UNPKG

@nx-dotnet/core

Version:

- Have an existing nx workspace. For creating this, see [nrwl's documentation](https://nx.dev/latest/angular/getting-started/nx-setup). - .NET SDK is installed, and `dotnet` is available on the path. For help on this, see [Microsoft's documentation](https

150 lines 6.38 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = generateSwaggerSetup; const devkit_1 = require("@nx/devkit"); const swagger_executor_configuration_1 = require("../../models/swagger-executor-configuration"); const semver_1 = require("semver"); const project_configuration_1 = require("../utils/project-configuration"); const path = require("node:path"); async function normalizeOptions(host, options) { if (!options.output && !options.swaggerProject) { throw new Error('Either specify --output or --swagger-project'); } const output = //eslint-disable-next-line @typescript-eslint/no-non-null-assertion options.output ?? swaggerProjectRoot(host, options.swaggerProject); return { ...options, output, }; } async function generateSwaggerSetup(host, options) { const tasks = []; const normalizedOptions = await normalizeOptions(host, options); const { name: project } = await (0, project_configuration_1.updateProjectConfiguration)(host, normalizedOptions.project, normalizedOptions.projectRoot, (projectJson) => ({ ...projectJson, targets: { ...projectJson?.targets, [normalizedOptions.target ?? 'swagger']: (0, swagger_executor_configuration_1.getSwaggerExecutorConfiguration)(normalizedOptions.output), }, })); if (normalizedOptions.swaggerProject) { const shellTasks = await generateShellProject(host, { ...options, swaggerProject: normalizedOptions.swaggerProject, project, codegenProject: normalizedOptions.codegenProject, output: normalizedOptions.output, }); tasks.push(...shellTasks); } else { throw new Error('Either specify --output or --swagger-project'); } return async () => { for (const task of tasks) { await task(); } }; } function swaggerProjectRoot(host, swaggerProject) { return (0, devkit_1.joinPathFragments)((0, devkit_1.getWorkspaceLayout)(host).libsDir, 'generated', swaggerProject); } async function generateShellProject(host, options) { const root = swaggerProjectRoot(host, options.swaggerProject); const targets = {}; const tasks = []; const project = { root, targets, implicitDependencies: [options.project], }; if (options.codegenProject) { // If typescript lib is buildable, // then this lib must be too. It seems // a little silly, but we **need** this target. targets.build = { executor: 'nx:noop', outputs: [root], }; const { tasks: codegenTasks, name: codegenProjectName } = await generateCodegenProject(host, options); tasks.push(...codegenTasks); if (options.useOpenApiGenerator) { tasks.push((0, devkit_1.addDependenciesToPackageJson)(host, {}, { '@openapitools/openapi-generator-cli': '^2.13.4' })); } project.targets ?? (project.targets = {}); project.targets.codegen = { executor: '@nx-dotnet/core:openapi-codegen', options: options.useOpenApiGenerator ? { useOpenApiGenerator: true, openApiGenerator: 'typescript', openapiJsonPath: options.output, outputProject: codegenProjectName, } : { openapiJsonPath: options.output, outputProject: codegenProjectName, }, dependsOn: ['swagger'], inputs: [(0, devkit_1.joinPathFragments)('{projectRoot}', options.output)], outputs: [(0, devkit_1.joinPathFragments)('{workspaceRoot}')], }; } (0, devkit_1.addProjectConfiguration)(host, options.swaggerProject, project); return tasks; } async function generateCodegenProject(host, options) { const tasks = []; const nameWithDirectory = `generated-${options.codegenProject}`; const nxJson = (0, devkit_1.readNxJson)(host); const { libraryGenerator, } = require('@nx/js'); const libraryGeneratorDefaults = { ...nxJson?.generators?.['@nx/js:library'], ...nxJson?.generators?.['@nx/js']?.library, }; tasks.push(await libraryGenerator(host, { // eslint-disable-next-line @typescript-eslint/no-non-null-assertion ...libraryGeneratorDefaults, name: nameWithDirectory, directory: path.join('libs', 'generated', options.codegenProject), unitTestRunner: 'none', })); await (0, project_configuration_1.updateProjectConfiguration)(host, nameWithDirectory, 'unknown', (projectJson) => ({ ...projectJson, targets: { ...projectJson?.targets, build: { executor: 'nx:noop', outputs: [(0, devkit_1.joinPathFragments)('{projectRoot}')], }, }, implicitDependencies: [options.swaggerProject ?? options.project], })); updateNxJsonForCodegenTargets(host, options); return { name: nameWithDirectory, tasks }; } function updateNxJsonForCodegenTargets(host, options) { var _a, _b, _c, _d, _e, _f, _g; const wc = (0, devkit_1.readNxJson)(host); if (!wc) { return; } const cacheableOperations = wc.tasksRunnerOptions?.default?.options?.cacheableOperations; if (cacheableOperations) { cacheableOperations.push('codegen', options.target ?? 'swagger'); } const newBuildDeps = ['codegen', '^codegen']; wc.targetDefaults ?? (wc.targetDefaults = {}); (_a = wc.targetDefaults)['build'] ?? (_a['build'] = {}); (_b = wc.targetDefaults['build']).dependsOn ?? (_b.dependsOn = ['^build']); wc.targetDefaults['build'].dependsOn = Array.from(new Set(wc.targetDefaults['build'].dependsOn.concat(newBuildDeps))); if ((0, semver_1.major)(devkit_1.NX_VERSION) >= 17) { (_c = wc.targetDefaults)['codegen'] ?? (_c['codegen'] = {}); (_d = wc.targetDefaults['codegen']).cache ?? (_d.cache = true); (_e = wc.targetDefaults)[_f = options.target ?? 'swagger'] ?? (_e[_f] = {}); (_g = wc.targetDefaults[options.target ?? 'swagger']).cache ?? (_g.cache = true); } (0, devkit_1.updateNxJson)(host, wc); } //# sourceMappingURL=add-swagger-target.js.map