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

202 lines (201 loc) • 7.94 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.addProject = addProject; const devkit_1 = require("@nx/devkit"); const has_webpack_plugin_1 = require("../../../utils/has-webpack-plugin"); const maybe_js_1 = require("../../../utils/maybe-js"); const has_rspack_plugin_1 = require("../../../utils/has-rspack-plugin"); function addProject(host, options) { const project = { root: options.appProjectRoot, sourceRoot: `${options.appProjectRoot}/src`, projectType: 'application', targets: {}, tags: options.parsedTags, }; if (options.bundler === 'webpack') { if (!(0, has_webpack_plugin_1.hasWebpackPlugin)(host) || !options.addPlugin) { project.targets = { build: createBuildTarget(options), serve: createServeTarget(options), }; } } else if (options.bundler === 'rspack' && (!(0, has_rspack_plugin_1.hasRspackPlugin)(host) || !options.addPlugin)) { project.targets = { build: createRspackBuildTarget(options), serve: createRspackServeTarget(options), }; } const packageJson = { name: options.importPath, version: '0.0.1', private: true, }; if (!options.useProjectJson) { if (options.projectName !== options.importPath) { packageJson.nx = { name: options.projectName }; } if (Object.keys(project.targets).length) { packageJson.nx ??= {}; packageJson.nx.targets = project.targets; } if (options.parsedTags?.length) { packageJson.nx ??= {}; packageJson.nx.tags = options.parsedTags; } } else { (0, devkit_1.addProjectConfiguration)(host, options.projectName, { ...project, }); } if (!options.useProjectJson || options.isUsingTsSolutionConfig) { // React Router already adds a package.json to the project root if (options.useReactRouter) { (0, devkit_1.updateJson)(host, (0, devkit_1.joinPathFragments)(options.appProjectRoot, 'package.json'), (json) => { return { name: packageJson.name, ...json, }; }); } else { (0, devkit_1.writeJson)(host, (0, devkit_1.joinPathFragments)(options.appProjectRoot, 'package.json'), packageJson); } } } function createRspackBuildTarget(options) { return { executor: '@nx/rspack:rspack', outputs: ['{options.outputPath}'], defaultConfiguration: 'production', options: { outputPath: options.isUsingTsSolutionConfig ? (0, devkit_1.joinPathFragments)(options.appProjectRoot, 'dist') : (0, devkit_1.joinPathFragments)('dist', options.appProjectRoot !== '.' ? options.appProjectRoot : options.projectName), index: (0, devkit_1.joinPathFragments)(options.appProjectRoot, 'src/index.html'), baseHref: '/', main: (0, devkit_1.joinPathFragments)(options.appProjectRoot, (0, maybe_js_1.maybeJs)(options, `src/main.tsx`)), tsConfig: (0, devkit_1.joinPathFragments)(options.appProjectRoot, 'tsconfig.app.json'), assets: [ (0, devkit_1.joinPathFragments)(options.appProjectRoot, 'src/favicon.ico'), (0, devkit_1.joinPathFragments)(options.appProjectRoot, 'src/assets'), ], rspackConfig: (0, devkit_1.joinPathFragments)(options.appProjectRoot, 'rspack.config.js'), styles: options.styledModule || !options.hasStyles ? [] : [ (0, devkit_1.joinPathFragments)(options.appProjectRoot, `src/styles.${options.style}`), ], scripts: [], configurations: { development: { mode: 'development', }, production: { mode: 'production', optimization: true, sourceMap: false, outputHashing: 'all', namedChunks: false, extractLicenses: true, vendorChunk: false, }, }, }, }; } function createRspackServeTarget(options) { return { executor: '@nx/rspack:dev-server', defaultConfiguration: 'development', options: { buildTarget: `${options.projectName}:build`, hmr: true, }, configurations: { development: { buildTarget: `${options.projectName}:build:development`, }, production: { buildTarget: `${options.projectName}:build:production`, hmr: false, }, }, }; } function createBuildTarget(options) { return { executor: '@nx/webpack:webpack', outputs: ['{options.outputPath}'], defaultConfiguration: 'production', options: { compiler: options.compiler ?? 'babel', outputPath: options.isUsingTsSolutionConfig ? (0, devkit_1.joinPathFragments)(options.appProjectRoot, 'dist') : (0, devkit_1.joinPathFragments)('dist', options.appProjectRoot !== '.' ? options.appProjectRoot : options.projectName), index: (0, devkit_1.joinPathFragments)(options.appProjectRoot, 'src/index.html'), baseHref: '/', main: (0, devkit_1.joinPathFragments)(options.appProjectRoot, (0, maybe_js_1.maybeJs)(options, `src/main.tsx`)), tsConfig: (0, devkit_1.joinPathFragments)(options.appProjectRoot, 'tsconfig.app.json'), assets: [ (0, devkit_1.joinPathFragments)(options.appProjectRoot, 'src/favicon.ico'), (0, devkit_1.joinPathFragments)(options.appProjectRoot, 'src/assets'), ], styles: options.styledModule || !options.hasStyles ? [] : [ (0, devkit_1.joinPathFragments)(options.appProjectRoot, `src/styles.${options.style}`), ], scripts: [], webpackConfig: (0, devkit_1.joinPathFragments)(options.appProjectRoot, 'webpack.config.js'), }, configurations: { development: { extractLicenses: false, optimization: false, sourceMap: true, vendorChunk: true, }, production: { fileReplacements: [ { replace: (0, devkit_1.joinPathFragments)(options.appProjectRoot, (0, maybe_js_1.maybeJs)(options, `src/environments/environment.ts`)), with: (0, devkit_1.joinPathFragments)(options.appProjectRoot, (0, maybe_js_1.maybeJs)(options, `src/environments/environment.prod.ts`)), }, ], optimization: true, outputHashing: 'all', sourceMap: false, namedChunks: false, extractLicenses: true, vendorChunk: false, }, }, }; } function createServeTarget(options) { return { executor: '@nx/webpack:dev-server', defaultConfiguration: 'development', options: { buildTarget: `${options.projectName}:build`, hmr: true, }, configurations: { development: { buildTarget: `${options.projectName}:build:development`, }, production: { buildTarget: `${options.projectName}:build:production`, hmr: false, }, }, }; }