Description
Copied from original discussion in nodejs/loaders#217 (comment)
I know that as a user I won't have much sway here, but I think I'm not alone in thinking that files in node_modules/*/*.ts
should also be allowed --experimental-strip-types
type stripping.
A few thoughts:
1) Node.js Alone Won't Prevent TS npm Publishing
There is a lot of movement in the "execute TypeScript, don't build it" ecosystem already, for example with the advent of many ecosystem projects such as:
- TypeScript execution CLIs like
ts-node
,tsm
,tsx
- TypeScript-native runtimes like Bun and Deno
- modern TS-native registries like JSR
- somewhat related: ECMAScript proposal Type Annotations
Publishing .ts
files to npm and other registries is already a growing pattern, which drastically reduces the effort and complexity of publishing a TypeScript package.
I think as these projects evolve and more people get to know about this possibility, there will be a greatly increased interest in this possibility.
It's my opinion that this banning of node_modules/*/*.ts
in Node.js alone won't be able to hold back the energy in the ecosystem, especially with working alternatives. (not to mention users circumventing this by using any of the other projects, which do not have this limitation)
2) User Experience
My first experience with node --experimental-strip-types
was creating an internal checking tool which was its own package, without a build step.
I immediately fell flat on my face with this, because of the banning of node_modules/*/*.ts
files.
Even though I was already somewhat aware of the discussions and objections behind this (eg. the nodejs/TSC
meeting notes from 2024-07-24), for my use case it felt like an arbitrary limitation imposed on my project.
I imagine that as type stripping becomes more widespread, this will be a common complaint from users.
3) Node.js Features Available Everywhere
@GeoffreyBooth wrote about supporting a Node.js feature everywhere:
If we support a file type, we support it everywhere. Just as module detection needs to apply within
node_modules
so that a package that works locally continues to work when published to npm, the same applies to TypeScript. We shouldn't be limiting our functionality to try to encourage best practices.
This resonates with me - it seems like supporting a Node.js feature in as many places as possible will be the best for users and cause the least amount of support complaints.
Banning node_modules/*/*.ts
to try to avoid a pattern which the ecosystem may adopt seems like a weak reason. (not to mention that the ecosystem may end up adopting this pattern anyway by finding cowpaths around this)
4) Identifying and Addressing Downsides
Downsides as mentioned by Ryan and Daniel on the TypeScript team and vocal node_modules/*/*.ts
opponents such as Matteo are important and should be considered.
But it feels like also:
- Each problem should be carefully thought through, examined, clearly enumerated and documented (also asked for by Geoffrey)
- Once clearly enumerated and documented, solutions should be also thought through, with each solution's tradeoffs being also enumerated and documented
This being done with a dispassionate, neutral stance, not trying to prove any one viewpoint.
In reading through the publicly-available documents, I don't think this has been done yet.
5) At Least Allow Users to Choose
Even if careful enumeration of problems and solutions leads to the final conclusion that the tradeoff is not worth it for Node.js, I think it would be good to allow users to choose for themselves and disable this node_modules/*/*.ts
banning with a flag, eg:
node --experimental-strip-types-in-dependencies
6) Similarities to .ts
Rewriting Limitation
Oh one more thing, more related of a feeling than fact-based:
This node_modules/*/*.ts
banning feels like it has a similar vibe to the .ts
-> .js
rewriting decision in TypeScript, which was overturned after years of doubling-down on .js
imports (ironically heavily inspired by Node.js type stripping).