@nx/angular 23.0.0-beta.21 → 23.0.0-beta.22
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/migrations.json +62 -31
- package/package.json +8 -8
- package/src/migrations/update-20-2-0/add-localize-polyfill-to-targets.md +44 -0
- package/src/migrations/update-20-2-0/disable-angular-eslint-prefer-standalone.md +475 -0
- package/src/migrations/update-20-2-0/migrate-mf-imports-to-new-package.md +19 -0
- package/src/migrations/update-20-2-0/migrate-with-mf-import-to-new-package.md +25 -0
- package/src/migrations/update-20-2-0/remove-angular-eslint-rules.md +37 -0
- package/src/migrations/update-20-2-0/remove-tailwind-config-from-ng-packagr-executors.md +69 -0
- package/src/migrations/update-20-2-0/update-angular-cli.md +49 -0
- package/src/migrations/update-20-2-0/update-angular-ssr-imports-to-use-node-entry-point.md +27 -0
- package/src/migrations/update-20-3-0/ensure-nx-module-federation-package.md +23 -0
- package/src/migrations/update-20-4-0/update-angular-cli.md +49 -0
- package/src/migrations/update-20-5-0/update-angular-cli.md +23 -0
- package/src/migrations/update-21-0-0/change-data-persistence-operators-imports-to-ngrx-router-store-data-persistence.md +113 -0
- package/src/migrations/update-21-0-0/set-continuous-option.md +90 -0
- package/src/migrations/update-21-2-0/migrate-provide-server-rendering-import.md +56 -0
- package/src/migrations/update-21-2-0/replace-provide-server-routing.md +107 -0
- package/src/migrations/update-21-2-0/set-generator-defaults-for-previous-style-guide.md +164 -0
- package/src/migrations/update-21-2-0/update-angular-cli.md +23 -0
- package/src/migrations/update-21-2-0/update-module-resolution.md +53 -0
- package/src/migrations/update-21-3-0/update-angular-cli.md +23 -0
- package/src/migrations/update-21-5-0/remove-default-karma-configuration-files.md +122 -0
- package/src/migrations/update-21-5-0/set-tsconfig-option.md +114 -0
- package/src/migrations/update-21-5-0/update-angular-cli.md +23 -0
- package/src/migrations/update-21-6-1/update-angular-cli.md +23 -0
- package/src/migrations/update-22-3-0/set-isolated-modules.md +76 -0
- package/src/migrations/update-22-3-0/update-jest-preset-angular-setup.md +21 -0
- package/src/migrations/update-22-3-0/update-module-resolution.md +81 -0
- package/src/migrations/update-22-3-0/update-ssr-webpack-config.md +71 -0
- package/src/migrations/update-22-3-0/update-typescript-lib.md +103 -0
- package/src/migrations/update-22-3-0/update-unit-test-runner-option.md +33 -0
- package/src/migrations/update-23-0-0/migrate-ngrx-generator-defaults.md +46 -0
- package/src/migrations/update-23-0-0/migrate-with-mf-import-to-new-package.md +27 -0
- package/src/utils/versions.d.ts +1 -1
- package/src/utils/versions.js +1 -1
|
@@ -0,0 +1,475 @@
|
|
|
1
|
+
#### Disable Angular ESLint Prefer Standalone
|
|
2
|
+
|
|
3
|
+
Disable the Angular ESLint prefer-standalone rule if not set.
|
|
4
|
+
|
|
5
|
+
#### Sample Code Changes
|
|
6
|
+
|
|
7
|
+
Update import paths for `withModuleFederation` and `withModuleFederationForSSR`.
|
|
8
|
+
|
|
9
|
+
##### Before
|
|
10
|
+
|
|
11
|
+
```json title="apps/app1/.eslintrc.json"
|
|
12
|
+
{
|
|
13
|
+
"overrides": [
|
|
14
|
+
{
|
|
15
|
+
"files": ["*.html"],
|
|
16
|
+
"rules": {
|
|
17
|
+
"some-rule-for-html": "error"
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
]
|
|
21
|
+
}
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
##### After
|
|
25
|
+
|
|
26
|
+
```json title="apps/app1/.eslintrc.json"
|
|
27
|
+
{
|
|
28
|
+
"overrides": [
|
|
29
|
+
{
|
|
30
|
+
"files": ["*.html"],
|
|
31
|
+
"rules": {
|
|
32
|
+
"some-rule-for-html": "error"
|
|
33
|
+
}
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
"files": ["*.ts"],
|
|
37
|
+
"rules": {
|
|
38
|
+
"@angular-eslint/prefer-standalone": "off"
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
]
|
|
42
|
+
}
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
import {
|
|
46
|
+
addProjectConfiguration,
|
|
47
|
+
writeJson,
|
|
48
|
+
type ProjectConfiguration,
|
|
49
|
+
type ProjectGraph,
|
|
50
|
+
type Tree,
|
|
51
|
+
} from '@nx/devkit';
|
|
52
|
+
import { createTreeWithEmptyWorkspace } from '@nx/devkit/testing';
|
|
53
|
+
import migration from './disable-angular-eslint-prefer-standalone';
|
|
54
|
+
|
|
55
|
+
let projectGraph: ProjectGraph;
|
|
56
|
+
jest.mock('@nx/devkit', () => ({
|
|
57
|
+
...jest.requireActual('@nx/devkit'),
|
|
58
|
+
createProjectGraphAsync: () => Promise.resolve(projectGraph),
|
|
59
|
+
}));
|
|
60
|
+
|
|
61
|
+
describe('disable-angular-eslint-prefer-standalone', () => {
|
|
62
|
+
let tree: Tree;
|
|
63
|
+
|
|
64
|
+
beforeEach(() => {
|
|
65
|
+
tree = createTreeWithEmptyWorkspace();
|
|
66
|
+
|
|
67
|
+
const projectConfig: ProjectConfiguration = {
|
|
68
|
+
name: 'app1',
|
|
69
|
+
root: 'apps/app1',
|
|
70
|
+
};
|
|
71
|
+
projectGraph = {
|
|
72
|
+
dependencies: {
|
|
73
|
+
app1: [
|
|
74
|
+
{
|
|
75
|
+
source: 'app1',
|
|
76
|
+
target: 'npm:@angular/core',
|
|
77
|
+
type: 'static',
|
|
78
|
+
},
|
|
79
|
+
],
|
|
80
|
+
},
|
|
81
|
+
nodes: {
|
|
82
|
+
app1: {
|
|
83
|
+
data: projectConfig,
|
|
84
|
+
name: 'app1',
|
|
85
|
+
type: 'app',
|
|
86
|
+
},
|
|
87
|
+
},
|
|
88
|
+
};
|
|
89
|
+
addProjectConfiguration(tree, projectConfig.name, projectConfig);
|
|
90
|
+
|
|
91
|
+
});
|
|
92
|
+
|
|
93
|
+
describe('.eslintrc.json', () => {
|
|
94
|
+
it('should not disable @angular-eslint/prefer-standalone when it is set', async () => {
|
|
95
|
+
writeJson(tree, 'apps/app1/.eslintrc.json', {
|
|
96
|
+
overrides: [
|
|
97
|
+
{
|
|
98
|
+
files: ['*.ts'],
|
|
99
|
+
rules: { '@angular-eslint/prefer-standalone': ['error'] },
|
|
100
|
+
},
|
|
101
|
+
],
|
|
102
|
+
});
|
|
103
|
+
|
|
104
|
+
await migration(tree);
|
|
105
|
+
|
|
106
|
+
expect(tree.read('apps/app1/.eslintrc.json', 'utf8'))
|
|
107
|
+
.toMatchInlineSnapshot(`
|
|
108
|
+
"{
|
|
109
|
+
"overrides": [
|
|
110
|
+
{
|
|
111
|
+
"files": ["*.ts"],
|
|
112
|
+
"rules": {
|
|
113
|
+
"@angular-eslint/prefer-standalone": ["error"]
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
]
|
|
117
|
+
}
|
|
118
|
+
"
|
|
119
|
+
`);
|
|
120
|
+
});
|
|
121
|
+
|
|
122
|
+
it('should not disable @angular-eslint/prefer-standalone when there are multiple overrides for angular eslint and the rule is set in one of them', async () => {
|
|
123
|
+
writeJson(tree, 'apps/app1/.eslintrc.json', {
|
|
124
|
+
overrides: [
|
|
125
|
+
{
|
|
126
|
+
files: ['*.ts'],
|
|
127
|
+
rules: {
|
|
128
|
+
'@angular-eslint/directive-selector': [
|
|
129
|
+
'error',
|
|
130
|
+
{ type: 'attribute', prefix: 'app', style: 'camelCase' },
|
|
131
|
+
],
|
|
132
|
+
},
|
|
133
|
+
},
|
|
134
|
+
{
|
|
135
|
+
files: ['*.ts'],
|
|
136
|
+
rules: { '@angular-eslint/prefer-standalone': ['error'] },
|
|
137
|
+
},
|
|
138
|
+
],
|
|
139
|
+
});
|
|
140
|
+
|
|
141
|
+
await migration(tree);
|
|
142
|
+
|
|
143
|
+
expect(tree.read('apps/app1/.eslintrc.json', 'utf8'))
|
|
144
|
+
.toMatchInlineSnapshot(`
|
|
145
|
+
"{
|
|
146
|
+
"overrides": [
|
|
147
|
+
{
|
|
148
|
+
"files": ["*.ts"],
|
|
149
|
+
"rules": {
|
|
150
|
+
"@angular-eslint/directive-selector": [
|
|
151
|
+
"error",
|
|
152
|
+
{
|
|
153
|
+
"type": "attribute",
|
|
154
|
+
"prefix": "app",
|
|
155
|
+
"style": "camelCase"
|
|
156
|
+
}
|
|
157
|
+
]
|
|
158
|
+
}
|
|
159
|
+
},
|
|
160
|
+
{
|
|
161
|
+
"files": ["*.ts"],
|
|
162
|
+
"rules": {
|
|
163
|
+
"@angular-eslint/prefer-standalone": ["error"]
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
]
|
|
167
|
+
}
|
|
168
|
+
"
|
|
169
|
+
`);
|
|
170
|
+
});
|
|
171
|
+
|
|
172
|
+
it('should disable @angular-eslint/prefer-standalone in an existing override for angular eslint', async () => {
|
|
173
|
+
writeJson(tree, 'apps/app1/.eslintrc.json', {
|
|
174
|
+
overrides: [
|
|
175
|
+
{
|
|
176
|
+
files: ['*.ts'],
|
|
177
|
+
rules: { 'no-unused-vars': 'error' },
|
|
178
|
+
},
|
|
179
|
+
{
|
|
180
|
+
files: ['*.ts'],
|
|
181
|
+
rules: {
|
|
182
|
+
'@angular-eslint/directive-selector': [
|
|
183
|
+
'error',
|
|
184
|
+
{ type: 'attribute', prefix: 'app', style: 'camelCase' },
|
|
185
|
+
],
|
|
186
|
+
},
|
|
187
|
+
},
|
|
188
|
+
],
|
|
189
|
+
});
|
|
190
|
+
|
|
191
|
+
await migration(tree);
|
|
192
|
+
|
|
193
|
+
expect(tree.read('apps/app1/.eslintrc.json', 'utf8'))
|
|
194
|
+
.toMatchInlineSnapshot(`
|
|
195
|
+
"{
|
|
196
|
+
"overrides": [
|
|
197
|
+
{
|
|
198
|
+
"files": ["*.ts"],
|
|
199
|
+
"rules": {
|
|
200
|
+
"no-unused-vars": "error"
|
|
201
|
+
}
|
|
202
|
+
},
|
|
203
|
+
{
|
|
204
|
+
"files": ["*.ts"],
|
|
205
|
+
"rules": {
|
|
206
|
+
"@angular-eslint/directive-selector": [
|
|
207
|
+
"error",
|
|
208
|
+
{
|
|
209
|
+
"type": "attribute",
|
|
210
|
+
"prefix": "app",
|
|
211
|
+
"style": "camelCase"
|
|
212
|
+
}
|
|
213
|
+
],
|
|
214
|
+
"@angular-eslint/prefer-standalone": "off"
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
]
|
|
218
|
+
}
|
|
219
|
+
"
|
|
220
|
+
`);
|
|
221
|
+
});
|
|
222
|
+
|
|
223
|
+
it('should disable @angular-eslint/prefer-standalone in an existing override for ts files', async () => {
|
|
224
|
+
writeJson(tree, 'apps/app1/.eslintrc.json', {
|
|
225
|
+
overrides: [
|
|
226
|
+
{
|
|
227
|
+
files: ['*.ts'],
|
|
228
|
+
rules: { 'no-unused-vars': 'error' },
|
|
229
|
+
},
|
|
230
|
+
],
|
|
231
|
+
});
|
|
232
|
+
|
|
233
|
+
await migration(tree);
|
|
234
|
+
|
|
235
|
+
expect(tree.read('apps/app1/.eslintrc.json', 'utf8'))
|
|
236
|
+
.toMatchInlineSnapshot(`
|
|
237
|
+
"{
|
|
238
|
+
"overrides": [
|
|
239
|
+
{
|
|
240
|
+
"files": ["*.ts"],
|
|
241
|
+
"rules": {
|
|
242
|
+
"no-unused-vars": "error",
|
|
243
|
+
"@angular-eslint/prefer-standalone": "off"
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
]
|
|
247
|
+
}
|
|
248
|
+
"
|
|
249
|
+
`);
|
|
250
|
+
});
|
|
251
|
+
|
|
252
|
+
it('should disable @angular-eslint/prefer-standalone in a new override', async () => {
|
|
253
|
+
writeJson(tree, 'apps/app1/.eslintrc.json', {
|
|
254
|
+
overrides: [
|
|
255
|
+
{
|
|
256
|
+
files: ['*.html'],
|
|
257
|
+
rules: { 'some-rule-for-html': 'error' },
|
|
258
|
+
},
|
|
259
|
+
],
|
|
260
|
+
});
|
|
261
|
+
|
|
262
|
+
await migration(tree);
|
|
263
|
+
|
|
264
|
+
expect(tree.read('apps/app1/.eslintrc.json', 'utf8'))
|
|
265
|
+
.toMatchInlineSnapshot(`
|
|
266
|
+
"{
|
|
267
|
+
"overrides": [
|
|
268
|
+
{
|
|
269
|
+
"files": ["*.html"],
|
|
270
|
+
"rules": {
|
|
271
|
+
"some-rule-for-html": "error"
|
|
272
|
+
}
|
|
273
|
+
},
|
|
274
|
+
{
|
|
275
|
+
"files": ["*.ts"],
|
|
276
|
+
"rules": {
|
|
277
|
+
"@angular-eslint/prefer-standalone": "off"
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
]
|
|
281
|
+
}
|
|
282
|
+
"
|
|
283
|
+
`);
|
|
284
|
+
});
|
|
285
|
+
|
|
286
|
+
});
|
|
287
|
+
|
|
288
|
+
describe('flat config', () => {
|
|
289
|
+
it('should not disable @angular-eslint/prefer-standalone when it is set', async () => {
|
|
290
|
+
tree.write('eslint.config.js', 'module.exports = [];');
|
|
291
|
+
tree.write(
|
|
292
|
+
'apps/app1/eslint.config.js',
|
|
293
|
+
`module.exports = [
|
|
294
|
+
{
|
|
295
|
+
files: ['*.ts'],
|
|
296
|
+
rules: { '@angular-eslint/prefer-standalone': ['error'] },
|
|
297
|
+
},
|
|
298
|
+
];
|
|
299
|
+
`
|
|
300
|
+
);
|
|
301
|
+
|
|
302
|
+
await migration(tree);
|
|
303
|
+
|
|
304
|
+
expect(tree.read('apps/app1/eslint.config.js', 'utf8'))
|
|
305
|
+
.toMatchInlineSnapshot(`
|
|
306
|
+
"module.exports = [
|
|
307
|
+
{
|
|
308
|
+
files: ['*.ts'],
|
|
309
|
+
rules: { '@angular-eslint/prefer-standalone': ['error'] },
|
|
310
|
+
},
|
|
311
|
+
];
|
|
312
|
+
"
|
|
313
|
+
`);
|
|
314
|
+
});
|
|
315
|
+
|
|
316
|
+
it('should not disable @angular-eslint/prefer-standalone when there are multiple overrides for angular eslint and the rule is set in one of them', async () => {
|
|
317
|
+
tree.write('eslint.config.js', 'module.exports = [];');
|
|
318
|
+
tree.write(
|
|
319
|
+
'apps/app1/eslint.config.js',
|
|
320
|
+
`module.exports = [
|
|
321
|
+
{
|
|
322
|
+
files: ['*.ts'],
|
|
323
|
+
rules: {
|
|
324
|
+
'@angular-eslint/directive-selector': [
|
|
325
|
+
'error',
|
|
326
|
+
{ type: 'attribute', prefix: 'app', style: 'camelCase' },
|
|
327
|
+
],
|
|
328
|
+
},
|
|
329
|
+
},
|
|
330
|
+
{
|
|
331
|
+
files: ['*.ts'],
|
|
332
|
+
rules: { '@angular-eslint/prefer-standalone': ['error'] },
|
|
333
|
+
},
|
|
334
|
+
];
|
|
335
|
+
`
|
|
336
|
+
);
|
|
337
|
+
|
|
338
|
+
await migration(tree);
|
|
339
|
+
|
|
340
|
+
expect(tree.read('apps/app1/eslint.config.js', 'utf8'))
|
|
341
|
+
.toMatchInlineSnapshot(`
|
|
342
|
+
"module.exports = [
|
|
343
|
+
{
|
|
344
|
+
files: ['*.ts'],
|
|
345
|
+
rules: {
|
|
346
|
+
'@angular-eslint/directive-selector': [
|
|
347
|
+
'error',
|
|
348
|
+
{ type: 'attribute', prefix: 'app', style: 'camelCase' },
|
|
349
|
+
],
|
|
350
|
+
},
|
|
351
|
+
},
|
|
352
|
+
{
|
|
353
|
+
files: ['*.ts'],
|
|
354
|
+
rules: { '@angular-eslint/prefer-standalone': ['error'] },
|
|
355
|
+
},
|
|
356
|
+
];
|
|
357
|
+
"
|
|
358
|
+
`);
|
|
359
|
+
});
|
|
360
|
+
|
|
361
|
+
it('should disable @angular-eslint/prefer-standalone in an existing override for angular eslint', async () => {
|
|
362
|
+
tree.write('eslint.config.js', 'module.exports = [];');
|
|
363
|
+
tree.write(
|
|
364
|
+
'apps/app1/eslint.config.js',
|
|
365
|
+
`module.exports = [
|
|
366
|
+
{
|
|
367
|
+
files: ['*.ts'],
|
|
368
|
+
rules: { 'no-unused-vars': 'error' },
|
|
369
|
+
},
|
|
370
|
+
{
|
|
371
|
+
files: ['*.ts'],
|
|
372
|
+
rules: {
|
|
373
|
+
'@angular-eslint/directive-selector': [
|
|
374
|
+
'error',
|
|
375
|
+
{ type: 'attribute', prefix: 'app', style: 'camelCase' },
|
|
376
|
+
],
|
|
377
|
+
},
|
|
378
|
+
},
|
|
379
|
+
];
|
|
380
|
+
`
|
|
381
|
+
);
|
|
382
|
+
|
|
383
|
+
await migration(tree);
|
|
384
|
+
|
|
385
|
+
expect(tree.read('apps/app1/eslint.config.js', 'utf8'))
|
|
386
|
+
.toMatchInlineSnapshot(`
|
|
387
|
+
"module.exports = [
|
|
388
|
+
{
|
|
389
|
+
files: ['*.ts'],
|
|
390
|
+
rules: { 'no-unused-vars': 'error' },
|
|
391
|
+
},
|
|
392
|
+
{
|
|
393
|
+
files: ['**/*.ts'],
|
|
394
|
+
rules: {
|
|
395
|
+
'@angular-eslint/directive-selector': [
|
|
396
|
+
'error',
|
|
397
|
+
{
|
|
398
|
+
type: 'attribute',
|
|
399
|
+
prefix: 'app',
|
|
400
|
+
style: 'camelCase',
|
|
401
|
+
},
|
|
402
|
+
],
|
|
403
|
+
'@angular-eslint/prefer-standalone': 'off',
|
|
404
|
+
},
|
|
405
|
+
},
|
|
406
|
+
];
|
|
407
|
+
"
|
|
408
|
+
`);
|
|
409
|
+
});
|
|
410
|
+
|
|
411
|
+
it('should disable @angular-eslint/prefer-standalone in an existing override for ts files', async () => {
|
|
412
|
+
tree.write('eslint.config.js', 'module.exports = [];');
|
|
413
|
+
tree.write(
|
|
414
|
+
'apps/app1/eslint.config.js',
|
|
415
|
+
`module.exports = [
|
|
416
|
+
{
|
|
417
|
+
files: ['*.ts'],
|
|
418
|
+
rules: { 'no-unused-vars': 'error' },
|
|
419
|
+
},
|
|
420
|
+
];
|
|
421
|
+
`
|
|
422
|
+
);
|
|
423
|
+
|
|
424
|
+
await migration(tree);
|
|
425
|
+
|
|
426
|
+
expect(tree.read('apps/app1/eslint.config.js', 'utf8'))
|
|
427
|
+
.toMatchInlineSnapshot(`
|
|
428
|
+
"module.exports = [
|
|
429
|
+
{
|
|
430
|
+
files: ['**/*.ts'],
|
|
431
|
+
rules: {
|
|
432
|
+
'no-unused-vars': 'error',
|
|
433
|
+
'@angular-eslint/prefer-standalone': 'off',
|
|
434
|
+
},
|
|
435
|
+
},
|
|
436
|
+
];
|
|
437
|
+
"
|
|
438
|
+
`);
|
|
439
|
+
});
|
|
440
|
+
|
|
441
|
+
it('should disable @angular-eslint/prefer-standalone in a new override', async () => {
|
|
442
|
+
tree.write('eslint.config.js', 'module.exports = [];');
|
|
443
|
+
tree.write(
|
|
444
|
+
'apps/app1/eslint.config.js',
|
|
445
|
+
`module.exports = [
|
|
446
|
+
{
|
|
447
|
+
files: ['*.html'],
|
|
448
|
+
rules: { 'some-rule-for-html': 'error' },
|
|
449
|
+
},
|
|
450
|
+
];
|
|
451
|
+
`
|
|
452
|
+
);
|
|
453
|
+
|
|
454
|
+
await migration(tree);
|
|
455
|
+
|
|
456
|
+
expect(tree.read('apps/app1/eslint.config.js', 'utf8'))
|
|
457
|
+
.toMatchInlineSnapshot(`
|
|
458
|
+
"module.exports = [
|
|
459
|
+
{
|
|
460
|
+
files: ['*.html'],
|
|
461
|
+
rules: { 'some-rule-for-html': 'error' },
|
|
462
|
+
},
|
|
463
|
+
{
|
|
464
|
+
files: ['**/*.ts'],
|
|
465
|
+
rules: {
|
|
466
|
+
'@angular-eslint/prefer-standalone': 'off',
|
|
467
|
+
},
|
|
468
|
+
},
|
|
469
|
+
];
|
|
470
|
+
"
|
|
471
|
+
`);
|
|
472
|
+
});
|
|
473
|
+
|
|
474
|
+
});
|
|
475
|
+
});
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
#### Migrate Module Federation Imports to New Package
|
|
2
|
+
|
|
3
|
+
Update the ModuleFederationConfig imports to use @nx/module-federation.
|
|
4
|
+
|
|
5
|
+
#### Sample Code Changes
|
|
6
|
+
|
|
7
|
+
Update import paths for ModuleFederationConfig.
|
|
8
|
+
|
|
9
|
+
##### Before
|
|
10
|
+
|
|
11
|
+
```js title="apps/shell/webpack.config.js"
|
|
12
|
+
import { ModuleFederationConfig } from '@nx/webpack';
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
##### After
|
|
16
|
+
|
|
17
|
+
```js title="apps/shell/webpack.config.js"
|
|
18
|
+
import { ModuleFederationConfig } from '@nx/module-federation';
|
|
19
|
+
```
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
#### Migrate withModuleFederation Import to New Package
|
|
2
|
+
|
|
3
|
+
Update the withModuleFederation import to use @nx/module-federation/webpack.
|
|
4
|
+
|
|
5
|
+
#### Sample Code Changes
|
|
6
|
+
|
|
7
|
+
Update import paths for `withModuleFederation` and `withModuleFederationForSSR`.
|
|
8
|
+
|
|
9
|
+
##### Before
|
|
10
|
+
|
|
11
|
+
```ts title="apps/shell/webpack.config.ts"
|
|
12
|
+
import {
|
|
13
|
+
withModuleFederation,
|
|
14
|
+
withModuleFederationForSSR,
|
|
15
|
+
} from '@nx/angular/module-federation';
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
##### After
|
|
19
|
+
|
|
20
|
+
```ts title="apps/shell/webpack.config.ts"
|
|
21
|
+
import {
|
|
22
|
+
withModuleFederation,
|
|
23
|
+
withModuleFederationForSSR,
|
|
24
|
+
} from '@nx/module-federation/angular';
|
|
25
|
+
```
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
#### Remove Angular ESLint Rules
|
|
2
|
+
|
|
3
|
+
Remove Angular ESLint rules that were removed in v19.0.0.
|
|
4
|
+
|
|
5
|
+
#### Sample Code Changes
|
|
6
|
+
|
|
7
|
+
Removes `@angular-eslint/no-host-metadata-property`, `@angular-eslint/sort-ngmodule-metadata-arrays` and `@angular-eslint/prefer-standalone-component` from any ESLint config file. Files to be searched include `.eslintrc.json`, `.eslintrc.base.json`, `.eslint.config.js` and `.eslint.config.base.js`.
|
|
8
|
+
|
|
9
|
+
##### Before
|
|
10
|
+
|
|
11
|
+
```json title="apps/app1/.eslintrc.json"
|
|
12
|
+
{
|
|
13
|
+
"overrides": [
|
|
14
|
+
{
|
|
15
|
+
"files": ["*.ts"],
|
|
16
|
+
"rules": {
|
|
17
|
+
"@angular-eslint/no-host-metadata-property": ["error"],
|
|
18
|
+
"@angular-eslint/sort-ngmodule-metadata-arrays": ["error"],
|
|
19
|
+
"@angular-eslint/prefer-standalone-component": ["error"]
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
]
|
|
23
|
+
}
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
##### After
|
|
27
|
+
|
|
28
|
+
```json title="apps/app1/.eslintrc.json"
|
|
29
|
+
{
|
|
30
|
+
"overrides": [
|
|
31
|
+
{
|
|
32
|
+
"files": ["*.ts"],
|
|
33
|
+
"rules": {}
|
|
34
|
+
}
|
|
35
|
+
]
|
|
36
|
+
}
|
|
37
|
+
```
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
#### Remove tailwindConfig from ng-packagr Executors
|
|
2
|
+
|
|
3
|
+
Remove the deprecated 'tailwindConfig' option from ng-packagr executors. Tailwind CSS configurations located at the project or workspace root will be picked up automatically.
|
|
4
|
+
|
|
5
|
+
#### Sample Code Changes
|
|
6
|
+
|
|
7
|
+
Remove `tailwindConfig` from the `@nx/angular:ng-packagr-lite` or `@nx/angular:package` executor options in project configuration.
|
|
8
|
+
|
|
9
|
+
##### Before
|
|
10
|
+
|
|
11
|
+
```json title="libs/my-lib/project.json"
|
|
12
|
+
{
|
|
13
|
+
"targets": {
|
|
14
|
+
"build": {
|
|
15
|
+
"executor": "@nx/angular:ng-packagr-lite",
|
|
16
|
+
"options": {
|
|
17
|
+
"project": "libs/lib1/ng-package.json",
|
|
18
|
+
"tailwindConfig": "libs/lib1/tailwind.config.js"
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
##### After
|
|
26
|
+
|
|
27
|
+
```json title="libs/my-lib/project.json"
|
|
28
|
+
{
|
|
29
|
+
"targets": {
|
|
30
|
+
"build": {
|
|
31
|
+
"executor": "@nx/angular:ng-packagr-lite",
|
|
32
|
+
"options": {
|
|
33
|
+
"project": "libs/lib1/ng-package.json"
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
Remove `tailwindConfig` from the `@nx/angular:ng-packagr-lite` or `@nx/angular:package` executor target defaults in `nx.json`.
|
|
41
|
+
|
|
42
|
+
##### Before
|
|
43
|
+
|
|
44
|
+
```json title="nx.json"
|
|
45
|
+
{
|
|
46
|
+
"targetDefaults": {
|
|
47
|
+
"@nx/angular:ng-packagr-lite": {
|
|
48
|
+
"options": {
|
|
49
|
+
"project": "{projectRoot}/ng-package.json",
|
|
50
|
+
"tailwindConfig": "{projectRoot}/tailwind.config.js"
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
##### After
|
|
58
|
+
|
|
59
|
+
```json title="nx.json"
|
|
60
|
+
{
|
|
61
|
+
"targetDefaults": {
|
|
62
|
+
"@nx/angular:ng-packagr-lite": {
|
|
63
|
+
"options": {
|
|
64
|
+
"project": "{projectRoot}/ng-package.json"
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
```
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
#### Update `@angular/cli` to `~19.0.0`
|
|
2
|
+
|
|
3
|
+
Update the version of the Angular CLI if it is specified in `package.json`
|
|
4
|
+
|
|
5
|
+
#### Sample Code Changes
|
|
6
|
+
|
|
7
|
+
Update in `devDependencies`:
|
|
8
|
+
|
|
9
|
+
##### Before
|
|
10
|
+
|
|
11
|
+
```json title="package.json"
|
|
12
|
+
{
|
|
13
|
+
"devDependencies": {
|
|
14
|
+
"@angular/cli": "~13.3.0"
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
##### After
|
|
20
|
+
|
|
21
|
+
```json title="package.json"
|
|
22
|
+
{
|
|
23
|
+
"devDependencies": {
|
|
24
|
+
"@angular/cli": "~19.0.0"
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
Update in `dependencies`:
|
|
30
|
+
|
|
31
|
+
##### Before
|
|
32
|
+
|
|
33
|
+
```json title="package.json"
|
|
34
|
+
{
|
|
35
|
+
"dependencies": {
|
|
36
|
+
"@angular/cli": "~13.3.0"
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
##### After
|
|
42
|
+
|
|
43
|
+
```json title="package.json"
|
|
44
|
+
{
|
|
45
|
+
"dependencies": {
|
|
46
|
+
"@angular/cli": "~19.0.0"
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
```
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
#### Update Angular SSR Imports to Use Node Entry Point
|
|
2
|
+
|
|
3
|
+
Update '@angular/ssr' import paths to use the new '/node' entry point when 'CommonEngine' is detected.
|
|
4
|
+
|
|
5
|
+
#### Sample Code Changes
|
|
6
|
+
|
|
7
|
+
Update import paths for SSR CommonEngine properties to use `@angular/ssr/node`.
|
|
8
|
+
|
|
9
|
+
##### Before
|
|
10
|
+
|
|
11
|
+
```ts title="apps/app1/server.ts"
|
|
12
|
+
import { CommonEngine } from '@angular/ssr';
|
|
13
|
+
import type {
|
|
14
|
+
CommonEngineOptions,
|
|
15
|
+
CommonEngineRenderOptions,
|
|
16
|
+
} from '@angular/ssr';
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
##### After
|
|
20
|
+
|
|
21
|
+
```ts title="apps/app1/server.ts"
|
|
22
|
+
import { CommonEngine } from '@angular/ssr/node';
|
|
23
|
+
import type {
|
|
24
|
+
CommonEngineOptions,
|
|
25
|
+
CommonEngineRenderOptions,
|
|
26
|
+
} from '@angular/ssr/node';
|
|
27
|
+
```
|