diff --git a/packages/localize/package.json b/packages/localize/package.json index 37a802f06c5af..318f3b51a32da 100644 --- a/packages/localize/package.json +++ b/packages/localize/package.json @@ -16,6 +16,9 @@ "ng-update": { "packageGroup": "NG_UPDATE_PACKAGE_GROUP" }, + "ng-add": { + "save": "devDependencies" + }, "sideEffects": [ "**/init/index.js", "**/init.js", @@ -36,4 +39,4 @@ "publishConfig": { "registry": "https://wombat-dressing-room.appspot.com" } -} \ No newline at end of file +} diff --git a/packages/localize/schematics/ng-add/index.ts b/packages/localize/schematics/ng-add/index.ts index 2dbebe97a4b39..f6d304a3ee6c6 100644 --- a/packages/localize/schematics/ng-add/index.ts +++ b/packages/localize/schematics/ng-add/index.ts @@ -9,7 +9,7 @@ */ import {virtualFs, workspaces} from '@angular-devkit/core'; -import {chain, Rule, SchematicsException, Tree} from '@angular-devkit/schematics'; +import {chain, Rule, SchematicContext, SchematicsException, Tree} from '@angular-devkit/schematics'; import {NodePackageInstallTask} from '@angular-devkit/schematics/tasks'; import {addPackageJsonDependency, NodeDependencyType, removePackageJsonDependency} from '@schematics/angular/utility/dependencies'; import {getWorkspace} from '@schematics/angular/utility/workspace'; @@ -97,22 +97,24 @@ function prependToTargetFiles( }; } -function moveToDependencyType(type: NodeDependencyType): Rule { - return (host, context) => { - debugger; - if (host.exists('package.json')) { - // Remove the previous dependency and add in a new one under the desired type. - removePackageJsonDependency(host, '@angular/localize'); - addPackageJsonDependency( - host, {name: '@angular/localize', type, version: `^0.0.0-PLACEHOLDER`}); - - // Add a task to run the package manager. This is necessary because we updated - // "package.json" and we want lock files to reflect this. - context.addTask(new NodePackageInstallTask()); - }; - }; +function moveToDependencies(host: Tree, context: SchematicContext) { + if (host.exists('package.json')) { + // Remove the previous dependency and add in a new one under the desired type. + removePackageJsonDependency(host, '@angular/localize'); + addPackageJsonDependency(host, { + name: '@angular/localize', + type: NodeDependencyType.Default, + version: `~0.0.0-PLACEHOLDER` + }); + + // Add a task to run the package manager. This is necessary because we updated + // "package.json" and we want lock files to reflect this. + context.addTask(new NodePackageInstallTask()); + } } +function noop() {} + export default function(options: Schema): Rule { return async (host: Tree) => { if (!options.name) { @@ -132,15 +134,12 @@ export default function(options: Schema): Rule { ${localizePolyfill} `; - // If `$localize` will not be used at runtime then we can install `@angular/localize` as a - // devDependency. - const dependencyType = - options.useAtRuntime ? NodeDependencyType.Default : NodeDependencyType.Dev; - return chain([ prependToTargetFiles(project, Builders.Browser, 'polyfills', localizeStr), prependToTargetFiles(project, Builders.Server, 'main', localizeStr), - moveToDependencyType(dependencyType), + // If `$localize` will be used at runtime then must install `@angular/localize` + // into `dependencies`, rather than the default of `devDependencies`. + options.useAtRuntime ? moveToDependencies : noop ]); }; } diff --git a/packages/localize/schematics/ng-add/index_spec.ts b/packages/localize/schematics/ng-add/index_spec.ts index 99350e3ee2206..fabd645919a8c 100644 --- a/packages/localize/schematics/ng-add/index_spec.ts +++ b/packages/localize/schematics/ng-add/index_spec.ts @@ -33,11 +33,13 @@ export { renderModule, renderModuleFactory } from '@angular/platform-server';`; beforeEach(() => { host = new UnitTestTree(new HostTree()); - host.create('package.json', `{ - "dependencies": { - "@angular/localize": "old-version" + host.create('package.json', JSON.stringify({ + 'devDependencies': { + // The default (according to `ng-add` in its package.json) is for `@angular/localize` to be + // saved to `devDependencies`. + '@angular/localize': '~0.0.0-PLACEHOLDER', } - }`); + })); host.create('src/polyfills.ts', polyfillsContent); host.create('src/another-polyfills.ts', polyfillsContent); host.create('src/unrelated-polyfills.ts', polyfillsContent); @@ -176,7 +178,7 @@ export { renderModule, renderModuleFactory } from '@angular/platform-server';`; host = await schematicRunner.runSchematicAsync('ng-add', defaultOptions, host).toPromise(); const packageJsonText = host.readContent('/package.json'); expect(JSON.parse(packageJsonText).devDependencies?.['@angular/localize']) - .toBe('^0.0.0-PLACEHOLDER'); + .toBe('~0.0.0-PLACEHOLDER'); expect(JSON.parse(packageJsonText).dependencies?.['@angular/localize']).toBeUndefined(); }); @@ -186,7 +188,7 @@ export { renderModule, renderModuleFactory } from '@angular/platform-server';`; .toPromise(); const packageJsonText = host.readContent('/package.json'); expect(JSON.parse(packageJsonText).dependencies?.['@angular/localize']) - .toBe('^0.0.0-PLACEHOLDER'); + .toBe('~0.0.0-PLACEHOLDER'); expect(JSON.parse(packageJsonText).devDependencies?.['@angular/localize']).toBeUndefined(); }); }); diff --git a/packages/localize/schematics/ng-add/schema.json b/packages/localize/schematics/ng-add/schema.json index 9013d316cbcc7..1c255911ce87b 100644 --- a/packages/localize/schematics/ng-add/schema.json +++ b/packages/localize/schematics/ng-add/schema.json @@ -13,8 +13,8 @@ }, "useAtRuntime": { "type": "boolean", - "description": "If true then the dependency is included in the `dependencies` section of packge.json, rather than `devDependencies`.", - "x-prompt": "Will this project use $localize at runtime?" + "description": "If set then `@angular/localize` is included in the `dependencies` section of `package.json`, rather than `devDependencies`, which is the default.", + "default": false } }, "required": []