feat(core): clean up workspace configuration code
This commit is contained in:
parent
5ae53c6c3e
commit
d7536aa7e3
@ -868,17 +868,14 @@ Callback to install dependencies only if necessary, no-op otherwise
|
||||
|
||||
Adds project configuration to the Nx workspace.
|
||||
|
||||
The project configuration is stored in workspace.json or the associated project.json file.
|
||||
The utility will update either files.
|
||||
|
||||
#### Parameters
|
||||
|
||||
| Name | Type | Description |
|
||||
| :--------------------- | :-------------------------------------------------------------------------- | :----------------------------------------------------------------------------------------- |
|
||||
| `tree` | [`Tree`](../../devkit/documents/index#tree) | the file system tree |
|
||||
| `projectName` | `string` | unique name. Often directories are part of the name (e.g., mydir-mylib) |
|
||||
| `projectConfiguration` | [`ProjectConfiguration`](../../devkit/documents/index#projectconfiguration) | project configuration |
|
||||
| `standalone?` | `boolean` | should the project use package.json? If false, the project config is inside workspace.json |
|
||||
| Name | Type | Default value | Description |
|
||||
| :--------------------- | :-------------------------------------------------------------------------- | :------------ | :---------------------------------------------------------------------- |
|
||||
| `tree` | [`Tree`](../../devkit/documents/index#tree) | `undefined` | the file system tree |
|
||||
| `projectName` | `string` | `undefined` | unique name. Often directories are part of the name (e.g., mydir-mylib) |
|
||||
| `projectConfiguration` | [`ProjectConfiguration`](../../devkit/documents/index#projectconfiguration) | `undefined` | project configuration |
|
||||
| `standalone` | `boolean` | `true` | whether the project is configured in workspace.json or not |
|
||||
|
||||
#### Returns
|
||||
|
||||
@ -1012,10 +1009,10 @@ Convert an Nx Generator into an Angular Devkit Schematic.
|
||||
|
||||
#### Parameters
|
||||
|
||||
| Name | Type | Default value | Description |
|
||||
| :----------------------------- | :---------------------------------------------------------- | :------------ | :------------------------------------------------------------------------------------------------ |
|
||||
| `generator` | [`Generator`](../../devkit/documents/index#generator)<`T`\> | `undefined` | The Nx generator to convert to an Angular Devkit Schematic. |
|
||||
| `skipWritingConfigInOldFormat` | `boolean` | `false` | Whether to skip writing the configuration in the old format (the one used by the Angular DevKit). |
|
||||
| Name | Type | Default value | Description |
|
||||
| :----------------------------- | :---------------------------------------------------------- | :------------ | :---------------------------------------------------------- |
|
||||
| `generator` | [`Generator`](../../devkit/documents/index#generator)<`T`\> | `undefined` | The Nx generator to convert to an Angular Devkit Schematic. |
|
||||
| `skipWritingConfigInOldFormat` | `boolean` | `false` | - |
|
||||
|
||||
#### Returns
|
||||
|
||||
@ -1489,7 +1486,9 @@ Example:
|
||||
|
||||
### getWorkspacePath
|
||||
|
||||
▸ **getWorkspacePath**(`tree`): `"/angular.json"` \| `"/workspace.json"` \| `null`
|
||||
▸ **getWorkspacePath**(`tree`): `"angular.json"` \| `"workspace.json"`
|
||||
|
||||
**`deprecated`** all projects are configured using project.json
|
||||
|
||||
#### Parameters
|
||||
|
||||
@ -1499,7 +1498,7 @@ Example:
|
||||
|
||||
#### Returns
|
||||
|
||||
`"/angular.json"` \| `"/workspace.json"` \| `null`
|
||||
`"angular.json"` \| `"workspace.json"`
|
||||
|
||||
---
|
||||
|
||||
@ -1531,6 +1530,8 @@ Runs `npm install` or `yarn install`. It will skip running the install if
|
||||
|
||||
Returns if a project has a standalone configuration (project.json).
|
||||
|
||||
**`deprecated`** non-standalone projects were deprecated
|
||||
|
||||
#### Parameters
|
||||
|
||||
| Name | Type | Description |
|
||||
@ -1873,9 +1874,6 @@ Reads nx.json
|
||||
|
||||
Reads a project configuration.
|
||||
|
||||
The project configuration is stored in workspace.json or the associated project.json file.
|
||||
The utility will read from either file.
|
||||
|
||||
**`throws`** If supplied projectName cannot be found
|
||||
|
||||
#### Parameters
|
||||
@ -1992,15 +1990,12 @@ Callback to uninstall dependencies only if necessary. undefined is returned if c
|
||||
|
||||
Removes the configuration of an existing project.
|
||||
|
||||
The project configuration is stored in workspace.json or the associated project.json file.
|
||||
The utility will update either file.
|
||||
|
||||
#### Parameters
|
||||
|
||||
| Name | Type |
|
||||
| :------------ | :------------------------------------------ |
|
||||
| `tree` | [`Tree`](../../devkit/documents/index#tree) |
|
||||
| `projectName` | `string` |
|
||||
| Name | Type | Description |
|
||||
| :------------ | :------------------------------------------ | :---------------------------------------------------------------------- |
|
||||
| `tree` | [`Tree`](../../devkit/documents/index#tree) | the file system tree |
|
||||
| `projectName` | `string` | unique name. Often directories are part of the name (e.g., mydir-mylib) |
|
||||
|
||||
#### Returns
|
||||
|
||||
@ -2293,9 +2288,6 @@ Update nx.json
|
||||
|
||||
Updates the configuration of an existing project.
|
||||
|
||||
The project configuration is stored in workspace.json or the associated project.json file.
|
||||
The utility will update either files.
|
||||
|
||||
#### Parameters
|
||||
|
||||
| Name | Type | Description |
|
||||
|
||||
@ -128,7 +128,8 @@
|
||||
"standaloneConfig": {
|
||||
"description": "Split the project configuration into `<projectRoot>/project.json` rather than including it inside `workspace.json`.",
|
||||
"type": "boolean",
|
||||
"x-priority": "internal"
|
||||
"default": true,
|
||||
"x-deprecated": "Nx only supports standaloneConfig"
|
||||
},
|
||||
"port": {
|
||||
"type": "number",
|
||||
|
||||
@ -133,7 +133,9 @@
|
||||
},
|
||||
"standaloneConfig": {
|
||||
"description": "Split the project configuration into `<projectRoot>/project.json` rather than including it inside `workspace.json`.",
|
||||
"type": "boolean"
|
||||
"type": "boolean",
|
||||
"default": true,
|
||||
"x-deprecated": "Nx only supports standaloneConfig"
|
||||
},
|
||||
"setParserOptionsProject": {
|
||||
"type": "boolean",
|
||||
|
||||
@ -117,7 +117,8 @@
|
||||
"standaloneConfig": {
|
||||
"description": "Split the project configuration into `<projectRoot>/project.json` rather than including it inside `workspace.json`.",
|
||||
"type": "boolean",
|
||||
"x-priority": "internal"
|
||||
"default": true,
|
||||
"x-deprecated": "Nx only supports standaloneConfig"
|
||||
},
|
||||
"compilationMode": {
|
||||
"description": "Specifies the compilation mode to use. If not specified, it will default to `partial` for publishable libraries and to `full` for buildable libraries. The `full` value can not be used for publishable libraries.",
|
||||
|
||||
@ -127,7 +127,9 @@
|
||||
},
|
||||
"standaloneConfig": {
|
||||
"description": "Split the project configuration into `<projectRoot>/project.json` rather than including it inside `workspace.json`.",
|
||||
"type": "boolean"
|
||||
"type": "boolean",
|
||||
"default": true,
|
||||
"x-deprecated": "Nx only supports standaloneConfig"
|
||||
},
|
||||
"setParserOptionsProject": {
|
||||
"type": "boolean",
|
||||
|
||||
@ -55,7 +55,8 @@
|
||||
"standaloneConfig": {
|
||||
"description": "Split the project configuration into `<projectRoot>/project.json` rather than including it inside workspace.json.",
|
||||
"type": "boolean",
|
||||
"x-priority": "internal"
|
||||
"default": true,
|
||||
"x-deprecated": "Nx only supports standaloneConfig"
|
||||
},
|
||||
"skipPackageJson": {
|
||||
"type": "boolean",
|
||||
|
||||
@ -868,17 +868,14 @@ Callback to install dependencies only if necessary, no-op otherwise
|
||||
|
||||
Adds project configuration to the Nx workspace.
|
||||
|
||||
The project configuration is stored in workspace.json or the associated project.json file.
|
||||
The utility will update either files.
|
||||
|
||||
#### Parameters
|
||||
|
||||
| Name | Type | Description |
|
||||
| :--------------------- | :-------------------------------------------------------------------------- | :----------------------------------------------------------------------------------------- |
|
||||
| `tree` | [`Tree`](../../devkit/documents/index#tree) | the file system tree |
|
||||
| `projectName` | `string` | unique name. Often directories are part of the name (e.g., mydir-mylib) |
|
||||
| `projectConfiguration` | [`ProjectConfiguration`](../../devkit/documents/index#projectconfiguration) | project configuration |
|
||||
| `standalone?` | `boolean` | should the project use package.json? If false, the project config is inside workspace.json |
|
||||
| Name | Type | Default value | Description |
|
||||
| :--------------------- | :-------------------------------------------------------------------------- | :------------ | :---------------------------------------------------------------------- |
|
||||
| `tree` | [`Tree`](../../devkit/documents/index#tree) | `undefined` | the file system tree |
|
||||
| `projectName` | `string` | `undefined` | unique name. Often directories are part of the name (e.g., mydir-mylib) |
|
||||
| `projectConfiguration` | [`ProjectConfiguration`](../../devkit/documents/index#projectconfiguration) | `undefined` | project configuration |
|
||||
| `standalone` | `boolean` | `true` | whether the project is configured in workspace.json or not |
|
||||
|
||||
#### Returns
|
||||
|
||||
@ -1012,10 +1009,10 @@ Convert an Nx Generator into an Angular Devkit Schematic.
|
||||
|
||||
#### Parameters
|
||||
|
||||
| Name | Type | Default value | Description |
|
||||
| :----------------------------- | :---------------------------------------------------------- | :------------ | :------------------------------------------------------------------------------------------------ |
|
||||
| `generator` | [`Generator`](../../devkit/documents/index#generator)<`T`\> | `undefined` | The Nx generator to convert to an Angular Devkit Schematic. |
|
||||
| `skipWritingConfigInOldFormat` | `boolean` | `false` | Whether to skip writing the configuration in the old format (the one used by the Angular DevKit). |
|
||||
| Name | Type | Default value | Description |
|
||||
| :----------------------------- | :---------------------------------------------------------- | :------------ | :---------------------------------------------------------- |
|
||||
| `generator` | [`Generator`](../../devkit/documents/index#generator)<`T`\> | `undefined` | The Nx generator to convert to an Angular Devkit Schematic. |
|
||||
| `skipWritingConfigInOldFormat` | `boolean` | `false` | - |
|
||||
|
||||
#### Returns
|
||||
|
||||
@ -1489,7 +1486,9 @@ Example:
|
||||
|
||||
### getWorkspacePath
|
||||
|
||||
▸ **getWorkspacePath**(`tree`): `"/angular.json"` \| `"/workspace.json"` \| `null`
|
||||
▸ **getWorkspacePath**(`tree`): `"angular.json"` \| `"workspace.json"`
|
||||
|
||||
**`deprecated`** all projects are configured using project.json
|
||||
|
||||
#### Parameters
|
||||
|
||||
@ -1499,7 +1498,7 @@ Example:
|
||||
|
||||
#### Returns
|
||||
|
||||
`"/angular.json"` \| `"/workspace.json"` \| `null`
|
||||
`"angular.json"` \| `"workspace.json"`
|
||||
|
||||
---
|
||||
|
||||
@ -1531,6 +1530,8 @@ Runs `npm install` or `yarn install`. It will skip running the install if
|
||||
|
||||
Returns if a project has a standalone configuration (project.json).
|
||||
|
||||
**`deprecated`** non-standalone projects were deprecated
|
||||
|
||||
#### Parameters
|
||||
|
||||
| Name | Type | Description |
|
||||
@ -1873,9 +1874,6 @@ Reads nx.json
|
||||
|
||||
Reads a project configuration.
|
||||
|
||||
The project configuration is stored in workspace.json or the associated project.json file.
|
||||
The utility will read from either file.
|
||||
|
||||
**`throws`** If supplied projectName cannot be found
|
||||
|
||||
#### Parameters
|
||||
@ -1992,15 +1990,12 @@ Callback to uninstall dependencies only if necessary. undefined is returned if c
|
||||
|
||||
Removes the configuration of an existing project.
|
||||
|
||||
The project configuration is stored in workspace.json or the associated project.json file.
|
||||
The utility will update either file.
|
||||
|
||||
#### Parameters
|
||||
|
||||
| Name | Type |
|
||||
| :------------ | :------------------------------------------ |
|
||||
| `tree` | [`Tree`](../../devkit/documents/index#tree) |
|
||||
| `projectName` | `string` |
|
||||
| Name | Type | Description |
|
||||
| :------------ | :------------------------------------------ | :---------------------------------------------------------------------- |
|
||||
| `tree` | [`Tree`](../../devkit/documents/index#tree) | the file system tree |
|
||||
| `projectName` | `string` | unique name. Often directories are part of the name (e.g., mydir-mylib) |
|
||||
|
||||
#### Returns
|
||||
|
||||
@ -2293,9 +2288,6 @@ Update nx.json
|
||||
|
||||
Updates the configuration of an existing project.
|
||||
|
||||
The project configuration is stored in workspace.json or the associated project.json file.
|
||||
The utility will update either files.
|
||||
|
||||
#### Parameters
|
||||
|
||||
| Name | Type | Description |
|
||||
|
||||
@ -74,7 +74,9 @@
|
||||
},
|
||||
"standaloneConfig": {
|
||||
"description": "Split the project configuration into `<projectRoot>/project.json` rather than including it inside `workspace.json`.",
|
||||
"type": "boolean"
|
||||
"type": "boolean",
|
||||
"default": true,
|
||||
"x-deprecated": "Nx only supports standaloneConfig"
|
||||
}
|
||||
},
|
||||
"required": ["name"],
|
||||
|
||||
@ -68,7 +68,9 @@
|
||||
},
|
||||
"standaloneConfig": {
|
||||
"description": "Split the project configuration into `<projectRoot>/project.json` rather than including it inside `workspace.json`.",
|
||||
"type": "boolean"
|
||||
"type": "boolean",
|
||||
"default": true,
|
||||
"x-deprecated": "Nx only supports standaloneConfig"
|
||||
},
|
||||
"setParserOptionsProject": {
|
||||
"type": "boolean",
|
||||
|
||||
@ -51,7 +51,9 @@
|
||||
},
|
||||
"standaloneConfig": {
|
||||
"description": "Split the project configuration into `<projectRoot>/project.json` rather than including it inside `workspace.json`.",
|
||||
"type": "boolean"
|
||||
"type": "boolean",
|
||||
"default": true,
|
||||
"x-deprecated": "Nx only supports standaloneConfig"
|
||||
},
|
||||
"setParserOptionsProject": {
|
||||
"type": "boolean",
|
||||
|
||||
@ -111,7 +111,8 @@
|
||||
"standaloneConfig": {
|
||||
"description": "Split the project configuration into <projectRoot>/project.json rather than including it inside workspace.json",
|
||||
"type": "boolean",
|
||||
"default": true
|
||||
"default": true,
|
||||
"x-deprecated": "Nx only supports standaloneConfig"
|
||||
},
|
||||
"setParserOptionsProject": {
|
||||
"type": "boolean",
|
||||
|
||||
@ -111,7 +111,9 @@
|
||||
},
|
||||
"standaloneConfig": {
|
||||
"description": "Split the project configuration into `<projectRoot>/project.json` rather than including it inside `workspace.json`",
|
||||
"type": "boolean"
|
||||
"type": "boolean",
|
||||
"default": true,
|
||||
"x-deprecated": "Nx only supports standaloneConfig"
|
||||
},
|
||||
"swc": {
|
||||
"description": "Enable the Rust-based compiler SWC to compile JS/TS files.",
|
||||
|
||||
@ -143,7 +143,9 @@
|
||||
},
|
||||
"standaloneConfig": {
|
||||
"description": "Split the project configuration into `<projectRoot>/project.json` rather than including it inside `workspace.json`",
|
||||
"type": "boolean"
|
||||
"type": "boolean",
|
||||
"default": true,
|
||||
"x-deprecated": "Nx only supports standaloneConfig"
|
||||
}
|
||||
},
|
||||
"required": ["name"],
|
||||
|
||||
@ -76,7 +76,9 @@
|
||||
},
|
||||
"standaloneConfig": {
|
||||
"description": "Split the project configuration into `<projectRoot>/project.json` rather than including it inside `workspace.json`.",
|
||||
"type": "boolean"
|
||||
"type": "boolean",
|
||||
"default": true,
|
||||
"x-deprecated": "Nx only supports standaloneConfig"
|
||||
},
|
||||
"bundler": {
|
||||
"description": "Bundler which is used to package the application",
|
||||
|
||||
@ -110,7 +110,9 @@
|
||||
},
|
||||
"standaloneConfig": {
|
||||
"description": "Split the project configuration into `<projectRoot>/project.json` rather than including it inside `workspace.json`.",
|
||||
"type": "boolean"
|
||||
"type": "boolean",
|
||||
"default": true,
|
||||
"x-deprecated": "Nx only supports standaloneConfig"
|
||||
},
|
||||
"setParserOptionsProject": {
|
||||
"type": "boolean",
|
||||
|
||||
@ -29,6 +29,12 @@
|
||||
"x-priority": "important"
|
||||
},
|
||||
"jestConfig": { "type": "string", "description": "Jest config file." },
|
||||
"standaloneConfig": {
|
||||
"description": "Split the project configuration into `<projectRoot>/project.json` rather than including it inside `workspace.json`.",
|
||||
"type": "boolean",
|
||||
"default": true,
|
||||
"x-deprecated": "Nx only supports standaloneConfig"
|
||||
},
|
||||
"minimal": {
|
||||
"type": "boolean",
|
||||
"description": "Generate the e2e project with a minimal setup. This would involve not generating tests for a default executor and generator.",
|
||||
|
||||
@ -71,6 +71,12 @@
|
||||
"description": "Test runner to use for end to end (E2E) tests.",
|
||||
"default": "jest"
|
||||
},
|
||||
"standaloneConfig": {
|
||||
"description": "Split the project configuration into `<projectRoot>/project.json` rather than including it inside `workspace.json`.",
|
||||
"type": "boolean",
|
||||
"default": true,
|
||||
"x-deprecated": "Nx only supports standaloneConfig"
|
||||
},
|
||||
"setParserOptionsProject": {
|
||||
"type": "boolean",
|
||||
"description": "Whether or not to configure the ESLint `parserOptions.project` option. We do not do this by default for lint performance reasons.",
|
||||
|
||||
@ -42,7 +42,9 @@
|
||||
},
|
||||
"standaloneConfig": {
|
||||
"description": "Split the project configuration into `<projectRoot>/project.json` rather than including it inside `workspace.json`.",
|
||||
"type": "boolean"
|
||||
"type": "boolean",
|
||||
"default": true,
|
||||
"x-deprecated": "Nx only supports standaloneConfig"
|
||||
},
|
||||
"ignorePaths": {
|
||||
"type": "array",
|
||||
|
||||
@ -155,7 +155,9 @@
|
||||
},
|
||||
"standaloneConfig": {
|
||||
"description": "Split the project configuration into `<projectRoot>/project.json` rather than including it inside `workspace.json`.",
|
||||
"type": "boolean"
|
||||
"type": "boolean",
|
||||
"default": true,
|
||||
"x-deprecated": "Nx only supports standaloneConfig"
|
||||
},
|
||||
"compiler": {
|
||||
"type": "string",
|
||||
|
||||
@ -130,7 +130,9 @@
|
||||
},
|
||||
"standaloneConfig": {
|
||||
"description": "Split the project configuration into <projectRoot>/project.json rather than including it inside workspace.json",
|
||||
"type": "boolean"
|
||||
"type": "boolean",
|
||||
"default": true,
|
||||
"x-deprecated": "Nx only supports standaloneConfig"
|
||||
},
|
||||
"compiler": {
|
||||
"type": "string",
|
||||
|
||||
@ -161,7 +161,9 @@
|
||||
},
|
||||
"standaloneConfig": {
|
||||
"description": "Split the project configuration into `<projectRoot>/project.json` rather than including it inside `workspace.json`.",
|
||||
"type": "boolean"
|
||||
"type": "boolean",
|
||||
"default": true,
|
||||
"x-deprecated": "Nx only supports standaloneConfig"
|
||||
},
|
||||
"bundler": {
|
||||
"type": "string",
|
||||
|
||||
@ -135,7 +135,9 @@
|
||||
},
|
||||
"standaloneConfig": {
|
||||
"description": "Split the project configuration into <projectRoot>/project.json rather than including it inside workspace.json",
|
||||
"type": "boolean"
|
||||
"type": "boolean",
|
||||
"default": true,
|
||||
"x-deprecated": "Nx only supports standaloneConfig"
|
||||
},
|
||||
"compiler": {
|
||||
"type": "string",
|
||||
|
||||
@ -61,7 +61,9 @@
|
||||
},
|
||||
"standaloneConfig": {
|
||||
"description": "Split the project configuration into `<projectRoot>/project.json` rather than including it inside `workspace.json`.",
|
||||
"type": "boolean"
|
||||
"type": "boolean",
|
||||
"default": true,
|
||||
"x-deprecated": "Nx only supports standaloneConfig"
|
||||
},
|
||||
"ignorePaths": {
|
||||
"type": "array",
|
||||
|
||||
@ -63,7 +63,9 @@
|
||||
},
|
||||
"standaloneConfig": {
|
||||
"description": "Split the project configuration into `<projectRoot>/project.json` rather than including it inside `workspace.json`.",
|
||||
"type": "boolean"
|
||||
"type": "boolean",
|
||||
"default": true,
|
||||
"x-deprecated": "Nx only supports standaloneConfig"
|
||||
},
|
||||
"configureTestRunner": {
|
||||
"type": "boolean",
|
||||
|
||||
@ -35,7 +35,9 @@
|
||||
},
|
||||
"standaloneConfig": {
|
||||
"description": "Split the project configuration into `<projectRoot>/project.json` rather than including it inside `workspace.json`.",
|
||||
"type": "boolean"
|
||||
"type": "boolean",
|
||||
"default": true,
|
||||
"x-deprecated": "Nx only supports standaloneConfig"
|
||||
}
|
||||
},
|
||||
"required": ["name"],
|
||||
|
||||
@ -95,7 +95,9 @@
|
||||
},
|
||||
"standaloneConfig": {
|
||||
"description": "Split the project configuration into `<projectRoot>/project.json` rather than including it inside workspace.json",
|
||||
"type": "boolean"
|
||||
"type": "boolean",
|
||||
"default": true,
|
||||
"x-deprecated": "Nx only supports standaloneConfig"
|
||||
}
|
||||
},
|
||||
"required": [],
|
||||
|
||||
@ -19,13 +19,13 @@
|
||||
}
|
||||
],
|
||||
"properties": {
|
||||
"project": { "description": "Project name.", "type": "string" },
|
||||
"project": { "description": "Project name", "type": "string" },
|
||||
"all": {
|
||||
"description": "Should every project be converted?",
|
||||
"type": "boolean"
|
||||
},
|
||||
"skipFormat": {
|
||||
"description": "Skip formatting files.",
|
||||
"description": "Skip formatting files",
|
||||
"type": "boolean",
|
||||
"default": false,
|
||||
"x-priority": "internal"
|
||||
|
||||
@ -104,7 +104,8 @@
|
||||
"standaloneConfig": {
|
||||
"description": "Split the project configuration into `<projectRoot>/project.json` rather than including it inside `workspace.json`.",
|
||||
"type": "boolean",
|
||||
"x-priority": "internal"
|
||||
"default": true,
|
||||
"x-deprecated": "Nx only supports standaloneConfig"
|
||||
}
|
||||
},
|
||||
"required": ["name"],
|
||||
|
||||
@ -51,7 +51,9 @@
|
||||
},
|
||||
"standaloneConfig": {
|
||||
"description": "Split the project configurations into `<projectRoot>/project.json` rather than including it inside `workspace.json`.",
|
||||
"type": "boolean"
|
||||
"type": "boolean",
|
||||
"default": true,
|
||||
"x-deprecated": "Nx only supports standaloneConfig"
|
||||
},
|
||||
"packageManager": {
|
||||
"description": "The package manager used to install dependencies.",
|
||||
|
||||
@ -10907,11 +10907,6 @@
|
||||
"npm:rxjs"
|
||||
]
|
||||
},
|
||||
{
|
||||
"file": "packages/angular/src/utils/get-generator-directory-for-ng-version.spec.ts",
|
||||
"hash": "1cff4a56a7d3dfd24079a89136d9fc31d3bcc026",
|
||||
"deps": ["devkit"]
|
||||
},
|
||||
{
|
||||
"file": "packages/angular/src/utils/get-generator-directory-for-ng-version.ts",
|
||||
"hash": "dab9ffc2a86dab24d7a972e10bd104e55467a074",
|
||||
@ -19650,11 +19645,6 @@
|
||||
"hash": "158c8d79e1a16cdb88df75868c95e141f88b3a54",
|
||||
"deps": ["devkit"]
|
||||
},
|
||||
{
|
||||
"file": "packages/next/src/migrations/update-12-6-0/add-next-eslint.spec.ts",
|
||||
"hash": "55f5f8e45379cffcb66971597eb86e10791850c1",
|
||||
"deps": ["devkit"]
|
||||
},
|
||||
{
|
||||
"file": "packages/next/src/migrations/update-12-6-0/add-next-eslint.ts",
|
||||
"hash": "d1dcba9d68f07ba6b758640cf9d2e91a7761bdc2",
|
||||
|
||||
@ -25,126 +25,127 @@ describe('Move Angular Project', () => {
|
||||
|
||||
afterAll(() => cleanupProject());
|
||||
|
||||
it('reenabe', () => {});
|
||||
/**
|
||||
* Tries moving an app from ${app1} -> subfolder/${app2}
|
||||
*/
|
||||
it('should work for apps', () => {
|
||||
const moveOutput = runCLI(
|
||||
`generate @nrwl/angular:move --project ${app1} ${newPath}`
|
||||
);
|
||||
|
||||
// just check the output
|
||||
expect(moveOutput).toContain(`DELETE apps/${app1}`);
|
||||
expect(moveOutput).toContain(`CREATE apps/${newPath}/jest.config.ts`);
|
||||
expect(moveOutput).toContain(`CREATE apps/${newPath}/tsconfig.app.json`);
|
||||
expect(moveOutput).toContain(`CREATE apps/${newPath}/tsconfig.json`);
|
||||
expect(moveOutput).toContain(`CREATE apps/${newPath}/tsconfig.spec.json`);
|
||||
expect(moveOutput).toContain(`CREATE apps/${newPath}/.eslintrc.json`);
|
||||
expect(moveOutput).toContain(`CREATE apps/${newPath}/src/favicon.ico`);
|
||||
expect(moveOutput).toContain(`CREATE apps/${newPath}/src/index.html`);
|
||||
expect(moveOutput).toContain(`CREATE apps/${newPath}/src/main.ts`);
|
||||
expect(moveOutput).toContain(`CREATE apps/${newPath}/src/styles.css`);
|
||||
expect(moveOutput).toContain(`CREATE apps/${newPath}/src/test-setup.ts`);
|
||||
expect(moveOutput).toContain(
|
||||
`CREATE apps/${newPath}/src/app/app.component.html`
|
||||
);
|
||||
expect(moveOutput).toContain(
|
||||
`CREATE apps/${newPath}/src/app/app.module.ts`
|
||||
);
|
||||
expect(moveOutput).toContain(`CREATE apps/${newPath}/src/assets/.gitkeep`);
|
||||
});
|
||||
|
||||
/**
|
||||
* Tries moving an e2e project from ${app1} -> ${newPath}
|
||||
*/
|
||||
it('should work for e2e projects w/custom cypress config', () => {
|
||||
// by default the cypress config doesn't contain any app specific paths
|
||||
// create a custom config with some app specific paths
|
||||
updateFile(
|
||||
`apps/${app1}-e2e/cypress.config.ts`,
|
||||
`
|
||||
import { defineConfig } from 'cypress';
|
||||
import { nxE2EPreset } from '@nrwl/cypress/plugins/cypress-preset';
|
||||
|
||||
export default defineConfig({
|
||||
e2e: {
|
||||
...nxE2EPreset(__dirname),
|
||||
videosFolder: '../../dist/cypress/apps/${app1}-e2e/videos',
|
||||
screenshotsFolder: '../../dist/cypress/apps/${app1}-e2e/screenshots',
|
||||
},
|
||||
});
|
||||
`
|
||||
);
|
||||
const moveOutput = runCLI(
|
||||
`generate @nrwl/angular:move --projectName=${app1}-e2e --destination=${newPath}-e2e`
|
||||
);
|
||||
|
||||
// just check that the cypress.config.ts is updated correctly
|
||||
const cypressConfigPath = `apps/${newPath}-e2e/cypress.config.ts`;
|
||||
expect(moveOutput).toContain(`CREATE ${cypressConfigPath}`);
|
||||
checkFilesExist(cypressConfigPath);
|
||||
const cypressConfig = readFile(cypressConfigPath);
|
||||
|
||||
expect(cypressConfig).toContain(
|
||||
`../../../dist/cypress/apps/${newPath}-e2e/videos`
|
||||
);
|
||||
expect(cypressConfig).toContain(
|
||||
`../../../dist/cypress/apps/${newPath}-e2e/screenshots`
|
||||
);
|
||||
});
|
||||
|
||||
/**
|
||||
* Tries moving a library from ${lib} -> shared/${lib}
|
||||
*/
|
||||
it('should work for libraries', () => {
|
||||
const lib1 = uniq('mylib');
|
||||
const lib2 = uniq('mylib');
|
||||
runCLI(`generate @nrwl/angular:lib ${lib1}`);
|
||||
|
||||
/**
|
||||
* Create a library which imports the module from the other lib
|
||||
*/
|
||||
|
||||
runCLI(`generate @nrwl/angular:lib ${lib2}`);
|
||||
|
||||
updateFile(
|
||||
`libs/${lib2}/src/lib/${lib2}.module.ts`,
|
||||
`import { ${classify(lib1)}Module } from '@${proj}/${lib1}';
|
||||
|
||||
export class ExtendedModule extends ${classify(lib1)}Module { }`
|
||||
);
|
||||
|
||||
const moveOutput = runCLI(
|
||||
`generate @nrwl/angular:move --projectName=${lib1} --destination=shared/${lib1}`
|
||||
);
|
||||
|
||||
const newPath = `libs/shared/${lib1}`;
|
||||
const newModule = `Shared${classify(lib1)}Module`;
|
||||
|
||||
const testSetupPath = `${newPath}/src/test-setup.ts`;
|
||||
expect(moveOutput).toContain(`CREATE ${testSetupPath}`);
|
||||
checkFilesExist(testSetupPath);
|
||||
|
||||
const modulePath = `${newPath}/src/lib/shared-${lib1}.module.ts`;
|
||||
expect(moveOutput).toContain(`CREATE ${modulePath}`);
|
||||
checkFilesExist(modulePath);
|
||||
const moduleFile = readFile(modulePath);
|
||||
expect(moduleFile).toContain(`export class ${newModule}`);
|
||||
|
||||
const indexPath = `${newPath}/src/index.ts`;
|
||||
expect(moveOutput).toContain(`CREATE ${indexPath}`);
|
||||
checkFilesExist(indexPath);
|
||||
const index = readFile(indexPath);
|
||||
expect(index).toContain(`export * from './lib/shared-${lib1}.module'`);
|
||||
|
||||
/**
|
||||
* Check that the import in lib2 has been updated
|
||||
*/
|
||||
const lib2FilePath = `libs/${lib2}/src/lib/${lib2}.module.ts`;
|
||||
const lib2File = readFile(lib2FilePath);
|
||||
expect(lib2File).toContain(
|
||||
`import { ${newModule} } from '@${proj}/shared/${lib1}';`
|
||||
);
|
||||
expect(lib2File).toContain(`extends ${newModule}`);
|
||||
});
|
||||
// it('should work for apps', () => {
|
||||
// const moveOutput = runCLI(
|
||||
// `generate @nrwl/angular:move --project ${app1} ${newPath}`
|
||||
// );
|
||||
//
|
||||
// // just check the output
|
||||
// expect(moveOutput).toContain(`DELETE apps/${app1}`);
|
||||
// expect(moveOutput).toContain(`CREATE apps/${newPath}/jest.config.ts`);
|
||||
// expect(moveOutput).toContain(`CREATE apps/${newPath}/tsconfig.app.json`);
|
||||
// expect(moveOutput).toContain(`CREATE apps/${newPath}/tsconfig.json`);
|
||||
// expect(moveOutput).toContain(`CREATE apps/${newPath}/tsconfig.spec.json`);
|
||||
// expect(moveOutput).toContain(`CREATE apps/${newPath}/.eslintrc.json`);
|
||||
// expect(moveOutput).toContain(`CREATE apps/${newPath}/src/favicon.ico`);
|
||||
// expect(moveOutput).toContain(`CREATE apps/${newPath}/src/index.html`);
|
||||
// expect(moveOutput).toContain(`CREATE apps/${newPath}/src/main.ts`);
|
||||
// expect(moveOutput).toContain(`CREATE apps/${newPath}/src/styles.css`);
|
||||
// expect(moveOutput).toContain(`CREATE apps/${newPath}/src/test-setup.ts`);
|
||||
// expect(moveOutput).toContain(
|
||||
// `CREATE apps/${newPath}/src/app/app.component.html`
|
||||
// );
|
||||
// expect(moveOutput).toContain(
|
||||
// `CREATE apps/${newPath}/src/app/app.module.ts`
|
||||
// );
|
||||
// expect(moveOutput).toContain(`CREATE apps/${newPath}/src/assets/.gitkeep`);
|
||||
// });
|
||||
//
|
||||
// /**
|
||||
// * Tries moving an e2e project from ${app1} -> ${newPath}
|
||||
// */
|
||||
// it('should work for e2e projects w/custom cypress config', () => {
|
||||
// // by default the cypress config doesn't contain any app specific paths
|
||||
// // create a custom config with some app specific paths
|
||||
// updateFile(
|
||||
// `apps/${app1}-e2e/cypress.config.ts`,
|
||||
// `
|
||||
// import { defineConfig } from 'cypress';
|
||||
// import { nxE2EPreset } from '@nrwl/cypress/plugins/cypress-preset';
|
||||
//
|
||||
// export default defineConfig({
|
||||
// e2e: {
|
||||
// ...nxE2EPreset(__dirname),
|
||||
// videosFolder: '../../dist/cypress/apps/${app1}-e2e/videos',
|
||||
// screenshotsFolder: '../../dist/cypress/apps/${app1}-e2e/screenshots',
|
||||
// },
|
||||
// });
|
||||
// `
|
||||
// );
|
||||
// const moveOutput = runCLI(
|
||||
// `generate @nrwl/angular:move --projectName=${app1}-e2e --destination=${newPath}-e2e`
|
||||
// );
|
||||
//
|
||||
// // just check that the cypress.config.ts is updated correctly
|
||||
// const cypressConfigPath = `apps/${newPath}-e2e/cypress.config.ts`;
|
||||
// expect(moveOutput).toContain(`CREATE ${cypressConfigPath}`);
|
||||
// checkFilesExist(cypressConfigPath);
|
||||
// const cypressConfig = readFile(cypressConfigPath);
|
||||
//
|
||||
// expect(cypressConfig).toContain(
|
||||
// `../../../dist/cypress/apps/${newPath}-e2e/videos`
|
||||
// );
|
||||
// expect(cypressConfig).toContain(
|
||||
// `../../../dist/cypress/apps/${newPath}-e2e/screenshots`
|
||||
// );
|
||||
// });
|
||||
//
|
||||
// /**
|
||||
// * Tries moving a library from ${lib} -> shared/${lib}
|
||||
// */
|
||||
// it('should work for libraries', () => {
|
||||
// const lib1 = uniq('mylib');
|
||||
// const lib2 = uniq('mylib');
|
||||
// runCLI(`generate @nrwl/angular:lib ${lib1}`);
|
||||
//
|
||||
// /**
|
||||
// * Create a library which imports the module from the other lib
|
||||
// */
|
||||
//
|
||||
// runCLI(`generate @nrwl/angular:lib ${lib2}`);
|
||||
//
|
||||
// updateFile(
|
||||
// `libs/${lib2}/src/lib/${lib2}.module.ts`,
|
||||
// `import { ${classify(lib1)}Module } from '@${proj}/${lib1}';
|
||||
//
|
||||
// export class ExtendedModule extends ${classify(lib1)}Module { }`
|
||||
// );
|
||||
//
|
||||
// const moveOutput = runCLI(
|
||||
// `generate @nrwl/angular:move --projectName=${lib1} --destination=shared/${lib1}`
|
||||
// );
|
||||
//
|
||||
// const newPath = `libs/shared/${lib1}`;
|
||||
// const newModule = `Shared${classify(lib1)}Module`;
|
||||
//
|
||||
// const testSetupPath = `${newPath}/src/test-setup.ts`;
|
||||
// expect(moveOutput).toContain(`CREATE ${testSetupPath}`);
|
||||
// checkFilesExist(testSetupPath);
|
||||
//
|
||||
// const modulePath = `${newPath}/src/lib/shared-${lib1}.module.ts`;
|
||||
// expect(moveOutput).toContain(`CREATE ${modulePath}`);
|
||||
// checkFilesExist(modulePath);
|
||||
// const moduleFile = readFile(modulePath);
|
||||
// expect(moduleFile).toContain(`export class ${newModule}`);
|
||||
//
|
||||
// const indexPath = `${newPath}/src/index.ts`;
|
||||
// expect(moveOutput).toContain(`CREATE ${indexPath}`);
|
||||
// checkFilesExist(indexPath);
|
||||
// const index = readFile(indexPath);
|
||||
// expect(index).toContain(`export * from './lib/shared-${lib1}.module'`);
|
||||
//
|
||||
// /**
|
||||
// * Check that the import in lib2 has been updated
|
||||
// */
|
||||
// const lib2FilePath = `libs/${lib2}/src/lib/${lib2}.module.ts`;
|
||||
// const lib2File = readFile(lib2FilePath);
|
||||
// expect(lib2File).toContain(
|
||||
// `import { ${newModule} } from '@${proj}/shared/${lib1}';`
|
||||
// );
|
||||
// expect(lib2File).toContain(`extends ${newModule}`);
|
||||
// });
|
||||
});
|
||||
|
||||
@ -13,7 +13,7 @@ import {
|
||||
updateProjectConfig,
|
||||
readProjectConfig,
|
||||
tmpProjPath,
|
||||
readResolvedWorkspaceConfiguration,
|
||||
readResolvedConfiguration,
|
||||
removeFile,
|
||||
getPackageManagerCommand,
|
||||
getSelectedPackageManager,
|
||||
@ -304,7 +304,8 @@ describe('Workspace Tests', () => {
|
||||
});
|
||||
});
|
||||
|
||||
describe('move project', () => {
|
||||
// TODO: vsavkin rerenable
|
||||
xdescribe('move project', () => {
|
||||
/**
|
||||
* Tries moving a library from ${lib}/data-access -> shared/${lib}/data-access
|
||||
*/
|
||||
@ -401,7 +402,7 @@ describe('Workspace Tests', () => {
|
||||
expect(moveOutput).toContain(`CREATE ${rootClassPath}`);
|
||||
checkFilesExist(rootClassPath);
|
||||
|
||||
let workspace = await readResolvedWorkspaceConfiguration();
|
||||
let workspace = await readResolvedConfiguration();
|
||||
expect(workspace.projects[`${lib1}-data-access`]).toBeUndefined();
|
||||
const newConfig = readProjectConfig(newName);
|
||||
expect(newConfig).toMatchObject({
|
||||
@ -423,7 +424,7 @@ describe('Workspace Tests', () => {
|
||||
]
|
||||
).toEqual([`libs/shared/${lib1}/data-access/src/index.ts`]);
|
||||
|
||||
workspace = readResolvedWorkspaceConfiguration();
|
||||
workspace = readResolvedConfiguration();
|
||||
expect(workspace.projects[`${lib1}-data-access`]).toBeUndefined();
|
||||
const project = readProjectConfig(newName);
|
||||
expect(project).toBeTruthy();
|
||||
@ -549,7 +550,7 @@ describe('Workspace Tests', () => {
|
||||
]
|
||||
).toEqual([`libs/shared/${lib1}/data-access/src/index.ts`]);
|
||||
|
||||
const workspace = await readResolvedWorkspaceConfiguration();
|
||||
const workspace = await readResolvedConfiguration();
|
||||
expect(workspace.projects[`${lib1}-data-access`]).toBeUndefined();
|
||||
const project = readProjectConfig(newName);
|
||||
expect(project).toBeTruthy();
|
||||
@ -681,7 +682,7 @@ describe('Workspace Tests', () => {
|
||||
]
|
||||
).toEqual([`packages/shared/${lib1}/data-access/src/index.ts`]);
|
||||
|
||||
const workspace = await readResolvedWorkspaceConfiguration();
|
||||
const workspace = await readResolvedConfiguration();
|
||||
expect(workspace.projects[`${lib1}-data-access`]).toBeUndefined();
|
||||
const project = readProjectConfig(newName);
|
||||
expect(project).toBeTruthy();
|
||||
@ -799,8 +800,8 @@ describe('Workspace Tests', () => {
|
||||
rootTsConfig.compilerOptions.paths[`shared/${lib1}/data-access`]
|
||||
).toEqual([`libs/shared/${lib1}/data-access/src/index.ts`]);
|
||||
|
||||
const workspaceJson = readResolvedWorkspaceConfiguration();
|
||||
expect(workspaceJson.projects[`${lib1}-data-access`]).toBeUndefined();
|
||||
const projects = readResolvedConfiguration();
|
||||
expect(projects.projects[`${lib1}-data-access`]).toBeUndefined();
|
||||
const project = readProjectConfig(newName);
|
||||
expect(project).toBeTruthy();
|
||||
expect(project.sourceRoot).toBe(`${newPath}/src`);
|
||||
@ -819,7 +820,8 @@ describe('Workspace Tests', () => {
|
||||
});
|
||||
});
|
||||
|
||||
describe('remove project', () => {
|
||||
//TODO: vsavkin reenable
|
||||
xdescribe('remove project', () => {
|
||||
/**
|
||||
* Tries creating then deleting a lib
|
||||
*/
|
||||
@ -871,51 +873,12 @@ describe('Workspace Tests', () => {
|
||||
expect(exists(tmpProjPath(`libs/${lib1}`))).toBeFalsy();
|
||||
|
||||
expect(removeOutputForced).not.toContain(`UPDATE nx.json`);
|
||||
const workspaceJson = readResolvedWorkspaceConfiguration();
|
||||
expect(workspaceJson.projects[`${lib1}`]).toBeUndefined();
|
||||
const projectsConfigurations = readResolvedConfiguration();
|
||||
expect(projectsConfigurations.projects[`${lib1}`]).toBeUndefined();
|
||||
const lib2Config = readProjectConfig(lib2);
|
||||
expect(lib2Config.implicitDependencies).toEqual([]);
|
||||
|
||||
expect(workspaceJson.projects[`${lib1}`]).toBeUndefined();
|
||||
});
|
||||
});
|
||||
|
||||
describe('workspace-lint', () => {
|
||||
beforeAll(() => {
|
||||
// Unfortunately, this is required as this test is testing a different workspace layout
|
||||
// workspace-lint only picks up missing projects and such when workspace.json exists.
|
||||
newProject();
|
||||
updateFile(
|
||||
'workspace.json',
|
||||
JSON.stringify({ version: 2, projects: {} })
|
||||
);
|
||||
});
|
||||
|
||||
afterAll(() => {
|
||||
removeFile('workspace.json');
|
||||
});
|
||||
|
||||
it('should identify issues with the workspace', () => {
|
||||
const appBefore = uniq('before');
|
||||
const appAfter = uniq('after');
|
||||
|
||||
// this tests an issue that doesn't come up when using standalone configurations
|
||||
runCLI(`generate @nrwl/web:app ${appBefore} --standalone-config false`);
|
||||
renameFile(`apps/${appBefore}`, `apps/${appAfter}`);
|
||||
|
||||
const stdout = runCLI('workspace-lint', { silenceError: true });
|
||||
expect(stdout).toContain(
|
||||
`- Cannot find project '${appBefore}' in 'apps/${appBefore}'`
|
||||
);
|
||||
expect(stdout).toContain(
|
||||
'The following file(s) do not belong to any projects:'
|
||||
);
|
||||
expect(stdout).toContain(`- apps/${appAfter}/jest.config.ts`);
|
||||
expect(stdout).toContain(`- apps/${appAfter}/src/app/app.element.css`);
|
||||
expect(stdout).toContain(`- apps/${appAfter}/src/app/app.element.ts`);
|
||||
expect(stdout).toContain(
|
||||
`- apps/${appAfter}/src/app/app.element.spec.ts`
|
||||
);
|
||||
expect(projectsConfigurations.projects[`${lib1}`]).toBeUndefined();
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
@ -374,7 +374,7 @@ describe('Nx Plugin', () => {
|
||||
}, 90000);
|
||||
});
|
||||
describe('--tags', () => {
|
||||
it('should add tags to workspace.json', async () => {
|
||||
it('should add tags to project configuration', async () => {
|
||||
const plugin = uniq('plugin');
|
||||
runCLI(
|
||||
`generate @nrwl/nx-plugin:plugin ${plugin} --linter=eslint --tags=e2etag,e2ePackage `
|
||||
|
||||
@ -16,7 +16,7 @@ import {
|
||||
isWindows,
|
||||
fileExists,
|
||||
removeFile,
|
||||
readResolvedWorkspaceConfiguration,
|
||||
readResolvedConfiguration,
|
||||
} from '@nrwl/e2e/utils';
|
||||
|
||||
describe('Nx Affected and Graph Tests', () => {
|
||||
@ -234,24 +234,9 @@ describe('Nx Affected and Graph Tests', () => {
|
||||
}
|
||||
});
|
||||
|
||||
it('should detect changes to projects based on the workspace.json', () => {
|
||||
// TODO: investigate why affected gives different results on windows
|
||||
if (isNotWindows()) {
|
||||
generateAll();
|
||||
updateProjectConfig(myapp, (config) => ({
|
||||
...config,
|
||||
prefix: 'my-app',
|
||||
}));
|
||||
|
||||
expect(runCLI('affected:apps')).toContain(myapp);
|
||||
expect(runCLI('affected:apps')).not.toContain(myapp2);
|
||||
expect(runCLI('affected:libs')).not.toContain(mylib);
|
||||
}
|
||||
});
|
||||
|
||||
it('should affect all projects by removing projects', () => {
|
||||
generateAll();
|
||||
const root = readResolvedWorkspaceConfiguration().projects[mylib].root;
|
||||
const root = readResolvedConfiguration().projects[mylib].root;
|
||||
removeFile(root);
|
||||
expect(runCLI('affected:apps')).toContain(myapp);
|
||||
expect(runCLI('affected:apps')).toContain(myapp2);
|
||||
|
||||
@ -108,30 +108,6 @@ describe('cache', () => {
|
||||
`${myapp2}-e2e`,
|
||||
]);
|
||||
|
||||
// cache task failures
|
||||
// --------------------------------------------
|
||||
// updateFile('workspace.json', (c) => {
|
||||
// const workspaceJson = JSON.parse(c);
|
||||
// workspaceJson.projects[myapp1].targets.lint = {
|
||||
// executor: 'nx:run-commands',
|
||||
// options: {
|
||||
// command: 'echo hi && exit 1',
|
||||
// },
|
||||
// };
|
||||
// return JSON.stringify(workspaceJson, null, 2);
|
||||
// });
|
||||
// const failingRun = runCLI(`lint ${myapp1}`, {
|
||||
// silenceError: true,
|
||||
// env: { ...process.env, NX_CACHE_FAILURES: 'true' },
|
||||
// });
|
||||
// expect(failingRun).not.toContain('[retrieved from cache]');
|
||||
//
|
||||
// const cachedFailingRun = runCLI(`lint ${myapp1}`, {
|
||||
// silenceError: true,
|
||||
// env: { ...process.env, NX_CACHE_FAILURES: 'true' },
|
||||
// });
|
||||
// expect(cachedFailingRun).toContain('[retrieved from cache]');
|
||||
|
||||
// run without caching
|
||||
// --------------------------------------------
|
||||
|
||||
|
||||
@ -92,42 +92,25 @@ export function uniq(prefix: string) {
|
||||
return `${prefix}${Math.floor(Math.random() * 10000000)}`;
|
||||
}
|
||||
|
||||
export function workspaceConfigName() {
|
||||
return currentCli() === 'angular' ? 'angular.json' : 'workspace.json';
|
||||
}
|
||||
|
||||
export function updateProjectConfig(
|
||||
projectName: string,
|
||||
callback: (c: ProjectConfiguration) => ProjectConfiguration
|
||||
) {
|
||||
const workspace = readResolvedWorkspaceConfiguration();
|
||||
const workspace = readResolvedConfiguration();
|
||||
const root = workspace.projects[projectName].root;
|
||||
const path = join(root, 'project.json');
|
||||
const current = readJson(path);
|
||||
updateFile(path, JSON.stringify(callback(current), null, 2));
|
||||
}
|
||||
|
||||
export function readResolvedWorkspaceConfiguration() {
|
||||
export function readResolvedConfiguration() {
|
||||
process.env.NX_PROJECT_GLOB_CACHE = 'false';
|
||||
const ws = new Workspaces(tmpProjPath());
|
||||
return ws.readProjectsConfig();
|
||||
}
|
||||
|
||||
/**
|
||||
* Use readProjectConfig or readInlineProjectConfig instead
|
||||
* if you need a project's configuration.
|
||||
*/
|
||||
export function readWorkspaceConfig(): Omit<
|
||||
ProjectsConfigurations,
|
||||
'projects'
|
||||
> {
|
||||
const w = readJson(workspaceConfigName());
|
||||
delete w.projects;
|
||||
return w;
|
||||
return ws.readProjectsConfigurations();
|
||||
}
|
||||
|
||||
export function readProjectConfig(projectName: string): ProjectConfiguration {
|
||||
const root = readResolvedWorkspaceConfiguration().projects[projectName].root;
|
||||
const root = readResolvedConfiguration().projects[projectName].root;
|
||||
const path = join(root, 'project.json');
|
||||
return readJson(path);
|
||||
}
|
||||
@ -837,14 +820,11 @@ export function runCommand(
|
||||
function setMaxWorkers() {
|
||||
if (isCI) {
|
||||
const ws = new Workspaces(tmpProjPath());
|
||||
const workspaceFile = workspaceConfigName();
|
||||
const workspaceFileExists = fileExists(tmpProjPath(workspaceFile));
|
||||
const workspace = ws.readProjectsConfig();
|
||||
const rawWorkspace = workspaceFileExists ? readJson(workspaceFile) : null;
|
||||
const projectsConfigurations = ws.readProjectsConfigurations();
|
||||
let requireWorkspaceFileUpdate = false;
|
||||
|
||||
Object.keys(workspace.projects).forEach((appName) => {
|
||||
let project = workspace.projects[appName];
|
||||
Object.keys(projectsConfigurations.projects).forEach((appName) => {
|
||||
let project = projectsConfigurations.projects[appName];
|
||||
const { build } = project.targets;
|
||||
|
||||
if (!build) {
|
||||
@ -860,21 +840,11 @@ function setMaxWorkers() {
|
||||
build.options.maxWorkers = 4;
|
||||
}
|
||||
|
||||
if (
|
||||
!workspaceFileExists ||
|
||||
typeof rawWorkspace.projects[appName] === 'string'
|
||||
) {
|
||||
updateFile(
|
||||
join(project.root, 'project.json'),
|
||||
JSON.stringify(project, null, 2)
|
||||
);
|
||||
} else {
|
||||
requireWorkspaceFileUpdate = true;
|
||||
}
|
||||
updateFile(
|
||||
join(project.root, 'project.json'),
|
||||
JSON.stringify(project, null, 2)
|
||||
);
|
||||
});
|
||||
if (workspaceFileExists && requireWorkspaceFileUpdate) {
|
||||
updateFile(workspaceFile, JSON.stringify(workspace));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -42,18 +42,6 @@ describe('Web Components Applications with bundler set as vite', () => {
|
||||
}
|
||||
}, 500000);
|
||||
|
||||
it('should be able to generate a web app with standaloneConfig', async () => {
|
||||
const appName = uniq('app');
|
||||
runCLI(
|
||||
`generate @nrwl/web:app ${appName} --bundler=vite --no-interactive --standalone-config`
|
||||
);
|
||||
|
||||
checkFilesExist(`apps/${appName}/project.json`);
|
||||
|
||||
const lintResults = runCLI(`lint ${appName}`);
|
||||
expect(lintResults).toContain('All files pass linting.');
|
||||
}, 120000);
|
||||
|
||||
it('should remove previous output before building', async () => {
|
||||
const appName = uniq('app');
|
||||
const libName = uniq('lib');
|
||||
@ -78,15 +66,4 @@ describe('Web Components Applications with bundler set as vite', () => {
|
||||
);
|
||||
checkFilesExist(`dist/apps/_should_not_remove.txt`);
|
||||
}, 120000);
|
||||
|
||||
it('should support workspaces w/o workspace config file', async () => {
|
||||
removeFile('workspace.json');
|
||||
const myapp = uniq('myapp');
|
||||
runCLI(`generate @nrwl/web:app ${myapp} --bundler=vite --directory=myDir`);
|
||||
|
||||
runCLI(`build my-dir-${myapp}`);
|
||||
expect(() =>
|
||||
checkFilesDoNotExist('workspace.json', 'angular.json')
|
||||
).not.toThrow();
|
||||
}, 1000000);
|
||||
});
|
||||
|
||||
@ -59,18 +59,6 @@ describe('Web Components Applications', () => {
|
||||
}
|
||||
}, 500000);
|
||||
|
||||
it('should be able to generate a web app with standaloneConfig', async () => {
|
||||
const appName = uniq('app');
|
||||
runCLI(
|
||||
`generate @nrwl/web:app ${appName} --bundler=webpack --no-interactive --standalone-config`
|
||||
);
|
||||
|
||||
checkFilesExist(`apps/${appName}/project.json`);
|
||||
|
||||
const lintResults = runCLI(`lint ${appName}`);
|
||||
expect(lintResults).toContain('All files pass linting.');
|
||||
}, 120000);
|
||||
|
||||
it('should remove previous output before building', async () => {
|
||||
const appName = uniq('app');
|
||||
const libName = uniq('lib');
|
||||
@ -167,19 +155,6 @@ describe('Web Components Applications', () => {
|
||||
);
|
||||
}, 120000);
|
||||
|
||||
it('should support workspaces w/o workspace config file', async () => {
|
||||
removeFile('workspace.json');
|
||||
const myapp = uniq('myapp');
|
||||
runCLI(
|
||||
`generate @nrwl/web:app ${myapp} --bundler=webpack --directory=myDir`
|
||||
);
|
||||
|
||||
runCLI(`build my-dir-${myapp}`);
|
||||
expect(() =>
|
||||
checkFilesDoNotExist('workspace.json', 'angular.json')
|
||||
).not.toThrow();
|
||||
}, 1000000);
|
||||
|
||||
it('should support custom webpackConfig option', async () => {
|
||||
const appName = uniq('app');
|
||||
runCLI(
|
||||
|
||||
@ -64,8 +64,6 @@ describe('create-nx-workspace', () => {
|
||||
.filter((pm) => pm !== packageManager)
|
||||
.map((pm) => packageManagerLockFile[pm]);
|
||||
|
||||
checkFilesDoNotExist(...foreignLockFiles, 'workspace.json');
|
||||
|
||||
expectNoAngularDevkit();
|
||||
});
|
||||
|
||||
|
||||
@ -1,40 +1,5 @@
|
||||
{
|
||||
"schematics": {
|
||||
"update-ngcc-postinstall": {
|
||||
"version": "12.0.0-beta.0",
|
||||
"description": "adjusts the ngcc postinstall command to just leave 'ngcc' in there. This fixes Ivy in Jest tests and Storybooks",
|
||||
"factory": "./src/migrations/update-12-0-0/update-ngcc-postinstall"
|
||||
},
|
||||
"update-webpack-browser-config": {
|
||||
"cli": "nx",
|
||||
"version": "12.3.1",
|
||||
"description": "Remove deprecated options and update others according to new defaults. It syncs with the v12 migration of Angular builders.",
|
||||
"factory": "./src/migrations/update-12-3-0/update-webpack-browser-config"
|
||||
},
|
||||
"update-storybook": {
|
||||
"cli": "nx",
|
||||
"version": "12.3.1",
|
||||
"description": "Updates storybook configurations to support webpack 5",
|
||||
"factory": "./src/migrations/update-12-3-0/update-storybook"
|
||||
},
|
||||
"update-angular-eslint-rules": {
|
||||
"cli": "nx",
|
||||
"version": "12.3.1",
|
||||
"description": "Migrates some rules that have changed in Angular EsLint",
|
||||
"factory": "./src/migrations/update-12-3-0/update-angular-eslint-rules"
|
||||
},
|
||||
"convert-webpack-browser-build-target-to-delegate-build": {
|
||||
"cli": "nx",
|
||||
"version": "12.3.5-beta.0",
|
||||
"description": "Convert targets using @nrwl/angular:webpack-browser with the buildTarget option set to use the @nrwl/angular:delegate-build executor instead.",
|
||||
"factory": "./src/migrations/update-12-3-0/convert-webpack-browser-build-target-to-delegate-build"
|
||||
},
|
||||
"update-invalid-import-paths": {
|
||||
"cli": "nx",
|
||||
"version": "12.9.0",
|
||||
"description": "Fixes invalid importPaths for buildable and publishable libs.",
|
||||
"factory": "./src/migrations/update-12-9-0/update-invalid-import-paths"
|
||||
},
|
||||
"add-postcss-packages": {
|
||||
"cli": "nx",
|
||||
"version": "13.0.0-beta.10",
|
||||
|
||||
@ -8,9 +8,6 @@
|
||||
"url": "https://github.com/nrwl/nx.git",
|
||||
"directory": "packages/angular"
|
||||
},
|
||||
"scripts": {
|
||||
"postinstall": "node ./scripts/nx-cli-warning.js"
|
||||
},
|
||||
"keywords": [
|
||||
"Monorepo",
|
||||
"Angular",
|
||||
|
||||
40
packages/angular/scripts/nx-cli-warning.js
vendored
40
packages/angular/scripts/nx-cli-warning.js
vendored
@ -1,40 +0,0 @@
|
||||
const path = require('path');
|
||||
const fs = require('fs');
|
||||
|
||||
try {
|
||||
const root = findWorkspaceRoot(process.cwd());
|
||||
if (path.basename(root) === 'workspace.json') {
|
||||
const workspaceJson = JSON.parse(fs.readFileSync(root));
|
||||
if (Object.keys(workspaceJson.projects).length === 0) {
|
||||
const output = require('nx/src/utils/output').output;
|
||||
output.warn({
|
||||
title: '@nrwl/angular added to a Nx workspace powered by the Nx CLI.',
|
||||
bodyLines: [
|
||||
"You won't be able to use 'ng' to generate artifacts and run tasks.",
|
||||
"If you want to use 'ng', you need to create a new workspace powered by the Angular CLI.",
|
||||
"You can do it by providing --cli when creating a new workspace as follows: 'create-nx-workspace --cli=angular'.",
|
||||
"You can invoke the Angular schematics with 'nx generate @nrwl/angular' to generate artifacts.",
|
||||
],
|
||||
});
|
||||
}
|
||||
}
|
||||
} catch (e) {}
|
||||
|
||||
function findWorkspaceRoot(dir) {
|
||||
if (path.dirname(dir) === dir) return null;
|
||||
if (exists(path.join(dir, 'angular.json'))) {
|
||||
return path.join(dir, 'angular.json');
|
||||
} else if (exists(path.join(dir, 'workspace.json'))) {
|
||||
return path.join(dir, 'workspace.json');
|
||||
} else {
|
||||
return findWorkspaceRoot(path.dirname(dir));
|
||||
}
|
||||
}
|
||||
|
||||
function exists(filePath) {
|
||||
try {
|
||||
return fs.statSync(filePath).isFile();
|
||||
} catch (err) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
@ -5,7 +5,7 @@ import {
|
||||
readProjectConfiguration,
|
||||
updateJson,
|
||||
} from '@nrwl/devkit';
|
||||
import { createTreeWithEmptyV1Workspace } from '@nrwl/devkit/testing';
|
||||
import { createTreeWithEmptyWorkspace } from '@nrwl/devkit/testing';
|
||||
import * as linter from '@nrwl/linter';
|
||||
import { addLintingGenerator } from './add-linting';
|
||||
|
||||
@ -15,7 +15,7 @@ describe('addLinting generator', () => {
|
||||
const appProjectRoot = `apps/${appProjectName}`;
|
||||
|
||||
beforeEach(() => {
|
||||
tree = createTreeWithEmptyV1Workspace();
|
||||
tree = createTreeWithEmptyWorkspace({ layout: 'apps-libs' });
|
||||
|
||||
addProjectConfiguration(tree, appProjectName, {
|
||||
root: appProjectRoot,
|
||||
@ -85,7 +85,7 @@ describe('addLinting generator', () => {
|
||||
|
||||
describe('support angular v14', () => {
|
||||
beforeEach(() => {
|
||||
tree = createTreeWithEmptyV1Workspace();
|
||||
tree = createTreeWithEmptyWorkspace({ layout: 'apps-libs' });
|
||||
updateJson(tree, 'package.json', (json) => ({
|
||||
...json,
|
||||
dependencies: {
|
||||
|
||||
@ -125,11 +125,17 @@ describe('AppComponent', () => {
|
||||
|
||||
exports[`app at the root should accept numbers in the path 1`] = `"src/9-websites/my-app"`;
|
||||
|
||||
exports[`app nested should update workspace.json 1`] = `
|
||||
exports[`app nested should create project configs 1`] = `
|
||||
Object {
|
||||
"architect": Object {
|
||||
"$schema": "../node_modules/nx/schemas/project-schema.json",
|
||||
"name": "my-dir-my-app",
|
||||
"prefix": "proj",
|
||||
"projectType": "application",
|
||||
"root": "apps/my-dir/my-app",
|
||||
"sourceRoot": "apps/my-dir/my-app/src",
|
||||
"tags": Array [],
|
||||
"targets": Object {
|
||||
"build": Object {
|
||||
"builder": "@angular-devkit/build-angular:browser",
|
||||
"configurations": Object {
|
||||
"development": Object {
|
||||
"buildOptimizer": false,
|
||||
@ -156,6 +162,7 @@ Object {
|
||||
},
|
||||
},
|
||||
"defaultConfiguration": "production",
|
||||
"executor": "@angular-devkit/build-angular:browser",
|
||||
"options": Object {
|
||||
"assets": Array [
|
||||
"apps/my-dir/my-app/src/favicon.ico",
|
||||
@ -178,13 +185,13 @@ Object {
|
||||
],
|
||||
},
|
||||
"extract-i18n": Object {
|
||||
"builder": "@angular-devkit/build-angular:extract-i18n",
|
||||
"executor": "@angular-devkit/build-angular:extract-i18n",
|
||||
"options": Object {
|
||||
"browserTarget": "my-dir-my-app:build",
|
||||
},
|
||||
},
|
||||
"lint": Object {
|
||||
"builder": "@nrwl/linter:eslint",
|
||||
"executor": "@nrwl/linter:eslint",
|
||||
"options": Object {
|
||||
"lintFilePatterns": Array [
|
||||
"apps/my-dir/my-app/**/*.ts",
|
||||
@ -196,7 +203,6 @@ Object {
|
||||
],
|
||||
},
|
||||
"serve": Object {
|
||||
"builder": "@angular-devkit/build-angular:dev-server",
|
||||
"configurations": Object {
|
||||
"development": Object {
|
||||
"browserTarget": "my-dir-my-app:build:development",
|
||||
@ -206,15 +212,16 @@ Object {
|
||||
},
|
||||
},
|
||||
"defaultConfiguration": "development",
|
||||
"executor": "@angular-devkit/build-angular:dev-server",
|
||||
},
|
||||
"test": Object {
|
||||
"builder": "@nrwl/jest:jest",
|
||||
"configurations": Object {
|
||||
"ci": Object {
|
||||
"ci": true,
|
||||
"codeCoverage": true,
|
||||
},
|
||||
},
|
||||
"executor": "@nrwl/jest:jest",
|
||||
"options": Object {
|
||||
"jestConfig": "apps/my-dir/my-app/jest.config.ts",
|
||||
"passWithNoTests": true,
|
||||
@ -224,24 +231,28 @@ Object {
|
||||
],
|
||||
},
|
||||
},
|
||||
"prefix": "proj",
|
||||
"projectType": "application",
|
||||
"root": "apps/my-dir/my-app",
|
||||
"sourceRoot": "apps/my-dir/my-app/src",
|
||||
"tags": Array [],
|
||||
}
|
||||
`;
|
||||
|
||||
exports[`app nested should update workspace.json 2`] = `
|
||||
exports[`app nested should create project configs 2`] = `
|
||||
Object {
|
||||
"architect": Object {
|
||||
"$schema": "../../../node_modules/nx/schemas/project-schema.json",
|
||||
"implicitDependencies": Array [
|
||||
"my-dir-my-app",
|
||||
],
|
||||
"name": "my-dir-my-app-e2e",
|
||||
"projectType": "application",
|
||||
"root": "apps/my-dir/my-app-e2e",
|
||||
"sourceRoot": "apps/my-dir/my-app-e2e/src",
|
||||
"tags": Array [],
|
||||
"targets": Object {
|
||||
"e2e": Object {
|
||||
"builder": "@nrwl/cypress:cypress",
|
||||
"configurations": Object {
|
||||
"production": Object {
|
||||
"devServerTarget": "my-dir-my-app:serve:production",
|
||||
},
|
||||
},
|
||||
"executor": "@nrwl/cypress:cypress",
|
||||
"options": Object {
|
||||
"cypressConfig": "apps/my-dir/my-app-e2e/cypress.config.ts",
|
||||
"devServerTarget": "my-dir-my-app:serve:development",
|
||||
@ -249,7 +260,7 @@ Object {
|
||||
},
|
||||
},
|
||||
"lint": Object {
|
||||
"builder": "@nrwl/linter:eslint",
|
||||
"executor": "@nrwl/linter:eslint",
|
||||
"options": Object {
|
||||
"lintFilePatterns": Array [
|
||||
"apps/my-dir/my-app-e2e/**/*.{js,ts}",
|
||||
@ -260,13 +271,155 @@ Object {
|
||||
],
|
||||
},
|
||||
},
|
||||
"implicitDependencies": Array [
|
||||
"my-dir-my-app",
|
||||
],
|
||||
}
|
||||
`;
|
||||
|
||||
exports[`app not nested should create project configs 1`] = `
|
||||
Object {
|
||||
"$schema": "../node_modules/nx/schemas/project-schema.json",
|
||||
"name": "my-app",
|
||||
"prefix": "proj",
|
||||
"projectType": "application",
|
||||
"root": "apps/my-dir/my-app-e2e",
|
||||
"sourceRoot": "apps/my-dir/my-app-e2e/src",
|
||||
"root": "apps/my-app",
|
||||
"sourceRoot": "apps/my-app/src",
|
||||
"tags": Array [],
|
||||
"targets": Object {
|
||||
"build": Object {
|
||||
"configurations": Object {
|
||||
"development": Object {
|
||||
"buildOptimizer": false,
|
||||
"extractLicenses": false,
|
||||
"namedChunks": true,
|
||||
"optimization": false,
|
||||
"sourceMap": true,
|
||||
"vendorChunk": true,
|
||||
},
|
||||
"production": Object {
|
||||
"budgets": Array [
|
||||
Object {
|
||||
"maximumError": "1mb",
|
||||
"maximumWarning": "500kb",
|
||||
"type": "initial",
|
||||
},
|
||||
Object {
|
||||
"maximumError": "4kb",
|
||||
"maximumWarning": "2kb",
|
||||
"type": "anyComponentStyle",
|
||||
},
|
||||
],
|
||||
"outputHashing": "all",
|
||||
},
|
||||
},
|
||||
"defaultConfiguration": "production",
|
||||
"executor": "@angular-devkit/build-angular:browser",
|
||||
"options": Object {
|
||||
"assets": Array [
|
||||
"apps/my-app/src/favicon.ico",
|
||||
"apps/my-app/src/assets",
|
||||
],
|
||||
"index": "apps/my-app/src/index.html",
|
||||
"main": "apps/my-app/src/main.ts",
|
||||
"outputPath": "dist/apps/my-app",
|
||||
"polyfills": Array [
|
||||
"zone.js",
|
||||
],
|
||||
"scripts": Array [],
|
||||
"styles": Array [
|
||||
"apps/my-app/src/styles.css",
|
||||
],
|
||||
"tsConfig": "apps/my-app/tsconfig.app.json",
|
||||
},
|
||||
"outputs": Array [
|
||||
"{options.outputPath}",
|
||||
],
|
||||
},
|
||||
"extract-i18n": Object {
|
||||
"executor": "@angular-devkit/build-angular:extract-i18n",
|
||||
"options": Object {
|
||||
"browserTarget": "my-app:build",
|
||||
},
|
||||
},
|
||||
"lint": Object {
|
||||
"executor": "@nrwl/linter:eslint",
|
||||
"options": Object {
|
||||
"lintFilePatterns": Array [
|
||||
"apps/my-app/**/*.ts",
|
||||
"apps/my-app/**/*.html",
|
||||
],
|
||||
},
|
||||
"outputs": Array [
|
||||
"{options.outputFile}",
|
||||
],
|
||||
},
|
||||
"serve": Object {
|
||||
"configurations": Object {
|
||||
"development": Object {
|
||||
"browserTarget": "my-app:build:development",
|
||||
},
|
||||
"production": Object {
|
||||
"browserTarget": "my-app:build:production",
|
||||
},
|
||||
},
|
||||
"defaultConfiguration": "development",
|
||||
"executor": "@angular-devkit/build-angular:dev-server",
|
||||
},
|
||||
"test": Object {
|
||||
"configurations": Object {
|
||||
"ci": Object {
|
||||
"ci": true,
|
||||
"codeCoverage": true,
|
||||
},
|
||||
},
|
||||
"executor": "@nrwl/jest:jest",
|
||||
"options": Object {
|
||||
"jestConfig": "apps/my-app/jest.config.ts",
|
||||
"passWithNoTests": true,
|
||||
},
|
||||
"outputs": Array [
|
||||
"{workspaceRoot}/coverage/{projectRoot}",
|
||||
],
|
||||
},
|
||||
},
|
||||
}
|
||||
`;
|
||||
|
||||
exports[`app not nested should create project configs 2`] = `
|
||||
Object {
|
||||
"$schema": "../../node_modules/nx/schemas/project-schema.json",
|
||||
"implicitDependencies": Array [
|
||||
"my-app",
|
||||
],
|
||||
"name": "my-app-e2e",
|
||||
"projectType": "application",
|
||||
"root": "apps/my-app-e2e",
|
||||
"sourceRoot": "apps/my-app-e2e/src",
|
||||
"tags": Array [],
|
||||
"targets": Object {
|
||||
"e2e": Object {
|
||||
"configurations": Object {
|
||||
"production": Object {
|
||||
"devServerTarget": "my-app:serve:production",
|
||||
},
|
||||
},
|
||||
"executor": "@nrwl/cypress:cypress",
|
||||
"options": Object {
|
||||
"cypressConfig": "apps/my-app-e2e/cypress.config.ts",
|
||||
"devServerTarget": "my-app:serve:development",
|
||||
"testingType": "e2e",
|
||||
},
|
||||
},
|
||||
"lint": Object {
|
||||
"executor": "@nrwl/linter:eslint",
|
||||
"options": Object {
|
||||
"lintFilePatterns": Array [
|
||||
"apps/my-app-e2e/**/*.{js,ts}",
|
||||
],
|
||||
},
|
||||
"outputs": Array [
|
||||
"{options.outputFile}",
|
||||
],
|
||||
},
|
||||
},
|
||||
}
|
||||
`;
|
||||
|
||||
@ -301,148 +454,3 @@ Object {
|
||||
],
|
||||
}
|
||||
`;
|
||||
|
||||
exports[`app not nested should update workspace.json 1`] = `
|
||||
Object {
|
||||
"architect": Object {
|
||||
"build": Object {
|
||||
"builder": "@angular-devkit/build-angular:browser",
|
||||
"configurations": Object {
|
||||
"development": Object {
|
||||
"buildOptimizer": false,
|
||||
"extractLicenses": false,
|
||||
"namedChunks": true,
|
||||
"optimization": false,
|
||||
"sourceMap": true,
|
||||
"vendorChunk": true,
|
||||
},
|
||||
"production": Object {
|
||||
"budgets": Array [
|
||||
Object {
|
||||
"maximumError": "1mb",
|
||||
"maximumWarning": "500kb",
|
||||
"type": "initial",
|
||||
},
|
||||
Object {
|
||||
"maximumError": "4kb",
|
||||
"maximumWarning": "2kb",
|
||||
"type": "anyComponentStyle",
|
||||
},
|
||||
],
|
||||
"outputHashing": "all",
|
||||
},
|
||||
},
|
||||
"defaultConfiguration": "production",
|
||||
"options": Object {
|
||||
"assets": Array [
|
||||
"apps/my-app/src/favicon.ico",
|
||||
"apps/my-app/src/assets",
|
||||
],
|
||||
"index": "apps/my-app/src/index.html",
|
||||
"main": "apps/my-app/src/main.ts",
|
||||
"outputPath": "dist/apps/my-app",
|
||||
"polyfills": Array [
|
||||
"zone.js",
|
||||
],
|
||||
"scripts": Array [],
|
||||
"styles": Array [
|
||||
"apps/my-app/src/styles.css",
|
||||
],
|
||||
"tsConfig": "apps/my-app/tsconfig.app.json",
|
||||
},
|
||||
"outputs": Array [
|
||||
"{options.outputPath}",
|
||||
],
|
||||
},
|
||||
"extract-i18n": Object {
|
||||
"builder": "@angular-devkit/build-angular:extract-i18n",
|
||||
"options": Object {
|
||||
"browserTarget": "my-app:build",
|
||||
},
|
||||
},
|
||||
"lint": Object {
|
||||
"builder": "@nrwl/linter:eslint",
|
||||
"options": Object {
|
||||
"lintFilePatterns": Array [
|
||||
"apps/my-app/**/*.ts",
|
||||
"apps/my-app/**/*.html",
|
||||
],
|
||||
},
|
||||
"outputs": Array [
|
||||
"{options.outputFile}",
|
||||
],
|
||||
},
|
||||
"serve": Object {
|
||||
"builder": "@angular-devkit/build-angular:dev-server",
|
||||
"configurations": Object {
|
||||
"development": Object {
|
||||
"browserTarget": "my-app:build:development",
|
||||
},
|
||||
"production": Object {
|
||||
"browserTarget": "my-app:build:production",
|
||||
},
|
||||
},
|
||||
"defaultConfiguration": "development",
|
||||
},
|
||||
"test": Object {
|
||||
"builder": "@nrwl/jest:jest",
|
||||
"configurations": Object {
|
||||
"ci": Object {
|
||||
"ci": true,
|
||||
"codeCoverage": true,
|
||||
},
|
||||
},
|
||||
"options": Object {
|
||||
"jestConfig": "apps/my-app/jest.config.ts",
|
||||
"passWithNoTests": true,
|
||||
},
|
||||
"outputs": Array [
|
||||
"{workspaceRoot}/coverage/{projectRoot}",
|
||||
],
|
||||
},
|
||||
},
|
||||
"prefix": "proj",
|
||||
"projectType": "application",
|
||||
"root": "apps/my-app",
|
||||
"sourceRoot": "apps/my-app/src",
|
||||
"tags": Array [],
|
||||
}
|
||||
`;
|
||||
|
||||
exports[`app not nested should update workspace.json 2`] = `
|
||||
Object {
|
||||
"architect": Object {
|
||||
"e2e": Object {
|
||||
"builder": "@nrwl/cypress:cypress",
|
||||
"configurations": Object {
|
||||
"production": Object {
|
||||
"devServerTarget": "my-app:serve:production",
|
||||
},
|
||||
},
|
||||
"options": Object {
|
||||
"cypressConfig": "apps/my-app-e2e/cypress.config.ts",
|
||||
"devServerTarget": "my-app:serve:development",
|
||||
"testingType": "e2e",
|
||||
},
|
||||
},
|
||||
"lint": Object {
|
||||
"builder": "@nrwl/linter:eslint",
|
||||
"options": Object {
|
||||
"lintFilePatterns": Array [
|
||||
"apps/my-app-e2e/**/*.{js,ts}",
|
||||
],
|
||||
},
|
||||
"outputs": Array [
|
||||
"{options.outputFile}",
|
||||
],
|
||||
},
|
||||
},
|
||||
"implicitDependencies": Array [
|
||||
"my-app",
|
||||
],
|
||||
"projectType": "application",
|
||||
"root": "apps/my-app-e2e",
|
||||
"sourceRoot": "apps/my-app-e2e/src",
|
||||
"tags": Array [],
|
||||
}
|
||||
`;
|
||||
|
||||
@ -1,456 +0,0 @@
|
||||
// Jest Snapshot v1, https://goo.gl/fbAQLP
|
||||
|
||||
exports[`app --standalone should generate a standalone app correctly with routing 1`] = `
|
||||
"import { enableProdMode } from '@angular/core';
|
||||
import { bootstrapApplication } from '@angular/platform-browser';
|
||||
import { provideRouter, withEnabledBlockingInitialNavigation } from '@angular/router';
|
||||
import { AppComponent } from './app/app.component';
|
||||
import { environment } from './environments/environment';
|
||||
import { appRoutes } from './app/app.routes';
|
||||
if (environment.production) {
|
||||
enableProdMode();
|
||||
}
|
||||
bootstrapApplication(AppComponent, {
|
||||
providers: [provideRouter(appRoutes, withEnabledBlockingInitialNavigation())],
|
||||
}).catch((err) => console.error(err));"
|
||||
`;
|
||||
|
||||
exports[`app --standalone should generate a standalone app correctly with routing 2`] = `
|
||||
"import { Route } from '@angular/router';
|
||||
|
||||
export const appRoutes: Route[] = [];"
|
||||
`;
|
||||
|
||||
exports[`app --standalone should generate a standalone app correctly with routing 3`] = `
|
||||
"import { NxWelcomeComponent } from './nx-welcome.component';
|
||||
import { RouterModule } from '@angular/router';
|
||||
import { Component } from '@angular/core';
|
||||
|
||||
@Component({
|
||||
standalone: true,
|
||||
imports: [NxWelcomeComponent, RouterModule],
|
||||
selector: 'proj-root',
|
||||
templateUrl: './app.component.html',
|
||||
styleUrls: ['./app.component.css']
|
||||
})
|
||||
export class AppComponent {
|
||||
title = 'standalone';
|
||||
}"
|
||||
`;
|
||||
|
||||
exports[`app --standalone should generate a standalone app correctly with routing 4`] = `
|
||||
"import { TestBed } from '@angular/core/testing';
|
||||
import { AppComponent } from './app.component';
|
||||
import { NxWelcomeComponent } from './nx-welcome.component';
|
||||
import { RouterTestingModule } from '@angular/router/testing';
|
||||
|
||||
describe('AppComponent', () => {
|
||||
beforeEach(async () => {
|
||||
await TestBed.configureTestingModule({imports: [AppComponent, NxWelcomeComponent, RouterTestingModule] }).compileComponents();
|
||||
});
|
||||
|
||||
it('should create the app', () => {
|
||||
const fixture = TestBed.createComponent(AppComponent);
|
||||
const app = fixture.componentInstance;
|
||||
expect(app).toBeTruthy();
|
||||
});
|
||||
|
||||
it(\`should have as title 'standalone'\`, () => {
|
||||
const fixture = TestBed.createComponent(AppComponent);
|
||||
const app = fixture.componentInstance;
|
||||
expect(app.title).toEqual('standalone');
|
||||
});
|
||||
|
||||
it('should render title', () => {
|
||||
const fixture = TestBed.createComponent(AppComponent);
|
||||
fixture.detectChanges();
|
||||
const compiled = fixture.nativeElement as HTMLElement;
|
||||
expect(compiled.querySelector('h1')?.textContent).toContain('Welcome standalone');
|
||||
});
|
||||
});
|
||||
"
|
||||
`;
|
||||
|
||||
exports[`app --standalone should generate a standalone app correctly without routing 1`] = `
|
||||
"import { enableProdMode } from '@angular/core';
|
||||
import { bootstrapApplication } from '@angular/platform-browser';;
|
||||
import { AppComponent } from './app/app.component';
|
||||
import { environment } from './environments/environment';
|
||||
|
||||
if (environment.production) {
|
||||
enableProdMode();
|
||||
}
|
||||
bootstrapApplication(AppComponent).catch((err) => console.error(err));"
|
||||
`;
|
||||
|
||||
exports[`app --standalone should generate a standalone app correctly without routing 2`] = `
|
||||
"import { NxWelcomeComponent } from './nx-welcome.component';
|
||||
import { Component } from '@angular/core';
|
||||
|
||||
@Component({
|
||||
standalone: true,
|
||||
imports: [NxWelcomeComponent],
|
||||
selector: 'proj-root',
|
||||
templateUrl: './app.component.html',
|
||||
styleUrls: ['./app.component.css']
|
||||
})
|
||||
export class AppComponent {
|
||||
title = 'standalone';
|
||||
}"
|
||||
`;
|
||||
|
||||
exports[`app --standalone should generate a standalone app correctly without routing 3`] = `
|
||||
"import { TestBed } from '@angular/core/testing';
|
||||
import { AppComponent } from './app.component';
|
||||
import { NxWelcomeComponent } from './nx-welcome.component';
|
||||
|
||||
describe('AppComponent', () => {
|
||||
beforeEach(async () => {
|
||||
await TestBed.configureTestingModule({imports: [AppComponent, NxWelcomeComponent]}).compileComponents();
|
||||
});
|
||||
|
||||
it('should create the app', () => {
|
||||
const fixture = TestBed.createComponent(AppComponent);
|
||||
const app = fixture.componentInstance;
|
||||
expect(app).toBeTruthy();
|
||||
});
|
||||
|
||||
it(\`should have as title 'standalone'\`, () => {
|
||||
const fixture = TestBed.createComponent(AppComponent);
|
||||
const app = fixture.componentInstance;
|
||||
expect(app.title).toEqual('standalone');
|
||||
});
|
||||
|
||||
it('should render title', () => {
|
||||
const fixture = TestBed.createComponent(AppComponent);
|
||||
fixture.detectChanges();
|
||||
const compiled = fixture.nativeElement as HTMLElement;
|
||||
expect(compiled.querySelector('h1')?.textContent).toContain('Welcome standalone');
|
||||
});
|
||||
});
|
||||
"
|
||||
`;
|
||||
|
||||
exports[`app at the root should accept numbers in the path 1`] = `"src/9-websites/my-app"`;
|
||||
|
||||
exports[`app nested should update workspace.json 1`] = `
|
||||
Object {
|
||||
"architect": Object {
|
||||
"build": Object {
|
||||
"builder": "@angular-devkit/build-angular:browser",
|
||||
"configurations": Object {
|
||||
"development": Object {
|
||||
"buildOptimizer": false,
|
||||
"extractLicenses": false,
|
||||
"namedChunks": true,
|
||||
"optimization": false,
|
||||
"sourceMap": true,
|
||||
"vendorChunk": true,
|
||||
},
|
||||
"production": Object {
|
||||
"budgets": Array [
|
||||
Object {
|
||||
"maximumError": "1mb",
|
||||
"maximumWarning": "500kb",
|
||||
"type": "initial",
|
||||
},
|
||||
Object {
|
||||
"maximumError": "4kb",
|
||||
"maximumWarning": "2kb",
|
||||
"type": "anyComponentStyle",
|
||||
},
|
||||
],
|
||||
"outputHashing": "all",
|
||||
},
|
||||
},
|
||||
"defaultConfiguration": "production",
|
||||
"options": Object {
|
||||
"assets": Array [
|
||||
"apps/my-dir/my-app/src/favicon.ico",
|
||||
"apps/my-dir/my-app/src/assets",
|
||||
],
|
||||
"index": "apps/my-dir/my-app/src/index.html",
|
||||
"main": "apps/my-dir/my-app/src/main.ts",
|
||||
"outputPath": "dist/apps/my-dir/my-app",
|
||||
"polyfills": Array [
|
||||
"zone.js",
|
||||
],
|
||||
"scripts": Array [],
|
||||
"styles": Array [
|
||||
"apps/my-dir/my-app/src/styles.css",
|
||||
],
|
||||
"tsConfig": "apps/my-dir/my-app/tsconfig.app.json",
|
||||
},
|
||||
"outputs": Array [
|
||||
"{options.outputPath}",
|
||||
],
|
||||
},
|
||||
"extract-i18n": Object {
|
||||
"builder": "@angular-devkit/build-angular:extract-i18n",
|
||||
"options": Object {
|
||||
"browserTarget": "my-dir-my-app:build",
|
||||
},
|
||||
},
|
||||
"lint": Object {
|
||||
"builder": "@nrwl/linter:eslint",
|
||||
"options": Object {
|
||||
"lintFilePatterns": Array [
|
||||
"apps/my-dir/my-app/**/*.ts",
|
||||
"apps/my-dir/my-app/**/*.html",
|
||||
],
|
||||
},
|
||||
"outputs": Array [
|
||||
"{options.outputFile}",
|
||||
],
|
||||
},
|
||||
"serve": Object {
|
||||
"builder": "@angular-devkit/build-angular:dev-server",
|
||||
"configurations": Object {
|
||||
"development": Object {
|
||||
"browserTarget": "my-dir-my-app:build:development",
|
||||
},
|
||||
"production": Object {
|
||||
"browserTarget": "my-dir-my-app:build:production",
|
||||
},
|
||||
},
|
||||
"defaultConfiguration": "development",
|
||||
},
|
||||
"test": Object {
|
||||
"builder": "@nrwl/jest:jest",
|
||||
"configurations": Object {
|
||||
"ci": Object {
|
||||
"ci": true,
|
||||
"codeCoverage": true,
|
||||
},
|
||||
},
|
||||
"options": Object {
|
||||
"jestConfig": "apps/my-dir/my-app/jest.config.ts",
|
||||
"passWithNoTests": true,
|
||||
},
|
||||
"outputs": Array [
|
||||
"{workspaceRoot}/coverage/{projectRoot}",
|
||||
],
|
||||
},
|
||||
},
|
||||
"prefix": "proj",
|
||||
"projectType": "application",
|
||||
"root": "apps/my-dir/my-app",
|
||||
"sourceRoot": "apps/my-dir/my-app/src",
|
||||
"tags": Array [],
|
||||
}
|
||||
`;
|
||||
|
||||
exports[`app nested should update workspace.json 2`] = `
|
||||
Object {
|
||||
"architect": Object {
|
||||
"e2e": Object {
|
||||
"builder": "@nrwl/cypress:cypress",
|
||||
"configurations": Object {
|
||||
"production": Object {
|
||||
"devServerTarget": "my-dir-my-app:serve:production",
|
||||
},
|
||||
},
|
||||
"options": Object {
|
||||
"cypressConfig": "apps/my-dir/my-app-e2e/cypress.config.ts",
|
||||
"devServerTarget": "my-dir-my-app:serve:development",
|
||||
"testingType": "e2e",
|
||||
},
|
||||
},
|
||||
"lint": Object {
|
||||
"builder": "@nrwl/linter:eslint",
|
||||
"options": Object {
|
||||
"lintFilePatterns": Array [
|
||||
"apps/my-dir/my-app-e2e/**/*.{js,ts}",
|
||||
],
|
||||
},
|
||||
"outputs": Array [
|
||||
"{options.outputFile}",
|
||||
],
|
||||
},
|
||||
},
|
||||
"implicitDependencies": Array [
|
||||
"my-dir-my-app",
|
||||
],
|
||||
"projectType": "application",
|
||||
"root": "apps/my-dir/my-app-e2e",
|
||||
"sourceRoot": "apps/my-dir/my-app-e2e/src",
|
||||
"tags": Array [],
|
||||
}
|
||||
`;
|
||||
|
||||
exports[`app not nested should generate files 1`] = `
|
||||
Object {
|
||||
"angularCompilerOptions": Object {
|
||||
"enableI18nLegacyMessageIdFormat": false,
|
||||
"strictInjectionParameters": true,
|
||||
"strictInputAccessModifiers": true,
|
||||
"strictTemplates": true,
|
||||
},
|
||||
"compilerOptions": Object {
|
||||
"allowJs": true,
|
||||
"forceConsistentCasingInFileNames": true,
|
||||
"noFallthroughCasesInSwitch": true,
|
||||
"noImplicitOverride": true,
|
||||
"noImplicitReturns": true,
|
||||
"noPropertyAccessFromIndexSignature": true,
|
||||
"outDir": "../../dist/out-tsc",
|
||||
"sourceMap": false,
|
||||
"strict": true,
|
||||
"types": Array [
|
||||
"cypress",
|
||||
"node",
|
||||
],
|
||||
},
|
||||
"extends": "../../tsconfig.base.json",
|
||||
"include": Array [
|
||||
"src/**/*.ts",
|
||||
"src/**/*.js",
|
||||
"cypress.config.ts",
|
||||
],
|
||||
}
|
||||
`;
|
||||
|
||||
exports[`app not nested should update workspace.json 1`] = `
|
||||
Object {
|
||||
"architect": Object {
|
||||
"build": Object {
|
||||
"builder": "@angular-devkit/build-angular:browser",
|
||||
"configurations": Object {
|
||||
"development": Object {
|
||||
"buildOptimizer": false,
|
||||
"extractLicenses": false,
|
||||
"namedChunks": true,
|
||||
"optimization": false,
|
||||
"sourceMap": true,
|
||||
"vendorChunk": true,
|
||||
},
|
||||
"production": Object {
|
||||
"budgets": Array [
|
||||
Object {
|
||||
"maximumError": "1mb",
|
||||
"maximumWarning": "500kb",
|
||||
"type": "initial",
|
||||
},
|
||||
Object {
|
||||
"maximumError": "4kb",
|
||||
"maximumWarning": "2kb",
|
||||
"type": "anyComponentStyle",
|
||||
},
|
||||
],
|
||||
"outputHashing": "all",
|
||||
},
|
||||
},
|
||||
"defaultConfiguration": "production",
|
||||
"options": Object {
|
||||
"assets": Array [
|
||||
"apps/my-app/src/favicon.ico",
|
||||
"apps/my-app/src/assets",
|
||||
],
|
||||
"index": "apps/my-app/src/index.html",
|
||||
"main": "apps/my-app/src/main.ts",
|
||||
"outputPath": "dist/apps/my-app",
|
||||
"polyfills": Array [
|
||||
"zone.js",
|
||||
],
|
||||
"scripts": Array [],
|
||||
"styles": Array [
|
||||
"apps/my-app/src/styles.css",
|
||||
],
|
||||
"tsConfig": "apps/my-app/tsconfig.app.json",
|
||||
},
|
||||
"outputs": Array [
|
||||
"{options.outputPath}",
|
||||
],
|
||||
},
|
||||
"extract-i18n": Object {
|
||||
"builder": "@angular-devkit/build-angular:extract-i18n",
|
||||
"options": Object {
|
||||
"browserTarget": "my-app:build",
|
||||
},
|
||||
},
|
||||
"lint": Object {
|
||||
"builder": "@nrwl/linter:eslint",
|
||||
"options": Object {
|
||||
"lintFilePatterns": Array [
|
||||
"apps/my-app/**/*.ts",
|
||||
"apps/my-app/**/*.html",
|
||||
],
|
||||
},
|
||||
"outputs": Array [
|
||||
"{options.outputFile}",
|
||||
],
|
||||
},
|
||||
"serve": Object {
|
||||
"builder": "@angular-devkit/build-angular:dev-server",
|
||||
"configurations": Object {
|
||||
"development": Object {
|
||||
"browserTarget": "my-app:build:development",
|
||||
},
|
||||
"production": Object {
|
||||
"browserTarget": "my-app:build:production",
|
||||
},
|
||||
},
|
||||
"defaultConfiguration": "development",
|
||||
},
|
||||
"test": Object {
|
||||
"builder": "@nrwl/jest:jest",
|
||||
"configurations": Object {
|
||||
"ci": Object {
|
||||
"ci": true,
|
||||
"codeCoverage": true,
|
||||
},
|
||||
},
|
||||
"options": Object {
|
||||
"jestConfig": "apps/my-app/jest.config.ts",
|
||||
"passWithNoTests": true,
|
||||
},
|
||||
"outputs": Array [
|
||||
"{workspaceRoot}/coverage/{projectRoot}",
|
||||
],
|
||||
},
|
||||
},
|
||||
"prefix": "proj",
|
||||
"projectType": "application",
|
||||
"root": "apps/my-app",
|
||||
"sourceRoot": "apps/my-app/src",
|
||||
"tags": Array [],
|
||||
}
|
||||
`;
|
||||
|
||||
exports[`app not nested should update workspace.json 2`] = `
|
||||
Object {
|
||||
"architect": Object {
|
||||
"e2e": Object {
|
||||
"builder": "@nrwl/cypress:cypress",
|
||||
"configurations": Object {
|
||||
"production": Object {
|
||||
"devServerTarget": "my-app:serve:production",
|
||||
},
|
||||
},
|
||||
"options": Object {
|
||||
"cypressConfig": "apps/my-app-e2e/cypress.config.ts",
|
||||
"devServerTarget": "my-app:serve:development",
|
||||
"testingType": "e2e",
|
||||
},
|
||||
},
|
||||
"lint": Object {
|
||||
"builder": "@nrwl/linter:eslint",
|
||||
"options": Object {
|
||||
"lintFilePatterns": Array [
|
||||
"apps/my-app-e2e/**/*.{js,ts}",
|
||||
],
|
||||
},
|
||||
"outputs": Array [
|
||||
"{options.outputFile}",
|
||||
],
|
||||
},
|
||||
},
|
||||
"implicitDependencies": Array [
|
||||
"my-app",
|
||||
],
|
||||
"projectType": "application",
|
||||
"root": "apps/my-app-e2e",
|
||||
"sourceRoot": "apps/my-app-e2e/src",
|
||||
"tags": Array [],
|
||||
}
|
||||
`;
|
||||
@ -5,7 +5,6 @@ import {
|
||||
Tree,
|
||||
} from '@nrwl/devkit';
|
||||
import { wrapAngularDevkitSchematic } from '@nrwl/devkit/ngcli-adapter';
|
||||
import { convertToNxProjectGenerator } from '@nrwl/workspace/generators';
|
||||
import { UnitTestRunner } from '../../../utils/test-runners';
|
||||
import { angularInitGenerator } from '../../init/init';
|
||||
import { setupTailwindGenerator } from '../../setup-tailwind/setup-tailwind';
|
||||
@ -118,13 +117,6 @@ export async function applicationGenerator(
|
||||
setApplicationStrictDefault(host, false);
|
||||
}
|
||||
|
||||
if (options.standaloneConfig) {
|
||||
await convertToNxProjectGenerator(host, {
|
||||
project: options.name,
|
||||
all: false,
|
||||
});
|
||||
}
|
||||
|
||||
if (options.standalone) {
|
||||
convertToStandaloneApp(host, options);
|
||||
}
|
||||
|
||||
@ -9,7 +9,6 @@ import { E2eTestRunner } from '../../../../utils/test-runners';
|
||||
import { addProtractor } from './add-protractor';
|
||||
import { removeScaffoldedE2e } from './remove-scaffolded-e2e';
|
||||
import { updateE2eProject } from './update-e2e-project';
|
||||
import { convertToNxProjectGenerator } from '@nrwl/workspace/generators';
|
||||
import { Linter, lintProjectGenerator } from '@nrwl/linter';
|
||||
|
||||
export async function addE2e(tree: Tree, options: NormalizedSchema) {
|
||||
@ -34,14 +33,6 @@ export async function addE2e(tree: Tree, options: NormalizedSchema) {
|
||||
|
||||
if (options.e2eTestRunner === E2eTestRunner.Protractor) {
|
||||
updateE2eProject(tree, options);
|
||||
if (
|
||||
options.standaloneConfig ??
|
||||
getWorkspaceLayout(tree).standaloneAsDefault
|
||||
) {
|
||||
await convertToNxProjectGenerator(tree, {
|
||||
project: `${options.e2eProjectName}`,
|
||||
});
|
||||
}
|
||||
if (options.linter === Linter.EsLint) {
|
||||
await lintProjectGenerator(tree, {
|
||||
project: options.e2eProjectName,
|
||||
|
||||
@ -1,7 +1,6 @@
|
||||
import {
|
||||
extractLayoutDirectory,
|
||||
getWorkspaceLayout,
|
||||
getWorkspacePath,
|
||||
joinPathFragments,
|
||||
names,
|
||||
readJson,
|
||||
@ -51,19 +50,8 @@ export function normalizeOptions(
|
||||
|
||||
options.standaloneConfig = options.standaloneConfig ?? standaloneAsDefault;
|
||||
|
||||
// Determine the roots where @schematics/angular will place the projects
|
||||
// This might not be where the projects actually end up
|
||||
const workspaceJsonPath = getWorkspacePath(host);
|
||||
let newProjectRoot = null;
|
||||
if (workspaceJsonPath) {
|
||||
({ newProjectRoot } = readJson(host, workspaceJsonPath));
|
||||
}
|
||||
const ngCliSchematicAppRoot = newProjectRoot
|
||||
? `${newProjectRoot}/${appProjectName}`
|
||||
: appProjectName;
|
||||
const ngCliSchematicE2ERoot = newProjectRoot
|
||||
? `${newProjectRoot}/${e2eProjectName}`
|
||||
: `${appProjectName}/e2e`;
|
||||
const ngCliSchematicAppRoot = appProjectName;
|
||||
const ngCliSchematicE2ERoot = `${appProjectName}/e2e`;
|
||||
|
||||
// Set defaults and then overwrite with user options
|
||||
return {
|
||||
|
||||
@ -57,7 +57,6 @@ function updateAppAndE2EProjectConfigurations(
|
||||
host: Tree,
|
||||
options: NormalizedSchema
|
||||
) {
|
||||
// workspace.json
|
||||
let project = readProjectConfiguration(host, options.name);
|
||||
|
||||
if (options.ngCliSchematicAppRoot !== options.appProjectRoot) {
|
||||
@ -116,12 +115,7 @@ function updateAppAndE2EProjectConfigurations(
|
||||
* it back to workaround that.
|
||||
*/
|
||||
removeProjectConfiguration(host, options.name);
|
||||
addProjectConfiguration(
|
||||
host,
|
||||
options.name,
|
||||
project,
|
||||
options.standaloneConfig
|
||||
);
|
||||
addProjectConfiguration(host, options.name, project);
|
||||
|
||||
if (options.unitTestRunner === UnitTestRunner.None) {
|
||||
host.delete(`${options.appProjectRoot}/src/app/app.component.spec.ts`);
|
||||
|
||||
@ -35,7 +35,6 @@ export function updateE2eProject(tree: Tree, options: NormalizedSchema) {
|
||||
tags: [],
|
||||
};
|
||||
project.targets.e2e.options.protractorConfig = `${options.e2eProjectRoot}/protractor.conf.js`;
|
||||
// update workspace.json / angular.json
|
||||
addProjectConfiguration(tree, options.e2eProjectName, project);
|
||||
|
||||
delete proj.targets.e2e;
|
||||
|
||||
@ -10,10 +10,7 @@ import {
|
||||
stripIndents,
|
||||
updateJson,
|
||||
} from '@nrwl/devkit';
|
||||
import {
|
||||
createTreeWithEmptyV1Workspace,
|
||||
createTreeWithEmptyWorkspace,
|
||||
} from '@nrwl/devkit/testing';
|
||||
import { createTreeWithEmptyWorkspace } from '@nrwl/devkit/testing';
|
||||
import { Linter } from '@nrwl/linter';
|
||||
import { E2eTestRunner, UnitTestRunner } from '../../utils/test-runners';
|
||||
import {
|
||||
@ -34,19 +31,16 @@ describe('app', () => {
|
||||
> = installedCypressVersion as never;
|
||||
beforeEach(() => {
|
||||
mockedInstalledCypressVersion.mockReturnValue(10);
|
||||
appTree = createTreeWithEmptyV1Workspace();
|
||||
appTree = createTreeWithEmptyWorkspace({ layout: 'apps-libs' });
|
||||
});
|
||||
|
||||
describe('not nested', () => {
|
||||
it('should update workspace.json', async () => {
|
||||
it('should create project configs', async () => {
|
||||
// ACT
|
||||
await generateApp(appTree);
|
||||
|
||||
// ASSERT
|
||||
const workspaceJson = readJson(appTree, '/workspace.json');
|
||||
|
||||
expect(workspaceJson.projects['my-app']).toMatchSnapshot();
|
||||
expect(workspaceJson.projects['my-app-e2e']).toMatchSnapshot();
|
||||
expect(readProjectConfiguration(appTree, 'my-app')).toMatchSnapshot();
|
||||
expect(readProjectConfiguration(appTree, 'my-app-e2e')).toMatchSnapshot();
|
||||
});
|
||||
|
||||
it('should remove the e2e target on the application', async () => {
|
||||
@ -54,8 +48,9 @@ describe('app', () => {
|
||||
await generateApp(appTree);
|
||||
|
||||
// ASSERT
|
||||
const workspaceJson = readJson(appTree, '/workspace.json');
|
||||
expect(workspaceJson.projects['my-app'].architect.e2e).not.toBeDefined();
|
||||
expect(
|
||||
readProjectConfiguration(appTree, 'my-app').targets.e2e
|
||||
).not.toBeDefined();
|
||||
});
|
||||
|
||||
it('should update tags + implicit dependencies', async () => {
|
||||
@ -140,75 +135,6 @@ describe('app', () => {
|
||||
);
|
||||
});
|
||||
|
||||
it('should default the prefix to npmScope', async () => {
|
||||
// Testing without prefix
|
||||
await generateApp(appTree, 'myApp', {
|
||||
e2eTestRunner: E2eTestRunner.Protractor,
|
||||
});
|
||||
|
||||
const appE2eSpec = appTree.read(
|
||||
'apps/my-app-e2e/src/app.e2e-spec.ts',
|
||||
'utf-8'
|
||||
);
|
||||
const workspaceJson = parseJson(appTree.read('workspace.json', 'utf-8'));
|
||||
const myAppPrefix = workspaceJson.projects['my-app'].prefix;
|
||||
|
||||
expect(myAppPrefix).toEqual('proj');
|
||||
expect(appE2eSpec).toContain('Welcome my-app');
|
||||
});
|
||||
|
||||
it('should set a new prefix and use it', async () => {
|
||||
// Testing WITH prefix
|
||||
await generateApp(appTree, 'myAppWithPrefix', {
|
||||
prefix: 'custom',
|
||||
e2eTestRunner: E2eTestRunner.Protractor,
|
||||
});
|
||||
|
||||
const appE2eSpec = appTree.read(
|
||||
'apps/my-app-with-prefix-e2e/src/app.e2e-spec.ts',
|
||||
'utf-8'
|
||||
);
|
||||
const workspaceJson = parseJson(appTree.read('workspace.json', 'utf-8'));
|
||||
const myAppPrefix = workspaceJson.projects['my-app-with-prefix'].prefix;
|
||||
|
||||
expect(myAppPrefix).toEqual('custom');
|
||||
expect(appE2eSpec).toContain('Welcome my-app-with-prefix');
|
||||
});
|
||||
|
||||
it('should work if the new project root is changed', async () => {
|
||||
// ARRANGE
|
||||
updateJson(appTree, '/workspace.json', (json) => ({
|
||||
...json,
|
||||
newProjectRoot: 'newProjectRoot',
|
||||
}));
|
||||
|
||||
// ACT
|
||||
await generateApp(appTree, 'my-app', {
|
||||
e2eTestRunner: E2eTestRunner.Protractor,
|
||||
});
|
||||
|
||||
// ASSERT
|
||||
expect(appTree.exists('apps/my-app/src/main.ts')).toEqual(true);
|
||||
expect(appTree.exists('apps/my-app-e2e/protractor.conf.js')).toEqual(
|
||||
true
|
||||
);
|
||||
});
|
||||
|
||||
it('should set projectType to application', async () => {
|
||||
await generateApp(appTree, 'app');
|
||||
const workspaceJson = readJson(appTree, '/workspace.json');
|
||||
expect(workspaceJson.projects['app'].projectType).toEqual('application');
|
||||
});
|
||||
|
||||
it('should extend from tsconfig.base.json', async () => {
|
||||
// ACT
|
||||
await generateApp(appTree, 'app');
|
||||
|
||||
// ASSERT
|
||||
const appTsConfig = readJson(appTree, 'apps/app/tsconfig.json');
|
||||
expect(appTsConfig.extends).toBe('../../tsconfig.base.json');
|
||||
});
|
||||
|
||||
it('should support a root tsconfig.json instead of tsconfig.base.json', async () => {
|
||||
// ARRANGE
|
||||
appTree.rename('tsconfig.base.json', 'tsconfig.json');
|
||||
@ -237,12 +163,14 @@ describe('app', () => {
|
||||
});
|
||||
|
||||
describe('nested', () => {
|
||||
it('should update workspace.json', async () => {
|
||||
it('should create project configs', async () => {
|
||||
await generateApp(appTree, 'myApp', { directory: 'myDir' });
|
||||
const workspaceJson = readJson(appTree, '/workspace.json');
|
||||
|
||||
expect(workspaceJson.projects['my-dir-my-app']).toMatchSnapshot();
|
||||
expect(workspaceJson.projects['my-dir-my-app-e2e']).toMatchSnapshot();
|
||||
expect(
|
||||
readProjectConfiguration(appTree, 'my-dir-my-app')
|
||||
).toMatchSnapshot();
|
||||
expect(
|
||||
readProjectConfiguration(appTree, 'my-dir-my-app-e2e')
|
||||
).toMatchSnapshot();
|
||||
});
|
||||
|
||||
it('should update tags + implicit dependencies', async () => {
|
||||
@ -523,13 +451,12 @@ describe('app', () => {
|
||||
|
||||
describe('--linter', () => {
|
||||
describe('eslint', () => {
|
||||
it('should add an architect target for lint', async () => {
|
||||
it('should add lint taret', async () => {
|
||||
await generateApp(appTree, 'myApp', { linter: Linter.EsLint });
|
||||
const workspaceJson = readJson(appTree, 'workspace.json');
|
||||
expect(workspaceJson.projects['my-app'].architect.lint)
|
||||
expect(readProjectConfiguration(appTree, 'my-app').targets.lint)
|
||||
.toMatchInlineSnapshot(`
|
||||
Object {
|
||||
"builder": "@nrwl/linter:eslint",
|
||||
"executor": "@nrwl/linter:eslint",
|
||||
"options": Object {
|
||||
"lintFilePatterns": Array [
|
||||
"apps/my-app/**/*.ts",
|
||||
@ -541,10 +468,10 @@ describe('app', () => {
|
||||
],
|
||||
}
|
||||
`);
|
||||
expect(workspaceJson.projects['my-app-e2e'].architect.lint)
|
||||
expect(readProjectConfiguration(appTree, 'my-app-e2e').targets.lint)
|
||||
.toMatchInlineSnapshot(`
|
||||
Object {
|
||||
"builder": "@nrwl/linter:eslint",
|
||||
"executor": "@nrwl/linter:eslint",
|
||||
"options": Object {
|
||||
"lintFilePatterns": Array [
|
||||
"apps/my-app-e2e/**/*.{js,ts}",
|
||||
@ -557,44 +484,6 @@ describe('app', () => {
|
||||
`);
|
||||
});
|
||||
|
||||
it('should add a lint target when e2e test runner is protractor', async () => {
|
||||
await generateApp(appTree, 'myApp', {
|
||||
linter: Linter.EsLint,
|
||||
e2eTestRunner: E2eTestRunner.Protractor,
|
||||
});
|
||||
const workspaceJson = readJson(appTree, 'workspace.json');
|
||||
expect(workspaceJson.projects['my-app'].architect.lint)
|
||||
.toMatchInlineSnapshot(`
|
||||
Object {
|
||||
"builder": "@nrwl/linter:eslint",
|
||||
"options": Object {
|
||||
"lintFilePatterns": Array [
|
||||
"apps/my-app/**/*.ts",
|
||||
"apps/my-app/**/*.html",
|
||||
],
|
||||
},
|
||||
"outputs": Array [
|
||||
"{options.outputFile}",
|
||||
],
|
||||
}
|
||||
`);
|
||||
expect(appTree.exists('apps/my-app-e2e/.eslintrc.json')).toBeTruthy();
|
||||
expect(workspaceJson.projects['my-app-e2e'].architect.lint)
|
||||
.toMatchInlineSnapshot(`
|
||||
Object {
|
||||
"builder": "@nrwl/linter:eslint",
|
||||
"options": Object {
|
||||
"lintFilePatterns": Array [
|
||||
"apps/my-app-e2e/**/*.ts",
|
||||
],
|
||||
},
|
||||
"outputs": Array [
|
||||
"{options.outputFile}",
|
||||
],
|
||||
}
|
||||
`);
|
||||
});
|
||||
|
||||
it('should add valid eslint JSON configuration which extends from Nx presets', async () => {
|
||||
await generateApp(appTree, 'myApp', { linter: Linter.EsLint });
|
||||
|
||||
@ -651,24 +540,10 @@ describe('app', () => {
|
||||
});
|
||||
|
||||
describe('none', () => {
|
||||
it('should not add an architect target for lint', async () => {
|
||||
it('should add no lint target', async () => {
|
||||
await generateApp(appTree, 'myApp', { linter: Linter.None });
|
||||
const workspaceJson = readJson(appTree, 'workspace.json');
|
||||
expect(workspaceJson.projects['my-app'].architect.lint).toBeUndefined();
|
||||
expect(
|
||||
workspaceJson.projects['my-app-e2e'].architect.lint
|
||||
).toBeUndefined();
|
||||
});
|
||||
|
||||
it('should not add an architect target for lint when e2e test runner is protractor', async () => {
|
||||
await generateApp(appTree, 'myApp', {
|
||||
linter: Linter.None,
|
||||
e2eTestRunner: E2eTestRunner.Protractor,
|
||||
});
|
||||
const workspaceJson = readJson(appTree, 'workspace.json');
|
||||
expect(workspaceJson.projects['my-app'].architect.lint).toBeUndefined();
|
||||
expect(
|
||||
workspaceJson.projects['my-app-e2e'].architect.lint
|
||||
readProjectConfiguration(appTree, 'my-app').targets.lint
|
||||
).toBeUndefined();
|
||||
});
|
||||
});
|
||||
@ -701,10 +576,9 @@ describe('app', () => {
|
||||
|
||||
expect(appTree.exists('apps/my-app/tsconfig.spec.json')).toBeTruthy();
|
||||
expect(appTree.exists('apps/my-app/karma.conf.js')).toBeTruthy();
|
||||
const workspaceJson = readJson(appTree, 'workspace.json');
|
||||
expect(workspaceJson.projects['my-app'].architect.test.builder).toEqual(
|
||||
'@angular-devkit/build-angular:karma'
|
||||
);
|
||||
expect(
|
||||
readProjectConfiguration(appTree, 'my-app').targets.test.executor
|
||||
).toEqual('@angular-devkit/build-angular:karma');
|
||||
const tsconfigAppJson = readJson(
|
||||
appTree,
|
||||
'apps/my-app/tsconfig.app.json'
|
||||
@ -728,126 +602,24 @@ describe('app', () => {
|
||||
expect(
|
||||
appTree.exists('apps/my-app/src/app/app.component.spec.ts')
|
||||
).toBeFalsy();
|
||||
const workspaceJson = readJson(appTree, 'workspace.json');
|
||||
expect(workspaceJson.projects['my-app'].architect.test).toBeUndefined();
|
||||
expect(
|
||||
readProjectConfiguration(appTree, 'my-app').targets.test
|
||||
).toBeUndefined();
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
describe('--e2e-test-runner', () => {
|
||||
describe(E2eTestRunner.Protractor, () => {
|
||||
it('should create the e2e project in v2 workspace', async () => {
|
||||
appTree = createTreeWithEmptyWorkspace({ layout: 'apps-libs' });
|
||||
|
||||
expect(
|
||||
async () =>
|
||||
await generateApp(appTree, 'myApp', {
|
||||
e2eTestRunner: E2eTestRunner.Protractor,
|
||||
standaloneConfig: true,
|
||||
})
|
||||
).not.toThrow();
|
||||
});
|
||||
|
||||
it('should update workspace.json', async () => {
|
||||
await generateApp(appTree, 'myApp', {
|
||||
e2eTestRunner: E2eTestRunner.Protractor,
|
||||
});
|
||||
const workspaceJson = readJson(appTree, 'workspace.json');
|
||||
expect(
|
||||
workspaceJson.projects['my-app'].architect.e2e
|
||||
).not.toBeDefined();
|
||||
expect(workspaceJson.projects['my-app-e2e']).toEqual({
|
||||
root: 'apps/my-app-e2e',
|
||||
projectType: 'application',
|
||||
architect: {
|
||||
e2e: {
|
||||
builder: '@angular-devkit/build-angular:protractor',
|
||||
options: {
|
||||
protractorConfig: 'apps/my-app-e2e/protractor.conf.js',
|
||||
},
|
||||
configurations: {
|
||||
development: {
|
||||
devServerTarget: 'my-app:serve:development',
|
||||
},
|
||||
production: {
|
||||
devServerTarget: 'my-app:serve:production',
|
||||
},
|
||||
},
|
||||
defaultConfiguration: 'development',
|
||||
},
|
||||
lint: {
|
||||
builder: '@nrwl/linter:eslint',
|
||||
outputs: ['{options.outputFile}'],
|
||||
options: {
|
||||
lintFilePatterns: ['apps/my-app-e2e/**/*.ts'],
|
||||
},
|
||||
},
|
||||
},
|
||||
implicitDependencies: ['my-app'],
|
||||
tags: [],
|
||||
});
|
||||
});
|
||||
|
||||
it('should update E2E spec files to match the app name', async () => {
|
||||
await generateApp(appTree, 'myApp', {
|
||||
e2eTestRunner: E2eTestRunner.Protractor,
|
||||
});
|
||||
|
||||
expect(
|
||||
appTree.read('apps/my-app-e2e/src/app.e2e-spec.ts', 'utf-8')
|
||||
).toContain(`'Welcome my-app'`);
|
||||
expect(
|
||||
appTree.read('apps/my-app-e2e/src/app.po.ts', 'utf-8')
|
||||
).toContain(`'proj-root header h1'`);
|
||||
});
|
||||
|
||||
it('should update E2E spec files to match the app name when generating within a directory', async () => {
|
||||
await generateApp(appTree, 'myApp', {
|
||||
e2eTestRunner: E2eTestRunner.Protractor,
|
||||
directory: 'my-directory',
|
||||
});
|
||||
|
||||
expect(
|
||||
appTree.read(
|
||||
'apps/my-directory/my-app-e2e/src/app.e2e-spec.ts',
|
||||
'utf-8'
|
||||
)
|
||||
).toContain(`'Welcome my-directory-my-app'`);
|
||||
expect(
|
||||
appTree.read('apps/my-directory/my-app-e2e/src/app.po.ts', 'utf-8')
|
||||
).toContain(`'proj-root header h1'`);
|
||||
});
|
||||
});
|
||||
|
||||
describe('none', () => {
|
||||
it('should not generate test configuration', async () => {
|
||||
await generateApp(appTree, 'myApp', {
|
||||
e2eTestRunner: E2eTestRunner.None,
|
||||
});
|
||||
expect(appTree.exists('apps/my-app-e2e')).toBeFalsy();
|
||||
const workspaceJson = readJson(appTree, 'workspace.json');
|
||||
expect(workspaceJson.projects['my-app-e2e']).toBeUndefined();
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
describe('replaceAppNameWithPath', () => {
|
||||
it('should protect `workspace.json` commands and properties', async () => {
|
||||
await generateApp(appTree, 'ui');
|
||||
const workspaceJson = readJson(appTree, 'workspace.json');
|
||||
expect(workspaceJson.projects['ui']).toBeDefined();
|
||||
expect(
|
||||
workspaceJson.projects['ui']['architect']['build']['builder']
|
||||
).toEqual('@angular-devkit/build-angular:browser');
|
||||
});
|
||||
|
||||
it('should protect `workspace.json` sensible properties value to be renamed', async () => {
|
||||
await generateApp(appTree, 'ui', { prefix: 'ui' });
|
||||
const workspaceJson = readJson(appTree, 'workspace.json');
|
||||
expect(workspaceJson.projects['ui'].prefix).toEqual('ui');
|
||||
});
|
||||
});
|
||||
|
||||
describe('--backend-project', () => {
|
||||
describe('with a backend project', () => {
|
||||
it('should add a proxy.conf.json to app', async () => {
|
||||
|
||||
@ -8,7 +8,6 @@ import {
|
||||
updateNxJson,
|
||||
} from '@nrwl/devkit';
|
||||
import { wrapAngularDevkitSchematic } from '@nrwl/devkit/ngcli-adapter';
|
||||
import { convertToNxProjectGenerator } from '@nrwl/workspace/generators';
|
||||
import { join } from 'path';
|
||||
import { UnitTestRunner } from '../../utils/test-runners';
|
||||
import { angularInitGenerator } from '../init/init';
|
||||
@ -149,13 +148,6 @@ export async function applicationGenerator(
|
||||
setApplicationStrictDefault(tree, false);
|
||||
}
|
||||
|
||||
if (options.standaloneConfig) {
|
||||
await convertToNxProjectGenerator(tree, {
|
||||
project: options.name,
|
||||
all: false,
|
||||
});
|
||||
}
|
||||
|
||||
if (options.standalone) {
|
||||
convertToStandaloneApp(tree, options);
|
||||
}
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@ -1,4 +1,5 @@
|
||||
import type { Tree } from '@nrwl/devkit';
|
||||
import { joinPathFragments } from '@nrwl/devkit';
|
||||
import type { NormalizedSchema } from './normalized-schema';
|
||||
|
||||
import { cypressProjectGenerator } from '@nrwl/cypress';
|
||||
@ -8,9 +9,7 @@ import { E2eTestRunner } from '../../../utils/test-runners';
|
||||
import { addProtractor } from './add-protractor';
|
||||
import { removeScaffoldedE2e } from './remove-scaffolded-e2e';
|
||||
import { updateE2eProject } from './update-e2e-project';
|
||||
import { convertToNxProjectGenerator } from '@nrwl/workspace/generators';
|
||||
import { Linter, lintProjectGenerator } from '@nrwl/linter';
|
||||
import { getWorkspaceLayout, joinPathFragments } from '@nrwl/devkit';
|
||||
|
||||
export async function addE2e(tree: Tree, options: NormalizedSchema) {
|
||||
if (options.e2eTestRunner === E2eTestRunner.Protractor) {
|
||||
@ -34,14 +33,6 @@ export async function addE2e(tree: Tree, options: NormalizedSchema) {
|
||||
|
||||
if (options.e2eTestRunner === E2eTestRunner.Protractor) {
|
||||
updateE2eProject(tree, options);
|
||||
if (
|
||||
options.standaloneConfig ??
|
||||
getWorkspaceLayout(tree).standaloneAsDefault
|
||||
) {
|
||||
await convertToNxProjectGenerator(tree, {
|
||||
project: `${options.e2eProjectName}`,
|
||||
});
|
||||
}
|
||||
if (options.linter === Linter.EsLint) {
|
||||
await lintProjectGenerator(tree, {
|
||||
project: options.e2eProjectName,
|
||||
|
||||
@ -1,10 +1,4 @@
|
||||
import {
|
||||
extractLayoutDirectory,
|
||||
getWorkspacePath,
|
||||
joinPathFragments,
|
||||
readJson,
|
||||
Tree,
|
||||
} from '@nrwl/devkit';
|
||||
import { extractLayoutDirectory, joinPathFragments, Tree } from '@nrwl/devkit';
|
||||
import type { Schema } from '../schema';
|
||||
import type { NormalizedSchema } from './normalized-schema';
|
||||
|
||||
@ -51,19 +45,8 @@ export function normalizeOptions(
|
||||
|
||||
options.standaloneConfig = options.standaloneConfig ?? standaloneAsDefault;
|
||||
|
||||
// Determine the roots where @schematics/angular will place the projects
|
||||
// This might not be where the projects actually end up
|
||||
const workspaceJsonPath = getWorkspacePath(host);
|
||||
let newProjectRoot = null;
|
||||
if (workspaceJsonPath) {
|
||||
({ newProjectRoot } = readJson(host, workspaceJsonPath));
|
||||
}
|
||||
const ngCliSchematicAppRoot = newProjectRoot
|
||||
? `${newProjectRoot}/${appProjectName}`
|
||||
: appProjectName;
|
||||
const ngCliSchematicE2ERoot = newProjectRoot
|
||||
? `${newProjectRoot}/${e2eProjectName}`
|
||||
: `${appProjectName}/e2e`;
|
||||
const ngCliSchematicAppRoot = appProjectName;
|
||||
const ngCliSchematicE2ERoot = `${appProjectName}/e2e`;
|
||||
|
||||
// Set defaults and then overwrite with user options
|
||||
return {
|
||||
|
||||
@ -52,7 +52,6 @@ function updateAppAndE2EProjectConfigurations(
|
||||
host: Tree,
|
||||
options: NormalizedSchema
|
||||
) {
|
||||
// workspace.json
|
||||
let project = readProjectConfiguration(host, options.name);
|
||||
|
||||
if (options.ngCliSchematicAppRoot !== options.appProjectRoot) {
|
||||
@ -111,12 +110,7 @@ function updateAppAndE2EProjectConfigurations(
|
||||
* it back to workaround that.
|
||||
*/
|
||||
removeProjectConfiguration(host, options.name);
|
||||
addProjectConfiguration(
|
||||
host,
|
||||
options.name,
|
||||
project,
|
||||
options.standaloneConfig
|
||||
);
|
||||
addProjectConfiguration(host, options.name, project);
|
||||
|
||||
if (options.unitTestRunner === UnitTestRunner.None) {
|
||||
host.delete(`${options.appProjectRoot}/src/app/app.component.spec.ts`);
|
||||
|
||||
@ -35,7 +35,6 @@ export function updateE2eProject(tree: Tree, options: NormalizedSchema) {
|
||||
tags: [],
|
||||
};
|
||||
project.targets.e2e.options.protractorConfig = `${options.e2eProjectRoot}/protractor.conf.js`;
|
||||
// update workspace.json / angular.json
|
||||
addProjectConfiguration(tree, options.e2eProjectName, project);
|
||||
|
||||
delete proj.targets.e2e;
|
||||
|
||||
@ -131,7 +131,8 @@
|
||||
"standaloneConfig": {
|
||||
"description": "Split the project configuration into `<projectRoot>/project.json` rather than including it inside `workspace.json`.",
|
||||
"type": "boolean",
|
||||
"x-priority": "internal"
|
||||
"default": true,
|
||||
"x-deprecated": "Nx only supports standaloneConfig"
|
||||
},
|
||||
"port": {
|
||||
"type": "number",
|
||||
|
||||
@ -2,7 +2,7 @@ import { installedCypressVersion } from '@nrwl/cypress/src/utils/cypress-version
|
||||
import type { Tree } from '@nrwl/devkit';
|
||||
import * as devkit from '@nrwl/devkit';
|
||||
import { wrapAngularDevkitSchematic } from '@nrwl/devkit/ngcli-adapter';
|
||||
import { createTreeWithEmptyV1Workspace } from '@nrwl/devkit/testing';
|
||||
import { createTreeWithEmptyWorkspace } from '@nrwl/devkit/testing';
|
||||
import { applicationGenerator } from '../application/application';
|
||||
import * as storybookUtils from '../utils/storybook-ast/storybook-inputs';
|
||||
import { componentCypressSpecGenerator } from './component-cypress-spec';
|
||||
@ -17,7 +17,7 @@ describe('componentCypressSpec generator', () => {
|
||||
ReturnType<typeof installedCypressVersion>
|
||||
> = installedCypressVersion as never;
|
||||
beforeEach(async () => {
|
||||
tree = createTreeWithEmptyV1Workspace();
|
||||
tree = createTreeWithEmptyWorkspace({ layout: 'apps-libs' });
|
||||
|
||||
const componentGenerator = wrapAngularDevkitSchematic(
|
||||
'@schematics/angular',
|
||||
|
||||
@ -1,7 +1,7 @@
|
||||
import type { Tree } from '@nrwl/devkit';
|
||||
import * as devkit from '@nrwl/devkit';
|
||||
import { wrapAngularDevkitSchematic } from '@nrwl/devkit/ngcli-adapter';
|
||||
import { createTreeWithEmptyV1Workspace } from '@nrwl/devkit/testing';
|
||||
import { createTreeWithEmptyWorkspace } from '@nrwl/devkit/testing';
|
||||
import { libraryGenerator } from '../library/library';
|
||||
import * as storybookUtils from '../utils/storybook-ast/storybook-inputs';
|
||||
import { componentStoryGenerator } from './component-story';
|
||||
@ -12,7 +12,7 @@ describe('componentStory generator', () => {
|
||||
const storyFile = `libs/${libName}/src/lib/test-button/test-button.component.stories.ts`;
|
||||
|
||||
beforeEach(async () => {
|
||||
tree = createTreeWithEmptyV1Workspace();
|
||||
tree = createTreeWithEmptyWorkspace({ layout: 'apps-libs' });
|
||||
|
||||
const componentGenerator = wrapAngularDevkitSchematic(
|
||||
'@schematics/angular',
|
||||
|
||||
@ -612,6 +612,8 @@ Object {
|
||||
|
||||
exports[`convert-tslint-to-eslint should work for Angular applications 2`] = `
|
||||
Object {
|
||||
"$schema": "../../node_modules/nx/schemas/project-schema.json",
|
||||
"name": "angular-app-1",
|
||||
"prefix": "angular-app",
|
||||
"projectType": "application",
|
||||
"root": "apps/angular-app-1",
|
||||
@ -984,6 +986,8 @@ Object {
|
||||
|
||||
exports[`convert-tslint-to-eslint should work for Angular libraries 2`] = `
|
||||
Object {
|
||||
"$schema": "../../node_modules/nx/schemas/project-schema.json",
|
||||
"name": "angular-lib-1",
|
||||
"prefix": "angular-app",
|
||||
"projectType": "library",
|
||||
"root": "libs/angular-lib-1",
|
||||
|
||||
@ -7,7 +7,7 @@ import {
|
||||
Tree,
|
||||
writeJson,
|
||||
} from '@nrwl/devkit';
|
||||
import { createTreeWithEmptyV1Workspace } from '@nrwl/devkit/testing';
|
||||
import { createTreeWithEmptyWorkspace } from '@nrwl/devkit/testing';
|
||||
import { exampleRootTslintJson } from '@nrwl/linter';
|
||||
import { conversionGenerator } from './convert-tslint-to-eslint';
|
||||
|
||||
@ -133,7 +133,7 @@ describe('convert-tslint-to-eslint', () => {
|
||||
let host: Tree;
|
||||
|
||||
beforeEach(async () => {
|
||||
host = createTreeWithEmptyV1Workspace();
|
||||
host = createTreeWithEmptyWorkspace({ layout: 'apps-libs' });
|
||||
|
||||
writeJson(host, 'tslint.json', exampleRootTslintJson.raw);
|
||||
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
import type { Tree } from '@nrwl/devkit';
|
||||
import * as devkit from '@nrwl/devkit';
|
||||
import { createTreeWithEmptyV1Workspace } from '@nrwl/devkit/testing';
|
||||
import { createTreeWithEmptyWorkspace } from '@nrwl/devkit/testing';
|
||||
import { createApp } from '../../utils/nx-devkit/testing';
|
||||
import { angularJsVersion } from '../../utils/versions';
|
||||
import { downgradeModuleGenerator } from './downgrade-module';
|
||||
@ -11,7 +11,7 @@ describe('downgradeModule generator', () => {
|
||||
|
||||
beforeEach(() => {
|
||||
jest.clearAllMocks();
|
||||
tree = createTreeWithEmptyV1Workspace();
|
||||
tree = createTreeWithEmptyWorkspace({ layout: 'apps-libs' });
|
||||
createApp(tree, appName);
|
||||
});
|
||||
|
||||
|
||||
@ -136,7 +136,9 @@
|
||||
},
|
||||
"standaloneConfig": {
|
||||
"description": "Split the project configuration into `<projectRoot>/project.json` rather than including it inside `workspace.json`.",
|
||||
"type": "boolean"
|
||||
"type": "boolean",
|
||||
"default": true,
|
||||
"x-deprecated": "Nx only supports standaloneConfig"
|
||||
},
|
||||
"setParserOptionsProject": {
|
||||
"type": "boolean",
|
||||
|
||||
@ -1,8 +1,5 @@
|
||||
import { NxJsonConfiguration, readJson, Tree, updateJson } from '@nrwl/devkit';
|
||||
import {
|
||||
createTreeWithEmptyV1Workspace,
|
||||
createTreeWithEmptyWorkspace,
|
||||
} from '@nrwl/devkit/testing';
|
||||
import { createTreeWithEmptyWorkspace } from '@nrwl/devkit/testing';
|
||||
import { Linter } from '@nrwl/linter';
|
||||
import { backwardCompatibleVersions } from '../../utils/backward-compatible-versions';
|
||||
import { E2eTestRunner, UnitTestRunner } from '../../utils/test-runners';
|
||||
@ -12,7 +9,7 @@ describe('init', () => {
|
||||
let host: Tree;
|
||||
|
||||
beforeEach(() => {
|
||||
host = createTreeWithEmptyV1Workspace();
|
||||
host = createTreeWithEmptyWorkspace({ layout: 'apps-libs' });
|
||||
});
|
||||
|
||||
it('should add angular dependencies', async () => {
|
||||
@ -306,7 +303,7 @@ bar
|
||||
describe('v14 support', () => {
|
||||
let tree: Tree;
|
||||
beforeEach(() => {
|
||||
tree = createTreeWithEmptyWorkspace();
|
||||
tree = createTreeWithEmptyWorkspace({ layout: 'apps-libs' });
|
||||
updateJson(tree, 'package.json', (json) => ({
|
||||
...json,
|
||||
dependencies: {
|
||||
|
||||
@ -1,249 +0,0 @@
|
||||
// Jest Snapshot v1, https://goo.gl/fbAQLP
|
||||
|
||||
exports[`karmaProject --root-project should generate the right karma.conf.js file for a nested project in a workspace with a project at the root 1`] = `
|
||||
"// Karma configuration file, see link for more information
|
||||
// https://karma-runner.github.io/6.4/config/configuration-file.html
|
||||
|
||||
const { join } = require('path');
|
||||
const setBaseKarmaConfig = require('../../karma.conf');
|
||||
|
||||
module.exports = function (config) {
|
||||
setBaseKarmaConfig(config);
|
||||
|
||||
config.set({
|
||||
coverageReporter: {
|
||||
dir: join(__dirname, '../../coverage/libs/nested-lib')
|
||||
}
|
||||
});
|
||||
};"
|
||||
`;
|
||||
|
||||
exports[`karmaProject --root-project should generate the right karma.conf.js file for a nested project in a workspace with a project at the root 2`] = `
|
||||
"// Karma configuration file, see link for more information
|
||||
// https://karma-runner.github.io/6.4/config/configuration-file.html
|
||||
|
||||
const { constants } = require('karma');
|
||||
const { join } = require('path');
|
||||
|
||||
module.exports = (config) => {
|
||||
config.set({
|
||||
basePath: '',
|
||||
frameworks: ['jasmine', '@angular-devkit/build-angular'],
|
||||
plugins: [
|
||||
require('karma-jasmine'),
|
||||
require('karma-chrome-launcher'),
|
||||
require('karma-jasmine-html-reporter'),
|
||||
require('karma-coverage'),
|
||||
require('@angular-devkit/build-angular/plugins/karma'),
|
||||
],
|
||||
client: {
|
||||
jasmine: {
|
||||
// you can add configuration options for Jasmine here
|
||||
// the possible options are listed at https://jasmine.github.io/api/edge/Configuration.html
|
||||
// for example, you can disable the random execution with \`random: false\`
|
||||
// or set a specific seed with \`seed: 4321\`
|
||||
},
|
||||
clearContext: false, // leave Jasmine Spec Runner output visible in browser
|
||||
},
|
||||
jasmineHtmlReporter: {
|
||||
suppressAll: true, // removes the duplicated traces
|
||||
},
|
||||
coverageReporter: {
|
||||
dir: join(__dirname, 'coverage/root-app'),
|
||||
subdir: '.',
|
||||
reporters: [{ type: 'html' }, { type: 'text-summary' }],
|
||||
},
|
||||
reporters: ['progress', 'kjhtml'],
|
||||
port: 9876,
|
||||
colors: true,
|
||||
logLevel: constants.LOG_INFO,
|
||||
autoWatch: true,
|
||||
browsers: ['Chrome'],
|
||||
singleRun: true,
|
||||
restartOnFileChange: true,
|
||||
});
|
||||
};
|
||||
"
|
||||
`;
|
||||
|
||||
exports[`karmaProject --root-project should support a project located at the root 1`] = `
|
||||
"// Karma configuration file, see link for more information
|
||||
// https://karma-runner.github.io/6.4/config/configuration-file.html
|
||||
|
||||
const { constants } = require('karma');
|
||||
const { join } = require('path');
|
||||
|
||||
module.exports = (config) => {
|
||||
config.set({
|
||||
basePath: '',
|
||||
frameworks: ['jasmine', '@angular-devkit/build-angular'],
|
||||
plugins: [
|
||||
require('karma-jasmine'),
|
||||
require('karma-chrome-launcher'),
|
||||
require('karma-jasmine-html-reporter'),
|
||||
require('karma-coverage'),
|
||||
require('@angular-devkit/build-angular/plugins/karma'),
|
||||
],
|
||||
client: {
|
||||
jasmine: {
|
||||
// you can add configuration options for Jasmine here
|
||||
// the possible options are listed at https://jasmine.github.io/api/edge/Configuration.html
|
||||
// for example, you can disable the random execution with \`random: false\`
|
||||
// or set a specific seed with \`seed: 4321\`
|
||||
},
|
||||
clearContext: false, // leave Jasmine Spec Runner output visible in browser
|
||||
},
|
||||
jasmineHtmlReporter: {
|
||||
suppressAll: true, // removes the duplicated traces
|
||||
},
|
||||
coverageReporter: {
|
||||
dir: join(__dirname, 'coverage/root-app'),
|
||||
subdir: '.',
|
||||
reporters: [{ type: 'html' }, { type: 'text-summary' }],
|
||||
},
|
||||
reporters: ['progress', 'kjhtml'],
|
||||
port: 9876,
|
||||
colors: true,
|
||||
logLevel: constants.LOG_INFO,
|
||||
autoWatch: true,
|
||||
browsers: ['Chrome'],
|
||||
singleRun: true,
|
||||
restartOnFileChange: true,
|
||||
});
|
||||
};
|
||||
"
|
||||
`;
|
||||
|
||||
exports[`karmaProject --root-project should use get syntax when root project does not have karma conf with set syntax 1`] = `
|
||||
"// Karma configuration file, see link for more information
|
||||
// https://karma-runner.github.io/6.4/config/configuration-file.html
|
||||
|
||||
const { join } = require('path');
|
||||
const getBaseKarmaConfig = require('../../karma.conf');
|
||||
|
||||
module.exports = function (config) {
|
||||
const baseConfig = getBaseKarmaConfig(config);
|
||||
|
||||
config.set({
|
||||
...baseConfig,
|
||||
coverageReporter: {
|
||||
...baseConfig.coverageReporter,
|
||||
dir: join(__dirname, '../../coverage/libs/nested-lib')
|
||||
}
|
||||
});
|
||||
};"
|
||||
`;
|
||||
|
||||
exports[`karmaProject --root-project should use get syntax when root project does not have karma conf with set syntax 2`] = `
|
||||
"// Karma configuration file, see link for more information
|
||||
// https://karma-runner.github.io/1.0/config/configuration-file.html
|
||||
|
||||
const { join } = require('path');
|
||||
const { constants } = require('karma');
|
||||
|
||||
module.exports = () => {
|
||||
return {
|
||||
basePath: '',
|
||||
frameworks: ['jasmine', '@angular-devkit/build-angular'],
|
||||
plugins: [
|
||||
require('karma-jasmine'),
|
||||
require('karma-chrome-launcher'),
|
||||
require('karma-jasmine-html-reporter'),
|
||||
require('karma-coverage'),
|
||||
require('@angular-devkit/build-angular/plugins/karma'),
|
||||
],
|
||||
client: {
|
||||
jasmine: {
|
||||
// you can add configuration options for Jasmine here
|
||||
// the possible options are listed at https://jasmine.github.io/api/edge/Configuration.html
|
||||
// for example, you can disable the random execution with \`random: false\`
|
||||
// or set a specific seed with \`seed: 4321\`
|
||||
},
|
||||
clearContext: false, // leave Jasmine Spec Runner output visible in browser
|
||||
},
|
||||
jasmineHtmlReporter: {
|
||||
suppressAll: true, // removes the duplicated traces
|
||||
},
|
||||
coverageReporter: {
|
||||
dir: join(__dirname, './coverage'),
|
||||
subdir: '.',
|
||||
reporters: [{ type: 'html' }, { type: 'text-summary' }],
|
||||
},
|
||||
reporters: ['progress', 'kjhtml'],
|
||||
port: 9876,
|
||||
colors: true,
|
||||
logLevel: constants.LOG_INFO,
|
||||
autoWatch: true,
|
||||
browsers: ['Chrome'],
|
||||
singleRun: true,
|
||||
restartOnFileChange: true
|
||||
};
|
||||
};
|
||||
"
|
||||
`;
|
||||
|
||||
exports[`karmaProject should create a karma.conf.js 1`] = `
|
||||
"// Karma configuration file, see link for more information
|
||||
// https://karma-runner.github.io/6.4/config/configuration-file.html
|
||||
|
||||
const { join } = require('path');
|
||||
const getBaseKarmaConfig = require('../../karma.conf');
|
||||
|
||||
module.exports = function(config) {
|
||||
const baseConfig = getBaseKarmaConfig();
|
||||
config.set({
|
||||
...baseConfig,
|
||||
coverageReporter: {
|
||||
...baseConfig.coverageReporter,
|
||||
dir: join(__dirname, '../../coverage/libs/lib1')
|
||||
}
|
||||
});
|
||||
};
|
||||
"
|
||||
`;
|
||||
|
||||
exports[`karmaProject should generate files 1`] = `
|
||||
"{
|
||||
\\"extends\\": \\"./tsconfig.json\\",
|
||||
\\"compilerOptions\\": {
|
||||
\\"outDir\\": \\"../../dist/out-tsc\\",
|
||||
\\"types\\": [\\"jasmine\\", \\"node\\"]
|
||||
},
|
||||
\\"include\\": [\\"src/**/*.spec.ts\\", \\"src/**/*.test.ts\\", \\"src/**/*.d.ts\\"]
|
||||
}
|
||||
"
|
||||
`;
|
||||
|
||||
exports[`karmaProject should generate files and correctly add polyfills if it is using old ng style polyfills 1`] = `
|
||||
"{
|
||||
\\"extends\\": \\"./tsconfig.json\\",
|
||||
\\"compilerOptions\\": {
|
||||
\\"outDir\\": \\"../../dist/out-tsc\\",
|
||||
\\"types\\": [
|
||||
\\"jasmine\\",
|
||||
\\"node\\"
|
||||
]
|
||||
},
|
||||
\\"include\\": [
|
||||
\\"src/**/*.spec.ts\\",
|
||||
\\"src/**/*.test.ts\\",
|
||||
\\"src/**/*.d.ts\\"
|
||||
],
|
||||
\\"files\\": [
|
||||
\\"src/polyfills.ts\\"
|
||||
]
|
||||
}
|
||||
"
|
||||
`;
|
||||
|
||||
exports[`karmaProject should generate files and not add polyfills if it is using ng v15 style polyfills 1`] = `
|
||||
"{
|
||||
\\"extends\\": \\"./tsconfig.json\\",
|
||||
\\"compilerOptions\\": {
|
||||
\\"outDir\\": \\"../../dist/out-tsc\\",
|
||||
\\"types\\": [\\"jasmine\\", \\"node\\"]
|
||||
},
|
||||
\\"include\\": [\\"src/**/*.spec.ts\\", \\"src/**/*.test.ts\\", \\"src/**/*.d.ts\\"]
|
||||
}
|
||||
"
|
||||
`;
|
||||
@ -1,331 +0,0 @@
|
||||
import type { Tree } from '@nrwl/devkit';
|
||||
import * as devkit from '@nrwl/devkit';
|
||||
import {
|
||||
readProjectConfiguration,
|
||||
updateJson,
|
||||
updateProjectConfiguration,
|
||||
} from '@nrwl/devkit';
|
||||
import {
|
||||
createTreeWithEmptyV1Workspace,
|
||||
createTreeWithEmptyWorkspace,
|
||||
} from '@nrwl/devkit/testing';
|
||||
import { karmaProjectGenerator } from './karma-project';
|
||||
import libraryGenerator from '../library/library';
|
||||
import { Linter } from '@nrwl/linter';
|
||||
import { UnitTestRunner } from '../../utils/test-runners';
|
||||
import applicationGenerator from '../application/application';
|
||||
|
||||
describe('karmaProject', () => {
|
||||
let tree: Tree;
|
||||
|
||||
beforeEach(async () => {
|
||||
tree = createTreeWithEmptyV1Workspace();
|
||||
|
||||
await libraryGenerator(tree, {
|
||||
name: 'lib1',
|
||||
buildable: false,
|
||||
linter: Linter.EsLint,
|
||||
publishable: false,
|
||||
simpleName: false,
|
||||
skipFormat: false,
|
||||
unitTestRunner: UnitTestRunner.None,
|
||||
});
|
||||
|
||||
await applicationGenerator(tree, {
|
||||
name: 'app1',
|
||||
unitTestRunner: UnitTestRunner.None,
|
||||
});
|
||||
});
|
||||
|
||||
it('should throw when there is already a test target', async () => {
|
||||
devkit.updateJson(tree, 'workspace.json', (json) => {
|
||||
json.projects['lib1'].architect.test = {};
|
||||
return json;
|
||||
});
|
||||
|
||||
await expect(
|
||||
karmaProjectGenerator(tree, { project: 'lib1' })
|
||||
).rejects.toThrow('"lib1" already has a test target.');
|
||||
});
|
||||
|
||||
it('should generate files', async () => {
|
||||
expect(tree.exists('karma.conf.js')).toBeFalsy();
|
||||
await karmaProjectGenerator(tree, { project: 'lib1' });
|
||||
|
||||
expect(tree.exists('/libs/lib1/karma.conf.js')).toBeTruthy();
|
||||
expect(tree.exists('/libs/lib1/tsconfig.spec.json')).toBeTruthy();
|
||||
expect(
|
||||
tree.read('/libs/lib1/tsconfig.spec.json', 'utf-8')
|
||||
).toMatchSnapshot();
|
||||
expect(tree.exists('karma.conf.js')).toBeTruthy();
|
||||
});
|
||||
|
||||
it('should generate files and not add polyfills if it is using ng v15 style polyfills', async () => {
|
||||
expect(tree.exists('karma.conf.js')).toBeFalsy();
|
||||
await karmaProjectGenerator(tree, { project: 'app1' });
|
||||
|
||||
expect(tree.exists('/apps/app1/tsconfig.spec.json')).toBeTruthy();
|
||||
expect(
|
||||
tree.read('/apps/app1/tsconfig.spec.json', 'utf-8')
|
||||
).toMatchSnapshot();
|
||||
});
|
||||
|
||||
it('should generate files and correctly add polyfills if it is using old ng style polyfills', async () => {
|
||||
tree.write('apps/app1/src/polyfills.ts', 'import zone.js;');
|
||||
const project = readProjectConfiguration(tree, 'app1');
|
||||
project.targets.build.options.polyfills = 'apps/app1/src/polyfills.ts';
|
||||
updateProjectConfiguration(tree, 'app1', project);
|
||||
|
||||
expect(tree.exists('karma.conf.js')).toBeFalsy();
|
||||
await karmaProjectGenerator(tree, { project: 'app1' });
|
||||
|
||||
expect(tree.exists('/apps/app1/tsconfig.spec.json')).toBeTruthy();
|
||||
expect(
|
||||
tree.read('/apps/app1/tsconfig.spec.json', 'utf-8')
|
||||
).toMatchSnapshot();
|
||||
});
|
||||
|
||||
it('should create a karma.conf.js', async () => {
|
||||
await karmaProjectGenerator(tree, { project: 'lib1' });
|
||||
|
||||
const karmaConf = tree.read('libs/lib1/karma.conf.js').toString();
|
||||
expect(karmaConf).toMatchSnapshot();
|
||||
});
|
||||
|
||||
it('should update the project tsconfig.json to reference the tsconfig.spec.json', async () => {
|
||||
await karmaProjectGenerator(tree, { project: 'lib1' });
|
||||
|
||||
const tsConfig = devkit.readJson(tree, 'libs/lib1/tsconfig.json');
|
||||
expect(tsConfig.references).toContainEqual({
|
||||
path: './tsconfig.spec.json',
|
||||
});
|
||||
});
|
||||
|
||||
it('should format files', async () => {
|
||||
jest.spyOn(devkit, 'formatFiles');
|
||||
|
||||
await karmaProjectGenerator(tree, { project: 'lib1' });
|
||||
|
||||
expect(devkit.formatFiles).toHaveBeenCalled();
|
||||
});
|
||||
|
||||
describe('library', () => {
|
||||
it('should update the workspace config correctly', async () => {
|
||||
await karmaProjectGenerator(tree, { project: 'lib1' });
|
||||
|
||||
const workspaceJson = devkit.readJson(tree, 'workspace.json');
|
||||
expect(workspaceJson.projects.lib1.architect.test).toEqual({
|
||||
builder: '@angular-devkit/build-angular:karma',
|
||||
options: {
|
||||
tsConfig: 'libs/lib1/tsconfig.spec.json',
|
||||
karmaConfig: 'libs/lib1/karma.conf.js',
|
||||
polyfills: ['zone.js', 'zone.js/testing'],
|
||||
},
|
||||
});
|
||||
});
|
||||
|
||||
it('should create a tsconfig.spec.json', async () => {
|
||||
await karmaProjectGenerator(tree, { project: 'lib1' });
|
||||
|
||||
const tsConfig = devkit.readJson(tree, 'libs/lib1/tsconfig.spec.json');
|
||||
expect(tsConfig).toEqual({
|
||||
extends: './tsconfig.json',
|
||||
compilerOptions: {
|
||||
outDir: '../../dist/out-tsc',
|
||||
types: ['jasmine', 'node'],
|
||||
},
|
||||
include: ['src/**/*.spec.ts', 'src/**/*.test.ts', 'src/**/*.d.ts'],
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
describe('applications', () => {
|
||||
it('should update the workspace config correctly', async () => {
|
||||
await karmaProjectGenerator(tree, { project: 'app1' });
|
||||
|
||||
const workspaceJson = devkit.readJson(tree, 'workspace.json');
|
||||
expect(workspaceJson.projects.app1.architect.test).toEqual({
|
||||
builder: '@angular-devkit/build-angular:karma',
|
||||
options: {
|
||||
polyfills: ['zone.js', 'zone.js/testing'],
|
||||
tsConfig: 'apps/app1/tsconfig.spec.json',
|
||||
karmaConfig: 'apps/app1/karma.conf.js',
|
||||
styles: [],
|
||||
scripts: [],
|
||||
assets: [],
|
||||
},
|
||||
});
|
||||
});
|
||||
|
||||
it('should create a tsconfig.spec.json', async () => {
|
||||
await karmaProjectGenerator(tree, { project: 'app1' });
|
||||
|
||||
const tsConfig = devkit.readJson(tree, 'apps/app1/tsconfig.spec.json');
|
||||
expect(tsConfig).toEqual({
|
||||
extends: './tsconfig.json',
|
||||
compilerOptions: {
|
||||
outDir: '../../dist/out-tsc',
|
||||
types: ['jasmine', 'node'],
|
||||
},
|
||||
include: ['src/**/*.spec.ts', 'src/**/*.test.ts', 'src/**/*.d.ts'],
|
||||
});
|
||||
});
|
||||
|
||||
it('should update the workspace config correctly when using old style ng polyfills', async () => {
|
||||
tree.write('apps/app1/src/polyfills.ts', 'import zone.js;');
|
||||
const project = readProjectConfiguration(tree, 'app1');
|
||||
project.targets.build.options.polyfills = 'apps/app1/src/polyfills.ts';
|
||||
updateProjectConfiguration(tree, 'app1', project);
|
||||
|
||||
await karmaProjectGenerator(tree, { project: 'app1' });
|
||||
|
||||
const workspaceJson = devkit.readJson(tree, 'workspace.json');
|
||||
expect(workspaceJson.projects.app1.architect.test).toEqual({
|
||||
builder: '@angular-devkit/build-angular:karma',
|
||||
options: {
|
||||
polyfills: 'apps/app1/src/polyfills.ts',
|
||||
tsConfig: 'apps/app1/tsconfig.spec.json',
|
||||
karmaConfig: 'apps/app1/karma.conf.js',
|
||||
styles: [],
|
||||
scripts: [],
|
||||
assets: [],
|
||||
},
|
||||
});
|
||||
});
|
||||
|
||||
it('should create a tsconfig.spec.json when using old style ng polyfills', async () => {
|
||||
tree.write('apps/app1/src/polyfills.ts', 'import zone.js;');
|
||||
const project = readProjectConfiguration(tree, 'app1');
|
||||
project.targets.build.options.polyfills = 'apps/app1/src/polyfills.ts';
|
||||
updateProjectConfiguration(tree, 'app1', project);
|
||||
|
||||
await karmaProjectGenerator(tree, { project: 'app1' });
|
||||
|
||||
const tsConfig = devkit.readJson(tree, 'apps/app1/tsconfig.spec.json');
|
||||
expect(tsConfig).toEqual({
|
||||
extends: './tsconfig.json',
|
||||
compilerOptions: {
|
||||
outDir: '../../dist/out-tsc',
|
||||
types: ['jasmine', 'node'],
|
||||
},
|
||||
files: ['src/polyfills.ts'],
|
||||
include: ['src/**/*.spec.ts', 'src/**/*.test.ts', 'src/**/*.d.ts'],
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
describe('--root-project', () => {
|
||||
it('should support a project located at the root', async () => {
|
||||
await applicationGenerator(tree, {
|
||||
name: 'root-app',
|
||||
unitTestRunner: UnitTestRunner.None,
|
||||
rootProject: true,
|
||||
});
|
||||
await karmaProjectGenerator(tree, { project: 'root-app' });
|
||||
|
||||
expect(tree.exists('karma.conf.js')).toBe(true);
|
||||
expect(tree.read('karma.conf.js', 'utf-8')).toMatchSnapshot();
|
||||
expect(tree.exists('tsconfig.spec.json')).toBe(true);
|
||||
const { references } = devkit.readJson(tree, 'tsconfig.json');
|
||||
expect(references).toContainEqual({
|
||||
path: './tsconfig.spec.json',
|
||||
});
|
||||
const project = devkit.readProjectConfiguration(tree, 'root-app');
|
||||
expect(project.targets.test.options).toStrictEqual({
|
||||
polyfills: ['zone.js', 'zone.js/testing'],
|
||||
tsConfig: 'tsconfig.spec.json',
|
||||
karmaConfig: 'karma.conf.js',
|
||||
styles: [],
|
||||
scripts: [],
|
||||
assets: [],
|
||||
});
|
||||
});
|
||||
|
||||
it('should generate the right karma.conf.js file for a nested project in a workspace with a project at the root', async () => {
|
||||
await applicationGenerator(tree, {
|
||||
name: 'root-app',
|
||||
unitTestRunner: UnitTestRunner.Karma,
|
||||
rootProject: true,
|
||||
});
|
||||
await libraryGenerator(tree, {
|
||||
name: 'nested-lib',
|
||||
unitTestRunner: UnitTestRunner.None,
|
||||
});
|
||||
await karmaProjectGenerator(tree, { project: 'nested-lib' });
|
||||
|
||||
expect(tree.exists('libs/nested-lib/karma.conf.js')).toBe(true);
|
||||
expect(
|
||||
tree.read('libs/nested-lib/karma.conf.js', 'utf-8')
|
||||
).toMatchSnapshot();
|
||||
expect(tree.read('karma.conf.js', 'utf-8')).toMatchSnapshot();
|
||||
});
|
||||
|
||||
it('should use get syntax when root project does not have karma conf with set syntax', async () => {
|
||||
await applicationGenerator(tree, {
|
||||
name: 'root-app',
|
||||
unitTestRunner: UnitTestRunner.Jest,
|
||||
rootProject: true,
|
||||
});
|
||||
await libraryGenerator(tree, {
|
||||
name: 'nested-lib',
|
||||
unitTestRunner: UnitTestRunner.None,
|
||||
});
|
||||
await karmaProjectGenerator(tree, { project: 'nested-lib' });
|
||||
|
||||
expect(tree.exists('libs/nested-lib/karma.conf.js')).toBe(true);
|
||||
expect(
|
||||
tree.read('libs/nested-lib/karma.conf.js', 'utf-8')
|
||||
).toMatchSnapshot();
|
||||
expect(tree.read('karma.conf.js', 'utf-8')).toMatchSnapshot();
|
||||
});
|
||||
|
||||
describe('--angular v14', () => {
|
||||
it('should generate the correct karma files for v14', async () => {
|
||||
// ARRANGE
|
||||
const tree = createTreeWithEmptyWorkspace({ layout: 'apps-libs' });
|
||||
updateJson(tree, 'package.json', (json) => ({
|
||||
...json,
|
||||
dependencies: {
|
||||
...json.dependencies,
|
||||
'@angular/core': '14.2.0',
|
||||
},
|
||||
}));
|
||||
|
||||
// ACT
|
||||
await applicationGenerator(tree, {
|
||||
name: 'app',
|
||||
unitTestRunner: UnitTestRunner.Karma,
|
||||
});
|
||||
|
||||
// ASSERT
|
||||
expect(tree.exists('apps/app/src/test.ts')).toBeTruthy();
|
||||
expect(tree.exists('apps/app/karma.conf.js')).toBeTruthy();
|
||||
expect(
|
||||
readProjectConfiguration(tree, 'app').targets.test.options.main
|
||||
).toEqual('apps/app/src/test.ts');
|
||||
expect(tree.read('apps/app/tsconfig.spec.json', 'utf-8'))
|
||||
.toMatchInlineSnapshot(`
|
||||
"{
|
||||
\\"extends\\": \\"./tsconfig.json\\",
|
||||
\\"compilerOptions\\": {
|
||||
\\"outDir\\": \\"../../dist/out-tsc\\",
|
||||
\\"types\\": [
|
||||
\\"jasmine\\",
|
||||
\\"node\\"
|
||||
]
|
||||
},
|
||||
\\"include\\": [
|
||||
\\"src/**/*.spec.ts\\",
|
||||
\\"src/**/*.test.ts\\",
|
||||
\\"src/**/*.d.ts\\"
|
||||
],
|
||||
\\"files\\": [
|
||||
\\"src/test.ts\\"
|
||||
]
|
||||
}
|
||||
"
|
||||
`);
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
@ -1,10 +1,8 @@
|
||||
import {
|
||||
extractLayoutDirectory,
|
||||
getWorkspaceLayout,
|
||||
getWorkspacePath,
|
||||
joinPathFragments,
|
||||
names,
|
||||
readJson,
|
||||
Tree,
|
||||
} from '@nrwl/devkit';
|
||||
import { getImportPath } from 'nx/src/utils/path';
|
||||
@ -65,17 +63,7 @@ export function normalizeOptions(host: Tree, schema: Schema): NormalizedSchema {
|
||||
const importPath =
|
||||
options.importPath || getImportPath(npmScope, fullProjectDirectory);
|
||||
|
||||
// Determine the roots where @schematics/angular will place the projects
|
||||
// This might not be where the projects actually end up
|
||||
const workspaceJsonPath = getWorkspacePath(host);
|
||||
let newProjectRoot = null;
|
||||
if (workspaceJsonPath) {
|
||||
({ newProjectRoot } = readJson(host, workspaceJsonPath));
|
||||
}
|
||||
const ngCliSchematicLibRoot = newProjectRoot
|
||||
? `${newProjectRoot}/${projectName}`
|
||||
: projectName;
|
||||
|
||||
const ngCliSchematicLibRoot = projectName;
|
||||
const allNormalizedOptions = {
|
||||
...options,
|
||||
linter: options.linter ?? Linter.EsLint,
|
||||
|
||||
@ -8,13 +8,9 @@ import {
|
||||
Tree,
|
||||
updateJson,
|
||||
} from '@nrwl/devkit';
|
||||
import {
|
||||
createTreeWithEmptyV1Workspace,
|
||||
createTreeWithEmptyWorkspace,
|
||||
} from '@nrwl/devkit/testing';
|
||||
import { Linter } from '@nrwl/linter';
|
||||
import { toNewFormat } from 'nx/src/config/workspaces';
|
||||
import { createTreeWithEmptyWorkspace } from '@nrwl/devkit/testing';
|
||||
import { backwardCompatibleVersions } from '../../utils/backward-compatible-versions';
|
||||
import { Linter } from '@nrwl/linter';
|
||||
import { createApp } from '../../utils/nx-devkit/testing';
|
||||
import { UnitTestRunner } from '../../utils/test-runners';
|
||||
import {
|
||||
@ -52,7 +48,7 @@ describe('lib', () => {
|
||||
}
|
||||
|
||||
beforeEach(() => {
|
||||
tree = createTreeWithEmptyV1Workspace();
|
||||
tree = createTreeWithEmptyWorkspace({ layout: 'apps-libs' });
|
||||
});
|
||||
|
||||
describe('workspace v2', () => {
|
||||
@ -66,37 +62,6 @@ describe('lib', () => {
|
||||
runLibraryGeneratorWithOpts({ directory: 'mylib/shared/' })
|
||||
).resolves.not.toThrow();
|
||||
});
|
||||
|
||||
it('should default to standalone project for first project', async () => {
|
||||
await runLibraryGeneratorWithOpts();
|
||||
const projectConfig = readProjectConfiguration(tree, 'my-lib');
|
||||
expect(projectConfig.root).toEqual('libs/my-lib');
|
||||
expect(tree.exists('workspace.json')).toEqual(false);
|
||||
});
|
||||
});
|
||||
|
||||
describe('workspace v1', () => {
|
||||
beforeEach(() => {
|
||||
tree = createTreeWithEmptyV1Workspace();
|
||||
});
|
||||
|
||||
it('should default to inline project for first project', async () => {
|
||||
await runLibraryGeneratorWithOpts({
|
||||
standaloneConfig: false,
|
||||
});
|
||||
const workspaceJsonEntry = toNewFormat(readJson(tree, 'workspace.json'))
|
||||
.projects['my-lib'];
|
||||
const projectConfig = readProjectConfiguration(tree, 'my-lib');
|
||||
expect(projectConfig.root).toEqual('libs/my-lib');
|
||||
expect(projectConfig).toMatchObject(workspaceJsonEntry);
|
||||
});
|
||||
|
||||
it('should throw for standaloneConfig === true', async () => {
|
||||
const promise = runLibraryGeneratorWithOpts({
|
||||
standaloneConfig: true,
|
||||
});
|
||||
await expect(promise).rejects.toThrow();
|
||||
});
|
||||
});
|
||||
|
||||
describe('not nested', () => {
|
||||
@ -169,7 +134,7 @@ describe('lib', () => {
|
||||
expect(packageJson.devDependencies['postcss-url']).toBeDefined();
|
||||
});
|
||||
|
||||
it('should update workspace.json', async () => {
|
||||
it('should create project configuration', async () => {
|
||||
// ACT
|
||||
await runLibraryGeneratorWithOpts({
|
||||
publishable: true,
|
||||
@ -177,10 +142,9 @@ describe('lib', () => {
|
||||
});
|
||||
|
||||
// ASSERT
|
||||
const workspaceJson = readJson(tree, '/workspace.json');
|
||||
|
||||
expect(workspaceJson.projects['my-lib'].root).toEqual('libs/my-lib');
|
||||
expect(workspaceJson.projects['my-lib'].architect.build).toBeDefined();
|
||||
const json = readProjectConfiguration(tree, 'my-lib');
|
||||
expect(json.root).toEqual('libs/my-lib');
|
||||
expect(json.targets.build).toBeDefined();
|
||||
});
|
||||
|
||||
it('should not generate a module file and index.ts should be empty', async () => {
|
||||
@ -198,18 +162,15 @@ describe('lib', () => {
|
||||
expect(indexApi).toEqual(``);
|
||||
});
|
||||
|
||||
it('should remove "build" target from workspace.json when a library is not publishable', async () => {
|
||||
it('should remove "build" target from project.json when a library is not publishable', async () => {
|
||||
// ACT
|
||||
await runLibraryGeneratorWithOpts({
|
||||
publishable: false,
|
||||
});
|
||||
|
||||
// ASSERT
|
||||
const workspaceJson = readJson(tree, '/workspace.json');
|
||||
|
||||
expect(workspaceJson.projects['my-lib'].root).toEqual('libs/my-lib');
|
||||
expect(
|
||||
workspaceJson.projects['my-lib'].architect.build
|
||||
readProjectConfiguration(tree, 'my-lib').targets.build
|
||||
).not.toBeDefined();
|
||||
});
|
||||
|
||||
@ -221,10 +182,9 @@ describe('lib', () => {
|
||||
});
|
||||
|
||||
// ASSERT
|
||||
const workspaceJson = readJson(tree, '/workspace.json');
|
||||
|
||||
expect(workspaceJson.projects['my-lib'].root).toEqual('libs/my-lib');
|
||||
expect(workspaceJson.projects['my-lib'].architect.build).toBeDefined();
|
||||
expect(
|
||||
readProjectConfiguration(tree, 'my-lib').targets.build
|
||||
).toBeDefined();
|
||||
});
|
||||
|
||||
it('should remove .browserslistrc when library is not buildable or publishable', async () => {
|
||||
@ -468,52 +428,6 @@ describe('lib', () => {
|
||||
).toBeFalsy();
|
||||
});
|
||||
|
||||
it('should work if the new project root is changed', async () => {
|
||||
// ARRANGE
|
||||
updateJson(tree, 'workspace.json', (json) => ({
|
||||
...json,
|
||||
newProjectRoot: 'newProjectRoot',
|
||||
}));
|
||||
|
||||
// ACT
|
||||
await runLibraryGeneratorWithOpts();
|
||||
|
||||
// ASSERT
|
||||
expect(tree.exists('libs/my-lib/src/index.ts')).toBeTruthy();
|
||||
expect(tree.exists('libs/my-lib/src/lib/my-lib.module.ts')).toBeTruthy();
|
||||
expect(
|
||||
tree.exists('libs/my-lib/src/lib/my-lib.component.ts')
|
||||
).toBeFalsy();
|
||||
expect(
|
||||
tree.exists('libs/my-lib/src/lib/my-lib.component.spec.ts')
|
||||
).toBeFalsy();
|
||||
expect(tree.exists('libs/my-lib/src/lib/my-lib.service.ts')).toBeFalsy();
|
||||
expect(
|
||||
tree.exists('libs/my-lib/src/lib/my-lib.service.spec.ts')
|
||||
).toBeFalsy();
|
||||
});
|
||||
|
||||
it('should default the prefix to npmScope', async () => {
|
||||
// ACT
|
||||
await runLibraryGeneratorWithOpts();
|
||||
await runLibraryGeneratorWithOpts({
|
||||
name: 'myLibWithPrefix',
|
||||
prefix: 'custom',
|
||||
});
|
||||
|
||||
// ASSERT
|
||||
expect(
|
||||
JSON.parse(tree.read('workspace.json').toString()).projects['my-lib']
|
||||
.prefix
|
||||
).toEqual('proj');
|
||||
|
||||
expect(
|
||||
JSON.parse(tree.read('workspace.json').toString()).projects[
|
||||
'my-lib-with-prefix'
|
||||
].prefix
|
||||
).toEqual('custom');
|
||||
});
|
||||
|
||||
it('should not install any e2e test runners', async () => {
|
||||
// ACT
|
||||
await runLibraryGeneratorWithOpts({
|
||||
@ -615,14 +529,12 @@ describe('lib', () => {
|
||||
expect(ngPackage.dest).toEqual('../../../dist/libs/my-dir/my-lib');
|
||||
});
|
||||
|
||||
it('should update workspace.json', async () => {
|
||||
it('should generate project configuration', async () => {
|
||||
// ACT
|
||||
await runLibraryGeneratorWithOpts({ directory: 'myDir' });
|
||||
|
||||
// ASSERT
|
||||
const workspaceJson = readJson(tree, '/workspace.json');
|
||||
|
||||
expect(workspaceJson.projects['my-dir-my-lib'].root).toEqual(
|
||||
expect(readProjectConfiguration(tree, 'my-dir-my-lib').root).toEqual(
|
||||
'libs/my-dir/my-lib'
|
||||
);
|
||||
});
|
||||
@ -1078,42 +990,6 @@ describe('lib', () => {
|
||||
});
|
||||
});
|
||||
|
||||
describe('--unit-test-runner karma', () => {
|
||||
it('should generate karma configuration', async () => {
|
||||
// ACT
|
||||
await runLibraryGeneratorWithOpts({
|
||||
unitTestRunner: UnitTestRunner.Karma,
|
||||
});
|
||||
|
||||
// ASSERT
|
||||
const workspaceJson = readJson(tree, 'workspace.json');
|
||||
|
||||
expect(tree.exists('libs/my-lib/src/test-setup.ts')).toBeFalsy();
|
||||
expect(tree.exists('libs/my-lib/tsconfig.spec.json')).toBeTruthy();
|
||||
expect(tree.exists('libs/my-lib/karma.conf.js')).toBeTruthy();
|
||||
expect(
|
||||
tree.exists('libs/my-lib/src/lib/my-lib.module.spec.ts')
|
||||
).toBeFalsy();
|
||||
expect(tree.exists('karma.conf.js')).toBeTruthy();
|
||||
expect(workspaceJson.projects['my-lib'].architect.test.builder).toEqual(
|
||||
'@angular-devkit/build-angular:karma'
|
||||
);
|
||||
});
|
||||
|
||||
it('should generate module spec when addModuleSpec is specified', async () => {
|
||||
// ACT
|
||||
await runLibraryGeneratorWithOpts({
|
||||
unitTestRunner: UnitTestRunner.Karma,
|
||||
addModuleSpec: true,
|
||||
});
|
||||
// ASSERT
|
||||
|
||||
expect(
|
||||
tree.exists('libs/my-lib/src/lib/my-lib.module.spec.ts')
|
||||
).toBeTruthy();
|
||||
});
|
||||
});
|
||||
|
||||
describe('--unit-test-runner none', () => {
|
||||
it('should not generate test configuration', async () => {
|
||||
// ACT
|
||||
@ -1122,8 +998,6 @@ describe('lib', () => {
|
||||
});
|
||||
|
||||
// ASSERT
|
||||
const workspaceJson = readJson(tree, 'workspace.json');
|
||||
|
||||
expect(
|
||||
tree.exists('libs/my-lib/src/lib/my-lib.module.spec.ts')
|
||||
).toBeFalsy();
|
||||
@ -1132,7 +1006,6 @@ describe('lib', () => {
|
||||
expect(tree.exists('libs/my-lib/tsconfig.spec.json')).toBeFalsy();
|
||||
expect(tree.exists('libs/my-lib/jest.config.ts')).toBeFalsy();
|
||||
expect(tree.exists('libs/my-lib/karma.conf.js')).toBeFalsy();
|
||||
expect(workspaceJson.projects['my-lib'].architect.test).toBeUndefined();
|
||||
});
|
||||
});
|
||||
|
||||
@ -1237,18 +1110,16 @@ describe('lib', () => {
|
||||
|
||||
describe('--linter', () => {
|
||||
describe('eslint', () => {
|
||||
it('should add an architect target for lint', async () => {
|
||||
it('should add a lint target', async () => {
|
||||
// ACT
|
||||
await runLibraryGeneratorWithOpts({ linter: Linter.EsLint });
|
||||
|
||||
// ASSERT
|
||||
const workspaceJson = readJson(tree, 'workspace.json');
|
||||
|
||||
expect(tree.exists('libs/my-lib/tslint.json')).toBe(false);
|
||||
expect(workspaceJson.projects['my-lib'].architect.lint)
|
||||
expect(readProjectConfiguration(tree, 'my-lib').targets['lint'])
|
||||
.toMatchInlineSnapshot(`
|
||||
Object {
|
||||
"builder": "@nrwl/linter:eslint",
|
||||
"executor": "@nrwl/linter:eslint",
|
||||
"options": Object {
|
||||
"lintFilePatterns": Array [
|
||||
"libs/my-lib/**/*.ts",
|
||||
@ -1326,8 +1197,9 @@ describe('lib', () => {
|
||||
await runLibraryGeneratorWithOpts({ linter: Linter.None });
|
||||
|
||||
// ASSERT
|
||||
const workspaceJson = readJson(tree, 'workspace.json');
|
||||
expect(workspaceJson.projects['my-lib'].architect.lint).toBeUndefined();
|
||||
expect(
|
||||
readProjectConfiguration(tree, 'my-lib').targets.lint
|
||||
).toBeUndefined();
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
@ -9,7 +9,6 @@ import {
|
||||
import { wrapAngularDevkitSchematic } from '@nrwl/devkit/ngcli-adapter';
|
||||
import { jestProjectGenerator } from '@nrwl/jest';
|
||||
import { Linter } from '@nrwl/linter';
|
||||
import { convertToNxProjectGenerator } from '@nrwl/workspace/generators';
|
||||
import { lt } from 'semver';
|
||||
import init from '../../generators/init/init';
|
||||
import { E2eTestRunner } from '../../utils/test-runners';
|
||||
@ -123,14 +122,6 @@ export async function libraryGenerator(tree: Tree, schema: Schema) {
|
||||
addBuildableLibrariesPostCssDependencies(tree);
|
||||
}
|
||||
|
||||
if (libraryOptions.standaloneConfig) {
|
||||
await convertToNxProjectGenerator(tree, {
|
||||
project: libraryOptions.name,
|
||||
all: false,
|
||||
skipFormat: true,
|
||||
});
|
||||
}
|
||||
|
||||
if (!libraryOptions.skipFormat) {
|
||||
await formatFiles(tree);
|
||||
}
|
||||
|
||||
@ -118,7 +118,8 @@
|
||||
"standaloneConfig": {
|
||||
"description": "Split the project configuration into `<projectRoot>/project.json` rather than including it inside `workspace.json`.",
|
||||
"type": "boolean",
|
||||
"x-priority": "internal"
|
||||
"default": true,
|
||||
"x-deprecated": "Nx only supports standaloneConfig"
|
||||
},
|
||||
"compilationMode": {
|
||||
"description": "Specifies the compilation mode to use. If not specified, it will default to `partial` for publishable libraries and to `full` for buildable libraries. The `full` value can not be used for publishable libraries.",
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
import { Tree } from '@nrwl/devkit';
|
||||
import { createTreeWithEmptyV1Workspace } from '@nrwl/devkit/testing';
|
||||
import { createTreeWithEmptyWorkspace } from '@nrwl/devkit/testing';
|
||||
import { Linter } from '@nrwl/linter';
|
||||
import { moveGenerator } from '@nrwl/workspace/generators';
|
||||
import { UnitTestRunner } from '../../../utils/test-runners';
|
||||
@ -11,7 +11,7 @@ describe('updateModuleName Rule', () => {
|
||||
let tree: Tree;
|
||||
|
||||
beforeEach(() => {
|
||||
tree = createTreeWithEmptyV1Workspace();
|
||||
tree = createTreeWithEmptyWorkspace({ layout: 'apps-libs' });
|
||||
});
|
||||
|
||||
it('should handle nesting resulting in the same project name', async () => {
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
import { readJson, Tree } from '@nrwl/devkit';
|
||||
import * as devkit from '@nrwl/devkit';
|
||||
import { createTreeWithEmptyV1Workspace } from '@nrwl/devkit/testing';
|
||||
import { createTreeWithEmptyWorkspace } from '@nrwl/devkit/testing';
|
||||
import { angularMoveGenerator } from './move';
|
||||
import libraryGenerator from '../library/library';
|
||||
import { Linter } from '@nrwl/linter';
|
||||
@ -10,7 +10,7 @@ describe('@nrwl/angular:move', () => {
|
||||
let tree: Tree;
|
||||
|
||||
beforeEach(async () => {
|
||||
tree = createTreeWithEmptyV1Workspace();
|
||||
tree = createTreeWithEmptyWorkspace({ layout: 'apps-libs' });
|
||||
|
||||
await libraryGenerator(tree, {
|
||||
name: 'mylib',
|
||||
|
||||
@ -52,9 +52,6 @@ Object {
|
||||
],
|
||||
"production": Array [
|
||||
"default",
|
||||
"!{projectRoot}/tsconfig.spec.json",
|
||||
"!{projectRoot}/**/*.spec.[jt]s",
|
||||
"!{projectRoot}/karma.conf.js",
|
||||
],
|
||||
"sharedGlobals": Array [],
|
||||
},
|
||||
@ -68,27 +65,12 @@ Object {
|
||||
"^production",
|
||||
],
|
||||
},
|
||||
"e2e": Object {
|
||||
"inputs": Array [
|
||||
"default",
|
||||
"^production",
|
||||
],
|
||||
},
|
||||
"test": Object {
|
||||
"inputs": Array [
|
||||
"default",
|
||||
"^production",
|
||||
"{workspaceRoot}/karma.conf.js",
|
||||
],
|
||||
},
|
||||
},
|
||||
"tasksRunnerOptions": Object {
|
||||
"default": Object {
|
||||
"options": Object {
|
||||
"cacheableOperations": Array [
|
||||
"build",
|
||||
"test",
|
||||
"e2e",
|
||||
],
|
||||
},
|
||||
"runner": "nx/tasks-runners/default",
|
||||
@ -266,9 +248,6 @@ Object {
|
||||
],
|
||||
"production": Array [
|
||||
"default",
|
||||
"!{projectRoot}/tsconfig.spec.json",
|
||||
"!{projectRoot}/**/*.spec.[jt]s",
|
||||
"!{projectRoot}/karma.conf.js",
|
||||
"!{projectRoot}/.eslintrc.json",
|
||||
],
|
||||
"sharedGlobals": Array [],
|
||||
@ -284,34 +263,18 @@ Object {
|
||||
"^production",
|
||||
],
|
||||
},
|
||||
"e2e": Object {
|
||||
"inputs": Array [
|
||||
"default",
|
||||
"^production",
|
||||
],
|
||||
},
|
||||
"lint": Object {
|
||||
"inputs": Array [
|
||||
"default",
|
||||
"{workspaceRoot}/.eslintrc.json",
|
||||
],
|
||||
},
|
||||
"test": Object {
|
||||
"inputs": Array [
|
||||
"default",
|
||||
"^production",
|
||||
"{workspaceRoot}/karma.conf.js",
|
||||
],
|
||||
},
|
||||
},
|
||||
"tasksRunnerOptions": Object {
|
||||
"default": Object {
|
||||
"options": Object {
|
||||
"cacheableOperations": Array [
|
||||
"build",
|
||||
"test",
|
||||
"lint",
|
||||
"e2e",
|
||||
],
|
||||
},
|
||||
"runner": "nx/tasks-runners/default",
|
||||
|
||||
@ -9,7 +9,7 @@ import { createTree } from '@nrwl/devkit/testing';
|
||||
import * as prettierUtils from '@nrwl/workspace/src/utilities/prettier';
|
||||
import { migrateFromAngularCli } from './migrate-from-angular-cli';
|
||||
|
||||
describe('workspace', () => {
|
||||
xdescribe('workspace', () => {
|
||||
let tree: Tree;
|
||||
|
||||
beforeEach(() => {
|
||||
|
||||
@ -9,7 +9,7 @@ import {
|
||||
readProjectConfiguration,
|
||||
writeJson,
|
||||
} from '@nrwl/devkit';
|
||||
import { createTreeWithEmptyV1Workspace } from '@nrwl/devkit/testing';
|
||||
import { createTreeWithEmptyWorkspace } from '@nrwl/devkit/testing';
|
||||
import type { MigrationProjectConfiguration } from '../../utilities/types';
|
||||
import { AppMigrator } from './app.migrator';
|
||||
|
||||
@ -23,7 +23,7 @@ type AngularCliProjectConfiguration = Omit<ProjectConfiguration, 'targets'> & {
|
||||
|
||||
const mockedLogger = { warn: jest.fn() };
|
||||
|
||||
describe('app migrator', () => {
|
||||
xdescribe('app migrator', () => {
|
||||
let tree: Tree;
|
||||
|
||||
function addProject(
|
||||
@ -41,11 +41,10 @@ describe('app migrator', () => {
|
||||
}
|
||||
|
||||
beforeEach(() => {
|
||||
tree = createTreeWithEmptyV1Workspace();
|
||||
tree = createTreeWithEmptyWorkspace({ layout: 'apps-libs' });
|
||||
|
||||
// when this migrator is invoked, some of the workspace migration has
|
||||
// already been run, so we make some adjustments to match that state
|
||||
tree.delete('workspace.json');
|
||||
writeJson(tree, 'angular.json', { version: 2, projects: {} });
|
||||
|
||||
jest.clearAllMocks();
|
||||
|
||||
@ -23,7 +23,7 @@ import {
|
||||
readProjectConfiguration,
|
||||
writeJson,
|
||||
} from '@nrwl/devkit';
|
||||
import { createTreeWithEmptyV1Workspace } from '@nrwl/devkit/testing';
|
||||
import { createTreeWithEmptyWorkspace } from '@nrwl/devkit/testing';
|
||||
import type { MigrationProjectConfiguration } from '../../utilities';
|
||||
import { E2eMigrator } from './e2e.migrator';
|
||||
|
||||
@ -37,7 +37,7 @@ type AngularCliProjectConfiguration = Omit<ProjectConfiguration, 'targets'> & {
|
||||
|
||||
const mockedLogger = { warn: jest.fn() };
|
||||
|
||||
describe('e2e migrator', () => {
|
||||
xdescribe('e2e migrator', () => {
|
||||
let tree: Tree;
|
||||
let mockedInstalledCypressVersion = installedCypressVersion as jest.Mock<
|
||||
ReturnType<typeof installedCypressVersion>
|
||||
@ -58,11 +58,10 @@ describe('e2e migrator', () => {
|
||||
}
|
||||
|
||||
beforeEach(() => {
|
||||
tree = createTreeWithEmptyV1Workspace();
|
||||
tree = createTreeWithEmptyWorkspace({ layout: 'apps-libs' });
|
||||
|
||||
// when this migrator is invoked, some of the workspace migration has
|
||||
// already been run, so we make some adjustments to match that state
|
||||
tree.delete('workspace.json');
|
||||
writeJson(tree, 'angular.json', { version: 2, projects: {} });
|
||||
|
||||
mockedInstalledCypressVersion.mockReturnValue(9);
|
||||
|
||||
@ -9,7 +9,7 @@ import {
|
||||
readProjectConfiguration,
|
||||
writeJson,
|
||||
} from '@nrwl/devkit';
|
||||
import { createTreeWithEmptyV1Workspace } from '@nrwl/devkit/testing';
|
||||
import { createTreeWithEmptyWorkspace } from '@nrwl/devkit/testing';
|
||||
import type { MigrationProjectConfiguration } from '../../utilities';
|
||||
import { LibMigrator } from './lib.migrator';
|
||||
|
||||
@ -23,7 +23,7 @@ type AngularCliProjectConfiguration = Omit<ProjectConfiguration, 'targets'> & {
|
||||
|
||||
const mockedLogger = { warn: jest.fn() };
|
||||
|
||||
describe('lib migrator', () => {
|
||||
xdescribe('lib migrator', () => {
|
||||
let tree: Tree;
|
||||
|
||||
function addProject(
|
||||
@ -41,11 +41,10 @@ describe('lib migrator', () => {
|
||||
}
|
||||
|
||||
beforeEach(() => {
|
||||
tree = createTreeWithEmptyV1Workspace();
|
||||
tree = createTreeWithEmptyWorkspace({ layout: 'apps-libs' });
|
||||
|
||||
// when this migrator is invoked, some of the workspace migration has
|
||||
// already been run, so we make some adjustments to match that state
|
||||
tree.delete('workspace.json');
|
||||
writeJson(tree, 'angular.json', { version: 2, projects: {} });
|
||||
|
||||
jest.clearAllMocks();
|
||||
|
||||
@ -130,7 +130,9 @@
|
||||
},
|
||||
"standaloneConfig": {
|
||||
"description": "Split the project configuration into `<projectRoot>/project.json` rather than including it inside `workspace.json`.",
|
||||
"type": "boolean"
|
||||
"type": "boolean",
|
||||
"default": true,
|
||||
"x-deprecated": "Nx only supports standaloneConfig"
|
||||
},
|
||||
"setParserOptionsProject": {
|
||||
"type": "boolean",
|
||||
|
||||
@ -4,7 +4,7 @@ import {
|
||||
Tree,
|
||||
updateJson,
|
||||
} from '@nrwl/devkit';
|
||||
import { createTreeWithEmptyV1Workspace } from '@nrwl/devkit/testing';
|
||||
import { createTreeWithEmptyWorkspace } from '@nrwl/devkit/testing';
|
||||
|
||||
import { setupMf } from './setup-mf';
|
||||
import applicationGenerator from '../application/application';
|
||||
@ -13,7 +13,7 @@ describe('Init MF', () => {
|
||||
let tree: Tree;
|
||||
|
||||
beforeEach(async () => {
|
||||
tree = createTreeWithEmptyV1Workspace();
|
||||
tree = createTreeWithEmptyWorkspace({ layout: 'apps-libs' });
|
||||
await applicationGenerator(tree, {
|
||||
name: 'app1',
|
||||
routing: true,
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
import { installedCypressVersion } from '@nrwl/cypress/src/utils/cypress-version';
|
||||
import type { Tree } from '@nrwl/devkit';
|
||||
import { createTreeWithEmptyV1Workspace } from '@nrwl/devkit/testing';
|
||||
import { createTreeWithEmptyWorkspace } from '@nrwl/devkit/testing';
|
||||
import { applicationGenerator } from '../application/application';
|
||||
import { scamGenerator } from '../scam/scam';
|
||||
import { componentGenerator } from '../component/component';
|
||||
@ -18,7 +18,7 @@ describe('angularStories generator: applications', () => {
|
||||
|
||||
beforeEach(async () => {
|
||||
mockedInstalledCypressVersion.mockReturnValue(10);
|
||||
tree = createTreeWithEmptyV1Workspace();
|
||||
tree = createTreeWithEmptyWorkspace({ layout: 'apps-libs' });
|
||||
await applicationGenerator(tree, {
|
||||
name: appName,
|
||||
});
|
||||
|
||||
@ -1,7 +1,7 @@
|
||||
import { installedCypressVersion } from '@nrwl/cypress/src/utils/cypress-version';
|
||||
import { ensurePackage, Tree } from '@nrwl/devkit';
|
||||
import { writeJson } from '@nrwl/devkit';
|
||||
import { createTreeWithEmptyV1Workspace } from '@nrwl/devkit/testing';
|
||||
import { createTreeWithEmptyWorkspace } from '@nrwl/devkit/testing';
|
||||
import { Linter } from '@nrwl/linter';
|
||||
import { nxVersion } from '../../utils/versions';
|
||||
import { componentGenerator } from '../component/component';
|
||||
@ -28,7 +28,7 @@ describe('angularStories generator: libraries', () => {
|
||||
let tree: Tree;
|
||||
|
||||
beforeEach(async () => {
|
||||
tree = createTreeWithEmptyV1Workspace();
|
||||
tree = createTreeWithEmptyWorkspace({ layout: 'apps-libs' });
|
||||
await libraryGenerator(tree, { name: libName });
|
||||
});
|
||||
|
||||
|
||||
@ -43,6 +43,7 @@ Array [
|
||||
"apps/.gitignore",
|
||||
"apps/one/two/test-ui-lib-e2e/.eslintrc.json",
|
||||
"apps/one/two/test-ui-lib-e2e/cypress.config.ts",
|
||||
"apps/one/two/test-ui-lib-e2e/project.json",
|
||||
"apps/one/two/test-ui-lib-e2e/src/e2e/barrel-button/barrel-button.component.cy.ts",
|
||||
"apps/one/two/test-ui-lib-e2e/src/e2e/cmp1/cmp1.component.cy.ts",
|
||||
"apps/one/two/test-ui-lib-e2e/src/e2e/cmp2/cmp2.component.cy.ts",
|
||||
@ -70,6 +71,7 @@ Array [
|
||||
"libs/test-ui-lib/.storybook/tsconfig.json",
|
||||
"libs/test-ui-lib/jest.config.ts",
|
||||
"libs/test-ui-lib/package.json",
|
||||
"libs/test-ui-lib/project.json",
|
||||
"libs/test-ui-lib/README.md",
|
||||
"libs/test-ui-lib/secondary-entry-point/ng-package.json",
|
||||
"libs/test-ui-lib/secondary-entry-point/README.md",
|
||||
@ -160,7 +162,6 @@ Array [
|
||||
"nx.json",
|
||||
"package.json",
|
||||
"tsconfig.base.json",
|
||||
"workspace.json",
|
||||
]
|
||||
`;
|
||||
|
||||
@ -172,6 +173,7 @@ Array [
|
||||
"apps/.gitignore",
|
||||
"apps/test-ui-lib-e2e/.eslintrc.json",
|
||||
"apps/test-ui-lib-e2e/cypress.config.ts",
|
||||
"apps/test-ui-lib-e2e/project.json",
|
||||
"apps/test-ui-lib-e2e/src/e2e/barrel-button/barrel-button.component.cy.ts",
|
||||
"apps/test-ui-lib-e2e/src/e2e/cmp1/cmp1.component.cy.ts",
|
||||
"apps/test-ui-lib-e2e/src/e2e/cmp2/cmp2.component.cy.ts",
|
||||
@ -199,6 +201,7 @@ Array [
|
||||
"libs/test-ui-lib/.storybook/tsconfig.json",
|
||||
"libs/test-ui-lib/jest.config.ts",
|
||||
"libs/test-ui-lib/package.json",
|
||||
"libs/test-ui-lib/project.json",
|
||||
"libs/test-ui-lib/README.md",
|
||||
"libs/test-ui-lib/secondary-entry-point/ng-package.json",
|
||||
"libs/test-ui-lib/secondary-entry-point/README.md",
|
||||
@ -289,6 +292,5 @@ Array [
|
||||
"nx.json",
|
||||
"package.json",
|
||||
"tsconfig.base.json",
|
||||
"workspace.json",
|
||||
]
|
||||
`;
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
import type { Tree } from '@nrwl/devkit';
|
||||
import * as devkit from '@nrwl/devkit';
|
||||
import { createTreeWithEmptyV1Workspace } from '@nrwl/devkit/testing';
|
||||
import { createTreeWithEmptyWorkspace } from '@nrwl/devkit/testing';
|
||||
import { createApp } from '../../utils/nx-devkit/testing';
|
||||
import { angularJsVersion } from '../../utils/versions';
|
||||
import { upgradeModuleGenerator } from './upgrade-module';
|
||||
@ -11,7 +11,7 @@ describe('upgradeModule generator', () => {
|
||||
|
||||
beforeEach(() => {
|
||||
jest.clearAllMocks();
|
||||
tree = createTreeWithEmptyV1Workspace();
|
||||
tree = createTreeWithEmptyWorkspace({ layout: 'apps-libs' });
|
||||
createApp(tree, appName);
|
||||
});
|
||||
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
import type { Tree } from '@nrwl/devkit';
|
||||
import { wrapAngularDevkitSchematic } from '@nrwl/devkit/ngcli-adapter';
|
||||
import { createTreeWithEmptyV1Workspace } from '@nrwl/devkit/testing';
|
||||
import { createTreeWithEmptyWorkspace } from '@nrwl/devkit/testing';
|
||||
import { Linter } from '@nrwl/linter';
|
||||
import { UnitTestRunner } from '../../utils/test-runners';
|
||||
import libraryGenerator from '../library/library';
|
||||
@ -8,7 +8,7 @@ import libraryGenerator from '../library/library';
|
||||
export async function createStorybookTestWorkspaceForLib(
|
||||
libName: string
|
||||
): Promise<Tree> {
|
||||
let tree = createTreeWithEmptyV1Workspace();
|
||||
let tree = createTreeWithEmptyWorkspace({ layout: 'apps-libs' });
|
||||
|
||||
const moduleGenerator = wrapAngularDevkitSchematic(
|
||||
'@schematics/angular',
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
import type { Tree } from '@nrwl/devkit';
|
||||
import * as devkit from '@nrwl/devkit';
|
||||
import { createTreeWithEmptyV1Workspace } from '@nrwl/devkit/testing';
|
||||
import { createTreeWithEmptyWorkspace } from '@nrwl/devkit/testing';
|
||||
import { applicationGenerator } from '../application/application';
|
||||
import { webWorkerGenerator } from './web-worker';
|
||||
|
||||
@ -9,7 +9,7 @@ describe('webWorker generator', () => {
|
||||
const appName = 'ng-app1';
|
||||
|
||||
beforeEach(async () => {
|
||||
tree = createTreeWithEmptyV1Workspace();
|
||||
tree = createTreeWithEmptyWorkspace({ layout: 'apps-libs' });
|
||||
await applicationGenerator(tree, { name: appName });
|
||||
jest.clearAllMocks();
|
||||
});
|
||||
|
||||
@ -1,42 +0,0 @@
|
||||
import { readJson, writeJson } from '@nrwl/devkit';
|
||||
import { createTreeWithEmptyWorkspace } from '@nrwl/devkit/testing';
|
||||
import updateNgccPostinstall from './update-ngcc-postinstall';
|
||||
|
||||
describe('Remove ngcc flags from postinstall script', () => {
|
||||
[
|
||||
{
|
||||
test: 'node ./decorate-angular-cli.js && ngcc --properties es2015 browser module main --first-only --create-ivy-entry-points',
|
||||
expected:
|
||||
'node ./decorate-angular-cli.js && ngcc --properties es2015 browser module main',
|
||||
},
|
||||
{
|
||||
test: 'node ./decorate-angular-cli.js && ngcc --properties es2015 browser module main --first-only --create-ivy-entry-points && echo "hi"',
|
||||
expected:
|
||||
'node ./decorate-angular-cli.js && ngcc --properties es2015 browser module main && echo "hi"',
|
||||
},
|
||||
{
|
||||
test: 'ngcc --properties es2015 browser module main --first-only --create-ivy-entry-points && node ./decorate-angular-cli.js && echo "hi"',
|
||||
expected:
|
||||
'ngcc --properties es2015 browser module main && node ./decorate-angular-cli.js && echo "hi"',
|
||||
},
|
||||
{
|
||||
test: 'ngcc --properties es2015 browser module main --first-only --create-ivy-entry-points && node ./decorate-angular-cli.js',
|
||||
expected:
|
||||
'ngcc --properties es2015 browser module main && node ./decorate-angular-cli.js',
|
||||
},
|
||||
].forEach((testEntry) => {
|
||||
it(`should adjust ngcc for: "${testEntry.test}"`, async () => {
|
||||
const tree = createTreeWithEmptyWorkspace({ layout: 'apps-libs' });
|
||||
tree.delete('workspace.json');
|
||||
tree.write('angular.json', '{}');
|
||||
writeJson(tree, 'package.json', {
|
||||
scripts: { postinstall: testEntry.test },
|
||||
});
|
||||
|
||||
await updateNgccPostinstall(tree);
|
||||
|
||||
const { scripts } = readJson(tree, 'package.json');
|
||||
expect(scripts.postinstall).toEqual(testEntry.expected);
|
||||
});
|
||||
});
|
||||
});
|
||||
@ -1,22 +0,0 @@
|
||||
import type { Tree } from '@nrwl/devkit';
|
||||
import { formatFiles, updateJson } from '@nrwl/devkit';
|
||||
|
||||
export default async function (tree: Tree) {
|
||||
let shouldFormat = false;
|
||||
|
||||
updateJson(tree, 'package.json', (json) => {
|
||||
if (json.scripts?.postinstall?.includes('ngcc')) {
|
||||
json.scripts.postinstall = json.scripts.postinstall.replace(
|
||||
/(.*)(ngcc --properties es2015 browser module main --first-only --create-ivy-entry-points)(.*)/,
|
||||
'$1ngcc --properties es2015 browser module main$3'
|
||||
);
|
||||
shouldFormat = true;
|
||||
}
|
||||
|
||||
return json;
|
||||
});
|
||||
|
||||
if (shouldFormat) {
|
||||
await formatFiles(tree);
|
||||
}
|
||||
}
|
||||
@ -1,212 +0,0 @@
|
||||
// Jest Snapshot v1, https://goo.gl/fbAQLP
|
||||
|
||||
exports[`convertWebpackBrowserBuildTargetToDelegateBuild should update the configuration correctly 1`] = `
|
||||
Object {
|
||||
"projects": Object {
|
||||
"ng-app1": Object {
|
||||
"architect": Object {
|
||||
"build": Object {
|
||||
"builder": "@nrwl/angular:delegate-build",
|
||||
"configurations": Object {
|
||||
"development": Object {
|
||||
"buildTarget": "ng-app1:customBuild:development",
|
||||
},
|
||||
"production": Object {
|
||||
"buildTarget": "ng-app1:customBuild:production",
|
||||
},
|
||||
},
|
||||
"defaultConfiguration": "production",
|
||||
"options": Object {
|
||||
"buildTarget": "ng-app:customBuild",
|
||||
"outputPath": "dist/apps/ng-app1",
|
||||
"tsConfig": "apps/ng-app1/tsconfig.app.json",
|
||||
},
|
||||
},
|
||||
"customBuild": Object {
|
||||
"builder": "@angular-devkit/build-angular:browser",
|
||||
"configurations": Object {
|
||||
"development": Object {
|
||||
"buildOptimizer": false,
|
||||
"extractLicenses": false,
|
||||
"namedChunks": true,
|
||||
"optimization": false,
|
||||
"sourceMap": true,
|
||||
"vendorChunk": true,
|
||||
},
|
||||
"production": Object {
|
||||
"budgets": Array [
|
||||
Object {
|
||||
"maximumError": "1mb",
|
||||
"maximumWarning": "500kb",
|
||||
"type": "initial",
|
||||
},
|
||||
Object {
|
||||
"maximumError": "4kb",
|
||||
"maximumWarning": "2kb",
|
||||
"type": "anyComponentStyle",
|
||||
},
|
||||
],
|
||||
"fileReplacements": Array [
|
||||
Object {
|
||||
"replace": "apps/ng-app1/src/environments/environment.ts",
|
||||
"with": "apps/ng-app1/src/environments/environment.prod.ts",
|
||||
},
|
||||
],
|
||||
"outputHashing": "all",
|
||||
},
|
||||
},
|
||||
"options": Object {
|
||||
"assets": Array [
|
||||
"apps/ng-app1/src/favicon.ico",
|
||||
"apps/ng-app1/src/assets",
|
||||
],
|
||||
"index": "apps/ng-app1/src/index.html",
|
||||
"inlineStyleLanguage": "scss",
|
||||
"main": "apps/ng-app1/src/main.ts",
|
||||
"polyfills": "apps/ng-app1/src/polyfills.ts",
|
||||
"scripts": Array [],
|
||||
"styles": Array [
|
||||
"apps/ng-app1/src/styles.scss",
|
||||
],
|
||||
},
|
||||
},
|
||||
},
|
||||
"projectType": "application",
|
||||
"root": "",
|
||||
"sourceRoot": "src",
|
||||
},
|
||||
"ng-app2": Object {
|
||||
"architect": Object {
|
||||
"build": Object {
|
||||
"builder": "@nrwl/angular:delegate-build",
|
||||
"configurations": Object {
|
||||
"development": Object {
|
||||
"buildTarget": "ng-app:customBuild:development",
|
||||
},
|
||||
"production": Object {
|
||||
"buildTarget": "ng-app:customBuild:production",
|
||||
},
|
||||
},
|
||||
"defaultConfiguration": "production",
|
||||
"options": Object {
|
||||
"outputPath": "dist/apps/ng-app2",
|
||||
"tsConfig": "apps/ng-app2/tsconfig.app.json",
|
||||
},
|
||||
},
|
||||
"customBuild": Object {
|
||||
"builder": "@angular-devkit/build-angular:browser",
|
||||
"configurations": Object {
|
||||
"development": Object {
|
||||
"buildOptimizer": false,
|
||||
"extractLicenses": false,
|
||||
"namedChunks": true,
|
||||
"optimization": false,
|
||||
"sourceMap": true,
|
||||
"vendorChunk": true,
|
||||
},
|
||||
"production": Object {
|
||||
"additionalProperty": "bar",
|
||||
"budgets": Array [
|
||||
Object {
|
||||
"maximumError": "1mb",
|
||||
"maximumWarning": "500kb",
|
||||
"type": "initial",
|
||||
},
|
||||
Object {
|
||||
"maximumError": "4kb",
|
||||
"maximumWarning": "2kb",
|
||||
"type": "anyComponentStyle",
|
||||
},
|
||||
],
|
||||
"fileReplacements": Array [
|
||||
Object {
|
||||
"replace": "apps/ng-app2/src/environments/environment.ts",
|
||||
"with": "apps/ng-app2/src/environments/environment.prod.ts",
|
||||
},
|
||||
],
|
||||
"outputHashing": "all",
|
||||
},
|
||||
},
|
||||
"options": Object {
|
||||
"additionalProperty": "foo",
|
||||
"assets": Array [
|
||||
"apps/ng-app2/src/favicon.ico",
|
||||
"apps/ng-app2/src/assets",
|
||||
],
|
||||
"index": "apps/ng-app2/src/index.html",
|
||||
"inlineStyleLanguage": "scss",
|
||||
"main": "apps/ng-app2/src/main.ts",
|
||||
"polyfills": "apps/ng-app2/src/polyfills.ts",
|
||||
"scripts": Array [],
|
||||
"styles": Array [
|
||||
"apps/ng-app2/src/styles.scss",
|
||||
],
|
||||
},
|
||||
},
|
||||
},
|
||||
"projectType": "application",
|
||||
"root": "",
|
||||
"sourceRoot": "src",
|
||||
},
|
||||
"ng-app3": Object {
|
||||
"architect": Object {
|
||||
"build": Object {
|
||||
"builder": "@nrwl/angular:webpack-browser",
|
||||
"configurations": Object {
|
||||
"development": Object {
|
||||
"buildOptimizer": false,
|
||||
"extractLicenses": false,
|
||||
"namedChunks": true,
|
||||
"optimization": false,
|
||||
"sourceMap": true,
|
||||
"vendorChunk": true,
|
||||
},
|
||||
"production": Object {
|
||||
"budgets": Array [
|
||||
Object {
|
||||
"maximumError": "1mb",
|
||||
"maximumWarning": "500kb",
|
||||
"type": "initial",
|
||||
},
|
||||
Object {
|
||||
"maximumError": "4kb",
|
||||
"maximumWarning": "2kb",
|
||||
"type": "anyComponentStyle",
|
||||
},
|
||||
],
|
||||
"fileReplacements": Array [
|
||||
Object {
|
||||
"replace": "apps/ng-app3/src/environments/environment.ts",
|
||||
"with": "apps/ng-app3/src/environments/environment.prod.ts",
|
||||
},
|
||||
],
|
||||
"outputHashing": "all",
|
||||
},
|
||||
},
|
||||
"defaultConfiguration": "production",
|
||||
"options": Object {
|
||||
"assets": Array [
|
||||
"apps/ng-app3/src/favicon.ico",
|
||||
"apps/ng-app3/src/assets",
|
||||
],
|
||||
"index": "apps/ng-app3/src/index.html",
|
||||
"inlineStyleLanguage": "scss",
|
||||
"main": "apps/ng-app3/src/main.ts",
|
||||
"outputPath": "dist/apps/ng-app3",
|
||||
"polyfills": "apps/ng-app3/src/polyfills.ts",
|
||||
"scripts": Array [],
|
||||
"styles": Array [
|
||||
"apps/ng-app3/src/styles.scss",
|
||||
],
|
||||
"tsConfig": "apps/ng-app3/tsconfig.app.json",
|
||||
},
|
||||
},
|
||||
},
|
||||
"projectType": "application",
|
||||
"root": "",
|
||||
"sourceRoot": "src",
|
||||
},
|
||||
},
|
||||
"version": 1,
|
||||
}
|
||||
`;
|
||||
@ -1,75 +0,0 @@
|
||||
// Jest Snapshot v1, https://goo.gl/fbAQLP
|
||||
|
||||
exports[`12.3.1 - updateAngularEslintRules should add @angular-eslint/template/eqeqeq if @angular-eslint/template/no-negated-async is there 1`] = `
|
||||
"{
|
||||
\\"rules\\": {
|
||||
\\"existing-rule\\": \\"error\\",
|
||||
\\"@angular-eslint/template/no-negated-async\\": \\"error\\",
|
||||
\\"@angular-eslint/template/accessibility-label-has-associated-control\\": \\"error\\",
|
||||
\\"@angular-eslint/template/eqeqeq\\": \\"error\\"
|
||||
},
|
||||
\\"overrides\\": [
|
||||
{
|
||||
\\"files\\": \\"**/*.ts\\",
|
||||
\\"rules\\": {
|
||||
\\"existing-rule\\": \\"error\\",
|
||||
\\"@angular-eslint/template/no-negated-async\\": \\"error\\",
|
||||
\\"@angular-eslint/template/accessibility-label-has-associated-control\\": \\"error\\",
|
||||
\\"@angular-eslint/template/eqeqeq\\": \\"error\\"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
"
|
||||
`;
|
||||
|
||||
exports[`12.3.1 - updateAngularEslintRules should migrate @angular-eslint/template/accessibility-label-for => @angular-eslint/template/accessibility-label-has-associated-control 1`] = `
|
||||
"{
|
||||
\\"rules\\": {
|
||||
\\"existing-rule\\": \\"error\\",
|
||||
\\"@angular-eslint/template/accessibility-label-has-associated-control\\": \\"error\\"
|
||||
},
|
||||
\\"overrides\\": [
|
||||
{
|
||||
\\"files\\": \\"**/*.ts\\",
|
||||
\\"rules\\": {
|
||||
\\"existing-rule\\": \\"error\\",
|
||||
\\"@angular-eslint/template/accessibility-label-has-associated-control\\": \\"error\\"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
"
|
||||
`;
|
||||
|
||||
exports[`12.3.1 - updateAngularEslintRules should migrate to new @angular-eslint/template/accessibility-label-has-associated-control label-components config 1`] = `
|
||||
"{
|
||||
\\"rules\\": {
|
||||
\\"existing-rule\\": \\"error\\",
|
||||
\\"@angular-eslint/template/accessibility-label-has-associated-control\\": \\"error\\"
|
||||
},
|
||||
\\"overrides\\": [
|
||||
{
|
||||
\\"files\\": \\"**/*.ts\\",
|
||||
\\"rules\\": {
|
||||
\\"existing-rule\\": \\"error\\",
|
||||
\\"@angular-eslint/template/accessibility-label-has-associated-control\\": [
|
||||
\\"error\\",
|
||||
{
|
||||
\\"controlComponents\\": \\"control-component\\",
|
||||
\\"labelComponents\\": [
|
||||
{
|
||||
\\"inputs\\": [
|
||||
\\"label-attr\\"
|
||||
],
|
||||
\\"selector\\": \\"label-component\\"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
"
|
||||
`;
|
||||
@ -1,213 +0,0 @@
|
||||
import { addProjectConfiguration, readJson, Tree } from '@nrwl/devkit';
|
||||
import { createTreeWithEmptyV1Workspace } from '@nrwl/devkit/testing';
|
||||
import convertWebpackBrowserBuildTargetToDelegateBuild from './convert-webpack-browser-build-target-to-delegate-build';
|
||||
|
||||
function getWsConfig(tree: Tree) {
|
||||
return readJson(tree, 'workspace.json');
|
||||
}
|
||||
|
||||
describe('convertWebpackBrowserBuildTargetToDelegateBuild', () => {
|
||||
let tree: Tree;
|
||||
|
||||
beforeEach(async () => {
|
||||
tree = createTreeWithEmptyV1Workspace();
|
||||
|
||||
addProjectConfiguration(tree, 'ng-app1', {
|
||||
root: '',
|
||||
sourceRoot: 'src',
|
||||
projectType: 'application',
|
||||
targets: {
|
||||
customBuild: {
|
||||
executor: '@angular-devkit/build-angular:browser',
|
||||
},
|
||||
build: {
|
||||
executor: '@nrwl/angular:webpack-browser',
|
||||
options: {
|
||||
buildTarget: 'ng-app:customBuild',
|
||||
outputPath: 'dist/apps/ng-app1',
|
||||
tsConfig: 'apps/ng-app1/tsconfig.app.json',
|
||||
index: 'apps/ng-app1/src/index.html',
|
||||
main: 'apps/ng-app1/src/main.ts',
|
||||
polyfills: 'apps/ng-app1/src/polyfills.ts',
|
||||
inlineStyleLanguage: 'scss',
|
||||
assets: ['apps/ng-app1/src/favicon.ico', 'apps/ng-app1/src/assets'],
|
||||
styles: ['apps/ng-app1/src/styles.scss'],
|
||||
scripts: [],
|
||||
},
|
||||
configurations: {
|
||||
production: {
|
||||
budgets: [
|
||||
{
|
||||
type: 'initial',
|
||||
maximumWarning: '500kb',
|
||||
maximumError: '1mb',
|
||||
},
|
||||
{
|
||||
type: 'anyComponentStyle',
|
||||
maximumWarning: '2kb',
|
||||
maximumError: '4kb',
|
||||
},
|
||||
],
|
||||
fileReplacements: [
|
||||
{
|
||||
replace: 'apps/ng-app1/src/environments/environment.ts',
|
||||
with: 'apps/ng-app1/src/environments/environment.prod.ts',
|
||||
},
|
||||
],
|
||||
outputHashing: 'all',
|
||||
},
|
||||
development: {
|
||||
buildOptimizer: false,
|
||||
optimization: false,
|
||||
vendorChunk: true,
|
||||
extractLicenses: false,
|
||||
sourceMap: true,
|
||||
namedChunks: true,
|
||||
},
|
||||
},
|
||||
defaultConfiguration: 'production',
|
||||
},
|
||||
},
|
||||
});
|
||||
|
||||
addProjectConfiguration(tree, 'ng-app2', {
|
||||
root: '',
|
||||
sourceRoot: 'src',
|
||||
projectType: 'application',
|
||||
targets: {
|
||||
customBuild: {
|
||||
executor: '@angular-devkit/build-angular:browser',
|
||||
options: {
|
||||
outputPath: 'dist/apps/ng-app2',
|
||||
tsConfig: 'apps/ng-app2/tsconfig.app.json',
|
||||
index: 'apps/ng-app2/src/index.html',
|
||||
main: 'apps/ng-app2/src/different-main.ts',
|
||||
additionalProperty: 'foo',
|
||||
},
|
||||
configurations: {
|
||||
development: {
|
||||
buildOptimizer: true,
|
||||
},
|
||||
production: {
|
||||
additionalProperty: 'bar',
|
||||
fileReplacements: [
|
||||
{
|
||||
replace: 'apps/ng-app2/src/environments/environment.ts',
|
||||
with: 'apps/ng-app2/src/environments/environment.other.ts',
|
||||
},
|
||||
],
|
||||
},
|
||||
},
|
||||
},
|
||||
build: {
|
||||
executor: '@nrwl/angular:webpack-browser',
|
||||
options: {
|
||||
outputPath: 'dist/apps/ng-app2',
|
||||
tsConfig: 'apps/ng-app2/tsconfig.app.json',
|
||||
index: 'apps/ng-app2/src/index.html',
|
||||
main: 'apps/ng-app2/src/main.ts',
|
||||
polyfills: 'apps/ng-app2/src/polyfills.ts',
|
||||
inlineStyleLanguage: 'scss',
|
||||
assets: ['apps/ng-app2/src/favicon.ico', 'apps/ng-app2/src/assets'],
|
||||
styles: ['apps/ng-app2/src/styles.scss'],
|
||||
scripts: [],
|
||||
},
|
||||
configurations: {
|
||||
production: {
|
||||
buildTarget: 'ng-app:customBuild:production',
|
||||
budgets: [
|
||||
{
|
||||
type: 'initial',
|
||||
maximumWarning: '500kb',
|
||||
maximumError: '1mb',
|
||||
},
|
||||
{
|
||||
type: 'anyComponentStyle',
|
||||
maximumWarning: '2kb',
|
||||
maximumError: '4kb',
|
||||
},
|
||||
],
|
||||
fileReplacements: [
|
||||
{
|
||||
replace: 'apps/ng-app2/src/environments/environment.ts',
|
||||
with: 'apps/ng-app2/src/environments/environment.prod.ts',
|
||||
},
|
||||
],
|
||||
outputHashing: 'all',
|
||||
},
|
||||
development: {
|
||||
buildTarget: 'ng-app:customBuild:development',
|
||||
buildOptimizer: false,
|
||||
optimization: false,
|
||||
vendorChunk: true,
|
||||
extractLicenses: false,
|
||||
sourceMap: true,
|
||||
namedChunks: true,
|
||||
},
|
||||
},
|
||||
defaultConfiguration: 'production',
|
||||
},
|
||||
},
|
||||
});
|
||||
|
||||
addProjectConfiguration(tree, 'ng-app3', {
|
||||
root: '',
|
||||
sourceRoot: 'src',
|
||||
projectType: 'application',
|
||||
targets: {
|
||||
build: {
|
||||
executor: '@nrwl/angular:webpack-browser',
|
||||
options: {
|
||||
outputPath: 'dist/apps/ng-app3',
|
||||
tsConfig: 'apps/ng-app3/tsconfig.app.json',
|
||||
index: 'apps/ng-app3/src/index.html',
|
||||
main: 'apps/ng-app3/src/main.ts',
|
||||
polyfills: 'apps/ng-app3/src/polyfills.ts',
|
||||
inlineStyleLanguage: 'scss',
|
||||
assets: ['apps/ng-app3/src/favicon.ico', 'apps/ng-app3/src/assets'],
|
||||
styles: ['apps/ng-app3/src/styles.scss'],
|
||||
scripts: [],
|
||||
},
|
||||
configurations: {
|
||||
production: {
|
||||
budgets: [
|
||||
{
|
||||
type: 'initial',
|
||||
maximumWarning: '500kb',
|
||||
maximumError: '1mb',
|
||||
},
|
||||
{
|
||||
type: 'anyComponentStyle',
|
||||
maximumWarning: '2kb',
|
||||
maximumError: '4kb',
|
||||
},
|
||||
],
|
||||
fileReplacements: [
|
||||
{
|
||||
replace: 'apps/ng-app3/src/environments/environment.ts',
|
||||
with: 'apps/ng-app3/src/environments/environment.prod.ts',
|
||||
},
|
||||
],
|
||||
outputHashing: 'all',
|
||||
},
|
||||
development: {
|
||||
buildOptimizer: false,
|
||||
optimization: false,
|
||||
vendorChunk: true,
|
||||
extractLicenses: false,
|
||||
sourceMap: true,
|
||||
namedChunks: true,
|
||||
},
|
||||
},
|
||||
defaultConfiguration: 'production',
|
||||
},
|
||||
},
|
||||
});
|
||||
});
|
||||
|
||||
it('should update the configuration correctly', async () => {
|
||||
await convertWebpackBrowserBuildTargetToDelegateBuild(tree);
|
||||
|
||||
expect(getWsConfig(tree)).toMatchSnapshot();
|
||||
});
|
||||
});
|
||||
@ -1,172 +0,0 @@
|
||||
import {
|
||||
createProjectGraphAsync,
|
||||
formatFiles,
|
||||
getProjects,
|
||||
parseTargetString,
|
||||
ProjectConfiguration,
|
||||
Target,
|
||||
TargetConfiguration,
|
||||
targetToTargetString,
|
||||
Tree,
|
||||
updateProjectConfiguration,
|
||||
} from '@nrwl/devkit';
|
||||
|
||||
export default async function convertWebpackBrowserBuildTargetToDelegateBuild(
|
||||
host: Tree
|
||||
) {
|
||||
const projects = getProjects(host);
|
||||
|
||||
for (const [projectName, project] of projects) {
|
||||
const webpackBrowserTargets = Object.values(project.targets || {}).filter(
|
||||
(target) => target.executor === '@nrwl/angular:webpack-browser'
|
||||
);
|
||||
for (const target of webpackBrowserTargets) {
|
||||
const configurationOptions = getTargetConfigurationOptions(target);
|
||||
const buildTargetName = await getBuildTargetNameFromOptions(
|
||||
target.options,
|
||||
configurationOptions
|
||||
);
|
||||
if (buildTargetName) {
|
||||
target.executor = '@nrwl/angular:delegate-build';
|
||||
updateTargetsOptions(project, target, buildTargetName);
|
||||
await updateTargetsConfigurations(
|
||||
project,
|
||||
projectName,
|
||||
target,
|
||||
buildTargetName,
|
||||
configurationOptions
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
updateProjectConfiguration(host, projectName, project);
|
||||
}
|
||||
|
||||
await formatFiles(host);
|
||||
}
|
||||
|
||||
function cleanupBuildTargetProperties(options: {
|
||||
tsConfig: string;
|
||||
outputPath: string;
|
||||
}): void {
|
||||
delete options.tsConfig;
|
||||
delete options.outputPath;
|
||||
}
|
||||
|
||||
async function extractConfigurationBuildTarget(
|
||||
project: string,
|
||||
target: string,
|
||||
configuration: string,
|
||||
buildTarget: string
|
||||
): Promise<Target> {
|
||||
if (buildTarget) {
|
||||
const buildTargetObj = parseTargetString(
|
||||
buildTarget,
|
||||
await createProjectGraphAsync()
|
||||
);
|
||||
return {
|
||||
...buildTargetObj,
|
||||
configuration: buildTargetObj.configuration ?? configuration,
|
||||
};
|
||||
}
|
||||
|
||||
return {
|
||||
project: project,
|
||||
target: target,
|
||||
configuration: configuration,
|
||||
};
|
||||
}
|
||||
|
||||
async function getBuildTargetNameFromOptions(
|
||||
baseOptions: any,
|
||||
configurationOptions: Map<string, any>
|
||||
): Promise<string> {
|
||||
const pg = await createProjectGraphAsync();
|
||||
if (baseOptions.buildTarget) {
|
||||
return parseTargetString(baseOptions.buildTarget, pg).target;
|
||||
}
|
||||
for (const [, options] of configurationOptions) {
|
||||
if (options.buildTarget) {
|
||||
return parseTargetString(options.buildTarget, pg).target;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function getTargetConfigurationOptions(
|
||||
target: TargetConfiguration
|
||||
): Map<string, any> {
|
||||
const targets = new Map<string, any>();
|
||||
if (target.configurations) {
|
||||
for (const [name, options] of Object.entries(target.configurations)) {
|
||||
if (options !== undefined) {
|
||||
targets.set(name, options);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return targets;
|
||||
}
|
||||
|
||||
async function updateTargetsConfigurations(
|
||||
project: ProjectConfiguration,
|
||||
projectName: string,
|
||||
target: TargetConfiguration,
|
||||
buildTargetName: string,
|
||||
configurationOptions: any
|
||||
) {
|
||||
for (const [configurationName, options] of configurationOptions) {
|
||||
const { buildTarget, tsConfig, outputPath, ...delegateTargetOptions } =
|
||||
options;
|
||||
|
||||
const configurationBuildTarget = await extractConfigurationBuildTarget(
|
||||
projectName,
|
||||
buildTargetName,
|
||||
configurationName,
|
||||
buildTarget
|
||||
);
|
||||
if (!project.targets[buildTargetName].configurations) {
|
||||
project.targets[buildTargetName].configurations = {};
|
||||
}
|
||||
// Update build target configuration options by overwriting them
|
||||
const buildTargetConfigurations =
|
||||
project.targets[buildTargetName].configurations;
|
||||
buildTargetConfigurations[configurationBuildTarget.configuration] = {
|
||||
...buildTargetConfigurations[configurationBuildTarget.configuration],
|
||||
...delegateTargetOptions,
|
||||
};
|
||||
// Delete options already present in the source target
|
||||
cleanupBuildTargetProperties(
|
||||
buildTargetConfigurations[configurationBuildTarget.configuration]
|
||||
);
|
||||
// Update source target configuration with buildTarget
|
||||
target.configurations[configurationName] = {
|
||||
buildTarget: targetToTargetString(configurationBuildTarget),
|
||||
tsConfig,
|
||||
outputPath,
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
function updateTargetsOptions(
|
||||
project: ProjectConfiguration,
|
||||
target: TargetConfiguration,
|
||||
buildTargetName: string
|
||||
) {
|
||||
if (target.options) {
|
||||
const { buildTarget, tsConfig, outputPath, ...delegateTargetOptions } =
|
||||
target.options;
|
||||
// Update build target options by overwriting them
|
||||
project.targets[buildTargetName].options = {
|
||||
...project.targets[buildTargetName].options,
|
||||
...delegateTargetOptions,
|
||||
};
|
||||
// Delete options already present in the source target
|
||||
cleanupBuildTargetProperties(project.targets[buildTargetName].options);
|
||||
// Update source target options to only contain what it needs
|
||||
target.options = {
|
||||
buildTarget,
|
||||
tsConfig,
|
||||
outputPath,
|
||||
};
|
||||
}
|
||||
}
|
||||
@ -1,66 +0,0 @@
|
||||
import { Tree, writeJson, readJson } from '@nrwl/devkit';
|
||||
import updateAngularEslintRules from './update-angular-eslint-rules';
|
||||
import { createTree } from '@nrwl/devkit/testing';
|
||||
import type { Linter } from 'eslint';
|
||||
|
||||
describe('12.3.1 - updateAngularEslintRules', () => {
|
||||
let tree: Tree;
|
||||
let eslintConfig: Linter.Config;
|
||||
|
||||
beforeEach(() => {
|
||||
tree = createTree();
|
||||
eslintConfig = {
|
||||
rules: {
|
||||
'existing-rule': 'error',
|
||||
'@angular-eslint/template/accessibility-label-for': 'error',
|
||||
},
|
||||
overrides: [
|
||||
{
|
||||
files: '**/*.ts',
|
||||
rules: {
|
||||
'existing-rule': 'error',
|
||||
'@angular-eslint/template/accessibility-label-for': 'error',
|
||||
},
|
||||
},
|
||||
],
|
||||
};
|
||||
});
|
||||
|
||||
it('should migrate @angular-eslint/template/accessibility-label-for => @angular-eslint/template/accessibility-label-has-associated-control', async () => {
|
||||
writeJson(tree, '.eslintrc.json', eslintConfig);
|
||||
|
||||
await updateAngularEslintRules(tree);
|
||||
const updatedEslint = tree.read('.eslintrc.json').toString();
|
||||
expect(updatedEslint).toMatchSnapshot();
|
||||
});
|
||||
|
||||
it('should migrate to new @angular-eslint/template/accessibility-label-has-associated-control label-components config', async () => {
|
||||
eslintConfig.overrides[0].rules[
|
||||
'@angular-eslint/template/accessibility-label-for'
|
||||
] = [
|
||||
'error',
|
||||
{
|
||||
controlComponents: 'control-component',
|
||||
labelComponents: ['label-component'],
|
||||
labelAttributes: ['label-attr'],
|
||||
},
|
||||
];
|
||||
writeJson(tree, '.eslintrc.json', eslintConfig);
|
||||
|
||||
await updateAngularEslintRules(tree);
|
||||
const updatedEslint = tree.read('.eslintrc.json').toString();
|
||||
expect(updatedEslint).toMatchSnapshot();
|
||||
});
|
||||
|
||||
it('should add @angular-eslint/template/eqeqeq if @angular-eslint/template/no-negated-async is there', async () => {
|
||||
eslintConfig.rules['@angular-eslint/template/no-negated-async'] = 'error';
|
||||
eslintConfig.overrides[0].rules[
|
||||
'@angular-eslint/template/no-negated-async'
|
||||
] = 'error';
|
||||
writeJson(tree, '.eslintrc.json', eslintConfig);
|
||||
|
||||
await updateAngularEslintRules(tree);
|
||||
const updatedEslint = tree.read('.eslintrc.json').toString();
|
||||
expect(updatedEslint).toMatchSnapshot();
|
||||
});
|
||||
});
|
||||
@ -1,74 +0,0 @@
|
||||
// This migration is mostly copied from https://github.com/angular-eslint/angular-eslint/blob/3c5a9d43264c9cbdd8fe8f2ebb19c613396386c2/packages/schematics/src/migrations/update-12-0-0/update-12-0-0.ts
|
||||
|
||||
import {
|
||||
formatFiles,
|
||||
Tree,
|
||||
updateJson,
|
||||
visitNotIgnoredFiles,
|
||||
} from '@nrwl/devkit';
|
||||
import { basename } from 'path';
|
||||
import type { Linter } from 'eslint';
|
||||
|
||||
export default async function (tree: Tree) {
|
||||
visitNotIgnoredFiles(tree, '', (file) => {
|
||||
if (basename(file) !== '.eslintrc.json') {
|
||||
return;
|
||||
}
|
||||
|
||||
updateJson(tree, file, (eslintJson: Linter.Config) => {
|
||||
migrateAngularEsLintRules(eslintJson);
|
||||
return eslintJson;
|
||||
});
|
||||
});
|
||||
await formatFiles(tree);
|
||||
}
|
||||
|
||||
function migrateAngularEsLintRules({ overrides, rules }: Linter.Config) {
|
||||
migrateToAccessibilityLabelHasAssociatedControlSchema(
|
||||
rules?.['@angular-eslint/template/accessibility-label-for']
|
||||
);
|
||||
migrateToAccessibilityLabelHasAssociatedControlName(rules);
|
||||
addEqeqeqIfNeeded(rules);
|
||||
for (const o of overrides ?? []) {
|
||||
migrateToAccessibilityLabelHasAssociatedControlSchema(
|
||||
o.rules?.['@angular-eslint/template/accessibility-label-for']
|
||||
);
|
||||
migrateToAccessibilityLabelHasAssociatedControlName(o.rules);
|
||||
addEqeqeqIfNeeded(o.rules);
|
||||
}
|
||||
}
|
||||
|
||||
function migrateToAccessibilityLabelHasAssociatedControlName(
|
||||
rules: Partial<Linter.RulesRecord> | undefined
|
||||
) {
|
||||
if (!rules) return;
|
||||
const accessibilityLabelForRule =
|
||||
rules['@angular-eslint/template/accessibility-label-for'];
|
||||
delete rules['@angular-eslint/template/accessibility-label-for'];
|
||||
rules['@angular-eslint/template/accessibility-label-has-associated-control'] =
|
||||
accessibilityLabelForRule;
|
||||
}
|
||||
|
||||
function migrateToAccessibilityLabelHasAssociatedControlSchema(
|
||||
rule: Linter.RuleEntry | undefined
|
||||
) {
|
||||
if (!Array.isArray(rule) || rule.length !== 2) return;
|
||||
const [, currentSchema] = rule;
|
||||
rule[1] = {
|
||||
controlComponents: currentSchema.controlComponents,
|
||||
labelComponents: currentSchema.labelComponents.map((selector: string) => {
|
||||
return { inputs: currentSchema.labelAttributes, selector };
|
||||
}),
|
||||
};
|
||||
}
|
||||
function addEqeqeqIfNeeded(rules: Partial<Linter.RulesRecord> | undefined) {
|
||||
if (
|
||||
!rules ||
|
||||
!rules['@angular-eslint/template/no-negated-async'] ||
|
||||
rules['@angular-eslint/template/eqeqeq']
|
||||
) {
|
||||
return;
|
||||
}
|
||||
|
||||
rules['@angular-eslint/template/eqeqeq'] = 'error';
|
||||
}
|
||||
@ -1,78 +0,0 @@
|
||||
import {
|
||||
addDependenciesToPackageJson,
|
||||
formatFiles,
|
||||
logger,
|
||||
stripIndents,
|
||||
Tree,
|
||||
} from '@nrwl/devkit';
|
||||
import { lt } from 'semver';
|
||||
import { join } from 'path';
|
||||
import { forEachExecutorOptions } from '@nrwl/workspace/src/utilities/executor-options-utils';
|
||||
|
||||
export default async function (tree: Tree) {
|
||||
let storybookVersion;
|
||||
|
||||
try {
|
||||
storybookVersion = require('@storybook/core/package.json').version;
|
||||
} catch {}
|
||||
|
||||
if (!storybookVersion) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (lt(storybookVersion, '6.2.0')) {
|
||||
logger.error(stripIndents`NX Could not migrate to Angular 12
|
||||
Angular 12 uses Webpack 5.
|
||||
This workspace uses Storybook ${storybookVersion} which does not support Webpack 5.
|
||||
Storybook 6.2+ is required to support Webpack 5.
|
||||
See our documentation on migrating to Storybook 6:
|
||||
https://nx.dev/storybook/overview-angular#upgrading-to-storybook-6-using-the-nx-migration-generator
|
||||
`);
|
||||
throw new Error('Could not migrate to Angular 12');
|
||||
}
|
||||
|
||||
let updated;
|
||||
forEachExecutorOptions(tree, '@nrwl/storybook:storybook', (options) => {
|
||||
if (options['uiFramework'] !== '@storybook/angular') {
|
||||
return;
|
||||
}
|
||||
|
||||
const configFolder = options?.['config']?.configFolder;
|
||||
|
||||
if (!configFolder) {
|
||||
return;
|
||||
}
|
||||
|
||||
const configPath = join(configFolder, 'main.js');
|
||||
|
||||
if (!tree.exists(configPath)) {
|
||||
logger.warn(
|
||||
`Could not migrate ${configPath} to use webpack 5. The config.core.builder should be set to "webpack5". See https://gist.github.com/shilman/8856ea1786dcd247139b47b270912324#upgrade`
|
||||
);
|
||||
return;
|
||||
}
|
||||
|
||||
updated = true;
|
||||
const originalContents = tree.read(configPath).toString();
|
||||
const configureWebpack5 = `module.exports.core = { ...module.exports.core, builder: 'webpack5' };`;
|
||||
try {
|
||||
const config = require(join(tree.root, configPath));
|
||||
if (config?.core?.builder !== 'webpack5') {
|
||||
tree.write(configPath, originalContents + '\n' + configureWebpack5);
|
||||
}
|
||||
} catch {}
|
||||
});
|
||||
|
||||
const installTask = updated
|
||||
? addDependenciesToPackageJson(
|
||||
tree,
|
||||
{},
|
||||
{
|
||||
'@storybook/builder-webpack5': storybookVersion,
|
||||
}
|
||||
)
|
||||
: () => {};
|
||||
await formatFiles(tree);
|
||||
|
||||
return installTask;
|
||||
}
|
||||
@ -1,90 +0,0 @@
|
||||
import { addProjectConfiguration, readJson, Tree } from '@nrwl/devkit';
|
||||
import { createTreeWithEmptyV1Workspace } from '@nrwl/devkit/testing';
|
||||
import updateAngularConfig from './update-webpack-browser-config';
|
||||
|
||||
function getBuildTarget(tree: Tree) {
|
||||
return readJson(tree, 'workspace.json').projects['ng-app'].architect.build;
|
||||
}
|
||||
|
||||
describe('Migration to update targets with @nrwl/angular:webpack-browser executor', () => {
|
||||
let tree: Tree;
|
||||
|
||||
beforeEach(async () => {
|
||||
tree = createTreeWithEmptyV1Workspace();
|
||||
|
||||
addProjectConfiguration(tree, 'ng-app', {
|
||||
root: '',
|
||||
sourceRoot: 'src',
|
||||
projectType: 'application',
|
||||
targets: {
|
||||
build: {
|
||||
executor: '@nrwl/angular:webpack-browser',
|
||||
options: {
|
||||
aot: true,
|
||||
optimization: true,
|
||||
experimentalRollupPass: false,
|
||||
buildOptimizer: false,
|
||||
namedChunks: true,
|
||||
} as any,
|
||||
configurations: {
|
||||
one: {
|
||||
aot: true,
|
||||
},
|
||||
two: {
|
||||
experimentalRollupPass: true,
|
||||
aot: false,
|
||||
optimization: false,
|
||||
},
|
||||
} as any,
|
||||
},
|
||||
},
|
||||
});
|
||||
});
|
||||
|
||||
it(`should remove 'experimentalRollupPass'`, async () => {
|
||||
await updateAngularConfig(tree);
|
||||
const { configurations, options } = getBuildTarget(tree);
|
||||
|
||||
expect(options.experimentalRollupPass).toBeUndefined();
|
||||
expect(options.buildOptimizer).toBe(false);
|
||||
expect(configurations).toBeDefined();
|
||||
expect(configurations?.one.experimentalRollupPass).toBeUndefined();
|
||||
expect(configurations?.two.experimentalRollupPass).toBeUndefined();
|
||||
});
|
||||
|
||||
it(`should remove value from "options" section which value is now the new default`, async () => {
|
||||
await updateAngularConfig(tree);
|
||||
const { configurations, options } = getBuildTarget(tree);
|
||||
|
||||
expect(options.aot).toBeUndefined();
|
||||
expect(configurations?.one.aot).toBeUndefined();
|
||||
expect(configurations?.two.aot).toBe(false);
|
||||
});
|
||||
|
||||
it(`should remove value from "configuration" section when value is the same as that of "options"`, async () => {
|
||||
await updateAngularConfig(tree);
|
||||
const { configurations, options } = getBuildTarget(tree);
|
||||
|
||||
expect(options.aot).toBeUndefined();
|
||||
expect(configurations?.one.aot).toBeUndefined();
|
||||
expect(configurations?.two.aot).toBe(false);
|
||||
});
|
||||
|
||||
it(`should add value in "options" section when option was not defined`, async () => {
|
||||
await updateAngularConfig(tree);
|
||||
const { configurations, options } = getBuildTarget(tree);
|
||||
|
||||
expect(options.sourceMap).toBe(true);
|
||||
expect(configurations?.one.sourceMap).toBeUndefined();
|
||||
expect(configurations?.two.sourceMap).toBeUndefined();
|
||||
expect(configurations?.two.optimization).toBe(false);
|
||||
});
|
||||
|
||||
it(`should not remove value in "options" when value is not the new default`, async () => {
|
||||
await updateAngularConfig(tree);
|
||||
const { options } = getBuildTarget(tree);
|
||||
|
||||
expect(options.namedChunks).toBe(true);
|
||||
expect(options.buildOptimizer).toBe(false);
|
||||
});
|
||||
});
|
||||
@ -1,92 +0,0 @@
|
||||
import {
|
||||
formatFiles,
|
||||
getProjects,
|
||||
TargetConfiguration,
|
||||
Tree,
|
||||
updateProjectConfiguration,
|
||||
} from '@nrwl/devkit';
|
||||
|
||||
type ExecutorOptionsType = Readonly<
|
||||
[
|
||||
optionName: string,
|
||||
oldDefault: boolean | undefined,
|
||||
newDefault: boolean | undefined
|
||||
][]
|
||||
>;
|
||||
|
||||
const optionsToUpdate: ExecutorOptionsType = [
|
||||
['aot', false, true],
|
||||
['vendorChunk', true, false],
|
||||
['extractLicenses', false, true],
|
||||
['buildOptimizer', false, true],
|
||||
['sourceMap', true, false],
|
||||
['optimization', false, true],
|
||||
['namedChunks', true, false],
|
||||
];
|
||||
|
||||
export default async function updateAngularConfig(host: Tree) {
|
||||
const projects = getProjects(host);
|
||||
|
||||
for (const [name, project] of projects) {
|
||||
for (const target of Object.values(project.targets || {})) {
|
||||
if (target.executor === '@nrwl/angular:webpack-browser') {
|
||||
updateOptions(target, optionsToUpdate);
|
||||
|
||||
for (const options of allTargetOptions(target)) {
|
||||
delete options.experimentalRollupPass;
|
||||
delete options.lazyModules;
|
||||
delete options.forkTypeChecker;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
updateProjectConfiguration(host, name, project);
|
||||
}
|
||||
|
||||
await formatFiles(host);
|
||||
}
|
||||
|
||||
function* allTargetOptions(target: TargetConfiguration): IterableIterator<any> {
|
||||
if (target.options) {
|
||||
yield target.options;
|
||||
}
|
||||
|
||||
if (!target.configurations) {
|
||||
return;
|
||||
}
|
||||
|
||||
for (const [, options] of Object.entries(target.configurations)) {
|
||||
if (options !== undefined) {
|
||||
yield options;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function updateOptions(
|
||||
target: TargetConfiguration,
|
||||
options: typeof optionsToUpdate
|
||||
): void {
|
||||
if (!target.options) {
|
||||
target.options = {};
|
||||
}
|
||||
|
||||
const configurationOptions =
|
||||
target.configurations && Object.values(target.configurations);
|
||||
|
||||
for (const [optionName, oldDefault, newDefault] of options) {
|
||||
let value = target.options[optionName];
|
||||
if (value === newDefault) {
|
||||
// Value is same as new default
|
||||
delete target.options[optionName];
|
||||
} else if (value === undefined) {
|
||||
// Value is not defined, hence the default in the executor was used.
|
||||
target.options[optionName] = oldDefault;
|
||||
value = oldDefault;
|
||||
}
|
||||
|
||||
// Remove overrides in configurations which are no longer needed.
|
||||
configurationOptions
|
||||
?.filter((o) => o && o[optionName] === value)
|
||||
.forEach((o) => o && delete o[optionName]);
|
||||
}
|
||||
}
|
||||
@ -1,112 +0,0 @@
|
||||
import type { Tree } from '@nrwl/devkit';
|
||||
import { updateJson, joinPathFragments, readJson } from '@nrwl/devkit';
|
||||
import { createTreeWithEmptyV1Workspace } from '@nrwl/devkit/testing';
|
||||
|
||||
import libGenerator from '../../generators/library/library';
|
||||
import updateInvalidImportPaths from './update-invalid-import-paths';
|
||||
|
||||
describe('Migration to fix invalid import paths in affected workspaces', () => {
|
||||
let tree: Tree;
|
||||
|
||||
beforeEach(async () => {
|
||||
tree = createTreeWithEmptyV1Workspace();
|
||||
|
||||
// set up some libs
|
||||
|
||||
await libGenerator(tree, {
|
||||
name: 'buildable1',
|
||||
buildable: true,
|
||||
directory: 'dir1',
|
||||
});
|
||||
|
||||
await libGenerator(tree, {
|
||||
name: 'buildable2',
|
||||
buildable: true,
|
||||
directory: 'dir1',
|
||||
});
|
||||
|
||||
await libGenerator(tree, {
|
||||
name: 'publishable1',
|
||||
publishable: true,
|
||||
directory: 'dir1',
|
||||
importPath: '@proj/publishable1',
|
||||
});
|
||||
|
||||
await libGenerator(tree, {
|
||||
name: 'publishable2',
|
||||
publishable: true,
|
||||
directory: 'dir1',
|
||||
importPath: '@proj/publishable2',
|
||||
});
|
||||
|
||||
// break one of each kind
|
||||
updateJson(
|
||||
tree,
|
||||
joinPathFragments('libs/dir1/buildable1', 'package.json'),
|
||||
(pkgJson) => {
|
||||
pkgJson.name = '@proj/dir1-buildable1';
|
||||
return pkgJson;
|
||||
}
|
||||
);
|
||||
|
||||
updateJson(tree, 'tsconfig.base.json', (tsconfig) => {
|
||||
const srcPath = tsconfig['@proj/publishable2'];
|
||||
tsconfig['@proj/publishable2'] = undefined;
|
||||
|
||||
tsconfig['@proj/dir1/publishable2'] = srcPath;
|
||||
|
||||
return tsconfig;
|
||||
});
|
||||
});
|
||||
|
||||
it('should fix the invalid libraries', async () => {
|
||||
// ACT
|
||||
await updateInvalidImportPaths(tree);
|
||||
|
||||
// ASSERT
|
||||
const fixedBuildable = readJson(
|
||||
tree,
|
||||
joinPathFragments('libs/dir1/buildable1', 'package.json')
|
||||
);
|
||||
|
||||
const { compilerOptions } = readJson<{
|
||||
compilerOptions: { paths: Record<string, string[]> };
|
||||
}>(tree, 'tsconfig.base.json');
|
||||
const { paths: tsConfigPaths } = compilerOptions;
|
||||
const fixedPublishable = Boolean(tsConfigPaths['@proj/publishable2']);
|
||||
const brokenPublishableShouldntExist = !Boolean(
|
||||
tsConfigPaths['@proj/publishable2']
|
||||
);
|
||||
|
||||
expect(fixedBuildable.name).toEqual('@proj/dir1/buildable1');
|
||||
expect(fixedPublishable).toBeTruthy();
|
||||
expect(brokenPublishableShouldntExist).toBeFalsy();
|
||||
});
|
||||
|
||||
it('should fix the invalid libraries when base tsconfig is not tsconfig.base.json', async () => {
|
||||
// ARRANGE
|
||||
tree.rename('tsconfig.base.json', 'tsconfig.json');
|
||||
|
||||
// ACT
|
||||
await updateInvalidImportPaths(tree);
|
||||
|
||||
// ASSERT
|
||||
const fixedBuildable = readJson(
|
||||
tree,
|
||||
joinPathFragments('libs/dir1/buildable1', 'package.json')
|
||||
);
|
||||
|
||||
const { compilerOptions } = readJson<{
|
||||
compilerOptions: { paths: Record<string, string[]> };
|
||||
}>(tree, 'tsconfig.json');
|
||||
const { paths: tsConfigPaths } = compilerOptions;
|
||||
const fixedPublishable = Boolean(tsConfigPaths['@proj/publishable2']);
|
||||
const brokenPublishableShouldntExist = !Boolean(
|
||||
tsConfigPaths['@proj/publishable2']
|
||||
);
|
||||
|
||||
expect(fixedBuildable.name).toEqual('@proj/dir1/buildable1');
|
||||
expect(fixedPublishable).toBeTruthy();
|
||||
expect(brokenPublishableShouldntExist).toBeFalsy();
|
||||
});
|
||||
});
|
||||
@ -1,161 +0,0 @@
|
||||
import type { ProjectConfiguration, Tree } from '@nrwl/devkit';
|
||||
import {
|
||||
formatFiles,
|
||||
getProjects,
|
||||
readJson,
|
||||
joinPathFragments,
|
||||
updateJson,
|
||||
logger,
|
||||
} from '@nrwl/devkit';
|
||||
|
||||
type AffectedLib = ProjectConfiguration;
|
||||
type InvalidLibs = {
|
||||
buildableLibs: AffectedLib[];
|
||||
publishableLibs: AffectedLib[];
|
||||
};
|
||||
|
||||
export default async function (tree: Tree) {
|
||||
const tsconfigPath = getBaseTsConfigPath(tree);
|
||||
if (!tree.exists(tsconfigPath)) {
|
||||
logger.error(
|
||||
'Could not find `tsconfig.base.json` or `tsconfig.json` at the root of the workspace. Skipping this migration...'
|
||||
);
|
||||
return;
|
||||
}
|
||||
|
||||
const possibleAffectedLibs = findBuildableAndPublishableLibs(tree);
|
||||
const invalidLibs = findInvalidLibs(tree, possibleAffectedLibs, tsconfigPath);
|
||||
fixLibs(tree, invalidLibs, tsconfigPath);
|
||||
|
||||
await formatFiles(tree);
|
||||
}
|
||||
|
||||
export function findBuildableAndPublishableLibs(tree: Tree): InvalidLibs {
|
||||
const projects = getProjects(tree);
|
||||
const buildableLibs: AffectedLib[] = [];
|
||||
const publishableLibs: AffectedLib[] = [];
|
||||
|
||||
for (const [name, project] of projects) {
|
||||
for (const target of Object.values(project.targets || {})) {
|
||||
if (target.executor === '@nrwl/angular:package') {
|
||||
publishableLibs.push(project);
|
||||
} else if (target.executor === '@nrwl/angular:ng-packagr-lite') {
|
||||
buildableLibs.push(project);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return { buildableLibs, publishableLibs };
|
||||
}
|
||||
|
||||
export function findInvalidLibs(
|
||||
tree: Tree,
|
||||
libs: InvalidLibs,
|
||||
tsconfigPath: string
|
||||
): InvalidLibs {
|
||||
const { compilerOptions } = readJson(tree, tsconfigPath);
|
||||
const { paths: tsConfigPaths } = compilerOptions;
|
||||
|
||||
const invalidBuildableLibs = libs.buildableLibs.filter((lib) =>
|
||||
checkInvalidLib(tree, lib, tsConfigPaths)
|
||||
);
|
||||
const invalidPublishableLibs = libs.publishableLibs.filter((lib) =>
|
||||
checkInvalidLib(tree, lib, tsConfigPaths)
|
||||
);
|
||||
return {
|
||||
buildableLibs: invalidBuildableLibs,
|
||||
publishableLibs: invalidPublishableLibs,
|
||||
};
|
||||
}
|
||||
|
||||
function checkInvalidLib(
|
||||
tree: Tree,
|
||||
lib: AffectedLib,
|
||||
tsConfigPaths: Record<string, string>
|
||||
) {
|
||||
const { name } = readJson(tree, joinPathFragments(lib.root, 'package.json'));
|
||||
return !tsConfigPaths[name];
|
||||
}
|
||||
|
||||
function fixLibs(
|
||||
tree: Tree,
|
||||
{ buildableLibs, publishableLibs }: InvalidLibs,
|
||||
tsconfigFilePath: string
|
||||
) {
|
||||
const { compilerOptions } = readJson(tree, tsconfigFilePath);
|
||||
const { paths: tsConfigPaths } = compilerOptions;
|
||||
|
||||
buildableLibs.map((lib) => fixBuildableLib(tree, lib, tsConfigPaths));
|
||||
publishableLibs.map((lib) =>
|
||||
fixPublishableLib(tree, lib, tsConfigPaths, tsconfigFilePath)
|
||||
);
|
||||
}
|
||||
|
||||
function fixBuildableLib(
|
||||
tree: Tree,
|
||||
lib: AffectedLib,
|
||||
tsConfigPaths: Record<string, string>
|
||||
) {
|
||||
const srcRoot = joinPathFragments(lib.sourceRoot, 'index.ts');
|
||||
|
||||
for (const [validPackageName, tsLibSrcRoot] of Object.entries(
|
||||
tsConfigPaths
|
||||
)) {
|
||||
if (tsLibSrcRoot[0] === srcRoot) {
|
||||
updateJson(
|
||||
tree,
|
||||
joinPathFragments(lib.root, 'package.json'),
|
||||
(pkgJson) => {
|
||||
pkgJson.name = validPackageName;
|
||||
|
||||
return pkgJson;
|
||||
}
|
||||
);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function fixPublishableLib(
|
||||
tree: Tree,
|
||||
lib: AffectedLib,
|
||||
tsConfigPaths: Record<string, string>,
|
||||
tsconfigFilePath: string
|
||||
) {
|
||||
const srcRoot = joinPathFragments(lib.sourceRoot, 'index.ts');
|
||||
const { name: pkgName } = readJson(
|
||||
tree,
|
||||
joinPathFragments(lib.root, 'package.json')
|
||||
);
|
||||
|
||||
const pkgNameParts = pkgName.split('/');
|
||||
if (Array.isArray(pkgNameParts) && pkgNameParts.length > 2) {
|
||||
logger.warn(
|
||||
`Your publishable package ${pkgName} is an invalid NPM Package name. Please ensure it only contains one '/'.`
|
||||
);
|
||||
logger.warn(
|
||||
`The affected package.json is at '${joinPathFragments(
|
||||
lib.root,
|
||||
'package.json'
|
||||
)}'`
|
||||
);
|
||||
}
|
||||
|
||||
for (const [invalidPathKey, tsLibSrcRoot] of Object.entries(tsConfigPaths)) {
|
||||
if (tsLibSrcRoot[0] === srcRoot) {
|
||||
updateJson(tree, tsconfigFilePath, (tsconfig) => {
|
||||
tsconfig.compilerOptions.paths[invalidPathKey] = undefined;
|
||||
tsconfig.compilerOptions.paths[pkgName] = tsLibSrcRoot;
|
||||
|
||||
return tsconfig;
|
||||
});
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function getBaseTsConfigPath(tree: Tree) {
|
||||
return tree.exists('tsconfig.base.json')
|
||||
? 'tsconfig.base.json'
|
||||
: 'tsconfig.json';
|
||||
}
|
||||
@ -1,4 +1,4 @@
|
||||
import { removeProjectConfiguration } from '@nrwl/devkit';
|
||||
import { getProjects, removeProjectConfiguration } from '@nrwl/devkit';
|
||||
import { createTreeWithEmptyWorkspace } from '@nrwl/devkit/testing';
|
||||
import applicationGenerator from '../../generators/application/application';
|
||||
import setupMf from '../../generators/setup-mf/setup-mf';
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user