@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":"hasReactDomClient.cjs.js","sources":["../../../src/lib/bundler/hasReactDomClient.ts"],"sourcesContent":["/*\n * Copyright 2023 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 { targetPaths } from '@backstage/cli-common';\n\nexport function hasReactDomClient() {\n try {\n require.resolve('react-dom/client', {\n paths: [targetPaths.dir],\n });\n return true;\n } catch {\n return false;\n }\n}\n"],"names":["targetPaths"],"mappings":";;;;AAkBO,SAAS,iBAAA,GAAoB;AAClC,EAAA,IAAI;AACF,IAAA,OAAA,CAAQ,QAAQ,kBAAA,EAAoB;AAAA,MAClC,KAAA,EAAO,CAACA,qBAAA,CAAY,GAAG;AAAA,KACxB,CAAA;AACD,IAAA,OAAO,IAAA;AAAA,EACT,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,KAAA;AAAA,EACT;AACF;;;;"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var node_path = require('node:path');
|
|
4
|
+
var getPackages = require('@manypkg/get-packages');
|
|
5
|
+
var cliCommon = require('@backstage/cli-common');
|
|
6
|
+
|
|
7
|
+
async function createWorkspaceLinkingPlugins(bundler, workspace) {
|
|
8
|
+
const { packages: linkedPackages, root: linkedRoot } = await getPackages.getPackages(
|
|
9
|
+
workspace
|
|
10
|
+
);
|
|
11
|
+
const replacementRegex = new RegExp(
|
|
12
|
+
`^(?:${linkedPackages.map((pkg) => pkg.packageJson.name).join("|")})(?:/.*)?$`
|
|
13
|
+
);
|
|
14
|
+
return [
|
|
15
|
+
// Any imports of a package that is present in the linked workspace will
|
|
16
|
+
// be redirected to be resolved within the context of the linked workspace
|
|
17
|
+
new bundler.NormalModuleReplacementPlugin(replacementRegex, (resource) => {
|
|
18
|
+
resource.context = linkedRoot.dir;
|
|
19
|
+
}),
|
|
20
|
+
// react and react-dom are always resolved from the target directory
|
|
21
|
+
// Note: this often requires that the linked and target workspace use the same versions of React
|
|
22
|
+
new bundler.NormalModuleReplacementPlugin(
|
|
23
|
+
/^react(?:-router)?(?:-dom)?$/,
|
|
24
|
+
(resource) => {
|
|
25
|
+
if (!node_path.relative(linkedRoot.dir, resource.context).startsWith("..")) {
|
|
26
|
+
resource.context = cliCommon.targetPaths.dir;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
)
|
|
30
|
+
];
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
exports.createWorkspaceLinkingPlugins = createWorkspaceLinkingPlugins;
|
|
34
|
+
//# sourceMappingURL=linkWorkspaces.cjs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"linkWorkspaces.cjs.js","sources":["../../../src/lib/bundler/linkWorkspaces.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 { relative as relativePath } from 'node:path';\nimport { getPackages } from '@manypkg/get-packages';\nimport { rspack } from '@rspack/core';\nimport { targetPaths } from '@backstage/cli-common';\n\n/**\n * This returns of collection of plugins that links a separate workspace into\n * the target one. Any packages that are present in the linked workspaces will\n * always be used in place of the ones in the target workspace, with the exception\n * of react and react-dom which are always resolved from the target workspace.\n */\nexport async function createWorkspaceLinkingPlugins(\n bundler: typeof rspack,\n workspace: string,\n) {\n const { packages: linkedPackages, root: linkedRoot } = await getPackages(\n workspace,\n );\n\n // Matches all packages in the linked workspaces, as well as sub-path exports from them\n const replacementRegex = new RegExp(\n `^(?:${linkedPackages\n .map(pkg => pkg.packageJson.name)\n .join('|')})(?:/.*)?$`,\n );\n\n return [\n // Any imports of a package that is present in the linked workspace will\n // be redirected to be resolved within the context of the linked workspace\n new bundler.NormalModuleReplacementPlugin(replacementRegex, resource => {\n resource.context = linkedRoot.dir;\n }),\n // react and react-dom are always resolved from the target directory\n // Note: this often requires that the linked and target workspace use the same versions of React\n new bundler.NormalModuleReplacementPlugin(\n /^react(?:-router)?(?:-dom)?$/,\n resource => {\n if (!relativePath(linkedRoot.dir, resource.context).startsWith('..')) {\n resource.context = targetPaths.dir;\n }\n },\n ),\n ];\n}\n"],"names":["getPackages","relativePath","targetPaths"],"mappings":";;;;;;AA2BA,eAAsB,6BAAA,CACpB,SACA,SAAA,EACA;AACA,EAAA,MAAM,EAAE,QAAA,EAAU,cAAA,EAAgB,IAAA,EAAM,UAAA,KAAe,MAAMA,uBAAA;AAAA,IAC3D;AAAA,GACF;AAGA,EAAA,MAAM,mBAAmB,IAAI,MAAA;AAAA,IAC3B,CAAA,IAAA,EAAO,cAAA,CACJ,GAAA,CAAI,CAAA,GAAA,KAAO,GAAA,CAAI,YAAY,IAAI,CAAA,CAC/B,IAAA,CAAK,GAAG,CAAC,CAAA,UAAA;AAAA,GACd;AAEA,EAAA,OAAO;AAAA;AAAA;AAAA,IAGL,IAAI,OAAA,CAAQ,6BAAA,CAA8B,gBAAA,EAAkB,CAAA,QAAA,KAAY;AACtE,MAAA,QAAA,CAAS,UAAU,UAAA,CAAW,GAAA;AAAA,IAChC,CAAC,CAAA;AAAA;AAAA;AAAA,IAGD,IAAI,OAAA,CAAQ,6BAAA;AAAA,MACV,8BAAA;AAAA,MACA,CAAA,QAAA,KAAY;AACV,QAAA,IAAI,CAACC,mBAAa,UAAA,CAAW,GAAA,EAAK,SAAS,OAAO,CAAA,CAAE,UAAA,CAAW,IAAI,CAAA,EAAG;AACpE,UAAA,QAAA,CAAS,UAAUC,qBAAA,CAAY,GAAA;AAAA,QACjC;AAAA,MACF;AAAA;AACF,GACF;AACF;;;;"}
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var entryPoints = require('../entryPoints.cjs.js');
|
|
4
|
+
var typeDistProject = require('../typeDistProject.cjs.js');
|
|
5
|
+
var moduleFederationCommon = require('@backstage/module-federation-common');
|
|
6
|
+
var node_path = require('node:path');
|
|
7
|
+
var fs = require('fs-extra');
|
|
8
|
+
var chokidar = require('chokidar');
|
|
9
|
+
var PQueue = require('p-queue');
|
|
10
|
+
|
|
11
|
+
function _interopDefaultCompat (e) { return e && typeof e === 'object' && 'default' in e ? e : { default: e }; }
|
|
12
|
+
|
|
13
|
+
var fs__default = /*#__PURE__*/_interopDefaultCompat(fs);
|
|
14
|
+
var chokidar__default = /*#__PURE__*/_interopDefaultCompat(chokidar);
|
|
15
|
+
var PQueue__default = /*#__PURE__*/_interopDefaultCompat(PQueue);
|
|
16
|
+
|
|
17
|
+
async function getModuleFederationRemoteOptions(packageJson, packageDir) {
|
|
18
|
+
let exposes;
|
|
19
|
+
const packageRole = packageJson.backstage?.role;
|
|
20
|
+
if (packageJson.exports && packageRole) {
|
|
21
|
+
const project = await typeDistProject.createTypeDistProject();
|
|
22
|
+
exposes = Object.fromEntries(
|
|
23
|
+
entryPoints.readEntryPoints(packageJson).filter((ep) => {
|
|
24
|
+
if (ep.mount === "./package.json") {
|
|
25
|
+
return false;
|
|
26
|
+
}
|
|
27
|
+
if (ep.mount === ".") {
|
|
28
|
+
return true;
|
|
29
|
+
}
|
|
30
|
+
return typeDistProject.getEntryPointDefaultFeatureType(
|
|
31
|
+
packageRole,
|
|
32
|
+
packageDir,
|
|
33
|
+
project,
|
|
34
|
+
ep.path
|
|
35
|
+
) !== null;
|
|
36
|
+
}).map((ep) => [ep.mount, ep.path])
|
|
37
|
+
);
|
|
38
|
+
}
|
|
39
|
+
return {
|
|
40
|
+
// The default output mode requires the name to be a usable as a code
|
|
41
|
+
// symbol, there might be better options here but for now we need to
|
|
42
|
+
// sanitize the name.
|
|
43
|
+
name: packageJson.name.replaceAll("@", "").replaceAll("/", "__").replaceAll("-", "_"),
|
|
44
|
+
exposes,
|
|
45
|
+
sharedDependencies: moduleFederationCommon.defaultRemoteSharedDependencies()
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
function prepareRuntimeSharedDependenciesScript(hostSharedDependencies) {
|
|
49
|
+
const items = Object.entries(hostSharedDependencies).map(
|
|
50
|
+
([name, sharedDep]) => {
|
|
51
|
+
if (!sharedDep.version) {
|
|
52
|
+
throw new Error(`Version is required for shared dependency '${name}'`);
|
|
53
|
+
}
|
|
54
|
+
return {
|
|
55
|
+
name,
|
|
56
|
+
version: sharedDep.version,
|
|
57
|
+
lib: name,
|
|
58
|
+
// Coverted into import below
|
|
59
|
+
shareConfig: {
|
|
60
|
+
singleton: sharedDep.singleton,
|
|
61
|
+
requiredVersion: sharedDep.requiredVersion,
|
|
62
|
+
eager: sharedDep.eager
|
|
63
|
+
}
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
);
|
|
67
|
+
return `window['${moduleFederationCommon.BACKSTAGE_RUNTIME_SHARED_DEPENDENCIES_GLOBAL}'] = ${JSON.stringify(
|
|
68
|
+
{ items, version: "v1" },
|
|
69
|
+
null,
|
|
70
|
+
2
|
|
71
|
+
).replace(
|
|
72
|
+
/"lib": ("[^"]+")/gm,
|
|
73
|
+
(_, name) => `"lib": () => import(${name})`
|
|
74
|
+
)};`;
|
|
75
|
+
}
|
|
76
|
+
const RUNTIME_SHARED_DEPENDENCIES_MODULE_NAME = "__backstage-module-federation-runtime-shared-dependencies__";
|
|
77
|
+
const writeQueue = new PQueue__default.default({ concurrency: 1 });
|
|
78
|
+
async function writeRuntimeSharedDependenciesModule(targetPath, runtimeSharedDependencies) {
|
|
79
|
+
const script = prepareRuntimeSharedDependenciesScript(
|
|
80
|
+
runtimeSharedDependencies
|
|
81
|
+
);
|
|
82
|
+
await writeQueue.add(async () => {
|
|
83
|
+
const path = node_path.join(
|
|
84
|
+
targetPath,
|
|
85
|
+
"node_modules",
|
|
86
|
+
`${RUNTIME_SHARED_DEPENDENCIES_MODULE_NAME}.js`
|
|
87
|
+
);
|
|
88
|
+
await fs__default.default.ensureDir(node_path.dirname(path));
|
|
89
|
+
await fs__default.default.writeFile(path, script);
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
function resolveSharedDependencyVersions(targetPath, hostSharedDependencies) {
|
|
93
|
+
return Object.fromEntries(
|
|
94
|
+
Object.entries(hostSharedDependencies).filter(([_, sharedDep]) => sharedDep !== void 0).flatMap(([importPath, sharedDep]) => {
|
|
95
|
+
const moduleName = importPath.startsWith("@") ? importPath.split("/").slice(0, 2).join("/") : importPath.split("/")[0];
|
|
96
|
+
let version;
|
|
97
|
+
try {
|
|
98
|
+
const packagePath = require.resolve(`${moduleName}/package.json`, {
|
|
99
|
+
paths: [targetPath]
|
|
100
|
+
});
|
|
101
|
+
version = require(packagePath).version;
|
|
102
|
+
} catch (e) {
|
|
103
|
+
console.log(
|
|
104
|
+
`Skipping module federation shared dependency '${importPath}' because it could not be resolved.`
|
|
105
|
+
);
|
|
106
|
+
return [];
|
|
107
|
+
}
|
|
108
|
+
return [[importPath, { ...sharedDep, version }]];
|
|
109
|
+
})
|
|
110
|
+
);
|
|
111
|
+
}
|
|
112
|
+
async function createRuntimeSharedDependenciesEntryPoint(options) {
|
|
113
|
+
const { targetPath, watch } = options;
|
|
114
|
+
const doWriteSharedDependenciesModule = async () => {
|
|
115
|
+
const sharedDependencies = moduleFederationCommon.defaultHostSharedDependencies();
|
|
116
|
+
await writeRuntimeSharedDependenciesModule(
|
|
117
|
+
targetPath,
|
|
118
|
+
resolveSharedDependencyVersions(targetPath, sharedDependencies)
|
|
119
|
+
);
|
|
120
|
+
};
|
|
121
|
+
if (watch) {
|
|
122
|
+
const watcher = chokidar__default.default.watch(node_path.resolve(targetPath, "package.json"));
|
|
123
|
+
watcher.on("change", async () => {
|
|
124
|
+
await doWriteSharedDependenciesModule();
|
|
125
|
+
watch();
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
await doWriteSharedDependenciesModule();
|
|
129
|
+
return [RUNTIME_SHARED_DEPENDENCIES_MODULE_NAME];
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
exports.createRuntimeSharedDependenciesEntryPoint = createRuntimeSharedDependenciesEntryPoint;
|
|
133
|
+
exports.getModuleFederationRemoteOptions = getModuleFederationRemoteOptions;
|
|
134
|
+
exports.prepareRuntimeSharedDependenciesScript = prepareRuntimeSharedDependenciesScript;
|
|
135
|
+
//# sourceMappingURL=moduleFederation.cjs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"moduleFederation.cjs.js","sources":["../../../src/lib/bundler/moduleFederation.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 { ModuleFederationRemoteOptions } from './types';\nimport { BackstagePackageJson } from '@backstage/cli-node';\nimport { readEntryPoints } from '../entryPoints';\nimport {\n createTypeDistProject,\n getEntryPointDefaultFeatureType,\n} from '../typeDistProject';\nimport {\n BACKSTAGE_RUNTIME_SHARED_DEPENDENCIES_GLOBAL,\n defaultRemoteSharedDependencies,\n defaultHostSharedDependencies,\n HostSharedDependencies,\n RuntimeSharedDependenciesGlobal,\n} from '@backstage/module-federation-common';\nimport { dirname, join as joinPath, resolve as resolvePath } from 'node:path';\nimport fs from 'fs-extra';\nimport chokidar from 'chokidar';\nimport PQueue from 'p-queue';\n\n// Remote modules management utilities\n\nexport async function getModuleFederationRemoteOptions(\n packageJson: BackstagePackageJson,\n packageDir: string,\n): Promise<ModuleFederationRemoteOptions | undefined> {\n let exposes: ModuleFederationRemoteOptions['exposes'];\n const packageRole = packageJson.backstage?.role;\n if (packageJson.exports && packageRole) {\n const project = await createTypeDistProject();\n exposes = Object.fromEntries(\n readEntryPoints(packageJson)\n .filter(ep => {\n if (ep.mount === './package.json') {\n return false;\n }\n if (ep.mount === '.') {\n return true;\n }\n // Include this additional entry point in the exposed modules\n // if it exports a feature as default export.\n return (\n getEntryPointDefaultFeatureType(\n packageRole,\n packageDir,\n project,\n ep.path,\n ) !== null\n );\n })\n .map(ep => [ep.mount, ep.path]),\n );\n }\n\n return {\n // The default output mode requires the name to be a usable as a code\n // symbol, there might be better options here but for now we need to\n // sanitize the name.\n name: packageJson.name\n .replaceAll('@', '')\n .replaceAll('/', '__')\n .replaceAll('-', '_'),\n exposes,\n sharedDependencies: defaultRemoteSharedDependencies(),\n };\n}\n\n// Module federation host management utilities\n\n/**\n * Prepares the runtime shared dependencies script for the module federation host,\n * which will be written by the CLI into a Javascript file added as an additional entry point for the frontend bundler.\n * This script is used in the browser to build the list of shared dependencies provided to the module federation runtime.\n *\n * @internal\n */\nexport function prepareRuntimeSharedDependenciesScript(\n hostSharedDependencies: HostSharedDependencies,\n) {\n const items = Object.entries(hostSharedDependencies).map(\n ([name, sharedDep]) => {\n if (!sharedDep.version) {\n throw new Error(`Version is required for shared dependency '${name}'`);\n }\n return {\n name,\n version: sharedDep.version,\n lib: name as unknown as () => Promise<unknown>, // Coverted into import below\n shareConfig: {\n singleton: sharedDep.singleton,\n requiredVersion: sharedDep.requiredVersion,\n eager: sharedDep.eager,\n },\n };\n },\n );\n\n return `window['${BACKSTAGE_RUNTIME_SHARED_DEPENDENCIES_GLOBAL}'] = ${JSON.stringify(\n { items, version: 'v1' } satisfies RuntimeSharedDependenciesGlobal,\n null,\n 2,\n ).replace(\n /\"lib\": (\"[^\"]+\")/gm,\n (_, name) => `\"lib\": () => import(${name})`,\n )};`;\n}\n\nconst RUNTIME_SHARED_DEPENDENCIES_MODULE_NAME =\n '__backstage-module-federation-runtime-shared-dependencies__';\n\n// Make sure we're not issuing multiple writes at the same time, which can cause partial overwrites\nconst writeQueue = new PQueue({ concurrency: 1 });\n\nasync function writeRuntimeSharedDependenciesModule(\n targetPath: string,\n runtimeSharedDependencies: HostSharedDependencies,\n) {\n const script = prepareRuntimeSharedDependenciesScript(\n runtimeSharedDependencies,\n );\n\n await writeQueue.add(async () => {\n const path = joinPath(\n targetPath,\n 'node_modules',\n `${RUNTIME_SHARED_DEPENDENCIES_MODULE_NAME}.js`,\n );\n\n await fs.ensureDir(dirname(path));\n await fs.writeFile(path, script);\n });\n}\n\nfunction resolveSharedDependencyVersions(\n targetPath: string,\n hostSharedDependencies: HostSharedDependencies,\n): HostSharedDependencies {\n return Object.fromEntries(\n Object.entries(hostSharedDependencies)\n .filter(([_, sharedDep]) => sharedDep !== undefined)\n .flatMap(([importPath, sharedDep]) => {\n // Remove any sub-path exports from the import path\n const moduleName = importPath.startsWith('@')\n ? importPath.split('/').slice(0, 2).join('/')\n : importPath.split('/')[0];\n\n let version: string;\n try {\n const packagePath = require.resolve(`${moduleName}/package.json`, {\n paths: [targetPath],\n });\n version = require(packagePath).version;\n } catch (e) {\n console.log(\n `Skipping module federation shared dependency '${importPath}' because it could not be resolved.`,\n );\n return [];\n }\n\n return [[importPath, { ...sharedDep, version }]];\n }),\n );\n}\n\nexport async function createRuntimeSharedDependenciesEntryPoint(options: {\n targetPath: string;\n watch?: () => void;\n}): Promise<string[]> {\n const { targetPath, watch } = options;\n\n const doWriteSharedDependenciesModule = async () => {\n const sharedDependencies = defaultHostSharedDependencies();\n await writeRuntimeSharedDependenciesModule(\n targetPath,\n resolveSharedDependencyVersions(targetPath, sharedDependencies),\n );\n };\n\n if (watch) {\n const watcher = chokidar.watch(resolvePath(targetPath, 'package.json'));\n watcher.on('change', async () => {\n await doWriteSharedDependenciesModule();\n watch();\n });\n }\n await doWriteSharedDependenciesModule();\n\n return [RUNTIME_SHARED_DEPENDENCIES_MODULE_NAME];\n}\n"],"names":["createTypeDistProject","readEntryPoints","getEntryPointDefaultFeatureType","defaultRemoteSharedDependencies","BACKSTAGE_RUNTIME_SHARED_DEPENDENCIES_GLOBAL","PQueue","joinPath","fs","dirname","defaultHostSharedDependencies","chokidar","resolvePath"],"mappings":"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"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var core = require('@rspack/core');
|
|
4
|
+
|
|
5
|
+
const optimization = (options) => {
|
|
6
|
+
const { isDev, webpack } = options;
|
|
7
|
+
const MinifyPlugin = webpack ? require("esbuild-loader").EsbuildPlugin : core.SwcJsMinimizerRspackPlugin;
|
|
8
|
+
return {
|
|
9
|
+
minimize: !isDev,
|
|
10
|
+
minimizer: [
|
|
11
|
+
new MinifyPlugin({
|
|
12
|
+
target: "ES2023",
|
|
13
|
+
format: "iife",
|
|
14
|
+
exclude: "remoteEntry.js"
|
|
15
|
+
}),
|
|
16
|
+
// Avoid iife wrapping of module federation remote entry as it breaks the variable assignment
|
|
17
|
+
new MinifyPlugin({
|
|
18
|
+
target: "ES2023",
|
|
19
|
+
format: void 0,
|
|
20
|
+
include: "remoteEntry.js"
|
|
21
|
+
}),
|
|
22
|
+
webpack ? void 0 : new core.LightningCssMinimizerRspackPlugin()
|
|
23
|
+
],
|
|
24
|
+
runtimeChunk: "single",
|
|
25
|
+
splitChunks: {
|
|
26
|
+
automaticNameDelimiter: "-",
|
|
27
|
+
cacheGroups: {
|
|
28
|
+
default: false,
|
|
29
|
+
// Put all vendor code needed for initial page load in individual files if they're big
|
|
30
|
+
// enough, if they're smaller they end up in the main
|
|
31
|
+
packages: {
|
|
32
|
+
chunks: "initial",
|
|
33
|
+
test(module) {
|
|
34
|
+
return Boolean(
|
|
35
|
+
module?.resource?.match(/[\\/]node_modules[\\/](.*?)([\\/]|$)/)
|
|
36
|
+
);
|
|
37
|
+
},
|
|
38
|
+
name(module) {
|
|
39
|
+
const packageName = module.resource.match(
|
|
40
|
+
/[\\/]node_modules[\\/](.*?)([\\/]|$)/
|
|
41
|
+
)[1];
|
|
42
|
+
return packageName.replace("@", "");
|
|
43
|
+
},
|
|
44
|
+
filename: isDev ? "module-[name].js" : "static/module-[name].[contenthash:8].js",
|
|
45
|
+
priority: 10,
|
|
46
|
+
minSize: 1e5,
|
|
47
|
+
minChunks: 1,
|
|
48
|
+
...webpack && {
|
|
49
|
+
maxAsyncRequests: Infinity,
|
|
50
|
+
maxInitialRequests: Infinity
|
|
51
|
+
}
|
|
52
|
+
},
|
|
53
|
+
// filename is not included in type, but we need it
|
|
54
|
+
// Group together the smallest modules
|
|
55
|
+
vendor: {
|
|
56
|
+
chunks: "initial",
|
|
57
|
+
test: /[\\/]node_modules[\\/]/,
|
|
58
|
+
name: "vendor",
|
|
59
|
+
priority: 5,
|
|
60
|
+
enforce: true
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
};
|
|
65
|
+
};
|
|
66
|
+
|
|
67
|
+
exports.optimization = optimization;
|
|
68
|
+
//# sourceMappingURL=optimization.cjs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"optimization.cjs.js","sources":["../../../src/lib/bundler/optimization.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 { BundlingOptions } from './types';\nimport {\n SwcJsMinimizerRspackPlugin,\n LightningCssMinimizerRspackPlugin,\n RspackOptionsNormalized,\n} from '@rspack/core';\n\nexport const optimization = (\n options: BundlingOptions,\n): RspackOptionsNormalized['optimization'] => {\n const { isDev, webpack } = options;\n\n const MinifyPlugin = webpack\n ? require('esbuild-loader').EsbuildPlugin\n : SwcJsMinimizerRspackPlugin;\n\n return {\n minimize: !isDev,\n minimizer: [\n new MinifyPlugin({\n target: 'ES2023',\n format: 'iife',\n exclude: 'remoteEntry.js',\n }),\n // Avoid iife wrapping of module federation remote entry as it breaks the variable assignment\n new MinifyPlugin({\n target: 'ES2023',\n format: undefined,\n include: 'remoteEntry.js',\n }),\n webpack ? undefined : new LightningCssMinimizerRspackPlugin(),\n ],\n runtimeChunk: 'single',\n splitChunks: {\n automaticNameDelimiter: '-',\n cacheGroups: {\n default: false,\n // Put all vendor code needed for initial page load in individual files if they're big\n // enough, if they're smaller they end up in the main\n packages: {\n chunks: 'initial',\n test(module: any) {\n return Boolean(\n module?.resource?.match(/[\\\\/]node_modules[\\\\/](.*?)([\\\\/]|$)/),\n );\n },\n name(module: any) {\n // get the name. E.g. node_modules/packageName/not/this/part.js\n // or node_modules/packageName\n const packageName = module.resource.match(\n /[\\\\/]node_modules[\\\\/](.*?)([\\\\/]|$)/,\n )[1];\n\n // npm package names are URL-safe, but some servers don't like @ symbols\n return packageName.replace('@', '');\n },\n filename: isDev\n ? 'module-[name].js'\n : 'static/module-[name].[contenthash:8].js',\n priority: 10,\n minSize: 100000,\n minChunks: 1,\n ...(webpack && {\n maxAsyncRequests: Infinity,\n maxInitialRequests: Infinity,\n }),\n }, // filename is not included in type, but we need it\n // Group together the smallest modules\n vendor: {\n chunks: 'initial',\n test: /[\\\\/]node_modules[\\\\/]/,\n name: 'vendor',\n priority: 5,\n enforce: true,\n },\n },\n },\n };\n};\n"],"names":["SwcJsMinimizerRspackPlugin","LightningCssMinimizerRspackPlugin"],"mappings":";;;;AAuBO,MAAM,YAAA,GAAe,CAC1B,OAAA,KAC4C;AAC5C,EAAA,MAAM,EAAE,KAAA,EAAO,OAAA,EAAQ,GAAI,OAAA;AAE3B,EAAA,MAAM,YAAA,GAAe,OAAA,GACjB,OAAA,CAAQ,gBAAgB,EAAE,aAAA,GAC1BA,+BAAA;AAEJ,EAAA,OAAO;AAAA,IACL,UAAU,CAAC,KAAA;AAAA,IACX,SAAA,EAAW;AAAA,MACT,IAAI,YAAA,CAAa;AAAA,QACf,MAAA,EAAQ,QAAA;AAAA,QACR,MAAA,EAAQ,MAAA;AAAA,QACR,OAAA,EAAS;AAAA,OACV,CAAA;AAAA;AAAA,MAED,IAAI,YAAA,CAAa;AAAA,QACf,MAAA,EAAQ,QAAA;AAAA,QACR,MAAA,EAAQ,MAAA;AAAA,QACR,OAAA,EAAS;AAAA,OACV,CAAA;AAAA,MACD,OAAA,GAAU,MAAA,GAAY,IAAIC,sCAAA;AAAkC,KAC9D;AAAA,IACA,YAAA,EAAc,QAAA;AAAA,IACd,WAAA,EAAa;AAAA,MACX,sBAAA,EAAwB,GAAA;AAAA,MACxB,WAAA,EAAa;AAAA,QACX,OAAA,EAAS,KAAA;AAAA;AAAA;AAAA,QAGT,QAAA,EAAU;AAAA,UACR,MAAA,EAAQ,SAAA;AAAA,UACR,KAAK,MAAA,EAAa;AAChB,YAAA,OAAO,OAAA;AAAA,cACL,MAAA,EAAQ,QAAA,EAAU,KAAA,CAAM,sCAAsC;AAAA,aAChE;AAAA,UACF,CAAA;AAAA,UACA,KAAK,MAAA,EAAa;AAGhB,YAAA,MAAM,WAAA,GAAc,OAAO,QAAA,CAAS,KAAA;AAAA,cAClC;AAAA,cACA,CAAC,CAAA;AAGH,YAAA,OAAO,WAAA,CAAY,OAAA,CAAQ,GAAA,EAAK,EAAE,CAAA;AAAA,UACpC,CAAA;AAAA,UACA,QAAA,EAAU,QACN,kBAAA,GACA,yCAAA;AAAA,UACJ,QAAA,EAAU,EAAA;AAAA,UACV,OAAA,EAAS,GAAA;AAAA,UACT,SAAA,EAAW,CAAA;AAAA,UACX,GAAI,OAAA,IAAW;AAAA,YACb,gBAAA,EAAkB,QAAA;AAAA,YAClB,kBAAA,EAAoB;AAAA;AACtB,SACF;AAAA;AAAA;AAAA,QAEA,MAAA,EAAQ;AAAA,UACN,MAAA,EAAQ,SAAA;AAAA,UACR,IAAA,EAAM,wBAAA;AAAA,UACN,IAAA,EAAM,QAAA;AAAA,UACN,QAAA,EAAU,CAAA;AAAA,UACV,OAAA,EAAS;AAAA;AACX;AACF;AACF,GACF;AACF;;;;"}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var config = require('@backstage/config');
|
|
4
|
+
var chokidar = require('chokidar');
|
|
5
|
+
var fs = require('fs-extra');
|
|
6
|
+
var PQueue = require('p-queue');
|
|
7
|
+
var node_path = require('node:path');
|
|
8
|
+
var cliCommon = require('@backstage/cli-common');
|
|
9
|
+
|
|
10
|
+
function _interopDefaultCompat (e) { return e && typeof e === 'object' && 'default' in e ? e : { default: e }; }
|
|
11
|
+
|
|
12
|
+
var chokidar__default = /*#__PURE__*/_interopDefaultCompat(chokidar);
|
|
13
|
+
var fs__default = /*#__PURE__*/_interopDefaultCompat(fs);
|
|
14
|
+
var PQueue__default = /*#__PURE__*/_interopDefaultCompat(PQueue);
|
|
15
|
+
|
|
16
|
+
const DETECTED_MODULES_MODULE_NAME = "__backstage-autodetected-plugins__";
|
|
17
|
+
function readPackageDetectionConfig(config$1) {
|
|
18
|
+
const packages = config$1.getOptional("app.packages");
|
|
19
|
+
if (packages === void 0 || packages === null) {
|
|
20
|
+
return void 0;
|
|
21
|
+
}
|
|
22
|
+
if (typeof packages === "string") {
|
|
23
|
+
if (packages !== "all") {
|
|
24
|
+
throw new Error(
|
|
25
|
+
`Invalid app.packages mode, got '${packages}', expected 'all'`
|
|
26
|
+
);
|
|
27
|
+
}
|
|
28
|
+
return {};
|
|
29
|
+
}
|
|
30
|
+
if (typeof packages !== "object" || Array.isArray(packages)) {
|
|
31
|
+
throw new Error("Invalid config at 'app.packages', expected object");
|
|
32
|
+
}
|
|
33
|
+
const packagesConfig = new config.ConfigReader(packages, "app.packages");
|
|
34
|
+
return {
|
|
35
|
+
include: packagesConfig.getOptionalStringArray("include"),
|
|
36
|
+
exclude: packagesConfig.getOptionalStringArray("exclude")
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
async function detectPackages(targetPath, { include, exclude }) {
|
|
40
|
+
const pkg = await fs__default.default.readJson(
|
|
41
|
+
node_path.resolve(targetPath, "package.json")
|
|
42
|
+
);
|
|
43
|
+
return Object.keys(pkg.dependencies ?? {}).flatMap((depName) => {
|
|
44
|
+
if (exclude?.includes(depName)) {
|
|
45
|
+
return [];
|
|
46
|
+
}
|
|
47
|
+
if (include && !include.includes(depName)) {
|
|
48
|
+
return [];
|
|
49
|
+
}
|
|
50
|
+
try {
|
|
51
|
+
const depPackageJson = require(require.resolve(
|
|
52
|
+
`${depName}/package.json`,
|
|
53
|
+
{ paths: [targetPath] }
|
|
54
|
+
));
|
|
55
|
+
if (["frontend-plugin", "frontend-plugin-module"].includes(
|
|
56
|
+
depPackageJson.backstage?.role ?? ""
|
|
57
|
+
)) {
|
|
58
|
+
const exp = depPackageJson.exports;
|
|
59
|
+
if (exp && typeof exp === "object" && "./alpha" in exp) {
|
|
60
|
+
return [
|
|
61
|
+
{ name: depName, import: depName },
|
|
62
|
+
{ name: depName, export: "./alpha", import: `${depName}/alpha` }
|
|
63
|
+
];
|
|
64
|
+
}
|
|
65
|
+
return [{ name: depName, import: depName }];
|
|
66
|
+
}
|
|
67
|
+
} catch {
|
|
68
|
+
}
|
|
69
|
+
return [];
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
const writeQueue = new PQueue__default.default({ concurrency: 1 });
|
|
73
|
+
async function writeDetectedPackagesModule(targetPath, pkgs) {
|
|
74
|
+
const requirePackageScript = pkgs?.map(
|
|
75
|
+
(pkg) => `{ name: ${JSON.stringify(pkg.name)}, export: ${JSON.stringify(
|
|
76
|
+
pkg.export
|
|
77
|
+
)}, default: require('${pkg.import}').default }`
|
|
78
|
+
).join(",");
|
|
79
|
+
await writeQueue.add(async () => {
|
|
80
|
+
const detectedModulesPath = node_path.join(
|
|
81
|
+
targetPath,
|
|
82
|
+
"node_modules",
|
|
83
|
+
`${DETECTED_MODULES_MODULE_NAME}.js`
|
|
84
|
+
);
|
|
85
|
+
await fs__default.default.ensureDir(node_path.dirname(detectedModulesPath));
|
|
86
|
+
await fs__default.default.writeFile(
|
|
87
|
+
detectedModulesPath,
|
|
88
|
+
`window['__@backstage/discovered__'] = { modules: [${requirePackageScript}] };`
|
|
89
|
+
);
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
async function createDetectedModulesEntryPoint(options) {
|
|
93
|
+
const { config, watch, targetPath } = options;
|
|
94
|
+
const detectionConfig = readPackageDetectionConfig(config);
|
|
95
|
+
if (!detectionConfig) {
|
|
96
|
+
return [];
|
|
97
|
+
}
|
|
98
|
+
const legacyDetectedModulesPath = node_path.join(
|
|
99
|
+
cliCommon.targetPaths.rootDir,
|
|
100
|
+
"node_modules",
|
|
101
|
+
`${DETECTED_MODULES_MODULE_NAME}.js`
|
|
102
|
+
);
|
|
103
|
+
if (await fs__default.default.pathExists(legacyDetectedModulesPath)) {
|
|
104
|
+
await fs__default.default.remove(legacyDetectedModulesPath);
|
|
105
|
+
}
|
|
106
|
+
if (watch) {
|
|
107
|
+
const watcher = chokidar__default.default.watch(node_path.resolve(targetPath, "package.json"));
|
|
108
|
+
watcher.on("change", async () => {
|
|
109
|
+
await writeDetectedPackagesModule(
|
|
110
|
+
targetPath,
|
|
111
|
+
await detectPackages(targetPath, detectionConfig)
|
|
112
|
+
);
|
|
113
|
+
watch();
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
await writeDetectedPackagesModule(
|
|
117
|
+
targetPath,
|
|
118
|
+
await detectPackages(targetPath, detectionConfig)
|
|
119
|
+
);
|
|
120
|
+
return [DETECTED_MODULES_MODULE_NAME];
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
exports.createDetectedModulesEntryPoint = createDetectedModulesEntryPoint;
|
|
124
|
+
//# sourceMappingURL=packageDetection.cjs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"packageDetection.cjs.js","sources":["../../../src/lib/bundler/packageDetection.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 { BackstagePackageJson } from '@backstage/cli-node';\nimport { Config, ConfigReader } from '@backstage/config';\nimport chokidar from 'chokidar';\nimport fs from 'fs-extra';\nimport PQueue from 'p-queue';\nimport { dirname, join as joinPath, resolve as resolvePath } from 'node:path';\nimport { targetPaths } from '@backstage/cli-common';\n\nconst DETECTED_MODULES_MODULE_NAME = '__backstage-autodetected-plugins__';\n\ninterface PackageDetectionConfig {\n include?: string[];\n exclude?: string[];\n}\n\nfunction readPackageDetectionConfig(\n config: Config,\n): PackageDetectionConfig | undefined {\n const packages = config.getOptional('app.packages');\n if (packages === undefined || packages === null) {\n return undefined;\n }\n\n if (typeof packages === 'string') {\n if (packages !== 'all') {\n throw new Error(\n `Invalid app.packages mode, got '${packages}', expected 'all'`,\n );\n }\n return {};\n }\n\n if (typeof packages !== 'object' || Array.isArray(packages)) {\n throw new Error(\"Invalid config at 'app.packages', expected object\");\n }\n const packagesConfig = new ConfigReader(packages, 'app.packages');\n\n return {\n include: packagesConfig.getOptionalStringArray('include'),\n exclude: packagesConfig.getOptionalStringArray('exclude'),\n };\n}\n\nasync function detectPackages(\n targetPath: string,\n { include, exclude }: PackageDetectionConfig,\n) {\n const pkg: BackstagePackageJson = await fs.readJson(\n resolvePath(targetPath, 'package.json'),\n );\n\n return Object.keys(pkg.dependencies ?? {}).flatMap(depName => {\n if (exclude?.includes(depName)) {\n return [];\n }\n if (include && !include.includes(depName)) {\n return [];\n }\n\n try {\n const depPackageJson: BackstagePackageJson = require(require.resolve(\n `${depName}/package.json`,\n { paths: [targetPath] },\n ));\n if (\n ['frontend-plugin', 'frontend-plugin-module'].includes(\n depPackageJson.backstage?.role ?? '',\n )\n ) {\n // Include alpha entry point if available. If there's no default export it will be ignored\n const exp = depPackageJson.exports;\n if (exp && typeof exp === 'object' && './alpha' in exp) {\n return [\n { name: depName, import: depName },\n { name: depName, export: './alpha', import: `${depName}/alpha` },\n ];\n }\n return [{ name: depName, import: depName }];\n }\n } catch {\n /* ignore packages that don't make package.json available */\n }\n return [];\n });\n}\n\n// Make sure we're not issuing multiple writes at the same time, which can cause partial overwrites\nconst writeQueue = new PQueue({ concurrency: 1 });\n\nasync function writeDetectedPackagesModule(\n targetPath: string,\n pkgs: { name: string; export?: string; import: string }[],\n) {\n const requirePackageScript = pkgs\n ?.map(\n pkg =>\n `{ name: ${JSON.stringify(pkg.name)}, export: ${JSON.stringify(\n pkg.export,\n )}, default: require('${pkg.import}').default }`,\n )\n .join(',');\n\n await writeQueue.add(async () => {\n const detectedModulesPath = joinPath(\n targetPath,\n 'node_modules',\n `${DETECTED_MODULES_MODULE_NAME}.js`,\n );\n\n await fs.ensureDir(dirname(detectedModulesPath));\n await fs.writeFile(\n detectedModulesPath,\n `window['__@backstage/discovered__'] = { modules: [${requirePackageScript}] };`,\n );\n });\n}\n\nexport async function createDetectedModulesEntryPoint(options: {\n config: Config;\n targetPath: string;\n watch?: () => void;\n}): Promise<string[]> {\n const { config, watch, targetPath } = options;\n\n const detectionConfig = readPackageDetectionConfig(config);\n if (!detectionConfig) {\n return [];\n }\n\n // Previous versions of the CLI would write the detected modules file to the\n // root `node_modules`, this makes sure that doesn't exist to minimize risk of conflicts\n const legacyDetectedModulesPath = joinPath(\n targetPaths.rootDir,\n 'node_modules',\n `${DETECTED_MODULES_MODULE_NAME}.js`,\n );\n if (await fs.pathExists(legacyDetectedModulesPath)) {\n await fs.remove(legacyDetectedModulesPath);\n }\n\n if (watch) {\n const watcher = chokidar.watch(resolvePath(targetPath, 'package.json'));\n\n watcher.on('change', async () => {\n await writeDetectedPackagesModule(\n targetPath,\n await detectPackages(targetPath, detectionConfig),\n );\n watch();\n });\n }\n\n await writeDetectedPackagesModule(\n targetPath,\n await detectPackages(targetPath, detectionConfig),\n );\n\n return [DETECTED_MODULES_MODULE_NAME];\n}\n"],"names":["config","ConfigReader","fs","resolvePath","PQueue","joinPath","dirname","targetPaths","chokidar"],"mappings":"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"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var fs = require('fs-extra');
|
|
4
|
+
var node_path = require('node:path');
|
|
5
|
+
var cliCommon = require('@backstage/cli-common');
|
|
6
|
+
|
|
7
|
+
function _interopDefaultCompat (e) { return e && typeof e === 'object' && 'default' in e ? e : { default: e }; }
|
|
8
|
+
|
|
9
|
+
var fs__default = /*#__PURE__*/_interopDefaultCompat(fs);
|
|
10
|
+
|
|
11
|
+
function resolveBundlingPaths(options) {
|
|
12
|
+
const { entry, targetDir = cliCommon.targetPaths.dir } = options;
|
|
13
|
+
const resolveTargetModule = (pathString) => {
|
|
14
|
+
for (const ext of ["mjs", "js", "ts", "tsx", "jsx"]) {
|
|
15
|
+
const filePath = node_path.resolve(targetDir, `${pathString}.${ext}`);
|
|
16
|
+
if (fs__default.default.pathExistsSync(filePath)) {
|
|
17
|
+
return filePath;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
return node_path.resolve(targetDir, `${pathString}.js`);
|
|
21
|
+
};
|
|
22
|
+
let targetPublic = void 0;
|
|
23
|
+
let targetHtml = node_path.resolve(targetDir, "public/index.html");
|
|
24
|
+
if (fs__default.default.pathExistsSync(targetHtml)) {
|
|
25
|
+
targetPublic = node_path.resolve(targetDir, "public");
|
|
26
|
+
} else {
|
|
27
|
+
targetHtml = node_path.resolve(targetDir, `${entry}.html`);
|
|
28
|
+
if (!fs__default.default.pathExistsSync(targetHtml)) {
|
|
29
|
+
targetHtml = cliCommon.findOwnPaths(__dirname).resolve(
|
|
30
|
+
"templates/serve_index.html"
|
|
31
|
+
);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
const targetRunFile = node_path.resolve(targetDir, "src/run.ts");
|
|
35
|
+
const runFileExists = fs__default.default.pathExistsSync(targetRunFile);
|
|
36
|
+
return {
|
|
37
|
+
targetHtml,
|
|
38
|
+
targetPublic,
|
|
39
|
+
targetPath: node_path.resolve(targetDir, "."),
|
|
40
|
+
targetRunFile: runFileExists ? targetRunFile : void 0,
|
|
41
|
+
targetDist: node_path.resolve(targetDir, options.dist ?? "dist"),
|
|
42
|
+
targetAssets: node_path.resolve(targetDir, "assets"),
|
|
43
|
+
targetSrc: node_path.resolve(targetDir, "src"),
|
|
44
|
+
targetDev: node_path.resolve(targetDir, "dev"),
|
|
45
|
+
targetEntry: resolveTargetModule(entry),
|
|
46
|
+
targetTsConfig: cliCommon.targetPaths.resolveRoot("tsconfig.json"),
|
|
47
|
+
targetPackageJson: node_path.resolve(targetDir, "package.json"),
|
|
48
|
+
rootNodeModules: cliCommon.targetPaths.resolveRoot("node_modules"),
|
|
49
|
+
root: cliCommon.targetPaths.rootDir
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
async function resolveOptionalBundlingPaths(options) {
|
|
53
|
+
const resolvedPaths = resolveBundlingPaths(options);
|
|
54
|
+
if (await fs__default.default.pathExists(resolvedPaths.targetEntry)) {
|
|
55
|
+
return resolvedPaths;
|
|
56
|
+
}
|
|
57
|
+
return void 0;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
exports.resolveBundlingPaths = resolveBundlingPaths;
|
|
61
|
+
exports.resolveOptionalBundlingPaths = resolveOptionalBundlingPaths;
|
|
62
|
+
//# sourceMappingURL=paths.cjs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paths.cjs.js","sources":["../../../src/lib/bundler/paths.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 { targetPaths, findOwnPaths } from '@backstage/cli-common';\n\nexport type BundlingPathsOptions = {\n // bundle entrypoint, e.g. 'src/index'\n entry: string;\n // Target directory, defaulting to targetPaths.dir\n targetDir?: string;\n // Relative dist directory, defaulting to 'dist'\n dist?: string;\n};\n\nexport function resolveBundlingPaths(options: BundlingPathsOptions) {\n const { entry, targetDir = targetPaths.dir } = options;\n\n const resolveTargetModule = (pathString: string) => {\n for (const ext of ['mjs', 'js', 'ts', 'tsx', 'jsx']) {\n const filePath = resolvePath(targetDir, `${pathString}.${ext}`);\n if (fs.pathExistsSync(filePath)) {\n return filePath;\n }\n }\n return resolvePath(targetDir, `${pathString}.js`);\n };\n\n let targetPublic = undefined;\n let targetHtml = resolvePath(targetDir, 'public/index.html');\n\n // Prefer public folder\n if (fs.pathExistsSync(targetHtml)) {\n targetPublic = resolvePath(targetDir, 'public');\n } else {\n targetHtml = resolvePath(targetDir, `${entry}.html`);\n if (!fs.pathExistsSync(targetHtml)) {\n /* eslint-disable-next-line no-restricted-syntax */\n targetHtml = findOwnPaths(__dirname).resolve(\n 'templates/serve_index.html',\n );\n }\n }\n\n // Backend plugin dev run file\n const targetRunFile = resolvePath(targetDir, 'src/run.ts');\n const runFileExists = fs.pathExistsSync(targetRunFile);\n\n return {\n targetHtml,\n targetPublic,\n targetPath: resolvePath(targetDir, '.'),\n targetRunFile: runFileExists ? targetRunFile : undefined,\n targetDist: resolvePath(targetDir, options.dist ?? 'dist'),\n targetAssets: resolvePath(targetDir, 'assets'),\n targetSrc: resolvePath(targetDir, 'src'),\n targetDev: resolvePath(targetDir, 'dev'),\n targetEntry: resolveTargetModule(entry),\n targetTsConfig: targetPaths.resolveRoot('tsconfig.json'),\n targetPackageJson: resolvePath(targetDir, 'package.json'),\n rootNodeModules: targetPaths.resolveRoot('node_modules'),\n root: targetPaths.rootDir,\n };\n}\n\nexport async function resolveOptionalBundlingPaths(\n options: BundlingPathsOptions,\n) {\n const resolvedPaths = resolveBundlingPaths(options);\n if (await fs.pathExists(resolvedPaths.targetEntry)) {\n return resolvedPaths;\n }\n return undefined;\n}\n\nexport type BundlingPaths = ReturnType<typeof resolveBundlingPaths>;\n"],"names":["targetPaths","resolvePath","fs","findOwnPaths"],"mappings":";;;;;;;;;;AA6BO,SAAS,qBAAqB,OAAA,EAA+B;AAClE,EAAA,MAAM,EAAE,KAAA,EAAO,SAAA,GAAYA,qBAAA,CAAY,KAAI,GAAI,OAAA;AAE/C,EAAA,MAAM,mBAAA,GAAsB,CAAC,UAAA,KAAuB;AAClD,IAAA,KAAA,MAAW,OAAO,CAAC,KAAA,EAAO,MAAM,IAAA,EAAM,KAAA,EAAO,KAAK,CAAA,EAAG;AACnD,MAAA,MAAM,WAAWC,iBAAA,CAAY,SAAA,EAAW,GAAG,UAAU,CAAA,CAAA,EAAI,GAAG,CAAA,CAAE,CAAA;AAC9D,MAAA,IAAIC,mBAAA,CAAG,cAAA,CAAe,QAAQ,CAAA,EAAG;AAC/B,QAAA,OAAO,QAAA;AAAA,MACT;AAAA,IACF;AACA,IAAA,OAAOD,iBAAA,CAAY,SAAA,EAAW,CAAA,EAAG,UAAU,CAAA,GAAA,CAAK,CAAA;AAAA,EAClD,CAAA;AAEA,EAAA,IAAI,YAAA,GAAe,MAAA;AACnB,EAAA,IAAI,UAAA,GAAaA,iBAAA,CAAY,SAAA,EAAW,mBAAmB,CAAA;AAG3D,EAAA,IAAIC,mBAAA,CAAG,cAAA,CAAe,UAAU,CAAA,EAAG;AACjC,IAAA,YAAA,GAAeD,iBAAA,CAAY,WAAW,QAAQ,CAAA;AAAA,EAChD,CAAA,MAAO;AACL,IAAA,UAAA,GAAaA,iBAAA,CAAY,SAAA,EAAW,CAAA,EAAG,KAAK,CAAA,KAAA,CAAO,CAAA;AACnD,IAAA,IAAI,CAACC,mBAAA,CAAG,cAAA,CAAe,UAAU,CAAA,EAAG;AAElC,MAAA,UAAA,GAAaC,sBAAA,CAAa,SAAS,CAAA,CAAE,OAAA;AAAA,QACnC;AAAA,OACF;AAAA,IACF;AAAA,EACF;AAGA,EAAA,MAAM,aAAA,GAAgBF,iBAAA,CAAY,SAAA,EAAW,YAAY,CAAA;AACzD,EAAA,MAAM,aAAA,GAAgBC,mBAAA,CAAG,cAAA,CAAe,aAAa,CAAA;AAErD,EAAA,OAAO;AAAA,IACL,UAAA;AAAA,IACA,YAAA;AAAA,IACA,UAAA,EAAYD,iBAAA,CAAY,SAAA,EAAW,GAAG,CAAA;AAAA,IACtC,aAAA,EAAe,gBAAgB,aAAA,GAAgB,MAAA;AAAA,IAC/C,UAAA,EAAYA,iBAAA,CAAY,SAAA,EAAW,OAAA,CAAQ,QAAQ,MAAM,CAAA;AAAA,IACzD,YAAA,EAAcA,iBAAA,CAAY,SAAA,EAAW,QAAQ,CAAA;AAAA,IAC7C,SAAA,EAAWA,iBAAA,CAAY,SAAA,EAAW,KAAK,CAAA;AAAA,IACvC,SAAA,EAAWA,iBAAA,CAAY,SAAA,EAAW,KAAK,CAAA;AAAA,IACvC,WAAA,EAAa,oBAAoB,KAAK,CAAA;AAAA,IACtC,cAAA,EAAgBD,qBAAA,CAAY,WAAA,CAAY,eAAe,CAAA;AAAA,IACvD,iBAAA,EAAmBC,iBAAA,CAAY,SAAA,EAAW,cAAc,CAAA;AAAA,IACxD,eAAA,EAAiBD,qBAAA,CAAY,WAAA,CAAY,cAAc,CAAA;AAAA,IACvD,MAAMA,qBAAA,CAAY;AAAA,GACpB;AACF;AAEA,eAAsB,6BACpB,OAAA,EACA;AACA,EAAA,MAAM,aAAA,GAAgB,qBAAqB,OAAO,CAAA;AAClD,EAAA,IAAI,MAAME,mBAAA,CAAG,UAAA,CAAW,aAAA,CAAc,WAAW,CAAA,EAAG;AAClD,IAAA,OAAO,aAAA;AAAA,EACT;AACA,EAAA,OAAO,MAAA;AACT;;;;;"}
|