Skip to content

Commit 13c0a2c

Browse files
committed
fix(core): app generation should work in encapuslated Nx workspaces
1 parent d4fca4d commit 13c0a2c

File tree

8 files changed

+116
-81
lines changed

8 files changed

+116
-81
lines changed

e2e/utils/index.ts

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,8 @@
11
import { tmpProjPath } from '@nrwl/nx-plugin/testing';
22
import { ChildProcess, exec, execSync } from 'child_process';
33
import {
4-
copySync,
54
createFileSync,
65
ensureDirSync,
7-
moveSync,
86
readdirSync,
97
readFileSync,
108
removeSync,
@@ -13,10 +11,8 @@ import {
1311
writeFileSync,
1412
} from 'fs-extra';
1513
import * as path from 'path';
16-
import { dirSync } from 'tmp';
1714

1815
import * as isCI from 'is-ci';
19-
import { workspaceConfigName } from 'nx/src/config/workspaces';
2016
import { detectPackageManager } from '@nrwl/devkit';
2117
interface RunCmdOpts {
2218
silenceError?: boolean;

nx.json

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,15 @@
4141
"dependsOn": ["^build", "prebuild", "^prebuild", "^codegen", "codegen"],
4242
"inputs": ["production", "^production"]
4343
},
44+
"@nx-dotnet/core:build": {
45+
"dependsOn": ["^build", "prebuild", "^prebuild", "^codegen", "codegen"],
46+
"inputs": [
47+
"production",
48+
"^production",
49+
"{workspaceRoot}/Directory.Build.props",
50+
"{workspaceRoot}/Directory.Build.targets"
51+
]
52+
},
4453
"codegen": {
4554
"dependsOn": ["^swagger", "swagger"]
4655
},
@@ -63,9 +72,7 @@
6372
"{workspaceRoot}/tsconfig.base.json",
6473
"{workspaceRoot}/tslint.json",
6574
"{workspaceRoot}/nx.json",
66-
"{workspaceRoot}/babel.config.json",
67-
"{workspaceRoot}/Directory.Build.props",
68-
"{workspaceRoot}/Directory.Build.targets"
75+
"{workspaceRoot}/babel.config.json"
6976
],
7077
"production": [
7178
"default",

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@
5252
"@nrwl/js": "15.8.0-beta.2",
5353
"@nrwl/linter": "15.8.0-beta.2",
5454
"@nrwl/node": "15.8.0-beta.2",
55-
"@nrwl/nx-cloud": "15.1.0",
55+
"@nrwl/nx-cloud": "15.1.1",
5656
"@nrwl/nx-plugin": "15.8.0-beta.2",
5757
"@nrwl/react": "15.8.0-beta.2",
5858
"@nrwl/web": "15.8.0-beta.2",

packages/core/src/generators/add-swagger-target/add-swagger-target.ts

Lines changed: 87 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import {
1212
updateNxJson,
1313
addDependenciesToPackageJson,
1414
} from '@nrwl/devkit';
15-
import { libraryGenerator } from '@nrwl/js/src/generators/library/library';
15+
import type JsLibraryGenerator = require('@nrwl/js/src/generators/library/library');
1616

1717
import type NxPluginOpenAPILibGenerator = require('@trumbitta/nx-plugin-openapi/src/generators/api-lib/generator');
1818
import type NxPluginOpenAPIInitGenerator = require('@trumbitta/nx-plugin-openapi/src/generators/init/generator');
@@ -121,76 +121,99 @@ async function generateCodegenProject(
121121
const tasks: GeneratorCallback[] = [];
122122
const nameWithDirectory = `generated-${options.codegenProject}`;
123123
if (options.useNxPluginOpenAPI) {
124-
ensurePackage(host, '@trumbitta/nx-plugin-openapi', '^1.12.1');
125-
tasks.push(
126-
addDependenciesToPackageJson(
127-
host,
128-
{},
129-
{ '@trumbitta/nx-plugin-openapi': '^1.12.1' },
130-
),
131-
);
132-
const {
133-
default: nxPluginOpenAPIGenerator,
134-
}: // eslint-disable-next-line @typescript-eslint/no-var-requires
135-
typeof NxPluginOpenAPILibGenerator = require('@trumbitta/nx-plugin-openapi/src/generators/api-lib/generator');
136-
const {
137-
default: nxPluginOpenAPIInitGenerator,
138-
}: // eslint-disable-next-line @typescript-eslint/no-var-requires
139-
typeof NxPluginOpenAPIInitGenerator = require('@trumbitta/nx-plugin-openapi/src/generators/init/generator');
140-
141-
tasks.push(await nxPluginOpenAPIInitGenerator(host));
142-
143-
tasks.push(
144-
await nxPluginOpenAPIGenerator(host, {
145-
isRemoteSpec: false,
146-
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
147-
name: options.codegenProject!,
148-
directory: 'generated',
149-
generator: 'typescript-fetch',
150-
sourceSpecLib: options.swaggerProject,
151-
}),
152-
);
153-
154-
const configuration = readProjectConfiguration(host, nameWithDirectory);
155-
configuration.targets ??= {};
156-
const targetConfiguration = configuration.targets?.['generate-sources'];
157-
targetConfiguration.options['sourceSpecPathOrUrl'] = joinPathFragments(
158-
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
159-
readProjectConfiguration(host, options.swaggerProject!).root,
160-
'swagger.json',
161-
);
162-
targetConfiguration.dependsOn = ['^swagger'];
163-
configuration.targets['codegen'] = targetConfiguration;
164-
delete configuration.targets['generate-sources'];
165-
updateProjectConfiguration(host, nameWithDirectory, configuration);
124+
await setupOpenAPICodegen(host, tasks, options, nameWithDirectory);
166125
} else {
167-
tasks.push(
168-
await libraryGenerator(host, {
169-
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
170-
name: options.codegenProject!,
171-
directory: 'generated',
172-
buildable: true,
173-
}),
174-
);
175-
const codegenProjectConfiguration = readProjectConfiguration(
176-
host,
177-
nameWithDirectory,
178-
);
179-
codegenProjectConfiguration.implicitDependencies ??= [];
180-
codegenProjectConfiguration.implicitDependencies.push(
181-
options.swaggerProject ? options.swaggerProject : options.project,
182-
);
183-
updateProjectConfiguration(
184-
host,
185-
nameWithDirectory,
186-
codegenProjectConfiguration,
187-
);
126+
await setupNxNETCodegen(tasks, host, options, nameWithDirectory);
188127
}
189128

190129
updateNxJsonForCodegenTargets(host, options);
191130

192131
return tasks;
193132
}
133+
134+
async function setupOpenAPICodegen(
135+
host: Tree,
136+
tasks: GeneratorCallback[],
137+
options: AddSwaggerJsonExecutorSchema,
138+
nameWithDirectory: string,
139+
) {
140+
ensurePackage(host, '@trumbitta/nx-plugin-openapi', '^1.12.1');
141+
tasks.push(
142+
addDependenciesToPackageJson(
143+
host,
144+
{},
145+
{ '@trumbitta/nx-plugin-openapi': '^1.12.1' },
146+
),
147+
);
148+
const {
149+
default: nxPluginOpenAPIGenerator,
150+
}: // eslint-disable-next-line @typescript-eslint/no-var-requires
151+
typeof NxPluginOpenAPILibGenerator = require('@trumbitta/nx-plugin-openapi/src/generators/api-lib/generator');
152+
const {
153+
default: nxPluginOpenAPIInitGenerator,
154+
}: // eslint-disable-next-line @typescript-eslint/no-var-requires
155+
typeof NxPluginOpenAPIInitGenerator = require('@trumbitta/nx-plugin-openapi/src/generators/init/generator');
156+
157+
tasks.push(await nxPluginOpenAPIInitGenerator(host));
158+
159+
tasks.push(
160+
await nxPluginOpenAPIGenerator(host, {
161+
isRemoteSpec: false,
162+
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
163+
name: options.codegenProject!,
164+
directory: 'generated',
165+
generator: 'typescript-fetch',
166+
sourceSpecLib: options.swaggerProject,
167+
}),
168+
);
169+
170+
const configuration = readProjectConfiguration(host, nameWithDirectory);
171+
configuration.targets ??= {};
172+
const targetConfiguration = configuration.targets?.['generate-sources'];
173+
targetConfiguration.options['sourceSpecPathOrUrl'] = joinPathFragments(
174+
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
175+
readProjectConfiguration(host, options.swaggerProject!).root,
176+
'swagger.json',
177+
);
178+
targetConfiguration.dependsOn = ['^swagger'];
179+
configuration.targets['codegen'] = targetConfiguration;
180+
delete configuration.targets['generate-sources'];
181+
updateProjectConfiguration(host, nameWithDirectory, configuration);
182+
}
183+
184+
async function setupNxNETCodegen(
185+
tasks: GeneratorCallback[],
186+
host: Tree,
187+
options: AddSwaggerJsonExecutorSchema,
188+
nameWithDirectory: string,
189+
) {
190+
const {
191+
libraryGenerator,
192+
}: // eslint-disable-next-line @typescript-eslint/no-var-requires
193+
typeof JsLibraryGenerator = require('@nrwl/js/src/generators/library/library');
194+
tasks.push(
195+
await libraryGenerator(host, {
196+
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
197+
name: options.codegenProject!,
198+
directory: 'generated',
199+
buildable: true,
200+
}),
201+
);
202+
const codegenProjectConfiguration = readProjectConfiguration(
203+
host,
204+
nameWithDirectory,
205+
);
206+
codegenProjectConfiguration.implicitDependencies ??= [];
207+
codegenProjectConfiguration.implicitDependencies.push(
208+
options.swaggerProject ? options.swaggerProject : options.project,
209+
);
210+
updateProjectConfiguration(
211+
host,
212+
nameWithDirectory,
213+
codegenProjectConfiguration,
214+
);
215+
}
216+
194217
function updateNxJsonForCodegenTargets(
195218
host: Tree,
196219
options: AddSwaggerJsonExecutorSchema,

packages/core/src/generators/nuget-reference/generator.spec.ts

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import { createTreeWithEmptyWorkspace } from '@nrwl/devkit/testing';
44
import { Answers, prompt } from 'inquirer';
55

66
import { DotNetClient, mockDotnetFactory } from '@nx-dotnet/dotnet';
7-
import { updateConfig } from '@nx-dotnet/utils';
7+
import { updateConfig, getProjectFileForNxProject } from '@nx-dotnet/utils';
88

99
import generator from './generator';
1010
import { NugetReferenceGeneratorSchema } from './schema';
@@ -54,8 +54,6 @@ describe('nuget-reference generator', () => {
5454
});
5555

5656
it('provides resolved version to dotnet add package reference', async () => {
57-
const { getProjectFileForNxProject } = await import('@nx-dotnet/utils');
58-
5957
const projectFilePath = 'libs/test/Test.csproj';
6058

6159
(getProjectFileForNxProject as jest.MockedFunction<() => Promise<string>>)

packages/core/src/generators/utils/generate-project.ts

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -224,7 +224,8 @@ export async function GenerateProject(
224224

225225
if (
226226
normalizedOptions.projectTemplate === 'webapi' &&
227-
!normalizedOptions.skipSwaggerLib
227+
!normalizedOptions.skipSwaggerLib &&
228+
packageIsInstalled('@nrwl/js')
228229
) {
229230
tasks.push(
230231
await generateSwaggerSetup(host, {
@@ -275,3 +276,12 @@ export function addPrebuildMsbuildTask(
275276

276277
xml.children.push(fragment);
277278
}
279+
280+
function packageIsInstalled(pkg: string) {
281+
try {
282+
require.resolve(pkg);
283+
return true;
284+
} catch {
285+
return false;
286+
}
287+
}

packages/core/src/graph/infer-project.spec.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import type { NxDotnetConfig } from '@nx-dotnet/utils';
2+
import type configUtils = require('@nx-dotnet/utils/src/lib/utility-functions/config');
23

34
import * as fs from 'fs';
45

@@ -11,7 +12,7 @@ jest.mock(
1112
() =>
1213
({
1314
readConfig: () => configValues,
14-
} as typeof import('@nx-dotnet/utils/src/lib/utility-functions/config')),
15+
} as typeof configUtils),
1516
);
1617

1718
import { registerProjectTargets } from './infer-project';

yarn.lock

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4472,10 +4472,10 @@
44724472
"@nrwl/workspace" "15.8.0-beta.2"
44734473
tslib "^2.3.0"
44744474

4475-
"@nrwl/nx-cloud@15.1.0":
4476-
version "15.1.0"
4477-
resolved "https://registry.yarnpkg.com/@nrwl/nx-cloud/-/nx-cloud-15.1.0.tgz#455404f6006a2fb2247ecb4b4c0e30665704eecd"
4478-
integrity sha512-QcMlPZ+DBzTWcoWSziyrENYhBLfE5MSns3M5qJB8EClg9/vomepA+NLOLWB+/O0sfdeBGFKlvFyrjf+CnVaB2A==
4475+
"@nrwl/nx-cloud@15.1.1":
4476+
version "15.1.1"
4477+
resolved "https://registry.yarnpkg.com/@nrwl/nx-cloud/-/nx-cloud-15.1.1.tgz#4f730e04c43ba863df8ecf0a5e7c927a5e5d14eb"
4478+
integrity sha512-aIVb87PQpAjwdEaFksQ3rYgFq9MDaBG2KvYZcj/k+z2uWeWH84ha/opO37aCFLf5VXNiyJZGRb/+7vW7BFpNOw==
44794479
dependencies:
44804480
axios "^0.21.2"
44814481
chalk "4.1.0"

0 commit comments

Comments
 (0)