102 lines
2.8 KiB
TypeScript
102 lines
2.8 KiB
TypeScript
import {
|
|
extractLayoutDirectory,
|
|
getProjects,
|
|
getWorkspaceLayout,
|
|
joinPathFragments,
|
|
logger,
|
|
names,
|
|
normalizePath,
|
|
Tree,
|
|
} from '@nx/devkit';
|
|
import { getImportPath } from '@nx/js/src/utils/get-import-path';
|
|
|
|
import { assertValidStyle } from '../../../utils/assertion';
|
|
import { NormalizedSchema, Schema } from '../schema';
|
|
|
|
export function normalizeOptions(
|
|
host: Tree,
|
|
options: Schema
|
|
): NormalizedSchema {
|
|
const name = names(options.name).fileName;
|
|
const { projectDirectory, layoutDirectory } = extractLayoutDirectory(
|
|
options.directory
|
|
);
|
|
const fullProjectDirectory = projectDirectory
|
|
? `${names(projectDirectory).fileName}/${name}`
|
|
: name;
|
|
|
|
const projectName = fullProjectDirectory.replace(new RegExp('/', 'g'), '-');
|
|
const fileName = options.simpleName ? name : projectName;
|
|
const { libsDir: defaultLibsDir } = getWorkspaceLayout(host);
|
|
const libsDir = layoutDirectory ?? defaultLibsDir;
|
|
const projectRoot = joinPathFragments(libsDir, fullProjectDirectory);
|
|
|
|
const parsedTags = options.tags
|
|
? options.tags.split(',').map((s) => s.trim())
|
|
: [];
|
|
|
|
const importPath =
|
|
options.importPath || getImportPath(host, fullProjectDirectory);
|
|
|
|
let bundler = options.bundler ?? 'none';
|
|
|
|
if (bundler === 'none') {
|
|
if (options.publishable) {
|
|
logger.warn(
|
|
`Publishable libraries cannot be used with bundler: 'none'. Defaulting to 'rollup'.`
|
|
);
|
|
bundler = 'rollup';
|
|
}
|
|
if (options.buildable) {
|
|
logger.warn(
|
|
`Buildable libraries cannot be used with bundler: 'none'. Defaulting to 'rollup'.`
|
|
);
|
|
bundler = 'rollup';
|
|
}
|
|
}
|
|
|
|
const normalized = {
|
|
...options,
|
|
compiler: options.compiler ?? 'babel',
|
|
bundler,
|
|
fileName,
|
|
routePath: `/${name}`,
|
|
name: projectName,
|
|
projectRoot,
|
|
projectDirectory: fullProjectDirectory,
|
|
parsedTags,
|
|
importPath,
|
|
libsDir,
|
|
} as NormalizedSchema;
|
|
|
|
// Libraries with a bundler or is publishable must also be buildable.
|
|
normalized.buildable = Boolean(
|
|
normalized.bundler !== 'none' || options.buildable || options.publishable
|
|
);
|
|
|
|
normalized.inSourceTests === normalized.minimal || normalized.inSourceTests;
|
|
|
|
if (options.appProject) {
|
|
const appProjectConfig = getProjects(host).get(options.appProject);
|
|
|
|
if (appProjectConfig.projectType !== 'application') {
|
|
throw new Error(
|
|
`appProject expected type of "application" but got "${appProjectConfig.projectType}"`
|
|
);
|
|
}
|
|
|
|
try {
|
|
normalized.appMain = appProjectConfig.targets.build.options.main;
|
|
normalized.appSourceRoot = normalizePath(appProjectConfig.sourceRoot);
|
|
} catch (e) {
|
|
throw new Error(
|
|
`Could not locate project main for ${options.appProject}`
|
|
);
|
|
}
|
|
}
|
|
|
|
assertValidStyle(normalized.style);
|
|
|
|
return normalized;
|
|
}
|