hardhat icon indicating copy to clipboard operation
hardhat copied to clipboard

feat: Support .cts extension with ts-node 10+

Open phated opened this issue 1 year ago • 6 comments

  • [x] I talked about the limitations in the ESM PR and suggestion in the ts-node transpile PR

Due to the way hardhat registers tasks, v3 can't support ESM (as I outlined at https://github.com/NomicFoundation/hardhat/pull/1994#issuecomment-972459102); however, TypeScript added ESM support and many projects are converting to ESM-only. The ts-node team added support for the .cts extension in https://github.com/TypeStrong/ts-node/pull/1694, which allows individual files to be resolved as commonjs (see https://github.com/TypeStrong/ts-node#module-type-overrides).

This change should allow a monorepo to become "type": "module" and still use hardhat in commonjs mode. 🎉

phated avatar Aug 05 '22 22:08 phated

⚠️ No Changeset found

Latest commit: 2489ac5ffd55956322a685b12347bdc2cac5c2e2

Merging this PR will not cause a version bump for any packages. If these changes should not result in a new version, you're good to go. If these changes should result in a version bump, you need to add a changeset.

This PR includes no changesets

When changesets are added to this PR, you'll see the packages that this PR includes changesets for and the associated semver types

Click here to learn what changesets are, and how to add one.

Click here if you're a maintainer who wants to add a changeset to this PR

changeset-bot[bot] avatar Aug 05 '22 22:08 changeset-bot[bot]

The latest updates on your projects. Learn more about Vercel for Git ↗︎

Name Status Preview Updated
hardhat ✅ Ready (Inspect) Visit Preview Sep 13, 2022 at 0:57AM (UTC)
hardhat-storybook ✅ Ready (Inspect) Visit Preview Sep 13, 2022 at 0:57AM (UTC)

vercel[bot] avatar Aug 05 '22 22:08 vercel[bot]

This issue is also being tracked on Linear.

We use Linear to manage our development process, but we keep the conversations on Github.

LINEAR-ID: aa761df6-e663-4f74-a192-ba44dc37a0f4

github-actions[bot] avatar Aug 05 '22 22:08 github-actions[bot]

Thanks for submitting this PR!

Unfortunately, it has some linter errors, so we can't merge it yet. Can you please fix them?

Running yarn lint:fix in the root of the repository may fix them automatically.

github-actions[bot] avatar Aug 05 '22 22:08 github-actions[bot]

@alcuadrado this looks good to me. Do you want to take a look?

fvictorio avatar Aug 08 '22 09:08 fvictorio

Hmm, this might need some changes to the Hardhat config loading logic.

fvictorio avatar Aug 08 '22 09:08 fvictorio

edit: on further consideration I don't think this solves anything. we can rename all the files to .cts, which allows the project itself to be ESM compatible and we could load ESM modules into .ts files, but we wouldn't be able to load ESM modules into .cts files, which would basically be all the hardhat project files. whilst great it we can use hardhat inside a ESM project, it doesn't really allow the use of ESM modules, unless those are standalone scripts/modules not imported into any hardhat files.

this whole ESM thing is a mess.


I tried this and it doesn't seem to be detecting my .cts config file. and if I manually pass --config hardhat.config.cts I get mocha errors when running hardhat test. many modules are starting to move to ESM only, surely the best to way enable support for those is to have the hardhat project marked as ESM but hardhat support/load .cts files. surely this wouldn't take much to get over the line, it feels part way there already.

Error [ERR_REQUIRE_ESM]: Must use import to load ES Module: /Users/rob/src/test/node/hardhat-esm/test/Lock.ts
require() of ES modules is not supported.
require() of /Users/rob/src/test/node/hardhat-esm/test/Lock.ts from /Users/rob/src/test/node/hardhat-esm/node_modules/mocha/lib/mocha.js is an ES module file as it is a .ts file whose nearest parent package.json contains "type": "module" which defines all .ts files in that package scope as ES modules.
Instead change the requiring code to use import(), or remove "type": "module" from /Users/rob/src/test/node/hardhat-esm/package.json.

    at createErrRequireEsm (/Users/rob/src/test/node/hardhat-esm/node_modules/ts-node/dist-raw/node-internal-errors.js:46:15)
    at assertScriptCanLoadAsCJSImpl (/Users/rob/src/test/node/hardhat-esm/node_modules/ts-node/dist-raw/node-internal-modules-cjs-loader.js:584:11)
    at Object.require.extensions.<computed> [as .ts] (/Users/rob/src/test/node/hardhat-esm/node_modules/ts-node/src/index.ts:1610:5)
    at Module.load (node:internal/modules/cjs/loader:981:32)
    at Function.Module._load (node:internal/modules/cjs/loader:822:12)
    at Module.require (node:internal/modules/cjs/loader:1005:19)
    at require (node:internal/modules/cjs/helpers:102:18)
    at /Users/rob/src/test/node/hardhat-esm/node_modules/mocha/lib/mocha.js:414:36
    at Array.forEach (<anonymous>)
    at Mocha.loadFiles (/Users/rob/src/test/node/hardhat-esm/node_modules/mocha/lib/mocha.js:411:14) {
  code: 'ERR_REQUIRE_ESM'
}
Waiting for the debugger to disconnect...
error Command failed with exit code 1.

I tried editing this in package.json and renaming to Lock.cts but it doesn't seem to detect it and reports 0 passing. "test": "mocha --recursive \"test/**/*.cts\"",

oh snap it worked.

hardhat-esm yarn hardhat --config hardhat.config.cts test
Debugger attached.
Debugger attached.
yarn run v1.22.15
$ /Users/rob/src/test/node/hardhat-esm/node_modules/.bin/hardhat --config hardhat.config.cts test
Debugger attached.


  Lock
    Deployment
      ✔ Should set the right unlockTime (687ms)
      ✔ Should set the right owner
      ✔ Should receive and store the funds to lock
      ✔ Should fail if the unlockTime is not in the future
    Withdrawals
      Validations
        ✔ Should revert with the right error if called too soon
        ✔ Should revert with the right error if called from another account
        ✔ Shouldn't fail if the unlockTime has arrived and the owner calls it
      Events
        ✔ Should emit an event on withdrawals
      Transfers
        ✔ Should transfer the funds to the owner


  9 passing (897ms)

it's hardcoded here image

I'd love to contribute but I've only been working with node for about 2 weeks

robwilkes avatar Aug 11 '22 07:08 robwilkes

@robwilkes this is the very first, minor step into getting some semblance of interopt with type: module projects. Please hang tight until we can get things working together. As for this feature specifically, it requires ts-node 10+ and typescript 4.7+ otherwise it won't detect the extension correctly.

phated avatar Aug 11 '22 16:08 phated

Woohoo, your important contribution to this open-source project has earned you a GitPOAP!

GitPOAP: 2022 Hardhat Contributor: GitPOAP: 2022 Hardhat Contributor GitPOAP Badge

Head on over to GitPOAP.io and connect your GitHub account to mint!

gitpoap-bot[bot] avatar Sep 13 '22 13:09 gitpoap-bot[bot]

Merging this to the esm feature branch, because I think these PRs will be easier to review and test together.

fvictorio avatar Sep 13 '22 13:09 fvictorio