UNPKG

@nx/nuxt

Version:

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

170 lines (169 loc) • 7.65 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.applicationGenerator = applicationGenerator; exports.applicationGeneratorInternal = applicationGeneratorInternal; const devkit_1 = require("@nx/devkit"); const init_1 = require("../init/init"); const normalize_options_1 = require("./lib/normalize-options"); const create_ts_config_1 = require("../../utils/create-ts-config"); const js_1 = require("@nx/js"); const update_gitignore_1 = require("../../utils/update-gitignore"); const add_e2e_1 = require("./lib/add-e2e"); const add_linting_1 = require("../../utils/add-linting"); const add_vitest_1 = require("./lib/add-vitest"); const vue_1 = require("@nx/vue"); const ensure_dependencies_1 = require("./lib/ensure-dependencies"); const log_show_project_command_1 = require("@nx/devkit/src/utils/log-show-project-command"); const node_child_process_1 = require("node:child_process"); const node_path_1 = require("node:path"); const onboarding_1 = require("nx/src/nx-cloud/utilities/onboarding"); const ts_solution_setup_1 = require("@nx/js/src/utils/typescript/ts-solution-setup"); const sort_fields_1 = require("@nx/js/src/utils/package-json/sort-fields"); async function applicationGenerator(tree, schema) { return await applicationGeneratorInternal(tree, { useProjectJson: true, ...schema, }); } async function applicationGeneratorInternal(tree, schema) { const tasks = []; const addTsPlugin = (0, ts_solution_setup_1.shouldConfigureTsSolutionSetup)(tree, true, // nuxt always adds plugins schema.useTsSolution); const jsInitTask = await (0, js_1.initGenerator)(tree, { ...schema, tsConfigName: schema.rootProject ? 'tsconfig.json' : 'tsconfig.base.json', skipFormat: true, addTsPlugin, platform: 'web', }); tasks.push(jsInitTask); const options = await (0, normalize_options_1.normalizeOptions)(tree, schema); const projectOffsetFromRoot = (0, devkit_1.offsetFromRoot)(options.appProjectRoot); const onBoardingStatus = await (0, onboarding_1.createNxCloudOnboardingURLForWelcomeApp)(tree, options.nxCloudToken); const connectCloudUrl = onBoardingStatus === 'unclaimed' && (await (0, onboarding_1.getNxCloudAppOnBoardingUrl)(options.nxCloudToken)); tasks.push(await (0, ensure_dependencies_1.ensureDependencies)(tree, 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 (options.parsedTags?.length) { packageJson.nx ??= {}; packageJson.nx.tags = options.parsedTags; } } else { const sourceDir = options.useAppDir ? 'app' : 'src'; (0, devkit_1.addProjectConfiguration)(tree, options.projectName, { root: options.appProjectRoot, projectType: 'application', sourceRoot: `${options.appProjectRoot}/${sourceDir}`, tags: options.parsedTags?.length ? options.parsedTags : undefined, targets: {}, }); } if (!options.useProjectJson || options.isUsingTsSolutionConfig) { (0, devkit_1.writeJson)(tree, (0, devkit_1.joinPathFragments)(options.appProjectRoot, 'package.json'), packageJson); } // Select template directory based on useAppDir const templateDir = options.useAppDir ? 'app-dir' : 'base'; const nxWelcomeDir = options.useAppDir ? 'nx-welcome-app-dir' : 'nx-welcome'; (0, devkit_1.generateFiles)(tree, (0, node_path_1.join)(__dirname, './files', templateDir), options.appProjectRoot, { ...options, offsetFromRoot: projectOffsetFromRoot, relativePathToRootTsConfig: (0, js_1.getRelativePathToRootTsConfig)(tree, options.appProjectRoot), title: options.projectName, dot: '.', tmpl: '', style: options.style, projectRoot: options.appProjectRoot, hasVitest: options.unitTestRunner === 'vitest', }); (0, devkit_1.generateFiles)(tree, (0, node_path_1.join)(__dirname, './files', nxWelcomeDir, onBoardingStatus), options.appProjectRoot, { ...options, connectCloudUrl, offsetFromRoot: projectOffsetFromRoot, title: options.projectName, dot: '.', tmpl: '', style: options.style, projectRoot: options.appProjectRoot, hasVitest: options.unitTestRunner === 'vitest', }); if (options.style === 'none') { const stylesPath = options.useAppDir ? `app/assets/css/styles.none` : `src/assets/css/styles.none`; tree.delete((0, devkit_1.joinPathFragments)(options.appProjectRoot, stylesPath)); } (0, create_ts_config_1.createTsConfig)(tree, { projectRoot: options.appProjectRoot, rootProject: options.rootProject, unitTestRunner: options.unitTestRunner, isUsingTsSolutionConfig: options.isUsingTsSolutionConfig, useAppDir: options.useAppDir, }, (0, js_1.getRelativePathToRootTsConfig)(tree, options.appProjectRoot)); (0, update_gitignore_1.updateGitIgnore)(tree); // If we are using the new TS solution // We need to update the workspace file (package.json or pnpm-workspaces.yaml) to include the new project if (options.isUsingTsSolutionConfig) { await (0, ts_solution_setup_1.addProjectToTsSolutionWorkspace)(tree, options.appProjectRoot); } tasks.push(await (0, add_linting_1.addLinting)(tree, { projectName: options.projectName, projectRoot: options.appProjectRoot, linter: options.linter ?? 'eslint', unitTestRunner: options.unitTestRunner, rootProject: options.rootProject, })); if (options.unitTestRunner === 'vitest') { tasks.push((0, devkit_1.addDependenciesToPackageJson)(tree, {}, { '@vue/test-utils': vue_1.vueTestUtilsVersion, '@vitejs/plugin-vue': vue_1.vitePluginVueVersion, })); tasks.push(await (0, add_vitest_1.addVitest)(tree, options)); } const nuxtInitTask = await (0, init_1.default)(tree, { ...options, skipFormat: true, }); tasks.push(nuxtInitTask); tasks.push(await (0, add_e2e_1.addE2e)(tree, options)); if (options.js) (0, devkit_1.toJS)(tree); if (options.isUsingTsSolutionConfig) { (0, ts_solution_setup_1.updateTsconfigFiles)(tree, options.appProjectRoot, 'tsconfig.app.json', { jsx: 'preserve', jsxImportSource: 'vue', module: 'esnext', moduleResolution: 'bundler', resolveJsonModule: true, }, options.linter === 'eslint' ? ['eslint.config.js', 'eslint.config.cjs', 'eslint.config.mjs'] : undefined); } (0, sort_fields_1.sortPackageJsonFields)(tree, options.appProjectRoot); if (!options.skipFormat) await (0, devkit_1.formatFiles)(tree); tasks.push(() => { try { (0, node_child_process_1.execSync)(`npx -y nuxi prepare`, { cwd: options.appProjectRoot, windowsHide: false, }); } catch (e) { console.error(`Failed to run \`nuxi prepare\` in "${options.appProjectRoot}". Please run the command manually.`); } }); tasks.push(() => { (0, log_show_project_command_1.logShowProjectCommand)(options.projectName); }); return (0, devkit_1.runTasksInSerial)(...tasks); } exports.default = applicationGenerator;