Skip to content

feat(nf): compatibility with @angular/build package #806

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 1 commit into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 7 additions & 6 deletions libs/mf/src/schematics/init-webpack/schematic.ts
Original file line number Diff line number Diff line change
@@ -1,16 +1,16 @@
import {
apply,
chain,
mergeWith,
move,
Rule,
template,
Tree,
url,
apply,
mergeWith,
template,
move,
} from '@angular-devkit/schematics';

import { NodePackageInstallTask } from '@angular-devkit/schematics/tasks';
import { strings } from '@angular-devkit/core';
import { NodePackageInstallTask } from '@angular-devkit/schematics/tasks';
import * as json5 from 'json5';
import * as semver from 'semver';

Expand Down Expand Up @@ -232,7 +232,8 @@ export default function config(options: MfSchematicSchema): Rule {

const buildConfig = projectConfig?.architect?.build;
const isApplicationBuilder =
buildConfig?.builder === '@angular-devkit/build-angular:application';
buildConfig?.builder === '@angular-devkit/build-angular:application' ||
buildConfig?.builder === '@angular/build:application';

if (isApplicationBuilder && !options.skipConfirmation) {
console.warn(
Expand Down
45 changes: 23 additions & 22 deletions libs/native-federation/src/builders/build/builder.ts
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
import * as path from 'path';
import * as fs from 'fs';
import * as mrmime from 'mrmime';
import * as path from 'path';

import { buildApplication, ApplicationBuilderOptions } from '@angular/build';
import { ApplicationBuilderOptions, buildApplication } from '@angular/build';
import {
serveWithVite,
buildApplicationInternal,
serveWithVite,
} from '@angular/build/private';

import {
Expand All @@ -16,39 +16,38 @@ import {

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

import { setLogLevel, logger } from '@softarc/native-federation/build';
import { logger, setLogLevel } from '@softarc/native-federation/build';

import { FederationOptions } from '@softarc/native-federation/build';
import { setBuildAdapter } from '@softarc/native-federation/build';
import { targetFromTargetString } from '@angular-devkit/architect';
import {
buildForFederation,
FederationOptions,
getExternals,
loadFederationConfig,
setBuildAdapter,
} from '@softarc/native-federation/build';
import {
createAngularBuildAdapter,
setMemResultHandler,
} from '../../utils/angular-esbuild-adapter';
import { getExternals } from '@softarc/native-federation/build';
import { loadFederationConfig } from '@softarc/native-federation/build';
import { buildForFederation } from '@softarc/native-federation/build';
import { targetFromTargetString } from '@angular-devkit/architect';

import { NfBuilderSchema } from './schema';
import { reloadBrowser, setError } from '../../utils/dev-server';
import { RebuildHubs } from '../../utils/rebuild-events';
import { updateScriptTags } from '../../utils/updateIndexHtml';
import { JsonObject } from '@angular-devkit/core';
import { existsSync, mkdirSync, rmSync } from 'fs';
import { reloadBrowser, setError } from '../../utils/dev-server';
import {
EsBuildResult,
MemResults,
NgCliAssetResult,
} from '../../utils/mem-resuts';
import { JsonObject } from '@angular-devkit/core';
import { RebuildHubs } from '../../utils/rebuild-events';
import { createSharedMappingsPlugin } from '../../utils/shared-mappings-plugin';
import { updateScriptTags } from '../../utils/updateIndexHtml';
import { NfBuilderSchema } from './schema';
// import { NextHandleFunction } from 'vite';
import { PluginBuild } from 'esbuild';
import { FederationInfo } from '@softarc/native-federation-runtime';
import {
getI18nConfig,
I18nConfig,
translateFederationArtefacts,
} from '../../utils/i18n';
import { PluginBuild } from 'esbuild';
import { checkAngularBuildApplicationBuilder } from '../../utils/check-builder';
import { getI18nConfig, translateFederationArtefacts } from '../../utils/i18n';

function _buildApplication(options, context, pluginsOrExtensions) {
let extensions;
Expand Down Expand Up @@ -268,7 +267,9 @@ export async function* runBuilder(

options.deleteOutputPath = false;

const appBuilderName = '@angular-devkit/build-angular:application';
const appBuilderName = checkAngularBuildApplicationBuilder()
? '@angular/build:application'
: '@angular-devkit/build-angular:application';

const builderRun = runServer
? serveWithVite(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import { Rule, Tree } from '@angular-devkit/schematics';
import { MfSchematicSchema } from './schema';

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

type NormalizedOptions = {
polyfills: string;
Expand Down Expand Up @@ -41,7 +42,9 @@ function updateWorkspaceConfig(

if (projectConfig.architect.esbuild) {
projectConfig.architect.esbuild.builder =
'@angular-devkit/build-angular:application';
checkAngularBuildApplicationBuilder()
? '@angular/build:application'
: '@angular-devkit/build-angular:application';
projectConfig.architect.esbuild.options.browser =
projectConfig.architect.esbuild.options.main;
delete projectConfig.architect.esbuild.options.main;
Expand Down
30 changes: 18 additions & 12 deletions libs/native-federation/src/schematics/init/schematic.ts
Original file line number Diff line number Diff line change
@@ -1,17 +1,17 @@
import {
chain,
Rule,
Tree,
url,
apply,
chain,
mergeWith,
template,
move,
noop,
Rule,
template,
Tree,
url,
} from '@angular-devkit/schematics';

import { NodePackageInstallTask } from '@angular-devkit/schematics/tasks';
import { strings } from '@angular-devkit/core';
import { NodePackageInstallTask } from '@angular-devkit/schematics/tasks';
import { MfSchematicSchema } from './schema';

import {
Expand All @@ -26,6 +26,7 @@ import {
} from '@schematics/angular/utility/dependencies';

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

const SSR_VERSION = '^2.0.10';

Expand Down Expand Up @@ -212,11 +213,16 @@ function updateWorkspaceConfig(

const originalBuild = projectConfig.architect.build;

if (originalBuild.builder !== '@angular-devkit/build-angular:application') {
if (
originalBuild.builder !== '@angular-devkit/build-angular:application' ||
originalBuild.builder !== '@angular/build:application'
) {
console.log(
'Switching project to the application builder using esbuild ...'
);
originalBuild.builder = '@angular-devkit/build-angular:application';
originalBuild.builder = checkAngularBuildApplicationBuilder()
? '@angular/build:application'
: '@angular-devkit/build-angular:application';
delete originalBuild.configurations?.development?.buildOptimizer;
delete originalBuild.configurations?.development?.vendorChunk;
}
Expand Down Expand Up @@ -502,7 +508,7 @@ function makeServerAsync(

const cors = `import { createRequire } from "module";
const require = createRequire(import.meta.url);
const cors = require("cors");
const cors = require("cors");
`;
const mainContent = tree.read(server).toString('utf8');
const updatedContent = (cors + mainContent)
Expand Down Expand Up @@ -531,7 +537,7 @@ console.log('Starting SSR for Shell');
remotesOrManifestUrl: '../browser/federation.manifest.json',
relBundlePath: '../browser/',
});

await import('./bootstrap-server');

})();
Expand All @@ -548,7 +554,7 @@ console.log('Starting SSR for Shell');
remotesOrManifestUrl: ${manifest},
relBundlePath: '../browser/',
});

await import('./bootstrap-server');

})();
Expand All @@ -561,7 +567,7 @@ console.log('Starting SSR for Shell');
await initNodeFederation({
relBundlePath: '../browser/'
});

await import('./bootstrap-server');

})();
Expand Down
22 changes: 22 additions & 0 deletions libs/native-federation/src/utils/check-builder.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
import { existsSync } from 'fs';
import { resolve } from 'path';

/**
* Since Angular 16, the Angular CLI uses the new @angular/build package
* Currently the @angular/build package is not installed by default
* However in the next version of Angular (v20), it will replace the @angular-devkit/build-angular package
*
* This functions checks if the @angular/build package is installed to insure a compatibility with the next version of Angular
* 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
*
* @returns true if the Angular build package is installed
*/
export const checkAngularBuildApplicationBuilder = () => {
const pathAngularBuildPackage = resolve(
process.cwd(),
'node_modules',
'@angular/build'
);

return existsSync(pathAngularBuildPackage);
};