@nx/workspace 20.0.0-canary.20241002-1d10a19 → 20.0.0-rc.0
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/new/files-package-based-repo/__dot__vscode/extensions.json__tmpl__ +2 -4
- package/src/generators/new/files-package-based-repo/package.json__tmpl__ +1 -1
- package/src/generators/new/generate-workspace-files.js +3 -3
- package/src/generators/preset/preset.js +1 -1
- 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 -186
- 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-
|
3
|
+
"version": "20.0.0-rc.0",
|
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-
|
41
|
+
"@nx/devkit": "20.0.0-rc.0",
|
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-
|
46
|
+
"nx": "20.0.0-rc.0"
|
47
47
|
},
|
48
48
|
"publishConfig": {
|
49
49
|
"access": "public"
|
@@ -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/*'
|
@@ -258,7 +258,7 @@ async function createPreset(tree, options) {
|
|
258
258
|
return initGenerator(tree, {
|
259
259
|
formatter: options.formatter,
|
260
260
|
addTsPlugin: process.env.NX_ADD_PLUGINS !== 'false' &&
|
261
|
-
process.env.NX_ADD_TS_PLUGIN
|
261
|
+
process.env.NX_ADD_TS_PLUGIN !== 'false',
|
262
262
|
});
|
263
263
|
}
|
264
264
|
else if (options.preset === presets_1.Preset.TsStandalone) {
|
@@ -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,186 +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
|
-
directory: 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
|
-
});
|
146
|
-
}
|
147
|
-
}
|
148
|
-
function updateExistingPlugin(tree, project) {
|
149
|
-
const packageJson = (0, devkit_1.readJson)(tree, (0, devkit_1.joinPathFragments)(project.root, 'package.json'));
|
150
|
-
const defaultGeneratorsPath = (0, devkit_1.joinPathFragments)(project.root, 'generators.json');
|
151
|
-
let generatorsJsonPath = packageJson.generators ||
|
152
|
-
packageJson.schematics ||
|
153
|
-
tree.exists(defaultGeneratorsPath)
|
154
|
-
? defaultGeneratorsPath
|
155
|
-
: null;
|
156
|
-
if (!generatorsJsonPath) {
|
157
|
-
getCreateGeneratorsJson()(tree, (0, devkit_1.readProjectConfiguration)(tree, PROJECT_NAME).root, PROJECT_NAME);
|
158
|
-
generatorsJsonPath = defaultGeneratorsPath;
|
159
|
-
}
|
160
|
-
(0, devkit_1.updateJson)(tree, generatorsJsonPath, (json) => {
|
161
|
-
const generators = collectAndMoveGenerators(tree, project.root);
|
162
|
-
json.generators ??= {};
|
163
|
-
for (const generator in generators) {
|
164
|
-
if (json.generators[generator]) {
|
165
|
-
devkit_1.output.warn({
|
166
|
-
title: `Generator ${generator} already exists in ${project.name}`,
|
167
|
-
bodyLines: [
|
168
|
-
'Since you have a generator with the same name in your plugin, the generator from workspace-generators has been discarded.',
|
169
|
-
],
|
170
|
-
});
|
171
|
-
}
|
172
|
-
else {
|
173
|
-
json.generators[generator] = generators[generator];
|
174
|
-
}
|
175
|
-
}
|
176
|
-
return json;
|
177
|
-
});
|
178
|
-
}
|
179
|
-
function getCreateGeneratorsJson() {
|
180
|
-
// We cant use `as typeof import('@nx/plugin/src/generators/generator/generator');` here
|
181
|
-
// because it will cause a typescript error at build time.
|
182
|
-
const { createGeneratorsJson } =
|
183
|
-
// nx-ignore-next-line
|
184
|
-
require('@nx/plugin/src/generators/generator/generator');
|
185
|
-
return createGeneratorsJson;
|
186
|
-
}
|
@@ -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
|
-
}
|