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

View File

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

View File

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

View File

@ -70,14 +70,20 @@
"description": "The build target to add.",
"type": "string",
"default": "build"
},
"format": {
"description": "The format to build the library (esm or cjs).",
"type": "array",
"items": { "type": "string", "enum": ["esm", "cjs"] },
"default": ["esm"]
}
},
"required": [],
"presets": []
},
"description": "Add rollup configuration to a project.",
"hidden": true,
"implementation": "/packages/rollup/src/generators/configuration/configuration.ts",
"hidden": false,
"path": "/packages/rollup/src/generators/configuration/schema.json",
"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`
);
rmDist();
runCLI(`build ${myPkg}`);
runCLI(`build ${myPkg} --format=cjs,esm --generateExportsField`);
output = runCommand(`node dist/libs/${myPkg}/index.cjs.js`);
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`
);
rmDist();
runCLI(`build ${myPkg}`);
runCLI(`build ${myPkg} --format=cjs,esm --generateExportsField`);
output = runCommand(`node dist/libs/${myPkg}/index.cjs.js`);
expect(output).toMatch(/Hello/);
}, 500000);

View File

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

View File

@ -51,14 +51,19 @@ function addBuildTarget(tree: Tree, options: EsBuildProjectSchema) {
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 = {
main: getMainFile(tree, options),
outputPath: joinPathFragments(
'dist',
project.root === '.' ? options.project : project.root
),
main: prevBuildOptions?.main ?? getMainFile(tree, options),
outputPath:
prevBuildOptions?.outputPath ??
joinPathFragments(
'dist',
project.root === '.' ? options.project : project.root
),
outputFileName: 'main.js',
tsConfig,
assets: [],

View File

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

View File

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

View File

@ -3,6 +3,7 @@ import {
readJson,
readProjectConfiguration,
Tree,
updateProjectConfiguration,
writeJson,
} from '@nx/devkit';
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',
});
}
const tsConfig =
options.tsConfig ?? joinPathFragments(project.root, 'tsconfig.lib.json');
const prevBuildOptions = project.targets?.[options.buildTarget]?.options;
const buildOptions: RollupExecutorOptions = {
main: options.main ?? joinPathFragments(project.root, 'src/main.ts'),
outputPath: joinPathFragments(
'dist',
project.root === '.' ? project.name : project.root
),
main:
options.main ??
prevBuildOptions?.main ??
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',
tsConfig,
project: `${project.root}/package.json`,
external: options.external,
format: options.format,
};
if (options.rollupConfig) {

View File

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

View File

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