@backstage/cli-module-build 0.1.1-next.1 → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +31 -0
- package/dist/commands/package/start/startBackend.cjs.js +2 -0
- package/dist/commands/package/start/startBackend.cjs.js.map +1 -1
- package/dist/lib/bundler/config.cjs.js +11 -1
- package/dist/lib/bundler/config.cjs.js.map +1 -1
- package/dist/lib/packager/computeTopologicalLayers.cjs.js +32 -0
- package/dist/lib/packager/computeTopologicalLayers.cjs.js.map +1 -0
- package/dist/lib/packager/createDistWorkspace.cjs.js +10 -7
- package/dist/lib/packager/createDistWorkspace.cjs.js.map +1 -1
- package/dist/lib/runner/runBackend.cjs.js +31 -0
- package/dist/lib/runner/runBackend.cjs.js.map +1 -1
- package/dist/lib/runner/startEmbeddedDb.cjs.js +100 -0
- package/dist/lib/runner/startEmbeddedDb.cjs.js.map +1 -0
- package/dist/package.json.cjs.js +17 -3
- package/dist/package.json.cjs.js.map +1 -1
- package/package.json +20 -10
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,36 @@
|
|
|
1
1
|
# @backstage/cli-module-build
|
|
2
2
|
|
|
3
|
+
## 0.1.1
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- 2e5c5f8: Bumped `glob` dependency from v7/v8/v11 to v13 to address security vulnerabilities in older versions. Bumped `rollup` from v4.27 to v4.59+ to fix a high severity path traversal vulnerability (GHSA-mw96-cpmx-2vgc).
|
|
8
|
+
- f1b493f: Fixed the embedded-postgres PID file being written before database initialization, which prevented the database from initializing successfully.
|
|
9
|
+
- f52a296: Suppressed false-positive Module Federation warning for shared dependencies that use secondary entry points (e.g. `@mui/material/styles`). These sub-path `package.json` files lack a `version` field, causing the bundler to emit "No version specified" warnings that fail CI builds.
|
|
10
|
+
- c16c508: When building dist-workspaces with --always-pack, batch `yarn pack` operations to avoid packing packages and their dependencies simultaneously.
|
|
11
|
+
- f14df56: Added experimental support for using `embedded-postgres` as the database for local development. Set `backend.database.client` to `embedded-postgres` in your app config to enable this. The `embedded-postgres` package must be installed as an explicit dependency in your project.
|
|
12
|
+
- Updated dependencies
|
|
13
|
+
- @backstage/errors@1.3.0
|
|
14
|
+
- @backstage/cli-common@0.2.1
|
|
15
|
+
- @backstage/cli-node@0.3.1
|
|
16
|
+
- @backstage/config-loader@1.10.10
|
|
17
|
+
- @backstage/config@1.3.7
|
|
18
|
+
- @backstage/module-federation-common@0.1.3
|
|
19
|
+
|
|
20
|
+
## 0.1.1-next.2
|
|
21
|
+
|
|
22
|
+
### Patch Changes
|
|
23
|
+
|
|
24
|
+
- c16c508: When building dist-workspaces with --always-pack, batch `yarn pack` operations to avoid packing packages and their dependencies simultaneously.
|
|
25
|
+
- f14df56: Added experimental support for using `embedded-postgres` as the database for local development. Set `backend.database.client` to `embedded-postgres` in your app config to enable this. The `embedded-postgres` package must be installed as an explicit dependency in your project.
|
|
26
|
+
- Updated dependencies
|
|
27
|
+
- @backstage/errors@1.3.0-next.0
|
|
28
|
+
- @backstage/cli-common@0.2.1-next.1
|
|
29
|
+
- @backstage/cli-node@0.3.1-next.1
|
|
30
|
+
- @backstage/config-loader@1.10.10-next.1
|
|
31
|
+
- @backstage/config@1.3.7-next.0
|
|
32
|
+
- @backstage/module-federation-common@0.1.3-next.0
|
|
33
|
+
|
|
3
34
|
## 0.1.1-next.1
|
|
4
35
|
|
|
5
36
|
### Patch Changes
|
|
@@ -13,6 +13,7 @@ async function startBackend(options) {
|
|
|
13
13
|
const waitForExit = await runBackend.runBackend({
|
|
14
14
|
targetDir: options.targetDir,
|
|
15
15
|
entry: "src/index",
|
|
16
|
+
configPaths: options.configPaths,
|
|
16
17
|
inspectEnabled: options.inspectEnabled,
|
|
17
18
|
inspectBrkEnabled: options.inspectBrkEnabled,
|
|
18
19
|
linkedWorkspace: options.linkedWorkspace,
|
|
@@ -33,6 +34,7 @@ async function startBackendPlugin(options) {
|
|
|
33
34
|
const waitForExit = await runBackend.runBackend({
|
|
34
35
|
targetDir: options.targetDir,
|
|
35
36
|
entry: "dev/index",
|
|
37
|
+
configPaths: options.configPaths,
|
|
36
38
|
inspectEnabled: options.inspectEnabled,
|
|
37
39
|
inspectBrkEnabled: options.inspectBrkEnabled,
|
|
38
40
|
require: options.require,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"startBackend.cjs.js","sources":["../../../../src/commands/package/start/startBackend.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 } from '@backstage/cli-common';\n\nimport { runBackend } from '../../../lib/runner';\n\ninterface StartBackendOptions {\n targetDir: string;\n checksEnabled: boolean;\n inspectEnabled?: boolean | string;\n inspectBrkEnabled?: boolean | string;\n linkedWorkspace?: string;\n require?: string;\n}\n\nexport async function startBackend(options: StartBackendOptions) {\n const waitForExit = await runBackend({\n targetDir: options.targetDir,\n entry: 'src/index',\n inspectEnabled: options.inspectEnabled,\n inspectBrkEnabled: options.inspectBrkEnabled,\n linkedWorkspace: options.linkedWorkspace,\n require: options.require,\n });\n\n await waitForExit();\n}\n\nexport async function startBackendPlugin(options: StartBackendOptions) {\n const hasDevIndexEntry = await fs.pathExists(\n resolvePath(options.targetDir ?? targetPaths.dir, 'dev/index.ts'),\n );\n if (!hasDevIndexEntry) {\n console.warn(\n `The 'dev' directory is missing. Please create a proper dev/index.ts in order to start the plugin.`,\n );\n return;\n }\n\n const waitForExit = await runBackend({\n targetDir: options.targetDir,\n entry: 'dev/index',\n inspectEnabled: options.inspectEnabled,\n inspectBrkEnabled: options.inspectBrkEnabled,\n require: options.require,\n linkedWorkspace: options.linkedWorkspace,\n });\n\n await waitForExit();\n}\n"],"names":["runBackend","fs","resolvePath","targetPaths"],"mappings":";;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"startBackend.cjs.js","sources":["../../../../src/commands/package/start/startBackend.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 } from '@backstage/cli-common';\n\nimport { runBackend } from '../../../lib/runner';\n\ninterface StartBackendOptions {\n targetDir: string;\n checksEnabled: boolean;\n configPaths?: string[];\n inspectEnabled?: boolean | string;\n inspectBrkEnabled?: boolean | string;\n linkedWorkspace?: string;\n require?: string;\n}\n\nexport async function startBackend(options: StartBackendOptions) {\n const waitForExit = await runBackend({\n targetDir: options.targetDir,\n entry: 'src/index',\n configPaths: options.configPaths,\n inspectEnabled: options.inspectEnabled,\n inspectBrkEnabled: options.inspectBrkEnabled,\n linkedWorkspace: options.linkedWorkspace,\n require: options.require,\n });\n\n await waitForExit();\n}\n\nexport async function startBackendPlugin(options: StartBackendOptions) {\n const hasDevIndexEntry = await fs.pathExists(\n resolvePath(options.targetDir ?? targetPaths.dir, 'dev/index.ts'),\n );\n if (!hasDevIndexEntry) {\n console.warn(\n `The 'dev' directory is missing. Please create a proper dev/index.ts in order to start the plugin.`,\n );\n return;\n }\n\n const waitForExit = await runBackend({\n targetDir: options.targetDir,\n entry: 'dev/index',\n configPaths: options.configPaths,\n inspectEnabled: options.inspectEnabled,\n inspectBrkEnabled: options.inspectBrkEnabled,\n require: options.require,\n linkedWorkspace: options.linkedWorkspace,\n });\n\n await waitForExit();\n}\n"],"names":["runBackend","fs","resolvePath","targetPaths"],"mappings":";;;;;;;;;;;AAgCA,eAAsB,aAAa,OAAA,EAA8B;AAC/D,EAAA,MAAM,WAAA,GAAc,MAAMA,qBAAA,CAAW;AAAA,IACnC,WAAW,OAAA,CAAQ,SAAA;AAAA,IACnB,KAAA,EAAO,WAAA;AAAA,IACP,aAAa,OAAA,CAAQ,WAAA;AAAA,IACrB,gBAAgB,OAAA,CAAQ,cAAA;AAAA,IACxB,mBAAmB,OAAA,CAAQ,iBAAA;AAAA,IAC3B,iBAAiB,OAAA,CAAQ,eAAA;AAAA,IACzB,SAAS,OAAA,CAAQ;AAAA,GAClB,CAAA;AAED,EAAA,MAAM,WAAA,EAAY;AACpB;AAEA,eAAsB,mBAAmB,OAAA,EAA8B;AACrE,EAAA,MAAM,gBAAA,GAAmB,MAAMC,mBAAA,CAAG,UAAA;AAAA,IAChCC,iBAAA,CAAY,OAAA,CAAQ,SAAA,IAAaC,qBAAA,CAAY,KAAK,cAAc;AAAA,GAClE;AACA,EAAA,IAAI,CAAC,gBAAA,EAAkB;AACrB,IAAA,OAAA,CAAQ,IAAA;AAAA,MACN,CAAA,iGAAA;AAAA,KACF;AACA,IAAA;AAAA,EACF;AAEA,EAAA,MAAM,WAAA,GAAc,MAAMH,qBAAA,CAAW;AAAA,IACnC,WAAW,OAAA,CAAQ,SAAA;AAAA,IACnB,KAAA,EAAO,WAAA;AAAA,IACP,aAAa,OAAA,CAAQ,WAAA;AAAA,IACrB,gBAAgB,OAAA,CAAQ,cAAA;AAAA,IACxB,mBAAmB,OAAA,CAAQ,iBAAA;AAAA,IAC3B,SAAS,OAAA,CAAQ,OAAA;AAAA,IACjB,iBAAiB,OAAA,CAAQ;AAAA,GAC1B,CAAA;AAED,EAAA,MAAM,WAAA,EAAY;AACpB;;;;;"}
|
|
@@ -299,7 +299,17 @@ async function createConfig(paths, options) {
|
|
|
299
299
|
css: false
|
|
300
300
|
}
|
|
301
301
|
},
|
|
302
|
-
plugins
|
|
302
|
+
plugins,
|
|
303
|
+
...options.moduleFederationRemote && {
|
|
304
|
+
// TODO: remove this warning skipping as soon as the corresponding bundler limitation
|
|
305
|
+
// described in issue https://github.com/web-infra-dev/rspack/issues/13635 is fixed
|
|
306
|
+
// when PR: https://github.com/web-infra-dev/rspack/pull/13636 is merged.
|
|
307
|
+
ignoreWarnings: [
|
|
308
|
+
{
|
|
309
|
+
message: /No version specified and unable to automatically determine one\. No version in description file/
|
|
310
|
+
}
|
|
311
|
+
]
|
|
312
|
+
}
|
|
303
313
|
};
|
|
304
314
|
}
|
|
305
315
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.cjs.js","sources":["../../../src/lib/bundler/config.ts"],"sourcesContent":["/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { resolve as resolvePath } from 'node:path';\nimport { BundlingOptions, ModuleFederationRemoteOptions } from './types';\nimport { rspack, Configuration } from '@rspack/core';\n\nimport { BundlingPaths } from './paths';\nimport { Config } from '@backstage/config';\nimport ESLintRspackPlugin from 'eslint-rspack-plugin';\nimport { TsCheckerRspackPlugin } from 'ts-checker-rspack-plugin';\nimport HtmlWebpackPlugin from 'html-webpack-plugin';\nimport ModuleScopePlugin from 'react-dev-utils/ModuleScopePlugin';\nimport { ModuleFederationPlugin } from '@module-federation/enhanced/rspack';\n\nimport fs from 'fs-extra';\nimport { optimization as optimizationConfig } from './optimization';\nimport pickBy from 'lodash/pickBy';\nimport { findOwnPaths, runOutput, targetPaths } from '@backstage/cli-common';\n\nimport { transforms } from './transforms';\nimport { version } from '../../../package.json';\nimport yn from 'yn';\nimport { hasReactDomClient } from './hasReactDomClient';\nimport { createWorkspaceLinkingPlugins } from './linkWorkspaces';\nimport { ConfigInjectingHtmlWebpackPlugin } from './ConfigInjectingHtmlWebpackPlugin';\n\nexport function resolveBaseUrl(\n config: Config,\n moduleFederationRemote?: ModuleFederationRemoteOptions,\n): URL {\n const baseUrl = config.getOptionalString('app.baseUrl');\n\n const defaultBaseUrl = moduleFederationRemote\n ? `http://localhost:${process.env.PORT ?? '3000'}`\n : 'http://localhost:3000';\n\n try {\n return new URL(baseUrl ?? '/', defaultBaseUrl);\n } catch (error) {\n throw new Error(`Invalid app.baseUrl, ${error}`);\n }\n}\n\nexport function resolveEndpoint(\n config: Config,\n moduleFederationRemote?: ModuleFederationRemoteOptions,\n): {\n host: string;\n port: number;\n} {\n const url = resolveBaseUrl(config, moduleFederationRemote);\n\n return {\n host: config.getOptionalString('app.listen.host') ?? url.hostname,\n port:\n config.getOptionalNumber('app.listen.port') ??\n Number(url.port) ??\n (url.protocol === 'https:' ? 443 : 80),\n };\n}\n\nasync function readBuildInfo() {\n const timestamp = Date.now();\n\n let commit: string | undefined;\n try {\n commit = await runOutput(['git', 'rev-parse', 'HEAD']);\n } catch (error) {\n // ignore, see below\n }\n\n let gitVersion: string | undefined;\n try {\n gitVersion = await runOutput(['git', 'describe', '--always']);\n } catch (error) {\n // ignore, see below\n }\n\n if (commit === undefined || gitVersion === undefined) {\n console.info(\n 'NOTE: Did not compute git version or commit hash, could not execute the git command line utility',\n );\n }\n\n const { version: packageVersion } = await fs.readJson(\n targetPaths.resolve('package.json'),\n );\n\n return {\n cliVersion: version,\n gitVersion: gitVersion ?? 'unknown',\n packageVersion,\n timestamp,\n commit: commit ?? 'unknown',\n };\n}\n\nexport async function createConfig(\n paths: BundlingPaths,\n options: BundlingOptions,\n): Promise<Configuration> {\n const {\n checksEnabled,\n isDev,\n frontendConfig,\n moduleFederationRemote,\n publicSubPath = '',\n webpack,\n } = options;\n\n const { plugins, loaders } = transforms(options);\n // Any package that is part of the monorepo but outside the monorepo root dir need\n // separate resolution logic.\n\n const validBaseUrl = resolveBaseUrl(frontendConfig, moduleFederationRemote);\n let publicPath = validBaseUrl.pathname.replace(/\\/$/, '');\n if (publicSubPath) {\n publicPath = `${publicPath}${publicSubPath}`.replace('//', '/');\n }\n\n if (isDev) {\n const { host, port } = resolveEndpoint(\n options.frontendConfig,\n options.moduleFederationRemote,\n );\n\n const refreshOptions = {\n overlay: {\n sockProtocol: 'ws',\n sockHost: host,\n sockPort: port,\n },\n } as const;\n\n if (webpack) {\n const ReactRefreshPlugin = require('@pmmmwh/react-refresh-webpack-plugin');\n plugins.push(new ReactRefreshPlugin(refreshOptions));\n } else {\n const RspackReactRefreshPlugin = require('@rspack/plugin-react-refresh');\n plugins.push(new RspackReactRefreshPlugin(refreshOptions));\n }\n }\n\n if (checksEnabled) {\n const TsCheckerPlugin = webpack\n ? (require('fork-ts-checker-webpack-plugin') as typeof import('fork-ts-checker-webpack-plugin'))\n : TsCheckerRspackPlugin;\n const ESLintPlugin = webpack\n ? (require('eslint-webpack-plugin') as typeof import('eslint-webpack-plugin'))\n : ESLintRspackPlugin;\n plugins.push(\n new TsCheckerPlugin({\n typescript: { configFile: paths.targetTsConfig, memoryLimit: 8192 },\n }),\n new ESLintPlugin({\n cache: false, // Cache seems broken\n context: paths.targetPath,\n files: ['**/*.(ts|tsx|mts|cts|js|jsx|mjs|cjs)'],\n }),\n );\n }\n\n const bundler = webpack ? (webpack as unknown as typeof rspack) : rspack;\n\n // TODO(blam): process is no longer auto polyfilled by webpack in v5.\n // we use the provide plugin to provide this polyfill, but lets look\n // to remove this eventually!\n plugins.push(\n new bundler.ProvidePlugin({\n process: require.resolve('process/browser'),\n Buffer: ['buffer', 'Buffer'],\n }),\n );\n\n if (!options.moduleFederationRemote) {\n const templateOptions = {\n meta: {\n 'backstage-app-mode': options?.appMode ?? 'public',\n },\n template: paths.targetHtml,\n templateParameters: {\n publicPath,\n config: frontendConfig,\n },\n };\n if (webpack) {\n // Config injection via index.html doesn't work across reloads with\n // WebPack, so we rely on the APP_CONFIG injection instead\n plugins.push(new HtmlWebpackPlugin(templateOptions));\n } else {\n // With Rspack we inject config via index.html, this is both because we\n // can't use APP_CONFIG due to the lack of support for runtime values, but\n // also because we are able to do it and it lines up better with what the\n // app-backend is doing.\n //\n // We still use the html plugin from WebPack, since the Rspack one won't\n // let us inject complex objects like the config.\n plugins.push(\n new ConfigInjectingHtmlWebpackPlugin(\n templateOptions,\n options.getFrontendAppConfigs,\n ),\n );\n }\n plugins.push(\n new HtmlWebpackPlugin({\n meta: {\n 'backstage-app-mode': options?.appMode ?? 'public',\n // This is added to be written in the later step, and finally read by the extra entry point\n 'backstage-public-path': '<%= publicPath %>/',\n },\n minify: false,\n publicPath: '<%= publicPath %>',\n filename: 'index.html.tmpl',\n template: `${require.resolve('raw-loader')}!${paths.targetHtml}`,\n }),\n );\n }\n\n if (options.moduleFederationRemote) {\n const AdaptedModuleFederationPlugin = webpack\n ? (require('@module-federation/enhanced/webpack')\n .ModuleFederationPlugin as unknown as typeof ModuleFederationPlugin)\n : ModuleFederationPlugin;\n\n const exposes = options.moduleFederationRemote.exposes\n ? Object.fromEntries(\n Object.entries(options.moduleFederationRemote?.exposes).map(\n ([k, v]) => [k, resolvePath(paths.targetPath, v)],\n ),\n )\n : {\n '.': paths.targetEntry,\n };\n\n plugins.push(\n new AdaptedModuleFederationPlugin({\n filename: 'remoteEntry.js',\n exposes,\n name: options.moduleFederationRemote.name,\n runtime: false,\n shared: options.moduleFederationRemote.sharedDependencies,\n }),\n );\n }\n\n const buildInfo = await readBuildInfo();\n\n plugins.push(\n webpack\n ? new webpack.DefinePlugin({\n 'process.env.BUILD_INFO': JSON.stringify(buildInfo),\n 'process.env.APP_CONFIG': webpack.DefinePlugin.runtimeValue(\n () => JSON.stringify(options.getFrontendAppConfigs()),\n true,\n ),\n // This allows for conditional imports of react-dom/client, since there's no way\n // to check for presence of it in source code without module resolution errors.\n 'process.env.HAS_REACT_DOM_CLIENT': JSON.stringify(\n hasReactDomClient(),\n ),\n })\n : new bundler.DefinePlugin({\n 'process.env.BUILD_INFO': JSON.stringify(buildInfo),\n 'process.env.APP_CONFIG': JSON.stringify([]), // Inject via index.html instead\n // This allows for conditional imports of react-dom/client, since there's no way\n // to check for presence of it in source code without module resolution errors.\n 'process.env.HAS_REACT_DOM_CLIENT': JSON.stringify(\n hasReactDomClient(),\n ),\n }),\n );\n\n if (options.linkedWorkspace) {\n plugins.push(\n ...(await createWorkspaceLinkingPlugins(\n bundler,\n options.linkedWorkspace,\n )),\n );\n }\n\n // These files are required by the transpiled code when using React Refresh.\n // They need to be excluded to the module scope plugin which ensures that files\n // that exist in the package are required.\n const reactRefreshFiles = webpack\n ? [\n require.resolve(\n '@pmmmwh/react-refresh-webpack-plugin/lib/runtime/RefreshUtils.js',\n ),\n require.resolve(\n '@pmmmwh/react-refresh-webpack-plugin/overlay/index.js',\n ),\n require.resolve('react-refresh'),\n ]\n : [];\n\n const mode = isDev ? 'development' : 'production';\n const optimization = optimizationConfig(options);\n\n return {\n mode,\n profile: false,\n ...(isDev\n ? {\n watchOptions: {\n ignored: /node_modules\\/(?!__backstage-autodetected-plugins__)/,\n },\n }\n : {}),\n optimization,\n bail: false,\n performance: {\n hints: false, // we check the gzip size instead\n },\n devtool: isDev ? 'eval-cheap-module-source-map' : 'source-map',\n context: paths.targetPath,\n entry: [\n /* eslint-disable-next-line no-restricted-syntax */\n findOwnPaths(__dirname).resolve('config/webpack-public-path'),\n ...(options.additionalEntryPoints ?? []),\n paths.targetEntry,\n ],\n resolve: {\n extensions: ['.ts', '.tsx', '.mjs', '.js', '.jsx', '.json', '.wasm'],\n mainFields: ['browser', 'module', 'main'],\n fallback: {\n ...pickBy(require('node-stdlib-browser')),\n module: false,\n dgram: false,\n dns: false,\n fs: false,\n http2: false,\n net: false,\n tls: false,\n child_process: false,\n\n /* new ignores */\n path: false,\n https: false,\n http: false,\n util: require.resolve('util/'),\n },\n // FIXME: see also https://github.com/web-infra-dev/rspack/issues/3408\n ...(webpack && {\n plugins: [\n new ModuleScopePlugin(\n [paths.targetSrc, paths.targetDev],\n [paths.targetPackageJson, ...reactRefreshFiles],\n ),\n ],\n }),\n },\n module: {\n rules: loaders,\n },\n output: {\n uniqueName: options.moduleFederationRemote?.name,\n path: paths.targetDist,\n publicPath: options.moduleFederationRemote ? 'auto' : `${publicPath}/`,\n filename: isDev ? '[name].js' : 'static/[name].[contenthash:8].js',\n chunkFilename: isDev\n ? '[name].chunk.js'\n : 'static/[name].[contenthash:8].chunk.js',\n ...(isDev\n ? {\n devtoolModuleFilenameTemplate: (info: any) =>\n `file:///${resolvePath(info.absoluteResourcePath).replace(\n /\\\\/g,\n '/',\n )}`,\n }\n : {}),\n },\n experiments: {\n lazyCompilation: yn(process.env.EXPERIMENTAL_LAZY_COMPILATION),\n ...(!webpack && {\n // We're still using `style-loader` for custom `insert` option\n css: false,\n }),\n },\n plugins,\n };\n}\n"],"names":["runOutput","fs","targetPaths","version","transforms","TsCheckerRspackPlugin","ESLintRspackPlugin","rspack","HtmlWebpackPlugin","ConfigInjectingHtmlWebpackPlugin","ModuleFederationPlugin","resolvePath","hasReactDomClient","createWorkspaceLinkingPlugins","optimization","optimizationConfig","findOwnPaths","pickBy","ModuleScopePlugin","yn"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAwCO,SAAS,cAAA,CACd,QACA,sBAAA,EACK;AACL,EAAA,MAAM,OAAA,GAAU,MAAA,CAAO,iBAAA,CAAkB,aAAa,CAAA;AAEtD,EAAA,MAAM,iBAAiB,sBAAA,GACnB,CAAA,iBAAA,EAAoB,QAAQ,GAAA,CAAI,IAAA,IAAQ,MAAM,CAAA,CAAA,GAC9C,uBAAA;AAEJ,EAAA,IAAI;AACF,IAAA,OAAO,IAAI,GAAA,CAAI,OAAA,IAAW,GAAA,EAAK,cAAc,CAAA;AAAA,EAC/C,SAAS,KAAA,EAAO;AACd,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,qBAAA,EAAwB,KAAK,CAAA,CAAE,CAAA;AAAA,EACjD;AACF;AAEO,SAAS,eAAA,CACd,QACA,sBAAA,EAIA;AACA,EAAA,MAAM,GAAA,GAAM,cAAA,CAAe,MAAA,EAAQ,sBAAsB,CAAA;AAEzD,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,MAAA,CAAO,iBAAA,CAAkB,iBAAiB,KAAK,GAAA,CAAI,QAAA;AAAA,IACzD,IAAA,EACE,MAAA,CAAO,iBAAA,CAAkB,iBAAiB,CAAA,IAC1C,MAAA,CAAO,GAAA,CAAI,IAAI,CAAA,KACd,GAAA,CAAI,QAAA,KAAa,QAAA,GAAW,GAAA,GAAM,EAAA;AAAA,GACvC;AACF;AAEA,eAAe,aAAA,GAAgB;AAC7B,EAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAE3B,EAAA,IAAI,MAAA;AACJ,EAAA,IAAI;AACF,IAAA,MAAA,GAAS,MAAMA,mBAAA,CAAU,CAAC,KAAA,EAAO,WAAA,EAAa,MAAM,CAAC,CAAA;AAAA,EACvD,SAAS,KAAA,EAAO;AAAA,EAEhB;AAEA,EAAA,IAAI,UAAA;AACJ,EAAA,IAAI;AACF,IAAA,UAAA,GAAa,MAAMA,mBAAA,CAAU,CAAC,KAAA,EAAO,UAAA,EAAY,UAAU,CAAC,CAAA;AAAA,EAC9D,SAAS,KAAA,EAAO;AAAA,EAEhB;AAEA,EAAA,IAAI,MAAA,KAAW,MAAA,IAAa,UAAA,KAAe,MAAA,EAAW;AACpD,IAAA,OAAA,CAAQ,IAAA;AAAA,MACN;AAAA,KACF;AAAA,EACF;AAEA,EAAA,MAAM,EAAE,OAAA,EAAS,cAAA,EAAe,GAAI,MAAMC,mBAAA,CAAG,QAAA;AAAA,IAC3CC,qBAAA,CAAY,QAAQ,cAAc;AAAA,GACpC;AAEA,EAAA,OAAO;AAAA,IACL,UAAA,EAAYC,gBAAA;AAAA,IACZ,YAAY,UAAA,IAAc,SAAA;AAAA,IAC1B,cAAA;AAAA,IACA,SAAA;AAAA,IACA,QAAQ,MAAA,IAAU;AAAA,GACpB;AACF;AAEA,eAAsB,YAAA,CACpB,OACA,OAAA,EACwB;AACxB,EAAA,MAAM;AAAA,IACJ,aAAA;AAAA,IACA,KAAA;AAAA,IACA,cAAA;AAAA,IACA,sBAAA;AAAA,IACA,aAAA,GAAgB,EAAA;AAAA,IAChB;AAAA,GACF,GAAI,OAAA;AAEJ,EAAA,MAAM,EAAE,OAAA,EAAS,OAAA,EAAQ,GAAIC,sBAAW,OAAO,CAAA;AAI/C,EAAA,MAAM,YAAA,GAAe,cAAA,CAAe,cAAA,EAAgB,sBAAsB,CAAA;AAC1E,EAAA,IAAI,UAAA,GAAa,YAAA,CAAa,QAAA,CAAS,OAAA,CAAQ,OAAO,EAAE,CAAA;AACxD,EAAA,IAAI,aAAA,EAAe;AACjB,IAAA,UAAA,GAAa,GAAG,UAAU,CAAA,EAAG,aAAa,CAAA,CAAA,CAAG,OAAA,CAAQ,MAAM,GAAG,CAAA;AAAA,EAChE;AAEA,EAAA,IAAI,KAAA,EAAO;AACT,IAAA,MAAM,EAAE,IAAA,EAAM,IAAA,EAAK,GAAI,eAAA;AAAA,MACrB,OAAA,CAAQ,cAAA;AAAA,MACR,OAAA,CAAQ;AAAA,KACV;AAEA,IAAA,MAAM,cAAA,GAAiB;AAAA,MACrB,OAAA,EAAS;AAAA,QACP,YAAA,EAAc,IAAA;AAAA,QACd,QAAA,EAAU,IAAA;AAAA,QACV,QAAA,EAAU;AAAA;AACZ,KACF;AAEA,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,MAAM,kBAAA,GAAqB,QAAQ,sCAAsC,CAAA;AACzE,MAAA,OAAA,CAAQ,IAAA,CAAK,IAAI,kBAAA,CAAmB,cAAc,CAAC,CAAA;AAAA,IACrD,CAAA,MAAO;AACL,MAAA,MAAM,wBAAA,GAA2B,QAAQ,8BAA8B,CAAA;AACvE,MAAA,OAAA,CAAQ,IAAA,CAAK,IAAI,wBAAA,CAAyB,cAAc,CAAC,CAAA;AAAA,IAC3D;AAAA,EACF;AAEA,EAAA,IAAI,aAAA,EAAe;AACjB,IAAA,MAAM,eAAA,GAAkB,OAAA,GACnB,OAAA,CAAQ,gCAAgC,CAAA,GACzCC,2CAAA;AACJ,IAAA,MAAM,YAAA,GAAe,OAAA,GAChB,OAAA,CAAQ,uBAAuB,CAAA,GAChCC,mCAAA;AACJ,IAAA,OAAA,CAAQ,IAAA;AAAA,MACN,IAAI,eAAA,CAAgB;AAAA,QAClB,YAAY,EAAE,UAAA,EAAY,KAAA,CAAM,cAAA,EAAgB,aAAa,IAAA;AAAK,OACnE,CAAA;AAAA,MACD,IAAI,YAAA,CAAa;AAAA,QACf,KAAA,EAAO,KAAA;AAAA;AAAA,QACP,SAAS,KAAA,CAAM,UAAA;AAAA,QACf,KAAA,EAAO,CAAC,sCAAsC;AAAA,OAC/C;AAAA,KACH;AAAA,EACF;AAEA,EAAA,MAAM,OAAA,GAAU,UAAW,OAAA,GAAuCC,WAAA;AAKlE,EAAA,OAAA,CAAQ,IAAA;AAAA,IACN,IAAI,QAAQ,aAAA,CAAc;AAAA,MACxB,OAAA,EAAS,OAAA,CAAQ,OAAA,CAAQ,iBAAiB,CAAA;AAAA,MAC1C,MAAA,EAAQ,CAAC,QAAA,EAAU,QAAQ;AAAA,KAC5B;AAAA,GACH;AAEA,EAAA,IAAI,CAAC,QAAQ,sBAAA,EAAwB;AACnC,IAAA,MAAM,eAAA,GAAkB;AAAA,MACtB,IAAA,EAAM;AAAA,QACJ,oBAAA,EAAsB,SAAS,OAAA,IAAW;AAAA,OAC5C;AAAA,MACA,UAAU,KAAA,CAAM,UAAA;AAAA,MAChB,kBAAA,EAAoB;AAAA,QAClB,UAAA;AAAA,QACA,MAAA,EAAQ;AAAA;AACV,KACF;AACA,IAAA,IAAI,OAAA,EAAS;AAGX,MAAA,OAAA,CAAQ,IAAA,CAAK,IAAIC,kCAAA,CAAkB,eAAe,CAAC,CAAA;AAAA,IACrD,CAAA,MAAO;AAQL,MAAA,OAAA,CAAQ,IAAA;AAAA,QACN,IAAIC,iEAAA;AAAA,UACF,eAAA;AAAA,UACA,OAAA,CAAQ;AAAA;AACV,OACF;AAAA,IACF;AACA,IAAA,OAAA,CAAQ,IAAA;AAAA,MACN,IAAID,kCAAA,CAAkB;AAAA,QACpB,IAAA,EAAM;AAAA,UACJ,oBAAA,EAAsB,SAAS,OAAA,IAAW,QAAA;AAAA;AAAA,UAE1C,uBAAA,EAAyB;AAAA,SAC3B;AAAA,QACA,MAAA,EAAQ,KAAA;AAAA,QACR,UAAA,EAAY,mBAAA;AAAA,QACZ,QAAA,EAAU,iBAAA;AAAA,QACV,QAAA,EAAU,GAAG,OAAA,CAAQ,OAAA,CAAQ,YAAY,CAAC,CAAA,CAAA,EAAI,MAAM,UAAU,CAAA;AAAA,OAC/D;AAAA,KACH;AAAA,EACF;AAEA,EAAA,IAAI,QAAQ,sBAAA,EAAwB;AAClC,IAAA,MAAM,6BAAA,GAAgC,OAAA,GACjC,OAAA,CAAQ,qCAAqC,EAC3C,sBAAA,GACHE,6BAAA;AAEJ,IAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,sBAAA,CAAuB,OAAA,GAC3C,MAAA,CAAO,WAAA;AAAA,MACL,MAAA,CAAO,OAAA,CAAQ,OAAA,CAAQ,sBAAA,EAAwB,OAAO,CAAA,CAAE,GAAA;AAAA,QACtD,CAAC,CAAC,CAAA,EAAG,CAAC,CAAA,KAAM,CAAC,CAAA,EAAGC,iBAAA,CAAY,KAAA,CAAM,UAAA,EAAY,CAAC,CAAC;AAAA;AAClD,KACF,GACA;AAAA,MACE,KAAK,KAAA,CAAM;AAAA,KACb;AAEJ,IAAA,OAAA,CAAQ,IAAA;AAAA,MACN,IAAI,6BAAA,CAA8B;AAAA,QAChC,QAAA,EAAU,gBAAA;AAAA,QACV,OAAA;AAAA,QACA,IAAA,EAAM,QAAQ,sBAAA,CAAuB,IAAA;AAAA,QACrC,OAAA,EAAS,KAAA;AAAA,QACT,MAAA,EAAQ,QAAQ,sBAAA,CAAuB;AAAA,OACxC;AAAA,KACH;AAAA,EACF;AAEA,EAAA,MAAM,SAAA,GAAY,MAAM,aAAA,EAAc;AAEtC,EAAA,OAAA,CAAQ,IAAA;AAAA,IACN,OAAA,GACI,IAAI,OAAA,CAAQ,YAAA,CAAa;AAAA,MACvB,wBAAA,EAA0B,IAAA,CAAK,SAAA,CAAU,SAAS,CAAA;AAAA,MAClD,wBAAA,EAA0B,QAAQ,YAAA,CAAa,YAAA;AAAA,QAC7C,MAAM,IAAA,CAAK,SAAA,CAAU,OAAA,CAAQ,uBAAuB,CAAA;AAAA,QACpD;AAAA,OACF;AAAA;AAAA;AAAA,MAGA,oCAAoC,IAAA,CAAK,SAAA;AAAA,QACvCC,mCAAA;AAAkB;AACpB,KACD,CAAA,GACD,IAAI,OAAA,CAAQ,YAAA,CAAa;AAAA,MACvB,wBAAA,EAA0B,IAAA,CAAK,SAAA,CAAU,SAAS,CAAA;AAAA,MAClD,wBAAA,EAA0B,IAAA,CAAK,SAAA,CAAU,EAAE,CAAA;AAAA;AAAA;AAAA;AAAA,MAG3C,oCAAoC,IAAA,CAAK,SAAA;AAAA,QACvCA,mCAAA;AAAkB;AACpB,KACD;AAAA,GACP;AAEA,EAAA,IAAI,QAAQ,eAAA,EAAiB;AAC3B,IAAA,OAAA,CAAQ,IAAA;AAAA,MACN,GAAI,MAAMC,4CAAA;AAAA,QACR,OAAA;AAAA,QACA,OAAA,CAAQ;AAAA;AACV,KACF;AAAA,EACF;AAKA,EAAA,MAAM,oBAAoB,OAAA,GACtB;AAAA,IACE,OAAA,CAAQ,OAAA;AAAA,MACN;AAAA,KACF;AAAA,IACA,OAAA,CAAQ,OAAA;AAAA,MACN;AAAA,KACF;AAAA,IACA,OAAA,CAAQ,QAAQ,eAAe;AAAA,MAEjC,EAAC;AAEL,EAAA,MAAM,IAAA,GAAO,QAAQ,aAAA,GAAgB,YAAA;AACrC,EAAA,MAAMC,cAAA,GAAeC,0BAAmB,OAAO,CAAA;AAE/C,EAAA,OAAO;AAAA,IACL,IAAA;AAAA,IACA,OAAA,EAAS,KAAA;AAAA,IACT,GAAI,KAAA,GACA;AAAA,MACE,YAAA,EAAc;AAAA,QACZ,OAAA,EAAS;AAAA;AACX,QAEF,EAAC;AAAA,kBACLD,cAAA;AAAA,IACA,IAAA,EAAM,KAAA;AAAA,IACN,WAAA,EAAa;AAAA,MACX,KAAA,EAAO;AAAA;AAAA,KACT;AAAA,IACA,OAAA,EAAS,QAAQ,8BAAA,GAAiC,YAAA;AAAA,IAClD,SAAS,KAAA,CAAM,UAAA;AAAA,IACf,KAAA,EAAO;AAAA;AAAA,MAELE,sBAAA,CAAa,SAAS,CAAA,CAAE,OAAA,CAAQ,4BAA4B,CAAA;AAAA,MAC5D,GAAI,OAAA,CAAQ,qBAAA,IAAyB,EAAC;AAAA,MACtC,KAAA,CAAM;AAAA,KACR;AAAA,IACA,OAAA,EAAS;AAAA,MACP,UAAA,EAAY,CAAC,KAAA,EAAO,MAAA,EAAQ,QAAQ,KAAA,EAAO,MAAA,EAAQ,SAAS,OAAO,CAAA;AAAA,MACnE,UAAA,EAAY,CAAC,SAAA,EAAW,QAAA,EAAU,MAAM,CAAA;AAAA,MACxC,QAAA,EAAU;AAAA,QACR,GAAGC,uBAAA,CAAO,OAAA,CAAQ,qBAAqB,CAAC,CAAA;AAAA,QACxC,MAAA,EAAQ,KAAA;AAAA,QACR,KAAA,EAAO,KAAA;AAAA,QACP,GAAA,EAAK,KAAA;AAAA,QACL,EAAA,EAAI,KAAA;AAAA,QACJ,KAAA,EAAO,KAAA;AAAA,QACP,GAAA,EAAK,KAAA;AAAA,QACL,GAAA,EAAK,KAAA;AAAA,QACL,aAAA,EAAe,KAAA;AAAA;AAAA,QAGf,IAAA,EAAM,KAAA;AAAA,QACN,KAAA,EAAO,KAAA;AAAA,QACP,IAAA,EAAM,KAAA;AAAA,QACN,IAAA,EAAM,OAAA,CAAQ,OAAA,CAAQ,OAAO;AAAA,OAC/B;AAAA;AAAA,MAEA,GAAI,OAAA,IAAW;AAAA,QACb,OAAA,EAAS;AAAA,UACP,IAAIC,kCAAA;AAAA,YACF,CAAC,KAAA,CAAM,SAAA,EAAW,KAAA,CAAM,SAAS,CAAA;AAAA,YACjC,CAAC,KAAA,CAAM,iBAAA,EAAmB,GAAG,iBAAiB;AAAA;AAChD;AACF;AACF,KACF;AAAA,IACA,MAAA,EAAQ;AAAA,MACN,KAAA,EAAO;AAAA,KACT;AAAA,IACA,MAAA,EAAQ;AAAA,MACN,UAAA,EAAY,QAAQ,sBAAA,EAAwB,IAAA;AAAA,MAC5C,MAAM,KAAA,CAAM,UAAA;AAAA,MACZ,UAAA,EAAY,OAAA,CAAQ,sBAAA,GAAyB,MAAA,GAAS,GAAG,UAAU,CAAA,CAAA,CAAA;AAAA,MACnE,QAAA,EAAU,QAAQ,WAAA,GAAc,kCAAA;AAAA,MAChC,aAAA,EAAe,QACX,iBAAA,GACA,wCAAA;AAAA,MACJ,GAAI,KAAA,GACA;AAAA,QACE,+BAA+B,CAAC,IAAA,KAC9B,WAAWP,iBAAA,CAAY,IAAA,CAAK,oBAAoB,CAAA,CAAE,OAAA;AAAA,UAChD,KAAA;AAAA,UACA;AAAA,SACD,CAAA;AAAA,UAEL;AAAC,KACP;AAAA,IACA,WAAA,EAAa;AAAA,MACX,eAAA,EAAiBQ,mBAAA,CAAG,OAAA,CAAQ,GAAA,CAAI,6BAA6B,CAAA;AAAA,MAC7D,GAAI,CAAC,OAAA,IAAW;AAAA;AAAA,QAEd,GAAA,EAAK;AAAA;AACP,KACF;AAAA,IACA;AAAA,GACF;AACF;;;;;;"}
|
|
1
|
+
{"version":3,"file":"config.cjs.js","sources":["../../../src/lib/bundler/config.ts"],"sourcesContent":["/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { resolve as resolvePath } from 'node:path';\nimport { BundlingOptions, ModuleFederationRemoteOptions } from './types';\nimport { rspack, Configuration } from '@rspack/core';\n\nimport { BundlingPaths } from './paths';\nimport { Config } from '@backstage/config';\nimport ESLintRspackPlugin from 'eslint-rspack-plugin';\nimport { TsCheckerRspackPlugin } from 'ts-checker-rspack-plugin';\nimport HtmlWebpackPlugin from 'html-webpack-plugin';\nimport ModuleScopePlugin from 'react-dev-utils/ModuleScopePlugin';\nimport { ModuleFederationPlugin } from '@module-federation/enhanced/rspack';\n\nimport fs from 'fs-extra';\nimport { optimization as optimizationConfig } from './optimization';\nimport pickBy from 'lodash/pickBy';\nimport { findOwnPaths, runOutput, targetPaths } from '@backstage/cli-common';\n\nimport { transforms } from './transforms';\nimport { version } from '../../../package.json';\nimport yn from 'yn';\nimport { hasReactDomClient } from './hasReactDomClient';\nimport { createWorkspaceLinkingPlugins } from './linkWorkspaces';\nimport { ConfigInjectingHtmlWebpackPlugin } from './ConfigInjectingHtmlWebpackPlugin';\n\nexport function resolveBaseUrl(\n config: Config,\n moduleFederationRemote?: ModuleFederationRemoteOptions,\n): URL {\n const baseUrl = config.getOptionalString('app.baseUrl');\n\n const defaultBaseUrl = moduleFederationRemote\n ? `http://localhost:${process.env.PORT ?? '3000'}`\n : 'http://localhost:3000';\n\n try {\n return new URL(baseUrl ?? '/', defaultBaseUrl);\n } catch (error) {\n throw new Error(`Invalid app.baseUrl, ${error}`);\n }\n}\n\nexport function resolveEndpoint(\n config: Config,\n moduleFederationRemote?: ModuleFederationRemoteOptions,\n): {\n host: string;\n port: number;\n} {\n const url = resolveBaseUrl(config, moduleFederationRemote);\n\n return {\n host: config.getOptionalString('app.listen.host') ?? url.hostname,\n port:\n config.getOptionalNumber('app.listen.port') ??\n Number(url.port) ??\n (url.protocol === 'https:' ? 443 : 80),\n };\n}\n\nasync function readBuildInfo() {\n const timestamp = Date.now();\n\n let commit: string | undefined;\n try {\n commit = await runOutput(['git', 'rev-parse', 'HEAD']);\n } catch (error) {\n // ignore, see below\n }\n\n let gitVersion: string | undefined;\n try {\n gitVersion = await runOutput(['git', 'describe', '--always']);\n } catch (error) {\n // ignore, see below\n }\n\n if (commit === undefined || gitVersion === undefined) {\n console.info(\n 'NOTE: Did not compute git version or commit hash, could not execute the git command line utility',\n );\n }\n\n const { version: packageVersion } = await fs.readJson(\n targetPaths.resolve('package.json'),\n );\n\n return {\n cliVersion: version,\n gitVersion: gitVersion ?? 'unknown',\n packageVersion,\n timestamp,\n commit: commit ?? 'unknown',\n };\n}\n\nexport async function createConfig(\n paths: BundlingPaths,\n options: BundlingOptions,\n): Promise<Configuration> {\n const {\n checksEnabled,\n isDev,\n frontendConfig,\n moduleFederationRemote,\n publicSubPath = '',\n webpack,\n } = options;\n\n const { plugins, loaders } = transforms(options);\n // Any package that is part of the monorepo but outside the monorepo root dir need\n // separate resolution logic.\n\n const validBaseUrl = resolveBaseUrl(frontendConfig, moduleFederationRemote);\n let publicPath = validBaseUrl.pathname.replace(/\\/$/, '');\n if (publicSubPath) {\n publicPath = `${publicPath}${publicSubPath}`.replace('//', '/');\n }\n\n if (isDev) {\n const { host, port } = resolveEndpoint(\n options.frontendConfig,\n options.moduleFederationRemote,\n );\n\n const refreshOptions = {\n overlay: {\n sockProtocol: 'ws',\n sockHost: host,\n sockPort: port,\n },\n } as const;\n\n if (webpack) {\n const ReactRefreshPlugin = require('@pmmmwh/react-refresh-webpack-plugin');\n plugins.push(new ReactRefreshPlugin(refreshOptions));\n } else {\n const RspackReactRefreshPlugin = require('@rspack/plugin-react-refresh');\n plugins.push(new RspackReactRefreshPlugin(refreshOptions));\n }\n }\n\n if (checksEnabled) {\n const TsCheckerPlugin = webpack\n ? (require('fork-ts-checker-webpack-plugin') as typeof import('fork-ts-checker-webpack-plugin'))\n : TsCheckerRspackPlugin;\n const ESLintPlugin = webpack\n ? (require('eslint-webpack-plugin') as typeof import('eslint-webpack-plugin'))\n : ESLintRspackPlugin;\n plugins.push(\n new TsCheckerPlugin({\n typescript: { configFile: paths.targetTsConfig, memoryLimit: 8192 },\n }),\n new ESLintPlugin({\n cache: false, // Cache seems broken\n context: paths.targetPath,\n files: ['**/*.(ts|tsx|mts|cts|js|jsx|mjs|cjs)'],\n }),\n );\n }\n\n const bundler = webpack ? (webpack as unknown as typeof rspack) : rspack;\n\n // TODO(blam): process is no longer auto polyfilled by webpack in v5.\n // we use the provide plugin to provide this polyfill, but lets look\n // to remove this eventually!\n plugins.push(\n new bundler.ProvidePlugin({\n process: require.resolve('process/browser'),\n Buffer: ['buffer', 'Buffer'],\n }),\n );\n\n if (!options.moduleFederationRemote) {\n const templateOptions = {\n meta: {\n 'backstage-app-mode': options?.appMode ?? 'public',\n },\n template: paths.targetHtml,\n templateParameters: {\n publicPath,\n config: frontendConfig,\n },\n };\n if (webpack) {\n // Config injection via index.html doesn't work across reloads with\n // WebPack, so we rely on the APP_CONFIG injection instead\n plugins.push(new HtmlWebpackPlugin(templateOptions));\n } else {\n // With Rspack we inject config via index.html, this is both because we\n // can't use APP_CONFIG due to the lack of support for runtime values, but\n // also because we are able to do it and it lines up better with what the\n // app-backend is doing.\n //\n // We still use the html plugin from WebPack, since the Rspack one won't\n // let us inject complex objects like the config.\n plugins.push(\n new ConfigInjectingHtmlWebpackPlugin(\n templateOptions,\n options.getFrontendAppConfigs,\n ),\n );\n }\n plugins.push(\n new HtmlWebpackPlugin({\n meta: {\n 'backstage-app-mode': options?.appMode ?? 'public',\n // This is added to be written in the later step, and finally read by the extra entry point\n 'backstage-public-path': '<%= publicPath %>/',\n },\n minify: false,\n publicPath: '<%= publicPath %>',\n filename: 'index.html.tmpl',\n template: `${require.resolve('raw-loader')}!${paths.targetHtml}`,\n }),\n );\n }\n\n if (options.moduleFederationRemote) {\n const AdaptedModuleFederationPlugin = webpack\n ? (require('@module-federation/enhanced/webpack')\n .ModuleFederationPlugin as unknown as typeof ModuleFederationPlugin)\n : ModuleFederationPlugin;\n\n const exposes = options.moduleFederationRemote.exposes\n ? Object.fromEntries(\n Object.entries(options.moduleFederationRemote?.exposes).map(\n ([k, v]) => [k, resolvePath(paths.targetPath, v)],\n ),\n )\n : {\n '.': paths.targetEntry,\n };\n\n plugins.push(\n new AdaptedModuleFederationPlugin({\n filename: 'remoteEntry.js',\n exposes,\n name: options.moduleFederationRemote.name,\n runtime: false,\n shared: options.moduleFederationRemote.sharedDependencies,\n }),\n );\n }\n\n const buildInfo = await readBuildInfo();\n\n plugins.push(\n webpack\n ? new webpack.DefinePlugin({\n 'process.env.BUILD_INFO': JSON.stringify(buildInfo),\n 'process.env.APP_CONFIG': webpack.DefinePlugin.runtimeValue(\n () => JSON.stringify(options.getFrontendAppConfigs()),\n true,\n ),\n // This allows for conditional imports of react-dom/client, since there's no way\n // to check for presence of it in source code without module resolution errors.\n 'process.env.HAS_REACT_DOM_CLIENT': JSON.stringify(\n hasReactDomClient(),\n ),\n })\n : new bundler.DefinePlugin({\n 'process.env.BUILD_INFO': JSON.stringify(buildInfo),\n 'process.env.APP_CONFIG': JSON.stringify([]), // Inject via index.html instead\n // This allows for conditional imports of react-dom/client, since there's no way\n // to check for presence of it in source code without module resolution errors.\n 'process.env.HAS_REACT_DOM_CLIENT': JSON.stringify(\n hasReactDomClient(),\n ),\n }),\n );\n\n if (options.linkedWorkspace) {\n plugins.push(\n ...(await createWorkspaceLinkingPlugins(\n bundler,\n options.linkedWorkspace,\n )),\n );\n }\n\n // These files are required by the transpiled code when using React Refresh.\n // They need to be excluded to the module scope plugin which ensures that files\n // that exist in the package are required.\n const reactRefreshFiles = webpack\n ? [\n require.resolve(\n '@pmmmwh/react-refresh-webpack-plugin/lib/runtime/RefreshUtils.js',\n ),\n require.resolve(\n '@pmmmwh/react-refresh-webpack-plugin/overlay/index.js',\n ),\n require.resolve('react-refresh'),\n ]\n : [];\n\n const mode = isDev ? 'development' : 'production';\n const optimization = optimizationConfig(options);\n\n return {\n mode,\n profile: false,\n ...(isDev\n ? {\n watchOptions: {\n ignored: /node_modules\\/(?!__backstage-autodetected-plugins__)/,\n },\n }\n : {}),\n optimization,\n bail: false,\n performance: {\n hints: false, // we check the gzip size instead\n },\n devtool: isDev ? 'eval-cheap-module-source-map' : 'source-map',\n context: paths.targetPath,\n entry: [\n /* eslint-disable-next-line no-restricted-syntax */\n findOwnPaths(__dirname).resolve('config/webpack-public-path'),\n ...(options.additionalEntryPoints ?? []),\n paths.targetEntry,\n ],\n resolve: {\n extensions: ['.ts', '.tsx', '.mjs', '.js', '.jsx', '.json', '.wasm'],\n mainFields: ['browser', 'module', 'main'],\n fallback: {\n ...pickBy(require('node-stdlib-browser')),\n module: false,\n dgram: false,\n dns: false,\n fs: false,\n http2: false,\n net: false,\n tls: false,\n child_process: false,\n\n /* new ignores */\n path: false,\n https: false,\n http: false,\n util: require.resolve('util/'),\n },\n // FIXME: see also https://github.com/web-infra-dev/rspack/issues/3408\n ...(webpack && {\n plugins: [\n new ModuleScopePlugin(\n [paths.targetSrc, paths.targetDev],\n [paths.targetPackageJson, ...reactRefreshFiles],\n ),\n ],\n }),\n },\n module: {\n rules: loaders,\n },\n output: {\n uniqueName: options.moduleFederationRemote?.name,\n path: paths.targetDist,\n publicPath: options.moduleFederationRemote ? 'auto' : `${publicPath}/`,\n filename: isDev ? '[name].js' : 'static/[name].[contenthash:8].js',\n chunkFilename: isDev\n ? '[name].chunk.js'\n : 'static/[name].[contenthash:8].chunk.js',\n ...(isDev\n ? {\n devtoolModuleFilenameTemplate: (info: any) =>\n `file:///${resolvePath(info.absoluteResourcePath).replace(\n /\\\\/g,\n '/',\n )}`,\n }\n : {}),\n },\n experiments: {\n lazyCompilation: yn(process.env.EXPERIMENTAL_LAZY_COMPILATION),\n ...(!webpack && {\n // We're still using `style-loader` for custom `insert` option\n css: false,\n }),\n },\n plugins,\n ...(options.moduleFederationRemote && {\n // TODO: remove this warning skipping as soon as the corresponding bundler limitation\n // described in issue https://github.com/web-infra-dev/rspack/issues/13635 is fixed\n // when PR: https://github.com/web-infra-dev/rspack/pull/13636 is merged.\n ignoreWarnings: [\n {\n message:\n /No version specified and unable to automatically determine one\\. No version in description file/,\n },\n ],\n }),\n };\n}\n"],"names":["runOutput","fs","targetPaths","version","transforms","TsCheckerRspackPlugin","ESLintRspackPlugin","rspack","HtmlWebpackPlugin","ConfigInjectingHtmlWebpackPlugin","ModuleFederationPlugin","resolvePath","hasReactDomClient","createWorkspaceLinkingPlugins","optimization","optimizationConfig","findOwnPaths","pickBy","ModuleScopePlugin","yn"],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
function computeTopologicalLayers(packages) {
|
|
4
|
+
const remaining = new Map(packages.map((p) => [p.name, p]));
|
|
5
|
+
const layers = [];
|
|
6
|
+
while (remaining.size > 0) {
|
|
7
|
+
const layer = [];
|
|
8
|
+
for (const [, pkg] of remaining) {
|
|
9
|
+
const blocked = Array.from(pkg.publishedLocalDependencies.keys()).some(
|
|
10
|
+
(dep) => remaining.has(dep)
|
|
11
|
+
);
|
|
12
|
+
if (!blocked) {
|
|
13
|
+
layer.push(pkg);
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
if (layer.length === 0) {
|
|
17
|
+
for (const pkg of remaining.values()) {
|
|
18
|
+
layers.push([pkg]);
|
|
19
|
+
}
|
|
20
|
+
remaining.clear();
|
|
21
|
+
break;
|
|
22
|
+
}
|
|
23
|
+
for (const pkg of layer) {
|
|
24
|
+
remaining.delete(pkg.name);
|
|
25
|
+
}
|
|
26
|
+
layers.push(layer);
|
|
27
|
+
}
|
|
28
|
+
return layers;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
exports.computeTopologicalLayers = computeTopologicalLayers;
|
|
32
|
+
//# sourceMappingURL=computeTopologicalLayers.cjs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"computeTopologicalLayers.cjs.js","sources":["../../../src/lib/packager/computeTopologicalLayers.ts"],"sourcesContent":["/*\n * Copyright 2026 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 { PackageGraphNode } from '@backstage/cli-node';\n\n/**\n * Groups packages into topological layers based on their published local\n * dependencies. Packages in the same layer have no inter-dependencies and\n * can be safely packed in parallel. Each successive layer depends only on\n * packages in earlier (already-packed) layers.\n *\n * If a dependency cycle is detected the remaining packages are returned as\n * a single final layer — this matches the previous behaviour of packing\n * everything in parallel and avoids blocking the build entirely.\n */\nexport function computeTopologicalLayers(\n packages: PackageGraphNode[],\n): PackageGraphNode[][] {\n const remaining = new Map(packages.map(p => [p.name, p]));\n const layers: PackageGraphNode[][] = [];\n\n while (remaining.size > 0) {\n const layer: PackageGraphNode[] = [];\n\n for (const [, pkg] of remaining) {\n // A package is ready when none of its published local deps are still\n // waiting to be packed.\n const blocked = Array.from(pkg.publishedLocalDependencies.keys()).some(\n dep => remaining.has(dep),\n );\n if (!blocked) {\n layer.push(pkg);\n }\n }\n\n if (layer.length === 0) {\n // Circular dependency — fall back to packing the remaining packages\n // sequentially as single-package layers to avoid parallel races.\n for (const pkg of remaining.values()) {\n layers.push([pkg]);\n }\n remaining.clear();\n break;\n }\n\n for (const pkg of layer) {\n remaining.delete(pkg.name);\n }\n layers.push(layer);\n }\n\n return layers;\n}\n"],"names":[],"mappings":";;AA4BO,SAAS,yBACd,QAAA,EACsB;AACtB,EAAA,MAAM,SAAA,GAAY,IAAI,GAAA,CAAI,QAAA,CAAS,GAAA,CAAI,CAAA,CAAA,KAAK,CAAC,CAAA,CAAE,IAAA,EAAM,CAAC,CAAC,CAAC,CAAA;AACxD,EAAA,MAAM,SAA+B,EAAC;AAEtC,EAAA,OAAO,SAAA,CAAU,OAAO,CAAA,EAAG;AACzB,IAAA,MAAM,QAA4B,EAAC;AAEnC,IAAA,KAAA,MAAW,GAAG,GAAG,CAAA,IAAK,SAAA,EAAW;AAG/B,MAAA,MAAM,UAAU,KAAA,CAAM,IAAA,CAAK,IAAI,0BAAA,CAA2B,IAAA,EAAM,CAAA,CAAE,IAAA;AAAA,QAChE,CAAA,GAAA,KAAO,SAAA,CAAU,GAAA,CAAI,GAAG;AAAA,OAC1B;AACA,MAAA,IAAI,CAAC,OAAA,EAAS;AACZ,QAAA,KAAA,CAAM,KAAK,GAAG,CAAA;AAAA,MAChB;AAAA,IACF;AAEA,IAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AAGtB,MAAA,KAAA,MAAW,GAAA,IAAO,SAAA,CAAU,MAAA,EAAO,EAAG;AACpC,QAAA,MAAA,CAAO,IAAA,CAAK,CAAC,GAAG,CAAC,CAAA;AAAA,MACnB;AACA,MAAA,SAAA,CAAU,KAAA,EAAM;AAChB,MAAA;AAAA,IACF;AAEA,IAAA,KAAA,MAAW,OAAO,KAAA,EAAO;AACvB,MAAA,SAAA,CAAU,MAAA,CAAO,IAAI,IAAI,CAAA;AAAA,IAC3B;AACA,IAAA,MAAA,CAAO,KAAK,KAAK,CAAA;AAAA,EACnB;AAEA,EAAA,OAAO,MAAA;AACT;;;;"}
|
|
@@ -7,6 +7,7 @@ var os = require('node:os');
|
|
|
7
7
|
var tar = require('tar');
|
|
8
8
|
var partition = require('lodash/partition');
|
|
9
9
|
var cliCommon = require('@backstage/cli-common');
|
|
10
|
+
var computeTopologicalLayers = require('./computeTopologicalLayers.cjs.js');
|
|
10
11
|
var _package = require('../../package.json.cjs.js');
|
|
11
12
|
var packager = require('../builder/packager.cjs.js');
|
|
12
13
|
var types = require('../builder/types.cjs.js');
|
|
@@ -191,7 +192,8 @@ async function moveToDistWorkspace(workspaceDir, localPackages, alwaysPack, enab
|
|
|
191
192
|
});
|
|
192
193
|
})
|
|
193
194
|
);
|
|
194
|
-
|
|
195
|
+
let archiveIndex = 0;
|
|
196
|
+
async function pack(target, archive = `temp-package-${archiveIndex++}.tgz`) {
|
|
195
197
|
logger.log(`Repacking ${target.name} into dist workspace`);
|
|
196
198
|
const absoluteOutputPath = node_path.resolve(
|
|
197
199
|
workspaceDir,
|
|
@@ -228,12 +230,13 @@ async function moveToDistWorkspace(workspaceDir, localPackages, alwaysPack, enab
|
|
|
228
230
|
for (const target of unsafePackages) {
|
|
229
231
|
await pack(target, `temp-package.tgz`);
|
|
230
232
|
}
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
233
|
+
const layers = computeTopologicalLayers.computeTopologicalLayers(safePackages);
|
|
234
|
+
for (const layer of layers) {
|
|
235
|
+
await cliNode.runConcurrentTasks({
|
|
236
|
+
items: layer,
|
|
237
|
+
worker: pack
|
|
238
|
+
});
|
|
239
|
+
}
|
|
237
240
|
}
|
|
238
241
|
async function resolveLocalDependencies(packageNames, packages) {
|
|
239
242
|
const packageGraph = cliNode.PackageGraph.fromPackages(packages);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createDistWorkspace.cjs.js","sources":["../../../src/lib/packager/createDistWorkspace.ts"],"sourcesContent":["/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport chalk from 'chalk';\nimport fs from 'fs-extra';\nimport {\n join as joinPath,\n resolve as resolvePath,\n relative as relativePath,\n} from 'node:path';\nimport { tmpdir } from 'node:os';\nimport * as tar from 'tar';\nimport partition from 'lodash/partition';\n\nimport { run, targetPaths } from '@backstage/cli-common';\nimport {\n dependencies as cliDependencies,\n devDependencies as cliDevDependencies,\n} from '../../../package.json';\nimport {\n BuildOptions,\n buildPackages,\n getOutputsForRole,\n Output,\n} from '../builder';\nimport { productionPack } from './productionPack';\nimport {\n BackstagePackage,\n PackageRoles,\n PackageGraph,\n PackageGraphNode,\n runConcurrentTasks,\n} from '@backstage/cli-node';\nimport { createTypeDistProject } from '../typeDistProject';\n\n// These packages aren't safe to pack in parallel since the CLI depends on them\nconst UNSAFE_PACKAGES = [\n ...Object.keys(cliDependencies),\n ...Object.keys(cliDevDependencies),\n];\n\ntype FileEntry =\n | string\n | {\n src: string;\n dest: string;\n };\n\ntype Options = {\n /**\n * Target directory for the dist workspace, defaults to a temporary directory\n */\n targetDir?: string;\n\n /**\n * Configuration files to load during packaging.\n */\n configPaths?: string[];\n\n /**\n * Files to copy into the target workspace.\n *\n * Defaults to ['yarn.lock', 'package.json'].\n */\n files?: FileEntry[];\n\n /**\n * If set to true, the target packages are built before they are packaged into the workspace.\n */\n buildDependencies?: boolean;\n\n /**\n * When `buildDependencies` is set, this list of packages will not be built even if they are dependencies.\n */\n buildExcludes?: string[];\n\n /**\n * If set, creates a skeleton tarball that contains all package.json files\n * with the same structure as the workspace dir.\n */\n skeleton?: 'skeleton.tar' | 'skeleton.tar.gz';\n\n /**\n * If set to true, `yarn pack` is always preferred when creating the dist\n * workspace. This ensures correct workspace output at significant cost to\n * command performance.\n */\n alwaysPack?: boolean;\n\n /**\n * If set to true, the TypeScript feature detection will be enabled, which\n * annotates the package exports field with the `backstage` export type.\n */\n enableFeatureDetection?: boolean;\n\n /**\n * If set to true, the generated code will be minified.\n */\n minify?: boolean;\n\n /**\n * Optional logger to route console output through. When not provided,\n * output goes to `console.log` / `console.warn` as before.\n */\n logger?: {\n log(msg: string): void;\n warn(msg: string): void;\n };\n};\n\nfunction prefixLogFunc(prefix: string, logFn: (msg: string) => void) {\n return (data: Buffer) => {\n for (const line of data.toString('utf8').split(/\\r?\\n/)) {\n if (line) logFn(`${prefix}${line}`);\n }\n };\n}\n\n/**\n * Uses `yarn pack` to package local packages and unpacks them into a dist workspace.\n * The target workspace will end up containing dist version of each package and\n * will be suitable for packaging e.g. into a docker image.\n *\n * This creates a structure that is functionally similar to if the packages were\n * installed from npm, but uses Yarn workspaces to link to them at runtime.\n */\nexport async function createDistWorkspace(\n packageNames: string[],\n options: Options = {},\n) {\n const logger = options.logger ?? { log: console.log, warn: console.warn };\n\n const targetDir =\n options.targetDir ??\n (await fs.mkdtemp(resolvePath(tmpdir(), 'dist-workspace')));\n\n const packages = await PackageGraph.listTargetPackages();\n const targets = await resolveLocalDependencies(packageNames, packages);\n\n if (options.buildDependencies) {\n const exclude = options.buildExcludes ?? [];\n const configPaths = options.configPaths ?? [];\n\n const toBuild = new Set(\n targets.map(_ => _.name).filter(name => !exclude.includes(name)),\n );\n\n const standardBuilds = new Array<BuildOptions>();\n const customBuild = new Array<{\n dir: string;\n name: string;\n args?: string[];\n }>();\n\n for (const pkg of packages) {\n if (!toBuild.has(pkg.packageJson.name)) {\n continue;\n }\n const role = pkg.packageJson.backstage?.role;\n if (!role) {\n logger.warn(\n `Building ${pkg.packageJson.name} separately because it has no role`,\n );\n customBuild.push({ dir: pkg.dir, name: pkg.packageJson.name });\n continue;\n }\n\n const buildScript = pkg.packageJson.scripts?.build;\n if (!buildScript) {\n customBuild.push({ dir: pkg.dir, name: pkg.packageJson.name });\n continue;\n }\n\n if (!buildScript.startsWith('backstage-cli package build')) {\n logger.warn(\n `Building ${pkg.packageJson.name} separately because it has a custom build script, '${buildScript}'`,\n );\n customBuild.push({ dir: pkg.dir, name: pkg.packageJson.name });\n continue;\n }\n\n if (PackageRoles.getRoleInfo(role).output.includes('bundle')) {\n logger.warn(\n `Building ${pkg.packageJson.name} separately because it is a bundled package`,\n );\n const args = buildScript.includes('--config')\n ? []\n : configPaths.map(p => ['--config', p]).flat();\n customBuild.push({ dir: pkg.dir, name: pkg.packageJson.name, args });\n continue;\n }\n\n const outputs = getOutputsForRole(role);\n\n // No need to build and include types in the production runtime\n outputs.delete(Output.types);\n\n if (outputs.size > 0) {\n standardBuilds.push({\n targetDir: pkg.dir,\n packageJson: pkg.packageJson,\n outputs: outputs,\n logPrefix: `${chalk.cyan(\n relativePath(targetPaths.rootDir, pkg.dir),\n )}: `,\n minify: options.minify,\n workspacePackages: packages,\n });\n }\n }\n\n await buildPackages(standardBuilds);\n\n if (customBuild.length > 0) {\n await runConcurrentTasks({\n items: customBuild,\n worker: async ({ name, dir, args }) => {\n await run(['yarn', 'run', 'build', ...(args || [])], {\n cwd: dir,\n onStdout: prefixLogFunc(`${name}: `, logger.log),\n onStderr: prefixLogFunc(`${name}: `, logger.warn),\n }).waitForExit();\n },\n });\n }\n }\n\n await moveToDistWorkspace(\n targetDir,\n targets,\n Boolean(options.alwaysPack),\n Boolean(options.enableFeatureDetection),\n logger,\n );\n\n const files: FileEntry[] = options.files ?? ['yarn.lock', 'package.json'];\n\n for (const file of files) {\n const src = typeof file === 'string' ? file : file.src;\n const dest = typeof file === 'string' ? file : file.dest;\n await fs.copy(targetPaths.resolveRoot(src), resolvePath(targetDir, dest));\n }\n\n if (options.skeleton) {\n const skeletonFiles = targets\n .map(target => {\n const dir = relativePath(targetPaths.rootDir, target.dir);\n return joinPath(dir, 'package.json');\n })\n .sort();\n\n await tar.create(\n {\n file: resolvePath(targetDir, options.skeleton),\n cwd: targetDir,\n portable: true,\n noMtime: true,\n gzip: options.skeleton.endsWith('.gz'),\n },\n skeletonFiles,\n );\n }\n\n return { targetDir, targets };\n}\n\nconst FAST_PACK_SCRIPTS = [\n undefined,\n 'backstage-cli prepack',\n 'backstage-cli package prepack',\n];\n\n/**\n * Runs `yarn pack` on a single package and extracts the resulting tarball\n * into `targetDir`. This resolves `workspace:^` and `backstage:^` dependency\n * specs to concrete versions via yarn's `beforeWorkspacePacking` hook.\n */\nexport async function packToDirectory(options: {\n packageDir: string;\n packageName: string;\n targetDir: string;\n archivePath?: string;\n logger: { log(msg: string): void; warn(msg: string): void };\n}): Promise<void> {\n const { packageDir, packageName, targetDir, logger } = options;\n const archivePath =\n options.archivePath ?? resolvePath(targetDir, 'temp-archive.tgz');\n const prefix = `${packageName} [pack]: `;\n\n await fs.ensureDir(targetDir);\n await run(['yarn', 'pack', '--filename', archivePath], {\n cwd: packageDir,\n onStdout: prefixLogFunc(prefix, logger.log),\n onStderr: prefixLogFunc(prefix, logger.warn),\n }).waitForExit();\n\n await tar.extract({ file: archivePath, cwd: targetDir, strip: 1 });\n await fs.remove(archivePath);\n}\n\nasync function moveToDistWorkspace(\n workspaceDir: string,\n localPackages: PackageGraphNode[],\n alwaysPack: boolean,\n enableFeatureDetection: boolean,\n logger: { log(msg: string): void; warn(msg: string): void },\n): Promise<void> {\n const [fastPackPackages, slowPackPackages] = partition(\n localPackages,\n pkg =>\n !alwaysPack &&\n FAST_PACK_SCRIPTS.includes(pkg.packageJson.scripts?.prepack),\n );\n\n const featureDetectionProject =\n fastPackPackages.length > 0 && enableFeatureDetection\n ? await createTypeDistProject()\n : undefined;\n\n // New an improved flow where we avoid calling `yarn pack`\n await Promise.all(\n fastPackPackages.map(async target => {\n logger.log(`Moving ${target.name} into dist workspace`);\n\n const outputDir = relativePath(targetPaths.rootDir, target.dir);\n const absoluteOutputPath = resolvePath(workspaceDir, outputDir);\n await productionPack({\n packageDir: target.dir,\n targetDir: absoluteOutputPath,\n featureDetectionProject,\n });\n }),\n );\n\n // Old flow is below, which calls `yarn pack` and extracts the tarball\n\n async function pack(target: PackageGraphNode, archive: string) {\n logger.log(`Repacking ${target.name} into dist workspace`);\n const absoluteOutputPath = resolvePath(\n workspaceDir,\n relativePath(targetPaths.rootDir, target.dir),\n );\n await packToDirectory({\n packageDir: target.dir,\n packageName: target.name,\n targetDir: absoluteOutputPath,\n archivePath: resolvePath(workspaceDir, archive),\n logger,\n });\n\n // We remove the dependencies from package.json of packages that are marked\n // as bundled, so that yarn doesn't try to install them.\n if (target.packageJson.bundled) {\n const pkgJson = await fs.readJson(\n resolvePath(absoluteOutputPath, 'package.json'),\n );\n delete pkgJson.dependencies;\n delete pkgJson.devDependencies;\n delete pkgJson.peerDependencies;\n delete pkgJson.optionalDependencies;\n\n await fs.writeJson(\n resolvePath(absoluteOutputPath, 'package.json'),\n pkgJson,\n {\n spaces: 2,\n },\n );\n }\n }\n\n const [unsafePackages, safePackages] = partition(slowPackPackages, p =>\n UNSAFE_PACKAGES.includes(p.name),\n );\n\n // The unsafe package are packed first one by one in order to avoid race conditions\n // where the CLI is being executed with broken dependencies.\n for (const target of unsafePackages) {\n await pack(target, `temp-package.tgz`);\n }\n\n // Repacking in parallel is much faster and safe for all packages outside of the Backstage repo\n await runConcurrentTasks({\n items: safePackages.map((target, index) => ({ target, index })),\n worker: async ({ target, index }) => {\n await pack(target, `temp-package-${index}.tgz`);\n },\n });\n}\n\n/**\n * Resolves the full set of local (workspace) packages that the given\n * package names transitively depend on via `publishedLocalDependencies`.\n * Packages marked as `bundled` have their own dependencies excluded.\n *\n * This is the same traversal that `createDistWorkspace` performs internally.\n * Callers must supply the monorepo package list obtained from\n * `PackageGraph.listTargetPackages()`.\n */\nexport async function resolveLocalDependencies(\n packageNames: string[],\n packages: BackstagePackage[],\n): Promise<PackageGraphNode[]> {\n const packageGraph = PackageGraph.fromPackages(packages);\n const targetNames = packageGraph.collectPackageNames(packageNames, node => {\n // Don't include dependencies of packages that are marked as bundled\n if (node.packageJson.bundled) {\n return undefined;\n }\n\n return node.publishedLocalDependencies.keys();\n });\n return Array.from(targetNames).map(name => packageGraph.get(name)!);\n}\n"],"names":["cliDependencies","cliDevDependencies","fs","resolvePath","tmpdir","PackageGraph","PackageRoles","getOutputsForRole","Output","chalk","relativePath","targetPaths","buildPackages","runConcurrentTasks","run","joinPath","tar","partition","createTypeDistProject","productionPack"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"createDistWorkspace.cjs.js","sources":["../../../src/lib/packager/createDistWorkspace.ts"],"sourcesContent":["/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport chalk from 'chalk';\nimport fs from 'fs-extra';\nimport {\n join as joinPath,\n resolve as resolvePath,\n relative as relativePath,\n} from 'node:path';\nimport { tmpdir } from 'node:os';\nimport * as tar from 'tar';\nimport partition from 'lodash/partition';\n\nimport { run, targetPaths } from '@backstage/cli-common';\nimport { computeTopologicalLayers } from './computeTopologicalLayers';\nimport {\n dependencies as cliDependencies,\n devDependencies as cliDevDependencies,\n} from '../../../package.json';\nimport {\n BuildOptions,\n buildPackages,\n getOutputsForRole,\n Output,\n} from '../builder';\nimport { productionPack } from './productionPack';\nimport {\n BackstagePackage,\n PackageRoles,\n PackageGraph,\n PackageGraphNode,\n runConcurrentTasks,\n} from '@backstage/cli-node';\nimport { createTypeDistProject } from '../typeDistProject';\n\n// These packages aren't safe to pack in parallel since the CLI depends on them\nconst UNSAFE_PACKAGES = [\n ...Object.keys(cliDependencies),\n ...Object.keys(cliDevDependencies),\n];\n\ntype FileEntry =\n | string\n | {\n src: string;\n dest: string;\n };\n\ntype Options = {\n /**\n * Target directory for the dist workspace, defaults to a temporary directory\n */\n targetDir?: string;\n\n /**\n * Configuration files to load during packaging.\n */\n configPaths?: string[];\n\n /**\n * Files to copy into the target workspace.\n *\n * Defaults to ['yarn.lock', 'package.json'].\n */\n files?: FileEntry[];\n\n /**\n * If set to true, the target packages are built before they are packaged into the workspace.\n */\n buildDependencies?: boolean;\n\n /**\n * When `buildDependencies` is set, this list of packages will not be built even if they are dependencies.\n */\n buildExcludes?: string[];\n\n /**\n * If set, creates a skeleton tarball that contains all package.json files\n * with the same structure as the workspace dir.\n */\n skeleton?: 'skeleton.tar' | 'skeleton.tar.gz';\n\n /**\n * If set to true, `yarn pack` is always preferred when creating the dist\n * workspace. This ensures correct workspace output at significant cost to\n * command performance.\n */\n alwaysPack?: boolean;\n\n /**\n * If set to true, the TypeScript feature detection will be enabled, which\n * annotates the package exports field with the `backstage` export type.\n */\n enableFeatureDetection?: boolean;\n\n /**\n * If set to true, the generated code will be minified.\n */\n minify?: boolean;\n\n /**\n * Optional logger to route console output through. When not provided,\n * output goes to `console.log` / `console.warn` as before.\n */\n logger?: {\n log(msg: string): void;\n warn(msg: string): void;\n };\n};\n\nfunction prefixLogFunc(prefix: string, logFn: (msg: string) => void) {\n return (data: Buffer) => {\n for (const line of data.toString('utf8').split(/\\r?\\n/)) {\n if (line) logFn(`${prefix}${line}`);\n }\n };\n}\n\n/**\n * Uses `yarn pack` to package local packages and unpacks them into a dist workspace.\n * The target workspace will end up containing dist version of each package and\n * will be suitable for packaging e.g. into a docker image.\n *\n * This creates a structure that is functionally similar to if the packages were\n * installed from npm, but uses Yarn workspaces to link to them at runtime.\n */\nexport async function createDistWorkspace(\n packageNames: string[],\n options: Options = {},\n) {\n const logger = options.logger ?? { log: console.log, warn: console.warn };\n\n const targetDir =\n options.targetDir ??\n (await fs.mkdtemp(resolvePath(tmpdir(), 'dist-workspace')));\n\n const packages = await PackageGraph.listTargetPackages();\n const targets = await resolveLocalDependencies(packageNames, packages);\n\n if (options.buildDependencies) {\n const exclude = options.buildExcludes ?? [];\n const configPaths = options.configPaths ?? [];\n\n const toBuild = new Set(\n targets.map(_ => _.name).filter(name => !exclude.includes(name)),\n );\n\n const standardBuilds = new Array<BuildOptions>();\n const customBuild = new Array<{\n dir: string;\n name: string;\n args?: string[];\n }>();\n\n for (const pkg of packages) {\n if (!toBuild.has(pkg.packageJson.name)) {\n continue;\n }\n const role = pkg.packageJson.backstage?.role;\n if (!role) {\n logger.warn(\n `Building ${pkg.packageJson.name} separately because it has no role`,\n );\n customBuild.push({ dir: pkg.dir, name: pkg.packageJson.name });\n continue;\n }\n\n const buildScript = pkg.packageJson.scripts?.build;\n if (!buildScript) {\n customBuild.push({ dir: pkg.dir, name: pkg.packageJson.name });\n continue;\n }\n\n if (!buildScript.startsWith('backstage-cli package build')) {\n logger.warn(\n `Building ${pkg.packageJson.name} separately because it has a custom build script, '${buildScript}'`,\n );\n customBuild.push({ dir: pkg.dir, name: pkg.packageJson.name });\n continue;\n }\n\n if (PackageRoles.getRoleInfo(role).output.includes('bundle')) {\n logger.warn(\n `Building ${pkg.packageJson.name} separately because it is a bundled package`,\n );\n const args = buildScript.includes('--config')\n ? []\n : configPaths.map(p => ['--config', p]).flat();\n customBuild.push({ dir: pkg.dir, name: pkg.packageJson.name, args });\n continue;\n }\n\n const outputs = getOutputsForRole(role);\n\n // No need to build and include types in the production runtime\n outputs.delete(Output.types);\n\n if (outputs.size > 0) {\n standardBuilds.push({\n targetDir: pkg.dir,\n packageJson: pkg.packageJson,\n outputs: outputs,\n logPrefix: `${chalk.cyan(\n relativePath(targetPaths.rootDir, pkg.dir),\n )}: `,\n minify: options.minify,\n workspacePackages: packages,\n });\n }\n }\n\n await buildPackages(standardBuilds);\n\n if (customBuild.length > 0) {\n await runConcurrentTasks({\n items: customBuild,\n worker: async ({ name, dir, args }) => {\n await run(['yarn', 'run', 'build', ...(args || [])], {\n cwd: dir,\n onStdout: prefixLogFunc(`${name}: `, logger.log),\n onStderr: prefixLogFunc(`${name}: `, logger.warn),\n }).waitForExit();\n },\n });\n }\n }\n\n await moveToDistWorkspace(\n targetDir,\n targets,\n Boolean(options.alwaysPack),\n Boolean(options.enableFeatureDetection),\n logger,\n );\n\n const files: FileEntry[] = options.files ?? ['yarn.lock', 'package.json'];\n\n for (const file of files) {\n const src = typeof file === 'string' ? file : file.src;\n const dest = typeof file === 'string' ? file : file.dest;\n await fs.copy(targetPaths.resolveRoot(src), resolvePath(targetDir, dest));\n }\n\n if (options.skeleton) {\n const skeletonFiles = targets\n .map(target => {\n const dir = relativePath(targetPaths.rootDir, target.dir);\n return joinPath(dir, 'package.json');\n })\n .sort();\n\n await tar.create(\n {\n file: resolvePath(targetDir, options.skeleton),\n cwd: targetDir,\n portable: true,\n noMtime: true,\n gzip: options.skeleton.endsWith('.gz'),\n },\n skeletonFiles,\n );\n }\n\n return { targetDir, targets };\n}\n\nconst FAST_PACK_SCRIPTS = [\n undefined,\n 'backstage-cli prepack',\n 'backstage-cli package prepack',\n];\n\n/**\n * Runs `yarn pack` on a single package and extracts the resulting tarball\n * into `targetDir`. This resolves `workspace:^` and `backstage:^` dependency\n * specs to concrete versions via yarn's `beforeWorkspacePacking` hook.\n */\nexport async function packToDirectory(options: {\n packageDir: string;\n packageName: string;\n targetDir: string;\n archivePath?: string;\n logger: { log(msg: string): void; warn(msg: string): void };\n}): Promise<void> {\n const { packageDir, packageName, targetDir, logger } = options;\n const archivePath =\n options.archivePath ?? resolvePath(targetDir, 'temp-archive.tgz');\n const prefix = `${packageName} [pack]: `;\n\n await fs.ensureDir(targetDir);\n await run(['yarn', 'pack', '--filename', archivePath], {\n cwd: packageDir,\n onStdout: prefixLogFunc(prefix, logger.log),\n onStderr: prefixLogFunc(prefix, logger.warn),\n }).waitForExit();\n\n await tar.extract({ file: archivePath, cwd: targetDir, strip: 1 });\n await fs.remove(archivePath);\n}\n\nasync function moveToDistWorkspace(\n workspaceDir: string,\n localPackages: PackageGraphNode[],\n alwaysPack: boolean,\n enableFeatureDetection: boolean,\n logger: { log(msg: string): void; warn(msg: string): void },\n): Promise<void> {\n const [fastPackPackages, slowPackPackages] = partition(\n localPackages,\n pkg =>\n !alwaysPack &&\n FAST_PACK_SCRIPTS.includes(pkg.packageJson.scripts?.prepack),\n );\n\n const featureDetectionProject =\n fastPackPackages.length > 0 && enableFeatureDetection\n ? await createTypeDistProject()\n : undefined;\n\n // New an improved flow where we avoid calling `yarn pack`\n await Promise.all(\n fastPackPackages.map(async target => {\n logger.log(`Moving ${target.name} into dist workspace`);\n\n const outputDir = relativePath(targetPaths.rootDir, target.dir);\n const absoluteOutputPath = resolvePath(workspaceDir, outputDir);\n await productionPack({\n packageDir: target.dir,\n targetDir: absoluteOutputPath,\n featureDetectionProject,\n });\n }),\n );\n\n // Old flow is below, which calls `yarn pack` and extracts the tarball\n\n let archiveIndex = 0;\n\n async function pack(\n target: PackageGraphNode,\n archive: string = `temp-package-${archiveIndex++}.tgz`,\n ) {\n logger.log(`Repacking ${target.name} into dist workspace`);\n\n const absoluteOutputPath = resolvePath(\n workspaceDir,\n relativePath(targetPaths.rootDir, target.dir),\n );\n await packToDirectory({\n packageDir: target.dir,\n packageName: target.name,\n targetDir: absoluteOutputPath,\n archivePath: resolvePath(workspaceDir, archive),\n logger,\n });\n\n // We remove the dependencies from package.json of packages that are marked\n // as bundled, so that yarn doesn't try to install them.\n if (target.packageJson.bundled) {\n const pkgJson = await fs.readJson(\n resolvePath(absoluteOutputPath, 'package.json'),\n );\n delete pkgJson.dependencies;\n delete pkgJson.devDependencies;\n delete pkgJson.peerDependencies;\n delete pkgJson.optionalDependencies;\n\n await fs.writeJson(\n resolvePath(absoluteOutputPath, 'package.json'),\n pkgJson,\n {\n spaces: 2,\n },\n );\n }\n }\n\n const [unsafePackages, safePackages] = partition(slowPackPackages, p =>\n UNSAFE_PACKAGES.includes(p.name),\n );\n\n // The unsafe package are packed first one by one in order to avoid race conditions\n // where the CLI is being executed with broken dependencies.\n for (const target of unsafePackages) {\n await pack(target, `temp-package.tgz`);\n }\n\n // Pack safe packages in topological layers so that a package is never\n // packed concurrently with its own dependencies. `yarn pack` temporarily\n // rewrites each package's package.json to resolve workspace:^ references;\n // packing a package while a dependency's manifest is mid-rewrite causes\n // intermittent \"No local workspace found for this range\" failures.\n const layers = computeTopologicalLayers(safePackages);\n for (const layer of layers) {\n await runConcurrentTasks({\n items: layer,\n worker: pack,\n });\n }\n}\n\n/**\n * Resolves the full set of local (workspace) packages that the given\n * package names transitively depend on via `publishedLocalDependencies`.\n * Packages marked as `bundled` have their own dependencies excluded.\n *\n * This is the same traversal that `createDistWorkspace` performs internally.\n * Callers must supply the monorepo package list obtained from\n * `PackageGraph.listTargetPackages()`.\n */\nexport async function resolveLocalDependencies(\n packageNames: string[],\n packages: BackstagePackage[],\n): Promise<PackageGraphNode[]> {\n const packageGraph = PackageGraph.fromPackages(packages);\n const targetNames = packageGraph.collectPackageNames(packageNames, node => {\n // Don't include dependencies of packages that are marked as bundled\n if (node.packageJson.bundled) {\n return undefined;\n }\n\n return node.publishedLocalDependencies.keys();\n });\n return Array.from(targetNames).map(name => packageGraph.get(name)!);\n}\n"],"names":["cliDependencies","cliDevDependencies","fs","resolvePath","tmpdir","PackageGraph","PackageRoles","getOutputsForRole","Output","chalk","relativePath","targetPaths","buildPackages","runConcurrentTasks","run","joinPath","tar","partition","createTypeDistProject","productionPack","computeTopologicalLayers"],"mappings":"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"}
|
|
@@ -8,7 +8,9 @@ var debounce = require('lodash/debounce');
|
|
|
8
8
|
var node_url = require('node:url');
|
|
9
9
|
var node_path = require('node:path');
|
|
10
10
|
var cliCommon = require('@backstage/cli-common');
|
|
11
|
+
var configLoader = require('@backstage/config-loader');
|
|
11
12
|
var spawn = require('cross-spawn');
|
|
13
|
+
var startEmbeddedDb = require('./startEmbeddedDb.cjs.js');
|
|
12
14
|
|
|
13
15
|
function _interopDefaultCompat (e) { return e && typeof e === 'object' && 'default' in e ? e : { default: e }; }
|
|
14
16
|
|
|
@@ -28,6 +30,16 @@ async function runBackend(options) {
|
|
|
28
30
|
}
|
|
29
31
|
const server = new IpcServer.IpcServer();
|
|
30
32
|
ServerDataStore.ServerDataStore.bind(server);
|
|
33
|
+
const extraEnv = {};
|
|
34
|
+
let embeddedDb;
|
|
35
|
+
const dbClient = await readDatabaseClient(options.configPaths);
|
|
36
|
+
if (dbClient === "embedded-postgres") {
|
|
37
|
+
embeddedDb = await startEmbeddedDb.startEmbeddedDb();
|
|
38
|
+
extraEnv.APP_CONFIG_backend_database = JSON.stringify({
|
|
39
|
+
client: "pg",
|
|
40
|
+
connection: embeddedDb.connection
|
|
41
|
+
});
|
|
42
|
+
}
|
|
31
43
|
let exiting = false;
|
|
32
44
|
let firstStart = true;
|
|
33
45
|
let child;
|
|
@@ -84,6 +96,7 @@ async function runBackend(options) {
|
|
|
84
96
|
cwd: options.targetDir,
|
|
85
97
|
env: {
|
|
86
98
|
...process.env,
|
|
99
|
+
...extraEnv,
|
|
87
100
|
BACKSTAGE_CLI_LINKED_WORKSPACE: options.linkedWorkspace,
|
|
88
101
|
BACKSTAGE_CLI_CHANNEL: "1",
|
|
89
102
|
ESBK_TSCONFIG_PATH: cliCommon.targetPaths.resolveRoot("tsconfig.json")
|
|
@@ -124,6 +137,7 @@ async function runBackend(options) {
|
|
|
124
137
|
child.kill(signal);
|
|
125
138
|
});
|
|
126
139
|
}
|
|
140
|
+
await embeddedDb?.close();
|
|
127
141
|
resolveExitPromise();
|
|
128
142
|
}
|
|
129
143
|
process.once("SIGINT", handleSignal);
|
|
@@ -131,6 +145,23 @@ async function runBackend(options) {
|
|
|
131
145
|
});
|
|
132
146
|
return () => exitPromise;
|
|
133
147
|
}
|
|
148
|
+
async function readDatabaseClient(configPaths) {
|
|
149
|
+
const rootDir = cliCommon.targetPaths.rootDir;
|
|
150
|
+
const source = configLoader.ConfigSources.default({
|
|
151
|
+
rootDir,
|
|
152
|
+
allowMissingDefaultConfig: true,
|
|
153
|
+
argv: (configPaths ?? []).flatMap((p) => [
|
|
154
|
+
"--config",
|
|
155
|
+
node_path.isAbsolute(p) ? p : node_path.resolve(rootDir, p)
|
|
156
|
+
])
|
|
157
|
+
});
|
|
158
|
+
const config = await configLoader.ConfigSources.toConfig(source);
|
|
159
|
+
try {
|
|
160
|
+
return config.getOptionalString("backend.database.client");
|
|
161
|
+
} finally {
|
|
162
|
+
config.close();
|
|
163
|
+
}
|
|
164
|
+
}
|
|
134
165
|
|
|
135
166
|
exports.runBackend = runBackend;
|
|
136
167
|
//# sourceMappingURL=runBackend.cjs.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runBackend.cjs.js","sources":["../../../src/lib/runner/runBackend.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 { FSWatcher, watch } from 'chokidar';\nimport type { ChildProcess } from 'node:child_process';\nimport { ctrlc } from 'ctrlc-windows';\nimport { IpcServer, ServerDataStore } from '../ipc';\nimport debounce from 'lodash/debounce';\nimport { fileURLToPath } from 'node:url';\nimport { isAbsolute as isAbsolutePath } from 'node:path';\nimport { targetPaths } from '@backstage/cli-common';\n\nimport spawn from 'cross-spawn';\n\nconst loaderArgs = [\n '--enable-source-maps',\n '--require',\n require.resolve('@backstage/cli-node/config/nodeTransform.cjs'),\n // TODO: Support modules, although there's currently no way to load them since import() is transpiled to require()\n];\n\nexport type RunBackendOptions = {\n /** The directory to run the backend process in, defaults to cwd */\n targetDir?: string;\n /** relative entry point path without extension, e.g. 'src/index' */\n entry: string;\n /** Whether to forward the --inspect flag to the node process */\n inspectEnabled?: boolean | string;\n /** Whether to forward the --inspect-brk flag to the node process */\n inspectBrkEnabled?: boolean | string;\n /** Additional module to require via the --require flag to the node process */\n require?: string | string[];\n /** An external linked workspace to override module resolution towards */\n linkedWorkspace?: string;\n};\n\nexport async function runBackend(options: RunBackendOptions) {\n const envEnv = process.env as { NODE_ENV: string; NODE_OPTIONS?: string };\n if (!envEnv.NODE_ENV) {\n envEnv.NODE_ENV = 'development';\n }\n\n // Set up the parent IPC server and bind the available services\n const server = new IpcServer();\n ServerDataStore.bind(server);\n\n let exiting = false;\n let firstStart = true;\n let child: ChildProcess | undefined;\n let watcher: FSWatcher | undefined = undefined;\n let shutdownPromise: Promise<void> | undefined = undefined;\n\n const watchedPaths = new Set<string>();\n\n const restart = debounce(async () => {\n if (firstStart) {\n firstStart = false;\n } else {\n console.log();\n console.log('Change detected, restarting the development server...');\n console.log();\n }\n // If a re-trigger happens during an existing shutdown, we just ignore it\n if (shutdownPromise) {\n return;\n }\n\n if (child && !child.killed && child.exitCode === null) {\n // We always wait for the existing process to exit, to make sure we don't get IPC conflicts\n shutdownPromise = new Promise(resolve => child!.once('exit', resolve));\n if (process.platform === 'win32' && child.pid) {\n ctrlc(child.pid);\n } else {\n child.kill();\n }\n await shutdownPromise;\n shutdownPromise = undefined;\n }\n\n // We've received a shutdown signal\n if (exiting) {\n return;\n }\n\n const optionArgs = new Array<string>();\n if (options.inspectEnabled) {\n const inspect =\n typeof options.inspectEnabled === 'string'\n ? `--inspect=${options.inspectEnabled}`\n : '--inspect';\n optionArgs.push(inspect);\n } else if (options.inspectBrkEnabled) {\n const inspect =\n typeof options.inspectBrkEnabled === 'string'\n ? `--inspect-brk=${options.inspectBrkEnabled}`\n : '--inspect-brk';\n optionArgs.push(inspect);\n }\n if (options.require) {\n const requires = [options.require].flat();\n for (const r of requires) {\n optionArgs.push(`--require=${r}`);\n }\n }\n\n // Unless the user explicitly toggles node-snapshot, default to provide --no-node-snapshot to reduce number of steps to run scaffolder\n // on Node LTS.\n if (!envEnv.NODE_OPTIONS?.includes('--node-snapshot')) {\n optionArgs.push('--no-node-snapshot');\n }\n\n const userArgs = process.argv\n .slice(['node', 'backstage-cli', 'package', 'start'].length)\n .filter(arg => !optionArgs.includes(arg));\n\n child = spawn(\n process.execPath,\n [...loaderArgs, ...optionArgs, options.entry, ...userArgs],\n {\n stdio: ['ignore', 'inherit', 'inherit', 'ipc'],\n cwd: options.targetDir,\n env: {\n ...process.env,\n BACKSTAGE_CLI_LINKED_WORKSPACE: options.linkedWorkspace,\n BACKSTAGE_CLI_CHANNEL: '1',\n ESBK_TSCONFIG_PATH: targetPaths.resolveRoot('tsconfig.json'),\n },\n serialization: 'advanced',\n },\n );\n\n server.addChild(child);\n\n // This captures messages sent by @esbuild-kit/cjs-loader\n child.on('message', (data: { type?: string } | null) => {\n if (!watcher) {\n return;\n }\n if (typeof data === 'object' && data?.type === 'watch') {\n let path = (data as { path: string }).path;\n if (path.startsWith('file:')) {\n path = fileURLToPath(path);\n }\n\n if (isAbsolutePath(path) && !watchedPaths.has(path)) {\n watchedPaths.add(path);\n watcher.add(path);\n }\n }\n });\n }, 100);\n\n restart();\n\n watcher = watch(['./package.json'], {\n cwd: process.cwd(),\n ignoreInitial: true,\n ignorePermissionErrors: true,\n }).on('all', restart);\n\n // Trigger restart on hitting enter in the terminal\n process.stdin.on('data', restart);\n\n const exitPromise = new Promise<void>(resolveExitPromise => {\n async function handleSignal(signal: NodeJS.Signals) {\n exiting = true;\n\n // Forward signals to child and wait for it to exit if still running\n if (child && child.exitCode === null) {\n await new Promise(resolve => {\n child!.on('close', resolve);\n child!.kill(signal);\n });\n }\n\n resolveExitPromise();\n }\n\n process.once('SIGINT', handleSignal);\n process.once('SIGTERM', handleSignal);\n });\n\n return () => exitPromise;\n}\n"],"names":["IpcServer","ServerDataStore","debounce","ctrlc","spawn","targetPaths","fileURLToPath","isAbsolutePath","watch"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"runBackend.cjs.js","sources":["../../../src/lib/runner/runBackend.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 { FSWatcher, watch } from 'chokidar';\nimport type { ChildProcess } from 'node:child_process';\nimport { ctrlc } from 'ctrlc-windows';\nimport { IpcServer, ServerDataStore } from '../ipc';\nimport debounce from 'lodash/debounce';\nimport { fileURLToPath } from 'node:url';\nimport {\n isAbsolute as isAbsolutePath,\n resolve as resolvePath,\n} from 'node:path';\nimport { targetPaths } from '@backstage/cli-common';\nimport { ConfigSources } from '@backstage/config-loader';\n\nimport spawn from 'cross-spawn';\nimport { startEmbeddedDb } from './startEmbeddedDb';\n\nconst loaderArgs = [\n '--enable-source-maps',\n '--require',\n require.resolve('@backstage/cli-node/config/nodeTransform.cjs'),\n // TODO: Support modules, although there's currently no way to load them since import() is transpiled to require()\n];\n\nexport type RunBackendOptions = {\n /** The directory to run the backend process in, defaults to cwd */\n targetDir?: string;\n /** relative entry point path without extension, e.g. 'src/index' */\n entry: string;\n /** Whether to forward the --inspect flag to the node process */\n inspectEnabled?: boolean | string;\n /** Whether to forward the --inspect-brk flag to the node process */\n inspectBrkEnabled?: boolean | string;\n /** Additional module to require via the --require flag to the node process */\n require?: string | string[];\n /** An external linked workspace to override module resolution towards */\n linkedWorkspace?: string;\n /** Config file paths from --config flags */\n configPaths?: string[];\n};\n\nexport async function runBackend(options: RunBackendOptions) {\n const envEnv = process.env as { NODE_ENV: string; NODE_OPTIONS?: string };\n if (!envEnv.NODE_ENV) {\n envEnv.NODE_ENV = 'development';\n }\n\n // Set up the parent IPC server and bind the available services\n const server = new IpcServer();\n ServerDataStore.bind(server);\n\n const extraEnv: Record<string, string> = {};\n\n let embeddedDb: Awaited<ReturnType<typeof startEmbeddedDb>> | undefined;\n\n const dbClient = await readDatabaseClient(options.configPaths);\n if (dbClient === 'embedded-postgres') {\n embeddedDb = await startEmbeddedDb();\n extraEnv.APP_CONFIG_backend_database = JSON.stringify({\n client: 'pg',\n connection: embeddedDb.connection,\n });\n }\n\n let exiting = false;\n let firstStart = true;\n let child: ChildProcess | undefined;\n let watcher: FSWatcher | undefined = undefined;\n let shutdownPromise: Promise<void> | undefined = undefined;\n\n const watchedPaths = new Set<string>();\n\n const restart = debounce(async () => {\n if (firstStart) {\n firstStart = false;\n } else {\n console.log();\n console.log('Change detected, restarting the development server...');\n console.log();\n }\n // If a re-trigger happens during an existing shutdown, we just ignore it\n if (shutdownPromise) {\n return;\n }\n\n if (child && !child.killed && child.exitCode === null) {\n // We always wait for the existing process to exit, to make sure we don't get IPC conflicts\n shutdownPromise = new Promise(resolve => child!.once('exit', resolve));\n if (process.platform === 'win32' && child.pid) {\n ctrlc(child.pid);\n } else {\n child.kill();\n }\n await shutdownPromise;\n shutdownPromise = undefined;\n }\n\n // We've received a shutdown signal\n if (exiting) {\n return;\n }\n\n const optionArgs = new Array<string>();\n if (options.inspectEnabled) {\n const inspect =\n typeof options.inspectEnabled === 'string'\n ? `--inspect=${options.inspectEnabled}`\n : '--inspect';\n optionArgs.push(inspect);\n } else if (options.inspectBrkEnabled) {\n const inspect =\n typeof options.inspectBrkEnabled === 'string'\n ? `--inspect-brk=${options.inspectBrkEnabled}`\n : '--inspect-brk';\n optionArgs.push(inspect);\n }\n if (options.require) {\n const requires = [options.require].flat();\n for (const r of requires) {\n optionArgs.push(`--require=${r}`);\n }\n }\n\n // Unless the user explicitly toggles node-snapshot, default to provide --no-node-snapshot to reduce number of steps to run scaffolder\n // on Node LTS.\n if (!envEnv.NODE_OPTIONS?.includes('--node-snapshot')) {\n optionArgs.push('--no-node-snapshot');\n }\n\n const userArgs = process.argv\n .slice(['node', 'backstage-cli', 'package', 'start'].length)\n .filter(arg => !optionArgs.includes(arg));\n\n child = spawn(\n process.execPath,\n [...loaderArgs, ...optionArgs, options.entry, ...userArgs],\n {\n stdio: ['ignore', 'inherit', 'inherit', 'ipc'],\n cwd: options.targetDir,\n env: {\n ...process.env,\n ...extraEnv,\n BACKSTAGE_CLI_LINKED_WORKSPACE: options.linkedWorkspace,\n BACKSTAGE_CLI_CHANNEL: '1',\n ESBK_TSCONFIG_PATH: targetPaths.resolveRoot('tsconfig.json'),\n },\n serialization: 'advanced',\n },\n );\n\n server.addChild(child);\n\n // This captures messages sent by @esbuild-kit/cjs-loader\n child.on('message', (data: { type?: string } | null) => {\n if (!watcher) {\n return;\n }\n if (typeof data === 'object' && data?.type === 'watch') {\n let path = (data as { path: string }).path;\n if (path.startsWith('file:')) {\n path = fileURLToPath(path);\n }\n\n if (isAbsolutePath(path) && !watchedPaths.has(path)) {\n watchedPaths.add(path);\n watcher.add(path);\n }\n }\n });\n }, 100);\n\n restart();\n\n watcher = watch(['./package.json'], {\n cwd: process.cwd(),\n ignoreInitial: true,\n ignorePermissionErrors: true,\n }).on('all', restart);\n\n // Trigger restart on hitting enter in the terminal\n process.stdin.on('data', restart);\n\n const exitPromise = new Promise<void>(resolveExitPromise => {\n async function handleSignal(signal: NodeJS.Signals) {\n exiting = true;\n\n // Forward signals to child and wait for it to exit if still running\n if (child && child.exitCode === null) {\n await new Promise(resolve => {\n child!.on('close', resolve);\n child!.kill(signal);\n });\n }\n\n await embeddedDb?.close();\n resolveExitPromise();\n }\n\n process.once('SIGINT', handleSignal);\n process.once('SIGTERM', handleSignal);\n });\n\n return () => exitPromise;\n}\n\nasync function readDatabaseClient(\n configPaths?: string[],\n): Promise<string | undefined> {\n const rootDir = targetPaths.rootDir;\n const source = ConfigSources.default({\n rootDir,\n allowMissingDefaultConfig: true,\n argv: (configPaths ?? []).flatMap(p => [\n '--config',\n isAbsolutePath(p) ? p : resolvePath(rootDir, p),\n ]),\n });\n\n const config = await ConfigSources.toConfig(source);\n try {\n return config.getOptionalString('backend.database.client');\n } finally {\n config.close();\n }\n}\n"],"names":["IpcServer","ServerDataStore","startEmbeddedDb","debounce","ctrlc","spawn","targetPaths","fileURLToPath","isAbsolutePath","watch","ConfigSources","resolvePath"],"mappings":";;;;;;;;;;;;;;;;;;;AAgCA,MAAM,UAAA,GAAa;AAAA,EACjB,sBAAA;AAAA,EACA,WAAA;AAAA,EACA,OAAA,CAAQ,QAAQ,8CAA8C;AAAA;AAEhE,CAAA;AAmBA,eAAsB,WAAW,OAAA,EAA4B;AAC3D,EAAA,MAAM,SAAS,OAAA,CAAQ,GAAA;AACvB,EAAA,IAAI,CAAC,OAAO,QAAA,EAAU;AACpB,IAAA,MAAA,CAAO,QAAA,GAAW,aAAA;AAAA,EACpB;AAGA,EAAA,MAAM,MAAA,GAAS,IAAIA,mBAAA,EAAU;AAC7B,EAAAC,+BAAA,CAAgB,KAAK,MAAM,CAAA;AAE3B,EAAA,MAAM,WAAmC,EAAC;AAE1C,EAAA,IAAI,UAAA;AAEJ,EAAA,MAAM,QAAA,GAAW,MAAM,kBAAA,CAAmB,OAAA,CAAQ,WAAW,CAAA;AAC7D,EAAA,IAAI,aAAa,mBAAA,EAAqB;AACpC,IAAA,UAAA,GAAa,MAAMC,+BAAA,EAAgB;AACnC,IAAA,QAAA,CAAS,2BAAA,GAA8B,KAAK,SAAA,CAAU;AAAA,MACpD,MAAA,EAAQ,IAAA;AAAA,MACR,YAAY,UAAA,CAAW;AAAA,KACxB,CAAA;AAAA,EACH;AAEA,EAAA,IAAI,OAAA,GAAU,KAAA;AACd,EAAA,IAAI,UAAA,GAAa,IAAA;AACjB,EAAA,IAAI,KAAA;AACJ,EAAA,IAAI,OAAA,GAAiC,MAAA;AACrC,EAAA,IAAI,eAAA,GAA6C,MAAA;AAEjD,EAAA,MAAM,YAAA,uBAAmB,GAAA,EAAY;AAErC,EAAA,MAAM,OAAA,GAAUC,0BAAS,YAAY;AACnC,IAAA,IAAI,UAAA,EAAY;AACd,MAAA,UAAA,GAAa,KAAA;AAAA,IACf,CAAA,MAAO;AACL,MAAA,OAAA,CAAQ,GAAA,EAAI;AACZ,MAAA,OAAA,CAAQ,IAAI,uDAAuD,CAAA;AACnE,MAAA,OAAA,CAAQ,GAAA,EAAI;AAAA,IACd;AAEA,IAAA,IAAI,eAAA,EAAiB;AACnB,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,SAAS,CAAC,KAAA,CAAM,MAAA,IAAU,KAAA,CAAM,aAAa,IAAA,EAAM;AAErD,MAAA,eAAA,GAAkB,IAAI,OAAA,CAAQ,CAAA,OAAA,KAAW,MAAO,IAAA,CAAK,MAAA,EAAQ,OAAO,CAAC,CAAA;AACrE,MAAA,IAAI,OAAA,CAAQ,QAAA,KAAa,OAAA,IAAW,KAAA,CAAM,GAAA,EAAK;AAC7C,QAAAC,kBAAA,CAAM,MAAM,GAAG,CAAA;AAAA,MACjB,CAAA,MAAO;AACL,QAAA,KAAA,CAAM,IAAA,EAAK;AAAA,MACb;AACA,MAAA,MAAM,eAAA;AACN,MAAA,eAAA,GAAkB,MAAA;AAAA,IACpB;AAGA,IAAA,IAAI,OAAA,EAAS;AACX,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,UAAA,GAAa,IAAI,KAAA,EAAc;AACrC,IAAA,IAAI,QAAQ,cAAA,EAAgB;AAC1B,MAAA,MAAM,OAAA,GACJ,OAAO,OAAA,CAAQ,cAAA,KAAmB,WAC9B,CAAA,UAAA,EAAa,OAAA,CAAQ,cAAc,CAAA,CAAA,GACnC,WAAA;AACN,MAAA,UAAA,CAAW,KAAK,OAAO,CAAA;AAAA,IACzB,CAAA,MAAA,IAAW,QAAQ,iBAAA,EAAmB;AACpC,MAAA,MAAM,OAAA,GACJ,OAAO,OAAA,CAAQ,iBAAA,KAAsB,WACjC,CAAA,cAAA,EAAiB,OAAA,CAAQ,iBAAiB,CAAA,CAAA,GAC1C,eAAA;AACN,MAAA,UAAA,CAAW,KAAK,OAAO,CAAA;AAAA,IACzB;AACA,IAAA,IAAI,QAAQ,OAAA,EAAS;AACnB,MAAA,MAAM,QAAA,GAAW,CAAC,OAAA,CAAQ,OAAO,EAAE,IAAA,EAAK;AACxC,MAAA,KAAA,MAAW,KAAK,QAAA,EAAU;AACxB,QAAA,UAAA,CAAW,IAAA,CAAK,CAAA,UAAA,EAAa,CAAC,CAAA,CAAE,CAAA;AAAA,MAClC;AAAA,IACF;AAIA,IAAA,IAAI,CAAC,MAAA,CAAO,YAAA,EAAc,QAAA,CAAS,iBAAiB,CAAA,EAAG;AACrD,MAAA,UAAA,CAAW,KAAK,oBAAoB,CAAA;AAAA,IACtC;AAEA,IAAA,MAAM,WAAW,OAAA,CAAQ,IAAA,CACtB,MAAM,CAAC,MAAA,EAAQ,iBAAiB,SAAA,EAAW,OAAO,CAAA,CAAE,MAAM,EAC1D,MAAA,CAAO,CAAA,GAAA,KAAO,CAAC,UAAA,CAAW,QAAA,CAAS,GAAG,CAAC,CAAA;AAE1C,IAAA,KAAA,GAAQC,sBAAA;AAAA,MACN,OAAA,CAAQ,QAAA;AAAA,MACR,CAAC,GAAG,UAAA,EAAY,GAAG,YAAY,OAAA,CAAQ,KAAA,EAAO,GAAG,QAAQ,CAAA;AAAA,MACzD;AAAA,QACE,KAAA,EAAO,CAAC,QAAA,EAAU,SAAA,EAAW,WAAW,KAAK,CAAA;AAAA,QAC7C,KAAK,OAAA,CAAQ,SAAA;AAAA,QACb,GAAA,EAAK;AAAA,UACH,GAAG,OAAA,CAAQ,GAAA;AAAA,UACX,GAAG,QAAA;AAAA,UACH,gCAAgC,OAAA,CAAQ,eAAA;AAAA,UACxC,qBAAA,EAAuB,GAAA;AAAA,UACvB,kBAAA,EAAoBC,qBAAA,CAAY,WAAA,CAAY,eAAe;AAAA,SAC7D;AAAA,QACA,aAAA,EAAe;AAAA;AACjB,KACF;AAEA,IAAA,MAAA,CAAO,SAAS,KAAK,CAAA;AAGrB,IAAA,KAAA,CAAM,EAAA,CAAG,SAAA,EAAW,CAAC,IAAA,KAAmC;AACtD,MAAA,IAAI,CAAC,OAAA,EAAS;AACZ,QAAA;AAAA,MACF;AACA,MAAA,IAAI,OAAO,IAAA,KAAS,QAAA,IAAY,IAAA,EAAM,SAAS,OAAA,EAAS;AACtD,QAAA,IAAI,OAAQ,IAAA,CAA0B,IAAA;AACtC,QAAA,IAAI,IAAA,CAAK,UAAA,CAAW,OAAO,CAAA,EAAG;AAC5B,UAAA,IAAA,GAAOC,uBAAc,IAAI,CAAA;AAAA,QAC3B;AAEA,QAAA,IAAIC,qBAAe,IAAI,CAAA,IAAK,CAAC,YAAA,CAAa,GAAA,CAAI,IAAI,CAAA,EAAG;AACnD,UAAA,YAAA,CAAa,IAAI,IAAI,CAAA;AACrB,UAAA,OAAA,CAAQ,IAAI,IAAI,CAAA;AAAA,QAClB;AAAA,MACF;AAAA,IACF,CAAC,CAAA;AAAA,EACH,GAAG,GAAG,CAAA;AAEN,EAAA,OAAA,EAAQ;AAER,EAAA,OAAA,GAAUC,cAAA,CAAM,CAAC,gBAAgB,CAAA,EAAG;AAAA,IAClC,GAAA,EAAK,QAAQ,GAAA,EAAI;AAAA,IACjB,aAAA,EAAe,IAAA;AAAA,IACf,sBAAA,EAAwB;AAAA,GACzB,CAAA,CAAE,EAAA,CAAG,KAAA,EAAO,OAAO,CAAA;AAGpB,EAAA,OAAA,CAAQ,KAAA,CAAM,EAAA,CAAG,MAAA,EAAQ,OAAO,CAAA;AAEhC,EAAA,MAAM,WAAA,GAAc,IAAI,OAAA,CAAc,CAAA,kBAAA,KAAsB;AAC1D,IAAA,eAAe,aAAa,MAAA,EAAwB;AAClD,MAAA,OAAA,GAAU,IAAA;AAGV,MAAA,IAAI,KAAA,IAAS,KAAA,CAAM,QAAA,KAAa,IAAA,EAAM;AACpC,QAAA,MAAM,IAAI,QAAQ,CAAA,OAAA,KAAW;AAC3B,UAAA,KAAA,CAAO,EAAA,CAAG,SAAS,OAAO,CAAA;AAC1B,UAAA,KAAA,CAAO,KAAK,MAAM,CAAA;AAAA,QACpB,CAAC,CAAA;AAAA,MACH;AAEA,MAAA,MAAM,YAAY,KAAA,EAAM;AACxB,MAAA,kBAAA,EAAmB;AAAA,IACrB;AAEA,IAAA,OAAA,CAAQ,IAAA,CAAK,UAAU,YAAY,CAAA;AACnC,IAAA,OAAA,CAAQ,IAAA,CAAK,WAAW,YAAY,CAAA;AAAA,EACtC,CAAC,CAAA;AAED,EAAA,OAAO,MAAM,WAAA;AACf;AAEA,eAAe,mBACb,WAAA,EAC6B;AAC7B,EAAA,MAAM,UAAUH,qBAAA,CAAY,OAAA;AAC5B,EAAA,MAAM,MAAA,GAASI,2BAAc,OAAA,CAAQ;AAAA,IACnC,OAAA;AAAA,IACA,yBAAA,EAA2B,IAAA;AAAA,IAC3B,IAAA,EAAA,CAAO,WAAA,IAAe,EAAC,EAAG,QAAQ,CAAA,CAAA,KAAK;AAAA,MACrC,UAAA;AAAA,MACAF,qBAAe,CAAC,CAAA,GAAI,CAAA,GAAIG,iBAAA,CAAY,SAAS,CAAC;AAAA,KAC/C;AAAA,GACF,CAAA;AAED,EAAA,MAAM,MAAA,GAAS,MAAMD,0BAAA,CAAc,QAAA,CAAS,MAAM,CAAA;AAClD,EAAA,IAAI;AACF,IAAA,OAAO,MAAA,CAAO,kBAAkB,yBAAyB,CAAA;AAAA,EAC3D,CAAA,SAAE;AACA,IAAA,MAAA,CAAO,KAAA,EAAM;AAAA,EACf;AACF;;;;"}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var os = require('node:os');
|
|
4
|
+
var fs = require('fs-extra');
|
|
5
|
+
var node_path = require('node:path');
|
|
6
|
+
var portfinder = require('portfinder');
|
|
7
|
+
var errors = require('@backstage/errors');
|
|
8
|
+
var chalk = require('chalk');
|
|
9
|
+
|
|
10
|
+
function _interopDefaultCompat (e) { return e && typeof e === 'object' && 'default' in e ? e : { default: e }; }
|
|
11
|
+
|
|
12
|
+
var os__default = /*#__PURE__*/_interopDefaultCompat(os);
|
|
13
|
+
var fs__default = /*#__PURE__*/_interopDefaultCompat(fs);
|
|
14
|
+
var chalk__default = /*#__PURE__*/_interopDefaultCompat(chalk);
|
|
15
|
+
|
|
16
|
+
const TEMP_DIR_PREFIX = "backstage-dev-db-";
|
|
17
|
+
const PID_FILE = "backstage.pid";
|
|
18
|
+
function isProcessAlive(pid) {
|
|
19
|
+
try {
|
|
20
|
+
process.kill(pid, 0);
|
|
21
|
+
return true;
|
|
22
|
+
} catch {
|
|
23
|
+
return false;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
async function cleanStaleDatabases() {
|
|
27
|
+
const tmpBase = os__default.default.tmpdir();
|
|
28
|
+
const entries = (await fs__default.default.readdir(tmpBase)).filter(
|
|
29
|
+
(d) => d.startsWith(TEMP_DIR_PREFIX)
|
|
30
|
+
);
|
|
31
|
+
await Promise.all(
|
|
32
|
+
entries.map(async (d) => {
|
|
33
|
+
const dir = node_path.resolve(tmpBase, d);
|
|
34
|
+
const raw = await fs__default.default.readFile(node_path.resolve(dir, PID_FILE), "utf8").catch(() => void 0);
|
|
35
|
+
const pid = raw ? Number(raw.trim()) : NaN;
|
|
36
|
+
if (!pid || !isProcessAlive(pid)) {
|
|
37
|
+
await fs__default.default.remove(dir);
|
|
38
|
+
}
|
|
39
|
+
})
|
|
40
|
+
);
|
|
41
|
+
}
|
|
42
|
+
async function startEmbeddedDb() {
|
|
43
|
+
console.warn(
|
|
44
|
+
chalk__default.default.yellow(
|
|
45
|
+
"WARNING: Using embedded-postgres for local development is experimental and subject to change"
|
|
46
|
+
)
|
|
47
|
+
);
|
|
48
|
+
const { default: EmbeddedPostgres } = await import('embedded-postgres').catch(
|
|
49
|
+
(error) => {
|
|
50
|
+
throw new errors.ForwardedError(
|
|
51
|
+
`Failed to load 'embedded-postgres' which is required when using 'embedded-postgres' as the database client. It must be installed as an explicit dependency in your project`,
|
|
52
|
+
error
|
|
53
|
+
);
|
|
54
|
+
}
|
|
55
|
+
);
|
|
56
|
+
await cleanStaleDatabases();
|
|
57
|
+
const host = "localhost";
|
|
58
|
+
const user = "postgres";
|
|
59
|
+
const password = "password";
|
|
60
|
+
const port = await portfinder.getPortPromise();
|
|
61
|
+
const tmpDir = await fs__default.default.mkdtemp(node_path.resolve(os__default.default.tmpdir(), TEMP_DIR_PREFIX));
|
|
62
|
+
const pg = new EmbeddedPostgres({
|
|
63
|
+
databaseDir: tmpDir,
|
|
64
|
+
user,
|
|
65
|
+
password,
|
|
66
|
+
port,
|
|
67
|
+
persistent: false,
|
|
68
|
+
onError(messageOrError) {
|
|
69
|
+
console.error(`[embedded-postgres]`, messageOrError);
|
|
70
|
+
},
|
|
71
|
+
onLog() {
|
|
72
|
+
}
|
|
73
|
+
});
|
|
74
|
+
try {
|
|
75
|
+
await pg.initialise();
|
|
76
|
+
await fs__default.default.writeFile(node_path.resolve(tmpDir, PID_FILE), String(process.pid));
|
|
77
|
+
await pg.start();
|
|
78
|
+
} catch (error) {
|
|
79
|
+
await pg.stop().catch(() => {
|
|
80
|
+
});
|
|
81
|
+
await fs__default.default.remove(tmpDir).catch(() => {
|
|
82
|
+
});
|
|
83
|
+
throw error;
|
|
84
|
+
}
|
|
85
|
+
return {
|
|
86
|
+
connection: {
|
|
87
|
+
host,
|
|
88
|
+
user,
|
|
89
|
+
password,
|
|
90
|
+
port
|
|
91
|
+
},
|
|
92
|
+
async close() {
|
|
93
|
+
await pg.stop();
|
|
94
|
+
await fs__default.default.remove(tmpDir);
|
|
95
|
+
}
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
exports.startEmbeddedDb = startEmbeddedDb;
|
|
100
|
+
//# sourceMappingURL=startEmbeddedDb.cjs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"startEmbeddedDb.cjs.js","sources":["../../../src/lib/runner/startEmbeddedDb.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 os from 'node:os';\nimport fs from 'fs-extra';\nimport { resolve as resolvePath } from 'node:path';\nimport { getPortPromise } from 'portfinder';\nimport { ForwardedError } from '@backstage/errors';\nimport chalk from 'chalk';\n\nconst TEMP_DIR_PREFIX = 'backstage-dev-db-';\nconst PID_FILE = 'backstage.pid';\n\nfunction isProcessAlive(pid: number): boolean {\n try {\n process.kill(pid, 0);\n return true;\n } catch {\n return false;\n }\n}\n\nasync function cleanStaleDatabases() {\n const tmpBase = os.tmpdir();\n const entries = (await fs.readdir(tmpBase)).filter(d =>\n d.startsWith(TEMP_DIR_PREFIX),\n );\n await Promise.all(\n entries.map(async d => {\n const dir = resolvePath(tmpBase, d);\n const raw = await fs\n .readFile(resolvePath(dir, PID_FILE), 'utf8')\n .catch(() => undefined);\n const pid = raw ? Number(raw.trim()) : NaN;\n if (!pid || !isProcessAlive(pid)) {\n await fs.remove(dir);\n }\n }),\n );\n}\n\nexport async function startEmbeddedDb() {\n console.warn(\n chalk.yellow(\n 'WARNING: Using embedded-postgres for local development is experimental and subject to change',\n ),\n );\n\n const { default: EmbeddedPostgres } = await import('embedded-postgres').catch(\n error => {\n throw new ForwardedError(\n `Failed to load 'embedded-postgres' which is required when using ` +\n `'embedded-postgres' as the database client. It must be installed ` +\n `as an explicit dependency in your project`,\n error,\n );\n },\n );\n\n await cleanStaleDatabases();\n\n const host = 'localhost';\n const user = 'postgres';\n const password = 'password';\n const port = await getPortPromise();\n const tmpDir = await fs.mkdtemp(resolvePath(os.tmpdir(), TEMP_DIR_PREFIX));\n\n const pg = new EmbeddedPostgres({\n databaseDir: tmpDir,\n user,\n password,\n port,\n persistent: false,\n onError(messageOrError) {\n console.error(`[embedded-postgres]`, messageOrError);\n },\n onLog() {},\n });\n\n try {\n await pg.initialise();\n await fs.writeFile(resolvePath(tmpDir, PID_FILE), String(process.pid));\n await pg.start();\n } catch (error) {\n await pg.stop().catch(() => {});\n await fs.remove(tmpDir).catch(() => {});\n throw error;\n }\n\n return {\n connection: {\n host,\n user,\n password,\n port,\n },\n async close() {\n await pg.stop();\n await fs.remove(tmpDir);\n },\n };\n}\n"],"names":["os","fs","resolvePath","chalk","ForwardedError","getPortPromise"],"mappings":"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"}
|
package/dist/package.json.cjs.js
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
4
|
|
|
5
5
|
var name = "@backstage/cli-module-build";
|
|
6
|
-
var version = "0.1.1
|
|
6
|
+
var version = "0.1.1";
|
|
7
7
|
var description = "CLI module for Backstage CLI";
|
|
8
8
|
var backstage = {
|
|
9
9
|
role: "cli-module"
|
|
@@ -80,6 +80,7 @@ var dependencies = {
|
|
|
80
80
|
"node-stdlib-browser": "^1.3.1",
|
|
81
81
|
"npm-packlist": "^5.0.0",
|
|
82
82
|
"p-queue": "^6.6.2",
|
|
83
|
+
portfinder: "^1.0.32",
|
|
83
84
|
postcss: "^8.1.0",
|
|
84
85
|
"postcss-import": "^16.1.0",
|
|
85
86
|
process: "^0.11.10",
|
|
@@ -109,7 +110,16 @@ var devDependencies = {
|
|
|
109
110
|
"@types/fs-extra": "^11.0.0",
|
|
110
111
|
"@types/lodash": "^4.14.151",
|
|
111
112
|
"@types/npm-packlist": "^3.0.0",
|
|
112
|
-
"@types/shell-quote": "^1.7.5"
|
|
113
|
+
"@types/shell-quote": "^1.7.5",
|
|
114
|
+
"embedded-postgres": "18.3.0-beta.16"
|
|
115
|
+
};
|
|
116
|
+
var peerDependencies = {
|
|
117
|
+
"embedded-postgres": "^18.3.0-beta.16"
|
|
118
|
+
};
|
|
119
|
+
var peerDependenciesMeta = {
|
|
120
|
+
"embedded-postgres": {
|
|
121
|
+
optional: true
|
|
122
|
+
}
|
|
113
123
|
};
|
|
114
124
|
var packageJson = {
|
|
115
125
|
name: name,
|
|
@@ -127,7 +137,9 @@ var packageJson = {
|
|
|
127
137
|
scripts: scripts,
|
|
128
138
|
jest: jest,
|
|
129
139
|
dependencies: dependencies,
|
|
130
|
-
devDependencies: devDependencies
|
|
140
|
+
devDependencies: devDependencies,
|
|
141
|
+
peerDependencies: peerDependencies,
|
|
142
|
+
peerDependenciesMeta: peerDependenciesMeta
|
|
131
143
|
};
|
|
132
144
|
|
|
133
145
|
exports.backstage = backstage;
|
|
@@ -142,6 +154,8 @@ exports.jest = jest;
|
|
|
142
154
|
exports.license = license;
|
|
143
155
|
exports.main = main;
|
|
144
156
|
exports.name = name;
|
|
157
|
+
exports.peerDependencies = peerDependencies;
|
|
158
|
+
exports.peerDependenciesMeta = peerDependenciesMeta;
|
|
145
159
|
exports.publishConfig = publishConfig;
|
|
146
160
|
exports.repository = repository;
|
|
147
161
|
exports.scripts = scripts;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"package.json.cjs.js","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"package.json.cjs.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@backstage/cli-module-build",
|
|
3
|
-
"version": "0.1.1
|
|
3
|
+
"version": "0.1.1",
|
|
4
4
|
"description": "CLI module for Backstage CLI",
|
|
5
5
|
"backstage": {
|
|
6
6
|
"role": "cli-module"
|
|
@@ -40,12 +40,12 @@
|
|
|
40
40
|
]
|
|
41
41
|
},
|
|
42
42
|
"dependencies": {
|
|
43
|
-
"@backstage/cli-common": "0.2.1
|
|
44
|
-
"@backstage/cli-node": "0.3.1
|
|
45
|
-
"@backstage/config": "1.3.
|
|
46
|
-
"@backstage/config-loader": "1.10.10
|
|
47
|
-
"@backstage/errors": "1.
|
|
48
|
-
"@backstage/module-federation-common": "0.1.
|
|
43
|
+
"@backstage/cli-common": "^0.2.1",
|
|
44
|
+
"@backstage/cli-node": "^0.3.1",
|
|
45
|
+
"@backstage/config": "^1.3.7",
|
|
46
|
+
"@backstage/config-loader": "^1.10.10",
|
|
47
|
+
"@backstage/errors": "^1.3.0",
|
|
48
|
+
"@backstage/module-federation-common": "^0.1.3",
|
|
49
49
|
"@manypkg/get-packages": "^1.1.3",
|
|
50
50
|
"@module-federation/enhanced": "^0.21.6",
|
|
51
51
|
"@pmmmwh/react-refresh-webpack-plugin": "^0.6.0",
|
|
@@ -77,6 +77,7 @@
|
|
|
77
77
|
"node-stdlib-browser": "^1.3.1",
|
|
78
78
|
"npm-packlist": "^5.0.0",
|
|
79
79
|
"p-queue": "^6.6.2",
|
|
80
|
+
"portfinder": "^1.0.32",
|
|
80
81
|
"postcss": "^8.1.0",
|
|
81
82
|
"postcss-import": "^16.1.0",
|
|
82
83
|
"process": "^0.11.10",
|
|
@@ -101,12 +102,21 @@
|
|
|
101
102
|
"yn": "^4.0.0"
|
|
102
103
|
},
|
|
103
104
|
"devDependencies": {
|
|
104
|
-
"@backstage/backend-test-utils": "1.11.2
|
|
105
|
-
"@backstage/cli": "0.36.1
|
|
105
|
+
"@backstage/backend-test-utils": "^1.11.2",
|
|
106
|
+
"@backstage/cli": "^0.36.1",
|
|
106
107
|
"@types/fs-extra": "^11.0.0",
|
|
107
108
|
"@types/lodash": "^4.14.151",
|
|
108
109
|
"@types/npm-packlist": "^3.0.0",
|
|
109
|
-
"@types/shell-quote": "^1.7.5"
|
|
110
|
+
"@types/shell-quote": "^1.7.5",
|
|
111
|
+
"embedded-postgres": "18.3.0-beta.16"
|
|
112
|
+
},
|
|
113
|
+
"peerDependencies": {
|
|
114
|
+
"embedded-postgres": "^18.3.0-beta.16"
|
|
115
|
+
},
|
|
116
|
+
"peerDependenciesMeta": {
|
|
117
|
+
"embedded-postgres": {
|
|
118
|
+
"optional": true
|
|
119
|
+
}
|
|
110
120
|
},
|
|
111
121
|
"typesVersions": {
|
|
112
122
|
"*": {
|