@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 @@
|
|
|
1
|
+
{"version":3,"file":"types.cjs.js","sources":["../../../src/lib/builder/types.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/* We want to maintain the same information as an enum, so we disable the redeclaration warning */\n/* eslint-disable @typescript-eslint/no-redeclare */\n\nimport { BackstagePackage, BackstagePackageJson } from '@backstage/cli-node';\n\nexport const Output = {\n esm: 0,\n cjs: 1,\n types: 2,\n} as const;\n\n/**\n * @public\n */\nexport type Output = (typeof Output)[keyof typeof Output];\n\n/**\n * @public\n */\nexport namespace Output {\n export type esm = typeof Output.esm;\n export type cjs = typeof Output.cjs;\n export type types = typeof Output.types;\n}\n\nexport type BuildOptions = {\n logPrefix?: string;\n targetDir?: string;\n packageJson?: BackstagePackageJson;\n outputs: Set<Output>;\n minify?: boolean;\n workspacePackages: BackstagePackage[];\n};\n"],"names":[],"mappings":";;AAoBO,MAAM,MAAA,GAAS;AAAA,EACpB,GAAA,EAAK,CAAA;AAAA,EACL,GAAA,EAAK,CAAA;AAAA,EACL,KAAA,EAAO;AACT;;;;"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var HtmlWebpackPlugin = require('html-webpack-plugin');
|
|
4
|
+
|
|
5
|
+
function _interopDefaultCompat (e) { return e && typeof e === 'object' && 'default' in e ? e : { default: e }; }
|
|
6
|
+
|
|
7
|
+
var HtmlWebpackPlugin__default = /*#__PURE__*/_interopDefaultCompat(HtmlWebpackPlugin);
|
|
8
|
+
|
|
9
|
+
class ConfigInjectingHtmlWebpackPlugin extends HtmlWebpackPlugin__default.default {
|
|
10
|
+
name = "ConfigInjectingHtmlWebpackPlugin";
|
|
11
|
+
#getFrontendAppConfigs;
|
|
12
|
+
constructor(options, getFrontendAppConfigs) {
|
|
13
|
+
super(options);
|
|
14
|
+
this.#getFrontendAppConfigs = getFrontendAppConfigs;
|
|
15
|
+
}
|
|
16
|
+
apply = (compiler) => {
|
|
17
|
+
super.apply(compiler);
|
|
18
|
+
compiler.hooks.compilation.tap(this.name, (compilation) => {
|
|
19
|
+
const hooks = HtmlWebpackPlugin__default.default.getCompilationHooks(compilation);
|
|
20
|
+
hooks.alterAssetTagGroups.tap(this.name, (ctx) => {
|
|
21
|
+
if (ctx.plugin !== this) {
|
|
22
|
+
return ctx;
|
|
23
|
+
}
|
|
24
|
+
return {
|
|
25
|
+
...ctx,
|
|
26
|
+
headTags: [
|
|
27
|
+
...ctx.headTags,
|
|
28
|
+
HtmlWebpackPlugin__default.default.createHtmlTagObject(
|
|
29
|
+
"script",
|
|
30
|
+
{ type: "backstage.io/config" },
|
|
31
|
+
`
|
|
32
|
+
${JSON.stringify(this.#getFrontendAppConfigs(), null, 2)}
|
|
33
|
+
`
|
|
34
|
+
)
|
|
35
|
+
]
|
|
36
|
+
};
|
|
37
|
+
});
|
|
38
|
+
});
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
exports.ConfigInjectingHtmlWebpackPlugin = ConfigInjectingHtmlWebpackPlugin;
|
|
43
|
+
//# sourceMappingURL=ConfigInjectingHtmlWebpackPlugin.cjs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ConfigInjectingHtmlWebpackPlugin.cjs.js","sources":["../../../src/lib/bundler/ConfigInjectingHtmlWebpackPlugin.ts"],"sourcesContent":["/*\n * Copyright 2024 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 { AppConfig } from '@backstage/config';\nimport HtmlWebpackPlugin from 'html-webpack-plugin';\n\nexport class ConfigInjectingHtmlWebpackPlugin extends HtmlWebpackPlugin {\n readonly name = 'ConfigInjectingHtmlWebpackPlugin';\n readonly #getFrontendAppConfigs: () => AppConfig[];\n\n constructor(\n options: HtmlWebpackPlugin.Options,\n getFrontendAppConfigs: () => AppConfig[],\n ) {\n super(options);\n this.#getFrontendAppConfigs = getFrontendAppConfigs;\n }\n\n apply: HtmlWebpackPlugin['apply'] = compiler => {\n super.apply(compiler);\n\n compiler.hooks.compilation.tap(this.name, compilation => {\n const hooks = HtmlWebpackPlugin.getCompilationHooks(compilation);\n hooks.alterAssetTagGroups.tap(this.name, ctx => {\n if (ctx.plugin !== this) {\n return ctx;\n }\n return {\n ...ctx,\n headTags: [\n ...ctx.headTags,\n HtmlWebpackPlugin.createHtmlTagObject(\n 'script',\n { type: 'backstage.io/config' },\n `\\n${JSON.stringify(this.#getFrontendAppConfigs(), null, 2)}\\n`,\n ),\n ],\n };\n });\n });\n };\n}\n"],"names":["HtmlWebpackPlugin"],"mappings":";;;;;;;;AAmBO,MAAM,yCAAyCA,kCAAA,CAAkB;AAAA,EAC7D,IAAA,GAAO,kCAAA;AAAA,EACP,sBAAA;AAAA,EAET,WAAA,CACE,SACA,qBAAA,EACA;AACA,IAAA,KAAA,CAAM,OAAO,CAAA;AACb,IAAA,IAAA,CAAK,sBAAA,GAAyB,qBAAA;AAAA,EAChC;AAAA,EAEA,QAAoC,CAAA,QAAA,KAAY;AAC9C,IAAA,KAAA,CAAM,MAAM,QAAQ,CAAA;AAEpB,IAAA,QAAA,CAAS,KAAA,CAAM,WAAA,CAAY,GAAA,CAAI,IAAA,CAAK,MAAM,CAAA,WAAA,KAAe;AACvD,MAAA,MAAM,KAAA,GAAQA,kCAAA,CAAkB,mBAAA,CAAoB,WAAW,CAAA;AAC/D,MAAA,KAAA,CAAM,mBAAA,CAAoB,GAAA,CAAI,IAAA,CAAK,IAAA,EAAM,CAAA,GAAA,KAAO;AAC9C,QAAA,IAAI,GAAA,CAAI,WAAW,IAAA,EAAM;AACvB,UAAA,OAAO,GAAA;AAAA,QACT;AACA,QAAA,OAAO;AAAA,UACL,GAAG,GAAA;AAAA,UACH,QAAA,EAAU;AAAA,YACR,GAAG,GAAA,CAAI,QAAA;AAAA,YACPA,kCAAA,CAAkB,mBAAA;AAAA,cAChB,QAAA;AAAA,cACA,EAAE,MAAM,qBAAA,EAAsB;AAAA,cAC9B;AAAA,EAAK,KAAK,SAAA,CAAU,IAAA,CAAK,wBAAuB,EAAG,IAAA,EAAM,CAAC,CAAC;AAAA;AAAA;AAC7D;AACF,SACF;AAAA,MACF,CAAC,CAAA;AAAA,IACH,CAAC,CAAA;AAAA,EACH,CAAA;AACF;;;;"}
|
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var yn = require('yn');
|
|
4
|
+
var fs = require('fs-extra');
|
|
5
|
+
var node_path = require('node:path');
|
|
6
|
+
var core = require('@rspack/core');
|
|
7
|
+
var FileSizeReporter = require('react-dev-utils/FileSizeReporter');
|
|
8
|
+
var formatWebpackMessages = require('react-dev-utils/formatWebpackMessages');
|
|
9
|
+
var config = require('./config.cjs.js');
|
|
10
|
+
var paths = require('./paths.cjs.js');
|
|
11
|
+
var chalk = require('chalk');
|
|
12
|
+
var packageDetection = require('./packageDetection.cjs.js');
|
|
13
|
+
var moduleFederation = require('./moduleFederation.cjs.js');
|
|
14
|
+
|
|
15
|
+
function _interopDefaultCompat (e) { return e && typeof e === 'object' && 'default' in e ? e : { default: e }; }
|
|
16
|
+
|
|
17
|
+
var yn__default = /*#__PURE__*/_interopDefaultCompat(yn);
|
|
18
|
+
var fs__default = /*#__PURE__*/_interopDefaultCompat(fs);
|
|
19
|
+
var formatWebpackMessages__default = /*#__PURE__*/_interopDefaultCompat(formatWebpackMessages);
|
|
20
|
+
var chalk__default = /*#__PURE__*/_interopDefaultCompat(chalk);
|
|
21
|
+
|
|
22
|
+
const WARN_AFTER_BUNDLE_GZIP_SIZE = 512 * 1024;
|
|
23
|
+
const WARN_AFTER_CHUNK_GZIP_SIZE = 1024 * 1024;
|
|
24
|
+
function applyContextToError(error, moduleName) {
|
|
25
|
+
return `Failed to compile '${moduleName}':
|
|
26
|
+
${error}`;
|
|
27
|
+
}
|
|
28
|
+
async function buildBundle(options) {
|
|
29
|
+
const { statsJsonEnabled, schema: configSchema, webpack } = options;
|
|
30
|
+
const paths$1 = paths.resolveBundlingPaths(options);
|
|
31
|
+
const publicPaths = await paths.resolveOptionalBundlingPaths({
|
|
32
|
+
targetDir: options.targetDir,
|
|
33
|
+
entry: "src/index-public-experimental",
|
|
34
|
+
dist: "dist/public"
|
|
35
|
+
});
|
|
36
|
+
const commonConfigOptions = {
|
|
37
|
+
...options,
|
|
38
|
+
checksEnabled: false,
|
|
39
|
+
isDev: false,
|
|
40
|
+
getFrontendAppConfigs: () => options.frontendAppConfigs
|
|
41
|
+
};
|
|
42
|
+
const configs = [];
|
|
43
|
+
if (options.moduleFederationRemote) {
|
|
44
|
+
configs.push(await config.createConfig(paths$1, commonConfigOptions));
|
|
45
|
+
} else {
|
|
46
|
+
const detectedModulesEntryPoint = await packageDetection.createDetectedModulesEntryPoint({
|
|
47
|
+
config: options.fullConfig,
|
|
48
|
+
targetPath: paths$1.targetPath
|
|
49
|
+
});
|
|
50
|
+
const moduleFederationSharedDependenciesEntryPoint = await moduleFederation.createRuntimeSharedDependenciesEntryPoint({
|
|
51
|
+
targetPath: paths$1.targetPath
|
|
52
|
+
});
|
|
53
|
+
configs.push(
|
|
54
|
+
await config.createConfig(paths$1, {
|
|
55
|
+
...commonConfigOptions,
|
|
56
|
+
additionalEntryPoints: [
|
|
57
|
+
...detectedModulesEntryPoint,
|
|
58
|
+
...moduleFederationSharedDependenciesEntryPoint
|
|
59
|
+
],
|
|
60
|
+
appMode: publicPaths ? "protected" : "public"
|
|
61
|
+
})
|
|
62
|
+
);
|
|
63
|
+
if (publicPaths) {
|
|
64
|
+
console.log(
|
|
65
|
+
chalk__default.default.yellow(
|
|
66
|
+
`\u26A0\uFE0F WARNING: The app /public entry point is an experimental feature that may receive immediate breaking changes.`
|
|
67
|
+
)
|
|
68
|
+
);
|
|
69
|
+
configs.push(
|
|
70
|
+
await config.createConfig(publicPaths, {
|
|
71
|
+
...commonConfigOptions,
|
|
72
|
+
appMode: "public"
|
|
73
|
+
})
|
|
74
|
+
);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
const isCi = yn__default.default(process.env.CI, { default: false });
|
|
78
|
+
const previousFileSizes = await FileSizeReporter.measureFileSizesBeforeBuild(paths$1.targetDist);
|
|
79
|
+
const previousAuthSizes = publicPaths ? await FileSizeReporter.measureFileSizesBeforeBuild(publicPaths.targetDist) : void 0;
|
|
80
|
+
await fs__default.default.emptyDir(paths$1.targetDist);
|
|
81
|
+
if (paths$1.targetPublic) {
|
|
82
|
+
await fs__default.default.copy(paths$1.targetPublic, paths$1.targetDist, {
|
|
83
|
+
dereference: true,
|
|
84
|
+
filter: (file) => file !== paths$1.targetHtml
|
|
85
|
+
});
|
|
86
|
+
if (publicPaths) {
|
|
87
|
+
await fs__default.default.copy(paths$1.targetPublic, publicPaths.targetDist, {
|
|
88
|
+
dereference: true,
|
|
89
|
+
filter: (file) => file !== paths$1.targetHtml
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
if (configSchema) {
|
|
94
|
+
await fs__default.default.writeJson(
|
|
95
|
+
node_path.resolve(paths$1.targetDist, ".config-schema.json"),
|
|
96
|
+
configSchema.serialize(),
|
|
97
|
+
{ spaces: 2 }
|
|
98
|
+
);
|
|
99
|
+
}
|
|
100
|
+
if (webpack) {
|
|
101
|
+
console.log(chalk__default.default.yellow(`\u26A0\uFE0F WARNING: Using legacy WebPack bundler`));
|
|
102
|
+
}
|
|
103
|
+
const { stats } = await build(configs, isCi, webpack);
|
|
104
|
+
if (!stats) {
|
|
105
|
+
throw new Error("No stats returned");
|
|
106
|
+
}
|
|
107
|
+
const [mainStats, authStats] = stats.stats;
|
|
108
|
+
if (statsJsonEnabled) {
|
|
109
|
+
await require("bfj").write(
|
|
110
|
+
node_path.resolve(paths$1.targetDist, "bundle-stats.json"),
|
|
111
|
+
mainStats.toJson()
|
|
112
|
+
);
|
|
113
|
+
}
|
|
114
|
+
FileSizeReporter.printFileSizesAfterBuild(
|
|
115
|
+
mainStats,
|
|
116
|
+
previousFileSizes,
|
|
117
|
+
paths$1.targetDist,
|
|
118
|
+
WARN_AFTER_BUNDLE_GZIP_SIZE,
|
|
119
|
+
WARN_AFTER_CHUNK_GZIP_SIZE
|
|
120
|
+
);
|
|
121
|
+
if (publicPaths && previousAuthSizes) {
|
|
122
|
+
FileSizeReporter.printFileSizesAfterBuild(
|
|
123
|
+
authStats,
|
|
124
|
+
previousAuthSizes,
|
|
125
|
+
publicPaths.targetDist,
|
|
126
|
+
WARN_AFTER_BUNDLE_GZIP_SIZE,
|
|
127
|
+
WARN_AFTER_CHUNK_GZIP_SIZE
|
|
128
|
+
);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
async function build(configs, isCi, webpack) {
|
|
132
|
+
const bundler = webpack ?? core.rspack;
|
|
133
|
+
const stats = await new Promise((resolve, reject) => {
|
|
134
|
+
bundler(configs, (err, buildStats) => {
|
|
135
|
+
if (err) {
|
|
136
|
+
if (err.message) {
|
|
137
|
+
const { errors: errors2 } = formatWebpackMessages__default.default({
|
|
138
|
+
errors: [err.message],
|
|
139
|
+
warnings: new Array(),
|
|
140
|
+
_showErrors: true,
|
|
141
|
+
_showWarnings: true
|
|
142
|
+
});
|
|
143
|
+
throw new Error(errors2[0]);
|
|
144
|
+
} else {
|
|
145
|
+
reject(err);
|
|
146
|
+
}
|
|
147
|
+
} else {
|
|
148
|
+
resolve(buildStats);
|
|
149
|
+
}
|
|
150
|
+
});
|
|
151
|
+
});
|
|
152
|
+
if (!stats) {
|
|
153
|
+
throw new Error("Failed to compile: No stats provided");
|
|
154
|
+
}
|
|
155
|
+
const serializedStats = stats.toJson({
|
|
156
|
+
all: false,
|
|
157
|
+
warnings: true,
|
|
158
|
+
errors: true
|
|
159
|
+
});
|
|
160
|
+
const { errors, warnings } = formatWebpackMessages__default.default({
|
|
161
|
+
errors: serializedStats.errors,
|
|
162
|
+
warnings: serializedStats.warnings
|
|
163
|
+
});
|
|
164
|
+
if (errors.length) {
|
|
165
|
+
const errorWithContext = applyContextToError(
|
|
166
|
+
errors[0],
|
|
167
|
+
serializedStats.errors?.[0]?.moduleName ?? ""
|
|
168
|
+
);
|
|
169
|
+
throw new Error(errorWithContext);
|
|
170
|
+
}
|
|
171
|
+
if (isCi && warnings.length) {
|
|
172
|
+
const warningsWithContext = warnings.map((warning, i) => {
|
|
173
|
+
return applyContextToError(
|
|
174
|
+
warning,
|
|
175
|
+
serializedStats.warnings?.[i]?.moduleName ?? ""
|
|
176
|
+
);
|
|
177
|
+
});
|
|
178
|
+
console.log(
|
|
179
|
+
chalk__default.default.yellow(
|
|
180
|
+
"\nTreating warnings as errors because process.env.CI = true.\n"
|
|
181
|
+
)
|
|
182
|
+
);
|
|
183
|
+
throw new Error(warningsWithContext.join("\n\n"));
|
|
184
|
+
}
|
|
185
|
+
return { stats };
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
exports.buildBundle = buildBundle;
|
|
189
|
+
//# sourceMappingURL=bundle.cjs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bundle.cjs.js","sources":["../../../src/lib/bundler/bundle.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 yn from 'yn';\nimport fs from 'fs-extra';\nimport { resolve as resolvePath } from 'node:path';\nimport { rspack, Configuration, MultiStats } from '@rspack/core';\nimport {\n measureFileSizesBeforeBuild,\n printFileSizesAfterBuild,\n} from 'react-dev-utils/FileSizeReporter';\nimport formatWebpackMessages from 'react-dev-utils/formatWebpackMessages';\nimport { createConfig } from './config';\nimport { BuildOptions } from './types';\nimport { resolveBundlingPaths, resolveOptionalBundlingPaths } from './paths';\nimport chalk from 'chalk';\nimport { createDetectedModulesEntryPoint } from './packageDetection';\nimport { createRuntimeSharedDependenciesEntryPoint } from './moduleFederation';\n\n// TODO(Rugvip): Limits from CRA, we might want to tweak these though.\nconst WARN_AFTER_BUNDLE_GZIP_SIZE = 512 * 1024;\nconst WARN_AFTER_CHUNK_GZIP_SIZE = 1024 * 1024;\n\nfunction applyContextToError(error: string, moduleName: string): string {\n return `Failed to compile '${moduleName}':\\n ${error}`;\n}\n\nexport async function buildBundle(options: BuildOptions) {\n const { statsJsonEnabled, schema: configSchema, webpack } = options;\n\n const paths = resolveBundlingPaths(options);\n const publicPaths = await resolveOptionalBundlingPaths({\n targetDir: options.targetDir,\n entry: 'src/index-public-experimental',\n dist: 'dist/public',\n });\n\n const commonConfigOptions = {\n ...options,\n checksEnabled: false,\n isDev: false,\n getFrontendAppConfigs: () => options.frontendAppConfigs,\n };\n\n const configs: Configuration[] = [];\n if (options.moduleFederationRemote) {\n // Package detection is disabled for remote bundles\n configs.push(await createConfig(paths, commonConfigOptions));\n } else {\n const detectedModulesEntryPoint = await createDetectedModulesEntryPoint({\n config: options.fullConfig,\n targetPath: paths.targetPath,\n });\n\n const moduleFederationSharedDependenciesEntryPoint =\n await createRuntimeSharedDependenciesEntryPoint({\n targetPath: paths.targetPath,\n });\n\n configs.push(\n await createConfig(paths, {\n ...commonConfigOptions,\n additionalEntryPoints: [\n ...detectedModulesEntryPoint,\n ...moduleFederationSharedDependenciesEntryPoint,\n ],\n appMode: publicPaths ? 'protected' : 'public',\n }),\n );\n\n if (publicPaths) {\n console.log(\n chalk.yellow(\n `⚠️ WARNING: The app /public entry point is an experimental feature that may receive immediate breaking changes.`,\n ),\n );\n configs.push(\n await createConfig(publicPaths, {\n ...commonConfigOptions,\n appMode: 'public',\n }),\n );\n }\n }\n\n const isCi = yn(process.env.CI, { default: false });\n\n const previousFileSizes = await measureFileSizesBeforeBuild(paths.targetDist);\n const previousAuthSizes = publicPaths\n ? await measureFileSizesBeforeBuild(publicPaths.targetDist)\n : undefined;\n await fs.emptyDir(paths.targetDist);\n\n if (paths.targetPublic) {\n await fs.copy(paths.targetPublic, paths.targetDist, {\n dereference: true,\n filter: file => file !== paths.targetHtml,\n });\n\n // If we've got a separate public index entry point, copy public content there too\n if (publicPaths) {\n await fs.copy(paths.targetPublic, publicPaths.targetDist, {\n dereference: true,\n filter: file => file !== paths.targetHtml,\n });\n }\n }\n\n if (configSchema) {\n await fs.writeJson(\n resolvePath(paths.targetDist, '.config-schema.json'),\n configSchema.serialize(),\n { spaces: 2 },\n );\n }\n\n if (webpack) {\n console.log(chalk.yellow(`⚠️ WARNING: Using legacy WebPack bundler`));\n }\n\n const { stats } = await build(configs, isCi, webpack);\n\n if (!stats) {\n throw new Error('No stats returned');\n }\n const [mainStats, authStats] = stats.stats;\n\n if (statsJsonEnabled) {\n // No @types/bfj\n await require('bfj').write(\n resolvePath(paths.targetDist, 'bundle-stats.json'),\n mainStats.toJson(),\n );\n }\n\n printFileSizesAfterBuild(\n mainStats,\n previousFileSizes,\n paths.targetDist,\n WARN_AFTER_BUNDLE_GZIP_SIZE,\n WARN_AFTER_CHUNK_GZIP_SIZE,\n );\n if (publicPaths && previousAuthSizes) {\n printFileSizesAfterBuild(\n authStats,\n previousAuthSizes,\n publicPaths.targetDist,\n WARN_AFTER_BUNDLE_GZIP_SIZE,\n WARN_AFTER_CHUNK_GZIP_SIZE,\n );\n }\n}\n\nasync function build(\n configs: Configuration[],\n isCi: boolean,\n webpack?: typeof import('webpack'),\n) {\n const bundler = (webpack ?? rspack) as typeof rspack;\n\n const stats = await new Promise<MultiStats | undefined>((resolve, reject) => {\n bundler(configs, (err, buildStats) => {\n if (err) {\n if (err.message) {\n const { errors } = formatWebpackMessages({\n errors: [err.message],\n warnings: new Array<string>(),\n _showErrors: true,\n _showWarnings: true,\n });\n\n throw new Error(errors[0]);\n } else {\n reject(err);\n }\n } else {\n resolve(buildStats);\n }\n });\n });\n\n if (!stats) {\n throw new Error('Failed to compile: No stats provided');\n }\n\n const serializedStats = stats.toJson({\n all: false,\n warnings: true,\n errors: true,\n });\n const { errors, warnings } = formatWebpackMessages({\n errors: serializedStats.errors,\n warnings: serializedStats.warnings,\n });\n\n if (errors.length) {\n // Only keep the first error. Others are often indicative\n // of the same problem, but confuse the reader with noise.\n const errorWithContext = applyContextToError(\n errors[0],\n serializedStats.errors?.[0]?.moduleName ?? '',\n );\n throw new Error(errorWithContext);\n }\n if (isCi && warnings.length) {\n const warningsWithContext = warnings.map((warning, i) => {\n return applyContextToError(\n warning,\n serializedStats.warnings?.[i]?.moduleName ?? '',\n );\n });\n console.log(\n chalk.yellow(\n '\\nTreating warnings as errors because process.env.CI = true.\\n',\n ),\n );\n throw new Error(warningsWithContext.join('\\n\\n'));\n }\n\n return { stats };\n}\n"],"names":["paths","resolveBundlingPaths","resolveOptionalBundlingPaths","createConfig","createDetectedModulesEntryPoint","createRuntimeSharedDependenciesEntryPoint","chalk","yn","measureFileSizesBeforeBuild","fs","resolvePath","printFileSizesAfterBuild","rspack","errors","formatWebpackMessages"],"mappings":"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"}
|
|
@@ -0,0 +1,309 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var node_path = require('node:path');
|
|
4
|
+
var core = require('@rspack/core');
|
|
5
|
+
var ESLintRspackPlugin = require('eslint-rspack-plugin');
|
|
6
|
+
var tsCheckerRspackPlugin = require('ts-checker-rspack-plugin');
|
|
7
|
+
var HtmlWebpackPlugin = require('html-webpack-plugin');
|
|
8
|
+
var ModuleScopePlugin = require('react-dev-utils/ModuleScopePlugin');
|
|
9
|
+
var rspack = require('@module-federation/enhanced/rspack');
|
|
10
|
+
var fs = require('fs-extra');
|
|
11
|
+
var optimization = require('./optimization.cjs.js');
|
|
12
|
+
var pickBy = require('lodash/pickBy');
|
|
13
|
+
var cliCommon = require('@backstage/cli-common');
|
|
14
|
+
var transforms = require('./transforms.cjs.js');
|
|
15
|
+
var _package = require('../../package.json.cjs.js');
|
|
16
|
+
var yn = require('yn');
|
|
17
|
+
var hasReactDomClient = require('./hasReactDomClient.cjs.js');
|
|
18
|
+
var linkWorkspaces = require('./linkWorkspaces.cjs.js');
|
|
19
|
+
var ConfigInjectingHtmlWebpackPlugin = require('./ConfigInjectingHtmlWebpackPlugin.cjs.js');
|
|
20
|
+
|
|
21
|
+
function _interopDefaultCompat (e) { return e && typeof e === 'object' && 'default' in e ? e : { default: e }; }
|
|
22
|
+
|
|
23
|
+
var ESLintRspackPlugin__default = /*#__PURE__*/_interopDefaultCompat(ESLintRspackPlugin);
|
|
24
|
+
var HtmlWebpackPlugin__default = /*#__PURE__*/_interopDefaultCompat(HtmlWebpackPlugin);
|
|
25
|
+
var ModuleScopePlugin__default = /*#__PURE__*/_interopDefaultCompat(ModuleScopePlugin);
|
|
26
|
+
var fs__default = /*#__PURE__*/_interopDefaultCompat(fs);
|
|
27
|
+
var pickBy__default = /*#__PURE__*/_interopDefaultCompat(pickBy);
|
|
28
|
+
var yn__default = /*#__PURE__*/_interopDefaultCompat(yn);
|
|
29
|
+
|
|
30
|
+
function resolveBaseUrl(config, moduleFederationRemote) {
|
|
31
|
+
const baseUrl = config.getOptionalString("app.baseUrl");
|
|
32
|
+
const defaultBaseUrl = moduleFederationRemote ? `http://localhost:${process.env.PORT ?? "3000"}` : "http://localhost:3000";
|
|
33
|
+
try {
|
|
34
|
+
return new URL(baseUrl ?? "/", defaultBaseUrl);
|
|
35
|
+
} catch (error) {
|
|
36
|
+
throw new Error(`Invalid app.baseUrl, ${error}`);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
function resolveEndpoint(config, moduleFederationRemote) {
|
|
40
|
+
const url = resolveBaseUrl(config, moduleFederationRemote);
|
|
41
|
+
return {
|
|
42
|
+
host: config.getOptionalString("app.listen.host") ?? url.hostname,
|
|
43
|
+
port: config.getOptionalNumber("app.listen.port") ?? Number(url.port) ?? (url.protocol === "https:" ? 443 : 80)
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
async function readBuildInfo() {
|
|
47
|
+
const timestamp = Date.now();
|
|
48
|
+
let commit;
|
|
49
|
+
try {
|
|
50
|
+
commit = await cliCommon.runOutput(["git", "rev-parse", "HEAD"]);
|
|
51
|
+
} catch (error) {
|
|
52
|
+
}
|
|
53
|
+
let gitVersion;
|
|
54
|
+
try {
|
|
55
|
+
gitVersion = await cliCommon.runOutput(["git", "describe", "--always"]);
|
|
56
|
+
} catch (error) {
|
|
57
|
+
}
|
|
58
|
+
if (commit === void 0 || gitVersion === void 0) {
|
|
59
|
+
console.info(
|
|
60
|
+
"NOTE: Did not compute git version or commit hash, could not execute the git command line utility"
|
|
61
|
+
);
|
|
62
|
+
}
|
|
63
|
+
const { version: packageVersion } = await fs__default.default.readJson(
|
|
64
|
+
cliCommon.targetPaths.resolve("package.json")
|
|
65
|
+
);
|
|
66
|
+
return {
|
|
67
|
+
cliVersion: _package.version,
|
|
68
|
+
gitVersion: gitVersion ?? "unknown",
|
|
69
|
+
packageVersion,
|
|
70
|
+
timestamp,
|
|
71
|
+
commit: commit ?? "unknown"
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
async function createConfig(paths, options) {
|
|
75
|
+
const {
|
|
76
|
+
checksEnabled,
|
|
77
|
+
isDev,
|
|
78
|
+
frontendConfig,
|
|
79
|
+
moduleFederationRemote,
|
|
80
|
+
publicSubPath = "",
|
|
81
|
+
webpack
|
|
82
|
+
} = options;
|
|
83
|
+
const { plugins, loaders } = transforms.transforms(options);
|
|
84
|
+
const validBaseUrl = resolveBaseUrl(frontendConfig, moduleFederationRemote);
|
|
85
|
+
let publicPath = validBaseUrl.pathname.replace(/\/$/, "");
|
|
86
|
+
if (publicSubPath) {
|
|
87
|
+
publicPath = `${publicPath}${publicSubPath}`.replace("//", "/");
|
|
88
|
+
}
|
|
89
|
+
if (isDev) {
|
|
90
|
+
const { host, port } = resolveEndpoint(
|
|
91
|
+
options.frontendConfig,
|
|
92
|
+
options.moduleFederationRemote
|
|
93
|
+
);
|
|
94
|
+
const refreshOptions = {
|
|
95
|
+
overlay: {
|
|
96
|
+
sockProtocol: "ws",
|
|
97
|
+
sockHost: host,
|
|
98
|
+
sockPort: port
|
|
99
|
+
}
|
|
100
|
+
};
|
|
101
|
+
if (webpack) {
|
|
102
|
+
const ReactRefreshPlugin = require("@pmmmwh/react-refresh-webpack-plugin");
|
|
103
|
+
plugins.push(new ReactRefreshPlugin(refreshOptions));
|
|
104
|
+
} else {
|
|
105
|
+
const RspackReactRefreshPlugin = require("@rspack/plugin-react-refresh");
|
|
106
|
+
plugins.push(new RspackReactRefreshPlugin(refreshOptions));
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
if (checksEnabled) {
|
|
110
|
+
const TsCheckerPlugin = webpack ? require("fork-ts-checker-webpack-plugin") : tsCheckerRspackPlugin.TsCheckerRspackPlugin;
|
|
111
|
+
const ESLintPlugin = webpack ? require("eslint-webpack-plugin") : ESLintRspackPlugin__default.default;
|
|
112
|
+
plugins.push(
|
|
113
|
+
new TsCheckerPlugin({
|
|
114
|
+
typescript: { configFile: paths.targetTsConfig, memoryLimit: 8192 }
|
|
115
|
+
}),
|
|
116
|
+
new ESLintPlugin({
|
|
117
|
+
cache: false,
|
|
118
|
+
// Cache seems broken
|
|
119
|
+
context: paths.targetPath,
|
|
120
|
+
files: ["**/*.(ts|tsx|mts|cts|js|jsx|mjs|cjs)"]
|
|
121
|
+
})
|
|
122
|
+
);
|
|
123
|
+
}
|
|
124
|
+
const bundler = webpack ? webpack : core.rspack;
|
|
125
|
+
plugins.push(
|
|
126
|
+
new bundler.ProvidePlugin({
|
|
127
|
+
process: require.resolve("process/browser"),
|
|
128
|
+
Buffer: ["buffer", "Buffer"]
|
|
129
|
+
})
|
|
130
|
+
);
|
|
131
|
+
if (!options.moduleFederationRemote) {
|
|
132
|
+
const templateOptions = {
|
|
133
|
+
meta: {
|
|
134
|
+
"backstage-app-mode": options?.appMode ?? "public"
|
|
135
|
+
},
|
|
136
|
+
template: paths.targetHtml,
|
|
137
|
+
templateParameters: {
|
|
138
|
+
publicPath,
|
|
139
|
+
config: frontendConfig
|
|
140
|
+
}
|
|
141
|
+
};
|
|
142
|
+
if (webpack) {
|
|
143
|
+
plugins.push(new HtmlWebpackPlugin__default.default(templateOptions));
|
|
144
|
+
} else {
|
|
145
|
+
plugins.push(
|
|
146
|
+
new ConfigInjectingHtmlWebpackPlugin.ConfigInjectingHtmlWebpackPlugin(
|
|
147
|
+
templateOptions,
|
|
148
|
+
options.getFrontendAppConfigs
|
|
149
|
+
)
|
|
150
|
+
);
|
|
151
|
+
}
|
|
152
|
+
plugins.push(
|
|
153
|
+
new HtmlWebpackPlugin__default.default({
|
|
154
|
+
meta: {
|
|
155
|
+
"backstage-app-mode": options?.appMode ?? "public",
|
|
156
|
+
// This is added to be written in the later step, and finally read by the extra entry point
|
|
157
|
+
"backstage-public-path": "<%= publicPath %>/"
|
|
158
|
+
},
|
|
159
|
+
minify: false,
|
|
160
|
+
publicPath: "<%= publicPath %>",
|
|
161
|
+
filename: "index.html.tmpl",
|
|
162
|
+
template: `${require.resolve("raw-loader")}!${paths.targetHtml}`
|
|
163
|
+
})
|
|
164
|
+
);
|
|
165
|
+
}
|
|
166
|
+
if (options.moduleFederationRemote) {
|
|
167
|
+
const AdaptedModuleFederationPlugin = webpack ? require("@module-federation/enhanced/webpack").ModuleFederationPlugin : rspack.ModuleFederationPlugin;
|
|
168
|
+
const exposes = options.moduleFederationRemote.exposes ? Object.fromEntries(
|
|
169
|
+
Object.entries(options.moduleFederationRemote?.exposes).map(
|
|
170
|
+
([k, v]) => [k, node_path.resolve(paths.targetPath, v)]
|
|
171
|
+
)
|
|
172
|
+
) : {
|
|
173
|
+
".": paths.targetEntry
|
|
174
|
+
};
|
|
175
|
+
plugins.push(
|
|
176
|
+
new AdaptedModuleFederationPlugin({
|
|
177
|
+
filename: "remoteEntry.js",
|
|
178
|
+
exposes,
|
|
179
|
+
name: options.moduleFederationRemote.name,
|
|
180
|
+
runtime: false,
|
|
181
|
+
shared: options.moduleFederationRemote.sharedDependencies
|
|
182
|
+
})
|
|
183
|
+
);
|
|
184
|
+
}
|
|
185
|
+
const buildInfo = await readBuildInfo();
|
|
186
|
+
plugins.push(
|
|
187
|
+
webpack ? new webpack.DefinePlugin({
|
|
188
|
+
"process.env.BUILD_INFO": JSON.stringify(buildInfo),
|
|
189
|
+
"process.env.APP_CONFIG": webpack.DefinePlugin.runtimeValue(
|
|
190
|
+
() => JSON.stringify(options.getFrontendAppConfigs()),
|
|
191
|
+
true
|
|
192
|
+
),
|
|
193
|
+
// This allows for conditional imports of react-dom/client, since there's no way
|
|
194
|
+
// to check for presence of it in source code without module resolution errors.
|
|
195
|
+
"process.env.HAS_REACT_DOM_CLIENT": JSON.stringify(
|
|
196
|
+
hasReactDomClient.hasReactDomClient()
|
|
197
|
+
)
|
|
198
|
+
}) : new bundler.DefinePlugin({
|
|
199
|
+
"process.env.BUILD_INFO": JSON.stringify(buildInfo),
|
|
200
|
+
"process.env.APP_CONFIG": JSON.stringify([]),
|
|
201
|
+
// Inject via index.html instead
|
|
202
|
+
// This allows for conditional imports of react-dom/client, since there's no way
|
|
203
|
+
// to check for presence of it in source code without module resolution errors.
|
|
204
|
+
"process.env.HAS_REACT_DOM_CLIENT": JSON.stringify(
|
|
205
|
+
hasReactDomClient.hasReactDomClient()
|
|
206
|
+
)
|
|
207
|
+
})
|
|
208
|
+
);
|
|
209
|
+
if (options.linkedWorkspace) {
|
|
210
|
+
plugins.push(
|
|
211
|
+
...await linkWorkspaces.createWorkspaceLinkingPlugins(
|
|
212
|
+
bundler,
|
|
213
|
+
options.linkedWorkspace
|
|
214
|
+
)
|
|
215
|
+
);
|
|
216
|
+
}
|
|
217
|
+
const reactRefreshFiles = webpack ? [
|
|
218
|
+
require.resolve(
|
|
219
|
+
"@pmmmwh/react-refresh-webpack-plugin/lib/runtime/RefreshUtils.js"
|
|
220
|
+
),
|
|
221
|
+
require.resolve(
|
|
222
|
+
"@pmmmwh/react-refresh-webpack-plugin/overlay/index.js"
|
|
223
|
+
),
|
|
224
|
+
require.resolve("react-refresh")
|
|
225
|
+
] : [];
|
|
226
|
+
const mode = isDev ? "development" : "production";
|
|
227
|
+
const optimization$1 = optimization.optimization(options);
|
|
228
|
+
return {
|
|
229
|
+
mode,
|
|
230
|
+
profile: false,
|
|
231
|
+
...isDev ? {
|
|
232
|
+
watchOptions: {
|
|
233
|
+
ignored: /node_modules\/(?!__backstage-autodetected-plugins__)/
|
|
234
|
+
}
|
|
235
|
+
} : {},
|
|
236
|
+
optimization: optimization$1,
|
|
237
|
+
bail: false,
|
|
238
|
+
performance: {
|
|
239
|
+
hints: false
|
|
240
|
+
// we check the gzip size instead
|
|
241
|
+
},
|
|
242
|
+
devtool: isDev ? "eval-cheap-module-source-map" : "source-map",
|
|
243
|
+
context: paths.targetPath,
|
|
244
|
+
entry: [
|
|
245
|
+
/* eslint-disable-next-line no-restricted-syntax */
|
|
246
|
+
cliCommon.findOwnPaths(__dirname).resolve("config/webpack-public-path"),
|
|
247
|
+
...options.additionalEntryPoints ?? [],
|
|
248
|
+
paths.targetEntry
|
|
249
|
+
],
|
|
250
|
+
resolve: {
|
|
251
|
+
extensions: [".ts", ".tsx", ".mjs", ".js", ".jsx", ".json", ".wasm"],
|
|
252
|
+
mainFields: ["browser", "module", "main"],
|
|
253
|
+
fallback: {
|
|
254
|
+
...pickBy__default.default(require("node-stdlib-browser")),
|
|
255
|
+
module: false,
|
|
256
|
+
dgram: false,
|
|
257
|
+
dns: false,
|
|
258
|
+
fs: false,
|
|
259
|
+
http2: false,
|
|
260
|
+
net: false,
|
|
261
|
+
tls: false,
|
|
262
|
+
child_process: false,
|
|
263
|
+
/* new ignores */
|
|
264
|
+
path: false,
|
|
265
|
+
https: false,
|
|
266
|
+
http: false,
|
|
267
|
+
util: require.resolve("util/")
|
|
268
|
+
},
|
|
269
|
+
// FIXME: see also https://github.com/web-infra-dev/rspack/issues/3408
|
|
270
|
+
...webpack && {
|
|
271
|
+
plugins: [
|
|
272
|
+
new ModuleScopePlugin__default.default(
|
|
273
|
+
[paths.targetSrc, paths.targetDev],
|
|
274
|
+
[paths.targetPackageJson, ...reactRefreshFiles]
|
|
275
|
+
)
|
|
276
|
+
]
|
|
277
|
+
}
|
|
278
|
+
},
|
|
279
|
+
module: {
|
|
280
|
+
rules: loaders
|
|
281
|
+
},
|
|
282
|
+
output: {
|
|
283
|
+
uniqueName: options.moduleFederationRemote?.name,
|
|
284
|
+
path: paths.targetDist,
|
|
285
|
+
publicPath: options.moduleFederationRemote ? "auto" : `${publicPath}/`,
|
|
286
|
+
filename: isDev ? "[name].js" : "static/[name].[contenthash:8].js",
|
|
287
|
+
chunkFilename: isDev ? "[name].chunk.js" : "static/[name].[contenthash:8].chunk.js",
|
|
288
|
+
...isDev ? {
|
|
289
|
+
devtoolModuleFilenameTemplate: (info) => `file:///${node_path.resolve(info.absoluteResourcePath).replace(
|
|
290
|
+
/\\/g,
|
|
291
|
+
"/"
|
|
292
|
+
)}`
|
|
293
|
+
} : {}
|
|
294
|
+
},
|
|
295
|
+
experiments: {
|
|
296
|
+
lazyCompilation: yn__default.default(process.env.EXPERIMENTAL_LAZY_COMPILATION),
|
|
297
|
+
...!webpack && {
|
|
298
|
+
// We're still using `style-loader` for custom `insert` option
|
|
299
|
+
css: false
|
|
300
|
+
}
|
|
301
|
+
},
|
|
302
|
+
plugins
|
|
303
|
+
};
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
exports.createConfig = createConfig;
|
|
307
|
+
exports.resolveBaseUrl = resolveBaseUrl;
|
|
308
|
+
exports.resolveEndpoint = resolveEndpoint;
|
|
309
|
+
//# sourceMappingURL=config.cjs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.cjs.js","sources":["../../../src/lib/bundler/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 { resolve as resolvePath } from 'node:path';\nimport { BundlingOptions, ModuleFederationRemoteOptions } from './types';\nimport { rspack, Configuration } from '@rspack/core';\n\nimport { BundlingPaths } from './paths';\nimport { Config } from '@backstage/config';\nimport ESLintRspackPlugin from 'eslint-rspack-plugin';\nimport { TsCheckerRspackPlugin } from 'ts-checker-rspack-plugin';\nimport HtmlWebpackPlugin from 'html-webpack-plugin';\nimport ModuleScopePlugin from 'react-dev-utils/ModuleScopePlugin';\nimport { ModuleFederationPlugin } from '@module-federation/enhanced/rspack';\n\nimport fs from 'fs-extra';\nimport { optimization as optimizationConfig } from './optimization';\nimport pickBy from 'lodash/pickBy';\nimport { findOwnPaths, runOutput, targetPaths } from '@backstage/cli-common';\n\nimport { transforms } from './transforms';\nimport { version } from '../../../package.json';\nimport yn from 'yn';\nimport { hasReactDomClient } from './hasReactDomClient';\nimport { createWorkspaceLinkingPlugins } from './linkWorkspaces';\nimport { ConfigInjectingHtmlWebpackPlugin } from './ConfigInjectingHtmlWebpackPlugin';\n\nexport function resolveBaseUrl(\n config: Config,\n moduleFederationRemote?: ModuleFederationRemoteOptions,\n): URL {\n const baseUrl = config.getOptionalString('app.baseUrl');\n\n const defaultBaseUrl = moduleFederationRemote\n ? `http://localhost:${process.env.PORT ?? '3000'}`\n : 'http://localhost:3000';\n\n try {\n return new URL(baseUrl ?? '/', defaultBaseUrl);\n } catch (error) {\n throw new Error(`Invalid app.baseUrl, ${error}`);\n }\n}\n\nexport function resolveEndpoint(\n config: Config,\n moduleFederationRemote?: ModuleFederationRemoteOptions,\n): {\n host: string;\n port: number;\n} {\n const url = resolveBaseUrl(config, moduleFederationRemote);\n\n return {\n host: config.getOptionalString('app.listen.host') ?? url.hostname,\n port:\n config.getOptionalNumber('app.listen.port') ??\n Number(url.port) ??\n (url.protocol === 'https:' ? 443 : 80),\n };\n}\n\nasync function readBuildInfo() {\n const timestamp = Date.now();\n\n let commit: string | undefined;\n try {\n commit = await runOutput(['git', 'rev-parse', 'HEAD']);\n } catch (error) {\n // ignore, see below\n }\n\n let gitVersion: string | undefined;\n try {\n gitVersion = await runOutput(['git', 'describe', '--always']);\n } catch (error) {\n // ignore, see below\n }\n\n if (commit === undefined || gitVersion === undefined) {\n console.info(\n 'NOTE: Did not compute git version or commit hash, could not execute the git command line utility',\n );\n }\n\n const { version: packageVersion } = await fs.readJson(\n targetPaths.resolve('package.json'),\n );\n\n return {\n cliVersion: version,\n gitVersion: gitVersion ?? 'unknown',\n packageVersion,\n timestamp,\n commit: commit ?? 'unknown',\n };\n}\n\nexport async function createConfig(\n paths: BundlingPaths,\n options: BundlingOptions,\n): Promise<Configuration> {\n const {\n checksEnabled,\n isDev,\n frontendConfig,\n moduleFederationRemote,\n publicSubPath = '',\n webpack,\n } = options;\n\n const { plugins, loaders } = transforms(options);\n // Any package that is part of the monorepo but outside the monorepo root dir need\n // separate resolution logic.\n\n const validBaseUrl = resolveBaseUrl(frontendConfig, moduleFederationRemote);\n let publicPath = validBaseUrl.pathname.replace(/\\/$/, '');\n if (publicSubPath) {\n publicPath = `${publicPath}${publicSubPath}`.replace('//', '/');\n }\n\n if (isDev) {\n const { host, port } = resolveEndpoint(\n options.frontendConfig,\n options.moduleFederationRemote,\n );\n\n const refreshOptions = {\n overlay: {\n sockProtocol: 'ws',\n sockHost: host,\n sockPort: port,\n },\n } as const;\n\n if (webpack) {\n const ReactRefreshPlugin = require('@pmmmwh/react-refresh-webpack-plugin');\n plugins.push(new ReactRefreshPlugin(refreshOptions));\n } else {\n const RspackReactRefreshPlugin = require('@rspack/plugin-react-refresh');\n plugins.push(new RspackReactRefreshPlugin(refreshOptions));\n }\n }\n\n if (checksEnabled) {\n const TsCheckerPlugin = webpack\n ? (require('fork-ts-checker-webpack-plugin') as typeof import('fork-ts-checker-webpack-plugin'))\n : TsCheckerRspackPlugin;\n const ESLintPlugin = webpack\n ? (require('eslint-webpack-plugin') as typeof import('eslint-webpack-plugin'))\n : ESLintRspackPlugin;\n plugins.push(\n new TsCheckerPlugin({\n typescript: { configFile: paths.targetTsConfig, memoryLimit: 8192 },\n }),\n new ESLintPlugin({\n cache: false, // Cache seems broken\n context: paths.targetPath,\n files: ['**/*.(ts|tsx|mts|cts|js|jsx|mjs|cjs)'],\n }),\n );\n }\n\n const bundler = webpack ? (webpack as unknown as typeof rspack) : rspack;\n\n // TODO(blam): process is no longer auto polyfilled by webpack in v5.\n // we use the provide plugin to provide this polyfill, but lets look\n // to remove this eventually!\n plugins.push(\n new bundler.ProvidePlugin({\n process: require.resolve('process/browser'),\n Buffer: ['buffer', 'Buffer'],\n }),\n );\n\n if (!options.moduleFederationRemote) {\n const templateOptions = {\n meta: {\n 'backstage-app-mode': options?.appMode ?? 'public',\n },\n template: paths.targetHtml,\n templateParameters: {\n publicPath,\n config: frontendConfig,\n },\n };\n if (webpack) {\n // Config injection via index.html doesn't work across reloads with\n // WebPack, so we rely on the APP_CONFIG injection instead\n plugins.push(new HtmlWebpackPlugin(templateOptions));\n } else {\n // With Rspack we inject config via index.html, this is both because we\n // can't use APP_CONFIG due to the lack of support for runtime values, but\n // also because we are able to do it and it lines up better with what the\n // app-backend is doing.\n //\n // We still use the html plugin from WebPack, since the Rspack one won't\n // let us inject complex objects like the config.\n plugins.push(\n new ConfigInjectingHtmlWebpackPlugin(\n templateOptions,\n options.getFrontendAppConfigs,\n ),\n );\n }\n plugins.push(\n new HtmlWebpackPlugin({\n meta: {\n 'backstage-app-mode': options?.appMode ?? 'public',\n // This is added to be written in the later step, and finally read by the extra entry point\n 'backstage-public-path': '<%= publicPath %>/',\n },\n minify: false,\n publicPath: '<%= publicPath %>',\n filename: 'index.html.tmpl',\n template: `${require.resolve('raw-loader')}!${paths.targetHtml}`,\n }),\n );\n }\n\n if (options.moduleFederationRemote) {\n const AdaptedModuleFederationPlugin = webpack\n ? (require('@module-federation/enhanced/webpack')\n .ModuleFederationPlugin as unknown as typeof ModuleFederationPlugin)\n : ModuleFederationPlugin;\n\n const exposes = options.moduleFederationRemote.exposes\n ? Object.fromEntries(\n Object.entries(options.moduleFederationRemote?.exposes).map(\n ([k, v]) => [k, resolvePath(paths.targetPath, v)],\n ),\n )\n : {\n '.': paths.targetEntry,\n };\n\n plugins.push(\n new AdaptedModuleFederationPlugin({\n filename: 'remoteEntry.js',\n exposes,\n name: options.moduleFederationRemote.name,\n runtime: false,\n shared: options.moduleFederationRemote.sharedDependencies,\n }),\n );\n }\n\n const buildInfo = await readBuildInfo();\n\n plugins.push(\n webpack\n ? new webpack.DefinePlugin({\n 'process.env.BUILD_INFO': JSON.stringify(buildInfo),\n 'process.env.APP_CONFIG': webpack.DefinePlugin.runtimeValue(\n () => JSON.stringify(options.getFrontendAppConfigs()),\n true,\n ),\n // This allows for conditional imports of react-dom/client, since there's no way\n // to check for presence of it in source code without module resolution errors.\n 'process.env.HAS_REACT_DOM_CLIENT': JSON.stringify(\n hasReactDomClient(),\n ),\n })\n : new bundler.DefinePlugin({\n 'process.env.BUILD_INFO': JSON.stringify(buildInfo),\n 'process.env.APP_CONFIG': JSON.stringify([]), // Inject via index.html instead\n // This allows for conditional imports of react-dom/client, since there's no way\n // to check for presence of it in source code without module resolution errors.\n 'process.env.HAS_REACT_DOM_CLIENT': JSON.stringify(\n hasReactDomClient(),\n ),\n }),\n );\n\n if (options.linkedWorkspace) {\n plugins.push(\n ...(await createWorkspaceLinkingPlugins(\n bundler,\n options.linkedWorkspace,\n )),\n );\n }\n\n // These files are required by the transpiled code when using React Refresh.\n // They need to be excluded to the module scope plugin which ensures that files\n // that exist in the package are required.\n const reactRefreshFiles = webpack\n ? [\n require.resolve(\n '@pmmmwh/react-refresh-webpack-plugin/lib/runtime/RefreshUtils.js',\n ),\n require.resolve(\n '@pmmmwh/react-refresh-webpack-plugin/overlay/index.js',\n ),\n require.resolve('react-refresh'),\n ]\n : [];\n\n const mode = isDev ? 'development' : 'production';\n const optimization = optimizationConfig(options);\n\n return {\n mode,\n profile: false,\n ...(isDev\n ? {\n watchOptions: {\n ignored: /node_modules\\/(?!__backstage-autodetected-plugins__)/,\n },\n }\n : {}),\n optimization,\n bail: false,\n performance: {\n hints: false, // we check the gzip size instead\n },\n devtool: isDev ? 'eval-cheap-module-source-map' : 'source-map',\n context: paths.targetPath,\n entry: [\n /* eslint-disable-next-line no-restricted-syntax */\n findOwnPaths(__dirname).resolve('config/webpack-public-path'),\n ...(options.additionalEntryPoints ?? []),\n paths.targetEntry,\n ],\n resolve: {\n extensions: ['.ts', '.tsx', '.mjs', '.js', '.jsx', '.json', '.wasm'],\n mainFields: ['browser', 'module', 'main'],\n fallback: {\n ...pickBy(require('node-stdlib-browser')),\n module: false,\n dgram: false,\n dns: false,\n fs: false,\n http2: false,\n net: false,\n tls: false,\n child_process: false,\n\n /* new ignores */\n path: false,\n https: false,\n http: false,\n util: require.resolve('util/'),\n },\n // FIXME: see also https://github.com/web-infra-dev/rspack/issues/3408\n ...(webpack && {\n plugins: [\n new ModuleScopePlugin(\n [paths.targetSrc, paths.targetDev],\n [paths.targetPackageJson, ...reactRefreshFiles],\n ),\n ],\n }),\n },\n module: {\n rules: loaders,\n },\n output: {\n uniqueName: options.moduleFederationRemote?.name,\n path: paths.targetDist,\n publicPath: options.moduleFederationRemote ? 'auto' : `${publicPath}/`,\n filename: isDev ? '[name].js' : 'static/[name].[contenthash:8].js',\n chunkFilename: isDev\n ? '[name].chunk.js'\n : 'static/[name].[contenthash:8].chunk.js',\n ...(isDev\n ? {\n devtoolModuleFilenameTemplate: (info: any) =>\n `file:///${resolvePath(info.absoluteResourcePath).replace(\n /\\\\/g,\n '/',\n )}`,\n }\n : {}),\n },\n experiments: {\n lazyCompilation: yn(process.env.EXPERIMENTAL_LAZY_COMPILATION),\n ...(!webpack && {\n // We're still using `style-loader` for custom `insert` option\n css: false,\n }),\n },\n plugins,\n };\n}\n"],"names":["runOutput","fs","targetPaths","version","transforms","TsCheckerRspackPlugin","ESLintRspackPlugin","rspack","HtmlWebpackPlugin","ConfigInjectingHtmlWebpackPlugin","ModuleFederationPlugin","resolvePath","hasReactDomClient","createWorkspaceLinkingPlugins","optimization","optimizationConfig","findOwnPaths","pickBy","ModuleScopePlugin","yn"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAwCO,SAAS,cAAA,CACd,QACA,sBAAA,EACK;AACL,EAAA,MAAM,OAAA,GAAU,MAAA,CAAO,iBAAA,CAAkB,aAAa,CAAA;AAEtD,EAAA,MAAM,iBAAiB,sBAAA,GACnB,CAAA,iBAAA,EAAoB,QAAQ,GAAA,CAAI,IAAA,IAAQ,MAAM,CAAA,CAAA,GAC9C,uBAAA;AAEJ,EAAA,IAAI;AACF,IAAA,OAAO,IAAI,GAAA,CAAI,OAAA,IAAW,GAAA,EAAK,cAAc,CAAA;AAAA,EAC/C,SAAS,KAAA,EAAO;AACd,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,qBAAA,EAAwB,KAAK,CAAA,CAAE,CAAA;AAAA,EACjD;AACF;AAEO,SAAS,eAAA,CACd,QACA,sBAAA,EAIA;AACA,EAAA,MAAM,GAAA,GAAM,cAAA,CAAe,MAAA,EAAQ,sBAAsB,CAAA;AAEzD,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,MAAA,CAAO,iBAAA,CAAkB,iBAAiB,KAAK,GAAA,CAAI,QAAA;AAAA,IACzD,IAAA,EACE,MAAA,CAAO,iBAAA,CAAkB,iBAAiB,CAAA,IAC1C,MAAA,CAAO,GAAA,CAAI,IAAI,CAAA,KACd,GAAA,CAAI,QAAA,KAAa,QAAA,GAAW,GAAA,GAAM,EAAA;AAAA,GACvC;AACF;AAEA,eAAe,aAAA,GAAgB;AAC7B,EAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAE3B,EAAA,IAAI,MAAA;AACJ,EAAA,IAAI;AACF,IAAA,MAAA,GAAS,MAAMA,mBAAA,CAAU,CAAC,KAAA,EAAO,WAAA,EAAa,MAAM,CAAC,CAAA;AAAA,EACvD,SAAS,KAAA,EAAO;AAAA,EAEhB;AAEA,EAAA,IAAI,UAAA;AACJ,EAAA,IAAI;AACF,IAAA,UAAA,GAAa,MAAMA,mBAAA,CAAU,CAAC,KAAA,EAAO,UAAA,EAAY,UAAU,CAAC,CAAA;AAAA,EAC9D,SAAS,KAAA,EAAO;AAAA,EAEhB;AAEA,EAAA,IAAI,MAAA,KAAW,MAAA,IAAa,UAAA,KAAe,MAAA,EAAW;AACpD,IAAA,OAAA,CAAQ,IAAA;AAAA,MACN;AAAA,KACF;AAAA,EACF;AAEA,EAAA,MAAM,EAAE,OAAA,EAAS,cAAA,EAAe,GAAI,MAAMC,mBAAA,CAAG,QAAA;AAAA,IAC3CC,qBAAA,CAAY,QAAQ,cAAc;AAAA,GACpC;AAEA,EAAA,OAAO;AAAA,IACL,UAAA,EAAYC,gBAAA;AAAA,IACZ,YAAY,UAAA,IAAc,SAAA;AAAA,IAC1B,cAAA;AAAA,IACA,SAAA;AAAA,IACA,QAAQ,MAAA,IAAU;AAAA,GACpB;AACF;AAEA,eAAsB,YAAA,CACpB,OACA,OAAA,EACwB;AACxB,EAAA,MAAM;AAAA,IACJ,aAAA;AAAA,IACA,KAAA;AAAA,IACA,cAAA;AAAA,IACA,sBAAA;AAAA,IACA,aAAA,GAAgB,EAAA;AAAA,IAChB;AAAA,GACF,GAAI,OAAA;AAEJ,EAAA,MAAM,EAAE,OAAA,EAAS,OAAA,EAAQ,GAAIC,sBAAW,OAAO,CAAA;AAI/C,EAAA,MAAM,YAAA,GAAe,cAAA,CAAe,cAAA,EAAgB,sBAAsB,CAAA;AAC1E,EAAA,IAAI,UAAA,GAAa,YAAA,CAAa,QAAA,CAAS,OAAA,CAAQ,OAAO,EAAE,CAAA;AACxD,EAAA,IAAI,aAAA,EAAe;AACjB,IAAA,UAAA,GAAa,GAAG,UAAU,CAAA,EAAG,aAAa,CAAA,CAAA,CAAG,OAAA,CAAQ,MAAM,GAAG,CAAA;AAAA,EAChE;AAEA,EAAA,IAAI,KAAA,EAAO;AACT,IAAA,MAAM,EAAE,IAAA,EAAM,IAAA,EAAK,GAAI,eAAA;AAAA,MACrB,OAAA,CAAQ,cAAA;AAAA,MACR,OAAA,CAAQ;AAAA,KACV;AAEA,IAAA,MAAM,cAAA,GAAiB;AAAA,MACrB,OAAA,EAAS;AAAA,QACP,YAAA,EAAc,IAAA;AAAA,QACd,QAAA,EAAU,IAAA;AAAA,QACV,QAAA,EAAU;AAAA;AACZ,KACF;AAEA,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,MAAM,kBAAA,GAAqB,QAAQ,sCAAsC,CAAA;AACzE,MAAA,OAAA,CAAQ,IAAA,CAAK,IAAI,kBAAA,CAAmB,cAAc,CAAC,CAAA;AAAA,IACrD,CAAA,MAAO;AACL,MAAA,MAAM,wBAAA,GAA2B,QAAQ,8BAA8B,CAAA;AACvE,MAAA,OAAA,CAAQ,IAAA,CAAK,IAAI,wBAAA,CAAyB,cAAc,CAAC,CAAA;AAAA,IAC3D;AAAA,EACF;AAEA,EAAA,IAAI,aAAA,EAAe;AACjB,IAAA,MAAM,eAAA,GAAkB,OAAA,GACnB,OAAA,CAAQ,gCAAgC,CAAA,GACzCC,2CAAA;AACJ,IAAA,MAAM,YAAA,GAAe,OAAA,GAChB,OAAA,CAAQ,uBAAuB,CAAA,GAChCC,mCAAA;AACJ,IAAA,OAAA,CAAQ,IAAA;AAAA,MACN,IAAI,eAAA,CAAgB;AAAA,QAClB,YAAY,EAAE,UAAA,EAAY,KAAA,CAAM,cAAA,EAAgB,aAAa,IAAA;AAAK,OACnE,CAAA;AAAA,MACD,IAAI,YAAA,CAAa;AAAA,QACf,KAAA,EAAO,KAAA;AAAA;AAAA,QACP,SAAS,KAAA,CAAM,UAAA;AAAA,QACf,KAAA,EAAO,CAAC,sCAAsC;AAAA,OAC/C;AAAA,KACH;AAAA,EACF;AAEA,EAAA,MAAM,OAAA,GAAU,UAAW,OAAA,GAAuCC,WAAA;AAKlE,EAAA,OAAA,CAAQ,IAAA;AAAA,IACN,IAAI,QAAQ,aAAA,CAAc;AAAA,MACxB,OAAA,EAAS,OAAA,CAAQ,OAAA,CAAQ,iBAAiB,CAAA;AAAA,MAC1C,MAAA,EAAQ,CAAC,QAAA,EAAU,QAAQ;AAAA,KAC5B;AAAA,GACH;AAEA,EAAA,IAAI,CAAC,QAAQ,sBAAA,EAAwB;AACnC,IAAA,MAAM,eAAA,GAAkB;AAAA,MACtB,IAAA,EAAM;AAAA,QACJ,oBAAA,EAAsB,SAAS,OAAA,IAAW;AAAA,OAC5C;AAAA,MACA,UAAU,KAAA,CAAM,UAAA;AAAA,MAChB,kBAAA,EAAoB;AAAA,QAClB,UAAA;AAAA,QACA,MAAA,EAAQ;AAAA;AACV,KACF;AACA,IAAA,IAAI,OAAA,EAAS;AAGX,MAAA,OAAA,CAAQ,IAAA,CAAK,IAAIC,kCAAA,CAAkB,eAAe,CAAC,CAAA;AAAA,IACrD,CAAA,MAAO;AAQL,MAAA,OAAA,CAAQ,IAAA;AAAA,QACN,IAAIC,iEAAA;AAAA,UACF,eAAA;AAAA,UACA,OAAA,CAAQ;AAAA;AACV,OACF;AAAA,IACF;AACA,IAAA,OAAA,CAAQ,IAAA;AAAA,MACN,IAAID,kCAAA,CAAkB;AAAA,QACpB,IAAA,EAAM;AAAA,UACJ,oBAAA,EAAsB,SAAS,OAAA,IAAW,QAAA;AAAA;AAAA,UAE1C,uBAAA,EAAyB;AAAA,SAC3B;AAAA,QACA,MAAA,EAAQ,KAAA;AAAA,QACR,UAAA,EAAY,mBAAA;AAAA,QACZ,QAAA,EAAU,iBAAA;AAAA,QACV,QAAA,EAAU,GAAG,OAAA,CAAQ,OAAA,CAAQ,YAAY,CAAC,CAAA,CAAA,EAAI,MAAM,UAAU,CAAA;AAAA,OAC/D;AAAA,KACH;AAAA,EACF;AAEA,EAAA,IAAI,QAAQ,sBAAA,EAAwB;AAClC,IAAA,MAAM,6BAAA,GAAgC,OAAA,GACjC,OAAA,CAAQ,qCAAqC,EAC3C,sBAAA,GACHE,6BAAA;AAEJ,IAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,sBAAA,CAAuB,OAAA,GAC3C,MAAA,CAAO,WAAA;AAAA,MACL,MAAA,CAAO,OAAA,CAAQ,OAAA,CAAQ,sBAAA,EAAwB,OAAO,CAAA,CAAE,GAAA;AAAA,QACtD,CAAC,CAAC,CAAA,EAAG,CAAC,CAAA,KAAM,CAAC,CAAA,EAAGC,iBAAA,CAAY,KAAA,CAAM,UAAA,EAAY,CAAC,CAAC;AAAA;AAClD,KACF,GACA;AAAA,MACE,KAAK,KAAA,CAAM;AAAA,KACb;AAEJ,IAAA,OAAA,CAAQ,IAAA;AAAA,MACN,IAAI,6BAAA,CAA8B;AAAA,QAChC,QAAA,EAAU,gBAAA;AAAA,QACV,OAAA;AAAA,QACA,IAAA,EAAM,QAAQ,sBAAA,CAAuB,IAAA;AAAA,QACrC,OAAA,EAAS,KAAA;AAAA,QACT,MAAA,EAAQ,QAAQ,sBAAA,CAAuB;AAAA,OACxC;AAAA,KACH;AAAA,EACF;AAEA,EAAA,MAAM,SAAA,GAAY,MAAM,aAAA,EAAc;AAEtC,EAAA,OAAA,CAAQ,IAAA;AAAA,IACN,OAAA,GACI,IAAI,OAAA,CAAQ,YAAA,CAAa;AAAA,MACvB,wBAAA,EAA0B,IAAA,CAAK,SAAA,CAAU,SAAS,CAAA;AAAA,MAClD,wBAAA,EAA0B,QAAQ,YAAA,CAAa,YAAA;AAAA,QAC7C,MAAM,IAAA,CAAK,SAAA,CAAU,OAAA,CAAQ,uBAAuB,CAAA;AAAA,QACpD;AAAA,OACF;AAAA;AAAA;AAAA,MAGA,oCAAoC,IAAA,CAAK,SAAA;AAAA,QACvCC,mCAAA;AAAkB;AACpB,KACD,CAAA,GACD,IAAI,OAAA,CAAQ,YAAA,CAAa;AAAA,MACvB,wBAAA,EAA0B,IAAA,CAAK,SAAA,CAAU,SAAS,CAAA;AAAA,MAClD,wBAAA,EAA0B,IAAA,CAAK,SAAA,CAAU,EAAE,CAAA;AAAA;AAAA;AAAA;AAAA,MAG3C,oCAAoC,IAAA,CAAK,SAAA;AAAA,QACvCA,mCAAA;AAAkB;AACpB,KACD;AAAA,GACP;AAEA,EAAA,IAAI,QAAQ,eAAA,EAAiB;AAC3B,IAAA,OAAA,CAAQ,IAAA;AAAA,MACN,GAAI,MAAMC,4CAAA;AAAA,QACR,OAAA;AAAA,QACA,OAAA,CAAQ;AAAA;AACV,KACF;AAAA,EACF;AAKA,EAAA,MAAM,oBAAoB,OAAA,GACtB;AAAA,IACE,OAAA,CAAQ,OAAA;AAAA,MACN;AAAA,KACF;AAAA,IACA,OAAA,CAAQ,OAAA;AAAA,MACN;AAAA,KACF;AAAA,IACA,OAAA,CAAQ,QAAQ,eAAe;AAAA,MAEjC,EAAC;AAEL,EAAA,MAAM,IAAA,GAAO,QAAQ,aAAA,GAAgB,YAAA;AACrC,EAAA,MAAMC,cAAA,GAAeC,0BAAmB,OAAO,CAAA;AAE/C,EAAA,OAAO;AAAA,IACL,IAAA;AAAA,IACA,OAAA,EAAS,KAAA;AAAA,IACT,GAAI,KAAA,GACA;AAAA,MACE,YAAA,EAAc;AAAA,QACZ,OAAA,EAAS;AAAA;AACX,QAEF,EAAC;AAAA,kBACLD,cAAA;AAAA,IACA,IAAA,EAAM,KAAA;AAAA,IACN,WAAA,EAAa;AAAA,MACX,KAAA,EAAO;AAAA;AAAA,KACT;AAAA,IACA,OAAA,EAAS,QAAQ,8BAAA,GAAiC,YAAA;AAAA,IAClD,SAAS,KAAA,CAAM,UAAA;AAAA,IACf,KAAA,EAAO;AAAA;AAAA,MAELE,sBAAA,CAAa,SAAS,CAAA,CAAE,OAAA,CAAQ,4BAA4B,CAAA;AAAA,MAC5D,GAAI,OAAA,CAAQ,qBAAA,IAAyB,EAAC;AAAA,MACtC,KAAA,CAAM;AAAA,KACR;AAAA,IACA,OAAA,EAAS;AAAA,MACP,UAAA,EAAY,CAAC,KAAA,EAAO,MAAA,EAAQ,QAAQ,KAAA,EAAO,MAAA,EAAQ,SAAS,OAAO,CAAA;AAAA,MACnE,UAAA,EAAY,CAAC,SAAA,EAAW,QAAA,EAAU,MAAM,CAAA;AAAA,MACxC,QAAA,EAAU;AAAA,QACR,GAAGC,uBAAA,CAAO,OAAA,CAAQ,qBAAqB,CAAC,CAAA;AAAA,QACxC,MAAA,EAAQ,KAAA;AAAA,QACR,KAAA,EAAO,KAAA;AAAA,QACP,GAAA,EAAK,KAAA;AAAA,QACL,EAAA,EAAI,KAAA;AAAA,QACJ,KAAA,EAAO,KAAA;AAAA,QACP,GAAA,EAAK,KAAA;AAAA,QACL,GAAA,EAAK,KAAA;AAAA,QACL,aAAA,EAAe,KAAA;AAAA;AAAA,QAGf,IAAA,EAAM,KAAA;AAAA,QACN,KAAA,EAAO,KAAA;AAAA,QACP,IAAA,EAAM,KAAA;AAAA,QACN,IAAA,EAAM,OAAA,CAAQ,OAAA,CAAQ,OAAO;AAAA,OAC/B;AAAA;AAAA,MAEA,GAAI,OAAA,IAAW;AAAA,QACb,OAAA,EAAS;AAAA,UACP,IAAIC,kCAAA;AAAA,YACF,CAAC,KAAA,CAAM,SAAA,EAAW,KAAA,CAAM,SAAS,CAAA;AAAA,YACjC,CAAC,KAAA,CAAM,iBAAA,EAAmB,GAAG,iBAAiB;AAAA;AAChD;AACF;AACF,KACF;AAAA,IACA,MAAA,EAAQ;AAAA,MACN,KAAA,EAAO;AAAA,KACT;AAAA,IACA,MAAA,EAAQ;AAAA,MACN,UAAA,EAAY,QAAQ,sBAAA,EAAwB,IAAA;AAAA,MAC5C,MAAM,KAAA,CAAM,UAAA;AAAA,MACZ,UAAA,EAAY,OAAA,CAAQ,sBAAA,GAAyB,MAAA,GAAS,GAAG,UAAU,CAAA,CAAA,CAAA;AAAA,MACnE,QAAA,EAAU,QAAQ,WAAA,GAAc,kCAAA;AAAA,MAChC,aAAA,EAAe,QACX,iBAAA,GACA,wCAAA;AAAA,MACJ,GAAI,KAAA,GACA;AAAA,QACE,+BAA+B,CAAC,IAAA,KAC9B,WAAWP,iBAAA,CAAY,IAAA,CAAK,oBAAoB,CAAA,CAAE,OAAA;AAAA,UAChD,KAAA;AAAA,UACA;AAAA,SACD,CAAA;AAAA,UAEL;AAAC,KACP;AAAA,IACA,WAAA,EAAa;AAAA,MACX,eAAA,EAAiBQ,mBAAA,CAAG,OAAA,CAAQ,GAAA,CAAI,6BAA6B,CAAA;AAAA,MAC7D,GAAI,CAAC,OAAA,IAAW;AAAA;AAAA,QAEd,GAAA,EAAK;AAAA;AACP,KACF;AAAA,IACA;AAAA,GACF;AACF;;;;;;"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var cliCommon = require('@backstage/cli-common');
|
|
4
|
+
|
|
5
|
+
function hasReactDomClient() {
|
|
6
|
+
try {
|
|
7
|
+
require.resolve("react-dom/client", {
|
|
8
|
+
paths: [cliCommon.targetPaths.dir]
|
|
9
|
+
});
|
|
10
|
+
return true;
|
|
11
|
+
} catch {
|
|
12
|
+
return false;
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
exports.hasReactDomClient = hasReactDomClient;
|
|
17
|
+
//# sourceMappingURL=hasReactDomClient.cjs.js.map
|