bbc / sqs-consumer

Build Amazon Simple Queue Service (SQS) based applications without the boilerplate
https://bbc.github.io/sqs-consumer/
Other
1.71k stars 330 forks source link

v10 isn't loading the type file correctly #492

Closed nicholasgriffintn closed 2 months ago

nicholasgriffintn commented 2 months ago

Discussed in https://github.com/bbc/sqs-consumer/discussions/491

Originally posted by **tyler-g** April 29, 2024 ### Summary Hey all, we saw this was already mentioned for the breaking change in v10: [v10.0.0](https://github.com/bbc/sqs-consumer/releases/tag/v10.0.0) Potentially Breaking Changes SQS Consumer has been transitioned to use ESM in its codebase, in order to support this, we have had to change how we deploy the package in order to build both ESM and CJS versions of the package. This may cause issues with your software, if it does, please let us know. This has forced us to be stuck on v9 because on v10 it will not find the type index file in sqs-consumer package. Wanted to check if there is any follow up to this that will eventually let us upgrade, or if we'll be stuck on v9. Thanks ### Example _No response_
kibertoad commented 2 months ago

Yup, this breaks for CommonJS import resolution:

Error: test/publishers/SnsPermissionPublisher.spec.ts(7,26): error TS2307: Cannot find module 'sqs-consumer' or its corresponding type declarations.
  There are types at '/home/runner/work/message-queue-toolkit/message-queue-toolkit/node_modules/sqs-consumer/dist/types/index.d.ts', but this result could not be resolved under your current 'moduleResolution' setting. Consider updating to 'node16', 'nodenext', or 'bundler'.
Error: ../sqs/lib/sqs/AbstractSqsConsumer.ts(19,26): error TS2307: Cannot find module 'sqs-consumer' or its corresponding type declarations.
  There are types at '/home/runner/work/message-queue-toolkit/message-queue-toolkit/node_modules/sqs-consumer/dist/types/index.d.ts', but this result could not be resolved under your current 'moduleResolution' setting. Consider updating to 'node16', 'nodenext', or 'bundler'.

Looks like dual-publishing is not setup correctly.

nicholasgriffintn commented 2 months ago

Yup, we seem to have some sort of issue going on, one that is on the list to try to figure out when I have the time, for now, it's probably best to stick to v9 if you are getting these errors, in my testing, it did load for common js, but it seems I didn't hit every use case.

I'm not sure how to do that / if that's actually possible.

One avenue may be that we need to add main and types back to the package json, I'm still researching though.

nicholasgriffintn commented 2 months ago

I have published a canary version: sqs-consumer@10.2.0-canary.0 that adds main and types back, I hoping this is solution, not fully tested yet though as it is a bit late and back to the day job tomorrow, would be great if people could try it and let us know if it does the job or not.

trevor-brandt commented 2 months ago

@nicholasgriffintn Your canary version worked for us.

We attempted to update from v9.x to v10.1.0 and were getting the following error:

error TS2307: Cannot find module 'sqs-consumer' or its corresponding type declarations.
  There are types at '[redacted]/sqs-consumer/dist/types/index.d.ts', but this result could not be resolved under your current 'moduleResolution' setting. Consider updating to 'node16', 'nodenext', or 'bundler'.

Using 10.2.0-canary.0, the error is gone and the project builds correctly.

nicholasgriffintn commented 2 months ago

Awesome, I've released it now as 10.2.0. Will leave this open in case it didn't fix it, and will close later if it did.

kibertoad commented 2 months ago

@nicholasgriffintn Thank you, it works now!

trevor-brandt commented 2 months ago

@nicholasgriffintn 10.2.0 works for an old project (hooray!), but when I use it in a project with a more recent tsconfig, it breaks that project (oh no!).

10.1.0 fails but 10.2.0 works with the error I mentioned above when we had these compilerOptions set:

{
  "compilerOptions": {
    "target": "es2021",
    "module": "commonjs",
    "moduleResolution": "node",
    "declaration": true,
    "outDir": "dist",
    "esModuleInterop": true,
    "forceConsistentCasingInFileNames": true,
    "resolveJsonModule": true,
    "skipLibCheck": true,
    "strict": false,
  },
  "exclude": ["node_modules", "dist"]
}

However, in another project with the following tsconfig settings, 10.1.0 works but now 10.2.0 breaks:

{
  "compilerOptions": {
    "target": "es2022",
    "module": "Node16",
    "declaration": true,
    "outDir": "dist",
    "esModuleInterop": true,
    "forceConsistentCasingInFileNames": true,
    "resolveJsonModule": true,
    "skipLibCheck": true,
    "strict": false,
  },
  "exclude": ["node_modules", "dist"]
}

The error we get with 10.2.0 for the above tsconfig:

error TS1479: The current file is a CommonJS module whose imports will produce 'require' calls; however, the referenced file is an ECMAScript module and cannot be imported with 'require'. Consider writing a dynamic 'import("sqs-consumer")' call instead.
  To convert this file to an ECMAScript module, change its file extension to '.mts', or add the field `"type": "module"` to '[redacted]/package.json'.

import { Consumer } from 'sqs-consumer';

Sorry, I know this must be a pain! There might be settings we can change to try to rectify it, but this isn't an issue we have with the other libs we import, so I'm guessing it won't just be me.

nicholasgriffintn commented 2 months ago

@trevor-brandt Sorry, not sure I'm able to replicate, we have a few examples going here, they all seem to be loading up as expected:

https://github.com/bbc/sqs-consumer-starter/tree/main/examples

Would you mind forking and providing an example according to the closest one to your setup please? This is one I've setup using your tsconfig: https://github.com/bbc/sqs-consumer-starter/tree/main/examples/ts-commonjs-node16

nicholasgriffintn commented 2 months ago

Update: I've published 10.2.1 just now, that exports type files specific for esm and cjs, ran it through this, seems to be happy: https://arethetypeswrong.github.io/?p=sqs-consumer

Maybe that version might fix the issue for you?

trevor-brandt commented 2 months ago

@nicholasgriffintn , I started taking a look at your starter example and couldn't repro until I noticed you're using 10.2.1. If I bump my patch version from 10.2.0 to 10.2.1 everything is great!

I'm able to repro with a couple changes to your ts-commonjs-node16 if I revert to 10.2.0 (we're using import instead of require in our code), but since the latest is working for me, I'm good if you're good.

Thanks for all your efforts to get this stuff ironed out!

trevor-brandt commented 2 months ago

@nicholasgriffintn And I just noticed your comment about 10.2.1, so yep! You were right on it. Thanks again!

github-actions[bot] commented 1 month ago

This issue has been closed for more than 30 days. If this issue is still occuring, please open a new issue with more recent context.