From bba941ab4dfba12037d93d7f3dd7bdc7f6eacf67 Mon Sep 17 00:00:00 2001 From: Jason Jean Date: Wed, 4 Dec 2024 10:05:43 -0500 Subject: [PATCH 01/21] fix(core): move resolving plugins back to main thread (#29176) ## Current Behavior Resolving custom plugins to their paths to be loaded involves loading our default plugins. When plugin isolation, this loads the default plugins for each and every plugin worker. ## Expected Behavior Resolution of the plugins is the same and easily serializable to send to the worker. Resolving plugins on the main thread allows Nx to reuse the default plugins and decrease the memory usage greatly. ## Related Issue(s) Fixes # --- .../src/project-graph/plugins/get-plugins.ts | 19 +++-- .../plugins/isolation/messaging.ts | 3 + .../plugins/isolation/plugin-pool.ts | 8 ++- .../plugins/isolation/plugin-worker.ts | 26 +++++-- .../plugins/load-resolved-plugin.ts | 26 +++++++ .../nx/src/project-graph/plugins/loader.ts | 72 +++++++++---------- 6 files changed, 104 insertions(+), 50 deletions(-) create mode 100644 packages/nx/src/project-graph/plugins/load-resolved-plugin.ts diff --git a/packages/nx/src/project-graph/plugins/get-plugins.ts b/packages/nx/src/project-graph/plugins/get-plugins.ts index 83489795852a3..1a245d318d598 100644 --- a/packages/nx/src/project-graph/plugins/get-plugins.ts +++ b/packages/nx/src/project-graph/plugins/get-plugins.ts @@ -5,6 +5,9 @@ import { workspaceRoot } from '../../utils/workspace-root'; let currentPluginsConfigurationHash: string; let loadedPlugins: LoadedNxPlugin[]; +let pendingPluginsPromise: + | Promise void]> + | undefined; let cleanup: () => void; export async function getPlugins() { @@ -24,11 +27,10 @@ export async function getPlugins() { cleanup(); } + pendingPluginsPromise ??= loadNxPlugins(pluginsConfiguration, workspaceRoot); + currentPluginsConfigurationHash = pluginsConfigurationHash; - const [result, cleanupFn] = await loadNxPlugins( - pluginsConfiguration, - workspaceRoot - ); + const [result, cleanupFn] = await pendingPluginsPromise; cleanup = cleanupFn; loadedPlugins = result; return result; @@ -36,6 +38,9 @@ export async function getPlugins() { let loadedDefaultPlugins: LoadedNxPlugin[]; let cleanupDefaultPlugins: () => void; +let pendingDefaultPluginPromise: + | Promise void]> + | undefined; export async function getOnlyDefaultPlugins() { // If the plugins configuration has not changed, reuse the current plugins @@ -48,13 +53,17 @@ export async function getOnlyDefaultPlugins() { cleanupDefaultPlugins(); } - const [result, cleanupFn] = await loadNxPlugins([], workspaceRoot); + pendingDefaultPluginPromise ??= loadNxPlugins([], workspaceRoot); + + const [result, cleanupFn] = await pendingDefaultPluginPromise; cleanupDefaultPlugins = cleanupFn; loadedPlugins = result; return result; } export function cleanupPlugins() { + pendingPluginsPromise = undefined; + pendingDefaultPluginPromise = undefined; cleanup(); cleanupDefaultPlugins(); } diff --git a/packages/nx/src/project-graph/plugins/isolation/messaging.ts b/packages/nx/src/project-graph/plugins/isolation/messaging.ts index 950957aab51ae..f8e6e69a4378f 100644 --- a/packages/nx/src/project-graph/plugins/isolation/messaging.ts +++ b/packages/nx/src/project-graph/plugins/isolation/messaging.ts @@ -14,6 +14,9 @@ export interface PluginWorkerLoadMessage { payload: { plugin: PluginConfiguration; root: string; + name: string; + pluginPath: string; + shouldRegisterTSTranspiler: boolean; }; } diff --git a/packages/nx/src/project-graph/plugins/isolation/plugin-pool.ts b/packages/nx/src/project-graph/plugins/isolation/plugin-pool.ts index 740f8562ac68c..bb912362dd45e 100644 --- a/packages/nx/src/project-graph/plugins/isolation/plugin-pool.ts +++ b/packages/nx/src/project-graph/plugins/isolation/plugin-pool.ts @@ -16,6 +16,8 @@ import { isPluginWorkerResult, sendMessageOverSocket, } from './messaging'; +import { getNxRequirePaths } from '../../../utils/installation-directory'; +import { resolveNxPlugin } from '../loader'; const cleanupFunctions = new Set<() => void>(); @@ -59,6 +61,10 @@ export async function loadRemoteNxPlugin( if (nxPluginWorkerCache.has(cacheKey)) { return [nxPluginWorkerCache.get(cacheKey), () => {}]; } + const moduleName = typeof plugin === 'string' ? plugin : plugin.plugin; + + const { name, pluginPath, shouldRegisterTSTranspiler } = + await resolveNxPlugin(moduleName, root, getNxRequirePaths(root)); const { worker, socket } = await startPluginWorker(); @@ -77,7 +83,7 @@ export async function loadRemoteNxPlugin( const pluginPromise = new Promise((res, rej) => { sendMessageOverSocket(socket, { type: 'load', - payload: { plugin, root }, + payload: { plugin, root, name, pluginPath, shouldRegisterTSTranspiler }, }); // logger.verbose(`[plugin-worker] started worker: ${worker.pid}`); diff --git a/packages/nx/src/project-graph/plugins/isolation/plugin-worker.ts b/packages/nx/src/project-graph/plugins/isolation/plugin-worker.ts index 5bc4477a3bfb0..349ab00347916 100644 --- a/packages/nx/src/project-graph/plugins/isolation/plugin-worker.ts +++ b/packages/nx/src/project-graph/plugins/isolation/plugin-worker.ts @@ -4,6 +4,7 @@ import { consumeMessagesFromSocket } from '../../../utils/consume-messages-from- import { createServer } from 'net'; import { unlinkSync } from 'fs'; +import { registerPluginTSTranspiler } from '../loader'; if (process.env.NX_PERF_LOGGING === 'true') { require('../../../utils/perf-logging'); @@ -35,13 +36,30 @@ const server = createServer((socket) => { return; } return consumeMessage(socket, message, { - load: async ({ plugin: pluginConfiguration, root }) => { + load: async ({ + plugin: pluginConfiguration, + root, + name, + pluginPath, + shouldRegisterTSTranspiler, + }) => { if (loadTimeout) clearTimeout(loadTimeout); process.chdir(root); try { - const { loadNxPlugin } = await import('../loader'); - const [promise] = loadNxPlugin(pluginConfiguration, root); - plugin = await promise; + const { loadResolvedNxPluginAsync } = await import( + '../load-resolved-plugin' + ); + + // Register the ts-transpiler if we are pointing to a + // plain ts file that's not part of a plugin project + if (shouldRegisterTSTranspiler) { + registerPluginTSTranspiler(); + } + plugin = await loadResolvedNxPluginAsync( + pluginConfiguration, + pluginPath, + name + ); return { type: 'load-result', payload: { diff --git a/packages/nx/src/project-graph/plugins/load-resolved-plugin.ts b/packages/nx/src/project-graph/plugins/load-resolved-plugin.ts new file mode 100644 index 0000000000000..a77337581a26f --- /dev/null +++ b/packages/nx/src/project-graph/plugins/load-resolved-plugin.ts @@ -0,0 +1,26 @@ +import type { PluginConfiguration } from '../../config/nx-json'; +import { LoadedNxPlugin } from './internal-api'; +import { NxPlugin } from './public-api'; + +export async function loadResolvedNxPluginAsync( + pluginConfiguration: PluginConfiguration, + pluginPath: string, + name: string +) { + const plugin = await importPluginModule(pluginPath); + plugin.name ??= name; + return new LoadedNxPlugin(plugin, pluginConfiguration); +} + +async function importPluginModule(pluginPath: string): Promise { + const m = await import(pluginPath); + if ( + m.default && + ('createNodes' in m.default || + 'createNodesV2' in m.default || + 'createDependencies' in m.default) + ) { + return m.default; + } + return m; +} diff --git a/packages/nx/src/project-graph/plugins/loader.ts b/packages/nx/src/project-graph/plugins/loader.ts index 05661bcc93525..0e90af76855de 100644 --- a/packages/nx/src/project-graph/plugins/loader.ts +++ b/packages/nx/src/project-graph/plugins/loader.ts @@ -24,13 +24,13 @@ import { logger } from '../../utils/logger'; import type * as ts from 'typescript'; import { extname } from 'node:path'; -import type { NxPlugin } from './public-api'; import type { PluginConfiguration } from '../../config/nx-json'; import { retrieveProjectConfigurationsWithoutPluginInference } from '../utils/retrieve-workspace-files'; import { LoadedNxPlugin } from './internal-api'; import { LoadPluginError } from '../error-types'; import path = require('node:path/posix'); import { readTsConfig } from '../../plugins/js/utils/typescript'; +import { loadResolvedNxPluginAsync } from './load-resolved-plugin'; export function readPluginPackageJson( pluginName: string, @@ -200,18 +200,18 @@ export function getPluginPathAndName( root: string ) { let pluginPath: string; - let registerTSTranspiler = false; + let shouldRegisterTSTranspiler = false; try { pluginPath = require.resolve(moduleName, { paths, }); const extension = path.extname(pluginPath); - registerTSTranspiler = extension === '.ts'; + shouldRegisterTSTranspiler = extension === '.ts'; } catch (e) { if (e.code === 'MODULE_NOT_FOUND') { const plugin = resolveLocalNxPlugin(moduleName, projects, root); if (plugin) { - registerTSTranspiler = true; + shouldRegisterTSTranspiler = true; const main = readPluginMainFromProjectConfiguration( plugin.projectConfig ); @@ -226,18 +226,12 @@ export function getPluginPathAndName( } const packageJsonPath = path.join(pluginPath, 'package.json'); - // Register the ts-transpiler if we are pointing to a - // plain ts file that's not part of a plugin project - if (registerTSTranspiler) { - registerPluginTSTranspiler(); - } - const { name } = !['.ts', '.js'].some((x) => extname(moduleName) === x) && // Not trying to point to a ts or js file existsSync(packageJsonPath) // plugin has a package.json ? readJsonFile(packageJsonPath) // read name from package.json : { name: moduleName }; - return { pluginPath, name }; + return { pluginPath, name, shouldRegisterTSTranspiler }; } let projectsWithoutInference: Record; @@ -249,6 +243,27 @@ export function loadNxPlugin(plugin: PluginConfiguration, root: string) { ] as const; } +export async function resolveNxPlugin( + moduleName: string, + root: string, + paths: string[] +) { + try { + require.resolve(moduleName); + } catch { + // If a plugin cannot be resolved, we will need projects to resolve it + projectsWithoutInference ??= + await retrieveProjectConfigurationsWithoutPluginInference(root); + } + const { pluginPath, name, shouldRegisterTSTranspiler } = getPluginPathAndName( + moduleName, + paths, + projectsWithoutInference, + root + ); + return { pluginPath, name, shouldRegisterTSTranspiler }; +} + export async function loadNxPluginAsync( pluginConfiguration: PluginConfiguration, paths: string[], @@ -259,37 +274,14 @@ export async function loadNxPluginAsync( ? pluginConfiguration : pluginConfiguration.plugin; try { - try { - require.resolve(moduleName); - } catch { - // If a plugin cannot be resolved, we will need projects to resolve it - projectsWithoutInference ??= - await retrieveProjectConfigurationsWithoutPluginInference(root); - } - const { pluginPath, name } = getPluginPathAndName( - moduleName, - paths, - projectsWithoutInference, - root - ); - const plugin = await importPluginModule(pluginPath); - plugin.name ??= name; + const { pluginPath, name, shouldRegisterTSTranspiler } = + await resolveNxPlugin(moduleName, root, paths); - return new LoadedNxPlugin(plugin, pluginConfiguration); + if (shouldRegisterTSTranspiler) { + registerPluginTSTranspiler(); + } + return loadResolvedNxPluginAsync(pluginConfiguration, pluginPath, name); } catch (e) { throw new LoadPluginError(moduleName, e); } } - -async function importPluginModule(pluginPath: string): Promise { - const m = await import(pluginPath); - if ( - m.default && - ('createNodes' in m.default || - 'createNodesV2' in m.default || - 'createDependencies' in m.default) - ) { - return m.default; - } - return m; -} From db5e2f63bf80ab376b3b6740f327d538610d18f2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Leosvel=20P=C3=A9rez=20Espinosa?= Date: Wed, 4 Dec 2024 17:28:49 +0100 Subject: [PATCH 02/21] docs(core): update nx sync messaging in npm workspaces tutorial (#29188) Update the npm workspaces tutorial to reflect the changes made in https://github.com/nrwl/nx/pull/29149. Updated doc: https://nx-dev-git-docs-nx-sync-terminal-output-nrwl.vercel.app/getting-started/tutorials/npm-workspaces-tutorial ## Current Behavior ## Expected Behavior ## Related Issue(s) Fixes # --- docs/shared/tutorials/npm-workspaces.md | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/docs/shared/tutorials/npm-workspaces.md b/docs/shared/tutorials/npm-workspaces.md index c98da9fee6c49..63e988b5605b1 100644 --- a/docs/shared/tutorials/npm-workspaces.md +++ b/docs/shared/tutorials/npm-workspaces.md @@ -329,10 +329,9 @@ Now if you run run the build, Nx will notice that the TypeScript project referen ```text {% command="nx build @tuskdesign/zoo" path="~/tuskydesigns" %} NX The workspace is out of sync -The @nx/js:typescript-sync sync generator identified 6 files in the workspace that are out of sync: -Based on the workspace project graph, some TypeScript configuration files are missing project references to the projects they depend on or contain outdated project references. +[@nx/js:typescript-sync]: Some TypeScript configuration files are missing project references to the projects they depend on or contain outdated project references. -Please note that having the workspace out of sync will result in an error in CI. +This will result in an error in CI. ? Would you like to sync the identified changes to get your workspace up to date? … ❯ Yes, sync the changes and run the tasks From 67d03937b50a4378a608b7f908930cb7d859306b Mon Sep 17 00:00:00 2001 From: James Henry Date: Wed, 4 Dec 2024 20:32:52 +0400 Subject: [PATCH 03/21] fix(release): set make_latest legacy during github release creation (#29197) --- packages/nx/src/command-line/release/utils/github.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/packages/nx/src/command-line/release/utils/github.ts b/packages/nx/src/command-line/release/utils/github.ts index 3b484dc289375..1de5e4578cf74 100644 --- a/packages/nx/src/command-line/release/utils/github.ts +++ b/packages/nx/src/command-line/release/utils/github.ts @@ -29,6 +29,7 @@ interface GithubRequestConfig { token: string | null; } +// https://docs.github.com/en/rest/releases/releases?apiVersion=2022-11-28#create-a-release--parameters interface GithubRelease { id?: string; tag_name: string; @@ -37,6 +38,7 @@ interface GithubRelease { body?: string; draft?: boolean; prerelease?: boolean; + make_latest?: 'legacy' | boolean; } export interface GithubRepoData { @@ -310,6 +312,8 @@ async function syncGithubRelease( name: release.version, body: release.body, prerelease: release.prerelease, + // legacy specifies that the latest release should be determined based on the release creation date and higher semantic version. + make_latest: 'legacy', }; try { From aefafc55bae428b15fdc957f1fb73603bd53ab77 Mon Sep 17 00:00:00 2001 From: Colum Ferry Date: Wed, 4 Dec 2024 16:45:27 +0000 Subject: [PATCH 04/21] feat(module-federation): alias host and remote generators to consumer and producer (#29190) ## Current Behavior Our Module Federation support across Angular and React contains Host and Remote generators. The module-federation.io docs have started to shift towards Consumer and Producer terminology for better translation of meanings across languages. ## Expected Behavior To stay consistent with official terminology, add aliases for the host and remote generators to allow for the new terminology. i.e. host -> consumer, remote -> producer. Therefore the following are all valid ```shell nx g host shell --remotes=remote1 nx g host shell --producers=producer1 nx g consumer shell --remotes=remote1 nx g consumer shell --producers=remote1 nx g remote remote1 --host=shell nx g remote remote1 --consumer=shell nx g producer producer1 --host=shell nx g producer producer1 --consumer=shell ``` --- .../angular/generators/federate-module.json | 29 ++++++++++++------- .../packages/angular/generators/host.json | 23 +++++++++------ .../packages/angular/generators/remote.json | 23 +++++++++------ .../packages/angular/generators/setup-mf.json | 8 +++-- .../module-federation-dev-server.json | 24 ++++++++------- .../module-federation-ssr-dev-server.json | 22 ++++++++------ .../module-federation-static-server.json | 2 +- .../react/generators/federate-module.json | 22 +++++++++----- .../packages/react/generators/host.json | 19 ++++++------ .../packages/react/generators/remote.json | 19 ++++++------ .../module-federation-dev-server.json | 24 ++++++++------- .../module-federation-ssr-dev-server.json | 22 ++++++++------ .../module-federation-static-server.json | 2 +- packages/angular/generators.json | 6 ++-- .../generators/federate-module/schema.json | 29 ++++++++++++------- .../angular/src/generators/host/schema.json | 21 +++++++++----- .../angular/src/generators/remote/schema.json | 21 +++++++++----- .../src/generators/setup-mf/schema.json | 8 +++-- packages/react/generators.json | 6 ++-- .../module-federation-dev-server/schema.json | 24 ++++++++------- .../schema.json | 22 ++++++++------ .../module-federation-static-server.impl.ts | 10 +++---- .../schema.json | 2 +- .../generators/federate-module/schema.json | 22 +++++++++----- .../react/src/generators/host/schema.json | 17 ++++++----- .../remote/lib/update-host-with-remote.ts | 4 +-- .../react/src/generators/remote/schema.json | 17 ++++++----- .../module-federation-dev-server/schema.json | 24 ++++++++------- .../schema.json | 22 ++++++++------ .../schema.json | 2 +- 30 files changed, 293 insertions(+), 203 deletions(-) diff --git a/docs/generated/packages/angular/generators/federate-module.json b/docs/generated/packages/angular/generators/federate-module.json index bdc649cccae2c..ff5235c97d4a0 100644 --- a/docs/generated/packages/angular/generators/federate-module.json +++ b/docs/generated/packages/angular/generators/federate-module.json @@ -6,11 +6,15 @@ "cli": "nx", "$id": "NxReactFederateModule", "title": "Federate Module", - "description": "Create a federated module, which is exposed by a remote and can be subsequently loaded by a host.", + "description": "Create a federated module, which is exposed by a Producer (remote) and can be subsequently loaded by a Consumer (host).", "examples": [ { - "command": "nx g federate-module MyModule --path=./src/component/my-cmp.ts --remote=my-remote-app --remoteDirectory=apps/my-remote-app", + "command": "nx g federate-module MyModule --path=./src/component/my-cmp.ts --remote=myRemoteApp --remoteDirectory=apps/myRemoteApp", "description": "Create a federated module from my-remote-app, that exposes my-cmp from ./src/component/my-cmp.ts as MyModule." + }, + { + "command": "nx g federate-module MyModule --path=./src/component/my-cmp.ts --producer=myProducer --producerDirectory=apps/myProducer", + "description": "Create a federated module from myProducer, that exposes my-cmp from ./src/component/my-cmp.ts as MyModule." } ], "type": "object", @@ -30,15 +34,17 @@ }, "remote": { "type": "string", - "description": "The name of the remote.", - "x-prompt": "What is/should the remote be named?" + "description": "The name of the Producer (remote).", + "x-prompt": "What is/should the Producer (remote) be named?", + "alias": "producer" }, "remoteDirectory": { - "description": "The directory of the new remote application if one needs to be created.", - "type": "string" + "description": "The directory of the new Producer (remote) application if one needs to be created.", + "type": "string", + "alias": "producerDirectory" }, "style": { - "description": "The file extension to be used for style files for the remote if one needs to be created.", + "description": "The file extension to be used for style files for the Producer (remote) if one needs to be created.", "type": "string", "default": "css", "enum": ["css", "scss", "sass", "less"] @@ -52,24 +58,25 @@ "unitTestRunner": { "type": "string", "enum": ["jest", "vitest", "none"], - "description": "Test runner to use for unit tests of the remote if it needs to be created.", + "description": "Test runner to use for unit tests of the Producer (remote) if it needs to be created.", "x-prompt": "Which unit test runner would you like to use?", "default": "jest" }, "e2eTestRunner": { "type": "string", "enum": ["cypress", "none"], - "description": "Test runner to use for end to end (e2e) tests of the remote if it needs to be created.", + "description": "Test runner to use for end to end (e2e) tests of the Producer (remote) if it needs to be created.", "default": "cypress" }, "standalone": { - "description": "Whether to generate the remote application with standalone components if it needs to be created.", + "description": "Whether to generate the Producer (remote) application with standalone components if it needs to be created.", "type": "boolean", "default": true }, "host": { "type": "string", - "description": "The host / shell application for this remote." + "description": "The Consumer (host) application for this Producer (remote).", + "alias": "consumer" } }, "required": ["name", "path", "remote"], diff --git a/docs/generated/packages/angular/generators/host.json b/docs/generated/packages/angular/generators/host.json index 94872b74ae16b..2affa077f829b 100644 --- a/docs/generated/packages/angular/generators/host.json +++ b/docs/generated/packages/angular/generators/host.json @@ -5,13 +5,17 @@ "$schema": "https://json-schema.org/schema", "$id": "NxMFHost", "cli": "nx", - "title": "Nx Module Federation Host Application", - "description": "Create an Angular Host Module Federation Application.", + "title": "Nx Module Federation Consumer (Host) Application", + "description": "Create an Angular Consumer (Host) Module Federation Application.", "type": "object", "examples": [ { "command": "nx g @nx/angular:host appName --remotes=remote1", - "description": "Create an Angular application with configuration in place for Module Federation. If the `remotes` option is provided, attach the remote application to this application's configuration" + "description": "Create an Angular application with configuration in place for Module Federation. If the `remotes` option is provided, attach the Producer (remote) application to this application's configuration" + }, + { + "command": "nx g @nx/angular:consumer appName --producers=remote1", + "description": "Create an Angular application with configuration in place for Module Federation. If the `producers` option is provided, attach the Producer (remote) application to this application's configuration" } ], "properties": { @@ -23,14 +27,15 @@ }, "name": { "type": "string", - "description": "The name to give to the host Angular application.", + "description": "The name to give to the Consumer (host) Angular application.", "pattern": "^[a-zA-Z][^:]*$", "x-priority": "important" }, "remotes": { "type": "array", - "description": "The names of the remote applications to add to the host.", - "x-priority": "important" + "description": "The names of the Producers (remote) applications to add to the Consumer (host).", + "x-priority": "important", + "alias": "producers" }, "dynamic": { "type": "boolean", @@ -160,11 +165,11 @@ }, "standalone": { "type": "boolean", - "description": "Whether to generate a host application that uses standalone components.", + "description": "Whether to generate a Consumer (host) application that uses standalone components.", "default": true }, "ssr": { - "description": "Whether to configure SSR for the host application", + "description": "Whether to configure SSR for the Consumer (host) application", "type": "boolean", "default": false, "x-priority": "important" @@ -185,8 +190,8 @@ }, "x-type": "application", "description": "Generate a Host Angular Module Federation Application.", + "aliases": ["consumer"], "implementation": "/packages/angular/src/generators/host/host.ts", - "aliases": [], "hidden": false, "path": "/packages/angular/src/generators/host/schema.json", "type": "generator" diff --git a/docs/generated/packages/angular/generators/remote.json b/docs/generated/packages/angular/generators/remote.json index f6aa75dfec956..2d647b82584b6 100644 --- a/docs/generated/packages/angular/generators/remote.json +++ b/docs/generated/packages/angular/generators/remote.json @@ -5,13 +5,17 @@ "$schema": "https://json-schema.org/schema", "$id": "NxMFRemote", "cli": "nx", - "title": "Nx Module Federation Remote App", - "description": "Create an Angular Remote Module Federation Application.", + "title": "Nx Module Federation Producer (Remote) App", + "description": "Create an Angular Producer (Remote) Module Federation Application.", "type": "object", "examples": [ { "command": "nx g @nx/angular:remote appName --host=host --port=4201", - "description": "Create an Angular app with configuration in place for Module Federation. If host is provided, attach this remote app to host app's configuration." + "description": "Create an Angular app with configuration in place for Module Federation. If Consumer (host) is provided, attach this Producer (remote) app to Consumer (host) app's configuration." + }, + { + "command": "nx g @nx/angular:producer appName --consumer=host --port=4201", + "description": "Create an Angular app with configuration in place for Module Federation. If Consumer (host) is provided, attach this Producer (remote) app to Consumer (host) app's configuration." } ], "properties": { @@ -23,15 +27,16 @@ }, "name": { "type": "string", - "description": "The name to give to the remote Angular app.", + "description": "The name to give to the Producer (remote) Angular app.", "pattern": "^[a-zA-Z_$][a-zA-Z_$0-9]*$", "x-priority": "important" }, "host": { "type": "string", - "description": "The name of the host app to attach this remote app to.", + "description": "The name of the Consumer (host) app to attach this Producer (remote) app to.", "x-dropdown": "projects", - "x-priority": "important" + "x-priority": "important", + "alias": "consumer" }, "port": { "type": "number", @@ -153,12 +158,12 @@ "x-priority": "internal" }, "standalone": { - "description": "Whether to generate a remote application with standalone components.", + "description": "Whether to generate a Producer (remote) application with standalone components.", "type": "boolean", "default": true }, "ssr": { - "description": "Whether to configure SSR for the remote application to be consumed by a host application using SSR.", + "description": "Whether to configure SSR for the Producer (remote) application to be consumed by a Consumer (host) application using SSR.", "type": "boolean", "default": false }, @@ -178,8 +183,8 @@ }, "x-type": "application", "description": "Generate a Remote Angular Module Federation Application.", + "aliases": ["producer"], "implementation": "/packages/angular/src/generators/remote/remote.ts", - "aliases": [], "hidden": false, "path": "/packages/angular/src/generators/remote/schema.json", "type": "generator" diff --git a/docs/generated/packages/angular/generators/setup-mf.json b/docs/generated/packages/angular/generators/setup-mf.json index 2df78438f737b..c7a65fd9a0b21 100644 --- a/docs/generated/packages/angular/generators/setup-mf.json +++ b/docs/generated/packages/angular/generators/setup-mf.json @@ -34,15 +34,17 @@ }, "remotes": { "type": "array", - "description": "A list of remote application names that the host application should consume." + "description": "A list of remote application names that the Consumer (host) application should consume.", + "alias": "producers" }, "host": { "type": "string", - "description": "The name of the host application that the remote application will be consumed by." + "description": "The name of the host application that the remote application will be consumed by.", + "alias": "consumer" }, "routing": { "type": "boolean", - "description": "Generate a routing setup to allow a host application to route to the remote application.", + "description": "Generate a routing setup to allow a Consumer (host) application to route to the Producer (remote) application.", "x-priority": "important" }, "skipFormat": { diff --git a/docs/generated/packages/react/executors/module-federation-dev-server.json b/docs/generated/packages/react/executors/module-federation-dev-server.json index 3eee2b52be57a..7684b5b2f7e76 100644 --- a/docs/generated/packages/react/executors/module-federation-dev-server.json +++ b/docs/generated/packages/react/executors/module-federation-dev-server.json @@ -25,14 +25,16 @@ } ] }, - "description": "List of remote applications to run in development mode (i.e. using serve target).", - "x-priority": "important" + "description": "List of Producer (remote) applications to run in development mode (i.e. using serve target).", + "x-priority": "important", + "alias": "devProducers" }, "skipRemotes": { "type": "array", "items": { "type": "string" }, - "description": "List of remote applications to not automatically serve, either statically or in development mode. This will not remove the remotes from the `module-federation.config` file, and therefore the application may still try to fetch these remotes.\nThis option is useful if you have other means for serving the `remote` application(s).\n**NOTE:** Remotes that are not in the workspace will be skipped automatically.", - "x-priority": "important" + "description": "List of Producer (remote) applications to not automatically serve, either statically or in development mode. This will not remove the Producers (remotes) from the `module-federation.config` file, and therefore the application may still try to fetch these Producers (remotes).\nThis option is useful if you have other means for serving the Producer (remote) application(s).\n**NOTE:** Producers (remotes) that are not in the workspace will be skipped automatically.", + "x-priority": "important", + "alias": "skipProducers" }, "buildTarget": { "type": "string", @@ -106,25 +108,27 @@ }, "static": { "type": "boolean", - "description": "Whether to use a static file server instead of the webpack-dev-server. This should be used for remote applications that are also host applications." + "description": "Whether to use a static file server instead of the webpack-dev-server. This should be used for Producer (remote) applications that are also Consumer (host) applications." }, "isInitialHost": { "type": "boolean", - "description": "Whether the host that is running this executor is the first in the project tree to do so.", + "description": "Whether the Consumer (host) that is running this executor is the first in the project tree to do so.", "default": true, - "x-priority": "internal" + "x-priority": "internal", + "alias": "isInitialConsumer" }, "parallel": { "type": "number", - "description": "Max number of parallel processes for building static remotes" + "description": "Max number of parallel processes for building static Producers (remotes)" }, "staticRemotesPort": { "type": "number", - "description": "The port at which to serve the file-server for the static remotes." + "description": "The port at which to serve the file-server for the static Producers (remotes).", + "alias": "staticProducersPort" }, "pathToManifestFile": { "type": "string", - "description": "Path to a Module Federation manifest file (e.g. `my/path/to/module-federation.manifest.json`) containing the dynamic remote applications relative to the workspace root." + "description": "Path to a Module Federation manifest file (e.g. `my/path/to/module-federation.manifest.json`) containing the dynamic Producer (remote) applications relative to the workspace root." } }, "examplesFile": "## Examples\n\n{% tabs %}\n\n{% tab label=\"Basic Usage\" %}\nThe Module Federation Dev Server will serve a host application and find the remote applications associated with the host and serve them statically also. \nSee an example set up of it below:\n\n```json\n{\n \"serve\": {\n \"executor\": \"@nx/react:module-federation-dev-server\",\n \"configurations\": {\n \"production\": {\n \"buildTarget\": \"host:build:production\"\n },\n \"development\": {\n \"buildTarget\": \"host:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\",\n \"options\": {\n \"port\": 4200,\n \"publicHost\": \"http://localhost:4200\"\n }\n }\n}\n```\n\n{% /tab %}\n\n{% tab label=\"Serve host with remotes that can be live reloaded\" %}\nThe Module Federation Dev Server will serve a host application and find the remote applications associated with the host and serve a set selection with live reloading enabled also. \nSee an example set up of it below:\n\n```json\n{\n \"serve-with-hmr-remotes\": {\n \"executor\": \"@nx/react:module-federation-dev-server\",\n \"configurations\": {\n \"production\": {\n \"buildTarget\": \"host:build:production\"\n },\n \"development\": {\n \"buildTarget\": \"host:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\",\n \"options\": {\n \"port\": 4200,\n \"publicHost\": \"http://localhost:4200\",\n \"devRemotes\": [\n \"remote1\",\n {\n \"remoteName\": \"remote2\",\n \"configuration\": \"development\"\n }\n ]\n }\n }\n}\n```\n\n{% /tab %}\n\n{% /tabs %}\n", diff --git a/docs/generated/packages/react/executors/module-federation-ssr-dev-server.json b/docs/generated/packages/react/executors/module-federation-ssr-dev-server.json index c2fe914e1e383..a7b1e53a04138 100644 --- a/docs/generated/packages/react/executors/module-federation-ssr-dev-server.json +++ b/docs/generated/packages/react/executors/module-federation-ssr-dev-server.json @@ -5,7 +5,7 @@ "version": 2, "outputCapture": "direct-nodejs", "title": "Module Federation SSR Dev Server", - "description": "Serve a SSR host application along with its known remotes.", + "description": "Serve a SSR Consumer (host) application along with its known Producers (remotes).", "cli": "nx", "type": "object", "properties": { @@ -28,14 +28,16 @@ "devRemotes": { "type": "array", "items": { "type": "string" }, - "description": "List of remote applications to run in development mode (i.e. using serve target).", - "x-priority": "important" + "description": "List of Producer (remote) applications to run in development mode (i.e. using serve target).", + "x-priority": "important", + "alias": "devProducers" }, "skipRemotes": { "type": "array", "items": { "type": "string" }, - "description": "List of remote applications to not automatically serve, either statically or in development mode.", - "x-priority": "important" + "description": "List of Producer (remote) applications to not automatically serve, either statically or in development mode.", + "x-priority": "important", + "alias": "skipProducers" }, "host": { "type": "string", @@ -44,11 +46,12 @@ }, "staticRemotesPort": { "type": "number", - "description": "The port at which to serve the file-server for the static remotes." + "description": "The port at which to serve the file-server for the static Producers (remotes).", + "alias": "staticProducersPort" }, "pathToManifestFile": { "type": "string", - "description": "Path to a Module Federation manifest file (e.g. `my/path/to/module-federation.manifest.json`) containing the dynamic remote applications relative to the workspace root." + "description": "Path to a Module Federation manifest file (e.g. `my/path/to/module-federation.manifest.json`) containing the dynamic Producer (remote) applications relative to the workspace root." }, "ssl": { "type": "boolean", @@ -65,9 +68,10 @@ }, "isInitialHost": { "type": "boolean", - "description": "Whether the host that is running this executor is the first in the project tree to do so.", + "description": "Whether the Consumer (host) that is running this executor is the first in the project tree to do so.", "default": true, - "x-priority": "internal" + "x-priority": "internal", + "alias": "isInitialConsumer" } }, "required": ["browserTarget", "serverTarget"], diff --git a/docs/generated/packages/react/executors/module-federation-static-server.json b/docs/generated/packages/react/executors/module-federation-static-server.json index 4cd3fd244b8b7..28c73a60de99c 100644 --- a/docs/generated/packages/react/executors/module-federation-static-server.json +++ b/docs/generated/packages/react/executors/module-federation-static-server.json @@ -5,7 +5,7 @@ "version": 2, "outputCapture": "direct-nodejs", "title": "Module Federation Static Dev Server", - "description": "Serve a host application statically along with it's remotes.", + "description": "Serve a Consumer (host) application statically along with its Producers (remotes).", "cli": "nx", "type": "object", "properties": { "serveTarget": { "type": "string" } }, diff --git a/docs/generated/packages/react/generators/federate-module.json b/docs/generated/packages/react/generators/federate-module.json index 9a045541050f4..797dce5c376d0 100644 --- a/docs/generated/packages/react/generators/federate-module.json +++ b/docs/generated/packages/react/generators/federate-module.json @@ -6,11 +6,15 @@ "cli": "nx", "$id": "NxReactFederateModule", "title": "Federate Module", - "description": "Create a federated module, which can be loaded by a remote host.", + "description": "Create a federated module, which can be loaded by a Consumer (host) via a Producer (remote).", "examples": [ { - "command": "nx g federate-module MyModule --path=./src/component/my-cmp.ts --remote=my-remote-app --remoteDirectory=apps/my-remote-app", - "description": "Create a federated module from my-remote-app, that exposes my-cmp from ./src/component/my-cmp.ts as MyModule." + "command": "nx g federate-module MyModule --path=./src/component/my-cmp.ts --remote=myRemote --remoteDirectory=apps/myRemote", + "description": "Create a federated module from myRemote, that exposes my-cmp from ./src/component/my-cmp.ts as MyModule." + }, + { + "command": "nx g federate-module MyModule --path=./src/component/my-cmp.ts --producer=myProducer --producerDirectory=apps/myProducer", + "description": "Create a federated module from myProducer, that exposes my-cmp from ./src/component/my-cmp.ts as MyModule." } ], "type": "object", @@ -30,12 +34,14 @@ }, "remote": { "type": "string", - "description": "The name of the remote.", - "x-prompt": "What is/should the remote be named?" + "description": "The name of the Producer (remote).", + "x-prompt": "What is/should the Producer (remote) be named?", + "alias": "producer" }, "remoteDirectory": { - "description": "The directory of the new remote application if one needs to be created.", - "type": "string" + "description": "The directory of the new Producer (remote) application if one needs to be created.", + "type": "string", + "alias": "producerDirectory" }, "style": { "description": "The file extension to be used for style files.", @@ -70,7 +76,7 @@ }, "host": { "type": "string", - "description": "The host / shell application for this remote." + "description": "The Consumer (host) application for this Producer (remote)." }, "bundler": { "description": "The bundler to use.", diff --git a/docs/generated/packages/react/generators/host.json b/docs/generated/packages/react/generators/host.json index 453632040b3bb..d270b6de5eef7 100644 --- a/docs/generated/packages/react/generators/host.json +++ b/docs/generated/packages/react/generators/host.json @@ -5,8 +5,8 @@ "$schema": "https://json-schema.org/schema", "$id": "GeneratorReactHost", "cli": "nx", - "title": "Generate Module Federation Setup for React Host App", - "description": "Create Module Federation configuration files for given React Host Application.", + "title": "Generate Module Federation Setup for React Consumer (Host) App", + "description": "Create Module Federation configuration files for given React Consumer (Host) Application.", "type": "object", "properties": { "directory": { @@ -18,7 +18,7 @@ }, "name": { "type": "string", - "description": "The name of the host application to generate the Module Federation configuration", + "description": "The name of the Consumer (host) application to generate the Module Federation configuration", "pattern": "^[a-zA-Z][^:]*$", "x-priority": "important" }, @@ -68,7 +68,7 @@ }, "dynamic": { "type": "boolean", - "description": "Should the host application use dynamic federation?", + "description": "Should the Consumer (host) application use dynamic federation?", "default": false }, "skipFormat": { @@ -135,18 +135,19 @@ }, "remotes": { "type": "array", - "description": "A list of remote application names that the host application should consume.", + "description": "A list of Producer (remote) application names that the Consumer (host) application should consume.", "default": [], - "x-priority": "important" + "x-priority": "important", + "alias": "producers" }, "devServerPort": { "type": "number", - "description": "The port for the dev server of the remote app.", + "description": "The port for the dev server of the Producer (remote) app.", "default": 4200, "x-priority": "important" }, "ssr": { - "description": "Whether to configure SSR for the host application", + "description": "Whether to configure SSR for the Consumer (host) application", "type": "boolean", "default": false }, @@ -181,8 +182,8 @@ }, "x-type": "application", "description": "Generate a host react application", + "aliases": ["consumer"], "implementation": "/packages/react/src/generators/host/host.ts", - "aliases": [], "hidden": false, "path": "/packages/react/src/generators/host/schema.json", "type": "generator" diff --git a/docs/generated/packages/react/generators/remote.json b/docs/generated/packages/react/generators/remote.json index 7ffcfb99ce4ec..0c642a051c46b 100644 --- a/docs/generated/packages/react/generators/remote.json +++ b/docs/generated/packages/react/generators/remote.json @@ -5,8 +5,8 @@ "$schema": "https://json-schema.org/schema", "$id": "GeneratorReactRemote", "cli": "nx", - "title": "Generate Module Federation Setup for React Remote App", - "description": "Create Module Federation configuration files for given React Remote Application.", + "title": "Generate Module Federation Setup for React Producer (Remote) App", + "description": "Create Module Federation configuration files for given React Producer (Remote) Application.", "type": "object", "properties": { "directory": { @@ -18,13 +18,13 @@ }, "name": { "type": "string", - "description": "The name of the remote application to generate the Module Federation configuration", + "description": "The name of the Producer (remote) application to generate the Module Federation configuration", "pattern": "^[a-zA-Z_$][a-zA-Z_$0-9]*$", "x-priority": "important" }, "dynamic": { "type": "boolean", - "description": "Should the host application use dynamic federation?", + "description": "Should the Consumer (host) application use dynamic federation?", "default": false, "x-priority": "internal" }, @@ -141,16 +141,17 @@ }, "host": { "type": "string", - "description": "The host / shell application for this remote.", - "x-priority": "important" + "description": "The Consumer (host) application for this Producer (remote).", + "x-priority": "important", + "alias": "consumer" }, "devServerPort": { "type": "number", - "description": "The port for the dev server of the remote app.", + "description": "The port for the dev server of the Producer (remote) app.", "x-priority": "important" }, "ssr": { - "description": "Whether to configure SSR for the host application", + "description": "Whether to configure SSR for the Consumer (host) application", "type": "boolean", "default": false }, @@ -180,8 +181,8 @@ }, "x-type": "application", "description": "Generate a remote react application", + "aliases": ["producer"], "implementation": "/packages/react/src/generators/remote/remote.ts", - "aliases": [], "hidden": false, "path": "/packages/react/src/generators/remote/schema.json", "type": "generator" diff --git a/docs/generated/packages/rspack/executors/module-federation-dev-server.json b/docs/generated/packages/rspack/executors/module-federation-dev-server.json index 571c583e136a2..14ef282051c30 100644 --- a/docs/generated/packages/rspack/executors/module-federation-dev-server.json +++ b/docs/generated/packages/rspack/executors/module-federation-dev-server.json @@ -25,14 +25,16 @@ } ] }, - "description": "List of remote applications to run in development mode (i.e. using serve target).", - "x-priority": "important" + "description": "List of Producer (remote) applications to run in development mode (i.e. using serve target).", + "x-priority": "important", + "alias": "devProducers" }, "skipRemotes": { "type": "array", "items": { "type": "string" }, - "description": "List of remote applications to not automatically serve, either statically or in development mode. This will not remove the remotes from the `module-federation.config` file, and therefore the application may still try to fetch these remotes.\nThis option is useful if you have other means for serving the `remote` application(s).\n**NOTE:** Remotes that are not in the workspace will be skipped automatically.", - "x-priority": "important" + "description": "List of Producer (remote) applications to not automatically serve, either statically or in development mode. This will not remove the Producers (remotes) from the `module-federation.config` file, and therefore the application may still try to fetch these Producers (remotes).\nThis option is useful if you have other means for serving the Producer (remote) application(s).\n**NOTE:** Producers (remotes) that are not in the workspace will be skipped automatically.", + "x-priority": "important", + "alias": "skipProducers" }, "buildTarget": { "type": "string", @@ -69,25 +71,27 @@ }, "static": { "type": "boolean", - "description": "Whether to use a static file server instead of the rspack-dev-server. This should be used for remote applications that are also host applications." + "description": "Whether to use a static file server instead of the rspack-dev-server. This should be used for Producer (remote) applications that are also Consumer (host) applications." }, "isInitialHost": { "type": "boolean", - "description": "Whether the host that is running this executor is the first in the project tree to do so.", + "description": "Whether the Consumer (host) that is running this executor is the first in the project tree to do so.", "default": true, - "x-priority": "internal" + "x-priority": "internal", + "alias": "isInitialConsumer" }, "parallel": { "type": "number", - "description": "Max number of parallel processes for building static remotes" + "description": "Max number of parallel processes for building static Producers (remotes)." }, "staticRemotesPort": { "type": "number", - "description": "The port at which to serve the file-server for the static remotes." + "description": "The port at which to serve the file-server for the static Producers (remotes).", + "alias": "staticProducersPort" }, "pathToManifestFile": { "type": "string", - "description": "Path to a Module Federation manifest file (e.g. `my/path/to/module-federation.manifest.json`) containing the dynamic remote applications relative to the workspace root." + "description": "Path to a Module Federation manifest file (e.g. `my/path/to/module-federation.manifest.json`) containing the dynamic Producer (remote) applications relative to the workspace root." } }, "presets": [] diff --git a/docs/generated/packages/rspack/executors/module-federation-ssr-dev-server.json b/docs/generated/packages/rspack/executors/module-federation-ssr-dev-server.json index f91a75342f7f6..984c7a4674bfe 100644 --- a/docs/generated/packages/rspack/executors/module-federation-ssr-dev-server.json +++ b/docs/generated/packages/rspack/executors/module-federation-ssr-dev-server.json @@ -5,7 +5,7 @@ "version": 2, "outputCapture": "direct-nodejs", "title": "Module Federation SSR Dev Server", - "description": "Serve a SSR host application along with its known remotes.", + "description": "Serve a SSR Consumer (host) application along with its known Producers (remotes).", "cli": "nx", "type": "object", "properties": { @@ -28,14 +28,16 @@ "devRemotes": { "type": "array", "items": { "type": "string" }, - "description": "List of remote applications to run in development mode (i.e. using serve target).", - "x-priority": "important" + "description": "List of Producers (remote) applications to run in development mode (i.e. using serve target).", + "x-priority": "important", + "alias": "devProducers" }, "skipRemotes": { "type": "array", "items": { "type": "string" }, - "description": "List of remote applications to not automatically serve, either statically or in development mode.", - "x-priority": "important" + "description": "List of Producers (remote) applications to not automatically serve, either statically or in development mode.", + "x-priority": "important", + "alias": "skipProducers" }, "host": { "type": "string", @@ -44,11 +46,12 @@ }, "staticRemotesPort": { "type": "number", - "description": "The port at which to serve the file-server for the static remotes." + "description": "The port at which to serve the file-server for the static Producers (remotes).", + "alias": "staticProducersPort" }, "pathToManifestFile": { "type": "string", - "description": "Path to a Module Federation manifest file (e.g. `my/path/to/module-federation.manifest.json`) containing the dynamic remote applications relative to the workspace root." + "description": "Path to a Module Federation manifest file (e.g. `my/path/to/module-federation.manifest.json`) containing the dynamic Producers (remote) applications relative to the workspace root." }, "ssl": { "type": "boolean", @@ -69,9 +72,10 @@ }, "isInitialHost": { "type": "boolean", - "description": "Whether the host that is running this executor is the first in the project tree to do so.", + "description": "Whether the Consumer (host) that is running this executor is the first in the project tree to do so.", "default": true, - "x-priority": "internal" + "x-priority": "internal", + "alias": "isInitialConsumer" } }, "required": ["browserTarget", "serverTarget"], diff --git a/docs/generated/packages/rspack/executors/module-federation-static-server.json b/docs/generated/packages/rspack/executors/module-federation-static-server.json index 83d2a7072f677..fab2e13b5a10f 100644 --- a/docs/generated/packages/rspack/executors/module-federation-static-server.json +++ b/docs/generated/packages/rspack/executors/module-federation-static-server.json @@ -5,7 +5,7 @@ "version": 2, "outputCapture": "direct-nodejs", "title": "Module Federation Static Dev Server", - "description": "Serve a host application statically along with it's remotes.", + "description": "Serve a Consumer (host) application statically along with it's Producers (remotes).", "cli": "nx", "type": "object", "properties": { "serveTarget": { "type": "string" } }, diff --git a/packages/angular/generators.json b/packages/angular/generators.json index 608fa8bd70226..edbde17e92b41 100644 --- a/packages/angular/generators.json +++ b/packages/angular/generators.json @@ -73,7 +73,8 @@ "factory": "./src/generators/remote/remote", "schema": "./src/generators/remote/schema.json", "x-type": "application", - "description": "Generate a Remote Angular Module Federation Application." + "description": "Generate a Remote Angular Module Federation Application.", + "aliases": ["producer"] }, "move": { "factory": "./src/generators/move/move#angularMoveGenerator", @@ -91,7 +92,8 @@ "factory": "./src/generators/host/host", "schema": "./src/generators/host/schema.json", "x-type": "application", - "description": "Generate a Host Angular Module Federation Application." + "description": "Generate a Host Angular Module Federation Application.", + "aliases": ["consumer"] }, "ng-add": { "factory": "./src/generators/ng-add/ng-add", diff --git a/packages/angular/src/generators/federate-module/schema.json b/packages/angular/src/generators/federate-module/schema.json index 50576437aea86..e0bcf30ca5b74 100644 --- a/packages/angular/src/generators/federate-module/schema.json +++ b/packages/angular/src/generators/federate-module/schema.json @@ -3,11 +3,15 @@ "cli": "nx", "$id": "NxReactFederateModule", "title": "Federate Module", - "description": "Create a federated module, which is exposed by a remote and can be subsequently loaded by a host.", + "description": "Create a federated module, which is exposed by a Producer (remote) and can be subsequently loaded by a Consumer (host).", "examples": [ { - "command": "nx g federate-module MyModule --path=./src/component/my-cmp.ts --remote=my-remote-app --remoteDirectory=apps/my-remote-app", + "command": "nx g federate-module MyModule --path=./src/component/my-cmp.ts --remote=myRemoteApp --remoteDirectory=apps/myRemoteApp", "description": "Create a federated module from my-remote-app, that exposes my-cmp from ./src/component/my-cmp.ts as MyModule." + }, + { + "command": "nx g federate-module MyModule --path=./src/component/my-cmp.ts --producer=myProducer --producerDirectory=apps/myProducer", + "description": "Create a federated module from myProducer, that exposes my-cmp from ./src/component/my-cmp.ts as MyModule." } ], "type": "object", @@ -30,15 +34,17 @@ }, "remote": { "type": "string", - "description": "The name of the remote.", - "x-prompt": "What is/should the remote be named?" + "description": "The name of the Producer (remote).", + "x-prompt": "What is/should the Producer (remote) be named?", + "alias": "producer" }, "remoteDirectory": { - "description": "The directory of the new remote application if one needs to be created.", - "type": "string" + "description": "The directory of the new Producer (remote) application if one needs to be created.", + "type": "string", + "alias": "producerDirectory" }, "style": { - "description": "The file extension to be used for style files for the remote if one needs to be created.", + "description": "The file extension to be used for style files for the Producer (remote) if one needs to be created.", "type": "string", "default": "css", "enum": ["css", "scss", "sass", "less"] @@ -52,24 +58,25 @@ "unitTestRunner": { "type": "string", "enum": ["jest", "vitest", "none"], - "description": "Test runner to use for unit tests of the remote if it needs to be created.", + "description": "Test runner to use for unit tests of the Producer (remote) if it needs to be created.", "x-prompt": "Which unit test runner would you like to use?", "default": "jest" }, "e2eTestRunner": { "type": "string", "enum": ["cypress", "none"], - "description": "Test runner to use for end to end (e2e) tests of the remote if it needs to be created.", + "description": "Test runner to use for end to end (e2e) tests of the Producer (remote) if it needs to be created.", "default": "cypress" }, "standalone": { - "description": "Whether to generate the remote application with standalone components if it needs to be created.", + "description": "Whether to generate the Producer (remote) application with standalone components if it needs to be created.", "type": "boolean", "default": true }, "host": { "type": "string", - "description": "The host / shell application for this remote." + "description": "The Consumer (host) application for this Producer (remote).", + "alias": "consumer" } }, "required": ["name", "path", "remote"], diff --git a/packages/angular/src/generators/host/schema.json b/packages/angular/src/generators/host/schema.json index c65b343c8cba6..2be1e3522c79a 100644 --- a/packages/angular/src/generators/host/schema.json +++ b/packages/angular/src/generators/host/schema.json @@ -2,13 +2,17 @@ "$schema": "https://json-schema.org/schema", "$id": "NxMFHost", "cli": "nx", - "title": "Nx Module Federation Host Application", - "description": "Create an Angular Host Module Federation Application.", + "title": "Nx Module Federation Consumer (Host) Application", + "description": "Create an Angular Consumer (Host) Module Federation Application.", "type": "object", "examples": [ { "command": "nx g @nx/angular:host appName --remotes=remote1", - "description": "Create an Angular application with configuration in place for Module Federation. If the `remotes` option is provided, attach the remote application to this application's configuration" + "description": "Create an Angular application with configuration in place for Module Federation. If the `remotes` option is provided, attach the Producer (remote) application to this application's configuration" + }, + { + "command": "nx g @nx/angular:consumer appName --producers=remote1", + "description": "Create an Angular application with configuration in place for Module Federation. If the `producers` option is provided, attach the Producer (remote) application to this application's configuration" } ], "properties": { @@ -23,14 +27,15 @@ }, "name": { "type": "string", - "description": "The name to give to the host Angular application.", + "description": "The name to give to the Consumer (host) Angular application.", "pattern": "^[a-zA-Z][^:]*$", "x-priority": "important" }, "remotes": { "type": "array", - "description": "The names of the remote applications to add to the host.", - "x-priority": "important" + "description": "The names of the Producers (remote) applications to add to the Consumer (host).", + "x-priority": "important", + "alias": "producers" }, "dynamic": { "type": "boolean", @@ -163,11 +168,11 @@ }, "standalone": { "type": "boolean", - "description": "Whether to generate a host application that uses standalone components.", + "description": "Whether to generate a Consumer (host) application that uses standalone components.", "default": true }, "ssr": { - "description": "Whether to configure SSR for the host application", + "description": "Whether to configure SSR for the Consumer (host) application", "type": "boolean", "default": false, "x-priority": "important" diff --git a/packages/angular/src/generators/remote/schema.json b/packages/angular/src/generators/remote/schema.json index c59c0016cc6a8..d41469cf02ee8 100644 --- a/packages/angular/src/generators/remote/schema.json +++ b/packages/angular/src/generators/remote/schema.json @@ -2,13 +2,17 @@ "$schema": "https://json-schema.org/schema", "$id": "NxMFRemote", "cli": "nx", - "title": "Nx Module Federation Remote App", - "description": "Create an Angular Remote Module Federation Application.", + "title": "Nx Module Federation Producer (Remote) App", + "description": "Create an Angular Producer (Remote) Module Federation Application.", "type": "object", "examples": [ { "command": "nx g @nx/angular:remote appName --host=host --port=4201", - "description": "Create an Angular app with configuration in place for Module Federation. If host is provided, attach this remote app to host app's configuration." + "description": "Create an Angular app with configuration in place for Module Federation. If Consumer (host) is provided, attach this Producer (remote) app to Consumer (host) app's configuration." + }, + { + "command": "nx g @nx/angular:producer appName --consumer=host --port=4201", + "description": "Create an Angular app with configuration in place for Module Federation. If Consumer (host) is provided, attach this Producer (remote) app to Consumer (host) app's configuration." } ], "properties": { @@ -23,15 +27,16 @@ }, "name": { "type": "string", - "description": "The name to give to the remote Angular app.", + "description": "The name to give to the Producer (remote) Angular app.", "pattern": "^[a-zA-Z_$][a-zA-Z_$0-9]*$", "x-priority": "important" }, "host": { "type": "string", - "description": "The name of the host app to attach this remote app to.", + "description": "The name of the Consumer (host) app to attach this Producer (remote) app to.", "x-dropdown": "projects", - "x-priority": "important" + "x-priority": "important", + "alias": "consumer" }, "port": { "type": "number", @@ -156,12 +161,12 @@ "x-priority": "internal" }, "standalone": { - "description": "Whether to generate a remote application with standalone components.", + "description": "Whether to generate a Producer (remote) application with standalone components.", "type": "boolean", "default": true }, "ssr": { - "description": "Whether to configure SSR for the remote application to be consumed by a host application using SSR.", + "description": "Whether to configure SSR for the Producer (remote) application to be consumed by a Consumer (host) application using SSR.", "type": "boolean", "default": false }, diff --git a/packages/angular/src/generators/setup-mf/schema.json b/packages/angular/src/generators/setup-mf/schema.json index 66b263026a4ff..dbd1065e4e8ff 100644 --- a/packages/angular/src/generators/setup-mf/schema.json +++ b/packages/angular/src/generators/setup-mf/schema.json @@ -34,15 +34,17 @@ }, "remotes": { "type": "array", - "description": "A list of remote application names that the host application should consume." + "description": "A list of remote application names that the Consumer (host) application should consume.", + "alias": "producers" }, "host": { "type": "string", - "description": "The name of the host application that the remote application will be consumed by." + "description": "The name of the host application that the remote application will be consumed by.", + "alias": "consumer" }, "routing": { "type": "boolean", - "description": "Generate a routing setup to allow a host application to route to the remote application.", + "description": "Generate a routing setup to allow a Consumer (host) application to route to the Producer (remote) application.", "x-priority": "important" }, "skipFormat": { diff --git a/packages/react/generators.json b/packages/react/generators.json index da58dda499784..07a40a57639c1 100644 --- a/packages/react/generators.json +++ b/packages/react/generators.json @@ -64,13 +64,15 @@ "factory": "./src/generators/host/host", "schema": "./src/generators/host/schema.json", "x-type": "application", - "description": "Generate a host react application" + "description": "Generate a host react application", + "aliases": ["consumer"] }, "remote": { "factory": "./src/generators/remote/remote", "schema": "./src/generators/remote/schema.json", "x-type": "application", - "description": "Generate a remote react application" + "description": "Generate a remote react application", + "aliases": ["producer"] }, "cypress-component-configuration": { "factory": "./src/generators/cypress-component-configuration/cypress-component-configuration#cypressComponentConfigGenerator", diff --git a/packages/react/src/executors/module-federation-dev-server/schema.json b/packages/react/src/executors/module-federation-dev-server/schema.json index 00075add23e56..e455106be47ae 100644 --- a/packages/react/src/executors/module-federation-dev-server/schema.json +++ b/packages/react/src/executors/module-federation-dev-server/schema.json @@ -28,16 +28,18 @@ } ] }, - "description": "List of remote applications to run in development mode (i.e. using serve target).", - "x-priority": "important" + "description": "List of Producer (remote) applications to run in development mode (i.e. using serve target).", + "x-priority": "important", + "alias": "devProducers" }, "skipRemotes": { "type": "array", "items": { "type": "string" }, - "description": "List of remote applications to not automatically serve, either statically or in development mode. This will not remove the remotes from the `module-federation.config` file, and therefore the application may still try to fetch these remotes.\nThis option is useful if you have other means for serving the `remote` application(s).\n**NOTE:** Remotes that are not in the workspace will be skipped automatically.", - "x-priority": "important" + "description": "List of Producer (remote) applications to not automatically serve, either statically or in development mode. This will not remove the Producers (remotes) from the `module-federation.config` file, and therefore the application may still try to fetch these Producers (remotes).\nThis option is useful if you have other means for serving the Producer (remote) application(s).\n**NOTE:** Producers (remotes) that are not in the workspace will be skipped automatically.", + "x-priority": "important", + "alias": "skipProducers" }, "buildTarget": { "type": "string", @@ -111,25 +113,27 @@ }, "static": { "type": "boolean", - "description": "Whether to use a static file server instead of the webpack-dev-server. This should be used for remote applications that are also host applications." + "description": "Whether to use a static file server instead of the webpack-dev-server. This should be used for Producer (remote) applications that are also Consumer (host) applications." }, "isInitialHost": { "type": "boolean", - "description": "Whether the host that is running this executor is the first in the project tree to do so.", + "description": "Whether the Consumer (host) that is running this executor is the first in the project tree to do so.", "default": true, - "x-priority": "internal" + "x-priority": "internal", + "alias": "isInitialConsumer" }, "parallel": { "type": "number", - "description": "Max number of parallel processes for building static remotes" + "description": "Max number of parallel processes for building static Producers (remotes)" }, "staticRemotesPort": { "type": "number", - "description": "The port at which to serve the file-server for the static remotes." + "description": "The port at which to serve the file-server for the static Producers (remotes).", + "alias": "staticProducersPort" }, "pathToManifestFile": { "type": "string", - "description": "Path to a Module Federation manifest file (e.g. `my/path/to/module-federation.manifest.json`) containing the dynamic remote applications relative to the workspace root." + "description": "Path to a Module Federation manifest file (e.g. `my/path/to/module-federation.manifest.json`) containing the dynamic Producer (remote) applications relative to the workspace root." } }, "examplesFile": "../../../docs/module-federation-dev-server-examples.md" diff --git a/packages/react/src/executors/module-federation-ssr-dev-server/schema.json b/packages/react/src/executors/module-federation-ssr-dev-server/schema.json index 9e19288760732..8efca45fda1bb 100644 --- a/packages/react/src/executors/module-federation-ssr-dev-server/schema.json +++ b/packages/react/src/executors/module-federation-ssr-dev-server/schema.json @@ -2,7 +2,7 @@ "version": 2, "outputCapture": "direct-nodejs", "title": "Module Federation SSR Dev Server", - "description": "Serve a SSR host application along with its known remotes.", + "description": "Serve a SSR Consumer (host) application along with its known Producers (remotes).", "cli": "nx", "type": "object", "properties": { @@ -27,16 +27,18 @@ "items": { "type": "string" }, - "description": "List of remote applications to run in development mode (i.e. using serve target).", - "x-priority": "important" + "description": "List of Producer (remote) applications to run in development mode (i.e. using serve target).", + "x-priority": "important", + "alias": "devProducers" }, "skipRemotes": { "type": "array", "items": { "type": "string" }, - "description": "List of remote applications to not automatically serve, either statically or in development mode.", - "x-priority": "important" + "description": "List of Producer (remote) applications to not automatically serve, either statically or in development mode.", + "x-priority": "important", + "alias": "skipProducers" }, "host": { "type": "string", @@ -45,11 +47,12 @@ }, "staticRemotesPort": { "type": "number", - "description": "The port at which to serve the file-server for the static remotes." + "description": "The port at which to serve the file-server for the static Producers (remotes).", + "alias": "staticProducersPort" }, "pathToManifestFile": { "type": "string", - "description": "Path to a Module Federation manifest file (e.g. `my/path/to/module-federation.manifest.json`) containing the dynamic remote applications relative to the workspace root." + "description": "Path to a Module Federation manifest file (e.g. `my/path/to/module-federation.manifest.json`) containing the dynamic Producer (remote) applications relative to the workspace root." }, "ssl": { "type": "boolean", @@ -66,9 +69,10 @@ }, "isInitialHost": { "type": "boolean", - "description": "Whether the host that is running this executor is the first in the project tree to do so.", + "description": "Whether the Consumer (host) that is running this executor is the first in the project tree to do so.", "default": true, - "x-priority": "internal" + "x-priority": "internal", + "alias": "isInitialConsumer" } }, "required": ["browserTarget", "serverTarget"] diff --git a/packages/react/src/executors/module-federation-static-server/module-federation-static-server.impl.ts b/packages/react/src/executors/module-federation-static-server/module-federation-static-server.impl.ts index c48826c594af9..4c548e2d12369 100644 --- a/packages/react/src/executors/module-federation-static-server/module-federation-static-server.impl.ts +++ b/packages/react/src/executors/module-federation-static-server/module-federation-static-server.impl.ts @@ -112,7 +112,7 @@ async function buildHost( if (stdoutString.includes('Successfully ran target build')) { staticProcess.stdout.removeAllListeners('data'); - logger.info(`NX Built host`); + logger.info(`NX Built Consumer (host)`); res(); } }); @@ -121,7 +121,7 @@ async function buildHost( staticProcess.stdout.removeAllListeners('data'); staticProcess.stderr.removeAllListeners('data'); if (code !== 0) { - rej(`Host failed to build. See above for details.`); + rej(`Consumer (host) failed to build. See above for details.`); } else { res(); } @@ -213,8 +213,8 @@ export function startProxies( process.on('SIGTERM', () => proxyServer.close()); process.on('exit', () => proxyServer.close()); } - logger.info(`NX Static remotes proxies started successfully`); - logger.info(`NX Starting static host proxy...`); + logger.info(`NX Static Producers (remotes) proxies started successfully`); + logger.info(`NX Starting static Consumer (host) proxy...`); const expressProxy: Express = express(); expressProxy.use( createProxyMiddleware({ @@ -238,7 +238,7 @@ export function startProxies( .listen(hostServeOptions.port); process.on('SIGTERM', () => proxyServer.close()); process.on('exit', () => proxyServer.close()); - logger.info('NX Static host proxy started successfully'); + logger.info('NX Static Consumer (host) proxy started successfully'); } export default async function* moduleFederationStaticServer( diff --git a/packages/react/src/executors/module-federation-static-server/schema.json b/packages/react/src/executors/module-federation-static-server/schema.json index 329ac0a6226d5..8113034e2e562 100644 --- a/packages/react/src/executors/module-federation-static-server/schema.json +++ b/packages/react/src/executors/module-federation-static-server/schema.json @@ -2,7 +2,7 @@ "version": 2, "outputCapture": "direct-nodejs", "title": "Module Federation Static Dev Server", - "description": "Serve a host application statically along with it's remotes.", + "description": "Serve a Consumer (host) application statically along with its Producers (remotes).", "cli": "nx", "type": "object", "properties": { diff --git a/packages/react/src/generators/federate-module/schema.json b/packages/react/src/generators/federate-module/schema.json index e6fe54eb6ccad..9c2fa2372bfc8 100644 --- a/packages/react/src/generators/federate-module/schema.json +++ b/packages/react/src/generators/federate-module/schema.json @@ -3,11 +3,15 @@ "cli": "nx", "$id": "NxReactFederateModule", "title": "Federate Module", - "description": "Create a federated module, which can be loaded by a remote host.", + "description": "Create a federated module, which can be loaded by a Consumer (host) via a Producer (remote).", "examples": [ { - "command": "nx g federate-module MyModule --path=./src/component/my-cmp.ts --remote=my-remote-app --remoteDirectory=apps/my-remote-app", - "description": "Create a federated module from my-remote-app, that exposes my-cmp from ./src/component/my-cmp.ts as MyModule." + "command": "nx g federate-module MyModule --path=./src/component/my-cmp.ts --remote=myRemote --remoteDirectory=apps/myRemote", + "description": "Create a federated module from myRemote, that exposes my-cmp from ./src/component/my-cmp.ts as MyModule." + }, + { + "command": "nx g federate-module MyModule --path=./src/component/my-cmp.ts --producer=myProducer --producerDirectory=apps/myProducer", + "description": "Create a federated module from myProducer, that exposes my-cmp from ./src/component/my-cmp.ts as MyModule." } ], "type": "object", @@ -30,12 +34,14 @@ }, "remote": { "type": "string", - "description": "The name of the remote.", - "x-prompt": "What is/should the remote be named?" + "description": "The name of the Producer (remote).", + "x-prompt": "What is/should the Producer (remote) be named?", + "alias": "producer" }, "remoteDirectory": { - "description": "The directory of the new remote application if one needs to be created.", - "type": "string" + "description": "The directory of the new Producer (remote) application if one needs to be created.", + "type": "string", + "alias": "producerDirectory" }, "style": { "description": "The file extension to be used for style files.", @@ -70,7 +76,7 @@ }, "host": { "type": "string", - "description": "The host / shell application for this remote." + "description": "The Consumer (host) application for this Producer (remote)." }, "bundler": { "description": "The bundler to use.", diff --git a/packages/react/src/generators/host/schema.json b/packages/react/src/generators/host/schema.json index 0c6143a53fcb0..fe9b7f1c7407d 100644 --- a/packages/react/src/generators/host/schema.json +++ b/packages/react/src/generators/host/schema.json @@ -2,8 +2,8 @@ "$schema": "https://json-schema.org/schema", "$id": "GeneratorReactHost", "cli": "nx", - "title": "Generate Module Federation Setup for React Host App", - "description": "Create Module Federation configuration files for given React Host Application.", + "title": "Generate Module Federation Setup for React Consumer (Host) App", + "description": "Create Module Federation configuration files for given React Consumer (Host) Application.", "type": "object", "properties": { "directory": { @@ -18,7 +18,7 @@ }, "name": { "type": "string", - "description": "The name of the host application to generate the Module Federation configuration", + "description": "The name of the Consumer (host) application to generate the Module Federation configuration", "pattern": "^[a-zA-Z][^:]*$", "x-priority": "important" }, @@ -74,7 +74,7 @@ }, "dynamic": { "type": "boolean", - "description": "Should the host application use dynamic federation?", + "description": "Should the Consumer (host) application use dynamic federation?", "default": false }, "skipFormat": { @@ -141,18 +141,19 @@ }, "remotes": { "type": "array", - "description": "A list of remote application names that the host application should consume.", + "description": "A list of Producer (remote) application names that the Consumer (host) application should consume.", "default": [], - "x-priority": "important" + "x-priority": "important", + "alias": "producers" }, "devServerPort": { "type": "number", - "description": "The port for the dev server of the remote app.", + "description": "The port for the dev server of the Producer (remote) app.", "default": 4200, "x-priority": "important" }, "ssr": { - "description": "Whether to configure SSR for the host application", + "description": "Whether to configure SSR for the Consumer (host) application", "type": "boolean", "default": false }, diff --git a/packages/react/src/generators/remote/lib/update-host-with-remote.ts b/packages/react/src/generators/remote/lib/update-host-with-remote.ts index 5a904aa001116..08a6c3259e0c0 100644 --- a/packages/react/src/generators/remote/lib/update-host-with-remote.ts +++ b/packages/react/src/generators/remote/lib/update-host-with-remote.ts @@ -56,7 +56,7 @@ export function updateHostWithRemote( } else { // TODO(jack): Point to the nx.dev guide when ready. logger.warn( - `Could not find configuration at ${moduleFederationConfigPath}. Did you generate this project with "@nx/react:host"?` + `Could not find configuration at ${moduleFederationConfigPath}. Did you generate this project with "@nx/react:host" or "@nx/react:consumer"?` ); } @@ -78,7 +78,7 @@ export function updateHostWithRemote( ); } else { logger.warn( - `Could not find app component at ${appComponentPath}. Did you generate this project with "@nx/react:host"?` + `Could not find app component at ${appComponentPath}. Did you generate this project with "@nx/react:host" or "@nx/react:consumer"?` ); } } diff --git a/packages/react/src/generators/remote/schema.json b/packages/react/src/generators/remote/schema.json index 11ef9df6a5ef6..4978d1b3bb1e4 100644 --- a/packages/react/src/generators/remote/schema.json +++ b/packages/react/src/generators/remote/schema.json @@ -2,8 +2,8 @@ "$schema": "https://json-schema.org/schema", "$id": "GeneratorReactRemote", "cli": "nx", - "title": "Generate Module Federation Setup for React Remote App", - "description": "Create Module Federation configuration files for given React Remote Application.", + "title": "Generate Module Federation Setup for React Producer (Remote) App", + "description": "Create Module Federation configuration files for given React Producer (Remote) Application.", "type": "object", "properties": { "directory": { @@ -18,13 +18,13 @@ }, "name": { "type": "string", - "description": "The name of the remote application to generate the Module Federation configuration", + "description": "The name of the Producer (remote) application to generate the Module Federation configuration", "pattern": "^[a-zA-Z_$][a-zA-Z_$0-9]*$", "x-priority": "important" }, "dynamic": { "type": "boolean", - "description": "Should the host application use dynamic federation?", + "description": "Should the Consumer (host) application use dynamic federation?", "default": false, "x-priority": "internal" }, @@ -147,16 +147,17 @@ }, "host": { "type": "string", - "description": "The host / shell application for this remote.", - "x-priority": "important" + "description": "The Consumer (host) application for this Producer (remote).", + "x-priority": "important", + "alias": "consumer" }, "devServerPort": { "type": "number", - "description": "The port for the dev server of the remote app.", + "description": "The port for the dev server of the Producer (remote) app.", "x-priority": "important" }, "ssr": { - "description": "Whether to configure SSR for the host application", + "description": "Whether to configure SSR for the Consumer (host) application", "type": "boolean", "default": false }, diff --git a/packages/rspack/src/executors/module-federation-dev-server/schema.json b/packages/rspack/src/executors/module-federation-dev-server/schema.json index 75b019a5e6654..93f9e7e60de47 100644 --- a/packages/rspack/src/executors/module-federation-dev-server/schema.json +++ b/packages/rspack/src/executors/module-federation-dev-server/schema.json @@ -28,16 +28,18 @@ } ] }, - "description": "List of remote applications to run in development mode (i.e. using serve target).", - "x-priority": "important" + "description": "List of Producer (remote) applications to run in development mode (i.e. using serve target).", + "x-priority": "important", + "alias": "devProducers" }, "skipRemotes": { "type": "array", "items": { "type": "string" }, - "description": "List of remote applications to not automatically serve, either statically or in development mode. This will not remove the remotes from the `module-federation.config` file, and therefore the application may still try to fetch these remotes.\nThis option is useful if you have other means for serving the `remote` application(s).\n**NOTE:** Remotes that are not in the workspace will be skipped automatically.", - "x-priority": "important" + "description": "List of Producer (remote) applications to not automatically serve, either statically or in development mode. This will not remove the Producers (remotes) from the `module-federation.config` file, and therefore the application may still try to fetch these Producers (remotes).\nThis option is useful if you have other means for serving the Producer (remote) application(s).\n**NOTE:** Producers (remotes) that are not in the workspace will be skipped automatically.", + "x-priority": "important", + "alias": "skipProducers" }, "buildTarget": { "type": "string", @@ -74,25 +76,27 @@ }, "static": { "type": "boolean", - "description": "Whether to use a static file server instead of the rspack-dev-server. This should be used for remote applications that are also host applications." + "description": "Whether to use a static file server instead of the rspack-dev-server. This should be used for Producer (remote) applications that are also Consumer (host) applications." }, "isInitialHost": { "type": "boolean", - "description": "Whether the host that is running this executor is the first in the project tree to do so.", + "description": "Whether the Consumer (host) that is running this executor is the first in the project tree to do so.", "default": true, - "x-priority": "internal" + "x-priority": "internal", + "alias": "isInitialConsumer" }, "parallel": { "type": "number", - "description": "Max number of parallel processes for building static remotes" + "description": "Max number of parallel processes for building static Producers (remotes)." }, "staticRemotesPort": { "type": "number", - "description": "The port at which to serve the file-server for the static remotes." + "description": "The port at which to serve the file-server for the static Producers (remotes).", + "alias": "staticProducersPort" }, "pathToManifestFile": { "type": "string", - "description": "Path to a Module Federation manifest file (e.g. `my/path/to/module-federation.manifest.json`) containing the dynamic remote applications relative to the workspace root." + "description": "Path to a Module Federation manifest file (e.g. `my/path/to/module-federation.manifest.json`) containing the dynamic Producer (remote) applications relative to the workspace root." } } } diff --git a/packages/rspack/src/executors/module-federation-ssr-dev-server/schema.json b/packages/rspack/src/executors/module-federation-ssr-dev-server/schema.json index 8f86f09ec874e..303fc881fe764 100644 --- a/packages/rspack/src/executors/module-federation-ssr-dev-server/schema.json +++ b/packages/rspack/src/executors/module-federation-ssr-dev-server/schema.json @@ -2,7 +2,7 @@ "version": 2, "outputCapture": "direct-nodejs", "title": "Module Federation SSR Dev Server", - "description": "Serve a SSR host application along with its known remotes.", + "description": "Serve a SSR Consumer (host) application along with its known Producers (remotes).", "cli": "nx", "type": "object", "properties": { @@ -27,16 +27,18 @@ "items": { "type": "string" }, - "description": "List of remote applications to run in development mode (i.e. using serve target).", - "x-priority": "important" + "description": "List of Producers (remote) applications to run in development mode (i.e. using serve target).", + "x-priority": "important", + "alias": "devProducers" }, "skipRemotes": { "type": "array", "items": { "type": "string" }, - "description": "List of remote applications to not automatically serve, either statically or in development mode.", - "x-priority": "important" + "description": "List of Producers (remote) applications to not automatically serve, either statically or in development mode.", + "x-priority": "important", + "alias": "skipProducers" }, "host": { "type": "string", @@ -45,11 +47,12 @@ }, "staticRemotesPort": { "type": "number", - "description": "The port at which to serve the file-server for the static remotes." + "description": "The port at which to serve the file-server for the static Producers (remotes).", + "alias": "staticProducersPort" }, "pathToManifestFile": { "type": "string", - "description": "Path to a Module Federation manifest file (e.g. `my/path/to/module-federation.manifest.json`) containing the dynamic remote applications relative to the workspace root." + "description": "Path to a Module Federation manifest file (e.g. `my/path/to/module-federation.manifest.json`) containing the dynamic Producers (remote) applications relative to the workspace root." }, "ssl": { "type": "boolean", @@ -70,9 +73,10 @@ }, "isInitialHost": { "type": "boolean", - "description": "Whether the host that is running this executor is the first in the project tree to do so.", + "description": "Whether the Consumer (host) that is running this executor is the first in the project tree to do so.", "default": true, - "x-priority": "internal" + "x-priority": "internal", + "alias": "isInitialConsumer" } }, "required": ["browserTarget", "serverTarget"] diff --git a/packages/rspack/src/executors/module-federation-static-server/schema.json b/packages/rspack/src/executors/module-federation-static-server/schema.json index 329ac0a6226d5..0b0414104344b 100644 --- a/packages/rspack/src/executors/module-federation-static-server/schema.json +++ b/packages/rspack/src/executors/module-federation-static-server/schema.json @@ -2,7 +2,7 @@ "version": 2, "outputCapture": "direct-nodejs", "title": "Module Federation Static Dev Server", - "description": "Serve a host application statically along with it's remotes.", + "description": "Serve a Consumer (host) application statically along with it's Producers (remotes).", "cli": "nx", "type": "object", "properties": { From 59e3704fb3fe8bc4f82cbf6a8ace0b7e81a13c55 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Leosvel=20P=C3=A9rez=20Espinosa?= Date: Wed, 4 Dec 2024 18:04:45 +0100 Subject: [PATCH 05/21] fix(testing): force compatible module resolution when running the jest executor (#29189) ## Current Behavior ## Expected Behavior ## Related Issue(s) Fixes #29139 --- packages/jest/src/executors/jest/jest.impl.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/packages/jest/src/executors/jest/jest.impl.ts b/packages/jest/src/executors/jest/jest.impl.ts index 2c8210d5cb89f..57a045a053584 100644 --- a/packages/jest/src/executors/jest/jest.impl.ts +++ b/packages/jest/src/executors/jest/jest.impl.ts @@ -21,6 +21,10 @@ export async function jestExecutor( options: JestExecutorOptions, context: ExecutorContext ): Promise<{ success: boolean }> { + // Jest registers ts-node with module CJS https://github.com/SimenB/jest/blob/v29.6.4/packages/jest-config/src/readConfigFileAndSetRootDir.ts#L117-L119 + // We want to support of ESM via 'module':'nodenext', we need to override the resolution until Jest supports it. + process.env.TS_NODE_COMPILER_OPTIONS ??= '{"moduleResolution":"node10"}'; + const config = await jestConfigParser(options, context); const { results } = await runCLI(config, [options.jestConfig]); From 972c01bd2572eadef680412c96619b1a1b916a07 Mon Sep 17 00:00:00 2001 From: Jack Hsu Date: Wed, 4 Dec 2024 12:44:07 -0500 Subject: [PATCH 06/21] feat(storybook): add support for TS solutions file (#29194) This PR adds support for the [new TS setup](https://github.com/nrwl/nx/discussions/29099) with Storybook. --- .../src/utils/typescript/ts-solution-setup.ts | 11 ++ .../component-story/component-story.ts | 6 +- .../react/src/generators/stories/stories.ts | 9 +- .../storybook-configuration/configuration.ts | 4 +- .../configuration-nested.spec.ts.snap | 20 ++-- .../__snapshots__/configuration.spec.ts.snap | 10 +- .../configuration/configuration.spec.ts | 111 ++++++++++++++++++ .../generators/configuration/configuration.ts | 3 - .../lib/interaction-testing.utils.ts | 12 ++ .../configuration/lib/util-functions.ts | 106 ++++++++++------- .../cypress-project/cypress-project.ts | 3 - .../storybook/src/generators/init/init.ts | 3 - .../vite/plugins/nx-tsconfig-paths.plugin.ts | 2 + 13 files changed, 229 insertions(+), 71 deletions(-) diff --git a/packages/js/src/utils/typescript/ts-solution-setup.ts b/packages/js/src/utils/typescript/ts-solution-setup.ts index d50d9fdb7c724..c726556004337 100644 --- a/packages/js/src/utils/typescript/ts-solution-setup.ts +++ b/packages/js/src/utils/typescript/ts-solution-setup.ts @@ -101,6 +101,17 @@ export function assertNotUsingTsSolutionSetup( process.exit(1); } +export function findRuntimeTsConfigName( + tree: Tree, + projectRoot: string +): string | null { + if (tree.exists(joinPathFragments(projectRoot, 'tsconfig.app.json'))) + return 'tsconfig.app.json'; + if (tree.exists(joinPathFragments(projectRoot, 'tsconfig.lib.json'))) + return 'tsconfig.lib.json'; + return null; +} + export function updateTsconfigFiles( tree: Tree, projectRoot: string, diff --git a/packages/react/src/generators/component-story/component-story.ts b/packages/react/src/generators/component-story/component-story.ts index d4b913d4490b3..ee36ede2a14e3 100644 --- a/packages/react/src/generators/component-story/component-story.ts +++ b/packages/react/src/generators/component-story/component-story.ts @@ -31,9 +31,11 @@ export function createComponentStoriesFile( tsModule = ensureTypescript(); } const proj = getProjects(host).get(project); - const sourceRoot = proj.sourceRoot; - const componentFilePath = joinPathFragments(sourceRoot, componentPath); + const componentFilePath = joinPathFragments( + proj.sourceRoot ?? proj.root, + componentPath + ); const componentDirectory = componentFilePath.replace( componentFilePath.slice(componentFilePath.lastIndexOf('/')), diff --git a/packages/react/src/generators/stories/stories.ts b/packages/react/src/generators/stories/stories.ts index b21a78c0f870f..f5e23e6f90f05 100644 --- a/packages/react/src/generators/stories/stories.ts +++ b/packages/react/src/generators/stories/stories.ts @@ -47,8 +47,10 @@ export async function projectRootPath( } else if (config.projectType == 'library') { // libs/test-lib/src/lib projectDir = 'lib'; + } else { + projectDir = '.'; } - return joinPathFragments(config.sourceRoot, projectDir); + return joinPathFragments(config.sourceRoot ?? config.root, projectDir); } export function containsComponentDeclaration( @@ -119,7 +121,10 @@ export async function createAllStories( await Promise.all( componentPaths.map(async (componentPath) => { - const relativeCmpDir = componentPath.replace(join(sourceRoot, '/'), ''); + const relativeCmpDir = componentPath.replace( + join(sourceRoot ?? root, '/'), + '' + ); if (!containsComponentDeclaration(tree, componentPath)) { return; diff --git a/packages/react/src/generators/storybook-configuration/configuration.ts b/packages/react/src/generators/storybook-configuration/configuration.ts index 1c65f58955795..ce4fd568de915 100644 --- a/packages/react/src/generators/storybook-configuration/configuration.ts +++ b/packages/react/src/generators/storybook-configuration/configuration.ts @@ -54,8 +54,8 @@ export async function storybookConfigurationGeneratorInternal( if ( findWebpackConfig(host, projectConfig.root) || - projectConfig.targets['build']?.executor === '@nx/rollup:rollup' || - projectConfig.targets['build']?.executor === '@nx/expo:build' + projectConfig.targets?.['build']?.executor === '@nx/rollup:rollup' || + projectConfig.targets?.['build']?.executor === '@nx/expo:build' ) { uiFramework = '@storybook/react-webpack5'; } diff --git a/packages/storybook/src/generators/configuration/__snapshots__/configuration-nested.spec.ts.snap b/packages/storybook/src/generators/configuration/__snapshots__/configuration-nested.spec.ts.snap index ead051b57021b..c0bb4e028f296 100644 --- a/packages/storybook/src/generators/configuration/__snapshots__/configuration-nested.spec.ts.snap +++ b/packages/storybook/src/generators/configuration/__snapshots__/configuration-nested.spec.ts.snap @@ -36,11 +36,6 @@ exports[`@nx/storybook:configuration for workspaces with Root project basic func "emitDecoratorMetadata": true, "outDir": "" }, - "files": [ - "./node_modules/@nx/react/typings/styled-jsx.d.ts", - "./node_modules/@nx/react/typings/cssmodule.d.ts", - "./node_modules/@nx/react/typings/image.d.ts" - ], "exclude": [ "src/**/*.spec.ts", "src/**/*.test.ts", @@ -59,6 +54,11 @@ exports[`@nx/storybook:configuration for workspaces with Root project basic func "src/**/*.stories.mdx", ".storybook/*.js", ".storybook/*.ts" + ], + "files": [ + "./node_modules/@nx/react/typings/styled-jsx.d.ts", + "./node_modules/@nx/react/typings/cssmodule.d.ts", + "./node_modules/@nx/react/typings/image.d.ts" ] } " @@ -97,11 +97,6 @@ exports[`@nx/storybook:configuration for workspaces with Root project basic func "emitDecoratorMetadata": true, "outDir": "" }, - "files": [ - "../../node_modules/@nx/react/typings/styled-jsx.d.ts", - "../../node_modules/@nx/react/typings/cssmodule.d.ts", - "../../node_modules/@nx/react/typings/image.d.ts" - ], "exclude": [ "src/**/*.spec.ts", "src/**/*.test.ts", @@ -120,6 +115,11 @@ exports[`@nx/storybook:configuration for workspaces with Root project basic func "src/**/*.stories.mdx", ".storybook/*.js", ".storybook/*.ts" + ], + "files": [ + "../../node_modules/@nx/react/typings/styled-jsx.d.ts", + "../../node_modules/@nx/react/typings/cssmodule.d.ts", + "../../node_modules/@nx/react/typings/image.d.ts" ] } " diff --git a/packages/storybook/src/generators/configuration/__snapshots__/configuration.spec.ts.snap b/packages/storybook/src/generators/configuration/__snapshots__/configuration.spec.ts.snap index 4bfa0bdcd4db7..a8127944fd3ca 100644 --- a/packages/storybook/src/generators/configuration/__snapshots__/configuration.spec.ts.snap +++ b/packages/storybook/src/generators/configuration/__snapshots__/configuration.spec.ts.snap @@ -47,11 +47,6 @@ exports[`@nx/storybook:configuration for Storybook v7 basic functionalities shou "emitDecoratorMetadata": true, "outDir": "" }, - "files": [ - "../node_modules/@nx/react/typings/styled-jsx.d.ts", - "../node_modules/@nx/react/typings/cssmodule.d.ts", - "../node_modules/@nx/react/typings/image.d.ts" - ], "exclude": [ "src/**/*.spec.ts", "src/**/*.test.ts", @@ -70,6 +65,11 @@ exports[`@nx/storybook:configuration for Storybook v7 basic functionalities shou "src/**/*.stories.mdx", ".storybook/*.js", ".storybook/*.ts" + ], + "files": [ + "../node_modules/@nx/react/typings/styled-jsx.d.ts", + "../node_modules/@nx/react/typings/cssmodule.d.ts", + "../node_modules/@nx/react/typings/image.d.ts" ] } " diff --git a/packages/storybook/src/generators/configuration/configuration.spec.ts b/packages/storybook/src/generators/configuration/configuration.spec.ts index cff1ca36696d4..63ebd8247ba95 100644 --- a/packages/storybook/src/generators/configuration/configuration.spec.ts +++ b/packages/storybook/src/generators/configuration/configuration.spec.ts @@ -794,4 +794,115 @@ describe('@nx/storybook:configuration for Storybook v7', () => { } ); }); + + describe('TS solution setup', () => { + let tree: Tree; + beforeEach(() => { + tree = createTreeWithEmptyWorkspace(); + updateJson(tree, 'package.json', (json) => { + json.workspaces = ['packages/*', 'apps/*']; + return json; + }); + writeJson(tree, 'tsconfig.base.json', { + compilerOptions: { + composite: true, + declaration: true, + }, + }); + writeJson(tree, 'tsconfig.json', { + extends: './tsconfig.base.json', + files: [], + references: [], + }); + }); + + it('should add project references when using TS solution', async () => { + await libraryGenerator(tree, { + directory: 'mylib', + bundler: 'none', + skipFormat: true, + addPlugin: true, + }); + + await configurationGenerator(tree, { + project: 'mylib', + standaloneConfig: false, + uiFramework: '@storybook/react-vite', + addPlugin: true, + }); + + expect(readJson(tree, 'tsconfig.json')).toMatchInlineSnapshot(` + { + "extends": "./tsconfig.base.json", + "files": [], + "references": [ + { + "path": "./mylib", + }, + ], + "ts-node": { + "compilerOptions": { + "module": "commonjs", + }, + }, + } + `); + expect(readJson(tree, 'mylib/tsconfig.json')).toMatchInlineSnapshot(` + { + "extends": "../tsconfig.base.json", + "files": [], + "include": [], + "references": [ + { + "path": "./tsconfig.lib.json", + }, + { + "path": "./tsconfig.storybook.json", + }, + ], + } + `); + expect(readJson(tree, 'mylib/tsconfig.storybook.json')) + .toMatchInlineSnapshot(` + { + "compilerOptions": { + "jsx": "preserve", + "module": "esnext", + "moduleResolution": "bundler", + "outDir": "out-tsc/storybook", + }, + "exclude": [ + "src/**/*.spec.ts", + "src/**/*.test.ts", + "src/**/*.spec.js", + "src/**/*.test.js", + "src/**/*.spec.tsx", + "src/**/*.test.tsx", + "src/**/*.spec.jsx", + "src/**/*.test.js", + ], + "extends": "../tsconfig.base.json", + "files": [ + "../node_modules/@nx/react/typings/styled-jsx.d.ts", + "../node_modules/@nx/react/typings/cssmodule.d.ts", + "../node_modules/@nx/react/typings/image.d.ts", + ], + "include": [ + "src/**/*.stories.ts", + "src/**/*.stories.js", + "src/**/*.stories.jsx", + "src/**/*.stories.tsx", + "src/**/*.stories.mdx", + ".storybook/*.js", + ".storybook/*.ts", + ], + "references": [ + { + "path": "./tsconfig.lib.json", + }, + ], + } + `); + }); + }); }); diff --git a/packages/storybook/src/generators/configuration/configuration.ts b/packages/storybook/src/generators/configuration/configuration.ts index 43d2233dc11e9..8fd73406d42d0 100644 --- a/packages/storybook/src/generators/configuration/configuration.ts +++ b/packages/storybook/src/generators/configuration/configuration.ts @@ -9,7 +9,6 @@ import { Tree, } from '@nx/devkit'; import { initGenerator as jsInitGenerator } from '@nx/js'; -import { assertNotUsingTsSolutionSetup } from '@nx/js/src/utils/typescript/ts-solution-setup'; import { StorybookConfigureSchema } from './schema'; import { initGenerator } from '../init/init'; @@ -60,8 +59,6 @@ export async function configurationGeneratorInternal( tree: Tree, rawSchema: StorybookConfigureSchema ) { - assertNotUsingTsSolutionSetup(tree, 'storybook', 'configuration'); - const storybookMajor = storybookMajorVersion(); if (storybookMajor > 0 && storybookMajor === 6) { throw new Error(pleaseUpgrade()); diff --git a/packages/storybook/src/generators/configuration/lib/interaction-testing.utils.ts b/packages/storybook/src/generators/configuration/lib/interaction-testing.utils.ts index 9ebd37fc51ec8..f877b0db6ce9b 100644 --- a/packages/storybook/src/generators/configuration/lib/interaction-testing.utils.ts +++ b/packages/storybook/src/generators/configuration/lib/interaction-testing.utils.ts @@ -67,6 +67,18 @@ function getMainTsJsPath( host: Tree, projectConfig: ProjectConfiguration ): string | undefined { + // Inferred targets from `@nx/storybook/plugin` are inferred from `.storybook/main.{js,ts,mjs,mts,cjs,cts}` so we can assume the directory. + if (!projectConfig.targets) { + const exts = ['js', 'ts', 'mjs', 'mts', 'cjs', 'cts']; + for (const ext of exts) { + const candidate = `${projectConfig.root}/.storybook/main.${ext}`; + if (host.exists(candidate)) return candidate; + } + throw new Error( + `Cannot find main Storybook file. Does this file exist? e.g. ${projectConfig.root}/.storybook/main.ts` + ); + } + let mainJsTsPath: string | undefined = undefined; Object.entries(projectConfig.targets).forEach( ([_targetName, targetConfig]) => { diff --git a/packages/storybook/src/generators/configuration/lib/util-functions.ts b/packages/storybook/src/generators/configuration/lib/util-functions.ts index 9c6e25c95234d..b19b557267fb1 100644 --- a/packages/storybook/src/generators/configuration/lib/util-functions.ts +++ b/packages/storybook/src/generators/configuration/lib/util-functions.ts @@ -1,11 +1,9 @@ import { - createProjectGraphAsync, ensurePackage, generateFiles, joinPathFragments, logger, offsetFromRoot, - parseTargetString, readJson, readNxJson, readProjectConfiguration, @@ -17,7 +15,6 @@ import { workspaceRoot, writeJson, } from '@nx/devkit'; -import { forEachExecutorOptions } from '@nx/devkit/src/generators/executor-options-utils'; import { Linter } from '@nx/eslint'; import { join, relative } from 'path'; import { @@ -30,6 +27,10 @@ import { UiFramework } from '../../../utils/models'; import { nxVersion } from '../../../utils/versions'; import { findEslintFile } from '@nx/eslint/src/generators/utils/eslint-file'; import { useFlatConfig } from '@nx/eslint/src/utils/flat-config'; +import { + findRuntimeTsConfigName, + isUsingTsSolutionSetup, +} from '@nx/js/src/utils/typescript/ts-solution-setup'; const DEFAULT_PORT = 4400; @@ -167,6 +168,9 @@ export function createStorybookTsconfigFile( isRootProject: boolean, mainDir: 'components' | 'src' ) { + const offset = offsetFromRoot(projectRoot); + const useTsSolution = isUsingTsSolutionSetup(tree); + // First let's check if old configuration file exists // If it exists, let's rename it and move it to the new location const oldStorybookTsConfigPath = joinPathFragments( @@ -186,9 +190,10 @@ export function createStorybookTsconfigFile( return; } + const storybookTsConfigName = 'tsconfig.storybook.json'; const storybookTsConfigPath = joinPathFragments( projectRoot, - 'tsconfig.storybook.json' + storybookTsConfigName ); if (tree.exists(storybookTsConfigPath)) { @@ -196,12 +201,52 @@ export function createStorybookTsconfigFile( return; } - const exclude = [`${mainDir}/**/*.spec.ts`, `${mainDir}/**/*.test.ts`]; + const storybookTsConfig: any = { + extends: useTsSolution + ? joinPathFragments(offset, 'tsconfig.base.json') + : './tsconfig.json', + compilerOptions: { + emitDecoratorMetadata: useTsSolution ? undefined : true, + outDir: useTsSolution + ? 'out-tsc/storybook' + : uiFramework === '@storybook/react-webpack5' || + uiFramework === '@storybook/react-vite' + ? '' + : undefined, + module: useTsSolution ? 'esnext' : undefined, + moduleResolution: useTsSolution ? 'bundler' : undefined, + jsx: + useTsSolution && uiFramework !== '@storybook/angular' + ? 'preserve' + : undefined, + }, + exclude: [`${mainDir}/**/*.spec.ts`, `${mainDir}/**/*.test.ts`], + include: [ + `${mainDir}/**/*.stories.ts`, + `${mainDir}/**/*.stories.js`, + `${mainDir}/**/*.stories.jsx`, + `${mainDir}/**/*.stories.tsx`, + `${mainDir}/**/*.stories.mdx`, + '.storybook/*.js', + '.storybook/*.ts', + ], + }; + + if (useTsSolution) { + const runtimeConfig = findRuntimeTsConfigName(tree, projectRoot); + if (runtimeConfig) { + storybookTsConfig.references ??= []; + storybookTsConfig.references.push({ + path: `./${runtimeConfig}`, + }); + } + } + if ( uiFramework === '@storybook/react-webpack5' || uiFramework === '@storybook/react-vite' ) { - exclude.push( + storybookTsConfig.exclude.push( `${mainDir}/**/*.spec.js`, `${mainDir}/**/*.test.js`, `${mainDir}/**/*.spec.tsx`, @@ -209,17 +254,7 @@ export function createStorybookTsconfigFile( `${mainDir}/**/*.spec.jsx`, `${mainDir}/**/*.test.js` ); - } - - let files: string[]; - - if ( - uiFramework === '@storybook/react-webpack5' || - uiFramework === '@storybook/react-vite' - ) { - const offset = offsetFromRoot(projectRoot); - - files = [ + storybookTsConfig.files = [ `${ !isRootProject ? offset : '' }node_modules/@nx/react/typings/styled-jsx.d.ts`, @@ -232,30 +267,19 @@ export function createStorybookTsconfigFile( ]; } - const include: string[] = [ - `${mainDir}/**/*.stories.ts`, - `${mainDir}/**/*.stories.js`, - `${mainDir}/**/*.stories.jsx`, - `${mainDir}/**/*.stories.tsx`, - `${mainDir}/**/*.stories.mdx`, - '.storybook/*.js', - '.storybook/*.ts', - ]; - - const storybookTsConfig: TsConfig = { - extends: './tsconfig.json', - compilerOptions: { - emitDecoratorMetadata: true, - outDir: - uiFramework === '@storybook/react-webpack5' || - uiFramework === '@storybook/react-vite' - ? '' - : undefined, - }, - files, - exclude, - include, - }; + if (useTsSolution) { + updateJson( + tree, + joinPathFragments(projectRoot, 'tsconfig.json'), + (json) => { + json.references ??= []; + json.references.push({ + path: `./${storybookTsConfigName}`, + }); + return json; + } + ); + } writeJson(tree, storybookTsConfigPath, storybookTsConfig); } diff --git a/packages/storybook/src/generators/cypress-project/cypress-project.ts b/packages/storybook/src/generators/cypress-project/cypress-project.ts index a05185f061d7a..ee2af4b0cdaa5 100644 --- a/packages/storybook/src/generators/cypress-project/cypress-project.ts +++ b/packages/storybook/src/generators/cypress-project/cypress-project.ts @@ -15,7 +15,6 @@ import { } from '@nx/devkit'; import { Linter, LinterType } from '@nx/eslint'; import { determineProjectNameAndRootOptions } from '@nx/devkit/src/generators/project-name-and-root-utils'; -import { assertNotUsingTsSolutionSetup } from '@nx/js/src/utils/typescript/ts-solution-setup'; import { join } from 'path'; import { safeFileDelete } from '../../utils/utilities'; @@ -35,8 +34,6 @@ export async function cypressProjectGenerator( tree: Tree, schema: CypressConfigureSchema ) { - assertNotUsingTsSolutionSetup(tree, 'cypress', 'cypress-project'); - logger.warn( `Use 'interactionTests' instead when running '@nx/storybook:configuration'. This generator will be removed in v21.` ); diff --git a/packages/storybook/src/generators/init/init.ts b/packages/storybook/src/generators/init/init.ts index f6c77b871c2df..452031928ea72 100644 --- a/packages/storybook/src/generators/init/init.ts +++ b/packages/storybook/src/generators/init/init.ts @@ -11,7 +11,6 @@ import { updateNxJson, } from '@nx/devkit'; import { addPluginV1 } from '@nx/devkit/src/utils/add-plugin'; -import { assertNotUsingTsSolutionSetup } from '@nx/js/src/utils/typescript/ts-solution-setup'; import { gte } from 'semver'; import { createNodes } from '../../plugins/plugin'; import { @@ -96,8 +95,6 @@ export function initGenerator(tree: Tree, schema: Schema) { } export async function initGeneratorInternal(tree: Tree, schema: Schema) { - assertNotUsingTsSolutionSetup(tree, 'storybook', 'init'); - const nxJson = readNxJson(tree); const addPluginDefault = process.env.NX_ADD_PLUGINS !== 'false' && diff --git a/packages/vite/plugins/nx-tsconfig-paths.plugin.ts b/packages/vite/plugins/nx-tsconfig-paths.plugin.ts index 7cfc3c3a67b95..cf8d9b3f0c707 100644 --- a/packages/vite/plugins/nx-tsconfig-paths.plugin.ts +++ b/packages/vite/plugins/nx-tsconfig-paths.plugin.ts @@ -18,6 +18,7 @@ import { } from '@nx/js/src/utils/buildable-libs-utils'; import { Plugin } from 'vite'; import { nxViteBuildCoordinationPlugin } from './nx-vite-build-coordination.plugin'; +import { isUsingTsSolutionSetup } from '@nx/js/src/utils/typescript/ts-solution-setup'; export interface nxViteTsPathsOptions { /** @@ -188,6 +189,7 @@ There should at least be a tsconfig.base.json or tsconfig.json in the root of th return resolvedFile || null; }, async writeBundle(options) { + if (isUsingTsSolutionSetup()) return; const outDir = options.dir || 'dist'; const src = resolve(projectRoot, 'package.json'); if (existsSync(src)) { From 6c5916a79ff06e0fc2e09942be8ec1f5af58a065 Mon Sep 17 00:00:00 2001 From: Jack Hsu Date: Wed, 4 Dec 2024 12:53:42 -0500 Subject: [PATCH 07/21] feat(rollup): use .cjs file extension for config files (#29196) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The `rollup.config.js` file will be resolved as ESM if the closest `package.json` has `type: 'module`. This causes an error when computing the project graph and when reading the file for builds. ``` Original error: require is not defined in ES module scope, you can use import instead ``` This PR also updates the output directory to `{projectRoot}/dist` for the new TS setup. ## Current Behavior `nx g @nx/react:lib --bundler=rollup` has an error due to Node resolution ## Expected Behavior `nx g @nx/react:lib --bundler=rollup` works out of the box ## Related Issue(s) Fixes #29193, #[29195](https://github.com/nrwl/nx/issues/29195) --------- Co-authored-by: Leosvel Pérez Espinosa --- e2e/react/src/react-package.test.ts | 2 +- e2e/rollup/src/rollup-legacy.test.ts | 10 +- e2e/rollup/src/rollup.test.ts | 8 +- .../generators/setup-build/generator.spec.ts | 2 +- packages/react/plugins/bundle-rollup.ts | 4 +- .../library/lib/add-rollup-build-target.ts | 70 +++++----- .../src/generators/library/library.spec.ts | 129 +++++++++++++++++- .../configuration/configuration.spec.ts | 4 +- .../generators/configuration/configuration.ts | 2 +- .../convert-to-inferred.spec.ts | 36 ++--- .../convert-to-inferred.ts | 4 +- ...ollup-config-from-executor-options.spec.ts | 83 +++++++++-- ...act-rollup-config-from-executor-options.ts | 11 +- .../plugins/__snapshots__/plugin.spec.ts.snap | 8 +- packages/rollup/src/plugins/plugin.spec.ts | 8 +- 15 files changed, 291 insertions(+), 90 deletions(-) diff --git a/e2e/react/src/react-package.test.ts b/e2e/react/src/react-package.test.ts index f5b72a9af6b20..f89dafec04696 100644 --- a/e2e/react/src/react-package.test.ts +++ b/e2e/react/src/react-package.test.ts @@ -95,7 +95,7 @@ describe('Build React libraries and apps', () => { // Add assets to child lib updateFile( - join('libs', childLib, 'rollup.config.js'), + join('libs', childLib, 'rollup.config.cjs'), `const { withNx } = require('@nx/rollup/with-nx'); module.exports = withNx( { diff --git a/e2e/rollup/src/rollup-legacy.test.ts b/e2e/rollup/src/rollup-legacy.test.ts index 1ec847001e24d..b5fcd121cec6b 100644 --- a/e2e/rollup/src/rollup-legacy.test.ts +++ b/e2e/rollup/src/rollup-legacy.test.ts @@ -185,13 +185,13 @@ describe('Rollup Plugin', () => { checkFilesExist(`dist/test/index.mjs.js`); }); - it('should support array config from rollup.config.js', () => { + it('should support array config from rollup.config.cjs', () => { const jsLib = uniq('jslib'); runCLI( `generate @nx/js:lib ${jsLib} --directory=libs/${jsLib} --bundler rollup --verbose` ); updateFile( - `libs/${jsLib}/rollup.config.js`, + `libs/${jsLib}/rollup.config.cjs`, `module.exports = (config) => [{ ...config, output: { @@ -204,7 +204,7 @@ describe('Rollup Plugin', () => { }]` ); updateJson(join('libs', jsLib, 'project.json'), (config) => { - config.targets.build.options.rollupConfig = `libs/${jsLib}/rollup.config.js`; + config.targets.build.options.rollupConfig = `libs/${jsLib}/rollup.config.cjs`; return config; }); @@ -219,7 +219,7 @@ describe('Rollup Plugin', () => { `generate @nx/js:lib ${jsLib} --directory=libs/${jsLib} --bundler rollup --verbose` ); updateFile( - `libs/${jsLib}/rollup.config.js`, + `libs/${jsLib}/rollup.config.cjs`, `module.exports = (config) => ({ ...config, // Filter out the plugin, but the @nx/rollup:rollup executor should add it back @@ -227,7 +227,7 @@ describe('Rollup Plugin', () => { })` ); updateJson(join('libs', jsLib, 'project.json'), (config) => { - config.targets.build.options.rollupConfig = `libs/${jsLib}/rollup.config.js`; + config.targets.build.options.rollupConfig = `libs/${jsLib}/rollup.config.cjs`; return config; }); diff --git a/e2e/rollup/src/rollup.test.ts b/e2e/rollup/src/rollup.test.ts index 2d8056a9ec3d7..bce8c2ca4ccec 100644 --- a/e2e/rollup/src/rollup.test.ts +++ b/e2e/rollup/src/rollup.test.ts @@ -27,7 +27,7 @@ describe('Rollup Plugin', () => { `generate @nx/rollup:configuration ${myPkg} --tsConfig=./tsconfig.lib.json --main=./src/index.ts` ); updateFile( - `libs/${myPkg}/rollup.config.js`, + `libs/${myPkg}/rollup.config.cjs`, ` const { withNx } = require('@nx/rollup/with-nx'); module.exports = withNx({ @@ -61,7 +61,7 @@ describe('Rollup Plugin', () => { `generate @nx/rollup:configuration ${myPkg} --tsConfig=./tsconfig.lib.json --main=./src/index.ts --compiler=swc` ); updateFile( - `libs/${myPkg}/rollup.config.js`, + `libs/${myPkg}/rollup.config.cjs`, ` const { withNx } = require('@nx/rollup/with-nx'); module.exports = withNx({ @@ -85,7 +85,7 @@ describe('Rollup Plugin', () => { `generate @nx/rollup:configuration ${myPkg} --tsConfig=./tsconfig.lib.json --main=./src/index.ts --compiler=tsc` ); updateFile( - `libs/${myPkg}/rollup.config.js`, + `libs/${myPkg}/rollup.config.cjs`, ` const { withNx } = require('@nx/rollup/with-nx'); module.exports = withNx({ @@ -114,7 +114,7 @@ describe('Rollup Plugin', () => { `generate @nx/rollup:configuration ${myPkg} --tsConfig=./tsconfig.lib.json --main=./src/index.ts --compiler=tsc` ); updateFile( - `libs/${myPkg}/rollup.config.js`, + `libs/${myPkg}/rollup.config.cjs`, ` const { withNx } = require('@nx/rollup/with-nx'); module.exports = withNx({ diff --git a/packages/js/src/generators/setup-build/generator.spec.ts b/packages/js/src/generators/setup-build/generator.spec.ts index aec3504f8447a..24993382ec27f 100644 --- a/packages/js/src/generators/setup-build/generator.spec.ts +++ b/packages/js/src/generators/setup-build/generator.spec.ts @@ -138,7 +138,7 @@ describe('setup-build generator', () => { bundler: 'rollup', }); - expect(tree.exists('packages/mypkg/rollup.config.js')).toBe(true); + expect(tree.exists('packages/mypkg/rollup.config.cjs')).toBe(true); }); it('should support --bundler=esbuild', async () => { diff --git a/packages/react/plugins/bundle-rollup.ts b/packages/react/plugins/bundle-rollup.ts index eae13e6e8702b..4461bf328d016 100644 --- a/packages/react/plugins/bundle-rollup.ts +++ b/packages/react/plugins/bundle-rollup.ts @@ -1,8 +1,8 @@ import * as rollup from 'rollup'; -// TODO(v22): Remove this in Nx 22 and migrate to explicit rollup.config.js files. +// TODO(v22): Remove this in Nx 22 and migrate to explicit rollup.config.cjs files. /** - * @deprecated Use `withNx` function from `@nx/rollup/with-nx` in your rollup.config.js file instead. Use `nx g @nx/rollup:convert-to-inferred` to generate the rollup.config.js file if it does not exist. + * @deprecated Use `withNx` function from `@nx/rollup/with-nx` in your rollup.config.cjs file instead. Use `nx g @nx/rollup:convert-to-inferred` to generate the rollup.config.cjs file if it does not exist. */ function getRollupOptions(options: rollup.RollupOptions) { const extraGlobals = { diff --git a/packages/react/src/generators/library/lib/add-rollup-build-target.ts b/packages/react/src/generators/library/lib/add-rollup-build-target.ts index a7cb9ff47bebc..2d489f711e448 100644 --- a/packages/react/src/generators/library/lib/add-rollup-build-target.ts +++ b/packages/react/src/generators/library/lib/add-rollup-build-target.ts @@ -8,7 +8,6 @@ import { readNxJson, readProjectConfiguration, runTasksInSerial, - stripIndents, updateProjectConfiguration, } from '@nx/devkit'; @@ -69,38 +68,43 @@ export async function addRollupBuildTarget( if (hasRollupPlugin) { // New behavior, using rollup config file and inferred target. host.write( - joinPathFragments(options.projectRoot, 'rollup.config.js'), - stripIndents` - const { withNx } = require('@nx/rollup/with-nx'); - const url = require('@rollup/plugin-url'); - const svg = require('@svgr/rollup'); - - module.exports = withNx({ - main: '${maybeJs(options, './src/index.ts')}', - outputPath: '${joinPathFragments( - offsetFromRoot(options.projectRoot), - 'dist', - options.projectRoot - )}', - tsConfig: './tsconfig.lib.json', - compiler: '${options.compiler ?? 'babel'}', - external: ${JSON.stringify(external)}, - format: ['esm'], - assets:[{ input: '.', output: '.', glob: 'README.md'}], - }, { - // Provide additional rollup configuration here. See: https://rollupjs.org/configuration-options - plugins: [ - svg({ - svgo: false, - titleProp: true, - ref: true, - }), - url({ - limit: 10000, // 10kB - }), - ], - }); - ` + joinPathFragments(options.projectRoot, 'rollup.config.cjs'), + `const { withNx } = require('@nx/rollup/with-nx'); +const url = require('@rollup/plugin-url'); +const svg = require('@svgr/rollup'); + +module.exports = withNx( + { + main: '${maybeJs(options, './src/index.ts')}', + outputPath: '${ + options.isUsingTsSolutionConfig + ? './dist' + : joinPathFragments( + offsetFromRoot(options.projectRoot), + 'dist', + options.projectRoot + ) + }', + tsConfig: './tsconfig.lib.json', + compiler: '${options.compiler ?? 'babel'}', + external: ${JSON.stringify(external)}, + format: ['esm'], + assets:[{ input: '.', output: '.', glob: 'README.md'}], + }, { + // Provide additional rollup configuration here. See: https://rollupjs.org/configuration-options + plugins: [ + svg({ + svgo: false, + titleProp: true, + ref: true, + }), + url({ + limit: 10000, // 10kB + }), + ], + } +); +` ); } else { // Legacy behavior, there is a target in project.json using rollup executor. diff --git a/packages/react/src/generators/library/library.spec.ts b/packages/react/src/generators/library/library.spec.ts index 60ad9f8216236..be647296211fb 100644 --- a/packages/react/src/generators/library/library.spec.ts +++ b/packages/react/src/generators/library/library.spec.ts @@ -517,7 +517,37 @@ describe('lib', () => { buildable: true, }); - expect(tree.exists('my-lib/rollup.config.js')).toBeTruthy(); + expect(tree.read('my-lib/rollup.config.cjs', 'utf-8')) + .toMatchInlineSnapshot(` + "const { withNx } = require('@nx/rollup/with-nx'); + const url = require('@rollup/plugin-url'); + const svg = require('@svgr/rollup'); + + module.exports = withNx( + { + main: './src/index.ts', + outputPath: '../dist/my-lib', + tsConfig: './tsconfig.lib.json', + compiler: 'babel', + external: ["react","react-dom","react/jsx-runtime"], + format: ['esm'], + assets:[{ input: '.', output: '.', glob: 'README.md'}], + }, { + // Provide additional rollup configuration here. See: https://rollupjs.org/configuration-options + plugins: [ + svg({ + svgo: false, + titleProp: true, + ref: true, + }), + url({ + limit: 10000, // 10kB + }), + ], + } + ); + " + `); }); }); @@ -558,7 +588,7 @@ describe('lib', () => { importPath: '@proj/my-lib', }); - expect(tree.read('my-lib/rollup.config.js', 'utf-8')) + expect(tree.read('my-lib/rollup.config.cjs', 'utf-8')) .toEqual(`const { withNx } = require('@nx/rollup/with-nx'); const url = require('@rollup/plugin-url'); const svg = require('@svgr/rollup'); @@ -906,6 +936,59 @@ module.exports = withNx( name: 'mylib', }); + expect(tree.read('mylib/vite.config.ts', 'utf-8')).toMatchInlineSnapshot(` + "/// + import { defineConfig } from 'vite'; + import react from '@vitejs/plugin-react'; + import dts from 'vite-plugin-dts'; + import * as path from 'path'; + + export default defineConfig({ + root: __dirname, + cacheDir: '../node_modules/.vite/mylib', + plugins: [react(), dts({ entryRoot: 'src', tsconfigPath: path.join(__dirname, 'tsconfig.lib.json') })], + // Uncomment this if you are using workers. + // worker: { + // plugins: [ nxViteTsPaths() ], + // }, + // Configuration for building your library. + // See: https://vitejs.dev/guide/build.html#library-mode + build: { + outDir: './dist', + emptyOutDir: true, + reportCompressedSize: true, + commonjsOptions: { + transformMixedEsModules: true, + }, + lib: { + // Could also be a dictionary or array of multiple entry points. + entry: 'src/index.ts', + name: 'mylib', + fileName: 'index', + // Change this to the formats you want to support. + // Don't forget to update your package.json as well. + formats: ['es', 'cjs'] + }, + rollupOptions: { + // External packages that should not be bundled into your library. + external: ['react','react-dom','react/jsx-runtime'] + }, + }, + test: { + watch: false, + globals: true, + environment: 'jsdom', + include: ['src/**/*.{test,spec}.{js,mjs,cjs,ts,mts,cts,jsx,tsx}'], + reporters: ['default'], + coverage: { + reportsDirectory: '../coverage/mylib', + provider: 'v8', + } + }, + }); + " + `); + expect(readJson(tree, 'tsconfig.json').references).toMatchInlineSnapshot(` [ { @@ -1061,5 +1144,47 @@ module.exports = withNx( } `); }); + + it('should configure rollup correctly', async () => { + await libraryGenerator(tree, { + ...defaultSchema, + bundler: 'rollup', + unitTestRunner: 'none', + directory: 'mylib', + name: 'mylib', + }); + + expect(tree.read('mylib/rollup.config.cjs', 'utf-8')) + .toMatchInlineSnapshot(` + "const { withNx } = require('@nx/rollup/with-nx'); + const url = require('@rollup/plugin-url'); + const svg = require('@svgr/rollup'); + + module.exports = withNx( + { + main: './src/index.ts', + outputPath: './dist', + tsConfig: './tsconfig.lib.json', + compiler: 'babel', + external: ["react","react-dom","react/jsx-runtime"], + format: ['esm'], + assets:[{ input: '.', output: '.', glob: 'README.md'}], + }, { + // Provide additional rollup configuration here. See: https://rollupjs.org/configuration-options + plugins: [ + svg({ + svgo: false, + titleProp: true, + ref: true, + }), + url({ + limit: 10000, // 10kB + }), + ], + } + ); + " + `); + }); }); }); diff --git a/packages/rollup/src/generators/configuration/configuration.spec.ts b/packages/rollup/src/generators/configuration/configuration.spec.ts index e68d286da1523..370241aad389f 100644 --- a/packages/rollup/src/generators/configuration/configuration.spec.ts +++ b/packages/rollup/src/generators/configuration/configuration.spec.ts @@ -59,7 +59,7 @@ describe('configurationGenerator', () => { main: './libs/mypkg/src/index.ts', }); - const rollupConfig = tree.read('libs/mypkg/rollup.config.js', 'utf-8'); + const rollupConfig = tree.read('libs/mypkg/rollup.config.cjs', 'utf-8'); expect(rollupConfig) .toEqual(`const { withNx } = require('@nx/rollup/with-nx'); @@ -88,7 +88,7 @@ module.exports = withNx( tsConfig: 'libs/mypkg/tsconfig.custom.json', }); - const rollupConfig = tree.read('libs/mypkg/rollup.config.js', 'utf-8'); + const rollupConfig = tree.read('libs/mypkg/rollup.config.cjs', 'utf-8'); expect(rollupConfig) .toEqual(`const { withNx } = require('@nx/rollup/with-nx'); diff --git a/packages/rollup/src/generators/configuration/configuration.ts b/packages/rollup/src/generators/configuration/configuration.ts index df1096bf57d3a..53a6a79dcad49 100644 --- a/packages/rollup/src/generators/configuration/configuration.ts +++ b/packages/rollup/src/generators/configuration/configuration.ts @@ -99,7 +99,7 @@ function createRollupConfig( }; tree.write( - joinPathFragments(project.root, 'rollup.config.js'), + joinPathFragments(project.root, 'rollup.config.cjs'), `const { withNx } = require('@nx/rollup/with-nx'); module.exports = withNx( diff --git a/packages/rollup/src/generators/convert-to-inferred/convert-to-inferred.spec.ts b/packages/rollup/src/generators/convert-to-inferred/convert-to-inferred.spec.ts index 4e200052fce05..5839570a95c9d 100644 --- a/packages/rollup/src/generators/convert-to-inferred/convert-to-inferred.spec.ts +++ b/packages/rollup/src/generators/convert-to-inferred/convert-to-inferred.spec.ts @@ -100,7 +100,7 @@ describe('Rollup - Convert Executors To Plugin', () => { include: [`${project.root}/**/*`], }, ]); - expect(tree.read('mypkg/rollup.config.js', 'utf-8')) + expect(tree.read('mypkg/rollup.config.cjs', 'utf-8')) .toMatchInlineSnapshot(` "const { withNx } = require('@nx/rollup/with-nx'); @@ -124,8 +124,8 @@ describe('Rollup - Convert Executors To Plugin', () => { module.exports = config; " `); - expect(tree.exists('otherpkg1/rollup.config.js')).toBe(false); - expect(tree.exists('otherpkg2/rollup.config.js')).toBe(false); + expect(tree.exists('otherpkg1/rollup.config.cjs')).toBe(false); + expect(tree.exists('otherpkg2/rollup.config.cjs')).toBe(false); expect(readProjectConfiguration(tree, project.name).targets).toEqual({}); }); @@ -187,7 +187,7 @@ describe('Rollup - Convert Executors To Plugin', () => { project: projectWithMultipleConfigsAndEntries.name, }); - expect(tree.read('mypkg1/rollup.config.js', 'utf-8')) + expect(tree.read('mypkg1/rollup.config.cjs', 'utf-8')) .toMatchInlineSnapshot(` "const { withNx } = require('@nx/rollup/with-nx'); @@ -213,7 +213,7 @@ describe('Rollup - Convert Executors To Plugin', () => { module.exports = config; " `); - expect(tree.read('mypkg2/rollup.config.js', 'utf-8')) + expect(tree.read('mypkg2/rollup.config.cjs', 'utf-8')) .toMatchInlineSnapshot(` "const { withNx } = require('@nx/rollup/with-nx'); @@ -254,31 +254,31 @@ describe('Rollup - Convert Executors To Plugin', () => { ).toEqual({}); }); - it('should handle conflicts with existing rollup.config.js file', async () => { + it('should handle conflicts with existing rollup.config.cjs file', async () => { const project = createProject(tree, { name: 'mypkg1', root: 'mypkg1', targetOptions: { rollupConfig: [ - 'mypkg1/rollup.config.js', + 'mypkg1/rollup.config.cjs', 'mypkg1/rollup.other.config.js', ], }, }); tree.write( - 'mypkg1/rollup.config.js', + 'mypkg1/rollup.config.cjs', '// existing config\nmodule.exports = {};' ); await convertToInferred(tree, { project: project.name }); - expect(tree.read('mypkg1/rollup.migrated.config.js', 'utf-8')) + expect(tree.read('mypkg1/rollup.migrated.config.cjs', 'utf-8')) .toMatchInlineSnapshot(` "// existing config module.exports = {}; " `); - expect(tree.read('mypkg1/rollup.config.js', 'utf-8')) + expect(tree.read('mypkg1/rollup.config.cjs', 'utf-8')) .toMatchInlineSnapshot(` "const { withNx } = require('@nx/rollup/with-nx'); @@ -299,7 +299,7 @@ describe('Rollup - Convert Executors To Plugin', () => { // output: { sourcemap: true }, }); - config = require('./rollup.migrated.config.js')(config, options); + config = require('./rollup.migrated.config.cjs')(config, options); config = require('./rollup.other.config.js')(config, options); module.exports = config; @@ -422,7 +422,7 @@ describe('Rollup - Convert Executors To Plugin', () => { await convertToInferred(tree, { project: project.name }); - expect(tree.read('mypkg/rollup.config.js', 'utf-8')) + expect(tree.read('mypkg/rollup.config.cjs', 'utf-8')) .toMatchInlineSnapshot(` "const { withNx } = require('@nx/rollup/with-nx'); @@ -521,7 +521,7 @@ describe('Rollup - Convert Executors To Plugin', () => { readProjectConfiguration(tree, project.name).targets.build.cache ).toBe(true); // Plugin options are read from targetDefaults since they were missing in project.json - expect(tree.read('mypkg1/rollup.config.js', 'utf-8')) + expect(tree.read('mypkg1/rollup.config.cjs', 'utf-8')) .toMatchInlineSnapshot(` "const { withNx } = require('@nx/rollup/with-nx'); @@ -574,7 +574,7 @@ describe('Rollup - Convert Executors To Plugin', () => { plugin: '@nx/rollup/plugin', }, ]); - expect(tree.read('mypkg/rollup.config.js', 'utf-8')) + expect(tree.read('mypkg/rollup.config.cjs', 'utf-8')) .toMatchInlineSnapshot(` "const { withNx } = require('@nx/rollup/with-nx'); @@ -599,8 +599,8 @@ describe('Rollup - Convert Executors To Plugin', () => { module.exports = config; " `); - expect(tree.exists('otherpkg1/rollup.config.js')).toBe(false); - expect(tree.exists('otherpkg2/rollup.config.js')).toBe(false); + expect(tree.exists('otherpkg1/rollup.config.cjs')).toBe(false); + expect(tree.exists('otherpkg2/rollup.config.cjs')).toBe(false); expect(readProjectConfiguration(tree, project.name).targets).toEqual({}); }); }); @@ -623,7 +623,7 @@ describe('Rollup - Convert Executors To Plugin', () => { await convertToInferred(tree, {}); - expect(tree.read('pkg1/rollup.config.js', 'utf-8')) + expect(tree.read('pkg1/rollup.config.cjs', 'utf-8')) .toMatchInlineSnapshot(` "const { withNx } = require('@nx/rollup/with-nx'); @@ -647,7 +647,7 @@ describe('Rollup - Convert Executors To Plugin', () => { module.exports = config; " `); - expect(tree.read('pkg2/rollup.config.js', 'utf-8')) + expect(tree.read('pkg2/rollup.config.cjs', 'utf-8')) .toMatchInlineSnapshot(` "const { withNx } = require('@nx/rollup/with-nx'); diff --git a/packages/rollup/src/generators/convert-to-inferred/convert-to-inferred.ts b/packages/rollup/src/generators/convert-to-inferred/convert-to-inferred.ts index 18487dc7c9778..b5e87dcc3cb42 100644 --- a/packages/rollup/src/generators/convert-to-inferred/convert-to-inferred.ts +++ b/packages/rollup/src/generators/convert-to-inferred/convert-to-inferred.ts @@ -79,10 +79,10 @@ export async function convertToInferred(tree: Tree, options: Schema) { (target.outputs[0] === '{options.outputPath}' || target.outputs[0] === '{workspaceRoot}/{options.outputPath}') ) { - // If only the default `options.outputPath` is set as output, remove it and use path inferred from `rollup.config.js`. + // If only the default `options.outputPath` is set as output, remove it and use path inferred from `rollup.config.cjs`. delete target.outputs; } else { - // Otherwise, replace `options.outputPath` with what is inferred from `rollup.config.js`. + // Otherwise, replace `options.outputPath` with what is inferred from `rollup.config.cjs`. target.outputs = target.outputs.map((output) => // Again, "{projectRoot}/{options.outputPath}" is an invalid output for Rollup. output === '{options.outputPath}' || diff --git a/packages/rollup/src/generators/convert-to-inferred/lib/extract-rollup-config-from-executor-options.spec.ts b/packages/rollup/src/generators/convert-to-inferred/lib/extract-rollup-config-from-executor-options.spec.ts index a55fc4b3ecac8..550e30da06e63 100644 --- a/packages/rollup/src/generators/convert-to-inferred/lib/extract-rollup-config-from-executor-options.spec.ts +++ b/packages/rollup/src/generators/convert-to-inferred/lib/extract-rollup-config-from-executor-options.spec.ts @@ -4,6 +4,71 @@ import { extractRollupConfigFromExecutorOptions } from './extract-rollup-config- describe('extract-rollup-config-from-executor-options', () => { it('should extract the options correctly', () => { + // ARRANGE + const tree = createTreeWithEmptyWorkspace(); + tree.write( + `apps/myapp/rollup.config.cjs`, + `export default (config) => {return config;}` + ); + // ACT + const defaultValues = extractRollupConfigFromExecutorOptions( + tree, + { + outputPath: 'dist/apps/myapp', + tsConfig: 'apps/myapp/tsconfig.json', + project: '', + main: 'src/lib/index.ts', + rollupConfig: 'apps/myapp/rollup.config.cjs', + watch: true, + format: ['esm', 'cjs'], + }, + {}, + 'apps/myapp' + ); + + // ASSERT + const configFile = tree.read('apps/myapp/rollup.config.cjs', 'utf-8'); + expect(configFile).toMatchInlineSnapshot(` + "const { withNx } = require('@nx/rollup/with-nx'); + + // These options were migrated by @nx/rollup:convert-to-inferred from project.json + const options = { + "outputPath": "../../dist/apps/myapp", + "tsConfig": "./tsconfig.json", + "project": "", + "main": "../../src/lib/index.ts", + "format": [ + "esm", + "cjs" + ] + }; + + let config = withNx(options, { + // Provide additional rollup configuration here. See: https://rollupjs.org/configuration-options + // e.g. + // output: { sourcemap: true }, + }); + + config = require('./rollup.migrated.config.cjs')(config, options); + + module.exports = config;" + `); + expect(tree.exists('apps/myapp/rollup.migrated.config.cjs')).toBeTruthy(); + expect(defaultValues).toMatchInlineSnapshot(` + { + "format": [ + "esm", + "cjs", + ], + "main": "../../src/lib/index.ts", + "outputPath": "../../dist/apps/myapp", + "project": "", + "tsConfig": "./tsconfig.json", + } + `); + }); + + it('should extract the options correctly (rollup.config.js)', () => { // ARRANGE const tree = createTreeWithEmptyWorkspace(); tree.write( @@ -27,7 +92,7 @@ describe('extract-rollup-config-from-executor-options', () => { ); // ASSERT - const configFile = tree.read('apps/myapp/rollup.config.js', 'utf-8'); + const configFile = tree.read('apps/myapp/rollup.config.cjs', 'utf-8'); expect(configFile).toMatchInlineSnapshot(` "const { withNx } = require('@nx/rollup/with-nx'); @@ -68,11 +133,11 @@ describe('extract-rollup-config-from-executor-options', () => { `); }); - it('should extract configurations that do not defined a rollupConfig into the rollup.config.js file', () => { + it('should extract configurations that do not defined a rollupConfig into the rollup.config.cjs file', () => { // ARRANGE const tree = createTreeWithEmptyWorkspace(); tree.write( - `apps/myapp/rollup.config.js`, + `apps/myapp/rollup.config.cjs`, `export default (config) => {return config;}` ); tree.write( @@ -87,7 +152,7 @@ describe('extract-rollup-config-from-executor-options', () => { tsConfig: 'apps/myapp/tsconfig.json', project: '', main: 'src/lib/index.ts', - rollupConfig: 'apps/myapp/rollup.config.js', + rollupConfig: 'apps/myapp/rollup.config.cjs', watch: true, format: ['esm', 'cjs'], }, @@ -100,7 +165,7 @@ describe('extract-rollup-config-from-executor-options', () => { ); // ASSERT - const configFile = tree.read('apps/myapp/rollup.config.js', 'utf-8'); + const configFile = tree.read('apps/myapp/rollup.config.cjs', 'utf-8'); expect(configFile).toMatchInlineSnapshot(` "const { withNx } = require('@nx/rollup/with-nx'); @@ -137,11 +202,11 @@ describe('extract-rollup-config-from-executor-options', () => { // output: { sourcemap: true }, }); - config = require('./rollup.migrated.config.js')(config, options); + config = require('./rollup.migrated.config.cjs')(config, options); module.exports = config;" `); - expect(tree.exists('apps/myapp/rollup.migrated.config.js')).toBeTruthy(); + expect(tree.exists('apps/myapp/rollup.migrated.config.cjs')).toBeTruthy(); expect(defaultValues).toMatchInlineSnapshot(` { "format": [ @@ -160,7 +225,7 @@ describe('extract-rollup-config-from-executor-options', () => { // ARRANGE const tree = createTreeWithEmptyWorkspace(); tree.write( - `apps/myapp/rollup.config.js`, + `apps/myapp/rollup.config.cjs`, `export default (config) => {return config;}` ); tree.write( @@ -175,7 +240,7 @@ describe('extract-rollup-config-from-executor-options', () => { tsConfig: 'apps/myapp/tsconfig.json', project: '', main: 'src/lib/index.ts', - rollupConfig: 'apps/myapp/rollup.config.js', + rollupConfig: 'apps/myapp/rollup.config.cjs', watch: true, format: ['esm', 'cjs'], }, diff --git a/packages/rollup/src/generators/convert-to-inferred/lib/extract-rollup-config-from-executor-options.ts b/packages/rollup/src/generators/convert-to-inferred/lib/extract-rollup-config-from-executor-options.ts index df9694f4630d8..b5e0bedaf5c5a 100644 --- a/packages/rollup/src/generators/convert-to-inferred/lib/extract-rollup-config-from-executor-options.ts +++ b/packages/rollup/src/generators/convert-to-inferred/lib/extract-rollup-config-from-executor-options.ts @@ -26,9 +26,16 @@ export function extractRollupConfigFromExecutorOptions( : []; delete options.rollupConfig; - // Resolve conflict with rollup.config.js if it exists. + // Resolve conflict with rollup.config.cjs or rollup.config.js if they exist. for (let i = 0; i < oldRollupConfig.length; i++) { const file = oldRollupConfig[i]; + if (file === './rollup.config.cjs') { + tree.rename( + joinPathFragments(projectRoot, 'rollup.config.cjs'), + joinPathFragments(projectRoot, `rollup.migrated.config.cjs`) + ); + oldRollupConfig.splice(i, 1, './rollup.migrated.config.cjs'); + } if (file === './rollup.config.js') { tree.rename( joinPathFragments(projectRoot, 'rollup.config.js'), @@ -116,7 +123,7 @@ export function extractRollupConfigFromExecutorOptions( } tree.write( - joinPathFragments(projectRoot, `rollup.config.js`), + joinPathFragments(projectRoot, `rollup.config.cjs`), createNewRollupConfig(oldRollupConfig, defaultOptions, configurationOptions) ); diff --git a/packages/rollup/src/plugins/__snapshots__/plugin.spec.ts.snap b/packages/rollup/src/plugins/__snapshots__/plugin.spec.ts.snap index f7d8977bb8fec..ea8eca5fb32ad 100644 --- a/packages/rollup/src/plugins/__snapshots__/plugin.spec.ts.snap +++ b/packages/rollup/src/plugins/__snapshots__/plugin.spec.ts.snap @@ -3,7 +3,7 @@ exports[`@nx/rollup/plugin non-root project should create nodes 1`] = ` [ [ - "mylib/rollup.config.js", + "mylib/rollup.config.cjs", { "projects": { "mylib": { @@ -11,7 +11,7 @@ exports[`@nx/rollup/plugin non-root project should create nodes 1`] = ` "targets": { "build": { "cache": true, - "command": "rollup -c rollup.config.js", + "command": "rollup -c rollup.config.cjs", "dependsOn": [ "^build", ], @@ -58,7 +58,7 @@ exports[`@nx/rollup/plugin non-root project should create nodes 1`] = ` exports[`@nx/rollup/plugin root project should create nodes 1`] = ` [ [ - "rollup.config.js", + "rollup.config.cjs", { "projects": { ".": { @@ -66,7 +66,7 @@ exports[`@nx/rollup/plugin root project should create nodes 1`] = ` "targets": { "build": { "cache": true, - "command": "rollup -c rollup.config.js", + "command": "rollup -c rollup.config.cjs", "dependsOn": [ "^build", ], diff --git a/packages/rollup/src/plugins/plugin.spec.ts b/packages/rollup/src/plugins/plugin.spec.ts index 67c7b6e8202ae..4c18f9c54bb50 100644 --- a/packages/rollup/src/plugins/plugin.spec.ts +++ b/packages/rollup/src/plugins/plugin.spec.ts @@ -51,7 +51,7 @@ describe('@nx/rollup/plugin', () => { // is that the hash is different after updating the // config file. The actual config read is mocked below. tempFs.createFileSync( - 'rollup.config.js', + 'rollup.config.cjs', JSON.stringify(rollupConfigOptions) ); tempFs.createFileSync('package.json', JSON.stringify({ name: 'mylib' })); @@ -77,7 +77,7 @@ describe('@nx/rollup/plugin', () => { it('should create nodes', async () => { // ACT const nodes = await createNodesFunction( - ['rollup.config.js'], + ['rollup.config.cjs'], { buildTargetName: 'build', }, @@ -125,7 +125,7 @@ describe('@nx/rollup/plugin', () => { // is that the hash is different after updating the // config file. The actual config read is mocked below. tempFs.createFileSync( - 'mylib/rollup.config.js', + 'mylib/rollup.config.cjs', JSON.stringify(rollupConfigOptions) ); tempFs.createFileSync( @@ -154,7 +154,7 @@ describe('@nx/rollup/plugin', () => { it('should create nodes', async () => { // ACT const nodes = await createNodesFunction( - ['mylib/rollup.config.js'], + ['mylib/rollup.config.cjs'], { buildTargetName: 'build', }, From 7157e7a07c7390c4955a975b1dc00185f71f4300 Mon Sep 17 00:00:00 2001 From: Colum Ferry Date: Wed, 4 Dec 2024 18:05:49 +0000 Subject: [PATCH 08/21] fix(rspack): align @rspack/core versions (#29199) Align rspack versions amongst packages and update useLegacyNxPlugin helper to match new API changes --- package.json | 2 +- packages/module-federation/package.json | 2 +- packages/rspack/migrations.json | 4 +- packages/rspack/package.json | 2 +- .../use-legacy-nx-plugin.ts | 12 +- packages/rspack/src/utils/versions.ts | 2 +- pnpm-lock.yaml | 180 +++++++++--------- 7 files changed, 104 insertions(+), 100 deletions(-) diff --git a/package.json b/package.json index 3a4514959abf0..afc144365e3b0 100644 --- a/package.json +++ b/package.json @@ -101,7 +101,7 @@ "@rollup/plugin-json": "^6.1.0", "@rollup/plugin-node-resolve": "^15.2.3", "@rollup/plugin-url": "^8.0.2", - "@rspack/core": "1.1.3", + "@rspack/core": "^1.1.5", "@rspack/dev-server": "1.0.9", "@rspack/plugin-minify": "^0.7.5", "@rspack/plugin-react-refresh": "^1.0.0", diff --git a/packages/module-federation/package.json b/packages/module-federation/package.json index 21da73e961858..f28d6d563fe26 100644 --- a/packages/module-federation/package.json +++ b/packages/module-federation/package.json @@ -30,7 +30,7 @@ "@nx/web": "file:../web", "picocolors": "^1.1.0", "webpack": "5.88.0", - "@rspack/core": "1.1.3", + "@rspack/core": "^1.1.5", "@module-federation/enhanced": "0.7.6", "@module-federation/node": "2.6.11", "@module-federation/sdk": "0.7.6", diff --git a/packages/rspack/migrations.json b/packages/rspack/migrations.json index 8ceeacad5cbb5..f519d2c3b6d9b 100644 --- a/packages/rspack/migrations.json +++ b/packages/rspack/migrations.json @@ -77,10 +77,10 @@ } }, "20.2.0": { - "version": "20.2.0-beta.3", + "version": "20.2.0-beta.7", "packages": { "@rspack/core": { - "version": "^1.1.2", + "version": "^1.1.5", "alwaysAddToPackageJson": false }, "@rspack/dev-server": { diff --git a/packages/rspack/package.json b/packages/rspack/package.json index 5893615706a16..62c9dcdd74d1e 100644 --- a/packages/rspack/package.json +++ b/packages/rspack/package.json @@ -29,7 +29,7 @@ "@nx/web": "file:../web", "@nx/module-federation": "file:../module-federation", "@phenomnomnominal/tsquery": "~5.0.1", - "@rspack/core": "^1.1.2", + "@rspack/core": "^1.1.5", "@rspack/dev-server": "^1.0.9", "@rspack/plugin-react-refresh": "^1.0.0", "autoprefixer": "^10.4.9", diff --git a/packages/rspack/src/plugins/use-legacy-nx-plugin/use-legacy-nx-plugin.ts b/packages/rspack/src/plugins/use-legacy-nx-plugin/use-legacy-nx-plugin.ts index 53a055cb0c3f2..9291c29f4b7c1 100644 --- a/packages/rspack/src/plugins/use-legacy-nx-plugin/use-legacy-nx-plugin.ts +++ b/packages/rspack/src/plugins/use-legacy-nx-plugin/use-legacy-nx-plugin.ts @@ -6,7 +6,11 @@ import { } from '@nx/devkit'; import type { NxRspackExecutionContext } from '../../utils/config'; import type { NxAppRspackPluginOptions } from '../utils/models'; -import type { Compiler, Configuration } from '@rspack/core'; +import type { + Compiler, + Configuration, + RspackOptionsNormalized, +} from '@rspack/core'; import { normalizeOptions } from '../utils/plugins/normalize-options'; import { readNxJson } from 'nx/src/config/configuration'; @@ -37,9 +41,9 @@ import { readNxJson } from 'nx/src/config/configuration'; */ export async function useLegacyNxPlugin( fn: ( - config: Configuration, + config: RspackOptionsNormalized, ctx: NxRspackExecutionContext - ) => Promise, + ) => Promise, executorOptions: NxAppRspackPluginOptions ) { if (global.NX_GRAPH_CREATION) { @@ -75,7 +79,7 @@ export async function useLegacyNxPlugin( apply(compiler: Compiler) { compiler.hooks.beforeCompile.tapPromise('NxLegacyAsyncPlugin', () => { return new Promise((resolve) => { - fn(compiler.options as Configuration, ctx).then((updated) => { + fn(compiler.options, ctx).then((updated) => { // Merge options back shallowly since it's a fully functional configuration. // Most likely, the user modified the config in place, but this guarantees that updates are applied if users did something like: // `return { ...config, plugins: [...config.plugins, new MyPlugin()] }` diff --git a/packages/rspack/src/utils/versions.ts b/packages/rspack/src/utils/versions.ts index afe4d2eca86e4..fae45debec1a8 100644 --- a/packages/rspack/src/utils/versions.ts +++ b/packages/rspack/src/utils/versions.ts @@ -1,5 +1,5 @@ export const nxVersion = require('../../package.json').version; -export const rspackCoreVersion = '1.1.2'; +export const rspackCoreVersion = '^1.1.5'; export const rspackDevServerVersion = '1.0.9'; export const rspackPluginMinifyVersion = '^0.7.5'; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ce85627bcb820..ff6a0fca85766 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -174,7 +174,7 @@ importers: version: 0.1900.2(chokidar@3.6.0) '@angular-devkit/build-angular': specifier: ~19.0.0 - version: 19.0.2(j4mvxd56inyzanlxbgqutwwsei) + version: 19.0.2(vsrtc4j5b2tjebunq4fmj5q5sy) '@angular-devkit/core': specifier: ~19.0.0 version: 19.0.2(chokidar@3.6.0) @@ -297,7 +297,7 @@ importers: version: 3.13.2(rollup@4.22.0)(webpack-sources@3.2.3) '@nx/angular': specifier: 20.2.0-beta.3 - version: 20.2.0-beta.3(zscmxqgajku7lzsb7vlxsdlsui) + version: 20.2.0-beta.3(dtud7qphu6hdicss76tjbn32se) '@nx/cypress': specifier: 20.2.0-beta.3 version: 20.2.0-beta.3(@babel/traverse@7.25.9)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(@zkochan/js-yaml@0.0.7)(cypress@13.13.0)(eslint@8.57.0)(nx@20.2.0-beta.3(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(typescript@5.6.3)(verdaccio@5.32.2(encoding@0.1.13)(typanion@3.14.0)) @@ -321,10 +321,10 @@ importers: version: 20.2.0-beta.3(@babel/traverse@7.25.9)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(nx@20.2.0-beta.3(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(typescript@5.6.3)(verdaccio@5.32.2(encoding@0.1.13)(typanion@3.14.0)) '@nx/next': specifier: 20.2.0-beta.3 - version: 20.2.0-beta.3(@babel/core@7.25.2)(@babel/traverse@7.25.9)(@rspack/core@1.1.3(@swc/helpers@0.5.11))(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/helpers@0.5.11)(@types/node@20.16.10)(@zkochan/js-yaml@0.0.7)(esbuild@0.19.5)(eslint@8.57.0)(html-webpack-plugin@5.5.0(webpack@5.88.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.19.5)(webpack-cli@5.1.4)))(next@14.2.16(@babel/core@7.25.2)(@playwright/test@1.47.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.55.0))(nx@20.2.0-beta.3(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)(verdaccio@5.32.2(encoding@0.1.13)(typanion@3.14.0))(webpack-cli@5.1.4(webpack-dev-server@5.0.4)(webpack@5.88.0))(webpack@5.88.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.19.5)(webpack-cli@5.1.4)) + version: 20.2.0-beta.3(@babel/core@7.25.2)(@babel/traverse@7.25.9)(@rspack/core@1.1.5(@swc/helpers@0.5.11))(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/helpers@0.5.11)(@types/node@20.16.10)(@zkochan/js-yaml@0.0.7)(esbuild@0.19.5)(eslint@8.57.0)(html-webpack-plugin@5.5.0(webpack@5.88.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.19.5)(webpack-cli@5.1.4)))(next@14.2.16(@babel/core@7.25.2)(@playwright/test@1.47.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.55.0))(nx@20.2.0-beta.3(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)(verdaccio@5.32.2(encoding@0.1.13)(typanion@3.14.0))(webpack-cli@5.1.4(webpack-dev-server@5.0.4)(webpack@5.88.0))(webpack@5.88.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.19.5)(webpack-cli@5.1.4)) '@nx/playwright': specifier: 20.2.0-beta.3 - version: 20.2.0-beta.3(@babel/traverse@7.25.9)(@playwright/test@1.47.1)(@rspack/core@1.1.3(@swc/helpers@0.5.11))(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(@zkochan/js-yaml@0.0.7)(esbuild@0.19.5)(eslint@8.57.0)(html-webpack-plugin@5.5.0(webpack@5.88.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.19.5)(webpack-cli@5.1.4)))(nx@20.2.0-beta.3(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(typescript@5.6.3)(verdaccio@5.32.2(encoding@0.1.13)(typanion@3.14.0))(vite@5.0.8(@types/node@20.16.10)(less@4.1.3)(sass@1.55.0)(stylus@0.64.0)(terser@5.36.0))(vitest@1.3.1(@types/node@20.16.10)(jsdom@20.0.3)(less@4.1.3)(sass@1.55.0)(stylus@0.64.0)(terser@5.36.0))(webpack-cli@5.1.4(webpack-dev-server@5.0.4)(webpack@5.88.0)) + version: 20.2.0-beta.3(@babel/traverse@7.25.9)(@playwright/test@1.47.1)(@rspack/core@1.1.5(@swc/helpers@0.5.11))(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(@zkochan/js-yaml@0.0.7)(esbuild@0.19.5)(eslint@8.57.0)(html-webpack-plugin@5.5.0(webpack@5.88.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.19.5)(webpack-cli@5.1.4)))(nx@20.2.0-beta.3(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(typescript@5.6.3)(verdaccio@5.32.2(encoding@0.1.13)(typanion@3.14.0))(vite@5.0.8(@types/node@20.16.10)(less@4.1.3)(sass@1.55.0)(stylus@0.64.0)(terser@5.36.0))(vitest@1.3.1(@types/node@20.16.10)(jsdom@20.0.3)(less@4.1.3)(sass@1.55.0)(stylus@0.64.0)(terser@5.36.0))(webpack-cli@5.1.4(webpack-dev-server@5.0.4)(webpack@5.88.0)) '@nx/powerpack-conformance': specifier: 1.1.0-beta.6 version: 1.1.0-beta.6(@babel/traverse@7.25.9)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(nx@20.2.0-beta.3(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(typescript@5.6.3)(verdaccio@5.32.2(encoding@0.1.13)(typanion@3.14.0)) @@ -351,7 +351,7 @@ importers: version: 20.2.0-beta.3(@babel/traverse@7.25.9)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(nx@20.2.0-beta.3(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(typescript@5.6.3)(verdaccio@5.32.2(encoding@0.1.13)(typanion@3.14.0)) '@nx/webpack': specifier: 20.2.0-beta.3 - version: 20.2.0-beta.3(@babel/traverse@7.25.9)(@rspack/core@1.1.3(@swc/helpers@0.5.11))(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(esbuild@0.19.5)(html-webpack-plugin@5.5.0(webpack@5.88.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.19.5)(webpack-cli@5.1.4)))(nx@20.2.0-beta.3(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(typescript@5.6.3)(verdaccio@5.32.2(encoding@0.1.13)(typanion@3.14.0))(webpack-cli@5.1.4(webpack-dev-server@5.0.4)(webpack@5.88.0)) + version: 20.2.0-beta.3(@babel/traverse@7.25.9)(@rspack/core@1.1.5(@swc/helpers@0.5.11))(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(esbuild@0.19.5)(html-webpack-plugin@5.5.0(webpack@5.88.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.19.5)(webpack-cli@5.1.4)))(nx@20.2.0-beta.3(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(typescript@5.6.3)(verdaccio@5.32.2(encoding@0.1.13)(typanion@3.14.0))(webpack-cli@5.1.4(webpack-dev-server@5.0.4)(webpack@5.88.0)) '@phenomnomnominal/tsquery': specifier: ~5.0.1 version: 5.0.1(typescript@5.6.3) @@ -392,11 +392,11 @@ importers: specifier: ^8.0.2 version: 8.0.2(rollup@4.22.0) '@rspack/core': - specifier: 1.1.3 - version: 1.1.3(@swc/helpers@0.5.11) + specifier: ^1.1.5 + version: 1.1.5(@swc/helpers@0.5.11) '@rspack/dev-server': specifier: 1.0.9 - version: 1.0.9(@rspack/core@1.1.3(@swc/helpers@0.5.11))(@types/express@4.17.14)(webpack-cli@5.1.4(webpack-dev-server@5.0.4)(webpack@5.88.0))(webpack@5.88.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.19.5)(webpack-cli@5.1.4)) + version: 1.0.9(@rspack/core@1.1.5(@swc/helpers@0.5.11))(@types/express@4.17.14)(webpack-cli@5.1.4(webpack-dev-server@5.0.4)(webpack@5.88.0))(webpack@5.88.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.19.5)(webpack-cli@5.1.4)) '@rspack/plugin-minify': specifier: ^0.7.5 version: 0.7.5 @@ -423,7 +423,7 @@ importers: version: 8.4.6(@storybook/test@8.4.6(storybook@8.4.6(prettier@2.8.8)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rollup@4.22.0)(storybook@8.4.6(prettier@2.8.8))(typescript@5.6.3)(vite@5.0.8(@types/node@20.16.10)(less@4.1.3)(sass@1.55.0)(stylus@0.64.0)(terser@5.36.0))(webpack-sources@3.2.3) '@storybook/react-webpack5': specifier: ^8.4.6 - version: 8.4.6(@rspack/core@1.1.3(@swc/helpers@0.5.11))(@storybook/test@8.4.6(storybook@8.4.6(prettier@2.8.8)))(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.19.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.4.6(prettier@2.8.8))(typescript@5.6.3)(webpack-cli@5.1.4(webpack-dev-server@5.0.4)(webpack@5.88.0)) + version: 8.4.6(@rspack/core@1.1.5(@swc/helpers@0.5.11))(@storybook/test@8.4.6(storybook@8.4.6(prettier@2.8.8)))(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.19.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.4.6(prettier@2.8.8))(typescript@5.6.3)(webpack-cli@5.1.4(webpack-dev-server@5.0.4)(webpack@5.88.0)) '@storybook/types': specifier: ^8.4.6 version: 8.4.6(storybook@8.4.6(prettier@2.8.8)) @@ -6199,8 +6199,8 @@ packages: cpu: [arm64] os: [darwin] - '@rspack/binding-darwin-arm64@1.1.3': - resolution: {integrity: sha512-gpLUBMDAS/uEcnE+ODy1ILTeyp1oM4QCq8rRhKHuOfsIe1AZ9Mct59v2omIE/r+R4dnbJ0ikIpto9qJZ6P2u1A==} + '@rspack/binding-darwin-arm64@1.1.5': + resolution: {integrity: sha512-eEynmyPPl+OGYQ9LRFwiQosyRfcca3OQB73akqY4mqDRl39OyiBjq7347DLHJysgbm9z+B1bsiLuh2xc6mdclQ==} cpu: [arm64] os: [darwin] @@ -6209,8 +6209,8 @@ packages: cpu: [x64] os: [darwin] - '@rspack/binding-darwin-x64@1.1.3': - resolution: {integrity: sha512-m1G7SzkRfr1oLgghbAxUwj1J7hSKhtskQZiVeqe5tewKimFr6xLpKSTLTnEtlW0gdGNf1+dRMX/4kLMwhOdY7g==} + '@rspack/binding-darwin-x64@1.1.5': + resolution: {integrity: sha512-I6HPRgogewU5v1OKe3noEzq2U1FCEYAbW+smy+lPvpTW+3X6PlVMzTT4oelhB0EXDQ+KxjXH9KpOKON1hg/JGg==} cpu: [x64] os: [darwin] @@ -6219,8 +6219,8 @@ packages: cpu: [arm64] os: [linux] - '@rspack/binding-linux-arm64-gnu@1.1.3': - resolution: {integrity: sha512-MpOrO1oppxAm8J1ztNz6G5DG/oL9ZLHmIz9vYNV6PKnk+MPhCXqfhFmQ2hZm5VIVKuOobfYEJiDUqKg2MLg8gA==} + '@rspack/binding-linux-arm64-gnu@1.1.5': + resolution: {integrity: sha512-LQnqucNa6Dr6y3By+/M2ARO4jDR3AM+PuCsHgzlYT0RDRLS+Ow3f50WbNBf7eI/DhrEA0aucYL3sz1ljguB3EA==} cpu: [arm64] os: [linux] @@ -6229,8 +6229,8 @@ packages: cpu: [arm64] os: [linux] - '@rspack/binding-linux-arm64-musl@1.1.3': - resolution: {integrity: sha512-PnUDC1JxT6a5hJW0hhJ9ubWk3R+nk7eLXyNaORHyQH4k8o89Zm5GYoKnDgO4eRy41NB9/aBJQJRGSRn0iAsZgw==} + '@rspack/binding-linux-arm64-musl@1.1.5': + resolution: {integrity: sha512-b9L/9HJxrWY4cezPWqgj28I9Xe2XxwLHu8x0CMGobwF2XKR0QQVLAst38RW/EusJ8TURdyvNEOuRZlWEIJuYOw==} cpu: [arm64] os: [linux] @@ -6239,8 +6239,8 @@ packages: cpu: [x64] os: [linux] - '@rspack/binding-linux-x64-gnu@1.1.3': - resolution: {integrity: sha512-+6JgyKXOp2QrHzlru95mge70tDkYlaY4NNE9xyrdj6PgTnM9cVPx4sLVhHC9+tWXaTFnccfEe9Tt6LjKnjHGaA==} + '@rspack/binding-linux-x64-gnu@1.1.5': + resolution: {integrity: sha512-0az52ZXTg/ErCGC1v/oFLWByKAiXvng4euv+prwMWF6p1pA7lfLRLzdibDFO4KgC16Zlfcg3hqs7YikLng4x+w==} cpu: [x64] os: [linux] @@ -6249,8 +6249,8 @@ packages: cpu: [x64] os: [linux] - '@rspack/binding-linux-x64-musl@1.1.3': - resolution: {integrity: sha512-X0TJTVL1Roqq/tvN26QO4u62x2xp5tE0dlhwhbeCHrBdgBzc+PHvcv/8lclRcq6lDPzceAgcnNX/+RbWg0DzKg==} + '@rspack/binding-linux-x64-musl@1.1.5': + resolution: {integrity: sha512-EF/LJTtCTkuti2gJnCyvXHC5Q2L5M4+RXm5kj9Bfu/t0Zmmfe6Jd5QUsifgogioeL0ZsH/Pou5QiiVcOFcqFKQ==} cpu: [x64] os: [linux] @@ -6259,8 +6259,8 @@ packages: cpu: [arm64] os: [win32] - '@rspack/binding-win32-arm64-msvc@1.1.3': - resolution: {integrity: sha512-Lvpp5Q30YiPNkuOFPawp2al2CTWElPeG3X0E9LFIfPdVkLc/e2nkf5a6zSYtnbD2oaskzQIYN/k27fWqWWcVHA==} + '@rspack/binding-win32-arm64-msvc@1.1.5': + resolution: {integrity: sha512-VEqhK6HwIHby6gtOkxIx66SkqYndiaP1ddZ3X39RLE40TY3KlNgfG/SzbN9J5Qb+8jjq3ogV8n50+wLEGkhiWw==} cpu: [arm64] os: [win32] @@ -6269,8 +6269,8 @@ packages: cpu: [ia32] os: [win32] - '@rspack/binding-win32-ia32-msvc@1.1.3': - resolution: {integrity: sha512-tC+xXcbTRX7l+NFnlGK8UhDIJrKma7S/MA1KDol23/I3Vw67EcaHDwG+q2v7uiJsxn9XooIOSCJhPKmUUfZNXg==} + '@rspack/binding-win32-ia32-msvc@1.1.5': + resolution: {integrity: sha512-Yi2BwYehc5/sRVgI7zTGYJKjnV8UszAJt/stWdFHaq82chHiuuF/tQd1WcBUq0Iin9ylBMo16mRJAuFkFmJ74Q==} cpu: [ia32] os: [win32] @@ -6279,16 +6279,16 @@ packages: cpu: [x64] os: [win32] - '@rspack/binding-win32-x64-msvc@1.1.3': - resolution: {integrity: sha512-jeRaPJtsD/+m1QINgoDMA6D3kOcTwSHVmGSxR6fznLA5BKa76m8lewuALYxHHq9/qcgwJ4e6UtiwrO2JL3vxVQ==} + '@rspack/binding-win32-x64-msvc@1.1.5': + resolution: {integrity: sha512-4UArXYqJO1Ni7TmCw1T11JnrwfpoThDdiQ9k1P1voBWK3bDahPEBOptk9ZPu2+ZuRX8hFrvumRKkLY3oy7fTMw==} cpu: [x64] os: [win32] '@rspack/binding@1.1.2': resolution: {integrity: sha512-HUE7EPvrgbabbhW635wSrthidZY1Kijk6+rvmTFuxzmxsBtZNcrhUFVw7Z1fwa2fykiOhbot61EDV9X1qoIa4g==} - '@rspack/binding@1.1.3': - resolution: {integrity: sha512-fB1ziJ1UXO2P4ZDO+dviSNuxknUqrz6QQ6QGfpC+S1ClUy1HOhHXss/Yn78B/R9py6dlqZzmhmhz2d+XzFVApA==} + '@rspack/binding@1.1.5': + resolution: {integrity: sha512-RsSkgi56Q5XUXut0qweLSE1C4Ogcm7g/ueKoOgsbHAYVKrCs9/dTFlPHWSIAaI7QWh0GWEePR/MM2O2HIu+1rw==} '@rspack/core@1.1.2': resolution: {integrity: sha512-cXYPImNpHl2nZmWcMv7WHsorkOaIZP9csPc2J8WxEJhOEotcgP33TKmRTAfJYszV4cqUuKbVjLMv0WgX1OeftQ==} @@ -6299,8 +6299,8 @@ packages: '@swc/helpers': optional: true - '@rspack/core@1.1.3': - resolution: {integrity: sha512-LdM1mAlBtEh9ozbpyWVW5uuL+aJMjYqd531pH5/i/EPDKNrOLrQWVNMa2dh07qLwJZXoTFMf7LWA7QNsmBUPJg==} + '@rspack/core@1.1.5': + resolution: {integrity: sha512-/FmxDeMuW8fJkhz8fHuCu7OiJHFKW78xclEu7LkEujWl4PqJgdWjUL/6FWIj50spRwj6PRfuc31hFSL4hbNfCA==} engines: {node: '>=16.0.0'} peerDependencies: '@swc/helpers': '>=0.5.1' @@ -17815,7 +17815,7 @@ snapshots: transitivePeerDependencies: - chokidar - '@angular-devkit/build-angular@19.0.2(j4mvxd56inyzanlxbgqutwwsei)': + '@angular-devkit/build-angular@19.0.2(vsrtc4j5b2tjebunq4fmj5q5sy)': dependencies: '@ampproject/remapping': 2.3.0 '@angular-devkit/architect': 0.1900.2(chokidar@3.6.0) @@ -17840,7 +17840,7 @@ snapshots: babel-loader: 9.2.1(@babel/core@7.26.0)(webpack@5.96.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.24.0)(webpack-cli@5.1.4(webpack-dev-server@5.0.4)(webpack@5.88.0))) browserslist: 4.23.3 copy-webpack-plugin: 12.0.2(webpack@5.96.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.24.0)(webpack-cli@5.1.4(webpack-dev-server@5.0.4)(webpack@5.88.0))) - css-loader: 7.1.2(@rspack/core@1.1.3(@swc/helpers@0.5.11))(webpack@5.96.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.24.0)(webpack-cli@5.1.4(webpack-dev-server@5.0.4)(webpack@5.88.0))) + css-loader: 7.1.2(@rspack/core@1.1.5(@swc/helpers@0.5.11))(webpack@5.96.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.24.0)(webpack-cli@5.1.4(webpack-dev-server@5.0.4)(webpack@5.88.0))) esbuild-wasm: 0.24.0 fast-glob: 3.3.2 http-proxy-middleware: 3.0.3 @@ -17848,7 +17848,7 @@ snapshots: jsonc-parser: 3.3.1 karma-source-map-support: 1.4.0 less: 4.2.0 - less-loader: 12.2.0(@rspack/core@1.1.3(@swc/helpers@0.5.11))(less@4.2.0)(webpack@5.96.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.24.0)(webpack-cli@5.1.4(webpack-dev-server@5.0.4)(webpack@5.88.0))) + less-loader: 12.2.0(@rspack/core@1.1.5(@swc/helpers@0.5.11))(less@4.2.0)(webpack@5.96.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.24.0)(webpack-cli@5.1.4(webpack-dev-server@5.0.4)(webpack@5.88.0))) license-webpack-plugin: 4.0.2(webpack@5.96.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.24.0)(webpack-cli@5.1.4(webpack-dev-server@5.0.4)(webpack@5.88.0))) loader-utils: 3.3.1 mini-css-extract-plugin: 2.9.2(webpack@5.96.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.24.0)(webpack-cli@5.1.4(webpack-dev-server@5.0.4)(webpack@5.88.0))) @@ -17857,11 +17857,11 @@ snapshots: picomatch: 4.0.2 piscina: 4.7.0 postcss: 8.4.49 - postcss-loader: 8.1.1(@rspack/core@1.1.3(@swc/helpers@0.5.11))(postcss@8.4.49)(typescript@5.6.3)(webpack@5.96.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.24.0)(webpack-cli@5.1.4(webpack-dev-server@5.0.4)(webpack@5.88.0))) + postcss-loader: 8.1.1(@rspack/core@1.1.5(@swc/helpers@0.5.11))(postcss@8.4.49)(typescript@5.6.3)(webpack@5.96.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.24.0)(webpack-cli@5.1.4(webpack-dev-server@5.0.4)(webpack@5.88.0))) resolve-url-loader: 5.0.0 rxjs: 7.8.1 sass: 1.80.7 - sass-loader: 16.0.3(@rspack/core@1.1.3(@swc/helpers@0.5.11))(sass@1.80.7)(webpack@5.96.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.24.0)(webpack-cli@5.1.4(webpack-dev-server@5.0.4)(webpack@5.88.0))) + sass-loader: 16.0.3(@rspack/core@1.1.5(@swc/helpers@0.5.11))(sass@1.80.7)(webpack@5.96.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.24.0)(webpack-cli@5.1.4(webpack-dev-server@5.0.4)(webpack@5.88.0))) semver: 7.6.3 source-map-loader: 5.0.0(webpack@5.96.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.24.0)(webpack-cli@5.1.4(webpack-dev-server@5.0.4)(webpack@5.88.0))) source-map-support: 0.5.21 @@ -22111,9 +22111,9 @@ snapshots: transitivePeerDependencies: - encoding - '@nx/angular@20.2.0-beta.3(zscmxqgajku7lzsb7vlxsdlsui)': + '@nx/angular@20.2.0-beta.3(dtud7qphu6hdicss76tjbn32se)': dependencies: - '@angular-devkit/build-angular': 19.0.2(j4mvxd56inyzanlxbgqutwwsei) + '@angular-devkit/build-angular': 19.0.2(vsrtc4j5b2tjebunq4fmj5q5sy) '@angular-devkit/core': 19.0.2(chokidar@3.6.0) '@angular-devkit/schematics': 19.0.2(chokidar@3.6.0) '@nx/devkit': 20.2.0-beta.3(nx@20.2.0-beta.3(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))) @@ -22121,7 +22121,7 @@ snapshots: '@nx/js': 20.2.0-beta.3(@babel/traverse@7.25.9)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(nx@20.2.0-beta.3(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(typescript@5.6.3)(verdaccio@5.32.2(encoding@0.1.13)(typanion@3.14.0)) '@nx/module-federation': 20.2.0-beta.3(@babel/traverse@7.25.9)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/helpers@0.5.11)(@types/node@20.16.10)(esbuild@0.19.5)(next@14.2.16(@babel/core@7.25.2)(@playwright/test@1.47.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.55.0))(nx@20.2.0-beta.3(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)(verdaccio@5.32.2(encoding@0.1.13)(typanion@3.14.0))(webpack-cli@5.1.4(webpack-dev-server@5.0.4)(webpack@5.88.0)) '@nx/web': 20.2.0-beta.3(@babel/traverse@7.25.9)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(nx@20.2.0-beta.3(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(typescript@5.6.3)(verdaccio@5.32.2(encoding@0.1.13)(typanion@3.14.0)) - '@nx/webpack': 20.2.0-beta.3(@babel/traverse@7.25.9)(@rspack/core@1.1.3(@swc/helpers@0.5.11))(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(esbuild@0.19.5)(html-webpack-plugin@5.5.0(webpack@5.88.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.19.5)(webpack-cli@5.1.4)))(nx@20.2.0-beta.3(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(typescript@5.6.3)(verdaccio@5.32.2(encoding@0.1.13)(typanion@3.14.0))(webpack-cli@5.1.4(webpack-dev-server@5.0.4)(webpack@5.88.0)) + '@nx/webpack': 20.2.0-beta.3(@babel/traverse@7.25.9)(@rspack/core@1.1.5(@swc/helpers@0.5.11))(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(esbuild@0.19.5)(html-webpack-plugin@5.5.0(webpack@5.88.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.19.5)(webpack-cli@5.1.4)))(nx@20.2.0-beta.3(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(typescript@5.6.3)(verdaccio@5.32.2(encoding@0.1.13)(typanion@3.14.0))(webpack-cli@5.1.4(webpack-dev-server@5.0.4)(webpack@5.88.0)) '@nx/workspace': 20.2.0-beta.3(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)) '@phenomnomnominal/tsquery': 5.0.1(typescript@5.6.3) '@schematics/angular': 19.0.2(chokidar@3.6.0) @@ -22532,7 +22532,7 @@ snapshots: - vue-tsc - webpack-cli - '@nx/next@20.2.0-beta.3(@babel/core@7.25.2)(@babel/traverse@7.25.9)(@rspack/core@1.1.3(@swc/helpers@0.5.11))(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/helpers@0.5.11)(@types/node@20.16.10)(@zkochan/js-yaml@0.0.7)(esbuild@0.19.5)(eslint@8.57.0)(html-webpack-plugin@5.5.0(webpack@5.88.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.19.5)(webpack-cli@5.1.4)))(next@14.2.16(@babel/core@7.25.2)(@playwright/test@1.47.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.55.0))(nx@20.2.0-beta.3(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)(verdaccio@5.32.2(encoding@0.1.13)(typanion@3.14.0))(webpack-cli@5.1.4(webpack-dev-server@5.0.4)(webpack@5.88.0))(webpack@5.88.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.19.5)(webpack-cli@5.1.4))': + '@nx/next@20.2.0-beta.3(@babel/core@7.25.2)(@babel/traverse@7.25.9)(@rspack/core@1.1.5(@swc/helpers@0.5.11))(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/helpers@0.5.11)(@types/node@20.16.10)(@zkochan/js-yaml@0.0.7)(esbuild@0.19.5)(eslint@8.57.0)(html-webpack-plugin@5.5.0(webpack@5.88.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.19.5)(webpack-cli@5.1.4)))(next@14.2.16(@babel/core@7.25.2)(@playwright/test@1.47.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.55.0))(nx@20.2.0-beta.3(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)(verdaccio@5.32.2(encoding@0.1.13)(typanion@3.14.0))(webpack-cli@5.1.4(webpack-dev-server@5.0.4)(webpack@5.88.0))(webpack@5.88.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.19.5)(webpack-cli@5.1.4))': dependencies: '@babel/plugin-proposal-decorators': 7.24.7(@babel/core@7.25.2) '@nx/devkit': 20.2.0-beta.3(nx@20.2.0-beta.3(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))) @@ -22540,7 +22540,7 @@ snapshots: '@nx/js': 20.2.0-beta.3(@babel/traverse@7.25.9)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(nx@20.2.0-beta.3(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(typescript@5.6.3)(verdaccio@5.32.2(encoding@0.1.13)(typanion@3.14.0)) '@nx/react': 20.2.0-beta.3(@babel/traverse@7.25.9)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/helpers@0.5.11)(@types/node@20.16.10)(@zkochan/js-yaml@0.0.7)(esbuild@0.19.5)(eslint@8.57.0)(next@14.2.16(@babel/core@7.25.2)(@playwright/test@1.47.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.55.0))(nx@20.2.0-beta.3(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)(verdaccio@5.32.2(encoding@0.1.13)(typanion@3.14.0))(webpack-cli@5.1.4(webpack-dev-server@5.0.4)(webpack@5.88.0))(webpack@5.88.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.19.5)(webpack-cli@5.1.4)) '@nx/web': 20.2.0-beta.3(@babel/traverse@7.25.9)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(nx@20.2.0-beta.3(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(typescript@5.6.3)(verdaccio@5.32.2(encoding@0.1.13)(typanion@3.14.0)) - '@nx/webpack': 20.2.0-beta.3(@babel/traverse@7.25.9)(@rspack/core@1.1.3(@swc/helpers@0.5.11))(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(esbuild@0.19.5)(html-webpack-plugin@5.5.0(webpack@5.88.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.19.5)(webpack-cli@5.1.4)))(nx@20.2.0-beta.3(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(typescript@5.6.3)(verdaccio@5.32.2(encoding@0.1.13)(typanion@3.14.0))(webpack-cli@5.1.4(webpack-dev-server@5.0.4)(webpack@5.88.0)) + '@nx/webpack': 20.2.0-beta.3(@babel/traverse@7.25.9)(@rspack/core@1.1.5(@swc/helpers@0.5.11))(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(esbuild@0.19.5)(html-webpack-plugin@5.5.0(webpack@5.88.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.19.5)(webpack-cli@5.1.4)))(nx@20.2.0-beta.3(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(typescript@5.6.3)(verdaccio@5.32.2(encoding@0.1.13)(typanion@3.14.0))(webpack-cli@5.1.4(webpack-dev-server@5.0.4)(webpack@5.88.0)) '@phenomnomnominal/tsquery': 5.0.1(typescript@5.6.3) '@svgr/webpack': 8.1.0(typescript@5.6.3) copy-webpack-plugin: 10.2.4(webpack@5.88.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.19.5)(webpack-cli@5.1.4)) @@ -22646,13 +22646,13 @@ snapshots: '@nx/nx-win32-x64-msvc@20.2.0-beta.3': optional: true - '@nx/playwright@20.2.0-beta.3(@babel/traverse@7.25.9)(@playwright/test@1.47.1)(@rspack/core@1.1.3(@swc/helpers@0.5.11))(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(@zkochan/js-yaml@0.0.7)(esbuild@0.19.5)(eslint@8.57.0)(html-webpack-plugin@5.5.0(webpack@5.88.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.19.5)(webpack-cli@5.1.4)))(nx@20.2.0-beta.3(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(typescript@5.6.3)(verdaccio@5.32.2(encoding@0.1.13)(typanion@3.14.0))(vite@5.0.8(@types/node@20.16.10)(less@4.1.3)(sass@1.55.0)(stylus@0.64.0)(terser@5.36.0))(vitest@1.3.1(@types/node@20.16.10)(jsdom@20.0.3)(less@4.1.3)(sass@1.55.0)(stylus@0.64.0)(terser@5.36.0))(webpack-cli@5.1.4(webpack-dev-server@5.0.4)(webpack@5.88.0))': + '@nx/playwright@20.2.0-beta.3(@babel/traverse@7.25.9)(@playwright/test@1.47.1)(@rspack/core@1.1.5(@swc/helpers@0.5.11))(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(@zkochan/js-yaml@0.0.7)(esbuild@0.19.5)(eslint@8.57.0)(html-webpack-plugin@5.5.0(webpack@5.88.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.19.5)(webpack-cli@5.1.4)))(nx@20.2.0-beta.3(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(typescript@5.6.3)(verdaccio@5.32.2(encoding@0.1.13)(typanion@3.14.0))(vite@5.0.8(@types/node@20.16.10)(less@4.1.3)(sass@1.55.0)(stylus@0.64.0)(terser@5.36.0))(vitest@1.3.1(@types/node@20.16.10)(jsdom@20.0.3)(less@4.1.3)(sass@1.55.0)(stylus@0.64.0)(terser@5.36.0))(webpack-cli@5.1.4(webpack-dev-server@5.0.4)(webpack@5.88.0))': dependencies: '@nx/devkit': 20.2.0-beta.3(nx@20.2.0-beta.3(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))) '@nx/eslint': 20.2.0-beta.3(@babel/traverse@7.25.9)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(@zkochan/js-yaml@0.0.7)(eslint@8.57.0)(nx@20.2.0-beta.3(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(verdaccio@5.32.2(encoding@0.1.13)(typanion@3.14.0)) '@nx/js': 20.2.0-beta.3(@babel/traverse@7.25.9)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(nx@20.2.0-beta.3(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(typescript@5.6.3)(verdaccio@5.32.2(encoding@0.1.13)(typanion@3.14.0)) '@nx/vite': 20.2.0-beta.3(@babel/traverse@7.25.9)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(nx@20.2.0-beta.3(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(typescript@5.6.3)(verdaccio@5.32.2(encoding@0.1.13)(typanion@3.14.0))(vite@5.0.8(@types/node@20.16.10)(less@4.1.3)(sass@1.55.0)(stylus@0.64.0)(terser@5.36.0))(vitest@1.3.1(@types/node@20.16.10)(jsdom@20.0.3)(less@4.1.3)(sass@1.55.0)(stylus@0.64.0)(terser@5.36.0)) - '@nx/webpack': 20.2.0-beta.3(@babel/traverse@7.25.9)(@rspack/core@1.1.3(@swc/helpers@0.5.11))(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(esbuild@0.19.5)(html-webpack-plugin@5.5.0(webpack@5.88.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.19.5)(webpack-cli@5.1.4)))(nx@20.2.0-beta.3(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(typescript@5.6.3)(verdaccio@5.32.2(encoding@0.1.13)(typanion@3.14.0))(webpack-cli@5.1.4(webpack-dev-server@5.0.4)(webpack@5.88.0)) + '@nx/webpack': 20.2.0-beta.3(@babel/traverse@7.25.9)(@rspack/core@1.1.5(@swc/helpers@0.5.11))(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(esbuild@0.19.5)(html-webpack-plugin@5.5.0(webpack@5.88.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.19.5)(webpack-cli@5.1.4)))(nx@20.2.0-beta.3(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(typescript@5.6.3)(verdaccio@5.32.2(encoding@0.1.13)(typanion@3.14.0))(webpack-cli@5.1.4(webpack-dev-server@5.0.4)(webpack@5.88.0)) '@phenomnomnominal/tsquery': 5.0.1(typescript@5.6.3) minimatch: 9.0.3 tslib: 2.7.0 @@ -22806,13 +22806,13 @@ snapshots: '@nx/module-federation': 20.2.0-beta.3(@babel/traverse@7.25.9)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/helpers@0.5.11)(@types/node@20.16.10)(esbuild@0.19.5)(next@14.2.16(@babel/core@7.25.2)(@playwright/test@1.47.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.55.0))(nx@20.2.0-beta.3(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)(verdaccio@5.32.2(encoding@0.1.13)(typanion@3.14.0))(webpack-cli@5.1.4(webpack-dev-server@5.0.4)(webpack@5.88.0)) '@nx/web': 20.2.0-beta.3(@babel/traverse@7.25.9)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(nx@20.2.0-beta.3(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(typescript@5.6.3)(verdaccio@5.32.2(encoding@0.1.13)(typanion@3.14.0)) '@phenomnomnominal/tsquery': 5.0.1(typescript@5.6.3) - '@rspack/core': 1.1.3(@swc/helpers@0.5.11) - '@rspack/dev-server': 1.0.9(@rspack/core@1.1.3(@swc/helpers@0.5.11))(@types/express@4.17.14)(webpack-cli@5.1.4(webpack-dev-server@5.0.4)(webpack@5.88.0))(webpack@5.88.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.19.5)(webpack-cli@5.1.4)) + '@rspack/core': 1.1.5(@swc/helpers@0.5.11) + '@rspack/dev-server': 1.0.9(@rspack/core@1.1.5(@swc/helpers@0.5.11))(@types/express@4.17.14)(webpack-cli@5.1.4(webpack-dev-server@5.0.4)(webpack@5.88.0))(webpack@5.88.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.19.5)(webpack-cli@5.1.4)) '@rspack/plugin-react-refresh': 1.0.0(react-refresh@0.10.0) autoprefixer: 10.4.13(postcss@8.4.38) browserslist: 4.23.3 chalk: 4.1.2 - css-loader: 6.11.0(@rspack/core@1.1.3(@swc/helpers@0.5.11))(webpack@5.88.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.19.5)(webpack-cli@5.1.4)) + css-loader: 6.11.0(@rspack/core@1.1.5(@swc/helpers@0.5.11))(webpack@5.88.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.19.5)(webpack-cli@5.1.4)) enquirer: 2.3.6 express: 4.21.0 fork-ts-checker-webpack-plugin: 7.2.13(typescript@5.6.3)(webpack@5.88.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.19.5)(webpack-cli@5.1.4)) @@ -22822,7 +22822,7 @@ snapshots: loader-utils: 2.0.3 postcss: 8.4.38 postcss-import: 14.1.0(postcss@8.4.38) - postcss-loader: 8.1.1(@rspack/core@1.1.3(@swc/helpers@0.5.11))(postcss@8.4.38)(typescript@5.6.3)(webpack@5.88.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.19.5)(webpack-cli@5.1.4)) + postcss-loader: 8.1.1(@rspack/core@1.1.5(@swc/helpers@0.5.11))(postcss@8.4.38)(typescript@5.6.3)(webpack@5.88.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.19.5)(webpack-cli@5.1.4)) sass: 1.55.0 sass-loader: 12.6.0(sass@1.55.0)(webpack@5.88.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.19.5)(webpack-cli@5.1.4)) source-map-loader: 5.0.0(webpack@5.88.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.19.5)(webpack-cli@5.1.4)) @@ -22926,7 +22926,7 @@ snapshots: - typescript - verdaccio - '@nx/webpack@20.2.0-beta.3(@babel/traverse@7.25.9)(@rspack/core@1.1.3(@swc/helpers@0.5.11))(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(esbuild@0.19.5)(html-webpack-plugin@5.5.0(webpack@5.88.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.19.5)(webpack-cli@5.1.4)))(nx@20.2.0-beta.3(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(typescript@5.6.3)(verdaccio@5.32.2(encoding@0.1.13)(typanion@3.14.0))(webpack-cli@5.1.4(webpack-dev-server@5.0.4)(webpack@5.88.0))': + '@nx/webpack@20.2.0-beta.3(@babel/traverse@7.25.9)(@rspack/core@1.1.5(@swc/helpers@0.5.11))(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(esbuild@0.19.5)(html-webpack-plugin@5.5.0(webpack@5.88.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.19.5)(webpack-cli@5.1.4)))(nx@20.2.0-beta.3(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(typescript@5.6.3)(verdaccio@5.32.2(encoding@0.1.13)(typanion@3.14.0))(webpack-cli@5.1.4(webpack-dev-server@5.0.4)(webpack@5.88.0))': dependencies: '@babel/core': 7.25.2 '@nx/devkit': 20.2.0-beta.3(nx@20.2.0-beta.3(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))) @@ -22937,7 +22937,7 @@ snapshots: babel-loader: 9.2.1(@babel/core@7.25.2)(webpack@5.88.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.19.5)(webpack-cli@5.1.4)) browserslist: 4.23.3 copy-webpack-plugin: 10.2.4(webpack@5.88.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.19.5)(webpack-cli@5.1.4)) - css-loader: 6.11.0(@rspack/core@1.1.3(@swc/helpers@0.5.11))(webpack@5.88.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.19.5)(webpack-cli@5.1.4)) + css-loader: 6.11.0(@rspack/core@1.1.5(@swc/helpers@0.5.11))(webpack@5.88.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.19.5)(webpack-cli@5.1.4)) css-minimizer-webpack-plugin: 5.0.1(esbuild@0.19.5)(webpack@5.88.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.19.5)(webpack-cli@5.1.4)) fork-ts-checker-webpack-plugin: 7.2.13(typescript@5.6.3)(webpack@5.88.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.19.5)(webpack-cli@5.1.4)) less: 4.1.3 @@ -23922,55 +23922,55 @@ snapshots: '@rspack/binding-darwin-arm64@1.1.2': optional: true - '@rspack/binding-darwin-arm64@1.1.3': + '@rspack/binding-darwin-arm64@1.1.5': optional: true '@rspack/binding-darwin-x64@1.1.2': optional: true - '@rspack/binding-darwin-x64@1.1.3': + '@rspack/binding-darwin-x64@1.1.5': optional: true '@rspack/binding-linux-arm64-gnu@1.1.2': optional: true - '@rspack/binding-linux-arm64-gnu@1.1.3': + '@rspack/binding-linux-arm64-gnu@1.1.5': optional: true '@rspack/binding-linux-arm64-musl@1.1.2': optional: true - '@rspack/binding-linux-arm64-musl@1.1.3': + '@rspack/binding-linux-arm64-musl@1.1.5': optional: true '@rspack/binding-linux-x64-gnu@1.1.2': optional: true - '@rspack/binding-linux-x64-gnu@1.1.3': + '@rspack/binding-linux-x64-gnu@1.1.5': optional: true '@rspack/binding-linux-x64-musl@1.1.2': optional: true - '@rspack/binding-linux-x64-musl@1.1.3': + '@rspack/binding-linux-x64-musl@1.1.5': optional: true '@rspack/binding-win32-arm64-msvc@1.1.2': optional: true - '@rspack/binding-win32-arm64-msvc@1.1.3': + '@rspack/binding-win32-arm64-msvc@1.1.5': optional: true '@rspack/binding-win32-ia32-msvc@1.1.2': optional: true - '@rspack/binding-win32-ia32-msvc@1.1.3': + '@rspack/binding-win32-ia32-msvc@1.1.5': optional: true '@rspack/binding-win32-x64-msvc@1.1.2': optional: true - '@rspack/binding-win32-x64-msvc@1.1.3': + '@rspack/binding-win32-x64-msvc@1.1.5': optional: true '@rspack/binding@1.1.2': @@ -23985,17 +23985,17 @@ snapshots: '@rspack/binding-win32-ia32-msvc': 1.1.2 '@rspack/binding-win32-x64-msvc': 1.1.2 - '@rspack/binding@1.1.3': + '@rspack/binding@1.1.5': optionalDependencies: - '@rspack/binding-darwin-arm64': 1.1.3 - '@rspack/binding-darwin-x64': 1.1.3 - '@rspack/binding-linux-arm64-gnu': 1.1.3 - '@rspack/binding-linux-arm64-musl': 1.1.3 - '@rspack/binding-linux-x64-gnu': 1.1.3 - '@rspack/binding-linux-x64-musl': 1.1.3 - '@rspack/binding-win32-arm64-msvc': 1.1.3 - '@rspack/binding-win32-ia32-msvc': 1.1.3 - '@rspack/binding-win32-x64-msvc': 1.1.3 + '@rspack/binding-darwin-arm64': 1.1.5 + '@rspack/binding-darwin-x64': 1.1.5 + '@rspack/binding-linux-arm64-gnu': 1.1.5 + '@rspack/binding-linux-arm64-musl': 1.1.5 + '@rspack/binding-linux-x64-gnu': 1.1.5 + '@rspack/binding-linux-x64-musl': 1.1.5 + '@rspack/binding-win32-arm64-msvc': 1.1.5 + '@rspack/binding-win32-ia32-msvc': 1.1.5 + '@rspack/binding-win32-x64-msvc': 1.1.5 '@rspack/core@1.1.2(@swc/helpers@0.5.11)': dependencies: @@ -24006,18 +24006,18 @@ snapshots: optionalDependencies: '@swc/helpers': 0.5.11 - '@rspack/core@1.1.3(@swc/helpers@0.5.11)': + '@rspack/core@1.1.5(@swc/helpers@0.5.11)': dependencies: '@module-federation/runtime-tools': 0.5.1 - '@rspack/binding': 1.1.3 + '@rspack/binding': 1.1.5 '@rspack/lite-tapable': 1.0.1 - caniuse-lite: 1.0.30001662 + caniuse-lite: 1.0.30001684 optionalDependencies: '@swc/helpers': 0.5.11 - '@rspack/dev-server@1.0.9(@rspack/core@1.1.3(@swc/helpers@0.5.11))(@types/express@4.17.14)(webpack-cli@5.1.4(webpack-dev-server@5.0.4)(webpack@5.88.0))(webpack@5.88.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.19.5)(webpack-cli@5.1.4))': + '@rspack/dev-server@1.0.9(@rspack/core@1.1.5(@swc/helpers@0.5.11))(@types/express@4.17.14)(webpack-cli@5.1.4(webpack-dev-server@5.0.4)(webpack@5.88.0))(webpack@5.88.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.19.5)(webpack-cli@5.1.4))': dependencies: - '@rspack/core': 1.1.3(@swc/helpers@0.5.11) + '@rspack/core': 1.1.5(@swc/helpers@0.5.11) chokidar: 3.6.0 connect-history-api-fallback: 2.0.0 express: 4.21.0 @@ -24218,7 +24218,7 @@ snapshots: transitivePeerDependencies: - webpack-sources - '@storybook/builder-webpack5@8.4.6(@rspack/core@1.1.3(@swc/helpers@0.5.11))(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.19.5)(storybook@8.4.6(prettier@2.8.8))(typescript@5.6.3)(webpack-cli@5.1.4(webpack-dev-server@5.0.4)(webpack@5.88.0))': + '@storybook/builder-webpack5@8.4.6(@rspack/core@1.1.5(@swc/helpers@0.5.11))(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.19.5)(storybook@8.4.6(prettier@2.8.8))(typescript@5.6.3)(webpack-cli@5.1.4(webpack-dev-server@5.0.4)(webpack@5.88.0))': dependencies: '@storybook/core-webpack': 8.4.6(storybook@8.4.6(prettier@2.8.8)) '@types/node': 22.5.5 @@ -24227,7 +24227,7 @@ snapshots: case-sensitive-paths-webpack-plugin: 2.4.0 cjs-module-lexer: 1.4.1 constants-browserify: 1.0.0 - css-loader: 6.11.0(@rspack/core@1.1.3(@swc/helpers@0.5.11))(webpack@5.88.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.19.5)(webpack-cli@5.1.4)) + css-loader: 6.11.0(@rspack/core@1.1.5(@swc/helpers@0.5.11))(webpack@5.88.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.19.5)(webpack-cli@5.1.4)) es-module-lexer: 1.5.4 fork-ts-checker-webpack-plugin: 8.0.0(typescript@5.6.3)(webpack@5.88.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.19.5)(webpack-cli@5.1.4)) html-webpack-plugin: 5.5.0(webpack@5.88.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.19.5)(webpack-cli@5.1.4)) @@ -24406,9 +24406,9 @@ snapshots: - typescript - webpack-sources - '@storybook/react-webpack5@8.4.6(@rspack/core@1.1.3(@swc/helpers@0.5.11))(@storybook/test@8.4.6(storybook@8.4.6(prettier@2.8.8)))(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.19.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.4.6(prettier@2.8.8))(typescript@5.6.3)(webpack-cli@5.1.4(webpack-dev-server@5.0.4)(webpack@5.88.0))': + '@storybook/react-webpack5@8.4.6(@rspack/core@1.1.5(@swc/helpers@0.5.11))(@storybook/test@8.4.6(storybook@8.4.6(prettier@2.8.8)))(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.19.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.4.6(prettier@2.8.8))(typescript@5.6.3)(webpack-cli@5.1.4(webpack-dev-server@5.0.4)(webpack@5.88.0))': dependencies: - '@storybook/builder-webpack5': 8.4.6(@rspack/core@1.1.3(@swc/helpers@0.5.11))(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.19.5)(storybook@8.4.6(prettier@2.8.8))(typescript@5.6.3)(webpack-cli@5.1.4(webpack-dev-server@5.0.4)(webpack@5.88.0)) + '@storybook/builder-webpack5': 8.4.6(@rspack/core@1.1.5(@swc/helpers@0.5.11))(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.19.5)(storybook@8.4.6(prettier@2.8.8))(typescript@5.6.3)(webpack-cli@5.1.4(webpack-dev-server@5.0.4)(webpack@5.88.0)) '@storybook/preset-react-webpack': 8.4.6(@storybook/test@8.4.6(storybook@8.4.6(prettier@2.8.8)))(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.19.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.4.6(prettier@2.8.8))(typescript@5.6.3)(webpack-cli@5.1.4(webpack-dev-server@5.0.4)(webpack@5.88.0)) '@storybook/react': 8.4.6(@storybook/test@8.4.6(storybook@8.4.6(prettier@2.8.8)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.4.6(prettier@2.8.8))(typescript@5.6.3) '@types/node': 22.5.5 @@ -26990,7 +26990,7 @@ snapshots: caniuse-api@3.0.0: dependencies: browserslist: 4.23.3 - caniuse-lite: 1.0.30001662 + caniuse-lite: 1.0.30001684 lodash.memoize: 4.1.2 lodash.uniq: 4.5.0 @@ -27661,7 +27661,7 @@ snapshots: postcss: 8.4.38 postcss-selector-parser: 6.1.2 - css-loader@6.11.0(@rspack/core@1.1.3(@swc/helpers@0.5.11))(webpack@5.88.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.19.5)(webpack-cli@5.1.4)): + css-loader@6.11.0(@rspack/core@1.1.5(@swc/helpers@0.5.11))(webpack@5.88.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.19.5)(webpack-cli@5.1.4)): dependencies: icss-utils: 5.1.0(postcss@8.4.38) postcss: 8.4.38 @@ -27672,10 +27672,10 @@ snapshots: postcss-value-parser: 4.2.0 semver: 7.6.3 optionalDependencies: - '@rspack/core': 1.1.3(@swc/helpers@0.5.11) + '@rspack/core': 1.1.5(@swc/helpers@0.5.11) webpack: 5.88.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.19.5)(webpack-cli@5.1.4) - css-loader@7.1.2(@rspack/core@1.1.3(@swc/helpers@0.5.11))(webpack@5.96.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.24.0)(webpack-cli@5.1.4(webpack-dev-server@5.0.4)(webpack@5.88.0))): + css-loader@7.1.2(@rspack/core@1.1.5(@swc/helpers@0.5.11))(webpack@5.96.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.24.0)(webpack-cli@5.1.4(webpack-dev-server@5.0.4)(webpack@5.88.0))): dependencies: icss-utils: 5.1.0(postcss@8.4.38) postcss: 8.4.38 @@ -27686,7 +27686,7 @@ snapshots: postcss-value-parser: 4.2.0 semver: 7.6.3 optionalDependencies: - '@rspack/core': 1.1.3(@swc/helpers@0.5.11) + '@rspack/core': 1.1.5(@swc/helpers@0.5.11) webpack: 5.96.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.24.0)(webpack-cli@5.1.4(webpack-dev-server@5.0.4)(webpack@5.88.0)) css-minimizer-webpack-plugin@5.0.1(esbuild@0.19.5)(webpack@5.88.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.19.5)(webpack-cli@5.1.4)): @@ -31486,11 +31486,11 @@ snapshots: less: 4.1.3 webpack: 5.88.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.19.5)(webpack-cli@5.1.4) - less-loader@12.2.0(@rspack/core@1.1.3(@swc/helpers@0.5.11))(less@4.2.0)(webpack@5.96.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.24.0)(webpack-cli@5.1.4(webpack-dev-server@5.0.4)(webpack@5.88.0))): + less-loader@12.2.0(@rspack/core@1.1.5(@swc/helpers@0.5.11))(less@4.2.0)(webpack@5.96.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.24.0)(webpack-cli@5.1.4(webpack-dev-server@5.0.4)(webpack@5.88.0))): dependencies: less: 4.2.0 optionalDependencies: - '@rspack/core': 1.1.3(@swc/helpers@0.5.11) + '@rspack/core': 1.1.5(@swc/helpers@0.5.11) webpack: 5.96.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.24.0)(webpack-cli@5.1.4(webpack-dev-server@5.0.4)(webpack@5.88.0)) less@4.1.3: @@ -34136,26 +34136,26 @@ snapshots: semver: 7.6.3 webpack: 5.88.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.19.5)(webpack-cli@5.1.4) - postcss-loader@8.1.1(@rspack/core@1.1.3(@swc/helpers@0.5.11))(postcss@8.4.38)(typescript@5.6.3)(webpack@5.88.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.19.5)(webpack-cli@5.1.4)): + postcss-loader@8.1.1(@rspack/core@1.1.5(@swc/helpers@0.5.11))(postcss@8.4.38)(typescript@5.6.3)(webpack@5.88.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.19.5)(webpack-cli@5.1.4)): dependencies: cosmiconfig: 9.0.0(typescript@5.6.3) jiti: 1.21.6 postcss: 8.4.38 semver: 7.6.3 optionalDependencies: - '@rspack/core': 1.1.3(@swc/helpers@0.5.11) + '@rspack/core': 1.1.5(@swc/helpers@0.5.11) webpack: 5.88.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.19.5)(webpack-cli@5.1.4) transitivePeerDependencies: - typescript - postcss-loader@8.1.1(@rspack/core@1.1.3(@swc/helpers@0.5.11))(postcss@8.4.49)(typescript@5.6.3)(webpack@5.96.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.24.0)(webpack-cli@5.1.4(webpack-dev-server@5.0.4)(webpack@5.88.0))): + postcss-loader@8.1.1(@rspack/core@1.1.5(@swc/helpers@0.5.11))(postcss@8.4.49)(typescript@5.6.3)(webpack@5.96.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.24.0)(webpack-cli@5.1.4(webpack-dev-server@5.0.4)(webpack@5.88.0))): dependencies: cosmiconfig: 9.0.0(typescript@5.6.3) jiti: 1.21.6 postcss: 8.4.49 semver: 7.6.3 optionalDependencies: - '@rspack/core': 1.1.3(@swc/helpers@0.5.11) + '@rspack/core': 1.1.5(@swc/helpers@0.5.11) webpack: 5.96.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.24.0)(webpack-cli@5.1.4(webpack-dev-server@5.0.4)(webpack@5.88.0)) transitivePeerDependencies: - typescript @@ -35526,11 +35526,11 @@ snapshots: optionalDependencies: sass: 1.55.0 - sass-loader@16.0.3(@rspack/core@1.1.3(@swc/helpers@0.5.11))(sass@1.80.7)(webpack@5.96.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.24.0)(webpack-cli@5.1.4(webpack-dev-server@5.0.4)(webpack@5.88.0))): + sass-loader@16.0.3(@rspack/core@1.1.5(@swc/helpers@0.5.11))(sass@1.80.7)(webpack@5.96.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.24.0)(webpack-cli@5.1.4(webpack-dev-server@5.0.4)(webpack@5.88.0))): dependencies: neo-async: 2.6.2 optionalDependencies: - '@rspack/core': 1.1.3(@swc/helpers@0.5.11) + '@rspack/core': 1.1.5(@swc/helpers@0.5.11) sass: 1.80.7 webpack: 5.96.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.24.0)(webpack-cli@5.1.4(webpack-dev-server@5.0.4)(webpack@5.88.0)) From 4773e35d0189bfd28600362ad6459c2eecfa472e Mon Sep 17 00:00:00 2001 From: Jason Jean Date: Wed, 4 Dec 2024 15:42:15 -0500 Subject: [PATCH 09/21] chore(repo): update nx to 20.2.0-beta.7 (#29198) ## Current Behavior This repo uses Nx `20.2.0-beta.3` ## Expected Behavior This repo uses Nx `20.2.0-beta.7` ## Related Issue(s) Fixes # --- .eslintrc.json | 10 +- package.json | 55 +- packages/angular/.eslintrc.json | 12 +- pnpm-lock.yaml | 1083 ++++++++++++++++--------------- 4 files changed, 594 insertions(+), 566 deletions(-) diff --git a/.eslintrc.json b/.eslintrc.json index b03a82584fcfe..255bb572a598c 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -71,9 +71,17 @@ "rules": { "@nx/workspace/ensure-pnpm-lock-version": [ "error", - { "version": "9.0" } + { + "version": "9.0" + } ] } + }, + { + "files": ["*.ts"], + "rules": { + "@angular-eslint/prefer-standalone": "off" + } } ] } diff --git a/package.json b/package.json index afc144365e3b0..0e15fb9acb0ab 100644 --- a/package.json +++ b/package.json @@ -31,9 +31,9 @@ "@angular-devkit/build-angular": "~19.0.0", "@angular-devkit/core": "~19.0.0", "@angular-devkit/schematics": "~19.0.0", - "@angular-eslint/eslint-plugin": "^19.0.0", - "@angular-eslint/eslint-plugin-template": "^19.0.0", - "@angular-eslint/template-parser": "^19.0.0", + "@angular-eslint/eslint-plugin": "19.0.0", + "@angular-eslint/eslint-plugin-template": "19.0.0", + "@angular-eslint/template-parser": "19.0.0", "@angular/cli": "~19.0.0", "@angular/common": "~19.0.0", "@angular/compiler": "~19.0.0", @@ -69,25 +69,25 @@ "@ngrx/store": "18.0.2", "@nuxt/kit": "^3.10.0", "@nuxt/schema": "^3.10.0", - "@nx/angular": "20.2.0-beta.3", - "@nx/cypress": "20.2.0-beta.3", - "@nx/devkit": "20.2.0-beta.3", - "@nx/esbuild": "20.2.0-beta.3", - "@nx/eslint": "20.2.0-beta.3", - "@nx/eslint-plugin": "20.2.0-beta.3", - "@nx/jest": "20.2.0-beta.3", - "@nx/js": "20.2.0-beta.3", - "@nx/next": "20.2.0-beta.3", - "@nx/playwright": "20.2.0-beta.3", + "@nx/angular": "20.2.0-beta.7", + "@nx/cypress": "20.2.0-beta.7", + "@nx/devkit": "20.2.0-beta.7", + "@nx/esbuild": "20.2.0-beta.7", + "@nx/eslint": "20.2.0-beta.7", + "@nx/eslint-plugin": "20.2.0-beta.7", + "@nx/jest": "20.2.0-beta.7", + "@nx/js": "20.2.0-beta.7", + "@nx/next": "20.2.0-beta.7", + "@nx/playwright": "20.2.0-beta.7", "@nx/powerpack-conformance": "1.1.0-beta.6", "@nx/powerpack-enterprise-cloud": "1.1.0-beta.6", "@nx/powerpack-license": "1.1.0-beta.6", - "@nx/react": "20.2.0-beta.3", - "@nx/storybook": "20.2.0-beta.3", - "@nx/vite": "20.2.0-beta.3", - "@nx/web": "20.2.0-beta.3", - "@nx/webpack": "20.2.0-beta.3", - "@nx/rspack": "20.2.0-beta.3", + "@nx/react": "20.2.0-beta.7", + "@nx/rspack": "20.2.0-beta.7", + "@nx/storybook": "20.2.0-beta.7", + "@nx/vite": "20.2.0-beta.7", + "@nx/web": "20.2.0-beta.7", + "@nx/webpack": "20.2.0-beta.7", "@phenomnomnominal/tsquery": "~5.0.1", "@playwright/test": "^1.36.1", "@pmmmwh/react-refresh-webpack-plugin": "^0.5.7", @@ -106,12 +106,12 @@ "@rspack/plugin-minify": "^0.7.5", "@rspack/plugin-react-refresh": "^1.0.0", "@schematics/angular": "~19.0.0", - "@storybook/addon-essentials": "^8.4.6", - "@storybook/addon-interactions": "^8.4.6", - "@storybook/core-server": "^8.4.6", - "@storybook/react": "^8.4.6", - "@storybook/react-vite": "^8.4.6", - "@storybook/react-webpack5": "^8.4.6", + "@storybook/addon-essentials": "8.4.6", + "@storybook/addon-interactions": "8.4.6", + "@storybook/core-server": "8.4.6", + "@storybook/react": "8.4.6", + "@storybook/react-vite": "8.4.6", + "@storybook/react-webpack5": "8.4.6", "@storybook/types": "^8.4.6", "@supabase/supabase-js": "^2.26.0", "@svgr/rollup": "^8.1.0", @@ -145,6 +145,7 @@ "@types/tmp": "^0.2.0", "@types/yargs": "17.0.10", "@types/yarnpkg__lockfile": "^1.1.5", + "@typescript-eslint/eslint-plugin": "^8.13.0", "@typescript-eslint/rule-tester": "^8.13.0", "@typescript-eslint/type-utils": "^8.13.0", "@typescript-eslint/utils": "^8.13.0", @@ -154,7 +155,7 @@ "@zkochan/js-yaml": "0.0.7", "ai": "^2.2.10", "ajv": "^8.12.0", - "angular-eslint": "^19.0.0", + "angular-eslint": "19.0.0", "autoprefixer": "10.4.13", "babel-jest": "29.7.0", "babel-loader": "^9.1.2", @@ -248,7 +249,7 @@ "node-fetch": "^2.6.7", "npm-package-arg": "11.0.1", "nuxt": "^3.10.0", - "nx": "20.2.0-beta.3", + "nx": "20.2.0-beta.7", "octokit": "^2.0.14", "open": "^8.4.0", "openai": "~4.3.1", diff --git a/packages/angular/.eslintrc.json b/packages/angular/.eslintrc.json index e47e84ce96a07..f43efe603d99e 100644 --- a/packages/angular/.eslintrc.json +++ b/packages/angular/.eslintrc.json @@ -48,7 +48,6 @@ "vite", "rxjs", "semver", - // These are installed by ensurePackage so missing in package.json "@nx/cypress", "@nx/playwright", "@nx/jest", @@ -58,7 +57,6 @@ "@nx/webpack", "prettier", "typescript", - // These are installed by generators "@schematics/angular", "@angular-devkit/core", "@angular-devkit/architect", @@ -74,9 +72,7 @@ "@storybook/angular", "@module-federation/node", "@nguniversal/builders", - // installed dynamically by the library generator "ng-packagr", - // ng-packagr deps, some are handled if not installed "injection-js", "browserslist", "cacache", @@ -91,14 +87,18 @@ "sass", "stylus", "tailwindcss", - // used in the CT angular plugin where Cy is already installed to use it. "cypress", - // we have only one type import, so it's not a runtime dependency "esbuild" ] } ] } + }, + { + "files": ["*.ts"], + "rules": { + "@angular-eslint/prefer-standalone": "off" + } } ] } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ff6a0fca85766..12c91217f6931 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -32,7 +32,7 @@ importers: version: 0.1.55 '@nx/graph': specifier: 0.1.0 - version: 0.1.0(@nx/devkit@20.2.0-beta.3(nx@20.2.0-beta.3(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))))(nx@20.2.0-beta.3(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(react-dom@18.3.1(react@18.3.1))(react-router-dom@6.26.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1) + version: 0.1.0(@nx/devkit@20.2.0-beta.7(nx@20.2.0-beta.7(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))))(nx@20.2.0-beta.7(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(react-dom@18.3.1(react@18.3.1))(react-router-dom@6.26.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1) '@react-spring/three': specifier: ^9.7.3 version: 9.7.4(@react-three/fiber@8.17.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(three@0.166.1))(react@18.3.1)(three@0.166.1) @@ -182,13 +182,13 @@ importers: specifier: ~19.0.0 version: 19.0.2(chokidar@3.6.0) '@angular-eslint/eslint-plugin': - specifier: ^19.0.0 + specifier: 19.0.0 version: 19.0.0(@typescript-eslint/utils@8.16.0(eslint@8.57.0)(typescript@5.6.3))(eslint@8.57.0)(typescript@5.6.3) '@angular-eslint/eslint-plugin-template': - specifier: ^19.0.0 + specifier: 19.0.0 version: 19.0.0(@typescript-eslint/types@8.16.0)(@typescript-eslint/utils@8.16.0(eslint@8.57.0)(typescript@5.6.3))(eslint@8.57.0)(typescript@5.6.3) '@angular-eslint/template-parser': - specifier: ^19.0.0 + specifier: 19.0.0 version: 19.0.0(eslint@8.57.0)(typescript@5.6.3) '@angular/cli': specifier: ~19.0.0 @@ -255,7 +255,7 @@ importers: version: 0.7.6 '@monodon/rust': specifier: 2.1.1 - version: 2.1.1(@napi-rs/cli@3.0.0-alpha.56(@emnapi/runtime@1.2.0)(emnapi@1.3.1(node-addon-api@7.1.1)))(nx@20.2.0-beta.3(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))) + version: 2.1.1(@napi-rs/cli@3.0.0-alpha.56(@emnapi/runtime@1.2.0)(emnapi@1.3.1(node-addon-api@7.1.1)))(nx@20.2.0-beta.7(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))) '@napi-rs/cli': specifier: 3.0.0-alpha.56 version: 3.0.0-alpha.56(@emnapi/runtime@1.2.0)(emnapi@1.3.1(node-addon-api@7.1.1)) @@ -296,62 +296,62 @@ importers: specifier: ^3.10.0 version: 3.13.2(rollup@4.22.0)(webpack-sources@3.2.3) '@nx/angular': - specifier: 20.2.0-beta.3 - version: 20.2.0-beta.3(dtud7qphu6hdicss76tjbn32se) + specifier: 20.2.0-beta.7 + version: 20.2.0-beta.7(s6tacdgbduxi2uiacc6ijnz6ge) '@nx/cypress': - specifier: 20.2.0-beta.3 - version: 20.2.0-beta.3(@babel/traverse@7.25.9)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(@zkochan/js-yaml@0.0.7)(cypress@13.13.0)(eslint@8.57.0)(nx@20.2.0-beta.3(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(typescript@5.6.3)(verdaccio@5.32.2(encoding@0.1.13)(typanion@3.14.0)) + specifier: 20.2.0-beta.7 + version: 20.2.0-beta.7(@babel/traverse@7.25.9)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(@zkochan/js-yaml@0.0.7)(cypress@13.13.0)(eslint@8.57.0)(nx@20.2.0-beta.7(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(typescript@5.6.3)(verdaccio@5.32.2(encoding@0.1.13)(typanion@3.14.0)) '@nx/devkit': - specifier: 20.2.0-beta.3 - version: 20.2.0-beta.3(nx@20.2.0-beta.3(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))) + specifier: 20.2.0-beta.7 + version: 20.2.0-beta.7(nx@20.2.0-beta.7(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))) '@nx/esbuild': - specifier: 20.2.0-beta.3 - version: 20.2.0-beta.3(@babel/traverse@7.25.9)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(esbuild@0.19.5)(nx@20.2.0-beta.3(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(typescript@5.6.3)(verdaccio@5.32.2(encoding@0.1.13)(typanion@3.14.0)) + specifier: 20.2.0-beta.7 + version: 20.2.0-beta.7(@babel/traverse@7.25.9)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(esbuild@0.19.5)(nx@20.2.0-beta.7(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(typescript@5.6.3)(verdaccio@5.32.2(encoding@0.1.13)(typanion@3.14.0)) '@nx/eslint': - specifier: 20.2.0-beta.3 - version: 20.2.0-beta.3(@babel/traverse@7.25.9)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(@zkochan/js-yaml@0.0.7)(eslint@8.57.0)(nx@20.2.0-beta.3(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(verdaccio@5.32.2(encoding@0.1.13)(typanion@3.14.0)) + specifier: 20.2.0-beta.7 + version: 20.2.0-beta.7(@babel/traverse@7.25.9)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(@zkochan/js-yaml@0.0.7)(eslint@8.57.0)(nx@20.2.0-beta.7(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(verdaccio@5.32.2(encoding@0.1.13)(typanion@3.14.0)) '@nx/eslint-plugin': - specifier: 20.2.0-beta.3 - version: 20.2.0-beta.3(@babel/traverse@7.25.9)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(@typescript-eslint/parser@8.16.0(eslint@8.57.0)(typescript@5.6.3))(eslint-config-prettier@9.1.0(eslint@8.57.0))(eslint@8.57.0)(nx@20.2.0-beta.3(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(typescript@5.6.3)(verdaccio@5.32.2(encoding@0.1.13)(typanion@3.14.0)) + specifier: 20.2.0-beta.7 + version: 20.2.0-beta.7(@babel/traverse@7.25.9)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(@typescript-eslint/parser@8.16.0(eslint@8.57.0)(typescript@5.6.3))(eslint-config-prettier@9.1.0(eslint@8.57.0))(eslint@8.57.0)(nx@20.2.0-beta.7(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(typescript@5.6.3)(verdaccio@5.32.2(encoding@0.1.13)(typanion@3.14.0)) '@nx/jest': - specifier: 20.2.0-beta.3 - version: 20.2.0-beta.3(@babel/traverse@7.25.9)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(nx@20.2.0-beta.3(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(ts-node@10.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(typescript@5.6.3))(typescript@5.6.3)(verdaccio@5.32.2(encoding@0.1.13)(typanion@3.14.0)) + specifier: 20.2.0-beta.7 + version: 20.2.0-beta.7(@babel/traverse@7.25.9)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(nx@20.2.0-beta.7(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(ts-node@10.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(typescript@5.6.3))(typescript@5.6.3)(verdaccio@5.32.2(encoding@0.1.13)(typanion@3.14.0)) '@nx/js': - specifier: 20.2.0-beta.3 - version: 20.2.0-beta.3(@babel/traverse@7.25.9)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(nx@20.2.0-beta.3(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(typescript@5.6.3)(verdaccio@5.32.2(encoding@0.1.13)(typanion@3.14.0)) + specifier: 20.2.0-beta.7 + version: 20.2.0-beta.7(@babel/traverse@7.25.9)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(nx@20.2.0-beta.7(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(typescript@5.6.3)(verdaccio@5.32.2(encoding@0.1.13)(typanion@3.14.0)) '@nx/next': - specifier: 20.2.0-beta.3 - version: 20.2.0-beta.3(@babel/core@7.25.2)(@babel/traverse@7.25.9)(@rspack/core@1.1.5(@swc/helpers@0.5.11))(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/helpers@0.5.11)(@types/node@20.16.10)(@zkochan/js-yaml@0.0.7)(esbuild@0.19.5)(eslint@8.57.0)(html-webpack-plugin@5.5.0(webpack@5.88.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.19.5)(webpack-cli@5.1.4)))(next@14.2.16(@babel/core@7.25.2)(@playwright/test@1.47.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.55.0))(nx@20.2.0-beta.3(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)(verdaccio@5.32.2(encoding@0.1.13)(typanion@3.14.0))(webpack-cli@5.1.4(webpack-dev-server@5.0.4)(webpack@5.88.0))(webpack@5.88.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.19.5)(webpack-cli@5.1.4)) + specifier: 20.2.0-beta.7 + version: 20.2.0-beta.7(@babel/core@7.25.2)(@babel/traverse@7.25.9)(@rspack/core@1.1.5(@swc/helpers@0.5.11))(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/helpers@0.5.11)(@types/node@20.16.10)(@zkochan/js-yaml@0.0.7)(esbuild@0.19.5)(eslint@8.57.0)(html-webpack-plugin@5.5.0(webpack@5.88.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.19.5)(webpack-cli@5.1.4)))(next@14.2.16(@babel/core@7.25.2)(@playwright/test@1.47.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.55.0))(nx@20.2.0-beta.7(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)(verdaccio@5.32.2(encoding@0.1.13)(typanion@3.14.0))(webpack-cli@5.1.4(webpack-dev-server@5.0.4)(webpack@5.88.0))(webpack@5.88.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.19.5)(webpack-cli@5.1.4)) '@nx/playwright': - specifier: 20.2.0-beta.3 - version: 20.2.0-beta.3(@babel/traverse@7.25.9)(@playwright/test@1.47.1)(@rspack/core@1.1.5(@swc/helpers@0.5.11))(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(@zkochan/js-yaml@0.0.7)(esbuild@0.19.5)(eslint@8.57.0)(html-webpack-plugin@5.5.0(webpack@5.88.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.19.5)(webpack-cli@5.1.4)))(nx@20.2.0-beta.3(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(typescript@5.6.3)(verdaccio@5.32.2(encoding@0.1.13)(typanion@3.14.0))(vite@5.0.8(@types/node@20.16.10)(less@4.1.3)(sass@1.55.0)(stylus@0.64.0)(terser@5.36.0))(vitest@1.3.1(@types/node@20.16.10)(jsdom@20.0.3)(less@4.1.3)(sass@1.55.0)(stylus@0.64.0)(terser@5.36.0))(webpack-cli@5.1.4(webpack-dev-server@5.0.4)(webpack@5.88.0)) + specifier: 20.2.0-beta.7 + version: 20.2.0-beta.7(@babel/traverse@7.25.9)(@playwright/test@1.47.1)(@rspack/core@1.1.5(@swc/helpers@0.5.11))(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(@zkochan/js-yaml@0.0.7)(esbuild@0.19.5)(eslint@8.57.0)(html-webpack-plugin@5.5.0(webpack@5.88.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.19.5)(webpack-cli@5.1.4)))(nx@20.2.0-beta.7(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(typescript@5.6.3)(verdaccio@5.32.2(encoding@0.1.13)(typanion@3.14.0))(vite@5.0.8(@types/node@20.16.10)(less@4.1.3)(sass@1.55.0)(stylus@0.64.0)(terser@5.36.0))(vitest@1.3.1(@types/node@20.16.10)(jsdom@20.0.3)(less@4.1.3)(sass@1.55.0)(stylus@0.64.0)(terser@5.36.0))(webpack-cli@5.1.4(webpack-dev-server@5.0.4)(webpack@5.88.0)) '@nx/powerpack-conformance': specifier: 1.1.0-beta.6 - version: 1.1.0-beta.6(@babel/traverse@7.25.9)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(nx@20.2.0-beta.3(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(typescript@5.6.3)(verdaccio@5.32.2(encoding@0.1.13)(typanion@3.14.0)) + version: 1.1.0-beta.6(@babel/traverse@7.25.9)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(nx@20.2.0-beta.7(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(typescript@5.6.3)(verdaccio@5.32.2(encoding@0.1.13)(typanion@3.14.0)) '@nx/powerpack-enterprise-cloud': specifier: 1.1.0-beta.6 - version: 1.1.0-beta.6(nx@20.2.0-beta.3(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))) + version: 1.1.0-beta.6(nx@20.2.0-beta.7(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))) '@nx/powerpack-license': specifier: 1.1.0-beta.6 version: 1.1.0-beta.6 '@nx/react': - specifier: 20.2.0-beta.3 - version: 20.2.0-beta.3(@babel/traverse@7.25.9)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/helpers@0.5.11)(@types/node@20.16.10)(@zkochan/js-yaml@0.0.7)(esbuild@0.19.5)(eslint@8.57.0)(next@14.2.16(@babel/core@7.25.2)(@playwright/test@1.47.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.55.0))(nx@20.2.0-beta.3(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)(verdaccio@5.32.2(encoding@0.1.13)(typanion@3.14.0))(webpack-cli@5.1.4(webpack-dev-server@5.0.4)(webpack@5.88.0))(webpack@5.88.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.19.5)(webpack-cli@5.1.4)) + specifier: 20.2.0-beta.7 + version: 20.2.0-beta.7(@babel/traverse@7.25.9)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/helpers@0.5.11)(@types/node@20.16.10)(@zkochan/js-yaml@0.0.7)(esbuild@0.19.5)(eslint@8.57.0)(next@14.2.16(@babel/core@7.25.2)(@playwright/test@1.47.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.55.0))(nx@20.2.0-beta.7(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)(verdaccio@5.32.2(encoding@0.1.13)(typanion@3.14.0))(webpack-cli@5.1.4(webpack-dev-server@5.0.4)(webpack@5.88.0))(webpack@5.88.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.19.5)(webpack-cli@5.1.4)) '@nx/rspack': - specifier: 20.2.0-beta.3 - version: 20.2.0-beta.3(fmeukgi3gqsgveqxj6bd3uzyli) + specifier: 20.2.0-beta.7 + version: 20.2.0-beta.7(lpvcfynk6qi2jfyvaa5ybhqzay) '@nx/storybook': - specifier: 20.2.0-beta.3 - version: 20.2.0-beta.3(@babel/traverse@7.25.9)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(@zkochan/js-yaml@0.0.7)(cypress@13.13.0)(eslint@8.57.0)(nx@20.2.0-beta.3(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(typescript@5.6.3)(verdaccio@5.32.2(encoding@0.1.13)(typanion@3.14.0)) + specifier: 20.2.0-beta.7 + version: 20.2.0-beta.7(@babel/traverse@7.25.9)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(@zkochan/js-yaml@0.0.7)(cypress@13.13.0)(eslint@8.57.0)(nx@20.2.0-beta.7(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(typescript@5.6.3)(verdaccio@5.32.2(encoding@0.1.13)(typanion@3.14.0)) '@nx/vite': - specifier: 20.2.0-beta.3 - version: 20.2.0-beta.3(@babel/traverse@7.25.9)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(nx@20.2.0-beta.3(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(typescript@5.6.3)(verdaccio@5.32.2(encoding@0.1.13)(typanion@3.14.0))(vite@5.0.8(@types/node@20.16.10)(less@4.1.3)(sass@1.55.0)(stylus@0.64.0)(terser@5.36.0))(vitest@1.3.1(@types/node@20.16.10)(jsdom@20.0.3)(less@4.1.3)(sass@1.55.0)(stylus@0.64.0)(terser@5.36.0)) + specifier: 20.2.0-beta.7 + version: 20.2.0-beta.7(@babel/traverse@7.25.9)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(nx@20.2.0-beta.7(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(typescript@5.6.3)(verdaccio@5.32.2(encoding@0.1.13)(typanion@3.14.0))(vite@5.0.8(@types/node@20.16.10)(less@4.1.3)(sass@1.55.0)(stylus@0.64.0)(terser@5.36.0))(vitest@1.3.1(@types/node@20.16.10)(jsdom@20.0.3)(less@4.1.3)(sass@1.55.0)(stylus@0.64.0)(terser@5.36.0)) '@nx/web': - specifier: 20.2.0-beta.3 - version: 20.2.0-beta.3(@babel/traverse@7.25.9)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(nx@20.2.0-beta.3(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(typescript@5.6.3)(verdaccio@5.32.2(encoding@0.1.13)(typanion@3.14.0)) + specifier: 20.2.0-beta.7 + version: 20.2.0-beta.7(@babel/traverse@7.25.9)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(nx@20.2.0-beta.7(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(typescript@5.6.3)(verdaccio@5.32.2(encoding@0.1.13)(typanion@3.14.0)) '@nx/webpack': - specifier: 20.2.0-beta.3 - version: 20.2.0-beta.3(@babel/traverse@7.25.9)(@rspack/core@1.1.5(@swc/helpers@0.5.11))(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(esbuild@0.19.5)(html-webpack-plugin@5.5.0(webpack@5.88.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.19.5)(webpack-cli@5.1.4)))(nx@20.2.0-beta.3(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(typescript@5.6.3)(verdaccio@5.32.2(encoding@0.1.13)(typanion@3.14.0))(webpack-cli@5.1.4(webpack-dev-server@5.0.4)(webpack@5.88.0)) + specifier: 20.2.0-beta.7 + version: 20.2.0-beta.7(@babel/traverse@7.25.9)(@rspack/core@1.1.5(@swc/helpers@0.5.11))(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(esbuild@0.19.5)(html-webpack-plugin@5.5.0(webpack@5.88.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.19.5)(webpack-cli@5.1.4)))(nx@20.2.0-beta.7(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(typescript@5.6.3)(verdaccio@5.32.2(encoding@0.1.13)(typanion@3.14.0))(webpack-cli@5.1.4(webpack-dev-server@5.0.4)(webpack@5.88.0)) '@phenomnomnominal/tsquery': specifier: ~5.0.1 version: 5.0.1(typescript@5.6.3) @@ -407,22 +407,22 @@ importers: specifier: ~19.0.0 version: 19.0.2(chokidar@3.6.0) '@storybook/addon-essentials': - specifier: ^8.4.6 + specifier: 8.4.6 version: 8.4.6(@types/react@18.3.1)(storybook@8.4.6(prettier@2.8.8))(webpack-sources@3.2.3) '@storybook/addon-interactions': - specifier: ^8.4.6 + specifier: 8.4.6 version: 8.4.6(storybook@8.4.6(prettier@2.8.8)) '@storybook/core-server': - specifier: ^8.4.6 + specifier: 8.4.6 version: 8.4.6(storybook@8.4.6(prettier@2.8.8)) '@storybook/react': - specifier: ^8.4.6 + specifier: 8.4.6 version: 8.4.6(@storybook/test@8.4.6(storybook@8.4.6(prettier@2.8.8)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.4.6(prettier@2.8.8))(typescript@5.6.3) '@storybook/react-vite': - specifier: ^8.4.6 + specifier: 8.4.6 version: 8.4.6(@storybook/test@8.4.6(storybook@8.4.6(prettier@2.8.8)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rollup@4.22.0)(storybook@8.4.6(prettier@2.8.8))(typescript@5.6.3)(vite@5.0.8(@types/node@20.16.10)(less@4.1.3)(sass@1.55.0)(stylus@0.64.0)(terser@5.36.0))(webpack-sources@3.2.3) '@storybook/react-webpack5': - specifier: ^8.4.6 + specifier: 8.4.6 version: 8.4.6(@rspack/core@1.1.5(@swc/helpers@0.5.11))(@storybook/test@8.4.6(storybook@8.4.6(prettier@2.8.8)))(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.19.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.4.6(prettier@2.8.8))(typescript@5.6.3)(webpack-cli@5.1.4(webpack-dev-server@5.0.4)(webpack@5.88.0)) '@storybook/types': specifier: ^8.4.6 @@ -523,6 +523,9 @@ importers: '@types/yarnpkg__lockfile': specifier: ^1.1.5 version: 1.1.9 + '@typescript-eslint/eslint-plugin': + specifier: ^8.13.0 + version: 8.16.0(@typescript-eslint/parser@8.16.0(eslint@8.57.0)(typescript@5.6.3))(eslint@8.57.0)(typescript@5.6.3) '@typescript-eslint/rule-tester': specifier: ^8.13.0 version: 8.16.0(eslint@8.57.0)(typescript@5.6.3) @@ -551,7 +554,7 @@ importers: specifier: ^8.12.0 version: 8.17.1 angular-eslint: - specifier: ^19.0.0 + specifier: 19.0.0 version: 19.0.0(chokidar@3.6.0)(eslint@8.57.0)(typescript-eslint@8.16.0(eslint@8.57.0)(typescript@5.6.3))(typescript@5.6.3) autoprefixer: specifier: 10.4.13 @@ -833,8 +836,8 @@ importers: specifier: ^3.10.0 version: 3.13.2(@azure/identity@4.5.0)(@azure/storage-blob@12.25.0)(@parcel/watcher@2.4.1)(@types/node@20.16.10)(encoding@0.1.13)(eslint@8.57.0)(ioredis@5.4.1)(less@4.1.3)(magicast@0.3.5)(optionator@0.9.4)(rollup@4.22.0)(sass@1.55.0)(stylus@0.64.0)(terser@5.36.0)(typescript@5.6.3)(vite@5.0.8(@types/node@20.16.10)(less@4.1.3)(sass@1.55.0)(stylus@0.64.0)(terser@5.36.0))(webpack-sources@3.2.3) nx: - specifier: 20.2.0-beta.3 - version: 20.2.0-beta.3(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)) + specifier: 20.2.0-beta.7 + version: 20.2.0-beta.7(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)) octokit: specifier: ^2.0.14 version: 2.1.0(encoding@0.1.13) @@ -1011,7 +1014,7 @@ importers: version: 5.88.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.19.5)(webpack-cli@5.1.4) webpack-dev-server: specifier: 5.0.4 - version: 5.0.4(webpack-cli@5.1.4)(webpack@5.88.0) + version: 5.0.4(webpack-cli@5.1.4(webpack-dev-server@5.0.4)(webpack@5.88.0))(webpack@5.88.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.19.5)(webpack-cli@5.1.4)) webpack-merge: specifier: ^5.8.0 version: 5.10.0 @@ -5026,48 +5029,43 @@ packages: engines: {node: '>=8.0.0', npm: '>=5.0.0'} hasBin: true - '@nx/angular@20.2.0-beta.3': - resolution: {integrity: sha512-H9oZM+aNg7pJ7kjjCsg77y/XOGJ2RXdX+EPKp6tqbKWIP9dUdN3gp2pHzoLPCvonbLXPHmYDdVy1X3echs02zw==} + '@nx/angular@20.2.0-beta.7': + resolution: {integrity: sha512-WAWUoxD+C0ou389Aa7HIJsd7OYlB2F3N/irhquTouZihgDQgukhf2tjMjgx3JE2i9AqWAT6xBp1IWgfByXuCpw==} peerDependencies: - '@angular-devkit/build-angular': '>= 16.0.0 < 19.0.0' - '@angular-devkit/core': '>= 16.0.0 < 19.0.0' - '@angular-devkit/schematics': '>= 16.0.0 < 19.0.0' - '@schematics/angular': '>= 16.0.0 < 19.0.0' + '@angular-devkit/build-angular': '>= 17.0.0 < 20.0.0' + '@angular-devkit/core': '>= 17.0.0 < 20.0.0' + '@angular-devkit/schematics': '>= 17.0.0 < 20.0.0' + '@schematics/angular': '>= 17.0.0 < 20.0.0' rxjs: ^6.5.3 || ^7.5.0 - '@nx/cypress@20.2.0-beta.3': - resolution: {integrity: sha512-uzA4ql3rrdXmQ5lKj31tL3ROrE045krCX6czc3YqEVHoKc7+/CL9Gy+7ja9MXM7HNpOW6aKkgqDmuk8viNUv1g==} + '@nx/cypress@20.2.0-beta.7': + resolution: {integrity: sha512-zKlryozxNScOpGMCBJigJbF5jKwgYEKgKeG7155oOGVr2Vi6QH6dqZhKzVy0QDIE2l1Wr/cWD2wsQ/444bMWqQ==} peerDependencies: cypress: '>= 3 < 14' peerDependenciesMeta: cypress: optional: true - '@nx/devkit@20.0.7': - resolution: {integrity: sha512-h+B5S+tkHObtKj2pQYUkbiaiYdcim95iS27CaZgasq7FiIXQOoupQ6jrIKduQJKx+GfYbuCCd60zrAYbkyvxiA==} - peerDependencies: - nx: '>= 19 <= 21' - '@nx/devkit@20.1.3': resolution: {integrity: sha512-+bNCRNSHKS7SS4Q2xI/p4hhd4mIibIbeF+hpF3TLO5wxyXbrYGSdhCVK5SwclwWUN/KhcKQjOrVGW5CKAm7HAw==} peerDependencies: nx: '>= 19 <= 21' - '@nx/devkit@20.2.0-beta.3': - resolution: {integrity: sha512-/Bpt8yN6eQ6nLAJoAyXQZ66Dp3D39GHlRiuY/yPw9PFj4kSjHybQYVMGMHb9upQ2gUiHoIIqezASIf/bpj8DyA==} + '@nx/devkit@20.2.0-beta.7': + resolution: {integrity: sha512-DUCw3Yq54ugMm/z7ZZE0j68w6RA88SZ9b2fi2huQnxXJkYh5Pa6f17/vAMLbQp3tcbybjjHcv+sYrWliSAGF+Q==} peerDependencies: nx: '>= 19 <= 21' - '@nx/esbuild@20.2.0-beta.3': - resolution: {integrity: sha512-xS6SFTdMA4sLeXK/b/upZvzWFWAAzGlEtLT2rTr2JccsXPDd1HtGix7S2rgxNwJumpria7Mer7ANgd+zvVO6hw==} + '@nx/esbuild@20.2.0-beta.7': + resolution: {integrity: sha512-UXJNZ9gmoihEkgR8kXtMT5D2Xq8aBXOABualmq7x/+OmtsH+JLZTA0tfD2VrQbcNfyhYyIxhoIi5rACF4Mdrvw==} peerDependencies: esbuild: ~0.19.2 peerDependenciesMeta: esbuild: optional: true - '@nx/eslint-plugin@20.2.0-beta.3': - resolution: {integrity: sha512-77pm92YSIG+NZTPXRvuHzHIwahGplZx8y44OOXi9AjdyDPiEWxW6RQGZF/kGl2+pJsXI41i+F1MVR7XU/iVqBg==} + '@nx/eslint-plugin@20.2.0-beta.7': + resolution: {integrity: sha512-t3SC0V5LKsyDki0fW6tGBbvil42AiLYf72rb4Y5CkfBeO9urfcW17vSHjVFZJ7XdQX1J9CB9BCbJ2aPAAzdHfQ==} peerDependencies: '@typescript-eslint/parser': ^6.13.2 || ^7.0.0 || ^8.0.0 eslint-config-prettier: ^9.0.0 @@ -5075,8 +5073,8 @@ packages: eslint-config-prettier: optional: true - '@nx/eslint@20.2.0-beta.3': - resolution: {integrity: sha512-wsxCKmLZgi4C50K/iHFbXyGSnIYS0SIZHcYFO+jOJA1Wy0nLR/3TCl65G6svRM16uBaEVtk0hyNUDMmIyZ7fUw==} + '@nx/eslint@20.2.0-beta.7': + resolution: {integrity: sha512-C9HNAIsCqkIyf+Do06tCEc75XSvwshwon5yD2zmBbvpZ3SIbSdlIM0NEPWEdMFhbLNbzWuwAbEjPBncwoy2eyw==} peerDependencies: '@zkochan/js-yaml': 0.0.7 eslint: ^8.0.0 || ^9.0.0 @@ -5093,8 +5091,8 @@ packages: react-dom: '>= 18 < 19' react-router-dom: '>= 6 < 7' - '@nx/jest@20.2.0-beta.3': - resolution: {integrity: sha512-6hMeRwKOfJuCYSM7XYaz81d1OVIeIDfP405Hky2fhaDabsCS78sDfRla77Tw25VcFUsDQmbqBZLh+hnAs03xcg==} + '@nx/jest@20.2.0-beta.7': + resolution: {integrity: sha512-3X1KLHSsN026Hl347zaXkIvRIiSJhM/Gy75ensRf2L0LwYJWB2KBwAC+UtWgMIjXjmFN9oE+WCUvymRJhKZE8Q==} '@nx/js@20.1.3': resolution: {integrity: sha512-PS6GjPWS0u37JJ6Gh7MVq+r25p5YRHcm+FlxzIfngDesLB8rZ2GFgztsz2r21WlOncGurDmjzJ8aRKQZNWXl8Q==} @@ -5104,19 +5102,19 @@ packages: verdaccio: optional: true - '@nx/js@20.2.0-beta.3': - resolution: {integrity: sha512-BDFK7tnYZJoXOoHYg4Sub7ATGti9cjAivwtBTdsrED1cWZg80oWfRRCu3sqqXMnGYHgzFMRBltLgOPztC6ee0Q==} + '@nx/js@20.2.0-beta.7': + resolution: {integrity: sha512-AIM4NM5lAU/8ot7bTWdmtjpXMnd0ynhOdV709vIBBledMa84UjvxSPWqNuM2fF6aQ3Dh5Q5URqk5KK5c+9S8Xw==} peerDependencies: verdaccio: ^5.0.4 peerDependenciesMeta: verdaccio: optional: true - '@nx/module-federation@20.2.0-beta.3': - resolution: {integrity: sha512-VbSk6ht3c/m+7ZYWDzxky9QKeZb8xEEQsYJUciEjF87bWXoWH0sYjryAZRJpfptV21YlUiZwR4B9dYwb/dicrQ==} + '@nx/module-federation@20.2.0-beta.7': + resolution: {integrity: sha512-u7m7kHeny68W5bd1wDHPb2DEDvB93BRqI+EvkMRxLNZDbHjsZKprE/klVpxEr5hKzNIE620rGTw9AGpjN6Bjxw==} - '@nx/next@20.2.0-beta.3': - resolution: {integrity: sha512-iU1CqnKWmE35ofPKcVB05pSUafwkrgZcdgV6cYg5tTAm81rjHBCyu5oROumgcv8Y8mYGYgAnDTNTZryDgRAZSg==} + '@nx/next@20.2.0-beta.7': + resolution: {integrity: sha512-BguasNqW8qTOqcrVYSSZbbQUcBDsmAZTosCx0RPeKpDZ7BcDz8l/VIC6+YXszUJNqiuvNhZh+iNhB9ZfoZCb7Q==} peerDependencies: next: '>=14.0.0' @@ -5126,8 +5124,8 @@ packages: cpu: [arm64] os: [darwin] - '@nx/nx-darwin-arm64@20.2.0-beta.3': - resolution: {integrity: sha512-4E8jewQV1oD+2QpWpdX92NAqpf9oWjfUpmz1G3njlEvb2h/cAYCVT+AdluWWI7WEkUT1jAbV3hY9/jVIUW7Hxw==} + '@nx/nx-darwin-arm64@20.2.0-beta.7': + resolution: {integrity: sha512-/xJMwZ3wVbIDfkwneXGljDuBYU8OyT1uYAUIrW8DBe3SpBHU0+N2/y8t4KCJmr7VPmemNhP87ZMtwKF+QxVTlg==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] @@ -5138,8 +5136,8 @@ packages: cpu: [x64] os: [darwin] - '@nx/nx-darwin-x64@20.2.0-beta.3': - resolution: {integrity: sha512-CaHFz75KArEal1HgJEPBj7Z2NsfCifYkJ3vBYAhysbyjzsf0nVJMYqHZC6TyMkhalxWnKe+osathFwXxNeZmPQ==} + '@nx/nx-darwin-x64@20.2.0-beta.7': + resolution: {integrity: sha512-lvIiWO1knESSYqrsJOX7g5mxoqZP+eXV6VK5YFDZoW3EHEE52Wpb7xebaLoRgvZYs/XO+PJ+yPK+PNi3IJzwDQ==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] @@ -5150,8 +5148,8 @@ packages: cpu: [x64] os: [freebsd] - '@nx/nx-freebsd-x64@20.2.0-beta.3': - resolution: {integrity: sha512-owPInETIkvDUUh599rkzOqHWeGJwnmhalhfzNCtIYXtU1k8sAJdLJ+D28114IkLHBZvolMj74/isiiwLDL7P3A==} + '@nx/nx-freebsd-x64@20.2.0-beta.7': + resolution: {integrity: sha512-R+nwvrs77OpwR0fxDHTbWvhtCF6lUM1b+khjW6UdX7uegyp59XJkKtb6TTmXbleSdvVcI/UX9CVVnJtb1WHiUw==} engines: {node: '>= 10'} cpu: [x64] os: [freebsd] @@ -5162,8 +5160,8 @@ packages: cpu: [arm] os: [linux] - '@nx/nx-linux-arm-gnueabihf@20.2.0-beta.3': - resolution: {integrity: sha512-tZHPug+4vcZm2+N7PlfsTIpABee7CqJOrEOBCujm24MuchCH/6U9jHxDg1A+7ySuWDLF6UdrUIGLbOBut9d8uA==} + '@nx/nx-linux-arm-gnueabihf@20.2.0-beta.7': + resolution: {integrity: sha512-VByHV5GikifBBrVFuBSjKlJLw4rd1oOjSToMhAaNmyo+TtKDDdsTgeONl/i8tUaze8iPhdtJpbqI55l9+iBdFg==} engines: {node: '>= 10'} cpu: [arm] os: [linux] @@ -5174,8 +5172,8 @@ packages: cpu: [arm64] os: [linux] - '@nx/nx-linux-arm64-gnu@20.2.0-beta.3': - resolution: {integrity: sha512-o98E210CYWsAMVawEowrRcyqmNrS7/DLVn4SNDjWSM1w8rUW/50NTLk/IS2caG/xxFS5kslDGXH1QDxNeth0ZQ==} + '@nx/nx-linux-arm64-gnu@20.2.0-beta.7': + resolution: {integrity: sha512-z6u4tR/HczSfx5NN8y8xFwC/VCpuXVxdWeaar/moj/GqexeCQafcIpyB4mX6VU6CyVc893wR/YyVtjSYLoQ5Ww==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] @@ -5186,8 +5184,8 @@ packages: cpu: [arm64] os: [linux] - '@nx/nx-linux-arm64-musl@20.2.0-beta.3': - resolution: {integrity: sha512-9aXgdty59YD+ZP9zaQzYLxvqvObPLHN/yHBc0lgNP+qQ9FexGx1b+Gbt9syqqkVFy/BMzXGCrygxBT7LlWdbjg==} + '@nx/nx-linux-arm64-musl@20.2.0-beta.7': + resolution: {integrity: sha512-YmsM9okiiVtIQr0hWcqj2OJ98/90lO9t50qAK/0z2t+YCZgK/o0Z9ferKK7A1jozNnyxgFmcXtb/UCeQ5biCXQ==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] @@ -5198,8 +5196,8 @@ packages: cpu: [x64] os: [linux] - '@nx/nx-linux-x64-gnu@20.2.0-beta.3': - resolution: {integrity: sha512-8wy6OX9tj5J1nRWiMUVAbXQoI4pEiR8ePy9xi1FnA1i9cD3p5oO7fNcRDyjYCneCcPzDo5A/AKaCAFsum1LpjQ==} + '@nx/nx-linux-x64-gnu@20.2.0-beta.7': + resolution: {integrity: sha512-RlyolPta4l4rKye9yB2OG8tdaRFYYbbC5ZZWb9UcdR1N0ZjdBkaL7RVFpt/iy0heeeTmecXnRbWeEf9l3bP9Aw==} engines: {node: '>= 10'} cpu: [x64] os: [linux] @@ -5210,8 +5208,8 @@ packages: cpu: [x64] os: [linux] - '@nx/nx-linux-x64-musl@20.2.0-beta.3': - resolution: {integrity: sha512-TDVa0FQgE1BcgbPK2h11WCbbXRxcRvNLgaLvbuy8w059izOk6Ds5/82mo6ffFnge0wtSbgrE8NvmfTIi4vgXLA==} + '@nx/nx-linux-x64-musl@20.2.0-beta.7': + resolution: {integrity: sha512-+WgupNZxvZaxEqSbATi4/xtJAa2Ckzu74MpmiDWEWGVQOwhmM7obRDvS84DZ2xKWpxMY7q1wmRdmUJ/xlynZBw==} engines: {node: '>= 10'} cpu: [x64] os: [linux] @@ -5222,8 +5220,8 @@ packages: cpu: [arm64] os: [win32] - '@nx/nx-win32-arm64-msvc@20.2.0-beta.3': - resolution: {integrity: sha512-iZNr2niozusvX97zhrvnXn5peYpJ6cbcDNCTEoNN7xOfRyMLqcpuvEHGRuzdCLRB9p7sb6CyAXpyJFx9pLT7QQ==} + '@nx/nx-win32-arm64-msvc@20.2.0-beta.7': + resolution: {integrity: sha512-4XGHkT9aoPZfCRuu0awzITKNoqrrmJtYOUpDfHH1LJsyHcrYozHd/jxjaaXiB+FewK9kIi8rgAHWYhjLT3vxjQ==} engines: {node: '>= 10'} cpu: [arm64] os: [win32] @@ -5234,14 +5232,14 @@ packages: cpu: [x64] os: [win32] - '@nx/nx-win32-x64-msvc@20.2.0-beta.3': - resolution: {integrity: sha512-aUBiuwfVxj2PFlb5tEnh73WIUbg+w7kKaMvkqNIOnRNOQmkebqGwOFiNlCkDtiIIjP3jTVXjqjJh9DO5RwQlsg==} + '@nx/nx-win32-x64-msvc@20.2.0-beta.7': + resolution: {integrity: sha512-+mvMve1e1tjOwuzWEg8607AcvcMe/SnmK6dNUA2OJd/Gcpuz/I8X5iC+KjptEmWqo2b83XQ0wUtIXOXi9IN7yQ==} engines: {node: '>= 10'} cpu: [x64] os: [win32] - '@nx/playwright@20.2.0-beta.3': - resolution: {integrity: sha512-8rzIZ8ljVfWsOqmSUSRPo0lT19oAhTR2nAI25V3wbFwhlErQ7kpgKd45W36Tja1aka729cO3mAH5ACKSujU6wQ==} + '@nx/playwright@20.2.0-beta.7': + resolution: {integrity: sha512-T/Uh92Od8eK0dhaPgmYvH09zXiJSvBdZIB8gm6P1az6GhOpL8+bdFPmIiqPrM4MPcoKUtfiZb6u3HT9fEb7Ekg==} peerDependencies: '@playwright/test': ^1.36.0 peerDependenciesMeta: @@ -5312,35 +5310,35 @@ packages: resolution: {integrity: sha512-fRi2a3Ui7q/A7IqGcc3SOaOI8dydZWago1PFK1h1tRt/h2f0mjtsfVb9nrQ2wOLNL2J8lPVVNqRYJG+fpzcvtA==} engines: {node: '>= 10'} - '@nx/react@20.2.0-beta.3': - resolution: {integrity: sha512-6eLFkC7qoTs0K8J+UX5ycA/UQk7m2EkYzhc8AS+trh+rn/G8xXgk7MdgY7+TUu5CvpoGyVgR3oO9Q2ukeB/3Tg==} + '@nx/react@20.2.0-beta.7': + resolution: {integrity: sha512-6BG9GMDiEretR02Xf6xqd0V0ududtGaZoPEGxFZ0uEUBv4uRzBsMdoPvKH3CdfY7gqxHzZZCPev+9YHTDU0aqA==} - '@nx/rspack@20.2.0-beta.3': - resolution: {integrity: sha512-7CkZXXnlF/nF2eP4O5rUWFMYxqG74OWXjzyjAw2/ZXTZuY+xWsJpxCVNDky2J0rmavyhYhS8FFrHU4TdHZHP9A==} + '@nx/rspack@20.2.0-beta.7': + resolution: {integrity: sha512-J8hT2rGDxLWtInUqyTcXL1qp2qHVIVGwcd6DAmBJCOM1lPUT+qFAqE7g/HyALtvAGmt+15tcxJ0C2YJat3w5/Q==} peerDependencies: '@module-federation/enhanced': ~0.7.6 '@module-federation/node': ~2.6.11 - '@nx/storybook@20.2.0-beta.3': - resolution: {integrity: sha512-WEUoHZu8xdElOrpPGfAz6kCzD+eLQ/3jSu3Wb+4B5iB0IEJt0NW39MEcioCHCv/KJ/XCgMD4Ne6aAizn7t3R8Q==} + '@nx/storybook@20.2.0-beta.7': + resolution: {integrity: sha512-gzrA7sJZqhSLftXey4XaxXJq+S+CZZSHsYA41IkSvtefeVB5/IbfCi+VEqj71x6n80VAPCXACPOhqoWDVjGjjw==} - '@nx/vite@20.2.0-beta.3': - resolution: {integrity: sha512-6/YxsqBAcat3186BnT70vaT/rCBnAATVlyZ3jH8Ux2tfXhApwuSWJMcR3tbKBMgIMgcsj0+gyvLpPX7jWBOvrw==} + '@nx/vite@20.2.0-beta.7': + resolution: {integrity: sha512-cKfCu1LHqyu0S6sfmAuhy8ZPGTSgt9GwDmxuNG9n73m6qD+gcsgtfCdgylpua4v/f84MIYxjxei/2oAD5JM5nA==} peerDependencies: vite: ^5.0.0 vitest: ^1.3.1 || ^2.0.0 - '@nx/web@20.2.0-beta.3': - resolution: {integrity: sha512-quQMgtbKXNwwtWorvCaIAF/yKPlY5aRcqw+HUYVmd1ioiGiWu/a9t8v3WuP7ZiVeuCIERjrZuwgnRyY8g0ybVA==} + '@nx/web@20.2.0-beta.7': + resolution: {integrity: sha512-yKF7YjSEW5GsjKlllR1bam/vZbIMi5McBEvKeCpockNJLz+l6fZsyJsQ4Rdwtj56rxb+1CW3dcKWALeWcNF3iQ==} - '@nx/webpack@20.2.0-beta.3': - resolution: {integrity: sha512-H2i7YKwHpAGrJz9lm6iSRhqzT3x3CRNAeYoNIuKnF9XLcBpBgRLBOkcdwcule5AAaVI6I5aL+k6TuwvHa0xgww==} + '@nx/webpack@20.2.0-beta.7': + resolution: {integrity: sha512-AXdlaTEY9Ve2FN9jjQ8qhiuIwRonOoQwJisVzaCgLu0/rgpH0xuD/Gpa2LDAUpb6zhT+zPCLl61/NQI8ozkKdw==} '@nx/workspace@20.1.3': resolution: {integrity: sha512-YOFzkvCcREG4sYNrW3GukBiXCUjxfe4dN2qgYZJ7p4aGoStgfIntjP0REwbgdrZMPTQi9gfAQo27+wTJ6O0FwA==} - '@nx/workspace@20.2.0-beta.3': - resolution: {integrity: sha512-yyBtoCtuyZvUUzYFB5P6IXtg8irEyGb7JAnjoObtIHPcSvfUm7HTejvVgnmeX15qHxxnCvqe5BrWC8svn6+5IQ==} + '@nx/workspace@20.2.0-beta.7': + resolution: {integrity: sha512-CNkpEZNmC0XOPJCrM2cpc8m+uv5fbFOb+TdxmdVL400+c1Z6sDCb8C4nV9etY9uU8sXUEOPRFcV8qURO0CnzbA==} '@octokit/app@13.1.8': resolution: {integrity: sha512-bCncePMguVyFpdBbnceFKfmPOuUD94T189GuQ0l00ZcQ+mX4hyPqnaWJlsXE2HSdA71eV7p8GPDZ+ErplTkzow==} @@ -6194,8 +6192,8 @@ packages: engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true - '@rspack/binding-darwin-arm64@1.1.2': - resolution: {integrity: sha512-Ay4Srve6U3pDFCsmwVJ1PHHKyeURO/iNU1pjiH986Q30bHDozfHWxCjcy0BJnK4CI4HcSaMQi5YF6BMps3ayuQ==} + '@rspack/binding-darwin-arm64@1.1.3': + resolution: {integrity: sha512-gpLUBMDAS/uEcnE+ODy1ILTeyp1oM4QCq8rRhKHuOfsIe1AZ9Mct59v2omIE/r+R4dnbJ0ikIpto9qJZ6P2u1A==} cpu: [arm64] os: [darwin] @@ -6204,8 +6202,8 @@ packages: cpu: [arm64] os: [darwin] - '@rspack/binding-darwin-x64@1.1.2': - resolution: {integrity: sha512-s/Mepgi8SHs75QNCtnHo/ua4fAsAz3JdJ6EfdkTmODCE2GwExXy43xl0qWhlzN1FDHnRFIZ0k6tWE0K+uCbKpQ==} + '@rspack/binding-darwin-x64@1.1.3': + resolution: {integrity: sha512-m1G7SzkRfr1oLgghbAxUwj1J7hSKhtskQZiVeqe5tewKimFr6xLpKSTLTnEtlW0gdGNf1+dRMX/4kLMwhOdY7g==} cpu: [x64] os: [darwin] @@ -6214,8 +6212,8 @@ packages: cpu: [x64] os: [darwin] - '@rspack/binding-linux-arm64-gnu@1.1.2': - resolution: {integrity: sha512-x2JgHIAKY9CaCt5Q0EwlomyfhLYUOJ7PRUy85axROvMAPRnyRmcDr2OYQPa4KSQ+nDvF7m5SVmchHhepaORwaw==} + '@rspack/binding-linux-arm64-gnu@1.1.3': + resolution: {integrity: sha512-MpOrO1oppxAm8J1ztNz6G5DG/oL9ZLHmIz9vYNV6PKnk+MPhCXqfhFmQ2hZm5VIVKuOobfYEJiDUqKg2MLg8gA==} cpu: [arm64] os: [linux] @@ -6224,8 +6222,8 @@ packages: cpu: [arm64] os: [linux] - '@rspack/binding-linux-arm64-musl@1.1.2': - resolution: {integrity: sha512-kvikjjzErfJEGldJnBTRPSkXcoICaW1PUkicVZJGYcpS6AmXz9OdbHsBKhBvJFCP+BoAHRpK10L0DAydF9kSfg==} + '@rspack/binding-linux-arm64-musl@1.1.3': + resolution: {integrity: sha512-PnUDC1JxT6a5hJW0hhJ9ubWk3R+nk7eLXyNaORHyQH4k8o89Zm5GYoKnDgO4eRy41NB9/aBJQJRGSRn0iAsZgw==} cpu: [arm64] os: [linux] @@ -6234,8 +6232,8 @@ packages: cpu: [arm64] os: [linux] - '@rspack/binding-linux-x64-gnu@1.1.2': - resolution: {integrity: sha512-wg5n7qTl0NRGL+7dzrZcKObM18GKMQDL5Ke7cEWmdHooH0rlyYK6ExIqzE5u/3GJ7KYBlDj/IgAMu5KLd8Ygjw==} + '@rspack/binding-linux-x64-gnu@1.1.3': + resolution: {integrity: sha512-+6JgyKXOp2QrHzlru95mge70tDkYlaY4NNE9xyrdj6PgTnM9cVPx4sLVhHC9+tWXaTFnccfEe9Tt6LjKnjHGaA==} cpu: [x64] os: [linux] @@ -6244,8 +6242,8 @@ packages: cpu: [x64] os: [linux] - '@rspack/binding-linux-x64-musl@1.1.2': - resolution: {integrity: sha512-1705atWiL6mo0KVRUoRcn5SFirUAJhREENzsQSucIYyHOX5bKjPDrd+7SAOSLOGc/yGJSmWZv6NzEH/WvY8TeA==} + '@rspack/binding-linux-x64-musl@1.1.3': + resolution: {integrity: sha512-X0TJTVL1Roqq/tvN26QO4u62x2xp5tE0dlhwhbeCHrBdgBzc+PHvcv/8lclRcq6lDPzceAgcnNX/+RbWg0DzKg==} cpu: [x64] os: [linux] @@ -6254,8 +6252,8 @@ packages: cpu: [x64] os: [linux] - '@rspack/binding-win32-arm64-msvc@1.1.2': - resolution: {integrity: sha512-DL9v6PAlC0dZnAjwNpdv5JyebidIctLTRCXO6q3bVL03i0jSyX5gRnd6YM5A9176M5HLBnSJjgujqhCffeFA3g==} + '@rspack/binding-win32-arm64-msvc@1.1.3': + resolution: {integrity: sha512-Lvpp5Q30YiPNkuOFPawp2al2CTWElPeG3X0E9LFIfPdVkLc/e2nkf5a6zSYtnbD2oaskzQIYN/k27fWqWWcVHA==} cpu: [arm64] os: [win32] @@ -6264,8 +6262,8 @@ packages: cpu: [arm64] os: [win32] - '@rspack/binding-win32-ia32-msvc@1.1.2': - resolution: {integrity: sha512-RluX7GENVpophR5BB4v0XxqffpGpBLTJDwoQBY0LjfOTGpLv8A0zrGIOMUsJGKE10MOlNfTUQOyB+p6sxLJzcQ==} + '@rspack/binding-win32-ia32-msvc@1.1.3': + resolution: {integrity: sha512-tC+xXcbTRX7l+NFnlGK8UhDIJrKma7S/MA1KDol23/I3Vw67EcaHDwG+q2v7uiJsxn9XooIOSCJhPKmUUfZNXg==} cpu: [ia32] os: [win32] @@ -6274,8 +6272,8 @@ packages: cpu: [ia32] os: [win32] - '@rspack/binding-win32-x64-msvc@1.1.2': - resolution: {integrity: sha512-fXg6y/IajuYyBy3oOsat20U+CLrDK/l4FLdg8ETfDPb5isD7jcmhyWXBeJVZVcwHT+Sj1LnLLUuhc+FGFk4aeA==} + '@rspack/binding-win32-x64-msvc@1.1.3': + resolution: {integrity: sha512-jeRaPJtsD/+m1QINgoDMA6D3kOcTwSHVmGSxR6fznLA5BKa76m8lewuALYxHHq9/qcgwJ4e6UtiwrO2JL3vxVQ==} cpu: [x64] os: [win32] @@ -6284,14 +6282,14 @@ packages: cpu: [x64] os: [win32] - '@rspack/binding@1.1.2': - resolution: {integrity: sha512-HUE7EPvrgbabbhW635wSrthidZY1Kijk6+rvmTFuxzmxsBtZNcrhUFVw7Z1fwa2fykiOhbot61EDV9X1qoIa4g==} + '@rspack/binding@1.1.3': + resolution: {integrity: sha512-fB1ziJ1UXO2P4ZDO+dviSNuxknUqrz6QQ6QGfpC+S1ClUy1HOhHXss/Yn78B/R9py6dlqZzmhmhz2d+XzFVApA==} '@rspack/binding@1.1.5': resolution: {integrity: sha512-RsSkgi56Q5XUXut0qweLSE1C4Ogcm7g/ueKoOgsbHAYVKrCs9/dTFlPHWSIAaI7QWh0GWEePR/MM2O2HIu+1rw==} - '@rspack/core@1.1.2': - resolution: {integrity: sha512-cXYPImNpHl2nZmWcMv7WHsorkOaIZP9csPc2J8WxEJhOEotcgP33TKmRTAfJYszV4cqUuKbVjLMv0WgX1OeftQ==} + '@rspack/core@1.1.3': + resolution: {integrity: sha512-LdM1mAlBtEh9ozbpyWVW5uuL+aJMjYqd531pH5/i/EPDKNrOLrQWVNMa2dh07qLwJZXoTFMf7LWA7QNsmBUPJg==} engines: {node: '>=16.0.0'} peerDependencies: '@swc/helpers': '>=0.5.1' @@ -7284,17 +7282,6 @@ packages: typescript: optional: true - '@typescript-eslint/eslint-plugin@8.6.0': - resolution: {integrity: sha512-UOaz/wFowmoh2G6Mr9gw60B1mm0MzUtm6Ic8G2yM1Le6gyj5Loi/N+O5mocugRGY+8OeeKmkMmbxNqUCq3B4Sg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0 - eslint: ^8.57.0 || ^9.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - '@typescript-eslint/parser@8.16.0': resolution: {integrity: sha512-D7DbgGFtsqIPIFMPJwCad9Gfi/hC0PWErRRHFnaCWoEDYi5tQUDiJCTmGUbBiLzjqAck4KcXt9Ayj0CNlIrF+w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -7343,15 +7330,6 @@ packages: typescript: optional: true - '@typescript-eslint/type-utils@8.6.0': - resolution: {integrity: sha512-dtePl4gsuenXVwC7dVNlb4mGDcKjDT/Ropsk4za/ouMBPplCLyznIaR+W65mvCvsyS97dymoBRrioEXI7k0XIg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - '@typescript-eslint/types@5.62.0': resolution: {integrity: sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -7407,12 +7385,6 @@ packages: typescript: optional: true - '@typescript-eslint/utils@8.6.0': - resolution: {integrity: sha512-eNp9cWnYf36NaOVjkEUznf6fEgVy1TWpE0o52e4wtojjBx7D1UV2WAWGzR+8Y5lVFtpMLPwNbC67T83DWSph4A==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 - '@typescript-eslint/visitor-keys@5.62.0': resolution: {integrity: sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -13306,8 +13278,8 @@ packages: '@swc/core': optional: true - nx@20.2.0-beta.3: - resolution: {integrity: sha512-wPHZOvIaFKoxNhVfJnM3pLtL/EOtomKc0avJhyMBXlRonwF1QhRu4G+Yfj/g9iQ10KAk4FR9BB1VUrwmjxar/Q==} + nx@20.2.0-beta.7: + resolution: {integrity: sha512-4moUsRIEz+hLIaAZQPPVu1aJYkVfZ6RvOuSUCmNIh2VyWS0G1ADOhsZZU+dPZzICHPEqn+7GgPGnUiKqhGBgRg==} hasBin: true peerDependencies: '@swc-node/register': ^1.8.0 @@ -16590,11 +16562,6 @@ packages: engines: {node: '>=14.17'} hasBin: true - typescript@5.4.5: - resolution: {integrity: sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==} - engines: {node: '>=14.17'} - hasBin: true - typescript@5.6.3: resolution: {integrity: sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==} engines: {node: '>=14.17'} @@ -18314,7 +18281,7 @@ snapshots: dependencies: '@babel/helper-validator-identifier': 7.25.9 js-tokens: 4.0.0 - picocolors: 1.1.0 + picocolors: 1.1.1 '@babel/compat-data@7.25.4': {} @@ -18426,6 +18393,32 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/helper-create-class-features-plugin@7.25.4(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-annotate-as-pure': 7.24.7 + '@babel/helper-member-expression-to-functions': 7.24.8 + '@babel/helper-optimise-call-expression': 7.24.7 + '@babel/helper-replace-supers': 7.25.0(@babel/core@7.26.0) + '@babel/helper-skip-transparent-expression-wrappers': 7.24.7 + '@babel/traverse': 7.25.6 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/helper-create-class-features-plugin@7.25.9(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-annotate-as-pure': 7.25.9 + '@babel/helper-member-expression-to-functions': 7.25.9 + '@babel/helper-optimise-call-expression': 7.25.9 + '@babel/helper-replace-supers': 7.25.9(@babel/core@7.25.2) + '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 + '@babel/traverse': 7.25.9 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + '@babel/helper-create-class-features-plugin@7.25.9(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 @@ -18484,8 +18477,8 @@ snapshots: '@babel/helper-member-expression-to-functions@7.24.8': dependencies: - '@babel/traverse': 7.25.6 - '@babel/types': 7.25.6 + '@babel/traverse': 7.25.9 + '@babel/types': 7.26.0 transitivePeerDependencies: - supports-color @@ -18520,6 +18513,16 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/helper-module-transforms@7.25.2(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-module-imports': 7.24.7 + '@babel/helper-simple-access': 7.24.7 + '@babel/helper-validator-identifier': 7.24.7 + '@babel/traverse': 7.25.6 + transitivePeerDependencies: + - supports-color + '@babel/helper-module-transforms@7.26.0(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 @@ -18531,7 +18534,7 @@ snapshots: '@babel/helper-optimise-call-expression@7.24.7': dependencies: - '@babel/types': 7.25.6 + '@babel/types': 7.26.0 '@babel/helper-optimise-call-expression@7.25.9': dependencies: @@ -18564,7 +18567,25 @@ snapshots: '@babel/core': 7.25.2 '@babel/helper-member-expression-to-functions': 7.24.8 '@babel/helper-optimise-call-expression': 7.24.7 - '@babel/traverse': 7.25.6 + '@babel/traverse': 7.25.9 + transitivePeerDependencies: + - supports-color + + '@babel/helper-replace-supers@7.25.0(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-member-expression-to-functions': 7.24.8 + '@babel/helper-optimise-call-expression': 7.24.7 + '@babel/traverse': 7.25.9 + transitivePeerDependencies: + - supports-color + + '@babel/helper-replace-supers@7.25.9(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-member-expression-to-functions': 7.25.9 + '@babel/helper-optimise-call-expression': 7.25.9 + '@babel/traverse': 7.25.9 transitivePeerDependencies: - supports-color @@ -18652,7 +18673,7 @@ snapshots: '@babel/helper-validator-identifier': 7.24.7 chalk: 2.4.2 js-tokens: 4.0.0 - picocolors: 1.1.0 + picocolors: 1.1.1 '@babel/parser@7.25.6': dependencies: @@ -18735,12 +18756,21 @@ snapshots: '@babel/plugin-proposal-decorators@7.24.7(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-create-class-features-plugin': 7.25.4(@babel/core@7.25.2) - '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-create-class-features-plugin': 7.25.9(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.25.9 '@babel/plugin-syntax-decorators': 7.24.7(@babel/core@7.25.2) transitivePeerDependencies: - supports-color + '@babel/plugin-proposal-decorators@7.24.7(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-create-class-features-plugin': 7.25.9(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-syntax-decorators': 7.24.7(@babel/core@7.26.0) + transitivePeerDependencies: + - supports-color + '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 @@ -18774,6 +18804,11 @@ snapshots: '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 + '@babel/plugin-syntax-decorators@7.24.7(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 @@ -18799,6 +18834,11 @@ snapshots: '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 + '@babel/plugin-syntax-import-attributes@7.25.6(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/plugin-syntax-import-attributes@7.26.0(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 @@ -18809,6 +18849,11 @@ snapshots: '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 + '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 @@ -18819,6 +18864,11 @@ snapshots: '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 + '@babel/plugin-syntax-jsx@7.24.7(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 @@ -18864,6 +18914,11 @@ snapshots: '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 + '@babel/plugin-syntax-typescript@7.25.4(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 @@ -19195,6 +19250,15 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/plugin-transform-modules-commonjs@7.24.8(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-module-transforms': 7.25.2(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-simple-access': 7.24.7 + transitivePeerDependencies: + - supports-color + '@babel/plugin-transform-modules-commonjs@7.25.9(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 @@ -19551,6 +19615,17 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/plugin-transform-typescript@7.25.2(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-annotate-as-pure': 7.24.7 + '@babel/helper-create-class-features-plugin': 7.25.4(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-skip-transparent-expression-wrappers': 7.24.7 + '@babel/plugin-syntax-typescript': 7.25.4(@babel/core@7.26.0) + transitivePeerDependencies: + - supports-color + '@babel/plugin-transform-unicode-escapes@7.24.7(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 @@ -19798,6 +19873,17 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/preset-typescript@7.24.7(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-validator-option': 7.24.8 + '@babel/plugin-syntax-jsx': 7.24.7(@babel/core@7.26.0) + '@babel/plugin-transform-modules-commonjs': 7.24.8(@babel/core@7.26.0) + '@babel/plugin-transform-typescript': 7.25.2(@babel/core@7.26.0) + transitivePeerDependencies: + - supports-color + '@babel/regjsgen@0.8.0': {} '@babel/runtime@7.25.6': @@ -20009,7 +20095,7 @@ snapshots: '@emnapi/wasi-threads@1.0.1': dependencies: - tslib: 2.7.0 + tslib: 2.8.1 '@emotion/hash@0.9.2': {} @@ -20910,21 +20996,21 @@ snapshots: '@jsdevtools/ono@7.1.3': {} - '@jsonjoy.com/base64@1.1.2(tslib@2.7.0)': + '@jsonjoy.com/base64@1.1.2(tslib@2.8.1)': dependencies: - tslib: 2.7.0 + tslib: 2.8.1 - '@jsonjoy.com/json-pack@1.1.0(tslib@2.7.0)': + '@jsonjoy.com/json-pack@1.1.0(tslib@2.8.1)': dependencies: - '@jsonjoy.com/base64': 1.1.2(tslib@2.7.0) - '@jsonjoy.com/util': 1.3.0(tslib@2.7.0) + '@jsonjoy.com/base64': 1.1.2(tslib@2.8.1) + '@jsonjoy.com/util': 1.3.0(tslib@2.8.1) hyperdyperid: 1.2.0 - thingies: 1.21.0(tslib@2.7.0) - tslib: 2.7.0 + thingies: 1.21.0(tslib@2.8.1) + tslib: 2.8.1 - '@jsonjoy.com/util@1.3.0(tslib@2.7.0)': + '@jsonjoy.com/util@1.3.0(tslib@2.8.1)': dependencies: - tslib: 2.7.0 + tslib: 2.8.1 '@jspm/core@2.0.1': {} @@ -21216,11 +21302,11 @@ snapshots: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - '@monodon/rust@2.1.1(@napi-rs/cli@3.0.0-alpha.56(@emnapi/runtime@1.2.0)(emnapi@1.3.1(node-addon-api@7.1.1)))(nx@20.2.0-beta.3(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))': + '@monodon/rust@2.1.1(@napi-rs/cli@3.0.0-alpha.56(@emnapi/runtime@1.2.0)(emnapi@1.3.1(node-addon-api@7.1.1)))(nx@20.2.0-beta.7(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))': dependencies: '@ltd/j-toml': 1.38.0 '@napi-rs/cli': 3.0.0-alpha.56(@emnapi/runtime@1.2.0)(emnapi@1.3.1(node-addon-api@7.1.1)) - '@nx/devkit': 20.0.7(nx@20.2.0-beta.3(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))) + '@nx/devkit': 20.1.3(nx@20.2.0-beta.7(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))) chalk: 4.1.2 npm-run-path: 4.0.1 semver: 7.5.4 @@ -22111,29 +22197,28 @@ snapshots: transitivePeerDependencies: - encoding - '@nx/angular@20.2.0-beta.3(dtud7qphu6hdicss76tjbn32se)': + '@nx/angular@20.2.0-beta.7(s6tacdgbduxi2uiacc6ijnz6ge)': dependencies: '@angular-devkit/build-angular': 19.0.2(vsrtc4j5b2tjebunq4fmj5q5sy) '@angular-devkit/core': 19.0.2(chokidar@3.6.0) '@angular-devkit/schematics': 19.0.2(chokidar@3.6.0) - '@nx/devkit': 20.2.0-beta.3(nx@20.2.0-beta.3(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))) - '@nx/eslint': 20.2.0-beta.3(@babel/traverse@7.25.9)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(@zkochan/js-yaml@0.0.7)(eslint@8.57.0)(nx@20.2.0-beta.3(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(verdaccio@5.32.2(encoding@0.1.13)(typanion@3.14.0)) - '@nx/js': 20.2.0-beta.3(@babel/traverse@7.25.9)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(nx@20.2.0-beta.3(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(typescript@5.6.3)(verdaccio@5.32.2(encoding@0.1.13)(typanion@3.14.0)) - '@nx/module-federation': 20.2.0-beta.3(@babel/traverse@7.25.9)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/helpers@0.5.11)(@types/node@20.16.10)(esbuild@0.19.5)(next@14.2.16(@babel/core@7.25.2)(@playwright/test@1.47.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.55.0))(nx@20.2.0-beta.3(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)(verdaccio@5.32.2(encoding@0.1.13)(typanion@3.14.0))(webpack-cli@5.1.4(webpack-dev-server@5.0.4)(webpack@5.88.0)) - '@nx/web': 20.2.0-beta.3(@babel/traverse@7.25.9)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(nx@20.2.0-beta.3(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(typescript@5.6.3)(verdaccio@5.32.2(encoding@0.1.13)(typanion@3.14.0)) - '@nx/webpack': 20.2.0-beta.3(@babel/traverse@7.25.9)(@rspack/core@1.1.5(@swc/helpers@0.5.11))(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(esbuild@0.19.5)(html-webpack-plugin@5.5.0(webpack@5.88.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.19.5)(webpack-cli@5.1.4)))(nx@20.2.0-beta.3(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(typescript@5.6.3)(verdaccio@5.32.2(encoding@0.1.13)(typanion@3.14.0))(webpack-cli@5.1.4(webpack-dev-server@5.0.4)(webpack@5.88.0)) - '@nx/workspace': 20.2.0-beta.3(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)) + '@nx/devkit': 20.2.0-beta.7(nx@20.2.0-beta.7(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))) + '@nx/eslint': 20.2.0-beta.7(@babel/traverse@7.25.9)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(@zkochan/js-yaml@0.0.7)(eslint@8.57.0)(nx@20.2.0-beta.7(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(verdaccio@5.32.2(encoding@0.1.13)(typanion@3.14.0)) + '@nx/js': 20.2.0-beta.7(@babel/traverse@7.25.9)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(nx@20.2.0-beta.7(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(typescript@5.6.3)(verdaccio@5.32.2(encoding@0.1.13)(typanion@3.14.0)) + '@nx/module-federation': 20.2.0-beta.7(@babel/traverse@7.25.9)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/helpers@0.5.11)(@types/node@20.16.10)(esbuild@0.19.5)(next@14.2.16(@babel/core@7.25.2)(@playwright/test@1.47.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.55.0))(nx@20.2.0-beta.7(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)(verdaccio@5.32.2(encoding@0.1.13)(typanion@3.14.0))(webpack-cli@5.1.4(webpack-dev-server@5.0.4)(webpack@5.88.0)) + '@nx/web': 20.2.0-beta.7(@babel/traverse@7.25.9)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(nx@20.2.0-beta.7(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(typescript@5.6.3)(verdaccio@5.32.2(encoding@0.1.13)(typanion@3.14.0)) + '@nx/webpack': 20.2.0-beta.7(@babel/traverse@7.25.9)(@rspack/core@1.1.5(@swc/helpers@0.5.11))(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(esbuild@0.19.5)(html-webpack-plugin@5.5.0(webpack@5.88.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.19.5)(webpack-cli@5.1.4)))(nx@20.2.0-beta.7(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(typescript@5.6.3)(verdaccio@5.32.2(encoding@0.1.13)(typanion@3.14.0))(webpack-cli@5.1.4(webpack-dev-server@5.0.4)(webpack@5.88.0)) + '@nx/workspace': 20.2.0-beta.7(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)) '@phenomnomnominal/tsquery': 5.0.1(typescript@5.6.3) '@schematics/angular': 19.0.2(chokidar@3.6.0) '@typescript-eslint/type-utils': 8.16.0(eslint@8.57.0)(typescript@5.6.3) chalk: 4.1.2 - find-cache-dir: 3.3.2 - magic-string: 0.30.11 + magic-string: 0.30.12 minimatch: 9.0.3 piscina: 4.7.0 rxjs: 7.8.1 semver: 7.6.3 - tslib: 2.7.0 + tslib: 2.8.1 webpack-merge: 5.10.0 transitivePeerDependencies: - '@babel/traverse' @@ -22170,14 +22255,14 @@ snapshots: - vue-tsc - webpack-cli - '@nx/cypress@20.2.0-beta.3(@babel/traverse@7.25.9)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(@zkochan/js-yaml@0.0.7)(cypress@13.13.0)(eslint@8.57.0)(nx@20.2.0-beta.3(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(typescript@5.6.3)(verdaccio@5.32.2(encoding@0.1.13)(typanion@3.14.0))': + '@nx/cypress@20.2.0-beta.7(@babel/traverse@7.25.9)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(@zkochan/js-yaml@0.0.7)(cypress@13.13.0)(eslint@8.57.0)(nx@20.2.0-beta.7(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(typescript@5.6.3)(verdaccio@5.32.2(encoding@0.1.13)(typanion@3.14.0))': dependencies: - '@nx/devkit': 20.2.0-beta.3(nx@20.2.0-beta.3(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))) - '@nx/eslint': 20.2.0-beta.3(@babel/traverse@7.25.9)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(@zkochan/js-yaml@0.0.7)(eslint@8.57.0)(nx@20.2.0-beta.3(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(verdaccio@5.32.2(encoding@0.1.13)(typanion@3.14.0)) - '@nx/js': 20.2.0-beta.3(@babel/traverse@7.25.9)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(nx@20.2.0-beta.3(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(typescript@5.6.3)(verdaccio@5.32.2(encoding@0.1.13)(typanion@3.14.0)) + '@nx/devkit': 20.2.0-beta.7(nx@20.2.0-beta.7(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))) + '@nx/eslint': 20.2.0-beta.7(@babel/traverse@7.25.9)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(@zkochan/js-yaml@0.0.7)(eslint@8.57.0)(nx@20.2.0-beta.7(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(verdaccio@5.32.2(encoding@0.1.13)(typanion@3.14.0)) + '@nx/js': 20.2.0-beta.7(@babel/traverse@7.25.9)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(nx@20.2.0-beta.7(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(typescript@5.6.3)(verdaccio@5.32.2(encoding@0.1.13)(typanion@3.14.0)) '@phenomnomnominal/tsquery': 5.0.1(typescript@5.6.3) detect-port: 1.6.1 - tslib: 2.7.0 + tslib: 2.8.1 optionalDependencies: cypress: 13.13.0 transitivePeerDependencies: @@ -22194,18 +22279,6 @@ snapshots: - typescript - verdaccio - '@nx/devkit@20.0.7(nx@20.2.0-beta.3(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))': - dependencies: - ejs: 3.1.10 - enquirer: 2.3.6 - ignore: 5.3.2 - minimatch: 9.0.3 - nx: 20.2.0-beta.3(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)) - semver: 7.6.3 - tmp: 0.2.3 - tslib: 2.7.0 - yargs-parser: 21.1.1 - '@nx/devkit@20.1.3(nx@20.1.3(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))': dependencies: ejs: 3.1.10 @@ -22215,41 +22288,41 @@ snapshots: nx: 20.1.3(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)) semver: 7.6.3 tmp: 0.2.3 - tslib: 2.7.0 + tslib: 2.8.1 yargs-parser: 21.1.1 - '@nx/devkit@20.1.3(nx@20.2.0-beta.3(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))': + '@nx/devkit@20.1.3(nx@20.2.0-beta.7(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))': dependencies: ejs: 3.1.10 enquirer: 2.3.6 ignore: 5.3.2 minimatch: 9.0.3 - nx: 20.2.0-beta.3(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)) + nx: 20.2.0-beta.7(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)) semver: 7.6.3 tmp: 0.2.3 - tslib: 2.7.0 + tslib: 2.8.1 yargs-parser: 21.1.1 - '@nx/devkit@20.2.0-beta.3(nx@20.2.0-beta.3(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))': + '@nx/devkit@20.2.0-beta.7(nx@20.2.0-beta.7(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))': dependencies: ejs: 3.1.10 enquirer: 2.3.6 ignore: 5.3.2 minimatch: 9.0.3 - nx: 20.2.0-beta.3(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)) + nx: 20.2.0-beta.7(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)) semver: 7.6.3 tmp: 0.2.3 - tslib: 2.7.0 + tslib: 2.8.1 yargs-parser: 21.1.1 - '@nx/esbuild@20.2.0-beta.3(@babel/traverse@7.25.9)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(esbuild@0.19.5)(nx@20.2.0-beta.3(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(typescript@5.6.3)(verdaccio@5.32.2(encoding@0.1.13)(typanion@3.14.0))': + '@nx/esbuild@20.2.0-beta.7(@babel/traverse@7.25.9)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(esbuild@0.19.5)(nx@20.2.0-beta.7(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(typescript@5.6.3)(verdaccio@5.32.2(encoding@0.1.13)(typanion@3.14.0))': dependencies: - '@nx/devkit': 20.2.0-beta.3(nx@20.2.0-beta.3(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))) - '@nx/js': 20.2.0-beta.3(@babel/traverse@7.25.9)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(nx@20.2.0-beta.3(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(typescript@5.6.3)(verdaccio@5.32.2(encoding@0.1.13)(typanion@3.14.0)) + '@nx/devkit': 20.2.0-beta.7(nx@20.2.0-beta.7(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))) + '@nx/js': 20.2.0-beta.7(@babel/traverse@7.25.9)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(nx@20.2.0-beta.7(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(typescript@5.6.3)(verdaccio@5.32.2(encoding@0.1.13)(typanion@3.14.0)) fast-glob: 3.2.7 - picocolors: 1.1.0 + picocolors: 1.1.1 tsconfig-paths: 4.2.0 - tslib: 2.7.0 + tslib: 2.8.1 optionalDependencies: esbuild: 0.19.5 transitivePeerDependencies: @@ -22264,10 +22337,10 @@ snapshots: - typescript - verdaccio - '@nx/eslint-plugin@20.2.0-beta.3(@babel/traverse@7.25.9)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(@typescript-eslint/parser@8.16.0(eslint@8.57.0)(typescript@5.6.3))(eslint-config-prettier@9.1.0(eslint@8.57.0))(eslint@8.57.0)(nx@20.2.0-beta.3(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(typescript@5.6.3)(verdaccio@5.32.2(encoding@0.1.13)(typanion@3.14.0))': + '@nx/eslint-plugin@20.2.0-beta.7(@babel/traverse@7.25.9)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(@typescript-eslint/parser@8.16.0(eslint@8.57.0)(typescript@5.6.3))(eslint-config-prettier@9.1.0(eslint@8.57.0))(eslint@8.57.0)(nx@20.2.0-beta.7(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(typescript@5.6.3)(verdaccio@5.32.2(encoding@0.1.13)(typanion@3.14.0))': dependencies: - '@nx/devkit': 20.2.0-beta.3(nx@20.2.0-beta.3(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))) - '@nx/js': 20.2.0-beta.3(@babel/traverse@7.25.9)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(nx@20.2.0-beta.3(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(typescript@5.6.3)(verdaccio@5.32.2(encoding@0.1.13)(typanion@3.14.0)) + '@nx/devkit': 20.2.0-beta.7(nx@20.2.0-beta.7(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))) + '@nx/js': 20.2.0-beta.7(@babel/traverse@7.25.9)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(nx@20.2.0-beta.7(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(typescript@5.6.3)(verdaccio@5.32.2(encoding@0.1.13)(typanion@3.14.0)) '@typescript-eslint/parser': 8.16.0(eslint@8.57.0)(typescript@5.6.3) '@typescript-eslint/type-utils': 8.16.0(eslint@8.57.0)(typescript@5.6.3) '@typescript-eslint/utils': 8.16.0(eslint@8.57.0)(typescript@5.6.3) @@ -22276,7 +22349,7 @@ snapshots: globals: 15.9.0 jsonc-eslint-parser: 2.4.0 semver: 7.6.3 - tslib: 2.7.0 + tslib: 2.8.1 optionalDependencies: eslint-config-prettier: 9.1.0(eslint@8.57.0) transitivePeerDependencies: @@ -22292,14 +22365,14 @@ snapshots: - typescript - verdaccio - '@nx/eslint@20.2.0-beta.3(@babel/traverse@7.25.9)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(@zkochan/js-yaml@0.0.7)(eslint@8.57.0)(nx@20.2.0-beta.3(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(verdaccio@5.32.2(encoding@0.1.13)(typanion@3.14.0))': + '@nx/eslint@20.2.0-beta.7(@babel/traverse@7.25.9)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(@zkochan/js-yaml@0.0.7)(eslint@8.57.0)(nx@20.2.0-beta.7(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(verdaccio@5.32.2(encoding@0.1.13)(typanion@3.14.0))': dependencies: - '@nx/devkit': 20.2.0-beta.3(nx@20.2.0-beta.3(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))) - '@nx/js': 20.2.0-beta.3(@babel/traverse@7.25.9)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(nx@20.2.0-beta.3(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(typescript@5.4.5)(verdaccio@5.32.2(encoding@0.1.13)(typanion@3.14.0)) + '@nx/devkit': 20.2.0-beta.7(nx@20.2.0-beta.7(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))) + '@nx/js': 20.2.0-beta.7(@babel/traverse@7.25.9)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(nx@20.2.0-beta.7(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(typescript@5.6.3)(verdaccio@5.32.2(encoding@0.1.13)(typanion@3.14.0)) eslint: 8.57.0 semver: 7.6.3 - tslib: 2.7.0 - typescript: 5.4.5 + tslib: 2.8.1 + typescript: 5.6.3 optionalDependencies: '@zkochan/js-yaml': 0.0.7 transitivePeerDependencies: @@ -22313,29 +22386,29 @@ snapshots: - supports-color - verdaccio - '@nx/graph@0.1.0(@nx/devkit@20.2.0-beta.3(nx@20.2.0-beta.3(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))))(nx@20.2.0-beta.3(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(react-dom@18.3.1(react@18.3.1))(react-router-dom@6.26.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)': + '@nx/graph@0.1.0(@nx/devkit@20.2.0-beta.7(nx@20.2.0-beta.7(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))))(nx@20.2.0-beta.7(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(react-dom@18.3.1(react@18.3.1))(react-router-dom@6.26.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)': dependencies: '@floating-ui/react': 0.26.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@headlessui/react': 1.7.19(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@heroicons/react': 2.1.5(react@18.3.1) - '@nx/devkit': 20.2.0-beta.3(nx@20.2.0-beta.3(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))) + '@nx/devkit': 20.2.0-beta.7(nx@20.2.0-beta.7(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))) classnames: 2.5.1 cytoscape: 3.30.2 cytoscape-dagre: 2.5.0(cytoscape@3.30.2) cytoscape-popper: 2.0.0(cytoscape@3.30.2) - nx: 20.2.0-beta.3(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)) + nx: 20.2.0-beta.7(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)) react: 18.3.1 react-copy-to-clipboard: 5.1.0(react@18.3.1) react-dom: 18.3.1(react@18.3.1) react-router-dom: 6.26.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) tailwind-merge: 2.5.2 - '@nx/jest@20.2.0-beta.3(@babel/traverse@7.25.9)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(nx@20.2.0-beta.3(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(ts-node@10.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(typescript@5.6.3))(typescript@5.6.3)(verdaccio@5.32.2(encoding@0.1.13)(typanion@3.14.0))': + '@nx/jest@20.2.0-beta.7(@babel/traverse@7.25.9)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(nx@20.2.0-beta.7(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(ts-node@10.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(typescript@5.6.3))(typescript@5.6.3)(verdaccio@5.32.2(encoding@0.1.13)(typanion@3.14.0))': dependencies: '@jest/reporters': 29.7.0 '@jest/test-result': 29.7.0 - '@nx/devkit': 20.2.0-beta.3(nx@20.2.0-beta.3(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))) - '@nx/js': 20.2.0-beta.3(@babel/traverse@7.25.9)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(nx@20.2.0-beta.3(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(typescript@5.6.3)(verdaccio@5.32.2(encoding@0.1.13)(typanion@3.14.0)) + '@nx/devkit': 20.2.0-beta.7(nx@20.2.0-beta.7(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))) + '@nx/js': 20.2.0-beta.7(@babel/traverse@7.25.9)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(nx@20.2.0-beta.7(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(typescript@5.6.3)(verdaccio@5.32.2(encoding@0.1.13)(typanion@3.14.0)) '@phenomnomnominal/tsquery': 5.0.1(typescript@5.6.3) chalk: 4.1.2 identity-obj-proxy: 3.0.0 @@ -22345,7 +22418,7 @@ snapshots: minimatch: 9.0.3 resolve.exports: 1.1.0 semver: 7.6.3 - tslib: 2.7.0 + tslib: 2.8.1 yargs-parser: 21.1.1 transitivePeerDependencies: - '@babel/traverse' @@ -22362,21 +22435,21 @@ snapshots: - typescript - verdaccio - '@nx/js@20.1.3(@babel/traverse@7.25.9)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(nx@20.2.0-beta.3(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(typescript@5.6.3)(verdaccio@5.32.2(encoding@0.1.13)(typanion@3.14.0))': + '@nx/js@20.1.3(@babel/traverse@7.25.9)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(nx@20.2.0-beta.7(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(typescript@5.6.3)(verdaccio@5.32.2(encoding@0.1.13)(typanion@3.14.0))': dependencies: - '@babel/core': 7.25.2 - '@babel/plugin-proposal-decorators': 7.24.7(@babel/core@7.25.2) - '@babel/plugin-transform-class-properties': 7.25.4(@babel/core@7.25.2) - '@babel/plugin-transform-runtime': 7.25.4(@babel/core@7.25.2) - '@babel/preset-env': 7.25.4(@babel/core@7.25.2) - '@babel/preset-typescript': 7.24.7(@babel/core@7.25.2) - '@babel/runtime': 7.25.6 - '@nx/devkit': 20.1.3(nx@20.2.0-beta.3(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))) + '@babel/core': 7.26.0 + '@babel/plugin-proposal-decorators': 7.24.7(@babel/core@7.26.0) + '@babel/plugin-transform-class-properties': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-runtime': 7.25.9(@babel/core@7.26.0) + '@babel/preset-env': 7.26.0(@babel/core@7.26.0) + '@babel/preset-typescript': 7.24.7(@babel/core@7.26.0) + '@babel/runtime': 7.26.0 + '@nx/devkit': 20.1.3(nx@20.2.0-beta.7(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))) '@nx/workspace': 20.1.3(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)) '@zkochan/js-yaml': 0.0.7 - babel-plugin-const-enum: 1.2.0(@babel/core@7.25.2) + babel-plugin-const-enum: 1.2.0(@babel/core@7.26.0) babel-plugin-macros: 2.8.0 - babel-plugin-transform-typescript-metadata: 0.3.2(@babel/core@7.25.2)(@babel/traverse@7.25.9) + babel-plugin-transform-typescript-metadata: 0.3.2(@babel/core@7.26.0)(@babel/traverse@7.25.9) chalk: 4.1.2 columnify: 1.6.0 detect-port: 1.6.1 @@ -22393,52 +22466,7 @@ snapshots: source-map-support: 0.5.19 ts-node: 10.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(typescript@5.6.3) tsconfig-paths: 4.2.0 - tslib: 2.7.0 - optionalDependencies: - verdaccio: 5.32.2(encoding@0.1.13)(typanion@3.14.0) - transitivePeerDependencies: - - '@babel/traverse' - - '@swc-node/register' - - '@swc/core' - - '@swc/wasm' - - '@types/node' - - debug - - nx - - supports-color - - typescript - - '@nx/js@20.2.0-beta.3(@babel/traverse@7.25.9)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(nx@20.2.0-beta.3(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(typescript@5.4.5)(verdaccio@5.32.2(encoding@0.1.13)(typanion@3.14.0))': - dependencies: - '@babel/core': 7.25.2 - '@babel/plugin-proposal-decorators': 7.24.7(@babel/core@7.25.2) - '@babel/plugin-transform-class-properties': 7.25.4(@babel/core@7.25.2) - '@babel/plugin-transform-runtime': 7.25.4(@babel/core@7.25.2) - '@babel/preset-env': 7.25.4(@babel/core@7.25.2) - '@babel/preset-typescript': 7.24.7(@babel/core@7.25.2) - '@babel/runtime': 7.25.6 - '@nx/devkit': 20.2.0-beta.3(nx@20.2.0-beta.3(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))) - '@nx/workspace': 20.2.0-beta.3(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)) - '@zkochan/js-yaml': 0.0.7 - babel-plugin-const-enum: 1.2.0(@babel/core@7.25.2) - babel-plugin-macros: 2.8.0 - babel-plugin-transform-typescript-metadata: 0.3.2(@babel/core@7.25.2)(@babel/traverse@7.25.9) - chalk: 4.1.2 - columnify: 1.6.0 - detect-port: 1.6.1 - enquirer: 2.3.6 - fast-glob: 3.2.7 - ignore: 5.3.2 - js-tokens: 4.0.0 - jsonc-parser: 3.2.0 - minimatch: 9.0.3 - npm-package-arg: 11.0.1 - npm-run-path: 4.0.1 - ora: 5.3.0 - semver: 7.6.3 - source-map-support: 0.5.19 - ts-node: 10.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(typescript@5.4.5) - tsconfig-paths: 4.2.0 - tslib: 2.7.0 + tslib: 2.8.1 optionalDependencies: verdaccio: 5.32.2(encoding@0.1.13)(typanion@3.14.0) transitivePeerDependencies: @@ -22452,21 +22480,21 @@ snapshots: - supports-color - typescript - '@nx/js@20.2.0-beta.3(@babel/traverse@7.25.9)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(nx@20.2.0-beta.3(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(typescript@5.6.3)(verdaccio@5.32.2(encoding@0.1.13)(typanion@3.14.0))': + '@nx/js@20.2.0-beta.7(@babel/traverse@7.25.9)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(nx@20.2.0-beta.7(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(typescript@5.6.3)(verdaccio@5.32.2(encoding@0.1.13)(typanion@3.14.0))': dependencies: - '@babel/core': 7.25.2 - '@babel/plugin-proposal-decorators': 7.24.7(@babel/core@7.25.2) - '@babel/plugin-transform-class-properties': 7.25.4(@babel/core@7.25.2) - '@babel/plugin-transform-runtime': 7.25.4(@babel/core@7.25.2) - '@babel/preset-env': 7.25.4(@babel/core@7.25.2) - '@babel/preset-typescript': 7.24.7(@babel/core@7.25.2) - '@babel/runtime': 7.25.6 - '@nx/devkit': 20.2.0-beta.3(nx@20.2.0-beta.3(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))) - '@nx/workspace': 20.2.0-beta.3(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)) + '@babel/core': 7.26.0 + '@babel/plugin-proposal-decorators': 7.24.7(@babel/core@7.26.0) + '@babel/plugin-transform-class-properties': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-runtime': 7.25.9(@babel/core@7.26.0) + '@babel/preset-env': 7.26.0(@babel/core@7.26.0) + '@babel/preset-typescript': 7.24.7(@babel/core@7.26.0) + '@babel/runtime': 7.26.0 + '@nx/devkit': 20.2.0-beta.7(nx@20.2.0-beta.7(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))) + '@nx/workspace': 20.2.0-beta.7(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)) '@zkochan/js-yaml': 0.0.7 - babel-plugin-const-enum: 1.2.0(@babel/core@7.25.2) + babel-plugin-const-enum: 1.2.0(@babel/core@7.26.0) babel-plugin-macros: 2.8.0 - babel-plugin-transform-typescript-metadata: 0.3.2(@babel/core@7.25.2)(@babel/traverse@7.25.9) + babel-plugin-transform-typescript-metadata: 0.3.2(@babel/core@7.26.0)(@babel/traverse@7.25.9) chalk: 4.1.2 columnify: 1.6.0 detect-port: 1.6.1 @@ -22483,7 +22511,7 @@ snapshots: source-map-support: 0.5.19 ts-node: 10.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(typescript@5.6.3) tsconfig-paths: 4.2.0 - tslib: 2.7.0 + tslib: 2.8.1 optionalDependencies: verdaccio: 5.32.2(encoding@0.1.13)(typanion@3.14.0) transitivePeerDependencies: @@ -22497,18 +22525,19 @@ snapshots: - supports-color - typescript - '@nx/module-federation@20.2.0-beta.3(@babel/traverse@7.25.9)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/helpers@0.5.11)(@types/node@20.16.10)(esbuild@0.19.5)(next@14.2.16(@babel/core@7.25.2)(@playwright/test@1.47.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.55.0))(nx@20.2.0-beta.3(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)(verdaccio@5.32.2(encoding@0.1.13)(typanion@3.14.0))(webpack-cli@5.1.4(webpack-dev-server@5.0.4)(webpack@5.88.0))': + '@nx/module-federation@20.2.0-beta.7(@babel/traverse@7.25.9)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/helpers@0.5.11)(@types/node@20.16.10)(esbuild@0.19.5)(next@14.2.16(@babel/core@7.25.2)(@playwright/test@1.47.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.55.0))(nx@20.2.0-beta.7(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)(verdaccio@5.32.2(encoding@0.1.13)(typanion@3.14.0))(webpack-cli@5.1.4(webpack-dev-server@5.0.4)(webpack@5.88.0))': dependencies: '@module-federation/enhanced': 0.7.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)(webpack@5.88.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.19.5)(webpack-cli@5.1.4)) '@module-federation/node': 2.6.11(next@14.2.16(@babel/core@7.25.2)(@playwright/test@1.47.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.55.0))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)(webpack@5.88.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.19.5)(webpack-cli@5.1.4)) '@module-federation/sdk': 0.7.6 - '@nx/devkit': 20.2.0-beta.3(nx@20.2.0-beta.3(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))) - '@nx/js': 20.2.0-beta.3(@babel/traverse@7.25.9)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(nx@20.2.0-beta.3(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(typescript@5.6.3)(verdaccio@5.32.2(encoding@0.1.13)(typanion@3.14.0)) - '@rspack/core': 1.1.2(@swc/helpers@0.5.11) + '@nx/devkit': 20.2.0-beta.7(nx@20.2.0-beta.7(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))) + '@nx/js': 20.2.0-beta.7(@babel/traverse@7.25.9)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(nx@20.2.0-beta.7(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(typescript@5.6.3)(verdaccio@5.32.2(encoding@0.1.13)(typanion@3.14.0)) + '@nx/web': 20.2.0-beta.7(@babel/traverse@7.25.9)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(nx@20.2.0-beta.7(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(typescript@5.6.3)(verdaccio@5.32.2(encoding@0.1.13)(typanion@3.14.0)) + '@rspack/core': 1.1.3(@swc/helpers@0.5.11) express: 4.21.0 http-proxy-middleware: 3.0.3 - picocolors: 1.1.0 - tslib: 2.7.0 + picocolors: 1.1.1 + tslib: 2.8.1 webpack: 5.88.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.19.5)(webpack-cli@5.1.4) transitivePeerDependencies: - '@babel/traverse' @@ -22532,15 +22561,15 @@ snapshots: - vue-tsc - webpack-cli - '@nx/next@20.2.0-beta.3(@babel/core@7.25.2)(@babel/traverse@7.25.9)(@rspack/core@1.1.5(@swc/helpers@0.5.11))(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/helpers@0.5.11)(@types/node@20.16.10)(@zkochan/js-yaml@0.0.7)(esbuild@0.19.5)(eslint@8.57.0)(html-webpack-plugin@5.5.0(webpack@5.88.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.19.5)(webpack-cli@5.1.4)))(next@14.2.16(@babel/core@7.25.2)(@playwright/test@1.47.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.55.0))(nx@20.2.0-beta.3(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)(verdaccio@5.32.2(encoding@0.1.13)(typanion@3.14.0))(webpack-cli@5.1.4(webpack-dev-server@5.0.4)(webpack@5.88.0))(webpack@5.88.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.19.5)(webpack-cli@5.1.4))': + '@nx/next@20.2.0-beta.7(@babel/core@7.25.2)(@babel/traverse@7.25.9)(@rspack/core@1.1.5(@swc/helpers@0.5.11))(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/helpers@0.5.11)(@types/node@20.16.10)(@zkochan/js-yaml@0.0.7)(esbuild@0.19.5)(eslint@8.57.0)(html-webpack-plugin@5.5.0(webpack@5.88.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.19.5)(webpack-cli@5.1.4)))(next@14.2.16(@babel/core@7.25.2)(@playwright/test@1.47.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.55.0))(nx@20.2.0-beta.7(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)(verdaccio@5.32.2(encoding@0.1.13)(typanion@3.14.0))(webpack-cli@5.1.4(webpack-dev-server@5.0.4)(webpack@5.88.0))(webpack@5.88.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.19.5)(webpack-cli@5.1.4))': dependencies: '@babel/plugin-proposal-decorators': 7.24.7(@babel/core@7.25.2) - '@nx/devkit': 20.2.0-beta.3(nx@20.2.0-beta.3(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))) - '@nx/eslint': 20.2.0-beta.3(@babel/traverse@7.25.9)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(@zkochan/js-yaml@0.0.7)(eslint@8.57.0)(nx@20.2.0-beta.3(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(verdaccio@5.32.2(encoding@0.1.13)(typanion@3.14.0)) - '@nx/js': 20.2.0-beta.3(@babel/traverse@7.25.9)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(nx@20.2.0-beta.3(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(typescript@5.6.3)(verdaccio@5.32.2(encoding@0.1.13)(typanion@3.14.0)) - '@nx/react': 20.2.0-beta.3(@babel/traverse@7.25.9)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/helpers@0.5.11)(@types/node@20.16.10)(@zkochan/js-yaml@0.0.7)(esbuild@0.19.5)(eslint@8.57.0)(next@14.2.16(@babel/core@7.25.2)(@playwright/test@1.47.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.55.0))(nx@20.2.0-beta.3(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)(verdaccio@5.32.2(encoding@0.1.13)(typanion@3.14.0))(webpack-cli@5.1.4(webpack-dev-server@5.0.4)(webpack@5.88.0))(webpack@5.88.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.19.5)(webpack-cli@5.1.4)) - '@nx/web': 20.2.0-beta.3(@babel/traverse@7.25.9)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(nx@20.2.0-beta.3(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(typescript@5.6.3)(verdaccio@5.32.2(encoding@0.1.13)(typanion@3.14.0)) - '@nx/webpack': 20.2.0-beta.3(@babel/traverse@7.25.9)(@rspack/core@1.1.5(@swc/helpers@0.5.11))(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(esbuild@0.19.5)(html-webpack-plugin@5.5.0(webpack@5.88.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.19.5)(webpack-cli@5.1.4)))(nx@20.2.0-beta.3(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(typescript@5.6.3)(verdaccio@5.32.2(encoding@0.1.13)(typanion@3.14.0))(webpack-cli@5.1.4(webpack-dev-server@5.0.4)(webpack@5.88.0)) + '@nx/devkit': 20.2.0-beta.7(nx@20.2.0-beta.7(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))) + '@nx/eslint': 20.2.0-beta.7(@babel/traverse@7.25.9)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(@zkochan/js-yaml@0.0.7)(eslint@8.57.0)(nx@20.2.0-beta.7(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(verdaccio@5.32.2(encoding@0.1.13)(typanion@3.14.0)) + '@nx/js': 20.2.0-beta.7(@babel/traverse@7.25.9)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(nx@20.2.0-beta.7(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(typescript@5.6.3)(verdaccio@5.32.2(encoding@0.1.13)(typanion@3.14.0)) + '@nx/react': 20.2.0-beta.7(@babel/traverse@7.25.9)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/helpers@0.5.11)(@types/node@20.16.10)(@zkochan/js-yaml@0.0.7)(esbuild@0.19.5)(eslint@8.57.0)(next@14.2.16(@babel/core@7.25.2)(@playwright/test@1.47.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.55.0))(nx@20.2.0-beta.7(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)(verdaccio@5.32.2(encoding@0.1.13)(typanion@3.14.0))(webpack-cli@5.1.4(webpack-dev-server@5.0.4)(webpack@5.88.0))(webpack@5.88.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.19.5)(webpack-cli@5.1.4)) + '@nx/web': 20.2.0-beta.7(@babel/traverse@7.25.9)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(nx@20.2.0-beta.7(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(typescript@5.6.3)(verdaccio@5.32.2(encoding@0.1.13)(typanion@3.14.0)) + '@nx/webpack': 20.2.0-beta.7(@babel/traverse@7.25.9)(@rspack/core@1.1.5(@swc/helpers@0.5.11))(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(esbuild@0.19.5)(html-webpack-plugin@5.5.0(webpack@5.88.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.19.5)(webpack-cli@5.1.4)))(nx@20.2.0-beta.7(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(typescript@5.6.3)(verdaccio@5.32.2(encoding@0.1.13)(typanion@3.14.0))(webpack-cli@5.1.4(webpack-dev-server@5.0.4)(webpack@5.88.0)) '@phenomnomnominal/tsquery': 5.0.1(typescript@5.6.3) '@svgr/webpack': 8.1.0(typescript@5.6.3) copy-webpack-plugin: 10.2.4(webpack@5.88.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.19.5)(webpack-cli@5.1.4)) @@ -22548,7 +22577,7 @@ snapshots: ignore: 5.3.2 next: 14.2.16(@babel/core@7.25.2)(@playwright/test@1.47.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.55.0) semver: 7.6.3 - tslib: 2.7.0 + tslib: 2.8.1 webpack-merge: 5.10.0 transitivePeerDependencies: - '@babel/core' @@ -22589,73 +22618,73 @@ snapshots: '@nx/nx-darwin-arm64@20.1.3': optional: true - '@nx/nx-darwin-arm64@20.2.0-beta.3': + '@nx/nx-darwin-arm64@20.2.0-beta.7': optional: true '@nx/nx-darwin-x64@20.1.3': optional: true - '@nx/nx-darwin-x64@20.2.0-beta.3': + '@nx/nx-darwin-x64@20.2.0-beta.7': optional: true '@nx/nx-freebsd-x64@20.1.3': optional: true - '@nx/nx-freebsd-x64@20.2.0-beta.3': + '@nx/nx-freebsd-x64@20.2.0-beta.7': optional: true '@nx/nx-linux-arm-gnueabihf@20.1.3': optional: true - '@nx/nx-linux-arm-gnueabihf@20.2.0-beta.3': + '@nx/nx-linux-arm-gnueabihf@20.2.0-beta.7': optional: true '@nx/nx-linux-arm64-gnu@20.1.3': optional: true - '@nx/nx-linux-arm64-gnu@20.2.0-beta.3': + '@nx/nx-linux-arm64-gnu@20.2.0-beta.7': optional: true '@nx/nx-linux-arm64-musl@20.1.3': optional: true - '@nx/nx-linux-arm64-musl@20.2.0-beta.3': + '@nx/nx-linux-arm64-musl@20.2.0-beta.7': optional: true '@nx/nx-linux-x64-gnu@20.1.3': optional: true - '@nx/nx-linux-x64-gnu@20.2.0-beta.3': + '@nx/nx-linux-x64-gnu@20.2.0-beta.7': optional: true '@nx/nx-linux-x64-musl@20.1.3': optional: true - '@nx/nx-linux-x64-musl@20.2.0-beta.3': + '@nx/nx-linux-x64-musl@20.2.0-beta.7': optional: true '@nx/nx-win32-arm64-msvc@20.1.3': optional: true - '@nx/nx-win32-arm64-msvc@20.2.0-beta.3': + '@nx/nx-win32-arm64-msvc@20.2.0-beta.7': optional: true '@nx/nx-win32-x64-msvc@20.1.3': optional: true - '@nx/nx-win32-x64-msvc@20.2.0-beta.3': + '@nx/nx-win32-x64-msvc@20.2.0-beta.7': optional: true - '@nx/playwright@20.2.0-beta.3(@babel/traverse@7.25.9)(@playwright/test@1.47.1)(@rspack/core@1.1.5(@swc/helpers@0.5.11))(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(@zkochan/js-yaml@0.0.7)(esbuild@0.19.5)(eslint@8.57.0)(html-webpack-plugin@5.5.0(webpack@5.88.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.19.5)(webpack-cli@5.1.4)))(nx@20.2.0-beta.3(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(typescript@5.6.3)(verdaccio@5.32.2(encoding@0.1.13)(typanion@3.14.0))(vite@5.0.8(@types/node@20.16.10)(less@4.1.3)(sass@1.55.0)(stylus@0.64.0)(terser@5.36.0))(vitest@1.3.1(@types/node@20.16.10)(jsdom@20.0.3)(less@4.1.3)(sass@1.55.0)(stylus@0.64.0)(terser@5.36.0))(webpack-cli@5.1.4(webpack-dev-server@5.0.4)(webpack@5.88.0))': + '@nx/playwright@20.2.0-beta.7(@babel/traverse@7.25.9)(@playwright/test@1.47.1)(@rspack/core@1.1.5(@swc/helpers@0.5.11))(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(@zkochan/js-yaml@0.0.7)(esbuild@0.19.5)(eslint@8.57.0)(html-webpack-plugin@5.5.0(webpack@5.88.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.19.5)(webpack-cli@5.1.4)))(nx@20.2.0-beta.7(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(typescript@5.6.3)(verdaccio@5.32.2(encoding@0.1.13)(typanion@3.14.0))(vite@5.0.8(@types/node@20.16.10)(less@4.1.3)(sass@1.55.0)(stylus@0.64.0)(terser@5.36.0))(vitest@1.3.1(@types/node@20.16.10)(jsdom@20.0.3)(less@4.1.3)(sass@1.55.0)(stylus@0.64.0)(terser@5.36.0))(webpack-cli@5.1.4(webpack-dev-server@5.0.4)(webpack@5.88.0))': dependencies: - '@nx/devkit': 20.2.0-beta.3(nx@20.2.0-beta.3(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))) - '@nx/eslint': 20.2.0-beta.3(@babel/traverse@7.25.9)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(@zkochan/js-yaml@0.0.7)(eslint@8.57.0)(nx@20.2.0-beta.3(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(verdaccio@5.32.2(encoding@0.1.13)(typanion@3.14.0)) - '@nx/js': 20.2.0-beta.3(@babel/traverse@7.25.9)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(nx@20.2.0-beta.3(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(typescript@5.6.3)(verdaccio@5.32.2(encoding@0.1.13)(typanion@3.14.0)) - '@nx/vite': 20.2.0-beta.3(@babel/traverse@7.25.9)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(nx@20.2.0-beta.3(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(typescript@5.6.3)(verdaccio@5.32.2(encoding@0.1.13)(typanion@3.14.0))(vite@5.0.8(@types/node@20.16.10)(less@4.1.3)(sass@1.55.0)(stylus@0.64.0)(terser@5.36.0))(vitest@1.3.1(@types/node@20.16.10)(jsdom@20.0.3)(less@4.1.3)(sass@1.55.0)(stylus@0.64.0)(terser@5.36.0)) - '@nx/webpack': 20.2.0-beta.3(@babel/traverse@7.25.9)(@rspack/core@1.1.5(@swc/helpers@0.5.11))(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(esbuild@0.19.5)(html-webpack-plugin@5.5.0(webpack@5.88.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.19.5)(webpack-cli@5.1.4)))(nx@20.2.0-beta.3(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(typescript@5.6.3)(verdaccio@5.32.2(encoding@0.1.13)(typanion@3.14.0))(webpack-cli@5.1.4(webpack-dev-server@5.0.4)(webpack@5.88.0)) + '@nx/devkit': 20.2.0-beta.7(nx@20.2.0-beta.7(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))) + '@nx/eslint': 20.2.0-beta.7(@babel/traverse@7.25.9)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(@zkochan/js-yaml@0.0.7)(eslint@8.57.0)(nx@20.2.0-beta.7(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(verdaccio@5.32.2(encoding@0.1.13)(typanion@3.14.0)) + '@nx/js': 20.2.0-beta.7(@babel/traverse@7.25.9)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(nx@20.2.0-beta.7(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(typescript@5.6.3)(verdaccio@5.32.2(encoding@0.1.13)(typanion@3.14.0)) + '@nx/vite': 20.2.0-beta.7(@babel/traverse@7.25.9)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(nx@20.2.0-beta.7(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(typescript@5.6.3)(verdaccio@5.32.2(encoding@0.1.13)(typanion@3.14.0))(vite@5.0.8(@types/node@20.16.10)(less@4.1.3)(sass@1.55.0)(stylus@0.64.0)(terser@5.36.0))(vitest@1.3.1(@types/node@20.16.10)(jsdom@20.0.3)(less@4.1.3)(sass@1.55.0)(stylus@0.64.0)(terser@5.36.0)) + '@nx/webpack': 20.2.0-beta.7(@babel/traverse@7.25.9)(@rspack/core@1.1.5(@swc/helpers@0.5.11))(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(esbuild@0.19.5)(html-webpack-plugin@5.5.0(webpack@5.88.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.19.5)(webpack-cli@5.1.4)))(nx@20.2.0-beta.7(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(typescript@5.6.3)(verdaccio@5.32.2(encoding@0.1.13)(typanion@3.14.0))(webpack-cli@5.1.4(webpack-dev-server@5.0.4)(webpack@5.88.0)) '@phenomnomnominal/tsquery': 5.0.1(typescript@5.6.3) minimatch: 9.0.3 - tslib: 2.7.0 + tslib: 2.8.1 optionalDependencies: '@playwright/test': 1.47.1 transitivePeerDependencies: @@ -22690,10 +22719,10 @@ snapshots: - vue-template-compiler - webpack-cli - '@nx/powerpack-conformance@1.1.0-beta.6(@babel/traverse@7.25.9)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(nx@20.2.0-beta.3(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(typescript@5.6.3)(verdaccio@5.32.2(encoding@0.1.13)(typanion@3.14.0))': + '@nx/powerpack-conformance@1.1.0-beta.6(@babel/traverse@7.25.9)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(nx@20.2.0-beta.7(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(typescript@5.6.3)(verdaccio@5.32.2(encoding@0.1.13)(typanion@3.14.0))': dependencies: - '@nx/devkit': 20.1.3(nx@20.2.0-beta.3(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))) - '@nx/js': 20.1.3(@babel/traverse@7.25.9)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(nx@20.2.0-beta.3(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(typescript@5.6.3)(verdaccio@5.32.2(encoding@0.1.13)(typanion@3.14.0)) + '@nx/devkit': 20.1.3(nx@20.2.0-beta.7(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))) + '@nx/js': 20.1.3(@babel/traverse@7.25.9)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(nx@20.2.0-beta.7(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(typescript@5.6.3)(verdaccio@5.32.2(encoding@0.1.13)(typanion@3.14.0)) '@nx/powerpack-license': 1.1.0-beta.6 ajv: 8.17.1 esbuild: 0.21.5 @@ -22709,9 +22738,9 @@ snapshots: - typescript - verdaccio - '@nx/powerpack-enterprise-cloud@1.1.0-beta.6(nx@20.2.0-beta.3(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))': + '@nx/powerpack-enterprise-cloud@1.1.0-beta.6(nx@20.2.0-beta.7(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))': dependencies: - '@nx/devkit': 20.1.3(nx@20.2.0-beta.3(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))) + '@nx/devkit': 20.1.3(nx@20.2.0-beta.7(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))) '@nx/powerpack-license': 1.1.0-beta.6 transitivePeerDependencies: - nx @@ -22757,21 +22786,21 @@ snapshots: '@nx/powerpack-license-win32-arm64-msvc': 1.1.0-beta.6 '@nx/powerpack-license-win32-x64-msvc': 1.1.0-beta.6 - '@nx/react@20.2.0-beta.3(@babel/traverse@7.25.9)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/helpers@0.5.11)(@types/node@20.16.10)(@zkochan/js-yaml@0.0.7)(esbuild@0.19.5)(eslint@8.57.0)(next@14.2.16(@babel/core@7.25.2)(@playwright/test@1.47.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.55.0))(nx@20.2.0-beta.3(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)(verdaccio@5.32.2(encoding@0.1.13)(typanion@3.14.0))(webpack-cli@5.1.4(webpack-dev-server@5.0.4)(webpack@5.88.0))(webpack@5.88.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.19.5)(webpack-cli@5.1.4))': + '@nx/react@20.2.0-beta.7(@babel/traverse@7.25.9)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/helpers@0.5.11)(@types/node@20.16.10)(@zkochan/js-yaml@0.0.7)(esbuild@0.19.5)(eslint@8.57.0)(next@14.2.16(@babel/core@7.25.2)(@playwright/test@1.47.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.55.0))(nx@20.2.0-beta.7(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)(verdaccio@5.32.2(encoding@0.1.13)(typanion@3.14.0))(webpack-cli@5.1.4(webpack-dev-server@5.0.4)(webpack@5.88.0))(webpack@5.88.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.19.5)(webpack-cli@5.1.4))': dependencies: - '@nx/devkit': 20.2.0-beta.3(nx@20.2.0-beta.3(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))) - '@nx/eslint': 20.2.0-beta.3(@babel/traverse@7.25.9)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(@zkochan/js-yaml@0.0.7)(eslint@8.57.0)(nx@20.2.0-beta.3(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(verdaccio@5.32.2(encoding@0.1.13)(typanion@3.14.0)) - '@nx/js': 20.2.0-beta.3(@babel/traverse@7.25.9)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(nx@20.2.0-beta.3(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(typescript@5.6.3)(verdaccio@5.32.2(encoding@0.1.13)(typanion@3.14.0)) - '@nx/module-federation': 20.2.0-beta.3(@babel/traverse@7.25.9)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/helpers@0.5.11)(@types/node@20.16.10)(esbuild@0.19.5)(next@14.2.16(@babel/core@7.25.2)(@playwright/test@1.47.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.55.0))(nx@20.2.0-beta.3(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)(verdaccio@5.32.2(encoding@0.1.13)(typanion@3.14.0))(webpack-cli@5.1.4(webpack-dev-server@5.0.4)(webpack@5.88.0)) - '@nx/web': 20.2.0-beta.3(@babel/traverse@7.25.9)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(nx@20.2.0-beta.3(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(typescript@5.6.3)(verdaccio@5.32.2(encoding@0.1.13)(typanion@3.14.0)) + '@nx/devkit': 20.2.0-beta.7(nx@20.2.0-beta.7(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))) + '@nx/eslint': 20.2.0-beta.7(@babel/traverse@7.25.9)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(@zkochan/js-yaml@0.0.7)(eslint@8.57.0)(nx@20.2.0-beta.7(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(verdaccio@5.32.2(encoding@0.1.13)(typanion@3.14.0)) + '@nx/js': 20.2.0-beta.7(@babel/traverse@7.25.9)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(nx@20.2.0-beta.7(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(typescript@5.6.3)(verdaccio@5.32.2(encoding@0.1.13)(typanion@3.14.0)) + '@nx/module-federation': 20.2.0-beta.7(@babel/traverse@7.25.9)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/helpers@0.5.11)(@types/node@20.16.10)(esbuild@0.19.5)(next@14.2.16(@babel/core@7.25.2)(@playwright/test@1.47.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.55.0))(nx@20.2.0-beta.7(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)(verdaccio@5.32.2(encoding@0.1.13)(typanion@3.14.0))(webpack-cli@5.1.4(webpack-dev-server@5.0.4)(webpack@5.88.0)) + '@nx/web': 20.2.0-beta.7(@babel/traverse@7.25.9)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(nx@20.2.0-beta.7(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(typescript@5.6.3)(verdaccio@5.32.2(encoding@0.1.13)(typanion@3.14.0)) '@phenomnomnominal/tsquery': 5.0.1(typescript@5.6.3) '@svgr/webpack': 8.1.0(typescript@5.6.3) express: 4.21.0 file-loader: 6.2.0(webpack@5.88.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.19.5)(webpack-cli@5.1.4)) http-proxy-middleware: 3.0.3 minimatch: 9.0.3 - picocolors: 1.1.0 - tslib: 2.7.0 + picocolors: 1.1.1 + tslib: 2.8.1 transitivePeerDependencies: - '@babel/traverse' - '@swc-node/register' @@ -22797,20 +22826,20 @@ snapshots: - webpack - webpack-cli - '@nx/rspack@20.2.0-beta.3(fmeukgi3gqsgveqxj6bd3uzyli)': + '@nx/rspack@20.2.0-beta.7(lpvcfynk6qi2jfyvaa5ybhqzay)': dependencies: '@module-federation/enhanced': 0.7.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)(webpack@5.88.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.19.5)(webpack-cli@5.1.4)) '@module-federation/node': 2.6.11(next@14.2.16(@babel/core@7.25.2)(@playwright/test@1.47.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.55.0))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)(webpack@5.88.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.19.5)(webpack-cli@5.1.4)) - '@nx/devkit': 20.2.0-beta.3(nx@20.2.0-beta.3(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))) - '@nx/js': 20.2.0-beta.3(@babel/traverse@7.25.9)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(nx@20.2.0-beta.3(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(typescript@5.6.3)(verdaccio@5.32.2(encoding@0.1.13)(typanion@3.14.0)) - '@nx/module-federation': 20.2.0-beta.3(@babel/traverse@7.25.9)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/helpers@0.5.11)(@types/node@20.16.10)(esbuild@0.19.5)(next@14.2.16(@babel/core@7.25.2)(@playwright/test@1.47.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.55.0))(nx@20.2.0-beta.3(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)(verdaccio@5.32.2(encoding@0.1.13)(typanion@3.14.0))(webpack-cli@5.1.4(webpack-dev-server@5.0.4)(webpack@5.88.0)) - '@nx/web': 20.2.0-beta.3(@babel/traverse@7.25.9)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(nx@20.2.0-beta.3(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(typescript@5.6.3)(verdaccio@5.32.2(encoding@0.1.13)(typanion@3.14.0)) + '@nx/devkit': 20.2.0-beta.7(nx@20.2.0-beta.7(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))) + '@nx/js': 20.2.0-beta.7(@babel/traverse@7.25.9)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(nx@20.2.0-beta.7(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(typescript@5.6.3)(verdaccio@5.32.2(encoding@0.1.13)(typanion@3.14.0)) + '@nx/module-federation': 20.2.0-beta.7(@babel/traverse@7.25.9)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/helpers@0.5.11)(@types/node@20.16.10)(esbuild@0.19.5)(next@14.2.16(@babel/core@7.25.2)(@playwright/test@1.47.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.55.0))(nx@20.2.0-beta.7(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)(verdaccio@5.32.2(encoding@0.1.13)(typanion@3.14.0))(webpack-cli@5.1.4(webpack-dev-server@5.0.4)(webpack@5.88.0)) + '@nx/web': 20.2.0-beta.7(@babel/traverse@7.25.9)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(nx@20.2.0-beta.7(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(typescript@5.6.3)(verdaccio@5.32.2(encoding@0.1.13)(typanion@3.14.0)) '@phenomnomnominal/tsquery': 5.0.1(typescript@5.6.3) '@rspack/core': 1.1.5(@swc/helpers@0.5.11) '@rspack/dev-server': 1.0.9(@rspack/core@1.1.5(@swc/helpers@0.5.11))(@types/express@4.17.14)(webpack-cli@5.1.4(webpack-dev-server@5.0.4)(webpack@5.88.0))(webpack@5.88.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.19.5)(webpack-cli@5.1.4)) '@rspack/plugin-react-refresh': 1.0.0(react-refresh@0.10.0) autoprefixer: 10.4.13(postcss@8.4.38) - browserslist: 4.23.3 + browserslist: 4.24.2 chalk: 4.1.2 css-loader: 6.11.0(@rspack/core@1.1.5(@swc/helpers@0.5.11))(webpack@5.88.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.19.5)(webpack-cli@5.1.4)) enquirer: 2.3.6 @@ -22827,7 +22856,7 @@ snapshots: sass-loader: 12.6.0(sass@1.55.0)(webpack@5.88.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.19.5)(webpack-cli@5.1.4)) source-map-loader: 5.0.0(webpack@5.88.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.19.5)(webpack-cli@5.1.4)) style-loader: 3.3.4(webpack@5.88.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.19.5)(webpack-cli@5.1.4)) - tslib: 2.7.0 + tslib: 2.8.1 webpack: 5.88.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.19.5)(webpack-cli@5.1.4) webpack-node-externals: 3.0.0 transitivePeerDependencies: @@ -22859,15 +22888,15 @@ snapshots: - vue-tsc - webpack-cli - '@nx/storybook@20.2.0-beta.3(@babel/traverse@7.25.9)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(@zkochan/js-yaml@0.0.7)(cypress@13.13.0)(eslint@8.57.0)(nx@20.2.0-beta.3(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(typescript@5.6.3)(verdaccio@5.32.2(encoding@0.1.13)(typanion@3.14.0))': + '@nx/storybook@20.2.0-beta.7(@babel/traverse@7.25.9)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(@zkochan/js-yaml@0.0.7)(cypress@13.13.0)(eslint@8.57.0)(nx@20.2.0-beta.7(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(typescript@5.6.3)(verdaccio@5.32.2(encoding@0.1.13)(typanion@3.14.0))': dependencies: - '@nx/cypress': 20.2.0-beta.3(@babel/traverse@7.25.9)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(@zkochan/js-yaml@0.0.7)(cypress@13.13.0)(eslint@8.57.0)(nx@20.2.0-beta.3(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(typescript@5.6.3)(verdaccio@5.32.2(encoding@0.1.13)(typanion@3.14.0)) - '@nx/devkit': 20.2.0-beta.3(nx@20.2.0-beta.3(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))) - '@nx/eslint': 20.2.0-beta.3(@babel/traverse@7.25.9)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(@zkochan/js-yaml@0.0.7)(eslint@8.57.0)(nx@20.2.0-beta.3(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(verdaccio@5.32.2(encoding@0.1.13)(typanion@3.14.0)) - '@nx/js': 20.2.0-beta.3(@babel/traverse@7.25.9)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(nx@20.2.0-beta.3(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(typescript@5.6.3)(verdaccio@5.32.2(encoding@0.1.13)(typanion@3.14.0)) + '@nx/cypress': 20.2.0-beta.7(@babel/traverse@7.25.9)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(@zkochan/js-yaml@0.0.7)(cypress@13.13.0)(eslint@8.57.0)(nx@20.2.0-beta.7(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(typescript@5.6.3)(verdaccio@5.32.2(encoding@0.1.13)(typanion@3.14.0)) + '@nx/devkit': 20.2.0-beta.7(nx@20.2.0-beta.7(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))) + '@nx/eslint': 20.2.0-beta.7(@babel/traverse@7.25.9)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(@zkochan/js-yaml@0.0.7)(eslint@8.57.0)(nx@20.2.0-beta.7(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(verdaccio@5.32.2(encoding@0.1.13)(typanion@3.14.0)) + '@nx/js': 20.2.0-beta.7(@babel/traverse@7.25.9)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(nx@20.2.0-beta.7(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(typescript@5.6.3)(verdaccio@5.32.2(encoding@0.1.13)(typanion@3.14.0)) '@phenomnomnominal/tsquery': 5.0.1(typescript@5.6.3) semver: 7.6.3 - tslib: 2.7.0 + tslib: 2.8.1 transitivePeerDependencies: - '@babel/traverse' - '@swc-node/register' @@ -22883,10 +22912,10 @@ snapshots: - typescript - verdaccio - '@nx/vite@20.2.0-beta.3(@babel/traverse@7.25.9)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(nx@20.2.0-beta.3(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(typescript@5.6.3)(verdaccio@5.32.2(encoding@0.1.13)(typanion@3.14.0))(vite@5.0.8(@types/node@20.16.10)(less@4.1.3)(sass@1.55.0)(stylus@0.64.0)(terser@5.36.0))(vitest@1.3.1(@types/node@20.16.10)(jsdom@20.0.3)(less@4.1.3)(sass@1.55.0)(stylus@0.64.0)(terser@5.36.0))': + '@nx/vite@20.2.0-beta.7(@babel/traverse@7.25.9)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(nx@20.2.0-beta.7(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(typescript@5.6.3)(verdaccio@5.32.2(encoding@0.1.13)(typanion@3.14.0))(vite@5.0.8(@types/node@20.16.10)(less@4.1.3)(sass@1.55.0)(stylus@0.64.0)(terser@5.36.0))(vitest@1.3.1(@types/node@20.16.10)(jsdom@20.0.3)(less@4.1.3)(sass@1.55.0)(stylus@0.64.0)(terser@5.36.0))': dependencies: - '@nx/devkit': 20.2.0-beta.3(nx@20.2.0-beta.3(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))) - '@nx/js': 20.2.0-beta.3(@babel/traverse@7.25.9)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(nx@20.2.0-beta.3(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(typescript@5.6.3)(verdaccio@5.32.2(encoding@0.1.13)(typanion@3.14.0)) + '@nx/devkit': 20.2.0-beta.7(nx@20.2.0-beta.7(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))) + '@nx/js': 20.2.0-beta.7(@babel/traverse@7.25.9)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(nx@20.2.0-beta.7(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(typescript@5.6.3)(verdaccio@5.32.2(encoding@0.1.13)(typanion@3.14.0)) '@phenomnomnominal/tsquery': 5.0.1(typescript@5.6.3) '@swc/helpers': 0.5.11 enquirer: 2.3.6 @@ -22906,14 +22935,14 @@ snapshots: - typescript - verdaccio - '@nx/web@20.2.0-beta.3(@babel/traverse@7.25.9)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(nx@20.2.0-beta.3(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(typescript@5.6.3)(verdaccio@5.32.2(encoding@0.1.13)(typanion@3.14.0))': + '@nx/web@20.2.0-beta.7(@babel/traverse@7.25.9)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(nx@20.2.0-beta.7(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(typescript@5.6.3)(verdaccio@5.32.2(encoding@0.1.13)(typanion@3.14.0))': dependencies: - '@nx/devkit': 20.2.0-beta.3(nx@20.2.0-beta.3(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))) - '@nx/js': 20.2.0-beta.3(@babel/traverse@7.25.9)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(nx@20.2.0-beta.3(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(typescript@5.6.3)(verdaccio@5.32.2(encoding@0.1.13)(typanion@3.14.0)) + '@nx/devkit': 20.2.0-beta.7(nx@20.2.0-beta.7(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))) + '@nx/js': 20.2.0-beta.7(@babel/traverse@7.25.9)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(nx@20.2.0-beta.7(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(typescript@5.6.3)(verdaccio@5.32.2(encoding@0.1.13)(typanion@3.14.0)) detect-port: 1.6.1 http-server: 14.1.0 - picocolors: 1.1.0 - tslib: 2.7.0 + picocolors: 1.1.1 + tslib: 2.8.1 transitivePeerDependencies: - '@babel/traverse' - '@swc-node/register' @@ -22926,16 +22955,16 @@ snapshots: - typescript - verdaccio - '@nx/webpack@20.2.0-beta.3(@babel/traverse@7.25.9)(@rspack/core@1.1.5(@swc/helpers@0.5.11))(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(esbuild@0.19.5)(html-webpack-plugin@5.5.0(webpack@5.88.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.19.5)(webpack-cli@5.1.4)))(nx@20.2.0-beta.3(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(typescript@5.6.3)(verdaccio@5.32.2(encoding@0.1.13)(typanion@3.14.0))(webpack-cli@5.1.4(webpack-dev-server@5.0.4)(webpack@5.88.0))': + '@nx/webpack@20.2.0-beta.7(@babel/traverse@7.25.9)(@rspack/core@1.1.5(@swc/helpers@0.5.11))(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(esbuild@0.19.5)(html-webpack-plugin@5.5.0(webpack@5.88.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.19.5)(webpack-cli@5.1.4)))(nx@20.2.0-beta.7(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(typescript@5.6.3)(verdaccio@5.32.2(encoding@0.1.13)(typanion@3.14.0))(webpack-cli@5.1.4(webpack-dev-server@5.0.4)(webpack@5.88.0))': dependencies: - '@babel/core': 7.25.2 - '@nx/devkit': 20.2.0-beta.3(nx@20.2.0-beta.3(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))) - '@nx/js': 20.2.0-beta.3(@babel/traverse@7.25.9)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(nx@20.2.0-beta.3(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(typescript@5.6.3)(verdaccio@5.32.2(encoding@0.1.13)(typanion@3.14.0)) + '@babel/core': 7.26.0 + '@nx/devkit': 20.2.0-beta.7(nx@20.2.0-beta.7(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))) + '@nx/js': 20.2.0-beta.7(@babel/traverse@7.25.9)(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(nx@20.2.0-beta.7(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)))(typescript@5.6.3)(verdaccio@5.32.2(encoding@0.1.13)(typanion@3.14.0)) '@phenomnomnominal/tsquery': 5.0.1(typescript@5.6.3) ajv: 8.17.1 autoprefixer: 10.4.13(postcss@8.4.38) - babel-loader: 9.2.1(@babel/core@7.25.2)(webpack@5.88.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.19.5)(webpack-cli@5.1.4)) - browserslist: 4.23.3 + babel-loader: 9.2.1(@babel/core@7.26.0)(webpack@5.88.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.19.5)(webpack-cli@5.1.4)) + browserslist: 4.24.2 copy-webpack-plugin: 10.2.4(webpack@5.88.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.19.5)(webpack-cli@5.1.4)) css-loader: 6.11.0(@rspack/core@1.1.5(@swc/helpers@0.5.11))(webpack@5.88.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.19.5)(webpack-cli@5.1.4)) css-minimizer-webpack-plugin: 5.0.1(esbuild@0.19.5)(webpack@5.88.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.19.5)(webpack-cli@5.1.4)) @@ -22946,7 +22975,7 @@ snapshots: loader-utils: 2.0.3 mini-css-extract-plugin: 2.4.7(webpack@5.88.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.19.5)(webpack-cli@5.1.4)) parse5: 4.0.0 - picocolors: 1.1.0 + picocolors: 1.1.1 postcss: 8.4.38 postcss-import: 14.1.0(postcss@8.4.38) postcss-loader: 6.2.1(postcss@8.4.38)(webpack@5.88.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.19.5)(webpack-cli@5.1.4)) @@ -22960,9 +22989,9 @@ snapshots: terser-webpack-plugin: 5.3.10(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.19.5)(webpack@5.88.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.19.5)(webpack-cli@5.1.4)) ts-loader: 9.5.1(typescript@5.6.3)(webpack@5.88.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.19.5)(webpack-cli@5.1.4)) tsconfig-paths-webpack-plugin: 4.0.0 - tslib: 2.7.0 + tslib: 2.8.1 webpack: 5.88.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.19.5)(webpack-cli@5.1.4) - webpack-dev-server: 5.0.4(webpack-cli@5.1.4)(webpack@5.88.0) + webpack-dev-server: 5.0.4(webpack-cli@5.1.4(webpack-dev-server@5.0.4)(webpack@5.88.0))(webpack@5.88.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.19.5)(webpack-cli@5.1.4)) webpack-node-externals: 3.0.0 webpack-subresource-integrity: 5.1.0(html-webpack-plugin@5.5.0(webpack@5.88.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.19.5)(webpack-cli@5.1.4)))(webpack@5.88.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.19.5)(webpack-cli@5.1.4)) transitivePeerDependencies: @@ -22999,20 +23028,20 @@ snapshots: chalk: 4.1.2 enquirer: 2.3.6 nx: 20.1.3(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)) - tslib: 2.7.0 + tslib: 2.8.1 yargs-parser: 21.1.1 transitivePeerDependencies: - '@swc-node/register' - '@swc/core' - debug - '@nx/workspace@20.2.0-beta.3(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))': + '@nx/workspace@20.2.0-beta.7(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))': dependencies: - '@nx/devkit': 20.2.0-beta.3(nx@20.2.0-beta.3(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))) + '@nx/devkit': 20.2.0-beta.7(nx@20.2.0-beta.7(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11))) chalk: 4.1.2 enquirer: 2.3.6 - nx: 20.2.0-beta.3(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)) - tslib: 2.7.0 + nx: 20.2.0-beta.7(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)) + tslib: 2.8.1 yargs-parser: 21.1.1 transitivePeerDependencies: - '@swc-node/register' @@ -23346,7 +23375,7 @@ snapshots: webpack: 5.88.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.19.5)(webpack-cli@5.1.4) optionalDependencies: type-fest: 3.13.1 - webpack-dev-server: 5.0.4(webpack-cli@5.1.4)(webpack@5.88.0) + webpack-dev-server: 5.0.4(webpack-cli@5.1.4(webpack-dev-server@5.0.4)(webpack@5.88.0))(webpack@5.88.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.19.5)(webpack-cli@5.1.4)) webpack-hot-middleware: 2.26.1 '@pnpm/lockfile-types@6.0.0': @@ -23919,71 +23948,71 @@ snapshots: optionalDependencies: fsevents: 2.3.3 - '@rspack/binding-darwin-arm64@1.1.2': + '@rspack/binding-darwin-arm64@1.1.3': optional: true '@rspack/binding-darwin-arm64@1.1.5': optional: true - '@rspack/binding-darwin-x64@1.1.2': + '@rspack/binding-darwin-x64@1.1.3': optional: true '@rspack/binding-darwin-x64@1.1.5': optional: true - '@rspack/binding-linux-arm64-gnu@1.1.2': + '@rspack/binding-linux-arm64-gnu@1.1.3': optional: true '@rspack/binding-linux-arm64-gnu@1.1.5': optional: true - '@rspack/binding-linux-arm64-musl@1.1.2': + '@rspack/binding-linux-arm64-musl@1.1.3': optional: true '@rspack/binding-linux-arm64-musl@1.1.5': optional: true - '@rspack/binding-linux-x64-gnu@1.1.2': + '@rspack/binding-linux-x64-gnu@1.1.3': optional: true '@rspack/binding-linux-x64-gnu@1.1.5': optional: true - '@rspack/binding-linux-x64-musl@1.1.2': + '@rspack/binding-linux-x64-musl@1.1.3': optional: true '@rspack/binding-linux-x64-musl@1.1.5': optional: true - '@rspack/binding-win32-arm64-msvc@1.1.2': + '@rspack/binding-win32-arm64-msvc@1.1.3': optional: true '@rspack/binding-win32-arm64-msvc@1.1.5': optional: true - '@rspack/binding-win32-ia32-msvc@1.1.2': + '@rspack/binding-win32-ia32-msvc@1.1.3': optional: true '@rspack/binding-win32-ia32-msvc@1.1.5': optional: true - '@rspack/binding-win32-x64-msvc@1.1.2': + '@rspack/binding-win32-x64-msvc@1.1.3': optional: true '@rspack/binding-win32-x64-msvc@1.1.5': optional: true - '@rspack/binding@1.1.2': + '@rspack/binding@1.1.3': optionalDependencies: - '@rspack/binding-darwin-arm64': 1.1.2 - '@rspack/binding-darwin-x64': 1.1.2 - '@rspack/binding-linux-arm64-gnu': 1.1.2 - '@rspack/binding-linux-arm64-musl': 1.1.2 - '@rspack/binding-linux-x64-gnu': 1.1.2 - '@rspack/binding-linux-x64-musl': 1.1.2 - '@rspack/binding-win32-arm64-msvc': 1.1.2 - '@rspack/binding-win32-ia32-msvc': 1.1.2 - '@rspack/binding-win32-x64-msvc': 1.1.2 + '@rspack/binding-darwin-arm64': 1.1.3 + '@rspack/binding-darwin-x64': 1.1.3 + '@rspack/binding-linux-arm64-gnu': 1.1.3 + '@rspack/binding-linux-arm64-musl': 1.1.3 + '@rspack/binding-linux-x64-gnu': 1.1.3 + '@rspack/binding-linux-x64-musl': 1.1.3 + '@rspack/binding-win32-arm64-msvc': 1.1.3 + '@rspack/binding-win32-ia32-msvc': 1.1.3 + '@rspack/binding-win32-x64-msvc': 1.1.3 '@rspack/binding@1.1.5': optionalDependencies: @@ -23997,12 +24026,12 @@ snapshots: '@rspack/binding-win32-ia32-msvc': 1.1.5 '@rspack/binding-win32-x64-msvc': 1.1.5 - '@rspack/core@1.1.2(@swc/helpers@0.5.11)': + '@rspack/core@1.1.3(@swc/helpers@0.5.11)': dependencies: '@module-federation/runtime-tools': 0.5.1 - '@rspack/binding': 1.1.2 + '@rspack/binding': 1.1.3 '@rspack/lite-tapable': 1.0.1 - caniuse-lite: 1.0.30001662 + caniuse-lite: 1.0.30001684 optionalDependencies: '@swc/helpers': 0.5.11 @@ -24025,7 +24054,7 @@ snapshots: mime-types: 2.1.35 p-retry: 4.6.2 webpack-dev-middleware: 7.4.2(webpack@5.88.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.19.5)(webpack-cli@5.1.4)) - webpack-dev-server: 5.0.4(webpack-cli@5.1.4)(webpack@5.88.0) + webpack-dev-server: 5.0.4(webpack-cli@5.1.4(webpack-dev-server@5.0.4)(webpack@5.88.0))(webpack@5.88.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.19.5)(webpack-cli@5.1.4)) ws: 8.18.0 transitivePeerDependencies: - '@types/express' @@ -24638,7 +24667,7 @@ snapshots: '@swc-node/sourcemap-support@0.5.1': dependencies: source-map-support: 0.5.21 - tslib: 2.7.0 + tslib: 2.8.1 '@swc/cli@0.3.12(@swc/core@1.5.7(@swc/helpers@0.5.11))(chokidar@3.6.0)': dependencies: @@ -24711,7 +24740,7 @@ snapshots: '@swc/helpers@0.5.5': dependencies: '@swc/counter': 0.1.3 - tslib: 2.7.0 + tslib: 2.8.1 '@swc/jest@0.2.36(@swc/core@1.5.7(@swc/helpers@0.5.11))': dependencies: @@ -25227,14 +25256,14 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/eslint-plugin@8.6.0(@typescript-eslint/parser@8.6.0(eslint@8.57.0)(typescript@5.6.3))(eslint@8.57.0)(typescript@5.6.3)': + '@typescript-eslint/eslint-plugin@8.16.0(@typescript-eslint/parser@8.6.0(eslint@8.57.0)(typescript@5.6.3))(eslint@8.57.0)(typescript@5.6.3)': dependencies: '@eslint-community/regexpp': 4.11.1 '@typescript-eslint/parser': 8.6.0(eslint@8.57.0)(typescript@5.6.3) - '@typescript-eslint/scope-manager': 8.6.0 - '@typescript-eslint/type-utils': 8.6.0(eslint@8.57.0)(typescript@5.6.3) - '@typescript-eslint/utils': 8.6.0(eslint@8.57.0)(typescript@5.6.3) - '@typescript-eslint/visitor-keys': 8.6.0 + '@typescript-eslint/scope-manager': 8.16.0 + '@typescript-eslint/type-utils': 8.16.0(eslint@8.57.0)(typescript@5.6.3) + '@typescript-eslint/utils': 8.16.0(eslint@8.57.0)(typescript@5.6.3) + '@typescript-eslint/visitor-keys': 8.16.0 eslint: 8.57.0 graphemer: 1.4.0 ignore: 5.3.2 @@ -25311,18 +25340,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/type-utils@8.6.0(eslint@8.57.0)(typescript@5.6.3)': - dependencies: - '@typescript-eslint/typescript-estree': 8.6.0(typescript@5.6.3) - '@typescript-eslint/utils': 8.6.0(eslint@8.57.0)(typescript@5.6.3) - debug: 4.3.7(supports-color@8.1.1) - ts-api-utils: 1.3.0(typescript@5.6.3) - optionalDependencies: - typescript: 5.6.3 - transitivePeerDependencies: - - eslint - - supports-color - '@typescript-eslint/types@5.62.0': {} '@typescript-eslint/types@8.16.0': {} @@ -25400,17 +25417,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.6.0(eslint@8.57.0)(typescript@5.6.3)': - dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) - '@typescript-eslint/scope-manager': 8.6.0 - '@typescript-eslint/types': 8.6.0 - '@typescript-eslint/typescript-estree': 8.6.0(typescript@5.6.3) - eslint: 8.57.0 - transitivePeerDependencies: - - supports-color - - typescript - '@typescript-eslint/visitor-keys@5.62.0': dependencies: '@typescript-eslint/types': 5.62.0 @@ -25482,7 +25488,7 @@ snapshots: lru-cache: 10.4.3 media-query-parser: 2.0.2 modern-ahocorasick: 1.0.1 - picocolors: 1.1.0 + picocolors: 1.1.1 transitivePeerDependencies: - babel-plugin-macros @@ -25804,6 +25810,23 @@ snapshots: transitivePeerDependencies: - supports-color + '@vue/babel-plugin-jsx@1.2.5(@babel/core@7.26.0)': + dependencies: + '@babel/helper-module-imports': 7.24.7 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/plugin-syntax-jsx': 7.24.7(@babel/core@7.26.0) + '@babel/template': 7.25.0 + '@babel/traverse': 7.25.9 + '@babel/types': 7.26.0 + '@vue/babel-helper-vue-transform-on': 1.2.5 + '@vue/babel-plugin-resolve-type': 1.2.5(@babel/core@7.26.0) + html-tags: 3.3.1 + svg-tags: 1.0.0 + optionalDependencies: + '@babel/core': 7.26.0 + transitivePeerDependencies: + - supports-color + '@vue/babel-plugin-resolve-type@1.2.5(@babel/core@7.25.2)': dependencies: '@babel/code-frame': 7.24.7 @@ -25815,6 +25838,17 @@ snapshots: transitivePeerDependencies: - supports-color + '@vue/babel-plugin-resolve-type@1.2.5(@babel/core@7.26.0)': + dependencies: + '@babel/code-frame': 7.24.7 + '@babel/core': 7.26.0 + '@babel/helper-module-imports': 7.24.7 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/parser': 7.25.6 + '@vue/compiler-sfc': 3.5.6 + transitivePeerDependencies: + - supports-color + '@vue/compiler-core@3.5.6': dependencies: '@babel/parser': 7.25.6 @@ -25990,7 +26024,7 @@ snapshots: webpack: 5.88.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.19.5)(webpack-cli@5.1.4) webpack-cli: 5.1.4(webpack-dev-server@5.0.4)(webpack@5.88.0) optionalDependencies: - webpack-dev-server: 5.0.4(webpack-cli@5.1.4)(webpack@5.88.0) + webpack-dev-server: 5.0.4(webpack-cli@5.1.4(webpack-dev-server@5.0.4)(webpack@5.88.0))(webpack@5.88.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.19.5)(webpack-cli@5.1.4)) '@widgetbot/embed-api@1.2.15': dependencies: @@ -26454,7 +26488,7 @@ snapshots: caniuse-lite: 1.0.30001662 fraction.js: 4.3.7 normalize-range: 0.1.2 - picocolors: 1.1.0 + picocolors: 1.1.1 postcss: 8.4.47 postcss-value-parser: 4.2.0 @@ -26464,7 +26498,7 @@ snapshots: caniuse-lite: 1.0.30001662 fraction.js: 4.3.7 normalize-range: 0.1.2 - picocolors: 1.1.0 + picocolors: 1.1.1 postcss: 8.4.49 postcss-value-parser: 4.2.0 @@ -26510,6 +26544,13 @@ snapshots: schema-utils: 4.2.0 webpack: 5.88.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.19.5)(webpack-cli@5.1.4) + babel-loader@9.2.1(@babel/core@7.26.0)(webpack@5.88.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.19.5)(webpack-cli@5.1.4)): + dependencies: + '@babel/core': 7.26.0 + find-cache-dir: 4.0.0 + schema-utils: 4.2.0 + webpack: 5.88.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.19.5)(webpack-cli@5.1.4) + babel-loader@9.2.1(@babel/core@7.26.0)(webpack@5.96.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.24.0)(webpack-cli@5.1.4(webpack-dev-server@5.0.4)(webpack@5.88.0))): dependencies: '@babel/core': 7.26.0 @@ -26517,12 +26558,12 @@ snapshots: schema-utils: 4.2.0 webpack: 5.96.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.24.0)(webpack-cli@5.1.4(webpack-dev-server@5.0.4)(webpack@5.88.0)) - babel-plugin-const-enum@1.2.0(@babel/core@7.25.2): + babel-plugin-const-enum@1.2.0(@babel/core@7.26.0): dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-syntax-typescript': 7.25.4(@babel/core@7.25.2) - '@babel/traverse': 7.25.6 + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-syntax-typescript': 7.25.4(@babel/core@7.26.0) + '@babel/traverse': 7.25.9 transitivePeerDependencies: - supports-color @@ -26545,7 +26586,7 @@ snapshots: babel-plugin-macros@2.8.0: dependencies: - '@babel/runtime': 7.25.6 + '@babel/runtime': 7.26.0 cosmiconfig: 6.0.0 resolve: 1.22.8 @@ -26597,10 +26638,10 @@ snapshots: transitivePeerDependencies: - supports-color - babel-plugin-transform-typescript-metadata@0.3.2(@babel/core@7.25.2)(@babel/traverse@7.25.9): + babel-plugin-transform-typescript-metadata@0.3.2(@babel/core@7.26.0)(@babel/traverse@7.25.9): dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 optionalDependencies: '@babel/traverse': 7.25.9 @@ -26969,7 +27010,7 @@ snapshots: camel-case@4.1.2: dependencies: pascal-case: 3.1.2 - tslib: 2.7.0 + tslib: 2.8.1 camelcase-css@2.0.1: {} @@ -26990,7 +27031,7 @@ snapshots: caniuse-api@3.0.0: dependencies: browserslist: 4.23.3 - caniuse-lite: 1.0.30001684 + caniuse-lite: 1.0.30001662 lodash.memoize: 4.1.2 lodash.uniq: 4.5.0 @@ -28239,7 +28280,7 @@ snapshots: dot-case@3.0.4: dependencies: no-case: 3.0.4 - tslib: 2.7.0 + tslib: 2.8.1 dot-prop@5.3.0: dependencies: @@ -28727,7 +28768,7 @@ snapshots: dependencies: '@next/eslint-plugin-next': 14.2.16 '@rushstack/eslint-patch': 1.10.4 - '@typescript-eslint/eslint-plugin': 8.6.0(@typescript-eslint/parser@8.6.0(eslint@8.57.0)(typescript@5.6.3))(eslint@8.57.0)(typescript@5.6.3) + '@typescript-eslint/eslint-plugin': 8.16.0(@typescript-eslint/parser@8.6.0(eslint@8.57.0)(typescript@5.6.3))(eslint@8.57.0)(typescript@5.6.3) '@typescript-eslint/parser': 8.6.0(eslint@8.57.0)(typescript@5.6.3) eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 @@ -31471,7 +31512,7 @@ snapshots: launch-editor@2.9.1: dependencies: - picocolors: 1.1.0 + picocolors: 1.1.1 shell-quote: 1.8.1 lazy-ass@1.6.0: {} @@ -31777,7 +31818,7 @@ snapshots: lower-case@2.0.2: dependencies: - tslib: 2.7.0 + tslib: 2.8.1 lowercase-keys@2.0.0: {} @@ -32036,7 +32077,7 @@ snapshots: media-query-parser@2.0.2: dependencies: - '@babel/runtime': 7.25.6 + '@babel/runtime': 7.26.0 media-typer@0.3.0: {} @@ -32046,10 +32087,10 @@ snapshots: memfs@4.12.0: dependencies: - '@jsonjoy.com/json-pack': 1.1.0(tslib@2.7.0) - '@jsonjoy.com/util': 1.3.0(tslib@2.7.0) - tree-dump: 1.0.2(tslib@2.7.0) - tslib: 2.7.0 + '@jsonjoy.com/json-pack': 1.1.0(tslib@2.8.1) + '@jsonjoy.com/util': 1.3.0(tslib@2.8.1) + tree-dump: 1.0.2(tslib@2.8.1) + tslib: 2.8.1 memoizee@0.4.17: dependencies: @@ -32900,7 +32941,7 @@ snapshots: no-case@3.0.4: dependencies: lower-case: 2.0.2 - tslib: 2.7.0 + tslib: 2.8.1 node-abort-controller@3.1.1: {} @@ -33258,7 +33299,7 @@ snapshots: tar-stream: 2.2.0 tmp: 0.2.3 tsconfig-paths: 4.2.0 - tslib: 2.7.0 + tslib: 2.8.1 yargs: 17.6.2 yargs-parser: 21.1.1 optionalDependencies: @@ -33277,7 +33318,7 @@ snapshots: transitivePeerDependencies: - debug - nx@20.2.0-beta.3(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)): + nx@20.2.0-beta.7(@swc-node/register@1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3))(@swc/core@1.5.7(@swc/helpers@0.5.11)): dependencies: '@napi-rs/wasm-runtime': 0.2.4 '@yarnpkg/lockfile': 1.1.0 @@ -33308,20 +33349,20 @@ snapshots: tar-stream: 2.2.0 tmp: 0.2.3 tsconfig-paths: 4.2.0 - tslib: 2.7.0 + tslib: 2.8.1 yargs: 17.6.2 yargs-parser: 21.1.1 optionalDependencies: - '@nx/nx-darwin-arm64': 20.2.0-beta.3 - '@nx/nx-darwin-x64': 20.2.0-beta.3 - '@nx/nx-freebsd-x64': 20.2.0-beta.3 - '@nx/nx-linux-arm-gnueabihf': 20.2.0-beta.3 - '@nx/nx-linux-arm64-gnu': 20.2.0-beta.3 - '@nx/nx-linux-arm64-musl': 20.2.0-beta.3 - '@nx/nx-linux-x64-gnu': 20.2.0-beta.3 - '@nx/nx-linux-x64-musl': 20.2.0-beta.3 - '@nx/nx-win32-arm64-msvc': 20.2.0-beta.3 - '@nx/nx-win32-x64-msvc': 20.2.0-beta.3 + '@nx/nx-darwin-arm64': 20.2.0-beta.7 + '@nx/nx-darwin-x64': 20.2.0-beta.7 + '@nx/nx-freebsd-x64': 20.2.0-beta.7 + '@nx/nx-linux-arm-gnueabihf': 20.2.0-beta.7 + '@nx/nx-linux-arm64-gnu': 20.2.0-beta.7 + '@nx/nx-linux-arm64-musl': 20.2.0-beta.7 + '@nx/nx-linux-x64-gnu': 20.2.0-beta.7 + '@nx/nx-linux-x64-musl': 20.2.0-beta.7 + '@nx/nx-win32-arm64-msvc': 20.2.0-beta.7 + '@nx/nx-win32-x64-msvc': 20.2.0-beta.7 '@swc-node/register': 1.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@swc/types@0.1.12)(typescript@5.6.3) '@swc/core': 1.5.7(@swc/helpers@0.5.11) transitivePeerDependencies: @@ -33629,7 +33670,7 @@ snapshots: param-case@3.0.4: dependencies: dot-case: 3.0.4 - tslib: 2.7.0 + tslib: 2.8.1 parent-module@1.0.1: dependencies: @@ -33711,7 +33752,7 @@ snapshots: pascal-case@3.1.2: dependencies: no-case: 3.0.4 - tslib: 2.7.0 + tslib: 2.8.1 path-browserify@1.0.1: {} @@ -34665,7 +34706,7 @@ snapshots: postcss@8.4.31: dependencies: nanoid: 3.3.7 - picocolors: 1.1.0 + picocolors: 1.1.1 source-map-js: 1.2.1 postcss@8.4.38: @@ -34677,7 +34718,7 @@ snapshots: postcss@8.4.47: dependencies: nanoid: 3.3.7 - picocolors: 1.1.0 + picocolors: 1.1.1 source-map-js: 1.2.1 postcss@8.4.49: @@ -35857,7 +35898,7 @@ snapshots: snake-case@3.0.4: dependencies: dot-case: 3.0.4 - tslib: 2.7.0 + tslib: 2.8.1 sockjs@0.3.24: dependencies: @@ -36365,7 +36406,7 @@ snapshots: css-select: 4.3.0 css-tree: 1.1.3 csso: 4.2.0 - picocolors: 1.1.0 + picocolors: 1.1.1 stable: 0.1.8 svgo@3.3.2: @@ -36376,7 +36417,7 @@ snapshots: css-tree: 2.3.1 css-what: 6.1.0 csso: 5.0.5 - picocolors: 1.1.0 + picocolors: 1.1.1 swagger-ui-dist@4.18.2: {} @@ -36566,9 +36607,9 @@ snapshots: dependencies: any-promise: 1.3.0 - thingies@1.21.0(tslib@2.7.0): + thingies@1.21.0(tslib@2.8.1): dependencies: - tslib: 2.7.0 + tslib: 2.8.1 thread-stream@0.15.2: dependencies: @@ -36682,9 +36723,9 @@ snapshots: traverse@0.3.9: {} - tree-dump@1.0.2(tslib@2.7.0): + tree-dump@1.0.2(tslib@2.8.1): dependencies: - tslib: 2.7.0 + tslib: 2.8.1 tree-kill@1.2.2: {} @@ -36750,26 +36791,6 @@ snapshots: typescript: 5.6.3 webpack: 5.88.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.19.5)(webpack-cli@5.1.4) - ts-node@10.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(typescript@5.4.5): - dependencies: - '@cspotcode/source-map-support': 0.8.1 - '@tsconfig/node10': 1.0.11 - '@tsconfig/node12': 1.0.11 - '@tsconfig/node14': 1.0.3 - '@tsconfig/node16': 1.0.4 - '@types/node': 20.16.10 - acorn: 8.12.1 - acorn-walk: 8.3.4 - arg: 4.1.3 - create-require: 1.1.1 - diff: 4.0.2 - make-error: 1.3.6 - typescript: 5.4.5 - v8-compile-cache-lib: 3.0.1 - yn: 3.1.1 - optionalDependencies: - '@swc/core': 1.5.7(@swc/helpers@0.5.11) - ts-node@10.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(typescript@5.6.3): dependencies: '@cspotcode/source-map-support': 0.8.1 @@ -36951,8 +36972,6 @@ snapshots: typescript@5.3.3: {} - typescript@5.4.5: {} - typescript@5.6.3: {} ufo@1.5.4: {} @@ -37231,13 +37250,13 @@ snapshots: dependencies: browserslist: 4.23.3 escalade: 3.2.0 - picocolors: 1.1.0 + picocolors: 1.1.1 update-browserslist-db@1.1.1(browserslist@4.24.2): dependencies: browserslist: 4.24.2 escalade: 3.2.0 - picocolors: 1.1.0 + picocolors: 1.1.1 uqr@0.1.2: {} @@ -37441,7 +37460,7 @@ snapshots: cac: 6.7.14 debug: 4.3.7(supports-color@8.1.1) pathe: 1.1.2 - picocolors: 1.1.0 + picocolors: 1.1.1 vite: 5.0.8(@types/node@20.16.10)(less@4.1.3)(sass@1.55.0)(stylus@0.64.0)(terser@5.36.0) transitivePeerDependencies: - '@types/node' @@ -37458,7 +37477,7 @@ snapshots: cac: 6.7.14 debug: 4.3.7(supports-color@8.1.1) pathe: 1.1.2 - picocolors: 1.1.0 + picocolors: 1.1.1 vite: 5.0.8(@types/node@20.16.10)(less@4.1.3)(sass@1.55.0)(stylus@0.64.0)(terser@5.36.0) transitivePeerDependencies: - '@types/node' @@ -37517,7 +37536,7 @@ snapshots: fs-extra: 11.2.0 open: 10.1.0 perfect-debounce: 1.0.0 - picocolors: 1.1.0 + picocolors: 1.1.1 sirv: 2.0.4 vite: 5.0.8(@types/node@20.16.10)(less@4.1.3)(sass@1.55.0)(stylus@0.64.0)(terser@5.36.0) optionalDependencies: @@ -37528,12 +37547,12 @@ snapshots: vite-plugin-vue-inspector@5.2.0(vite@5.0.8(@types/node@20.16.10)(less@4.1.3)(sass@1.55.0)(stylus@0.64.0)(terser@5.36.0)): dependencies: - '@babel/core': 7.25.2 - '@babel/plugin-proposal-decorators': 7.24.7(@babel/core@7.25.2) - '@babel/plugin-syntax-import-attributes': 7.25.6(@babel/core@7.25.2) - '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.25.2) - '@babel/plugin-transform-typescript': 7.25.2(@babel/core@7.25.2) - '@vue/babel-plugin-jsx': 1.2.5(@babel/core@7.25.2) + '@babel/core': 7.26.0 + '@babel/plugin-proposal-decorators': 7.24.7(@babel/core@7.26.0) + '@babel/plugin-syntax-import-attributes': 7.25.6(@babel/core@7.26.0) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.26.0) + '@babel/plugin-transform-typescript': 7.25.2(@babel/core@7.26.0) + '@vue/babel-plugin-jsx': 1.2.5(@babel/core@7.26.0) '@vue/compiler-dom': 3.5.6 kolorist: 1.8.0 magic-string: 0.30.12 @@ -37731,7 +37750,7 @@ snapshots: webpack: 5.88.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.19.5)(webpack-cli@5.1.4) webpack-merge: 5.10.0 optionalDependencies: - webpack-dev-server: 5.0.4(webpack-cli@5.1.4)(webpack@5.88.0) + webpack-dev-server: 5.0.4(webpack-cli@5.1.4(webpack-dev-server@5.0.4)(webpack@5.88.0))(webpack@5.88.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.19.5)(webpack-cli@5.1.4)) webpack-dev-middleware@6.1.3(webpack@5.88.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.19.5)(webpack-cli@5.1.4)): dependencies: @@ -37765,7 +37784,7 @@ snapshots: optionalDependencies: webpack: 5.96.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.24.0)(webpack-cli@5.1.4(webpack-dev-server@5.0.4)(webpack@5.88.0)) - webpack-dev-server@5.0.4(webpack-cli@5.1.4)(webpack@5.88.0): + webpack-dev-server@5.0.4(webpack-cli@5.1.4(webpack-dev-server@5.0.4)(webpack@5.88.0))(webpack@5.88.0(@swc/core@1.5.7(@swc/helpers@0.5.11))(esbuild@0.19.5)(webpack-cli@5.1.4)): dependencies: '@types/bonjour': 3.5.13 '@types/connect-history-api-fallback': 1.5.4 From 15060e3a4f727d730c78a93513fe6d429d642c9c Mon Sep 17 00:00:00 2001 From: Jason Jean Date: Wed, 4 Dec 2024 17:27:35 -0500 Subject: [PATCH 10/21] fix(core): recreate db when unable to connect (#29207) ## Current Behavior When Nx is unable to connect to the DB, nothing works and the user needs to run `nx reset` to remove the db file. ## Expected Behavior When Nx is unable to connect to the DB, the db is destroyed and recreated automatically within the same command. ## Related Issue(s) Fixes # --- packages/nx/src/native/db/initialize.rs | 74 ++++++++++++++----------- 1 file changed, 42 insertions(+), 32 deletions(-) diff --git a/packages/nx/src/native/db/initialize.rs b/packages/nx/src/native/db/initialize.rs index 5ad5264b33445..ada1ebb349630 100644 --- a/packages/nx/src/native/db/initialize.rs +++ b/packages/nx/src/native/db/initialize.rs @@ -37,44 +37,54 @@ pub(super) fn create_lock_file(db_path: &Path) -> anyhow::Result { } pub(super) fn initialize_db(nx_version: String, db_path: &Path) -> anyhow::Result { - let mut c = open_database_connection(db_path)?; - - trace!( - "Checking if current existing database is compatible with Nx {}", - nx_version - ); - let db_version = c.query_row( - "SELECT value FROM metadata WHERE key='NX_VERSION'", - [], - |row| { - let r: String = row.get(0)?; - Ok(r) - }, - ); - let c = match db_version { - Ok(Some(version)) if version == nx_version => { - trace!("Database is compatible with Nx {}", nx_version); - c + match open_database_connection(db_path) { + Ok(mut c) => { + trace!( + "Checking if current existing database is compatible with Nx {}", + nx_version + ); + let db_version = c.query_row( + "SELECT value FROM metadata WHERE key='NX_VERSION'", + [], + |row| { + let r: String = row.get(0)?; + Ok(r) + }, + ); + let c = match db_version { + Ok(Some(version)) if version == nx_version => { + trace!("Database is compatible with Nx {}", nx_version); + c + } + // If there is no metadata, it means that this database is new + Err(s) if s.to_string().contains("metadata") => { + configure_database(&c)?; + create_metadata_table(&mut c, &nx_version)?; + c + } + reason => { + trace!("Incompatible database because: {:?}", reason); + trace!("Disconnecting from existing incompatible database"); + c.close()?; + trace!("Removing existing incompatible database"); + remove_file(db_path)?; + + trace!("Initializing a new database"); + initialize_db(nx_version, db_path)? + } + }; + + Ok(c) } - // If there is no metadata, it means that this database is new - Err(s) if s.to_string().contains("metadata") => { - configure_database(&c)?; - create_metadata_table(&mut c, &nx_version)?; - c - } - reason => { - trace!("Incompatible database because: {:?}", reason); - trace!("Disconnecting from existing incompatible database"); - c.close()?; + Err(reason) => { + trace!("Unable to connect to existing database because: {:?}", reason); trace!("Removing existing incompatible database"); remove_file(db_path)?; trace!("Initializing a new database"); - initialize_db(nx_version, db_path)? + initialize_db(nx_version, db_path) } - }; - - Ok(c) + } } fn create_metadata_table(c: &mut NxDbConnection, nx_version: &str) -> anyhow::Result<()> { From 2fa3ce21d4a819b69fd58fd1139c26b73a6fa19b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Leosvel=20P=C3=A9rez=20Espinosa?= Date: Thu, 5 Dec 2024 11:12:52 +0100 Subject: [PATCH 11/21] feat(angular): add migration to remove angular eslint rules removed in v19 (#29214) Add migration to remove Angular ESLint rules that were removed in v19: - `@angular-eslint/no-host-metadata-property` - `@angular-eslint/sort-ngmodule-metadata-arrays` - `@angular-eslint/prefer-standalone-component` See Angular ESLint v19 changelog for reference: https://github.com/angular-eslint/angular-eslint/blob/main/CHANGELOG.md#1900-2024-11-29 ## Current Behavior ## Expected Behavior ## Related Issue(s) Fixes # --- packages/angular/migrations.json | 9 + .../remove-angular-eslint-rules.spec.ts | 155 ++++++++++++++++++ .../remove-angular-eslint-rules.ts | 43 +++++ .../generators/utils/flat-config/ast-utils.ts | 4 +- 4 files changed, 210 insertions(+), 1 deletion(-) create mode 100644 packages/angular/src/migrations/update-20-2-0/remove-angular-eslint-rules.spec.ts create mode 100644 packages/angular/src/migrations/update-20-2-0/remove-angular-eslint-rules.ts diff --git a/packages/angular/migrations.json b/packages/angular/migrations.json index a73e327498dfe..aabb5b7630a02 100644 --- a/packages/angular/migrations.json +++ b/packages/angular/migrations.json @@ -314,6 +314,15 @@ }, "description": "Disable the Angular ESLint prefer-standalone rule if not set.", "factory": "./src/migrations/update-20-2-0/disable-angular-eslint-prefer-standalone" + }, + "remove-angular-eslint-rules": { + "cli": "nx", + "version": "20.2.0-beta.8", + "requires": { + "@angular/core": ">=19.0.0" + }, + "description": "Remove Angular ESLint rules that were removed in v19.0.0.", + "factory": "./src/migrations/update-20-2-0/remove-angular-eslint-rules" } }, "packageJsonUpdates": { diff --git a/packages/angular/src/migrations/update-20-2-0/remove-angular-eslint-rules.spec.ts b/packages/angular/src/migrations/update-20-2-0/remove-angular-eslint-rules.spec.ts new file mode 100644 index 0000000000000..aab8d43539dc5 --- /dev/null +++ b/packages/angular/src/migrations/update-20-2-0/remove-angular-eslint-rules.spec.ts @@ -0,0 +1,155 @@ +import { + addProjectConfiguration, + writeJson, + type ProjectConfiguration, + type ProjectGraph, + type Tree, +} from '@nx/devkit'; +import { createTreeWithEmptyWorkspace } from '@nx/devkit/testing'; +import migration from './remove-angular-eslint-rules'; + +let projectGraph: ProjectGraph; +jest.mock('@nx/devkit', () => ({ + ...jest.requireActual('@nx/devkit'), + createProjectGraphAsync: () => Promise.resolve(projectGraph), +})); + +describe('remove-angular-eslint-rules', () => { + let tree: Tree; + + beforeEach(() => { + tree = createTreeWithEmptyWorkspace(); + + const projectConfig: ProjectConfiguration = { + name: 'app1', + root: 'apps/app1', + }; + projectGraph = { + dependencies: { + app1: [ + { + source: 'app1', + target: 'npm:@angular/core', + type: 'static', + }, + ], + }, + nodes: { + app1: { + data: projectConfig, + name: 'app1', + type: 'app', + }, + }, + }; + addProjectConfiguration(tree, projectConfig.name, projectConfig); + }); + + describe('.eslintrc.json', () => { + it.each([ + ['@angular-eslint/no-host-metadata-property'], + ['@angular-eslint/sort-ngmodule-metadata-arrays'], + ['@angular-eslint/prefer-standalone-component'], + ])('should remove %s rule', async (rule) => { + writeJson(tree, 'apps/app1/.eslintrc.json', { + overrides: [ + { + files: ['*.ts'], + rules: { [rule]: ['error'] }, + }, + ], + }); + + await migration(tree); + + expect(tree.read('apps/app1/.eslintrc.json', 'utf8')).not.toContain(rule); + }); + + it('should remove multiple rules', async () => { + writeJson(tree, 'apps/app1/.eslintrc.json', { + overrides: [ + { + files: ['*.ts'], + rules: { + '@angular-eslint/no-host-metadata-property': ['error'], + '@angular-eslint/sort-ngmodule-metadata-arrays': ['error'], + '@angular-eslint/prefer-standalone-component': ['error'], + }, + }, + ], + }); + + await migration(tree); + + expect(tree.read('apps/app1/.eslintrc.json', 'utf8')) + .toMatchInlineSnapshot(` + "{ + "overrides": [ + { + "files": ["*.ts"], + "rules": {} + } + ] + } + " + `); + }); + }); + + describe('flat config', () => { + it.each([ + ['@angular-eslint/no-host-metadata-property'], + ['@angular-eslint/sort-ngmodule-metadata-arrays'], + ['@angular-eslint/prefer-standalone-component'], + ])('should remove %s rule', async (rule) => { + tree.write('eslint.config.js', 'module.exports = [];'); + tree.write( + 'apps/app1/eslint.config.js', + `module.exports = [ + { + files: ['*.ts'], + rules: { '${rule}': ['error'] }, + }, + ]; + ` + ); + + await migration(tree); + + expect(tree.read('apps/app1/eslint.config.js', 'utf8')).not.toContain( + rule + ); + }); + + it('should remove multiple rules', async () => { + tree.write('eslint.config.js', 'module.exports = [];'); + tree.write( + 'apps/app1/eslint.config.js', + `module.exports = [ + { + files: ['*.ts'], + rules: { + '@angular-eslint/no-host-metadata-property': ['error'], + '@angular-eslint/sort-ngmodule-metadata-arrays': ['error'], + '@angular-eslint/prefer-standalone-component': ['error'], + }, + }, + ]; + ` + ); + + await migration(tree); + + expect(tree.read('apps/app1/eslint.config.js', 'utf8')) + .toMatchInlineSnapshot(` + "module.exports = [ + { + files: ['**/*.ts'], + rules: {}, + }, + ]; + " + `); + }); + }); +}); diff --git a/packages/angular/src/migrations/update-20-2-0/remove-angular-eslint-rules.ts b/packages/angular/src/migrations/update-20-2-0/remove-angular-eslint-rules.ts new file mode 100644 index 0000000000000..4a41f89a46091 --- /dev/null +++ b/packages/angular/src/migrations/update-20-2-0/remove-angular-eslint-rules.ts @@ -0,0 +1,43 @@ +import { formatFiles, type Tree } from '@nx/devkit'; +import { + isEslintConfigSupported, + lintConfigHasOverride, + updateOverrideInLintConfig, +} from '@nx/eslint/src/generators/utils/eslint-file'; +import { getProjectsFilteredByDependencies } from '../utils/projects'; + +export default async function (tree: Tree) { + const projects = await getProjectsFilteredByDependencies(tree, [ + 'npm:@angular/core', + ]); + + for (const { + project: { root }, + } of projects) { + if (!isEslintConfigSupported(tree, root)) { + // ESLint config is not supported, skip + continue; + } + + removeRule(tree, root, '@angular-eslint/no-host-metadata-property'); + removeRule(tree, root, '@angular-eslint/sort-ngmodule-metadata-arrays'); + removeRule(tree, root, '@angular-eslint/prefer-standalone-component'); + } + + await formatFiles(tree); +} + +function removeRule(tree: Tree, root: string, rule: string) { + const lookup: Parameters[2] = (o) => + !!o.rules?.[rule]; + if (!lintConfigHasOverride(tree, root, lookup, true)) { + // it's not using the rule, skip + return; + } + + // there is an override containing the rule, remove the rule + updateOverrideInLintConfig(tree, root, lookup, (o) => { + delete o.rules[rule]; + return o; + }); +} diff --git a/packages/eslint/src/generators/utils/flat-config/ast-utils.ts b/packages/eslint/src/generators/utils/flat-config/ast-utils.ts index c86ceefc8d9ff..5cb81e13a371b 100644 --- a/packages/eslint/src/generators/utils/flat-config/ast-utils.ts +++ b/packages/eslint/src/generators/utils/flat-config/ast-utils.ts @@ -63,7 +63,9 @@ function findAllBlocks(source: ts.SourceFile): ts.NodeArray { function isOverride(node: ts.Node): boolean { return ( (ts.isObjectLiteralExpression(node) && - node.properties.some((p) => p.name.getText() === 'files')) || + node.properties.some( + (p) => p.name.getText() === 'files' || p.name.getText() === '"files"' + )) || // detect ...compat.config(...).map(...) (ts.isSpreadElement(node) && ts.isCallExpression(node.expression) && From b848bb3dba92e75f1eed9afc0fdc9b28fd39895d Mon Sep 17 00:00:00 2001 From: Thomas Dekiere Date: Thu, 5 Dec 2024 13:38:04 +0100 Subject: [PATCH 12/21] fix(release): skip changelog generation for projects without available version data (#29212) --- packages/nx/src/command-line/release/changelog.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/packages/nx/src/command-line/release/changelog.ts b/packages/nx/src/command-line/release/changelog.ts index fd97f74adb1b3..2c38293e6af3b 100644 --- a/packages/nx/src/command-line/release/changelog.ts +++ b/packages/nx/src/command-line/release/changelog.ts @@ -1230,7 +1230,10 @@ async function generateChangelogForProjects({ * newVersion will be null in the case that no changes were detected (e.g. in conventional commits mode), * no changelog entry is relevant in that case. */ - if (projectsVersionData[project.name].newVersion === null) { + if ( + !projectsVersionData[project.name] || + projectsVersionData[project.name].newVersion === null + ) { continue; } From 625d8f3095df499541fb7254f7632bf8e791fde5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Leosvel=20P=C3=A9rez=20Espinosa?= Date: Thu, 5 Dec 2024 16:18:50 +0100 Subject: [PATCH 13/21] feat(angular): add migration to remove the `tailwindConfig` option from ng-packager executors (#29220) Add migration to remove the `tailwindConfig` option from the ng-packagr executors, which have been unused since Angular v17. Tailwind CSS configurations located at the project or workspace root will be picked up automatically. ## Current Behavior ## Expected Behavior ## Related Issue(s) Fixes #29217 --- packages/angular/migrations.json | 9 + ...d-config-from-ng-packagr-executors.spec.ts | 267 ++++++++++++++++++ ...ilwind-config-from-ng-packagr-executors.ts | 105 +++++++ 3 files changed, 381 insertions(+) create mode 100644 packages/angular/src/migrations/update-20-2-0/remove-tailwind-config-from-ng-packagr-executors.spec.ts create mode 100644 packages/angular/src/migrations/update-20-2-0/remove-tailwind-config-from-ng-packagr-executors.ts diff --git a/packages/angular/migrations.json b/packages/angular/migrations.json index aabb5b7630a02..ae5ed35b0e129 100644 --- a/packages/angular/migrations.json +++ b/packages/angular/migrations.json @@ -323,6 +323,15 @@ }, "description": "Remove Angular ESLint rules that were removed in v19.0.0.", "factory": "./src/migrations/update-20-2-0/remove-angular-eslint-rules" + }, + "remove-tailwind-config-from-ng-packagr-executors": { + "cli": "nx", + "version": "20.2.0-beta.8", + "requires": { + "@angular/core": ">=19.0.0" + }, + "description": "Remove the deprecated 'tailwindConfig' option from ng-packagr executors. Tailwind CSS configurations located at the project or workspace root will be picked up automatically.", + "factory": "./src/migrations/update-20-2-0/remove-tailwind-config-from-ng-packagr-executors" } }, "packageJsonUpdates": { diff --git a/packages/angular/src/migrations/update-20-2-0/remove-tailwind-config-from-ng-packagr-executors.spec.ts b/packages/angular/src/migrations/update-20-2-0/remove-tailwind-config-from-ng-packagr-executors.spec.ts new file mode 100644 index 0000000000000..9219b0ba2867f --- /dev/null +++ b/packages/angular/src/migrations/update-20-2-0/remove-tailwind-config-from-ng-packagr-executors.spec.ts @@ -0,0 +1,267 @@ +import { + addProjectConfiguration, + readJson, + readProjectConfiguration, + updateJson, + type NxJsonConfiguration, + type Tree, +} from '@nx/devkit'; +import * as devkit from '@nx/devkit'; +import { createTreeWithEmptyWorkspace } from '@nx/devkit/testing'; +import migration, { + executors, +} from './remove-tailwind-config-from-ng-packagr-executors'; + +describe('remove-tailwind-config-from-ng-packagr-executors migration', () => { + let tree: Tree; + + beforeEach(() => { + tree = createTreeWithEmptyWorkspace(); + jest + .spyOn(devkit, 'formatFiles') + .mockImplementation(() => Promise.resolve()); + }); + + it.each(executors)( + 'should remove "tailwindConfig" option from target using the "%s" executor', + async (executor) => { + addProjectConfiguration(tree, 'lib1', { + root: 'libs/lib1', + targets: { + build: { + executor, + options: { + project: 'libs/lib1/ng-package.json', + tailwindConfig: 'libs/lib1/tailwind.config.js', + }, + configurations: { + development: { + tsConfig: 'libs/lib1/tsconfig.lib.json', + tailwindConfig: 'libs/lib1/tailwind.config.dev.js', + }, + production: { + tsConfig: 'libs/lib1/tsconfig.lib.prod.json', + tailwindConfig: 'libs/lib1/tailwind.config.prod.js', + }, + }, + }, + }, + }); + + await migration(tree); + + const project = readProjectConfiguration(tree, 'lib1'); + expect(project.targets.build.options.tailwindConfig).toBeUndefined(); + expect( + project.targets.build.configurations.development.tailwindConfig + ).toBeUndefined(); + expect( + project.targets.build.configurations.production.tailwindConfig + ).toBeUndefined(); + } + ); + + it.each(executors)( + 'should remove empty objects from target using the "%s" executor', + async (executor) => { + addProjectConfiguration(tree, 'lib1', { + root: 'libs/lib1', + targets: { + build: { + executor, + options: { + tailwindConfig: 'libs/lib1/tailwind.config.js', + }, + configurations: { + development: { + tailwindConfig: 'libs/lib1/tailwind.config.dev.js', + }, + production: { + tailwindConfig: 'libs/lib1/tailwind.config.prod.js', + }, + }, + }, + }, + }); + + await migration(tree); + + const project = readProjectConfiguration(tree, 'lib1'); + expect(project.targets.build.options).toBeUndefined(); + expect(project.targets.build.configurations).toBeUndefined(); + } + ); + + it('should not delete "tailwindConfig" from target not using the relevant executors', async () => { + addProjectConfiguration(tree, 'lib1', { + root: 'libs/lib1', + targets: { + build: { + executor: '@org/awesome-plugin:executor', + options: { + tailwindConfig: 'libs/lib1/tailwind.config.js', + }, + configurations: { + development: { + tailwindConfig: 'libs/lib1/tailwind.config.dev.js', + }, + production: { + tailwindConfig: 'libs/lib1/tailwind.config.prod.js', + }, + }, + }, + }, + }); + + await migration(tree); + + const project = readProjectConfiguration(tree, 'lib1'); + expect(project.targets.build.options.tailwindConfig).toBe( + 'libs/lib1/tailwind.config.js' + ); + expect( + project.targets.build.configurations.development.tailwindConfig + ).toBe('libs/lib1/tailwind.config.dev.js'); + expect(project.targets.build.configurations.production.tailwindConfig).toBe( + 'libs/lib1/tailwind.config.prod.js' + ); + }); + + it.each(executors)( + 'should delete "tailwindConfig" option in nx.json target defaults for a target with the "%s" executor', + async (executor) => { + updateJson(tree, 'nx.json', (json) => { + json.targetDefaults ??= {}; + json.targetDefaults.build = { + executor, + options: { + project: '{projectRoot}/ng-package.json', + tailwindConfig: '{projectRoot}/tailwind.config.js', + }, + configurations: { + development: { + tsConfig: '{projectRoot}/tsconfig.lib.json', + tailwindConfig: '{projectRoot}/tailwind.config.dev.js', + }, + production: { + tsConfig: '{projectRoot}/tsconfig.lib.prod.json', + tailwindConfig: '{projectRoot}/tailwind.config.prod.js', + }, + }, + }; + return json; + }); + + await migration(tree); + + const nxJson = readJson(tree, 'nx.json'); + expect( + nxJson.targetDefaults.build.options.tailwindConfig + ).toBeUndefined(); + expect( + nxJson.targetDefaults.build.configurations.development.tailwindConfig + ).toBeUndefined(); + expect( + nxJson.targetDefaults.build.configurations.production.tailwindConfig + ).toBeUndefined(); + } + ); + + it.each(executors)( + 'should delete empty target defaults for a target with the "%s" executor', + async (executor) => { + updateJson(tree, 'nx.json', (json) => { + json.targetDefaults ??= {}; + json.targetDefaults.build = { + executor, + options: { + tailwindConfig: '{projectRoot}/tailwind.config.js', + }, + configurations: { + development: { + tailwindConfig: '{projectRoot}/tailwind.config.dev.js', + }, + production: { + tailwindConfig: '{projectRoot}/tailwind.config.prod.js', + }, + }, + }; + return json; + }); + + await migration(tree); + + const nxJson = readJson(tree, 'nx.json'); + expect(nxJson.targetDefaults.build).toBeUndefined(); + } + ); + + it.each(executors)( + 'should delete "tailwindConfig" option in nx.json target defaults for the "%s" executor', + async (executor) => { + updateJson(tree, 'nx.json', (json) => { + json.targetDefaults ??= {}; + json.targetDefaults[executor] = { + options: { + project: '{projectRoot}/ng-package.json', + tailwindConfig: '{projectRoot}/tailwind.config.js', + }, + configurations: { + development: { + tsConfig: '{projectRoot}/tsconfig.lib.json', + tailwindConfig: '{projectRoot}/tailwind.config.dev.js', + }, + production: { + tsConfig: '{projectRoot}/tsconfig.lib.prod.json', + tailwindConfig: '{projectRoot}/tailwind.config.prod.js', + }, + }, + }; + return json; + }); + + await migration(tree); + + const nxJson = readJson(tree, 'nx.json'); + expect( + nxJson.targetDefaults[executor].options.tailwindConfig + ).toBeUndefined(); + expect( + nxJson.targetDefaults[executor].configurations.development + .tailwindConfig + ).toBeUndefined(); + expect( + nxJson.targetDefaults[executor].configurations.production.tailwindConfig + ).toBeUndefined(); + } + ); + + it.each(executors)( + 'should delete empty target defaults for a target with the "%s" executor', + async (executor) => { + updateJson(tree, 'nx.json', (json) => { + json.targetDefaults ??= {}; + json.targetDefaults[executor] = { + options: { + tailwindConfig: '{projectRoot}/tailwind.config.js', + }, + configurations: { + development: { + tailwindConfig: '{projectRoot}/tailwind.config.dev.js', + }, + production: { + tailwindConfig: '{projectRoot}/tailwind.config.prod.js', + }, + }, + }; + return json; + }); + + await migration(tree); + + const nxJson = readJson(tree, 'nx.json'); + console.log(nxJson.targetDefaults); + expect(nxJson.targetDefaults[executor]).toBeUndefined(); + } + ); +}); diff --git a/packages/angular/src/migrations/update-20-2-0/remove-tailwind-config-from-ng-packagr-executors.ts b/packages/angular/src/migrations/update-20-2-0/remove-tailwind-config-from-ng-packagr-executors.ts new file mode 100644 index 0000000000000..bb1fce8f1f791 --- /dev/null +++ b/packages/angular/src/migrations/update-20-2-0/remove-tailwind-config-from-ng-packagr-executors.ts @@ -0,0 +1,105 @@ +import { + formatFiles, + readNxJson, + readProjectConfiguration, + updateNxJson, + updateProjectConfiguration, + type Tree, +} from '@nx/devkit'; +import { forEachExecutorOptions } from '@nx/devkit/src/generators/executor-options-utils'; + +export const executors = ['@nx/angular:ng-packagr-lite', '@nx/angular:package']; + +export default async function (tree: Tree) { + // update options from project configs + executors.forEach((executor) => { + forEachExecutorOptions<{ tailwindConfig?: string }>( + tree, + executor, + (options, project, target, configuration) => { + if (options.tailwindConfig === undefined) { + return; + } + + const projectConfiguration = readProjectConfiguration(tree, project); + if (configuration) { + const config = + projectConfiguration.targets[target].configurations[configuration]; + delete config.tailwindConfig; + if (!Object.keys(config).length) { + delete projectConfiguration.targets[target].configurations[ + configuration + ]; + } + if ( + !Object.keys(projectConfiguration.targets[target].configurations) + .length + ) { + delete projectConfiguration.targets[target].configurations; + } + } else { + const config = projectConfiguration.targets[target].options; + delete config.tailwindConfig; + if (!Object.keys(config).length) { + delete projectConfiguration.targets[target].options; + } + } + + updateProjectConfiguration(tree, project, projectConfiguration); + } + ); + }); + + // update options from nx.json target defaults + const nxJson = readNxJson(tree); + if (!nxJson.targetDefaults) { + return; + } + + for (const [targetOrExecutor, targetConfig] of Object.entries( + nxJson.targetDefaults + )) { + if ( + !executors.includes(targetOrExecutor) && + !executors.includes(targetConfig.executor) + ) { + continue; + } + + if (targetConfig.options) { + delete targetConfig.options.tailwindConfig; + if (!Object.keys(targetConfig.options).length) { + delete targetConfig.options; + } + } + + Object.entries(targetConfig.configurations ?? {}).forEach( + ([name, config]) => { + delete config.tailwindConfig; + if (!Object.keys(config).length) { + delete targetConfig.configurations[name]; + } + } + ); + + if (!Object.keys(targetConfig.configurations ?? {}).length) { + delete targetConfig.configurations; + } + + if ( + !Object.keys(targetConfig).length || + (Object.keys(targetConfig).length === 1 && + Object.keys(targetConfig)[0] === 'executor') + ) { + delete nxJson.targetDefaults[targetOrExecutor]; + } + + if (!Object.keys(nxJson.targetDefaults).length) { + delete nxJson.targetDefaults; + } + } + + updateNxJson(tree, nxJson); + + await formatFiles(tree); +} From f89fca98f3083a7a724d54b79d1f38536d61f6ac Mon Sep 17 00:00:00 2001 From: Jack Hsu Date: Thu, 5 Dec 2024 10:27:53 -0500 Subject: [PATCH 14/21] fix(remix): update app generator with valid package.json without Prettier (#29218) ## Current Behavior If you don't have Prettier installed, then `nx g @nx/remix:app apps/myapp` will generate a `package.json` with trailing comma, and `npm install` fails. ## Expected Behavior `package.json` should be valid without Prettier. ## Related Issue(s) Fixes # --- .../application/application.impl.spec.ts | 22 +++++++++++++++++-- .../files/ts-solution/package.json__tmpl__ | 3 +-- 2 files changed, 21 insertions(+), 4 deletions(-) diff --git a/packages/remix/src/generators/application/application.impl.spec.ts b/packages/remix/src/generators/application/application.impl.spec.ts index 47feaf0a0b48a..cc510d65b853a 100644 --- a/packages/remix/src/generators/application/application.impl.spec.ts +++ b/packages/remix/src/generators/application/application.impl.spec.ts @@ -316,8 +316,10 @@ describe('Remix Application', () => { }); describe('TS solution setup', () => { - it('should add project references when using TS solution', async () => { - const tree = createTreeWithEmptyWorkspace(); + let tree: Tree; + + beforeEach(() => { + tree = createTreeWithEmptyWorkspace(); updateJson(tree, 'package.json', (json) => { json.workspaces = ['packages/*', 'apps/*']; return json; @@ -333,7 +335,9 @@ describe('Remix Application', () => { files: [], references: [], }); + }); + it('should add project references when using TS solution', async () => { await applicationGenerator(tree, { directory: 'myapp', e2eTestRunner: 'playwright', @@ -523,6 +527,20 @@ describe('Remix Application', () => { } `); }); + + it('should generate valid package.json without formatting', async () => { + await applicationGenerator(tree, { + directory: 'myapp', + e2eTestRunner: 'playwright', + unitTestRunner: 'jest', + addPlugin: true, + skipFormat: true, + }); + + expect(() => + JSON.parse(tree.read('myapp/package.json', 'utf-8')) + ).not.toThrow(); + }); }); }); diff --git a/packages/remix/src/generators/application/files/ts-solution/package.json__tmpl__ b/packages/remix/src/generators/application/files/ts-solution/package.json__tmpl__ index 06b3362f5c0fb..594f4bd31ab48 100644 --- a/packages/remix/src/generators/application/files/ts-solution/package.json__tmpl__ +++ b/packages/remix/src/generators/application/files/ts-solution/package.json__tmpl__ @@ -24,8 +24,7 @@ <%_ if (name !== projectName) { _%> "name": "<%= name %>",<%_ } _%> "projectType": "application", - "sourceRoot": "<%- projectRoot %>", - <%_ if (parsedTags?.length) { _%> + "sourceRoot": "<%- projectRoot %>"<%_ if (parsedTags?.length) { _%>, "tags": <%- JSON.stringify(parsedTags) %> <%_ } _%> }<% } %> From 7c25cf150dcb742037798084f57c5a995d16fdd0 Mon Sep 17 00:00:00 2001 From: Jack Hsu Date: Thu, 5 Dec 2024 11:04:47 -0500 Subject: [PATCH 15/21] fix(remix): update lib generator to generate valid names in package.json (#29219) ## Current Behavior `nx g @nx/remix:lib packages/foo` generates invalid package names in new TS setup. e.g. `@acme/packages/foo`. ## Expected Behavior The name should be valid in `package.json`. ## Related Issue(s) Fixes # --- .../library/lib/add-tsconfig-entry-points.ts | 19 ++++--- .../library/lib/normalize-options.ts | 4 -- .../generators/library/library.impl.spec.ts | 52 ++++++++++++++++++- .../src/generators/library/library.impl.ts | 4 +- 4 files changed, 64 insertions(+), 15 deletions(-) diff --git a/packages/remix/src/generators/library/lib/add-tsconfig-entry-points.ts b/packages/remix/src/generators/library/lib/add-tsconfig-entry-points.ts index f1081b544c91f..891bf3a1c78b8 100644 --- a/packages/remix/src/generators/library/lib/add-tsconfig-entry-points.ts +++ b/packages/remix/src/generators/library/lib/add-tsconfig-entry-points.ts @@ -6,12 +6,16 @@ import { } from '@nx/devkit'; import { getRootTsConfigPathInTree } from '@nx/js'; import type { RemixLibraryOptions } from './normalize-options'; +import { resolveImportPath } from '@nx/devkit/src/generators/project-name-and-root-utils'; export function addTsconfigEntryPoints( tree: Tree, options: RemixLibraryOptions ) { - const { sourceRoot } = readProjectConfiguration(tree, options.projectName); + const { root: projectRoot, sourceRoot } = readProjectConfiguration( + tree, + options.projectName + ); const serverFilePath = joinPathFragments(sourceRoot, 'server.ts'); tree.write( @@ -20,14 +24,13 @@ export function addTsconfigEntryPoints( ); const baseTsConfig = getRootTsConfigPathInTree(tree); + // Use same logic as `determineProjectNameAndRootOptions` to get the import path + const importPath = resolveImportPath(tree, options.name, projectRoot); updateJson(tree, baseTsConfig, (json) => { - if ( - json.compilerOptions.paths && - json.compilerOptions.paths[options.importPath] - ) { - json.compilerOptions.paths[ - joinPathFragments(options.importPath, 'server') - ] = [serverFilePath]; + if (json.compilerOptions.paths && json.compilerOptions.paths[importPath]) { + json.compilerOptions.paths[joinPathFragments(importPath, 'server')] = [ + serverFilePath, + ]; } return json; diff --git a/packages/remix/src/generators/library/lib/normalize-options.ts b/packages/remix/src/generators/library/lib/normalize-options.ts index 8351fc042f134..ebbf1ff26d0d7 100644 --- a/packages/remix/src/generators/library/lib/normalize-options.ts +++ b/packages/remix/src/generators/library/lib/normalize-options.ts @@ -3,7 +3,6 @@ import { determineProjectNameAndRootOptions, ensureProjectName, } from '@nx/devkit/src/generators/project-name-and-root-utils'; -import { getImportPath } from '@nx/js/src/utils/get-import-path'; import type { NxRemixGeneratorSchema } from '../schema'; export interface RemixLibraryOptions extends NxRemixGeneratorSchema { @@ -31,12 +30,9 @@ export async function normalizeOptions( nxJson.useInferencePlugins !== false; options.addPlugin ??= addPluginDefault; - const importPath = options.importPath ?? getImportPath(tree, projectRoot); - return { ...options, unitTestRunner: options.unitTestRunner ?? 'vitest', - importPath, projectName, projectRoot, }; diff --git a/packages/remix/src/generators/library/library.impl.spec.ts b/packages/remix/src/generators/library/library.impl.spec.ts index 6c983760de0d6..d52397d20cc6f 100644 --- a/packages/remix/src/generators/library/library.impl.spec.ts +++ b/packages/remix/src/generators/library/library.impl.spec.ts @@ -1,6 +1,12 @@ import 'nx/src/internal-testing-utils/mock-project-graph'; -import { readJson, readProjectConfiguration } from '@nx/devkit'; +import { + readJson, + readProjectConfiguration, + Tree, + updateJson, + writeJson, +} from '@nx/devkit'; import { createTreeWithEmptyWorkspace } from '@nx/devkit/testing'; import applicationGenerator from '../application/application.impl'; import libraryGenerator from './library.impl'; @@ -129,4 +135,48 @@ describe('Remix Library Generator', () => { expect(pkgJson.main).toEqual('./dist/index.cjs.js'); expect(pkgJson.typings).toEqual('./dist/index.d.ts'); }); + describe('TS solution setup', () => { + let tree: Tree; + + beforeEach(() => { + tree = createTreeWithEmptyWorkspace(); + updateJson(tree, 'package.json', (json) => { + json.workspaces = ['packages/*', 'apps/*']; + return json; + }); + writeJson(tree, 'tsconfig.base.json', { + compilerOptions: { + composite: true, + declaration: true, + }, + }); + writeJson(tree, 'tsconfig.json', { + extends: './tsconfig.base.json', + files: [], + references: [], + }); + }); + + it('should generate valid package.json', async () => { + await libraryGenerator(tree, { + directory: 'packages/foo', + style: 'css', + addPlugin: true, + }); + + expect(readJson(tree, 'packages/foo/package.json')) + .toMatchInlineSnapshot(` + { + "main": "./src/index.ts", + "name": "@proj/foo", + "nx": { + "name": "foo", + "projectType": "library", + "sourceRoot": "packages/foo/src", + }, + "types": "./src/index.ts", + } + `); + }); + }); }); diff --git a/packages/remix/src/generators/library/library.impl.ts b/packages/remix/src/generators/library/library.impl.ts index 1f0553763b160..93bb3a565948a 100644 --- a/packages/remix/src/generators/library/library.impl.ts +++ b/packages/remix/src/generators/library/library.impl.ts @@ -32,12 +32,12 @@ export async function remixLibraryGeneratorInternal( tasks.push(jsInitTask); const libGenTask = await libraryGenerator(tree, { - name: options.projectName, + directory: options.directory, + name: options.name, style: options.style, unitTestRunner: options.unitTestRunner, tags: options.tags, importPath: options.importPath, - directory: options.projectRoot, skipFormat: true, skipTsConfig: false, linter: options.linter, From e9a07da4ac88fbd223ed81765d06ba8bd77352da Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Leosvel=20P=C3=A9rez=20Espinosa?= Date: Thu, 5 Dec 2024 17:42:16 +0100 Subject: [PATCH 16/21] fix(misc): use the ts sync generator with other bundler tasks (#29170) ## Current Behavior Only targets using `tsc` trigger the `@nx/js:typescript-sync` generator to run. ## Expected Behavior Generating projects with other bundlers should also infer the `@nx/js:typescript-sync` generator in their relevant targets. ## Related Issue(s) Fixes # --- .../src/generators/setup-build/generator.ts | 2 +- packages/rollup/src/plugins/plugin.ts | 24 +++++++-- packages/rspack/src/plugins/plugin.ts | 34 +++++++++++-- packages/vite/src/plugins/plugin.spec.ts | 35 +++++++++++-- packages/vite/src/plugins/plugin.ts | 49 ++++++++++++++++--- packages/webpack/src/plugins/plugin.ts | 42 ++++++++++++++-- 6 files changed, 159 insertions(+), 27 deletions(-) diff --git a/packages/js/src/generators/setup-build/generator.ts b/packages/js/src/generators/setup-build/generator.ts index aa7f4d73f7201..9e9eda516a9ba 100644 --- a/packages/js/src/generators/setup-build/generator.ts +++ b/packages/js/src/generators/setup-build/generator.ts @@ -17,7 +17,7 @@ import { addBuildTargetDefaults } from '@nx/devkit/src/generators/target-default import { basename, dirname, join } from 'node:path/posix'; import { mergeTargetConfigurations } from 'nx/src/devkit-internals'; import type { PackageJson } from 'nx/src/utils/package-json'; -import { ensureProjectIsIncludedInPluginRegistrations } from '../..//utils/typescript/plugin'; +import { ensureProjectIsIncludedInPluginRegistrations } from '../../utils/typescript/plugin'; import { getImportPath } from '../../utils/get-import-path'; import { getUpdatedPackageJsonContent, diff --git a/packages/rollup/src/plugins/plugin.ts b/packages/rollup/src/plugins/plugin.ts index 0c4ec4d8c5c75..c6debbe0658af 100644 --- a/packages/rollup/src/plugins/plugin.ts +++ b/packages/rollup/src/plugins/plugin.ts @@ -20,6 +20,7 @@ import { getLockFileName } from '@nx/js'; import { getNamedInputs } from '@nx/devkit/src/utils/get-named-inputs'; import { type RollupOptions } from 'rollup'; import { hashObject } from 'nx/src/hasher/file-hasher'; +import { isUsingTsSolutionSetup } from '@nx/js/src/utils/typescript/ts-solution-setup'; const pmc = getPackageManagerCommand(); @@ -59,7 +60,8 @@ export const createNodes: CreateNodes = [ configFilePath, normalizeOptions(options), context, - {} + {}, + isUsingTsSolutionSetup() ); }, ]; @@ -74,6 +76,7 @@ export const createNodesV2: CreateNodesV2 = [ `rollup-${optionsHash}.hash` ); const targetsCache = readTargetsCache(cachePath); + const isTsSolutionSetup = isUsingTsSolutionSetup(); try { return await createNodesFromFiles( @@ -82,7 +85,8 @@ export const createNodesV2: CreateNodesV2 = [ configFile, normalizedOptions, context, - targetsCache + targetsCache, + isTsSolutionSetup ), configFilePaths, normalizedOptions, @@ -98,7 +102,8 @@ async function createNodesInternal( configFilePath: string, options: Required, context: CreateNodesContext, - targetsCache: Record> + targetsCache: Record>, + isTsSolutionSetup: boolean ) { const projectRoot = dirname(configFilePath); const fullyQualifiedProjectRoot = join(context.workspaceRoot, projectRoot); @@ -123,7 +128,8 @@ async function createNodesInternal( configFilePath, projectRoot, options, - context + context, + isTsSolutionSetup ); return { @@ -140,7 +146,8 @@ async function buildRollupTarget( configFilePath: string, projectRoot: string, options: RollupPluginOptions, - context: CreateNodesContext + context: CreateNodesContext, + isTsSolutionSetup: boolean ): Promise> { let loadConfigFile: ( path: string, @@ -200,6 +207,13 @@ async function buildRollupTarget( }, }, }; + + if (isTsSolutionSetup) { + targets[options.buildTargetName].syncGenerators = [ + '@nx/js:typescript-sync', + ]; + } + return targets; } diff --git a/packages/rspack/src/plugins/plugin.ts b/packages/rspack/src/plugins/plugin.ts index 1e05fdaafeee2..bb729b5b2f75b 100644 --- a/packages/rspack/src/plugins/plugin.ts +++ b/packages/rspack/src/plugins/plugin.ts @@ -12,6 +12,7 @@ import { import { calculateHashForCreateNodes } from '@nx/devkit/src/utils/calculate-hash-for-create-nodes'; import { getNamedInputs } from '@nx/devkit/src/utils/get-named-inputs'; import { getLockFileName, getRootTsConfigPath } from '@nx/js'; +import { isUsingTsSolutionSetup } from '@nx/js/src/utils/typescript/ts-solution-setup'; import { existsSync, readdirSync } from 'fs'; import { hashObject } from 'nx/src/hasher/file-hasher'; import { workspaceDataDirectory } from 'nx/src/utils/cache-directory'; @@ -54,10 +55,17 @@ export const createNodesV2: CreateNodesV2 = [ `rspack-${optionsHash}.hash` ); const targetsCache = readTargetsCache(cachePath); + const isTsSolutionSetup = isUsingTsSolutionSetup(); try { return await createNodesFromFiles( (configFile, options, context) => - createNodesInternal(configFile, options, context, targetsCache), + createNodesInternal( + configFile, + options, + context, + targetsCache, + isTsSolutionSetup + ), configFilePaths, options, context @@ -72,7 +80,8 @@ async function createNodesInternal( configFilePath: string, options: RspackPluginOptions, context: CreateNodesContext, - targetsCache: Record + targetsCache: Record, + isTsSolutionSetup: boolean ) { const projectRoot = dirname(configFilePath); // Do not create a project if package.json and project.json isn't there. @@ -100,7 +109,8 @@ async function createNodesInternal( configFilePath, projectRoot, normalizedOptions, - context + context, + isTsSolutionSetup ); const { targets, metadata } = targetsCache[hash]; @@ -120,7 +130,8 @@ async function createRspackTargets( configFilePath: string, projectRoot: string, options: RspackPluginOptions, - context: CreateNodesContext + context: CreateNodesContext, + isTsSolutionSetup: boolean ): Promise { const namedInputs = getNamedInputs(projectRoot, context); @@ -187,6 +198,21 @@ async function createRspackTargets( }, }; + if (isTsSolutionSetup) { + targets[options.buildTargetName].syncGenerators = [ + '@nx/js:typescript-sync', + ]; + targets[options.serveTargetName].syncGenerators = [ + '@nx/js:typescript-sync', + ]; + targets[options.previewTargetName].syncGenerators = [ + '@nx/js:typescript-sync', + ]; + targets[options.serveStaticTargetName].syncGenerators = [ + '@nx/js:typescript-sync', + ]; + } + return { targets, metadata: {} }; } diff --git a/packages/vite/src/plugins/plugin.spec.ts b/packages/vite/src/plugins/plugin.spec.ts index 6eec64ff806a8..7c747813c3270 100644 --- a/packages/vite/src/plugins/plugin.spec.ts +++ b/packages/vite/src/plugins/plugin.spec.ts @@ -12,13 +12,17 @@ jest.mock('../utils/executor-utils', () => ({ jest.mock('@nx/js/src/utils/typescript/ts-solution-setup', () => ({ ...jest.requireActual('@nx/js/src/utils/typescript/ts-solution-setup'), - isUsingTsSolutionSetup: jest.fn().mockReturnValue(false), + isUsingTsSolutionSetup: jest.fn(), })); describe('@nx/vite/plugin', () => { let createNodesFunction = createNodesV2[1]; let context: CreateNodesContext; + beforeEach(() => { + (isUsingTsSolutionSetup as jest.Mock).mockReturnValue(false); + }); + describe('root project', () => { let tempFs: TempFs; beforeEach(async () => { @@ -42,12 +46,11 @@ describe('@nx/vite/plugin', () => { }; tempFs.createFileSync('vite.config.ts', ''); tempFs.createFileSync('index.html', ''); - tempFs.createFileSync('package.json', ''); + tempFs.createFileSync('package.json', '{}'); }); afterEach(() => { jest.resetModules(); - tempFs.cleanup(); }); it('should create nodes', async () => { @@ -95,7 +98,7 @@ describe('@nx/vite/plugin', () => { }); it('should infer typecheck with --build flag when using TS solution setup', async () => { - (isUsingTsSolutionSetup as jest.Mock).mockResolvedValue(true); + (isUsingTsSolutionSetup as jest.Mock).mockReturnValue(true); tempFs.createFileSync('tsconfig.json', ''); const nodes = await createNodesFunction( @@ -114,6 +117,30 @@ describe('@nx/vite/plugin', () => { `tsc --build --emitDeclarationOnly --pretty --verbose` ); }); + + it('should infer the sync generator when using TS solution setup', async () => { + (isUsingTsSolutionSetup as jest.Mock).mockReturnValue(true); + tempFs.createFileSync('tsconfig.json', ''); + + const nodes = await createNodesFunction( + ['vite.config.ts'], + { + buildTargetName: 'build', + serveTargetName: 'serve', + previewTargetName: 'preview', + testTargetName: 'test', + serveStaticTargetName: 'serve-static', + }, + context + ); + + expect(nodes[0][1].projects['.'].targets.build.syncGenerators).toEqual([ + '@nx/js:typescript-sync', + ]); + expect( + nodes[0][1].projects['.'].targets.typecheck.syncGenerators + ).toEqual(['@nx/js:typescript-sync']); + }); }); describe('not root project', () => { diff --git a/packages/vite/src/plugins/plugin.ts b/packages/vite/src/plugins/plugin.ts index 79eb7fed6ee9e..ccb8e8ad6c9db 100644 --- a/packages/vite/src/plugins/plugin.ts +++ b/packages/vite/src/plugins/plugin.ts @@ -38,7 +38,9 @@ export interface VitePluginOptions { type ViteTargets = Pick; function readTargetsCache(cachePath: string): Record { - return existsSync(cachePath) ? readJsonFile(cachePath) : {}; + return process.env.NX_CACHE_PROJECT_GRAPH !== 'false' && existsSync(cachePath) + ? readJsonFile(cachePath) + : {}; } function writeTargetsToCache(cachePath, results?: Record) { @@ -208,17 +210,24 @@ async function buildViteTargets( options.buildTargetName, namedInputs, buildOutputs, - projectRoot + projectRoot, + isUsingTsSolutionSetup ); // If running in library mode, then there is nothing to serve. if (!viteBuildConfig.build?.lib || hasServeConfig) { - targets[options.serveTargetName] = serveTarget(projectRoot); + targets[options.serveTargetName] = serveTarget( + projectRoot, + isUsingTsSolutionSetup + ); targets[options.previewTargetName] = previewTarget( projectRoot, options.buildTargetName ); - targets[options.serveStaticTargetName] = serveStaticTarget(options) as {}; + targets[options.serveStaticTargetName] = serveStaticTarget( + options, + isUsingTsSolutionSetup + ); } } @@ -251,6 +260,12 @@ async function buildViteTargets( }, }, }; + + if (isUsingTsSolutionSetup) { + targets[options.typecheckTargetName].syncGenerators = [ + '@nx/js:typescript-sync', + ]; + } } // if file is vitest.config or vite.config has definition for test, create target for test @@ -272,9 +287,10 @@ async function buildTarget( [inputName: string]: any[]; }, outputs: string[], - projectRoot: string + projectRoot: string, + isUsingTsSolutionSetup: boolean ) { - return { + const buildTarget: TargetConfiguration = { command: `vite build`, options: { cwd: joinPathFragments(projectRoot) }, cache: true, @@ -302,9 +318,15 @@ async function buildTarget( }, }, }; + + if (isUsingTsSolutionSetup) { + buildTarget.syncGenerators = ['@nx/js:typescript-sync']; + } + + return buildTarget; } -function serveTarget(projectRoot: string) { +function serveTarget(projectRoot: string, isUsingTsSolutionSetup: boolean) { const targetConfig: TargetConfiguration = { command: `vite serve`, options: { @@ -324,6 +346,10 @@ function serveTarget(projectRoot: string) { }, }; + if (isUsingTsSolutionSetup) { + targetConfig.syncGenerators = ['@nx/js:typescript-sync']; + } + return targetConfig; } @@ -388,7 +414,10 @@ async function testTarget( }; } -function serveStaticTarget(options: VitePluginOptions) { +function serveStaticTarget( + options: VitePluginOptions, + isUsingTsSolutionSetup: boolean +) { const targetConfig: TargetConfiguration = { executor: '@nx/web:file-server', options: { @@ -397,6 +426,10 @@ function serveStaticTarget(options: VitePluginOptions) { }, }; + if (isUsingTsSolutionSetup) { + targetConfig.syncGenerators = ['@nx/js:typescript-sync']; + } + return targetConfig; } diff --git a/packages/webpack/src/plugins/plugin.ts b/packages/webpack/src/plugins/plugin.ts index 6db7bac14f2d2..fe42b91575391 100644 --- a/packages/webpack/src/plugins/plugin.ts +++ b/packages/webpack/src/plugins/plugin.ts @@ -17,6 +17,7 @@ import { import { calculateHashForCreateNodes } from '@nx/devkit/src/utils/calculate-hash-for-create-nodes'; import { getNamedInputs } from '@nx/devkit/src/utils/get-named-inputs'; import { getLockFileName, getRootTsConfigPath } from '@nx/js'; +import { isUsingTsSolutionSetup } from '@nx/js/src/utils/typescript/ts-solution-setup'; import { existsSync, readdirSync } from 'fs'; import { hashObject } from 'nx/src/hasher/file-hasher'; import { workspaceDataDirectory } from 'nx/src/utils/cache-directory'; @@ -65,10 +66,17 @@ export const createNodesV2: CreateNodesV2 = [ ); const targetsCache = readTargetsCache(cachePath); const normalizedOptions = normalizeOptions(options); + const isTsSolutionSetup = isUsingTsSolutionSetup(); try { return await createNodesFromFiles( (configFile, options, context) => - createNodesInternal(configFile, options, context, targetsCache), + createNodesInternal( + configFile, + options, + context, + targetsCache, + isTsSolutionSetup + ), configFilePaths, normalizedOptions, context @@ -86,7 +94,13 @@ export const createNodes: CreateNodes = [ '`createNodes` is deprecated. Update your plugin to utilize createNodesV2 instead. In Nx 20, this will change to the createNodesV2 API.' ); const normalizedOptions = normalizeOptions(options); - return createNodesInternal(configFilePath, normalizedOptions, context, {}); + return createNodesInternal( + configFilePath, + normalizedOptions, + context, + {}, + isUsingTsSolutionSetup() + ); }, ]; @@ -94,7 +108,8 @@ async function createNodesInternal( configFilePath: string, options: Required, context: CreateNodesContext, - targetsCache: Record + targetsCache: Record, + isTsSolutionSetup: boolean ): Promise { const projectRoot = dirname(configFilePath); @@ -118,7 +133,8 @@ async function createNodesInternal( configFilePath, projectRoot, options, - context + context, + isTsSolutionSetup ); const { targets, metadata } = targetsCache[hash]; @@ -138,7 +154,8 @@ async function createWebpackTargets( configFilePath: string, projectRoot: string, options: Required, - context: CreateNodesContext + context: CreateNodesContext, + isTsSolutionSetup: boolean ): Promise { const namedInputs = getNamedInputs(projectRoot, context); @@ -243,6 +260,21 @@ async function createWebpackTargets( }, }; + if (isTsSolutionSetup) { + targets[options.buildTargetName].syncGenerators = [ + '@nx/js:typescript-sync', + ]; + targets[options.serveTargetName].syncGenerators = [ + '@nx/js:typescript-sync', + ]; + targets[options.previewTargetName].syncGenerators = [ + '@nx/js:typescript-sync', + ]; + targets[options.serveStaticTargetName].syncGenerators = [ + '@nx/js:typescript-sync', + ]; + } + return { targets, metadata: {} }; } From 7328a8dae4676fee4bf4b68b236e272b092f9841 Mon Sep 17 00:00:00 2001 From: Emily Xiong Date: Thu, 5 Dec 2024 10:46:42 -0800 Subject: [PATCH 17/21] fix(gradle): change gradle glob to include root gradlew (#29206) ## Current Behavior ## Expected Behavior ## Related Issue(s) Fixes https://github.com/nrwl/nx/issues/28865 --- packages/gradle/plugin.spec.ts | 127 ++++++++++++++++++ .../gradle/src/utils/split-config-files.ts | 2 + 2 files changed, 129 insertions(+) create mode 100644 packages/gradle/plugin.spec.ts diff --git a/packages/gradle/plugin.spec.ts b/packages/gradle/plugin.spec.ts new file mode 100644 index 0000000000000..c07019a01d431 --- /dev/null +++ b/packages/gradle/plugin.spec.ts @@ -0,0 +1,127 @@ +import { CreateNodesContext } from '@nx/devkit'; +import { TempFs } from '@nx/devkit/internal-testing-utils'; +import { createNodesV2 } from './plugin'; +import { type GradleReport } from './src/utils/get-gradle-report'; + +let gradleReport: GradleReport; +jest.mock('./src/utils/get-gradle-report', () => { + return { + GRADLE_BUILD_FILES: new Set(['build.gradle', 'build.gradle.kts']), + populateGradleReport: jest.fn().mockImplementation(() => void 0), + getCurrentGradleReport: jest.fn().mockImplementation(() => gradleReport), + }; +}); + +describe('@nx/gradle/plugin', () => { + let createNodesFunction = createNodesV2[1]; + let context: CreateNodesContext; + let tempFs: TempFs; + + beforeEach(async () => { + tempFs = new TempFs('gradle-plugin'); + gradleReport = { + gradleFileToGradleProjectMap: new Map([ + ['proj/build.gradle', 'proj'], + ]), + buildFileToDepsMap: new Map(), + gradleFileToOutputDirsMap: new Map>([ + ['proj/build.gradle', new Map([['build', 'build']])], + ]), + gradleProjectToTasksTypeMap: new Map>([ + ['proj', new Map([['test', 'Verification']])], + ]), + gradleProjectToProjectName: new Map([['proj', 'proj']]), + gradleProjectNameToProjectRootMap: new Map([ + ['proj', 'proj'], + ]), + gradleProjectToChildProjects: new Map(), + }; + context = { + nxJsonConfiguration: { + namedInputs: { + default: ['{projectRoot}/**/*'], + production: ['!{projectRoot}/**/*.spec.ts'], + }, + }, + workspaceRoot: tempFs.tempDir, + configFiles: [], + }; + tempFs.createFileSync('package.json', JSON.stringify({ name: 'repo' })); + tempFs.createFileSync( + 'my-app/project.json', + JSON.stringify({ name: 'my-app' }) + ); + }); + + afterEach(() => { + jest.resetModules(); + tempFs.cleanup(); + tempFs = null; + }); + + it('should create nodes', async () => { + tempFs.createFileSync('gradlew', ''); + + const nodes = await createNodesFunction( + ['gradlew', 'proj/build.gradle'], + undefined, + context + ); + + expect(nodes).toMatchInlineSnapshot(` + [ + [ + "proj/build.gradle", + { + "projects": { + "proj": { + "metadata": { + "targetGroups": { + "Verification": [ + "test", + ], + }, + "technologies": [ + "gradle", + ], + }, + "name": "proj", + "targets": { + "test": { + "cache": true, + "command": "./gradlew proj:test", + "dependsOn": [ + "testClasses", + ], + "inputs": [ + "default", + "^production", + ], + "metadata": { + "help": { + "command": "./gradlew help --task proj:test", + "example": { + "options": { + "args": [ + "--rerun", + ], + }, + }, + }, + "technologies": [ + "gradle", + ], + }, + "options": { + "cwd": ".", + }, + }, + }, + }, + }, + }, + ], + ] + `); + }); +}); diff --git a/packages/gradle/src/utils/split-config-files.ts b/packages/gradle/src/utils/split-config-files.ts index c8b900e91568d..2869107e88f44 100644 --- a/packages/gradle/src/utils/split-config-files.ts +++ b/packages/gradle/src/utils/split-config-files.ts @@ -15,6 +15,8 @@ export const gradleConfigGlob = combineGlobPatterns( ); export const gradleConfigAndTestGlob = combineGlobPatterns( + ...Array.from(GRADLE_BUILD_FILES), + ...Array.from(GRALDEW_FILES), ...Array.from(GRADLE_BUILD_FILES).map((file) => `**/${file}`), ...Array.from(GRALDEW_FILES).map((file) => `**/${file}`), ...GRADLE_TEST_FILES From 37adb48db8203bad9e3f5216ba2b983e73e06f6e Mon Sep 17 00:00:00 2001 From: Emily Xiong Date: Thu, 5 Dec 2024 10:53:29 -0800 Subject: [PATCH 18/21] fix(gradle): read tasks from properties report (#29124) ## Current Behavior Some gradle tasks are not real tasks. They exist in `tasks.txt` because it is derived from subprojects should not be a real target for that project. ## Expected Behavior Gradle projects only have real gradle tasks which are not derived from their subproject tasks. ## Related Issue(s) Fixes # --- e2e/gradle/src/gradle.test.ts | 12 +- ...arget-configuration-details-group-list.tsx | 10 +- packages/gradle/migrations.json | 6 + .../__snapshots__/generator.spec.ts.snap | 8 +- .../src/generators/ci-workflow/generator.ts | 4 +- .../gradle/src/generators/init/init.spec.ts | 2 + packages/gradle/src/generators/init/init.ts | 1 + .../add-include-subprojects-tasks.spec.ts | 63 +++++++++ .../20-2-0/add-include-subprojects-tasks.ts | 32 +++++ packages/gradle/src/plugin/nodes.spec.ts | 125 +++++++++++++++++- packages/gradle/src/plugin/nodes.ts | 52 +++++--- .../gradle/src/utils/get-gradle-report.ts | 9 ++ 12 files changed, 280 insertions(+), 44 deletions(-) create mode 100644 packages/gradle/src/migrations/20-2-0/add-include-subprojects-tasks.spec.ts create mode 100644 packages/gradle/src/migrations/20-2-0/add-include-subprojects-tasks.ts diff --git a/e2e/gradle/src/gradle.test.ts b/e2e/gradle/src/gradle.test.ts index b2e48f44e4a9d..856f77b43c592 100644 --- a/e2e/gradle/src/gradle.test.ts +++ b/e2e/gradle/src/gradle.test.ts @@ -29,8 +29,7 @@ describe('Gradle', () => { expect(projects).toContain('utilities'); expect(projects).toContain(gradleProjectName); - let buildOutput = runCLI('build app', { verbose: true }); - // app depends on list and utilities + const buildOutput = runCLI('build app', { verbose: true }); expect(buildOutput).toContain('nx run list:build'); expect(buildOutput).toContain(':list:classes'); expect(buildOutput).toContain('nx run utilities:build'); @@ -41,15 +40,6 @@ describe('Gradle', () => { `list/build/libs/list.jar`, `utilities/build/libs/utilities.jar` ); - - buildOutput = runCLI(`build ${gradleProjectName}`, { verbose: true }); - // root project depends on app, list and utilities - expect(buildOutput).toContain('nx run app:build'); - expect(buildOutput).toContain(':app:classes'); - expect(buildOutput).toContain('nx run list:build'); - expect(buildOutput).toContain(':list:classes'); - expect(buildOutput).toContain('nx run utilities:build'); - expect(buildOutput).toContain(':utilities:classes'); }); it('should track dependencies for new app', () => { diff --git a/graph/ui-project-details/src/lib/target-configuration-details-group-list/target-configuration-details-group-list.tsx b/graph/ui-project-details/src/lib/target-configuration-details-group-list/target-configuration-details-group-list.tsx index bbb8c5031a9d8..218df08b2b444 100644 --- a/graph/ui-project-details/src/lib/target-configuration-details-group-list/target-configuration-details-group-list.tsx +++ b/graph/ui-project-details/src/lib/target-configuration-details-group-list/target-configuration-details-group-list.tsx @@ -44,8 +44,11 @@ export function TargetConfigurationGroupList({ if (hasGroups) { return ( <> - {Object.entries(targetsGroup.groups).map( - ([targetGroupName, targets]) => { + {Object.entries(targetsGroup.groups) + .sort(([targetGroupName1], [targetGroupName2]) => + targetGroupName1.localeCompare(targetGroupName2) + ) + .map(([targetGroupName, targets]) => { return ( ); - } - )} + })} { "options": { "buildTargetName": "build", "classesTargetName": "classes", + "includeSubprojectsTasks": false, "testTargetName": "test", }, "plugin": "@nx/gradle", @@ -48,6 +49,7 @@ describe('@nx/gradle:init', () => { "options": { "buildTargetName": "build", "classesTargetName": "classes", + "includeSubprojectsTasks": false, "testTargetName": "test", }, "plugin": "@nx/gradle", diff --git a/packages/gradle/src/generators/init/init.ts b/packages/gradle/src/generators/init/init.ts index 77ba771b76656..2a7f9028ec457 100644 --- a/packages/gradle/src/generators/init/init.ts +++ b/packages/gradle/src/generators/init/init.ts @@ -52,6 +52,7 @@ function addPlugin(tree: Tree) { testTargetName: 'test', classesTargetName: 'classes', buildTargetName: 'build', + includeSubprojectsTasks: false, }, }); updateNxJson(tree, nxJson); diff --git a/packages/gradle/src/migrations/20-2-0/add-include-subprojects-tasks.spec.ts b/packages/gradle/src/migrations/20-2-0/add-include-subprojects-tasks.spec.ts new file mode 100644 index 0000000000000..ad989cbc00abe --- /dev/null +++ b/packages/gradle/src/migrations/20-2-0/add-include-subprojects-tasks.spec.ts @@ -0,0 +1,63 @@ +import { Tree, readNxJson } from '@nx/devkit'; +import { createTreeWithEmptyWorkspace } from '@nx/devkit/testing'; +import update from './add-include-subprojects-tasks'; + +describe('AddIncludeSubprojectsTasks', () => { + let tree: Tree; + + beforeAll(() => { + tree = createTreeWithEmptyWorkspace(); + }); + + it('should not change nx.json if @nx/gradle is not added', async () => { + tree.write('nx.json', JSON.stringify({ namedInputs: {} })); + update(tree); + expect(readNxJson(tree)).toMatchInlineSnapshot(` + { + "namedInputs": {}, + } + `); + }); + + it('should add includeSubprojectsTasks to @nx/gradle plugin', async () => { + tree.write('nx.json', JSON.stringify({ plugins: ['@nx/gradle'] })); + update(tree); + expect(readNxJson(tree)).toMatchInlineSnapshot(` + { + "plugins": [ + { + "options": { + "includeSubprojectsTasks": true, + }, + "plugin": "@nx/gradle", + }, + ], + } + `); + }); + + it('should add includeSubprojectsTasks to @nx/gradle plugin with options', async () => { + tree.write( + 'nx.json', + JSON.stringify({ + plugins: [ + { plugin: '@nx/gradle', options: { testTargetName: 'test' } }, + ], + }) + ); + update(tree); + expect(readNxJson(tree)).toMatchInlineSnapshot(` + { + "plugins": [ + { + "options": { + "includeSubprojectsTasks": true, + "testTargetName": "test", + }, + "plugin": "@nx/gradle", + }, + ], + } + `); + }); +}); diff --git a/packages/gradle/src/migrations/20-2-0/add-include-subprojects-tasks.ts b/packages/gradle/src/migrations/20-2-0/add-include-subprojects-tasks.ts new file mode 100644 index 0000000000000..b81506bbdf62c --- /dev/null +++ b/packages/gradle/src/migrations/20-2-0/add-include-subprojects-tasks.ts @@ -0,0 +1,32 @@ +import { Tree, readNxJson, updateNxJson } from '@nx/devkit'; +import { hasGradlePlugin } from '../../utils/has-gradle-plugin'; +import { GradlePluginOptions } from '../../plugin/nodes'; + +// This function add options includeSubprojectsTasks as true in nx.json for gradle plugin +export default function update(tree: Tree) { + const nxJson = readNxJson(tree); + if (!nxJson) { + return; + } + if (!hasGradlePlugin(tree)) { + return; + } + let gradlePluginIndex = nxJson.plugins.findIndex((p) => + typeof p === 'string' ? p === '@nx/gradle' : p.plugin === '@nx/gradle' + ); + let gradlePlugin = nxJson.plugins[gradlePluginIndex]; + if (typeof gradlePlugin === 'string') { + gradlePlugin = { + plugin: '@nx/gradle', + options: { + includeSubprojectsTasks: true, + }, + }; + nxJson.plugins[gradlePluginIndex] = gradlePlugin; + } else { + gradlePlugin.options ??= {}; + (gradlePlugin.options as GradlePluginOptions).includeSubprojectsTasks = + true; + } + updateNxJson(tree, nxJson); +} diff --git a/packages/gradle/src/plugin/nodes.spec.ts b/packages/gradle/src/plugin/nodes.spec.ts index 47cbf615bcf03..2860777af9a02 100644 --- a/packages/gradle/src/plugin/nodes.spec.ts +++ b/packages/gradle/src/plugin/nodes.spec.ts @@ -30,8 +30,17 @@ describe('@nx/gradle/plugin', () => { gradleFileToOutputDirsMap: new Map>([ ['proj/build.gradle', new Map([['build', 'build']])], ]), + gradleProjectToTasksMap: new Map>([ + ['proj', new Set(['test'])], + ]), gradleProjectToTasksTypeMap: new Map>([ - ['proj', new Map([['test', 'Verification']])], + [ + 'proj', + new Map([ + ['test', 'Verification'], + ['build', 'Build'], + ]), + ], ]), gradleProjectToProjectName: new Map([['proj', 'proj']]), gradleProjectNameToProjectRootMap: new Map([ @@ -90,7 +99,113 @@ describe('@nx/gradle/plugin', () => { ], }, "name": "proj", + "projectType": "application", + "targets": { + "test": { + "cache": true, + "command": "./gradlew proj:test", + "dependsOn": [ + "testClasses", + ], + "inputs": [ + "default", + "^production", + ], + "metadata": { + "help": { + "command": "./gradlew help --task proj:test", + "example": { + "options": { + "args": [ + "--rerun", + ], + }, + }, + }, + "technologies": [ + "gradle", + ], + }, + "options": { + "cwd": ".", + }, + }, + }, + }, + }, + }, + ], + ] + `); + }); + + it('should create nodes include subprojects tasks', async () => { + const results = await createNodesFunction( + ['proj/build.gradle'], + { + buildTargetName: 'build', + includeSubprojectsTasks: true, + }, + context + ); + + expect(results).toMatchInlineSnapshot(` + [ + [ + "proj/build.gradle", + { + "projects": { + "proj": { + "metadata": { + "targetGroups": { + "Build": [ + "build", + ], + "Verification": [ + "test", + ], + }, + "technologies": [ + "gradle", + ], + }, + "name": "proj", + "projectType": "application", "targets": { + "build": { + "cache": true, + "command": "./gradlew proj:build", + "dependsOn": [ + "^build", + "classes", + "test", + ], + "inputs": [ + "production", + "^production", + ], + "metadata": { + "help": { + "command": "./gradlew help --task proj:build", + "example": { + "options": { + "args": [ + "--rerun", + ], + }, + }, + }, + "technologies": [ + "gradle", + ], + }, + "options": { + "cwd": ".", + }, + "outputs": [ + "build", + ], + }, "test": { "cache": true, "command": "./gradlew proj:test", @@ -138,6 +253,9 @@ describe('@nx/gradle/plugin', () => { gradleFileToOutputDirsMap: new Map>([ ['nested/nested/proj/build.gradle', new Map([['build', 'build']])], ]), + gradleProjectToTasksMap: new Map>([ + ['proj', new Set(['test'])], + ]), gradleProjectToTasksTypeMap: new Map>([ ['proj', new Map([['test', 'Verification']])], ]), @@ -177,6 +295,7 @@ describe('@nx/gradle/plugin', () => { ], }, "name": "proj", + "projectType": "application", "targets": { "test": { "cache": true, @@ -226,6 +345,9 @@ describe('@nx/gradle/plugin', () => { gradleFileToOutputDirsMap: new Map>([ ['nested/nested/proj/build.gradle', new Map([['build', 'build']])], ]), + gradleProjectToTasksMap: new Map>([ + ['proj', new Set(['test'])], + ]), gradleProjectToTasksTypeMap: new Map>([ ['proj', new Map([['test', 'Test']])], ]), @@ -290,6 +412,7 @@ describe('@nx/gradle/plugin', () => { ], }, "name": "proj", + "projectType": "application", "targets": { "test": { "cache": false, diff --git a/packages/gradle/src/plugin/nodes.ts b/packages/gradle/src/plugin/nodes.ts index f17aae096cbff..cbedf477d1b37 100644 --- a/packages/gradle/src/plugin/nodes.ts +++ b/packages/gradle/src/plugin/nodes.ts @@ -31,7 +31,7 @@ import { getGradleExecFile, findGraldewFile } from '../utils/exec-gradle'; const cacheableTaskType = new Set(['Build', 'Verification']); const dependsOnMap = { - build: ['^build', 'classes'], + build: ['^build', 'classes', 'test'], testClasses: ['classes'], test: ['testClasses'], classes: ['^classes'], @@ -43,11 +43,12 @@ interface GradleTask { } export interface GradlePluginOptions { + includeSubprojectsTasks?: boolean; // default is false, show all gradle tasks in the project ciTargetName?: string; testTargetName?: string; classesTargetName?: string; buildTargetName?: string; - [taskTargetName: string]: string | undefined; + [taskTargetName: string]: string | undefined | boolean; } function normalizeOptions(options: GradlePluginOptions): GradlePluginOptions { @@ -58,14 +59,7 @@ function normalizeOptions(options: GradlePluginOptions): GradlePluginOptions { return options; } -type GradleTargets = Record< - string, - { - name: string; - targets: Record; - metadata: ProjectConfiguration['metadata']; - } ->; +type GradleTargets = Record>; function readTargetsCache(cachePath: string): GradleTargets { return existsSync(cachePath) ? readJsonFile(cachePath) : {}; @@ -180,6 +174,7 @@ async function createGradleProject( try { const { gradleProjectToTasksTypeMap, + gradleProjectToTasksMap, gradleFileToOutputDirsMap, gradleFileToGradleProjectMap, gradleProjectToProjectName, @@ -193,16 +188,26 @@ async function createGradleProject( return; } - const tasksTypeMap = gradleProjectToTasksTypeMap.get(gradleProject) as Map< - string, - string - >; + const tasksTypeMap: Map = gradleProjectToTasksTypeMap.get( + gradleProject + ) as Map; + const tasksSet = gradleProjectToTasksMap.get(gradleProject) as Set; let tasks: GradleTask[] = []; - for (let [taskName, taskType] of tasksTypeMap.entries()) { + tasksSet.forEach((taskName) => { tasks.push({ - type: taskType, + type: tasksTypeMap.get(taskName) as string, name: taskName, }); + }); + if (options.includeSubprojectsTasks) { + tasksTypeMap.forEach((taskType, taskName) => { + if (!tasksSet.has(taskName)) { + tasks.push({ + type: taskType, + name: taskName, + }); + } + }); } const outputDirs = gradleFileToOutputDirsMap.get(gradleFilePath) as Map< @@ -219,8 +224,9 @@ async function createGradleProject( gradleFilePath, testFiles ); - const project = { + const project: Partial = { name: projectName, + projectType: 'application', targets, metadata: { targetGroups, @@ -266,7 +272,7 @@ async function createGradleTargets( getTestCiTargets( testFiles, gradleProject, - targetName, + targetName as string, options.ciTargetName, inputsMap['test'], outputs, @@ -281,7 +287,7 @@ async function createGradleTargets( task.name }`; - targets[targetName] = { + targets[targetName as string] = { command: `${getGradleExecFile()} ${taskCommandToRun}`, options: { cwd: gradlewFileDirectory, @@ -303,10 +309,12 @@ async function createGradleTargets( ...(outputs && outputs.length ? { outputs } : {}), }; - if (!targetGroups[task.type]) { - targetGroups[task.type] = []; + if (task.type) { + if (!targetGroups[task.type]) { + targetGroups[task.type] = []; + } + targetGroups[task.type].push(targetName as string); } - targetGroups[task.type].push(targetName); } return { targetGroups, targets }; } diff --git a/packages/gradle/src/utils/get-gradle-report.ts b/packages/gradle/src/utils/get-gradle-report.ts index 1d689890e6ce5..254e8b16c36bc 100644 --- a/packages/gradle/src/utils/get-gradle-report.ts +++ b/packages/gradle/src/utils/get-gradle-report.ts @@ -21,6 +21,7 @@ export interface GradleReport { buildFileToDepsMap: Map; gradleFileToOutputDirsMap: Map>; gradleProjectToTasksTypeMap: Map>; + gradleProjectToTasksMap: Map>; gradleProjectToProjectName: Map; gradleProjectNameToProjectRootMap: Map; gradleProjectToChildProjects: Map; @@ -105,6 +106,7 @@ export function processProjectReports( * Map of Gradle Build File to tasks type map */ const gradleProjectToTasksTypeMap = new Map>(); + const gradleProjectToTasksMap = new Map>(); const gradleProjectToProjectName = new Map(); const gradleProjectNameToProjectRootMap = new Map(); /** @@ -159,6 +161,7 @@ export function processProjectReports( absBuildFilePath: string, absBuildDirPath: string; const outputDirMap = new Map(); + const tasks = new Set(); for (const line of propertyReportLines) { if (line.startsWith('name: ')) { projectName = line.substring('name: '.length); @@ -190,6 +193,10 @@ export function processProjectReports( `{workspaceRoot}/${relative(workspaceRoot, dirPath)}` ); } + if (line.includes(': task ')) { + const [task] = line.split(': task '); + tasks.add(task); + } } if (!projectName || !absBuildFilePath || !absBuildDirPath) { @@ -217,6 +224,7 @@ export function processProjectReports( gradleProject, dirname(buildFile) ); + gradleProjectToTasksMap.set(gradleProject, tasks); } if (line.endsWith('taskReport')) { const gradleProject = line.substring( @@ -267,6 +275,7 @@ export function processProjectReports( buildFileToDepsMap, gradleFileToOutputDirsMap, gradleProjectToTasksTypeMap, + gradleProjectToTasksMap, gradleProjectToProjectName, gradleProjectNameToProjectRootMap, gradleProjectToChildProjects, From 59a3db868560f27d64336013cd8744c216b81874 Mon Sep 17 00:00:00 2001 From: Emily Xiong Date: Thu, 5 Dec 2024 10:55:50 -0800 Subject: [PATCH 19/21] fix(core): skip nx cloud prompt when interactive is false (#28949) ## Current Behavior ## Expected Behavior ## Related Issue(s) Fixes # --- e2e/utils/create-project-utils.ts | 2 +- .../src/internal-utils/prompts.ts | 29 ++++++++++--------- .../create-package/create-package.ts | 2 +- .../files/e2e/__cliName__.spec.ts__tmpl__ | 14 +++++---- .../plugin/src/generators/e2e-project/e2e.ts | 2 +- .../files/src/__pluginName__.spec.ts__tmpl__ | 16 +++++----- 6 files changed, 35 insertions(+), 30 deletions(-) diff --git a/e2e/utils/create-project-utils.ts b/e2e/utils/create-project-utils.ts index 05406751870df..7199e95e8623c 100644 --- a/e2e/utils/create-project-utils.ts +++ b/e2e/utils/create-project-utils.ts @@ -372,7 +372,7 @@ export function runCreatePlugin( let command = `${ pm.runUninstalledPackage - } create-nx-plugin@${getPublishedVersion()} ${name} --nxCloud=skip`; + } create-nx-plugin@${getPublishedVersion()} ${name} --nxCloud=skip --no-interactive`; if (packageManager && !useDetectedPm) { command += ` --package-manager=${packageManager}`; diff --git a/packages/create-nx-workspace/src/internal-utils/prompts.ts b/packages/create-nx-workspace/src/internal-utils/prompts.ts index 93414a9604de7..2b622428a80d3 100644 --- a/packages/create-nx-workspace/src/internal-utils/prompts.ts +++ b/packages/create-nx-workspace/src/internal-utils/prompts.ts @@ -1,4 +1,7 @@ import * as yargs from 'yargs'; +import * as enquirer from 'enquirer'; +import * as chalk from 'chalk'; + import { MessageKey, messages } from '../utils/nx/ab-testing'; import { output } from '../utils/output'; import { deduceDefaultBase } from '../utils/git/default-base'; @@ -8,17 +11,18 @@ import { packageManagerList, } from '../utils/package-manager'; import { stringifyCollection } from '../utils/string-utils'; -import enquirer = require('enquirer'); import { NxCloud } from '../utils/nx/nx-cloud'; -import chalk = require('chalk'); +import { isCI } from '../utils/ci/is-ci'; export async function determineNxCloud( parsedArgs: yargs.Arguments<{ nxCloud: NxCloud }> ): Promise { - if (parsedArgs.nxCloud === undefined) { - return nxCloudPrompt('setupCI'); - } else { + if (parsedArgs.nxCloud) { return parsedArgs.nxCloud; + } else if (!parsedArgs.interactive || isCI()) { + return 'skip'; + } else { + return nxCloudPrompt('setupCI'); } } @@ -70,9 +74,8 @@ export async function determineDefaultBase( parsedArgs: yargs.Arguments<{ defaultBase?: string }> ): Promise { if (parsedArgs.defaultBase) { - return Promise.resolve(parsedArgs.defaultBase); - } - if (parsedArgs.allPrompts) { + return parsedArgs.defaultBase; + } else if (parsedArgs.allPrompts) { return enquirer .prompt<{ DefaultBase: string }>([ { @@ -93,7 +96,7 @@ export async function determineDefaultBase( return a.DefaultBase; }); } - return Promise.resolve(deduceDefaultBase()); + return deduceDefaultBase(); } export async function determinePackageManager( @@ -103,7 +106,7 @@ export async function determinePackageManager( if (packageManager) { if (packageManagerList.includes(packageManager as PackageManager)) { - return Promise.resolve(packageManager as PackageManager); + return packageManager as PackageManager; } output.error({ title: 'Invalid package manager', @@ -114,9 +117,7 @@ export async function determinePackageManager( ], }); process.exit(1); - } - - if (parsedArgs.allPrompts) { + } else if (parsedArgs.allPrompts) { return enquirer .prompt<{ packageManager: PackageManager }>([ { @@ -135,5 +136,5 @@ export async function determinePackageManager( .then((a) => a.packageManager); } - return Promise.resolve(detectInvokedPackageManager()); + return detectInvokedPackageManager(); } diff --git a/packages/plugin/src/generators/create-package/create-package.ts b/packages/plugin/src/generators/create-package/create-package.ts index f6966037b542b..930bd5fc4fbea 100644 --- a/packages/plugin/src/generators/create-package/create-package.ts +++ b/packages/plugin/src/generators/create-package/create-package.ts @@ -229,7 +229,7 @@ function addE2eProject(host: Tree, options: NormalizedSchema) { { pluginName: options.project, cliName: options.name, - packageManagerCommands: getPackageManagerCommand('npm'), + packageManagerCommands: getPackageManagerCommand(), pluginPackageName, tmpl: '', } diff --git a/packages/plugin/src/generators/create-package/files/e2e/__cliName__.spec.ts__tmpl__ b/packages/plugin/src/generators/create-package/files/e2e/__cliName__.spec.ts__tmpl__ index 873b84f1a94b9..11c89d9f74f89 100644 --- a/packages/plugin/src/generators/create-package/files/e2e/__cliName__.spec.ts__tmpl__ +++ b/packages/plugin/src/generators/create-package/files/e2e/__cliName__.spec.ts__tmpl__ @@ -6,11 +6,13 @@ describe('<%= cliName %>', () => { let projectDirectory: string; afterAll(() => { - // Cleanup the test project - rmSync(projectDirectory, { - recursive: true, - force: true, - }); + if (projectDirectory) { + // Cleanup the test project + rmSync(projectDirectory, { + recursive: true, + force: true, + }); + } }); @@ -43,7 +45,7 @@ function createTestProject(extraArgs = '') { }); execSync( - `<%= packageManagerCommands.exec %> --yes <%= cliName %>@e2e ${projectName} ${extraArgs}`, + `<%= packageManagerCommands.dlx %> <%= cliName %>@e2e ${projectName} ${extraArgs}`, { cwd: dirname(projectDirectory), stdio: 'inherit', diff --git a/packages/plugin/src/generators/e2e-project/e2e.ts b/packages/plugin/src/generators/e2e-project/e2e.ts index fa948ff94ae4f..0439dc678742a 100644 --- a/packages/plugin/src/generators/e2e-project/e2e.ts +++ b/packages/plugin/src/generators/e2e-project/e2e.ts @@ -111,7 +111,7 @@ function addFiles(host: Tree, options: NormalizedSchema) { ...options, tmpl: '', rootTsConfigPath: getRelativePathToRootTsConfig(host, options.projectRoot), - packageManagerCommands: getPackageManagerCommand('npm'), + packageManagerCommands: getPackageManagerCommand(), pluginPackageName, }); } diff --git a/packages/plugin/src/generators/e2e-project/files/src/__pluginName__.spec.ts__tmpl__ b/packages/plugin/src/generators/e2e-project/files/src/__pluginName__.spec.ts__tmpl__ index bf71aadb0f6d2..1519076b188c4 100644 --- a/packages/plugin/src/generators/e2e-project/files/src/__pluginName__.spec.ts__tmpl__ +++ b/packages/plugin/src/generators/e2e-project/files/src/__pluginName__.spec.ts__tmpl__ @@ -10,7 +10,7 @@ describe('<%= pluginName %>', () => { // The plugin has been built and published to a local registry in the jest globalSetup // Install the plugin built with the latest source code into the test repo - execSync(`<%= packageManagerCommands.install %> <%= pluginPackageName %>@e2e`, { + execSync(`<%= packageManagerCommands.addDev %> <%= pluginPackageName %>@e2e`, { cwd: projectDirectory, stdio: 'inherit', env: process.env, @@ -18,11 +18,13 @@ describe('<%= pluginName %>', () => { }); afterAll(() => { - // Cleanup the test project - rmSync(projectDirectory, { - recursive: true, - force: true, - }); + if (projectDirectory) { + // Cleanup the test project + rmSync(projectDirectory, { + recursive: true, + force: true, + }); + } }); @@ -53,7 +55,7 @@ function createTestProject() { }); execSync( - `<%= packageManagerCommands.exec %> --yes create-nx-workspace@latest ${projectName} --preset apps --nxCloud=skip --no-interactive`, + `<%= packageManagerCommands.dlx %> create-nx-workspace@latest ${projectName} --preset apps --nxCloud=skip --no-interactive`, { cwd: dirname(projectDirectory), stdio: 'inherit', From 2e98918a3f3a1ee90b308551d9d56425248578c8 Mon Sep 17 00:00:00 2001 From: Emily Xiong Date: Thu, 5 Dec 2024 13:29:54 -0800 Subject: [PATCH 20/21] fix(gradle): fix gradle unit test (#29224) ## Current Behavior ## Expected Behavior ## Related Issue(s) Fixes # --- e2e/gradle/src/utils/create-gradle-project.ts | 6 +++++- packages/gradle/plugin.spec.ts | 4 ++++ packages/gradle/src/utils/get-project-report-lines.ts | 4 ++-- 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/e2e/gradle/src/utils/create-gradle-project.ts b/e2e/gradle/src/utils/create-gradle-project.ts index b1e11051b2a06..1e4755082e1b7 100644 --- a/e2e/gradle/src/utils/create-gradle-project.ts +++ b/e2e/gradle/src/utils/create-gradle-project.ts @@ -15,7 +15,11 @@ export function createGradleProject( packageName: string = 'gradleProject', addProjectJsonNamePrefix: string = '' ) { - e2eConsoleLogger(`Using java version: ${execSync('java -version')}`); + e2eConsoleLogger( + `Using java version: ${execSync('java -version')} ${execSync( + 'echo $JAVA_HOME' + )}` + ); const gradleCommand = isWindows() ? resolve(`${__dirname}/../../gradlew.bat`) : resolve(`${__dirname}/../../gradlew`); diff --git a/packages/gradle/plugin.spec.ts b/packages/gradle/plugin.spec.ts index c07019a01d431..78dc8efe8bb1d 100644 --- a/packages/gradle/plugin.spec.ts +++ b/packages/gradle/plugin.spec.ts @@ -27,6 +27,9 @@ describe('@nx/gradle/plugin', () => { gradleFileToOutputDirsMap: new Map>([ ['proj/build.gradle', new Map([['build', 'build']])], ]), + gradleProjectToTasksMap: new Map>([ + ['proj', new Set(['test'])], + ]), gradleProjectToTasksTypeMap: new Map>([ ['proj', new Map([['test', 'Verification']])], ]), @@ -86,6 +89,7 @@ describe('@nx/gradle/plugin', () => { ], }, "name": "proj", + "projectType": "application", "targets": { "test": { "cache": true, diff --git a/packages/gradle/src/utils/get-project-report-lines.ts b/packages/gradle/src/utils/get-project-report-lines.ts index 84be3187ccc93..ddeaf341c7861 100644 --- a/packages/gradle/src/utils/get-project-report-lines.ts +++ b/packages/gradle/src/utils/get-project-report-lines.ts @@ -42,7 +42,7 @@ export async function getProjectReportLines( 'projectReport', ]); logger.warn( - `Could not run 'projectReportAll' task. Ran 'projectReport' instead. Please run 'nx generate @nx/gradle:init' to generate the necessary tasks.` + `Could not run 'projectReportAll' task. Ran 'projectReport' instead. Please run 'nx generate @nx/gradle:init' to generate the necessary tasks. ${e.message}` ); } catch (e) { throw new AggregateCreateNodesError( @@ -50,7 +50,7 @@ export async function getProjectReportLines( [ gradlewFile, new Error( - `Could not run 'projectReportAll' or 'projectReport' task. Please run 'nx generate @nx/gradle:init' to generate the necessary tasks.` + `Could not run 'projectReportAll' or 'projectReport' task. Please run 'nx generate @nx/gradle:init' to generate the necessary tasks. ${e.message}` ), ], ], From cc1441170abb54b354c8dada3ecd5e820d3836d6 Mon Sep 17 00:00:00 2001 From: Benjamin Cabanes <3447705+bcabanes@users.noreply.github.com> Date: Thu, 5 Dec 2024 17:20:45 -0500 Subject: [PATCH 21/21] docs(nx-dev): revamp the Nx Enterprise page on nx.dev (#29209) This update introduces a revamp to the Nx Enterprise page. The code changes involved the addition of new image files, amending several components for improved UI/UX. This refactor also includes an alteration to the Call-to-Action section and an introduction of a new Carousel component for better navigation. These adjustments aim to provide an improved user experience and enhanced readability. --------- Co-authored-by: Isaac Mann --- nx-dev/nx-dev/pages/enterprise.tsx | 51 +- .../public/images/enterprise/nx-agents.avif | Bin 0 -> 11483 bytes .../public/images/enterprise/nx-atomizer.avif | Bin 0 -> 69062 bytes .../enterprise/nx-flaky-tasks-detection.avif | Bin 0 -> 30322 bytes .../images/enterprise/nx-partnership.avif | Bin 0 -> 6133 bytes .../public/images/enterprise/nx-replay.avif | Bin 0 -> 30742 bytes .../enterprise/video-story-pavlo-grosse.avif | Bin 0 -> 36325 bytes nx-dev/ui-animations/src/lib/marquee.tsx | 17 +- nx-dev/ui-common/src/lib/default-layout.tsx | 2 +- nx-dev/ui-common/src/lib/headers/header.tsx | 20 +- nx-dev/ui-enterprise/src/index.ts | 15 +- nx-dev/ui-enterprise/src/lib/bento-grid.tsx | 78 -- .../ui-enterprise/src/lib/call-to-action.tsx | 49 +- nx-dev/ui-enterprise/src/lib/carousel.tsx | 309 +++++++ .../ui-enterprise/src/lib/customer-logos.tsx | 114 +++ .../src/lib/customer-metrics.tsx | 90 ++ .../src/lib/download-case-study.tsx | 3 +- .../ui-enterprise/src/lib/download-ebook.tsx | 62 -- .../src/lib/enterprise-addons.tsx | 78 -- nx-dev/ui-enterprise/src/lib/hero.tsx | 102 ++- .../src/lib/hetzner-cloud-testimonial.tsx | 246 +++++ .../src/lib/make-your-ci-fast.tsx | 143 +++ .../src/lib/metrics-and-customers.tsx | 185 ---- .../src/lib/scale-your-organization.tsx | 319 +++++++ .../src/lib/scale-your-people.tsx | 255 ------ nx-dev/ui-enterprise/src/lib/security.tsx | 82 +- .../ui-enterprise/src/lib/solve-your-ci.tsx | 849 ------------------ .../src/lib/testimonial-carousel.tsx | 196 ++++ nx-dev/ui-enterprise/src/lib/trusted-by.tsx | 220 ----- .../src/lib/vmware-testimonial.tsx | 48 + .../src/lib/customers/hetzner-cloud.tsx | 4 +- nx-dev/ui-icons/src/lib/customers/payfit.tsx | 4 +- 32 files changed, 1689 insertions(+), 1852 deletions(-) create mode 100644 nx-dev/nx-dev/public/images/enterprise/nx-agents.avif create mode 100644 nx-dev/nx-dev/public/images/enterprise/nx-atomizer.avif create mode 100644 nx-dev/nx-dev/public/images/enterprise/nx-flaky-tasks-detection.avif create mode 100644 nx-dev/nx-dev/public/images/enterprise/nx-partnership.avif create mode 100644 nx-dev/nx-dev/public/images/enterprise/nx-replay.avif create mode 100644 nx-dev/nx-dev/public/images/enterprise/video-story-pavlo-grosse.avif delete mode 100644 nx-dev/ui-enterprise/src/lib/bento-grid.tsx create mode 100644 nx-dev/ui-enterprise/src/lib/carousel.tsx create mode 100644 nx-dev/ui-enterprise/src/lib/customer-logos.tsx create mode 100644 nx-dev/ui-enterprise/src/lib/customer-metrics.tsx delete mode 100644 nx-dev/ui-enterprise/src/lib/download-ebook.tsx delete mode 100644 nx-dev/ui-enterprise/src/lib/enterprise-addons.tsx create mode 100644 nx-dev/ui-enterprise/src/lib/hetzner-cloud-testimonial.tsx create mode 100644 nx-dev/ui-enterprise/src/lib/make-your-ci-fast.tsx delete mode 100644 nx-dev/ui-enterprise/src/lib/metrics-and-customers.tsx create mode 100644 nx-dev/ui-enterprise/src/lib/scale-your-organization.tsx delete mode 100644 nx-dev/ui-enterprise/src/lib/scale-your-people.tsx delete mode 100644 nx-dev/ui-enterprise/src/lib/solve-your-ci.tsx create mode 100644 nx-dev/ui-enterprise/src/lib/testimonial-carousel.tsx delete mode 100644 nx-dev/ui-enterprise/src/lib/trusted-by.tsx create mode 100644 nx-dev/ui-enterprise/src/lib/vmware-testimonial.tsx diff --git a/nx-dev/nx-dev/pages/enterprise.tsx b/nx-dev/nx-dev/pages/enterprise.tsx index 84257850cf12f..e1e56019bc5b9 100644 --- a/nx-dev/nx-dev/pages/enterprise.tsx +++ b/nx-dev/nx-dev/pages/enterprise.tsx @@ -3,29 +3,31 @@ import { NextSeo } from 'next-seo'; import { DefaultLayout } from '@nx/nx-dev/ui-common'; import { CallToAction, - DownloadEbook, - EnterpriseAddons, + CustomerLogos, + CustomerMetrics, Hero, - MetricsAndCustomers, - ScaleYourPeople, + HetznerCloudTestimonial, + MakeYourCiFast, + ScaleOrganizationIntro, + ScaleYourOrganization, Security, - TrustedBy, - SolveYourCi, + TestimonialCarousel, + VmwareTestimonial, } from '@nx/nx-dev/ui-enterprise'; -import { TrialCallout } from '@nx/nx-dev/ui-pricing'; import { requestFreeTrial } from '../lib/components/headerCtaConfigs'; +import { ReactElement } from 'react'; -export function Enterprise(): JSX.Element { +export function Enterprise(): ReactElement { const router = useRouter(); return ( <> - +
+
+
- +
- +
-
- -
-
- +
+ +
-
- +
+
- +
- -
-
- +
-
+
diff --git a/nx-dev/nx-dev/public/images/enterprise/nx-agents.avif b/nx-dev/nx-dev/public/images/enterprise/nx-agents.avif new file mode 100644 index 0000000000000000000000000000000000000000..a7e897ed3783010ef24c43f3c0e11683cd542c67 GIT binary patch literal 11483 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 hqo3U9`+p4(D60Sf literal 0 HcmV?d00001 diff --git a/nx-dev/nx-dev/public/images/enterprise/nx-atomizer.avif b/nx-dev/nx-dev/public/images/enterprise/nx-atomizer.avif new file mode 100644 index 0000000000000000000000000000000000000000..7f183df74835d11c20e74c697192ec1eada89fd9 GIT binary patch literal 69062 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 WJG$ouwil0InV{!vM-Ke0O0F<5rUIA% literal 0 HcmV?d00001 diff --git a/nx-dev/nx-dev/public/images/enterprise/nx-flaky-tasks-detection.avif b/nx-dev/nx-dev/public/images/enterprise/nx-flaky-tasks-detection.avif new file mode 100644 index 0000000000000000000000000000000000000000..3f0470555bf88d0903cddfc767b78e732f4f7cbd GIT binary patch literal 30322 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

    Lphtb$5l~Z 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 literal 0 HcmV?d00001 diff --git a/nx-dev/nx-dev/public/images/enterprise/nx-replay.avif b/nx-dev/nx-dev/public/images/enterprise/nx-replay.avif new file mode 100644 index 0000000000000000000000000000000000000000..3d5942f33ad785db773c594768d01299d3ee1261 GIT binary patch literal 30742 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

    QivG!9;g86l_Os=aP7{}uV|*n` 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

    =RmgrZ8F4W4?)fvA< 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 (

    {children}
    diff --git a/nx-dev/ui-common/src/lib/default-layout.tsx b/nx-dev/ui-common/src/lib/default-layout.tsx index a27b48018de99..f1d776e3f27d7 100644 --- a/nx-dev/ui-common/src/lib/default-layout.tsx +++ b/nx-dev/ui-common/src/lib/default-layout.tsx @@ -24,7 +24,7 @@ export function DefaultLayout({ aria-hidden="true" >
    {/*DESKTOP*/} -
    +
    {/*PRIMARY NAVIGATION*/}
    {/*LOGO*/} diff --git a/nx-dev/ui-enterprise/src/index.ts b/nx-dev/ui-enterprise/src/index.ts index b9a6c7abff577..cc6ea94fead6e 100644 --- a/nx-dev/ui-enterprise/src/index.ts +++ b/nx-dev/ui-enterprise/src/index.ts @@ -1,10 +1,11 @@ export * from './lib/call-to-action'; -export * from './lib/download-case-study'; -export * from './lib/download-ebook'; -export * from './lib/enterprise-addons'; export * from './lib/hero'; -export * from './lib/metrics-and-customers'; -export * from './lib/scale-your-people'; export * from './lib/security'; -export * from './lib/trusted-by'; -export * from './lib/solve-your-ci'; +export * from './lib/customer-logos'; +export * from './lib/customer-metrics'; +export * from './lib/make-your-ci-fast'; +export * from './lib/hetzner-cloud-testimonial'; +export * from './lib/vmware-testimonial'; +export * from './lib/scale-your-organization'; +export * from './lib/testimonial-carousel'; +export * from './lib/download-case-study'; diff --git a/nx-dev/ui-enterprise/src/lib/bento-grid.tsx b/nx-dev/ui-enterprise/src/lib/bento-grid.tsx deleted file mode 100644 index b269013c0df6d..0000000000000 --- a/nx-dev/ui-enterprise/src/lib/bento-grid.tsx +++ /dev/null @@ -1,78 +0,0 @@ -import Link from 'next/link'; -import { ReactNode } from 'react'; -import { cx } from '@nx/nx-dev/ui-primitives'; - -export const BentoGrid = ({ - className, - children, -}: { - className?: string; - children?: ReactNode; -}) => { - return ( -
    - {children} -
    - ); -}; - -export const BentoGridItem = ({ - className, - title = null, - description = null, - header, - url = null, - icon, -}: { - className?: string; - title?: string | ReactNode | null; - description?: string | ReactNode | null; - header: ReactNode; - icon?: ReactNode; - url?: string | null; -}) => { - return ( -
    - {header} -
    -
    -
    - {icon} {title} -
    - {description && ( -
    - {description} -
    - )} -
    - {url ? ( - - - - - - ) : null} -
    -
    - ); -}; diff --git a/nx-dev/ui-enterprise/src/lib/call-to-action.tsx b/nx-dev/ui-enterprise/src/lib/call-to-action.tsx index c9a16c3cd4f5a..a351fb9a67062 100644 --- a/nx-dev/ui-enterprise/src/lib/call-to-action.tsx +++ b/nx-dev/ui-enterprise/src/lib/call-to-action.tsx @@ -1,11 +1,17 @@ import Link from 'next/link'; +import { ReactElement } from 'react'; +import { sendCustomEvent } from '@nx/nx-dev/feature-analytics'; -export function CallToAction(): JSX.Element { +export function CallToAction(): ReactElement { return ( -
    +

    - Your organization's transformation -
    - starts now + Get your hands dirty and try it out for yourself.

    + sendCustomEvent( + 'request-trial-click', + 'enterprise-bottom-cta', + 'enterprise' + ) + } + className="rounded-md bg-slate-950 px-3.5 py-2.5 text-sm font-semibold text-slate-100 shadow-sm hover:bg-slate-800 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-white dark:bg-white dark:text-slate-900 dark:hover:bg-slate-100" > - Talk to engineering + Request a free trial

    - Ready to talk terms?{' '} + Want to talk terms or see a demo?{' '} + sendCustomEvent( + 'contact-team', + 'enterprise-bottom-cta', + 'enterprise' + ) + } > - Speak directly to sales + Reach out to our team .

    diff --git a/nx-dev/ui-enterprise/src/lib/carousel.tsx b/nx-dev/ui-enterprise/src/lib/carousel.tsx new file mode 100644 index 0000000000000..8b6dbe89fabb4 --- /dev/null +++ b/nx-dev/ui-enterprise/src/lib/carousel.tsx @@ -0,0 +1,309 @@ +import { + createContext, + forwardRef, + ReactElement, + ReactNode, + Ref, + useCallback, + useContext, + useEffect, + useImperativeHandle, + useRef, + useState, +} from 'react'; +import { motion, MotionConfig, useAnimation } from 'framer-motion'; +import { cx } from '@nx/nx-dev/ui-primitives'; + +export interface CarouselHandle { + /** + * Navigate to a specific slide index + * @param index The zero-based index of the target slide + */ + goToSlide: (index: number) => void; + + /** + * Move to the next slide + */ + goToNext: () => void; + + /** + * Move to the previous slide + */ + goToPrevious: () => void; + + /** + * Get the current slide index + */ + getCurrentIndex: () => number; + + /** + * Get the total number of slides + */ + getTotalSlides: () => number; + + /** + * Pause the autoplay if it's enabled + */ + pauseAutoPlay: () => void; + + /** + * Resume the autoplay if it's enabled + */ + resumeAutoPlay: () => void; +} + +interface CarouselContextValue { + currentIndex: number; + totalSlides: number; + goToSlide: (index: number) => void; + goToNext: () => void; + goToPrevious: () => void; + pauseAutoPlay: () => void; + resumeAutoPlay: () => void; + registerSlide: (id: string) => void; + unregisterSlide: (id: string) => void; +} + +interface CarouselRootProps { + children: ReactNode; + className?: string; + autoPlayInterval?: number; + animationDuration?: number; + onSlideChange?: (index: number) => void; + enableKeyboardNavigation?: boolean; + ref?: Ref; +} + +const SPRING_CONFIG = { + type: 'spring' as const, + damping: 30, + stiffness: 300, + mass: 0.2, +}; + +const CarouselContext = createContext(null); + +export const useCarousel = (): CarouselContextValue => { + const context = useContext(CarouselContext); + if (!context) { + throw new Error('Carousel components must be used within a CarouselRoot'); + } + return context; +}; + +export const CarouselRoot = forwardRef( + ( + { + children, + className = '', + autoPlayInterval, + animationDuration = 0.5, + onSlideChange, + enableKeyboardNavigation = true, + }, + ref + ): ReactElement => { + const [currentIndex, setCurrentIndex] = useState(0); + const [slideIds, setSlideIds] = useState([]); + + const autoPlayTimeoutRef = useRef(); + const containerRef = useRef(null); + + const goToSlide = useCallback( + (index: number) => { + // Ensure the index is within bounds + const safeIndex = Math.max(0, Math.min(index, slideIds.length - 1)); + setCurrentIndex(safeIndex); + + // Call the onSlideChange callback if provided + onSlideChange?.(safeIndex); + }, + [slideIds.length, onSlideChange] + ); + const goToNext = useCallback(() => { + goToSlide((currentIndex + 1) % slideIds.length); + }, [currentIndex, slideIds.length, goToSlide]); + const goToPrevious = useCallback(() => { + goToSlide((currentIndex - 1 + slideIds.length) % slideIds.length); + }, [currentIndex, slideIds.length, goToSlide]); + + // Implement keyboard navigation + useEffect(() => { + if (!enableKeyboardNavigation) return; + + const handleKeyDown = (event: KeyboardEvent) => { + // Ignore keyboard navigation when user is typing in an input + if ( + event.target instanceof HTMLInputElement || + event.ctrlKey || + event.altKey || + event.shiftKey || + event.metaKey + ) { + return; + } + + switch (event.key) { + case 'ArrowLeft': + event.preventDefault(); + goToPrevious(); + break; + case 'ArrowRight': + event.preventDefault(); + goToNext(); + break; + case 'Home': + event.preventDefault(); + goToSlide(0); + break; + case 'End': + event.preventDefault(); + goToSlide(slideIds.length - 1); + break; + default: + break; + } + }; + + window.addEventListener('keydown', handleKeyDown); + return () => window.removeEventListener('keydown', handleKeyDown); + }, [ + enableKeyboardNavigation, + goToNext, + goToPrevious, + goToSlide, + slideIds.length, + ]); + + // Autoplay functionality + const pauseAutoPlay = useCallback(() => { + if (autoPlayTimeoutRef.current) { + clearInterval(autoPlayTimeoutRef.current); + } + }, []); + const resumeAutoPlay = useCallback(() => { + if (autoPlayInterval) { + pauseAutoPlay(); + autoPlayTimeoutRef.current = setInterval(goToNext, autoPlayInterval); + } + }, [autoPlayInterval, goToNext, pauseAutoPlay]); + + // Set up and clean up autoplay + useEffect(() => { + if (autoPlayInterval) { + resumeAutoPlay(); + } + return pauseAutoPlay; + }, [autoPlayInterval, resumeAutoPlay, pauseAutoPlay]); + + // Register and unregister slides + const registerSlide = useCallback((id: string) => { + setSlideIds((prev) => [...prev, id]); + }, []); + const unregisterSlide = useCallback((id: string) => { + setSlideIds((prev) => prev.filter((slideId) => slideId !== id)); + }, []); + + const contextValue = { + currentIndex, + totalSlides: slideIds.length, + goToSlide, + goToNext, + goToPrevious, + pauseAutoPlay, + resumeAutoPlay, + registerSlide, + unregisterSlide, + }; + + // Expose methods through the ref + useImperativeHandle( + ref, + () => ({ + goToSlide, + goToNext, + goToPrevious, + getCurrentIndex: () => currentIndex, + getTotalSlides: () => slideIds.length, + pauseAutoPlay, + resumeAutoPlay, + }), + [ + goToSlide, + goToNext, + goToPrevious, + currentIndex, + slideIds.length, + pauseAutoPlay, + resumeAutoPlay, + ] + ); + + return ( + + +
    + {children} +
    +
    +
    + ); + } +); + +export function CarouselViewport({ + className = '', + children, +}: { + className?: string; + children: ReactNode; +}): ReactElement { + const { currentIndex } = useCarousel(); + const controls = useAnimation(); + + useEffect(() => { + controls.start({ + x: -currentIndex * 100 + '%', + transition: SPRING_CONFIG, + }); + }, [currentIndex, controls]); + + return ( + + {children} + + ); +} + +export function CarouselSlide({ + children, + className = '', +}: { + children: ReactNode; + className?: string; +}): ReactElement { + const { registerSlide, unregisterSlide } = useCarousel(); + const slideId = useRef(`slide-${Math.random()}`); + + useEffect(() => { + registerSlide(slideId.current); + return () => unregisterSlide(slideId.current); + }, [registerSlide, unregisterSlide]); + + return ( +
    + {children} +
    + ); +} diff --git a/nx-dev/ui-enterprise/src/lib/customer-logos.tsx b/nx-dev/ui-enterprise/src/lib/customer-logos.tsx new file mode 100644 index 0000000000000..794d6a4bc813e --- /dev/null +++ b/nx-dev/ui-enterprise/src/lib/customer-logos.tsx @@ -0,0 +1,114 @@ +import { + AmericanAirlinesIcon, + AwsIcon, + BillIcon, + CapitalOneIcon, + CaterpillarIcon, + CiscoIcon, + FicoIcon, + HiltonIcon, + ManIcon, + RoyalBankOfCanadaIcon, + SevenElevenIcon, + ShopifyIcon, + StorybookIcon, + VmwareIcon, +} from '@nx/nx-dev/ui-icons'; +import { ReactElement } from 'react'; +import { Marquee } from '@nx/nx-dev/ui-animations'; +import { cx } from '@nx/nx-dev/ui-primitives'; +import Link from 'next/link'; +import { ChevronRightIcon } from '@heroicons/react/20/solid'; + +export function CustomerLogos(): ReactElement { + const icons = [ + { + Icon: AwsIcon, + className: 'size-14', + }, + { + Icon: ManIcon, + className: 'size-14', + }, + { + Icon: CapitalOneIcon, + className: 'size-28', + }, + { + Icon: ShopifyIcon, + className: null, + }, + { + Icon: RoyalBankOfCanadaIcon, + className: null, + }, + { + Icon: VmwareIcon, + className: 'size-24', + }, + { + Icon: StorybookIcon, + className: null, + }, + { + Icon: FicoIcon, + className: 'size-20', + }, + { + Icon: CaterpillarIcon, + className: null, + }, + { + Icon: CiscoIcon, + className: 'size-16', + }, + { + Icon: BillIcon, + className: null, + }, + { + Icon: SevenElevenIcon, + className: null, + }, + { + Icon: HiltonIcon, + className: 'size-24', + }, + { + Icon: AmericanAirlinesIcon, + className: null, + }, + ]; + + return ( +
    + + {icons.map((e, idx) => ( + +
    +
    +
    + + See our customers{' '} +
    +
    + ); +} diff --git a/nx-dev/ui-enterprise/src/lib/customer-metrics.tsx b/nx-dev/ui-enterprise/src/lib/customer-metrics.tsx new file mode 100644 index 0000000000000..503688fbeeb4d --- /dev/null +++ b/nx-dev/ui-enterprise/src/lib/customer-metrics.tsx @@ -0,0 +1,90 @@ +import { ReactElement } from 'react'; +import { HetznerCloudIcon } from '@nx/nx-dev/ui-icons'; +import { SectionHeading } from '@nx/nx-dev/ui-common'; +import Link from 'next/link'; +import { sendCustomEvent } from '@nx/nx-dev/feature-analytics'; + +export function CustomerMetrics(): ReactElement { + return ( +
    +
    +
    +
    +
    +
    +
    +

    + Engineers will run a test command and expect it to run for + 20 mins, they start it and see it finishes in a few seconds, + then they ask “Did I start it wrong? Why is it so fast?” +

    +
    +
    + pavlo grosse +
    +
    Pavlo Grosse
    +
    + Senior Software Engineer, Hetzner Cloud +
    +
    +
    +
    + + Want to see it in action?{' '} + + sendCustomEvent( + 'request-trial-click', + 'enterprise-customer-metrics', + 'enterprise' + ) + } + className="font-semibold underline" + > + Request a demo now + + +
    +
    +
    +
    +
    faster CI
    +
    + 70% +
    +
    +
    +
    less compute used
    +
    + 60% +
    +
    +
    +
    reduction in infra costs
    +
    + 75% +
    +
    +
    +
    +
    +
    +
    +
    + ); +} diff --git a/nx-dev/ui-enterprise/src/lib/download-case-study.tsx b/nx-dev/ui-enterprise/src/lib/download-case-study.tsx index c89f8820d03f8..4479f2725731d 100644 --- a/nx-dev/ui-enterprise/src/lib/download-case-study.tsx +++ b/nx-dev/ui-enterprise/src/lib/download-case-study.tsx @@ -1,4 +1,5 @@ import { ButtonLink } from '@nx/nx-dev/ui-common'; +import { ReactElement } from 'react'; export interface DownloadCaseStudyProps { title: string; @@ -12,7 +13,7 @@ export function DownloadCaseStudy({ description, buttonHref, buttonText = 'Download (pdf)', -}: DownloadCaseStudyProps): JSX.Element { +}: DownloadCaseStudyProps): ReactElement { return (
    diff --git a/nx-dev/ui-enterprise/src/lib/download-ebook.tsx b/nx-dev/ui-enterprise/src/lib/download-ebook.tsx deleted file mode 100644 index 6cf77ffecf509..0000000000000 --- a/nx-dev/ui-enterprise/src/lib/download-ebook.tsx +++ /dev/null @@ -1,62 +0,0 @@ -import { ButtonLink } from '@nx/nx-dev/ui-common'; -import { ReactElement } from 'react'; - -export function DownloadEbook(): ReactElement { - return ( -
    -
    - -
    -

    - Download our ebook -

    -

    - Discover how to scale your organization without feeling the pain of - CI, while having a better developer experience and fitting your - requirements. -

    -
    - - Download{' '} - (pdf) - -
    -
    -
    - App screenshot - - ebook - -
    -
    -
    - ); -} diff --git a/nx-dev/ui-enterprise/src/lib/enterprise-addons.tsx b/nx-dev/ui-enterprise/src/lib/enterprise-addons.tsx deleted file mode 100644 index 7fde9872ff399..0000000000000 --- a/nx-dev/ui-enterprise/src/lib/enterprise-addons.tsx +++ /dev/null @@ -1,78 +0,0 @@ -import { - BoltIcon, - ChevronDoubleRightIcon, - UsersIcon, -} from '@heroicons/react/24/outline'; -import { SectionHeading } from '@nx/nx-dev/ui-common'; - -export function EnterpriseAddons(): JSX.Element { - return ( -
    -
    -
    - - Partner with the Nx team - -
    -
    -
    -
    -
    -
    -
    - Move fast, move together -
    -
    -

    - We know Nx, you know your code. Together, we can build your - ultimate developer platform, tailored to your team. -

    -
    -
    -
    -
    -
    -
    - No trial and error necessary -
    -
    -

    - With the help of the developers of Nx, you'll use Nx and Nx - Cloud to its full potential, the first time. No matter how - long you've been using Nx, we'll find ways to make it more - powerful. -

    -
    -
    -
    -
    -
    -
    - Migrate to Nx & Nx Cloud -
    -
    -

    - Wherever your team is at in their Nx journey, our experts will - make it easy to move ahead and capture the full value of Nx - and Nx Cloud. -

    -
    -
    -
    -
    -
    -
    - ); -} diff --git a/nx-dev/ui-enterprise/src/lib/hero.tsx b/nx-dev/ui-enterprise/src/lib/hero.tsx index 30d0a939d2304..d122f38c889bb 100644 --- a/nx-dev/ui-enterprise/src/lib/hero.tsx +++ b/nx-dev/ui-enterprise/src/lib/hero.tsx @@ -1,42 +1,104 @@ import { ButtonLink, SectionHeading } from '@nx/nx-dev/ui-common'; -import Link from 'next/link'; +import { ReactElement } from 'react'; +import { ChevronRightIcon } from '@heroicons/react/20/solid'; +import { sendCustomEvent } from '@nx/nx-dev/feature-analytics'; -export function Hero(): JSX.Element { +export function Hero(): ReactElement { return ( -
    -
    -
    - - Nx Enterprise +
    + +
    +
    +

    + + + Live event + + + Webinar + live Q&A on Dec 10th + + +

    + + Solving the Performance Paradox,{' '} + + get speed and scale + Accelerate your organization's journey to tighter collaboration, better developer experience, and speed…lots of speed. -
    +
    + sendCustomEvent( + 'request-trial-click', + 'enterprise-hero', + 'enterprise' + ) + } > Request a free trial -

    - Got questions?{' '} - - Talk to an engineer. - -

    +
    +
    +
    +
    +
    + nx cloud application dashboard screenshot +
    diff --git a/nx-dev/ui-enterprise/src/lib/hetzner-cloud-testimonial.tsx b/nx-dev/ui-enterprise/src/lib/hetzner-cloud-testimonial.tsx new file mode 100644 index 0000000000000..3a3f0d0a18c22 --- /dev/null +++ b/nx-dev/ui-enterprise/src/lib/hetzner-cloud-testimonial.tsx @@ -0,0 +1,246 @@ +import { ComponentProps, ReactElement } from 'react'; +import { Button, ButtonLink, SectionHeading } from '@nx/nx-dev/ui-common'; +import { HetznerCloudIcon } from '@nx/nx-dev/ui-icons'; +import Link from 'next/link'; +import { cx } from '@nx/nx-dev/ui-primitives'; +import { MovingBorder } from '@nx/nx-dev/ui-animations'; +import { motion } from 'framer-motion'; +import { + ArrowDownTrayIcon, + PlayIcon, + VideoCameraIcon, +} from '@heroicons/react/24/outline'; + +function PlayButton({ + className, + ...props +}: ComponentProps<'div'>): ReactElement { + const parent = { + initial: { + width: 82, + transition: { + when: 'afterChildren', + }, + }, + hover: { + width: 296, + transition: { + duration: 0.125, + type: 'tween', + ease: 'easeOut', + }, + }, + }; + const child = { + initial: { + opacity: 0, + x: -6, + }, + hover: { + x: 0, + opacity: 1, + transition: { + duration: 0.015, + type: 'tween', + ease: 'easeOut', + }, + }, + }; + + return ( +
    +
    + +
    + +
    + + +
    + ); +} + +export function HetznerCloudTestimonial(): ReactElement { + return ( +
    +
    + + Nx Enterprise{' '} + + speeds build and test times + {' '} +
    + as Hetzner Cloud{' '} + + scales up + {' '} + product offering +
    +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + Avatar + +
    + {/* setIsOpen(true)}*/} + {/*/>*/} +
    +
    +
    + +
    +
    + + +
    +

    + Featured client +

    + +

    + Nx is speed and scalability. Before we only had a few features + and CI was slow and now it’s fast with way more features. + That’s a huge win for us.”. +

    +
    + +
    + pavlo grosse +
    +
    Pavlo Grosse
    +
    + Senior Software Engineer, Hetzner Cloud +
    +
    +
    + +
    + {/**/} + {/*
    +
    +
    +
    +
    +
    + ); +} diff --git a/nx-dev/ui-enterprise/src/lib/make-your-ci-fast.tsx b/nx-dev/ui-enterprise/src/lib/make-your-ci-fast.tsx new file mode 100644 index 0000000000000..6702b99c9c40f --- /dev/null +++ b/nx-dev/ui-enterprise/src/lib/make-your-ci-fast.tsx @@ -0,0 +1,143 @@ +import { ReactElement } from 'react'; +import { SectionHeading } from '@nx/nx-dev/ui-common'; + +export function MakeYourCiFast(): ReactElement { + return ( +
    +
    + + Make your CI fast,{' '} + + really fast + + +
    +
    +
    + Nx Replay: remote caching +
    +
    + + Nx Replay + +
    +

    + Never build the same code twice +

    +

    + Remote caching ensures that tasks are never rebuilt twice, + significantly reducing build times and resource usage. Share + cached results across your team and CI pipelines. +

    +
    +
    +
    +
    +
    + Nx flaky task detection & rerun +
    +
    + + Flaky task retries + +
    +

    + One less thing to debug +

    +

    + Automatically detect and re-run flaky tasks, enhancing the + reliability of your CI processes and minimizing time spent + debugging. +

    +
    +
    +
    +
    +
    + Nx Atomizer: split large tasks & E2E in chunks +
    +
    + + Atomizer + +
    +

    + Break tasks down, to speed tests up +

    +

    + Atomizer automatically + splits large e2e tests into smaller, atomized tasks, enabling + lightning fast testing. Parallelize your tests to reduce + bottlenecks and keep your pipelines fast. +

    +
    +
    +
    +
    +
    + Nx Agents: simple & fast task distribution +
    +
    + + Nx Agents + +
    +

    + Machines, make it fast! +

    +

    + Nx Agents intelligently + distribute tasks across multiple machines, significantly + reducing build times. Dynamically allocate agents based on PR + size to balance speed and cost. +

    +
    +
    +
    +
    +
    + Partner with the Nx Team for guidances +
    +
    + + Partnership + +
    +

    + Always thinking a step ahead for you +

    +

    + With Nx, you receive expert guidance from day one, ensuring + your setup is optimized for maximum efficiency. Whether you're + starting fresh, migrating, or scaling your developer platform, + we'll work with you to tailor the perfect solution for your + team. +

    +
    +
    +
    +
    +
    +
    + ); +} diff --git a/nx-dev/ui-enterprise/src/lib/metrics-and-customers.tsx b/nx-dev/ui-enterprise/src/lib/metrics-and-customers.tsx deleted file mode 100644 index d31eefdf2751d..0000000000000 --- a/nx-dev/ui-enterprise/src/lib/metrics-and-customers.tsx +++ /dev/null @@ -1,185 +0,0 @@ -import { motion, Variants } from 'framer-motion'; -import { DownloadCaseStudy } from './download-case-study'; -import { - BillColoredIcon, - CapitalOneIcon, - CaterpillarIcon, - CiscoIcon, - FicoIcon, - HiltonIcon, - ManIcon, - RoyalBankOfCanadaColoredIcon, - SevenElevenColoredIcon, - ShopifyIcon, - StorybookIcon, - VmwareIcon, -} from '@nx/nx-dev/ui-icons'; - -export function MetricsAndCustomers(): JSX.Element { - const downloadElement: Variants = { - hidden: { - opacity: 0, - translateY: 90, - }, - visible: { - opacity: 1, - translateY: 0, - transition: { - duration: 1, - ease: 'easeInOut', - type: 'tween', - }, - }, - }; - return ( -
    - -
    -
    -
    -
    Speed
    -
    - - 30-70% Faster - -
    -
    -
    -
    Infra Cost
    -
    - - 40-75% Cheaper - -
    -
    -
    -
    Compute
    -
    - - 30-60% Less - -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    - - - -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    - ); -} diff --git a/nx-dev/ui-enterprise/src/lib/scale-your-organization.tsx b/nx-dev/ui-enterprise/src/lib/scale-your-organization.tsx new file mode 100644 index 0000000000000..0749f230a26d0 --- /dev/null +++ b/nx-dev/ui-enterprise/src/lib/scale-your-organization.tsx @@ -0,0 +1,319 @@ +import { ReactElement } from 'react'; +import { SectionHeading, Strong } from '@nx/nx-dev/ui-common'; +import { + AcademicCapIcon, + ArrowPathIcon, + CheckBadgeIcon, + CodeBracketSquareIcon, + DocumentMagnifyingGlassIcon, + DocumentTextIcon, + EyeIcon, + ShieldExclamationIcon, + UsersIcon, +} from '@heroicons/react/24/outline'; +import Link from 'next/link'; + +export function ScaleYourOrganization(): ReactElement { + return ( +
    +
    +
    +
    + Nx Polygraph +
    +
    +
    + + Get to market faster by avoiding the most common pitfall of + growing teams: silos. Silos create waste, have poorly defined + ownership, lack visibility - and slow everything down. + + + Polygraph is a set of Nx Enterprise features built to help large + organizations{' '} + + see across workspaces and take action to accelerate + time-to-market + + . + +
    +
    +

    + “Nx means tooling and efficiency around our software + development lifecycle that empowers us to move a lot faster, + ship code faster and more reliably.” +

    +
    +
    + Justin Schwartzenberger +
    +
    Justin Schwartzenberger
    +
    + Principle Software Engineer, SiriusXM +
    +
    +
    +
    +
    +
    +
    + +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + Visibility +
    +
    + See dependencies across teams and repos +
    +
    +

    + In an organization with hundreds of repos it can be hard + to understand the relationships between different parts of + your ever-growing codebases. With the Workspace Graph, see + dependencies across all your repos to understand which + projects and teams are affected by changes in a single + repo. +

    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + Conformance +
    +
    + Streamline onboarding and governance +
    +
    +

    + Platform teams can easily publish and enforce coding + standards across an entire organization. Write and publish + rules, refactorings, and generators, then quickly deploy + them across all repos without involving individual teams. + Ensure security vulnerabilities are always addressed and + third-party dependencies stay up to date.{' '} + + Included in{' '} + + Nx Powerpack + + , and available complimentary to all Enterprise + customers. + +

    +
      +
    • + + Configure Conformance Rules{' '} + + +
    • +
    • + + Publish Conformance Rules{' '} + + +
    • +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + Ownership +
    +
    + Clear, expressive ownership +
    +
    +

    + Unlike the code ownership tools from VCS providers, Nx + Owners is built for monorepos. Define ownership at the + project level. Nx will compile it back to the file-based + rules your VCS providers understand. +

    +

    + Polygraph lets you see owners across all your repositories + and plan out multi repo refactorings and migrations.{' '} + + Included in{' '} + + Nx Powerpack + + , and available complimentary to all Enterprise + customers. + +

    +
    +
    +
    +
    +
    +
    +
    +
    + ); +} + +export function ScaleOrganizationIntro(): ReactElement { + return ( +
    + +
    + + Don’t lose velocity as your organization grows{' '} +
    + 10x developer{' '} + + Nx developers are even more efficient at scale + +
    +
    +
    + ); +} diff --git a/nx-dev/ui-enterprise/src/lib/scale-your-people.tsx b/nx-dev/ui-enterprise/src/lib/scale-your-people.tsx deleted file mode 100644 index a20f61ce61c26..0000000000000 --- a/nx-dev/ui-enterprise/src/lib/scale-your-people.tsx +++ /dev/null @@ -1,255 +0,0 @@ -import { - BuildingOffice2Icon, - Cog6ToothIcon, - CubeTransparentIcon, - IdentificationIcon, - SquaresPlusIcon, - UserGroupIcon, -} from '@heroicons/react/24/outline'; -import { SectionHeading } from '@nx/nx-dev/ui-common'; - -export function ScaleYourPeople(): JSX.Element { - return ( -
    -
    -
    - - Scale your people - -
    - - Build big things with the efficiency of a small team by increasing - collaboration and developer mobility, reducing wait time and - duplication, and establishing clear ownership. - -
    -
    -
    -
    - -
    -
    - -
    -
    - -
    -
    - -
    -
    - -
    -
    - -
    -
    -
    -
    - - Product screenshot - -
    - - -
    -
    - - coming soon - -
    -
    -
    - -
    -
    -

    - Monorepo, polyrepo, multi-monorepo? -

    -

    - Whatever you’re working with, Nx Enterprise will give you the - visibility you need to understand what they have in common, - how they relate, and how they differ. -

    -
    -
    -
    -
    - -
    -
    -

    - Monorepo experience in a polyrepo environment -

    -

    - Nx Enterprise will support optional monorepo-like constraints - to be applied across Nx Workspace boundaries in a seamless and - flexible way. Move fast with confidence. -

    -
    -
    -
    -
    - -
    -
    -

    - Automation over coordination -

    -

    - Testing and cross-repo coordination can be left to Nx - Enterprise tooling instead of manual human intervention to - test and enforce cross-repo dependencies & constraints. -

    -
    -
    -
    -
    -
    -
    - ); -} diff --git a/nx-dev/ui-enterprise/src/lib/security.tsx b/nx-dev/ui-enterprise/src/lib/security.tsx index ddc83ac35858a..b586474151406 100644 --- a/nx-dev/ui-enterprise/src/lib/security.tsx +++ b/nx-dev/ui-enterprise/src/lib/security.tsx @@ -1,10 +1,16 @@ +import { + GlobeAmericasIcon, + ServerStackIcon, + ShieldCheckIcon, +} from '@heroicons/react/24/outline'; import { SectionHeading } from '@nx/nx-dev/ui-common'; +import { ReactElement } from 'react'; -export function Security(): JSX.Element { +export function Security(): ReactElement { return (
    -
    -
    +
    +
    Security @@ -62,35 +68,49 @@ export function Security(): JSX.Element {
    -
    -

    - Dedicated infrastructure -

    -

    - We can support you to self-host Nx Cloud within your own - infrastructure or, depending on your needs, run Nx Cloud on - managed hosts within our cloud. -

    +
    +
    -
    -

    - Application security -

    -

    - We consistently review our security policies and collaborate - with third parties for penetration testing to promptly identify - and mitigate potential risks. -

    + +
    +
    -
    -

    - US & EU instances available -

    -

    - We support region specific hosting of Nx Cloud in the event IT - security or data protection policies restrict international - transfers. -

    + +
    +
    @@ -100,7 +120,7 @@ export function Security(): JSX.Element { aria-hidden="true" >
    -
    -
    - - Solve your CI - -
    - - Monorepos help you scale your people but they can also make CI a - challenge. Nx Enterprise solves it by providing efficient, fast and - reliable CI that can handle workflows of any size. - - {/*FEATURES CONTAINER*/} - - {items.map((item, i) => ( - p:text-lg]', item.className)} - icon={item.icon} - url={item.url} - /> - ))} - - - {/*TEXT*/} -
    - - - -
    -
    -
    - -
    -
    -

    - Both faster and cheaper -

    -

    - Current CI providers aren’t made for monorepos. They’re - low-level and static in their configuration. The combination - of Nx Agents and Nx Replay lets you reuse computation from - other runs and utilizes the allocated VMs in the most optimal - way. -

    -
    -
    -
    -
    - -
    -
    -

    - Solving E2E tests -

    -

    - Atomizer splits large e2e projects into fine-grained test - runs, enabling more efficient distribution and dramatically - reducing CI times. It also identifies flaky e2e tests at the - file level and re-runs those specific tests. -

    -
    -
    -
    -
    - -
    -
    -

    - What, not how -

    -

    - Nx Enterprise simplifies CI configuration, emphasizing which - tasks to execute over how with no need to tweak your CI - scripts as your monorepo evolves. This simplified - configuration cuts down on CI maintenance and increases - stability. -

    -
    -
    -
    -
    - -
    -
    -

    - Nx Powerpack included -

    -

    - A suite of paid extensions for the Nx CLI specifically - designed for enterprises, built and supported by the Nx core - team.{' '} - - Learn more about Nx Powerpack → - -

    -
    -
    -
    -
    -
    -
    - ); -} - -const Caching = () => { - const variants = { - hidden: { - opacity: 0, - transition: { - when: 'afterChildren', - }, - }, - visible: { - opacity: 1, - }, - }; - const items = [ - { - cache: 'remote', - target: 'build', - project: 'website', - }, - { - cache: 'remote', - target: 'test', - project: 'express', - }, - { - cache: 'remote', - target: 'build', - project: 'eslint', - }, - { - cache: 'remote', - target: 'lint', - project: 'autoloan', - }, - { - cache: 'remote', - target: 'test', - project: 'website', - }, - { - cache: 'remote', - target: 'lint', - project: 'website', - }, - { - cache: 'remote', - target: 'build-base', - project: 'express', - }, - { - cache: 'remote', - target: 'build', - project: 'express', - }, - { - cache: 'remote', - target: 'lint', - project: 'express', - }, - { - cache: 'remote', - target: 'test', - project: 'autoloan', - }, - ]; - return ( - - - -
    - {items.map((i, idx) => ( -
    -
    -
    - - {i.cache} - -
    -
    - {i.project}:{i.target} -
    -
    < 1s
    -
    - ))} -
    - - ); -}; - -const Atomizer = () => { - const variants = { - hidden: { - opacity: 0, - transition: { - when: 'afterChildren', - }, - }, - visible: { - opacity: 1, - }, - }; - const itemVariants = { - visible: (i: number) => ({ - opacity: 1, - x: 0, - transition: { - delay: i * 0.2, - duration: 0.275, - ease: 'easeOut', - when: 'beforeChildren', - staggerChildren: 0.3, - }, - }), - hidden: { - opacity: 0, - x: -100, - transition: { - when: 'afterChildren', - }, - }, - }; - const uiDialogsTests = ['e2e-ui-cdk:e2e', 'e2e-ui-layout:e2e']; - const loansTests = [ - 'loans-front-store:e2e', - 'loans-loans:e2e', - 'loans-credit-card:e2e', - 'loans-workflows:e2e', - 'loans-mortgage:e2e', - 'loans-submission:e2e', - ]; - const DefaultConnector = () => ( - <> -