@nx/angular 21.2.0-beta.1 → 21.2.0-beta.3

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.
Files changed (24) hide show
  1. package/README.md +1 -1
  2. package/fesm2022/nx-angular-mf.mjs +10 -3
  3. package/fesm2022/nx-angular-mf.mjs.map +1 -1
  4. package/migrations.json +108 -29
  5. package/ng-package.json +3 -17
  6. package/package.json +9 -9
  7. package/src/executors/ng-packagr-lite/ng-packagr-adjustments/ng-package/entry-point/entry-point.js +1 -1
  8. package/src/executors/ng-packagr-lite/ng-packagr-adjustments/ng-package/entry-point/write-bundles.transform.js +22 -9
  9. package/src/generators/add-linting/add-linting.js +0 -8
  10. package/src/generators/application/files/base/tsconfig.json__tpl__ +2 -2
  11. package/src/generators/application/files/standalone-components/src/app/app__componentFileSuffix__.spec.ts__tpl__ +2 -3
  12. package/src/generators/application/lib/update-tsconfig-files.js +19 -2
  13. package/src/generators/component-story/files/__componentFileName__.stories.ts__tmpl__ +4 -6
  14. package/src/generators/convert-to-rspack/convert-to-rspack.d.ts +1 -1
  15. package/src/generators/convert-to-rspack/convert-to-rspack.js +171 -22
  16. package/src/generators/library/lib/update-tsconfig-files.js +15 -2
  17. package/src/generators/library/library.js +1 -1
  18. package/src/generators/stories/stories.d.ts +2 -2
  19. package/src/generators/stories/stories.js +0 -9
  20. package/src/migrations/update-21-2-0/replace-provide-server-routing.js +22 -9
  21. package/src/migrations/update-21-2-0/update-angular-cli.d.ts +1 -1
  22. package/src/migrations/update-21-2-0/update-angular-cli.js +1 -1
  23. package/src/utils/versions.d.ts +6 -6
  24. package/src/utils/versions.js +6 -6
package/README.md CHANGED
@@ -22,7 +22,7 @@
22
22
 
23
23
  # Nx: Smart Repos · Fast Builds
24
24
 
25
- Nx is a build system, optimized for monorepos, with plugins for popular frameworks and tools and advanced CI capabilities including caching and distribution.
25
+ An AI-first build platform that connects everything from your editor to CI. Helping you deliver fast, without breaking things.
26
26
 
27
27
  This package is an [Angular plugin for Nx](https://nx.dev/nx-api/angular).
28
28
 
@@ -1,3 +1,5 @@
1
+ import { extname } from 'node:path';
2
+
1
3
  let resolveRemoteUrl;
2
4
  /**
3
5
  * @deprecated Use Runtime Helpers from '@module-federation/enhanced/runtime' instead. This will be removed in Nx 22.
@@ -104,10 +106,15 @@ async function loadRemoteContainer(remoteName) {
104
106
  const remoteUrl = remoteUrlDefinitions
105
107
  ? remoteUrlDefinitions[remoteName]
106
108
  : await resolveRemoteUrl(remoteName);
107
- let containerUrl = remoteUrl;
108
- if (!remoteUrl.endsWith('.mjs') && !remoteUrl.endsWith('.js')) {
109
- containerUrl = `${remoteUrl}${remoteUrl.endsWith('/') ? '' : '/'}remoteEntry.mjs`;
109
+ const url = new URL(remoteUrl);
110
+ const ext = extname(url.pathname);
111
+ const needsRemoteEntry = !['.js', '.mjs', '.json'].includes(ext);
112
+ if (needsRemoteEntry) {
113
+ url.pathname = url.pathname.endsWith('/')
114
+ ? `${url.pathname}remoteEntry.mjs`
115
+ : `${url.pathname}/remoteEntry.mjs`;
110
116
  }
117
+ const containerUrl = url.href;
111
118
  const container = await loadModule(containerUrl);
112
119
  await container.init(__webpack_share_scopes__.default);
113
120
  remoteContainerMap.set(remoteName, container);
@@ -1 +1 @@
1
- {"version":3,"file":"nx-angular-mf.mjs","sources":["../tmp-esm2022/mf/mf.js","../tmp-esm2022/mf/nx-angular-mf.js"],"sourcesContent":["let resolveRemoteUrl;\n/**\n * @deprecated Use Runtime Helpers from '@module-federation/enhanced/runtime' instead. This will be removed in Nx 22.\n */\nexport function setRemoteUrlResolver(_resolveRemoteUrl) {\n resolveRemoteUrl = _resolveRemoteUrl;\n}\nlet remoteUrlDefinitions;\n/**\n * @deprecated Use init() from '@module-federation/enhanced/runtime' instead. This will be removed in Nx 22.\n * If you have a remote app called `my-remote-app` and you want to use the `http://localhost:4201/mf-manifest.json` as the remote url, you should change it from:\n * ```ts\n * import { setRemoteDefinitions } from '@nx/angular/mf';\n *\n * setRemoteDefinitions({\n * 'my-remote-app': 'http://localhost:4201/mf-manifest.json'\n * });\n * ```\n * to use init():\n * ```ts\n * import { init } from '@module-federation/enhanced/runtime';\n *\n * init({\n * name: 'host',\n * remotes: [{\n * name: 'my-remote-app',\n * entry: 'http://localhost:4201/mf-manifest.json'\n * }]\n * });\n * ```\n */\nexport function setRemoteDefinitions(definitions) {\n remoteUrlDefinitions = definitions;\n}\n/**\n * @deprecated Use registerRemotes() from '@module-federation/enhanced/runtime' instead. This will be removed in Nx 22.\n * If you set a remote app with `setRemoteDefinition` such as:\n * ```ts\n * import { setRemoteDefinition } from '@nx/angular/mf';\n *\n * setRemoteDefinition(\n * 'my-remote-app',\n * 'http://localhost:4201/mf-manifest.json'\n * );\n * ```\n * change it to use registerRemotes():\n * ```ts\n * import { registerRemotes } from '@module-federation/enhanced/runtime';\n *\n * registerRemotes([\n * {\n * name: 'my-remote-app',\n * entry: 'http://localhost:4201/mf-manifest.json'\n * }\n * ]);\n * ```\n */\nexport function setRemoteDefinition(remoteName, remoteUrl) {\n remoteUrlDefinitions ??= {};\n remoteUrlDefinitions[remoteName] = remoteUrl;\n}\nlet remoteModuleMap = new Map();\nlet remoteContainerMap = new Map();\n/**\n * @deprecated Use loadRemote() from '@module-federation/enhanced/runtime' instead. This will be removed in Nx 22.\n * If you set a load a remote with `loadRemoteModule` such as:\n * ```ts\n * import { loadRemoteModule } from '@nx/angular/mf';\n *\n * loadRemoteModule('my-remote-app', './Module').then(m => m.RemoteEntryModule);\n * ```\n * change it to use loadRemote():\n * ```ts\n * import { loadRemote } from '@module-federation/enhanced/runtime';\n *\n * loadRemote<typeof import('my-remote-app/Module')>('my-remote-app/Module').then(m => m.RemoteEntryModule);\n * ```\n */\nexport async function loadRemoteModule(remoteName, moduleName) {\n const remoteModuleKey = `${remoteName}:${moduleName}`;\n if (remoteModuleMap.has(remoteModuleKey)) {\n return remoteModuleMap.get(remoteModuleKey);\n }\n const container = remoteContainerMap.has(remoteName)\n ? remoteContainerMap.get(remoteName)\n : await loadRemoteContainer(remoteName);\n const factory = await container.get(moduleName);\n const Module = factory();\n remoteModuleMap.set(remoteModuleKey, Module);\n return Module;\n}\nfunction loadModule(url) {\n return import(/* webpackIgnore:true */ url);\n}\nlet initialSharingScopeCreated = false;\nasync function loadRemoteContainer(remoteName) {\n if (!resolveRemoteUrl && !remoteUrlDefinitions) {\n throw new Error('Call setRemoteDefinitions or setRemoteUrlResolver to allow Dynamic Federation to find the remote apps correctly.');\n }\n if (!initialSharingScopeCreated) {\n initialSharingScopeCreated = true;\n await __webpack_init_sharing__('default');\n }\n const remoteUrl = remoteUrlDefinitions\n ? remoteUrlDefinitions[remoteName]\n : await resolveRemoteUrl(remoteName);\n let containerUrl = remoteUrl;\n if (!remoteUrl.endsWith('.mjs') && !remoteUrl.endsWith('.js')) {\n containerUrl = `${remoteUrl}${remoteUrl.endsWith('/') ? '' : '/'}remoteEntry.mjs`;\n }\n const container = await loadModule(containerUrl);\n await container.init(__webpack_share_scopes__.default);\n remoteContainerMap.set(remoteName, container);\n return container;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWYuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9hbmd1bGFyL21mL21mLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQU9BLElBQUksZ0JBQTBDLENBQUM7QUFFL0M7O0dBRUc7QUFDSCxNQUFNLFVBQVUsb0JBQW9CLENBQ2xDLGlCQUEyQztJQUUzQyxnQkFBZ0IsR0FBRyxpQkFBaUIsQ0FBQztBQUN2QyxDQUFDO0FBRUQsSUFBSSxvQkFBNEMsQ0FBQztBQUVqRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXNCRztBQUNILE1BQU0sVUFBVSxvQkFBb0IsQ0FBQyxXQUFtQztJQUN0RSxvQkFBb0IsR0FBRyxXQUFXLENBQUM7QUFDckMsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBc0JHO0FBQ0gsTUFBTSxVQUFVLG1CQUFtQixDQUFDLFVBQWtCLEVBQUUsU0FBaUI7SUFDdkUsb0JBQW9CLEtBQUssRUFBRSxDQUFDO0lBQzVCLG9CQUFvQixDQUFDLFVBQVUsQ0FBQyxHQUFHLFNBQVMsQ0FBQztBQUMvQyxDQUFDO0FBRUQsSUFBSSxlQUFlLEdBQUcsSUFBSSxHQUFHLEVBQW1CLENBQUM7QUFDakQsSUFBSSxrQkFBa0IsR0FBRyxJQUFJLEdBQUcsRUFBbUIsQ0FBQztBQUVwRDs7Ozs7Ozs7Ozs7Ozs7R0FjRztBQUNILE1BQU0sQ0FBQyxLQUFLLFVBQVUsZ0JBQWdCLENBQUMsVUFBa0IsRUFBRSxVQUFrQjtJQUMzRSxNQUFNLGVBQWUsR0FBRyxHQUFHLFVBQVUsSUFBSSxVQUFVLEVBQUUsQ0FBQztJQUN0RCxJQUFJLGVBQWUsQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLEVBQUUsQ0FBQztRQUN6QyxPQUFPLGVBQWUsQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLENBQUM7SUFDOUMsQ0FBQztJQUVELE1BQU0sU0FBUyxHQUFHLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUM7UUFDbEQsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUM7UUFDcEMsQ0FBQyxDQUFDLE1BQU0sbUJBQW1CLENBQUMsVUFBVSxDQUFDLENBQUM7SUFFMUMsTUFBTSxPQUFPLEdBQUcsTUFBTSxTQUFTLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ2hELE1BQU0sTUFBTSxHQUFHLE9BQU8sRUFBRSxDQUFDO0lBRXpCLGVBQWUsQ0FBQyxHQUFHLENBQUMsZUFBZSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBRTdDLE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUM7QUFFRCxTQUFTLFVBQVUsQ0FBQyxHQUFXO0lBQzdCLE9BQU8sTUFBTSxDQUFDLHdCQUF3QixDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQzlDLENBQUM7QUFFRCxJQUFJLDBCQUEwQixHQUFHLEtBQUssQ0FBQztBQUV2QyxLQUFLLFVBQVUsbUJBQW1CLENBQUMsVUFBa0I7SUFDbkQsSUFBSSxDQUFDLGdCQUFnQixJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztRQUMvQyxNQUFNLElBQUksS0FBSyxDQUNiLGtIQUFrSCxDQUNuSCxDQUFDO0lBQ0osQ0FBQztJQUVELElBQUksQ0FBQywwQkFBMEIsRUFBRSxDQUFDO1FBQ2hDLDBCQUEwQixHQUFHLElBQUksQ0FBQztRQUNsQyxNQUFNLHdCQUF3QixDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQzVDLENBQUM7SUFFRCxNQUFNLFNBQVMsR0FBRyxvQkFBb0I7UUFDcEMsQ0FBQyxDQUFDLG9CQUFvQixDQUFDLFVBQVUsQ0FBQztRQUNsQyxDQUFDLENBQUMsTUFBTSxnQkFBZ0IsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUV2QyxJQUFJLFlBQVksR0FBRyxTQUFTLENBQUM7SUFDN0IsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDOUQsWUFBWSxHQUFHLEdBQUcsU0FBUyxHQUN6QixTQUFTLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQ2pDLGlCQUFpQixDQUFDO0lBQ3BCLENBQUM7SUFFRCxNQUFNLFNBQVMsR0FBRyxNQUFNLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUNqRCxNQUFNLFNBQVMsQ0FBQyxJQUFJLENBQUMsd0JBQXdCLENBQUMsT0FBTyxDQUFDLENBQUM7SUFFdkQsa0JBQWtCLENBQUMsR0FBRyxDQUFDLFVBQVUsRUFBRSxTQUFTLENBQUMsQ0FBQztJQUM5QyxPQUFPLFNBQVMsQ0FBQztBQUNuQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IHR5cGUgUmVzb2x2ZVJlbW90ZVVybEZ1bmN0aW9uID0gKFxuICByZW1vdGVOYW1lOiBzdHJpbmdcbikgPT4gc3RyaW5nIHwgUHJvbWlzZTxzdHJpbmc+O1xuXG5kZWNsYXJlIGNvbnN0IF9fd2VicGFja19pbml0X3NoYXJpbmdfXzogKHNjb3BlOiAnZGVmYXVsdCcpID0+IFByb21pc2U8dm9pZD47XG5kZWNsYXJlIGNvbnN0IF9fd2VicGFja19zaGFyZV9zY29wZXNfXzogeyBkZWZhdWx0OiB1bmtub3duIH07XG5cbmxldCByZXNvbHZlUmVtb3RlVXJsOiBSZXNvbHZlUmVtb3RlVXJsRnVuY3Rpb247XG5cbi8qKlxuICogQGRlcHJlY2F0ZWQgVXNlIFJ1bnRpbWUgSGVscGVycyBmcm9tICdAbW9kdWxlLWZlZGVyYXRpb24vZW5oYW5jZWQvcnVudGltZScgaW5zdGVhZC4gVGhpcyB3aWxsIGJlIHJlbW92ZWQgaW4gTnggMjIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXRSZW1vdGVVcmxSZXNvbHZlcihcbiAgX3Jlc29sdmVSZW1vdGVVcmw6IFJlc29sdmVSZW1vdGVVcmxGdW5jdGlvblxuKSB7XG4gIHJlc29sdmVSZW1vdGVVcmwgPSBfcmVzb2x2ZVJlbW90ZVVybDtcbn1cblxubGV0IHJlbW90ZVVybERlZmluaXRpb25zOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuXG4vKipcbiAqIEBkZXByZWNhdGVkIFVzZSBpbml0KCkgZnJvbSAnQG1vZHVsZS1mZWRlcmF0aW9uL2VuaGFuY2VkL3J1bnRpbWUnIGluc3RlYWQuIFRoaXMgd2lsbCBiZSByZW1vdmVkIGluIE54IDIyLlxuICogSWYgeW91IGhhdmUgYSByZW1vdGUgYXBwIGNhbGxlZCBgbXktcmVtb3RlLWFwcGAgYW5kIHlvdSB3YW50IHRvIHVzZSB0aGUgYGh0dHA6Ly9sb2NhbGhvc3Q6NDIwMS9tZi1tYW5pZmVzdC5qc29uYCBhcyB0aGUgcmVtb3RlIHVybCwgeW91IHNob3VsZCBjaGFuZ2UgaXQgZnJvbTpcbiAqIGBgYHRzXG4gKiBpbXBvcnQgeyBzZXRSZW1vdGVEZWZpbml0aW9ucyB9IGZyb20gJ0BueC9hbmd1bGFyL21mJztcbiAqXG4gKiBzZXRSZW1vdGVEZWZpbml0aW9ucyh7XG4gKiAgICdteS1yZW1vdGUtYXBwJzogJ2h0dHA6Ly9sb2NhbGhvc3Q6NDIwMS9tZi1tYW5pZmVzdC5qc29uJ1xuICogfSk7XG4gKiBgYGBcbiAqIHRvIHVzZSBpbml0KCk6XG4gKiBgYGB0c1xuICogaW1wb3J0IHsgaW5pdCB9IGZyb20gJ0Btb2R1bGUtZmVkZXJhdGlvbi9lbmhhbmNlZC9ydW50aW1lJztcbiAqXG4gKiBpbml0KHtcbiAqICAgbmFtZTogJ2hvc3QnLFxuICogICByZW1vdGVzOiBbe1xuICogICAgIG5hbWU6ICdteS1yZW1vdGUtYXBwJyxcbiAqICAgICBlbnRyeTogJ2h0dHA6Ly9sb2NhbGhvc3Q6NDIwMS9tZi1tYW5pZmVzdC5qc29uJ1xuICogICB9XVxuICogfSk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldFJlbW90ZURlZmluaXRpb25zKGRlZmluaXRpb25zOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+KSB7XG4gIHJlbW90ZVVybERlZmluaXRpb25zID0gZGVmaW5pdGlvbnM7XG59XG5cbi8qKlxuICogQGRlcHJlY2F0ZWQgVXNlIHJlZ2lzdGVyUmVtb3RlcygpIGZyb20gJ0Btb2R1bGUtZmVkZXJhdGlvbi9lbmhhbmNlZC9ydW50aW1lJyBpbnN0ZWFkLiBUaGlzIHdpbGwgYmUgcmVtb3ZlZCBpbiBOeCAyMi5cbiAqIElmIHlvdSBzZXQgYSByZW1vdGUgYXBwIHdpdGggYHNldFJlbW90ZURlZmluaXRpb25gIHN1Y2ggYXM6XG4gKiBgYGB0c1xuICogaW1wb3J0IHsgc2V0UmVtb3RlRGVmaW5pdGlvbiB9IGZyb20gJ0BueC9hbmd1bGFyL21mJztcbiAqXG4gKiBzZXRSZW1vdGVEZWZpbml0aW9uKFxuICogICAnbXktcmVtb3RlLWFwcCcsXG4gKiAgICdodHRwOi8vbG9jYWxob3N0OjQyMDEvbWYtbWFuaWZlc3QuanNvbidcbiAqICk7XG4gKiBgYGBcbiAqIGNoYW5nZSBpdCB0byB1c2UgcmVnaXN0ZXJSZW1vdGVzKCk6XG4gKiBgYGB0c1xuICogaW1wb3J0IHsgcmVnaXN0ZXJSZW1vdGVzIH0gZnJvbSAnQG1vZHVsZS1mZWRlcmF0aW9uL2VuaGFuY2VkL3J1bnRpbWUnO1xuICpcbiAqIHJlZ2lzdGVyUmVtb3RlcyhbXG4gKiAge1xuICogICAgIG5hbWU6ICdteS1yZW1vdGUtYXBwJyxcbiAqICAgICBlbnRyeTogJ2h0dHA6Ly9sb2NhbGhvc3Q6NDIwMS9tZi1tYW5pZmVzdC5qc29uJ1xuICogICB9XG4gKiBdKTtcbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0UmVtb3RlRGVmaW5pdGlvbihyZW1vdGVOYW1lOiBzdHJpbmcsIHJlbW90ZVVybDogc3RyaW5nKSB7XG4gIHJlbW90ZVVybERlZmluaXRpb25zID8/PSB7fTtcbiAgcmVtb3RlVXJsRGVmaW5pdGlvbnNbcmVtb3RlTmFtZV0gPSByZW1vdGVVcmw7XG59XG5cbmxldCByZW1vdGVNb2R1bGVNYXAgPSBuZXcgTWFwPHN0cmluZywgdW5rbm93bj4oKTtcbmxldCByZW1vdGVDb250YWluZXJNYXAgPSBuZXcgTWFwPHN0cmluZywgdW5rbm93bj4oKTtcblxuLyoqXG4gKiBAZGVwcmVjYXRlZCBVc2UgbG9hZFJlbW90ZSgpIGZyb20gJ0Btb2R1bGUtZmVkZXJhdGlvbi9lbmhhbmNlZC9ydW50aW1lJyBpbnN0ZWFkLiBUaGlzIHdpbGwgYmUgcmVtb3ZlZCBpbiBOeCAyMi5cbiAqIElmIHlvdSBzZXQgYSBsb2FkIGEgcmVtb3RlIHdpdGggYGxvYWRSZW1vdGVNb2R1bGVgIHN1Y2ggYXM6XG4gKiBgYGB0c1xuICogaW1wb3J0IHsgbG9hZFJlbW90ZU1vZHVsZSB9IGZyb20gJ0BueC9hbmd1bGFyL21mJztcbiAqXG4gKiBsb2FkUmVtb3RlTW9kdWxlKCdteS1yZW1vdGUtYXBwJywgJy4vTW9kdWxlJykudGhlbihtID0+IG0uUmVtb3RlRW50cnlNb2R1bGUpO1xuICogYGBgXG4gKiBjaGFuZ2UgaXQgdG8gdXNlIGxvYWRSZW1vdGUoKTpcbiAqIGBgYHRzXG4gKiBpbXBvcnQgeyBsb2FkUmVtb3RlIH0gZnJvbSAnQG1vZHVsZS1mZWRlcmF0aW9uL2VuaGFuY2VkL3J1bnRpbWUnO1xuICpcbiAqIGxvYWRSZW1vdGU8dHlwZW9mIGltcG9ydCgnbXktcmVtb3RlLWFwcC9Nb2R1bGUnKT4oJ215LXJlbW90ZS1hcHAvTW9kdWxlJykudGhlbihtID0+IG0uUmVtb3RlRW50cnlNb2R1bGUpO1xuICogYGBgXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBsb2FkUmVtb3RlTW9kdWxlKHJlbW90ZU5hbWU6IHN0cmluZywgbW9kdWxlTmFtZTogc3RyaW5nKSB7XG4gIGNvbnN0IHJlbW90ZU1vZHVsZUtleSA9IGAke3JlbW90ZU5hbWV9OiR7bW9kdWxlTmFtZX1gO1xuICBpZiAocmVtb3RlTW9kdWxlTWFwLmhhcyhyZW1vdGVNb2R1bGVLZXkpKSB7XG4gICAgcmV0dXJuIHJlbW90ZU1vZHVsZU1hcC5nZXQocmVtb3RlTW9kdWxlS2V5KTtcbiAgfVxuXG4gIGNvbnN0IGNvbnRhaW5lciA9IHJlbW90ZUNvbnRhaW5lck1hcC5oYXMocmVtb3RlTmFtZSlcbiAgICA/IHJlbW90ZUNvbnRhaW5lck1hcC5nZXQocmVtb3RlTmFtZSlcbiAgICA6IGF3YWl0IGxvYWRSZW1vdGVDb250YWluZXIocmVtb3RlTmFtZSk7XG5cbiAgY29uc3QgZmFjdG9yeSA9IGF3YWl0IGNvbnRhaW5lci5nZXQobW9kdWxlTmFtZSk7XG4gIGNvbnN0IE1vZHVsZSA9IGZhY3RvcnkoKTtcblxuICByZW1vdGVNb2R1bGVNYXAuc2V0KHJlbW90ZU1vZHVsZUtleSwgTW9kdWxlKTtcblxuICByZXR1cm4gTW9kdWxlO1xufVxuXG5mdW5jdGlvbiBsb2FkTW9kdWxlKHVybDogc3RyaW5nKSB7XG4gIHJldHVybiBpbXBvcnQoLyogd2VicGFja0lnbm9yZTp0cnVlICovIHVybCk7XG59XG5cbmxldCBpbml0aWFsU2hhcmluZ1Njb3BlQ3JlYXRlZCA9IGZhbHNlO1xuXG5hc3luYyBmdW5jdGlvbiBsb2FkUmVtb3RlQ29udGFpbmVyKHJlbW90ZU5hbWU6IHN0cmluZykge1xuICBpZiAoIXJlc29sdmVSZW1vdGVVcmwgJiYgIXJlbW90ZVVybERlZmluaXRpb25zKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgJ0NhbGwgc2V0UmVtb3RlRGVmaW5pdGlvbnMgb3Igc2V0UmVtb3RlVXJsUmVzb2x2ZXIgdG8gYWxsb3cgRHluYW1pYyBGZWRlcmF0aW9uIHRvIGZpbmQgdGhlIHJlbW90ZSBhcHBzIGNvcnJlY3RseS4nXG4gICAgKTtcbiAgfVxuXG4gIGlmICghaW5pdGlhbFNoYXJpbmdTY29wZUNyZWF0ZWQpIHtcbiAgICBpbml0aWFsU2hhcmluZ1Njb3BlQ3JlYXRlZCA9IHRydWU7XG4gICAgYXdhaXQgX193ZWJwYWNrX2luaXRfc2hhcmluZ19fKCdkZWZhdWx0Jyk7XG4gIH1cblxuICBjb25zdCByZW1vdGVVcmwgPSByZW1vdGVVcmxEZWZpbml0aW9uc1xuICAgID8gcmVtb3RlVXJsRGVmaW5pdGlvbnNbcmVtb3RlTmFtZV1cbiAgICA6IGF3YWl0IHJlc29sdmVSZW1vdGVVcmwocmVtb3RlTmFtZSk7XG5cbiAgbGV0IGNvbnRhaW5lclVybCA9IHJlbW90ZVVybDtcbiAgaWYgKCFyZW1vdGVVcmwuZW5kc1dpdGgoJy5tanMnKSAmJiAhcmVtb3RlVXJsLmVuZHNXaXRoKCcuanMnKSkge1xuICAgIGNvbnRhaW5lclVybCA9IGAke3JlbW90ZVVybH0ke1xuICAgICAgcmVtb3RlVXJsLmVuZHNXaXRoKCcvJykgPyAnJyA6ICcvJ1xuICAgIH1yZW1vdGVFbnRyeS5tanNgO1xuICB9XG5cbiAgY29uc3QgY29udGFpbmVyID0gYXdhaXQgbG9hZE1vZHVsZShjb250YWluZXJVcmwpO1xuICBhd2FpdCBjb250YWluZXIuaW5pdChfX3dlYnBhY2tfc2hhcmVfc2NvcGVzX18uZGVmYXVsdCk7XG5cbiAgcmVtb3RlQ29udGFpbmVyTWFwLnNldChyZW1vdGVOYW1lLCBjb250YWluZXIpO1xuICByZXR1cm4gY29udGFpbmVyO1xufVxuIl19","/**\n * Generated bundle index. Do not edit.\n */\nexport * from './index';\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibngtYW5ndWxhci1tZi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2FuZ3VsYXIvbWYvbngtYW5ndWxhci1tZi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUVILGNBQWMsU0FBUyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBHZW5lcmF0ZWQgYnVuZGxlIGluZGV4LiBEbyBub3QgZWRpdC5cbiAqL1xuXG5leHBvcnQgKiBmcm9tICcuL2luZGV4JztcbiJdfQ=="],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"nx-angular-mf.mjs","sources":["../tmp-esm2022/mf/mf.js","../tmp-esm2022/mf/nx-angular-mf.js"],"sourcesContent":["import { extname } from 'node:path';\nlet resolveRemoteUrl;\n/**\n * @deprecated Use Runtime Helpers from '@module-federation/enhanced/runtime' instead. This will be removed in Nx 22.\n */\nexport function setRemoteUrlResolver(_resolveRemoteUrl) {\n resolveRemoteUrl = _resolveRemoteUrl;\n}\nlet remoteUrlDefinitions;\n/**\n * @deprecated Use init() from '@module-federation/enhanced/runtime' instead. This will be removed in Nx 22.\n * If you have a remote app called `my-remote-app` and you want to use the `http://localhost:4201/mf-manifest.json` as the remote url, you should change it from:\n * ```ts\n * import { setRemoteDefinitions } from '@nx/angular/mf';\n *\n * setRemoteDefinitions({\n * 'my-remote-app': 'http://localhost:4201/mf-manifest.json'\n * });\n * ```\n * to use init():\n * ```ts\n * import { init } from '@module-federation/enhanced/runtime';\n *\n * init({\n * name: 'host',\n * remotes: [{\n * name: 'my-remote-app',\n * entry: 'http://localhost:4201/mf-manifest.json'\n * }]\n * });\n * ```\n */\nexport function setRemoteDefinitions(definitions) {\n remoteUrlDefinitions = definitions;\n}\n/**\n * @deprecated Use registerRemotes() from '@module-federation/enhanced/runtime' instead. This will be removed in Nx 22.\n * If you set a remote app with `setRemoteDefinition` such as:\n * ```ts\n * import { setRemoteDefinition } from '@nx/angular/mf';\n *\n * setRemoteDefinition(\n * 'my-remote-app',\n * 'http://localhost:4201/mf-manifest.json'\n * );\n * ```\n * change it to use registerRemotes():\n * ```ts\n * import { registerRemotes } from '@module-federation/enhanced/runtime';\n *\n * registerRemotes([\n * {\n * name: 'my-remote-app',\n * entry: 'http://localhost:4201/mf-manifest.json'\n * }\n * ]);\n * ```\n */\nexport function setRemoteDefinition(remoteName, remoteUrl) {\n remoteUrlDefinitions ??= {};\n remoteUrlDefinitions[remoteName] = remoteUrl;\n}\nlet remoteModuleMap = new Map();\nlet remoteContainerMap = new Map();\n/**\n * @deprecated Use loadRemote() from '@module-federation/enhanced/runtime' instead. This will be removed in Nx 22.\n * If you set a load a remote with `loadRemoteModule` such as:\n * ```ts\n * import { loadRemoteModule } from '@nx/angular/mf';\n *\n * loadRemoteModule('my-remote-app', './Module').then(m => m.RemoteEntryModule);\n * ```\n * change it to use loadRemote():\n * ```ts\n * import { loadRemote } from '@module-federation/enhanced/runtime';\n *\n * loadRemote<typeof import('my-remote-app/Module')>('my-remote-app/Module').then(m => m.RemoteEntryModule);\n * ```\n */\nexport async function loadRemoteModule(remoteName, moduleName) {\n const remoteModuleKey = `${remoteName}:${moduleName}`;\n if (remoteModuleMap.has(remoteModuleKey)) {\n return remoteModuleMap.get(remoteModuleKey);\n }\n const container = remoteContainerMap.has(remoteName)\n ? remoteContainerMap.get(remoteName)\n : await loadRemoteContainer(remoteName);\n const factory = await container.get(moduleName);\n const Module = factory();\n remoteModuleMap.set(remoteModuleKey, Module);\n return Module;\n}\nfunction loadModule(url) {\n return import(/* webpackIgnore:true */ url);\n}\nlet initialSharingScopeCreated = false;\nasync function loadRemoteContainer(remoteName) {\n if (!resolveRemoteUrl && !remoteUrlDefinitions) {\n throw new Error('Call setRemoteDefinitions or setRemoteUrlResolver to allow Dynamic Federation to find the remote apps correctly.');\n }\n if (!initialSharingScopeCreated) {\n initialSharingScopeCreated = true;\n await __webpack_init_sharing__('default');\n }\n const remoteUrl = remoteUrlDefinitions\n ? remoteUrlDefinitions[remoteName]\n : await resolveRemoteUrl(remoteName);\n const url = new URL(remoteUrl);\n const ext = extname(url.pathname);\n const needsRemoteEntry = !['.js', '.mjs', '.json'].includes(ext);\n if (needsRemoteEntry) {\n url.pathname = url.pathname.endsWith('/')\n ? `${url.pathname}remoteEntry.mjs`\n : `${url.pathname}/remoteEntry.mjs`;\n }\n const containerUrl = url.href;\n const container = await loadModule(containerUrl);\n await container.init(__webpack_share_scopes__.default);\n remoteContainerMap.set(remoteName, container);\n return container;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWYuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9hbmd1bGFyL21mL21mLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFTcEMsSUFBSSxnQkFBMEMsQ0FBQztBQUUvQzs7R0FFRztBQUNILE1BQU0sVUFBVSxvQkFBb0IsQ0FDbEMsaUJBQTJDO0lBRTNDLGdCQUFnQixHQUFHLGlCQUFpQixDQUFDO0FBQ3ZDLENBQUM7QUFFRCxJQUFJLG9CQUE0QyxDQUFDO0FBRWpEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBc0JHO0FBQ0gsTUFBTSxVQUFVLG9CQUFvQixDQUFDLFdBQW1DO0lBQ3RFLG9CQUFvQixHQUFHLFdBQVcsQ0FBQztBQUNyQyxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FzQkc7QUFDSCxNQUFNLFVBQVUsbUJBQW1CLENBQUMsVUFBa0IsRUFBRSxTQUFpQjtJQUN2RSxvQkFBb0IsS0FBSyxFQUFFLENBQUM7SUFDNUIsb0JBQW9CLENBQUMsVUFBVSxDQUFDLEdBQUcsU0FBUyxDQUFDO0FBQy9DLENBQUM7QUFFRCxJQUFJLGVBQWUsR0FBRyxJQUFJLEdBQUcsRUFBbUIsQ0FBQztBQUNqRCxJQUFJLGtCQUFrQixHQUFHLElBQUksR0FBRyxFQUFtQixDQUFDO0FBRXBEOzs7Ozs7Ozs7Ozs7OztHQWNHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSxnQkFBZ0IsQ0FBQyxVQUFrQixFQUFFLFVBQWtCO0lBQzNFLE1BQU0sZUFBZSxHQUFHLEdBQUcsVUFBVSxJQUFJLFVBQVUsRUFBRSxDQUFDO0lBQ3RELElBQUksZUFBZSxDQUFDLEdBQUcsQ0FBQyxlQUFlLENBQUMsRUFBRSxDQUFDO1FBQ3pDLE9BQU8sZUFBZSxDQUFDLEdBQUcsQ0FBQyxlQUFlLENBQUMsQ0FBQztJQUM5QyxDQUFDO0lBRUQsTUFBTSxTQUFTLEdBQUcsa0JBQWtCLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQztRQUNsRCxDQUFDLENBQUMsa0JBQWtCLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQztRQUNwQyxDQUFDLENBQUMsTUFBTSxtQkFBbUIsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUUxQyxNQUFNLE9BQU8sR0FBRyxNQUFNLFNBQVMsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDaEQsTUFBTSxNQUFNLEdBQUcsT0FBTyxFQUFFLENBQUM7SUFFekIsZUFBZSxDQUFDLEdBQUcsQ0FBQyxlQUFlLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFFN0MsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQztBQUVELFNBQVMsVUFBVSxDQUFDLEdBQVc7SUFDN0IsT0FBTyxNQUFNLENBQUMsd0JBQXdCLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDOUMsQ0FBQztBQUVELElBQUksMEJBQTBCLEdBQUcsS0FBSyxDQUFDO0FBRXZDLEtBQUssVUFBVSxtQkFBbUIsQ0FBQyxVQUFrQjtJQUNuRCxJQUFJLENBQUMsZ0JBQWdCLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1FBQy9DLE1BQU0sSUFBSSxLQUFLLENBQ2Isa0hBQWtILENBQ25ILENBQUM7SUFDSixDQUFDO0lBRUQsSUFBSSxDQUFDLDBCQUEwQixFQUFFLENBQUM7UUFDaEMsMEJBQTBCLEdBQUcsSUFBSSxDQUFDO1FBQ2xDLE1BQU0sd0JBQXdCLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDNUMsQ0FBQztJQUVELE1BQU0sU0FBUyxHQUFHLG9CQUFvQjtRQUNwQyxDQUFDLENBQUMsb0JBQW9CLENBQUMsVUFBVSxDQUFDO1FBQ2xDLENBQUMsQ0FBQyxNQUFNLGdCQUFnQixDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBRXZDLE1BQU0sR0FBRyxHQUFHLElBQUksR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQy9CLE1BQU0sR0FBRyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7SUFFbEMsTUFBTSxnQkFBZ0IsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUM7SUFFakUsSUFBSSxnQkFBZ0IsRUFBRSxDQUFDO1FBQ3JCLEdBQUcsQ0FBQyxRQUFRLEdBQUcsR0FBRyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDO1lBQ3ZDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxRQUFRLGlCQUFpQjtZQUNsQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsUUFBUSxrQkFBa0IsQ0FBQztJQUN4QyxDQUFDO0lBRUQsTUFBTSxZQUFZLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQztJQUU5QixNQUFNLFNBQVMsR0FBRyxNQUFNLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUNqRCxNQUFNLFNBQVMsQ0FBQyxJQUFJLENBQUMsd0JBQXdCLENBQUMsT0FBTyxDQUFDLENBQUM7SUFFdkQsa0JBQWtCLENBQUMsR0FBRyxDQUFDLFVBQVUsRUFBRSxTQUFTLENBQUMsQ0FBQztJQUM5QyxPQUFPLFNBQVMsQ0FBQztBQUNuQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZXh0bmFtZSB9IGZyb20gJ25vZGU6cGF0aCc7XG5cbmV4cG9ydCB0eXBlIFJlc29sdmVSZW1vdGVVcmxGdW5jdGlvbiA9IChcbiAgcmVtb3RlTmFtZTogc3RyaW5nXG4pID0+IHN0cmluZyB8IFByb21pc2U8c3RyaW5nPjtcblxuZGVjbGFyZSBjb25zdCBfX3dlYnBhY2tfaW5pdF9zaGFyaW5nX186IChzY29wZTogJ2RlZmF1bHQnKSA9PiBQcm9taXNlPHZvaWQ+O1xuZGVjbGFyZSBjb25zdCBfX3dlYnBhY2tfc2hhcmVfc2NvcGVzX186IHsgZGVmYXVsdDogdW5rbm93biB9O1xuXG5sZXQgcmVzb2x2ZVJlbW90ZVVybDogUmVzb2x2ZVJlbW90ZVVybEZ1bmN0aW9uO1xuXG4vKipcbiAqIEBkZXByZWNhdGVkIFVzZSBSdW50aW1lIEhlbHBlcnMgZnJvbSAnQG1vZHVsZS1mZWRlcmF0aW9uL2VuaGFuY2VkL3J1bnRpbWUnIGluc3RlYWQuIFRoaXMgd2lsbCBiZSByZW1vdmVkIGluIE54IDIyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0UmVtb3RlVXJsUmVzb2x2ZXIoXG4gIF9yZXNvbHZlUmVtb3RlVXJsOiBSZXNvbHZlUmVtb3RlVXJsRnVuY3Rpb25cbikge1xuICByZXNvbHZlUmVtb3RlVXJsID0gX3Jlc29sdmVSZW1vdGVVcmw7XG59XG5cbmxldCByZW1vdGVVcmxEZWZpbml0aW9uczogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcblxuLyoqXG4gKiBAZGVwcmVjYXRlZCBVc2UgaW5pdCgpIGZyb20gJ0Btb2R1bGUtZmVkZXJhdGlvbi9lbmhhbmNlZC9ydW50aW1lJyBpbnN0ZWFkLiBUaGlzIHdpbGwgYmUgcmVtb3ZlZCBpbiBOeCAyMi5cbiAqIElmIHlvdSBoYXZlIGEgcmVtb3RlIGFwcCBjYWxsZWQgYG15LXJlbW90ZS1hcHBgIGFuZCB5b3Ugd2FudCB0byB1c2UgdGhlIGBodHRwOi8vbG9jYWxob3N0OjQyMDEvbWYtbWFuaWZlc3QuanNvbmAgYXMgdGhlIHJlbW90ZSB1cmwsIHlvdSBzaG91bGQgY2hhbmdlIGl0IGZyb206XG4gKiBgYGB0c1xuICogaW1wb3J0IHsgc2V0UmVtb3RlRGVmaW5pdGlvbnMgfSBmcm9tICdAbngvYW5ndWxhci9tZic7XG4gKlxuICogc2V0UmVtb3RlRGVmaW5pdGlvbnMoe1xuICogICAnbXktcmVtb3RlLWFwcCc6ICdodHRwOi8vbG9jYWxob3N0OjQyMDEvbWYtbWFuaWZlc3QuanNvbidcbiAqIH0pO1xuICogYGBgXG4gKiB0byB1c2UgaW5pdCgpOlxuICogYGBgdHNcbiAqIGltcG9ydCB7IGluaXQgfSBmcm9tICdAbW9kdWxlLWZlZGVyYXRpb24vZW5oYW5jZWQvcnVudGltZSc7XG4gKlxuICogaW5pdCh7XG4gKiAgIG5hbWU6ICdob3N0JyxcbiAqICAgcmVtb3RlczogW3tcbiAqICAgICBuYW1lOiAnbXktcmVtb3RlLWFwcCcsXG4gKiAgICAgZW50cnk6ICdodHRwOi8vbG9jYWxob3N0OjQyMDEvbWYtbWFuaWZlc3QuanNvbidcbiAqICAgfV1cbiAqIH0pO1xuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXRSZW1vdGVEZWZpbml0aW9ucyhkZWZpbml0aW9uczogUmVjb3JkPHN0cmluZywgc3RyaW5nPikge1xuICByZW1vdGVVcmxEZWZpbml0aW9ucyA9IGRlZmluaXRpb25zO1xufVxuXG4vKipcbiAqIEBkZXByZWNhdGVkIFVzZSByZWdpc3RlclJlbW90ZXMoKSBmcm9tICdAbW9kdWxlLWZlZGVyYXRpb24vZW5oYW5jZWQvcnVudGltZScgaW5zdGVhZC4gVGhpcyB3aWxsIGJlIHJlbW92ZWQgaW4gTnggMjIuXG4gKiBJZiB5b3Ugc2V0IGEgcmVtb3RlIGFwcCB3aXRoIGBzZXRSZW1vdGVEZWZpbml0aW9uYCBzdWNoIGFzOlxuICogYGBgdHNcbiAqIGltcG9ydCB7IHNldFJlbW90ZURlZmluaXRpb24gfSBmcm9tICdAbngvYW5ndWxhci9tZic7XG4gKlxuICogc2V0UmVtb3RlRGVmaW5pdGlvbihcbiAqICAgJ215LXJlbW90ZS1hcHAnLFxuICogICAnaHR0cDovL2xvY2FsaG9zdDo0MjAxL21mLW1hbmlmZXN0Lmpzb24nXG4gKiApO1xuICogYGBgXG4gKiBjaGFuZ2UgaXQgdG8gdXNlIHJlZ2lzdGVyUmVtb3RlcygpOlxuICogYGBgdHNcbiAqIGltcG9ydCB7IHJlZ2lzdGVyUmVtb3RlcyB9IGZyb20gJ0Btb2R1bGUtZmVkZXJhdGlvbi9lbmhhbmNlZC9ydW50aW1lJztcbiAqXG4gKiByZWdpc3RlclJlbW90ZXMoW1xuICogIHtcbiAqICAgICBuYW1lOiAnbXktcmVtb3RlLWFwcCcsXG4gKiAgICAgZW50cnk6ICdodHRwOi8vbG9jYWxob3N0OjQyMDEvbWYtbWFuaWZlc3QuanNvbidcbiAqICAgfVxuICogXSk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldFJlbW90ZURlZmluaXRpb24ocmVtb3RlTmFtZTogc3RyaW5nLCByZW1vdGVVcmw6IHN0cmluZykge1xuICByZW1vdGVVcmxEZWZpbml0aW9ucyA/Pz0ge307XG4gIHJlbW90ZVVybERlZmluaXRpb25zW3JlbW90ZU5hbWVdID0gcmVtb3RlVXJsO1xufVxuXG5sZXQgcmVtb3RlTW9kdWxlTWFwID0gbmV3IE1hcDxzdHJpbmcsIHVua25vd24+KCk7XG5sZXQgcmVtb3RlQ29udGFpbmVyTWFwID0gbmV3IE1hcDxzdHJpbmcsIHVua25vd24+KCk7XG5cbi8qKlxuICogQGRlcHJlY2F0ZWQgVXNlIGxvYWRSZW1vdGUoKSBmcm9tICdAbW9kdWxlLWZlZGVyYXRpb24vZW5oYW5jZWQvcnVudGltZScgaW5zdGVhZC4gVGhpcyB3aWxsIGJlIHJlbW92ZWQgaW4gTnggMjIuXG4gKiBJZiB5b3Ugc2V0IGEgbG9hZCBhIHJlbW90ZSB3aXRoIGBsb2FkUmVtb3RlTW9kdWxlYCBzdWNoIGFzOlxuICogYGBgdHNcbiAqIGltcG9ydCB7IGxvYWRSZW1vdGVNb2R1bGUgfSBmcm9tICdAbngvYW5ndWxhci9tZic7XG4gKlxuICogbG9hZFJlbW90ZU1vZHVsZSgnbXktcmVtb3RlLWFwcCcsICcuL01vZHVsZScpLnRoZW4obSA9PiBtLlJlbW90ZUVudHJ5TW9kdWxlKTtcbiAqIGBgYFxuICogY2hhbmdlIGl0IHRvIHVzZSBsb2FkUmVtb3RlKCk6XG4gKiBgYGB0c1xuICogaW1wb3J0IHsgbG9hZFJlbW90ZSB9IGZyb20gJ0Btb2R1bGUtZmVkZXJhdGlvbi9lbmhhbmNlZC9ydW50aW1lJztcbiAqXG4gKiBsb2FkUmVtb3RlPHR5cGVvZiBpbXBvcnQoJ215LXJlbW90ZS1hcHAvTW9kdWxlJyk+KCdteS1yZW1vdGUtYXBwL01vZHVsZScpLnRoZW4obSA9PiBtLlJlbW90ZUVudHJ5TW9kdWxlKTtcbiAqIGBgYFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbG9hZFJlbW90ZU1vZHVsZShyZW1vdGVOYW1lOiBzdHJpbmcsIG1vZHVsZU5hbWU6IHN0cmluZykge1xuICBjb25zdCByZW1vdGVNb2R1bGVLZXkgPSBgJHtyZW1vdGVOYW1lfToke21vZHVsZU5hbWV9YDtcbiAgaWYgKHJlbW90ZU1vZHVsZU1hcC5oYXMocmVtb3RlTW9kdWxlS2V5KSkge1xuICAgIHJldHVybiByZW1vdGVNb2R1bGVNYXAuZ2V0KHJlbW90ZU1vZHVsZUtleSk7XG4gIH1cblxuICBjb25zdCBjb250YWluZXIgPSByZW1vdGVDb250YWluZXJNYXAuaGFzKHJlbW90ZU5hbWUpXG4gICAgPyByZW1vdGVDb250YWluZXJNYXAuZ2V0KHJlbW90ZU5hbWUpXG4gICAgOiBhd2FpdCBsb2FkUmVtb3RlQ29udGFpbmVyKHJlbW90ZU5hbWUpO1xuXG4gIGNvbnN0IGZhY3RvcnkgPSBhd2FpdCBjb250YWluZXIuZ2V0KG1vZHVsZU5hbWUpO1xuICBjb25zdCBNb2R1bGUgPSBmYWN0b3J5KCk7XG5cbiAgcmVtb3RlTW9kdWxlTWFwLnNldChyZW1vdGVNb2R1bGVLZXksIE1vZHVsZSk7XG5cbiAgcmV0dXJuIE1vZHVsZTtcbn1cblxuZnVuY3Rpb24gbG9hZE1vZHVsZSh1cmw6IHN0cmluZykge1xuICByZXR1cm4gaW1wb3J0KC8qIHdlYnBhY2tJZ25vcmU6dHJ1ZSAqLyB1cmwpO1xufVxuXG5sZXQgaW5pdGlhbFNoYXJpbmdTY29wZUNyZWF0ZWQgPSBmYWxzZTtcblxuYXN5bmMgZnVuY3Rpb24gbG9hZFJlbW90ZUNvbnRhaW5lcihyZW1vdGVOYW1lOiBzdHJpbmcpIHtcbiAgaWYgKCFyZXNvbHZlUmVtb3RlVXJsICYmICFyZW1vdGVVcmxEZWZpbml0aW9ucykge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICdDYWxsIHNldFJlbW90ZURlZmluaXRpb25zIG9yIHNldFJlbW90ZVVybFJlc29sdmVyIHRvIGFsbG93IER5bmFtaWMgRmVkZXJhdGlvbiB0byBmaW5kIHRoZSByZW1vdGUgYXBwcyBjb3JyZWN0bHkuJ1xuICAgICk7XG4gIH1cblxuICBpZiAoIWluaXRpYWxTaGFyaW5nU2NvcGVDcmVhdGVkKSB7XG4gICAgaW5pdGlhbFNoYXJpbmdTY29wZUNyZWF0ZWQgPSB0cnVlO1xuICAgIGF3YWl0IF9fd2VicGFja19pbml0X3NoYXJpbmdfXygnZGVmYXVsdCcpO1xuICB9XG5cbiAgY29uc3QgcmVtb3RlVXJsID0gcmVtb3RlVXJsRGVmaW5pdGlvbnNcbiAgICA/IHJlbW90ZVVybERlZmluaXRpb25zW3JlbW90ZU5hbWVdXG4gICAgOiBhd2FpdCByZXNvbHZlUmVtb3RlVXJsKHJlbW90ZU5hbWUpO1xuXG4gIGNvbnN0IHVybCA9IG5ldyBVUkwocmVtb3RlVXJsKTtcbiAgY29uc3QgZXh0ID0gZXh0bmFtZSh1cmwucGF0aG5hbWUpO1xuXG4gIGNvbnN0IG5lZWRzUmVtb3RlRW50cnkgPSAhWycuanMnLCAnLm1qcycsICcuanNvbiddLmluY2x1ZGVzKGV4dCk7XG5cbiAgaWYgKG5lZWRzUmVtb3RlRW50cnkpIHtcbiAgICB1cmwucGF0aG5hbWUgPSB1cmwucGF0aG5hbWUuZW5kc1dpdGgoJy8nKVxuICAgICAgPyBgJHt1cmwucGF0aG5hbWV9cmVtb3RlRW50cnkubWpzYFxuICAgICAgOiBgJHt1cmwucGF0aG5hbWV9L3JlbW90ZUVudHJ5Lm1qc2A7XG4gIH1cblxuICBjb25zdCBjb250YWluZXJVcmwgPSB1cmwuaHJlZjtcblxuICBjb25zdCBjb250YWluZXIgPSBhd2FpdCBsb2FkTW9kdWxlKGNvbnRhaW5lclVybCk7XG4gIGF3YWl0IGNvbnRhaW5lci5pbml0KF9fd2VicGFja19zaGFyZV9zY29wZXNfXy5kZWZhdWx0KTtcblxuICByZW1vdGVDb250YWluZXJNYXAuc2V0KHJlbW90ZU5hbWUsIGNvbnRhaW5lcik7XG4gIHJldHVybiBjb250YWluZXI7XG59XG4iXX0=","/**\n * Generated bundle index. Do not edit.\n */\nexport * from './index';\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibngtYW5ndWxhci1tZi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2FuZ3VsYXIvbWYvbngtYW5ndWxhci1tZi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUVILGNBQWMsU0FBUyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBHZW5lcmF0ZWQgYnVuZGxlIGluZGV4LiBEbyBub3QgZWRpdC5cbiAqL1xuXG5leHBvcnQgKiBmcm9tICcuL2luZGV4JztcbiJdfQ=="],"names":[],"mappings":"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"}
package/migrations.json CHANGED
@@ -303,43 +303,43 @@
303
303
  "description": "Change the data persistence operator imports to '@ngrx/router-store/data-persistence'.",
304
304
  "factory": "./src/migrations/update-21-0-0/change-data-persistence-operators-imports-to-ngrx-router-store-data-persistence"
305
305
  },
306
- "update-angular-cli-version-20-0-0-rc-3": {
306
+ "update-angular-cli-version-20-0-0": {
307
307
  "cli": "nx",
308
- "version": "21.2.0-beta.0",
308
+ "version": "21.2.0-beta.3",
309
309
  "requires": {
310
- "@angular/core": ">=20.0.0-rc.2"
310
+ "@angular/core": ">=20.0.0"
311
311
  },
312
- "description": "Update the @angular/cli package version to 20.0.0-rc.3.",
312
+ "description": "Update the @angular/cli package version to ~20.0.0.",
313
313
  "factory": "./src/migrations/update-21-2-0/update-angular-cli"
314
314
  },
315
315
  "migrate-provide-server-rendering-import": {
316
- "version": "21.2.0-beta.0",
316
+ "version": "21.2.0-beta.3",
317
317
  "requires": {
318
- "@angular/core": ">=20.0.0-rc.2"
318
+ "@angular/core": ">=20.0.0"
319
319
  },
320
320
  "description": "Migrate imports of `provideServerRendering` from `@angular/platform-server` to `@angular/ssr`.",
321
321
  "factory": "./src/migrations/update-21-2-0/migrate-provide-server-rendering-import"
322
322
  },
323
323
  "replace-provide-server-routing": {
324
- "version": "21.2.0-beta.0",
324
+ "version": "21.2.0-beta.3",
325
325
  "requires": {
326
- "@angular/core": ">=20.0.0-rc.2"
326
+ "@angular/core": ">=20.0.0"
327
327
  },
328
- "description": "Replace `provideServerRouting` with `provideServerRendering` using `withRoutes`.",
328
+ "description": "Replace `provideServerRouting` and `provideServerRoutesConfig` with `provideServerRendering` using `withRoutes`.",
329
329
  "factory": "./src/migrations/update-21-2-0/replace-provide-server-routing"
330
330
  },
331
331
  "set-generator-defaults-for-previous-style-guide": {
332
- "version": "21.2.0-beta.0",
332
+ "version": "21.2.0-beta.3",
333
333
  "requires": {
334
- "@angular/core": ">=20.0.0-rc.2"
334
+ "@angular/core": ">=20.0.0"
335
335
  },
336
336
  "description": "Update the generator defaults to maintain the previous style guide behavior.",
337
337
  "factory": "./src/migrations/update-21-2-0/set-generator-defaults-for-previous-style-guide"
338
338
  },
339
339
  "update-module-resolution": {
340
- "version": "21.2.0-beta.0",
340
+ "version": "21.2.0-beta.3",
341
341
  "requires": {
342
- "@angular/core": ">=20.0.0-rc.2"
342
+ "@angular/core": ">=20.0.0"
343
343
  },
344
344
  "description": "Update 'moduleResolution' to 'bundler' in TypeScript configurations. You can read more about this here: https://www.typescriptlang.org/tsconfig/#moduleResolution.",
345
345
  "factory": "./src/migrations/update-21-2-0/update-module-resolution"
@@ -1667,66 +1667,145 @@
1667
1667
  }
1668
1668
  },
1669
1669
  "21.2.0": {
1670
- "version": "21.2.0-beta.0",
1670
+ "version": "21.2.0-beta.3",
1671
1671
  "x-prompt": "Do you want to update the Angular version to v20?",
1672
1672
  "requires": {
1673
- "@angular/core": ">=19.2.0 <20.0.0-rc.2"
1673
+ "@angular/core": ">=19.2.0 <20.0.0"
1674
1674
  },
1675
1675
  "packages": {
1676
1676
  "@angular-devkit/build-angular": {
1677
- "version": "20.0.0-rc.3",
1677
+ "version": "~20.0.0",
1678
1678
  "alwaysAddToPackageJson": false
1679
1679
  },
1680
1680
  "@angular-devkit/core": {
1681
- "version": "20.0.0-rc.3",
1681
+ "version": "~20.0.0",
1682
1682
  "alwaysAddToPackageJson": false
1683
1683
  },
1684
1684
  "@angular-devkit/schematics": {
1685
- "version": "20.0.0-rc.3",
1685
+ "version": "~20.0.0",
1686
1686
  "alwaysAddToPackageJson": false
1687
1687
  },
1688
1688
  "@angular/build": {
1689
- "version": "20.0.0-rc.3",
1689
+ "version": "~20.0.0",
1690
1690
  "alwaysAddToPackageJson": false
1691
1691
  },
1692
1692
  "@angular/pwa": {
1693
- "version": "20.0.0-rc.3",
1693
+ "version": "~20.0.0",
1694
1694
  "alwaysAddToPackageJson": false
1695
1695
  },
1696
1696
  "@angular/ssr": {
1697
- "version": "20.0.0-rc.3",
1697
+ "version": "~20.0.0",
1698
1698
  "alwaysAddToPackageJson": false
1699
1699
  },
1700
1700
  "@schematics/angular": {
1701
- "version": "20.0.0-rc.3",
1701
+ "version": "~20.0.0",
1702
1702
  "alwaysAddToPackageJson": false
1703
1703
  },
1704
1704
  "@angular-devkit/architect": {
1705
- "version": "0.2000.0-rc.3",
1705
+ "version": "~0.2000.0",
1706
1706
  "alwaysAddToPackageJson": false
1707
1707
  },
1708
1708
  "@angular-devkit/build-webpack": {
1709
- "version": "0.2000.0-rc.3",
1709
+ "version": "~0.2000.0",
1710
1710
  "alwaysAddToPackageJson": false
1711
1711
  },
1712
1712
  "@angular/core": {
1713
- "version": "20.0.0-rc.2",
1713
+ "version": "~20.0.0",
1714
1714
  "alwaysAddToPackageJson": true
1715
1715
  },
1716
1716
  "@angular/material": {
1717
- "version": "20.0.0-rc.2",
1717
+ "version": "~20.0.0",
1718
1718
  "alwaysAddToPackageJson": false
1719
1719
  },
1720
1720
  "@angular/cdk": {
1721
- "version": "20.0.0-rc.2",
1721
+ "version": "~20.0.0",
1722
1722
  "alwaysAddToPackageJson": false
1723
1723
  },
1724
1724
  "@angular/google-maps": {
1725
- "version": "20.0.0-rc.2",
1725
+ "version": "~20.0.0",
1726
1726
  "alwaysAddToPackageJson": false
1727
1727
  },
1728
1728
  "ng-packagr": {
1729
- "version": "20.0.0-rc.1",
1729
+ "version": "~20.0.0",
1730
+ "alwaysAddToPackageJson": false
1731
+ }
1732
+ }
1733
+ },
1734
+ "21.2.0-angular-eslint": {
1735
+ "version": "21.2.0-beta.3",
1736
+ "requires": {
1737
+ "@angular/core": ">= 20.0.0 < 21.0.0",
1738
+ "typescript-eslint": "^8.0.0",
1739
+ "eslint": "^8.57.0 || ^9.0.0"
1740
+ },
1741
+ "packages": {
1742
+ "angular-eslint": {
1743
+ "version": "^20.0.0",
1744
+ "alwaysAddToPackageJson": false
1745
+ }
1746
+ }
1747
+ },
1748
+ "21.2.0-@angular-eslint": {
1749
+ "version": "21.2.0-beta.3",
1750
+ "requires": {
1751
+ "@angular/core": ">= 20.0.0 < 21.0.0",
1752
+ "eslint": "^8.57.0 || ^9.0.0"
1753
+ },
1754
+ "packages": {
1755
+ "@angular-eslint/eslint-plugin": {
1756
+ "version": "^20.0.0",
1757
+ "alwaysAddToPackageJson": false
1758
+ },
1759
+ "@angular-eslint/eslint-plugin-template": {
1760
+ "version": "^20.0.0",
1761
+ "alwaysAddToPackageJson": false
1762
+ },
1763
+ "@angular-eslint/template-parser": {
1764
+ "version": "^20.0.0",
1765
+ "alwaysAddToPackageJson": false
1766
+ },
1767
+ "@angular-eslint/utils": {
1768
+ "version": "^20.0.0",
1769
+ "alwaysAddToPackageJson": false
1770
+ },
1771
+ "@angular-eslint/schematics": {
1772
+ "version": "^20.0.0",
1773
+ "alwaysAddToPackageJson": false
1774
+ },
1775
+ "@angular-eslint/test-utils": {
1776
+ "version": "^20.0.0",
1777
+ "alwaysAddToPackageJson": false
1778
+ },
1779
+ "@angular-eslint/builder": {
1780
+ "version": "^20.0.0",
1781
+ "alwaysAddToPackageJson": false
1782
+ },
1783
+ "@angular-eslint/bundled-angular-compiler": {
1784
+ "version": "^20.0.0",
1785
+ "alwaysAddToPackageJson": false
1786
+ }
1787
+ }
1788
+ },
1789
+ "21.2.0-angular-rspack": {
1790
+ "version": "21.2.0-beta.3",
1791
+ "packages": {
1792
+ "@nx/angular-rspack": {
1793
+ "version": "^21.1.0",
1794
+ "alwaysAddToPackageJson": false
1795
+ }
1796
+ }
1797
+ },
1798
+ "21.2.0-jest": {
1799
+ "version": "21.2.0-beta.3",
1800
+ "requires": {
1801
+ "@angular/compiler-cli": ">=15.0.0 <21.0.0",
1802
+ "@angular/core": ">=15.0.0 <21.0.0",
1803
+ "@angular/platform-browser-dynamic": ">=15.0.0 <21.0.0",
1804
+ "jest": "^29.0.0"
1805
+ },
1806
+ "packages": {
1807
+ "jest-preset-angular": {
1808
+ "version": "~14.6.0",
1730
1809
  "alwaysAddToPackageJson": false
1731
1810
  }
1732
1811
  }
package/ng-package.json CHANGED
@@ -7,28 +7,14 @@
7
7
  "deleteDestPath": false,
8
8
  "allowedNonPeerDependencies": [
9
9
  "@nx/",
10
- "@angular-devkit",
11
- "@angular-eslint/",
12
- "@module-federation/enhanced",
13
- "@schematics",
14
10
  "@phenomnomnominal/tsquery",
15
11
  "@typescript-eslint/",
12
+ "enquirer",
13
+ "magic-string",
16
14
  "picocolors",
17
- "ignore",
18
15
  "picomatch",
19
- "rxjs-for-await",
20
- "webpack-merge",
21
- "ts-node",
22
- "tsconfig-paths",
23
16
  "semver",
24
- "webpack",
25
- "express",
26
- "http-proxy-middleware",
27
- "http-server",
28
- "magic-string",
29
- "enquirer",
30
- "find-cache-dir",
31
- "webpack"
17
+ "webpack-merge"
32
18
  ],
33
19
  "keepLifecycleScripts": true
34
20
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nx/angular",
3
- "version": "21.2.0-beta.1",
3
+ "version": "21.2.0-beta.3",
4
4
  "private": false,
5
5
  "description": "The Nx Plugin for Angular contains executors, generators, and utilities for managing Angular applications and libraries within an Nx workspace. It provides: \n\n- Integration with libraries such as Storybook, Jest, ESLint, Tailwind CSS, Playwright and Cypress. \n\n- Generators to help scaffold code quickly (like: Micro Frontends, Libraries, both internal to your codebase and publishable to npm) \n\n- Single Component Application Modules (SCAMs) \n\n- NgRx helpers. \n\n- Utilities for automatic workspace refactoring.",
6
6
  "repository": {
@@ -58,14 +58,14 @@
58
58
  "migrations": "./migrations.json"
59
59
  },
60
60
  "dependencies": {
61
- "@nx/devkit": "21.2.0-beta.1",
62
- "@nx/eslint": "21.2.0-beta.1",
63
- "@nx/js": "21.2.0-beta.1",
64
- "@nx/module-federation": "21.2.0-beta.1",
65
- "@nx/rspack": "21.2.0-beta.1",
66
- "@nx/web": "21.2.0-beta.1",
67
- "@nx/webpack": "21.2.0-beta.1",
68
- "@nx/workspace": "21.2.0-beta.1",
61
+ "@nx/devkit": "21.2.0-beta.3",
62
+ "@nx/eslint": "21.2.0-beta.3",
63
+ "@nx/js": "21.2.0-beta.3",
64
+ "@nx/module-federation": "21.2.0-beta.3",
65
+ "@nx/rspack": "21.2.0-beta.3",
66
+ "@nx/web": "21.2.0-beta.3",
67
+ "@nx/webpack": "21.2.0-beta.3",
68
+ "@nx/workspace": "21.2.0-beta.3",
69
69
  "@phenomnomnominal/tsquery": "~5.0.1",
70
70
  "@typescript-eslint/type-utils": "^8.0.0",
71
71
  "enquirer": "~2.3.6",
@@ -46,7 +46,7 @@ function createNgEntryPoint(packageJson, ngPackageJson, basePath, secondaryData)
46
46
  directory: ensureUnixPath(secondaryDir),
47
47
  declarations: pathJoinWithDest('tmp-typings', secondaryDir, `${flatModuleFile}.d.ts`),
48
48
  // changed to use esm2022
49
- declarationsBundled: pathJoinWithDest('esm2022', secondaryDir, `${flatModuleFile}.d.ts`),
49
+ declarationsBundled: pathJoinWithDest(secondaryDir, `${flatModuleFile}.d.ts`),
50
50
  declarationsDir: pathJoinWithDest(secondaryDir),
51
51
  esm2022: pathJoinWithDest('tmp-esm2022', secondaryDir, `${flatModuleFile}.js`),
52
52
  // changed to use esm2022
@@ -14,6 +14,16 @@ const node_path_1 = require("node:path");
14
14
  const ng_packagr_version_1 = require("../../../../utilities/ng-packagr/ng-packagr-version");
15
15
  const package_imports_1 = require("../../../../utilities/ng-packagr/package-imports");
16
16
  const entry_point_1 = require("./entry-point");
17
+ async function shouldWriteFile(filePath, newContent) {
18
+ try {
19
+ const existingContent = await (0, promises_1.readFile)(filePath, 'utf-8');
20
+ return existingContent !== newContent;
21
+ }
22
+ catch (error) {
23
+ // If we can't read the existing file (including if it doesn't exist), write the new one
24
+ return true;
25
+ }
26
+ }
17
27
  const writeBundlesTransform = (_options) => {
18
28
  const { major: ngPackagrMajorVersion } = (0, ng_packagr_version_1.getNgPackagrVersionInfo)();
19
29
  const { BuildGraph } = (0, package_imports_1.importNgPackagrPath)('ng-packagr/src/lib/graph/build-graph', ngPackagrMajorVersion);
@@ -29,9 +39,11 @@ const writeBundlesTransform = (_options) => {
29
39
  entry.data.destinationFiles = entryPoint.destinationFiles;
30
40
  for (const [path, outputCache] of entry.cache.outputCache.entries()) {
31
41
  const normalizedPath = normalizeEsm2022Path(path, entryPoint);
32
- // write the outputs to the file system
33
- await (0, promises_1.mkdir)((0, node_path_1.dirname)(normalizedPath), { recursive: true });
34
- await (0, promises_1.writeFile)(normalizedPath, outputCache.content);
42
+ // Only write if content has changed
43
+ if (await shouldWriteFile(normalizedPath, outputCache.content)) {
44
+ await (0, promises_1.mkdir)((0, node_path_1.dirname)(normalizedPath), { recursive: true });
45
+ await (0, promises_1.writeFile)(normalizedPath, outputCache.content);
46
+ }
35
47
  }
36
48
  if (!entry.cache.outputCache.size && entryPoint.isSecondaryEntryPoint) {
37
49
  await (0, promises_1.mkdir)(entryPoint.destinationPath, { recursive: true });
@@ -47,16 +59,17 @@ const writeBundlesTransform = (_options) => {
47
59
  };
48
60
  exports.writeBundlesTransform = writeBundlesTransform;
49
61
  function normalizeEsm2022Path(path, entryPoint) {
62
+ const normalizedPath = (0, node_path_1.normalize)(path);
50
63
  if (!entryPoint.primaryDestinationPath) {
51
- return path;
64
+ return normalizedPath;
52
65
  }
53
- if (path.startsWith((0, node_path_1.join)(entryPoint.primaryDestinationPath, 'tmp-esm2022'))) {
54
- return path.replace('tmp-esm2022', 'esm2022');
66
+ if (normalizedPath.startsWith((0, node_path_1.join)(entryPoint.primaryDestinationPath, 'tmp-esm2022'))) {
67
+ return normalizedPath.replace('tmp-esm2022', 'esm2022');
55
68
  }
56
- if (path.startsWith((0, node_path_1.join)(entryPoint.primaryDestinationPath, 'tmp-typings'))) {
57
- return path.replace('tmp-typings', 'esm2022');
69
+ if (normalizedPath.startsWith((0, node_path_1.join)(entryPoint.primaryDestinationPath, 'tmp-typings'))) {
70
+ return normalizedPath.replace('tmp-typings', '');
58
71
  }
59
- return path;
72
+ return normalizedPath;
60
73
  }
61
74
  function toCustomNgEntryPoint(entryPoint) {
62
75
  return (0, entry_point_1.createNgEntryPoint)(entryPoint.packageJson, entryPoint.ngPackageJson, entryPoint.basePath,
@@ -55,10 +55,6 @@ async function addLintingGenerator(tree, options) {
55
55
  style: 'kebab-case',
56
56
  },
57
57
  ],
58
- // Temporary disable these rules until Angular ESLint recommended
59
- // rules are updated with the new Style Guide
60
- '@angular-eslint/component-class-suffix': 'off',
61
- '@angular-eslint/directive-class-suffix': 'off',
62
58
  },
63
59
  });
64
60
  (0, eslint_file_1.addOverrideToLintConfig)(tree, options.projectRoot, {
@@ -99,10 +95,6 @@ async function addLintingGenerator(tree, options) {
99
95
  style: 'kebab-case',
100
96
  },
101
97
  ],
102
- // Temporary disable these rules until Angular ESLint recommended
103
- // rules are updated with the new Style Guide
104
- '@angular-eslint/component-class-suffix': 'off',
105
- '@angular-eslint/directive-class-suffix': 'off',
106
98
  },
107
99
  },
108
100
  {
@@ -6,10 +6,10 @@
6
6
  },
7
7
  "files": [],
8
8
  "include": [],
9
- "references": [
9
+ "references": [<% if (angularMajorVersion < 20) { %>
10
10
  {
11
11
  "path": "./tsconfig.editor.json"
12
- },
12
+ },<% } %>
13
13
  {
14
14
  "path": "./tsconfig.app.json"
15
15
  }
@@ -1,12 +1,11 @@
1
1
  import { TestBed } from '@angular/core/testing';
2
2
  import { App<%= componentType %> } from './app<%= componentFileSuffix %>';<% if(!minimal) { %>
3
- import { NxWelcome<%= componentType %> } from './nx-welcome<%= componentFileSuffix %>';<% } %><% if(routing) { %>
4
- import { RouterModule } from '@angular/router';<% } %>
3
+ import { NxWelcome<%= componentType %> } from './nx-welcome<%= componentFileSuffix %>';<% } %>
5
4
 
6
5
  describe('App<%= componentType %>', () => {
7
6
  beforeEach(async () => {
8
7
  await TestBed.configureTestingModule({
9
- imports: [App<%= componentType %><% if(!minimal) { %>, NxWelcome<%= componentType %><% } %><% if(routing) { %>, RouterModule.forRoot([])<% } %>],
8
+ imports: [App<%= componentType %><% if(!minimal) { %>, NxWelcome<%= componentType %><% } %>],
10
9
  }).compileComponents();
11
10
  });
12
11
 
@@ -4,8 +4,8 @@ exports.updateTsconfigFiles = updateTsconfigFiles;
4
4
  const devkit_1 = require("@nx/devkit");
5
5
  const js_1 = require("@nx/js");
6
6
  const configuration_1 = require("@nx/js/src/utils/typescript/configuration");
7
- const semver_1 = require("semver");
8
7
  const ensure_typescript_1 = require("@nx/js/src/utils/typescript/ensure-typescript");
8
+ const semver_1 = require("semver");
9
9
  const update_app_editor_tsconfig_excluded_files_1 = require("../../utils/update-app-editor-tsconfig-excluded-files");
10
10
  const version_utils_1 = require("../../utils/version-utils");
11
11
  const enable_strict_type_checking_1 = require("./enable-strict-type-checking");
@@ -43,7 +43,8 @@ function updateTsconfigFiles(tree, options) {
43
43
  compilerOptions.esModuleInterop = true;
44
44
  }
45
45
  }
46
- (0, devkit_1.updateJson)(tree, `${options.appProjectRoot}/tsconfig.json`, (json) => {
46
+ const tsconfigPath = (0, devkit_1.joinPathFragments)(options.appProjectRoot, 'tsconfig.json');
47
+ (0, devkit_1.updateJson)(tree, tsconfigPath, (json) => {
47
48
  json.compilerOptions = {
48
49
  ...json.compilerOptions,
49
50
  ...compilerOptions,
@@ -51,8 +52,24 @@ function updateTsconfigFiles(tree, options) {
51
52
  json.compilerOptions = (0, configuration_1.getNeededCompilerOptionOverrides)(tree, json.compilerOptions, rootTsConfigPath);
52
53
  return json;
53
54
  });
55
+ if (options.unitTestRunner === 'jest') {
56
+ const tsconfigSpecPath = (0, devkit_1.joinPathFragments)(options.appProjectRoot, 'tsconfig.spec.json');
57
+ (0, devkit_1.updateJson)(tree, tsconfigSpecPath, (json) => {
58
+ json.compilerOptions = {
59
+ ...json.compilerOptions,
60
+ module: 'commonjs',
61
+ moduleResolution: 'node10',
62
+ };
63
+ json.compilerOptions = (0, configuration_1.getNeededCompilerOptionOverrides)(tree, json.compilerOptions, tsconfigPath);
64
+ return json;
65
+ });
66
+ }
54
67
  }
55
68
  function updateEditorTsConfig(tree, options) {
69
+ const tsconfigEditorPath = (0, devkit_1.joinPathFragments)(options.appProjectRoot, 'tsconfig.editor.json');
70
+ if (!tree.exists(tsconfigEditorPath)) {
71
+ return;
72
+ }
56
73
  const appTsConfig = (0, devkit_1.readJson)(tree, (0, devkit_1.joinPathFragments)(options.appProjectRoot, 'tsconfig.app.json'));
57
74
  const types = appTsConfig?.compilerOptions?.types ?? [];
58
75
  if (types?.length) {
@@ -1,8 +1,7 @@
1
1
  import type { Meta, StoryObj } from '@storybook/angular';
2
2
  import { <%=componentName%> } from './<%=componentFileName%>';
3
3
  <%_ if ( interactionTests ) { _%>
4
- import { within } from '@storybook/testing-library';
5
- import { expect } from '@storybook/jest';
4
+ import { expect } from 'storybook/test';
6
5
  <%_ } _%>
7
6
 
8
7
  const meta: Meta<<%= componentName %>> = {
@@ -23,9 +22,8 @@ export const Heading: Story = {
23
22
  args: {<% for (let prop of props) { %>
24
23
  <%= prop.name %>: <%- prop.defaultValue %>,<% } %>
25
24
  },
26
- play: async ({ canvasElement }) => {
27
- const canvas = within(canvasElement);
28
- expect(canvas.getByText(/<%=componentNameSimple%> works!/gi)).toBeTruthy();
25
+ play: async ({ canvas }) => {
26
+ await expect(canvas.getByText(/<%=componentNameSimple%> works!/gi)).toBeTruthy();
29
27
  },
30
28
  };
31
- <%_ } _%>
29
+ <%_ } _%>
@@ -1,4 +1,4 @@
1
- import { type Tree, GeneratorCallback } from '@nx/devkit';
1
+ import { type GeneratorCallback, type Tree } from '@nx/devkit';
2
2
  import type { ConvertToRspackSchema } from './schema';
3
3
  export declare function convertToRspack(tree: Tree, schema: ConvertToRspackSchema): Promise<GeneratorCallback>;
4
4
  export default convertToRspack;
@@ -2,15 +2,16 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.convertToRspack = convertToRspack;
4
4
  const devkit_1 = require("@nx/devkit");
5
+ const executor_options_utils_1 = require("@nx/devkit/src/generators/executor-options-utils");
6
+ const get_named_inputs_1 = require("@nx/devkit/src/utils/get-named-inputs");
7
+ const enquirer_1 = require("enquirer");
8
+ const path_1 = require("path");
9
+ const posix_1 = require("path/posix");
5
10
  const versions_1 = require("../../utils/versions");
6
11
  const create_config_1 = require("./lib/create-config");
7
12
  const get_custom_webpack_config_1 = require("./lib/get-custom-webpack-config");
8
13
  const update_tsconfig_1 = require("./lib/update-tsconfig");
9
14
  const validate_supported_executor_1 = require("./lib/validate-supported-executor");
10
- const posix_1 = require("path/posix");
11
- const path_1 = require("path");
12
- const executor_options_utils_1 = require("@nx/devkit/src/generators/executor-options-utils");
13
- const enquirer_1 = require("enquirer");
14
15
  const SUPPORTED_EXECUTORS = [
15
16
  '@angular-devkit/build-angular:browser',
16
17
  '@angular-devkit/build-angular:dev-server',
@@ -164,10 +165,6 @@ function handleBuildTargetOptions(tree, options, newConfigurationOptions, root)
164
165
  customWebpackConfigPath = options.customWebpackConfig.path;
165
166
  delete options.customWebpackConfig;
166
167
  }
167
- if (options.outputs) {
168
- // handled by the Rspack inference plugin
169
- delete options.outputs;
170
- }
171
168
  for (const [key, value] of Object.entries(options)) {
172
169
  let optionName = key;
173
170
  let optionValue = key in PATH_NORMALIZER ? PATH_NORMALIZER[key](tree, value, root) : value;
@@ -247,8 +244,9 @@ async function convertToRspack(tree, schema) {
247
244
  root: project.root,
248
245
  };
249
246
  const configurationOptions = {};
250
- const buildTargetNames = [];
251
- const serveTargetNames = [];
247
+ let buildTarget;
248
+ let serveTarget;
249
+ const targetsToRemove = [];
252
250
  let customWebpackConfigPath;
253
251
  (0, validate_supported_executor_1.validateSupportedBuildExecutor)(Object.values(project.targets));
254
252
  let projectServePort = DEFAULT_PORT;
@@ -262,14 +260,15 @@ async function convertToRspack(tree, schema) {
262
260
  handleBuildTargetOptions(tree, configuration, configurationOptions[configurationName], project.root);
263
261
  }
264
262
  }
265
- buildTargetNames.push(targetName);
263
+ buildTarget = { name: targetName, config: target };
264
+ targetsToRemove.push(targetName);
266
265
  }
267
266
  else if (target.executor === '@angular-devkit/build-angular:server' ||
268
267
  target.executor === '@nx/angular:webpack-server') {
269
268
  createConfigOptions.ssr ??= {};
270
269
  createConfigOptions.ssr.entry ??= normalizeFromProjectRoot(tree, target.options.main, project.root);
271
270
  createConfigOptions.server = './src/main.server.ts';
272
- buildTargetNames.push(targetName);
271
+ targetsToRemove.push(targetName);
273
272
  }
274
273
  else if (target.executor === '@angular-devkit/build-angular:dev-server' ||
275
274
  target.executor === '@nx/angular:dev-server' ||
@@ -277,7 +276,7 @@ async function convertToRspack(tree, schema) {
277
276
  createConfigOptions.devServer = {};
278
277
  if (target.options) {
279
278
  handleDevServerTargetOptions(tree, target.options, createConfigOptions.devServer, project.root);
280
- if (target.options.port !== DEFAULT_PORT) {
279
+ if (target.options.port && target.options.port !== DEFAULT_PORT) {
281
280
  projectServePort = target.options.port;
282
281
  }
283
282
  }
@@ -288,7 +287,8 @@ async function convertToRspack(tree, schema) {
288
287
  handleDevServerTargetOptions(tree, configuration, configurationOptions[configurationName].devServer, project.root);
289
288
  }
290
289
  }
291
- serveTargetNames.push(targetName);
290
+ serveTarget = { name: targetName, config: target };
291
+ targetsToRemove.push(targetName);
292
292
  }
293
293
  else if (target.executor === '@angular-devkit/build-angular:prerender') {
294
294
  if (target.options) {
@@ -309,11 +309,11 @@ async function convertToRspack(tree, schema) {
309
309
  }
310
310
  }
311
311
  }
312
- buildTargetNames.push(targetName);
312
+ targetsToRemove.push(targetName);
313
313
  }
314
314
  else if (target.executor === '@angular-devkit/build-angular:app-shell') {
315
315
  createConfigOptions.appShell = true;
316
- buildTargetNames.push(targetName);
316
+ targetsToRemove.push(targetName);
317
317
  }
318
318
  }
319
319
  const customWebpackConfigInfo = customWebpackConfigPath
@@ -321,20 +321,169 @@ async function convertToRspack(tree, schema) {
321
321
  : undefined;
322
322
  (0, create_config_1.createConfig)(tree, createConfigOptions, configurationOptions, customWebpackConfigInfo?.normalizedPathToCustomWebpackConfig, customWebpackConfigInfo?.isWebpackConfigFunction);
323
323
  (0, update_tsconfig_1.updateTsconfig)(tree, project.root);
324
- for (const targetName of [...buildTargetNames, ...serveTargetNames]) {
324
+ for (const targetName of targetsToRemove) {
325
325
  delete project.targets[targetName];
326
326
  }
327
- if (projectServePort !== DEFAULT_PORT) {
328
- project.targets.serve ??= {};
329
- project.targets.serve.options ??= {};
330
- project.targets.serve.options.port = projectServePort;
331
- }
332
327
  (0, devkit_1.updateProjectConfiguration)(tree, projectName, project);
328
+ // ensure plugin is registered
333
329
  const { rspackInitGenerator } = (0, devkit_1.ensurePackage)('@nx/rspack', versions_1.nxVersion);
334
330
  await rspackInitGenerator(tree, {
335
331
  addPlugin: true,
336
332
  framework: 'angular',
337
333
  });
334
+ // find the inferred target names
335
+ const nxJson = (0, devkit_1.readNxJson)(tree);
336
+ let inferredBuildTargetName = 'build';
337
+ let inferredServeTargetName = 'serve';
338
+ const pluginRegistration = nxJson.plugins.find((p) => typeof p === 'string' ? false : p.plugin === '@nx/rspack/plugin');
339
+ if (pluginRegistration) {
340
+ inferredBuildTargetName =
341
+ pluginRegistration.options.buildTargetName ?? inferredBuildTargetName;
342
+ inferredServeTargetName =
343
+ pluginRegistration.options.serveTargetName ?? inferredServeTargetName;
344
+ }
345
+ if (buildTarget) {
346
+ // these are all replaced by the inferred task
347
+ delete buildTarget.config.options;
348
+ delete buildTarget.config.configurations;
349
+ delete buildTarget.config.defaultConfiguration;
350
+ delete buildTarget.config.executor;
351
+ const shouldOverrideInputs = (inputs) => {
352
+ if (!inputs?.length) {
353
+ return false;
354
+ }
355
+ if (inputs.length === 2) {
356
+ // check whether the existing inputs would match the inferred task
357
+ // inputs with the exception of the @rspack/cli external dependency
358
+ // which webpack tasks wouldn't have
359
+ const namedInputs = (0, get_named_inputs_1.getNamedInputs)(project.root, {
360
+ nxJsonConfiguration: nxJson,
361
+ configFiles: [],
362
+ workspaceRoot: devkit_1.workspaceRoot,
363
+ });
364
+ if ('production' in namedInputs) {
365
+ return !['production', '^production'].every((input) => inputs.includes(input));
366
+ }
367
+ return !['default', '^default'].every((input) => inputs.includes(input));
368
+ }
369
+ return true;
370
+ };
371
+ if (shouldOverrideInputs(buildTarget.config.inputs)) {
372
+ // keep existing inputs and add the @rspack/cli external dependency
373
+ buildTarget.config.inputs = [
374
+ ...buildTarget.config.inputs,
375
+ { externalDependencies: ['@rspack/cli'] },
376
+ ];
377
+ }
378
+ else {
379
+ delete buildTarget.config.inputs;
380
+ }
381
+ if (buildTarget.config.cache) {
382
+ delete buildTarget.config.cache;
383
+ }
384
+ if (buildTarget.config.dependsOn?.length === 1 &&
385
+ buildTarget.config.dependsOn[0] === `^${buildTarget.name}`) {
386
+ delete buildTarget.config.dependsOn;
387
+ }
388
+ else if (buildTarget.config.dependsOn) {
389
+ buildTarget.config.dependsOn = buildTarget.config.dependsOn.map((dep) => dep === `^${buildTarget.name}` ? `^${inferredBuildTargetName}` : dep);
390
+ }
391
+ const newOutputPath = (0, devkit_1.joinPathFragments)(project.root, createConfigOptions.outputPath.base);
392
+ const shouldOverrideOutputs = (outputs) => {
393
+ if (!outputs?.length) {
394
+ // this means the target was wrongly configured, so, we don't override
395
+ // anything and let the inferred outputs be used
396
+ return false;
397
+ }
398
+ if (outputs.length === 1) {
399
+ if (outputs[0] === '{options.outputPath}') {
400
+ // the inferred task output is created after the createConfig
401
+ // outputPath option, so we don't need to keep this
402
+ return false;
403
+ }
404
+ const normalizedOutputPath = outputs[0]
405
+ .replace('{workspaceRoot}/', '')
406
+ .replace('{projectRoot}', project.root)
407
+ .replace('{projectName}', '');
408
+ if (normalizedOutputPath === newOutputPath ||
409
+ normalizedOutputPath.replace(/\/browser\/?$/, '') === newOutputPath) {
410
+ return false;
411
+ }
412
+ }
413
+ return true;
414
+ };
415
+ const normalizeOutput = (path, workspaceRoot, projectRoot) => {
416
+ const fullProjectRoot = (0, path_1.resolve)(workspaceRoot, projectRoot);
417
+ const fullPath = (0, path_1.resolve)(workspaceRoot, path);
418
+ const pathRelativeToProjectRoot = (0, devkit_1.normalizePath)((0, path_1.relative)(fullProjectRoot, fullPath));
419
+ if (pathRelativeToProjectRoot.startsWith('..')) {
420
+ return (0, devkit_1.joinPathFragments)('{workspaceRoot}', (0, path_1.relative)(workspaceRoot, fullPath));
421
+ }
422
+ return (0, devkit_1.joinPathFragments)('{projectRoot}', pathRelativeToProjectRoot);
423
+ };
424
+ if (shouldOverrideOutputs(buildTarget.config.outputs)) {
425
+ buildTarget.config.outputs = buildTarget.config.outputs.map((output) => {
426
+ if (output === '{options.outputPath}') {
427
+ // the target won't have an outputPath option, so we replace it with the new output path
428
+ return normalizeOutput(newOutputPath, devkit_1.workspaceRoot, project.root);
429
+ }
430
+ const normalizedOutputPath = output
431
+ .replace('{workspaceRoot}/', '')
432
+ .replace('{projectRoot}', project.root)
433
+ .replace('{projectName}', '');
434
+ if (/\/browser\/?$/.test(normalizedOutputPath) &&
435
+ normalizedOutputPath.replace(/\/browser\/?$/, '') === newOutputPath) {
436
+ return normalizeOutput(newOutputPath, devkit_1.workspaceRoot, project.root);
437
+ }
438
+ return output;
439
+ });
440
+ }
441
+ else {
442
+ delete buildTarget.config.outputs;
443
+ }
444
+ if (buildTarget.config.syncGenerators?.length === 1 &&
445
+ buildTarget.config.syncGenerators[0] === '@nx/js:typescript-sync') {
446
+ delete buildTarget.config.syncGenerators;
447
+ }
448
+ else if (buildTarget.config.syncGenerators?.length) {
449
+ buildTarget.config.syncGenerators = Array.from(new Set([
450
+ ...buildTarget.config.syncGenerators,
451
+ '@nx/js:typescript-sync',
452
+ ]));
453
+ }
454
+ if (Object.keys(buildTarget.config).length) {
455
+ // there's extra target metadata left that wouldn't be inferred, we keep it
456
+ project.targets[inferredBuildTargetName] = buildTarget.config;
457
+ }
458
+ }
459
+ if (serveTarget) {
460
+ delete serveTarget.config.options;
461
+ delete serveTarget.config.configurations;
462
+ delete serveTarget.config.defaultConfiguration;
463
+ delete serveTarget.config.executor;
464
+ if (serveTarget.config.continuous) {
465
+ delete serveTarget.config.continuous;
466
+ }
467
+ if (serveTarget.config.syncGenerators?.length === 1 &&
468
+ serveTarget.config.syncGenerators[0] === '@nx/js:typescript-sync') {
469
+ delete serveTarget.config.syncGenerators;
470
+ }
471
+ else if (serveTarget.config.syncGenerators?.length) {
472
+ serveTarget.config.syncGenerators = Array.from(new Set([
473
+ ...serveTarget.config.syncGenerators,
474
+ '@nx/js:typescript-sync',
475
+ ]));
476
+ }
477
+ if (projectServePort !== DEFAULT_PORT) {
478
+ serveTarget.config.options = {};
479
+ serveTarget.config.options.port = projectServePort;
480
+ }
481
+ if (Object.keys(serveTarget.config).length) {
482
+ // there's extra target metadata left that wouldn't be inferred, we keep it
483
+ project.targets[inferredServeTargetName] = serveTarget.config;
484
+ }
485
+ }
486
+ (0, devkit_1.updateProjectConfiguration)(tree, projectName, project);
338
487
  // This is needed to prevent a circular execution of the build target
339
488
  const rootPkgJson = (0, devkit_1.readJson)(tree, 'package.json');
340
489
  if (rootPkgJson.scripts?.build === 'nx build') {
@@ -19,6 +19,7 @@ function updateTsConfigFiles(tree, options) {
19
19
  experimentalDecorators: true,
20
20
  importHelpers: true,
21
21
  target: 'es2022',
22
+ moduleResolution: 'bundler',
22
23
  ...(options.strict
23
24
  ? {
24
25
  strict: true,
@@ -37,10 +38,10 @@ function updateTsConfigFiles(tree, options) {
37
38
  compilerOptions.module = 'preserve';
38
39
  }
39
40
  else {
40
- compilerOptions.moduleResolution = 'bundler';
41
41
  compilerOptions.module = 'es2022';
42
42
  }
43
- (0, devkit_1.updateJson)(tree, `${options.projectRoot}/tsconfig.json`, (json) => {
43
+ const tsconfigPath = (0, devkit_1.joinPathFragments)(options.projectRoot, 'tsconfig.json');
44
+ (0, devkit_1.updateJson)(tree, tsconfigPath, (json) => {
44
45
  json.compilerOptions = {
45
46
  ...json.compilerOptions,
46
47
  ...compilerOptions,
@@ -57,6 +58,18 @@ function updateTsConfigFiles(tree, options) {
57
58
  }
58
59
  return json;
59
60
  });
61
+ if (options.unitTestRunner === 'jest') {
62
+ const tsconfigSpecPath = (0, devkit_1.joinPathFragments)(options.projectRoot, 'tsconfig.spec.json');
63
+ (0, devkit_1.updateJson)(tree, tsconfigSpecPath, (json) => {
64
+ json.compilerOptions = {
65
+ ...json.compilerOptions,
66
+ module: 'commonjs',
67
+ moduleResolution: 'node10',
68
+ };
69
+ json.compilerOptions = (0, configuration_1.getNeededCompilerOptionOverrides)(tree, json.compilerOptions, tsconfigPath);
70
+ return json;
71
+ });
72
+ }
60
73
  }
61
74
  function updateProjectConfig(host, options) {
62
75
  (0, devkit_1.updateJson)(host, `${options.projectRoot}/tsconfig.lib.json`, (json) => {
@@ -50,8 +50,8 @@ async function libraryGenerator(tree, schema) {
50
50
  }
51
51
  const project = await (0, add_project_1.addProject)(tree, libraryOptions);
52
52
  (0, create_files_1.createFiles)(tree, options, project);
53
- (0, update_tsconfig_files_1.updateTsConfigFiles)(tree, libraryOptions);
54
53
  await addUnitTestRunner(tree, libraryOptions);
54
+ (0, update_tsconfig_files_1.updateTsConfigFiles)(tree, libraryOptions);
55
55
  updateNpmScopeIfBuildableOrPublishable(tree, libraryOptions);
56
56
  (0, set_generator_defaults_1.setGeneratorDefaults)(tree, options);
57
57
  if (!libraryOptions.standalone) {
@@ -1,4 +1,4 @@
1
- import { GeneratorCallback, Tree } from '@nx/devkit';
1
+ import { Tree } from '@nx/devkit';
2
2
  import type { StoriesGeneratorOptions } from './schema';
3
- export declare function angularStoriesGenerator(tree: Tree, options: StoriesGeneratorOptions): Promise<GeneratorCallback>;
3
+ export declare function angularStoriesGenerator(tree: Tree, options: StoriesGeneratorOptions): Promise<void>;
4
4
  export default angularStoriesGenerator;
@@ -8,7 +8,6 @@ const component_info_1 = require("../utils/storybook-ast/component-info");
8
8
  const entry_point_1 = require("../utils/storybook-ast/entry-point");
9
9
  const module_info_1 = require("../utils/storybook-ast/module-info");
10
10
  const picomatch = require("picomatch");
11
- const versions_1 = require("../../utils/versions");
12
11
  async function angularStoriesGenerator(tree, options) {
13
12
  const entryPoints = (0, entry_point_1.getProjectEntryPoints)(tree, options.name);
14
13
  const componentsInfo = [];
@@ -33,16 +32,8 @@ async function angularStoriesGenerator(tree, options) {
33
32
  skipFormat: true,
34
33
  });
35
34
  }
36
- const tasks = [];
37
- if (options.interactionTests) {
38
- const { interactionTestsDependencies, addInteractionsInAddons } = (0, devkit_1.ensurePackage)('@nx/storybook', versions_1.nxVersion);
39
- const projectConfiguration = (0, devkit_1.readProjectConfiguration)(tree, options.name);
40
- addInteractionsInAddons(tree, projectConfiguration);
41
- tasks.push((0, devkit_1.addDependenciesToPackageJson)(tree, {}, interactionTestsDependencies()));
42
- }
43
35
  if (!options.skipFormat) {
44
36
  await (0, devkit_1.formatFiles)(tree);
45
37
  }
46
- return (0, devkit_1.runTasksInSerial)(...tasks);
47
38
  }
48
39
  exports.default = angularStoriesGenerator;
@@ -26,15 +26,22 @@ async function default_1(tree) {
26
26
  }
27
27
  function processFile(tree, filePath) {
28
28
  const content = tree.read(filePath, 'utf-8');
29
- if (!content.includes('provideServerRouting') ||
29
+ if ((!content.includes('provideServerRouting') &&
30
+ !content.includes('provideServerRoutesConfig')) ||
30
31
  !content.includes('@angular/ssr')) {
31
32
  return;
32
33
  }
33
34
  const sourceFile = tsquery_1.tsquery.ast(content);
34
- const providersArray = tsquery_1.tsquery.query(sourceFile, 'PropertyAssignment:has(Identifier[name=providers]) > ArrayLiteralExpression:has(CallExpression > Identifier[name=provideServerRouting])', { visitAllChildren: true })[0];
35
+ const providersArray = tsquery_1.tsquery.query(sourceFile, 'PropertyAssignment:has(Identifier[name=providers]) > ArrayLiteralExpression', { visitAllChildren: true })[0];
35
36
  if (!providersArray) {
36
37
  return;
37
38
  }
39
+ if (!providersArray.elements.some((el) => ts.isCallExpression(el) &&
40
+ ts.isIdentifier(el.expression) &&
41
+ (el.expression.getText() === 'provideServerRouting' ||
42
+ el.expression.getText() === 'provideServerRoutesConfig'))) {
43
+ return;
44
+ }
38
45
  const recorder = new file_change_recorder_1.FileChangeRecorder(tree, filePath);
39
46
  const printer = ts.createPrinter({
40
47
  newLine: ts.NewLineKind.LineFeed,
@@ -46,18 +53,21 @@ function processFile(tree, filePath) {
46
53
  if (node.expression.getText() === 'provideServerRendering') {
47
54
  provideServerRenderingCall = node;
48
55
  }
49
- else if (node.expression.getText() === 'provideServerRouting') {
56
+ else if (node.expression.getText() === 'provideServerRouting' ||
57
+ node.expression.getText() === 'provideServerRoutesConfig') {
50
58
  provideServerRoutingCall = node;
51
59
  }
52
60
  }
53
61
  const withRoutesCall = ts.factory.createCallExpression(ts.factory.createIdentifier('withRoutes'), undefined, [provideServerRoutingCall.arguments.at(0)]);
54
62
  let updatedProvidersArray;
55
63
  if (provideServerRenderingCall) {
56
- // remove the "provideServerRouting" call and update the existing "provideServerRendering" call
64
+ // remove the "provideServerRouting" and "provideServerRoutesConfig"
65
+ // calls and update the existing "provideServerRendering" call
57
66
  updatedProvidersArray = ts.factory.updateArrayLiteralExpression(providersArray, providersArray.elements
58
67
  .filter((el) => !(ts.isCallExpression(el) &&
59
68
  ts.isIdentifier(el.expression) &&
60
- el.expression.text === 'provideServerRouting'))
69
+ (el.expression.text === 'provideServerRouting' ||
70
+ el.expression.text === 'provideServerRoutesConfig')))
61
71
  .map((el) => {
62
72
  if (ts.isCallExpression(el) &&
63
73
  ts.isIdentifier(el.expression) &&
@@ -68,11 +78,13 @@ function processFile(tree, filePath) {
68
78
  }));
69
79
  }
70
80
  else {
71
- // replace the "provideServerRouting" call with the new "provideServerRendering" call
81
+ // replace the "provideServerRouting" and "provideServerRoutesConfig"
82
+ // calls with the new "provideServerRendering" call
72
83
  updatedProvidersArray = ts.factory.updateArrayLiteralExpression(providersArray, providersArray.elements.map((el) => {
73
84
  if (ts.isCallExpression(el) &&
74
85
  ts.isIdentifier(el.expression) &&
75
- el.expression.text === 'provideServerRouting') {
86
+ (el.expression.text === 'provideServerRouting' ||
87
+ el.expression.text === 'provideServerRoutesConfig')) {
76
88
  return ts.factory.createCallExpression(ts.factory.createIdentifier('provideServerRendering'), undefined, [withRoutesCall, ...provideServerRoutingCall.arguments.slice(1)]);
77
89
  }
78
90
  return el;
@@ -85,11 +97,12 @@ function processFile(tree, filePath) {
85
97
  if (importDecl?.importClause?.namedBindings) {
86
98
  const namedBindings = importDecl?.importClause.namedBindings;
87
99
  if (ts.isNamedImports(namedBindings)) {
88
- // remove the "provideServerRouting" import and ensure we have the "withRoutes" import
100
+ // remove the "provideServerRouting" and "provideServerRoutesConfig"
101
+ // imports and ensure we have the "withRoutes" import
89
102
  const updatedElementNames = new Set([
90
103
  ...namedBindings.elements
91
104
  .map((el) => el.getText())
92
- .filter((x) => x !== 'provideServerRouting'),
105
+ .filter((x) => x !== 'provideServerRouting' && x !== 'provideServerRoutesConfig'),
93
106
  'withRoutes',
94
107
  ]);
95
108
  const updatedNamedBindings = ts.factory.updateNamedImports(namedBindings, Array.from(updatedElementNames).map((name) => ts.factory.createImportSpecifier(false, undefined, ts.factory.createIdentifier(name))));
@@ -1,3 +1,3 @@
1
1
  import { Tree } from '@nx/devkit';
2
- export declare const angularCliVersion = "20.0.0-rc.3";
2
+ export declare const angularCliVersion = "~20.0.0";
3
3
  export default function (tree: Tree): Promise<void>;
@@ -3,7 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.angularCliVersion = void 0;
4
4
  exports.default = default_1;
5
5
  const devkit_1 = require("@nx/devkit");
6
- exports.angularCliVersion = '20.0.0-rc.3';
6
+ exports.angularCliVersion = '~20.0.0';
7
7
  async function default_1(tree) {
8
8
  let shouldFormat = false;
9
9
  (0, devkit_1.updateJson)(tree, 'package.json', (json) => {
@@ -1,8 +1,8 @@
1
1
  export declare const nxVersion: any;
2
- export declare const angularVersion = "20.0.0-rc.2";
3
- export declare const angularDevkitVersion = "20.0.0-rc.3";
4
- export declare const ngPackagrVersion = "20.0.0-rc.1";
5
- export declare const angularRspackVersion = "^21.0.1";
2
+ export declare const angularVersion = "~20.0.0";
3
+ export declare const angularDevkitVersion = "~20.0.0";
4
+ export declare const ngPackagrVersion = "~20.0.0";
5
+ export declare const angularRspackVersion = "^21.1.0";
6
6
  export declare const ngrxVersion = "^19.0.0";
7
7
  export declare const rxjsVersion = "~7.8.0";
8
8
  export declare const zoneJsVersion = "~0.15.0";
@@ -16,14 +16,14 @@ export declare const browserSyncVersion = "^3.0.0";
16
16
  export declare const moduleFederationNodeVersion = "^2.6.26";
17
17
  export declare const moduleFederationEnhancedVersion = "^0.9.0";
18
18
  export declare const webpackMergeVersion = "^5.8.0";
19
- export declare const angularEslintVersion = "^19.2.0";
19
+ export declare const angularEslintVersion = "^20.0.0";
20
20
  export declare const typescriptEslintVersion = "^7.16.0";
21
21
  export declare const tailwindVersion = "^3.0.2";
22
22
  export declare const postcssVersion = "^8.4.5";
23
23
  export declare const postcssUrlVersion = "~10.1.3";
24
24
  export declare const autoprefixerVersion = "^10.4.0";
25
25
  export declare const tsNodeVersion = "10.9.1";
26
- export declare const jestPresetAngularVersion = "~14.4.0";
26
+ export declare const jestPresetAngularVersion = "~14.6.0";
27
27
  export declare const typesNodeVersion = "18.16.9";
28
28
  export declare const jasmineMarblesVersion = "^0.9.2";
29
29
  export declare const jsoncEslintParserVersion = "^2.1.0";
@@ -2,10 +2,10 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.jsoncEslintParserVersion = exports.jasmineMarblesVersion = exports.typesNodeVersion = exports.jestPresetAngularVersion = exports.tsNodeVersion = exports.autoprefixerVersion = exports.postcssUrlVersion = exports.postcssVersion = exports.tailwindVersion = exports.typescriptEslintVersion = exports.angularEslintVersion = exports.webpackMergeVersion = exports.moduleFederationEnhancedVersion = exports.moduleFederationNodeVersion = exports.browserSyncVersion = exports.typesExpressVersion = exports.expressVersion = exports.typesCorsVersion = exports.corsVersion = exports.tsLibVersion = exports.angularJsVersion = exports.zoneJsVersion = exports.rxjsVersion = exports.ngrxVersion = exports.angularRspackVersion = exports.ngPackagrVersion = exports.angularDevkitVersion = exports.angularVersion = exports.nxVersion = void 0;
4
4
  exports.nxVersion = require('../../package.json').version;
5
- exports.angularVersion = '20.0.0-rc.2';
6
- exports.angularDevkitVersion = '20.0.0-rc.3';
7
- exports.ngPackagrVersion = '20.0.0-rc.1';
8
- exports.angularRspackVersion = '^21.0.1';
5
+ exports.angularVersion = '~20.0.0';
6
+ exports.angularDevkitVersion = '~20.0.0';
7
+ exports.ngPackagrVersion = '~20.0.0';
8
+ exports.angularRspackVersion = '^21.1.0';
9
9
  exports.ngrxVersion = '^19.0.0';
10
10
  exports.rxjsVersion = '~7.8.0';
11
11
  exports.zoneJsVersion = '~0.15.0';
@@ -19,14 +19,14 @@ exports.browserSyncVersion = '^3.0.0';
19
19
  exports.moduleFederationNodeVersion = '^2.6.26';
20
20
  exports.moduleFederationEnhancedVersion = '^0.9.0';
21
21
  exports.webpackMergeVersion = '^5.8.0';
22
- exports.angularEslintVersion = '^19.2.0';
22
+ exports.angularEslintVersion = '^20.0.0';
23
23
  exports.typescriptEslintVersion = '^7.16.0';
24
24
  exports.tailwindVersion = '^3.0.2';
25
25
  exports.postcssVersion = '^8.4.5';
26
26
  exports.postcssUrlVersion = '~10.1.3';
27
27
  exports.autoprefixerVersion = '^10.4.0';
28
28
  exports.tsNodeVersion = '10.9.1';
29
- exports.jestPresetAngularVersion = '~14.4.0';
29
+ exports.jestPresetAngularVersion = '~14.6.0';
30
30
  exports.typesNodeVersion = '18.16.9';
31
31
  exports.jasmineMarblesVersion = '^0.9.2';
32
32
  exports.jsoncEslintParserVersion = '^2.1.0';