@nx/esbuild 20.0.10 → 20.1.0-beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +3 -3
- package/src/executors/esbuild/lib/build-esbuild-options.d.ts +1 -1
- package/src/executors/esbuild/lib/normalize.d.ts +2 -2
- package/src/executors/esbuild/lib/normalize.js +11 -7
- package/src/executors/esbuild/schema.d.ts +3 -2
- package/src/generators/configuration/configuration.js +95 -23
- package/src/generators/configuration/schema.d.ts +3 -0
- package/src/generators/configuration/schema.json +9 -0
- package/src/generators/init/init.js +0 -2
package/package.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"name": "@nx/esbuild",
|
3
|
-
"version": "20.0.
|
3
|
+
"version": "20.1.0-beta.1",
|
4
4
|
"private": false,
|
5
5
|
"description": "The Nx Plugin for esbuild contains executors and generators that support building applications using esbuild",
|
6
6
|
"repository": {
|
@@ -31,8 +31,8 @@
|
|
31
31
|
"migrations": "./migrations.json"
|
32
32
|
},
|
33
33
|
"dependencies": {
|
34
|
-
"@nx/devkit": "20.0.
|
35
|
-
"@nx/js": "20.0.
|
34
|
+
"@nx/devkit": "20.1.0-beta.1",
|
35
|
+
"@nx/js": "20.1.0-beta.1",
|
36
36
|
"fast-glob": "3.2.7",
|
37
37
|
"picocolors": "^1.1.0",
|
38
38
|
"tsconfig-paths": "^4.1.2",
|
@@ -2,6 +2,6 @@ import * as esbuild from 'esbuild';
|
|
2
2
|
import { ExecutorContext, ProjectGraphProjectNode } from '@nx/devkit';
|
3
3
|
import { NormalizedEsBuildExecutorOptions } from '../schema';
|
4
4
|
export declare function buildEsbuildOptions(format: 'cjs' | 'esm', options: NormalizedEsBuildExecutorOptions, context: ExecutorContext): esbuild.BuildOptions;
|
5
|
-
export declare function getOutExtension(format: 'cjs' | 'esm', options: NormalizedEsBuildExecutorOptions): '.cjs' | '.mjs' | '.js';
|
5
|
+
export declare function getOutExtension(format: 'cjs' | 'esm', options: Pick<NormalizedEsBuildExecutorOptions, 'userDefinedBuildOptions'>): '.cjs' | '.mjs' | '.js';
|
6
6
|
export declare function getOutfile(format: 'cjs' | 'esm', options: NormalizedEsBuildExecutorOptions, context: ExecutorContext): string;
|
7
7
|
export declare function getRegisterFileContent(project: ProjectGraphProjectNode, paths: Record<string, string[]>, mainFile: string, outExtension?: string): string;
|
@@ -1,3 +1,3 @@
|
|
1
|
-
import {
|
2
|
-
import {
|
1
|
+
import { type ExecutorContext } from '@nx/devkit';
|
2
|
+
import type { EsBuildExecutorOptions, NormalizedEsBuildExecutorOptions } from '../schema';
|
3
3
|
export declare function normalizeOptions(options: EsBuildExecutorOptions, context: ExecutorContext): NormalizedEsBuildExecutorOptions;
|
@@ -1,25 +1,29 @@
|
|
1
1
|
"use strict";
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
3
3
|
exports.normalizeOptions = normalizeOptions;
|
4
|
+
const devkit_1 = require("@nx/devkit");
|
5
|
+
const js_1 = require("@nx/js");
|
6
|
+
const ts_solution_setup_1 = require("@nx/js/src/utils/typescript/ts-solution-setup");
|
4
7
|
const fs = require("fs");
|
5
8
|
const path = require("path");
|
6
|
-
const devkit_1 = require("@nx/devkit");
|
7
9
|
const pc = require("picocolors");
|
8
|
-
const js_1 = require("@nx/js");
|
9
10
|
function normalizeOptions(options, context) {
|
11
|
+
const isTsSolutionSetup = (0, ts_solution_setup_1.isUsingTsSolutionSetup)();
|
12
|
+
if (isTsSolutionSetup && options.generatePackageJson) {
|
13
|
+
throw new Error(`Setting 'generatePackageJson: true' is not supported with the current TypeScript setup. Update the 'package.json' file at the project root as needed and unset the 'generatePackageJson' option.`);
|
14
|
+
}
|
10
15
|
const tsConfig = (0, js_1.readTsConfig)(options.tsConfig);
|
11
|
-
// If we're not generating package.json file, then copy it as-is as an asset.
|
12
|
-
const assets = options.generatePackageJson
|
13
|
-
? options.assets
|
16
|
+
// If we're not generating package.json file, then copy it as-is as an asset when not using ts solution setup.
|
17
|
+
const assets = options.generatePackageJson || isTsSolutionSetup
|
18
|
+
? options.assets ?? []
|
14
19
|
: [
|
15
20
|
...options.assets,
|
16
21
|
(0, devkit_1.joinPathFragments)(context.projectGraph.nodes[context.projectName].data.root, 'package.json'),
|
17
22
|
];
|
18
23
|
if (!options.bundle && options.thirdParty) {
|
19
|
-
devkit_1.logger.info(pc.yellow(`Your build has conflicting options, ${pc.bold('bundle:false')} and ${pc.bold('thirdParty:true')}. Your package.json
|
24
|
+
devkit_1.logger.info(pc.yellow(`Your build has conflicting options, ${pc.bold('bundle:false')} and ${pc.bold('thirdParty:true')}. Your package.json dependencies might not be generated correctly so we added an update ${pc.bold('thirdParty:false')}`));
|
20
25
|
}
|
21
26
|
const thirdParty = !options.bundle ? false : options.thirdParty;
|
22
|
-
const { root: projectRoot } = context.projectsConfigurations.projects[context.projectName];
|
23
27
|
const declarationRootDir = options.declarationRootDir
|
24
28
|
? path.join(context.root, options.declarationRootDir)
|
25
29
|
: undefined;
|
@@ -5,7 +5,7 @@ type Compiler = 'babel' | 'swc';
|
|
5
5
|
|
6
6
|
export interface EsBuildExecutorOptions {
|
7
7
|
additionalEntryPoints?: string[];
|
8
|
-
assets
|
8
|
+
assets?: (AssetGlob | string)[];
|
9
9
|
bundle?: boolean;
|
10
10
|
declaration?: boolean;
|
11
11
|
declarationRootDir?: string;
|
@@ -32,7 +32,8 @@ export interface EsBuildExecutorOptions {
|
|
32
32
|
|
33
33
|
export interface NormalizedEsBuildExecutorOptions
|
34
34
|
extends Omit<EsBuildExecutorOptions, 'esbuildOptions' | 'esbuildConfig'> {
|
35
|
+
assets: (AssetGlob | string)[];
|
35
36
|
singleEntry: boolean;
|
36
37
|
external: string[];
|
37
|
-
userDefinedBuildOptions: esbuild.BuildOptions;
|
38
|
+
userDefinedBuildOptions: esbuild.BuildOptions | undefined;
|
38
39
|
}
|
@@ -2,19 +2,24 @@
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
3
3
|
exports.configurationGenerator = configurationGenerator;
|
4
4
|
const devkit_1 = require("@nx/devkit");
|
5
|
+
const target_defaults_utils_1 = require("@nx/devkit/src/generators/target-defaults-utils");
|
6
|
+
const js_1 = require("@nx/js");
|
5
7
|
const get_import_path_1 = require("@nx/js/src/utils/get-import-path");
|
6
8
|
const ts_solution_setup_1 = require("@nx/js/src/utils/typescript/ts-solution-setup");
|
9
|
+
const posix_1 = require("node:path/posix");
|
10
|
+
const devkit_internals_1 = require("nx/src/devkit-internals");
|
11
|
+
const build_esbuild_options_1 = require("../../executors/esbuild/lib/build-esbuild-options");
|
7
12
|
const init_1 = require("../init/init");
|
8
|
-
const target_defaults_utils_1 = require("@nx/devkit/src/generators/target-defaults-utils");
|
9
13
|
async function configurationGenerator(tree, options) {
|
10
|
-
(0, ts_solution_setup_1.assertNotUsingTsSolutionSetup)(tree, 'esbuild', 'configuration');
|
11
14
|
const task = await (0, init_1.esbuildInitGenerator)(tree, {
|
12
15
|
...options,
|
13
16
|
skipFormat: true,
|
14
17
|
});
|
15
18
|
options.buildTarget ??= 'build';
|
19
|
+
const isTsSolutionSetup = (0, ts_solution_setup_1.isUsingTsSolutionSetup)(tree);
|
16
20
|
checkForTargetConflicts(tree, options);
|
17
|
-
addBuildTarget(tree, options);
|
21
|
+
addBuildTarget(tree, options, isTsSolutionSetup);
|
22
|
+
updatePackageJson(tree, options, isTsSolutionSetup);
|
18
23
|
await (0, devkit_1.formatFiles)(tree);
|
19
24
|
return task;
|
20
25
|
}
|
@@ -26,40 +31,44 @@ function checkForTargetConflicts(tree, options) {
|
|
26
31
|
throw new Error(`Project "${options.project}" already has a ${options.buildTarget} target. Pass --skipValidation to ignore this error.`);
|
27
32
|
}
|
28
33
|
}
|
29
|
-
function addBuildTarget(tree, options) {
|
34
|
+
function addBuildTarget(tree, options, isTsSolutionSetup) {
|
30
35
|
(0, target_defaults_utils_1.addBuildTargetDefaults)(tree, '@nx/esbuild:esbuild', options.buildTarget);
|
31
36
|
const project = (0, devkit_1.readProjectConfiguration)(tree, options.project);
|
32
|
-
const packageJsonPath = (0, devkit_1.joinPathFragments)(project.root, 'package.json');
|
33
|
-
if (!tree.exists(packageJsonPath)) {
|
34
|
-
const importPath = options.importPath || (0, get_import_path_1.getImportPath)(tree, options.project);
|
35
|
-
(0, devkit_1.writeJson)(tree, packageJsonPath, {
|
36
|
-
name: importPath,
|
37
|
-
version: '0.0.1',
|
38
|
-
});
|
39
|
-
}
|
40
37
|
const prevBuildOptions = project.targets?.[options.buildTarget]?.options;
|
41
38
|
const tsConfig = prevBuildOptions?.tsConfig ?? getTsConfigFile(tree, options);
|
39
|
+
let outputPath = prevBuildOptions?.outputPath;
|
40
|
+
if (!outputPath) {
|
41
|
+
outputPath = isTsSolutionSetup
|
42
|
+
? (0, devkit_1.joinPathFragments)(project.root, 'dist')
|
43
|
+
: (0, devkit_1.joinPathFragments)('dist', project.root === '.' ? options.project : project.root);
|
44
|
+
}
|
42
45
|
const buildOptions = {
|
43
46
|
main: prevBuildOptions?.main ?? getMainFile(tree, options),
|
44
|
-
outputPath
|
45
|
-
(0, devkit_1.joinPathFragments)('dist', project.root === '.' ? options.project : project.root),
|
47
|
+
outputPath,
|
46
48
|
outputFileName: 'main.js',
|
47
49
|
tsConfig,
|
48
|
-
assets: [],
|
49
50
|
platform: options.platform,
|
51
|
+
format: options.format,
|
50
52
|
};
|
51
|
-
if (
|
52
|
-
buildOptions.
|
53
|
-
|
53
|
+
if (isTsSolutionSetup) {
|
54
|
+
buildOptions.declarationRootDir =
|
55
|
+
project.sourceRoot ?? tree.exists(`${project.root}/src`)
|
56
|
+
? `${project.root}/src`
|
57
|
+
: project.root;
|
54
58
|
}
|
55
|
-
|
56
|
-
buildOptions.assets = [
|
57
|
-
|
59
|
+
else {
|
60
|
+
buildOptions.assets = [];
|
61
|
+
if (tree.exists((0, devkit_1.joinPathFragments)(project.root, 'README.md'))) {
|
62
|
+
buildOptions.assets.push({
|
58
63
|
glob: `${project.root}/README.md`,
|
59
64
|
input: '.',
|
60
65
|
output: '.',
|
61
|
-
}
|
62
|
-
|
66
|
+
});
|
67
|
+
}
|
68
|
+
}
|
69
|
+
if (options.platform === 'browser') {
|
70
|
+
buildOptions.outputHashing = 'all';
|
71
|
+
buildOptions.minify = true;
|
63
72
|
}
|
64
73
|
(0, devkit_1.updateProjectConfiguration)(tree, options.project, {
|
65
74
|
...project,
|
@@ -82,6 +91,69 @@ function addBuildTarget(tree, options) {
|
|
82
91
|
},
|
83
92
|
});
|
84
93
|
}
|
94
|
+
function updatePackageJson(tree, options, isTsSolutionSetup) {
|
95
|
+
const project = (0, devkit_1.readProjectConfiguration)(tree, options.project);
|
96
|
+
const packageJsonPath = (0, posix_1.join)(project.root, 'package.json');
|
97
|
+
let packageJson;
|
98
|
+
if (tree.exists(packageJsonPath)) {
|
99
|
+
if (!isTsSolutionSetup) {
|
100
|
+
return;
|
101
|
+
}
|
102
|
+
packageJson = (0, devkit_1.readJson)(tree, packageJsonPath);
|
103
|
+
}
|
104
|
+
else {
|
105
|
+
packageJson = {
|
106
|
+
name: (0, get_import_path_1.getImportPath)(tree, options.project),
|
107
|
+
version: '0.0.1',
|
108
|
+
};
|
109
|
+
}
|
110
|
+
if (isTsSolutionSetup) {
|
111
|
+
const nxJson = (0, devkit_1.readNxJson)(tree);
|
112
|
+
const projectTarget = project.targets[options.buildTarget];
|
113
|
+
const mergedTarget = (0, devkit_internals_1.mergeTargetConfigurations)(projectTarget, (projectTarget.executor
|
114
|
+
? nxJson.targetDefaults?.[projectTarget.executor]
|
115
|
+
: undefined) ?? nxJson.targetDefaults?.[options.buildTarget]);
|
116
|
+
const { declarationRootDir = '.', main, outputPath, outputFileName,
|
117
|
+
// the executor option defaults to [esm]
|
118
|
+
format = ['esm'], esbuildOptions, } = mergedTarget.options;
|
119
|
+
// can't use the declarationRootDir as rootDir because it only affects the typings,
|
120
|
+
// not the runtime entry point
|
121
|
+
packageJson = (0, js_1.getUpdatedPackageJsonContent)(packageJson, {
|
122
|
+
main,
|
123
|
+
outputPath,
|
124
|
+
projectRoot: project.root,
|
125
|
+
generateExportsField: true,
|
126
|
+
packageJsonPath,
|
127
|
+
format,
|
128
|
+
outputFileName,
|
129
|
+
outputFileExtensionForCjs: (0, build_esbuild_options_1.getOutExtension)('cjs', {
|
130
|
+
// there's very little chance that the user would have defined a custom esbuild config
|
131
|
+
// since that's an Nx specific file that we're not generating here and we're setting up
|
132
|
+
// the build for esbuild now
|
133
|
+
userDefinedBuildOptions: esbuildOptions,
|
134
|
+
}),
|
135
|
+
outputFileExtensionForEsm: (0, build_esbuild_options_1.getOutExtension)('esm', {
|
136
|
+
userDefinedBuildOptions: esbuildOptions,
|
137
|
+
}),
|
138
|
+
});
|
139
|
+
if (declarationRootDir !== (0, posix_1.dirname)(main)) {
|
140
|
+
// the declaration file entry point will be output to a location
|
141
|
+
// different than the runtime entry point, adjust accodingly
|
142
|
+
const outputDir = (0, js_1.getOutputDir)({
|
143
|
+
main,
|
144
|
+
outputPath,
|
145
|
+
projectRoot: project.root,
|
146
|
+
packageJsonPath,
|
147
|
+
rootDir: declarationRootDir,
|
148
|
+
});
|
149
|
+
const mainFile = (0, posix_1.basename)(options.main).replace(/\.[tj]s$/, '');
|
150
|
+
const typingsFile = `${outputDir}${mainFile}.d.ts`;
|
151
|
+
packageJson.types = typingsFile;
|
152
|
+
packageJson.exports['.'].types = typingsFile;
|
153
|
+
}
|
154
|
+
}
|
155
|
+
(0, devkit_1.writeJson)(tree, packageJsonPath, packageJson);
|
156
|
+
}
|
85
157
|
function getMainFile(tree, options) {
|
86
158
|
const project = (0, devkit_1.readProjectConfiguration)(tree, options.project);
|
87
159
|
const candidates = [
|
@@ -1,3 +1,5 @@
|
|
1
|
+
import type { SupportedFormat } from '@nx/js';
|
2
|
+
|
1
3
|
export interface EsBuildProjectSchema {
|
2
4
|
project: string;
|
3
5
|
main?: string;
|
@@ -10,4 +12,5 @@ export interface EsBuildProjectSchema {
|
|
10
12
|
esbuildConfig?: string;
|
11
13
|
platform?: 'node' | 'browser' | 'neutral';
|
12
14
|
buildTarget?: string;
|
15
|
+
format?: SupportedFormat[];
|
13
16
|
}
|
@@ -60,6 +60,15 @@
|
|
60
60
|
"description": "The build target to add.",
|
61
61
|
"type": "string",
|
62
62
|
"default": "build"
|
63
|
+
},
|
64
|
+
"format": {
|
65
|
+
"description": "The format to build the library (esm or cjs).",
|
66
|
+
"type": "array",
|
67
|
+
"items": {
|
68
|
+
"type": "string",
|
69
|
+
"enum": ["esm", "cjs"]
|
70
|
+
},
|
71
|
+
"default": ["esm"]
|
63
72
|
}
|
64
73
|
},
|
65
74
|
"required": [],
|
@@ -2,11 +2,9 @@
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
3
3
|
exports.esbuildInitGenerator = esbuildInitGenerator;
|
4
4
|
const devkit_1 = require("@nx/devkit");
|
5
|
-
const ts_solution_setup_1 = require("@nx/js/src/utils/typescript/ts-solution-setup");
|
6
5
|
const versions_1 = require("@nx/js/src/utils/versions");
|
7
6
|
const versions_2 = require("../../utils/versions");
|
8
7
|
async function esbuildInitGenerator(tree, schema) {
|
9
|
-
(0, ts_solution_setup_1.assertNotUsingTsSolutionSetup)(tree, 'esbuild', 'init');
|
10
8
|
let installTask = () => { };
|
11
9
|
if (!schema.skipPackageJson) {
|
12
10
|
installTask = (0, devkit_1.addDependenciesToPackageJson)(tree, {}, {
|