@nx/nuxt
Version:
170 lines (169 loc) • 7.65 kB
JavaScript
"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;