@nx/angular 16.8.0-beta.4 → 16.8.0-beta.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/mf/mf.js +31 -36
- package/package.json +10 -10
- package/plugins/component-testing.js +48 -40
- package/src/builders/module-federation-dev-server/module-federation-dev-server.impl.js +4 -6
- package/src/builders/module-federation-dev-ssr/module-federation-dev-ssr.impl.js +4 -6
- package/src/builders/utilities/buildable-libs.js +1 -2
- package/src/builders/utilities/module-federation.js +2 -3
- package/src/builders/utilities/webpack.js +16 -21
- package/src/builders/webpack-browser/webpack-browser.impl.js +13 -13
- package/src/builders/webpack-dev-server/lib/normalize-options.js +8 -1
- package/src/builders/webpack-dev-server/webpack-dev-server.impl.js +24 -18
- package/src/builders/webpack-server/webpack-server.impl.js +5 -7
- package/src/executors/browser-esbuild/browser-esbuild.impl.js +19 -23
- package/src/executors/browser-esbuild/lib/buildable-libs.js +1 -2
- package/src/executors/delegate-build/delegate-build.impl.js +9 -12
- package/src/executors/ng-packagr-lite/ng-packagr-adjustments/ng-package/entry-point/compile-ngc.transform.js +4 -7
- package/src/executors/ng-packagr-lite/ng-packagr-adjustments/ng-package/entry-point/entry-point.transform.js +4 -5
- package/src/executors/ng-packagr-lite/ng-packagr-adjustments/ng-package/entry-point/write-package.transform.js +158 -156
- package/src/executors/ng-packagr-lite/ng-packagr-adjustments/ng-package/options.di.js +6 -3
- package/src/executors/ng-packagr-lite/ng-packagr-adjustments/ngc/compile-source-files.js +118 -118
- package/src/executors/ng-packagr-lite/ng-packagr-adjustments/styles/stylesheet-processor.js +96 -103
- package/src/executors/ng-packagr-lite/ng-packagr-adjustments/ts/cache-compiler-host.js +20 -12
- package/src/executors/ng-packagr-lite/ng-packagr-lite.impl.js +18 -21
- package/src/executors/package/ng-packagr-adjustments/ng-package/entry-point/compile-ngc.transform.js +6 -9
- package/src/executors/package/ng-packagr-adjustments/ng-package/options.di.js +6 -3
- package/src/executors/package/ng-packagr-adjustments/ngc/compile-source-files.js +122 -122
- package/src/executors/package/ng-packagr-adjustments/styles/stylesheet-processor.js +96 -103
- package/src/executors/package/ng-packagr-adjustments/ts/cache-compiler-host.js +21 -13
- package/src/executors/package/ng-packagr-adjustments/utils/ng-compiler-cli.js +5 -8
- package/src/executors/package/package.impl.js +33 -38
- package/src/executors/utilities/angular-version-utils.js +1 -1
- package/src/executors/utilities/tailwindcss.js +2 -2
- package/src/executors/utilities/typescript.js +23 -28
- package/src/generators/add-linting/add-linting.js +76 -74
- package/src/generators/add-linting/lib/create-eslint-configuration.js +12 -4
- package/src/generators/application/application.js +56 -55
- package/src/generators/application/lib/add-e2e.js +36 -40
- package/src/generators/application/lib/add-linting.js +12 -15
- package/src/generators/application/lib/add-proxy-config.js +4 -1
- package/src/generators/application/lib/add-unit-test-runner.js +15 -18
- package/src/generators/application/lib/create-files.js +44 -47
- package/src/generators/application/lib/enable-strict-type-checking.js +2 -2
- package/src/generators/application/lib/normalize-options.js +37 -25
- package/src/generators/application/lib/set-app-strict-default.js +1 -2
- package/src/generators/application/lib/update-editor-tsconfig.js +1 -2
- package/src/generators/component/component.js +40 -43
- package/src/generators/component/lib/normalize-options.js +15 -5
- package/src/generators/component-cypress-spec/component-cypress-spec.js +25 -28
- package/src/generators/component-story/component-story.js +19 -22
- package/src/generators/convert-to-with-mf/convert-to-with-mf.js +19 -22
- package/src/generators/convert-to-with-mf/lib/get-webpack-config-path.js +3 -4
- package/src/generators/convert-tslint-to-eslint/convert-tslint-to-eslint.js +103 -106
- package/src/generators/cypress-component-configuration/cypress-component-configuration.js +59 -62
- package/src/generators/directive/directive.js +21 -24
- package/src/generators/directive/lib/normalize-options.js +11 -5
- package/src/generators/host/host.js +77 -67
- package/src/generators/host/lib/add-ssr.js +32 -35
- package/src/generators/init/init.js +101 -92
- package/src/generators/library/lib/add-standalone-component.js +18 -13
- package/src/generators/library/lib/enable-strict-type-checking.js +17 -5
- package/src/generators/library/lib/normalize-options.js +68 -53
- package/src/generators/library/library.js +89 -92
- package/src/generators/library-secondary-entry-point/lib/add-files.js +5 -1
- package/src/generators/library-secondary-entry-point/lib/normalize-options.js +6 -3
- package/src/generators/library-secondary-entry-point/lib/update-linting-file-patterns.js +1 -2
- package/src/generators/library-secondary-entry-point/library-secondary-entry-point.js +6 -9
- package/src/generators/move/lib/normalize-schema.js +5 -1
- package/src/generators/move/lib/update-module-name.js +1 -1
- package/src/generators/move/lib/update-ng-package.js +1 -2
- package/src/generators/move/lib/update-secondary-entry-points.js +1 -2
- package/src/generators/move/move.js +9 -12
- package/src/generators/ng-add/migrate-from-angular-cli.js +54 -53
- package/src/generators/ng-add/migrators/builders/angular-devkit-karma.migrator.js +4 -3
- package/src/generators/ng-add/migrators/builders/angular-devkit-ng-packagr.migrator.js +11 -12
- package/src/generators/ng-add/migrators/builders/angular-eslint-lint.migrator.js +39 -42
- package/src/generators/ng-add/migrators/builders/builder.migrator.js +1 -2
- package/src/generators/ng-add/migrators/migrator.js +7 -11
- package/src/generators/ng-add/migrators/projects/app.migrator.js +39 -43
- package/src/generators/ng-add/migrators/projects/e2e.migrator.js +115 -91
- package/src/generators/ng-add/migrators/projects/lib.migrator.js +23 -31
- package/src/generators/ng-add/migrators/projects/project.migrator.js +10 -14
- package/src/generators/ng-add/ng-add.js +5 -8
- package/src/generators/ng-add/utilities/dependencies.js +2 -3
- package/src/generators/ng-add/utilities/format-files-task.js +1 -1
- package/src/generators/ng-add/utilities/projects.js +1 -1
- package/src/generators/ng-add/utilities/workspace.js +25 -36
- package/src/generators/ngrx/lib/add-imports-to-module.js +1 -2
- package/src/generators/ngrx/lib/add-ngrx-to-package-json.js +1 -3
- package/src/generators/ngrx/lib/generate-files.js +11 -2
- package/src/generators/ngrx/lib/normalize-options.js +9 -4
- package/src/generators/ngrx/lib/validate-options.js +3 -3
- package/src/generators/ngrx/ngrx.js +18 -21
- package/src/generators/ngrx-feature-store/files/base/__directory__/__fileName__.actions.ts__tmpl__ +1 -1
- package/src/generators/ngrx-feature-store/files/base/__directory__/__fileName__.effects.spec.ts__tmpl__ +2 -2
- package/src/generators/ngrx-feature-store/files/base/__directory__/__fileName__.effects.ts__tmpl__ +2 -2
- package/src/generators/ngrx-feature-store/files/base/__directory__/__fileName__.facade.spec.ts__tmpl__ +6 -6
- package/src/generators/ngrx-feature-store/files/base/__directory__/__fileName__.facade.ts__tmpl__ +3 -3
- package/src/generators/ngrx-feature-store/files/base/__directory__/__fileName__.reducer.spec.ts__tmpl__ +3 -3
- package/src/generators/ngrx-feature-store/files/base/__directory__/__fileName__.reducer.ts__tmpl__ +2 -2
- package/src/generators/ngrx-feature-store/files/base/__directory__/__fileName__.selectors.spec.ts__tmpl__ +3 -3
- package/src/generators/ngrx-feature-store/files/base/__directory__/__fileName__.selectors.ts__tmpl__ +1 -1
- package/src/generators/ngrx-feature-store/files/no-inject/__directory__/__fileName__.effects.ts__tmpl__ +2 -2
- package/src/generators/ngrx-feature-store/files/no-inject/__directory__/__fileName__.facade.ts__tmpl__ +3 -3
- package/src/generators/ngrx-feature-store/lib/add-exports-barrel.js +4 -1
- package/src/generators/ngrx-feature-store/lib/add-imports.js +1 -1
- package/src/generators/ngrx-feature-store/lib/add-ngrx-to-package-json.js +1 -3
- package/src/generators/ngrx-feature-store/lib/generate-files.js +20 -4
- package/src/generators/ngrx-feature-store/lib/normalize-options.d.ts +1 -0
- package/src/generators/ngrx-feature-store/lib/normalize-options.js +22 -3
- package/src/generators/ngrx-feature-store/lib/validate-options.js +2 -2
- package/src/generators/ngrx-feature-store/ngrx-feature-store.js +18 -21
- package/src/generators/ngrx-root-store/lib/add-ngrx-to-package-json.js +8 -6
- package/src/generators/ngrx-root-store/lib/normalize-options.js +8 -4
- package/src/generators/ngrx-root-store/lib/validate-options.js +2 -2
- package/src/generators/ngrx-root-store/ngrx-root-store.js +27 -30
- package/src/generators/pipe/lib/normalize-options.js +9 -3
- package/src/generators/pipe/pipe.js +21 -24
- package/src/generators/remote/lib/add-ssr.js +46 -47
- package/src/generators/remote/lib/find-next-available-port.js +1 -2
- package/src/generators/remote/remote.js +52 -49
- package/src/generators/scam/lib/convert-component-to-scam.js +1 -2
- package/src/generators/scam/lib/normalize-options.js +11 -4
- package/src/generators/scam/scam.js +15 -12
- package/src/generators/scam-directive/lib/normalize-options.js +12 -4
- package/src/generators/scam-directive/scam-directive.js +13 -10
- package/src/generators/scam-pipe/lib/normalize-options.js +12 -4
- package/src/generators/scam-pipe/scam-pipe.js +13 -10
- package/src/generators/scam-to-standalone/scam-to-standalone.js +23 -26
- package/src/generators/setup-mf/lib/add-cypress-workaround.js +1 -1
- package/src/generators/setup-mf/lib/add-remote-to-host.js +4 -1
- package/src/generators/setup-mf/lib/change-build-target.js +10 -4
- package/src/generators/setup-mf/lib/generate-config.js +1 -1
- package/src/generators/setup-mf/lib/get-remotes-with-ports.js +1 -2
- package/src/generators/setup-mf/lib/normalize-options.js +5 -2
- package/src/generators/setup-mf/lib/set-tsconfig-target.js +7 -1
- package/src/generators/setup-mf/lib/setup-host-if-dynamic.js +1 -2
- package/src/generators/setup-mf/lib/setup-serve-target.js +10 -3
- package/src/generators/setup-mf/setup-mf.js +32 -35
- package/src/generators/setup-ssr/lib/generate-files.js +8 -5
- package/src/generators/setup-ssr/lib/normalize-options.js +9 -10
- package/src/generators/setup-ssr/lib/update-project-config.js +21 -17
- package/src/generators/setup-ssr/setup-ssr.js +26 -27
- package/src/generators/setup-tailwind/lib/add-tailwind-config-path-to-project.js +6 -4
- package/src/generators/setup-tailwind/lib/detect-tailwind-installed-version.js +1 -2
- package/src/generators/setup-tailwind/lib/normalize-options.js +4 -1
- package/src/generators/setup-tailwind/lib/update-application-styles.js +5 -6
- package/src/generators/setup-tailwind/setup-tailwind.js +20 -23
- package/src/generators/stories/lib/get-e2e-project.js +1 -1
- package/src/generators/stories/stories.js +43 -50
- package/src/generators/storybook-configuration/lib/assert-compatible-storybook-version.js +1 -1
- package/src/generators/storybook-configuration/lib/generate-stories.js +10 -13
- package/src/generators/storybook-configuration/lib/generate-storybook-configuration.js +12 -15
- package/src/generators/storybook-configuration/storybook-configuration.js +20 -16
- package/src/generators/utils/create-ts-config.js +1 -1
- package/src/generators/utils/entry-point.js +1 -2
- package/src/generators/utils/export-scam.js +1 -1
- package/src/generators/utils/insert-ngmodule-import.js +1 -1
- package/src/generators/utils/path.js +3 -3
- package/src/generators/utils/project.js +2 -3
- package/src/generators/utils/selector.js +1 -1
- package/src/generators/utils/storybook-ast/component-info.js +1 -2
- package/src/generators/utils/storybook-ast/entry-point.js +1 -2
- package/src/generators/utils/storybook-ast/module-info.js +1 -2
- package/src/generators/utils/storybook-ast/tree-utilities.js +1 -1
- package/src/generators/utils/testing.js +141 -139
- package/src/generators/utils/validations.js +1 -1
- package/src/generators/utils/version-utils.js +5 -7
- package/src/generators/web-worker/lib/normalize-options.js +6 -3
- package/src/generators/web-worker/web-worker.js +25 -28
- package/src/migrations/update-14-2-0/remove-show-circular-dependencies-option.js +10 -13
- package/src/migrations/update-14-2-0/update-angular-cli.js +14 -18
- package/src/migrations/update-14-2-0/update-libraries-secondary-entrypoints.js +22 -26
- package/src/migrations/update-14-2-0/update-ngcc-target.js +10 -14
- package/src/migrations/update-14-2-0/update-router-initial-navigation.js +31 -39
- package/src/migrations/update-14-2-0/update-tsconfig-target.js +48 -56
- package/src/migrations/update-14-5-0/migrate-mfe-to-mf.js +14 -17
- package/src/migrations/update-14-5-2/update-angular-cli.js +14 -18
- package/src/migrations/update-14-6-0/update-angular-cli.js +14 -18
- package/src/migrations/update-15-0-0/add-karma-inputs.js +27 -32
- package/src/migrations/update-15-0-0/switch-to-jasmine-marbles.js +62 -68
- package/src/migrations/update-15-2-0/remove-browserlist-config.js +34 -37
- package/src/migrations/update-15-2-0/remove-platform-server-exports.js +49 -52
- package/src/migrations/update-15-2-0/update-angular-cli.js +14 -18
- package/src/migrations/update-15-2-0/update-karma-main-file.js +11 -12
- package/src/migrations/update-15-2-0/update-typescript-target.js +40 -39
- package/src/migrations/update-15-2-0/update-workspace-config.js +16 -19
- package/src/migrations/update-15-5-0/update-angular-cli.js +14 -18
- package/src/migrations/update-15-7-0/install-required-packages.js +26 -28
- package/src/migrations/update-15-8-0/update-angular-cli.js +14 -18
- package/src/migrations/update-15-9-0/update-file-server-executor.js +31 -35
- package/src/migrations/update-15-9-0/update-testing-tsconfig.js +17 -22
- package/src/migrations/update-16-0-0/remove-karma-defaults.js +15 -18
- package/src/migrations/update-16-0-0/remove-library-generator-simple-module-name-option.js +22 -25
- package/src/migrations/update-16-0-0/remove-protractor-defaults.js +15 -18
- package/src/migrations/update-16-0-0-add-nx-packages/update-16-0-0-add-nx-packages.js +3 -6
- package/src/migrations/update-16-1-0/extract-standalone-config-from-bootstrap.js +38 -42
- package/src/migrations/update-16-1-0/remove-ngcc-invocation.js +15 -19
- package/src/migrations/update-16-1-0/remove-render-module-platform-server-exports.js +49 -52
- package/src/migrations/update-16-1-0/update-angular-cli.js +14 -18
- package/src/migrations/update-16-1-0/update-server-executor-config.js +13 -16
- package/src/migrations/update-16-2-0/switch-data-persistence-operators-imports-to-ngrx-router-store.js +25 -29
- package/src/migrations/update-16-4-0/rename-angular-eslint-accesibility-rules.js +13 -16
- package/src/migrations/update-16-4-0/update-angular-cli.js +14 -18
- package/src/migrations/update-16-6-0/explicitly-set-projects-to-update-buildable-deps.js +19 -24
- package/src/migrations/update-16-7-0/update-angular-cli.js +14 -18
- package/src/migrations/utils/projects.js +9 -15
- package/src/utils/get-mf-projects.js +1 -2
- package/src/utils/mf/utils.js +43 -44
- package/src/utils/mf/with-module-federation-ssr.js +39 -24
- package/src/utils/mf/with-module-federation.js +40 -21
- package/src/utils/nx-devkit/ast-utils.js +2 -3
- package/src/utils/version-utils.js +2 -4
|
@@ -1,21 +1,17 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
const tslib_1 = require("tslib");
|
|
4
3
|
const devkit_1 = require("@nx/devkit");
|
|
5
|
-
function default_1(tree) {
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
(
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
json.scripts.postinstall = json.scripts.postinstall.replace(/(.*)(ngcc --properties es2015 )(.*)/, '$1ngcc --properties es2020 $3');
|
|
12
|
-
shouldFormat = true;
|
|
13
|
-
}
|
|
14
|
-
return json;
|
|
15
|
-
});
|
|
16
|
-
if (shouldFormat) {
|
|
17
|
-
yield (0, devkit_1.formatFiles)(tree);
|
|
4
|
+
async function default_1(tree) {
|
|
5
|
+
let shouldFormat = false;
|
|
6
|
+
(0, devkit_1.updateJson)(tree, 'package.json', (json) => {
|
|
7
|
+
if (json.scripts?.postinstall?.includes('ngcc ')) {
|
|
8
|
+
json.scripts.postinstall = json.scripts.postinstall.replace(/(.*)(ngcc --properties es2015 )(.*)/, '$1ngcc --properties es2020 $3');
|
|
9
|
+
shouldFormat = true;
|
|
18
10
|
}
|
|
11
|
+
return json;
|
|
19
12
|
});
|
|
13
|
+
if (shouldFormat) {
|
|
14
|
+
await (0, devkit_1.formatFiles)(tree);
|
|
15
|
+
}
|
|
20
16
|
}
|
|
21
17
|
exports.default = default_1;
|
|
@@ -1,36 +1,33 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
const tslib_1 = require("tslib");
|
|
4
3
|
const devkit_1 = require("@nx/devkit");
|
|
5
4
|
const tsquery_1 = require("@phenomnomnominal/tsquery");
|
|
6
5
|
const typescript_1 = require("typescript");
|
|
7
|
-
function default_1(tree) {
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
yield (0, devkit_1.formatFiles)(tree);
|
|
33
|
-
});
|
|
6
|
+
async function default_1(tree) {
|
|
7
|
+
const printer = (0, typescript_1.createPrinter)();
|
|
8
|
+
const projects = await getProjectsWithAngularRouter(tree);
|
|
9
|
+
for (const project of projects) {
|
|
10
|
+
(0, devkit_1.visitNotIgnoredFiles)(tree, project.root, (filePath) => {
|
|
11
|
+
// we are only interested in .ts files
|
|
12
|
+
if (!filePath.endsWith('.ts')) {
|
|
13
|
+
return;
|
|
14
|
+
}
|
|
15
|
+
const content = tree.read(filePath, 'utf-8');
|
|
16
|
+
const ast = tsquery_1.tsquery.ast(content);
|
|
17
|
+
const routerModuleForRootCall = getRouterModuleForRootCall(ast);
|
|
18
|
+
if (!routerModuleForRootCall) {
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
const initialNavigationAssignment = getInitialNavigationAssignment(routerModuleForRootCall.arguments[1]);
|
|
22
|
+
if (!initialNavigationAssignment) {
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
const updatedInitialNavigationAssignment = printer.printNode(typescript_1.EmitHint.Unspecified, typescript_1.factory.updatePropertyAssignment(initialNavigationAssignment, initialNavigationAssignment.name, typescript_1.factory.createIdentifier(`'enabledBlocking'`)), initialNavigationAssignment.getSourceFile());
|
|
26
|
+
const updatedContent = `${content.slice(0, initialNavigationAssignment.getStart())}${updatedInitialNavigationAssignment}${content.slice(initialNavigationAssignment.getEnd())}`;
|
|
27
|
+
tree.write(filePath, updatedContent);
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
await (0, devkit_1.formatFiles)(tree);
|
|
34
31
|
}
|
|
35
32
|
exports.default = default_1;
|
|
36
33
|
function getInitialNavigationAssignment(extraOptionsLiteral) {
|
|
@@ -44,17 +41,12 @@ function getInitialNavigationAssignment(extraOptionsLiteral) {
|
|
|
44
41
|
}
|
|
45
42
|
return null;
|
|
46
43
|
}
|
|
47
|
-
function getProjectsWithAngularRouter(tree) {
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
return target === 'npm:@angular/router' &&
|
|
54
|
-
!((_a = projectGraph.externalNodes) === null || _a === void 0 ? void 0 : _a[node]);
|
|
55
|
-
}))
|
|
56
|
-
.map(([projectName]) => (0, devkit_1.readProjectConfiguration)(tree, projectName));
|
|
57
|
-
});
|
|
44
|
+
async function getProjectsWithAngularRouter(tree) {
|
|
45
|
+
const projectGraph = await (0, devkit_1.createProjectGraphAsync)();
|
|
46
|
+
return Object.entries(projectGraph.dependencies)
|
|
47
|
+
.filter(([node, dep]) => dep.some(({ target }) => target === 'npm:@angular/router' &&
|
|
48
|
+
!projectGraph.externalNodes?.[node]))
|
|
49
|
+
.map(([projectName]) => (0, devkit_1.readProjectConfiguration)(tree, projectName));
|
|
58
50
|
}
|
|
59
51
|
function getRouterModuleForRootCall(sourceFile) {
|
|
60
52
|
// narrow down call expressions
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
const tslib_1 = require("tslib");
|
|
4
3
|
const devkit_1 = require("@nx/devkit");
|
|
5
4
|
const devkit_2 = require("@nx/devkit");
|
|
6
5
|
const tsquery_1 = require("@phenomnomnominal/tsquery");
|
|
@@ -16,62 +15,56 @@ const executors = [
|
|
|
16
15
|
'@nrwl/angular:package',
|
|
17
16
|
];
|
|
18
17
|
const skipTargets = ['es2020', 'es2021', 'es2022', 'esnext'];
|
|
19
|
-
function default_1(tree) {
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
}
|
|
37
|
-
yield (0, devkit_2.formatFiles)(tree);
|
|
38
|
-
});
|
|
18
|
+
async function default_1(tree) {
|
|
19
|
+
const tsConfigPaths = await collectTsConfigPaths(tree);
|
|
20
|
+
for (const tsConfigPath of tsConfigPaths) {
|
|
21
|
+
(0, devkit_2.updateJson)(tree, tsConfigPath, (json) => {
|
|
22
|
+
if (!json.compilerOptions?.target ||
|
|
23
|
+
(json.compilerOptions?.target &&
|
|
24
|
+
!skipTargets.includes(json.compilerOptions.target.toLowerCase()))) {
|
|
25
|
+
json.compilerOptions ??= {};
|
|
26
|
+
json.compilerOptions.target = 'es2020';
|
|
27
|
+
}
|
|
28
|
+
return json;
|
|
29
|
+
}, {
|
|
30
|
+
allowTrailingComma: true,
|
|
31
|
+
disallowComments: false,
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
await (0, devkit_2.formatFiles)(tree);
|
|
39
35
|
}
|
|
40
36
|
exports.default = default_1;
|
|
41
|
-
function collectTsConfigPaths(tree) {
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
allowTrailingComma: true,
|
|
60
|
-
disallowComments: false,
|
|
61
|
-
});
|
|
62
|
-
if ((_a = tsConfig.compilerOptions) === null || _a === void 0 ? void 0 : _a.target) {
|
|
63
|
-
uniqueTsConfigs.add(tsConfigPath);
|
|
64
|
-
}
|
|
37
|
+
async function collectTsConfigPaths(tree) {
|
|
38
|
+
const uniqueTsConfigs = new Set([]);
|
|
39
|
+
const projectGraph = await (0, devkit_2.createProjectGraphAsync)();
|
|
40
|
+
const angularProjects = Object.entries(projectGraph.dependencies)
|
|
41
|
+
.filter(([node, dep]) => dep.some(({ target }) => target === 'npm:@angular/core' && !projectGraph.externalNodes?.[node]))
|
|
42
|
+
.map(([projectName]) => ({
|
|
43
|
+
projectName,
|
|
44
|
+
project: (0, devkit_2.readProjectConfiguration)(tree, projectName),
|
|
45
|
+
}));
|
|
46
|
+
for (const { projectName, project } of angularProjects) {
|
|
47
|
+
const tsConfigPath = (0, devkit_2.joinPathFragments)(project.root, 'tsconfig.json');
|
|
48
|
+
if (tree.exists(tsConfigPath)) {
|
|
49
|
+
uniqueTsConfigs.add(tsConfigPath);
|
|
50
|
+
const targetTsConfigPaths = getProjectTsConfigPaths(tree, project, projectName, false);
|
|
51
|
+
targetTsConfigPaths.forEach((tsConfigPath) => {
|
|
52
|
+
const tsConfig = (0, devkit_1.readJson)(tree, tsConfigPath, {
|
|
53
|
+
allowTrailingComma: true,
|
|
54
|
+
disallowComments: false,
|
|
65
55
|
});
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
}
|
|
56
|
+
if (tsConfig.compilerOptions?.target) {
|
|
57
|
+
uniqueTsConfigs.add(tsConfigPath);
|
|
58
|
+
}
|
|
59
|
+
});
|
|
60
|
+
continue;
|
|
72
61
|
}
|
|
73
|
-
|
|
74
|
-
|
|
62
|
+
const tsConfigPaths = getProjectTsConfigPaths(tree, project, projectName);
|
|
63
|
+
for (const tsConfigPath of tsConfigPaths) {
|
|
64
|
+
uniqueTsConfigs.add(tsConfigPath);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
return Array.from(uniqueTsConfigs);
|
|
75
68
|
}
|
|
76
69
|
function getProjectTsConfigPaths(tree, project, projectName, shouldWarn = true) {
|
|
77
70
|
const tsConfigPaths = new Set();
|
|
@@ -149,12 +142,11 @@ function getTsConfigFromJestConfig(tree, jestConfigPath, targetName, projectName
|
|
|
149
142
|
return tsConfigPath;
|
|
150
143
|
}
|
|
151
144
|
function getPathValuesFromTarget(target, option) {
|
|
152
|
-
var _a, _b;
|
|
153
145
|
const values = [];
|
|
154
|
-
if (
|
|
146
|
+
if (target.options?.[option]) {
|
|
155
147
|
values.push(target.options[option]);
|
|
156
148
|
}
|
|
157
|
-
Object.values(
|
|
149
|
+
Object.values(target.configurations ?? {}).forEach((options) => {
|
|
158
150
|
if (options[option]) {
|
|
159
151
|
values.push(options[option]);
|
|
160
152
|
}
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.renameSetupMfeGeneratorUsages = exports.replaceExportedMFETypes = exports.replaceNrwlAngularMfImport = void 0;
|
|
4
|
-
const tslib_1 = require("tslib");
|
|
5
4
|
const devkit_1 = require("@nx/devkit");
|
|
6
5
|
const path_1 = require("path");
|
|
7
6
|
const tsquery_1 = require("@phenomnomnominal/tsquery");
|
|
@@ -73,22 +72,20 @@ function renameSetupMfeGeneratorUsages(fileContents) {
|
|
|
73
72
|
return fileContents;
|
|
74
73
|
}
|
|
75
74
|
exports.renameSetupMfeGeneratorUsages = renameSetupMfeGeneratorUsages;
|
|
76
|
-
function default_1(tree) {
|
|
77
|
-
|
|
78
|
-
(0,
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
tree.write(path, fileContents);
|
|
91
|
-
});
|
|
75
|
+
async function default_1(tree) {
|
|
76
|
+
(0, devkit_1.visitNotIgnoredFiles)(tree, '/', (path) => {
|
|
77
|
+
const pathExtName = (0, path_1.extname)(path);
|
|
78
|
+
if (pathExtName !== '.ts' && pathExtName !== '.js') {
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
let fileContents = tree.read(path, 'utf-8');
|
|
82
|
+
fileContents = replaceNrwlAngularMfImport(fileContents);
|
|
83
|
+
if (pathExtName === '.ts') {
|
|
84
|
+
// Only TS files can import types and interfaces
|
|
85
|
+
fileContents = replaceExportedMFETypes(fileContents);
|
|
86
|
+
fileContents = renameSetupMfeGeneratorUsages(fileContents);
|
|
87
|
+
}
|
|
88
|
+
tree.write(path, fileContents);
|
|
92
89
|
});
|
|
93
90
|
}
|
|
94
91
|
exports.default = default_1;
|
|
@@ -1,26 +1,22 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
const tslib_1 = require("tslib");
|
|
4
3
|
const devkit_1 = require("@nx/devkit");
|
|
5
4
|
const angularCliVersion = '~14.1.0';
|
|
6
|
-
function default_1(tree) {
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
json.devDependencies['@angular/cli'] = angularCliVersion;
|
|
13
|
-
shouldFormat = true;
|
|
14
|
-
}
|
|
15
|
-
else if ((_b = json.dependencies) === null || _b === void 0 ? void 0 : _b['@angular/cli']) {
|
|
16
|
-
json.dependencies['@angular/cli'] = angularCliVersion;
|
|
17
|
-
shouldFormat = true;
|
|
18
|
-
}
|
|
19
|
-
return json;
|
|
20
|
-
});
|
|
21
|
-
if (shouldFormat) {
|
|
22
|
-
yield (0, devkit_1.formatFiles)(tree);
|
|
5
|
+
async function default_1(tree) {
|
|
6
|
+
let shouldFormat = false;
|
|
7
|
+
(0, devkit_1.updateJson)(tree, 'package.json', (json) => {
|
|
8
|
+
if (json.devDependencies?.['@angular/cli']) {
|
|
9
|
+
json.devDependencies['@angular/cli'] = angularCliVersion;
|
|
10
|
+
shouldFormat = true;
|
|
23
11
|
}
|
|
12
|
+
else if (json.dependencies?.['@angular/cli']) {
|
|
13
|
+
json.dependencies['@angular/cli'] = angularCliVersion;
|
|
14
|
+
shouldFormat = true;
|
|
15
|
+
}
|
|
16
|
+
return json;
|
|
24
17
|
});
|
|
18
|
+
if (shouldFormat) {
|
|
19
|
+
await (0, devkit_1.formatFiles)(tree);
|
|
20
|
+
}
|
|
25
21
|
}
|
|
26
22
|
exports.default = default_1;
|
|
@@ -1,26 +1,22 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
const tslib_1 = require("tslib");
|
|
4
3
|
const devkit_1 = require("@nx/devkit");
|
|
5
4
|
const angularCliVersion = '~14.2.0';
|
|
6
|
-
function default_1(tree) {
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
json.devDependencies['@angular/cli'] = angularCliVersion;
|
|
13
|
-
shouldFormat = true;
|
|
14
|
-
}
|
|
15
|
-
else if ((_b = json.dependencies) === null || _b === void 0 ? void 0 : _b['@angular/cli']) {
|
|
16
|
-
json.dependencies['@angular/cli'] = angularCliVersion;
|
|
17
|
-
shouldFormat = true;
|
|
18
|
-
}
|
|
19
|
-
return json;
|
|
20
|
-
});
|
|
21
|
-
if (shouldFormat) {
|
|
22
|
-
yield (0, devkit_1.formatFiles)(tree);
|
|
5
|
+
async function default_1(tree) {
|
|
6
|
+
let shouldFormat = false;
|
|
7
|
+
(0, devkit_1.updateJson)(tree, 'package.json', (json) => {
|
|
8
|
+
if (json.devDependencies?.['@angular/cli']) {
|
|
9
|
+
json.devDependencies['@angular/cli'] = angularCliVersion;
|
|
10
|
+
shouldFormat = true;
|
|
23
11
|
}
|
|
12
|
+
else if (json.dependencies?.['@angular/cli']) {
|
|
13
|
+
json.dependencies['@angular/cli'] = angularCliVersion;
|
|
14
|
+
shouldFormat = true;
|
|
15
|
+
}
|
|
16
|
+
return json;
|
|
24
17
|
});
|
|
18
|
+
if (shouldFormat) {
|
|
19
|
+
await (0, devkit_1.formatFiles)(tree);
|
|
20
|
+
}
|
|
25
21
|
}
|
|
26
22
|
exports.default = default_1;
|
|
@@ -1,40 +1,35 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
const tslib_1 = require("tslib");
|
|
4
3
|
const devkit_1 = require("@nx/devkit");
|
|
5
4
|
const executor_options_utils_1 = require("@nx/devkit/src/generators/executor-options-utils");
|
|
6
|
-
function default_1(tree) {
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
const
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
'!{projectRoot}/karma.conf.js',
|
|
19
|
-
]) {
|
|
20
|
-
productionFileset.add(exclusion);
|
|
21
|
-
}
|
|
22
|
-
nxJson.namedInputs.production = Array.from(productionFileset);
|
|
5
|
+
async function default_1(tree) {
|
|
6
|
+
const nxJson = (0, devkit_1.readNxJson)(tree);
|
|
7
|
+
const karmaTargets = getKarmaTargetNames(tree);
|
|
8
|
+
const hasProductionFileset = !!nxJson.namedInputs?.production;
|
|
9
|
+
if (karmaTargets.size > 0 && hasProductionFileset) {
|
|
10
|
+
const productionFileset = new Set(nxJson.namedInputs.production);
|
|
11
|
+
for (const exclusion of [
|
|
12
|
+
'!{projectRoot}/**/*.spec.[jt]s',
|
|
13
|
+
'!{projectRoot}/tsconfig.spec.json',
|
|
14
|
+
'!{projectRoot}/karma.conf.js',
|
|
15
|
+
]) {
|
|
16
|
+
productionFileset.add(exclusion);
|
|
23
17
|
}
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
18
|
+
nxJson.namedInputs.production = Array.from(productionFileset);
|
|
19
|
+
}
|
|
20
|
+
for (const targetName of karmaTargets) {
|
|
21
|
+
nxJson.targetDefaults ??= {};
|
|
22
|
+
const jestTargetDefaults = (nxJson.targetDefaults[targetName] ??= {});
|
|
23
|
+
jestTargetDefaults.inputs ??= [
|
|
24
|
+
'default',
|
|
25
|
+
hasProductionFileset ? '^production' : '^default',
|
|
26
|
+
...(tree.exists('karma.conf.js')
|
|
27
|
+
? ['{workspaceRoot}/karma.conf.js']
|
|
28
|
+
: []),
|
|
29
|
+
];
|
|
30
|
+
}
|
|
31
|
+
(0, devkit_1.updateNxJson)(tree, nxJson);
|
|
32
|
+
await (0, devkit_1.formatFiles)(tree);
|
|
38
33
|
}
|
|
39
34
|
exports.default = default_1;
|
|
40
35
|
function getKarmaTargetNames(tree) {
|
|
@@ -1,83 +1,78 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
const tslib_1 = require("tslib");
|
|
4
3
|
const devkit_1 = require("@nx/devkit");
|
|
5
4
|
const path_1 = require("path");
|
|
6
5
|
const tsquery_1 = require("@phenomnomnominal/tsquery");
|
|
7
6
|
const versions_1 = require("../../utils/versions");
|
|
8
7
|
const semver_1 = require("@nx/devkit/src/utils/semver");
|
|
9
8
|
const semver_2 = require("semver");
|
|
10
|
-
function switchToJasmineMarbles(tree) {
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
addJasmineMarblesDevDependencyIfUsed(tree, usesJasmineMarbles);
|
|
14
|
-
});
|
|
9
|
+
async function switchToJasmineMarbles(tree) {
|
|
10
|
+
const usesJasmineMarbles = await replaceJasmineMarbleUsagesInFiles(tree);
|
|
11
|
+
addJasmineMarblesDevDependencyIfUsed(tree, usesJasmineMarbles);
|
|
15
12
|
}
|
|
16
13
|
exports.default = switchToJasmineMarbles;
|
|
17
|
-
function replaceJasmineMarbleUsagesInFiles(tree) {
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
14
|
+
async function replaceJasmineMarbleUsagesInFiles(tree) {
|
|
15
|
+
let usesJasmineMarbles = false;
|
|
16
|
+
const projectGraph = await (() => {
|
|
17
|
+
try {
|
|
18
|
+
return (0, devkit_1.readCachedProjectGraph)();
|
|
19
|
+
}
|
|
20
|
+
catch {
|
|
21
|
+
return (0, devkit_1.createProjectGraphAsync)();
|
|
22
|
+
}
|
|
23
|
+
})();
|
|
24
|
+
const dirsToTraverse = Object.entries(projectGraph.dependencies)
|
|
25
|
+
.filter(([node, dep]) => dep.some(({ target }) => target === 'npm:@nrwl/angular' && !projectGraph.externalNodes?.[node]))
|
|
26
|
+
.map(([projectName]) => (0, devkit_1.readProjectConfiguration)(tree, projectName).root);
|
|
27
|
+
for (const dir of dirsToTraverse) {
|
|
28
|
+
(0, devkit_1.visitNotIgnoredFiles)(tree, dir, (path) => {
|
|
29
|
+
if ((0, path_1.extname)(path) !== '.ts') {
|
|
30
|
+
return;
|
|
23
31
|
}
|
|
24
|
-
|
|
25
|
-
|
|
32
|
+
const fileContents = tree.read(path, 'utf-8');
|
|
33
|
+
if (!fileContents.includes('@nrwl/angular/testing')) {
|
|
34
|
+
return;
|
|
26
35
|
}
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
return;
|
|
50
|
-
}
|
|
51
|
-
const IMPORT_SPECIFIERS_SELECTOR = 'NamedImports > ImportSpecifier';
|
|
52
|
-
const importSpecifierNodes = (0, tsquery_1.tsquery)(nrwlAngularTestingImportNodes[0], IMPORT_SPECIFIERS_SELECTOR, { visitAllChildren: true });
|
|
53
|
-
if (!importSpecifierNodes || importSpecifierNodes.length === 0) {
|
|
54
|
-
return;
|
|
55
|
-
}
|
|
56
|
-
const validNrwlTestingImports = [];
|
|
57
|
-
const validJasmineMarbleImports = [];
|
|
58
|
-
for (const node of importSpecifierNodes) {
|
|
59
|
-
const importSymbol = node.getText();
|
|
60
|
-
if (jasmineMarblesExportsRegex.test(importSymbol)) {
|
|
61
|
-
validJasmineMarbleImports.push(importSymbol);
|
|
62
|
-
}
|
|
63
|
-
else {
|
|
64
|
-
validNrwlTestingImports.push(importSymbol);
|
|
65
|
-
}
|
|
36
|
+
const NRWL_ANGULAR_TESTING_IMPORT_SELECTOR = 'ImportDeclaration:has(StringLiteral[value="@nrwl/angular/testing"])';
|
|
37
|
+
const ast = tsquery_1.tsquery.ast(fileContents);
|
|
38
|
+
const nrwlAngularTestingImportNodes = (0, tsquery_1.tsquery)(ast, NRWL_ANGULAR_TESTING_IMPORT_SELECTOR, { visitAllChildren: true });
|
|
39
|
+
if (!nrwlAngularTestingImportNodes ||
|
|
40
|
+
nrwlAngularTestingImportNodes.length === 0) {
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
const jasmineMarblesExportsRegex = new RegExp(/(hot|cold|getTestScheduler|time)/);
|
|
44
|
+
if (!jasmineMarblesExportsRegex.test(nrwlAngularTestingImportNodes[0].getText())) {
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
const IMPORT_SPECIFIERS_SELECTOR = 'NamedImports > ImportSpecifier';
|
|
48
|
+
const importSpecifierNodes = (0, tsquery_1.tsquery)(nrwlAngularTestingImportNodes[0], IMPORT_SPECIFIERS_SELECTOR, { visitAllChildren: true });
|
|
49
|
+
if (!importSpecifierNodes || importSpecifierNodes.length === 0) {
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
const validNrwlTestingImports = [];
|
|
53
|
+
const validJasmineMarbleImports = [];
|
|
54
|
+
for (const node of importSpecifierNodes) {
|
|
55
|
+
const importSymbol = node.getText();
|
|
56
|
+
if (jasmineMarblesExportsRegex.test(importSymbol)) {
|
|
57
|
+
validJasmineMarbleImports.push(importSymbol);
|
|
66
58
|
}
|
|
67
|
-
|
|
68
|
-
|
|
59
|
+
else {
|
|
60
|
+
validNrwlTestingImports.push(importSymbol);
|
|
69
61
|
}
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
62
|
+
}
|
|
63
|
+
if (!usesJasmineMarbles && validJasmineMarbleImports.length > 0) {
|
|
64
|
+
usesJasmineMarbles = true;
|
|
65
|
+
}
|
|
66
|
+
const newFileContents = `${fileContents.slice(0, nrwlAngularTestingImportNodes[0].getStart())}${validNrwlTestingImports.length > 0
|
|
67
|
+
? `import {${validNrwlTestingImports.join(',')}} from '@nrwl/angular/testing';`
|
|
68
|
+
: ''}
|
|
73
69
|
${validJasmineMarbleImports.length > 0
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
});
|
|
70
|
+
? `import {${validJasmineMarbleImports.join(',')}} from 'jasmine-marbles';${fileContents.slice(nrwlAngularTestingImportNodes[0].getEnd(), -1)}`
|
|
71
|
+
: ''}`;
|
|
72
|
+
tree.write(path, newFileContents);
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
return usesJasmineMarbles;
|
|
81
76
|
}
|
|
82
77
|
function addJasmineMarblesDevDependencyIfUsed(tree, usesJasmineMarbles) {
|
|
83
78
|
if (!usesJasmineMarbles) {
|
|
@@ -95,13 +90,12 @@ function addJasmineMarblesDevDependencyIfUsed(tree, usesJasmineMarbles) {
|
|
|
95
90
|
});
|
|
96
91
|
}
|
|
97
92
|
function getJasmineMarblesVersion(tree) {
|
|
98
|
-
var _a;
|
|
99
93
|
let rxjsVersion;
|
|
100
94
|
try {
|
|
101
95
|
const { dependencies, devDependencies } = (0, devkit_1.readJson)(tree, 'package.json');
|
|
102
|
-
rxjsVersion = (0, semver_1.checkAndCleanWithSemver)('rxjs',
|
|
96
|
+
rxjsVersion = (0, semver_1.checkAndCleanWithSemver)('rxjs', dependencies?.rxjs ?? devDependencies?.rxjs);
|
|
103
97
|
}
|
|
104
|
-
catch
|
|
98
|
+
catch {
|
|
105
99
|
rxjsVersion = (0, semver_1.checkAndCleanWithSemver)('rxjs', versions_1.rxjsVersion);
|
|
106
100
|
}
|
|
107
101
|
return (0, semver_2.gte)(rxjsVersion, '7.0.0') ? versions_1.jasmineMarblesVersion : '~0.8.3';
|