@backstage/cli-module-build 0.1.4 → 0.1.5-next.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 CHANGED
@@ -1,5 +1,22 @@
1
1
  # @backstage/cli-module-build
2
2
 
3
+ ## 0.1.5-next.1
4
+
5
+ ### Patch Changes
6
+
7
+ - 3cce70f: Increase generated frontend static asset filename hashes to 12 characters to reduce the chance of collisions across long-lived cached builds.
8
+ - Updated dependencies
9
+ - @backstage/config-loader@1.11.0-next.1
10
+
11
+ ## 0.1.5-next.0
12
+
13
+ ### Patch Changes
14
+
15
+ - 87af6ce: Package preparation now converts TypeScript configuration schemas to separate JSON files. Backend builds compile schemas together before assembling the distribution workspace, while package publishing compiles each schema independently.
16
+ - da820d1: Added support for passing custom flags to the embedded postgres processes via `backend.database.connection.flags.postgres` and `backend.database.connection.flags.initdb` configuration properties.
17
+ - Updated dependencies
18
+ - @backstage/config-loader@1.11.0-next.0
19
+
3
20
  ## 0.1.4
4
21
 
5
22
  ### Patch Changes
@@ -17,6 +17,7 @@ var yn = require('yn');
17
17
  var hasReactDomClient = require('./hasReactDomClient.cjs.js');
18
18
  var linkWorkspaces = require('./linkWorkspaces.cjs.js');
19
19
  var ConfigInjectingHtmlWebpackPlugin = require('./ConfigInjectingHtmlWebpackPlugin.cjs.js');
20
+ var staticAssetHash = require('./staticAssetHash.cjs.js');
20
21
 
21
22
  function _interopDefaultCompat (e) { return e && typeof e === 'object' && 'default' in e ? e : { default: e }; }
22
23
 
@@ -283,8 +284,8 @@ async function createConfig(paths, options) {
283
284
  uniqueName: options.moduleFederationRemote?.name,
284
285
  path: paths.targetDist,
285
286
  publicPath: options.moduleFederationRemote ? "auto" : `${publicPath}/`,
286
- filename: isDev ? "[name].js" : "static/[name].[contenthash:8].js",
287
- chunkFilename: isDev ? "[name].chunk.js" : "static/[name].[contenthash:8].chunk.js",
287
+ filename: isDev ? "[name].js" : `static/[name].[contenthash:${staticAssetHash.STATIC_ASSET_HASH_LENGTH}].js`,
288
+ chunkFilename: isDev ? "[name].chunk.js" : `static/[name].[contenthash:${staticAssetHash.STATIC_ASSET_HASH_LENGTH}].chunk.js`,
288
289
  ...isDev ? {
289
290
  devtoolModuleFilenameTemplate: (info) => `file:///${node_path.resolve(info.absoluteResourcePath).replace(
290
291
  /\\/g,
@@ -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 ignoreWarnings: [\n // @protobufjs/inquire uses require(moduleName) with a dynamic argument.\n // Since protobufjs >=7.5.9 this code path is never exercised (the\n // bundler-safe optional module lookups backport replaced all call sites),\n // but webpack/rspack still statically analyzes the source and emits a\n // \"Critical dependency\" warning. Safe to suppress.\n // See https://github.com/protobufjs/protobuf.js/issues/2057\n {\n module: /@protobufjs[\\\\/]inquire/,\n message:\n /Critical dependency: the request of a dependency is an expression/,\n },\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 ...(options.moduleFederationRemote\n ? [\n {\n message:\n /No version specified and unable to automatically determine one\\. No version in description file/,\n },\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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"}
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';\nimport { STATIC_ASSET_HASH_LENGTH } from './staticAssetHash';\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\n ? '[name].js'\n : `static/[name].[contenthash:${STATIC_ASSET_HASH_LENGTH}].js`,\n chunkFilename: isDev\n ? '[name].chunk.js'\n : `static/[name].[contenthash:${STATIC_ASSET_HASH_LENGTH}].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 ignoreWarnings: [\n // @protobufjs/inquire uses require(moduleName) with a dynamic argument.\n // Since protobufjs >=7.5.9 this code path is never exercised (the\n // bundler-safe optional module lookups backport replaced all call sites),\n // but webpack/rspack still statically analyzes the source and emits a\n // \"Critical dependency\" warning. Safe to suppress.\n // See https://github.com/protobufjs/protobuf.js/issues/2057\n {\n module: /@protobufjs[\\\\/]inquire/,\n message:\n /Critical dependency: the request of a dependency is an expression/,\n },\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 ...(options.moduleFederationRemote\n ? [\n {\n message:\n /No version specified and unable to automatically determine one\\. No version in description file/,\n },\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","STATIC_ASSET_HASH_LENGTH","yn"],"mappings":"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"}
@@ -1,6 +1,7 @@
1
1
  'use strict';
2
2
 
3
3
  var core = require('@rspack/core');
4
+ var staticAssetHash = require('./staticAssetHash.cjs.js');
4
5
 
5
6
  const optimization = (options) => {
6
7
  const { isDev, webpack } = options;
@@ -41,7 +42,7 @@ const optimization = (options) => {
41
42
  )[1];
42
43
  return packageName.replace("@", "");
43
44
  },
44
- filename: isDev ? "module-[name].js" : "static/module-[name].[contenthash:8].js",
45
+ filename: isDev ? "module-[name].js" : `static/module-[name].[contenthash:${staticAssetHash.STATIC_ASSET_HASH_LENGTH}].js`,
45
46
  priority: 10,
46
47
  minSize: 1e5,
47
48
  minChunks: 1,
@@ -1 +1 @@
1
- {"version":3,"file":"optimization.cjs.js","sources":["../../../src/lib/bundler/optimization.ts"],"sourcesContent":["/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { BundlingOptions } from './types';\nimport {\n SwcJsMinimizerRspackPlugin,\n LightningCssMinimizerRspackPlugin,\n RspackOptionsNormalized,\n} from '@rspack/core';\n\nexport const optimization = (\n options: BundlingOptions,\n): RspackOptionsNormalized['optimization'] => {\n const { isDev, webpack } = options;\n\n const MinifyPlugin = webpack\n ? require('esbuild-loader').EsbuildPlugin\n : SwcJsMinimizerRspackPlugin;\n\n return {\n minimize: !isDev,\n minimizer: [\n new MinifyPlugin({\n target: 'ES2023',\n format: 'iife',\n exclude: 'remoteEntry.js',\n }),\n // Avoid iife wrapping of module federation remote entry as it breaks the variable assignment\n new MinifyPlugin({\n target: 'ES2023',\n format: undefined,\n include: 'remoteEntry.js',\n }),\n webpack ? undefined : new LightningCssMinimizerRspackPlugin(),\n ],\n runtimeChunk: 'single',\n splitChunks: {\n automaticNameDelimiter: '-',\n cacheGroups: {\n default: false,\n // Put all vendor code needed for initial page load in individual files if they're big\n // enough, if they're smaller they end up in the main\n packages: {\n chunks: 'initial',\n test(module: any) {\n return Boolean(\n module?.resource?.match(/[\\\\/]node_modules[\\\\/](.*?)([\\\\/]|$)/),\n );\n },\n name(module: any) {\n // get the name. E.g. node_modules/packageName/not/this/part.js\n // or node_modules/packageName\n const packageName = module.resource.match(\n /[\\\\/]node_modules[\\\\/](.*?)([\\\\/]|$)/,\n )[1];\n\n // npm package names are URL-safe, but some servers don't like @ symbols\n return packageName.replace('@', '');\n },\n filename: isDev\n ? 'module-[name].js'\n : 'static/module-[name].[contenthash:8].js',\n priority: 10,\n minSize: 100000,\n minChunks: 1,\n ...(webpack && {\n maxAsyncRequests: Infinity,\n maxInitialRequests: Infinity,\n }),\n }, // filename is not included in type, but we need it\n // Group together the smallest modules\n vendor: {\n chunks: 'initial',\n test: /[\\\\/]node_modules[\\\\/]/,\n name: 'vendor',\n priority: 5,\n enforce: true,\n },\n },\n },\n };\n};\n"],"names":["SwcJsMinimizerRspackPlugin","LightningCssMinimizerRspackPlugin"],"mappings":";;;;AAuBO,MAAM,YAAA,GAAe,CAC1B,OAAA,KAC4C;AAC5C,EAAA,MAAM,EAAE,KAAA,EAAO,OAAA,EAAQ,GAAI,OAAA;AAE3B,EAAA,MAAM,YAAA,GAAe,OAAA,GACjB,OAAA,CAAQ,gBAAgB,EAAE,aAAA,GAC1BA,+BAAA;AAEJ,EAAA,OAAO;AAAA,IACL,UAAU,CAAC,KAAA;AAAA,IACX,SAAA,EAAW;AAAA,MACT,IAAI,YAAA,CAAa;AAAA,QACf,MAAA,EAAQ,QAAA;AAAA,QACR,MAAA,EAAQ,MAAA;AAAA,QACR,OAAA,EAAS;AAAA,OACV,CAAA;AAAA;AAAA,MAED,IAAI,YAAA,CAAa;AAAA,QACf,MAAA,EAAQ,QAAA;AAAA,QACR,MAAA,EAAQ,MAAA;AAAA,QACR,OAAA,EAAS;AAAA,OACV,CAAA;AAAA,MACD,OAAA,GAAU,MAAA,GAAY,IAAIC,sCAAA;AAAkC,KAC9D;AAAA,IACA,YAAA,EAAc,QAAA;AAAA,IACd,WAAA,EAAa;AAAA,MACX,sBAAA,EAAwB,GAAA;AAAA,MACxB,WAAA,EAAa;AAAA,QACX,OAAA,EAAS,KAAA;AAAA;AAAA;AAAA,QAGT,QAAA,EAAU;AAAA,UACR,MAAA,EAAQ,SAAA;AAAA,UACR,KAAK,MAAA,EAAa;AAChB,YAAA,OAAO,OAAA;AAAA,cACL,MAAA,EAAQ,QAAA,EAAU,KAAA,CAAM,sCAAsC;AAAA,aAChE;AAAA,UACF,CAAA;AAAA,UACA,KAAK,MAAA,EAAa;AAGhB,YAAA,MAAM,WAAA,GAAc,OAAO,QAAA,CAAS,KAAA;AAAA,cAClC;AAAA,cACA,CAAC,CAAA;AAGH,YAAA,OAAO,WAAA,CAAY,OAAA,CAAQ,GAAA,EAAK,EAAE,CAAA;AAAA,UACpC,CAAA;AAAA,UACA,QAAA,EAAU,QACN,kBAAA,GACA,yCAAA;AAAA,UACJ,QAAA,EAAU,EAAA;AAAA,UACV,OAAA,EAAS,GAAA;AAAA,UACT,SAAA,EAAW,CAAA;AAAA,UACX,GAAI,OAAA,IAAW;AAAA,YACb,gBAAA,EAAkB,QAAA;AAAA,YAClB,kBAAA,EAAoB;AAAA;AACtB,SACF;AAAA;AAAA;AAAA,QAEA,MAAA,EAAQ;AAAA,UACN,MAAA,EAAQ,SAAA;AAAA,UACR,IAAA,EAAM,wBAAA;AAAA,UACN,IAAA,EAAM,QAAA;AAAA,UACN,QAAA,EAAU,CAAA;AAAA,UACV,OAAA,EAAS;AAAA;AACX;AACF;AACF,GACF;AACF;;;;"}
1
+ {"version":3,"file":"optimization.cjs.js","sources":["../../../src/lib/bundler/optimization.ts"],"sourcesContent":["/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { BundlingOptions } from './types';\nimport {\n SwcJsMinimizerRspackPlugin,\n LightningCssMinimizerRspackPlugin,\n RspackOptionsNormalized,\n} from '@rspack/core';\nimport { STATIC_ASSET_HASH_LENGTH } from './staticAssetHash';\n\nexport const optimization = (\n options: BundlingOptions,\n): RspackOptionsNormalized['optimization'] => {\n const { isDev, webpack } = options;\n\n const MinifyPlugin = webpack\n ? require('esbuild-loader').EsbuildPlugin\n : SwcJsMinimizerRspackPlugin;\n\n return {\n minimize: !isDev,\n minimizer: [\n new MinifyPlugin({\n target: 'ES2023',\n format: 'iife',\n exclude: 'remoteEntry.js',\n }),\n // Avoid iife wrapping of module federation remote entry as it breaks the variable assignment\n new MinifyPlugin({\n target: 'ES2023',\n format: undefined,\n include: 'remoteEntry.js',\n }),\n webpack ? undefined : new LightningCssMinimizerRspackPlugin(),\n ],\n runtimeChunk: 'single',\n splitChunks: {\n automaticNameDelimiter: '-',\n cacheGroups: {\n default: false,\n // Put all vendor code needed for initial page load in individual files if they're big\n // enough, if they're smaller they end up in the main\n packages: {\n chunks: 'initial',\n test(module: any) {\n return Boolean(\n module?.resource?.match(/[\\\\/]node_modules[\\\\/](.*?)([\\\\/]|$)/),\n );\n },\n name(module: any) {\n // get the name. E.g. node_modules/packageName/not/this/part.js\n // or node_modules/packageName\n const packageName = module.resource.match(\n /[\\\\/]node_modules[\\\\/](.*?)([\\\\/]|$)/,\n )[1];\n\n // npm package names are URL-safe, but some servers don't like @ symbols\n return packageName.replace('@', '');\n },\n filename: isDev\n ? 'module-[name].js'\n : `static/module-[name].[contenthash:${STATIC_ASSET_HASH_LENGTH}].js`,\n priority: 10,\n minSize: 100000,\n minChunks: 1,\n ...(webpack && {\n maxAsyncRequests: Infinity,\n maxInitialRequests: Infinity,\n }),\n }, // filename is not included in type, but we need it\n // Group together the smallest modules\n vendor: {\n chunks: 'initial',\n test: /[\\\\/]node_modules[\\\\/]/,\n name: 'vendor',\n priority: 5,\n enforce: true,\n },\n },\n },\n };\n};\n"],"names":["SwcJsMinimizerRspackPlugin","LightningCssMinimizerRspackPlugin","STATIC_ASSET_HASH_LENGTH"],"mappings":";;;;;AAwBO,MAAM,YAAA,GAAe,CAC1B,OAAA,KAC4C;AAC5C,EAAA,MAAM,EAAE,KAAA,EAAO,OAAA,EAAQ,GAAI,OAAA;AAE3B,EAAA,MAAM,YAAA,GAAe,OAAA,GACjB,OAAA,CAAQ,gBAAgB,EAAE,aAAA,GAC1BA,+BAAA;AAEJ,EAAA,OAAO;AAAA,IACL,UAAU,CAAC,KAAA;AAAA,IACX,SAAA,EAAW;AAAA,MACT,IAAI,YAAA,CAAa;AAAA,QACf,MAAA,EAAQ,QAAA;AAAA,QACR,MAAA,EAAQ,MAAA;AAAA,QACR,OAAA,EAAS;AAAA,OACV,CAAA;AAAA;AAAA,MAED,IAAI,YAAA,CAAa;AAAA,QACf,MAAA,EAAQ,QAAA;AAAA,QACR,MAAA,EAAQ,MAAA;AAAA,QACR,OAAA,EAAS;AAAA,OACV,CAAA;AAAA,MACD,OAAA,GAAU,MAAA,GAAY,IAAIC,sCAAA;AAAkC,KAC9D;AAAA,IACA,YAAA,EAAc,QAAA;AAAA,IACd,WAAA,EAAa;AAAA,MACX,sBAAA,EAAwB,GAAA;AAAA,MACxB,WAAA,EAAa;AAAA,QACX,OAAA,EAAS,KAAA;AAAA;AAAA;AAAA,QAGT,QAAA,EAAU;AAAA,UACR,MAAA,EAAQ,SAAA;AAAA,UACR,KAAK,MAAA,EAAa;AAChB,YAAA,OAAO,OAAA;AAAA,cACL,MAAA,EAAQ,QAAA,EAAU,KAAA,CAAM,sCAAsC;AAAA,aAChE;AAAA,UACF,CAAA;AAAA,UACA,KAAK,MAAA,EAAa;AAGhB,YAAA,MAAM,WAAA,GAAc,OAAO,QAAA,CAAS,KAAA;AAAA,cAClC;AAAA,cACA,CAAC,CAAA;AAGH,YAAA,OAAO,WAAA,CAAY,OAAA,CAAQ,GAAA,EAAK,EAAE,CAAA;AAAA,UACpC,CAAA;AAAA,UACA,QAAA,EAAU,KAAA,GACN,kBAAA,GACA,CAAA,kCAAA,EAAqCC,wCAAwB,CAAA,IAAA,CAAA;AAAA,UACjE,QAAA,EAAU,EAAA;AAAA,UACV,OAAA,EAAS,GAAA;AAAA,UACT,SAAA,EAAW,CAAA;AAAA,UACX,GAAI,OAAA,IAAW;AAAA,YACb,gBAAA,EAAkB,QAAA;AAAA,YAClB,kBAAA,EAAoB;AAAA;AACtB,SACF;AAAA;AAAA;AAAA,QAEA,MAAA,EAAQ;AAAA,UACN,MAAA,EAAQ,SAAA;AAAA,UACR,IAAA,EAAM,wBAAA;AAAA,UACN,IAAA,EAAM,QAAA;AAAA,UACN,QAAA,EAAU,CAAA;AAAA,UACV,OAAA,EAAS;AAAA;AACX;AACF;AACF,GACF;AACF;;;;"}
@@ -0,0 +1,6 @@
1
+ 'use strict';
2
+
3
+ const STATIC_ASSET_HASH_LENGTH = 12;
4
+
5
+ exports.STATIC_ASSET_HASH_LENGTH = STATIC_ASSET_HASH_LENGTH;
6
+ //# sourceMappingURL=staticAssetHash.cjs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"staticAssetHash.cjs.js","sources":["../../../src/lib/bundler/staticAssetHash.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\n// Static assets may remain cached across many builds, so use enough hash\n// characters to keep filename collisions unlikely across deployments.\nexport const STATIC_ASSET_HASH_LENGTH = 12;\n"],"names":[],"mappings":";;AAkBO,MAAM,wBAAA,GAA2B;;;;"}
@@ -1,6 +1,7 @@
1
1
  'use strict';
2
2
 
3
3
  var core = require('@rspack/core');
4
+ var staticAssetHash = require('./staticAssetHash.cjs.js');
4
5
 
5
6
  const transforms = (options) => {
6
7
  const { isDev, isBackend, webpack } = options;
@@ -88,14 +89,14 @@ const transforms = (options) => {
88
89
  ],
89
90
  type: "asset/resource",
90
91
  generator: {
91
- filename: "static/[name].[hash:8][ext]"
92
+ filename: `static/[name].[hash:${staticAssetHash.STATIC_ASSET_HASH_LENGTH}][ext]`
92
93
  }
93
94
  },
94
95
  {
95
96
  test: /\.(eot|woff|woff2|ttf)$/i,
96
97
  type: "asset/resource",
97
98
  generator: {
98
- filename: "static/[name].[hash][ext][query]"
99
+ filename: `static/[name].[hash:${staticAssetHash.STATIC_ASSET_HASH_LENGTH}][ext][query]`
99
100
  }
100
101
  },
101
102
  {
@@ -106,7 +107,7 @@ const transforms = (options) => {
106
107
  include: /\.(md)$/,
107
108
  type: "asset/resource",
108
109
  generator: {
109
- filename: "static/[name].[hash][ext][query]"
110
+ filename: `static/[name].[hash:${staticAssetHash.STATIC_ASSET_HASH_LENGTH}][ext][query]`
110
111
  }
111
112
  },
112
113
  {
@@ -131,8 +132,8 @@ const transforms = (options) => {
131
132
  if (!isDev) {
132
133
  plugins.push(
133
134
  new CssExtractPlugin({
134
- filename: "static/[name].[contenthash:8].css",
135
- chunkFilename: "static/[name].[id].[contenthash:8].css",
135
+ filename: `static/[name].[contenthash:${staticAssetHash.STATIC_ASSET_HASH_LENGTH}].css`,
136
+ chunkFilename: `static/[name].[id].[contenthash:${staticAssetHash.STATIC_ASSET_HASH_LENGTH}].css`,
136
137
  insert: insertBeforeJssStyles
137
138
  // Only applies to async chunks
138
139
  })
@@ -1 +1 @@
1
- {"version":3,"file":"transforms.cjs.js","sources":["../../../src/lib/bundler/transforms.ts"],"sourcesContent":["/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n RuleSetRule,\n RspackPluginInstance,\n CssExtractRspackPlugin,\n WebpackPluginInstance,\n} from '@rspack/core';\n\ntype Transforms = {\n loaders: RuleSetRule[];\n plugins: Array<RspackPluginInstance | WebpackPluginInstance>;\n};\n\ntype TransformOptions = {\n isDev: boolean;\n isBackend?: boolean;\n webpack?: typeof import('webpack').webpack;\n};\n\nexport const transforms = (options: TransformOptions): Transforms => {\n const { isDev, isBackend, webpack } = options;\n\n const CssExtractPlugin: typeof CssExtractRspackPlugin = webpack\n ? (require('mini-css-extract-plugin') as unknown as typeof CssExtractRspackPlugin)\n : CssExtractRspackPlugin;\n\n // This ensures that styles inserted from the style-loader and any\n // async style chunks are always given lower priority than JSS styles.\n // Note that this function is stringified and executed in the browser\n // after transpilation, so stick to simple syntax\n function insertBeforeJssStyles(element: any) {\n const head = document.head;\n // This makes sure that any style elements we insert get put before the\n // dynamic styles from JSS, such as the ones from `makeStyles()`.\n // TODO(Rugvip): This will likely break in material-ui v5, keep an eye on it.\n const firstJssNode = head.querySelector('style[data-jss]');\n if (!firstJssNode) {\n head.appendChild(element);\n } else {\n head.insertBefore(element, firstJssNode);\n }\n }\n\n const loaders = [\n {\n test: /\\.(tsx?)$/,\n exclude: /node_modules/,\n use: [\n {\n loader: webpack\n ? require.resolve('swc-loader')\n : 'builtin:swc-loader',\n options: {\n jsc: {\n target: 'es2023',\n externalHelpers: !isBackend,\n parser: {\n syntax: 'typescript',\n tsx: !isBackend,\n dynamicImport: true,\n },\n transform: {\n react: isBackend\n ? undefined\n : {\n runtime: 'automatic',\n refresh: isDev,\n },\n },\n },\n },\n },\n ],\n },\n {\n test: /\\.(jsx?|mjs|cjs)$/,\n exclude: /node_modules/,\n use: [\n {\n loader: webpack\n ? require.resolve('swc-loader')\n : 'builtin:swc-loader',\n options: {\n jsc: {\n target: 'es2023',\n externalHelpers: !isBackend,\n parser: {\n syntax: 'ecmascript',\n jsx: !isBackend,\n dynamicImport: true,\n },\n transform: {\n react: isBackend\n ? undefined\n : {\n runtime: 'automatic',\n refresh: isDev,\n },\n },\n },\n },\n },\n ],\n },\n {\n test: /\\.(js|mjs|cjs)$/,\n resolve: {\n fullySpecified: false,\n },\n },\n {\n test: [\n /\\.bmp$/,\n /\\.gif$/,\n /\\.jpe?g$/,\n /\\.png$/,\n /\\.frag$/,\n /\\.vert$/,\n { and: [/\\.svg$/, { not: [/\\.icon\\.svg$/] }] },\n /\\.xml$/,\n /\\.ico$/,\n /\\.webp$/,\n ],\n type: 'asset/resource',\n generator: {\n filename: 'static/[name].[hash:8][ext]',\n },\n },\n {\n test: /\\.(eot|woff|woff2|ttf)$/i,\n type: 'asset/resource',\n generator: {\n filename: 'static/[name].[hash][ext][query]',\n },\n },\n {\n test: /\\.ya?ml$/,\n use: require.resolve('yml-loader'),\n },\n {\n include: /\\.(md)$/,\n type: 'asset/resource',\n generator: {\n filename: 'static/[name].[hash][ext][query]',\n },\n },\n {\n test: /\\.css$/i,\n use: [\n isDev\n ? {\n loader: require.resolve('style-loader'),\n options: {\n insert: insertBeforeJssStyles,\n },\n }\n : CssExtractPlugin.loader,\n {\n loader: require.resolve('css-loader'),\n options: {\n sourceMap: true,\n },\n },\n ],\n },\n ];\n\n const plugins = new Array<RspackPluginInstance | WebpackPluginInstance>();\n\n if (!isDev) {\n plugins.push(\n new CssExtractPlugin({\n filename: 'static/[name].[contenthash:8].css',\n chunkFilename: 'static/[name].[id].[contenthash:8].css',\n insert: insertBeforeJssStyles, // Only applies to async chunks\n }),\n );\n }\n\n return { loaders, plugins };\n};\n"],"names":["CssExtractRspackPlugin"],"mappings":"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"}
1
+ {"version":3,"file":"transforms.cjs.js","sources":["../../../src/lib/bundler/transforms.ts"],"sourcesContent":["/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n RuleSetRule,\n RspackPluginInstance,\n CssExtractRspackPlugin,\n WebpackPluginInstance,\n} from '@rspack/core';\nimport { STATIC_ASSET_HASH_LENGTH } from './staticAssetHash';\n\ntype Transforms = {\n loaders: RuleSetRule[];\n plugins: Array<RspackPluginInstance | WebpackPluginInstance>;\n};\n\ntype TransformOptions = {\n isDev: boolean;\n isBackend?: boolean;\n webpack?: typeof import('webpack').webpack;\n};\n\nexport const transforms = (options: TransformOptions): Transforms => {\n const { isDev, isBackend, webpack } = options;\n\n const CssExtractPlugin: typeof CssExtractRspackPlugin = webpack\n ? (require('mini-css-extract-plugin') as unknown as typeof CssExtractRspackPlugin)\n : CssExtractRspackPlugin;\n\n // This ensures that styles inserted from the style-loader and any\n // async style chunks are always given lower priority than JSS styles.\n // Note that this function is stringified and executed in the browser\n // after transpilation, so stick to simple syntax\n function insertBeforeJssStyles(element: any) {\n const head = document.head;\n // This makes sure that any style elements we insert get put before the\n // dynamic styles from JSS, such as the ones from `makeStyles()`.\n // TODO(Rugvip): This will likely break in material-ui v5, keep an eye on it.\n const firstJssNode = head.querySelector('style[data-jss]');\n if (!firstJssNode) {\n head.appendChild(element);\n } else {\n head.insertBefore(element, firstJssNode);\n }\n }\n\n const loaders = [\n {\n test: /\\.(tsx?)$/,\n exclude: /node_modules/,\n use: [\n {\n loader: webpack\n ? require.resolve('swc-loader')\n : 'builtin:swc-loader',\n options: {\n jsc: {\n target: 'es2023',\n externalHelpers: !isBackend,\n parser: {\n syntax: 'typescript',\n tsx: !isBackend,\n dynamicImport: true,\n },\n transform: {\n react: isBackend\n ? undefined\n : {\n runtime: 'automatic',\n refresh: isDev,\n },\n },\n },\n },\n },\n ],\n },\n {\n test: /\\.(jsx?|mjs|cjs)$/,\n exclude: /node_modules/,\n use: [\n {\n loader: webpack\n ? require.resolve('swc-loader')\n : 'builtin:swc-loader',\n options: {\n jsc: {\n target: 'es2023',\n externalHelpers: !isBackend,\n parser: {\n syntax: 'ecmascript',\n jsx: !isBackend,\n dynamicImport: true,\n },\n transform: {\n react: isBackend\n ? undefined\n : {\n runtime: 'automatic',\n refresh: isDev,\n },\n },\n },\n },\n },\n ],\n },\n {\n test: /\\.(js|mjs|cjs)$/,\n resolve: {\n fullySpecified: false,\n },\n },\n {\n test: [\n /\\.bmp$/,\n /\\.gif$/,\n /\\.jpe?g$/,\n /\\.png$/,\n /\\.frag$/,\n /\\.vert$/,\n { and: [/\\.svg$/, { not: [/\\.icon\\.svg$/] }] },\n /\\.xml$/,\n /\\.ico$/,\n /\\.webp$/,\n ],\n type: 'asset/resource',\n generator: {\n filename: `static/[name].[hash:${STATIC_ASSET_HASH_LENGTH}][ext]`,\n },\n },\n {\n test: /\\.(eot|woff|woff2|ttf)$/i,\n type: 'asset/resource',\n generator: {\n filename: `static/[name].[hash:${STATIC_ASSET_HASH_LENGTH}][ext][query]`,\n },\n },\n {\n test: /\\.ya?ml$/,\n use: require.resolve('yml-loader'),\n },\n {\n include: /\\.(md)$/,\n type: 'asset/resource',\n generator: {\n filename: `static/[name].[hash:${STATIC_ASSET_HASH_LENGTH}][ext][query]`,\n },\n },\n {\n test: /\\.css$/i,\n use: [\n isDev\n ? {\n loader: require.resolve('style-loader'),\n options: {\n insert: insertBeforeJssStyles,\n },\n }\n : CssExtractPlugin.loader,\n {\n loader: require.resolve('css-loader'),\n options: {\n sourceMap: true,\n },\n },\n ],\n },\n ];\n\n const plugins = new Array<RspackPluginInstance | WebpackPluginInstance>();\n\n if (!isDev) {\n plugins.push(\n new CssExtractPlugin({\n filename: `static/[name].[contenthash:${STATIC_ASSET_HASH_LENGTH}].css`,\n chunkFilename: `static/[name].[id].[contenthash:${STATIC_ASSET_HASH_LENGTH}].css`,\n insert: insertBeforeJssStyles, // Only applies to async chunks\n }),\n );\n }\n\n return { loaders, plugins };\n};\n"],"names":["CssExtractRspackPlugin","STATIC_ASSET_HASH_LENGTH"],"mappings":"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"}
@@ -179,6 +179,7 @@ async function moveToDistWorkspace(workspaceDir, localPackages, alwaysPack, enab
179
179
  localPackages,
180
180
  (pkg) => !alwaysPack && FAST_PACK_SCRIPTS.includes(pkg.packageJson.scripts?.prepack)
181
181
  );
182
+ const configSchemas = await productionPack.compilePackageConfigSchemas(fastPackPackages);
182
183
  const featureDetectionProject = fastPackPackages.length > 0 && enableFeatureDetection ? await typeDistProject.createTypeDistProject() : void 0;
183
184
  await Promise.all(
184
185
  fastPackPackages.map(async (target) => {
@@ -188,6 +189,7 @@ async function moveToDistWorkspace(workspaceDir, localPackages, alwaysPack, enab
188
189
  await productionPack.productionPack({
189
190
  packageDir: target.dir,
190
191
  targetDir: absoluteOutputPath,
192
+ configSchema: configSchemas.get(target.name),
191
193
  featureDetectionProject
192
194
  });
193
195
  })
@@ -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 { 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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"}
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 { compilePackageConfigSchemas, 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 configSchemas = await compilePackageConfigSchemas(fastPackPackages);\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 configSchema: configSchemas.get(target.name),\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","compilePackageConfigSchemas","createTypeDistProject","productionPack","computeTopologicalLayers"],"mappings":"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"}
@@ -3,6 +3,7 @@
3
3
  var fs = require('fs-extra');
4
4
  var npmPackList = require('npm-packlist');
5
5
  var node_path = require('node:path');
6
+ var configLoader = require('@backstage/config-loader');
6
7
  var entryPoints = require('../entryPoints.cjs.js');
7
8
  var typeDistProject = require('../typeDistProject.cjs.js');
8
9
 
@@ -13,8 +14,40 @@ var npmPackList__default = /*#__PURE__*/_interopDefaultCompat(npmPackList);
13
14
 
14
15
  const PKG_PATH = "package.json";
15
16
  const PKG_BACKUP_PATH = "package.json-prepack";
17
+ const GENERATED_CONFIG_SCHEMA_PATH = "config.schema.json";
16
18
  const SKIPPED_KEYS = ["access", "registry", "tag"];
17
19
  const SCRIPT_EXTS = [".js", ".jsx", ".ts", ".tsx"];
20
+ function getTypeScriptConfigSchemaPath(pkg) {
21
+ const configSchema = pkg.configSchema;
22
+ return typeof configSchema === "string" && configSchema.endsWith(".d.ts") ? configSchema : void 0;
23
+ }
24
+ async function compilePackageConfigSchemas(packages) {
25
+ const schemaPackages = packages.flatMap((pkg) => {
26
+ const schemaPath = getTypeScriptConfigSchemaPath(pkg.packageJson);
27
+ return schemaPath ? [{ ...pkg, schemaPath }] : [];
28
+ });
29
+ if (schemaPackages.length === 0) {
30
+ return /* @__PURE__ */ new Map();
31
+ }
32
+ const schema = await configLoader.loadConfigSchema({
33
+ dependencies: [],
34
+ packagePaths: schemaPackages.map(
35
+ (pkg) => node_path.resolve(pkg.dir, "package.json")
36
+ ),
37
+ excludePackageDependencies: true
38
+ });
39
+ const serialized = schema.serialize();
40
+ const expectedPaths = new Map(
41
+ schemaPackages.map((pkg) => [pkg.name, node_path.resolve(pkg.dir, pkg.schemaPath)])
42
+ );
43
+ const result = /* @__PURE__ */ new Map();
44
+ for (const entry of serialized.schemas) {
45
+ if (expectedPaths.get(entry.packageName) === node_path.resolve(process.cwd(), entry.path)) {
46
+ result.set(entry.packageName, entry.value);
47
+ }
48
+ }
49
+ return result;
50
+ }
18
51
  async function productionPack(options) {
19
52
  const { packageDir, targetDir } = options;
20
53
  const pkgPath = node_path.resolve(packageDir, PKG_PATH);
@@ -36,6 +69,25 @@ async function productionPack(options) {
36
69
  delete pkg.peerDependencies;
37
70
  delete pkg.optionalDependencies;
38
71
  }
72
+ const sourceConfigSchemaPath = getTypeScriptConfigSchemaPath(pkg);
73
+ let generatedConfigSchema;
74
+ if (sourceConfigSchemaPath) {
75
+ generatedConfigSchema = options.configSchema ?? (await compilePackageConfigSchemas([
76
+ { name: pkg.name, dir: packageDir, packageJson: pkg }
77
+ ])).get(pkg.name);
78
+ if (!generatedConfigSchema) {
79
+ throw new Error(`Failed to compile configuration schema for ${pkg.name}`);
80
+ }
81
+ pkg.configSchema = GENERATED_CONFIG_SCHEMA_PATH;
82
+ if (pkg.files) {
83
+ pkg.files = pkg.files.map(
84
+ (path) => path === sourceConfigSchemaPath ? GENERATED_CONFIG_SCHEMA_PATH : path
85
+ );
86
+ if (!pkg.files.includes(GENERATED_CONFIG_SCHEMA_PATH)) {
87
+ pkg.files.push(GENERATED_CONFIG_SCHEMA_PATH);
88
+ }
89
+ }
90
+ }
39
91
  if (targetDir) {
40
92
  const filePaths = await npmPackList__default.default({
41
93
  path: packageDir,
@@ -47,6 +99,9 @@ async function productionPack(options) {
47
99
  });
48
100
  await fs__default.default.ensureDir(targetDir);
49
101
  for (const filePath of filePaths.sort()) {
102
+ if (filePath === sourceConfigSchemaPath) {
103
+ continue;
104
+ }
50
105
  const target = node_path.resolve(targetDir, filePath);
51
106
  if (filePath === PKG_PATH) {
52
107
  await fs__default.default.writeJson(target, pkg, { encoding: "utf8", spaces: 2 });
@@ -54,7 +109,21 @@ async function productionPack(options) {
54
109
  await fs__default.default.copy(node_path.resolve(packageDir, filePath), target);
55
110
  }
56
111
  }
112
+ if (generatedConfigSchema) {
113
+ await fs__default.default.writeJson(
114
+ node_path.resolve(targetDir, GENERATED_CONFIG_SCHEMA_PATH),
115
+ generatedConfigSchema,
116
+ { encoding: "utf8", spaces: 2 }
117
+ );
118
+ }
57
119
  } else {
120
+ if (generatedConfigSchema) {
121
+ await fs__default.default.writeJson(
122
+ node_path.resolve(packageDir, GENERATED_CONFIG_SCHEMA_PATH),
123
+ generatedConfigSchema,
124
+ { encoding: "utf8", spaces: 2 }
125
+ );
126
+ }
58
127
  await fs__default.default.writeJson(pkgPath, pkg, { encoding: "utf8", spaces: 2 });
59
128
  }
60
129
  }
@@ -62,6 +131,9 @@ async function revertProductionPack(packageDir) {
62
131
  try {
63
132
  await fs__default.default.move(PKG_BACKUP_PATH, PKG_PATH, { overwrite: true });
64
133
  const pkg = await fs__default.default.readJson(PKG_PATH);
134
+ if (getTypeScriptConfigSchemaPath(pkg)) {
135
+ await fs__default.default.remove(node_path.resolve(packageDir, GENERATED_CONFIG_SCHEMA_PATH));
136
+ }
65
137
  const entryPoints$1 = entryPoints.readEntryPoints(pkg);
66
138
  for (const entryPoint of entryPoints$1) {
67
139
  if (entryPoint.mount !== "." && SCRIPT_EXTS.includes(entryPoint.ext)) {
@@ -155,6 +227,7 @@ async function rewriteEntryPoints(pkg, packageDir, featureDetectionProject) {
155
227
  return void 0;
156
228
  }
157
229
 
230
+ exports.compilePackageConfigSchemas = compilePackageConfigSchemas;
158
231
  exports.productionPack = productionPack;
159
232
  exports.revertProductionPack = revertProductionPack;
160
233
  //# sourceMappingURL=productionPack.cjs.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"productionPack.cjs.js","sources":["../../../src/lib/packager/productionPack.ts"],"sourcesContent":["/*\n * Copyright 2023 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport fs from 'fs-extra';\nimport npmPackList from 'npm-packlist';\nimport { resolve as resolvePath, posix as posixPath } from 'node:path';\nimport { BackstagePackageJson } from '@backstage/cli-node';\nimport { readEntryPoints } from '../entryPoints';\nimport { getEntryPointDefaultFeatureType } from '../typeDistProject';\nimport { Project } from 'ts-morph';\n\nconst PKG_PATH = 'package.json';\nconst PKG_BACKUP_PATH = 'package.json-prepack';\n\nconst SKIPPED_KEYS = ['access', 'registry', 'tag'];\nconst SCRIPT_EXTS = ['.js', '.jsx', '.ts', '.tsx'];\n\ninterface ProductionPackOptions {\n packageDir: string;\n targetDir?: string;\n /**\n * Enables package feature detection using this TS-morph project.\n */\n featureDetectionProject?: Project;\n}\n\nexport async function productionPack(options: ProductionPackOptions) {\n const { packageDir, targetDir } = options;\n const pkgPath = resolvePath(packageDir, PKG_PATH);\n const pkgContent = await fs.readFile(pkgPath, 'utf8');\n const pkg = JSON.parse(pkgContent) as BackstagePackageJson;\n\n // If we're making the update in-line, back up the package.json\n if (!targetDir) {\n await fs.writeFile(PKG_BACKUP_PATH, pkgContent);\n }\n\n // This mutates pkg to fill in index exports, so call it before applying publishConfig\n await rewriteEntryPoints(pkg, packageDir, options.featureDetectionProject);\n\n // TODO(Rugvip): Once exports are rolled out more broadly we should deprecate and remove this behavior\n const publishConfig = pkg.publishConfig ?? {};\n for (const key of Object.keys(publishConfig)) {\n if (!SKIPPED_KEYS.includes(key)) {\n (pkg as any)[key] = publishConfig[key as keyof typeof publishConfig];\n }\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 (pkg.bundled) {\n delete pkg.dependencies;\n delete pkg.devDependencies;\n delete pkg.peerDependencies;\n delete pkg.optionalDependencies;\n }\n\n if (targetDir) {\n // Lists all dist files, respecting .npmignore, files field in package.json, etc.\n const filePaths = await npmPackList({\n path: packageDir,\n // This makes sure we use the updated package.json when listing files\n packageJsonCache: new Map([\n [resolvePath(packageDir, PKG_PATH), pkg],\n ]) as any, // Seems like this parameter type is wrong,\n });\n\n await fs.ensureDir(targetDir);\n for (const filePath of filePaths.sort()) {\n const target = resolvePath(targetDir, filePath);\n if (filePath === PKG_PATH) {\n await fs.writeJson(target, pkg, { encoding: 'utf8', spaces: 2 });\n } else {\n await fs.copy(resolvePath(packageDir, filePath), target);\n }\n }\n } else {\n await fs.writeJson(pkgPath, pkg, { encoding: 'utf8', spaces: 2 });\n }\n}\n\n// Reverts the changes made by productionPack when called without a targetDir.\nexport async function revertProductionPack(packageDir: string) {\n // postpack isn't called by yarn right now, so it needs to be called manually\n try {\n await fs.move(PKG_BACKUP_PATH, PKG_PATH, { overwrite: true });\n\n // Check if we're shipping types for other release stages, clean up in that case\n const pkg = await fs.readJson(PKG_PATH);\n\n // Remove any extra entrypoint backwards compatibility directories\n const entryPoints = readEntryPoints(pkg);\n for (const entryPoint of entryPoints) {\n if (entryPoint.mount !== '.' && SCRIPT_EXTS.includes(entryPoint.ext)) {\n await fs.remove(resolvePath(packageDir, entryPoint.name));\n }\n }\n } catch (error) {\n console.warn(\n `Failed to restore package.json, ${error}. ` +\n 'Your package will be fine but you may have ended up with some garbage in the repo.',\n );\n }\n}\n\nconst EXPORT_MAP = {\n import: '.esm.js',\n require: '.cjs.js',\n types: '.d.ts',\n};\n\n/**\n * Rewrites the exports field in package.json to point to dist files, as\n * well as returning a function that creates backwards compatibility\n * entry points for importers that don't support exports.\n */\nasync function rewriteEntryPoints(\n pkg: BackstagePackageJson,\n packageDir: string,\n featureDetectionProject?: Project,\n) {\n const distPath = resolvePath(packageDir, 'dist');\n if (!(await fs.pathExists(distPath))) {\n return undefined;\n }\n const distFiles = await fs.readdir(distPath);\n const outputExports = {} as Record<string, string | Record<string, string>>;\n\n const entryPoints = readEntryPoints(pkg);\n\n // Clear to ensure a clean slate before adding entries back in further down\n if (pkg.typesVersions) {\n pkg.typesVersions = undefined;\n }\n\n for (const entryPoint of entryPoints) {\n if (!SCRIPT_EXTS.includes(entryPoint.ext)) {\n // Non-script files (like CSS) get their paths rewritten from src/ to dist/\n outputExports[entryPoint.mount] = entryPoint.path.replace(\n /^(\\.\\/)?src\\//,\n './dist/',\n );\n continue;\n }\n\n let exp = {} as Record<string, string>;\n\n for (const [key, ext] of Object.entries(EXPORT_MAP)) {\n const name = `${entryPoint.name}${ext}`;\n if (distFiles.includes(name)) {\n exp[key] = `./${posixPath.join(`dist`, name)}`;\n }\n }\n\n // Our current tooling relies on the typesVersions field rather than export.*.types\n if (exp.types) {\n if (!pkg.typesVersions) {\n pkg.typesVersions = { '*': {} };\n }\n if (entryPoint.name !== 'index') {\n pkg.typesVersions['*'][entryPoint.name] = [\n `dist/${entryPoint.name}.d.ts`,\n ];\n }\n }\n\n exp.default = exp.require ?? exp.import;\n\n // Find the default export type for the entry point, if feature detection is active\n if (exp.types && featureDetectionProject) {\n const defaultFeatureType =\n pkg.backstage?.role &&\n getEntryPointDefaultFeatureType(\n pkg.backstage?.role,\n packageDir,\n featureDetectionProject,\n exp.types,\n );\n\n if (defaultFeatureType) {\n // This ensures that the `backstage` field is at the top of the\n // `exports` field in the package.json because order is important.\n // https://nodejs.org/docs/latest-v20.x/api/packages.html#conditional-exports\n //\n // Adding this to the `exports` field in the package.json is to temporarily\n // support any existing behavior that relies on this, however not all packages\n // have exports field in their package.json.\n exp = { backstage: defaultFeatureType, ...exp };\n\n // Add the default feature type to the backstage metadata in the package.json\n pkg.backstage = pkg.backstage ?? {};\n pkg.backstage.features = pkg.backstage.features ?? {};\n pkg.backstage.features[entryPoint.mount] = defaultFeatureType;\n }\n }\n\n if (entryPoint.mount === '.') {\n if (exp.default) {\n pkg.main = exp.default;\n }\n if (exp.import) {\n pkg.module = exp.import;\n }\n if (exp.types) {\n pkg.types = exp.types;\n }\n }\n\n if (Object.keys(exp).length > 0) {\n outputExports[entryPoint.mount] = exp;\n }\n }\n\n // Make sure package.json is also available in typesVersions if present\n if (pkg.typesVersions?.['*']) {\n pkg.typesVersions['*']['package.json'] = ['package.json'];\n }\n\n if (pkg.exports) {\n pkg.exports = outputExports;\n // We treat package.json as a fixed export that is always available in the published package\n pkg.exports['./package.json'] = './package.json';\n }\n\n return undefined;\n}\n"],"names":["resolvePath","fs","npmPackList","entryPoints","readEntryPoints","posixPath","getEntryPointDefaultFeatureType"],"mappings":"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"}
1
+ {"version":3,"file":"productionPack.cjs.js","sources":["../../../src/lib/packager/productionPack.ts"],"sourcesContent":["/*\n * Copyright 2023 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport fs from 'fs-extra';\nimport npmPackList from 'npm-packlist';\nimport { resolve as resolvePath, posix as posixPath } from 'node:path';\nimport { BackstagePackageJson, PackageGraphNode } from '@backstage/cli-node';\nimport { loadConfigSchema } from '@backstage/config-loader';\nimport { readEntryPoints } from '../entryPoints';\nimport { getEntryPointDefaultFeatureType } from '../typeDistProject';\nimport { Project } from 'ts-morph';\n\nconst PKG_PATH = 'package.json';\nconst PKG_BACKUP_PATH = 'package.json-prepack';\nconst GENERATED_CONFIG_SCHEMA_PATH = 'config.schema.json';\n\nconst SKIPPED_KEYS = ['access', 'registry', 'tag'];\nconst SCRIPT_EXTS = ['.js', '.jsx', '.ts', '.tsx'];\n\ninterface ProductionPackOptions {\n packageDir: string;\n targetDir?: string;\n configSchema?: ConfigSchemaValue;\n /**\n * Enables package feature detection using this TS-morph project.\n */\n featureDetectionProject?: Project;\n}\n\ntype ConfigSchemaValue = Record<string, unknown>;\n\ntype PackageJsonWithConfigSchema = BackstagePackageJson & {\n configSchema?: string | ConfigSchemaValue;\n};\n\nfunction getTypeScriptConfigSchemaPath(pkg: BackstagePackageJson) {\n const configSchema = (pkg as PackageJsonWithConfigSchema).configSchema;\n return typeof configSchema === 'string' && configSchema.endsWith('.d.ts')\n ? configSchema\n : undefined;\n}\n\nexport async function compilePackageConfigSchemas(\n packages: Pick<PackageGraphNode, 'name' | 'dir' | 'packageJson'>[],\n) {\n const schemaPackages = packages.flatMap(pkg => {\n const schemaPath = getTypeScriptConfigSchemaPath(pkg.packageJson);\n return schemaPath ? [{ ...pkg, schemaPath }] : [];\n });\n if (schemaPackages.length === 0) {\n return new Map<string, ConfigSchemaValue>();\n }\n\n const schema = await loadConfigSchema({\n dependencies: [],\n packagePaths: schemaPackages.map(pkg =>\n resolvePath(pkg.dir, 'package.json'),\n ),\n excludePackageDependencies: true,\n });\n const serialized = schema.serialize() as {\n schemas: Array<{\n packageName: string;\n path: string;\n value: ConfigSchemaValue;\n }>;\n };\n const expectedPaths = new Map(\n schemaPackages.map(pkg => [pkg.name, resolvePath(pkg.dir, pkg.schemaPath)]),\n );\n const result = new Map<string, ConfigSchemaValue>();\n for (const entry of serialized.schemas) {\n if (\n expectedPaths.get(entry.packageName) ===\n resolvePath(process.cwd(), entry.path)\n ) {\n result.set(entry.packageName, entry.value);\n }\n }\n return result;\n}\n\nexport async function productionPack(options: ProductionPackOptions) {\n const { packageDir, targetDir } = options;\n const pkgPath = resolvePath(packageDir, PKG_PATH);\n const pkgContent = await fs.readFile(pkgPath, 'utf8');\n const pkg = JSON.parse(pkgContent) as BackstagePackageJson;\n\n // If we're making the update in-line, back up the package.json\n if (!targetDir) {\n await fs.writeFile(PKG_BACKUP_PATH, pkgContent);\n }\n\n // This mutates pkg to fill in index exports, so call it before applying publishConfig\n await rewriteEntryPoints(pkg, packageDir, options.featureDetectionProject);\n\n // TODO(Rugvip): Once exports are rolled out more broadly we should deprecate and remove this behavior\n const publishConfig = pkg.publishConfig ?? {};\n for (const key of Object.keys(publishConfig)) {\n if (!SKIPPED_KEYS.includes(key)) {\n (pkg as any)[key] = publishConfig[key as keyof typeof publishConfig];\n }\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 (pkg.bundled) {\n delete pkg.dependencies;\n delete pkg.devDependencies;\n delete pkg.peerDependencies;\n delete pkg.optionalDependencies;\n }\n\n const sourceConfigSchemaPath = getTypeScriptConfigSchemaPath(pkg);\n let generatedConfigSchema: ConfigSchemaValue | undefined;\n if (sourceConfigSchemaPath) {\n generatedConfigSchema =\n options.configSchema ??\n (\n await compilePackageConfigSchemas([\n { name: pkg.name, dir: packageDir, packageJson: pkg },\n ])\n ).get(pkg.name);\n if (!generatedConfigSchema) {\n throw new Error(`Failed to compile configuration schema for ${pkg.name}`);\n }\n\n (pkg as PackageJsonWithConfigSchema).configSchema =\n GENERATED_CONFIG_SCHEMA_PATH;\n if (pkg.files) {\n pkg.files = pkg.files.map(path =>\n path === sourceConfigSchemaPath ? GENERATED_CONFIG_SCHEMA_PATH : path,\n );\n if (!pkg.files.includes(GENERATED_CONFIG_SCHEMA_PATH)) {\n pkg.files.push(GENERATED_CONFIG_SCHEMA_PATH);\n }\n }\n }\n\n if (targetDir) {\n // Lists all dist files, respecting .npmignore, files field in package.json, etc.\n const filePaths = await npmPackList({\n path: packageDir,\n // This makes sure we use the updated package.json when listing files\n packageJsonCache: new Map([\n [resolvePath(packageDir, PKG_PATH), pkg],\n ]) as any, // Seems like this parameter type is wrong,\n });\n\n await fs.ensureDir(targetDir);\n for (const filePath of filePaths.sort()) {\n if (filePath === sourceConfigSchemaPath) {\n continue;\n }\n const target = resolvePath(targetDir, filePath);\n if (filePath === PKG_PATH) {\n await fs.writeJson(target, pkg, { encoding: 'utf8', spaces: 2 });\n } else {\n await fs.copy(resolvePath(packageDir, filePath), target);\n }\n }\n if (generatedConfigSchema) {\n await fs.writeJson(\n resolvePath(targetDir, GENERATED_CONFIG_SCHEMA_PATH),\n generatedConfigSchema,\n { encoding: 'utf8', spaces: 2 },\n );\n }\n } else {\n if (generatedConfigSchema) {\n await fs.writeJson(\n resolvePath(packageDir, GENERATED_CONFIG_SCHEMA_PATH),\n generatedConfigSchema,\n { encoding: 'utf8', spaces: 2 },\n );\n }\n await fs.writeJson(pkgPath, pkg, { encoding: 'utf8', spaces: 2 });\n }\n}\n\n// Reverts the changes made by productionPack when called without a targetDir.\nexport async function revertProductionPack(packageDir: string) {\n // postpack isn't called by yarn right now, so it needs to be called manually\n try {\n await fs.move(PKG_BACKUP_PATH, PKG_PATH, { overwrite: true });\n\n // Check if we're shipping types for other release stages, clean up in that case\n const pkg = await fs.readJson(PKG_PATH);\n\n if (getTypeScriptConfigSchemaPath(pkg)) {\n await fs.remove(resolvePath(packageDir, GENERATED_CONFIG_SCHEMA_PATH));\n }\n\n // Remove any extra entrypoint backwards compatibility directories\n const entryPoints = readEntryPoints(pkg);\n for (const entryPoint of entryPoints) {\n if (entryPoint.mount !== '.' && SCRIPT_EXTS.includes(entryPoint.ext)) {\n await fs.remove(resolvePath(packageDir, entryPoint.name));\n }\n }\n } catch (error) {\n console.warn(\n `Failed to restore package.json, ${error}. ` +\n 'Your package will be fine but you may have ended up with some garbage in the repo.',\n );\n }\n}\n\nconst EXPORT_MAP = {\n import: '.esm.js',\n require: '.cjs.js',\n types: '.d.ts',\n};\n\n/**\n * Rewrites the exports field in package.json to point to dist files, as\n * well as returning a function that creates backwards compatibility\n * entry points for importers that don't support exports.\n */\nasync function rewriteEntryPoints(\n pkg: BackstagePackageJson,\n packageDir: string,\n featureDetectionProject?: Project,\n) {\n const distPath = resolvePath(packageDir, 'dist');\n if (!(await fs.pathExists(distPath))) {\n return undefined;\n }\n const distFiles = await fs.readdir(distPath);\n const outputExports = {} as Record<string, string | Record<string, string>>;\n\n const entryPoints = readEntryPoints(pkg);\n\n // Clear to ensure a clean slate before adding entries back in further down\n if (pkg.typesVersions) {\n pkg.typesVersions = undefined;\n }\n\n for (const entryPoint of entryPoints) {\n if (!SCRIPT_EXTS.includes(entryPoint.ext)) {\n // Non-script files (like CSS) get their paths rewritten from src/ to dist/\n outputExports[entryPoint.mount] = entryPoint.path.replace(\n /^(\\.\\/)?src\\//,\n './dist/',\n );\n continue;\n }\n\n let exp = {} as Record<string, string>;\n\n for (const [key, ext] of Object.entries(EXPORT_MAP)) {\n const name = `${entryPoint.name}${ext}`;\n if (distFiles.includes(name)) {\n exp[key] = `./${posixPath.join(`dist`, name)}`;\n }\n }\n\n // Our current tooling relies on the typesVersions field rather than export.*.types\n if (exp.types) {\n if (!pkg.typesVersions) {\n pkg.typesVersions = { '*': {} };\n }\n if (entryPoint.name !== 'index') {\n pkg.typesVersions['*'][entryPoint.name] = [\n `dist/${entryPoint.name}.d.ts`,\n ];\n }\n }\n\n exp.default = exp.require ?? exp.import;\n\n // Find the default export type for the entry point, if feature detection is active\n if (exp.types && featureDetectionProject) {\n const defaultFeatureType =\n pkg.backstage?.role &&\n getEntryPointDefaultFeatureType(\n pkg.backstage?.role,\n packageDir,\n featureDetectionProject,\n exp.types,\n );\n\n if (defaultFeatureType) {\n // This ensures that the `backstage` field is at the top of the\n // `exports` field in the package.json because order is important.\n // https://nodejs.org/docs/latest-v20.x/api/packages.html#conditional-exports\n //\n // Adding this to the `exports` field in the package.json is to temporarily\n // support any existing behavior that relies on this, however not all packages\n // have exports field in their package.json.\n exp = { backstage: defaultFeatureType, ...exp };\n\n // Add the default feature type to the backstage metadata in the package.json\n pkg.backstage = pkg.backstage ?? {};\n pkg.backstage.features = pkg.backstage.features ?? {};\n pkg.backstage.features[entryPoint.mount] = defaultFeatureType;\n }\n }\n\n if (entryPoint.mount === '.') {\n if (exp.default) {\n pkg.main = exp.default;\n }\n if (exp.import) {\n pkg.module = exp.import;\n }\n if (exp.types) {\n pkg.types = exp.types;\n }\n }\n\n if (Object.keys(exp).length > 0) {\n outputExports[entryPoint.mount] = exp;\n }\n }\n\n // Make sure package.json is also available in typesVersions if present\n if (pkg.typesVersions?.['*']) {\n pkg.typesVersions['*']['package.json'] = ['package.json'];\n }\n\n if (pkg.exports) {\n pkg.exports = outputExports;\n // We treat package.json as a fixed export that is always available in the published package\n pkg.exports['./package.json'] = './package.json';\n }\n\n return undefined;\n}\n"],"names":["loadConfigSchema","resolvePath","fs","npmPackList","entryPoints","readEntryPoints","posixPath","getEntryPointDefaultFeatureType"],"mappings":"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"}
@@ -3,6 +3,7 @@
3
3
  var os = require('node:os');
4
4
  var fs = require('fs-extra');
5
5
  var node_path = require('node:path');
6
+ var zod = require('zod');
6
7
  var portfinder = require('portfinder');
7
8
  var errors = require('@backstage/errors');
8
9
  var configLoader = require('@backstage/config-loader');
@@ -41,6 +42,16 @@ async function cleanStaleDatabases() {
41
42
  })
42
43
  );
43
44
  }
45
+ const connectionSchema = zod.z.object({
46
+ host: zod.z.string().optional(),
47
+ port: zod.z.number().optional(),
48
+ user: zod.z.string().optional(),
49
+ password: zod.z.string().optional(),
50
+ flags: zod.z.object({
51
+ postgres: zod.z.array(zod.z.string()).optional(),
52
+ initdb: zod.z.array(zod.z.string()).optional()
53
+ }).optional()
54
+ });
44
55
  async function startEmbeddedDb(options) {
45
56
  const dbConfig = await readDatabaseConfig(
46
57
  options.configPaths,
@@ -77,6 +88,8 @@ async function startEmbeddedDbInternal(userConfig) {
77
88
  password,
78
89
  port,
79
90
  persistent: false,
91
+ ...userConfig?.flags?.postgres ? { postgresFlags: userConfig.flags.postgres } : {},
92
+ ...userConfig?.flags?.initdb ? { initdbFlags: userConfig.flags.initdb } : {},
80
93
  onError(messageOrError) {
81
94
  console.error(`[embedded-postgres]`, messageOrError);
82
95
  },
@@ -139,16 +152,8 @@ async function readDatabaseConfig(configPaths, targetDir) {
139
152
  return void 0;
140
153
  }
141
154
  const rawConnection = config.getOptional("backend.database.connection");
142
- if (typeof rawConnection === "string" || rawConnection === void 0) {
143
- return { client };
144
- }
145
- const host = config.getOptionalString("backend.database.connection.host");
146
- const port = config.getOptionalNumber("backend.database.connection.port");
147
- const user = config.getOptionalString("backend.database.connection.user");
148
- const password = config.getOptionalString(
149
- "backend.database.connection.password"
150
- );
151
- const connection = host !== void 0 || port !== void 0 || user !== void 0 || password !== void 0 ? { host, port, user, password } : void 0;
155
+ const connectionResult = connectionSchema.safeParse(rawConnection);
156
+ const connection = connectionResult.success ? connectionResult.data : void 0;
152
157
  return { client, connection };
153
158
  } finally {
154
159
  config.close();
@@ -1 +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 {\n isAbsolute as isAbsolutePath,\n resolve as resolvePath,\n} from 'node:path';\nimport { getPortPromise } from 'portfinder';\nimport { ForwardedError } from '@backstage/errors';\nimport { ConfigSources } from '@backstage/config-loader';\nimport { targetPaths } from '@backstage/cli-common';\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 interface EmbeddedDbConnectionConfig {\n host?: string;\n port?: number;\n user?: string;\n password?: string;\n}\n\nexport interface StartEmbeddedDbOptions {\n configPaths?: string[];\n targetDir?: string;\n}\n\n/**\n * Reads the database configuration from the app config and, if the client is\n * `embedded-postgres`, starts an embedded Postgres instance. Returns the config\n * override to inject into the child process, or `undefined` if the database\n * client is not `embedded-postgres`.\n */\nexport async function startEmbeddedDb(options: StartEmbeddedDbOptions): Promise<\n | {\n configOverride: Record<string, unknown>;\n close(): Promise<void>;\n }\n | undefined\n> {\n const dbConfig = await readDatabaseConfig(\n options.configPaths,\n options.targetDir,\n );\n if (dbConfig?.client !== 'embedded-postgres') {\n return undefined;\n }\n\n return startEmbeddedDbInternal(dbConfig.connection);\n}\n\nasync function startEmbeddedDbInternal(\n userConfig?: EmbeddedDbConnectionConfig,\n) {\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 = userConfig?.host ?? 'localhost';\n const user = userConfig?.user ?? 'postgres';\n const password = userConfig?.password ?? 'postgres';\n const port = userConfig?.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 const configOverride: Record<string, unknown> = {\n client: 'pg',\n };\n const defaultedConnection: Record<string, string | number> = {};\n if (!userConfig?.host) {\n defaultedConnection.host = host;\n }\n if (!userConfig?.user) {\n defaultedConnection.user = user;\n }\n if (!userConfig?.password) {\n defaultedConnection.password = password;\n }\n if (!userConfig?.port) {\n defaultedConnection.port = port;\n }\n if (Object.keys(defaultedConnection).length > 0) {\n configOverride.connection = defaultedConnection;\n }\n\n return {\n configOverride,\n async close() {\n await pg.stop();\n await fs.remove(tmpDir);\n },\n };\n}\n\nasync function readDatabaseConfig(\n configPaths?: string[],\n targetDir?: string,\n): Promise<\n | {\n client: string;\n connection?: EmbeddedDbConnectionConfig;\n }\n | undefined\n> {\n const rootDir = targetPaths.rootDir;\n const configBaseDir = targetDir ?? rootDir;\n const source = ConfigSources.default({\n rootDir,\n allowMissingDefaultConfig: true,\n argv: (configPaths ?? []).flatMap(p => [\n '--config',\n isAbsolutePath(p) ? p : resolvePath(configBaseDir, p),\n ]),\n });\n\n const config = await ConfigSources.toConfig(source);\n try {\n const client = config.getOptionalString('backend.database.client');\n if (!client) {\n return undefined;\n }\n\n // Only read structured connection config if the value is an object;\n // it can also be a plain string (e.g. ':memory:' for better-sqlite3).\n const rawConnection = config.getOptional('backend.database.connection');\n if (typeof rawConnection === 'string' || rawConnection === undefined) {\n return { client };\n }\n\n const host = config.getOptionalString('backend.database.connection.host');\n const port = config.getOptionalNumber('backend.database.connection.port');\n const user = config.getOptionalString('backend.database.connection.user');\n const password = config.getOptionalString(\n 'backend.database.connection.password',\n );\n\n const connection =\n host !== undefined ||\n port !== undefined ||\n user !== undefined ||\n password !== undefined\n ? { host, port, user, password }\n : undefined;\n\n return { client, connection };\n } finally {\n config.close();\n }\n}\n"],"names":["os","fs","resolvePath","chalk","ForwardedError","getPortPromise","targetPaths","ConfigSources","isAbsolutePath"],"mappings":"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"}
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 {\n isAbsolute as isAbsolutePath,\n resolve as resolvePath,\n} from 'node:path';\nimport { z } from 'zod';\nimport { getPortPromise } from 'portfinder';\nimport { ForwardedError } from '@backstage/errors';\nimport { ConfigSources } from '@backstage/config-loader';\nimport { targetPaths } from '@backstage/cli-common';\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 interface EmbeddedDbConnectionConfig {\n host?: string;\n port?: number;\n user?: string;\n password?: string;\n flags?: {\n postgres?: string[];\n initdb?: string[];\n };\n}\n\nconst connectionSchema: z.ZodType<EmbeddedDbConnectionConfig> = z.object({\n host: z.string().optional(),\n port: z.number().optional(),\n user: z.string().optional(),\n password: z.string().optional(),\n flags: z\n .object({\n postgres: z.array(z.string()).optional(),\n initdb: z.array(z.string()).optional(),\n })\n .optional(),\n});\n\nexport interface StartEmbeddedDbOptions {\n configPaths?: string[];\n targetDir?: string;\n}\n\n/**\n * Reads the database configuration from the app config and, if the client is\n * `embedded-postgres`, starts an embedded Postgres instance. Returns the config\n * override to inject into the child process, or `undefined` if the database\n * client is not `embedded-postgres`.\n */\nexport async function startEmbeddedDb(options: StartEmbeddedDbOptions): Promise<\n | {\n configOverride: Record<string, unknown>;\n close(): Promise<void>;\n }\n | undefined\n> {\n const dbConfig = await readDatabaseConfig(\n options.configPaths,\n options.targetDir,\n );\n if (dbConfig?.client !== 'embedded-postgres') {\n return undefined;\n }\n\n return startEmbeddedDbInternal(dbConfig.connection);\n}\n\nasync function startEmbeddedDbInternal(\n userConfig?: EmbeddedDbConnectionConfig,\n) {\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 = userConfig?.host ?? 'localhost';\n const user = userConfig?.user ?? 'postgres';\n const password = userConfig?.password ?? 'postgres';\n const port = userConfig?.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 ...(userConfig?.flags?.postgres\n ? { postgresFlags: userConfig.flags.postgres }\n : {}),\n ...(userConfig?.flags?.initdb\n ? { initdbFlags: userConfig.flags.initdb }\n : {}),\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 const configOverride: Record<string, unknown> = {\n client: 'pg',\n };\n const defaultedConnection: Record<string, string | number> = {};\n if (!userConfig?.host) {\n defaultedConnection.host = host;\n }\n if (!userConfig?.user) {\n defaultedConnection.user = user;\n }\n if (!userConfig?.password) {\n defaultedConnection.password = password;\n }\n if (!userConfig?.port) {\n defaultedConnection.port = port;\n }\n if (Object.keys(defaultedConnection).length > 0) {\n configOverride.connection = defaultedConnection;\n }\n\n return {\n configOverride,\n async close() {\n await pg.stop();\n await fs.remove(tmpDir);\n },\n };\n}\n\nasync function readDatabaseConfig(\n configPaths?: string[],\n targetDir?: string,\n): Promise<\n | {\n client: string;\n connection?: EmbeddedDbConnectionConfig;\n }\n | undefined\n> {\n const rootDir = targetPaths.rootDir;\n const configBaseDir = targetDir ?? rootDir;\n const source = ConfigSources.default({\n rootDir,\n allowMissingDefaultConfig: true,\n argv: (configPaths ?? []).flatMap(p => [\n '--config',\n isAbsolutePath(p) ? p : resolvePath(configBaseDir, p),\n ]),\n });\n\n const config = await ConfigSources.toConfig(source);\n try {\n const client = config.getOptionalString('backend.database.client');\n if (!client) {\n return undefined;\n }\n\n // Parse the raw connection value with zod rather than reading sub-keys\n // through the config reader, because the config reader's fallback chain\n // throws when a lower-priority config file has connection as a string.\n const rawConnection = config.getOptional('backend.database.connection');\n const connectionResult = connectionSchema.safeParse(rawConnection);\n const connection = connectionResult.success\n ? connectionResult.data\n : undefined;\n\n return { client, connection };\n } finally {\n config.close();\n }\n}\n"],"names":["os","fs","resolvePath","z","chalk","ForwardedError","getPortPromise","targetPaths","ConfigSources","isAbsolutePath"],"mappings":"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"}
@@ -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.4";
6
+ var version = "0.1.5-next.1";
7
7
  var description = "CLI module for Backstage CLI";
8
8
  var backstage = {
9
9
  role: "cli-module"
@@ -102,7 +102,8 @@ var dependencies = {
102
102
  webpack: "~5.105.0",
103
103
  "webpack-dev-server": "^5.0.0",
104
104
  "yml-loader": "^2.1.0",
105
- yn: "^4.0.0"
105
+ yn: "^4.0.0",
106
+ zod: "^3.25.76 || ^4.0.0"
106
107
  };
107
108
  var devDependencies = {
108
109
  "@backstage/backend-test-utils": "workspace:^",
@@ -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.4",
3
+ "version": "0.1.5-next.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.2",
44
- "@backstage/cli-node": "^0.3.3",
45
- "@backstage/config": "^1.3.8",
46
- "@backstage/config-loader": "^1.10.12",
47
- "@backstage/errors": "^1.3.1",
48
- "@backstage/module-federation-common": "^0.1.4",
43
+ "@backstage/cli-common": "0.2.2",
44
+ "@backstage/cli-node": "0.3.3",
45
+ "@backstage/config": "1.3.8",
46
+ "@backstage/config-loader": "1.11.0-next.1",
47
+ "@backstage/errors": "1.3.1",
48
+ "@backstage/module-federation-common": "0.1.4",
49
49
  "@manypkg/get-packages": "^1.1.3",
50
50
  "@module-federation/enhanced": "^2.3.3",
51
51
  "@pmmmwh/react-refresh-webpack-plugin": "^0.6.0",
@@ -99,11 +99,12 @@
99
99
  "webpack": "~5.105.0",
100
100
  "webpack-dev-server": "^5.0.0",
101
101
  "yml-loader": "^2.1.0",
102
- "yn": "^4.0.0"
102
+ "yn": "^4.0.0",
103
+ "zod": "^3.25.76 || ^4.0.0"
103
104
  },
104
105
  "devDependencies": {
105
- "@backstage/backend-test-utils": "^1.11.4",
106
- "@backstage/cli": "^0.36.3",
106
+ "@backstage/backend-test-utils": "1.11.5-next.0",
107
+ "@backstage/cli": "0.36.4-next.1",
107
108
  "@types/fs-extra": "^11.0.0",
108
109
  "@types/lodash": "^4.14.151",
109
110
  "@types/npm-packlist": "^3.0.0",