nx/packages/next/src/generators/application/lib/normalize-options.ts

125 lines
3.5 KiB
TypeScript

import { joinPathFragments, names, readNxJson, Tree } from '@nx/devkit';
import { determineProjectNameAndRootOptions } from '@nx/devkit/src/generators/project-name-and-root-utils';
import { Linter } from '@nx/eslint';
import { assertValidStyle } from '@nx/react/src/utils/assertion';
import { Schema } from '../schema';
import { NextPluginOptions } from '../../../plugins/plugin';
export interface NormalizedSchema extends Schema {
projectName: string;
appProjectRoot: string;
outputPath: string;
e2eProjectName: string;
e2eProjectRoot: string;
e2eWebServerAddress: string;
e2eWebServerTarget: string;
e2ePort: number;
parsedTags: string[];
fileName: string;
styledModule: null | string;
js?: boolean;
}
export async function normalizeOptions(
host: Tree,
options: Schema
): Promise<NormalizedSchema> {
const {
projectName: appProjectName,
projectRoot: appProjectRoot,
projectNameAndRootFormat,
} = await determineProjectNameAndRootOptions(host, {
name: options.name,
projectType: 'application',
directory: options.directory,
projectNameAndRootFormat: options.projectNameAndRootFormat,
rootProject: options.rootProject,
callingGenerator: '@nx/next:application',
});
options.rootProject = appProjectRoot === '.';
options.projectNameAndRootFormat = projectNameAndRootFormat;
const nxJson = readNxJson(host);
const addPlugin =
process.env.NX_ADD_PLUGINS !== 'false' &&
nxJson.useInferencePlugins !== false;
options.addPlugin ??= addPlugin;
let e2eWebServerTarget = options.addPlugin ? 'start' : 'serve';
if (options.addPlugin) {
if (nxJson.plugins) {
for (const plugin of nxJson.plugins) {
if (
typeof plugin === 'object' &&
plugin.plugin === '@nx/next/plugin' &&
(plugin.options as NextPluginOptions).startTargetName
) {
e2eWebServerTarget = (plugin.options as NextPluginOptions)
.startTargetName;
}
}
}
}
let e2ePort = options.addPlugin ? 3000 : 4200;
if (
nxJson.targetDefaults?.[e2eWebServerTarget] &&
(nxJson.targetDefaults?.[e2eWebServerTarget].options?.port ||
nxJson.targetDefaults?.[e2eWebServerTarget].options?.env?.PORT)
) {
e2ePort =
nxJson.targetDefaults?.[e2eWebServerTarget].options?.port ||
nxJson.targetDefaults?.[e2eWebServerTarget].options?.env?.PORT;
}
const e2eProjectName = options.rootProject ? 'e2e' : `${appProjectName}-e2e`;
const e2eProjectRoot = options.rootProject ? 'e2e' : `${appProjectRoot}-e2e`;
const e2eWebServerAddress = `http://localhost:${e2ePort}`;
const name = names(options.name).fileName;
const outputPath = joinPathFragments(
'dist',
appProjectRoot,
...(options.rootProject ? [name] : [])
);
const parsedTags = options.tags
? options.tags.split(',').map((s) => s.trim())
: [];
const fileName = 'index';
const appDir = options.appDir ?? true;
const src = options.src ?? true;
const styledModule = /^(css|scss|less|tailwind)$/.test(options.style)
? null
: options.style;
assertValidStyle(options.style);
return {
...options,
appDir,
src,
appProjectRoot,
e2eProjectName,
e2eProjectRoot,
e2eWebServerAddress,
e2eWebServerTarget,
e2ePort,
e2eTestRunner: options.e2eTestRunner || 'cypress',
fileName,
linter: options.linter || Linter.EsLint,
name,
outputPath,
parsedTags,
projectName: appProjectName,
style: options.style || 'css',
styledModule,
unitTestRunner: options.unitTestRunner || 'jest',
};
}