UNPKG

durrrrrrrrrjs

Version:

JavaScript Plugin for Nx

225 lines 10.4 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.librarySchematic = exports.addLint = exports.projectGenerator = exports.libraryGenerator = void 0; const tslib_1 = require("tslib"); const devkit_1 = require("@nrwl/devkit"); const jest_1 = require("@nrwl/jest"); const linter_1 = require("@nrwl/linter"); const run_tasks_in_serial_1 = require("@nrwl/workspace/src/utilities/run-tasks-in-serial"); const typescript_1 = require("@nrwl/workspace/src/utilities/typescript"); const path_1 = require("path"); const add_swc_config_1 = require("../../utils/swc/add-swc-config"); const add_swc_dependencies_1 = require("../../utils/swc/add-swc-dependencies"); function libraryGenerator(tree, schema) { return (0, tslib_1.__awaiter)(this, void 0, void 0, function* () { const { libsDir } = (0, devkit_1.getWorkspaceLayout)(tree); return projectGenerator(tree, schema, libsDir, (0, path_1.join)(__dirname, './files')); }); } exports.libraryGenerator = libraryGenerator; function projectGenerator(tree, schema, destinationDir, filesDir) { return (0, tslib_1.__awaiter)(this, void 0, void 0, function* () { const options = normalizeOptions(tree, schema, destinationDir); createFiles(tree, options, `${filesDir}/lib`); addProject(tree, options, destinationDir); if (!schema.skipTsConfig) { updateRootTsConfig(tree, options); } const tasks = []; if (options.linter !== 'none') { const lintCallback = yield addLint(tree, options); tasks.push(lintCallback); } if (options.unitTestRunner === 'jest') { const jestCallback = yield addJest(tree, options); tasks.push(jestCallback); if (options.compiler === 'swc') { replaceJestConfig(tree, options, `${filesDir}/jest-config`); } } if (!options.skipFormat) { yield (0, devkit_1.formatFiles)(tree); } return (0, run_tasks_in_serial_1.runTasksInSerial)(...tasks); }); } exports.projectGenerator = projectGenerator; function addProject(tree, options, destinationDir) { const projectConfiguration = { root: options.projectRoot, sourceRoot: (0, devkit_1.joinPathFragments)(options.projectRoot, 'src'), targets: {}, tags: options.parsedTags, }; if (options.buildable && options.config != 'npm-scripts') { projectConfiguration.targets.build = { executor: `@nrwl/js:${options.compiler}`, outputs: ['{options.outputPath}'], options: { outputPath: `dist/${destinationDir}/${options.projectDirectory}`, main: `${options.projectRoot}/src/index` + (options.js ? '.js' : '.ts'), tsConfig: `${options.projectRoot}/tsconfig.lib.json`, assets: [`${options.projectRoot}/*.md`], }, }; if (options.compiler === 'swc' && options.skipTypeCheck) { projectConfiguration.targets.build.options.skipTypeCheck = true; } } if (options.config === 'workspace') { (0, devkit_1.addProjectConfiguration)(tree, options.name, projectConfiguration, false); } else if (options.config === 'project') { (0, devkit_1.addProjectConfiguration)(tree, options.name, projectConfiguration, true); } else { (0, devkit_1.addProjectConfiguration)(tree, options.name, { root: projectConfiguration.root, tags: projectConfiguration.tags, targets: {}, }, true); } } function addLint(tree, options) { return (0, linter_1.lintProjectGenerator)(tree, { project: options.name, linter: options.linter, skipFormat: true, tsConfigPaths: [ (0, devkit_1.joinPathFragments)(options.projectRoot, 'tsconfig.lib.json'), ], eslintFilePatterns: [ `${options.projectRoot}/**/*.${options.js ? 'js' : 'ts'}`, ], setParserOptionsProject: options.setParserOptionsProject, }); } exports.addLint = addLint; function updateTsConfig(tree, options) { (0, devkit_1.updateJson)(tree, (0, path_1.join)(options.projectRoot, 'tsconfig.json'), (json) => { if (options.strict) { json.compilerOptions = Object.assign(Object.assign({}, json.compilerOptions), { forceConsistentCasingInFileNames: true, strict: true, noImplicitOverride: true, noPropertyAccessFromIndexSignature: true, noImplicitReturns: true, noFallthroughCasesInSwitch: true }); } return json; }); } function createFiles(tree, options, filesDir) { const { className, name, propertyName } = (0, devkit_1.names)(options.name); (0, devkit_1.generateFiles)(tree, filesDir, options.projectRoot, Object.assign(Object.assign({}, options), { dot: '.', className, name, propertyName, js: !!options.js, cliCommand: 'nx', strict: undefined, tmpl: '', offsetFromRoot: (0, devkit_1.offsetFromRoot)(options.projectRoot), rootTsConfigPath: (0, typescript_1.getRelativePathToRootTsConfig)(tree, options.projectRoot), buildable: options.buildable === true, hasUnitTestRunner: options.unitTestRunner !== 'none' })); if (options.buildable && options.compiler === 'swc') { (0, add_swc_dependencies_1.addSwcDependencies)(tree); (0, add_swc_config_1.addSwcConfig)(tree, options.projectRoot); } if (options.unitTestRunner === 'none') { tree.delete((0, path_1.join)(options.projectRoot, 'src/lib', `${options.fileName}.spec.ts`)); tree.delete((0, path_1.join)(options.projectRoot, 'src/app', `${options.fileName}.spec.ts`)); } if (options.js) { (0, devkit_1.toJS)(tree); } const packageJsonPath = (0, path_1.join)(options.projectRoot, 'package.json'); if (options.config === 'npm-scripts') { (0, devkit_1.updateJson)(tree, packageJsonPath, (json) => { json.scripts = { build: "echo 'implement build'", test: "echo 'implement test'", }; return json; }); } else if (!options.buildable) { tree.delete(packageJsonPath); } updateTsConfig(tree, options); } function addJest(tree, options) { return (0, tslib_1.__awaiter)(this, void 0, void 0, function* () { return yield (0, jest_1.jestProjectGenerator)(tree, { project: options.name, setupFile: 'none', supportTsx: false, skipSerializers: true, testEnvironment: options.testEnvironment, skipFormat: true, compiler: options.compiler, }); }); } function replaceJestConfig(tree, options, filesDir) { // remove the generated jest config by Jest generator tree.delete((0, path_1.join)(options.projectRoot, 'jest.config.js')); // replace with JS:SWC specific jest config (0, devkit_1.generateFiles)(tree, filesDir, options.projectRoot, { tmpl: '', project: options.name, offsetFromRoot: (0, devkit_1.offsetFromRoot)(options.projectRoot), projectRoot: options.projectRoot, }); } function normalizeOptions(tree, options, destinationDir) { var _a; if (options.publishable) { if (!options.importPath) { throw new Error(`For publishable libs you have to provide a proper "--importPath" which needs to be a valid npm package name (e.g. my-awesome-lib or @myorg/my-lib)`); } options.buildable = true; } if (options.config === 'npm-scripts') { options.unitTestRunner = 'none'; options.linter = linter_1.Linter.None; options.buildable = false; } (_a = options.compiler) !== null && _a !== void 0 ? _a : (options.compiler = 'tsc'); if (options.compiler === 'swc' && options.skipTypeCheck == null) { options.skipTypeCheck = false; } const name = (0, devkit_1.names)(options.name).fileName; const projectDirectory = options.directory ? `${(0, devkit_1.names)(options.directory).fileName}/${name}` : name; if (!options.unitTestRunner && options.config !== 'npm-scripts') { options.unitTestRunner = 'jest'; } if (!options.linter && options.config !== 'npm-scripts') { options.linter = linter_1.Linter.EsLint; } const projectName = projectDirectory.replace(new RegExp('/', 'g'), '-'); const fileName = getCaseAwareFileName({ fileName: options.simpleModuleName ? name : projectName, pascalCaseFiles: options.pascalCaseFiles, }); const { npmScope } = (0, devkit_1.getWorkspaceLayout)(tree); const projectRoot = (0, devkit_1.joinPathFragments)(destinationDir, projectDirectory); const parsedTags = options.tags ? options.tags.split(',').map((s) => s.trim()) : []; const defaultImportPath = `@${npmScope}/${projectDirectory}`; const importPath = options.importPath || defaultImportPath; return Object.assign(Object.assign({}, options), { fileName, name: projectName, projectRoot, projectDirectory, parsedTags, importPath }); } function getCaseAwareFileName(options) { const normalized = (0, devkit_1.names)(options.fileName); return options.pascalCaseFiles ? normalized.className : normalized.fileName; } function updateRootTsConfig(host, options) { (0, devkit_1.updateJson)(host, (0, typescript_1.getRootTsConfigPathInTree)(host), (json) => { const c = json.compilerOptions; c.paths = c.paths || {}; delete c.paths[options.name]; if (c.paths[options.importPath]) { throw new Error(`You already have a library using the import path "${options.importPath}". Make sure to specify a unique one.`); } c.paths[options.importPath] = [ (0, devkit_1.joinPathFragments)(options.projectRoot, './src', 'index.' + (options.js ? 'js' : 'ts')), ]; return json; }); } exports.default = libraryGenerator; exports.librarySchematic = (0, devkit_1.convertNxGenerator)(libraryGenerator); //# sourceMappingURL=library.js.map