@backstage/cli 0.8.2 → 0.10.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (62) hide show
  1. package/CHANGELOG.md +73 -0
  2. package/config/jest.js +1 -0
  3. package/config/jestSucraseTransform.js +5 -1
  4. package/dist/cjs/{Lockfile-80f0eec4.cjs.js → Lockfile-35661afa.cjs.js} +18 -18
  5. package/dist/cjs/{build-bae5a019.cjs.js → build-4c85e374.cjs.js} +9 -9
  6. package/dist/cjs/{build-1cbb9e7d.cjs.js → build-574ad84f.cjs.js} +23 -20
  7. package/dist/cjs/{build-70dd213a.cjs.js → build-c587cc8c.cjs.js} +8 -7
  8. package/dist/cjs/{build-b25b29ed.cjs.js → build-dc2484e7.cjs.js} +8 -7
  9. package/dist/cjs/{buildWorkspace-424d4929.cjs.js → buildWorkspace-29b42a0b.cjs.js} +6 -6
  10. package/dist/cjs/{bump-bce7f9c2.cjs.js → bump-24057de2.cjs.js} +55 -33
  11. package/dist/cjs/{bundle-cc6870fb.cjs.js → bundle-854deefb.cjs.js} +15 -15
  12. package/dist/cjs/{clean-7a981ea7.cjs.js → clean-ecf90e6b.cjs.js} +6 -6
  13. package/dist/cjs/{config-24fce3c1.cjs.js → config-91083c1e.cjs.js} +7 -7
  14. package/dist/cjs/create-89dd36f0.cjs.js +483 -0
  15. package/dist/cjs/{createPlugin-2c2b30fc.cjs.js → createPlugin-a8527ca3.cjs.js} +35 -36
  16. package/dist/cjs/{dev-efe399b8.cjs.js → dev-3713f802.cjs.js} +8 -8
  17. package/dist/cjs/{diff-e3661054.cjs.js → diff-79e33159.cjs.js} +39 -32
  18. package/dist/cjs/{docs-ceb404a3.cjs.js → docs-a8506fde.cjs.js} +6 -6
  19. package/dist/cjs/{index-26bec8ac.cjs.js → index-33d9cbba.cjs.js} +23 -20
  20. package/dist/cjs/{index-fbff7b78.cjs.js → index-9cf6e421.cjs.js} +14 -14
  21. package/dist/cjs/{index-6fee1c9a.cjs.js → index-b2152549.cjs.js} +81 -79
  22. package/dist/cjs/{info-5e7c2679.cjs.js → info-d8ce894c.cjs.js} +6 -6
  23. package/dist/cjs/{install-5920b5df.cjs.js → install-9e5b8576.cjs.js} +23 -23
  24. package/dist/cjs/{lint-306bb8fe.cjs.js → lint-955bc62d.cjs.js} +4 -4
  25. package/dist/cjs/{lint-6175d471.cjs.js → lint-a78b8bb6.cjs.js} +7 -7
  26. package/dist/cjs/{pack-32228ad6.cjs.js → pack-f474f79b.cjs.js} +6 -6
  27. package/dist/cjs/{packager-1ad7272f.cjs.js → packager-6c80f203.cjs.js} +37 -35
  28. package/dist/cjs/{packages-a5b6a3df.cjs.js → packages-bcde9079.cjs.js} +5 -5
  29. package/dist/cjs/{paths-09202a46.cjs.js → paths-f9c22b94.cjs.js} +51 -36
  30. package/dist/cjs/{print-806676fe.cjs.js → print-5e70799c.cjs.js} +5 -5
  31. package/dist/cjs/{removePlugin-f82ac16a.cjs.js → removePlugin-891ec166.cjs.js} +32 -29
  32. package/dist/cjs/{run-59c4395e.cjs.js → run-8388d249.cjs.js} +5 -5
  33. package/dist/cjs/{schema-398d8593.cjs.js → schema-80516b43.cjs.js} +5 -5
  34. package/dist/cjs/{serve-708fbf98.cjs.js → serve-1b0ace54.cjs.js} +15 -15
  35. package/dist/cjs/{serve-f4bb3cb0.cjs.js → serve-6c335165.cjs.js} +9 -9
  36. package/dist/cjs/{server-107d9cc0.cjs.js → server-b2f87b69.cjs.js} +6 -6
  37. package/dist/cjs/{svgrTemplate-2d0d15cf.cjs.js → svgrTemplate-f19e974c.cjs.js} +3 -3
  38. package/dist/cjs/{tasks-9bd3e946.cjs.js → tasks-f12b95ba.cjs.js} +96 -30
  39. package/dist/cjs/{testCommand-e32fbd45.cjs.js → testCommand-1c515cf7.cjs.js} +4 -4
  40. package/dist/cjs/{validate-9523a11e.cjs.js → validate-9907afbb.cjs.js} +4 -4
  41. package/dist/index.cjs.js +1 -1
  42. package/package.json +22 -23
  43. package/templates/default-backend-plugin/package.json.hbs +39 -37
  44. package/templates/default-backend-plugin/src/run.ts.hbs +1 -1
  45. package/templates/default-common-plugin-package/.eslintrc.js +3 -0
  46. package/templates/default-common-plugin-package/README.md.hbs +5 -0
  47. package/templates/default-common-plugin-package/package.json.hbs +34 -0
  48. package/templates/default-common-plugin-package/src/index.ts.hbs +19 -0
  49. package/templates/default-common-plugin-package/src/setupTests.ts +1 -0
  50. package/templates/default-common-plugin-package/tsconfig.json +9 -0
  51. package/templates/default-plugin/package.json.hbs +7 -4
  52. package/templates/default-plugin/src/routes.ts.hbs +1 -1
  53. package/templates/scaffolder-module/.eslintrc.js +3 -0
  54. package/templates/scaffolder-module/README.md.hbs +5 -0
  55. package/templates/scaffolder-module/package.json.hbs +37 -0
  56. package/templates/scaffolder-module/src/actions/example/example.test.ts +50 -0
  57. package/templates/scaffolder-module/src/actions/example/example.ts +57 -0
  58. package/templates/scaffolder-module/src/actions/example/index.ts +1 -0
  59. package/templates/scaffolder-module/src/actions/index.ts +1 -0
  60. package/templates/scaffolder-module/src/index.ts.hbs +8 -0
  61. package/templates/scaffolder-module/tsconfig.json +9 -0
  62. package/dist/cjs/buildImage-6b35526c.cjs.js +0 -77
@@ -10,10 +10,10 @@ var camelCase = require('lodash/camelCase');
10
10
  var upperFirst = require('lodash/upperFirst');
11
11
  var os = require('os');
12
12
  var errors = require('@backstage/errors');
13
- var tasks = require('./tasks-9bd3e946.cjs.js');
14
- var index = require('./index-6fee1c9a.cjs.js');
15
- var Lockfile = require('./Lockfile-80f0eec4.cjs.js');
16
- require('./run-59c4395e.cjs.js');
13
+ var tasks = require('./tasks-f12b95ba.cjs.js');
14
+ var index = require('./index-b2152549.cjs.js');
15
+ var Lockfile = require('./Lockfile-35661afa.cjs.js');
16
+ require('./run-8388d249.cjs.js');
17
17
  require('handlebars');
18
18
  require('ora');
19
19
  require('recursive-readdir');
@@ -35,8 +35,8 @@ var os__default = /*#__PURE__*/_interopDefaultLegacy(os);
35
35
  const exec = util.promisify(child_process.exec);
36
36
  async function checkExists(destination) {
37
37
  await tasks.Task.forItem("checking", destination, async () => {
38
- if (await fs__default['default'].pathExists(destination)) {
39
- const existing = chalk__default['default'].cyan(destination.replace(`${index.paths.targetRoot}/`, ""));
38
+ if (await fs__default["default"].pathExists(destination)) {
39
+ const existing = chalk__default["default"].cyan(destination.replace(`${index.paths.targetRoot}/`, ""));
40
40
  throw new Error(`A plugin with the same name already exists: ${existing}
41
41
  Please try again with a different plugin ID`);
42
42
  }
@@ -50,14 +50,14 @@ const sortObjectByKeys = (obj) => {
50
50
  };
51
51
  const capitalize = (str) => str.charAt(0).toUpperCase() + str.slice(1);
52
52
  const addExportStatement = async (file, exportStatement) => {
53
- const newContents = fs__default['default'].readFileSync(file, "utf8").split("\n").filter(Boolean).concat([exportStatement]).concat([""]).join("\n");
54
- await fs__default['default'].writeFile(file, newContents, "utf8");
53
+ const newContents = fs__default["default"].readFileSync(file, "utf8").split("\n").filter(Boolean).concat([exportStatement]).concat([""]).join("\n");
54
+ await fs__default["default"].writeFile(file, newContents, "utf8");
55
55
  };
56
56
  async function addPluginDependencyToApp(rootDir, pluginPackage, versionStr) {
57
57
  const packageFilePath = "packages/app/package.json";
58
58
  const packageFile = path.resolve(rootDir, packageFilePath);
59
59
  await tasks.Task.forItem("processing", packageFilePath, async () => {
60
- const packageFileContent = await fs__default['default'].readFile(packageFile, "utf-8");
60
+ const packageFileContent = await fs__default["default"].readFile(packageFile, "utf-8");
61
61
  const packageFileJson = JSON.parse(packageFileContent);
62
62
  const dependencies = packageFileJson.dependencies;
63
63
  if (dependencies[pluginPackage]) {
@@ -67,19 +67,19 @@ async function addPluginDependencyToApp(rootDir, pluginPackage, versionStr) {
67
67
  packageFileJson.dependencies = sortObjectByKeys(dependencies);
68
68
  const newContents = `${JSON.stringify(packageFileJson, null, 2)}
69
69
  `;
70
- await fs__default['default'].writeFile(packageFile, newContents, "utf-8").catch((error) => {
70
+ await fs__default["default"].writeFile(packageFile, newContents, "utf-8").catch((error) => {
71
71
  throw new Error(`Failed to add plugin as dependency to app: ${packageFile}: ${error.message}`);
72
72
  });
73
73
  });
74
74
  }
75
75
  async function addPluginExtensionToApp(pluginId, extensionName, pluginPackage) {
76
76
  const pluginsFilePath = index.paths.resolveTargetRoot("packages/app/src/App.tsx");
77
- if (!await fs__default['default'].pathExists(pluginsFilePath)) {
77
+ if (!await fs__default["default"].pathExists(pluginsFilePath)) {
78
78
  return;
79
79
  }
80
80
  await tasks.Task.forItem("processing", pluginsFilePath, async () => {
81
81
  var _a;
82
- const content = await fs__default['default'].readFile(pluginsFilePath, "utf8");
82
+ const content = await fs__default["default"].readFile(pluginsFilePath, "utf8");
83
83
  const revLines = content.split("\n").reverse();
84
84
  const lastImportIndex = revLines.findIndex((line) => line.match(/ from ("|').*("|')/));
85
85
  const lastRouteIndex = revLines.findIndex((line) => line.match(/<\/FlatRoutes/));
@@ -88,13 +88,13 @@ async function addPluginExtensionToApp(pluginId, extensionName, pluginPackage) {
88
88
  const [indentation] = (_a = revLines[lastRouteIndex + 1].match(/^\s*/)) != null ? _a : [];
89
89
  revLines.splice(lastRouteIndex + 1, 0, `${indentation}<Route path="/${pluginId}" element={<${extensionName} />}/>`);
90
90
  const newContent = revLines.reverse().join("\n");
91
- await fs__default['default'].writeFile(pluginsFilePath, newContent, "utf8");
91
+ await fs__default["default"].writeFile(pluginsFilePath, newContent, "utf8");
92
92
  }
93
93
  });
94
94
  }
95
95
  async function cleanUp(tempDir) {
96
96
  await tasks.Task.forItem("remove", "temporary directory", async () => {
97
- await fs__default['default'].remove(tempDir);
97
+ await fs__default["default"].remove(tempDir);
98
98
  });
99
99
  }
100
100
  async function buildPlugin(pluginFolder) {
@@ -112,7 +112,7 @@ async function buildPlugin(pluginFolder) {
112
112
  }).catch((error) => {
113
113
  process.stdout.write(error.stderr);
114
114
  process.stdout.write(error.stdout);
115
- throw new Error(`Warning: Could not execute command ${chalk__default['default'].cyan(command)}`);
115
+ throw new Error(`Warning: Could not execute command ${chalk__default["default"].cyan(command)}`);
116
116
  });
117
117
  } catch (error) {
118
118
  errors.assertError(error);
@@ -123,7 +123,7 @@ async function buildPlugin(pluginFolder) {
123
123
  }
124
124
  async function movePlugin(tempDir, destination, id) {
125
125
  await tasks.Task.forItem("moving", id, async () => {
126
- await fs__default['default'].move(tempDir, destination).catch((error) => {
126
+ await fs__default["default"].move(tempDir, destination).catch((error) => {
127
127
  throw new Error(`Failed to move plugin from ${tempDir} to ${destination}: ${error.message}`);
128
128
  });
129
129
  });
@@ -134,12 +134,12 @@ var createPlugin = async (cmd) => {
134
134
  {
135
135
  type: "input",
136
136
  name: "id",
137
- message: chalk__default['default'].blue("Enter an ID for the plugin [required]"),
137
+ message: chalk__default["default"].blue("Enter an ID for the plugin [required]"),
138
138
  validate: (value) => {
139
139
  if (!value) {
140
- return chalk__default['default'].red("Please enter an ID for the plugin");
140
+ return chalk__default["default"].red("Please enter an ID for the plugin");
141
141
  } else if (!/^[a-z0-9]+(-[a-z0-9]+)*$/.test(value)) {
142
- return chalk__default['default'].red("Plugin IDs must be lowercase and contain only letters, digits, and dashes.");
142
+ return chalk__default["default"].red("Plugin IDs must be lowercase and contain only letters, digits, and dashes.");
143
143
  }
144
144
  return true;
145
145
  }
@@ -149,32 +149,31 @@ var createPlugin = async (cmd) => {
149
149
  questions.push({
150
150
  type: "input",
151
151
  name: "owner",
152
- message: chalk__default['default'].blue("Enter the owner(s) of the plugin. If specified, this will be added to CODEOWNERS for the plugin path. [optional]"),
152
+ message: chalk__default["default"].blue("Enter the owner(s) of the plugin. If specified, this will be added to CODEOWNERS for the plugin path. [optional]"),
153
153
  validate: (value) => {
154
154
  if (!value) {
155
155
  return true;
156
156
  }
157
- const ownerIds2 = tasks.parseOwnerIds(value);
158
- if (!ownerIds2) {
159
- return chalk__default['default'].red("The owner must be a space separated list of team names (e.g. @org/team-name), usernames (e.g. @username), or the email addresses of users (e.g. user@example.com).");
157
+ const ownerIds = tasks.parseOwnerIds(value);
158
+ if (!ownerIds) {
159
+ return chalk__default["default"].red("The owner must be a space separated list of team names (e.g. @org/team-name), usernames (e.g. @username), or the email addresses of users (e.g. user@example.com).");
160
160
  }
161
161
  return true;
162
162
  }
163
163
  });
164
164
  }
165
- const answers = await inquirer__default['default'].prompt(questions);
165
+ const answers = await inquirer__default["default"].prompt(questions);
166
166
  const pluginId = cmd.backend && !answers.id.endsWith("-backend") ? `${answers.id}-backend` : answers.id;
167
167
  const name = cmd.scope ? `@${cmd.scope.replace(/^@/, "")}/plugin-${pluginId}` : `plugin-${pluginId}`;
168
- const pluginVar = `${camelCase__default['default'](answers.id)}Plugin`;
169
- const extensionName = `${upperFirst__default['default'](camelCase__default['default'](answers.id))}Page`;
168
+ const pluginVar = `${camelCase__default["default"](answers.id)}Plugin`;
169
+ const extensionName = `${upperFirst__default["default"](camelCase__default["default"](answers.id))}Page`;
170
170
  const npmRegistry = cmd.npmRegistry && cmd.scope ? cmd.npmRegistry : "";
171
171
  const privatePackage = cmd.private === false ? false : true;
172
- const isMonoRepo = await fs__default['default'].pathExists(index.paths.resolveTargetRoot("lerna.json"));
172
+ const isMonoRepo = await fs__default["default"].pathExists(index.paths.resolveTargetRoot("lerna.json"));
173
173
  const appPackage = index.paths.resolveTargetRoot("packages/app");
174
174
  const templateDir = index.paths.resolveOwn(cmd.backend ? "templates/default-backend-plugin" : "templates/default-plugin");
175
175
  const pluginDir = isMonoRepo ? index.paths.resolveTargetRoot("plugins", pluginId) : index.paths.resolveTargetRoot(pluginId);
176
- const ownerIds = tasks.parseOwnerIds(answers.owner);
177
- const {version: pluginVersion} = isMonoRepo ? await fs__default['default'].readJson(index.paths.resolveTargetRoot("lerna.json")) : {version: "0.1.0"};
176
+ const { version: pluginVersion } = isMonoRepo ? await fs__default["default"].readJson(index.paths.resolveTargetRoot("lerna.json")) : { version: "0.1.0" };
178
177
  let lockfile;
179
178
  try {
180
179
  lockfile = await Lockfile.Lockfile.load(index.paths.resolveTargetRoot("yarn.lock"));
@@ -186,7 +185,7 @@ var createPlugin = async (cmd) => {
186
185
  tasks.Task.section("Checking if the plugin ID is available");
187
186
  await checkExists(pluginDir);
188
187
  tasks.Task.section("Creating a temporary plugin directory");
189
- const tempDir = await fs__default['default'].mkdtemp(path.join(os__default['default'].tmpdir(), `backstage-plugin-${pluginId}`));
188
+ const tempDir = await fs__default["default"].mkdtemp(path.join(os__default["default"].tmpdir(), `backstage-plugin-${pluginId}`));
190
189
  try {
191
190
  tasks.Task.section("Preparing files");
192
191
  await tasks.templatingTask(templateDir, tempDir, {
@@ -202,17 +201,17 @@ var createPlugin = async (cmd) => {
202
201
  await movePlugin(tempDir, pluginDir, pluginId);
203
202
  tasks.Task.section("Building the plugin");
204
203
  await buildPlugin(pluginDir);
205
- if (await fs__default['default'].pathExists(appPackage) && !cmd.backend) {
204
+ if (await fs__default["default"].pathExists(appPackage) && !cmd.backend) {
206
205
  tasks.Task.section("Adding plugin as dependency in app");
207
206
  await addPluginDependencyToApp(index.paths.targetRoot, name, pluginVersion);
208
207
  tasks.Task.section("Import plugin in app");
209
208
  await addPluginExtensionToApp(pluginId, extensionName, name);
210
209
  }
211
- if (ownerIds && ownerIds.length) {
212
- await tasks.addCodeownersEntry(codeownersPath, `/plugins/${pluginId}`, ownerIds);
210
+ if (answers.owner) {
211
+ await tasks.addCodeownersEntry(`/plugins/${pluginId}`, answers.owner);
213
212
  }
214
213
  tasks.Task.log();
215
- tasks.Task.log(`\u{1F947} Successfully created ${chalk__default['default'].cyan(`${name}`)}`);
214
+ tasks.Task.log(`\u{1F947} Successfully created ${chalk__default["default"].cyan(`${name}`)}`);
216
215
  tasks.Task.log();
217
216
  tasks.Task.exit();
218
217
  } catch (error) {
@@ -231,6 +230,6 @@ exports.addExportStatement = addExportStatement;
231
230
  exports.addPluginDependencyToApp = addPluginDependencyToApp;
232
231
  exports.addPluginExtensionToApp = addPluginExtensionToApp;
233
232
  exports.capitalize = capitalize;
234
- exports.default = createPlugin;
233
+ exports["default"] = createPlugin;
235
234
  exports.movePlugin = movePlugin;
236
- //# sourceMappingURL=createPlugin-2c2b30fc.cjs.js.map
235
+ //# sourceMappingURL=createPlugin-a8527ca3.cjs.js.map
@@ -1,9 +1,9 @@
1
1
  'use strict';
2
2
 
3
3
  var fs = require('fs-extra');
4
- var index = require('./index-6fee1c9a.cjs.js');
4
+ var index = require('./index-b2152549.cjs.js');
5
5
  var webpack = require('webpack');
6
- var paths = require('./paths-09202a46.cjs.js');
6
+ var paths = require('./paths-f9c22b94.cjs.js');
7
7
  require('commander');
8
8
  require('chalk');
9
9
  require('semver');
@@ -19,8 +19,8 @@ require('webpack-node-externals');
19
19
  require('terser-webpack-plugin');
20
20
  require('./parallel-a4714c72.cjs.js');
21
21
  require('mini-css-extract-plugin');
22
- require('./svgrTemplate-2d0d15cf.cjs.js');
23
- require('./run-59c4395e.cjs.js');
22
+ require('./svgrTemplate-f19e974c.cjs.js');
23
+ require('./run-8388d249.cjs.js');
24
24
  require('child_process');
25
25
  require('util');
26
26
  require('lodash/pickBy');
@@ -36,7 +36,7 @@ async function serveBackend(options) {
36
36
  ...options,
37
37
  isDev: true
38
38
  });
39
- const compiler = webpack__default['default'](config, (err) => {
39
+ const compiler = webpack__default["default"](config, (err) => {
40
40
  if (err) {
41
41
  console.error(err);
42
42
  } else
@@ -56,7 +56,7 @@ async function serveBackend(options) {
56
56
  }
57
57
 
58
58
  var dev = async (cmd) => {
59
- await fs__default['default'].remove(index.paths.resolveTarget("dist"));
59
+ await fs__default["default"].remove(index.paths.resolveTarget("dist"));
60
60
  const waitForExit = await serveBackend({
61
61
  entry: "src/index",
62
62
  checksEnabled: cmd.check,
@@ -66,5 +66,5 @@ var dev = async (cmd) => {
66
66
  await waitForExit();
67
67
  };
68
68
 
69
- exports.default = dev;
70
- //# sourceMappingURL=dev-efe399b8.cjs.js.map
69
+ exports["default"] = dev;
70
+ //# sourceMappingURL=dev-3713f802.cjs.js.map
@@ -7,7 +7,7 @@ var path = require('path');
7
7
  var inquirer = require('inquirer');
8
8
  var handlebars = require('handlebars');
9
9
  var recursive = require('recursive-readdir');
10
- var index = require('./index-6fee1c9a.cjs.js');
10
+ var index = require('./index-b2152549.cjs.js');
11
11
  require('commander');
12
12
  require('semver');
13
13
  require('@backstage/cli-common');
@@ -38,7 +38,7 @@ class PackageJsonHandler {
38
38
  this.targetPkg = targetPkg;
39
39
  this.variant = variant;
40
40
  }
41
- static async handler({path, write, missing, targetContents, templateContents}, prompt, variant) {
41
+ static async handler({ path, write, missing, targetContents, templateContents }, prompt, variant) {
42
42
  console.log("Checking package.json");
43
43
  if (missing) {
44
44
  throw new Error(`${path} doesn't exist`);
@@ -61,18 +61,20 @@ class PackageJsonHandler {
61
61
  await this.syncScripts();
62
62
  await this.syncPublishConfig();
63
63
  await this.syncDependencies("dependencies");
64
+ await this.syncDependencies("peerDependencies", true);
64
65
  await this.syncDependencies("devDependencies");
66
+ await this.syncReactDeps();
65
67
  }
66
68
  async syncField(fieldName, obj = this.pkg, targetObj = this.targetPkg, prefix, sort, optional) {
67
- const fullFieldName = chalk__default['default'].cyan(prefix ? `${prefix}[${fieldName}]` : fieldName);
69
+ const fullFieldName = chalk__default["default"].cyan(prefix ? `${prefix}[${fieldName}]` : fieldName);
68
70
  const newValue = obj[fieldName];
69
- const coloredNewValue = chalk__default['default'].cyan(JSON.stringify(newValue));
71
+ const coloredNewValue = chalk__default["default"].cyan(JSON.stringify(newValue));
70
72
  if (fieldName in targetObj) {
71
73
  const oldValue = targetObj[fieldName];
72
74
  if (JSON.stringify(oldValue) === JSON.stringify(newValue)) {
73
75
  return;
74
76
  }
75
- const coloredOldValue = chalk__default['default'].cyan(JSON.stringify(oldValue));
77
+ const coloredOldValue = chalk__default["default"].cyan(JSON.stringify(oldValue));
76
78
  const msg = `package.json has mismatched field, ${fullFieldName}, change from ${coloredOldValue} to ${coloredNewValue}?`;
77
79
  if (await this.prompt(msg)) {
78
80
  targetObj[fieldName] = newValue;
@@ -92,7 +94,7 @@ class PackageJsonHandler {
92
94
  }
93
95
  }
94
96
  async syncFiles() {
95
- const {configSchema} = this.targetPkg;
97
+ const { configSchema } = this.targetPkg;
96
98
  const hasSchemaFile = typeof configSchema === "string";
97
99
  if (!this.targetPkg.files) {
98
100
  const expected = hasSchemaFile ? ["dist", configSchema] : ["dist"];
@@ -145,10 +147,10 @@ class PackageJsonHandler {
145
147
  }
146
148
  }
147
149
  }
148
- async syncDependencies(fieldName) {
150
+ async syncDependencies(fieldName, required = false) {
149
151
  const pkgDeps = this.pkg[fieldName];
150
152
  const targetDeps = this.targetPkg[fieldName] = this.targetPkg[fieldName] || {};
151
- if (!pkgDeps) {
153
+ if (!pkgDeps && !required) {
152
154
  return;
153
155
  }
154
156
  await this.syncField("@backstage/core", {}, targetDeps, fieldName, true);
@@ -157,17 +159,22 @@ class PackageJsonHandler {
157
159
  if (this.variant === "app" && key.startsWith("plugin-")) {
158
160
  continue;
159
161
  }
160
- await this.syncField(key, pkgDeps, targetDeps, fieldName, true, true);
162
+ await this.syncField(key, pkgDeps, targetDeps, fieldName, true, !required);
161
163
  }
162
164
  }
165
+ async syncReactDeps() {
166
+ const targetDeps = this.targetPkg.dependencies = this.targetPkg.dependencies || {};
167
+ await this.syncField("react", {}, targetDeps, "dependencies");
168
+ await this.syncField("react-dom", {}, targetDeps, "dependencies");
169
+ }
163
170
  async write() {
164
171
  await this.writeFunc(`${JSON.stringify(this.targetPkg, null, 2)}
165
172
  `);
166
173
  }
167
174
  }
168
- async function exactMatchHandler({path, write, missing, targetContents, templateContents}, prompt) {
175
+ async function exactMatchHandler({ path, write, missing, targetContents, templateContents }, prompt) {
169
176
  console.log(`Checking ${path}`);
170
- const coloredPath = chalk__default['default'].cyan(path);
177
+ const coloredPath = chalk__default["default"].cyan(path);
171
178
  if (missing) {
172
179
  if (await prompt(`Missing ${coloredPath}, do you want to add it?`)) {
173
180
  await write(templateContents);
@@ -180,9 +187,9 @@ async function exactMatchHandler({path, write, missing, targetContents, template
180
187
  const diffs = diff$1.diffLines(targetContents, templateContents);
181
188
  for (const diff of diffs) {
182
189
  if (diff.added) {
183
- process.stdout.write(chalk__default['default'].green(`+${diff.value}`));
190
+ process.stdout.write(chalk__default["default"].green(`+${diff.value}`));
184
191
  } else if (diff.removed) {
185
- process.stdout.write(chalk__default['default'].red(`-${diff.value}`));
192
+ process.stdout.write(chalk__default["default"].red(`-${diff.value}`));
186
193
  } else {
187
194
  process.stdout.write(` ${diff.value}`);
188
195
  }
@@ -191,9 +198,9 @@ async function exactMatchHandler({path, write, missing, targetContents, template
191
198
  await write(templateContents);
192
199
  }
193
200
  }
194
- async function existsHandler({path, write, missing, templateContents}, prompt) {
201
+ async function existsHandler({ path, write, missing, templateContents }, prompt) {
195
202
  console.log(`Making sure ${path} exists`);
196
- const coloredPath = chalk__default['default'].cyan(path);
203
+ const coloredPath = chalk__default["default"].cyan(path);
197
204
  if (missing) {
198
205
  if (await prompt(`Missing ${coloredPath}, do you want to add it?`)) {
199
206
  await write(templateContents);
@@ -201,7 +208,7 @@ async function existsHandler({path, write, missing, templateContents}, prompt) {
201
208
  return;
202
209
  }
203
210
  }
204
- async function skipHandler({path}) {
211
+ async function skipHandler({ path }) {
205
212
  console.log(`Skipping ${path}`);
206
213
  }
207
214
  const handlers = {
@@ -224,10 +231,10 @@ async function handleAllFiles(fileHandlers, files, promptFunc) {
224
231
  }
225
232
 
226
233
  const inquirerPromptFunc = async (msg) => {
227
- const {result} = await inquirer__default['default'].prompt({
234
+ const { result } = await inquirer__default["default"].prompt({
228
235
  type: "confirm",
229
236
  name: "result",
230
- message: chalk__default['default'].blue(msg)
237
+ message: chalk__default["default"].blue(msg)
231
238
  });
232
239
  return result;
233
240
  };
@@ -235,7 +242,7 @@ const makeCheckPromptFunc = () => {
235
242
  let failed = false;
236
243
  const promptFunc = async (msg) => {
237
244
  failed = true;
238
- console.log(chalk__default['default'].red(`[Check Failed] ${msg}`));
245
+ console.log(chalk__default["default"].red(`[Check Failed] ${msg}`));
239
246
  return false;
240
247
  };
241
248
  const finalize = () => {
@@ -251,12 +258,12 @@ const yesPromptFunc = async (msg) => {
251
258
  };
252
259
 
253
260
  async function readTemplateFile(templateFile, templateVars) {
254
- const contents = await fs__default['default'].readFile(templateFile, "utf8");
261
+ const contents = await fs__default["default"].readFile(templateFile, "utf8");
255
262
  if (!templateFile.endsWith(".hbs")) {
256
263
  return contents;
257
264
  }
258
265
  const packageVersionProvider = index.createPackageVersionProvider(void 0);
259
- return handlebars__default['default'].compile(contents)(templateVars, {
266
+ return handlebars__default["default"].compile(contents)(templateVars, {
260
267
  helpers: {
261
268
  versionQuery(name, hint) {
262
269
  return packageVersionProvider(name, typeof hint === "string" ? hint : void 0);
@@ -265,28 +272,28 @@ async function readTemplateFile(templateFile, templateVars) {
265
272
  });
266
273
  }
267
274
  async function readTemplate(templateDir, templateVars) {
268
- const templateFilePaths = await recursive__default['default'](templateDir).catch((error) => {
275
+ const templateFilePaths = await recursive__default["default"](templateDir).catch((error) => {
269
276
  throw new Error(`Failed to read template directory: ${error.message}`);
270
277
  });
271
278
  const templatedFiles = new Array();
272
279
  for (const templateFile of templateFilePaths) {
273
280
  const path$1 = path.relative(templateDir, templateFile).replace(/\.hbs$/, "");
274
281
  const contents = await readTemplateFile(templateFile, templateVars);
275
- templatedFiles.push({path: path$1, contents});
282
+ templatedFiles.push({ path: path$1, contents });
276
283
  }
277
284
  return templatedFiles;
278
285
  }
279
286
  async function diffTemplatedFiles(targetDir, templatedFiles) {
280
287
  const fileDiffs = new Array();
281
- for (const {path: path$1, contents: templateContents} of templatedFiles) {
288
+ for (const { path: path$1, contents: templateContents } of templatedFiles) {
282
289
  const targetPath = path.resolve(targetDir, path$1);
283
- const targetExists = await fs__default['default'].pathExists(targetPath);
290
+ const targetExists = await fs__default["default"].pathExists(targetPath);
284
291
  const write = async (contents) => {
285
- await fs__default['default'].ensureDir(path.dirname(targetPath));
286
- await fs__default['default'].writeFile(targetPath, contents, "utf8");
292
+ await fs__default["default"].ensureDir(path.dirname(targetPath));
293
+ await fs__default["default"].writeFile(targetPath, contents, "utf8");
287
294
  };
288
295
  if (targetExists) {
289
- const targetContents = await fs__default['default'].readFile(targetPath, "utf8");
296
+ const targetContents = await fs__default["default"].readFile(targetPath, "utf8");
290
297
  fileDiffs.push({
291
298
  path: path$1,
292
299
  write,
@@ -364,14 +371,14 @@ async function readPluginData() {
364
371
  } catch (error) {
365
372
  throw new Error(`Failed to read target package, ${error}`);
366
373
  }
367
- const pluginTsContents = await fs__default['default'].readFile(index.paths.resolveTarget("src/plugin.ts"), "utf8");
374
+ const pluginTsContents = await fs__default["default"].readFile(index.paths.resolveTarget("src/plugin.ts"), "utf8");
368
375
  const pluginIdMatch = pluginTsContents.match(/id: ['"`](.+?)['"`]/);
369
376
  if (!pluginIdMatch) {
370
377
  throw new Error(`Failed to parse plugin.ts, no plugin ID found`);
371
378
  }
372
379
  const id = pluginIdMatch[1];
373
- return {id, name, privatePackage, pluginVersion, npmRegistry};
380
+ return { id, name, privatePackage, pluginVersion, npmRegistry };
374
381
  }
375
382
 
376
- exports.default = diff;
377
- //# sourceMappingURL=diff-e3661054.cjs.js.map
383
+ exports["default"] = diff;
384
+ //# sourceMappingURL=diff-79e33159.cjs.js.map
@@ -2,9 +2,9 @@
2
2
 
3
3
  var configLoader = require('@backstage/config-loader');
4
4
  var openBrowser = require('react-dev-utils/openBrowser');
5
- var config = require('./config-24fce3c1.cjs.js');
5
+ var config = require('./config-91083c1e.cjs.js');
6
6
  require('@backstage/config');
7
- require('./index-6fee1c9a.cjs.js');
7
+ require('./index-b2152549.cjs.js');
8
8
  require('commander');
9
9
  require('chalk');
10
10
  require('fs-extra');
@@ -19,14 +19,14 @@ var openBrowser__default = /*#__PURE__*/_interopDefaultLegacy(openBrowser);
19
19
 
20
20
  const DOCS_URL = "https://config.backstage.io";
21
21
  var docs = async (cmd) => {
22
- const {schema: appSchemas} = await config.loadCliConfig({
22
+ const { schema: appSchemas } = await config.loadCliConfig({
23
23
  args: [],
24
24
  fromPackage: cmd.package,
25
25
  mockEnv: true
26
26
  });
27
27
  const schema = configLoader.mergeConfigSchemas(appSchemas.serialize().schemas.map((_) => _.value));
28
- openBrowser__default['default'](`${DOCS_URL}#schema=${JSON.stringify(schema)}`);
28
+ openBrowser__default["default"](`${DOCS_URL}#schema=${JSON.stringify(schema)}`);
29
29
  };
30
30
 
31
- exports.default = docs;
32
- //# sourceMappingURL=docs-ceb404a3.cjs.js.map
31
+ exports["default"] = docs;
32
+ //# sourceMappingURL=docs-a8506fde.cjs.js.map
@@ -4,8 +4,8 @@ var fs = require('fs-extra');
4
4
  var path = require('path');
5
5
  var os = require('os');
6
6
  var tar = require('tar');
7
- var index = require('./index-6fee1c9a.cjs.js');
8
- var run = require('./run-59c4395e.cjs.js');
7
+ var index = require('./index-b2152549.cjs.js');
8
+ var run = require('./run-8388d249.cjs.js');
9
9
 
10
10
  function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
11
11
 
@@ -18,29 +18,32 @@ const UNSAFE_PACKAGES = [
18
18
  ];
19
19
  async function createDistWorkspace(packageNames, options = {}) {
20
20
  var _a, _b, _c;
21
- const targetDir = (_a = options.targetDir) != null ? _a : await fs__default['default'].mkdtemp(path.resolve(os.tmpdir(), "dist-workspace"));
21
+ const targetDir = (_a = options.targetDir) != null ? _a : await fs__default["default"].mkdtemp(path.resolve(os.tmpdir(), "dist-workspace"));
22
22
  const targets = await findTargetPackages(packageNames);
23
23
  if (options.buildDependencies) {
24
24
  const exclude = (_b = options.buildExcludes) != null ? _b : [];
25
- const scopeArgs = targets.filter((target) => !exclude.includes(target.name)).flatMap((target) => ["--scope", target.name]);
26
- const lernaArgs = options.parallel && Number.isInteger(options.parallel) ? ["--concurrency", options.parallel.toString()] : [];
27
- await run.run("yarn", ["lerna", ...lernaArgs, "run", ...scopeArgs, "build"], {
28
- cwd: index.paths.targetRoot
29
- });
25
+ const toBuild = targets.filter((target) => !exclude.includes(target.name));
26
+ if (toBuild.length > 0) {
27
+ const scopeArgs = toBuild.flatMap((target) => ["--scope", target.name]);
28
+ const lernaArgs = options.parallel && Number.isInteger(options.parallel) ? ["--concurrency", options.parallel.toString()] : [];
29
+ await run.run("yarn", ["lerna", ...lernaArgs, "run", ...scopeArgs, "build"], {
30
+ cwd: index.paths.targetRoot
31
+ });
32
+ }
30
33
  }
31
34
  await moveToDistWorkspace(targetDir, targets);
32
35
  const files = (_c = options.files) != null ? _c : ["yarn.lock", "package.json"];
33
36
  for (const file of files) {
34
37
  const src = typeof file === "string" ? file : file.src;
35
38
  const dest = typeof file === "string" ? file : file.dest;
36
- await fs__default['default'].copy(index.paths.resolveTargetRoot(src), path.resolve(targetDir, dest));
39
+ await fs__default["default"].copy(index.paths.resolveTargetRoot(src), path.resolve(targetDir, dest));
37
40
  }
38
41
  if (options.skeleton) {
39
42
  const skeletonFiles = targets.map((target) => {
40
43
  const dir = path.relative(index.paths.targetRoot, target.location);
41
44
  return path.join(dir, "package.json");
42
45
  });
43
- await tar__default['default'].create({
46
+ await tar__default["default"].create({
44
47
  file: path.resolve(targetDir, options.skeleton),
45
48
  cwd: targetDir,
46
49
  portable: true,
@@ -58,24 +61,24 @@ async function moveToDistWorkspace(workspaceDir, localPackages) {
58
61
  cwd: target.location
59
62
  });
60
63
  if (target.scripts.postpack) {
61
- await run.run("yarn", ["postpack"], {cwd: target.location});
64
+ await run.run("yarn", ["postpack"], { cwd: target.location });
62
65
  }
63
66
  const outputDir = path.relative(index.paths.targetRoot, target.location);
64
67
  const absoluteOutputPath = path.resolve(workspaceDir, outputDir);
65
- await fs__default['default'].ensureDir(absoluteOutputPath);
66
- await tar__default['default'].extract({
68
+ await fs__default["default"].ensureDir(absoluteOutputPath);
69
+ await tar__default["default"].extract({
67
70
  file: archivePath,
68
71
  cwd: absoluteOutputPath,
69
72
  strip: 1
70
73
  });
71
- await fs__default['default'].remove(archivePath);
74
+ await fs__default["default"].remove(archivePath);
72
75
  if (target.get("bundled")) {
73
- const pkgJson = await fs__default['default'].readJson(path.resolve(absoluteOutputPath, "package.json"));
76
+ const pkgJson = await fs__default["default"].readJson(path.resolve(absoluteOutputPath, "package.json"));
74
77
  delete pkgJson.dependencies;
75
78
  delete pkgJson.devDependencies;
76
79
  delete pkgJson.peerDependencies;
77
80
  delete pkgJson.optionalDependencies;
78
- await fs__default['default'].writeJson(path.resolve(absoluteOutputPath, "package.json"), pkgJson, {
81
+ await fs__default["default"].writeJson(path.resolve(absoluteOutputPath, "package.json"), pkgJson, {
79
82
  spaces: 2
80
83
  });
81
84
  }
@@ -89,12 +92,12 @@ async function moveToDistWorkspace(workspaceDir, localPackages) {
89
92
  }
90
93
  async function findTargetPackages(pkgNames) {
91
94
  var _a;
92
- const {Project} = require("@lerna/project");
93
- const {PackageGraph} = require("@lerna/package-graph");
95
+ const { Project } = require("@lerna/project");
96
+ const { PackageGraph } = require("@lerna/package-graph");
94
97
  const project = new Project(index.paths.targetDir);
95
98
  const packages = await project.getPackages();
96
99
  const graph = new PackageGraph(packages);
97
- const targets = new Map();
100
+ const targets = /* @__PURE__ */ new Map();
98
101
  const searchNames = pkgNames.slice();
99
102
  while (searchNames.length) {
100
103
  const name = searchNames.pop();
@@ -117,4 +120,4 @@ async function findTargetPackages(pkgNames) {
117
120
  }
118
121
 
119
122
  exports.createDistWorkspace = createDistWorkspace;
120
- //# sourceMappingURL=index-26bec8ac.cjs.js.map
123
+ //# sourceMappingURL=index-33d9cbba.cjs.js.map