@backstage/cli-module-build 0.0.0-nightly-20260317031259

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (103) hide show
  1. package/CHANGELOG.md +18 -0
  2. package/README.md +23 -0
  3. package/bin/backstage-cli-module-build +32 -0
  4. package/config/webpack-public-path.js +31 -0
  5. package/dist/commands/buildWorkspace.cjs.js +53 -0
  6. package/dist/commands/buildWorkspace.cjs.js.map +1 -0
  7. package/dist/commands/package/build/command.cjs.js +136 -0
  8. package/dist/commands/package/build/command.cjs.js.map +1 -0
  9. package/dist/commands/package/build/index.cjs.js +10 -0
  10. package/dist/commands/package/build/index.cjs.js.map +1 -0
  11. package/dist/commands/package/bundle/command.cjs.js +691 -0
  12. package/dist/commands/package/bundle/command.cjs.js.map +1 -0
  13. package/dist/commands/package/bundle/index.cjs.js +10 -0
  14. package/dist/commands/package/bundle/index.cjs.js.map +1 -0
  15. package/dist/commands/package/clean.cjs.js +21 -0
  16. package/dist/commands/package/clean.cjs.js.map +1 -0
  17. package/dist/commands/package/postpack.cjs.js +15 -0
  18. package/dist/commands/package/postpack.cjs.js.map +1 -0
  19. package/dist/commands/package/prepack.cjs.js +29 -0
  20. package/dist/commands/package/prepack.cjs.js.map +1 -0
  21. package/dist/commands/package/start/command.cjs.js +80 -0
  22. package/dist/commands/package/start/command.cjs.js.map +1 -0
  23. package/dist/commands/package/start/index.cjs.js +10 -0
  24. package/dist/commands/package/start/index.cjs.js.map +1 -0
  25. package/dist/commands/package/start/resolveLinkedWorkspace.cjs.js +34 -0
  26. package/dist/commands/package/start/resolveLinkedWorkspace.cjs.js.map +1 -0
  27. package/dist/commands/package/start/startBackend.cjs.js +46 -0
  28. package/dist/commands/package/start/startBackend.cjs.js.map +1 -0
  29. package/dist/commands/package/start/startFrontend.cjs.js +49 -0
  30. package/dist/commands/package/start/startFrontend.cjs.js.map +1 -0
  31. package/dist/commands/package/start/startPackage.cjs.js +53 -0
  32. package/dist/commands/package/start/startPackage.cjs.js.map +1 -0
  33. package/dist/commands/repo/build.cjs.js +149 -0
  34. package/dist/commands/repo/build.cjs.js.map +1 -0
  35. package/dist/commands/repo/clean.cjs.js +41 -0
  36. package/dist/commands/repo/clean.cjs.js.map +1 -0
  37. package/dist/commands/repo/start.cjs.js +199 -0
  38. package/dist/commands/repo/start.cjs.js.map +1 -0
  39. package/dist/index.cjs.js +74 -0
  40. package/dist/index.cjs.js.map +1 -0
  41. package/dist/index.d.ts +5 -0
  42. package/dist/lib/buildBackend.cjs.js +81 -0
  43. package/dist/lib/buildBackend.cjs.js.map +1 -0
  44. package/dist/lib/buildFrontend.cjs.js +49 -0
  45. package/dist/lib/buildFrontend.cjs.js.map +1 -0
  46. package/dist/lib/builder/config.cjs.js +257 -0
  47. package/dist/lib/builder/config.cjs.js.map +1 -0
  48. package/dist/lib/builder/packager.cjs.js +131 -0
  49. package/dist/lib/builder/packager.cjs.js.map +1 -0
  50. package/dist/lib/builder/plugins.cjs.js +125 -0
  51. package/dist/lib/builder/plugins.cjs.js.map +1 -0
  52. package/dist/lib/builder/types.cjs.js +10 -0
  53. package/dist/lib/builder/types.cjs.js.map +1 -0
  54. package/dist/lib/bundler/ConfigInjectingHtmlWebpackPlugin.cjs.js +43 -0
  55. package/dist/lib/bundler/ConfigInjectingHtmlWebpackPlugin.cjs.js.map +1 -0
  56. package/dist/lib/bundler/bundle.cjs.js +189 -0
  57. package/dist/lib/bundler/bundle.cjs.js.map +1 -0
  58. package/dist/lib/bundler/config.cjs.js +309 -0
  59. package/dist/lib/bundler/config.cjs.js.map +1 -0
  60. package/dist/lib/bundler/hasReactDomClient.cjs.js +17 -0
  61. package/dist/lib/bundler/hasReactDomClient.cjs.js.map +1 -0
  62. package/dist/lib/bundler/linkWorkspaces.cjs.js +34 -0
  63. package/dist/lib/bundler/linkWorkspaces.cjs.js.map +1 -0
  64. package/dist/lib/bundler/moduleFederation.cjs.js +135 -0
  65. package/dist/lib/bundler/moduleFederation.cjs.js.map +1 -0
  66. package/dist/lib/bundler/optimization.cjs.js +68 -0
  67. package/dist/lib/bundler/optimization.cjs.js.map +1 -0
  68. package/dist/lib/bundler/packageDetection.cjs.js +124 -0
  69. package/dist/lib/bundler/packageDetection.cjs.js.map +1 -0
  70. package/dist/lib/bundler/paths.cjs.js +62 -0
  71. package/dist/lib/bundler/paths.cjs.js.map +1 -0
  72. package/dist/lib/bundler/server.cjs.js +231 -0
  73. package/dist/lib/bundler/server.cjs.js.map +1 -0
  74. package/dist/lib/bundler/transforms.cjs.js +145 -0
  75. package/dist/lib/bundler/transforms.cjs.js.map +1 -0
  76. package/dist/lib/config.cjs.js +94 -0
  77. package/dist/lib/config.cjs.js.map +1 -0
  78. package/dist/lib/entryPoints.cjs.js +49 -0
  79. package/dist/lib/entryPoints.cjs.js.map +1 -0
  80. package/dist/lib/ipc/IpcServer.cjs.js +60 -0
  81. package/dist/lib/ipc/IpcServer.cjs.js.map +1 -0
  82. package/dist/lib/ipc/ServerDataStore.cjs.js +36 -0
  83. package/dist/lib/ipc/ServerDataStore.cjs.js.map +1 -0
  84. package/dist/lib/optionsParser.cjs.js +22 -0
  85. package/dist/lib/optionsParser.cjs.js.map +1 -0
  86. package/dist/lib/packager/createDistWorkspace.cjs.js +252 -0
  87. package/dist/lib/packager/createDistWorkspace.cjs.js.map +1 -0
  88. package/dist/lib/packager/productionPack.cjs.js +160 -0
  89. package/dist/lib/packager/productionPack.cjs.js.map +1 -0
  90. package/dist/lib/publishing.cjs.js +40 -0
  91. package/dist/lib/publishing.cjs.js.map +1 -0
  92. package/dist/lib/role.cjs.js +24 -0
  93. package/dist/lib/role.cjs.js.map +1 -0
  94. package/dist/lib/runner/runBackend.cjs.js +136 -0
  95. package/dist/lib/runner/runBackend.cjs.js.map +1 -0
  96. package/dist/lib/typeDistProject.cjs.js +89 -0
  97. package/dist/lib/typeDistProject.cjs.js.map +1 -0
  98. package/dist/lib/urls.cjs.js +13 -0
  99. package/dist/lib/urls.cjs.js.map +1 -0
  100. package/dist/package.json.cjs.js +143 -0
  101. package/dist/package.json.cjs.js.map +1 -0
  102. package/package.json +113 -0
  103. package/templates/serve_index.html +27 -0
@@ -0,0 +1,149 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ var chalk = require('chalk');
6
+ var cleye = require('cleye');
7
+ var node_path = require('node:path');
8
+ var packager = require('../../lib/builder/packager.cjs.js');
9
+ var cliCommon = require('@backstage/cli-common');
10
+ var cliNode = require('@backstage/cli-node');
11
+ var buildFrontend = require('../../lib/buildFrontend.cjs.js');
12
+ var buildBackend = require('../../lib/buildBackend.cjs.js');
13
+ var optionsParser = require('../../lib/optionsParser.cjs.js');
14
+
15
+ function _interopDefaultCompat (e) { return e && typeof e === 'object' && 'default' in e ? e : { default: e }; }
16
+
17
+ var chalk__default = /*#__PURE__*/_interopDefaultCompat(chalk);
18
+
19
+ var build = async ({ args, info }) => {
20
+ const {
21
+ flags: { all, since, minify }
22
+ } = cleye.cli(
23
+ {
24
+ help: info,
25
+ booleanFlagNegation: true,
26
+ flags: {
27
+ all: {
28
+ type: Boolean,
29
+ description: "Build all packages, including bundled app and backend packages."
30
+ },
31
+ since: {
32
+ type: String,
33
+ description: "Only build packages and their dev dependents that changed since the specified ref"
34
+ },
35
+ minify: {
36
+ type: Boolean,
37
+ description: "Minify the generated code. Does not apply to app package (app is minified by default)."
38
+ }
39
+ }
40
+ },
41
+ void 0,
42
+ args
43
+ );
44
+ let packages = await cliNode.PackageGraph.listTargetPackages();
45
+ const webpack = process.env.LEGACY_WEBPACK_BUILD ? require("webpack") : void 0;
46
+ if (since) {
47
+ const graph = cliNode.PackageGraph.fromPackages(packages);
48
+ const changedPackages = await graph.listChangedPackages({
49
+ ref: since,
50
+ analyzeLockfile: true
51
+ });
52
+ const withDevDependents = graph.collectPackageNames(
53
+ changedPackages.map((pkg) => pkg.name),
54
+ (pkg) => pkg.localDevDependents.keys()
55
+ );
56
+ packages = Array.from(withDevDependents).map((name) => graph.get(name));
57
+ }
58
+ const apps = new Array();
59
+ const backends = new Array();
60
+ const parseBuildScript = optionsParser.createScriptOptionsParser(["package", "build"], {
61
+ role: { type: "string" },
62
+ minify: { type: "boolean" },
63
+ "skip-build-dependencies": { type: "boolean" },
64
+ stats: { type: "boolean" },
65
+ config: { type: "string", multiple: true },
66
+ "module-federation": { type: "boolean" }
67
+ });
68
+ const options = packages.flatMap((pkg) => {
69
+ const role = pkg.packageJson.backstage?.role ?? cliNode.PackageRoles.detectRoleFromPackage(pkg.packageJson);
70
+ if (!role) {
71
+ console.warn(`Ignored ${pkg.packageJson.name} because it has no role`);
72
+ return [];
73
+ }
74
+ if (role === "frontend") {
75
+ apps.push(pkg);
76
+ return [];
77
+ } else if (role === "backend") {
78
+ backends.push(pkg);
79
+ return [];
80
+ }
81
+ const outputs = packager.getOutputsForRole(role);
82
+ if (outputs.size === 0) {
83
+ console.warn(`Ignored ${pkg.packageJson.name} because it has no output`);
84
+ return [];
85
+ }
86
+ const buildOptions = parseBuildScript(pkg.packageJson.scripts?.build);
87
+ if (!buildOptions) {
88
+ console.warn(
89
+ `Ignored ${pkg.packageJson.name} because it does not have a matching build script`
90
+ );
91
+ return [];
92
+ }
93
+ return {
94
+ targetDir: pkg.dir,
95
+ packageJson: pkg.packageJson,
96
+ outputs,
97
+ logPrefix: `${chalk__default.default.cyan(node_path.relative(cliCommon.targetPaths.rootDir, pkg.dir))}: `,
98
+ workspacePackages: packages,
99
+ minify: minify ?? Boolean(buildOptions.minify)
100
+ };
101
+ });
102
+ console.log("Building packages");
103
+ await packager.buildPackages(options);
104
+ if (all) {
105
+ console.log("Building apps");
106
+ await cliNode.runConcurrentTasks({
107
+ items: apps,
108
+ concurrencyFactor: 1 / 2,
109
+ worker: async (pkg) => {
110
+ const buildOptions = parseBuildScript(pkg.packageJson.scripts?.build);
111
+ if (!buildOptions) {
112
+ console.warn(
113
+ `Ignored ${pkg.packageJson.name} because it does not have a matching build script`
114
+ );
115
+ return;
116
+ }
117
+ const configPaths = buildOptions.config;
118
+ await buildFrontend.buildFrontend({
119
+ targetDir: pkg.dir,
120
+ configPaths: Array.isArray(configPaths) ? configPaths : [],
121
+ writeStats: Boolean(buildOptions.stats),
122
+ webpack
123
+ });
124
+ }
125
+ });
126
+ console.log("Building backends");
127
+ await cliNode.runConcurrentTasks({
128
+ items: backends,
129
+ concurrencyFactor: 1 / 2,
130
+ worker: async (pkg) => {
131
+ const buildOptions = parseBuildScript(pkg.packageJson.scripts?.build);
132
+ if (!buildOptions) {
133
+ console.warn(
134
+ `Ignored ${pkg.packageJson.name} because it does not have a matching build script`
135
+ );
136
+ return;
137
+ }
138
+ await buildBackend.buildBackend({
139
+ targetDir: pkg.dir,
140
+ skipBuildDependencies: true,
141
+ minify: minify ?? Boolean(buildOptions.minify)
142
+ });
143
+ }
144
+ });
145
+ }
146
+ };
147
+
148
+ exports.default = build;
149
+ //# sourceMappingURL=build.cjs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build.cjs.js","sources":["../../../src/commands/repo/build.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 { cli } from 'cleye';\nimport { relative as relativePath } from 'node:path';\nimport { buildPackages, getOutputsForRole } from '../../lib/builder';\nimport { targetPaths } from '@backstage/cli-common';\n\nimport {\n BackstagePackage,\n PackageGraph,\n PackageRoles,\n runConcurrentTasks,\n} from '@backstage/cli-node';\nimport { buildFrontend } from '../../lib/buildFrontend';\nimport { buildBackend } from '../../lib/buildBackend';\nimport { createScriptOptionsParser } from '../../lib/optionsParser';\nimport type { CliCommandContext } from '@backstage/cli-node';\n\nexport default async ({ args, info }: CliCommandContext) => {\n const {\n flags: { all, since, minify },\n } = cli(\n {\n help: info,\n booleanFlagNegation: true,\n flags: {\n all: {\n type: Boolean,\n description:\n 'Build all packages, including bundled app and backend packages.',\n },\n since: {\n type: String,\n description:\n 'Only build packages and their dev dependents that changed since the specified ref',\n },\n minify: {\n type: Boolean,\n description:\n 'Minify the generated code. Does not apply to app package (app is minified by default).',\n },\n },\n },\n undefined,\n args,\n );\n\n let packages = await PackageGraph.listTargetPackages();\n\n const webpack = process.env.LEGACY_WEBPACK_BUILD\n ? (require('webpack') as typeof import('webpack'))\n : undefined;\n\n if (since) {\n const graph = PackageGraph.fromPackages(packages);\n const changedPackages = await graph.listChangedPackages({\n ref: since,\n analyzeLockfile: true,\n });\n const withDevDependents = graph.collectPackageNames(\n changedPackages.map(pkg => pkg.name),\n pkg => pkg.localDevDependents.keys(),\n );\n packages = Array.from(withDevDependents).map(name => graph.get(name)!);\n }\n\n const apps = new Array<BackstagePackage>();\n const backends = new Array<BackstagePackage>();\n\n const parseBuildScript = createScriptOptionsParser(['package', 'build'], {\n role: { type: 'string' },\n minify: { type: 'boolean' },\n 'skip-build-dependencies': { type: 'boolean' },\n stats: { type: 'boolean' },\n config: { type: 'string', multiple: true },\n 'module-federation': { type: 'boolean' },\n });\n\n const options = packages.flatMap(pkg => {\n const role =\n pkg.packageJson.backstage?.role ??\n PackageRoles.detectRoleFromPackage(pkg.packageJson);\n if (!role) {\n console.warn(`Ignored ${pkg.packageJson.name} because it has no role`);\n return [];\n }\n\n if (role === 'frontend') {\n apps.push(pkg);\n return [];\n } else if (role === 'backend') {\n backends.push(pkg);\n return [];\n }\n\n const outputs = getOutputsForRole(role);\n if (outputs.size === 0) {\n console.warn(`Ignored ${pkg.packageJson.name} because it has no output`);\n return [];\n }\n\n const buildOptions = parseBuildScript(pkg.packageJson.scripts?.build);\n if (!buildOptions) {\n console.warn(\n `Ignored ${pkg.packageJson.name} because it does not have a matching build script`,\n );\n return [];\n }\n\n return {\n targetDir: pkg.dir,\n packageJson: pkg.packageJson,\n outputs,\n logPrefix: `${chalk.cyan(relativePath(targetPaths.rootDir, pkg.dir))}: `,\n workspacePackages: packages,\n minify: minify ?? Boolean(buildOptions.minify),\n };\n });\n\n console.log('Building packages');\n await buildPackages(options);\n\n if (all) {\n console.log('Building apps');\n await runConcurrentTasks({\n items: apps,\n concurrencyFactor: 1 / 2,\n worker: async pkg => {\n const buildOptions = parseBuildScript(pkg.packageJson.scripts?.build);\n if (!buildOptions) {\n console.warn(\n `Ignored ${pkg.packageJson.name} because it does not have a matching build script`,\n );\n return;\n }\n const configPaths = buildOptions.config;\n await buildFrontend({\n targetDir: pkg.dir,\n configPaths: Array.isArray(configPaths)\n ? (configPaths as string[])\n : [],\n writeStats: Boolean(buildOptions.stats),\n webpack,\n });\n },\n });\n\n console.log('Building backends');\n await runConcurrentTasks({\n items: backends,\n concurrencyFactor: 1 / 2,\n worker: async pkg => {\n const buildOptions = parseBuildScript(pkg.packageJson.scripts?.build);\n if (!buildOptions) {\n console.warn(\n `Ignored ${pkg.packageJson.name} because it does not have a matching build script`,\n );\n return;\n }\n await buildBackend({\n targetDir: pkg.dir,\n skipBuildDependencies: true,\n minify: minify ?? Boolean(buildOptions.minify),\n });\n },\n });\n }\n};\n"],"names":["cli","PackageGraph","createScriptOptionsParser","PackageRoles","getOutputsForRole","chalk","relativePath","targetPaths","buildPackages","runConcurrentTasks","buildFrontend","buildBackend"],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ var cleye = require('cleye');
6
+ var fs = require('fs-extra');
7
+ var node_path = require('node:path');
8
+ var cliNode = require('@backstage/cli-node');
9
+ var cliCommon = require('@backstage/cli-common');
10
+
11
+ function _interopDefaultCompat (e) { return e && typeof e === 'object' && 'default' in e ? e : { default: e }; }
12
+
13
+ var fs__default = /*#__PURE__*/_interopDefaultCompat(fs);
14
+
15
+ var clean = async ({ args, info }) => {
16
+ cleye.cli({ help: info, booleanFlagNegation: true }, void 0, args);
17
+ const packages = await cliNode.PackageGraph.listTargetPackages();
18
+ await fs__default.default.remove(cliCommon.targetPaths.resolveRoot("dist"));
19
+ await fs__default.default.remove(cliCommon.targetPaths.resolveRoot("dist-types"));
20
+ await fs__default.default.remove(cliCommon.targetPaths.resolveRoot("coverage"));
21
+ await Promise.all(
22
+ Array.from(Array(10), async () => {
23
+ while (packages.length > 0) {
24
+ const pkg = packages.pop();
25
+ const cleanScript = pkg.packageJson.scripts?.clean;
26
+ if (cleanScript === "backstage-cli clean" || cleanScript === "backstage-cli package clean") {
27
+ await fs__default.default.remove(node_path.resolve(pkg.dir, "dist"));
28
+ await fs__default.default.remove(node_path.resolve(pkg.dir, "dist-types"));
29
+ await fs__default.default.remove(node_path.resolve(pkg.dir, "coverage"));
30
+ } else if (cleanScript) {
31
+ await cliCommon.run(["yarn", "run", "clean"], {
32
+ cwd: pkg.dir
33
+ }).waitForExit();
34
+ }
35
+ }
36
+ })
37
+ );
38
+ };
39
+
40
+ exports.default = clean;
41
+ //# sourceMappingURL=clean.cjs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clean.cjs.js","sources":["../../../src/commands/repo/clean.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 { cli } from 'cleye';\nimport fs from 'fs-extra';\nimport { resolve as resolvePath } from 'node:path';\nimport { PackageGraph } from '@backstage/cli-node';\nimport { run, targetPaths } from '@backstage/cli-common';\nimport type { CliCommandContext } from '@backstage/cli-node';\n\nexport default async ({ args, info }: CliCommandContext) => {\n cli({ help: info, booleanFlagNegation: true }, undefined, args);\n const packages = await PackageGraph.listTargetPackages();\n\n await fs.remove(targetPaths.resolveRoot('dist'));\n await fs.remove(targetPaths.resolveRoot('dist-types'));\n await fs.remove(targetPaths.resolveRoot('coverage'));\n\n await Promise.all(\n Array.from(Array(10), async () => {\n while (packages.length > 0) {\n const pkg = packages.pop()!;\n const cleanScript = pkg.packageJson.scripts?.clean;\n\n if (\n cleanScript === 'backstage-cli clean' ||\n cleanScript === 'backstage-cli package clean'\n ) {\n await fs.remove(resolvePath(pkg.dir, 'dist'));\n await fs.remove(resolvePath(pkg.dir, 'dist-types'));\n await fs.remove(resolvePath(pkg.dir, 'coverage'));\n } else if (cleanScript) {\n await run(['yarn', 'run', 'clean'], {\n cwd: pkg.dir,\n }).waitForExit();\n }\n }\n }),\n );\n};\n"],"names":["cli","PackageGraph","fs","targetPaths","resolvePath","run"],"mappings":";;;;;;;;;;;;;;AAuBA,YAAe,OAAO,EAAE,IAAA,EAAM,IAAA,EAAK,KAAyB;AAC1D,EAAAA,SAAA,CAAI,EAAE,IAAA,EAAM,IAAA,EAAM,qBAAqB,IAAA,EAAK,EAAG,QAAW,IAAI,CAAA;AAC9D,EAAA,MAAM,QAAA,GAAW,MAAMC,oBAAA,CAAa,kBAAA,EAAmB;AAEvD,EAAA,MAAMC,mBAAA,CAAG,MAAA,CAAOC,qBAAA,CAAY,WAAA,CAAY,MAAM,CAAC,CAAA;AAC/C,EAAA,MAAMD,mBAAA,CAAG,MAAA,CAAOC,qBAAA,CAAY,WAAA,CAAY,YAAY,CAAC,CAAA;AACrD,EAAA,MAAMD,mBAAA,CAAG,MAAA,CAAOC,qBAAA,CAAY,WAAA,CAAY,UAAU,CAAC,CAAA;AAEnD,EAAA,MAAM,OAAA,CAAQ,GAAA;AAAA,IACZ,KAAA,CAAM,IAAA,CAAK,KAAA,CAAM,EAAE,GAAG,YAAY;AAChC,MAAA,OAAO,QAAA,CAAS,SAAS,CAAA,EAAG;AAC1B,QAAA,MAAM,GAAA,GAAM,SAAS,GAAA,EAAI;AACzB,QAAA,MAAM,WAAA,GAAc,GAAA,CAAI,WAAA,CAAY,OAAA,EAAS,KAAA;AAE7C,QAAA,IACE,WAAA,KAAgB,qBAAA,IAChB,WAAA,KAAgB,6BAAA,EAChB;AACA,UAAA,MAAMD,oBAAG,MAAA,CAAOE,iBAAA,CAAY,GAAA,CAAI,GAAA,EAAK,MAAM,CAAC,CAAA;AAC5C,UAAA,MAAMF,oBAAG,MAAA,CAAOE,iBAAA,CAAY,GAAA,CAAI,GAAA,EAAK,YAAY,CAAC,CAAA;AAClD,UAAA,MAAMF,oBAAG,MAAA,CAAOE,iBAAA,CAAY,GAAA,CAAI,GAAA,EAAK,UAAU,CAAC,CAAA;AAAA,QAClD,WAAW,WAAA,EAAa;AACtB,UAAA,MAAMC,aAAA,CAAI,CAAC,MAAA,EAAQ,KAAA,EAAO,OAAO,CAAA,EAAG;AAAA,YAClC,KAAK,GAAA,CAAI;AAAA,WACV,EAAE,WAAA,EAAY;AAAA,QACjB;AAAA,MACF;AAAA,IACF,CAAC;AAAA,GACH;AACF,CAAA;;;;"}
@@ -0,0 +1,199 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ var cliNode = require('@backstage/cli-node');
6
+ var node_path = require('node:path');
7
+ var cliCommon = require('@backstage/cli-common');
8
+ var cleye = require('cleye');
9
+ var resolveLinkedWorkspace = require('../package/start/resolveLinkedWorkspace.cjs.js');
10
+ var startPackage = require('../package/start/startPackage.cjs.js');
11
+ var node_util = require('node:util');
12
+
13
+ const ACCEPTED_PACKAGE_ROLES = [
14
+ "frontend",
15
+ "backend",
16
+ "frontend-plugin",
17
+ "backend-plugin"
18
+ ];
19
+ var start = async ({ args, info }) => {
20
+ const {
21
+ flags: { plugin, config, require: requirePath, link, inspect, inspectBrk },
22
+ _: namesOrPaths
23
+ } = cleye.cli(
24
+ {
25
+ help: { ...info, usage: `${info.usage} [packages...]` },
26
+ booleanFlagNegation: true,
27
+ parameters: ["[packages...]"],
28
+ flags: {
29
+ plugin: {
30
+ type: [String],
31
+ description: "Start the dev entry-point for any matching plugin package in the repo",
32
+ default: []
33
+ },
34
+ config: {
35
+ type: [String],
36
+ description: "Config files to load instead of app-config.yaml",
37
+ default: []
38
+ },
39
+ require: {
40
+ type: String,
41
+ description: "Add a --require argument to the node process. Applies to backend package only"
42
+ },
43
+ link: {
44
+ type: String,
45
+ description: "Link an external workspace for module resolution"
46
+ },
47
+ inspect: {
48
+ type: String,
49
+ description: "Enable the Node.js inspector, optionally at a specific host:port"
50
+ },
51
+ inspectBrk: {
52
+ type: String,
53
+ description: "Enable the Node.js inspector and break before user code starts"
54
+ }
55
+ }
56
+ },
57
+ void 0,
58
+ args
59
+ );
60
+ const targetPackages = await findTargetPackages(namesOrPaths, plugin);
61
+ const packageOptions = await resolvePackageOptions(targetPackages, {
62
+ config,
63
+ inspect: inspect || (inspect === "" ? true : void 0),
64
+ inspectBrk: inspectBrk || (inspectBrk === "" ? true : void 0),
65
+ require: requirePath,
66
+ link
67
+ });
68
+ if (packageOptions.length === 0) {
69
+ console.log("No packages found to start");
70
+ return;
71
+ }
72
+ console.log(
73
+ `Starting ${packageOptions.map(({ pkg }) => pkg.packageJson.name).join(", ")}`
74
+ );
75
+ await Promise.all(packageOptions.map((entry) => startPackage.startPackage(entry.options)));
76
+ };
77
+ async function findTargetPackages(namesOrPaths, pluginIds) {
78
+ const targetPackages = new Array();
79
+ const packages = await cliNode.PackageGraph.listTargetPackages();
80
+ for (const pluginId of pluginIds) {
81
+ const matchingPackages = packages.filter((pkg) => {
82
+ return pluginId === pkg.packageJson.backstage?.pluginId && ACCEPTED_PACKAGE_ROLES.includes(pkg.packageJson.backstage.role);
83
+ });
84
+ if (matchingPackages.length === 0) {
85
+ throw new Error(
86
+ `Unable to find any plugin packages with plugin ID '${pluginId}'. Make sure backstage.pluginId is set in your package.json files by running 'yarn fix --publish'.`
87
+ );
88
+ }
89
+ targetPackages.push(...matchingPackages);
90
+ }
91
+ if (targetPackages.length > 0) {
92
+ return targetPackages;
93
+ }
94
+ for (const nameOrPath of namesOrPaths) {
95
+ let matchingPackage = packages.find(
96
+ (pkg) => nameOrPath === pkg.packageJson.name
97
+ );
98
+ if (!matchingPackage) {
99
+ const absPath = cliCommon.targetPaths.resolveRoot(nameOrPath);
100
+ matchingPackage = packages.find(
101
+ (pkg) => node_path.relative(pkg.dir, absPath) === ""
102
+ );
103
+ }
104
+ if (!matchingPackage) {
105
+ throw new Error(`Unable to find package by name '${nameOrPath}'`);
106
+ }
107
+ targetPackages.push(matchingPackage);
108
+ }
109
+ if (targetPackages.length > 0) {
110
+ return targetPackages;
111
+ }
112
+ for (const role of ["frontend", "backend"]) {
113
+ const matchingPackages = packages.filter(
114
+ (pkg) => pkg.packageJson.backstage?.role === role
115
+ );
116
+ if (matchingPackages.length > 1) {
117
+ const expectedPath = cliCommon.targetPaths.resolveRoot(
118
+ role === "frontend" ? "packages/app" : "packages/backend"
119
+ );
120
+ const matchByPath = matchingPackages.find(
121
+ (pkg) => node_path.relative(expectedPath, pkg.dir) === ""
122
+ );
123
+ if (matchByPath) {
124
+ targetPackages.push(matchByPath);
125
+ continue;
126
+ }
127
+ throw new Error(
128
+ `Found multiple packages with role '${role}' but none of the use the default path '${expectedPath}',choose which packages you want to run by passing the package names explicitly as arguments, for example 'yarn backstage-cli repo start my-app my-backend'.`
129
+ );
130
+ }
131
+ targetPackages.push(...matchingPackages);
132
+ }
133
+ if (targetPackages.length > 0) {
134
+ return targetPackages;
135
+ }
136
+ for (const role of ["frontend-plugin", "backend-plugin"]) {
137
+ const matchingPackages = packages.filter(
138
+ (pkg) => pkg.packageJson.backstage?.role === role
139
+ );
140
+ if (matchingPackages.length > 1) {
141
+ throw new Error(
142
+ `Found multiple packages with role '${role}', please choose which packages you want to run by passing the package names explicitly as arguments, for example 'yarn backstage-cli repo start my-plugin my-plugin-backend'.`
143
+ );
144
+ }
145
+ targetPackages.push(...matchingPackages);
146
+ }
147
+ if (targetPackages.length > 0) {
148
+ return targetPackages;
149
+ }
150
+ throw new Error(
151
+ `Unable to find any packages with role 'frontend', 'backend', 'frontend-plugin', or 'backend-plugin'.`
152
+ );
153
+ }
154
+ async function resolvePackageOptions(targetPackages, options) {
155
+ const linkedWorkspace = await resolveLinkedWorkspace.resolveLinkedWorkspace(options.link);
156
+ return targetPackages.flatMap((pkg) => {
157
+ const startScript = pkg.packageJson.scripts?.start;
158
+ if (!startScript) {
159
+ console.log(
160
+ `No start script found for package ${pkg.packageJson.name}, skipping...`
161
+ );
162
+ return [];
163
+ }
164
+ const { values: parsedOpts } = node_util.parseArgs({
165
+ args: startScript.split(" "),
166
+ strict: false,
167
+ options: {
168
+ config: {
169
+ type: "string",
170
+ multiple: true
171
+ },
172
+ require: {
173
+ type: "string"
174
+ }
175
+ }
176
+ });
177
+ const parsedRequire = typeof parsedOpts.require === "string" ? parsedOpts.require : void 0;
178
+ const parsedConfig = parsedOpts.config?.filter((c) => typeof c === "string") ?? [];
179
+ return [
180
+ {
181
+ pkg,
182
+ options: {
183
+ role: pkg.packageJson.backstage?.role,
184
+ targetDir: pkg.dir,
185
+ configPaths: options.config.length > 0 ? options.config : parsedConfig,
186
+ checksEnabled: false,
187
+ linkedWorkspace,
188
+ inspectEnabled: options.inspect,
189
+ inspectBrkEnabled: options.inspectBrk,
190
+ require: options.require ?? parsedRequire
191
+ }
192
+ }
193
+ ];
194
+ });
195
+ }
196
+
197
+ exports.default = start;
198
+ exports.findTargetPackages = findTargetPackages;
199
+ //# sourceMappingURL=start.cjs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"start.cjs.js","sources":["../../../src/commands/repo/start.ts"],"sourcesContent":["/*\n * Copyright 2025 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 BackstagePackage,\n PackageGraph,\n PackageRole,\n} from '@backstage/cli-node';\nimport { relative as relativePath } from 'node:path';\nimport { targetPaths } from '@backstage/cli-common';\nimport { cli } from 'cleye';\n\nimport { resolveLinkedWorkspace } from '../package/start/resolveLinkedWorkspace';\nimport { startPackage } from '../package/start/startPackage';\nimport { parseArgs } from 'node:util';\nimport type { CliCommandContext } from '@backstage/cli-node';\n\nconst ACCEPTED_PACKAGE_ROLES: Array<PackageRole | undefined> = [\n 'frontend',\n 'backend',\n 'frontend-plugin',\n 'backend-plugin',\n];\n\nexport default async ({ args, info }: CliCommandContext) => {\n const {\n flags: { plugin, config, require: requirePath, link, inspect, inspectBrk },\n _: namesOrPaths,\n } = cli(\n {\n help: { ...info, usage: `${info.usage} [packages...]` },\n booleanFlagNegation: true,\n parameters: ['[packages...]'],\n flags: {\n plugin: {\n type: [String],\n description:\n 'Start the dev entry-point for any matching plugin package in the repo',\n default: [],\n },\n config: {\n type: [String],\n description: 'Config files to load instead of app-config.yaml',\n default: [],\n },\n require: {\n type: String,\n description:\n 'Add a --require argument to the node process. Applies to backend package only',\n },\n link: {\n type: String,\n description: 'Link an external workspace for module resolution',\n },\n inspect: {\n type: String,\n description:\n 'Enable the Node.js inspector, optionally at a specific host:port',\n },\n inspectBrk: {\n type: String,\n description:\n 'Enable the Node.js inspector and break before user code starts',\n },\n },\n },\n undefined,\n args,\n );\n\n const targetPackages = await findTargetPackages(namesOrPaths, plugin);\n\n const packageOptions = await resolvePackageOptions(targetPackages, {\n plugin,\n config,\n inspect: inspect || (inspect === '' ? true : undefined),\n inspectBrk: inspectBrk || (inspectBrk === '' ? true : undefined),\n require: requirePath,\n link,\n });\n\n if (packageOptions.length === 0) {\n console.log('No packages found to start');\n return;\n }\n\n console.log(\n `Starting ${packageOptions\n .map(({ pkg }) => pkg.packageJson.name)\n .join(', ')}`,\n );\n\n // Each of these block until interrupted by user\n await Promise.all(packageOptions.map(entry => startPackage(entry.options)));\n};\n\nexport async function findTargetPackages(\n namesOrPaths: string[],\n pluginIds: string[],\n) {\n const targetPackages = new Array<BackstagePackage>();\n\n const packages = await PackageGraph.listTargetPackages();\n\n // Prioritize plugin options, so that the `start` script can contain a list of packages,\n // but make them easy to override by running for example `yarn start --plugin catalog`\n for (const pluginId of pluginIds) {\n const matchingPackages = packages.filter(pkg => {\n return (\n pluginId === pkg.packageJson.backstage?.pluginId &&\n ACCEPTED_PACKAGE_ROLES.includes(pkg.packageJson.backstage.role)\n );\n });\n if (matchingPackages.length === 0) {\n throw new Error(\n `Unable to find any plugin packages with plugin ID '${pluginId}'. Make sure backstage.pluginId is set in your package.json files by running 'yarn fix --publish'.`,\n );\n }\n targetPackages.push(...matchingPackages);\n }\n if (targetPackages.length > 0) {\n return targetPackages;\n }\n\n // Next check if explicit package names are provided, use them in that case.\n for (const nameOrPath of namesOrPaths) {\n let matchingPackage = packages.find(\n pkg => nameOrPath === pkg.packageJson.name,\n );\n if (!matchingPackage) {\n const absPath = targetPaths.resolveRoot(nameOrPath);\n matchingPackage = packages.find(\n pkg => relativePath(pkg.dir, absPath) === '',\n );\n }\n if (!matchingPackage) {\n throw new Error(`Unable to find package by name '${nameOrPath}'`);\n }\n targetPackages.push(matchingPackage);\n }\n\n if (targetPackages.length > 0) {\n return targetPackages;\n }\n\n // If no package names are provided, default to expect a single frontend and/or backend package\n for (const role of ['frontend', 'backend']) {\n const matchingPackages = packages.filter(\n pkg => pkg.packageJson.backstage?.role === role,\n );\n if (matchingPackages.length > 1) {\n // Final fallback is to check for the package path within the monorepo, packages/app or packages/backend\n const expectedPath = targetPaths.resolveRoot(\n role === 'frontend' ? 'packages/app' : 'packages/backend',\n );\n const matchByPath = matchingPackages.find(\n pkg => relativePath(expectedPath, pkg.dir) === '',\n );\n if (matchByPath) {\n targetPackages.push(matchByPath);\n continue;\n }\n\n throw new Error(\n `Found multiple packages with role '${role}' but none of the use the default path '${expectedPath}',` +\n `choose which packages you want to run by passing the package names explicitly ` +\n `as arguments, for example 'yarn backstage-cli repo start my-app my-backend'.`,\n );\n }\n\n targetPackages.push(...matchingPackages);\n }\n if (targetPackages.length > 0) {\n return targetPackages;\n }\n\n // If no app or backend packages are found, fall back to expecting single plugin packages\n for (const role of ['frontend-plugin', 'backend-plugin']) {\n const matchingPackages = packages.filter(\n pkg => pkg.packageJson.backstage?.role === role,\n );\n if (matchingPackages.length > 1) {\n throw new Error(\n `Found multiple packages with role '${role}', please choose which packages you want ` +\n `to run by passing the package names explicitly as arguments, for example ` +\n `'yarn backstage-cli repo start my-plugin my-plugin-backend'.`,\n );\n }\n targetPackages.push(...matchingPackages);\n }\n if (targetPackages.length > 0) {\n return targetPackages;\n }\n\n throw new Error(\n `Unable to find any packages with role 'frontend', 'backend', 'frontend-plugin', or 'backend-plugin'.`,\n );\n}\n\ntype CommandOptions = {\n plugin: string[];\n config: string[];\n inspect?: boolean | string;\n inspectBrk?: boolean | string;\n require?: string;\n link?: string;\n};\n\nasync function resolvePackageOptions(\n targetPackages: BackstagePackage[],\n options: CommandOptions,\n) {\n const linkedWorkspace = await resolveLinkedWorkspace(options.link);\n\n return targetPackages.flatMap(pkg => {\n const startScript = pkg.packageJson.scripts?.start;\n if (!startScript) {\n console.log(\n `No start script found for package ${pkg.packageJson.name}, skipping...`,\n );\n return [];\n }\n\n // Grab and parse --config and --require options from the start scripts, the rest are ignored\n // TODO(Rugvip): Prolly switch over to completely different arg parsing to avoid this duplication\n const { values: parsedOpts } = parseArgs({\n args: startScript.split(' '),\n strict: false,\n options: {\n config: {\n type: 'string',\n multiple: true,\n },\n require: {\n type: 'string',\n },\n },\n });\n const parsedRequire =\n typeof parsedOpts.require === 'string' ? parsedOpts.require : undefined;\n const parsedConfig =\n parsedOpts.config?.filter(c => typeof c === 'string') ?? [];\n\n return [\n {\n pkg,\n options: {\n role: pkg.packageJson.backstage?.role!,\n targetDir: pkg.dir,\n configPaths:\n options.config.length > 0 ? options.config : parsedConfig,\n checksEnabled: false,\n linkedWorkspace,\n inspectEnabled: options.inspect,\n inspectBrkEnabled: options.inspectBrk,\n require: options.require ?? parsedRequire,\n },\n },\n ];\n });\n}\n"],"names":["cli","startPackage","PackageGraph","targetPaths","relativePath","resolveLinkedWorkspace","parseArgs"],"mappings":"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"}
@@ -0,0 +1,74 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ var cliNode = require('@backstage/cli-node');
6
+ var _package = require('./package.json.cjs.js');
7
+
8
+ var index = cliNode.createCliModule({
9
+ packageJson: _package.default,
10
+ init: async (reg) => {
11
+ reg.addCommand({
12
+ path: ["package", "build"],
13
+ description: "Build a package for production deployment or publishing",
14
+ execute: { loader: () => import('./commands/package/build/index.cjs.js') }
15
+ });
16
+ reg.addCommand({
17
+ path: ["repo", "build"],
18
+ description: "Build packages in the project, excluding bundled app and backend packages.",
19
+ execute: { loader: () => import('./commands/repo/build.cjs.js') }
20
+ });
21
+ reg.addCommand({
22
+ path: ["package", "bundle"],
23
+ description: "Bundle a plugin for dynamic loading. Creates a self-contained plugin package that can be deployed and loaded dynamically by a Backstage application. Supports both backend and frontend plugins. Experimental.",
24
+ experimental: true,
25
+ execute: { loader: () => import('./commands/package/bundle/index.cjs.js') }
26
+ });
27
+ reg.addCommand({
28
+ path: ["package", "start"],
29
+ description: "Start a package for local development",
30
+ execute: { loader: () => import('./commands/package/start/index.cjs.js') }
31
+ });
32
+ reg.addCommand({
33
+ path: ["repo", "start"],
34
+ description: "Starts packages in the repo for local development",
35
+ execute: { loader: () => import('./commands/repo/start.cjs.js') }
36
+ });
37
+ reg.addCommand({
38
+ path: ["package", "clean"],
39
+ description: "Delete cache directories",
40
+ execute: {
41
+ loader: () => import('./commands/package/clean.cjs.js')
42
+ }
43
+ });
44
+ reg.addCommand({
45
+ path: ["package", "prepack"],
46
+ description: "Prepares a package for packaging before publishing",
47
+ execute: {
48
+ loader: () => import('./commands/package/prepack.cjs.js')
49
+ }
50
+ });
51
+ reg.addCommand({
52
+ path: ["package", "postpack"],
53
+ description: "Restores the changes made by the prepack command",
54
+ execute: {
55
+ loader: () => import('./commands/package/postpack.cjs.js')
56
+ }
57
+ });
58
+ reg.addCommand({
59
+ path: ["repo", "clean"],
60
+ description: "Delete cache and output directories",
61
+ execute: {
62
+ loader: () => import('./commands/repo/clean.cjs.js')
63
+ }
64
+ });
65
+ reg.addCommand({
66
+ path: ["build-workspace"],
67
+ description: "Builds a temporary dist workspace from the provided packages",
68
+ execute: { loader: () => import('./commands/buildWorkspace.cjs.js') }
69
+ });
70
+ }
71
+ });
72
+
73
+ exports.default = index;
74
+ //# sourceMappingURL=index.cjs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.cjs.js","sources":["../src/index.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 { createCliModule } from '@backstage/cli-node';\nimport packageJson from '../package.json';\n\nexport default createCliModule({\n packageJson,\n init: async reg => {\n reg.addCommand({\n path: ['package', 'build'],\n description: 'Build a package for production deployment or publishing',\n execute: { loader: () => import('./commands/package/build') },\n });\n\n reg.addCommand({\n path: ['repo', 'build'],\n description:\n 'Build packages in the project, excluding bundled app and backend packages.',\n execute: { loader: () => import('./commands/repo/build') },\n });\n\n reg.addCommand({\n path: ['package', 'bundle'],\n description:\n 'Bundle a plugin for dynamic loading. Creates a self-contained plugin ' +\n 'package that can be deployed and loaded dynamically by a Backstage application. ' +\n 'Supports both backend and frontend plugins. Experimental.',\n experimental: true,\n execute: { loader: () => import('./commands/package/bundle') },\n });\n\n reg.addCommand({\n path: ['package', 'start'],\n description: 'Start a package for local development',\n execute: { loader: () => import('./commands/package/start') },\n });\n\n reg.addCommand({\n path: ['repo', 'start'],\n description: 'Starts packages in the repo for local development',\n execute: { loader: () => import('./commands/repo/start') },\n });\n\n reg.addCommand({\n path: ['package', 'clean'],\n description: 'Delete cache directories',\n execute: {\n loader: () => import('./commands/package/clean'),\n },\n });\n\n reg.addCommand({\n path: ['package', 'prepack'],\n description: 'Prepares a package for packaging before publishing',\n execute: {\n loader: () => import('./commands/package/prepack'),\n },\n });\n\n reg.addCommand({\n path: ['package', 'postpack'],\n description: 'Restores the changes made by the prepack command',\n execute: {\n loader: () => import('./commands/package/postpack'),\n },\n });\n\n reg.addCommand({\n path: ['repo', 'clean'],\n description: 'Delete cache and output directories',\n execute: {\n loader: () => import('./commands/repo/clean'),\n },\n });\n\n reg.addCommand({\n path: ['build-workspace'],\n description:\n 'Builds a temporary dist workspace from the provided packages',\n execute: { loader: () => import('./commands/buildWorkspace') },\n });\n },\n});\n"],"names":["createCliModule","packageJson"],"mappings":";;;;;;;AAmBA,YAAeA,uBAAA,CAAgB;AAAA,eAC7BC,gBAAA;AAAA,EACA,IAAA,EAAM,OAAM,GAAA,KAAO;AACjB,IAAA,GAAA,CAAI,UAAA,CAAW;AAAA,MACb,IAAA,EAAM,CAAC,SAAA,EAAW,OAAO,CAAA;AAAA,MACzB,WAAA,EAAa,yDAAA;AAAA,MACb,SAAS,EAAE,MAAA,EAAQ,MAAM,OAAO,uCAA0B,CAAA;AAAE,KAC7D,CAAA;AAED,IAAA,GAAA,CAAI,UAAA,CAAW;AAAA,MACb,IAAA,EAAM,CAAC,MAAA,EAAQ,OAAO,CAAA;AAAA,MACtB,WAAA,EACE,4EAAA;AAAA,MACF,SAAS,EAAE,MAAA,EAAQ,MAAM,OAAO,8BAAuB,CAAA;AAAE,KAC1D,CAAA;AAED,IAAA,GAAA,CAAI,UAAA,CAAW;AAAA,MACb,IAAA,EAAM,CAAC,SAAA,EAAW,QAAQ,CAAA;AAAA,MAC1B,WAAA,EACE,gNAAA;AAAA,MAGF,YAAA,EAAc,IAAA;AAAA,MACd,SAAS,EAAE,MAAA,EAAQ,MAAM,OAAO,wCAA2B,CAAA;AAAE,KAC9D,CAAA;AAED,IAAA,GAAA,CAAI,UAAA,CAAW;AAAA,MACb,IAAA,EAAM,CAAC,SAAA,EAAW,OAAO,CAAA;AAAA,MACzB,WAAA,EAAa,uCAAA;AAAA,MACb,SAAS,EAAE,MAAA,EAAQ,MAAM,OAAO,uCAA0B,CAAA;AAAE,KAC7D,CAAA;AAED,IAAA,GAAA,CAAI,UAAA,CAAW;AAAA,MACb,IAAA,EAAM,CAAC,MAAA,EAAQ,OAAO,CAAA;AAAA,MACtB,WAAA,EAAa,mDAAA;AAAA,MACb,SAAS,EAAE,MAAA,EAAQ,MAAM,OAAO,8BAAuB,CAAA;AAAE,KAC1D,CAAA;AAED,IAAA,GAAA,CAAI,UAAA,CAAW;AAAA,MACb,IAAA,EAAM,CAAC,SAAA,EAAW,OAAO,CAAA;AAAA,MACzB,WAAA,EAAa,0BAAA;AAAA,MACb,OAAA,EAAS;AAAA,QACP,MAAA,EAAQ,MAAM,OAAO,iCAA0B;AAAA;AACjD,KACD,CAAA;AAED,IAAA,GAAA,CAAI,UAAA,CAAW;AAAA,MACb,IAAA,EAAM,CAAC,SAAA,EAAW,SAAS,CAAA;AAAA,MAC3B,WAAA,EAAa,oDAAA;AAAA,MACb,OAAA,EAAS;AAAA,QACP,MAAA,EAAQ,MAAM,OAAO,mCAA4B;AAAA;AACnD,KACD,CAAA;AAED,IAAA,GAAA,CAAI,UAAA,CAAW;AAAA,MACb,IAAA,EAAM,CAAC,SAAA,EAAW,UAAU,CAAA;AAAA,MAC5B,WAAA,EAAa,kDAAA;AAAA,MACb,OAAA,EAAS;AAAA,QACP,MAAA,EAAQ,MAAM,OAAO,oCAA6B;AAAA;AACpD,KACD,CAAA;AAED,IAAA,GAAA,CAAI,UAAA,CAAW;AAAA,MACb,IAAA,EAAM,CAAC,MAAA,EAAQ,OAAO,CAAA;AAAA,MACtB,WAAA,EAAa,qCAAA;AAAA,MACb,OAAA,EAAS;AAAA,QACP,MAAA,EAAQ,MAAM,OAAO,8BAAuB;AAAA;AAC9C,KACD,CAAA;AAED,IAAA,GAAA,CAAI,UAAA,CAAW;AAAA,MACb,IAAA,EAAM,CAAC,iBAAiB,CAAA;AAAA,MACxB,WAAA,EACE,8DAAA;AAAA,MACF,SAAS,EAAE,MAAA,EAAQ,MAAM,OAAO,kCAA2B,CAAA;AAAE,KAC9D,CAAA;AAAA,EACH;AACF,CAAC,CAAA;;;;"}
@@ -0,0 +1,5 @@
1
+ import * as _backstage_cli_node from '@backstage/cli-node';
2
+
3
+ declare const _default: _backstage_cli_node.CliModule;
4
+
5
+ export { _default as default };
@@ -0,0 +1,81 @@
1
+ 'use strict';
2
+
3
+ var os = require('node:os');
4
+ var fs = require('fs-extra');
5
+ var node_path = require('node:path');
6
+ var tar = require('tar');
7
+ var createDistWorkspace = require('./packager/createDistWorkspace.cjs.js');
8
+ var packager = require('./builder/packager.cjs.js');
9
+ var types = require('./builder/types.cjs.js');
10
+ var cliNode = require('@backstage/cli-node');
11
+
12
+ function _interopDefaultCompat (e) { return e && typeof e === 'object' && 'default' in e ? e : { default: e }; }
13
+
14
+ function _interopNamespaceCompat(e) {
15
+ if (e && typeof e === 'object' && 'default' in e) return e;
16
+ var n = Object.create(null);
17
+ if (e) {
18
+ Object.keys(e).forEach(function (k) {
19
+ if (k !== 'default') {
20
+ var d = Object.getOwnPropertyDescriptor(e, k);
21
+ Object.defineProperty(n, k, d.get ? d : {
22
+ enumerable: true,
23
+ get: function () { return e[k]; }
24
+ });
25
+ }
26
+ });
27
+ }
28
+ n.default = e;
29
+ return Object.freeze(n);
30
+ }
31
+
32
+ var os__default = /*#__PURE__*/_interopDefaultCompat(os);
33
+ var fs__default = /*#__PURE__*/_interopDefaultCompat(fs);
34
+ var tar__namespace = /*#__PURE__*/_interopNamespaceCompat(tar);
35
+
36
+ const BUNDLE_FILE = "bundle.tar.gz";
37
+ const SKELETON_FILE = "skeleton.tar.gz";
38
+ async function buildBackend(options) {
39
+ const { targetDir, skipBuildDependencies, configPaths, minify } = options;
40
+ const pkg = await fs__default.default.readJson(node_path.resolve(targetDir, "package.json"));
41
+ await packager.buildPackage({
42
+ targetDir,
43
+ packageJson: pkg,
44
+ outputs: /* @__PURE__ */ new Set([types.Output.cjs]),
45
+ minify,
46
+ workspacePackages: await cliNode.PackageGraph.listTargetPackages()
47
+ });
48
+ const tmpDir = await fs__default.default.mkdtemp(node_path.resolve(os__default.default.tmpdir(), "backstage-bundle"));
49
+ try {
50
+ await createDistWorkspace.createDistWorkspace([pkg.name], {
51
+ targetDir: tmpDir,
52
+ configPaths,
53
+ buildDependencies: !skipBuildDependencies,
54
+ buildExcludes: [pkg.name],
55
+ skeleton: SKELETON_FILE,
56
+ minify
57
+ });
58
+ const distDir = node_path.resolve(targetDir, "dist");
59
+ await fs__default.default.remove(distDir);
60
+ await fs__default.default.mkdir(distDir);
61
+ await fs__default.default.move(
62
+ node_path.resolve(tmpDir, SKELETON_FILE),
63
+ node_path.resolve(distDir, SKELETON_FILE)
64
+ );
65
+ await tar__namespace.create(
66
+ {
67
+ file: node_path.resolve(distDir, BUNDLE_FILE),
68
+ cwd: tmpDir,
69
+ portable: true,
70
+ noMtime: true,
71
+ gzip: true
72
+ },
73
+ [""]
74
+ );
75
+ } finally {
76
+ await fs__default.default.remove(tmpDir);
77
+ }
78
+ }
79
+
80
+ exports.buildBackend = buildBackend;
81
+ //# sourceMappingURL=buildBackend.cjs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"buildBackend.cjs.js","sources":["../../src/lib/buildBackend.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 os from 'node:os';\nimport fs from 'fs-extra';\nimport { resolve as resolvePath } from 'node:path';\nimport * as tar from 'tar';\nimport { createDistWorkspace } from './packager';\nimport { buildPackage, Output } from './builder';\nimport { PackageGraph } from '@backstage/cli-node';\n\nconst BUNDLE_FILE = 'bundle.tar.gz';\nconst SKELETON_FILE = 'skeleton.tar.gz';\n\ninterface BuildBackendOptions {\n targetDir: string;\n skipBuildDependencies: boolean;\n configPaths?: string[];\n minify?: boolean;\n}\n\nexport async function buildBackend(options: BuildBackendOptions) {\n const { targetDir, skipBuildDependencies, configPaths, minify } = options;\n const pkg = await fs.readJson(resolvePath(targetDir, 'package.json'));\n\n // We build the target package without generating type declarations.\n await buildPackage({\n targetDir,\n packageJson: pkg,\n outputs: new Set([Output.cjs]),\n minify,\n workspacePackages: await PackageGraph.listTargetPackages(),\n });\n\n const tmpDir = await fs.mkdtemp(resolvePath(os.tmpdir(), 'backstage-bundle'));\n try {\n await createDistWorkspace([pkg.name], {\n targetDir: tmpDir,\n configPaths,\n buildDependencies: !skipBuildDependencies,\n buildExcludes: [pkg.name],\n skeleton: SKELETON_FILE,\n minify,\n });\n\n // We built the target backend package using the regular build process, but the result of\n // that has now been packed into the dist workspace, so clean up the dist dir.\n const distDir = resolvePath(targetDir, 'dist');\n await fs.remove(distDir);\n await fs.mkdir(distDir);\n\n // Move out skeleton.tar.gz before we create the main bundle, no point having that included up twice.\n await fs.move(\n resolvePath(tmpDir, SKELETON_FILE),\n resolvePath(distDir, SKELETON_FILE),\n );\n\n // Create main bundle.tar.gz, with some tweaks to make it more likely hit Docker build cache.\n await tar.create(\n {\n file: resolvePath(distDir, BUNDLE_FILE),\n cwd: tmpDir,\n portable: true,\n noMtime: true,\n gzip: true,\n },\n [''],\n );\n } finally {\n await fs.remove(tmpDir);\n }\n}\n"],"names":["fs","resolvePath","buildPackage","Output","PackageGraph","os","createDistWorkspace","tar"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAwBA,MAAM,WAAA,GAAc,eAAA;AACpB,MAAM,aAAA,GAAgB,iBAAA;AAStB,eAAsB,aAAa,OAAA,EAA8B;AAC/D,EAAA,MAAM,EAAE,SAAA,EAAW,qBAAA,EAAuB,WAAA,EAAa,QAAO,GAAI,OAAA;AAClE,EAAA,MAAM,MAAM,MAAMA,mBAAA,CAAG,SAASC,iBAAA,CAAY,SAAA,EAAW,cAAc,CAAC,CAAA;AAGpE,EAAA,MAAMC,qBAAA,CAAa;AAAA,IACjB,SAAA;AAAA,IACA,WAAA,EAAa,GAAA;AAAA,IACb,yBAAS,IAAI,GAAA,CAAI,CAACC,YAAA,CAAO,GAAG,CAAC,CAAA;AAAA,IAC7B,MAAA;AAAA,IACA,iBAAA,EAAmB,MAAMC,oBAAA,CAAa,kBAAA;AAAmB,GAC1D,CAAA;AAED,EAAA,MAAM,MAAA,GAAS,MAAMJ,mBAAA,CAAG,OAAA,CAAQC,kBAAYI,mBAAA,CAAG,MAAA,EAAO,EAAG,kBAAkB,CAAC,CAAA;AAC5E,EAAA,IAAI;AACF,IAAA,MAAMC,uCAAA,CAAoB,CAAC,GAAA,CAAI,IAAI,CAAA,EAAG;AAAA,MACpC,SAAA,EAAW,MAAA;AAAA,MACX,WAAA;AAAA,MACA,mBAAmB,CAAC,qBAAA;AAAA,MACpB,aAAA,EAAe,CAAC,GAAA,CAAI,IAAI,CAAA;AAAA,MACxB,QAAA,EAAU,aAAA;AAAA,MACV;AAAA,KACD,CAAA;AAID,IAAA,MAAM,OAAA,GAAUL,iBAAA,CAAY,SAAA,EAAW,MAAM,CAAA;AAC7C,IAAA,MAAMD,mBAAA,CAAG,OAAO,OAAO,CAAA;AACvB,IAAA,MAAMA,mBAAA,CAAG,MAAM,OAAO,CAAA;AAGtB,IAAA,MAAMA,mBAAA,CAAG,IAAA;AAAA,MACPC,iBAAA,CAAY,QAAQ,aAAa,CAAA;AAAA,MACjCA,iBAAA,CAAY,SAAS,aAAa;AAAA,KACpC;AAGA,IAAA,MAAMM,cAAA,CAAI,MAAA;AAAA,MACR;AAAA,QACE,IAAA,EAAMN,iBAAA,CAAY,OAAA,EAAS,WAAW,CAAA;AAAA,QACtC,GAAA,EAAK,MAAA;AAAA,QACL,QAAA,EAAU,IAAA;AAAA,QACV,OAAA,EAAS,IAAA;AAAA,QACT,IAAA,EAAM;AAAA,OACR;AAAA,MACA,CAAC,EAAE;AAAA,KACL;AAAA,EACF,CAAA,SAAE;AACA,IAAA,MAAMD,mBAAA,CAAG,OAAO,MAAM,CAAA;AAAA,EACxB;AACF;;;;"}