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

179 lines 7.03 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.e2eProjectGenerator = void 0; const devkit_1 = require("@nx/devkit"); const eslint_1 = require("@nx/eslint"); const jest_1 = require("@nx/jest"); 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 app_type_1 = require("../cdk-app/app-type"); const generator_1 = require("../init/generator"); const to_valid_ssm_parameter_name_1 = require("./to-valid-ssm-parameter-name"); const addCommonDependencies = (tree, versions) => { return (0, devkit_1.addDependenciesToPackageJson)(tree, { // E2E common '@aws-sdk/credential-providers': versions['@aws-sdk/credential-providers'], '@aws-sdk/client-ssm': versions['@aws-sdk/client-ssm'], }, {}); }; const addGenericDependencies = (tree, versions) => { return (0, devkit_1.addDependenciesToPackageJson)(tree, { // E2E generic dependencies '@aws-sdk/client-sqs': versions['@aws-sdk/client-sqs'], }, {}); }; const addLambdaDependencies = (tree, versions) => { return (0, devkit_1.addDependenciesToPackageJson)(tree, { // E2E lambda dependencies '@aws-sdk/client-lambda': versions['@aws-sdk/client-lambda'], }, {}); }; const addConfiguration = (tree, options, projectOptions) => { const { projectName, projectRoot } = projectOptions; const projectConfiguration = { root: projectRoot, sourceRoot: (0, devkit_1.joinPathFragments)(projectRoot, 'src'), implicitDependencies: [options.project], projectType: 'application', targets: { e2e: { executor: '@nx/jest:jest', outputs: [`{workspaceRoot}/coverage/{projectRoot}`], cache: false, options: { jestConfig: `${projectRoot}/jest.config.ts`, passWithNoTests: true, }, }, }, }; if (options.type === app_type_1.AppType.lambda) { projectConfiguration.targets['generate-event'] = { executor: 'nx-serverless-cdk:generate-event', options: {}, }; } (0, devkit_1.addProjectConfiguration)(tree, projectName, projectConfiguration); }; const addEslint = async (tree, projectOptions, useInferencePlugins) => { const { projectName, projectRoot } = projectOptions; return await (0, eslint_1.lintProjectGenerator)(tree, { project: projectName, linter: eslint_1.Linter.EsLint, eslintFilePatterns: [`${projectRoot}/**/*.ts`], tsConfigPaths: [(0, devkit_1.joinPathFragments)(projectRoot, 'tsconfig.spec.json')], skipFormat: true, setParserOptionsProject: false, skipPackageJson: false, unitTestRunner: 'jest', rootProject: false, addPlugin: useInferencePlugins, }); }; const jestConfigSnippet = `, collectCoverageFrom: [ 'src/**/*.ts', '!jest.config.ts', ], coverageThreshold: { global: { branches: 80, functions: 80, lines: 80, statements: 80, }, }, coverageReporters: ['lcov', 'text'], resetMocks: true, testTimeout: 10000, }; `; const addJest = async (tree, projectOptions, useInferencePlugins) => { const { projectName, projectRoot } = projectOptions; (0, devkit_1.writeJson)(tree, (0, devkit_1.joinPathFragments)(projectOptions.projectRoot, 'tsconfig.json'), {}); const callback = await (0, jest_1.configurationGenerator)(tree, { project: projectName, supportTsx: false, setupFile: 'none', skipSerializers: true, testEnvironment: 'node', skipFormat: true, compiler: 'tsc', skipPackageJson: false, js: false, addPlugin: useInferencePlugins, }); 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 config = (0, devkit_1.readProjectConfiguration)(tree, projectName); delete config.targets?.['test']; (0, devkit_1.updateProjectConfiguration)(tree, projectName, config); return callback; }; const addFiles = (tree, options, projectOptions) => { const { projectRoot } = projectOptions; (0, devkit_1.generateFiles)(tree, (0, node_path_1.resolve)(__dirname, 'files'), projectRoot, { offset: (0, devkit_1.offsetFromRoot)(projectRoot), rootTsConfigPath: (0, js_1.getRelativePathToRootTsConfig)(tree, projectRoot), tmpl: '', }); if (options.type === app_type_1.AppType.generic) { (0, devkit_1.generateFiles)(tree, (0, node_path_1.resolve)(__dirname, 'files-generic'), projectRoot, { project: options.project, toValidSsmParameterName: to_valid_ssm_parameter_name_1.toValidSsmParameterName, tmpl: '', }); } else { (0, devkit_1.generateFiles)(tree, (0, node_path_1.resolve)(__dirname, 'files-lambda'), projectRoot, { project: options.project, toValidSsmParameterName: to_valid_ssm_parameter_name_1.toValidSsmParameterName, tmpl: '', }); } }; const e2eProjectGenerator = 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.Application, }); const inferencePlugins = (0, use_inference_plugins_1.useInferencePlugins)(tree); const tasks = []; tasks.push(await (0, js_1.initGenerator)(tree, { js: false, skipFormat: true, skipPackageJson: false, tsConfigName: 'tsconfig.base.json', })); tasks.push(await (0, generator_1.default)(tree, { skipFormat: true, })); tasks.push(addCommonDependencies(tree, versions)); if (options.type === app_type_1.AppType.generic) { tasks.push(addGenericDependencies(tree, versions)); } else { tasks.push(addLambdaDependencies(tree, versions)); } addConfiguration(tree, options, projectOptions); tasks.push(await addEslint(tree, projectOptions, inferencePlugins)); tasks.push(await addJest(tree, projectOptions, inferencePlugins)); addFiles(tree, options, projectOptions); if (!options.skipFormat) { await (0, devkit_1.formatFiles)(tree); } return (0, devkit_1.runTasksInSerial)(...tasks); }; exports.e2eProjectGenerator = e2eProjectGenerator; exports.default = exports.e2eProjectGenerator; //# sourceMappingURL=generator.js.map