129 lines
3.6 KiB
TypeScript
129 lines
3.6 KiB
TypeScript
import {
|
|
extractLayoutDirectory,
|
|
getWorkspaceLayout,
|
|
getWorkspacePath,
|
|
joinPathFragments,
|
|
names,
|
|
readJson,
|
|
Tree,
|
|
} from '@nrwl/devkit';
|
|
import { getImportPath } from 'nx/src/utils/path';
|
|
import { Schema } from '../schema';
|
|
import { NormalizedSchema } from './normalized-schema';
|
|
import { Linter } from '@nrwl/linter';
|
|
import { UnitTestRunner } from '../../../utils/test-runners';
|
|
import { normalizePrefix } from '../../utils/project';
|
|
|
|
export function normalizeOptions(host: Tree, schema: Schema): NormalizedSchema {
|
|
// Create a schema with populated default values
|
|
const options: Schema = {
|
|
buildable: false,
|
|
linter: Linter.EsLint,
|
|
publishable: false,
|
|
simpleName: false,
|
|
skipFormat: false,
|
|
unitTestRunner: UnitTestRunner.Jest,
|
|
// Publishable libs cannot use `full` yet, so if its false then use the passed value or default to `full`
|
|
compilationMode: schema.publishable
|
|
? 'partial'
|
|
: schema.compilationMode ?? 'full',
|
|
skipModule: schema.skipModule || schema.standalone,
|
|
...schema,
|
|
};
|
|
|
|
const name = names(options.name).fileName;
|
|
const { layoutDirectory, projectDirectory } = extractLayoutDirectory(
|
|
options.directory
|
|
);
|
|
const fullProjectDirectory = projectDirectory
|
|
? `${names(projectDirectory).fileName}/${name}`.replace(/\/+/g, '/')
|
|
: name;
|
|
|
|
const {
|
|
libsDir: defaultLibsDirectory,
|
|
npmScope,
|
|
standaloneAsDefault,
|
|
} = getWorkspaceLayout(host);
|
|
const libsDir = layoutDirectory ?? defaultLibsDirectory;
|
|
|
|
const projectName = fullProjectDirectory
|
|
.replace(new RegExp('/', 'g'), '-')
|
|
.replace(/-\d+/g, '');
|
|
const fileName =
|
|
options.simpleName || options.simpleModuleName ? name : projectName;
|
|
const projectRoot = joinPathFragments(libsDir, fullProjectDirectory);
|
|
|
|
const moduleName = `${names(fileName).className}Module`;
|
|
const parsedTags = options.tags
|
|
? options.tags.split(',').map((s) => s.trim())
|
|
: [];
|
|
const modulePath = `${projectRoot}/src/lib/${fileName}.module.ts`;
|
|
const prefix = normalizePrefix(options.prefix, npmScope);
|
|
|
|
options.standaloneConfig = options.standaloneConfig ?? standaloneAsDefault;
|
|
|
|
const importPath =
|
|
options.importPath || getImportPath(npmScope, fullProjectDirectory);
|
|
|
|
// Determine the roots where @schematics/angular will place the projects
|
|
// This might not be where the projects actually end up
|
|
const workspaceJsonPath = getWorkspacePath(host);
|
|
let newProjectRoot = null;
|
|
if (workspaceJsonPath) {
|
|
({ newProjectRoot } = readJson(host, workspaceJsonPath));
|
|
}
|
|
const ngCliSchematicLibRoot = newProjectRoot
|
|
? `${newProjectRoot}/${projectName}`
|
|
: projectName;
|
|
|
|
const allNormalizedOptions = {
|
|
...options,
|
|
linter: options.linter ?? Linter.EsLint,
|
|
unitTestRunner: options.unitTestRunner ?? UnitTestRunner.Jest,
|
|
prefix,
|
|
name: projectName,
|
|
projectRoot,
|
|
entryFile: 'index',
|
|
moduleName,
|
|
projectDirectory: fullProjectDirectory,
|
|
modulePath,
|
|
parsedTags,
|
|
fileName,
|
|
importPath,
|
|
ngCliSchematicLibRoot,
|
|
standaloneComponentName: `${names(name).className}Component`,
|
|
};
|
|
|
|
const {
|
|
displayBlock,
|
|
inlineStyle,
|
|
inlineTemplate,
|
|
viewEncapsulation,
|
|
changeDetection,
|
|
style,
|
|
skipTests,
|
|
selector,
|
|
skipSelector,
|
|
flat,
|
|
...libraryOptions
|
|
} = allNormalizedOptions;
|
|
|
|
return {
|
|
libraryOptions,
|
|
componentOptions: {
|
|
name: fileName,
|
|
standalone: libraryOptions.standalone,
|
|
displayBlock,
|
|
inlineStyle,
|
|
inlineTemplate,
|
|
viewEncapsulation,
|
|
changeDetection,
|
|
style,
|
|
skipTests,
|
|
selector,
|
|
skipSelector,
|
|
flat,
|
|
},
|
|
};
|
|
}
|