Skip to content

Commit ffbf317

Browse files
committed
feat(nf): compatibility with @angular/build package
1 parent d348e37 commit ffbf317

File tree

5 files changed

+73
-47
lines changed

5 files changed

+73
-47
lines changed

libs/mf/src/schematics/init-webpack/schematic.ts

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,16 @@
11
import {
2+
apply,
23
chain,
4+
mergeWith,
5+
move,
36
Rule,
7+
template,
48
Tree,
59
url,
6-
apply,
7-
mergeWith,
8-
template,
9-
move,
1010
} from '@angular-devkit/schematics';
1111

12-
import { NodePackageInstallTask } from '@angular-devkit/schematics/tasks';
1312
import { strings } from '@angular-devkit/core';
13+
import { NodePackageInstallTask } from '@angular-devkit/schematics/tasks';
1414
import * as json5 from 'json5';
1515
import * as semver from 'semver';
1616

@@ -234,7 +234,8 @@ export default function config(options: MfSchematicSchema): Rule {
234234

235235
const buildConfig = projectConfig?.architect?.build;
236236
const isApplicationBuilder =
237-
buildConfig?.builder === '@angular-devkit/build-angular:application';
237+
buildConfig?.builder === '@angular-devkit/build-angular:application' ||
238+
buildConfig?.builder === '@angular/build:application';
238239

239240
if (isApplicationBuilder && !options.skipConfirmation) {
240241
console.warn(

libs/native-federation/src/builders/build/builder.ts

Lines changed: 22 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,53 +1,52 @@
1-
import * as path from 'path';
21
import * as fs from 'fs';
2+
import { existsSync, mkdirSync, rmSync } from 'fs';
33
import * as mrmime from 'mrmime';
4+
import * as path from 'path';
45

5-
import { buildApplication, ApplicationBuilderOptions } from '@angular/build';
6+
import { ApplicationBuilderOptions, buildApplication } from '@angular/build';
67
import {
7-
serveWithVite,
88
buildApplicationInternal,
9+
serveWithVite,
910
} from '@angular/build/private';
1011

1112
import {
1213
BuilderContext,
1314
BuilderOutput,
1415
createBuilder,
16+
targetFromTargetString,
1517
} from '@angular-devkit/architect';
1618

1719
import { normalizeOptions } from '@angular-devkit/build-angular/src/builders/dev-server/options';
1820

19-
import { setLogLevel, logger } from '@softarc/native-federation/build';
20-
21-
import { FederationOptions } from '@softarc/native-federation/build';
22-
import { setBuildAdapter } from '@softarc/native-federation/build';
21+
import {
22+
buildForFederation,
23+
FederationOptions,
24+
getExternals,
25+
loadFederationConfig,
26+
logger,
27+
setBuildAdapter,
28+
setLogLevel,
29+
} from '@softarc/native-federation/build';
2330
import {
2431
createAngularBuildAdapter,
2532
setMemResultHandler,
2633
} from '../../utils/angular-esbuild-adapter';
27-
import { getExternals } from '@softarc/native-federation/build';
28-
import { loadFederationConfig } from '@softarc/native-federation/build';
29-
import { buildForFederation } from '@softarc/native-federation/build';
30-
import { targetFromTargetString } from '@angular-devkit/architect';
3134

3235
import { NfBuilderSchema } from './schema';
3336
import { RebuildHubs } from '../../utils/rebuild-events';
3437
import { updateScriptTags } from '../../utils/updateIndexHtml';
35-
import { existsSync, mkdirSync, rmSync } from 'fs';
38+
import { JsonObject } from '@angular-devkit/core';
3639
import {
3740
EsBuildResult,
3841
MemResults,
3942
NgCliAssetResult,
4043
} from '../../utils/mem-resuts';
41-
import { JsonObject } from '@angular-devkit/core';
4244
import { createSharedMappingsPlugin } from '../../utils/shared-mappings-plugin';
4345
// import { NextHandleFunction } from 'vite';
44-
import { PluginBuild } from 'esbuild';
4546
import { FederationInfo } from '@softarc/native-federation-runtime';
46-
import {
47-
getI18nConfig,
48-
I18nConfig,
49-
translateFederationArtefacts,
50-
} from '../../utils/i18n';
47+
import { PluginBuild } from 'esbuild';
48+
import { checkAngularBuildApplicationBuilder } from '../../utils/check-builder';
49+
import { getI18nConfig, translateFederationArtefacts } from '../../utils/i18n';
5150

5251
function _buildApplication(options, context, pluginsOrExtensions) {
5352
let extensions;
@@ -136,10 +135,6 @@ export async function* runBuilder(
136135

137136
setLogLevel(options.verbose ? 'verbose' : 'info');
138137

139-
if (!options.outputPath) {
140-
options.outputPath = `dist/${context.target.project}`;
141-
}
142-
143138
const outputPath = options.outputPath;
144139
const outputOptions: Required<
145140
Exclude<ApplicationBuilderOptions['outputPath'], string>
@@ -260,10 +255,7 @@ export async function* runBuilder(
260255
try {
261256
federationResult = await buildForFederation(config, fedOptions, externals);
262257
} catch (e) {
263-
console.error(e);
264-
if (!watch) {
265-
process.exit(1);
266-
}
258+
process.exit(1);
267259
}
268260

269261
const hasLocales = i18n?.locales && Object.keys(i18n.locales).length > 0;
@@ -278,7 +270,9 @@ export async function* runBuilder(
278270

279271
options.deleteOutputPath = false;
280272

281-
const appBuilderName = '@angular-devkit/build-angular:application';
273+
const appBuilderName = checkAngularBuildApplicationBuilder()
274+
? '@angular/build:application'
275+
: '@angular-devkit/build-angular:application';
282276

283277
const builderRun = runServer
284278
? serveWithVite(

libs/native-federation/src/schematics/appbuilder/schematic.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import { Rule, Tree } from '@angular-devkit/schematics';
33
import { MfSchematicSchema } from './schema';
44

55
import * as path from 'path';
6+
import { checkAngularBuildApplicationBuilder } from '../../utils/check-builder';
67

78
type NormalizedOptions = {
89
polyfills: string;
@@ -41,7 +42,9 @@ function updateWorkspaceConfig(
4142

4243
if (projectConfig.architect.esbuild) {
4344
projectConfig.architect.esbuild.builder =
44-
'@angular-devkit/build-angular:application';
45+
checkAngularBuildApplicationBuilder()
46+
? '@angular/build:application'
47+
: '@angular-devkit/build-angular:application';
4548
projectConfig.architect.esbuild.options.browser =
4649
projectConfig.architect.esbuild.options.main;
4750
delete projectConfig.architect.esbuild.options.main;

libs/native-federation/src/schematics/init/schematic.ts

Lines changed: 18 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,17 @@
11
import {
2-
chain,
3-
Rule,
4-
Tree,
5-
url,
62
apply,
3+
chain,
74
mergeWith,
8-
template,
95
move,
106
noop,
7+
Rule,
8+
template,
9+
Tree,
10+
url,
1111
} from '@angular-devkit/schematics';
1212

13-
import { NodePackageInstallTask } from '@angular-devkit/schematics/tasks';
1413
import { strings } from '@angular-devkit/core';
14+
import { NodePackageInstallTask } from '@angular-devkit/schematics/tasks';
1515
import { MfSchematicSchema } from './schema';
1616

1717
import {
@@ -26,6 +26,7 @@ import {
2626
} from '@schematics/angular/utility/dependencies';
2727

2828
import * as path from 'path';
29+
import { checkAngularBuildApplicationBuilder } from '../../utils/check-builder';
2930

3031
const SSR_VERSION = '^2.0.10';
3132

@@ -230,11 +231,16 @@ function updateWorkspaceConfig(
230231

231232
const originalBuild = projectConfig.architect.build;
232233

233-
if (originalBuild.builder !== '@angular-devkit/build-angular:application') {
234+
if (
235+
originalBuild.builder !== '@angular-devkit/build-angular:application' ||
236+
originalBuild.builder !== '@angular/build:application'
237+
) {
234238
console.log(
235239
'Switching project to the application builder using esbuild ...'
236240
);
237-
originalBuild.builder = '@angular-devkit/build-angular:application';
241+
originalBuild.builder = checkAngularBuildApplicationBuilder()
242+
? '@angular/build:application'
243+
: '@angular-devkit/build-angular:application';
238244
delete originalBuild.configurations?.development?.buildOptimizer;
239245
delete originalBuild.configurations?.development?.vendorChunk;
240246
}
@@ -520,7 +526,7 @@ function makeServerAsync(
520526

521527
const cors = `import { createRequire } from "module";
522528
const require = createRequire(import.meta.url);
523-
const cors = require("cors");
529+
const cors = require("cors");
524530
`;
525531
const mainContent = tree.read(server).toString('utf8');
526532
const updatedContent = (cors + mainContent)
@@ -549,7 +555,7 @@ console.log('Starting SSR for Shell');
549555
remotesOrManifestUrl: '../browser/federation.manifest.json',
550556
relBundlePath: '../browser/',
551557
});
552-
558+
553559
await import('./bootstrap-server');
554560
555561
})();
@@ -566,7 +572,7 @@ console.log('Starting SSR for Shell');
566572
remotesOrManifestUrl: ${manifest},
567573
relBundlePath: '../browser/',
568574
});
569-
575+
570576
await import('./bootstrap-server');
571577
572578
})();
@@ -579,7 +585,7 @@ console.log('Starting SSR for Shell');
579585
await initNodeFederation({
580586
relBundlePath: '../browser/'
581587
});
582-
588+
583589
await import('./bootstrap-server');
584590
585591
})();
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
import { existsSync } from 'fs';
2+
import { resolve } from 'path';
3+
4+
/**
5+
* Since Angular 16, the Angular CLI uses the new @angular/build package
6+
* Currently the @angular/build package is not installed by default
7+
* However in the next version of Angular (v20), it will replace the @angular-devkit/build-angular package
8+
*
9+
* This functions checks if the @angular/build package is installed to insure a compatibility with the next version of Angular
10+
* and insure also that if people migrate on Angular 20 and don't change the builder, it will not break the compatibility with this package in v20
11+
*
12+
* @returns true if the Angular build package is installed
13+
*/
14+
export const checkAngularBuildApplicationBuilder = () => {
15+
const pathAngularBuildPackage = resolve(
16+
process.cwd(),
17+
'node_modules',
18+
'@angular/build'
19+
);
20+
21+
return existsSync(pathAngularBuildPackage);
22+
};

0 commit comments

Comments
 (0)