diff --git a/package.json b/package.json index 60c9469..5d722f6 100644 --- a/package.json +++ b/package.json @@ -76,7 +76,6 @@ "@angular/build": "~22.1.0", "@eslint/js": "^10.0.1", "@nx/devkit": "^23.1.0", - "@schematics/angular": "~22.1.0", "@types/node": "~24.10.0", "@vitest/coverage-v8": "^4.0.0", "eslint": "^10.8.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 27e6486..9856e44 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -48,9 +48,6 @@ importers: '@nx/devkit': specifier: ^23.1.0 version: 23.1.1(nx@23.1.1) - '@schematics/angular': - specifier: ~22.1.0 - version: 22.1.3(chokidar@5.0.0) '@types/node': specifier: ~24.10.0 version: 24.10.15 @@ -1708,10 +1705,6 @@ packages: cpu: [x64] os: [win32] - '@schematics/angular@22.1.3': - resolution: {integrity: sha512-5f5f0tKp3d25hjNGkvw2dtGgTN4wxPNhv1AXnhFkh+mLinQK9Qwzr2iEXDDrAuJEkvz1ACHq631IURWph0lqew==, tarball: https://registry.npmjs.org/@schematics/angular/-/angular-22.1.3.tgz} - engines: {node: ^22.22.3 || ^24.15.0 || >=26.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} - '@softarc/native-federation-orchestrator@4.6.0': resolution: {integrity: sha512-8529SINGc3zBdKZcyUsP9vGj4EFjUOljy+43qfwzYSgC3FwkHcAjddf/p86t8kI9CmCp0JGeLkM1IjJ7xahVXQ==, tarball: https://registry.npmjs.org/@softarc/native-federation-orchestrator/-/native-federation-orchestrator-4.6.0.tgz} engines: {node: '>=24.16.0'} @@ -4501,15 +4494,6 @@ snapshots: '@rollup/rollup-win32-x64-msvc@4.62.4': optional: true - '@schematics/angular@22.1.3(chokidar@5.0.0)': - dependencies: - '@angular-devkit/core': 22.1.3(chokidar@5.0.0) - '@angular-devkit/schematics': 22.1.3(chokidar@5.0.0) - jsonc-parser: 3.3.1 - typescript: 6.0.3 - transitivePeerDependencies: - - chokidar - '@softarc/native-federation-orchestrator@4.6.0': dependencies: semver: 7.8.5 diff --git a/src/schematics/init/steps/add-dependencies.ts b/src/schematics/init/steps/add-dependencies.ts index 11d6608..fbec339 100644 --- a/src/schematics/init/steps/add-dependencies.ts +++ b/src/schematics/init/steps/add-dependencies.ts @@ -1,40 +1,45 @@ -import type { SchematicContext, Tree } from '@angular-devkit/schematics'; -import { NodePackageInstallTask } from '@angular-devkit/schematics/tasks/index.js'; -import { - addPackageJsonDependency, - NodeDependencyType, -} from '@schematics/angular/utility/dependencies'; - -export function addDependencies(tree: Tree, context: SchematicContext, ssr: boolean): void { - addPackageJsonDependency(tree, { - name: 'es-module-shims', - type: NodeDependencyType.Default, - version: '^2.8.0', - overwrite: false, - }); - - // Browser-only projects bundle the orchestrator into the app, so a dev - // dependency suffices. For SSR it must be a runtime dependency: the generated - // server entry imports '@softarc/native-federation-orchestrator/node' as a - // bare specifier resolved from node_modules at runtime. - addPackageJsonDependency(tree, { - name: '@softarc/native-federation-orchestrator', - type: ssr ? NodeDependencyType.Default : NodeDependencyType.Dev, - version: '^4.2.2', - overwrite: true, - }); +import type { SchematicContext, Tree } from "@angular-devkit/schematics"; +import { NodePackageInstallTask } from "@angular-devkit/schematics/tasks/index.js"; + +type DependencyType = "dependencies" | "devDependencies"; +type PackageJson = Partial>>; + +export function addDependencies( + tree: Tree, + context: SchematicContext, + ssr: boolean, +): void { + const packageJson = (tree.readJson("package.json") as PackageJson) ?? {}; + + function addDependency( + type: DependencyType, + name: string, + version: string, + overwrite = false, + ): void { + const deps = (packageJson[type] ??= {}); + if (overwrite || !deps[name]) { + deps[name] = version; + } + } + + addDependency("dependencies", "es-module-shims", "^2.8.0"); + + addDependency( + "devDependencies", + "@softarc/native-federation-orchestrator", + "^4.6.0", + true, + ); if (ssr) { - console.log('SSR detected ...'); - console.log('Activating CORS ...'); - - addPackageJsonDependency(tree, { - name: 'cors', - type: NodeDependencyType.Default, - version: '^2.8.5', - overwrite: false, - }); + console.log("SSR detected ..."); + console.log("Activating CORS ..."); + + addDependency("dependencies", "cors", "^2.8.5"); } + tree.overwrite("package.json", JSON.stringify(packageJson, null, 2)); + context.addTask(new NodePackageInstallTask()); } diff --git a/src/schematics/init/steps/make-main-async.ts b/src/schematics/init/steps/make-main-async.ts index 5590aed..69c2b76 100644 --- a/src/schematics/init/steps/make-main-async.ts +++ b/src/schematics/init/steps/make-main-async.ts @@ -1,6 +1,6 @@ -import type { Rule } from '@angular-devkit/schematics'; -import type { NfSchematicSchema } from '../schema.js'; -import * as path from 'path'; +import type { Rule } from "@angular-devkit/schematics"; +import type { NfSchematicSchema } from "../schema.js"; +import * as path from "path"; // The adapter's `initFederation` wrapper hides shimMode/logger/storage, so // generated apps don't ship internal orchestrator options or `logLevel: 'debug'`. @@ -9,15 +9,15 @@ const FEDERATION_IMPORT = `import { initFederation } from '@angular-architects/n function getFederationArg( options: NfSchematicSchema, remoteMap: unknown, - manifestRelPath: string + manifestRelPath: string, ): string { switch (options.type) { - case 'dynamic-host': + case "dynamic-host": return `'${manifestRelPath}'`; - case 'host': + case "host": return JSON.stringify(remoteMap, null, 2).replace(/"/g, "'"); default: - return `{ '${options.project}': './remoteEntry.json' }`; + return `{}`; } } @@ -25,11 +25,11 @@ export function makeMainAsync( main: string, options: NfSchematicSchema, remoteMap: unknown, - manifestRelPath: string + manifestRelPath: string, ): Rule { return async function (tree) { const mainPath = path.dirname(main); - const bootstrapName = path.join(mainPath, 'bootstrap.ts'); + const bootstrapName = path.join(mainPath, "bootstrap.ts"); if (tree.exists(bootstrapName)) { console.info(`${bootstrapName} already exists.`); @@ -45,11 +45,13 @@ export function makeMainAsync( main, `${FEDERATION_IMPORT} -initFederation(${federationArg}) +initFederation(${federationArg}, { + hostRemoteEntry: { url: "./remoteEntry.json" } +}) .catch(err => console.error(err)) .then(_ => import('./bootstrap')) .catch(err => console.error(err)); -` +`, ); }; }