ianstormtaylor / superstruct

A simple and composable way to validate data in JavaScript (and TypeScript).
https://docs.superstructjs.org
MIT License
6.95k stars 224 forks source link

NodeNext Compat #1224

Closed arturmuller closed 2 months ago

arturmuller commented 5 months ago

πŸ‘‰ This PR can be tested via a pre-release version of Superstruct: npm i superstruct@1.0.5-0.

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.
ciscoheat commented 5 months ago

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 commented 4 months ago

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

Jakeii commented 3 months ago

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 commented 3 months ago

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?

yeoffrey commented 2 months ago

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