nylas-nodejs icon indicating copy to clipboard operation
nylas-nodejs copied to clipboard

TypeScript Not Working When Package.json type is "module"

Open Lozoute opened this issue 11 months ago • 4 comments

Describe the bug When installing Nylas SDK 7 to a new repo, using TypeScript 5 and type "module" in package.json, TypeScript throws the error This expression is not constructable. adding type: "module" into the package.json of Nylas fixes the problem but then commonjs requires do not work anymore.

To Reproduce 1 Create a new repo

2 Add this package.json

{
  "name": "test",
  "version": "1.0.0",
  "description": "",
  "type": "module",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "start": "tsc && node nylas.mjs"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "dependencies": {
    "nylas": "^7.2.1"
  },
  "devDependencies": {
    "typescript": "^5.4.2"
  }
}

3. Add this tsconfig.json

{
  "compilerOptions": {
    "target": "esnext",
    "module": "NodeNext",
    "moduleResolution": "NodeNext",
    "declaration": true,
    "esModuleInterop": false,
    "forceConsistentCasingInFileNames": true,
    "strict": false,
    "noImplicitAny": false,
    "strictNullChecks": false,
    "strictFunctionTypes": false,
    "strictBindCallApply": false,
    "strictPropertyInitialization": false,
    "skipLibCheck": true,
    "resolvePackageJsonExports": true,
  },
  "exclude": ["modules/clients/**/*"]
}

4. Add this nylas.mts file

import Nylas from 'nylas';


const apiKey = 'YOUR_API_KEY';
const apiUri = 'https://api.eu.nylas.com';

const nylas = new Nylas({
  apiKey: apiKey,
  apiUri: apiUri
});


const result = await nylas.messages.list({
  identifier: "YOUR_GRANT",
  queryParams: {
    limit: 20,
  },
});

console.log(result);

5. npm install && npm start

Expected behavior Well I guess we should have no error but the tsc compiler throws the error This expression is not constructable.

SDK Version: 7.2.1

Additional context Add any other context about the problem here.

Lozoute avatar Mar 11 '24 15:03 Lozoute

Thanks for opening this issue @Lozoute, we'll take a look and provide you an update as soon as we get one.

mrashed-dev avatar Mar 12 '24 13:03 mrashed-dev

Hey @Lozoute, we're still looking into this internally and trying to find the best course of action here that won't break anything for cjs users. Until then, during my testing I found that if you use new Nylas.default({... it should work and it does give you full typing support. I'm not suggesting this as a final solution, but only a temporary workaround until we have something flushed out that can satisfy everyone. Hybrid projects in TS are always a little tricky. Sorry for the delay on this, but we're looking to resolve this fully soon.

mrashed-dev avatar Apr 26 '24 19:04 mrashed-dev

Hello @mrashed-dev It may work for TypeScript but once compiled, this code won't work:

{
  "errorType": "TypeError",
  "errorMessage": "Nylas.default is not a constructor",
  "trace": [
    "TypeError: Nylas.default is not a constructor",
    "    at file:///var/task/src/index.mjs:9:15",
    "    at process.processTicksAndRejections (node:internal/process/task_queues:95:5)"
  ]
}

I think it's crazy that the first thing we have on the NodeJs SDK Documentation is this:

import Nylas from "nylas";

const nylas = new Nylas({
  apiKey: "<NYLAS_API_KEY>",
  apiUri: "<NYLAS_API_URI>"
})  

And it doesn't even work properly.

Lozoute avatar Jul 30 '24 19:07 Lozoute

My only working solution for now is to do this:

// @ts-expect-error Some comment so next dev can understand...
const nylas = new Nylas({
  apiKey: nylasApiKey,
  apiUri: nylasApiBaseUrl
}) as Nylas.default

Lozoute avatar Jul 30 '24 19:07 Lozoute