- Migrating to @oclif/core@V3
- BREAKING CHANGES ❗
- Dropping node 14 and node 16 support
- Bin Scripts for ESM/CJS Interoperability
- Dropped
ts-nodeas a dependency Config.plugins- Readonly properties on
Config - Private methods on
Plugin global['cli-ux']->global.uxhandlenoCacheDefaultflag property replacesisWritingManifest- Removed Unnecessary Exports
- Features 🎉
- BREAKING CHANGES ❗
The end-of-life date for Node.js 14 was April 30, 2023.
The end-of-life date for Node.js 16 was September 11, 2023. This date is earlier than previously published. Node.js’s blog explains why they chose this earlier end-of-life date.
In order to support ESM and CommonJS plugin interoperability you will need to update your bin scripts to match these:
You will also need to update any references to the bin scripts to include the .js extension.
If you'd like to migrate your plugin to ESM, please read our guide here
We removed ts-node as a dependency to reduce the package size. By doing this, it means that linked plugin must have ts-node as a devDependency in order for auto-transpilation to work.
Config.plugins is now a Map where the keys are the plugin names and the values are the loaded Plugin instances. Previously it was an array of loaded Plugin instances.
By using a Map we can now do more efficient lookups during command execution. Config.getPluginsList was added in case you still would like a flat array of Plugin instances.
Various properties on Config are now readonly - name - version - channel - pjson - root - arch - bin - cacheDir - configDir - dataDir - dirname - errLog - home - platform - shell - userAgent - windows - debug - npmRegistry - userPJSON - plugins - binPath - binAliases - nsisCustomization - valid - flexibleTaxonomy - commands
The _manifest and warn methods on Plugin are now private
The global cli-ux object has been renamed to ux to be consistent with the module's name
The exported handle function for handling errors in bin scripts is now asynchronous
Version 2 allowed you to optionally return non-sensitive input if the default or defaultHelp flag/arg properties were called during manifest creation. This is helpful if you don't want sensitive data to be put into the oclif.manifest.json and then released to npm. To do this you had to handle the isWritingManifest parameter passed in to the default and defaultHelp callbacks.
export const mySensitiveFlag = Flags.string({
default: async (context, isWritingManifest) => {
if (isWritingManifest) {
return undefined
}
return 'sensitive info'
},
})Version 3 removes the isWritingManifest parameter in favor of a flag and arg property, noCacheDefault. Setting it to true will automatically keep it from being cached in the manifest.
export const mySensitiveFlag = Flags.string({
noCacheDefault: true,
default: async (context) => {
return 'sensitive info'
},
})The following exports have been removed:
toCachedtsPath
- Cache command permutations for flexible taxonomy in the
oclif.manifest.json - Cache additional command properties (
isESM,relativePath) in theoclif.manifest.json - Improved accuracy in the
DEBUG=perfoutput. - Remove
ts-nodefromdependenciesto reduce the package size.
You can now define single character flag aliases using the charAliases property.
There's a new flag type that infers the flag's type from the provided options.
In v2 you would have needed to do something like this,
type Options = 'foo' | 'bar'
export default class MyCommand extends Command {
static flags = {
name: Flags.custom<Options>({
options: ['foo', 'bar'],
})(),
}
}Now in v3 you can do this,
export default class MyCommand extends Command {
static flags = {
name: Flags.option({
options: ['foo', 'bar'] as const,
})(),
}
}You can now configure the style of the spinner when using ux.action.start. See spinners for all the different options.
ux.action.start('starting spinner', 'spinning', {style: 'arc'})
await ux.wait(2500)
ux.action.status = 'still going'
await ux.wait(2500)
ux.action.stop()