🚀 Socket Launch Week Day 5:Introducing Repository Access Permissions and Custom Roles.Learn more
Sign In

@backstage/cli-module-build

Package Overview
Dependencies
Maintainers
3
Versions
97
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@backstage/cli-module-build - npm Package Compare versions

Comparing version
0.1.4
to
0.1.5-next.0
+9
-0
CHANGELOG.md
# @backstage/cli-module-build
## 0.1.5-next.0
### Patch Changes
- 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.
- 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.
- Updated dependencies
- @backstage/config-loader@1.11.0-next.0
## 0.1.4

@@ -4,0 +13,0 @@

+2
-0

@@ -182,2 +182,3 @@ 'use strict';

);
const configSchemas = await productionPack.compilePackageConfigSchemas(fastPackPackages);
const featureDetectionProject = fastPackPackages.length > 0 && enableFeatureDetection ? await typeDistProject.createTypeDistProject() : void 0;

@@ -192,2 +193,3 @@ await Promise.all(

targetDir: absoluteOutputPath,
configSchema: configSchemas.get(target.name),
featureDetectionProject

@@ -194,0 +196,0 @@ });

+1
-1

@@ -1,1 +0,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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"}
{"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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"}

@@ -6,2 +6,3 @@ 'use strict';

var node_path = require('node:path');
var configLoader = require('@backstage/config-loader');
var entryPoints = require('../entryPoints.cjs.js');

@@ -17,4 +18,36 @@ var typeDistProject = require('../typeDistProject.cjs.js');

const PKG_BACKUP_PATH = "package.json-prepack";
const GENERATED_CONFIG_SCHEMA_PATH = "config.schema.json";
const SKIPPED_KEYS = ["access", "registry", "tag"];
const SCRIPT_EXTS = [".js", ".jsx", ".ts", ".tsx"];
function getTypeScriptConfigSchemaPath(pkg) {
const configSchema = pkg.configSchema;
return typeof configSchema === "string" && configSchema.endsWith(".d.ts") ? configSchema : void 0;
}
async function compilePackageConfigSchemas(packages) {
const schemaPackages = packages.flatMap((pkg) => {
const schemaPath = getTypeScriptConfigSchemaPath(pkg.packageJson);
return schemaPath ? [{ ...pkg, schemaPath }] : [];
});
if (schemaPackages.length === 0) {
return /* @__PURE__ */ new Map();
}
const schema = await configLoader.loadConfigSchema({
dependencies: [],
packagePaths: schemaPackages.map(
(pkg) => node_path.resolve(pkg.dir, "package.json")
),
excludePackageDependencies: true
});
const serialized = schema.serialize();
const expectedPaths = new Map(
schemaPackages.map((pkg) => [pkg.name, node_path.resolve(pkg.dir, pkg.schemaPath)])
);
const result = /* @__PURE__ */ new Map();
for (const entry of serialized.schemas) {
if (expectedPaths.get(entry.packageName) === node_path.resolve(process.cwd(), entry.path)) {
result.set(entry.packageName, entry.value);
}
}
return result;
}
async function productionPack(options) {

@@ -41,2 +74,21 @@ const { packageDir, targetDir } = options;

}
const sourceConfigSchemaPath = getTypeScriptConfigSchemaPath(pkg);
let generatedConfigSchema;
if (sourceConfigSchemaPath) {
generatedConfigSchema = options.configSchema ?? (await compilePackageConfigSchemas([
{ name: pkg.name, dir: packageDir, packageJson: pkg }
])).get(pkg.name);
if (!generatedConfigSchema) {
throw new Error(`Failed to compile configuration schema for ${pkg.name}`);
}
pkg.configSchema = GENERATED_CONFIG_SCHEMA_PATH;
if (pkg.files) {
pkg.files = pkg.files.map(
(path) => path === sourceConfigSchemaPath ? GENERATED_CONFIG_SCHEMA_PATH : path
);
if (!pkg.files.includes(GENERATED_CONFIG_SCHEMA_PATH)) {
pkg.files.push(GENERATED_CONFIG_SCHEMA_PATH);
}
}
}
if (targetDir) {

@@ -53,2 +105,5 @@ const filePaths = await npmPackList__default.default({

for (const filePath of filePaths.sort()) {
if (filePath === sourceConfigSchemaPath) {
continue;
}
const target = node_path.resolve(targetDir, filePath);

@@ -61,3 +116,17 @@ if (filePath === PKG_PATH) {

}
if (generatedConfigSchema) {
await fs__default.default.writeJson(
node_path.resolve(targetDir, GENERATED_CONFIG_SCHEMA_PATH),
generatedConfigSchema,
{ encoding: "utf8", spaces: 2 }
);
}
} else {
if (generatedConfigSchema) {
await fs__default.default.writeJson(
node_path.resolve(packageDir, GENERATED_CONFIG_SCHEMA_PATH),
generatedConfigSchema,
{ encoding: "utf8", spaces: 2 }
);
}
await fs__default.default.writeJson(pkgPath, pkg, { encoding: "utf8", spaces: 2 });

@@ -70,2 +139,5 @@ }

const pkg = await fs__default.default.readJson(PKG_PATH);
if (getTypeScriptConfigSchemaPath(pkg)) {
await fs__default.default.remove(node_path.resolve(packageDir, GENERATED_CONFIG_SCHEMA_PATH));
}
const entryPoints$1 = entryPoints.readEntryPoints(pkg);

@@ -164,4 +236,5 @@ for (const entryPoint of entryPoints$1) {

exports.compilePackageConfigSchemas = compilePackageConfigSchemas;
exports.productionPack = productionPack;
exports.revertProductionPack = revertProductionPack;
//# sourceMappingURL=productionPack.cjs.js.map

@@ -1,1 +0,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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"}
{"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":";;;;;;;;;;;;;;AAyBA,MAAM,QAAA,GAAW,cAAA;AACjB,MAAM,eAAA,GAAkB,sBAAA;AACxB,MAAM,4BAAA,GAA+B,oBAAA;AAErC,MAAM,YAAA,GAAe,CAAC,QAAA,EAAU,UAAA,EAAY,KAAK,CAAA;AACjD,MAAM,WAAA,GAAc,CAAC,KAAA,EAAO,MAAA,EAAQ,OAAO,MAAM,CAAA;AAkBjD,SAAS,8BAA8B,GAAA,EAA2B;AAChE,EAAA,MAAM,eAAgB,GAAA,CAAoC,YAAA;AAC1D,EAAA,OAAO,OAAO,YAAA,KAAiB,QAAA,IAAY,aAAa,QAAA,CAAS,OAAO,IACpE,YAAA,GACA,MAAA;AACN;AAEA,eAAsB,4BACpB,QAAA,EACA;AACA,EAAA,MAAM,cAAA,GAAiB,QAAA,CAAS,OAAA,CAAQ,CAAA,GAAA,KAAO;AAC7C,IAAA,MAAM,UAAA,GAAa,6BAAA,CAA8B,GAAA,CAAI,WAAW,CAAA;AAChE,IAAA,OAAO,UAAA,GAAa,CAAC,EAAE,GAAG,KAAK,UAAA,EAAY,IAAI,EAAC;AAAA,EAClD,CAAC,CAAA;AACD,EAAA,IAAI,cAAA,CAAe,WAAW,CAAA,EAAG;AAC/B,IAAA,2BAAW,GAAA,EAA+B;AAAA,EAC5C;AAEA,EAAA,MAAM,MAAA,GAAS,MAAMA,6BAAA,CAAiB;AAAA,IACpC,cAAc,EAAC;AAAA,IACf,cAAc,cAAA,CAAe,GAAA;AAAA,MAAI,CAAA,GAAA,KAC/BC,iBAAA,CAAY,GAAA,CAAI,GAAA,EAAK,cAAc;AAAA,KACrC;AAAA,IACA,0BAAA,EAA4B;AAAA,GAC7B,CAAA;AACD,EAAA,MAAM,UAAA,GAAa,OAAO,SAAA,EAAU;AAOpC,EAAA,MAAM,gBAAgB,IAAI,GAAA;AAAA,IACxB,cAAA,CAAe,GAAA,CAAI,CAAA,GAAA,KAAO,CAAC,GAAA,CAAI,IAAA,EAAMA,iBAAA,CAAY,GAAA,CAAI,GAAA,EAAK,GAAA,CAAI,UAAU,CAAC,CAAC;AAAA,GAC5E;AACA,EAAA,MAAM,MAAA,uBAAa,GAAA,EAA+B;AAClD,EAAA,KAAA,MAAW,KAAA,IAAS,WAAW,OAAA,EAAS;AACtC,IAAA,IACE,aAAA,CAAc,GAAA,CAAI,KAAA,CAAM,WAAW,CAAA,KACnCA,iBAAA,CAAY,OAAA,CAAQ,GAAA,EAAI,EAAG,KAAA,CAAM,IAAI,CAAA,EACrC;AACA,MAAA,MAAA,CAAO,GAAA,CAAI,KAAA,CAAM,WAAA,EAAa,KAAA,CAAM,KAAK,CAAA;AAAA,IAC3C;AAAA,EACF;AACA,EAAA,OAAO,MAAA;AACT;AAEA,eAAsB,eAAe,OAAA,EAAgC;AACnE,EAAA,MAAM,EAAE,UAAA,EAAY,SAAA,EAAU,GAAI,OAAA;AAClC,EAAA,MAAM,OAAA,GAAUA,iBAAA,CAAY,UAAA,EAAY,QAAQ,CAAA;AAChD,EAAA,MAAM,UAAA,GAAa,MAAMC,mBAAA,CAAG,QAAA,CAAS,SAAS,MAAM,CAAA;AACpD,EAAA,MAAM,GAAA,GAAM,IAAA,CAAK,KAAA,CAAM,UAAU,CAAA;AAGjC,EAAA,IAAI,CAAC,SAAA,EAAW;AACd,IAAA,MAAMA,mBAAA,CAAG,SAAA,CAAU,eAAA,EAAiB,UAAU,CAAA;AAAA,EAChD;AAGA,EAAA,MAAM,kBAAA,CAAmB,GAAA,EAAK,UAAA,EAAY,OAAA,CAAQ,uBAAuB,CAAA;AAGzE,EAAA,MAAM,aAAA,GAAgB,GAAA,CAAI,aAAA,IAAiB,EAAC;AAC5C,EAAA,KAAA,MAAW,GAAA,IAAO,MAAA,CAAO,IAAA,CAAK,aAAa,CAAA,EAAG;AAC5C,IAAA,IAAI,CAAC,YAAA,CAAa,QAAA,CAAS,GAAG,CAAA,EAAG;AAC/B,MAAC,GAAA,CAAY,GAAG,CAAA,GAAI,aAAA,CAAc,GAAiC,CAAA;AAAA,IACrE;AAAA,EACF;AAIA,EAAA,IAAI,IAAI,OAAA,EAAS;AACf,IAAA,OAAO,GAAA,CAAI,YAAA;AACX,IAAA,OAAO,GAAA,CAAI,eAAA;AACX,IAAA,OAAO,GAAA,CAAI,gBAAA;AACX,IAAA,OAAO,GAAA,CAAI,oBAAA;AAAA,EACb;AAEA,EAAA,MAAM,sBAAA,GAAyB,8BAA8B,GAAG,CAAA;AAChE,EAAA,IAAI,qBAAA;AACJ,EAAA,IAAI,sBAAA,EAAwB;AAC1B,IAAA,qBAAA,GACE,OAAA,CAAQ,YAAA,IAAA,CAEN,MAAM,2BAAA,CAA4B;AAAA,MAChC,EAAE,IAAA,EAAM,GAAA,CAAI,MAAM,GAAA,EAAK,UAAA,EAAY,aAAa,GAAA;AAAI,KACrD,CAAA,EACD,GAAA,CAAI,GAAA,CAAI,IAAI,CAAA;AAChB,IAAA,IAAI,CAAC,qBAAA,EAAuB;AAC1B,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,2CAAA,EAA8C,GAAA,CAAI,IAAI,CAAA,CAAE,CAAA;AAAA,IAC1E;AAEA,IAAC,IAAoC,YAAA,GACnC,4BAAA;AACF,IAAA,IAAI,IAAI,KAAA,EAAO;AACb,MAAA,GAAA,CAAI,KAAA,GAAQ,IAAI,KAAA,CAAM,GAAA;AAAA,QAAI,CAAA,IAAA,KACxB,IAAA,KAAS,sBAAA,GAAyB,4BAAA,GAA+B;AAAA,OACnE;AACA,MAAA,IAAI,CAAC,GAAA,CAAI,KAAA,CAAM,QAAA,CAAS,4BAA4B,CAAA,EAAG;AACrD,QAAA,GAAA,CAAI,KAAA,CAAM,KAAK,4BAA4B,CAAA;AAAA,MAC7C;AAAA,IACF;AAAA,EACF;AAEA,EAAA,IAAI,SAAA,EAAW;AAEb,IAAA,MAAM,SAAA,GAAY,MAAMC,4BAAA,CAAY;AAAA,MAClC,IAAA,EAAM,UAAA;AAAA;AAAA,MAEN,gBAAA,sBAAsB,GAAA,CAAI;AAAA,QACxB,CAACF,iBAAA,CAAY,UAAA,EAAY,QAAQ,GAAG,GAAG;AAAA,OACxC;AAAA;AAAA,KACF,CAAA;AAED,IAAA,MAAMC,mBAAA,CAAG,UAAU,SAAS,CAAA;AAC5B,IAAA,KAAA,MAAW,QAAA,IAAY,SAAA,CAAU,IAAA,EAAK,EAAG;AACvC,MAAA,IAAI,aAAa,sBAAA,EAAwB;AACvC,QAAA;AAAA,MACF;AACA,MAAA,MAAM,MAAA,GAASD,iBAAA,CAAY,SAAA,EAAW,QAAQ,CAAA;AAC9C,MAAA,IAAI,aAAa,QAAA,EAAU;AACzB,QAAA,MAAMC,mBAAA,CAAG,UAAU,MAAA,EAAQ,GAAA,EAAK,EAAE,QAAA,EAAU,MAAA,EAAQ,MAAA,EAAQ,CAAA,EAAG,CAAA;AAAA,MACjE,CAAA,MAAO;AACL,QAAA,MAAMA,oBAAG,IAAA,CAAKD,iBAAA,CAAY,UAAA,EAAY,QAAQ,GAAG,MAAM,CAAA;AAAA,MACzD;AAAA,IACF;AACA,IAAA,IAAI,qBAAA,EAAuB;AACzB,MAAA,MAAMC,mBAAA,CAAG,SAAA;AAAA,QACPD,iBAAA,CAAY,WAAW,4BAA4B,CAAA;AAAA,QACnD,qBAAA;AAAA,QACA,EAAE,QAAA,EAAU,MAAA,EAAQ,MAAA,EAAQ,CAAA;AAAE,OAChC;AAAA,IACF;AAAA,EACF,CAAA,MAAO;AACL,IAAA,IAAI,qBAAA,EAAuB;AACzB,MAAA,MAAMC,mBAAA,CAAG,SAAA;AAAA,QACPD,iBAAA,CAAY,YAAY,4BAA4B,CAAA;AAAA,QACpD,qBAAA;AAAA,QACA,EAAE,QAAA,EAAU,MAAA,EAAQ,MAAA,EAAQ,CAAA;AAAE,OAChC;AAAA,IACF;AACA,IAAA,MAAMC,mBAAA,CAAG,UAAU,OAAA,EAAS,GAAA,EAAK,EAAE,QAAA,EAAU,MAAA,EAAQ,MAAA,EAAQ,CAAA,EAAG,CAAA;AAAA,EAClE;AACF;AAGA,eAAsB,qBAAqB,UAAA,EAAoB;AAE7D,EAAA,IAAI;AACF,IAAA,MAAMA,oBAAG,IAAA,CAAK,eAAA,EAAiB,UAAU,EAAE,SAAA,EAAW,MAAM,CAAA;AAG5D,IAAA,MAAM,GAAA,GAAM,MAAMA,mBAAA,CAAG,QAAA,CAAS,QAAQ,CAAA;AAEtC,IAAA,IAAI,6BAAA,CAA8B,GAAG,CAAA,EAAG;AACtC,MAAA,MAAMA,mBAAA,CAAG,MAAA,CAAOD,iBAAA,CAAY,UAAA,EAAY,4BAA4B,CAAC,CAAA;AAAA,IACvE;AAGA,IAAA,MAAMG,aAAA,GAAcC,4BAAgB,GAAG,CAAA;AACvC,IAAA,KAAA,MAAW,cAAcD,aAAA,EAAa;AACpC,MAAA,IAAI,WAAW,KAAA,KAAU,GAAA,IAAO,YAAY,QAAA,CAAS,UAAA,CAAW,GAAG,CAAA,EAAG;AACpE,QAAA,MAAMF,oBAAG,MAAA,CAAOD,iBAAA,CAAY,UAAA,EAAY,UAAA,CAAW,IAAI,CAAC,CAAA;AAAA,MAC1D;AAAA,IACF;AAAA,EACF,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,IAAA;AAAA,MACN,mCAAmC,KAAK,CAAA,oFAAA;AAAA,KAE1C;AAAA,EACF;AACF;AAEA,MAAM,UAAA,GAAa;AAAA,EACjB,MAAA,EAAQ,SAAA;AAAA,EACR,OAAA,EAAS,SAAA;AAAA,EACT,KAAA,EAAO;AACT,CAAA;AAOA,eAAe,kBAAA,CACb,GAAA,EACA,UAAA,EACA,uBAAA,EACA;AACA,EAAA,MAAM,QAAA,GAAWA,iBAAA,CAAY,UAAA,EAAY,MAAM,CAAA;AAC/C,EAAA,IAAI,CAAE,MAAMC,mBAAA,CAAG,UAAA,CAAW,QAAQ,CAAA,EAAI;AACpC,IAAA,OAAO,MAAA;AAAA,EACT;AACA,EAAA,MAAM,SAAA,GAAY,MAAMA,mBAAA,CAAG,OAAA,CAAQ,QAAQ,CAAA;AAC3C,EAAA,MAAM,gBAAgB,EAAC;AAEvB,EAAA,MAAME,aAAA,GAAcC,4BAAgB,GAAG,CAAA;AAGvC,EAAA,IAAI,IAAI,aAAA,EAAe;AACrB,IAAA,GAAA,CAAI,aAAA,GAAgB,MAAA;AAAA,EACtB;AAEA,EAAA,KAAA,MAAW,cAAcD,aAAA,EAAa;AACpC,IAAA,IAAI,CAAC,WAAA,CAAY,QAAA,CAAS,UAAA,CAAW,GAAG,CAAA,EAAG;AAEzC,MAAA,aAAA,CAAc,UAAA,CAAW,KAAK,CAAA,GAAI,UAAA,CAAW,IAAA,CAAK,OAAA;AAAA,QAChD,eAAA;AAAA,QACA;AAAA,OACF;AACA,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,MAAM,EAAC;AAEX,IAAA,KAAA,MAAW,CAAC,GAAA,EAAK,GAAG,KAAK,MAAA,CAAO,OAAA,CAAQ,UAAU,CAAA,EAAG;AACnD,MAAA,MAAM,IAAA,GAAO,CAAA,EAAG,UAAA,CAAW,IAAI,GAAG,GAAG,CAAA,CAAA;AACrC,MAAA,IAAI,SAAA,CAAU,QAAA,CAAS,IAAI,CAAA,EAAG;AAC5B,QAAA,GAAA,CAAI,GAAG,CAAA,GAAI,CAAA,EAAA,EAAKE,gBAAU,IAAA,CAAK,CAAA,IAAA,CAAA,EAAQ,IAAI,CAAC,CAAA,CAAA;AAAA,MAC9C;AAAA,IACF;AAGA,IAAA,IAAI,IAAI,KAAA,EAAO;AACb,MAAA,IAAI,CAAC,IAAI,aAAA,EAAe;AACtB,QAAA,GAAA,CAAI,aAAA,GAAgB,EAAE,GAAA,EAAK,EAAC,EAAE;AAAA,MAChC;AACA,MAAA,IAAI,UAAA,CAAW,SAAS,OAAA,EAAS;AAC/B,QAAA,GAAA,CAAI,aAAA,CAAc,GAAG,CAAA,CAAE,UAAA,CAAW,IAAI,CAAA,GAAI;AAAA,UACxC,CAAA,KAAA,EAAQ,WAAW,IAAI,CAAA,KAAA;AAAA,SACzB;AAAA,MACF;AAAA,IACF;AAEA,IAAA,GAAA,CAAI,OAAA,GAAU,GAAA,CAAI,OAAA,IAAW,GAAA,CAAI,MAAA;AAGjC,IAAA,IAAI,GAAA,CAAI,SAAS,uBAAA,EAAyB;AACxC,MAAA,MAAM,kBAAA,GACJ,GAAA,CAAI,SAAA,EAAW,IAAA,IACfC,+CAAA;AAAA,QACE,IAAI,SAAA,EAAW,IAAA;AAAA,QACf,UAAA;AAAA,QACA,uBAAA;AAAA,QACA,GAAA,CAAI;AAAA,OACN;AAEF,MAAA,IAAI,kBAAA,EAAoB;AAQtB,QAAA,GAAA,GAAM,EAAE,SAAA,EAAW,kBAAA,EAAoB,GAAG,GAAA,EAAI;AAG9C,QAAA,GAAA,CAAI,SAAA,GAAY,GAAA,CAAI,SAAA,IAAa,EAAC;AAClC,QAAA,GAAA,CAAI,SAAA,CAAU,QAAA,GAAW,GAAA,CAAI,SAAA,CAAU,YAAY,EAAC;AACpD,QAAA,GAAA,CAAI,SAAA,CAAU,QAAA,CAAS,UAAA,CAAW,KAAK,CAAA,GAAI,kBAAA;AAAA,MAC7C;AAAA,IACF;AAEA,IAAA,IAAI,UAAA,CAAW,UAAU,GAAA,EAAK;AAC5B,MAAA,IAAI,IAAI,OAAA,EAAS;AACf,QAAA,GAAA,CAAI,OAAO,GAAA,CAAI,OAAA;AAAA,MACjB;AACA,MAAA,IAAI,IAAI,MAAA,EAAQ;AACd,QAAA,GAAA,CAAI,SAAS,GAAA,CAAI,MAAA;AAAA,MACnB;AACA,MAAA,IAAI,IAAI,KAAA,EAAO;AACb,QAAA,GAAA,CAAI,QAAQ,GAAA,CAAI,KAAA;AAAA,MAClB;AAAA,IACF;AAEA,IAAA,IAAI,MAAA,CAAO,IAAA,CAAK,GAAG,CAAA,CAAE,SAAS,CAAA,EAAG;AAC/B,MAAA,aAAA,CAAc,UAAA,CAAW,KAAK,CAAA,GAAI,GAAA;AAAA,IACpC;AAAA,EACF;AAGA,EAAA,IAAI,GAAA,CAAI,aAAA,GAAgB,GAAG,CAAA,EAAG;AAC5B,IAAA,GAAA,CAAI,cAAc,GAAG,CAAA,CAAE,cAAc,CAAA,GAAI,CAAC,cAAc,CAAA;AAAA,EAC1D;AAEA,EAAA,IAAI,IAAI,OAAA,EAAS;AACf,IAAA,GAAA,CAAI,OAAA,GAAU,aAAA;AAEd,IAAA,GAAA,CAAI,OAAA,CAAQ,gBAAgB,CAAA,GAAI,gBAAA;AAAA,EAClC;AAEA,EAAA,OAAO,MAAA;AACT;;;;;;"}

@@ -6,2 +6,3 @@ 'use strict';

var node_path = require('node:path');
var zod = require('zod');
var portfinder = require('portfinder');

@@ -45,2 +46,12 @@ var errors = require('@backstage/errors');

}
const connectionSchema = zod.z.object({
host: zod.z.string().optional(),
port: zod.z.number().optional(),
user: zod.z.string().optional(),
password: zod.z.string().optional(),
flags: zod.z.object({
postgres: zod.z.array(zod.z.string()).optional(),
initdb: zod.z.array(zod.z.string()).optional()
}).optional()
});
async function startEmbeddedDb(options) {

@@ -82,2 +93,4 @@ const dbConfig = await readDatabaseConfig(

persistent: false,
...userConfig?.flags?.postgres ? { postgresFlags: userConfig.flags.postgres } : {},
...userConfig?.flags?.initdb ? { initdbFlags: userConfig.flags.initdb } : {},
onError(messageOrError) {

@@ -145,12 +158,4 @@ console.error(`[embedded-postgres]`, messageOrError);

const rawConnection = config.getOptional("backend.database.connection");
if (typeof rawConnection === "string" || rawConnection === void 0) {
return { client };
}
const host = config.getOptionalString("backend.database.connection.host");
const port = config.getOptionalNumber("backend.database.connection.port");
const user = config.getOptionalString("backend.database.connection.user");
const password = config.getOptionalString(
"backend.database.connection.password"
);
const connection = host !== void 0 || port !== void 0 || user !== void 0 || password !== void 0 ? { host, port, user, password } : void 0;
const connectionResult = connectionSchema.safeParse(rawConnection);
const connection = connectionResult.success ? connectionResult.data : void 0;
return { client, connection };

@@ -157,0 +162,0 @@ } finally {

@@ -1,1 +0,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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"}
{"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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"}

@@ -6,3 +6,3 @@ 'use strict';

var name = "@backstage/cli-module-build";
var version = "0.1.4";
var version = "0.1.5-next.0";
var description = "CLI module for Backstage CLI";

@@ -106,3 +106,4 @@ var backstage = {

"yml-loader": "^2.1.0",
yn: "^4.0.0"
yn: "^4.0.0",
zod: "^3.25.76 || ^4.0.0"
};

@@ -109,0 +110,0 @@ var devDependencies = {

@@ -1,1 +0,1 @@

{"version":3,"file":"package.json.cjs.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
{"version":3,"file":"package.json.cjs.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
{
"name": "@backstage/cli-module-build",
"version": "0.1.4",
"version": "0.1.5-next.0",
"description": "CLI module for Backstage CLI",

@@ -43,8 +43,8 @@ "backstage": {

"dependencies": {
"@backstage/cli-common": "^0.2.2",
"@backstage/cli-node": "^0.3.3",
"@backstage/config": "^1.3.8",
"@backstage/config-loader": "^1.10.12",
"@backstage/errors": "^1.3.1",
"@backstage/module-federation-common": "^0.1.4",
"@backstage/cli-common": "0.2.2",
"@backstage/cli-node": "0.3.3",
"@backstage/config": "1.3.8",
"@backstage/config-loader": "1.11.0-next.0",
"@backstage/errors": "1.3.1",
"@backstage/module-federation-common": "0.1.4",
"@manypkg/get-packages": "^1.1.3",

@@ -103,7 +103,8 @@ "@module-federation/enhanced": "^2.3.3",

"yml-loader": "^2.1.0",
"yn": "^4.0.0"
"yn": "^4.0.0",
"zod": "^3.25.76 || ^4.0.0"
},
"devDependencies": {
"@backstage/backend-test-utils": "^1.11.4",
"@backstage/cli": "^0.36.3",
"@backstage/backend-test-utils": "1.11.5-next.0",
"@backstage/cli": "0.36.4-next.0",
"@types/fs-extra": "^11.0.0",

@@ -110,0 +111,0 @@ "@types/lodash": "^4.14.151",