2020-04-13 13:25:49 +01:00
# ! / u s r / b i n / e n v n o d e
/ * *
* @license
2020-05-19 12:08:49 -07:00
* Copyright Google LLC All Rights Reserved .
2020-04-13 13:25:49 +01:00
*
* Use of this source code is governed by an MIT - style license that can be
* found in the LICENSE file at https : //angular.io/license
* /
import * as yargs from 'yargs' ;
2020-12-30 17:03:41 +00:00
import { setFileSystem , NodeJSFileSystem } from '../../src/ngtsc/file_system' ;
2020-05-14 20:06:12 +01:00
import { ConsoleLogger , LogLevel } from '../../src/ngtsc/logging' ;
2020-04-16 15:54:40 +01:00
import { NgccOptions } from './ngcc_options' ;
2020-04-13 13:25:49 +01:00
export function parseCommandLineOptions ( args : string [ ] ) : NgccOptions {
const options =
yargs
. option ( 's' , {
alias : 'source' ,
describe :
'A path (relative to the working directory) of the `node_modules` folder to process.' ,
2020-08-14 15:23:05 -07:00
default : './node_modules' ,
type : 'string' ,
2020-04-13 13:25:49 +01:00
} )
2020-08-14 15:23:05 -07:00
. option ( 'f' , { alias : 'formats' , hidden : true , array : true , type : 'string' } )
2020-04-13 13:25:49 +01:00
. option ( 'p' , {
alias : 'properties' ,
array : true ,
describe :
2020-05-06 16:54:44 +02:00
'An array of names of properties in package.json to compile (e.g. `module` or `main`)\n' +
2020-04-13 13:25:49 +01:00
'Each of these properties should hold the path to a bundle-format.\n' +
'If provided, only the specified properties are considered for processing.\n' +
2020-08-14 15:23:05 -07:00
'If not provided, all the supported format properties (e.g. fesm2015, fesm5, es2015, esm2015, esm5, main, module) in the package.json are considered.' ,
type : 'string' ,
2020-04-13 13:25:49 +01:00
} )
. option ( 't' , {
alias : 'target' ,
describe :
'A relative path (from the `source` path) to a single entry-point to process (plus its dependencies).\n' +
2020-06-04 08:43:05 +01:00
'If this property is provided then `error-on-failed-entry-point` is forced to true.\n' +
'This option overrides the `--use-program-dependencies` option.' ,
2020-08-14 15:23:05 -07:00
type : 'string' ,
2020-06-04 08:43:05 +01:00
} )
. option ( 'use-program-dependencies' , {
type : 'boolean' ,
describe :
'If this property is provided then the entry-points to process are parsed from the program defined by the loaded tsconfig.json. See `--tsconfig`.\n' +
'This option is overridden by the `--target` option.' ,
2020-04-13 13:25:49 +01:00
} )
. option ( 'first-only' , {
describe :
refactor(ngcc): support processing only the typings files of packages (#40976)
Some tools (such as Language Server and ng-packagr) only care about
the processed typings generated by ngcc. Forcing these tools to process
the JavaScript files as well has two disadvantages:
First, unnecessary work is being done, which is time consuming.
But more importantly, it is not always possible to know how the final bundling
tools will want the processed JavaScript to be configured. For example,
the CLI would prefer the `--create-ivy-entry-points` option but this would
break non-CLI build tooling.
This commit adds a new option (`--typings-only` on the command line, and
`typingsOnly` via programmatic API) that instructs ngcc to only render changes
to the typings files for the entry-points that it finds, and not to write any
JavaScript files.
In order to process the typings, a JavaScript format will need to be analysed, but
it will not be rendered to disk. When using this option, it is best to offer ngcc a
wide range of possible JavaScript formats to choose from, and it will use the
first format that it finds. Ideally you would configure it to try the `ES2015` FESM
format first, since this will be the most performant.
Fixes #40969
PR Close #40976
2021-02-24 10:36:16 +00:00
'If specified then only the first matching package.json property will be compiled.\n' +
'This option is overridden by `--typings-only`.' ,
type : 'boolean' ,
} )
. option ( 'typings-only' , {
describe :
'If specified then only the typings files are processed, and no JS source files will be modified.\n' +
'Setting this option will force `--first-only` to be set, since only one format is needed to process the typings' ,
2020-08-14 15:23:05 -07:00
type : 'boolean' ,
2020-04-13 13:25:49 +01:00
} )
. option ( 'create-ivy-entry-points' , {
describe :
'If specified then new `*_ivy_ngcc` entry-points will be added to package.json rather than modifying the ones in-place.\n' +
'For this to work you need to have custom resolution set up (e.g. in webpack) to look for these new entry-points.\n' +
'The Angular CLI does this already, so it is safe to use this option if the project is being built via the CLI.' ,
type : 'boolean' ,
} )
. option ( 'legacy-message-ids' , {
describe : 'Render `$localize` messages with legacy format ids.\n' +
'The default value is `true`. Only set this to `false` if you do not want legacy message ids to\n' +
'be rendered. For example, if you are not using legacy message ids in your translation files\n' +
'AND are not doing compile-time inlining of translations, in which case the extra message ids\n' +
'would add unwanted size to the final source bundle.\n' +
'It is safe to leave this set to true if you are doing compile-time inlining because the extra\n' +
'legacy message ids will all be stripped during translation.' ,
type : 'boolean' ,
default : true ,
} )
. option ( 'async' , {
describe :
'Whether to compile asynchronously. This is enabled by default as it allows compilations to be parallelized.\n' +
'Disabling asynchronous compilation may be useful for debugging.' ,
type : 'boolean' ,
default : true ,
} )
. option ( 'l' , {
alias : 'loglevel' ,
describe : 'The lowest severity logging message that should be output.' ,
choices : [ 'debug' , 'info' , 'warn' , 'error' ] ,
2020-08-14 15:23:05 -07:00
type : 'string' ,
2020-04-13 13:25:49 +01:00
} )
. option ( 'invalidate-entry-point-manifest' , {
describe :
'If this is set then ngcc will not read an entry-point manifest file from disk.\n' +
'Instead it will walk the directory tree as normal looking for entry-points, and then write a new manifest file.' ,
type : 'boolean' ,
default : false ,
} )
. option ( 'error-on-failed-entry-point' , {
describe :
'Set this option in order to terminate immediately with an error code if an entry-point fails to be processed.\n' +
'If `-t`/`--target` is provided then this property is always true and cannot be changed. Otherwise the default is false.\n' +
'When set to false, ngcc will continue to process entry-points after a failure. In which case it will log an error and resume processing other entry-points.' ,
type : 'boolean' ,
default : false ,
} )
. option ( 'tsconfig' , {
describe :
'A path to a tsconfig.json file that will be used to configure the Angular compiler and module resolution used by ngcc.\n' +
'If not provided, ngcc will attempt to read a `tsconfig.json` file from the folder above that given by the `-s` option.\n' +
'Set to false (via `--no-tsconfig`) if you do not want ngcc to use any `tsconfig.json` file.' ,
type : 'string' ,
} )
. strict ( )
. help ( )
. parse ( args ) ;
2020-08-14 15:23:05 -07:00
if ( options . f ? . length ) {
2020-04-13 13:25:49 +01:00
console . error (
'The formats option (-f/--formats) has been removed. Consider the properties option (-p/--properties) instead.' ) ;
process . exit ( 1 ) ;
}
2020-12-30 17:03:41 +00:00
const fs = new NodeJSFileSystem ( ) ;
setFileSystem ( fs ) ;
2020-04-13 13:25:49 +01:00
2020-12-30 17:03:41 +00:00
const baseSourcePath = fs . resolve ( options . s || './node_modules' ) ;
2020-08-14 15:23:05 -07:00
const propertiesToConsider = options . p ;
const targetEntryPointPath = options . t ;
2020-04-13 13:25:49 +01:00
const compileAllFormats = ! options [ 'first-only' ] ;
refactor(ngcc): support processing only the typings files of packages (#40976)
Some tools (such as Language Server and ng-packagr) only care about
the processed typings generated by ngcc. Forcing these tools to process
the JavaScript files as well has two disadvantages:
First, unnecessary work is being done, which is time consuming.
But more importantly, it is not always possible to know how the final bundling
tools will want the processed JavaScript to be configured. For example,
the CLI would prefer the `--create-ivy-entry-points` option but this would
break non-CLI build tooling.
This commit adds a new option (`--typings-only` on the command line, and
`typingsOnly` via programmatic API) that instructs ngcc to only render changes
to the typings files for the entry-points that it finds, and not to write any
JavaScript files.
In order to process the typings, a JavaScript format will need to be analysed, but
it will not be rendered to disk. When using this option, it is best to offer ngcc a
wide range of possible JavaScript formats to choose from, and it will use the
first format that it finds. Ideally you would configure it to try the `ES2015` FESM
format first, since this will be the most performant.
Fixes #40969
PR Close #40976
2021-02-24 10:36:16 +00:00
const typingsOnly = options [ 'typings-only' ] ;
2020-04-13 13:25:49 +01:00
const createNewEntryPointFormats = options [ 'create-ivy-entry-points' ] ;
2020-08-14 15:23:05 -07:00
const logLevel = options . l as keyof typeof LogLevel | undefined ;
2020-04-13 13:25:49 +01:00
const enableI18nLegacyMessageIdFormat = options [ 'legacy-message-ids' ] ;
const invalidateEntryPointManifest = options [ 'invalidate-entry-point-manifest' ] ;
const errorOnFailedEntryPoint = options [ 'error-on-failed-entry-point' ] ;
2020-06-04 08:43:05 +01:00
const findEntryPointsFromTsConfigProgram = options [ 'use-program-dependencies' ] ;
2020-04-13 13:25:49 +01:00
// yargs is not so great at mixed string+boolean types, so we have to test tsconfig against a
// string "false" to capture the `tsconfig=false` option.
// And we have to convert the option to a string to handle `no-tsconfig`, which will be `false`.
2020-08-14 15:23:05 -07:00
const tsConfigPath = ` ${ options . tsconfig } ` === 'false' ? null : options . tsconfig ;
2020-04-13 13:25:49 +01:00
const logger = logLevel && new ConsoleLogger ( LogLevel [ logLevel ] ) ;
return {
basePath : baseSourcePath ,
propertiesToConsider ,
targetEntryPointPath ,
refactor(ngcc): support processing only the typings files of packages (#40976)
Some tools (such as Language Server and ng-packagr) only care about
the processed typings generated by ngcc. Forcing these tools to process
the JavaScript files as well has two disadvantages:
First, unnecessary work is being done, which is time consuming.
But more importantly, it is not always possible to know how the final bundling
tools will want the processed JavaScript to be configured. For example,
the CLI would prefer the `--create-ivy-entry-points` option but this would
break non-CLI build tooling.
This commit adds a new option (`--typings-only` on the command line, and
`typingsOnly` via programmatic API) that instructs ngcc to only render changes
to the typings files for the entry-points that it finds, and not to write any
JavaScript files.
In order to process the typings, a JavaScript format will need to be analysed, but
it will not be rendered to disk. When using this option, it is best to offer ngcc a
wide range of possible JavaScript formats to choose from, and it will use the
first format that it finds. Ideally you would configure it to try the `ES2015` FESM
format first, since this will be the most performant.
Fixes #40969
PR Close #40976
2021-02-24 10:36:16 +00:00
typingsOnly ,
2020-04-13 13:25:49 +01:00
compileAllFormats ,
createNewEntryPointFormats ,
logger ,
enableI18nLegacyMessageIdFormat ,
2020-08-14 15:23:05 -07:00
async : options . async ,
2020-04-13 13:25:49 +01:00
invalidateEntryPointManifest ,
errorOnFailedEntryPoint ,
2020-06-04 08:43:05 +01:00
tsConfigPath ,
findEntryPointsFromTsConfigProgram ,
2020-04-13 13:25:49 +01:00
} ;
2020-05-06 16:54:44 +02:00
}