ts-node
ts-node copied to clipboard
Log warning when "target" is too high for the node version
Blocked by #1445
Building off of #1202, we know the maximum "target" you can use for the given node version, so we can log a helpful warning when your target is wrong:
Warning: You are using a "target" option that may be incompatible with your node version.
For node vXYZ we recommend "target": "es2018" or lower.
To disable this warning, add the following to your tsconfig:
"ts-node": {"disableNodeCompatibilityWarnings": true}
To override your "target" within ts-node, add the following to your tsconfig:
"ts-node": {"compilerOptions": {"target": "es2018"}}
To derive your tsconfig from a recommended set of options, add the following to your tsconfig:
"extends": "ts-node/node12/tsconfig.json"
Questions
- [ ] Should this warning be logged for programmatic usage? For
ts-node/register? For--loader ts-node/esm? I don't think libraries should send output to stderr, butts-node/registeris a weird case because it's almost exclusively used from the CLI. - [ ] Should the
disableNodeCompatibilityWarningsoption be renamed to allow more than 2 modes?- `"forceNodeCompatibility": "auto" | "warn" | "off"
- `"autoNodeCompatibility": "enabled" | "warn" | "disabled"
- in auto / enabled mode, we override the "target" option with an appropriate value.
We discussed this on Discord: https://discord.com/channels/508357248330760243/508357707602853888/843546169752813589
Conclusions:
- Use node's warnings API:
process.emitWarning()- there is already precedent for warnings to emit to stderr from here
- node already has APIs to intercept these warnings and flags to suppress them
- Match node's behavior and emit each warning only once
- Add
warnings: booleanto API surface-
falseto disable them - Future work can expand to suppress or allow warnings by code
-
- Add
onWarning: callbackto API surface- if specified, warnings are sent here instead of to
process.emitWarning
- if specified, warnings are sent here instead of to
- All warnings get a code
TSNODE<4-digit number>- This is familiar: node's deprecation warnings are
DEP1234; TypeScript usesTS1234 - code allows easy detection in
process.on('warning'handlers
- This is familiar: node's deprecation warnings are
Questions
- when tsconfig has
"warnings": false, but a warning emits before tsconfig is loaded- Do we defer those warnings till after all options are known? For the
"target"warning, we can do this
- Do we defer those warnings till after all options are known? For the