@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
@@ -4,12 +4,14 @@ var fs = require('fs-extra');
4
4
  var path = require('path');
5
5
  var chalk = require('chalk');
6
6
  var inquirer = require('inquirer');
7
- var tasks = require('./tasks-9bd3e946.cjs.js');
8
- var index = require('./index-6fee1c9a.cjs.js');
7
+ var tasks = require('./tasks-f12b95ba.cjs.js');
8
+ var index = require('./index-b2152549.cjs.js');
9
9
  var errors = require('@backstage/errors');
10
10
  require('handlebars');
11
11
  require('ora');
12
+ require('util');
12
13
  require('recursive-readdir');
14
+ require('child_process');
13
15
  require('commander');
14
16
  require('semver');
15
17
  require('@backstage/cli-common');
@@ -26,45 +28,45 @@ const BACKSTAGE = "@backstage";
26
28
  const checkExists = async (rootDir, pluginName) => {
27
29
  await tasks.Task.forItem("checking", pluginName, async () => {
28
30
  try {
29
- const destination = path__default['default'].join(rootDir, "plugins", pluginName);
30
- const pathExist = await fs__default['default'].pathExists(destination);
31
+ const destination = path__default["default"].join(rootDir, "plugins", pluginName);
32
+ const pathExist = await fs__default["default"].pathExists(destination);
31
33
  if (!pathExist) {
32
- throw new Error(chalk__default['default'].red(` Plugin ${chalk__default['default'].cyan(pluginName)} does not exist!`));
34
+ throw new Error(chalk__default["default"].red(` Plugin ${chalk__default["default"].cyan(pluginName)} does not exist!`));
33
35
  }
34
36
  } catch (e) {
35
37
  errors.assertError(e);
36
- throw new Error(chalk__default['default'].red(` There was an error removing plugin ${chalk__default['default'].cyan(pluginName)}: ${e.message}`));
38
+ throw new Error(chalk__default["default"].red(` There was an error removing plugin ${chalk__default["default"].cyan(pluginName)}: ${e.message}`));
37
39
  }
38
40
  });
39
41
  };
40
42
  const removePluginDirectory = async (destination) => {
41
43
  await tasks.Task.forItem("removing", "plugin files", async () => {
42
44
  try {
43
- await fs__default['default'].remove(destination);
45
+ await fs__default["default"].remove(destination);
44
46
  } catch (e) {
45
47
  errors.assertError(e);
46
- throw Error(chalk__default['default'].red(` There was a problem removing the plugin directory: ${e.message}`));
48
+ throw Error(chalk__default["default"].red(` There was a problem removing the plugin directory: ${e.message}`));
47
49
  }
48
50
  });
49
51
  };
50
52
  const removeSymLink = async (destination) => {
51
53
  await tasks.Task.forItem("removing", "symbolic link", async () => {
52
- const symLinkExists = await fs__default['default'].pathExists(destination);
54
+ const symLinkExists = await fs__default["default"].pathExists(destination);
53
55
  if (symLinkExists) {
54
56
  try {
55
- await fs__default['default'].remove(destination);
57
+ await fs__default["default"].remove(destination);
56
58
  } catch (e) {
57
59
  errors.assertError(e);
58
- throw Error(chalk__default['default'].red(` Could not remove symbolic link ${chalk__default['default'].cyan(destination)}: ${e.message}`));
60
+ throw Error(chalk__default["default"].red(` Could not remove symbolic link ${chalk__default["default"].cyan(destination)}: ${e.message}`));
59
61
  }
60
62
  }
61
63
  });
62
64
  };
63
65
  const removeAllStatementsContainingID = async (file, ID) => {
64
- const originalContent = await fs__default['default'].readFile(file, "utf8");
66
+ const originalContent = await fs__default["default"].readFile(file, "utf8");
65
67
  const contentAfterRemoval = originalContent.split("\n").filter((statement) => !statement.includes(`${ID}`)).join("\n");
66
68
  if (originalContent !== contentAfterRemoval) {
67
- await fs__default['default'].writeFile(file, contentAfterRemoval, "utf8");
69
+ await fs__default["default"].writeFile(file, contentAfterRemoval, "utf8");
68
70
  }
69
71
  };
70
72
  const capitalize = (str) => str.charAt(0).toUpperCase() + str.slice(1);
@@ -75,7 +77,7 @@ const removeReferencesFromPluginsFile = async (pluginsFile, pluginName) => {
75
77
  await removeAllStatementsContainingID(pluginsFile, pluginNameCapitalized);
76
78
  } catch (e) {
77
79
  errors.assertError(e);
78
- throw new Error(chalk__default['default'].red(` There was an error removing export statement for plugin ${chalk__default['default'].cyan(pluginNameCapitalized)}: ${e.message}`));
80
+ throw new Error(chalk__default["default"].red(` There was an error removing export statement for plugin ${chalk__default["default"].cyan(pluginNameCapitalized)}: ${e.message}`));
79
81
  }
80
82
  });
81
83
  };
@@ -85,7 +87,7 @@ const removePluginFromCodeOwners = async (codeOwnersFile, pluginName) => {
85
87
  await removeAllStatementsContainingID(codeOwnersFile, pluginName);
86
88
  } catch (e) {
87
89
  errors.assertError(e);
88
- throw new Error(chalk__default['default'].red(` There was an error removing code owners statement for plugin ${chalk__default['default'].cyan(pluginName)}: ${e.message}`));
90
+ throw new Error(chalk__default["default"].red(` There was an error removing code owners statement for plugin ${chalk__default["default"].cyan(pluginName)}: ${e.message}`));
89
91
  }
90
92
  });
91
93
  };
@@ -93,44 +95,45 @@ const removeReferencesFromAppPackage = async (appPackageFile, pluginName) => {
93
95
  const pluginPackage = `${BACKSTAGE}/plugin-${pluginName}`;
94
96
  await tasks.Task.forItem("removing", "plugin app dependency", async () => {
95
97
  try {
96
- const appPackageFileContent = await fs__default['default'].readFile(appPackageFile, "utf-8");
98
+ const appPackageFileContent = await fs__default["default"].readFile(appPackageFile, "utf-8");
97
99
  const appPackageFileContentJSON = JSON.parse(appPackageFileContent);
98
100
  const dependencies = appPackageFileContentJSON.dependencies;
99
101
  if (!dependencies[pluginPackage]) {
100
- throw new Error(chalk__default['default'].red(` Plugin ${chalk__default['default'].cyan(pluginPackage)} does not exist in ${chalk__default['default'].cyan(appPackageFile)}`));
102
+ throw new Error(chalk__default["default"].red(` Plugin ${chalk__default["default"].cyan(pluginPackage)} does not exist in ${chalk__default["default"].cyan(appPackageFile)}`));
101
103
  }
102
104
  delete dependencies[pluginPackage];
103
- await fs__default['default'].writeFile(appPackageFile, `${JSON.stringify(appPackageFileContentJSON, null, 2)}
105
+ await fs__default["default"].writeFile(appPackageFile, `${JSON.stringify(appPackageFileContentJSON, null, 2)}
104
106
  `, "utf-8");
105
107
  } catch (e) {
106
108
  errors.assertError(e);
107
- throw new Error(chalk__default['default'].red(` Failed to remove plugin as dependency in app: ${chalk__default['default'].cyan(appPackageFile)}: ${e.message}`));
109
+ throw new Error(chalk__default["default"].red(` Failed to remove plugin as dependency in app: ${chalk__default["default"].cyan(appPackageFile)}: ${e.message}`));
108
110
  }
109
111
  });
110
112
  };
111
113
  var removePlugin = async () => {
114
+ console.warn(chalk__default["default"].yellow("[DEPRECATED] - The remove-plugin command is deprecated and will be removed in the future."));
112
115
  const questions = [
113
116
  {
114
117
  type: "input",
115
118
  name: "pluginName",
116
- message: chalk__default['default'].blue("Enter the ID of the plugin to be removed [required]"),
119
+ message: chalk__default["default"].blue("Enter the ID of the plugin to be removed [required]"),
117
120
  validate: (value) => {
118
121
  if (!value) {
119
- return chalk__default['default'].red("Please enter an ID for the plugin");
122
+ return chalk__default["default"].red("Please enter an ID for the plugin");
120
123
  } else if (!/^[a-z0-9]+(-[a-z0-9]+)*$/.test(value)) {
121
- return chalk__default['default'].red("Plugin IDs must be lowercase and contain only letters, digits and dashes.");
124
+ return chalk__default["default"].red("Plugin IDs must be lowercase and contain only letters, digits and dashes.");
122
125
  }
123
126
  return true;
124
127
  }
125
128
  }
126
129
  ];
127
- const answers = await inquirer__default['default'].prompt(questions);
130
+ const answers = await inquirer__default["default"].prompt(questions);
128
131
  const pluginName = answers.pluginName;
129
132
  const appPackage = index.paths.resolveTargetRoot("packages/app");
130
133
  const pluginDir = index.paths.resolveTargetRoot("plugins", answers.pluginName);
131
134
  const codeOwnersFile = await tasks.getCodeownersFilePath(index.paths.targetRoot);
132
- const appPackageFile = path__default['default'].join(appPackage, "package.json");
133
- const appPluginsFile = path__default['default'].join(appPackage, "src", "plugins.ts");
135
+ const appPackageFile = path__default["default"].join(appPackage, "package.json");
136
+ const appPluginsFile = path__default["default"].join(appPackage, "src", "plugins.ts");
134
137
  const pluginScopedDirectory = index.paths.resolveTargetRoot("node_modules", BACKSTAGE, `plugin-${pluginName}`);
135
138
  tasks.Task.log();
136
139
  tasks.Task.log("Removing the plugin...");
@@ -142,7 +145,7 @@ var removePlugin = async () => {
142
145
  await removePluginDirectory(pluginDir);
143
146
  tasks.Task.section("Removing symbolic link from @backstage.");
144
147
  await removeSymLink(pluginScopedDirectory);
145
- if (await fs__default['default'].pathExists(appPackage)) {
148
+ if (await fs__default["default"].pathExists(appPackage)) {
146
149
  tasks.Task.section("Removing references from plugins.ts.");
147
150
  await removeReferencesFromPluginsFile(appPluginsFile, pluginName);
148
151
  tasks.Task.section("Removing plugin dependency from app.");
@@ -153,7 +156,7 @@ var removePlugin = async () => {
153
156
  await removePluginFromCodeOwners(codeOwnersFile, pluginName);
154
157
  }
155
158
  tasks.Task.log();
156
- tasks.Task.log(`\u{1F947} Successfully removed ${chalk__default['default'].cyan(`@backstage/plugin-${answers.id}`)}`);
159
+ tasks.Task.log(`\u{1F947} Successfully removed ${chalk__default["default"].cyan(`@backstage/plugin-${answers.id}`)}`);
157
160
  tasks.Task.log();
158
161
  } catch (error) {
159
162
  errors.assertError(error);
@@ -163,10 +166,10 @@ var removePlugin = async () => {
163
166
  };
164
167
 
165
168
  exports.checkExists = checkExists;
166
- exports.default = removePlugin;
169
+ exports["default"] = removePlugin;
167
170
  exports.removePluginDirectory = removePluginDirectory;
168
171
  exports.removePluginFromCodeOwners = removePluginFromCodeOwners;
169
172
  exports.removeReferencesFromAppPackage = removeReferencesFromAppPackage;
170
173
  exports.removeReferencesFromPluginsFile = removeReferencesFromPluginsFile;
171
174
  exports.removeSymLink = removeSymLink;
172
- //# sourceMappingURL=removePlugin-f82ac16a.cjs.js.map
175
+ //# sourceMappingURL=removePlugin-891ec166.cjs.js.map
@@ -1,14 +1,14 @@
1
1
  'use strict';
2
2
 
3
3
  var child_process = require('child_process');
4
- var index = require('./index-6fee1c9a.cjs.js');
4
+ var index = require('./index-b2152549.cjs.js');
5
5
  var util = require('util');
6
6
  var errors = require('@backstage/errors');
7
7
 
8
8
  const execFile = util.promisify(child_process.execFile);
9
9
  async function run(name, args = [], options = {}) {
10
10
  var _a;
11
- const {stdoutLogFunc, stderrLogFunc} = options;
11
+ const { stdoutLogFunc, stderrLogFunc } = options;
12
12
  const env = {
13
13
  ...process.env,
14
14
  FORCE_COLOR: "true",
@@ -35,7 +35,7 @@ async function run(name, args = [], options = {}) {
35
35
  }
36
36
  async function runPlain(cmd, ...args) {
37
37
  try {
38
- const {stdout} = await execFile(cmd, args, {shell: true});
38
+ const { stdout } = await execFile(cmd, args, { shell: true });
39
39
  return stdout.trim();
40
40
  } catch (error) {
41
41
  errors.assertError(error);
@@ -50,7 +50,7 @@ async function runPlain(cmd, ...args) {
50
50
  }
51
51
  async function runCheck(cmd, ...args) {
52
52
  try {
53
- await execFile(cmd, args, {shell: true});
53
+ await execFile(cmd, args, { shell: true });
54
54
  return true;
55
55
  } catch (error) {
56
56
  return false;
@@ -78,4 +78,4 @@ async function waitForExit(child, name) {
78
78
  exports.run = run;
79
79
  exports.runCheck = runCheck;
80
80
  exports.runPlain = runPlain;
81
- //# sourceMappingURL=run-59c4395e.cjs.js.map
81
+ //# sourceMappingURL=run-8388d249.cjs.js.map
@@ -1,10 +1,10 @@
1
1
  'use strict';
2
2
 
3
3
  var yaml = require('yaml');
4
- var config = require('./config-24fce3c1.cjs.js');
4
+ var config = require('./config-91083c1e.cjs.js');
5
5
  var configLoader = require('@backstage/config-loader');
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');
@@ -14,7 +14,7 @@ require('@backstage/config/package.json');
14
14
  require('@backstage/errors');
15
15
 
16
16
  var schema = async (cmd) => {
17
- const {schema} = await config.loadCliConfig({
17
+ const { schema } = await config.loadCliConfig({
18
18
  args: [],
19
19
  fromPackage: cmd.package,
20
20
  mockEnv: true
@@ -31,5 +31,5 @@ var schema = async (cmd) => {
31
31
  }
32
32
  };
33
33
 
34
- exports.default = schema;
35
- //# sourceMappingURL=schema-398d8593.cjs.js.map
34
+ exports["default"] = schema;
35
+ //# sourceMappingURL=schema-80516b43.cjs.js.map
@@ -13,16 +13,16 @@ require('webpack-node-externals');
13
13
  require('@backstage/cli-common');
14
14
  require('terser-webpack-plugin');
15
15
  require('mini-css-extract-plugin');
16
- var index = require('./index-6fee1c9a.cjs.js');
17
- require('./run-59c4395e.cjs.js');
16
+ var index = require('./index-b2152549.cjs.js');
17
+ require('./run-8388d249.cjs.js');
18
18
  require('lodash/pickBy');
19
19
  require('yn');
20
20
  require('react-dev-utils/FileSizeReporter');
21
21
  require('react-dev-utils/formatWebpackMessages');
22
- var server = require('./server-107d9cc0.cjs.js');
23
- var config = require('./config-24fce3c1.cjs.js');
24
- var Lockfile = require('./Lockfile-80f0eec4.cjs.js');
25
- var lint = require('./lint-6175d471.cjs.js');
22
+ var server = require('./server-b2f87b69.cjs.js');
23
+ var config = require('./config-91083c1e.cjs.js');
24
+ var Lockfile = require('./Lockfile-35661afa.cjs.js');
25
+ var lint = require('./lint-a78b8bb6.cjs.js');
26
26
  require('commander');
27
27
  require('semver');
28
28
  require('@backstage/config/package.json');
@@ -31,9 +31,9 @@ require('child_process');
31
31
  require('util');
32
32
  require('webpack-dev-server');
33
33
  require('react-dev-utils/openBrowser');
34
- require('./paths-09202a46.cjs.js');
34
+ require('./paths-f9c22b94.cjs.js');
35
35
  require('./parallel-a4714c72.cjs.js');
36
- require('./svgrTemplate-2d0d15cf.cjs.js');
36
+ require('./svgrTemplate-f19e974c.cjs.js');
37
37
  require('@backstage/config-loader');
38
38
  require('@backstage/config');
39
39
  require('@yarnpkg/lockfile');
@@ -50,18 +50,18 @@ var serve = async (cmd) => {
50
50
  const result = lockfile.analyze({
51
51
  filter: lint.includedFilter
52
52
  });
53
- const problemPackages = [...result.newVersions, ...result.newRanges].map(({name: name2}) => name2);
53
+ const problemPackages = [...result.newVersions, ...result.newRanges].map(({ name: name2 }) => name2);
54
54
  if (problemPackages.length > 1) {
55
- console.log(chalk__default['default'].yellow(`\u26A0\uFE0F Some of the following packages may be outdated or have duplicate installations:
55
+ console.log(chalk__default["default"].yellow(`\u26A0\uFE0F Some of the following packages may be outdated or have duplicate installations:
56
56
 
57
- ${uniq__default['default'](problemPackages).join(", ")}
57
+ ${uniq__default["default"](problemPackages).join(", ")}
58
58
  `));
59
- console.log(chalk__default['default'].yellow(`\u26A0\uFE0F This can be resolved using the following command:
59
+ console.log(chalk__default["default"].yellow(`\u26A0\uFE0F This can be resolved using the following command:
60
60
 
61
61
  yarn backstage-cli versions:check --fix
62
62
  `));
63
63
  }
64
- const {name} = await fs__default['default'].readJson(index.paths.resolveTarget("package.json"));
64
+ const { name } = await fs__default["default"].readJson(index.paths.resolveTarget("package.json"));
65
65
  const waitForExit = await server.serveBundle({
66
66
  entry: "src/index",
67
67
  checksEnabled: cmd.check,
@@ -74,5 +74,5 @@ var serve = async (cmd) => {
74
74
  await waitForExit();
75
75
  };
76
76
 
77
- exports.default = serve;
78
- //# sourceMappingURL=serve-708fbf98.cjs.js.map
77
+ exports["default"] = serve;
78
+ //# sourceMappingURL=serve-1b0ace54.cjs.js.map
@@ -11,15 +11,15 @@ require('webpack-node-externals');
11
11
  require('@backstage/cli-common');
12
12
  require('terser-webpack-plugin');
13
13
  require('mini-css-extract-plugin');
14
- var index = require('./index-6fee1c9a.cjs.js');
15
- require('./run-59c4395e.cjs.js');
14
+ var index = require('./index-b2152549.cjs.js');
15
+ require('./run-8388d249.cjs.js');
16
16
  require('lodash/pickBy');
17
17
  require('yn');
18
18
  require('react-dev-utils/FileSizeReporter');
19
19
  require('react-dev-utils/formatWebpackMessages');
20
20
  require('chalk');
21
- var server = require('./server-107d9cc0.cjs.js');
22
- var config = require('./config-24fce3c1.cjs.js');
21
+ var server = require('./server-b2f87b69.cjs.js');
22
+ var config = require('./config-91083c1e.cjs.js');
23
23
  require('commander');
24
24
  require('semver');
25
25
  require('@backstage/config/package.json');
@@ -28,9 +28,9 @@ require('child_process');
28
28
  require('util');
29
29
  require('webpack-dev-server');
30
30
  require('react-dev-utils/openBrowser');
31
- require('./paths-09202a46.cjs.js');
31
+ require('./paths-f9c22b94.cjs.js');
32
32
  require('./parallel-a4714c72.cjs.js');
33
- require('./svgrTemplate-2d0d15cf.cjs.js');
33
+ require('./svgrTemplate-f19e974c.cjs.js');
34
34
  require('@backstage/config-loader');
35
35
  require('@backstage/config');
36
36
 
@@ -39,7 +39,7 @@ function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'defau
39
39
  var fs__default = /*#__PURE__*/_interopDefaultLegacy(fs);
40
40
 
41
41
  var serve = async (cmd) => {
42
- const {name} = await fs__default['default'].readJson(index.paths.resolveTarget("package.json"));
42
+ const { name } = await fs__default["default"].readJson(index.paths.resolveTarget("package.json"));
43
43
  const waitForExit = await server.serveBundle({
44
44
  entry: "dev/index",
45
45
  checksEnabled: cmd.check,
@@ -52,5 +52,5 @@ var serve = async (cmd) => {
52
52
  await waitForExit();
53
53
  };
54
54
 
55
- exports.default = serve;
56
- //# sourceMappingURL=serve-f4bb3cb0.cjs.js.map
55
+ exports["default"] = serve;
56
+ //# sourceMappingURL=serve-6c335165.cjs.js.map
@@ -4,7 +4,7 @@ var fs = require('fs-extra');
4
4
  var webpack = require('webpack');
5
5
  var WebpackDevServer = require('webpack-dev-server');
6
6
  var openBrowser = require('react-dev-utils/openBrowser');
7
- var paths = require('./paths-09202a46.cjs.js');
7
+ var paths = require('./paths-f9c22b94.cjs.js');
8
8
 
9
9
  function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
10
10
 
@@ -20,14 +20,14 @@ async function serveBundle(options) {
20
20
  const port = options.frontendConfig.getOptionalNumber("app.listen.port") || Number(url.port) || (url.protocol === "https:" ? 443 : 80);
21
21
  const paths$1 = paths.resolveBundlingPaths(options);
22
22
  const pkgPath = paths$1.targetPackageJson;
23
- const pkg = await fs__default['default'].readJson(pkgPath);
23
+ const pkg = await fs__default["default"].readJson(pkgPath);
24
24
  const config = await paths.createConfig(paths$1, {
25
25
  ...options,
26
26
  isDev: true,
27
27
  baseUrl: url
28
28
  });
29
- const compiler = webpack__default['default'](config);
30
- const server = new WebpackDevServer__default['default'](compiler, {
29
+ const compiler = webpack__default["default"](config);
30
+ const server = new WebpackDevServer__default["default"](compiler, {
31
31
  hot: !process.env.CI,
32
32
  devMiddleware: {
33
33
  publicPath: (_a = config.output) == null ? void 0 : _a.publicPath,
@@ -52,7 +52,7 @@ async function serveBundle(options) {
52
52
  reject(err);
53
53
  return;
54
54
  }
55
- openBrowser__default['default'](url.href);
55
+ openBrowser__default["default"](url.href);
56
56
  resolve();
57
57
  });
58
58
  });
@@ -70,4 +70,4 @@ async function serveBundle(options) {
70
70
  }
71
71
 
72
72
  exports.serveBundle = serveBundle;
73
- //# sourceMappingURL=server-107d9cc0.cjs.js.map
73
+ //# sourceMappingURL=server-b2f87b69.cjs.js.map
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- function svgrTemplate({template}, _opts, {imports, interfaces, componentName, jsx}) {
3
+ function svgrTemplate({ template }, _opts, { imports, interfaces, componentName, jsx }) {
4
4
  const iconName = {
5
5
  ...componentName,
6
6
  name: `${componentName.name.replace(/icon$/, "")}Icon`
@@ -9,7 +9,7 @@ function svgrTemplate({template}, _opts, {imports, interfaces, componentName, js
9
9
  type: "ExportDefaultDeclaration",
10
10
  declaration: iconName
11
11
  };
12
- const typeScriptTemplate = template.smart({plugins: ["typescript"]});
12
+ const typeScriptTemplate = template.smart({ plugins: ["typescript"] });
13
13
  return typeScriptTemplate.ast`
14
14
  ${imports}
15
15
  import SvgIcon from '@material-ui/core/SvgIcon';
@@ -22,4 +22,4 @@ ${defaultExport}`;
22
22
  }
23
23
 
24
24
  exports.svgrTemplate = svgrTemplate;
25
- //# sourceMappingURL=svgrTemplate-2d0d15cf.cjs.js.map
25
+ //# sourceMappingURL=svgrTemplate-f19e974c.cjs.js.map
@@ -2,11 +2,14 @@
2
2
 
3
3
  var fs = require('fs-extra');
4
4
  var path = require('path');
5
+ var index = require('./index-b2152549.cjs.js');
5
6
  var chalk = require('chalk');
6
7
  var handlebars = require('handlebars');
7
8
  var ora = require('ora');
9
+ var util = require('util');
8
10
  var recursive = require('recursive-readdir');
9
- var index = require('./index-6fee1c9a.cjs.js');
11
+ var child_process = require('child_process');
12
+ var errors = require('@backstage/errors');
10
13
 
11
14
  function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
12
15
 
@@ -22,14 +25,14 @@ const USER_ID_RE = /^@[-\w]+$/;
22
25
  const EMAIL_RE = /^[^@]+@[-.\w]+\.[-\w]+$/i;
23
26
  const DEFAULT_OWNER = "@backstage/maintainers";
24
27
  async function getCodeownersFilePath(rootDir) {
25
- const paths = [
26
- path__default['default'].join(rootDir, ".github", "CODEOWNERS"),
27
- path__default['default'].join(rootDir, ".gitlab", "CODEOWNERS"),
28
- path__default['default'].join(rootDir, "docs", "CODEOWNERS"),
29
- path__default['default'].join(rootDir, "CODEOWNERS")
28
+ const possiblePaths = [
29
+ path__default["default"].join(rootDir, ".github", "CODEOWNERS"),
30
+ path__default["default"].join(rootDir, ".gitlab", "CODEOWNERS"),
31
+ path__default["default"].join(rootDir, "docs", "CODEOWNERS"),
32
+ path__default["default"].join(rootDir, "CODEOWNERS")
30
33
  ];
31
- for (const p of paths) {
32
- if (await fs__default['default'].pathExists(p)) {
34
+ for (const p of possiblePaths) {
35
+ if (await fs__default["default"].pathExists(p)) {
33
36
  return p;
34
37
  }
35
38
  }
@@ -51,8 +54,19 @@ function parseOwnerIds(spaceSeparatedOwnerIds) {
51
54
  }
52
55
  return ids;
53
56
  }
54
- async function addCodeownersEntry(codeownersFilePath, ownedPath, ownerIds) {
55
- const allLines = (await fs__default['default'].readFile(codeownersFilePath, "utf8")).split("\n");
57
+ async function addCodeownersEntry(ownedPath, ownerStr, codeownersFilePath) {
58
+ const ownerIds = parseOwnerIds(ownerStr);
59
+ if (!ownerIds || ownerIds.length === 0) {
60
+ return false;
61
+ }
62
+ let filePath = codeownersFilePath;
63
+ if (!filePath) {
64
+ filePath = await getCodeownersFilePath(index.paths.targetRoot);
65
+ if (!filePath) {
66
+ return false;
67
+ }
68
+ }
69
+ const allLines = (await fs__default["default"].readFile(filePath, "utf8")).split("\n");
56
70
  const commentLines = [];
57
71
  for (const line of allLines) {
58
72
  if (line[0] !== "#") {
@@ -64,7 +78,7 @@ async function addCodeownersEntry(codeownersFilePath, ownedPath, ownerIds) {
64
78
  ownedPath: tokens[0],
65
79
  ownerIds: tokens.slice(1)
66
80
  }));
67
- const newDeclarationEntries = oldDeclarationEntries.filter((entry) => entry.ownedPath !== "*").concat([{ownedPath, ownerIds}]).sort((l1, l2) => l1.ownedPath.localeCompare(l2.ownedPath));
81
+ const newDeclarationEntries = oldDeclarationEntries.filter((entry) => entry.ownedPath !== "*").concat([{ ownedPath, ownerIds }]).sort((l1, l2) => l1.ownedPath.localeCompare(l2.ownedPath));
68
82
  newDeclarationEntries.unshift({
69
83
  ownedPath: "*",
70
84
  ownerIds: [DEFAULT_OWNER]
@@ -75,24 +89,26 @@ async function addCodeownersEntry(codeownersFilePath, ownedPath, ownerIds) {
75
89
  return [entryPath, ...entry.ownerIds].join(" ");
76
90
  });
77
91
  const newLines = [...commentLines, "", ...newDeclarationLines, ""];
78
- await fs__default['default'].writeFile(codeownersFilePath, newLines.join("\n"), "utf8");
92
+ await fs__default["default"].writeFile(filePath, newLines.join("\n"), "utf8");
93
+ return true;
79
94
  }
80
95
 
96
+ const exec = util.promisify(child_process.exec);
81
97
  const TASK_NAME_MAX_LENGTH = 14;
82
98
  class Task {
83
99
  static log(name = "") {
84
- process.stdout.write(`${chalk__default['default'].green(name)}
100
+ process.stderr.write(`${chalk__default["default"].green(name)}
85
101
  `);
86
102
  }
87
103
  static error(message = "") {
88
- process.stdout.write(`
89
- ${chalk__default['default'].red(message)}
104
+ process.stderr.write(`
105
+ ${chalk__default["default"].red(message)}
90
106
 
91
107
  `);
92
108
  }
93
109
  static section(name) {
94
- const title = chalk__default['default'].green(`${name}:`);
95
- process.stdout.write(`
110
+ const title = chalk__default["default"].green(`${name}:`);
111
+ process.stderr.write(`
96
112
  ${title}
97
113
  `);
98
114
  }
@@ -100,42 +116,65 @@ ${chalk__default['default'].red(message)}
100
116
  process.exit(code);
101
117
  }
102
118
  static async forItem(task, item, taskFunc) {
103
- const paddedTask = chalk__default['default'].green(task.padEnd(TASK_NAME_MAX_LENGTH));
104
- const spinner = ora__default['default']({
105
- prefixText: chalk__default['default'].green(` ${paddedTask}${chalk__default['default'].cyan(item)}`),
119
+ const paddedTask = chalk__default["default"].green(task.padEnd(TASK_NAME_MAX_LENGTH));
120
+ const spinner = ora__default["default"]({
121
+ prefixText: chalk__default["default"].green(` ${paddedTask}${chalk__default["default"].cyan(item)}`),
106
122
  spinner: "arc",
107
123
  color: "green"
108
124
  }).start();
109
125
  try {
110
- await taskFunc();
126
+ const result = await taskFunc();
111
127
  spinner.succeed();
128
+ return result;
112
129
  } catch (error) {
113
130
  spinner.fail();
114
131
  throw error;
115
132
  }
116
133
  }
134
+ static async forCommand(command, options) {
135
+ try {
136
+ await Task.forItem("executing", command, async () => {
137
+ await exec(command, { cwd: options == null ? void 0 : options.cwd });
138
+ });
139
+ } catch (error) {
140
+ errors.assertError(error);
141
+ if (error.stderr) {
142
+ process.stderr.write(error.stderr);
143
+ }
144
+ if (error.stdout) {
145
+ process.stdout.write(error.stdout);
146
+ }
147
+ if (options == null ? void 0 : options.optional) {
148
+ Task.error(`Warning: Failed to execute command ${chalk__default["default"].cyan(command)}`);
149
+ } else {
150
+ throw new Error(`Failed to execute command '${chalk__default["default"].cyan(command)}', ${error}`);
151
+ }
152
+ }
153
+ }
117
154
  }
118
155
  async function templatingTask(templateDir, destinationDir, context, versionProvider) {
119
- const files = await recursive__default['default'](templateDir).catch((error) => {
156
+ const files = await recursive__default["default"](templateDir).catch((error) => {
120
157
  throw new Error(`Failed to read template directory: ${error.message}`);
121
158
  });
122
- const isMonoRepo = await fs__default['default'].pathExists(index.paths.resolveTargetRoot("lerna.json"));
159
+ const isMonoRepo = await fs__default["default"].pathExists(index.paths.resolveTargetRoot("lerna.json"));
123
160
  for (const file of files) {
124
161
  const destinationFile = file.replace(templateDir, destinationDir);
125
- await fs__default['default'].ensureDir(path.dirname(destinationFile));
162
+ await fs__default["default"].ensureDir(path.dirname(destinationFile));
126
163
  if (file.endsWith(".hbs")) {
127
164
  await Task.forItem("templating", path.basename(file), async () => {
128
165
  const destination = destinationFile.replace(/\.hbs$/, "");
129
- const template = await fs__default['default'].readFile(file);
130
- const compiled = handlebars__default['default'].compile(template.toString());
131
- const contents = compiled({name: path.basename(destination), ...context}, {
166
+ const template = await fs__default["default"].readFile(file);
167
+ const compiled = handlebars__default["default"].compile(template.toString(), {
168
+ strict: true
169
+ });
170
+ const contents = compiled({ name: path.basename(destination), ...context }, {
132
171
  helpers: {
133
172
  versionQuery(name, versionHint) {
134
173
  return versionProvider(name, typeof versionHint === "string" ? versionHint : void 0);
135
174
  }
136
175
  }
137
176
  });
138
- await fs__default['default'].writeFile(destination, contents).catch((error) => {
177
+ await fs__default["default"].writeFile(destination, contents).catch((error) => {
139
178
  throw new Error(`Failed to create file: ${destination}: ${error.message}`);
140
179
  });
141
180
  });
@@ -144,7 +183,7 @@ async function templatingTask(templateDir, destinationDir, context, versionProvi
144
183
  continue;
145
184
  }
146
185
  await Task.forItem("copying", path.basename(file), async () => {
147
- await fs__default['default'].copyFile(file, destinationFile).catch((error) => {
186
+ await fs__default["default"].copyFile(file, destinationFile).catch((error) => {
148
187
  const destination = destinationFile;
149
188
  throw new Error(`Failed to copy file to ${destination} : ${error.message}`);
150
189
  });
@@ -152,10 +191,37 @@ async function templatingTask(templateDir, destinationDir, context, versionProvi
152
191
  }
153
192
  }
154
193
  }
194
+ async function addPackageDependency(path, options) {
195
+ try {
196
+ const pkgJson = await fs__default["default"].readJson(path);
197
+ const normalize = (obj) => {
198
+ if (Object.keys(obj).length === 0) {
199
+ return void 0;
200
+ }
201
+ return Object.fromEntries(Object.keys(obj).sort().map((key) => [key, obj[key]]));
202
+ };
203
+ pkgJson.dependencies = normalize({
204
+ ...pkgJson.dependencies,
205
+ ...options.dependencies
206
+ });
207
+ pkgJson.devDependencies = normalize({
208
+ ...pkgJson.devDependencies,
209
+ ...options.devDependencies
210
+ });
211
+ pkgJson.peerDependencies = normalize({
212
+ ...pkgJson.peerDependencies,
213
+ ...options.peerDependencies
214
+ });
215
+ await fs__default["default"].writeJson(path, pkgJson, { spaces: 2 });
216
+ } catch (error) {
217
+ throw new Error(`Failed to add package dependencies, ${error}`);
218
+ }
219
+ }
155
220
 
156
221
  exports.Task = Task;
157
222
  exports.addCodeownersEntry = addCodeownersEntry;
223
+ exports.addPackageDependency = addPackageDependency;
158
224
  exports.getCodeownersFilePath = getCodeownersFilePath;
159
225
  exports.parseOwnerIds = parseOwnerIds;
160
226
  exports.templatingTask = templatingTask;
161
- //# sourceMappingURL=tasks-9bd3e946.cjs.js.map
227
+ //# sourceMappingURL=tasks-f12b95ba.cjs.js.map