@nx/react
Version:
95 lines (94 loc) • 4.29 kB
JavaScript
;
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;