@backstage/cli-module-build 0.0.0-nightly-20260317031259
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/CHANGELOG.md +18 -0
- package/README.md +23 -0
- package/bin/backstage-cli-module-build +32 -0
- package/config/webpack-public-path.js +31 -0
- package/dist/commands/buildWorkspace.cjs.js +53 -0
- package/dist/commands/buildWorkspace.cjs.js.map +1 -0
- package/dist/commands/package/build/command.cjs.js +136 -0
- package/dist/commands/package/build/command.cjs.js.map +1 -0
- package/dist/commands/package/build/index.cjs.js +10 -0
- package/dist/commands/package/build/index.cjs.js.map +1 -0
- package/dist/commands/package/bundle/command.cjs.js +691 -0
- package/dist/commands/package/bundle/command.cjs.js.map +1 -0
- package/dist/commands/package/bundle/index.cjs.js +10 -0
- package/dist/commands/package/bundle/index.cjs.js.map +1 -0
- package/dist/commands/package/clean.cjs.js +21 -0
- package/dist/commands/package/clean.cjs.js.map +1 -0
- package/dist/commands/package/postpack.cjs.js +15 -0
- package/dist/commands/package/postpack.cjs.js.map +1 -0
- package/dist/commands/package/prepack.cjs.js +29 -0
- package/dist/commands/package/prepack.cjs.js.map +1 -0
- package/dist/commands/package/start/command.cjs.js +80 -0
- package/dist/commands/package/start/command.cjs.js.map +1 -0
- package/dist/commands/package/start/index.cjs.js +10 -0
- package/dist/commands/package/start/index.cjs.js.map +1 -0
- package/dist/commands/package/start/resolveLinkedWorkspace.cjs.js +34 -0
- package/dist/commands/package/start/resolveLinkedWorkspace.cjs.js.map +1 -0
- package/dist/commands/package/start/startBackend.cjs.js +46 -0
- package/dist/commands/package/start/startBackend.cjs.js.map +1 -0
- package/dist/commands/package/start/startFrontend.cjs.js +49 -0
- package/dist/commands/package/start/startFrontend.cjs.js.map +1 -0
- package/dist/commands/package/start/startPackage.cjs.js +53 -0
- package/dist/commands/package/start/startPackage.cjs.js.map +1 -0
- package/dist/commands/repo/build.cjs.js +149 -0
- package/dist/commands/repo/build.cjs.js.map +1 -0
- package/dist/commands/repo/clean.cjs.js +41 -0
- package/dist/commands/repo/clean.cjs.js.map +1 -0
- package/dist/commands/repo/start.cjs.js +199 -0
- package/dist/commands/repo/start.cjs.js.map +1 -0
- package/dist/index.cjs.js +74 -0
- package/dist/index.cjs.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/lib/buildBackend.cjs.js +81 -0
- package/dist/lib/buildBackend.cjs.js.map +1 -0
- package/dist/lib/buildFrontend.cjs.js +49 -0
- package/dist/lib/buildFrontend.cjs.js.map +1 -0
- package/dist/lib/builder/config.cjs.js +257 -0
- package/dist/lib/builder/config.cjs.js.map +1 -0
- package/dist/lib/builder/packager.cjs.js +131 -0
- package/dist/lib/builder/packager.cjs.js.map +1 -0
- package/dist/lib/builder/plugins.cjs.js +125 -0
- package/dist/lib/builder/plugins.cjs.js.map +1 -0
- package/dist/lib/builder/types.cjs.js +10 -0
- package/dist/lib/builder/types.cjs.js.map +1 -0
- package/dist/lib/bundler/ConfigInjectingHtmlWebpackPlugin.cjs.js +43 -0
- package/dist/lib/bundler/ConfigInjectingHtmlWebpackPlugin.cjs.js.map +1 -0
- package/dist/lib/bundler/bundle.cjs.js +189 -0
- package/dist/lib/bundler/bundle.cjs.js.map +1 -0
- package/dist/lib/bundler/config.cjs.js +309 -0
- package/dist/lib/bundler/config.cjs.js.map +1 -0
- package/dist/lib/bundler/hasReactDomClient.cjs.js +17 -0
- package/dist/lib/bundler/hasReactDomClient.cjs.js.map +1 -0
- package/dist/lib/bundler/linkWorkspaces.cjs.js +34 -0
- package/dist/lib/bundler/linkWorkspaces.cjs.js.map +1 -0
- package/dist/lib/bundler/moduleFederation.cjs.js +135 -0
- package/dist/lib/bundler/moduleFederation.cjs.js.map +1 -0
- package/dist/lib/bundler/optimization.cjs.js +68 -0
- package/dist/lib/bundler/optimization.cjs.js.map +1 -0
- package/dist/lib/bundler/packageDetection.cjs.js +124 -0
- package/dist/lib/bundler/packageDetection.cjs.js.map +1 -0
- package/dist/lib/bundler/paths.cjs.js +62 -0
- package/dist/lib/bundler/paths.cjs.js.map +1 -0
- package/dist/lib/bundler/server.cjs.js +231 -0
- package/dist/lib/bundler/server.cjs.js.map +1 -0
- package/dist/lib/bundler/transforms.cjs.js +145 -0
- package/dist/lib/bundler/transforms.cjs.js.map +1 -0
- package/dist/lib/config.cjs.js +94 -0
- package/dist/lib/config.cjs.js.map +1 -0
- package/dist/lib/entryPoints.cjs.js +49 -0
- package/dist/lib/entryPoints.cjs.js.map +1 -0
- package/dist/lib/ipc/IpcServer.cjs.js +60 -0
- package/dist/lib/ipc/IpcServer.cjs.js.map +1 -0
- package/dist/lib/ipc/ServerDataStore.cjs.js +36 -0
- package/dist/lib/ipc/ServerDataStore.cjs.js.map +1 -0
- package/dist/lib/optionsParser.cjs.js +22 -0
- package/dist/lib/optionsParser.cjs.js.map +1 -0
- package/dist/lib/packager/createDistWorkspace.cjs.js +252 -0
- package/dist/lib/packager/createDistWorkspace.cjs.js.map +1 -0
- package/dist/lib/packager/productionPack.cjs.js +160 -0
- package/dist/lib/packager/productionPack.cjs.js.map +1 -0
- package/dist/lib/publishing.cjs.js +40 -0
- package/dist/lib/publishing.cjs.js.map +1 -0
- package/dist/lib/role.cjs.js +24 -0
- package/dist/lib/role.cjs.js.map +1 -0
- package/dist/lib/runner/runBackend.cjs.js +136 -0
- package/dist/lib/runner/runBackend.cjs.js.map +1 -0
- package/dist/lib/typeDistProject.cjs.js +89 -0
- package/dist/lib/typeDistProject.cjs.js.map +1 -0
- package/dist/lib/urls.cjs.js +13 -0
- package/dist/lib/urls.cjs.js.map +1 -0
- package/dist/package.json.cjs.js +143 -0
- package/dist/package.json.cjs.js.map +1 -0
- package/package.json +113 -0
- package/templates/serve_index.html +27 -0
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var fs = require('fs-extra');
|
|
4
|
+
var node_path = require('node:path');
|
|
5
|
+
var bundle = require('./bundler/bundle.cjs.js');
|
|
6
|
+
var moduleFederation = require('./bundler/moduleFederation.cjs.js');
|
|
7
|
+
require('chalk');
|
|
8
|
+
require('react-dev-utils/openBrowser');
|
|
9
|
+
require('@rspack/core');
|
|
10
|
+
require('@rspack/dev-server');
|
|
11
|
+
require('@backstage/cli-common');
|
|
12
|
+
var config = require('./config.cjs.js');
|
|
13
|
+
require('eslint-rspack-plugin');
|
|
14
|
+
require('ts-checker-rspack-plugin');
|
|
15
|
+
require('html-webpack-plugin');
|
|
16
|
+
require('react-dev-utils/ModuleScopePlugin');
|
|
17
|
+
require('@module-federation/enhanced/rspack');
|
|
18
|
+
require('lodash/pickBy');
|
|
19
|
+
require('yn');
|
|
20
|
+
require('@manypkg/get-packages');
|
|
21
|
+
require('./bundler/packageDetection.cjs.js');
|
|
22
|
+
|
|
23
|
+
function _interopDefaultCompat (e) { return e && typeof e === 'object' && 'default' in e ? e : { default: e }; }
|
|
24
|
+
|
|
25
|
+
var fs__default = /*#__PURE__*/_interopDefaultCompat(fs);
|
|
26
|
+
|
|
27
|
+
async function buildFrontend(options) {
|
|
28
|
+
const { targetDir, writeStats, configPaths, webpack } = options;
|
|
29
|
+
const packageJson = await fs__default.default.readJson(
|
|
30
|
+
node_path.resolve(targetDir, "package.json")
|
|
31
|
+
);
|
|
32
|
+
await bundle.buildBundle({
|
|
33
|
+
targetDir,
|
|
34
|
+
entry: "src/index",
|
|
35
|
+
statsJsonEnabled: writeStats,
|
|
36
|
+
moduleFederationRemote: options.isModuleFederationRemote ? await moduleFederation.getModuleFederationRemoteOptions(
|
|
37
|
+
packageJson,
|
|
38
|
+
node_path.resolve(targetDir)
|
|
39
|
+
) : void 0,
|
|
40
|
+
...await config.loadCliConfig({
|
|
41
|
+
args: configPaths,
|
|
42
|
+
fromPackage: packageJson.name
|
|
43
|
+
}),
|
|
44
|
+
webpack
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
exports.buildFrontend = buildFrontend;
|
|
49
|
+
//# sourceMappingURL=buildFrontend.cjs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"buildFrontend.cjs.js","sources":["../../src/lib/buildFrontend.ts"],"sourcesContent":["/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport fs from 'fs-extra';\nimport { resolve as resolvePath } from 'node:path';\nimport { buildBundle, getModuleFederationRemoteOptions } from './bundler';\nimport { BackstagePackageJson } from '@backstage/cli-node';\nimport { loadCliConfig } from './config';\n\ninterface BuildAppOptions {\n targetDir: string;\n writeStats: boolean;\n configPaths: string[];\n isModuleFederationRemote?: boolean;\n webpack?: typeof import('webpack');\n}\n\nexport async function buildFrontend(options: BuildAppOptions) {\n const { targetDir, writeStats, configPaths, webpack } = options;\n const packageJson = (await fs.readJson(\n resolvePath(targetDir, 'package.json'),\n )) as BackstagePackageJson;\n await buildBundle({\n targetDir,\n entry: 'src/index',\n statsJsonEnabled: writeStats,\n moduleFederationRemote: options.isModuleFederationRemote\n ? await getModuleFederationRemoteOptions(\n packageJson,\n resolvePath(targetDir),\n )\n : undefined,\n ...(await loadCliConfig({\n args: configPaths,\n fromPackage: packageJson.name,\n })),\n webpack,\n });\n}\n"],"names":["fs","resolvePath","buildBundle","getModuleFederationRemoteOptions","loadCliConfig"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AA8BA,eAAsB,cAAc,OAAA,EAA0B;AAC5D,EAAA,MAAM,EAAE,SAAA,EAAW,UAAA,EAAY,WAAA,EAAa,SAAQ,GAAI,OAAA;AACxD,EAAA,MAAM,WAAA,GAAe,MAAMA,mBAAA,CAAG,QAAA;AAAA,IAC5BC,iBAAA,CAAY,WAAW,cAAc;AAAA,GACvC;AACA,EAAA,MAAMC,kBAAA,CAAY;AAAA,IAChB,SAAA;AAAA,IACA,KAAA,EAAO,WAAA;AAAA,IACP,gBAAA,EAAkB,UAAA;AAAA,IAClB,sBAAA,EAAwB,OAAA,CAAQ,wBAAA,GAC5B,MAAMC,iDAAA;AAAA,MACJ,WAAA;AAAA,MACAF,kBAAY,SAAS;AAAA,KACvB,GACA,MAAA;AAAA,IACJ,GAAI,MAAMG,oBAAA,CAAc;AAAA,MACtB,IAAA,EAAM,WAAA;AAAA,MACN,aAAa,WAAA,CAAY;AAAA,KAC1B,CAAA;AAAA,IACD;AAAA,GACD,CAAA;AACH;;;;"}
|
|
@@ -0,0 +1,257 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var chalk = require('chalk');
|
|
4
|
+
var fs = require('fs-extra');
|
|
5
|
+
var node_crypto = require('node:crypto');
|
|
6
|
+
var node_path = require('node:path');
|
|
7
|
+
var commonjs = require('@rollup/plugin-commonjs');
|
|
8
|
+
var resolve = require('@rollup/plugin-node-resolve');
|
|
9
|
+
var postcss = require('rollup-plugin-postcss');
|
|
10
|
+
var esbuild = require('rollup-plugin-esbuild');
|
|
11
|
+
var dts = require('rollup-plugin-dts');
|
|
12
|
+
var json = require('@rollup/plugin-json');
|
|
13
|
+
var yaml = require('@rollup/plugin-yaml');
|
|
14
|
+
var plugins = require('./plugins.cjs.js');
|
|
15
|
+
var types = require('./types.cjs.js');
|
|
16
|
+
var cliCommon = require('@backstage/cli-common');
|
|
17
|
+
var entryPoints = require('../entryPoints.cjs.js');
|
|
18
|
+
|
|
19
|
+
function _interopDefaultCompat (e) { return e && typeof e === 'object' && 'default' in e ? e : { default: e }; }
|
|
20
|
+
|
|
21
|
+
var chalk__default = /*#__PURE__*/_interopDefaultCompat(chalk);
|
|
22
|
+
var fs__default = /*#__PURE__*/_interopDefaultCompat(fs);
|
|
23
|
+
var commonjs__default = /*#__PURE__*/_interopDefaultCompat(commonjs);
|
|
24
|
+
var resolve__default = /*#__PURE__*/_interopDefaultCompat(resolve);
|
|
25
|
+
var postcss__default = /*#__PURE__*/_interopDefaultCompat(postcss);
|
|
26
|
+
var esbuild__default = /*#__PURE__*/_interopDefaultCompat(esbuild);
|
|
27
|
+
var dts__default = /*#__PURE__*/_interopDefaultCompat(dts);
|
|
28
|
+
var json__default = /*#__PURE__*/_interopDefaultCompat(json);
|
|
29
|
+
var yaml__default = /*#__PURE__*/_interopDefaultCompat(yaml);
|
|
30
|
+
|
|
31
|
+
const SCRIPT_EXTS = [".js", ".jsx", ".ts", ".tsx"];
|
|
32
|
+
const MODULE_EXTS = [".mjs", ".mts"];
|
|
33
|
+
const COMMONJS_EXTS = [".cjs", ".cts"];
|
|
34
|
+
const MOD_EXT = ".mjs";
|
|
35
|
+
const CJS_EXT = ".cjs";
|
|
36
|
+
const CJS_JS_EXT = ".cjs.js";
|
|
37
|
+
function isFileImport(source) {
|
|
38
|
+
if (source.startsWith(".")) {
|
|
39
|
+
return true;
|
|
40
|
+
}
|
|
41
|
+
if (source.startsWith("/")) {
|
|
42
|
+
return true;
|
|
43
|
+
}
|
|
44
|
+
if (source.match(/[a-z]:/i)) {
|
|
45
|
+
return true;
|
|
46
|
+
}
|
|
47
|
+
return false;
|
|
48
|
+
}
|
|
49
|
+
function buildInternalImportPattern(options) {
|
|
50
|
+
const inlinedPackages = options.workspacePackages.filter(
|
|
51
|
+
(pkg) => pkg.packageJson.backstage?.inline
|
|
52
|
+
);
|
|
53
|
+
for (const { packageJson } of inlinedPackages) {
|
|
54
|
+
if (!packageJson.private) {
|
|
55
|
+
throw new Error(
|
|
56
|
+
`Inlined package ${packageJson.name} must be marked as private`
|
|
57
|
+
);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
const names = inlinedPackages.map((pkg) => pkg.packageJson.name);
|
|
61
|
+
return new RegExp(`^(?:${names.join("|")})(?:$|/)`);
|
|
62
|
+
}
|
|
63
|
+
function multiOutputFormat() {
|
|
64
|
+
return {
|
|
65
|
+
name: "backstage-multi-output-format",
|
|
66
|
+
generateBundle(opts, bundle) {
|
|
67
|
+
const filter = opts.format === "cjs" ? (s) => s.endsWith(MOD_EXT) : (s) => !s.endsWith(MOD_EXT);
|
|
68
|
+
for (const name in bundle) {
|
|
69
|
+
if (filter(name)) {
|
|
70
|
+
delete bundle[name];
|
|
71
|
+
delete bundle[`${name}.map`];
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
},
|
|
75
|
+
renderDynamicImport(opts) {
|
|
76
|
+
if (opts.format === "cjs") {
|
|
77
|
+
return {
|
|
78
|
+
left: "import(",
|
|
79
|
+
right: ")"
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
return void 0;
|
|
83
|
+
}
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
async function makeRollupConfigs(options) {
|
|
87
|
+
const configs = new Array();
|
|
88
|
+
const targetDir = options.targetDir ?? cliCommon.targetPaths.dir;
|
|
89
|
+
let targetPkg = options.packageJson;
|
|
90
|
+
if (!targetPkg) {
|
|
91
|
+
const packagePath = node_path.resolve(targetDir, "package.json");
|
|
92
|
+
targetPkg = await fs__default.default.readJson(packagePath);
|
|
93
|
+
}
|
|
94
|
+
const onwarn = ({ code, message }) => {
|
|
95
|
+
if (code === "EMPTY_BUNDLE") {
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
if (options.logPrefix) {
|
|
99
|
+
console.log(options.logPrefix + message);
|
|
100
|
+
} else {
|
|
101
|
+
console.log(message);
|
|
102
|
+
}
|
|
103
|
+
};
|
|
104
|
+
const distDir = node_path.resolve(targetDir, "dist");
|
|
105
|
+
const entryPoints$1 = entryPoints.readEntryPoints(targetPkg);
|
|
106
|
+
const scriptEntryPoints = entryPoints$1.filter(
|
|
107
|
+
(e) => SCRIPT_EXTS.includes(e.ext)
|
|
108
|
+
);
|
|
109
|
+
const internalImportPattern = buildInternalImportPattern(options);
|
|
110
|
+
const external = (source, importer, isResolved) => Boolean(
|
|
111
|
+
importer && !isResolved && !internalImportPattern.test(source) && !isFileImport(source)
|
|
112
|
+
);
|
|
113
|
+
if (options.outputs.has(types.Output.cjs) || options.outputs.has(types.Output.esm)) {
|
|
114
|
+
const output = new Array();
|
|
115
|
+
const mainFields = ["module", "main"];
|
|
116
|
+
const rewriteNodeModules = (name) => name.replaceAll("node_modules", "node_modules_dist");
|
|
117
|
+
if (options.outputs.has(types.Output.cjs)) {
|
|
118
|
+
const defaultExt = targetPkg.type === "module" ? MOD_EXT : CJS_JS_EXT;
|
|
119
|
+
const outputOpts = {
|
|
120
|
+
dir: distDir,
|
|
121
|
+
entryFileNames(chunkInfo) {
|
|
122
|
+
const cleanName = rewriteNodeModules(chunkInfo.name);
|
|
123
|
+
const inputId = chunkInfo.facadeModuleId;
|
|
124
|
+
if (!inputId) {
|
|
125
|
+
return cleanName + defaultExt;
|
|
126
|
+
}
|
|
127
|
+
const inputExt = node_path.extname(inputId);
|
|
128
|
+
if (MODULE_EXTS.includes(inputExt)) {
|
|
129
|
+
return cleanName + MOD_EXT;
|
|
130
|
+
}
|
|
131
|
+
if (COMMONJS_EXTS.includes(inputExt)) {
|
|
132
|
+
return cleanName + CJS_EXT;
|
|
133
|
+
}
|
|
134
|
+
return cleanName + defaultExt;
|
|
135
|
+
},
|
|
136
|
+
sourcemap: true,
|
|
137
|
+
preserveModules: true,
|
|
138
|
+
preserveModulesRoot: `${targetDir}/src`,
|
|
139
|
+
interop: "compat",
|
|
140
|
+
exports: "named",
|
|
141
|
+
plugins: [multiOutputFormat()]
|
|
142
|
+
};
|
|
143
|
+
output.push({
|
|
144
|
+
...outputOpts,
|
|
145
|
+
format: "cjs"
|
|
146
|
+
});
|
|
147
|
+
output.push({
|
|
148
|
+
...outputOpts,
|
|
149
|
+
format: "module"
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
if (options.outputs.has(types.Output.esm)) {
|
|
153
|
+
output.push({
|
|
154
|
+
dir: distDir,
|
|
155
|
+
entryFileNames: (chunkInfo) => `${rewriteNodeModules(chunkInfo.name)}.esm.js`,
|
|
156
|
+
chunkFileNames: `esm/[name]-[hash].esm.js`,
|
|
157
|
+
format: "module",
|
|
158
|
+
sourcemap: true,
|
|
159
|
+
preserveModules: true,
|
|
160
|
+
preserveModulesRoot: `${targetDir}/src`
|
|
161
|
+
});
|
|
162
|
+
mainFields.unshift("browser");
|
|
163
|
+
}
|
|
164
|
+
configs.push({
|
|
165
|
+
input: Object.fromEntries(
|
|
166
|
+
scriptEntryPoints.map((e) => [e.name, node_path.resolve(targetDir, e.path)])
|
|
167
|
+
),
|
|
168
|
+
output,
|
|
169
|
+
onwarn,
|
|
170
|
+
makeAbsoluteExternalsRelative: false,
|
|
171
|
+
preserveEntrySignatures: "strict",
|
|
172
|
+
// All module imports are always marked as external
|
|
173
|
+
external,
|
|
174
|
+
plugins: [
|
|
175
|
+
resolve__default.default({
|
|
176
|
+
mainFields,
|
|
177
|
+
extensions: SCRIPT_EXTS
|
|
178
|
+
}),
|
|
179
|
+
commonjs__default.default({
|
|
180
|
+
include: /node_modules/,
|
|
181
|
+
exclude: [/\/[^/]+\.(?:stories|test)\.[^/]+$/]
|
|
182
|
+
}),
|
|
183
|
+
postcss__default.default({
|
|
184
|
+
modules: {
|
|
185
|
+
generateScopedName(name, filename, css) {
|
|
186
|
+
const hash = node_crypto.createHash("md5").update(css).digest("hex").slice(0, 10);
|
|
187
|
+
const file = node_path.basename(filename, ".module.css");
|
|
188
|
+
return `${file}_${name}__${hash}`;
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
}),
|
|
192
|
+
plugins.forwardFileImports({
|
|
193
|
+
exclude: /\.icon\.svg$/,
|
|
194
|
+
include: [
|
|
195
|
+
/\.svg$/,
|
|
196
|
+
/\.png$/,
|
|
197
|
+
/\.gif$/,
|
|
198
|
+
/\.jpg$/,
|
|
199
|
+
/\.jpeg$/,
|
|
200
|
+
/\.webp$/,
|
|
201
|
+
/\.eot$/,
|
|
202
|
+
/\.woff$/,
|
|
203
|
+
/\.woff2$/,
|
|
204
|
+
/\.ttf$/,
|
|
205
|
+
/\.md$/
|
|
206
|
+
]
|
|
207
|
+
}),
|
|
208
|
+
json__default.default(),
|
|
209
|
+
yaml__default.default(),
|
|
210
|
+
esbuild__default.default({
|
|
211
|
+
target: "ES2023",
|
|
212
|
+
minify: options.minify
|
|
213
|
+
}),
|
|
214
|
+
plugins.cssEntryPoints({ entryPoints: entryPoints$1, targetDir })
|
|
215
|
+
]
|
|
216
|
+
});
|
|
217
|
+
}
|
|
218
|
+
if (options.outputs.has(types.Output.types)) {
|
|
219
|
+
const input = Object.fromEntries(
|
|
220
|
+
scriptEntryPoints.map((e) => [
|
|
221
|
+
e.name,
|
|
222
|
+
cliCommon.targetPaths.resolveRoot(
|
|
223
|
+
"dist-types",
|
|
224
|
+
node_path.relative(cliCommon.targetPaths.rootDir, targetDir),
|
|
225
|
+
e.path.replace(/\.(?:ts|tsx)$/, ".d.ts")
|
|
226
|
+
)
|
|
227
|
+
])
|
|
228
|
+
);
|
|
229
|
+
for (const path of Object.values(input)) {
|
|
230
|
+
const declarationsExist = await fs__default.default.pathExists(path);
|
|
231
|
+
if (!declarationsExist) {
|
|
232
|
+
const declarationPath = node_path.relative(targetDir, path);
|
|
233
|
+
throw new Error(
|
|
234
|
+
`No declaration files found at ${declarationPath}, be sure to run ${chalk__default.default.bgRed.white(
|
|
235
|
+
"yarn tsc"
|
|
236
|
+
)} to generate .d.ts files before packaging`
|
|
237
|
+
);
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
configs.push({
|
|
241
|
+
input,
|
|
242
|
+
output: {
|
|
243
|
+
dir: distDir,
|
|
244
|
+
entryFileNames: `[name].d.ts`,
|
|
245
|
+
chunkFileNames: `types/[name]-[hash].d.ts`,
|
|
246
|
+
format: "es"
|
|
247
|
+
},
|
|
248
|
+
external: (source, importer, isResolved) => /\.css|scss|sass|svg|eot|woff|woff2|ttf$/.test(source) || external(source, importer, isResolved),
|
|
249
|
+
onwarn,
|
|
250
|
+
plugins: [dts__default.default({ respectExternal: true })]
|
|
251
|
+
});
|
|
252
|
+
}
|
|
253
|
+
return configs;
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
exports.makeRollupConfigs = makeRollupConfigs;
|
|
257
|
+
//# sourceMappingURL=config.cjs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.cjs.js","sources":["../../../src/lib/builder/config.ts"],"sourcesContent":["/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport chalk from 'chalk';\nimport fs from 'fs-extra';\nimport { createHash } from 'node:crypto';\nimport {\n basename,\n extname,\n relative as relativePath,\n resolve as resolvePath,\n} from 'node:path';\nimport commonjs from '@rollup/plugin-commonjs';\nimport resolve from '@rollup/plugin-node-resolve';\nimport postcss from 'rollup-plugin-postcss';\nimport esbuild from 'rollup-plugin-esbuild';\nimport dts from 'rollup-plugin-dts';\nimport json from '@rollup/plugin-json';\nimport yaml from '@rollup/plugin-yaml';\nimport {\n RollupOptions,\n OutputOptions,\n WarningHandlerWithDefault,\n OutputPlugin,\n} from 'rollup';\n\nimport { forwardFileImports, cssEntryPoints } from './plugins';\nimport { BuildOptions, Output } from './types';\nimport { targetPaths } from '@backstage/cli-common';\n\nimport { BackstagePackageJson } from '@backstage/cli-node';\nimport { readEntryPoints } from '../entryPoints';\n\nconst SCRIPT_EXTS = ['.js', '.jsx', '.ts', '.tsx'];\n\nconst MODULE_EXTS = ['.mjs', '.mts'];\nconst COMMONJS_EXTS = ['.cjs', '.cts'];\nconst MOD_EXT = '.mjs';\nconst CJS_EXT = '.cjs';\nconst CJS_JS_EXT = '.cjs.js';\n\nfunction isFileImport(source: string) {\n if (source.startsWith('.')) {\n return true;\n }\n if (source.startsWith('/')) {\n return true;\n }\n if (source.match(/[a-z]:/i)) {\n return true;\n }\n return false;\n}\n\nfunction buildInternalImportPattern(options: BuildOptions) {\n const inlinedPackages = options.workspacePackages.filter(\n pkg => pkg.packageJson.backstage?.inline,\n );\n for (const { packageJson } of inlinedPackages) {\n if (!packageJson.private) {\n throw new Error(\n `Inlined package ${packageJson.name} must be marked as private`,\n );\n }\n }\n const names = inlinedPackages.map(pkg => pkg.packageJson.name);\n return new RegExp(`^(?:${names.join('|')})(?:$|/)`);\n}\n\n// This Rollup output plugin enables support for mixed CommonJS and ESM output.\n// It does it be filtering out the unwanted output files that don't match the\n// input file format, allowing the rollup configuration to have overlapping\n// output configurations for different formats.\nfunction multiOutputFormat(): OutputPlugin {\n return {\n name: 'backstage-multi-output-format',\n generateBundle(opts, bundle) {\n const filter: (name: string) => boolean =\n opts.format === 'cjs'\n ? s => s.endsWith(MOD_EXT)\n : s => !s.endsWith(MOD_EXT);\n\n // Delete any files that don't match the current output format\n for (const name in bundle) {\n if (filter(name)) {\n delete bundle[name];\n delete bundle[`${name}.map`];\n }\n }\n },\n renderDynamicImport(opts) {\n if (opts.format === 'cjs') {\n return {\n left: 'import(',\n right: ')',\n };\n }\n return undefined;\n },\n };\n}\n\nexport async function makeRollupConfigs(\n options: BuildOptions,\n): Promise<RollupOptions[]> {\n const configs = new Array<RollupOptions>();\n const targetDir = options.targetDir ?? targetPaths.dir;\n\n let targetPkg = options.packageJson;\n if (!targetPkg) {\n const packagePath = resolvePath(targetDir, 'package.json');\n targetPkg = (await fs.readJson(packagePath)) as BackstagePackageJson;\n }\n\n const onwarn: WarningHandlerWithDefault = ({ code, message }) => {\n if (code === 'EMPTY_BUNDLE') {\n return; // We don't care about this one\n }\n if (options.logPrefix) {\n console.log(options.logPrefix + message);\n } else {\n console.log(message);\n }\n };\n\n const distDir = resolvePath(targetDir, 'dist');\n const entryPoints = readEntryPoints(targetPkg);\n\n const scriptEntryPoints = entryPoints.filter(e =>\n SCRIPT_EXTS.includes(e.ext),\n );\n\n const internalImportPattern = buildInternalImportPattern(options);\n const external = (\n source: string,\n importer: string | undefined,\n isResolved: boolean,\n ) =>\n Boolean(\n importer &&\n !isResolved &&\n !internalImportPattern.test(source) &&\n !isFileImport(source),\n );\n\n if (options.outputs.has(Output.cjs) || options.outputs.has(Output.esm)) {\n const output = new Array<OutputOptions>();\n const mainFields = ['module', 'main'];\n\n // Avoid using node_modules as a directory name, since it's trimmed from published packages.\n // This can happen when inlining dependencies such as style-inject added for css injection.\n const rewriteNodeModules = (name: string) =>\n name.replaceAll('node_modules', 'node_modules_dist');\n\n // For CommonJS we build both CommonJS and ESM output. Each of these outputs\n // can output both .cjs and .mjs files. The files from each of these outputs\n // will overlap, but we trim away files where the format doesn't match the\n // file extensions. That way we are left with a combination of .cjs and .mjs\n // files where the module format in the file matches the file extension.\n if (options.outputs.has(Output.cjs)) {\n const defaultExt = targetPkg.type === 'module' ? MOD_EXT : CJS_JS_EXT;\n const outputOpts: OutputOptions = {\n dir: distDir,\n entryFileNames(chunkInfo) {\n const cleanName = rewriteNodeModules(chunkInfo.name);\n\n const inputId = chunkInfo.facadeModuleId;\n if (!inputId) {\n return cleanName + defaultExt;\n }\n\n const inputExt = extname(inputId);\n if (MODULE_EXTS.includes(inputExt)) {\n return cleanName + MOD_EXT;\n }\n if (COMMONJS_EXTS.includes(inputExt)) {\n return cleanName + CJS_EXT;\n }\n return cleanName + defaultExt;\n },\n sourcemap: true,\n preserveModules: true,\n preserveModulesRoot: `${targetDir}/src`,\n interop: 'compat',\n exports: 'named',\n plugins: [multiOutputFormat()],\n };\n\n output.push({\n ...outputOpts,\n format: 'cjs',\n });\n output.push({\n ...outputOpts,\n format: 'module',\n });\n }\n if (options.outputs.has(Output.esm)) {\n output.push({\n dir: distDir,\n entryFileNames: chunkInfo =>\n `${rewriteNodeModules(chunkInfo.name)}.esm.js`,\n chunkFileNames: `esm/[name]-[hash].esm.js`,\n format: 'module',\n sourcemap: true,\n preserveModules: true,\n preserveModulesRoot: `${targetDir}/src`,\n });\n // Assume we're building for the browser if ESM output is included\n mainFields.unshift('browser');\n }\n\n configs.push({\n input: Object.fromEntries(\n scriptEntryPoints.map(e => [e.name, resolvePath(targetDir, e.path)]),\n ),\n output,\n onwarn,\n makeAbsoluteExternalsRelative: false,\n preserveEntrySignatures: 'strict',\n // All module imports are always marked as external\n external,\n plugins: [\n resolve({\n mainFields,\n extensions: SCRIPT_EXTS,\n }),\n commonjs({\n include: /node_modules/,\n exclude: [/\\/[^/]+\\.(?:stories|test)\\.[^/]+$/],\n }),\n postcss({\n modules: {\n generateScopedName(name: string, filename: string, css: string) {\n const hash = createHash('md5')\n .update(css)\n .digest('hex')\n .slice(0, 10);\n const file = basename(filename, '.module.css');\n return `${file}_${name}__${hash}`;\n },\n },\n }),\n forwardFileImports({\n exclude: /\\.icon\\.svg$/,\n include: [\n /\\.svg$/,\n /\\.png$/,\n /\\.gif$/,\n /\\.jpg$/,\n /\\.jpeg$/,\n /\\.webp$/,\n /\\.eot$/,\n /\\.woff$/,\n /\\.woff2$/,\n /\\.ttf$/,\n /\\.md$/,\n ],\n }),\n json(),\n yaml(),\n esbuild({\n target: 'ES2023',\n minify: options.minify,\n }),\n cssEntryPoints({ entryPoints, targetDir }),\n ],\n });\n }\n\n if (options.outputs.has(Output.types)) {\n const input = Object.fromEntries(\n scriptEntryPoints.map(e => [\n e.name,\n targetPaths.resolveRoot(\n 'dist-types',\n relativePath(targetPaths.rootDir, targetDir),\n e.path.replace(/\\.(?:ts|tsx)$/, '.d.ts'),\n ),\n ]),\n );\n\n for (const path of Object.values(input)) {\n const declarationsExist = await fs.pathExists(path);\n if (!declarationsExist) {\n const declarationPath = relativePath(targetDir, path);\n throw new Error(\n `No declaration files found at ${declarationPath}, be sure to run ${chalk.bgRed.white(\n 'yarn tsc',\n )} to generate .d.ts files before packaging`,\n );\n }\n }\n\n configs.push({\n input,\n output: {\n dir: distDir,\n entryFileNames: `[name].d.ts`,\n chunkFileNames: `types/[name]-[hash].d.ts`,\n format: 'es',\n },\n external: (source, importer, isResolved) =>\n /\\.css|scss|sass|svg|eot|woff|woff2|ttf$/.test(source) ||\n external(source, importer, isResolved),\n onwarn,\n plugins: [dts({ respectExternal: true })],\n });\n }\n\n return configs;\n}\n"],"names":["targetPaths","resolvePath","fs","entryPoints","readEntryPoints","Output","extname","resolve","commonjs","postcss","createHash","basename","forwardFileImports","json","yaml","esbuild","cssEntryPoints","relativePath","chalk","dts"],"mappings":"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"}
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var fs = require('fs-extra');
|
|
4
|
+
var rollup = require('rollup');
|
|
5
|
+
var chalk = require('chalk');
|
|
6
|
+
var node_path = require('node:path');
|
|
7
|
+
var cliCommon = require('@backstage/cli-common');
|
|
8
|
+
var config = require('./config.cjs.js');
|
|
9
|
+
var types = require('./types.cjs.js');
|
|
10
|
+
var cliNode = require('@backstage/cli-node');
|
|
11
|
+
|
|
12
|
+
function _interopDefaultCompat (e) { return e && typeof e === 'object' && 'default' in e ? e : { default: e }; }
|
|
13
|
+
|
|
14
|
+
var fs__default = /*#__PURE__*/_interopDefaultCompat(fs);
|
|
15
|
+
var chalk__default = /*#__PURE__*/_interopDefaultCompat(chalk);
|
|
16
|
+
|
|
17
|
+
function formatErrorMessage(error) {
|
|
18
|
+
let msg = "";
|
|
19
|
+
if (error.code === "PLUGIN_ERROR") {
|
|
20
|
+
if (error.plugin === "esbuild") {
|
|
21
|
+
msg += `${error.message}`;
|
|
22
|
+
if (error.errors?.length) {
|
|
23
|
+
msg += `
|
|
24
|
+
|
|
25
|
+
`;
|
|
26
|
+
for (const { text, location } of error.errors) {
|
|
27
|
+
const { line, column } = location;
|
|
28
|
+
const path = node_path.relative(cliCommon.targetPaths.dir, error.id);
|
|
29
|
+
const loc = chalk__default.default.cyan(`${path}:${line}:${column}`);
|
|
30
|
+
if (text === 'Unexpected "<"' && error.id.endsWith(".js")) {
|
|
31
|
+
msg += `${loc}: ${text}, JavaScript files with JSX should use a .jsx extension`;
|
|
32
|
+
} else {
|
|
33
|
+
msg += `${loc}: ${text}`;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
} else {
|
|
38
|
+
msg += `(plugin ${error.plugin}) ${error}
|
|
39
|
+
`;
|
|
40
|
+
}
|
|
41
|
+
} else {
|
|
42
|
+
if (error.loc) {
|
|
43
|
+
const file = `${cliCommon.targetPaths.resolve(error.loc.file || error.id)}`;
|
|
44
|
+
const pos = `${error.loc.line}:${error.loc.column}`;
|
|
45
|
+
msg += `${file} [${pos}]
|
|
46
|
+
`;
|
|
47
|
+
} else if (error.id) {
|
|
48
|
+
msg += `${cliCommon.targetPaths.resolve(error.id)}
|
|
49
|
+
`;
|
|
50
|
+
}
|
|
51
|
+
msg += `${error}
|
|
52
|
+
`;
|
|
53
|
+
if (error.url) {
|
|
54
|
+
msg += `${chalk__default.default.cyan(error.url)}
|
|
55
|
+
`;
|
|
56
|
+
}
|
|
57
|
+
if (error.frame) {
|
|
58
|
+
msg += `${chalk__default.default.dim(error.frame)}
|
|
59
|
+
`;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
return msg;
|
|
63
|
+
}
|
|
64
|
+
async function rollupBuild(config) {
|
|
65
|
+
try {
|
|
66
|
+
const bundle = await rollup.rollup(config);
|
|
67
|
+
if (config.output) {
|
|
68
|
+
for (const output of [config.output].flat()) {
|
|
69
|
+
await bundle.generate(output);
|
|
70
|
+
await bundle.write(output);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
} catch (error) {
|
|
74
|
+
throw new Error(formatErrorMessage(error));
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
const buildPackage = async (options) => {
|
|
78
|
+
try {
|
|
79
|
+
const { resolutions } = await fs__default.default.readJson(
|
|
80
|
+
cliCommon.targetPaths.resolveRoot("package.json")
|
|
81
|
+
);
|
|
82
|
+
if (resolutions?.esbuild) {
|
|
83
|
+
console.warn(
|
|
84
|
+
chalk__default.default.red(
|
|
85
|
+
'Your root package.json contains a "resolutions" entry for "esbuild". This was included in older @backstage/create-app templates in order to work around build issues that have since been fixed. Please remove the entry and run `yarn install`'
|
|
86
|
+
)
|
|
87
|
+
);
|
|
88
|
+
}
|
|
89
|
+
} catch {
|
|
90
|
+
}
|
|
91
|
+
const rollupConfigs = await config.makeRollupConfigs(options);
|
|
92
|
+
const targetDir = options.targetDir ?? cliCommon.targetPaths.dir;
|
|
93
|
+
await fs__default.default.remove(node_path.resolve(targetDir, "dist"));
|
|
94
|
+
const buildTasks = rollupConfigs.map(rollupBuild);
|
|
95
|
+
await Promise.all(buildTasks);
|
|
96
|
+
};
|
|
97
|
+
const buildPackages = async (options) => {
|
|
98
|
+
if (options.some((opt) => !opt.targetDir)) {
|
|
99
|
+
throw new Error("targetDir must be set for all build options");
|
|
100
|
+
}
|
|
101
|
+
const rollupConfigs = await Promise.all(options.map(config.makeRollupConfigs));
|
|
102
|
+
await Promise.all(
|
|
103
|
+
options.map(({ targetDir }) => fs__default.default.remove(node_path.resolve(targetDir, "dist")))
|
|
104
|
+
);
|
|
105
|
+
const buildTasks = rollupConfigs.flat().map((opts) => () => rollupBuild(opts));
|
|
106
|
+
await cliNode.runConcurrentTasks({
|
|
107
|
+
items: buildTasks,
|
|
108
|
+
worker: async (task) => task()
|
|
109
|
+
});
|
|
110
|
+
};
|
|
111
|
+
function getOutputsForRole(role) {
|
|
112
|
+
const outputs = /* @__PURE__ */ new Set();
|
|
113
|
+
for (const output of cliNode.PackageRoles.getRoleInfo(role).output) {
|
|
114
|
+
if (output === "cjs") {
|
|
115
|
+
outputs.add(types.Output.cjs);
|
|
116
|
+
}
|
|
117
|
+
if (output === "esm") {
|
|
118
|
+
outputs.add(types.Output.esm);
|
|
119
|
+
}
|
|
120
|
+
if (output === "types") {
|
|
121
|
+
outputs.add(types.Output.types);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
return outputs;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
exports.buildPackage = buildPackage;
|
|
128
|
+
exports.buildPackages = buildPackages;
|
|
129
|
+
exports.formatErrorMessage = formatErrorMessage;
|
|
130
|
+
exports.getOutputsForRole = getOutputsForRole;
|
|
131
|
+
//# sourceMappingURL=packager.cjs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"packager.cjs.js","sources":["../../../src/lib/builder/packager.ts"],"sourcesContent":["/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport fs from 'fs-extra';\nimport { rollup, RollupOptions } from 'rollup';\nimport chalk from 'chalk';\nimport { relative as relativePath, resolve as resolvePath } from 'node:path';\nimport { targetPaths } from '@backstage/cli-common';\n\nimport { makeRollupConfigs } from './config';\nimport { BuildOptions, Output } from './types';\nimport { PackageRoles, runConcurrentTasks } from '@backstage/cli-node';\n\nexport function formatErrorMessage(error: any) {\n let msg = '';\n\n if (error.code === 'PLUGIN_ERROR') {\n if (error.plugin === 'esbuild') {\n msg += `${error.message}`;\n if (error.errors?.length) {\n msg += `\\n\\n`;\n for (const { text, location } of error.errors) {\n const { line, column } = location;\n const path = relativePath(targetPaths.dir, error.id);\n const loc = chalk.cyan(`${path}:${line}:${column}`);\n\n if (text === 'Unexpected \"<\"' && error.id.endsWith('.js')) {\n msg += `${loc}: ${text}, JavaScript files with JSX should use a .jsx extension`;\n } else {\n msg += `${loc}: ${text}`;\n }\n }\n }\n } else {\n // Log which plugin is causing errors to make it easier to identity.\n // If we see these in logs we likely want to provide some custom error\n // output for those plugins too.\n msg += `(plugin ${error.plugin}) ${error}\\n`;\n }\n } else {\n // Generic rollup errors, log what's available\n if (error.loc) {\n const file = `${targetPaths.resolve((error.loc.file || error.id)!)}`;\n const pos = `${error.loc.line}:${error.loc.column}`;\n msg += `${file} [${pos}]\\n`;\n } else if (error.id) {\n msg += `${targetPaths.resolve(error.id)}\\n`;\n }\n\n msg += `${error}\\n`;\n\n if (error.url) {\n msg += `${chalk.cyan(error.url)}\\n`;\n }\n\n if (error.frame) {\n msg += `${chalk.dim(error.frame)}\\n`;\n }\n }\n return msg;\n}\n\nasync function rollupBuild(config: RollupOptions) {\n try {\n const bundle = await rollup(config);\n if (config.output) {\n for (const output of [config.output].flat()) {\n await bundle.generate(output);\n await bundle.write(output);\n }\n }\n } catch (error) {\n throw new Error(formatErrorMessage(error));\n }\n}\n\nexport const buildPackage = async (options: BuildOptions) => {\n try {\n const { resolutions } = await fs.readJson(\n targetPaths.resolveRoot('package.json'),\n );\n if (resolutions?.esbuild) {\n console.warn(\n chalk.red(\n 'Your root package.json contains a \"resolutions\" entry for \"esbuild\". This was ' +\n 'included in older @backstage/create-app templates in order to work around build ' +\n 'issues that have since been fixed. Please remove the entry and run `yarn install`',\n ),\n );\n }\n } catch {\n /* Errors ignored, this is just a warning */\n }\n\n const rollupConfigs = await makeRollupConfigs(options);\n\n const targetDir = options.targetDir ?? targetPaths.dir;\n await fs.remove(resolvePath(targetDir, 'dist'));\n\n const buildTasks = rollupConfigs.map(rollupBuild);\n\n await Promise.all(buildTasks);\n};\n\nexport const buildPackages = async (options: BuildOptions[]) => {\n if (options.some(opt => !opt.targetDir)) {\n throw new Error('targetDir must be set for all build options');\n }\n const rollupConfigs = await Promise.all(options.map(makeRollupConfigs));\n\n await Promise.all(\n options.map(({ targetDir }) => fs.remove(resolvePath(targetDir!, 'dist'))),\n );\n\n const buildTasks = rollupConfigs.flat().map(opts => () => rollupBuild(opts));\n\n await runConcurrentTasks({\n items: buildTasks,\n worker: async task => task(),\n });\n};\n\nexport function getOutputsForRole(role: string): Set<Output> {\n const outputs = new Set<Output>();\n\n for (const output of PackageRoles.getRoleInfo(role).output) {\n if (output === 'cjs') {\n outputs.add(Output.cjs);\n }\n if (output === 'esm') {\n outputs.add(Output.esm);\n }\n if (output === 'types') {\n outputs.add(Output.types);\n }\n }\n\n return outputs;\n}\n"],"names":["relativePath","targetPaths","chalk","rollup","fs","makeRollupConfigs","resolvePath","runConcurrentTasks","PackageRoles","Output"],"mappings":"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"}
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var fs = require('fs-extra');
|
|
4
|
+
var postcss = require('postcss');
|
|
5
|
+
var postcssImport = require('postcss-import');
|
|
6
|
+
var node_path = require('node:path');
|
|
7
|
+
var rollupPluginutils = require('rollup-pluginutils');
|
|
8
|
+
|
|
9
|
+
function _interopDefaultCompat (e) { return e && typeof e === 'object' && 'default' in e ? e : { default: e }; }
|
|
10
|
+
|
|
11
|
+
var fs__default = /*#__PURE__*/_interopDefaultCompat(fs);
|
|
12
|
+
var postcss__default = /*#__PURE__*/_interopDefaultCompat(postcss);
|
|
13
|
+
var postcssImport__default = /*#__PURE__*/_interopDefaultCompat(postcssImport);
|
|
14
|
+
|
|
15
|
+
function forwardFileImports(options) {
|
|
16
|
+
const filter = rollupPluginutils.createFilter(options.include, options.exclude);
|
|
17
|
+
const exportedFiles = /* @__PURE__ */ new Set();
|
|
18
|
+
const generatedFor = /* @__PURE__ */ new Set();
|
|
19
|
+
return {
|
|
20
|
+
name: "forward-file-imports",
|
|
21
|
+
async generateBundle(outputOptions, bundle, isWrite) {
|
|
22
|
+
if (!isWrite) {
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
const dir = outputOptions.dir || node_path.dirname(outputOptions.file);
|
|
26
|
+
if (generatedFor.has(dir)) {
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
for (const output of Object.values(bundle)) {
|
|
30
|
+
if (output.type !== "chunk") {
|
|
31
|
+
continue;
|
|
32
|
+
}
|
|
33
|
+
const chunk = output;
|
|
34
|
+
if (!chunk.facadeModuleId) {
|
|
35
|
+
continue;
|
|
36
|
+
}
|
|
37
|
+
generatedFor.add(dir);
|
|
38
|
+
const srcRoot = node_path.dirname(chunk.facadeModuleId);
|
|
39
|
+
await Promise.all(
|
|
40
|
+
Array.from(exportedFiles).map(async (exportedFile) => {
|
|
41
|
+
const outputPath = node_path.relative(srcRoot, exportedFile);
|
|
42
|
+
const targetFile = node_path.resolve(dir, outputPath);
|
|
43
|
+
await fs__default.default.ensureDir(node_path.dirname(targetFile));
|
|
44
|
+
await fs__default.default.copyFile(exportedFile, targetFile);
|
|
45
|
+
})
|
|
46
|
+
);
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
},
|
|
50
|
+
options(inputOptions) {
|
|
51
|
+
const treeshake = inputOptions.treeshake;
|
|
52
|
+
if (treeshake !== void 0 && typeof treeshake !== "object") {
|
|
53
|
+
throw new Error(
|
|
54
|
+
"Expected treeshake input config to be an object or not set"
|
|
55
|
+
);
|
|
56
|
+
}
|
|
57
|
+
if (treeshake?.moduleSideEffects) {
|
|
58
|
+
throw new Error("treeshake.moduleSideEffects must not be set");
|
|
59
|
+
}
|
|
60
|
+
const moduleSideEffects = (id) => {
|
|
61
|
+
if (filter(id)) {
|
|
62
|
+
return false;
|
|
63
|
+
}
|
|
64
|
+
return true;
|
|
65
|
+
};
|
|
66
|
+
const origExternal = inputOptions.external;
|
|
67
|
+
const external = (id, importer, isResolved) => {
|
|
68
|
+
if (typeof origExternal === "function" && origExternal(id, importer, isResolved)) {
|
|
69
|
+
return true;
|
|
70
|
+
}
|
|
71
|
+
if (Array.isArray(origExternal) && origExternal.includes(id)) {
|
|
72
|
+
return true;
|
|
73
|
+
}
|
|
74
|
+
if (!filter(id)) {
|
|
75
|
+
return false;
|
|
76
|
+
}
|
|
77
|
+
if (!importer) {
|
|
78
|
+
throw new Error(`Unknown importer of file module ${id}`);
|
|
79
|
+
}
|
|
80
|
+
const fullId = isResolved ? id : node_path.resolve(node_path.dirname(importer), id);
|
|
81
|
+
exportedFiles.add(fullId);
|
|
82
|
+
return true;
|
|
83
|
+
};
|
|
84
|
+
return {
|
|
85
|
+
...inputOptions,
|
|
86
|
+
external,
|
|
87
|
+
treeshake: { ...treeshake, moduleSideEffects }
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
function cssEntryPoints(options) {
|
|
93
|
+
const cssEntries = options.entryPoints.filter((ep) => ep.ext === ".css");
|
|
94
|
+
const generatedFor = /* @__PURE__ */ new Set();
|
|
95
|
+
return {
|
|
96
|
+
name: "backstage-css-entry-points",
|
|
97
|
+
async generateBundle(outputOptions, _bundle, isWrite) {
|
|
98
|
+
if (!isWrite) {
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
const dir = outputOptions.dir || node_path.dirname(outputOptions.file);
|
|
102
|
+
if (generatedFor.has(dir)) {
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
105
|
+
generatedFor.add(dir);
|
|
106
|
+
for (const entryPoint of cssEntries) {
|
|
107
|
+
const sourcePath = node_path.resolve(options.targetDir, entryPoint.path);
|
|
108
|
+
const outputPath = entryPoint.path.replace(/^(\.\/)?src\//, "");
|
|
109
|
+
const source = await fs__default.default.readFile(sourcePath, "utf8");
|
|
110
|
+
const result = await postcss__default.default([postcssImport__default.default()]).process(source, {
|
|
111
|
+
from: sourcePath
|
|
112
|
+
});
|
|
113
|
+
this.emitFile({
|
|
114
|
+
type: "asset",
|
|
115
|
+
fileName: outputPath,
|
|
116
|
+
source: result.css
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
exports.cssEntryPoints = cssEntryPoints;
|
|
124
|
+
exports.forwardFileImports = forwardFileImports;
|
|
125
|
+
//# sourceMappingURL=plugins.cjs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugins.cjs.js","sources":["../../../src/lib/builder/plugins.ts"],"sourcesContent":["/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport fs from 'fs-extra';\nimport postcss from 'postcss';\nimport postcssImport from 'postcss-import';\nimport {\n dirname,\n resolve as resolvePath,\n relative as relativePath,\n} from 'node:path';\nimport { createFilter } from 'rollup-pluginutils';\nimport {\n Plugin,\n InputOptions,\n OutputChunk,\n HasModuleSideEffects,\n} from 'rollup';\nimport { EntryPoint } from '../entryPoints';\n\ntype ForwardFileImportsOptions = {\n include: Array<string | RegExp> | string | RegExp | null;\n exclude?: Array<string | RegExp> | string | RegExp | null;\n};\n\n/**\n * This rollup plugin leaves all encountered asset imports as-is, but\n * copies the imported files into the output directory.\n *\n * For example `import ImageUrl from './my-image.png'` inside `src/MyComponent` will\n * cause `src/MyComponent/my-image.png` to be copied to the output directory at the\n * path `dist/MyComponent/my-image.png`. The import itself will stay, but be resolved,\n * resulting in something like `import ImageUrl from './MyComponent/my-image.png'`\n */\nexport function forwardFileImports(options: ForwardFileImportsOptions) {\n const filter = createFilter(options.include, options.exclude);\n\n // We collect the absolute paths to all files we want to bundle into the\n // output dir here. Resolving to relative paths in the output dir happens later.\n const exportedFiles = new Set<string>();\n\n // We keep track of output directories that we've already copied files\n // into, so that we don't duplicate that work\n const generatedFor = new Set<string>();\n\n return {\n name: 'forward-file-imports',\n async generateBundle(outputOptions, bundle, isWrite) {\n if (!isWrite) {\n return;\n }\n\n const dir = outputOptions.dir || dirname(outputOptions.file!);\n if (generatedFor.has(dir)) {\n return;\n }\n\n for (const output of Object.values(bundle)) {\n if (output.type !== 'chunk') {\n continue;\n }\n const chunk = output as OutputChunk;\n\n // This'll be an absolute path pointing to the initial index file of the\n // build, and we use it to find the location of the `src` dir\n if (!chunk.facadeModuleId) {\n continue;\n }\n generatedFor.add(dir);\n\n // We're assuming that the index file is at the root of the source dir, and\n // that all assets exist within that dir.\n const srcRoot = dirname(chunk.facadeModuleId);\n\n // Copy all the files we found into the dist dir\n await Promise.all(\n Array.from(exportedFiles).map(async exportedFile => {\n const outputPath = relativePath(srcRoot, exportedFile);\n const targetFile = resolvePath(dir, outputPath);\n\n await fs.ensureDir(dirname(targetFile));\n await fs.copyFile(exportedFile, targetFile);\n }),\n );\n return;\n }\n },\n options(inputOptions) {\n // We're in control of the config ourselves, so these are just checks to\n // make sure we don't update the config but forget about the config\n // overrides here\n const treeshake = inputOptions.treeshake;\n if (treeshake !== undefined && typeof treeshake !== 'object') {\n throw new Error(\n 'Expected treeshake input config to be an object or not set',\n );\n }\n if (treeshake?.moduleSideEffects) {\n throw new Error('treeshake.moduleSideEffects must not be set');\n }\n\n // All external assets are treated as being side-effect free.\n //\n // This also works around an apparent bug in rollup where the\n // `makeAbsoluteExternalsRelative: false` option sometimes caused relative\n // asset paths to be rewritten with an incorrect path. They are rewritten\n // in the first place because they are being treated as external by this\n // plugin, but that seems to be the best way to handle asset files.\n const moduleSideEffects: HasModuleSideEffects = id => {\n if (filter(id)) {\n return false;\n }\n return true;\n };\n\n const origExternal = inputOptions.external;\n\n // We decorate any existing `external` option with our own way of determining\n // if a module should be external. The can't use `resolveId`, since asset files\n // aren't passed there, might be some better way to do this though.\n const external: InputOptions['external'] = (id, importer, isResolved) => {\n // Call to inner external option\n if (\n typeof origExternal === 'function' &&\n origExternal(id, importer, isResolved)\n ) {\n return true;\n }\n\n if (Array.isArray(origExternal) && origExternal.includes(id)) {\n return true;\n }\n\n // The piece that we're adding\n if (!filter(id)) {\n return false;\n }\n\n // Confidence check, dunno if this can happen\n if (!importer) {\n throw new Error(`Unknown importer of file module ${id}`);\n }\n\n // Resolve relative imports to the full file URL, for deduping and copying later\n const fullId = isResolved ? id : resolvePath(dirname(importer), id);\n exportedFiles.add(fullId);\n\n // Treating this module as external from here, meaning rollup won't try to\n // put it in the output bundle, but still keep track of the relative imports\n // as needed in the output code.\n return true;\n };\n\n return {\n ...inputOptions,\n external,\n treeshake: { ...treeshake, moduleSideEffects },\n };\n },\n } satisfies Plugin;\n}\n\ninterface CssEntryPointsOptions {\n entryPoints: EntryPoint[];\n targetDir: string;\n}\n\n/**\n * Rollup plugin that bundles CSS entry points using postcss-import.\n * CSS files declared in package.json exports are processed and emitted\n * as part of the Rollup bundle.\n */\nexport function cssEntryPoints(options: CssEntryPointsOptions): Plugin {\n const cssEntries = options.entryPoints.filter(ep => ep.ext === '.css');\n\n // Track output directories we've already emitted CSS to, to avoid duplicates\n // when Rollup runs generateBundle multiple times (once per output format)\n const generatedFor = new Set<string>();\n\n return {\n name: 'backstage-css-entry-points',\n\n async generateBundle(outputOptions, _bundle, isWrite) {\n if (!isWrite) {\n return;\n }\n\n const dir = outputOptions.dir || dirname(outputOptions.file!);\n if (generatedFor.has(dir)) {\n return;\n }\n generatedFor.add(dir);\n\n for (const entryPoint of cssEntries) {\n const sourcePath = resolvePath(options.targetDir, entryPoint.path);\n // Strip the src/ prefix to create an output filename relative to the Rollup output directory\n const outputPath = entryPoint.path.replace(/^(\\.\\/)?src\\//, '');\n\n // Read source CSS\n const source = await fs.readFile(sourcePath, 'utf8');\n\n // Bundle @import statements using postcss-import\n const result = await postcss([postcssImport()]).process(source, {\n from: sourcePath,\n });\n\n // Emit the bundled CSS as an asset\n this.emitFile({\n type: 'asset',\n fileName: outputPath,\n source: result.css,\n });\n }\n },\n };\n}\n"],"names":["createFilter","dirname","relativePath","resolvePath","fs","postcss","postcssImport"],"mappings":"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"}
|