UNPKG

@nx/react

Version:

The React plugin for Nx contains executors and generators for managing React applications and libraries within an Nx workspace. It provides: - Integration with libraries such as Jest, Vitest, Playwright, Cypress, and Storybook. - Generators for applica

95 lines (94 loc) 4.29 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.providerGenerator = providerGenerator; const tslib_1 = require("tslib"); const devkit_1 = require("@nx/devkit"); const assert_supported_react_version_1 = require("../../utils/assert-supported-react-version"); const versions_1 = require("@nx/js/src/utils/versions"); const versions_2 = require("../../utils/versions"); const mfVersions = tslib_1.__importStar(require("../_utils/mf-versions")); const mf_dependencies_1 = require("../_utils/mf-dependencies"); const normalize_1 = require("../_utils/normalize"); // `--mode=...` is rspack's portable equivalent of `NODE_ENV=...` and works on // Windows without a shell prefix. const BUNDLER_DEV_COMMAND = { vite: 'vite', rsbuild: 'rsbuild dev', rspack: 'rspack serve --mode=development', }; const BUNDLER_BUILD_COMMAND = { vite: 'vite build', rsbuild: 'rsbuild build', rspack: 'rspack build --mode=production', }; async function providerGenerator(tree, schema) { (0, assert_supported_react_version_1.assertSupportedReactVersion)(tree); const opts = await (0, normalize_1.normalizeScaffoldOptions)(tree, { directory: schema.directory, surface: 'provider', bundler: schema.bundler, port: schema.port, }); // `exposeName` is the public MF expose key (consumers reference // `<provider>/<exposeName>`) and may be kebab-case, e.g. `cart-widget`. // `componentName` is the PascalCase identifier used for the React function // and its filename, since `export function cart-widget()` would be invalid. const exposeName = schema.exposeName?.trim() || 'App'; const componentName = (0, devkit_1.names)(exposeName).className; // `dependsOn` on a `continuous: true` target lets nx spin up the consumer // alongside the provider - matches the deprecated host/remote 'serve a // remote, host comes along' UX. Only wired when --consumer is set (e.g. // when the consumer generator scaffolds this provider). const serveTarget = { executor: 'nx:run-commands', continuous: true, options: { command: BUNDLER_DEV_COMMAND[opts.bundler], cwd: opts.projectRoot, }, }; if (schema.consumer) { serveTarget.dependsOn = [`${schema.consumer}:serve`]; } (0, devkit_1.addProjectConfiguration)(tree, opts.projectName, { root: opts.projectRoot, sourceRoot: (0, devkit_1.joinPathFragments)(opts.projectRoot, 'src'), projectType: 'application', targets: { serve: serveTarget, build: { executor: 'nx:run-commands', options: { command: BUNDLER_BUILD_COMMAND[opts.bundler], cwd: opts.projectRoot, }, }, }, }); const templateSubstitutions = { projectName: opts.projectName, federationName: opts.federationName, port: opts.port, exposeName, componentName, versions: { ...mfVersions, reactVersion: versions_2.reactVersion, reactDomVersion: versions_2.reactDomVersion, typesReactVersion: versions_2.typesReactVersion, typesReactDomVersion: versions_2.typesReactDomVersion, typescriptVersion: versions_1.typescriptVersion, }, tmpl: '', }; (0, devkit_1.generateFiles)(tree, (0, devkit_1.joinPathFragments)(__dirname, 'files', '_common'), opts.projectRoot, templateSubstitutions); (0, devkit_1.generateFiles)(tree, (0, devkit_1.joinPathFragments)(__dirname, 'files', opts.bundler), opts.projectRoot, templateSubstitutions); // Write deps into the workspace root package.json so bare bundler bins // resolve when nx invokes the generated run-commands serve target. The // per-project package.json template still ships for pnpm-workspace setups. const deps = (0, mf_dependencies_1.getProviderDeps)(opts.bundler); const installTask = (0, devkit_1.addDependenciesToPackageJson)(tree, deps.dependencies, deps.devDependencies, undefined, true); await (0, devkit_1.formatFiles)(tree); return (0, devkit_1.runTasksInSerial)(installTask); } exports.default = providerGenerator;