UNPKG

nx-serverless-cdk

Version:

nx-serverless-cdk is an Nx plugin for creating AWS CDK applications and libraries inside an Nx monorepo. It offers the possibility to test and debug CDK applications as well as AWS Lambda functions locally. The plugin provides the full flexibility of the

169 lines 6.51 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.cdkLibGenerator = void 0; const devkit_1 = require("@nx/devkit"); const eslint_1 = require("@nx/eslint"); const js_1 = require("@nx/js"); const workspace_1 = require("@nx/workspace"); const node_path_1 = require("node:path"); const normalize_project_options_1 = require("../../utils/normalize-project-options"); const use_inference_plugins_1 = require("../../utils/use-inference-plugins"); const versions_1 = require("../../utils/versions"); const generator_1 = require("../init/generator"); const addJsLibrary = async (tree, options, projectOptions) => { const { projectName, projectRoot, importPath } = projectOptions; const libOptions = { name: projectName, directory: projectRoot, projectNameAndRootFormat: 'as-provided', skipFormat: true, tags: 'cdk-lib', skipTsConfig: false, skipPackageJson: false, includeBabelRc: false, unitTestRunner: 'jest', linter: eslint_1.Linter.EsLint, testEnvironment: 'node', importPath, js: false, pascalCaseFiles: false, strict: false, setParserOptionsProject: false, config: 'project', bundler: 'esbuild', skipTypeCheck: false, minimal: false, rootProject: false, simpleName: false, addPlugin: (0, use_inference_plugins_1.useInferencePlugins)(tree), }; if (options.publishable) { libOptions.publishable = options.publishable; } return await (0, js_1.libraryGenerator)(tree, libOptions); }; const changeProjectConfiguration = (tree, projectOptions) => { const { projectName, projectRoot } = projectOptions; const config = (0, devkit_1.readProjectConfiguration)(tree, projectName); config.sourceRoot = (0, devkit_1.joinPathFragments)(projectRoot, 'cdk'); const configTargets = config.targets; configTargets['build-declarations'] = { executor: '@nx/js:tsc', options: { cache: false, clean: true, main: (0, devkit_1.joinPathFragments)(projectRoot, 'cdk', 'index.ts'), outputPath: (0, devkit_1.joinPathFragments)('dist', projectRoot), tsConfig: (0, devkit_1.joinPathFragments)(projectRoot, 'tsconfig.cdk.dts.json'), }, dependsOn: ['^build-declarations'], }; configTargets['build'] = { executor: '@nx/esbuild:esbuild', outputs: ['{options.outputPath}'], options: { assets: [(0, devkit_1.joinPathFragments)(projectRoot, '*.md')], bundle: true, // handled by build-declarations deleteOutputPath: false, format: ['cjs'], main: (0, devkit_1.joinPathFragments)(projectRoot, 'cdk', 'index.ts'), minify: true, outputPath: (0, devkit_1.joinPathFragments)('dist', projectRoot), platform: 'node', esbuildOptions: { outExtension: { '.js': '.js', }, sourcemap: 'inline', sourcesContent: true, }, target: 'node20', thirdParty: false, tsConfig: (0, devkit_1.joinPathFragments)(projectRoot, 'tsconfig.cdk.json'), }, dependsOn: ['build-declarations'], }; config.targets = Object.keys(configTargets) .sort() .reduce((acc, key) => ({ ...acc, ...{ [key]: configTargets[key] } }), {}); (0, devkit_1.updateProjectConfiguration)(tree, projectName, config); }; const changeSrcDirectory = (tree, projectOptions) => { const { projectRoot, importPath } = projectOptions; tree.delete((0, devkit_1.joinPathFragments)(projectRoot, 'src')); const tsConfigBaseFilePath = 'tsconfig.base.json'; const tsConfigBase = (0, devkit_1.readJson)(tree, tsConfigBaseFilePath); tsConfigBase.compilerOptions.paths[importPath] = [ (0, devkit_1.joinPathFragments)(projectRoot, 'cdk', 'index.ts'), ]; (0, devkit_1.writeJson)(tree, tsConfigBaseFilePath, tsConfigBase); }; const removeTsconfigLibJson = (tree, projectOptions) => { const { projectRoot } = projectOptions; tree.delete((0, devkit_1.joinPathFragments)(projectRoot, 'tsconfig.lib.json')); }; const jestConfigSnippet = `, collectCoverageFrom: [ 'cdk/**/*.ts', '!cdk/index.ts', '!jest.config.ts', ], coverageThreshold: { global: { branches: 80, functions: 80, lines: 80, statements: 80, }, }, coverageReporters: ['lcov', 'text'], resetMocks: true, }; `; const changeJestConfig = (tree, projectOptions) => { const { projectRoot } = projectOptions; const jestConfig = tree.read(`${projectRoot}/jest.config.ts`, 'utf-8'); const lines = jestConfig.split('\n'); lines.pop(); lines.pop(); const extendedJestConfig = lines.join('\n') + jestConfigSnippet; tree.write(`${projectRoot}/jest.config.ts`, extendedJestConfig); }; const addFiles = (tree, projectOptions, versions) => { const { projectName, projectRoot, importPath } = projectOptions; (0, devkit_1.generateFiles)(tree, (0, node_path_1.resolve)(__dirname, 'files'), projectRoot, { projectName, importPath, versions, offset: (0, devkit_1.offsetFromRoot)(projectRoot), rootTsConfigPath: (0, js_1.getRelativePathToRootTsConfig)(tree, projectRoot), tmpl: '', }); }; const cdkLibGenerator = async (tree, options) => { const versions = (0, versions_1.getVersions)(); const projectOptions = (0, normalize_project_options_1.default)(tree, { name: options.name, directory: options.directory, projectType: workspace_1.ProjectType.Library, importPath: options.importPath, }); const tasks = []; tasks.push(await (0, generator_1.default)(tree, { skipFormat: true, })); tasks.push(await addJsLibrary(tree, options, projectOptions)); changeProjectConfiguration(tree, projectOptions); changeSrcDirectory(tree, projectOptions); removeTsconfigLibJson(tree, projectOptions); changeJestConfig(tree, projectOptions); addFiles(tree, projectOptions, versions); if (!options.skipFormat) { await (0, devkit_1.formatFiles)(tree); } return (0, devkit_1.runTasksInSerial)(...tasks); }; exports.cdkLibGenerator = cdkLibGenerator; exports.default = exports.cdkLibGenerator; //# sourceMappingURL=generator.js.map