@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.
Files changed (103) hide show
  1. package/CHANGELOG.md +18 -0
  2. package/README.md +23 -0
  3. package/bin/backstage-cli-module-build +32 -0
  4. package/config/webpack-public-path.js +31 -0
  5. package/dist/commands/buildWorkspace.cjs.js +53 -0
  6. package/dist/commands/buildWorkspace.cjs.js.map +1 -0
  7. package/dist/commands/package/build/command.cjs.js +136 -0
  8. package/dist/commands/package/build/command.cjs.js.map +1 -0
  9. package/dist/commands/package/build/index.cjs.js +10 -0
  10. package/dist/commands/package/build/index.cjs.js.map +1 -0
  11. package/dist/commands/package/bundle/command.cjs.js +691 -0
  12. package/dist/commands/package/bundle/command.cjs.js.map +1 -0
  13. package/dist/commands/package/bundle/index.cjs.js +10 -0
  14. package/dist/commands/package/bundle/index.cjs.js.map +1 -0
  15. package/dist/commands/package/clean.cjs.js +21 -0
  16. package/dist/commands/package/clean.cjs.js.map +1 -0
  17. package/dist/commands/package/postpack.cjs.js +15 -0
  18. package/dist/commands/package/postpack.cjs.js.map +1 -0
  19. package/dist/commands/package/prepack.cjs.js +29 -0
  20. package/dist/commands/package/prepack.cjs.js.map +1 -0
  21. package/dist/commands/package/start/command.cjs.js +80 -0
  22. package/dist/commands/package/start/command.cjs.js.map +1 -0
  23. package/dist/commands/package/start/index.cjs.js +10 -0
  24. package/dist/commands/package/start/index.cjs.js.map +1 -0
  25. package/dist/commands/package/start/resolveLinkedWorkspace.cjs.js +34 -0
  26. package/dist/commands/package/start/resolveLinkedWorkspace.cjs.js.map +1 -0
  27. package/dist/commands/package/start/startBackend.cjs.js +46 -0
  28. package/dist/commands/package/start/startBackend.cjs.js.map +1 -0
  29. package/dist/commands/package/start/startFrontend.cjs.js +49 -0
  30. package/dist/commands/package/start/startFrontend.cjs.js.map +1 -0
  31. package/dist/commands/package/start/startPackage.cjs.js +53 -0
  32. package/dist/commands/package/start/startPackage.cjs.js.map +1 -0
  33. package/dist/commands/repo/build.cjs.js +149 -0
  34. package/dist/commands/repo/build.cjs.js.map +1 -0
  35. package/dist/commands/repo/clean.cjs.js +41 -0
  36. package/dist/commands/repo/clean.cjs.js.map +1 -0
  37. package/dist/commands/repo/start.cjs.js +199 -0
  38. package/dist/commands/repo/start.cjs.js.map +1 -0
  39. package/dist/index.cjs.js +74 -0
  40. package/dist/index.cjs.js.map +1 -0
  41. package/dist/index.d.ts +5 -0
  42. package/dist/lib/buildBackend.cjs.js +81 -0
  43. package/dist/lib/buildBackend.cjs.js.map +1 -0
  44. package/dist/lib/buildFrontend.cjs.js +49 -0
  45. package/dist/lib/buildFrontend.cjs.js.map +1 -0
  46. package/dist/lib/builder/config.cjs.js +257 -0
  47. package/dist/lib/builder/config.cjs.js.map +1 -0
  48. package/dist/lib/builder/packager.cjs.js +131 -0
  49. package/dist/lib/builder/packager.cjs.js.map +1 -0
  50. package/dist/lib/builder/plugins.cjs.js +125 -0
  51. package/dist/lib/builder/plugins.cjs.js.map +1 -0
  52. package/dist/lib/builder/types.cjs.js +10 -0
  53. package/dist/lib/builder/types.cjs.js.map +1 -0
  54. package/dist/lib/bundler/ConfigInjectingHtmlWebpackPlugin.cjs.js +43 -0
  55. package/dist/lib/bundler/ConfigInjectingHtmlWebpackPlugin.cjs.js.map +1 -0
  56. package/dist/lib/bundler/bundle.cjs.js +189 -0
  57. package/dist/lib/bundler/bundle.cjs.js.map +1 -0
  58. package/dist/lib/bundler/config.cjs.js +309 -0
  59. package/dist/lib/bundler/config.cjs.js.map +1 -0
  60. package/dist/lib/bundler/hasReactDomClient.cjs.js +17 -0
  61. package/dist/lib/bundler/hasReactDomClient.cjs.js.map +1 -0
  62. package/dist/lib/bundler/linkWorkspaces.cjs.js +34 -0
  63. package/dist/lib/bundler/linkWorkspaces.cjs.js.map +1 -0
  64. package/dist/lib/bundler/moduleFederation.cjs.js +135 -0
  65. package/dist/lib/bundler/moduleFederation.cjs.js.map +1 -0
  66. package/dist/lib/bundler/optimization.cjs.js +68 -0
  67. package/dist/lib/bundler/optimization.cjs.js.map +1 -0
  68. package/dist/lib/bundler/packageDetection.cjs.js +124 -0
  69. package/dist/lib/bundler/packageDetection.cjs.js.map +1 -0
  70. package/dist/lib/bundler/paths.cjs.js +62 -0
  71. package/dist/lib/bundler/paths.cjs.js.map +1 -0
  72. package/dist/lib/bundler/server.cjs.js +231 -0
  73. package/dist/lib/bundler/server.cjs.js.map +1 -0
  74. package/dist/lib/bundler/transforms.cjs.js +145 -0
  75. package/dist/lib/bundler/transforms.cjs.js.map +1 -0
  76. package/dist/lib/config.cjs.js +94 -0
  77. package/dist/lib/config.cjs.js.map +1 -0
  78. package/dist/lib/entryPoints.cjs.js +49 -0
  79. package/dist/lib/entryPoints.cjs.js.map +1 -0
  80. package/dist/lib/ipc/IpcServer.cjs.js +60 -0
  81. package/dist/lib/ipc/IpcServer.cjs.js.map +1 -0
  82. package/dist/lib/ipc/ServerDataStore.cjs.js +36 -0
  83. package/dist/lib/ipc/ServerDataStore.cjs.js.map +1 -0
  84. package/dist/lib/optionsParser.cjs.js +22 -0
  85. package/dist/lib/optionsParser.cjs.js.map +1 -0
  86. package/dist/lib/packager/createDistWorkspace.cjs.js +252 -0
  87. package/dist/lib/packager/createDistWorkspace.cjs.js.map +1 -0
  88. package/dist/lib/packager/productionPack.cjs.js +160 -0
  89. package/dist/lib/packager/productionPack.cjs.js.map +1 -0
  90. package/dist/lib/publishing.cjs.js +40 -0
  91. package/dist/lib/publishing.cjs.js.map +1 -0
  92. package/dist/lib/role.cjs.js +24 -0
  93. package/dist/lib/role.cjs.js.map +1 -0
  94. package/dist/lib/runner/runBackend.cjs.js +136 -0
  95. package/dist/lib/runner/runBackend.cjs.js.map +1 -0
  96. package/dist/lib/typeDistProject.cjs.js +89 -0
  97. package/dist/lib/typeDistProject.cjs.js.map +1 -0
  98. package/dist/lib/urls.cjs.js +13 -0
  99. package/dist/lib/urls.cjs.js.map +1 -0
  100. package/dist/package.json.cjs.js +143 -0
  101. package/dist/package.json.cjs.js.map +1 -0
  102. package/package.json +113 -0
  103. package/templates/serve_index.html +27 -0
@@ -0,0 +1,231 @@
1
+ 'use strict';
2
+
3
+ var chalk = require('chalk');
4
+ var fs = require('fs-extra');
5
+ var node_path = require('node:path');
6
+ var openBrowser = require('react-dev-utils/openBrowser');
7
+ var core = require('@rspack/core');
8
+ var devServer = require('@rspack/dev-server');
9
+ var cliCommon = require('@backstage/cli-common');
10
+ var config = require('../config.cjs.js');
11
+ var config$1 = require('./config.cjs.js');
12
+ var packageDetection = require('./packageDetection.cjs.js');
13
+ var paths = require('./paths.cjs.js');
14
+ var moduleFederation = require('./moduleFederation.cjs.js');
15
+
16
+ function _interopDefaultCompat (e) { return e && typeof e === 'object' && 'default' in e ? e : { default: e }; }
17
+
18
+ var chalk__default = /*#__PURE__*/_interopDefaultCompat(chalk);
19
+ var fs__default = /*#__PURE__*/_interopDefaultCompat(fs);
20
+ var openBrowser__default = /*#__PURE__*/_interopDefaultCompat(openBrowser);
21
+
22
+ async function serveBundle(options) {
23
+ const paths$1 = paths.resolveBundlingPaths(options);
24
+ const targetPkg = await fs__default.default.readJson(paths$1.targetPackageJson);
25
+ if (options.verifyVersions) {
26
+ if (targetPkg.dependencies?.["react-router"]?.includes("beta") || targetPkg.dependencies?.["react-router-dom"]?.includes("beta")) {
27
+ console.warn(
28
+ chalk__default.default.yellow(`
29
+ DEPRECATION WARNING: React Router Beta is deprecated and support for it will be removed in a future release.
30
+ Please migrate to use React Router v6 stable.
31
+ See https://backstage.io/docs/tutorials/react-router-stable-migration
32
+ `)
33
+ );
34
+ }
35
+ }
36
+ checkReactVersion();
37
+ const { name } = await fs__default.default.readJson(
38
+ node_path.resolve(options.targetDir ?? cliCommon.targetPaths.dir, "package.json")
39
+ );
40
+ let devServer$1 = void 0;
41
+ let latestFrontendAppConfigs = [];
42
+ const triggerReload = () => {
43
+ if (devServer$1) {
44
+ devServer$1.invalidate();
45
+ if (!process.env.LEGACY_WEBPACK_BUILD) {
46
+ devServer$1.sendMessage(
47
+ devServer$1.webSocketServer?.clients ?? [],
48
+ "static-changed"
49
+ );
50
+ }
51
+ }
52
+ };
53
+ const cliConfig = await config.loadCliConfig({
54
+ args: options.configPaths,
55
+ targetDir: options.targetDir,
56
+ fromPackage: name,
57
+ withFilteredKeys: true,
58
+ watch(appConfigs) {
59
+ latestFrontendAppConfigs = appConfigs;
60
+ triggerReload();
61
+ }
62
+ });
63
+ latestFrontendAppConfigs = cliConfig.frontendAppConfigs;
64
+ const appBaseUrl = cliConfig.frontendConfig.getOptionalString("app.baseUrl");
65
+ const backendBaseUrl = cliConfig.frontendConfig.getOptionalString("backend.baseUrl");
66
+ if (appBaseUrl && appBaseUrl === backendBaseUrl) {
67
+ console.log(
68
+ chalk__default.default.yellow(
69
+ `\u26A0\uFE0F Conflict between app baseUrl and backend baseUrl:
70
+
71
+ app.baseUrl: ${appBaseUrl}
72
+ backend.baseUrl: ${backendBaseUrl}
73
+
74
+ Must have unique hostname and/or ports.
75
+
76
+ This can be resolved by changing app.baseUrl and backend.baseUrl to point to their respective local development ports.
77
+ `
78
+ )
79
+ );
80
+ }
81
+ const { frontendConfig, fullConfig } = cliConfig;
82
+ const url = config$1.resolveBaseUrl(frontendConfig, options.moduleFederationRemote);
83
+ const { host, port } = config$1.resolveEndpoint(
84
+ frontendConfig,
85
+ options.moduleFederationRemote
86
+ );
87
+ const detectedModulesEntryPoint = await packageDetection.createDetectedModulesEntryPoint({
88
+ config: fullConfig,
89
+ targetPath: paths$1.targetPath,
90
+ watch() {
91
+ triggerReload();
92
+ }
93
+ });
94
+ const moduleFederationSharedDependenciesEntryPoint = await moduleFederation.createRuntimeSharedDependenciesEntryPoint({
95
+ targetPath: paths$1.targetPath,
96
+ watch() {
97
+ triggerReload();
98
+ }
99
+ });
100
+ const webpack = process.env.LEGACY_WEBPACK_BUILD ? require("webpack") : void 0;
101
+ const commonConfigOptions = {
102
+ ...options,
103
+ checksEnabled: options.checksEnabled,
104
+ isDev: true,
105
+ baseUrl: url,
106
+ frontendConfig,
107
+ webpack,
108
+ getFrontendAppConfigs: () => {
109
+ return latestFrontendAppConfigs;
110
+ }
111
+ };
112
+ const config$2 = await config$1.createConfig(paths$1, {
113
+ ...commonConfigOptions,
114
+ additionalEntryPoints: [
115
+ ...detectedModulesEntryPoint,
116
+ ...moduleFederationSharedDependenciesEntryPoint
117
+ ],
118
+ moduleFederationRemote: options.moduleFederationRemote
119
+ });
120
+ const bundler = webpack ?? core.rspack;
121
+ const DevServer = webpack ? require("webpack-dev-server") : devServer.RspackDevServer;
122
+ if (webpack) {
123
+ console.log(chalk__default.default.yellow(`\u26A0\uFE0F WARNING: Using legacy WebPack dev server.`));
124
+ }
125
+ const publicPaths = await paths.resolveOptionalBundlingPaths({
126
+ entry: "src/index-public-experimental",
127
+ dist: "dist/public"
128
+ });
129
+ if (publicPaths) {
130
+ console.log(
131
+ chalk__default.default.yellow(
132
+ `\u26A0\uFE0F WARNING: The app /public entry point is an experimental feature that may receive immediate breaking changes.`
133
+ )
134
+ );
135
+ }
136
+ const compiler = publicPaths ? bundler([config$2, await config$1.createConfig(publicPaths, commonConfigOptions)]) : bundler(config$2);
137
+ devServer$1 = new DevServer(
138
+ {
139
+ hot: !process.env.CI,
140
+ devMiddleware: {
141
+ publicPath: config$2.output?.publicPath,
142
+ stats: "errors-warnings"
143
+ },
144
+ static: paths$1.targetPublic ? {
145
+ publicPath: config$2.output?.publicPath,
146
+ directory: paths$1.targetPublic
147
+ } : void 0,
148
+ historyApiFallback: options.moduleFederationRemote ? false : {
149
+ // Paths with dots should still use the history fallback.
150
+ // See https://github.com/facebookincubator/create-react-app/issues/387.
151
+ disableDotRule: true,
152
+ // The index needs to be rewritten relative to the new public path, including subroutes.
153
+ index: `${config$2.output?.publicPath}index.html`
154
+ },
155
+ server: url.protocol === "https:" ? {
156
+ type: "https",
157
+ options: {
158
+ cert: fullConfig.getOptionalString(
159
+ "app.https.certificate.cert"
160
+ ),
161
+ key: fullConfig.getOptionalString("app.https.certificate.key")
162
+ }
163
+ } : {},
164
+ host,
165
+ port,
166
+ proxy: targetPkg.proxy,
167
+ // When the dev server is behind a proxy, the host and public hostname differ
168
+ allowedHosts: [url.hostname],
169
+ client: {
170
+ webSocketURL: { hostname: host, port }
171
+ },
172
+ headers: {
173
+ "Access-Control-Allow-Origin": "*",
174
+ "Access-Control-Allow-Methods": "GET, OPTIONS",
175
+ "Access-Control-Allow-Headers": "X-Requested-With, content-type, Authorization"
176
+ }
177
+ },
178
+ compiler
179
+ );
180
+ await new Promise(async (resolve, reject) => {
181
+ if (devServer$1) {
182
+ devServer$1.startCallback((err) => {
183
+ if (err) {
184
+ reject(err);
185
+ return;
186
+ }
187
+ resolve();
188
+ });
189
+ } else {
190
+ resolve();
191
+ }
192
+ });
193
+ if (!options.skipOpenBrowser) {
194
+ openBrowser__default.default(url.href);
195
+ }
196
+ const waitForExit = async () => {
197
+ for (const signal of ["SIGINT", "SIGTERM"]) {
198
+ process.on(signal, () => {
199
+ devServer$1?.stop();
200
+ process.exit();
201
+ });
202
+ }
203
+ return new Promise(() => {
204
+ });
205
+ };
206
+ return waitForExit;
207
+ }
208
+ function checkReactVersion() {
209
+ try {
210
+ const reactPkgPath = require.resolve("react/package.json", {
211
+ paths: [cliCommon.targetPaths.rootDir]
212
+ });
213
+ const reactPkg = require(reactPkgPath);
214
+ if (reactPkg.version.startsWith("16.")) {
215
+ console.log(
216
+ chalk__default.default.yellow(
217
+ `
218
+ \u26A0\uFE0F \u26A0\uFE0F
219
+ \u26A0\uFE0F You are using React version 16, which is deprecated for use in Backstage. \u26A0\uFE0F
220
+ \u26A0\uFE0F Please upgrade to React 17 by updating your packages/app dependencies. \u26A0\uFE0F
221
+ \u26A0\uFE0F \u26A0\uFE0F
222
+ `
223
+ )
224
+ );
225
+ }
226
+ } catch {
227
+ }
228
+ }
229
+
230
+ exports.serveBundle = serveBundle;
231
+ //# sourceMappingURL=server.cjs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.cjs.js","sources":["../../../src/lib/bundler/server.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 { AppConfig } from '@backstage/config';\nimport chalk from 'chalk';\nimport fs from 'fs-extra';\nimport { resolve as resolvePath } from 'node:path';\nimport openBrowser from 'react-dev-utils/openBrowser';\nimport { rspack } from '@rspack/core';\nimport { RspackDevServer } from '@rspack/dev-server';\n\nimport { targetPaths } from '@backstage/cli-common';\n\nimport { loadCliConfig } from '../config';\nimport { createConfig, resolveBaseUrl, resolveEndpoint } from './config';\nimport { createDetectedModulesEntryPoint } from './packageDetection';\nimport { resolveBundlingPaths, resolveOptionalBundlingPaths } from './paths';\nimport { ServeOptions } from './types';\nimport { createRuntimeSharedDependenciesEntryPoint } from './moduleFederation';\n\nexport async function serveBundle(options: ServeOptions) {\n const paths = resolveBundlingPaths(options);\n const targetPkg = await fs.readJson(paths.targetPackageJson);\n\n if (options.verifyVersions) {\n if (\n targetPkg.dependencies?.['react-router']?.includes('beta') ||\n targetPkg.dependencies?.['react-router-dom']?.includes('beta')\n ) {\n // eslint-disable-next-line no-console\n console.warn(\n chalk.yellow(`\nDEPRECATION WARNING: React Router Beta is deprecated and support for it will be removed in a future release.\n Please migrate to use React Router v6 stable.\n See https://backstage.io/docs/tutorials/react-router-stable-migration\n`),\n );\n }\n }\n\n checkReactVersion();\n\n const { name } = await fs.readJson(\n resolvePath(options.targetDir ?? targetPaths.dir, 'package.json'),\n );\n\n let devServer: RspackDevServer | undefined = undefined;\n\n let latestFrontendAppConfigs: AppConfig[] = [];\n\n /** Triggers a full reload of all clients */\n const triggerReload = () => {\n if (devServer) {\n devServer.invalidate();\n\n // For the Rspack server it's not enough to invalidate, we also need to\n // tell the browser to reload, which we do with a 'static-changed' message\n if (!process.env.LEGACY_WEBPACK_BUILD) {\n devServer.sendMessage(\n devServer.webSocketServer?.clients ?? [],\n 'static-changed',\n );\n }\n }\n };\n\n const cliConfig = await loadCliConfig({\n args: options.configPaths,\n targetDir: options.targetDir,\n fromPackage: name,\n withFilteredKeys: true,\n watch(appConfigs) {\n latestFrontendAppConfigs = appConfigs;\n\n triggerReload();\n },\n });\n latestFrontendAppConfigs = cliConfig.frontendAppConfigs;\n\n const appBaseUrl = cliConfig.frontendConfig.getOptionalString('app.baseUrl');\n const backendBaseUrl =\n cliConfig.frontendConfig.getOptionalString('backend.baseUrl');\n if (appBaseUrl && appBaseUrl === backendBaseUrl) {\n console.log(\n chalk.yellow(\n `⚠️ Conflict between app baseUrl and backend baseUrl:\n\n app.baseUrl: ${appBaseUrl}\n backend.baseUrl: ${backendBaseUrl}\n\n Must have unique hostname and/or ports.\n\n This can be resolved by changing app.baseUrl and backend.baseUrl to point to their respective local development ports.\n`,\n ),\n );\n }\n\n const { frontendConfig, fullConfig } = cliConfig;\n const url = resolveBaseUrl(frontendConfig, options.moduleFederationRemote);\n const { host, port } = resolveEndpoint(\n frontendConfig,\n options.moduleFederationRemote,\n );\n\n const detectedModulesEntryPoint = await createDetectedModulesEntryPoint({\n config: fullConfig,\n targetPath: paths.targetPath,\n watch() {\n triggerReload();\n },\n });\n\n const moduleFederationSharedDependenciesEntryPoint =\n await createRuntimeSharedDependenciesEntryPoint({\n targetPath: paths.targetPath,\n watch() {\n triggerReload();\n },\n });\n\n const webpack = process.env.LEGACY_WEBPACK_BUILD\n ? (require('webpack') as typeof import('webpack'))\n : undefined;\n\n const commonConfigOptions = {\n ...options,\n checksEnabled: options.checksEnabled,\n isDev: true,\n baseUrl: url,\n frontendConfig,\n webpack,\n getFrontendAppConfigs: () => {\n return latestFrontendAppConfigs;\n },\n };\n\n const config = await createConfig(paths, {\n ...commonConfigOptions,\n additionalEntryPoints: [\n ...detectedModulesEntryPoint,\n ...moduleFederationSharedDependenciesEntryPoint,\n ],\n moduleFederationRemote: options.moduleFederationRemote,\n });\n\n const bundler = (webpack ?? rspack) as typeof rspack;\n const DevServer: typeof RspackDevServer = webpack\n ? require('webpack-dev-server')\n : RspackDevServer;\n\n if (webpack) {\n console.log(chalk.yellow(`⚠️ WARNING: Using legacy WebPack dev server.`));\n }\n\n const publicPaths = await resolveOptionalBundlingPaths({\n entry: 'src/index-public-experimental',\n dist: 'dist/public',\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 }\n const compiler = publicPaths\n ? bundler([config, await createConfig(publicPaths, commonConfigOptions)])\n : bundler(config);\n\n devServer = new DevServer(\n {\n hot: !process.env.CI,\n devMiddleware: {\n publicPath: config.output?.publicPath as string,\n stats: 'errors-warnings',\n },\n static: paths.targetPublic\n ? {\n publicPath: config.output?.publicPath as string,\n directory: paths.targetPublic,\n }\n : undefined,\n historyApiFallback: options.moduleFederationRemote\n ? false\n : {\n // Paths with dots should still use the history fallback.\n // See https://github.com/facebookincubator/create-react-app/issues/387.\n disableDotRule: true,\n\n // The index needs to be rewritten relative to the new public path, including subroutes.\n index: `${config.output?.publicPath}index.html`,\n },\n server:\n url.protocol === 'https:'\n ? {\n type: 'https',\n options: {\n cert: fullConfig.getOptionalString(\n 'app.https.certificate.cert',\n ),\n key: fullConfig.getOptionalString('app.https.certificate.key'),\n },\n }\n : {},\n host,\n port,\n proxy: targetPkg.proxy,\n // When the dev server is behind a proxy, the host and public hostname differ\n allowedHosts: [url.hostname],\n client: {\n webSocketURL: { hostname: host, port },\n },\n headers: {\n 'Access-Control-Allow-Origin': '*',\n 'Access-Control-Allow-Methods': 'GET, OPTIONS',\n 'Access-Control-Allow-Headers':\n 'X-Requested-With, content-type, Authorization',\n },\n },\n compiler,\n );\n\n await new Promise<void>(async (resolve, reject) => {\n if (devServer) {\n devServer.startCallback((err?: Error) => {\n if (err) {\n reject(err);\n return;\n }\n resolve();\n });\n } else {\n resolve();\n }\n });\n\n if (!options.skipOpenBrowser) {\n openBrowser(url.href);\n }\n\n const waitForExit = async () => {\n for (const signal of ['SIGINT', 'SIGTERM'] as const) {\n process.on(signal, () => {\n devServer?.stop();\n // exit instead of resolve. The process is shutting down and resolving a promise here logs an error\n process.exit();\n });\n }\n\n // Block indefinitely and wait for the interrupt signal\n return new Promise(() => {});\n };\n\n return waitForExit;\n}\n\nfunction checkReactVersion() {\n try {\n // Make sure we're looking at the root of the target repo\n const reactPkgPath = require.resolve('react/package.json', {\n paths: [targetPaths.rootDir],\n });\n const reactPkg = require(reactPkgPath);\n if (reactPkg.version.startsWith('16.')) {\n console.log(\n chalk.yellow(\n `\n⚠️ ⚠️\n⚠️ You are using React version 16, which is deprecated for use in Backstage. ⚠️\n⚠️ Please upgrade to React 17 by updating your packages/app dependencies. ⚠️\n⚠️ ⚠️\n`,\n ),\n );\n }\n } catch {\n /* ignored */\n }\n}\n"],"names":["paths","resolveBundlingPaths","fs","chalk","resolvePath","targetPaths","devServer","loadCliConfig","resolveBaseUrl","resolveEndpoint","createDetectedModulesEntryPoint","createRuntimeSharedDependenciesEntryPoint","config","createConfig","rspack","RspackDevServer","resolveOptionalBundlingPaths","openBrowser"],"mappings":"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"}
@@ -0,0 +1,145 @@
1
+ 'use strict';
2
+
3
+ var core = require('@rspack/core');
4
+
5
+ const transforms = (options) => {
6
+ const { isDev, isBackend, webpack } = options;
7
+ const CssExtractPlugin = webpack ? require("mini-css-extract-plugin") : core.CssExtractRspackPlugin;
8
+ function insertBeforeJssStyles(element) {
9
+ const head = document.head;
10
+ const firstJssNode = head.querySelector("style[data-jss]");
11
+ if (!firstJssNode) {
12
+ head.appendChild(element);
13
+ } else {
14
+ head.insertBefore(element, firstJssNode);
15
+ }
16
+ }
17
+ const loaders = [
18
+ {
19
+ test: /\.(tsx?)$/,
20
+ exclude: /node_modules/,
21
+ use: [
22
+ {
23
+ loader: webpack ? require.resolve("swc-loader") : "builtin:swc-loader",
24
+ options: {
25
+ jsc: {
26
+ target: "es2023",
27
+ externalHelpers: !isBackend,
28
+ parser: {
29
+ syntax: "typescript",
30
+ tsx: !isBackend,
31
+ dynamicImport: true
32
+ },
33
+ transform: {
34
+ react: isBackend ? void 0 : {
35
+ runtime: "automatic",
36
+ refresh: isDev
37
+ }
38
+ }
39
+ }
40
+ }
41
+ }
42
+ ]
43
+ },
44
+ {
45
+ test: /\.(jsx?|mjs|cjs)$/,
46
+ exclude: /node_modules/,
47
+ use: [
48
+ {
49
+ loader: webpack ? require.resolve("swc-loader") : "builtin:swc-loader",
50
+ options: {
51
+ jsc: {
52
+ target: "es2023",
53
+ externalHelpers: !isBackend,
54
+ parser: {
55
+ syntax: "ecmascript",
56
+ jsx: !isBackend,
57
+ dynamicImport: true
58
+ },
59
+ transform: {
60
+ react: isBackend ? void 0 : {
61
+ runtime: "automatic",
62
+ refresh: isDev
63
+ }
64
+ }
65
+ }
66
+ }
67
+ }
68
+ ]
69
+ },
70
+ {
71
+ test: /\.(js|mjs|cjs)$/,
72
+ resolve: {
73
+ fullySpecified: false
74
+ }
75
+ },
76
+ {
77
+ test: [
78
+ /\.bmp$/,
79
+ /\.gif$/,
80
+ /\.jpe?g$/,
81
+ /\.png$/,
82
+ /\.frag$/,
83
+ /\.vert$/,
84
+ { and: [/\.svg$/, { not: [/\.icon\.svg$/] }] },
85
+ /\.xml$/,
86
+ /\.ico$/,
87
+ /\.webp$/
88
+ ],
89
+ type: "asset/resource",
90
+ generator: {
91
+ filename: "static/[name].[hash:8][ext]"
92
+ }
93
+ },
94
+ {
95
+ test: /\.(eot|woff|woff2|ttf)$/i,
96
+ type: "asset/resource",
97
+ generator: {
98
+ filename: "static/[name].[hash][ext][query]"
99
+ }
100
+ },
101
+ {
102
+ test: /\.ya?ml$/,
103
+ use: require.resolve("yml-loader")
104
+ },
105
+ {
106
+ include: /\.(md)$/,
107
+ type: "asset/resource",
108
+ generator: {
109
+ filename: "static/[name].[hash][ext][query]"
110
+ }
111
+ },
112
+ {
113
+ test: /\.css$/i,
114
+ use: [
115
+ isDev ? {
116
+ loader: require.resolve("style-loader"),
117
+ options: {
118
+ insert: insertBeforeJssStyles
119
+ }
120
+ } : CssExtractPlugin.loader,
121
+ {
122
+ loader: require.resolve("css-loader"),
123
+ options: {
124
+ sourceMap: true
125
+ }
126
+ }
127
+ ]
128
+ }
129
+ ];
130
+ const plugins = new Array();
131
+ if (!isDev) {
132
+ plugins.push(
133
+ new CssExtractPlugin({
134
+ filename: "static/[name].[contenthash:8].css",
135
+ chunkFilename: "static/[name].[id].[contenthash:8].css",
136
+ insert: insertBeforeJssStyles
137
+ // Only applies to async chunks
138
+ })
139
+ );
140
+ }
141
+ return { loaders, plugins };
142
+ };
143
+
144
+ exports.transforms = transforms;
145
+ //# sourceMappingURL=transforms.cjs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transforms.cjs.js","sources":["../../../src/lib/bundler/transforms.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 {\n RuleSetRule,\n RspackPluginInstance,\n CssExtractRspackPlugin,\n WebpackPluginInstance,\n} from '@rspack/core';\n\ntype Transforms = {\n loaders: RuleSetRule[];\n plugins: Array<RspackPluginInstance | WebpackPluginInstance>;\n};\n\ntype TransformOptions = {\n isDev: boolean;\n isBackend?: boolean;\n webpack?: typeof import('webpack').webpack;\n};\n\nexport const transforms = (options: TransformOptions): Transforms => {\n const { isDev, isBackend, webpack } = options;\n\n const CssExtractPlugin: typeof CssExtractRspackPlugin = webpack\n ? (require('mini-css-extract-plugin') as unknown as typeof CssExtractRspackPlugin)\n : CssExtractRspackPlugin;\n\n // This ensures that styles inserted from the style-loader and any\n // async style chunks are always given lower priority than JSS styles.\n // Note that this function is stringified and executed in the browser\n // after transpilation, so stick to simple syntax\n function insertBeforeJssStyles(element: any) {\n const head = document.head;\n // This makes sure that any style elements we insert get put before the\n // dynamic styles from JSS, such as the ones from `makeStyles()`.\n // TODO(Rugvip): This will likely break in material-ui v5, keep an eye on it.\n const firstJssNode = head.querySelector('style[data-jss]');\n if (!firstJssNode) {\n head.appendChild(element);\n } else {\n head.insertBefore(element, firstJssNode);\n }\n }\n\n const loaders = [\n {\n test: /\\.(tsx?)$/,\n exclude: /node_modules/,\n use: [\n {\n loader: webpack\n ? require.resolve('swc-loader')\n : 'builtin:swc-loader',\n options: {\n jsc: {\n target: 'es2023',\n externalHelpers: !isBackend,\n parser: {\n syntax: 'typescript',\n tsx: !isBackend,\n dynamicImport: true,\n },\n transform: {\n react: isBackend\n ? undefined\n : {\n runtime: 'automatic',\n refresh: isDev,\n },\n },\n },\n },\n },\n ],\n },\n {\n test: /\\.(jsx?|mjs|cjs)$/,\n exclude: /node_modules/,\n use: [\n {\n loader: webpack\n ? require.resolve('swc-loader')\n : 'builtin:swc-loader',\n options: {\n jsc: {\n target: 'es2023',\n externalHelpers: !isBackend,\n parser: {\n syntax: 'ecmascript',\n jsx: !isBackend,\n dynamicImport: true,\n },\n transform: {\n react: isBackend\n ? undefined\n : {\n runtime: 'automatic',\n refresh: isDev,\n },\n },\n },\n },\n },\n ],\n },\n {\n test: /\\.(js|mjs|cjs)$/,\n resolve: {\n fullySpecified: false,\n },\n },\n {\n test: [\n /\\.bmp$/,\n /\\.gif$/,\n /\\.jpe?g$/,\n /\\.png$/,\n /\\.frag$/,\n /\\.vert$/,\n { and: [/\\.svg$/, { not: [/\\.icon\\.svg$/] }] },\n /\\.xml$/,\n /\\.ico$/,\n /\\.webp$/,\n ],\n type: 'asset/resource',\n generator: {\n filename: 'static/[name].[hash:8][ext]',\n },\n },\n {\n test: /\\.(eot|woff|woff2|ttf)$/i,\n type: 'asset/resource',\n generator: {\n filename: 'static/[name].[hash][ext][query]',\n },\n },\n {\n test: /\\.ya?ml$/,\n use: require.resolve('yml-loader'),\n },\n {\n include: /\\.(md)$/,\n type: 'asset/resource',\n generator: {\n filename: 'static/[name].[hash][ext][query]',\n },\n },\n {\n test: /\\.css$/i,\n use: [\n isDev\n ? {\n loader: require.resolve('style-loader'),\n options: {\n insert: insertBeforeJssStyles,\n },\n }\n : CssExtractPlugin.loader,\n {\n loader: require.resolve('css-loader'),\n options: {\n sourceMap: true,\n },\n },\n ],\n },\n ];\n\n const plugins = new Array<RspackPluginInstance | WebpackPluginInstance>();\n\n if (!isDev) {\n plugins.push(\n new CssExtractPlugin({\n filename: 'static/[name].[contenthash:8].css',\n chunkFilename: 'static/[name].[id].[contenthash:8].css',\n insert: insertBeforeJssStyles, // Only applies to async chunks\n }),\n );\n }\n\n return { loaders, plugins };\n};\n"],"names":["CssExtractRspackPlugin"],"mappings":"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"}
@@ -0,0 +1,94 @@
1
+ 'use strict';
2
+
3
+ var configLoader = require('@backstage/config-loader');
4
+ var config = require('@backstage/config');
5
+ var cliCommon = require('@backstage/cli-common');
6
+ var getPackages = require('@manypkg/get-packages');
7
+ var cliNode = require('@backstage/cli-node');
8
+ var node_path = require('node:path');
9
+
10
+ async function loadCliConfig(options) {
11
+ const targetDir = options.targetDir ?? cliCommon.targetPaths.dir;
12
+ const { packages } = await getPackages.getPackages(targetDir);
13
+ let localPackageNames;
14
+ if (options.fromPackage) {
15
+ if (packages.length) {
16
+ const graph = cliNode.PackageGraph.fromPackages(packages);
17
+ localPackageNames = Array.from(
18
+ graph.collectPackageNames([options.fromPackage], (node) => {
19
+ if (node.name === "@backstage/cli") {
20
+ return void 0;
21
+ }
22
+ return node.localDependencies.keys();
23
+ })
24
+ );
25
+ } else {
26
+ localPackageNames = [options.fromPackage];
27
+ }
28
+ } else {
29
+ localPackageNames = packages.map((p) => p.packageJson.name);
30
+ }
31
+ const schema = await configLoader.loadConfigSchema({
32
+ dependencies: localPackageNames,
33
+ packagePaths: [cliCommon.targetPaths.resolveRoot("package.json")]
34
+ });
35
+ const source = configLoader.ConfigSources.default({
36
+ allowMissingDefaultConfig: true,
37
+ watch: Boolean(options.watch),
38
+ rootDir: cliCommon.targetPaths.rootDir,
39
+ argv: options.args.flatMap((t) => ["--config", node_path.resolve(targetDir, t)])
40
+ });
41
+ const appConfigs = await new Promise((resolve, reject) => {
42
+ async function loadConfigReaderLoop() {
43
+ let loaded = false;
44
+ try {
45
+ const abortController = new AbortController();
46
+ for await (const { configs } of source.readConfigData({
47
+ signal: abortController.signal
48
+ })) {
49
+ if (loaded) {
50
+ const newFrontendAppConfigs = schema.process(configs, {
51
+ visibility: ["frontend"],
52
+ withFilteredKeys: options.withFilteredKeys,
53
+ ignoreSchemaErrors: true
54
+ });
55
+ options.watch?.(newFrontendAppConfigs);
56
+ } else {
57
+ resolve(configs);
58
+ loaded = true;
59
+ if (!options.watch) {
60
+ abortController.abort();
61
+ }
62
+ }
63
+ }
64
+ } catch (error) {
65
+ if (loaded) {
66
+ console.error(`Failed to reload configuration, ${error}`);
67
+ } else {
68
+ reject(error);
69
+ }
70
+ }
71
+ }
72
+ loadConfigReaderLoop();
73
+ });
74
+ const configurationLoadedMessage = appConfigs.length ? `Loaded config from ${appConfigs.map((c) => c.context).join(", ")}` : `No configuration files found, running without config`;
75
+ process.stderr.write(`${configurationLoadedMessage}
76
+ `);
77
+ const frontendAppConfigs = schema.process(appConfigs, {
78
+ visibility: ["frontend"],
79
+ withFilteredKeys: options.withFilteredKeys,
80
+ ignoreSchemaErrors: true
81
+ });
82
+ const frontendConfig = config.ConfigReader.fromConfigs(frontendAppConfigs);
83
+ const fullConfig = config.ConfigReader.fromConfigs(appConfigs);
84
+ return {
85
+ schema,
86
+ appConfigs,
87
+ frontendConfig,
88
+ frontendAppConfigs,
89
+ fullConfig
90
+ };
91
+ }
92
+
93
+ exports.loadCliConfig = loadCliConfig;
94
+ //# sourceMappingURL=config.cjs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.cjs.js","sources":["../../src/lib/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 { ConfigSources, loadConfigSchema } from '@backstage/config-loader';\nimport { AppConfig, ConfigReader } from '@backstage/config';\nimport { targetPaths } from '@backstage/cli-common';\n\nimport { getPackages } from '@manypkg/get-packages';\nimport { PackageGraph } from '@backstage/cli-node';\nimport { resolve as resolvePath } from 'node:path';\n\ntype Options = {\n args: string[];\n targetDir?: string;\n fromPackage?: string;\n withFilteredKeys?: boolean;\n watch?: (newFrontendAppConfigs: AppConfig[]) => void;\n};\n\nexport async function loadCliConfig(options: Options) {\n const targetDir = options.targetDir ?? targetPaths.dir;\n\n const { packages } = await getPackages(targetDir);\n\n let localPackageNames;\n if (options.fromPackage) {\n if (packages.length) {\n const graph = PackageGraph.fromPackages(packages);\n localPackageNames = Array.from(\n graph.collectPackageNames([options.fromPackage], node => {\n // Workaround for Backstage main repo only, since the CLI has some artificial devDependencies\n if (node.name === '@backstage/cli') {\n return undefined;\n }\n return node.localDependencies.keys();\n }),\n );\n } else {\n localPackageNames = [options.fromPackage];\n }\n } else {\n localPackageNames = packages.map(p => p.packageJson.name);\n }\n\n const schema = await loadConfigSchema({\n dependencies: localPackageNames,\n packagePaths: [targetPaths.resolveRoot('package.json')],\n });\n\n const source = ConfigSources.default({\n allowMissingDefaultConfig: true,\n watch: Boolean(options.watch),\n rootDir: targetPaths.rootDir,\n argv: options.args.flatMap(t => ['--config', resolvePath(targetDir, t)]),\n });\n\n const appConfigs = await new Promise<AppConfig[]>((resolve, reject) => {\n async function loadConfigReaderLoop() {\n let loaded = false;\n\n try {\n const abortController = new AbortController();\n for await (const { configs } of source.readConfigData({\n signal: abortController.signal,\n })) {\n if (loaded) {\n const newFrontendAppConfigs = schema.process(configs, {\n visibility: ['frontend'],\n withFilteredKeys: options.withFilteredKeys,\n ignoreSchemaErrors: true,\n });\n options.watch?.(newFrontendAppConfigs);\n } else {\n resolve(configs);\n loaded = true;\n\n if (!options.watch) {\n abortController.abort();\n }\n }\n }\n } catch (error) {\n if (loaded) {\n console.error(`Failed to reload configuration, ${error}`);\n } else {\n reject(error);\n }\n }\n }\n loadConfigReaderLoop();\n });\n\n const configurationLoadedMessage = appConfigs.length\n ? `Loaded config from ${appConfigs.map(c => c.context).join(', ')}`\n : `No configuration files found, running without config`;\n\n process.stderr.write(`${configurationLoadedMessage}\\n`);\n\n const frontendAppConfigs = schema.process(appConfigs, {\n visibility: ['frontend'],\n withFilteredKeys: options.withFilteredKeys,\n ignoreSchemaErrors: true,\n });\n const frontendConfig = ConfigReader.fromConfigs(frontendAppConfigs);\n\n const fullConfig = ConfigReader.fromConfigs(appConfigs);\n\n return {\n schema,\n appConfigs,\n frontendConfig,\n frontendAppConfigs,\n fullConfig,\n };\n}\n"],"names":["targetPaths","getPackages","PackageGraph","loadConfigSchema","ConfigSources","resolvePath","ConfigReader"],"mappings":"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"}
@@ -0,0 +1,49 @@
1
+ 'use strict';
2
+
3
+ var node_path = require('node:path');
4
+
5
+ const defaultIndex = {
6
+ mount: ".",
7
+ path: "src/index.ts",
8
+ name: "index",
9
+ ext: ".ts"
10
+ };
11
+ const SCRIPT_EXTS = [".js", ".jsx", ".ts", ".tsx"];
12
+ function parseEntryPoint(mount, path) {
13
+ const ext = node_path.extname(path);
14
+ let name = mount;
15
+ if (name === ".") {
16
+ name = "index";
17
+ } else if (name.startsWith("./")) {
18
+ name = name.slice(2);
19
+ }
20
+ if (name.includes("/") && SCRIPT_EXTS.includes(ext)) {
21
+ throw new Error(`Mount point '${mount}' may not contain multiple slashes`);
22
+ }
23
+ return { mount, path, name, ext };
24
+ }
25
+ function readEntryPoints(pkg) {
26
+ const exp = pkg.exports;
27
+ if (typeof exp === "string") {
28
+ return [defaultIndex];
29
+ } else if (exp && typeof exp === "object" && !Array.isArray(exp)) {
30
+ const entryPoints = new Array();
31
+ for (const mount of Object.keys(exp)) {
32
+ const path = exp[mount];
33
+ if (typeof path !== "string") {
34
+ throw new Error(
35
+ `Exports field value must be a string, got '${JSON.stringify(path)}'`
36
+ );
37
+ }
38
+ if (process.env.EXPERIMENTAL_TRIM_NEXT_ENTRY && mount === "./next") {
39
+ continue;
40
+ }
41
+ entryPoints.push(parseEntryPoint(mount, path));
42
+ }
43
+ return entryPoints;
44
+ }
45
+ return [defaultIndex];
46
+ }
47
+
48
+ exports.readEntryPoints = readEntryPoints;
49
+ //# sourceMappingURL=entryPoints.cjs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entryPoints.cjs.js","sources":["../../src/lib/entryPoints.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 { extname } from 'node:path';\nimport { BackstagePackageJson } from '@backstage/cli-node';\n\nexport interface EntryPoint {\n mount: string;\n path: string;\n name: string;\n ext: string;\n}\n\n// Unless explicitly specified in exports, the index entrypoint is always\n// assumed to be at src/index.ts for backwards compatibility.\nconst defaultIndex = {\n mount: '.',\n path: 'src/index.ts',\n name: 'index',\n ext: '.ts',\n};\n\nconst SCRIPT_EXTS = ['.js', '.jsx', '.ts', '.tsx'];\n\nfunction parseEntryPoint(mount: string, path: string): EntryPoint {\n const ext = extname(path);\n\n let name = mount;\n if (name === '.') {\n name = 'index';\n } else if (name.startsWith('./')) {\n name = name.slice(2);\n }\n\n // Script entry points can't have slashes because we create backward-compat\n // directories for them. Non-script files (like CSS) can have nested paths.\n if (name.includes('/') && SCRIPT_EXTS.includes(ext)) {\n throw new Error(`Mount point '${mount}' may not contain multiple slashes`);\n }\n\n return { mount, path, name, ext };\n}\n\nexport function readEntryPoints(pkg: BackstagePackageJson): Array<EntryPoint> {\n const exp = pkg.exports;\n if (typeof exp === 'string') {\n return [defaultIndex];\n } else if (exp && typeof exp === 'object' && !Array.isArray(exp)) {\n const entryPoints = new Array<{\n mount: string;\n path: string;\n name: string;\n ext: string;\n }>();\n\n for (const mount of Object.keys(exp)) {\n const path = exp[mount];\n if (typeof path !== 'string') {\n throw new Error(\n `Exports field value must be a string, got '${JSON.stringify(path)}'`,\n );\n }\n\n // Setting the EXPERIMENTAL_TRIM_NEXT_ENTRY flag will remove any `./next` entry points\n if (process.env.EXPERIMENTAL_TRIM_NEXT_ENTRY && mount === './next') {\n continue;\n }\n\n entryPoints.push(parseEntryPoint(mount, path));\n }\n\n return entryPoints;\n }\n\n return [defaultIndex];\n}\n"],"names":["extname"],"mappings":";;;;AA4BA,MAAM,YAAA,GAAe;AAAA,EACnB,KAAA,EAAO,GAAA;AAAA,EACP,IAAA,EAAM,cAAA;AAAA,EACN,IAAA,EAAM,OAAA;AAAA,EACN,GAAA,EAAK;AACP,CAAA;AAEA,MAAM,WAAA,GAAc,CAAC,KAAA,EAAO,MAAA,EAAQ,OAAO,MAAM,CAAA;AAEjD,SAAS,eAAA,CAAgB,OAAe,IAAA,EAA0B;AAChE,EAAA,MAAM,GAAA,GAAMA,kBAAQ,IAAI,CAAA;AAExB,EAAA,IAAI,IAAA,GAAO,KAAA;AACX,EAAA,IAAI,SAAS,GAAA,EAAK;AAChB,IAAA,IAAA,GAAO,OAAA;AAAA,EACT,CAAA,MAAA,IAAW,IAAA,CAAK,UAAA,CAAW,IAAI,CAAA,EAAG;AAChC,IAAA,IAAA,GAAO,IAAA,CAAK,MAAM,CAAC,CAAA;AAAA,EACrB;AAIA,EAAA,IAAI,KAAK,QAAA,CAAS,GAAG,KAAK,WAAA,CAAY,QAAA,CAAS,GAAG,CAAA,EAAG;AACnD,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,aAAA,EAAgB,KAAK,CAAA,kCAAA,CAAoC,CAAA;AAAA,EAC3E;AAEA,EAAA,OAAO,EAAE,KAAA,EAAO,IAAA,EAAM,IAAA,EAAM,GAAA,EAAI;AAClC;AAEO,SAAS,gBAAgB,GAAA,EAA8C;AAC5E,EAAA,MAAM,MAAM,GAAA,CAAI,OAAA;AAChB,EAAA,IAAI,OAAO,QAAQ,QAAA,EAAU;AAC3B,IAAA,OAAO,CAAC,YAAY,CAAA;AAAA,EACtB,CAAA,MAAA,IAAW,OAAO,OAAO,GAAA,KAAQ,YAAY,CAAC,KAAA,CAAM,OAAA,CAAQ,GAAG,CAAA,EAAG;AAChE,IAAA,MAAM,WAAA,GAAc,IAAI,KAAA,EAKrB;AAEH,IAAA,KAAA,MAAW,KAAA,IAAS,MAAA,CAAO,IAAA,CAAK,GAAG,CAAA,EAAG;AACpC,MAAA,MAAM,IAAA,GAAO,IAAI,KAAK,CAAA;AACtB,MAAA,IAAI,OAAO,SAAS,QAAA,EAAU;AAC5B,QAAA,MAAM,IAAI,KAAA;AAAA,UACR,CAAA,2CAAA,EAA8C,IAAA,CAAK,SAAA,CAAU,IAAI,CAAC,CAAA,CAAA;AAAA,SACpE;AAAA,MACF;AAGA,MAAA,IAAI,OAAA,CAAQ,GAAA,CAAI,4BAAA,IAAgC,KAAA,KAAU,QAAA,EAAU;AAClE,QAAA;AAAA,MACF;AAEA,MAAA,WAAA,CAAY,IAAA,CAAK,eAAA,CAAgB,KAAA,EAAO,IAAI,CAAC,CAAA;AAAA,IAC/C;AAEA,IAAA,OAAO,WAAA;AAAA,EACT;AAEA,EAAA,OAAO,CAAC,YAAY,CAAA;AACtB;;;;"}
@@ -0,0 +1,60 @@
1
+ 'use strict';
2
+
3
+ var errors = require('@backstage/errors');
4
+
5
+ const requestType = "@backstage/cli/channel/request";
6
+ const responseType = "@backstage/cli/channel/response";
7
+ class IpcServer {
8
+ #generation = 1;
9
+ #methods = /* @__PURE__ */ new Map();
10
+ addChild(child) {
11
+ const generation = this.#generation++;
12
+ const sendMessage = child.send?.bind(child);
13
+ if (!sendMessage) {
14
+ return;
15
+ }
16
+ const messageListener = (request) => {
17
+ if (request.type !== requestType) {
18
+ return;
19
+ }
20
+ const handler = this.#methods.get(request.method);
21
+ if (!handler) {
22
+ sendMessage({
23
+ type: responseType,
24
+ id: request.id,
25
+ error: {
26
+ name: "NotFoundError",
27
+ message: `No handler registered for method ${request.method}`
28
+ }
29
+ });
30
+ return;
31
+ }
32
+ Promise.resolve().then(() => handler(request.body, { generation })).then(
33
+ (response) => sendMessage({
34
+ type: responseType,
35
+ id: request.id,
36
+ body: response
37
+ })
38
+ ).catch(
39
+ (error) => sendMessage({
40
+ type: responseType,
41
+ id: request.id,
42
+ error: errors.serializeError(error)
43
+ })
44
+ );
45
+ };
46
+ child.addListener("message", messageListener);
47
+ child.addListener("exit", () => {
48
+ child.removeListener("message", messageListener);
49
+ });
50
+ }
51
+ registerMethod(method, handler) {
52
+ if (this.#methods.has(method)) {
53
+ throw new Error(`A handler is already registered for method ${method}`);
54
+ }
55
+ this.#methods.set(method, handler);
56
+ }
57
+ }
58
+
59
+ exports.IpcServer = IpcServer;
60
+ //# sourceMappingURL=IpcServer.cjs.js.map