@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
JavaScript
;
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