@nx/workspace 20.0.0-canary.20241001-8fa7065 → 20.0.0-canary.20241003-84a5c7a
Sign up to get free protection for your applications and to get access to all the features.
- package/migrations.json +1 -44
- package/package.json +3 -3
- package/src/generators/convert-to-monorepo/convert-to-monorepo.js +0 -1
- package/src/generators/move/schema.d.ts +0 -3
- package/src/generators/move/schema.json +0 -5
- package/src/generators/new/files-package-based-repo/__dot__vscode/extensions.json__tmpl__ +2 -4
- package/src/generators/new/generate-workspace-files.js +3 -3
- package/src/generators/npm-package/npm-package.d.ts +2 -4
- package/src/generators/npm-package/npm-package.js +1 -1
- package/src/generators/npm-package/schema.json +7 -13
- package/src/generators/preset/preset.js +1 -21
- package/src/migrations/update-16-0-0/fix-invalid-babelrc.d.ts +0 -2
- package/src/migrations/update-16-0-0/fix-invalid-babelrc.js +0 -41
- package/src/migrations/update-16-0-0/move-workspace-generators-to-local-plugin.d.ts +0 -2
- package/src/migrations/update-16-0-0/move-workspace-generators-to-local-plugin.js +0 -187
- package/src/migrations/update-16-0-0-add-nx-packages/update-16-0-0-add-nx-packages.d.ts +0 -2
- package/src/migrations/update-16-0-0-add-nx-packages/update-16-0-0-add-nx-packages.js +0 -9
package/migrations.json
CHANGED
@@ -1,49 +1,6 @@
|
|
1
1
|
{
|
2
|
-
"generators": {
|
3
|
-
"update-16-0-0-add-nx-packages": {
|
4
|
-
"cli": "nx",
|
5
|
-
"version": "16.0.0-beta.1",
|
6
|
-
"description": "Replace @nrwl/workspace with @nx/workspace",
|
7
|
-
"implementation": "./src/migrations/update-16-0-0-add-nx-packages/update-16-0-0-add-nx-packages"
|
8
|
-
},
|
9
|
-
"16-0-0-move-workspace-generators-into-local-plugin": {
|
10
|
-
"version": "16.0.0-beta.4",
|
11
|
-
"description": "Generates a plugin called 'workspace-plugin' containing your workspace generators.",
|
12
|
-
"cli": "nx",
|
13
|
-
"implementation": "./src/migrations/update-16-0-0/move-workspace-generators-to-local-plugin"
|
14
|
-
},
|
15
|
-
"16-0-0-fix-invalid-babelrc": {
|
16
|
-
"version": "16.0.0-beta.9",
|
17
|
-
"description": "Fix .babelrc presets if it contains an invalid entry for @nx/web/babel.",
|
18
|
-
"cli": "nx",
|
19
|
-
"implementation": "./src/migrations/update-16-0-0/fix-invalid-babelrc"
|
20
|
-
}
|
21
|
-
},
|
2
|
+
"generators": {},
|
22
3
|
"packageJsonUpdates": {
|
23
|
-
"16.1.0": {
|
24
|
-
"version": "16.1.0-beta.0",
|
25
|
-
"x-prompt": "Do you want to update to TypeScript v5.0?",
|
26
|
-
"requires": {
|
27
|
-
"typescript": ">=4.9.5 <5.0.0"
|
28
|
-
},
|
29
|
-
"packages": {
|
30
|
-
"typescript": {
|
31
|
-
"version": "~5.0.2"
|
32
|
-
}
|
33
|
-
}
|
34
|
-
},
|
35
|
-
"16.4.0": {
|
36
|
-
"version": "16.4.0-beta.11",
|
37
|
-
"x-prompt": "Do you want to update to TypeScript v5.1?",
|
38
|
-
"requires": {
|
39
|
-
"typescript": ">=5.0.0 <5.1.0"
|
40
|
-
},
|
41
|
-
"packages": {
|
42
|
-
"typescript": {
|
43
|
-
"version": "~5.1.3"
|
44
|
-
}
|
45
|
-
}
|
46
|
-
},
|
47
4
|
"17.1.0": {
|
48
5
|
"version": "17.1.0-beta.4",
|
49
6
|
"x-prompt": "Do you want to update to TypeScript v5.2?",
|
package/package.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"name": "@nx/workspace",
|
3
|
-
"version": "20.0.0-canary.
|
3
|
+
"version": "20.0.0-canary.20241003-84a5c7a",
|
4
4
|
"private": false,
|
5
5
|
"description": "The Workspace plugin contains executors and generators that are useful for any Nx workspace. It should be present in every Nx workspace and other plugins build on it.",
|
6
6
|
"repository": {
|
@@ -38,12 +38,12 @@
|
|
38
38
|
}
|
39
39
|
},
|
40
40
|
"dependencies": {
|
41
|
-
"@nx/devkit": "20.0.0-canary.
|
41
|
+
"@nx/devkit": "20.0.0-canary.20241003-84a5c7a",
|
42
42
|
"chalk": "^4.1.0",
|
43
43
|
"enquirer": "~2.3.6",
|
44
44
|
"tslib": "^2.3.0",
|
45
45
|
"yargs-parser": "21.1.1",
|
46
|
-
"nx": "20.0.0-canary.
|
46
|
+
"nx": "20.0.0-canary.20241003-84a5c7a"
|
47
47
|
},
|
48
48
|
"publishConfig": {
|
49
49
|
"access": "public"
|
@@ -45,7 +45,6 @@ async function monorepoGenerator(tree, options) {
|
|
45
45
|
? (0, devkit_1.joinPathFragments)(appsDir, project.root === '.' ? project.name : project.root)
|
46
46
|
: (0, devkit_1.joinPathFragments)(libsDir, project.root === '.' ? project.name : project.root),
|
47
47
|
updateImportPath: project.projectType === 'library',
|
48
|
-
projectNameAndRootFormat: 'as-provided',
|
49
48
|
});
|
50
49
|
}
|
51
50
|
}
|
@@ -1,5 +1,3 @@
|
|
1
|
-
import { ProjectNameAndRootFormat } from '@nx/devkit/src/generators/project-name-and-root-utils';
|
2
|
-
|
3
1
|
export interface Schema {
|
4
2
|
projectName: string;
|
5
3
|
destination: string;
|
@@ -7,7 +5,6 @@ export interface Schema {
|
|
7
5
|
updateImportPath: boolean;
|
8
6
|
skipFormat?: boolean;
|
9
7
|
newProjectName?: string;
|
10
|
-
projectNameAndRootFormat?: ProjectNameAndRootFormat;
|
11
8
|
}
|
12
9
|
|
13
10
|
export interface NormalizedSchema extends Schema {
|
@@ -33,11 +33,6 @@
|
|
33
33
|
"index": 0
|
34
34
|
}
|
35
35
|
},
|
36
|
-
"projectNameAndRootFormat": {
|
37
|
-
"description": "Whether to generate the new project name and destination as provided (`as-provided`) or generate them composing their values and taking the configured layout into account (`derived`).",
|
38
|
-
"type": "string",
|
39
|
-
"enum": ["as-provided", "derived"]
|
40
|
-
},
|
41
36
|
"importPath": {
|
42
37
|
"type": "string",
|
43
38
|
"description": "The new import path to use in the `tsconfig.base.json`."
|
@@ -212,7 +212,7 @@ function createFiles(tree, options) {
|
|
212
212
|
? './files-root-app'
|
213
213
|
: (options.preset === presets_1.Preset.TS &&
|
214
214
|
process.env.NX_ADD_PLUGINS !== 'false' &&
|
215
|
-
process.env.NX_ADD_TS_PLUGIN
|
215
|
+
process.env.NX_ADD_TS_PLUGIN !== 'false') ||
|
216
216
|
options.preset === presets_1.Preset.NPM
|
217
217
|
? './files-package-based-repo'
|
218
218
|
: './files-integrated-repo';
|
@@ -242,7 +242,7 @@ async function createReadme(tree, { name, appName, directory, preset, nxCloud },
|
|
242
242
|
isJsStandalone: preset === presets_1.Preset.TsStandalone,
|
243
243
|
isTsPreset: preset === presets_1.Preset.TS,
|
244
244
|
isUsingNewTsSolutionSetup: process.env.NX_ADD_PLUGINS !== 'false' &&
|
245
|
-
process.env.NX_ADD_TS_PLUGIN
|
245
|
+
process.env.NX_ADD_TS_PLUGIN !== 'false',
|
246
246
|
isEmptyRepo: !appName,
|
247
247
|
appName,
|
248
248
|
generateAppCmd: presetInfo.generateAppCmd,
|
@@ -325,7 +325,7 @@ function setUpWorkspacesInPackageJson(tree, options) {
|
|
325
325
|
if (options.preset === presets_1.Preset.NPM ||
|
326
326
|
(options.preset === presets_1.Preset.TS &&
|
327
327
|
process.env.NX_ADD_PLUGINS !== 'false' &&
|
328
|
-
process.env.NX_ADD_TS_PLUGIN
|
328
|
+
process.env.NX_ADD_TS_PLUGIN !== 'false')) {
|
329
329
|
if (options.packageManager === 'pnpm') {
|
330
330
|
tree.write((0, path_1.join)(options.directory, 'pnpm-workspace.yaml'), `packages:
|
331
331
|
- 'packages/*'
|
@@ -1,8 +1,6 @@
|
|
1
1
|
import { Tree } from '@nx/devkit';
|
2
|
-
import { type ProjectNameAndRootFormat } from '@nx/devkit/src/generators/project-name-and-root-utils';
|
3
2
|
export interface ProjectOptions {
|
4
|
-
|
5
|
-
|
6
|
-
projectNameAndRootFormat?: ProjectNameAndRootFormat;
|
3
|
+
directory: string;
|
4
|
+
name?: string;
|
7
5
|
}
|
8
6
|
export declare function npmPackageGenerator(tree: Tree, _options: ProjectOptions): Promise<void>;
|
@@ -6,11 +6,11 @@ const project_name_and_root_utils_1 = require("@nx/devkit/src/generators/project
|
|
6
6
|
const path_1 = require("path");
|
7
7
|
const get_import_path_1 = require("../../utilities/get-import-path");
|
8
8
|
async function normalizeOptions(tree, options) {
|
9
|
+
await (0, project_name_and_root_utils_1.ensureProjectName)(tree, options, 'library');
|
9
10
|
const { projectName, projectRoot } = await (0, project_name_and_root_utils_1.determineProjectNameAndRootOptions)(tree, {
|
10
11
|
name: options.name,
|
11
12
|
projectType: 'library',
|
12
13
|
directory: options.directory,
|
13
|
-
projectNameAndRootFormat: options.projectNameAndRootFormat,
|
14
14
|
});
|
15
15
|
return {
|
16
16
|
...options,
|
@@ -6,26 +6,20 @@
|
|
6
6
|
"cli": "nx",
|
7
7
|
"type": "object",
|
8
8
|
"properties": {
|
9
|
-
"
|
9
|
+
"directory": {
|
10
10
|
"type": "string",
|
11
|
-
"description": "
|
11
|
+
"description": "A directory where the package is placed.",
|
12
|
+
"alias": "dir",
|
12
13
|
"$default": {
|
13
14
|
"$source": "argv",
|
14
15
|
"index": 0
|
15
16
|
},
|
16
|
-
"x-prompt": "
|
17
|
-
"pattern": "(?:^@[a-zA-Z0-9-*~][a-zA-Z0-9-*._~]*\\/[a-zA-Z0-9-~][a-zA-Z0-9-._~]*|^[a-zA-Z][^:]*)$"
|
18
|
-
},
|
19
|
-
"directory": {
|
20
|
-
"type": "string",
|
21
|
-
"description": "A directory where the package is placed.",
|
22
|
-
"alias": "dir"
|
17
|
+
"x-prompt": "Which directory do you want to create the package in?"
|
23
18
|
},
|
24
|
-
"
|
25
|
-
"description": "Whether to generate the project name and root directory as provided (`as-provided`) or generate them composing their values and taking the configured layout into account (`derived`).",
|
19
|
+
"name": {
|
26
20
|
"type": "string",
|
27
|
-
"
|
21
|
+
"description": "Package name."
|
28
22
|
}
|
29
23
|
},
|
30
|
-
"required": ["
|
24
|
+
"required": ["directory"]
|
31
25
|
}
|
@@ -25,7 +25,6 @@ async function createPreset(tree, options) {
|
|
25
25
|
return angularApplicationGenerator(tree, {
|
26
26
|
name: options.name,
|
27
27
|
directory: (0, path_1.join)('apps', options.name),
|
28
|
-
projectNameAndRootFormat: 'as-provided',
|
29
28
|
style: options.style,
|
30
29
|
linter: options.linter,
|
31
30
|
standalone: options.standaloneApi,
|
@@ -42,7 +41,6 @@ async function createPreset(tree, options) {
|
|
42
41
|
return angularApplicationGenerator(tree, {
|
43
42
|
name: options.name,
|
44
43
|
directory: '.',
|
45
|
-
projectNameAndRootFormat: 'as-provided',
|
46
44
|
style: options.style,
|
47
45
|
linter: options.linter,
|
48
46
|
routing: options.routing,
|
@@ -61,7 +59,6 @@ async function createPreset(tree, options) {
|
|
61
59
|
return reactApplicationGenerator(tree, {
|
62
60
|
name: options.name,
|
63
61
|
directory: (0, path_1.join)('apps', options.name),
|
64
|
-
projectNameAndRootFormat: 'as-provided',
|
65
62
|
style: options.style,
|
66
63
|
linter: options.linter,
|
67
64
|
bundler: options.bundler ?? 'webpack',
|
@@ -76,7 +73,6 @@ async function createPreset(tree, options) {
|
|
76
73
|
return reactApplicationGenerator(tree, {
|
77
74
|
name: options.name,
|
78
75
|
directory: '.',
|
79
|
-
projectNameAndRootFormat: 'as-provided',
|
80
76
|
style: options.style,
|
81
77
|
linter: options.linter,
|
82
78
|
rootProject: true,
|
@@ -93,7 +89,6 @@ async function createPreset(tree, options) {
|
|
93
89
|
return remixApplicationGenerator(tree, {
|
94
90
|
name: options.name,
|
95
91
|
directory: (0, path_1.join)('apps', options.name),
|
96
|
-
projectNameAndRootFormat: 'as-provided',
|
97
92
|
linter: options.linter,
|
98
93
|
e2eTestRunner: options.e2eTestRunner ?? 'playwright',
|
99
94
|
unitTestRunner: 'vitest',
|
@@ -107,7 +102,6 @@ async function createPreset(tree, options) {
|
|
107
102
|
return remixApplicationGenerator(tree, {
|
108
103
|
name: options.name,
|
109
104
|
directory: '.',
|
110
|
-
projectNameAndRootFormat: 'as-provided',
|
111
105
|
linter: options.linter,
|
112
106
|
e2eTestRunner: options.e2eTestRunner ?? 'playwright',
|
113
107
|
rootProject: true,
|
@@ -122,7 +116,6 @@ async function createPreset(tree, options) {
|
|
122
116
|
return vueApplicationGenerator(tree, {
|
123
117
|
name: options.name,
|
124
118
|
directory: (0, path_1.join)('apps', options.name),
|
125
|
-
projectNameAndRootFormat: 'as-provided',
|
126
119
|
style: options.style,
|
127
120
|
linter: options.linter,
|
128
121
|
e2eTestRunner: options.e2eTestRunner ?? 'playwright',
|
@@ -136,7 +129,6 @@ async function createPreset(tree, options) {
|
|
136
129
|
return vueApplicationGenerator(tree, {
|
137
130
|
name: options.name,
|
138
131
|
directory: '.',
|
139
|
-
projectNameAndRootFormat: 'as-provided',
|
140
132
|
style: options.style,
|
141
133
|
linter: options.linter,
|
142
134
|
rootProject: true,
|
@@ -152,7 +144,6 @@ async function createPreset(tree, options) {
|
|
152
144
|
return nuxtApplicationGenerator(tree, {
|
153
145
|
name: options.name,
|
154
146
|
directory: (0, path_1.join)('apps', options.name),
|
155
|
-
projectNameAndRootFormat: 'as-provided',
|
156
147
|
style: options.style,
|
157
148
|
linter: options.linter,
|
158
149
|
e2eTestRunner: options.e2eTestRunner ?? 'playwright',
|
@@ -166,7 +157,6 @@ async function createPreset(tree, options) {
|
|
166
157
|
return nuxtApplicationGenerator(tree, {
|
167
158
|
name: options.name,
|
168
159
|
directory: '.',
|
169
|
-
projectNameAndRootFormat: 'as-provided',
|
170
160
|
style: options.style,
|
171
161
|
linter: options.linter,
|
172
162
|
rootProject: true,
|
@@ -182,7 +172,6 @@ async function createPreset(tree, options) {
|
|
182
172
|
return nextApplicationGenerator(tree, {
|
183
173
|
name: options.name,
|
184
174
|
directory: (0, path_1.join)('apps', options.name),
|
185
|
-
projectNameAndRootFormat: 'as-provided',
|
186
175
|
style: options.style,
|
187
176
|
linter: options.linter,
|
188
177
|
appDir: options.nextAppDir,
|
@@ -197,7 +186,6 @@ async function createPreset(tree, options) {
|
|
197
186
|
return nextApplicationGenerator(tree, {
|
198
187
|
name: options.name,
|
199
188
|
directory: '.',
|
200
|
-
projectNameAndRootFormat: 'as-provided',
|
201
189
|
style: options.style,
|
202
190
|
linter: options.linter,
|
203
191
|
appDir: options.nextAppDir,
|
@@ -213,7 +201,6 @@ async function createPreset(tree, options) {
|
|
213
201
|
return webApplicationGenerator(tree, {
|
214
202
|
name: options.name,
|
215
203
|
directory: (0, path_1.join)('apps', options.name),
|
216
|
-
projectNameAndRootFormat: 'as-provided',
|
217
204
|
style: options.style,
|
218
205
|
linter: options.linter,
|
219
206
|
bundler: 'vite',
|
@@ -228,7 +215,6 @@ async function createPreset(tree, options) {
|
|
228
215
|
return nestApplicationGenerator(tree, {
|
229
216
|
name: options.name,
|
230
217
|
directory: (0, path_1.join)('apps', options.name),
|
231
|
-
projectNameAndRootFormat: 'as-provided',
|
232
218
|
linter: options.linter,
|
233
219
|
e2eTestRunner: options.e2eTestRunner ?? 'jest',
|
234
220
|
addPlugin,
|
@@ -239,7 +225,6 @@ async function createPreset(tree, options) {
|
|
239
225
|
return expressApplicationGenerator(tree, {
|
240
226
|
name: options.name,
|
241
227
|
directory: (0, path_1.join)('apps', options.name),
|
242
|
-
projectNameAndRootFormat: 'as-provided',
|
243
228
|
linter: options.linter,
|
244
229
|
e2eTestRunner: options.e2eTestRunner ?? 'jest',
|
245
230
|
addPlugin,
|
@@ -251,7 +236,6 @@ async function createPreset(tree, options) {
|
|
251
236
|
return reactNativeApplicationGenerator(tree, {
|
252
237
|
name: options.name,
|
253
238
|
directory: (0, path_1.join)('apps', options.name),
|
254
|
-
projectNameAndRootFormat: 'as-provided',
|
255
239
|
linter: options.linter,
|
256
240
|
e2eTestRunner: options.e2eTestRunner ?? 'detox',
|
257
241
|
addPlugin,
|
@@ -263,7 +247,6 @@ async function createPreset(tree, options) {
|
|
263
247
|
return expoApplicationGenerator(tree, {
|
264
248
|
name: options.name,
|
265
249
|
directory: (0, path_1.join)('apps', options.name),
|
266
|
-
projectNameAndRootFormat: 'as-provided',
|
267
250
|
linter: options.linter,
|
268
251
|
e2eTestRunner: options.e2eTestRunner ?? 'detox',
|
269
252
|
addPlugin,
|
@@ -275,7 +258,7 @@ async function createPreset(tree, options) {
|
|
275
258
|
return initGenerator(tree, {
|
276
259
|
formatter: options.formatter,
|
277
260
|
addTsPlugin: process.env.NX_ADD_PLUGINS !== 'false' &&
|
278
|
-
process.env.NX_ADD_TS_PLUGIN
|
261
|
+
process.env.NX_ADD_TS_PLUGIN !== 'false',
|
279
262
|
});
|
280
263
|
}
|
281
264
|
else if (options.preset === presets_1.Preset.TsStandalone) {
|
@@ -283,7 +266,6 @@ async function createPreset(tree, options) {
|
|
283
266
|
return libraryGenerator(tree, {
|
284
267
|
name: options.name,
|
285
268
|
directory: '.',
|
286
|
-
projectNameAndRootFormat: 'as-provided',
|
287
269
|
bundler: 'tsc',
|
288
270
|
unitTestRunner: 'vitest',
|
289
271
|
testEnvironment: 'node',
|
@@ -300,7 +282,6 @@ async function createPreset(tree, options) {
|
|
300
282
|
bundler,
|
301
283
|
name: options.name,
|
302
284
|
directory: '.',
|
303
|
-
projectNameAndRootFormat: 'as-provided',
|
304
285
|
linter: options.linter,
|
305
286
|
standaloneConfig: options.standaloneConfig,
|
306
287
|
framework: options.framework,
|
@@ -318,7 +299,6 @@ async function createPreset(tree, options) {
|
|
318
299
|
bundler,
|
319
300
|
name: options.name,
|
320
301
|
directory: (0, path_1.join)('apps', options.name),
|
321
|
-
projectNameAndRootFormat: 'as-provided',
|
322
302
|
linter: options.linter,
|
323
303
|
framework: options.framework,
|
324
304
|
docker: options.docker,
|
@@ -1,41 +0,0 @@
|
|
1
|
-
"use strict";
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
-
exports.default = update;
|
4
|
-
const devkit_1 = require("@nx/devkit");
|
5
|
-
function update(tree) {
|
6
|
-
const projects = (0, devkit_1.getProjects)(tree);
|
7
|
-
const packageJson = (0, devkit_1.readJson)(tree, 'package.json');
|
8
|
-
// In case user installed as prod dep.
|
9
|
-
const deps = { ...packageJson.dependencies, ...packageJson.devDependencies };
|
10
|
-
// If web package is installed, skip update.
|
11
|
-
if (deps['@nrwl/web'] || deps['@nx/web']) {
|
12
|
-
return;
|
13
|
-
}
|
14
|
-
projects.forEach((config, name) => {
|
15
|
-
const babelRcPath = (0, devkit_1.joinPathFragments)(config.root, '.babelrc');
|
16
|
-
if (!tree.exists(babelRcPath))
|
17
|
-
return;
|
18
|
-
const babelRc = (0, devkit_1.readJson)(tree, babelRcPath);
|
19
|
-
const nrwlWebBabelPresetIdx = babelRc.presets?.findIndex((p) =>
|
20
|
-
// Babel preset could be specified as a string or a tuple with options.
|
21
|
-
// Account for rescope migration running before or after this one.
|
22
|
-
Array.isArray(p)
|
23
|
-
? p[0] === '@nrwl/web/babel' || p[0] === '@nx/web/babel'
|
24
|
-
: p === '@nrwl/web/babel' || p === '@nx/web/babel');
|
25
|
-
if (nrwlWebBabelPresetIdx === undefined || nrwlWebBabelPresetIdx === -1) {
|
26
|
-
return;
|
27
|
-
}
|
28
|
-
if (deps['@nrwl/js'] || deps['@nx/js']) {
|
29
|
-
// If JS plugin is installed, then rename to @nx/js/babel.
|
30
|
-
const found = babelRc.presets[nrwlWebBabelPresetIdx];
|
31
|
-
babelRc.presets[nrwlWebBabelPresetIdx] = Array.isArray(found)
|
32
|
-
? ['@nx/js/babel', found[1]]
|
33
|
-
: '@nx/js/babel';
|
34
|
-
}
|
35
|
-
else {
|
36
|
-
// Otherwise, remove from config.
|
37
|
-
babelRc.presets.splice(nrwlWebBabelPresetIdx, 1);
|
38
|
-
}
|
39
|
-
(0, devkit_1.writeJson)(tree, babelRcPath, babelRc);
|
40
|
-
});
|
41
|
-
}
|
@@ -1,187 +0,0 @@
|
|
1
|
-
"use strict";
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
-
exports.default = default_1;
|
4
|
-
const devkit_1 = require("@nx/devkit");
|
5
|
-
// nx-ignore-next-line
|
6
|
-
const path = require("path");
|
7
|
-
const move_1 = require("../../generators/move/move");
|
8
|
-
const versions_1 = require("../../utils/versions");
|
9
|
-
const path_1 = require("path");
|
10
|
-
const get_import_path_1 = require("../../utilities/get-import-path");
|
11
|
-
const PROJECT_NAME = 'workspace-plugin';
|
12
|
-
const DESTINATION = `tools/${PROJECT_NAME}`;
|
13
|
-
async function default_1(tree) {
|
14
|
-
if (!tree.exists('tools/generators')) {
|
15
|
-
return;
|
16
|
-
}
|
17
|
-
const tasks = [];
|
18
|
-
if (hasWorkspaceGenerators(tree)) {
|
19
|
-
tasks.push(...(await moveWorkspaceGeneratorsToLocalPlugin(tree)));
|
20
|
-
}
|
21
|
-
removeToolsGeneratorsIfEmpty(tree);
|
22
|
-
await (0, devkit_1.formatFiles)(tree);
|
23
|
-
return () => {
|
24
|
-
for (const task of tasks) {
|
25
|
-
task();
|
26
|
-
}
|
27
|
-
};
|
28
|
-
}
|
29
|
-
async function moveWorkspaceGeneratorsToLocalPlugin(tree) {
|
30
|
-
const tasks = [];
|
31
|
-
let project = (0, devkit_1.getProjects)(tree).get(PROJECT_NAME);
|
32
|
-
if (!project) {
|
33
|
-
await createNewPlugin(tree);
|
34
|
-
tasks.push((0, devkit_1.addDependenciesToPackageJson)(tree, {}, {
|
35
|
-
'@nx/plugin': versions_1.nxVersion,
|
36
|
-
}));
|
37
|
-
project = (0, devkit_1.readProjectConfiguration)(tree, PROJECT_NAME);
|
38
|
-
}
|
39
|
-
updateExistingPlugin(tree, project);
|
40
|
-
return tasks;
|
41
|
-
}
|
42
|
-
function hasWorkspaceGenerators(tree) {
|
43
|
-
const children = tree.children('tools/generators');
|
44
|
-
return (children.length > 0 &&
|
45
|
-
!(children.length === 1 && children[0] === '.gitkeep'));
|
46
|
-
}
|
47
|
-
function removeToolsGeneratorsIfEmpty(tree) {
|
48
|
-
if (!hasWorkspaceGenerators(tree)) {
|
49
|
-
tree.delete('tools/generators');
|
50
|
-
}
|
51
|
-
}
|
52
|
-
// Inspired by packages/nx/src/command-line/workspace-generators.ts
|
53
|
-
function collectAndMoveGenerators(tree, destinationProjectRoot) {
|
54
|
-
const generators = {};
|
55
|
-
const generatorsDir = 'tools/generators';
|
56
|
-
const destinationDir = (0, devkit_1.joinPathFragments)(destinationProjectRoot, 'src', 'generators');
|
57
|
-
for (const c of tree.children('tools/generators')) {
|
58
|
-
const childDir = path.join(generatorsDir, c);
|
59
|
-
const schemaPath = (0, devkit_1.joinPathFragments)(childDir, 'schema.json');
|
60
|
-
if (tree.exists(schemaPath)) {
|
61
|
-
const schema = (0, devkit_1.readJson)(tree, schemaPath);
|
62
|
-
generators[c] = {
|
63
|
-
implementation: `./src/generators/${c}`,
|
64
|
-
schema: `./src/generators/${(0, devkit_1.joinPathFragments)(c, 'schema.json')}`,
|
65
|
-
description: schema.description ?? `Generator ${c}`,
|
66
|
-
};
|
67
|
-
moveFilesInDirectory(tree, childDir, (0, devkit_1.joinPathFragments)(destinationDir, c));
|
68
|
-
}
|
69
|
-
}
|
70
|
-
return generators;
|
71
|
-
}
|
72
|
-
function moveFilesInDirectory(tree, source, destination) {
|
73
|
-
const relative = path_1.posix.relative(source, path_1.posix.dirname(destination));
|
74
|
-
if (!relative.startsWith('../')) {
|
75
|
-
// If the destination is in the same directory or a subdirectory of the source
|
76
|
-
// we can just move the files. If it is not, we need to update the relative imports.
|
77
|
-
return;
|
78
|
-
}
|
79
|
-
let offsetLevel = 0;
|
80
|
-
const pathParts = relative.split('/');
|
81
|
-
for (const part of pathParts) {
|
82
|
-
if (part === '..') {
|
83
|
-
offsetLevel++;
|
84
|
-
}
|
85
|
-
else {
|
86
|
-
break;
|
87
|
-
}
|
88
|
-
}
|
89
|
-
for (const c of tree.children(source)) {
|
90
|
-
if (!tree.isFile(c)) {
|
91
|
-
moveFilesInDirectory(tree, (0, devkit_1.joinPathFragments)(source, c), (0, devkit_1.joinPathFragments)(destination, c));
|
92
|
-
}
|
93
|
-
tree.rename((0, devkit_1.joinPathFragments)(source, c), (0, devkit_1.joinPathFragments)(destination, c));
|
94
|
-
// If its a TS file we can update relative imports with find + replace
|
95
|
-
// This could be done with AST, but since we are only looking at relative
|
96
|
-
// imports its easy to do via string replace. We replace any strings starting
|
97
|
-
// with a relative path outside of their own directory.
|
98
|
-
if (c.endsWith('.ts')) {
|
99
|
-
let content = tree.read((0, devkit_1.joinPathFragments)(destination, c)).toString();
|
100
|
-
// +2 is a bit of a magic number here - represents extra directory levels in a normal
|
101
|
-
// plugin structure compared to the workspace-generator layout
|
102
|
-
const extraDirectoriesInPluginStructure = 2;
|
103
|
-
content = content.replace(new RegExp(`'` + `\.\.\/`.repeat(offsetLevel), 'g'), "'" + '../'.repeat(offsetLevel + extraDirectoriesInPluginStructure));
|
104
|
-
content = content.replace(new RegExp(`"` + `\.\.\/`.repeat(offsetLevel), 'g'), '"' + '../'.repeat(offsetLevel + extraDirectoriesInPluginStructure));
|
105
|
-
// We write it back in the same spot, since it is moved as if it was a regular file after this
|
106
|
-
tree.write((0, devkit_1.joinPathFragments)(source, c), content);
|
107
|
-
}
|
108
|
-
tree.rename((0, devkit_1.joinPathFragments)(source, c), (0, devkit_1.joinPathFragments)(destination, c));
|
109
|
-
}
|
110
|
-
}
|
111
|
-
async function createNewPlugin(tree) {
|
112
|
-
(0, devkit_1.ensurePackage)('@nx/plugin', versions_1.nxVersion);
|
113
|
-
const { pluginGenerator } =
|
114
|
-
// nx-ignore-next-line
|
115
|
-
require('@nx/plugin/src/generators/plugin/plugin');
|
116
|
-
// nx-ignore-next-line
|
117
|
-
const { Linter } = (0, devkit_1.ensurePackage)('@nx/eslint', versions_1.nxVersion);
|
118
|
-
const npmScope = (0, get_import_path_1.getNpmScope)(tree);
|
119
|
-
const importPath = npmScope ? `@${npmScope}/${PROJECT_NAME}` : PROJECT_NAME;
|
120
|
-
await pluginGenerator(tree, {
|
121
|
-
minimal: true,
|
122
|
-
name: PROJECT_NAME,
|
123
|
-
importPath: importPath,
|
124
|
-
skipTsConfig: false,
|
125
|
-
compiler: 'tsc',
|
126
|
-
linter: Linter.EsLint,
|
127
|
-
skipFormat: true,
|
128
|
-
skipLintChecks: false,
|
129
|
-
unitTestRunner: 'jest',
|
130
|
-
e2eTestRunner: 'none',
|
131
|
-
publishable: false,
|
132
|
-
});
|
133
|
-
await getCreateGeneratorsJson()(tree, (0, devkit_1.readProjectConfiguration)(tree, PROJECT_NAME).root, PROJECT_NAME);
|
134
|
-
await moveGeneratedPlugin(tree, DESTINATION, importPath);
|
135
|
-
}
|
136
|
-
function moveGeneratedPlugin(tree, destination, importPath) {
|
137
|
-
const config = (0, devkit_1.readProjectConfiguration)(tree, PROJECT_NAME);
|
138
|
-
if (config.root !== DESTINATION) {
|
139
|
-
return (0, move_1.moveGenerator)(tree, {
|
140
|
-
destination,
|
141
|
-
projectName: PROJECT_NAME,
|
142
|
-
newProjectName: PROJECT_NAME,
|
143
|
-
updateImportPath: true,
|
144
|
-
importPath: importPath,
|
145
|
-
projectNameAndRootFormat: 'as-provided',
|
146
|
-
});
|
147
|
-
}
|
148
|
-
}
|
149
|
-
function updateExistingPlugin(tree, project) {
|
150
|
-
const packageJson = (0, devkit_1.readJson)(tree, (0, devkit_1.joinPathFragments)(project.root, 'package.json'));
|
151
|
-
const defaultGeneratorsPath = (0, devkit_1.joinPathFragments)(project.root, 'generators.json');
|
152
|
-
let generatorsJsonPath = packageJson.generators ||
|
153
|
-
packageJson.schematics ||
|
154
|
-
tree.exists(defaultGeneratorsPath)
|
155
|
-
? defaultGeneratorsPath
|
156
|
-
: null;
|
157
|
-
if (!generatorsJsonPath) {
|
158
|
-
getCreateGeneratorsJson()(tree, (0, devkit_1.readProjectConfiguration)(tree, PROJECT_NAME).root, PROJECT_NAME);
|
159
|
-
generatorsJsonPath = defaultGeneratorsPath;
|
160
|
-
}
|
161
|
-
(0, devkit_1.updateJson)(tree, generatorsJsonPath, (json) => {
|
162
|
-
const generators = collectAndMoveGenerators(tree, project.root);
|
163
|
-
json.generators ??= {};
|
164
|
-
for (const generator in generators) {
|
165
|
-
if (json.generators[generator]) {
|
166
|
-
devkit_1.output.warn({
|
167
|
-
title: `Generator ${generator} already exists in ${project.name}`,
|
168
|
-
bodyLines: [
|
169
|
-
'Since you have a generator with the same name in your plugin, the generator from workspace-generators has been discarded.',
|
170
|
-
],
|
171
|
-
});
|
172
|
-
}
|
173
|
-
else {
|
174
|
-
json.generators[generator] = generators[generator];
|
175
|
-
}
|
176
|
-
}
|
177
|
-
return json;
|
178
|
-
});
|
179
|
-
}
|
180
|
-
function getCreateGeneratorsJson() {
|
181
|
-
// We cant use `as typeof import('@nx/plugin/src/generators/generator/generator');` here
|
182
|
-
// because it will cause a typescript error at build time.
|
183
|
-
const { createGeneratorsJson } =
|
184
|
-
// nx-ignore-next-line
|
185
|
-
require('@nx/plugin/src/generators/generator/generator');
|
186
|
-
return createGeneratorsJson;
|
187
|
-
}
|
@@ -1,9 +0,0 @@
|
|
1
|
-
"use strict";
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
-
exports.default = replacePackage;
|
4
|
-
const devkit_1 = require("@nx/devkit");
|
5
|
-
const replace_package_1 = require("@nx/devkit/src/utils/replace-package");
|
6
|
-
async function replacePackage(tree) {
|
7
|
-
await (0, replace_package_1.replaceNrwlPackageWithNxPackage)(tree, '@nrwl/workspace', '@nx/workspace');
|
8
|
-
await (0, devkit_1.formatFiles)(tree);
|
9
|
-
}
|