ts-node icon indicating copy to clipboard operation
ts-node copied to clipboard

Log warning when "target" is too high for the node version

Open cspotcode opened this issue 4 years ago • 1 comments

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, but ts-node/register is a weird case because it's almost exclusively used from the CLI.
  • [ ] Should the disableNodeCompatibilityWarnings option 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.

cspotcode avatar Feb 26 '21 19:02 cspotcode

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: boolean to API surface
    • false to disable them
    • Future work can expand to suppress or allow warnings by code
  • Add onWarning: callback to API surface
    • if specified, warnings are sent here instead of to process.emitWarning
  • All warnings get a code TSNODE<4-digit number>
    • This is familiar: node's deprecation warnings are DEP1234; TypeScript uses TS1234
    • code allows easy detection in process.on('warning' handlers

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

cspotcode avatar May 16 '21 20:05 cspotcode