Skip to content

Commit 0082081

Browse files
authored
feat(angular): add convert-to-rspack generator (#29860)
## Current Behavior Nx currently does not offer an automated method for switching from an Angular Webpack build to an Angular Rspack build. ## Expected Behavior Provide a generator `convert-to-rspack` in `@nx/angular` that will allow conversion from an Angular Webpack build to an Angular Rspack build. Usage: `nx g convert-to-rspack --project=myapp` ## TODO - [x] handle more builder options - [x] take existing custom webpack configs and migrate into the rspack config that is created
1 parent f40873f commit 0082081

21 files changed

+1503
-7
lines changed

docs/generated/manifests/menus.json

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7314,6 +7314,14 @@
73147314
"isExternal": false,
73157315
"disableCollapsible": false
73167316
},
7317+
{
7318+
"id": "convert-to-rspack",
7319+
"path": "/nx-api/angular/generators/convert-to-rspack",
7320+
"name": "convert-to-rspack",
7321+
"children": [],
7322+
"isExternal": false,
7323+
"disableCollapsible": false
7324+
},
73177325
{
73187326
"id": "directive",
73197327
"path": "/nx-api/angular/generators/directive",

docs/generated/manifests/nx-api.json

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -208,6 +208,15 @@
208208
"path": "/nx-api/angular/generators/convert-to-application-executor",
209209
"type": "generator"
210210
},
211+
"/nx-api/angular/generators/convert-to-rspack": {
212+
"description": "Converts Angular Webpack projects to use Rspack.",
213+
"file": "generated/packages/angular/generators/convert-to-rspack.json",
214+
"hidden": false,
215+
"name": "convert-to-rspack",
216+
"originalFilePath": "/packages/angular/src/generators/convert-to-rspack/schema.json",
217+
"path": "/nx-api/angular/generators/convert-to-rspack",
218+
"type": "generator"
219+
},
211220
"/nx-api/angular/generators/directive": {
212221
"description": "Generate an Angular directive.",
213222
"file": "generated/packages/angular/generators/directive.json",

docs/generated/packages-metadata.json

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -203,6 +203,15 @@
203203
"path": "angular/generators/convert-to-application-executor",
204204
"type": "generator"
205205
},
206+
{
207+
"description": "Converts Angular Webpack projects to use Rspack.",
208+
"file": "generated/packages/angular/generators/convert-to-rspack.json",
209+
"hidden": false,
210+
"name": "convert-to-rspack",
211+
"originalFilePath": "/packages/angular/src/generators/convert-to-rspack/schema.json",
212+
"path": "angular/generators/convert-to-rspack",
213+
"type": "generator"
214+
},
206215
{
207216
"description": "Generate an Angular directive.",
208217
"file": "generated/packages/angular/generators/directive.json",
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
{
2+
"name": "convert-to-rspack",
3+
"factory": "./src/generators/convert-to-rspack/convert-to-rspack",
4+
"schema": {
5+
"$schema": "https://json-schema.org/schema",
6+
"$id": "GeneratorNxApp",
7+
"title": "Creates an Angular application.",
8+
"description": "Creates an Angular application.",
9+
"type": "object",
10+
"cli": "nx",
11+
"properties": {
12+
"project": {
13+
"type": "string",
14+
"aliases": ["name", "projectName"],
15+
"description": "Project for which to convert to rspack.",
16+
"$default": { "$source": "argv", "index": 0 },
17+
"x-priority": "important"
18+
},
19+
"skipFormat": {
20+
"description": "Skip formatting files.",
21+
"type": "boolean",
22+
"default": false
23+
},
24+
"skipInstall": {
25+
"description": "Skip installing dependencies.",
26+
"type": "boolean",
27+
"default": false
28+
}
29+
},
30+
"presets": []
31+
},
32+
"description": "Converts Angular Webpack projects to use Rspack.",
33+
"implementation": "/packages/angular/src/generators/convert-to-rspack/convert-to-rspack.ts",
34+
"aliases": [],
35+
"hidden": false,
36+
"path": "/packages/angular/src/generators/convert-to-rspack/schema.json",
37+
"type": "generator"
38+
}

docs/shared/reference/sitemap.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -366,6 +366,7 @@
366366
- [component-story](/nx-api/angular/generators/component-story)
367367
- [component-test](/nx-api/angular/generators/component-test)
368368
- [convert-to-application-executor](/nx-api/angular/generators/convert-to-application-executor)
369+
- [convert-to-rspack](/nx-api/angular/generators/convert-to-rspack)
369370
- [directive](/nx-api/angular/generators/directive)
370371
- [federate-module](/nx-api/angular/generators/federate-module)
371372
- [init](/nx-api/angular/generators/init)

e2e/angular/src/misc.test.ts

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -144,3 +144,25 @@ describe('Move Angular Project', () => {
144144
expect(lib2File).toContain(`extends ${newModule}`);
145145
});
146146
});
147+
148+
describe('Convert Angular Webpack Project to Rspack', () => {
149+
let proj: string;
150+
let app1: string;
151+
152+
beforeAll(() => {
153+
proj = newProject({ packages: ['@nx/angular'] });
154+
app1 = uniq('app1');
155+
runCLI(
156+
`generate @nx/angular:app ${app1} --bundler=webpack --no-interactive`
157+
);
158+
});
159+
160+
afterAll(() => cleanupProject());
161+
162+
it('should convert an Angular Webpack project to Rspack', async () => {
163+
runCLI(`generate @nx/angular:convert-to-rspack --project=${app1}`);
164+
const buildOutput = runCLI(`build ${app1}`);
165+
expect(buildOutput).toContain('rspack build');
166+
expect(buildOutput).toContain('browser compiled');
167+
});
168+
});

packages/angular/generators.json

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,11 @@
3838
"schema": "./src/generators/convert-to-application-executor/schema.json",
3939
"description": "Converts projects to use the `@nx/angular:application` executor or the `@angular-devkit/build-angular:application` builder."
4040
},
41+
"convert-to-rspack": {
42+
"factory": "./src/generators/convert-to-rspack/convert-to-rspack",
43+
"schema": "./src/generators/convert-to-rspack/schema.json",
44+
"description": "Converts Angular Webpack projects to use Rspack."
45+
},
4146
"directive": {
4247
"factory": "./src/generators/directive/directive",
4348
"schema": "./src/generators/directive/schema.json",

packages/angular/package.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@
5050
"dependencies": {
5151
"@phenomnomnominal/tsquery": "~5.0.1",
5252
"@typescript-eslint/type-utils": "^8.0.0",
53+
"enquirer": "~2.3.6",
5354
"picocolors": "^1.1.0",
5455
"magic-string": "~0.30.2",
5556
"minimatch": "9.0.3",
@@ -60,6 +61,7 @@
6061
"@nx/js": "file:../js",
6162
"@nx/eslint": "file:../eslint",
6263
"@nx/webpack": "file:../webpack",
64+
"@nx/rspack": "file:../rspack",
6365
"@nx/module-federation": "file:../module-federation",
6466
"@nx/web": "file:../web",
6567
"@nx/workspace": "file:../workspace",

0 commit comments

Comments
 (0)