superstruct icon indicating copy to clipboard operation
superstruct copied to clipboard

NodeNext Compat

Open arturmuller opened this issue 11 months ago • 4 comments

👉 This PR can be tested via a pre-release version of Superstruct: npm i [email protected].

The goal of this PR is to fix Superstruct's compatibility with TypeScript's NodeNext module / module resolution settings. The simplest fix I could think of (and which was also proposed in #1211 by @ciscoheat) is to add file extensions to imports. This is currently in the PR, however, this presents several issues:

  1. It breaks tests. Test are currently written in Mocha, which is really starting to show its age — it is quite hard to figure out how to make things play nice with the rest of the tooling. @ciscoheat proposed a switch to Vitest which I am 100% in favour of, but I think we need to make the switch a bit more thoughtfully: a) Make sure the tests are actually written in a more standard Vitest way and that all test are passing.
  2. We have to actually use the file extensions, which — in my experience — is rather confusing to new contributors. The extension has to be .js not .ts (since TS doesn't rewrite paths), and we lose directory import. Bottom line, this feels like a non-ideal way to do this and other libs manage in a more elegant way, so we investigate how this can be done.
  3. There are many environments where Superstruct can run, and any changes to module resolution should be either thoroughly tested (at least manually), or marked as a breaking change to make sure we don't break suddenly people's builds. I would really hate to drop the whole TS/Node/CommonJS/ESM mess on unsuspecting users.

arturmuller avatar Mar 11 '24 12:03 arturmuller

I'm happy to say that this worked perfectly with Superforms, so I'm ready to add it to the library. Will it be a big change for the next official version, or can I add it already with the pre-release version?

ciscoheat avatar Mar 13 '24 14:03 ciscoheat

Hello again @arturmuller, any progress on this one? It would be very nice to support another library for Superforms.

ciscoheat avatar Apr 12 '24 07:04 ciscoheat

I suggest adding tsc-alias to the build process, you can leave the extensions out of the ts files, and just add the tsc-alias command after the build command.

with

  "tsc-alias": {
    "resolveFullPaths": true
  }

in the tsconfig.

it'll add extensions to all the paths in the type definitions.

PR: https://github.com/ianstormtaylor/superstruct/pull/1232

Jakeii avatar May 03 '24 18:05 Jakeii

I suggest adding tsc-alias to the build process, you can leave the extensions out of the ts files, and just add the tsc-alias command after the build command.

with

  "tsc-alias": {
    "resolveFullPaths": true
  }

in the tsconfig.

it'll add extensions to all the paths in the type definitions.

PR: #1232

Hey @arturmuller what do you think?

Jakeii avatar May 10 '24 08:05 Jakeii

This could be rebased onto main now that the tests are running on something newer!

yeoffrey avatar Jun 05 '24 20:06 yeoffrey