feat(js): carry-over known build options (main, tsConfig, etc.) when running setup-build generator (#18742)

This commit is contained in:
Jack Hsu 2023-08-28 10:36:18 -04:00 committed by GitHub
parent 960d80be93
commit 226dfaf7a4
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
13 changed files with 113 additions and 33 deletions

View File

@ -641,7 +641,7 @@
"/packages/esbuild/generators/configuration": { "/packages/esbuild/generators/configuration": {
"description": "Add esbuild configuration to a project.", "description": "Add esbuild configuration to a project.",
"file": "generated/packages/esbuild/generators/configuration.json", "file": "generated/packages/esbuild/generators/configuration.json",
"hidden": true, "hidden": false,
"name": "configuration", "name": "configuration",
"originalFilePath": "/packages/esbuild/src/generators/configuration/schema.json", "originalFilePath": "/packages/esbuild/src/generators/configuration/schema.json",
"path": "/packages/esbuild/generators/configuration", "path": "/packages/esbuild/generators/configuration",
@ -2377,7 +2377,7 @@
"/packages/rollup/generators/configuration": { "/packages/rollup/generators/configuration": {
"description": "Add rollup configuration to a project.", "description": "Add rollup configuration to a project.",
"file": "generated/packages/rollup/generators/configuration.json", "file": "generated/packages/rollup/generators/configuration.json",
"hidden": true, "hidden": false,
"name": "configuration", "name": "configuration",
"originalFilePath": "/packages/rollup/src/generators/configuration/schema.json", "originalFilePath": "/packages/rollup/src/generators/configuration/schema.json",
"path": "/packages/rollup/generators/configuration", "path": "/packages/rollup/generators/configuration",

View File

@ -630,7 +630,7 @@
{ {
"description": "Add esbuild configuration to a project.", "description": "Add esbuild configuration to a project.",
"file": "generated/packages/esbuild/generators/configuration.json", "file": "generated/packages/esbuild/generators/configuration.json",
"hidden": true, "hidden": false,
"name": "configuration", "name": "configuration",
"originalFilePath": "/packages/esbuild/src/generators/configuration/schema.json", "originalFilePath": "/packages/esbuild/src/generators/configuration/schema.json",
"path": "esbuild/generators/configuration", "path": "esbuild/generators/configuration",
@ -2351,7 +2351,7 @@
{ {
"description": "Add rollup configuration to a project.", "description": "Add rollup configuration to a project.",
"file": "generated/packages/rollup/generators/configuration.json", "file": "generated/packages/rollup/generators/configuration.json",
"hidden": true, "hidden": false,
"name": "configuration", "name": "configuration",
"originalFilePath": "/packages/rollup/src/generators/configuration/schema.json", "originalFilePath": "/packages/rollup/src/generators/configuration/schema.json",
"path": "rollup/generators/configuration", "path": "rollup/generators/configuration",

View File

@ -68,8 +68,8 @@
"presets": [] "presets": []
}, },
"description": "Add esbuild configuration to a project.", "description": "Add esbuild configuration to a project.",
"hidden": true,
"implementation": "/packages/esbuild/src/generators/configuration/configuration.ts", "implementation": "/packages/esbuild/src/generators/configuration/configuration.ts",
"hidden": false,
"path": "/packages/esbuild/src/generators/configuration/schema.json", "path": "/packages/esbuild/src/generators/configuration/schema.json",
"type": "generator" "type": "generator"
} }

View File

@ -70,14 +70,20 @@
"description": "The build target to add.", "description": "The build target to add.",
"type": "string", "type": "string",
"default": "build" "default": "build"
},
"format": {
"description": "The format to build the library (esm or cjs).",
"type": "array",
"items": { "type": "string", "enum": ["esm", "cjs"] },
"default": ["esm"]
} }
}, },
"required": [], "required": [],
"presets": [] "presets": []
}, },
"description": "Add rollup configuration to a project.", "description": "Add rollup configuration to a project.",
"hidden": true,
"implementation": "/packages/rollup/src/generators/configuration/configuration.ts", "implementation": "/packages/rollup/src/generators/configuration/configuration.ts",
"hidden": false,
"path": "/packages/rollup/src/generators/configuration/schema.json", "path": "/packages/rollup/src/generators/configuration/schema.json",
"type": "generator" "type": "generator"
} }

View File

@ -47,7 +47,7 @@ describe('Rollup Plugin', () => {
`generate @nx/rollup:configuration ${myPkg} --target=node --tsConfig=libs/${myPkg}/tsconfig.lib.json --main=libs/${myPkg}/src/index.ts --compiler=swc` `generate @nx/rollup:configuration ${myPkg} --target=node --tsConfig=libs/${myPkg}/tsconfig.lib.json --main=libs/${myPkg}/src/index.ts --compiler=swc`
); );
rmDist(); rmDist();
runCLI(`build ${myPkg}`); runCLI(`build ${myPkg} --format=cjs,esm --generateExportsField`);
output = runCommand(`node dist/libs/${myPkg}/index.cjs.js`); output = runCommand(`node dist/libs/${myPkg}/index.cjs.js`);
expect(output).toMatch(/Hello/); expect(output).toMatch(/Hello/);
@ -61,7 +61,7 @@ describe('Rollup Plugin', () => {
`generate @nx/rollup:configuration ${myPkg} --target=node --tsConfig=libs/${myPkg}/tsconfig.lib.json --main=libs/${myPkg}/src/index.ts --compiler=tsc` `generate @nx/rollup:configuration ${myPkg} --target=node --tsConfig=libs/${myPkg}/tsconfig.lib.json --main=libs/${myPkg}/src/index.ts --compiler=tsc`
); );
rmDist(); rmDist();
runCLI(`build ${myPkg}`); runCLI(`build ${myPkg} --format=cjs,esm --generateExportsField`);
output = runCommand(`node dist/libs/${myPkg}/index.cjs.js`); output = runCommand(`node dist/libs/${myPkg}/index.cjs.js`);
expect(output).toMatch(/Hello/); expect(output).toMatch(/Hello/);
}, 500000); }, 500000);

View File

@ -12,8 +12,7 @@
"aliases": ["esbuild-project"], "aliases": ["esbuild-project"],
"factory": "./src/generators/configuration/configuration#compat", "factory": "./src/generators/configuration/configuration#compat",
"schema": "./src/generators/configuration/schema.json", "schema": "./src/generators/configuration/schema.json",
"description": "Add esbuild configuration to a project.", "description": "Add esbuild configuration to a project."
"hidden": true
} }
}, },
"generators": { "generators": {
@ -28,8 +27,7 @@
"aliases": ["esbuild-project"], "aliases": ["esbuild-project"],
"factory": "./src/generators/configuration/configuration", "factory": "./src/generators/configuration/configuration",
"schema": "./src/generators/configuration/schema.json", "schema": "./src/generators/configuration/schema.json",
"description": "Add esbuild configuration to a project.", "description": "Add esbuild configuration to a project."
"hidden": true
} }
} }
} }

View File

@ -51,14 +51,19 @@ function addBuildTarget(tree: Tree, options: EsBuildProjectSchema) {
version: '0.0.1', version: '0.0.1',
}); });
} }
const tsConfig = getTsConfigFile(tree, options);
const prevBuildOptions = project.targets?.[options.buildTarget]?.options;
const tsConfig = prevBuildOptions?.tsConfig ?? getTsConfigFile(tree, options);
const buildOptions: EsBuildExecutorOptions = { const buildOptions: EsBuildExecutorOptions = {
main: getMainFile(tree, options), main: prevBuildOptions?.main ?? getMainFile(tree, options),
outputPath: joinPathFragments( outputPath:
'dist', prevBuildOptions?.outputPath ??
project.root === '.' ? options.project : project.root joinPathFragments(
), 'dist',
project.root === '.' ? options.project : project.root
),
outputFileName: 'main.js', outputFileName: 'main.js',
tsConfig, tsConfig,
assets: [], assets: [],

View File

@ -21,11 +21,14 @@ export async function setupBuildGenerator(
const tasks: GeneratorCallback[] = []; const tasks: GeneratorCallback[] = [];
const project = readProjectConfiguration(tree, options.project); const project = readProjectConfiguration(tree, options.project);
const buildTarget = options.buildTarget ?? 'build'; const buildTarget = options.buildTarget ?? 'build';
const prevBuildOptions = project.targets?.[buildTarget]?.options;
project.targets ??= {}; project.targets ??= {};
let mainFile: string; let mainFile: string;
if (options.main) { if (prevBuildOptions?.main) {
mainFile = prevBuildOptions.main;
} else if (options.main) {
mainFile = options.main; mainFile = options.main;
} else { } else {
const root = project.sourceRoot ?? project.root; const root = project.sourceRoot ?? project.root;
@ -48,7 +51,9 @@ export async function setupBuildGenerator(
} }
let tsConfigFile: string; let tsConfigFile: string;
if (options.tsConfig) { if (prevBuildOptions?.tsConfig) {
tsConfigFile = prevBuildOptions.tsConfig;
} else if (options.tsConfig) {
tsConfigFile = options.tsConfig; tsConfigFile = options.tsConfig;
} else { } else {
for (const f of [ for (const f of [
@ -97,6 +102,7 @@ export async function setupBuildGenerator(
buildTarget: options.buildTarget, buildTarget: options.buildTarget,
project: options.project, project: options.project,
skipFormat: true, skipFormat: true,
skipValidation: true,
}); });
tasks.push(task); tasks.push(task);
break; break;
@ -106,9 +112,12 @@ export async function setupBuildGenerator(
const task = await configurationGenerator(tree, { const task = await configurationGenerator(tree, {
buildTarget: options.buildTarget, buildTarget: options.buildTarget,
main: mainFile, main: mainFile,
tsConfig: tsConfigFile,
project: options.project, project: options.project,
skipFormat: true,
compiler: 'tsc', compiler: 'tsc',
format: ['cjs', 'esm'],
skipFormat: true,
skipValidation: true,
}); });
tasks.push(task); tasks.push(task);
break; break;

View File

@ -12,8 +12,7 @@
"aliases": ["rollup-project"], "aliases": ["rollup-project"],
"factory": "./src/generators/configuration/configuration#compat", "factory": "./src/generators/configuration/configuration#compat",
"schema": "./src/generators/configuration/schema.json", "schema": "./src/generators/configuration/schema.json",
"description": "Add rollup configuration to a project.", "description": "Add rollup configuration to a project."
"hidden": true
} }
}, },
"generators": { "generators": {
@ -28,8 +27,7 @@
"aliases": ["rollup-project"], "aliases": ["rollup-project"],
"factory": "./src/generators/configuration/configuration", "factory": "./src/generators/configuration/configuration",
"schema": "./src/generators/configuration/schema.json", "schema": "./src/generators/configuration/schema.json",
"description": "Add rollup configuration to a project.", "description": "Add rollup configuration to a project."
"hidden": true
} }
} }
} }

View File

@ -3,6 +3,7 @@ import {
readJson, readJson,
readProjectConfiguration, readProjectConfiguration,
Tree, Tree,
updateProjectConfiguration,
writeJson, writeJson,
} from '@nx/devkit'; } from '@nx/devkit';
import { createTreeWithEmptyWorkspace } from '@nx/devkit/testing'; import { createTreeWithEmptyWorkspace } from '@nx/devkit/testing';
@ -99,4 +100,46 @@ describe('configurationGenerator', () => {
}, },
}); });
}); });
it('should carry over known executor options from existing build target', async () => {
updateProjectConfiguration(tree, 'mypkg', {
root: 'libs/mypkg',
sourceRoot: 'libs/mypkg/src',
targets: {
build: {
executor: '@nx/js:tsc',
options: {
main: 'libs/mypkg/src/custom.ts',
outputPath: 'dist/custom',
tsConfig: 'libs/mypkg/src/tsconfig.custom.json',
additionalEntryPoints: ['libs/mypkg/src/extra.ts'],
generateExportsField: true,
},
},
},
});
await configurationGenerator(tree, {
project: 'mypkg',
buildTarget: 'build',
skipValidation: true,
});
const project = readProjectConfiguration(tree, 'mypkg');
expect(project.targets).toMatchObject({
build: {
executor: '@nx/rollup:rollup',
outputs: ['{options.outputPath}'],
defaultConfiguration: 'production',
options: {
main: 'libs/mypkg/src/custom.ts',
outputPath: 'dist/custom',
tsConfig: 'libs/mypkg/src/tsconfig.custom.json',
additionalEntryPoints: ['libs/mypkg/src/extra.ts'],
generateExportsField: true,
},
},
});
});
}); });

View File

@ -50,19 +50,30 @@ function addBuildTarget(tree: Tree, options: RollupProjectSchema) {
version: '0.0.1', version: '0.0.1',
}); });
} }
const tsConfig =
options.tsConfig ?? joinPathFragments(project.root, 'tsconfig.lib.json'); const prevBuildOptions = project.targets?.[options.buildTarget]?.options;
const buildOptions: RollupExecutorOptions = { const buildOptions: RollupExecutorOptions = {
main: options.main ?? joinPathFragments(project.root, 'src/main.ts'), main:
outputPath: joinPathFragments( options.main ??
'dist', prevBuildOptions?.main ??
project.root === '.' ? project.name : project.root joinPathFragments(project.root, 'src/main.ts'),
), outputPath:
prevBuildOptions?.outputPath ??
joinPathFragments(
'dist',
project.root === '.' ? project.name : project.root
),
tsConfig:
options.tsConfig ??
prevBuildOptions?.tsConfig ??
joinPathFragments(project.root, 'tsconfig.lib.json'),
additionalEntryPoints: prevBuildOptions?.additionalEntryPoints,
generateExportsField: prevBuildOptions?.generateExportsField,
compiler: options.compiler ?? 'babel', compiler: options.compiler ?? 'babel',
tsConfig,
project: `${project.root}/package.json`, project: `${project.root}/package.json`,
external: options.external, external: options.external,
format: options.format,
}; };
if (options.rollupConfig) { if (options.rollupConfig) {

View File

@ -10,4 +10,5 @@ export interface RollupProjectSchema {
external?: string[]; external?: string[];
rollupConfig?: string; rollupConfig?: string;
buildTarget?: string; buildTarget?: string;
format?: ('cjs' | 'esm')[];
} }

View File

@ -71,6 +71,15 @@
"description": "The build target to add.", "description": "The build target to add.",
"type": "string", "type": "string",
"default": "build" "default": "build"
},
"format": {
"description": "The format to build the library (esm or cjs).",
"type": "array",
"items": {
"type": "string",
"enum": ["esm", "cjs"]
},
"default": ["esm"]
} }
}, },
"required": [] "required": []