@backstage/cli 0.8.1 → 0.10.0

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 (60) 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/{build-32289a53.cjs.js → build-555a7349.cjs.js} +3 -3
  5. package/dist/cjs/{build-7357e33b.cjs.js → build-8652aa69.cjs.js} +3 -3
  6. package/dist/cjs/{build-036a2109.cjs.js → build-b5fb2b35.cjs.js} +3 -3
  7. package/dist/cjs/{build-3192edeb.cjs.js → build-be463597.cjs.js} +8 -5
  8. package/dist/cjs/{buildWorkspace-794159d5.cjs.js → buildWorkspace-79c93924.cjs.js} +4 -4
  9. package/dist/cjs/{bump-ab142f88.cjs.js → bump-53a961f8.cjs.js} +28 -6
  10. package/dist/cjs/{bundle-faf5ad1e.cjs.js → bundle-64a797f5.cjs.js} +5 -5
  11. package/dist/cjs/{clean-e96f4b94.cjs.js → clean-a28705b5.cjs.js} +2 -2
  12. package/dist/cjs/{config-dab34362.cjs.js → config-3816244a.cjs.js} +21 -6
  13. package/dist/cjs/create-d5e65154.cjs.js +483 -0
  14. package/dist/cjs/{createPlugin-3c802c14.cjs.js → createPlugin-77a95bbd.cjs.js} +8 -9
  15. package/dist/cjs/{dev-5750e5cb.cjs.js → dev-3b68b882.cjs.js} +4 -4
  16. package/dist/cjs/{diff-86e1188b.cjs.js → diff-7238cc6c.cjs.js} +2 -2
  17. package/dist/cjs/{docs-34d3c7fe.cjs.js → docs-f46d6945.cjs.js} +3 -3
  18. package/dist/cjs/{index-69ec4ee3.cjs.js → index-05328067.cjs.js} +13 -11
  19. package/dist/cjs/{index-1db5f8d6.cjs.js → index-8a512334.cjs.js} +169 -51
  20. package/dist/cjs/{index-dc92c8f4.cjs.js → index-c8a3517a.cjs.js} +2 -2
  21. package/dist/cjs/{info-f1a293c8.cjs.js → info-a069f3b4.cjs.js} +3 -3
  22. package/dist/cjs/{install-40b1f07e.cjs.js → install-43a8076b.cjs.js} +4 -4
  23. package/dist/cjs/{lint-95a1066a.cjs.js → lint-0053aded.cjs.js} +3 -3
  24. package/dist/cjs/{lint-73e3cf0a.cjs.js → lint-60658813.cjs.js} +3 -3
  25. package/dist/cjs/{pack-a254b380.cjs.js → pack-a4246579.cjs.js} +2 -2
  26. package/dist/cjs/{packager-679f1af5.cjs.js → packager-b1a183ad.cjs.js} +2 -2
  27. package/dist/cjs/{packages-4fe3897c.cjs.js → packages-562fcd14.cjs.js} +3 -3
  28. package/dist/cjs/{paths-9f678df9.cjs.js → paths-f77bdf66.cjs.js} +20 -5
  29. package/dist/cjs/{print-b972c130.cjs.js → print-db876002.cjs.js} +5 -4
  30. package/dist/cjs/{removePlugin-dc596b42.cjs.js → removePlugin-1379b63a.cjs.js} +6 -3
  31. package/dist/cjs/{run-a312f9a6.cjs.js → run-bacdaaf1.cjs.js} +2 -2
  32. package/dist/cjs/{schema-463ba3bd.cjs.js → schema-3fe57ce7.cjs.js} +3 -3
  33. package/dist/cjs/{serve-7b531df5.cjs.js → serve-a9cf4184.cjs.js} +6 -6
  34. package/dist/cjs/{serve-3d293027.cjs.js → serve-e89d4ea4.cjs.js} +7 -7
  35. package/dist/cjs/{server-5582cec8.cjs.js → server-4f0e40d3.cjs.js} +2 -2
  36. package/dist/cjs/{tasks-d6b72c3c.cjs.js → tasks-29b7d09e.cjs.js} +78 -12
  37. package/dist/cjs/{testCommand-42b484a8.cjs.js → testCommand-5602a58f.cjs.js} +3 -3
  38. package/dist/cjs/{validate-4b57eb89.cjs.js → validate-9b1a5456.cjs.js} +5 -4
  39. package/dist/index.cjs.js +1 -1
  40. package/package.json +18 -18
  41. package/templates/default-backend-plugin/package.json.hbs +39 -37
  42. package/templates/default-backend-plugin/src/run.ts.hbs +1 -1
  43. package/templates/default-common-plugin-package/.eslintrc.js +3 -0
  44. package/templates/default-common-plugin-package/README.md.hbs +5 -0
  45. package/templates/default-common-plugin-package/package.json.hbs +34 -0
  46. package/templates/default-common-plugin-package/src/index.ts.hbs +19 -0
  47. package/templates/default-common-plugin-package/src/setupTests.ts +1 -0
  48. package/templates/default-common-plugin-package/tsconfig.json +9 -0
  49. package/templates/default-plugin/package.json.hbs +4 -2
  50. package/templates/default-plugin/src/routes.ts.hbs +1 -1
  51. package/templates/scaffolder-module/.eslintrc.js +3 -0
  52. package/templates/scaffolder-module/README.md.hbs +5 -0
  53. package/templates/scaffolder-module/package.json.hbs +37 -0
  54. package/templates/scaffolder-module/src/actions/example/example.test.ts +50 -0
  55. package/templates/scaffolder-module/src/actions/example/example.ts +57 -0
  56. package/templates/scaffolder-module/src/actions/example/index.ts +1 -0
  57. package/templates/scaffolder-module/src/actions/index.ts +1 -0
  58. package/templates/scaffolder-module/src/index.ts.hbs +8 -0
  59. package/templates/scaffolder-module/tsconfig.json +9 -0
  60. package/dist/cjs/buildImage-62344040.cjs.js +0 -77
@@ -0,0 +1,483 @@
1
+ 'use strict';
2
+
3
+ var os = require('os');
4
+ var fs = require('fs-extra');
5
+ var path = require('path');
6
+ var chalk = require('chalk');
7
+ var inquirer = require('inquirer');
8
+ var camelCase = require('lodash/camelCase');
9
+ var upperFirst = require('lodash/upperFirst');
10
+ var index = require('./index-8a512334.cjs.js');
11
+ var tasks = require('./tasks-29b7d09e.cjs.js');
12
+ var Lockfile = require('./Lockfile-80f0eec4.cjs.js');
13
+ require('./run-bacdaaf1.cjs.js');
14
+ var partition = require('lodash/partition');
15
+ var errors = require('@backstage/errors');
16
+ require('commander');
17
+ require('semver');
18
+ require('@backstage/cli-common');
19
+ require('@backstage/config/package.json');
20
+ require('handlebars');
21
+ require('ora');
22
+ require('util');
23
+ require('recursive-readdir');
24
+ require('child_process');
25
+ require('@yarnpkg/lockfile');
26
+
27
+ function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
28
+
29
+ var os__default = /*#__PURE__*/_interopDefaultLegacy(os);
30
+ var fs__default = /*#__PURE__*/_interopDefaultLegacy(fs);
31
+ var chalk__default = /*#__PURE__*/_interopDefaultLegacy(chalk);
32
+ var inquirer__default = /*#__PURE__*/_interopDefaultLegacy(inquirer);
33
+ var camelCase__default = /*#__PURE__*/_interopDefaultLegacy(camelCase);
34
+ var upperFirst__default = /*#__PURE__*/_interopDefaultLegacy(upperFirst);
35
+ var partition__default = /*#__PURE__*/_interopDefaultLegacy(partition);
36
+
37
+ function createFactory(config) {
38
+ return config;
39
+ }
40
+
41
+ function pluginIdPrompt() {
42
+ return {
43
+ type: "input",
44
+ name: "id",
45
+ message: "Enter the ID of the plugin [required]",
46
+ validate: (value) => {
47
+ if (!value) {
48
+ return "Please enter the ID of the plugin";
49
+ } else if (!/^[a-z0-9]+(-[a-z0-9]+)*$/.test(value)) {
50
+ return "Plugin IDs must be lowercase and contain only letters, digits, and dashes.";
51
+ }
52
+ return true;
53
+ }
54
+ };
55
+ }
56
+ function ownerPrompt() {
57
+ return {
58
+ type: "input",
59
+ name: "owner",
60
+ message: "Enter an owner to add to CODEOWNERS [optional]",
61
+ when: (opts) => Boolean(opts.codeOwnersPath),
62
+ validate: (value) => {
63
+ if (!value) {
64
+ return true;
65
+ }
66
+ const ownerIds = tasks.parseOwnerIds(value);
67
+ if (!ownerIds) {
68
+ return "The owner must be a space separated list of team names (e.g. @org/team-name), usernames (e.g. @username), or the email addresses (e.g. user@example.com).";
69
+ }
70
+ return true;
71
+ }
72
+ };
73
+ }
74
+
75
+ async function executePluginPackageTemplate(ctx, options) {
76
+ const {targetDir} = options;
77
+ let lockfile;
78
+ try {
79
+ lockfile = await Lockfile.Lockfile.load(index.paths.resolveTargetRoot("yarn.lock"));
80
+ } catch {
81
+ }
82
+ tasks.Task.section("Checking Prerequisites");
83
+ const shortPluginDir = path.relative(index.paths.targetRoot, targetDir);
84
+ await tasks.Task.forItem("availability", shortPluginDir, async () => {
85
+ if (await fs__default['default'].pathExists(targetDir)) {
86
+ throw new Error(`A package with the same plugin ID already exists at ${chalk__default['default'].cyan(shortPluginDir)}. Please try again with a different ID.`);
87
+ }
88
+ });
89
+ const tempDir = await tasks.Task.forItem("creating", "temp dir", async () => {
90
+ return await ctx.createTemporaryDirectory("backstage-create");
91
+ });
92
+ tasks.Task.section("Executing Template");
93
+ await tasks.templatingTask(index.paths.resolveOwn("templates", options.templateName), tempDir, options.values, index.createPackageVersionProvider(lockfile));
94
+ const pkgJsonPath = path.resolve(tempDir, "package.json");
95
+ if (await fs__default['default'].pathExists(pkgJsonPath)) {
96
+ const pkgJson = await fs__default['default'].readJson(pkgJsonPath);
97
+ await fs__default['default'].writeJson(pkgJsonPath, pkgJson, {spaces: 2});
98
+ }
99
+ tasks.Task.section("Installing");
100
+ await tasks.Task.forItem("moving", shortPluginDir, async () => {
101
+ await fs__default['default'].move(tempDir, targetDir).catch((error) => {
102
+ throw new Error(`Failed to move package from ${tempDir} to ${targetDir}, ${error.message}`);
103
+ });
104
+ });
105
+ ctx.markAsModified();
106
+ }
107
+
108
+ const frontendPlugin = createFactory({
109
+ name: "plugin",
110
+ description: "A new frontend plugin",
111
+ optionsDiscovery: async () => ({
112
+ codeOwnersPath: await tasks.getCodeownersFilePath(index.paths.targetRoot)
113
+ }),
114
+ optionsPrompts: [pluginIdPrompt(), ownerPrompt()],
115
+ async create(options, ctx) {
116
+ const {id} = options;
117
+ const name = ctx.scope ? `@${ctx.scope}/plugin-${id}` : `backstage-plugin-${id}`;
118
+ const extensionName = `${upperFirst__default['default'](camelCase__default['default'](id))}Page`;
119
+ tasks.Task.log();
120
+ tasks.Task.log(`Creating backend plugin ${chalk__default['default'].cyan(name)}`);
121
+ const targetDir = ctx.isMonoRepo ? index.paths.resolveTargetRoot("plugins", id) : index.paths.resolveTargetRoot(`backstage-plugin-${id}`);
122
+ await executePluginPackageTemplate(ctx, {
123
+ targetDir,
124
+ templateName: "default-plugin",
125
+ values: {
126
+ id,
127
+ name,
128
+ extensionName,
129
+ pluginVar: `${camelCase__default['default'](id)}Plugin`,
130
+ pluginVersion: ctx.defaultVersion,
131
+ privatePackage: ctx.private,
132
+ npmRegistry: ctx.npmRegistry
133
+ }
134
+ });
135
+ if (await fs__default['default'].pathExists(index.paths.resolveTargetRoot("packages/app"))) {
136
+ await tasks.Task.forItem("app", "adding dependency", async () => {
137
+ await tasks.addPackageDependency(index.paths.resolveTargetRoot("packages/app/package.json"), {
138
+ dependencies: {
139
+ [name]: `^${ctx.defaultVersion}`
140
+ }
141
+ });
142
+ });
143
+ await tasks.Task.forItem("app", "adding import", async () => {
144
+ var _a;
145
+ const pluginsFilePath = index.paths.resolveTargetRoot("packages/app/src/App.tsx");
146
+ if (!await fs__default['default'].pathExists(pluginsFilePath)) {
147
+ return;
148
+ }
149
+ const content = await fs__default['default'].readFile(pluginsFilePath, "utf8");
150
+ const revLines = content.split("\n").reverse();
151
+ const lastImportIndex = revLines.findIndex((line) => line.match(/ from ("|').*("|')/));
152
+ const lastRouteIndex = revLines.findIndex((line) => line.match(/<\/FlatRoutes/));
153
+ if (lastImportIndex !== -1 && lastRouteIndex !== -1) {
154
+ const importLine = `import { ${extensionName} } from '${name}';`;
155
+ if (!content.includes(importLine)) {
156
+ revLines.splice(lastImportIndex, 0, importLine);
157
+ }
158
+ const componentLine = `<Route path="/${id}" element={<${extensionName} />} />`;
159
+ if (!content.includes(componentLine)) {
160
+ const [indentation] = (_a = revLines[lastRouteIndex + 1].match(/^\s*/)) != null ? _a : [];
161
+ revLines.splice(lastRouteIndex + 1, 0, indentation + componentLine);
162
+ }
163
+ const newContent = revLines.reverse().join("\n");
164
+ await fs__default['default'].writeFile(pluginsFilePath, newContent, "utf8");
165
+ }
166
+ });
167
+ }
168
+ if (options.owner) {
169
+ await tasks.addCodeownersEntry(`/plugins/${id}`, options.owner);
170
+ }
171
+ await tasks.Task.forCommand("yarn install", {cwd: targetDir, optional: true});
172
+ await tasks.Task.forCommand("yarn lint --fix", {
173
+ cwd: targetDir,
174
+ optional: true
175
+ });
176
+ }
177
+ });
178
+
179
+ const backendPlugin = createFactory({
180
+ name: "backend-plugin",
181
+ description: "A new backend plugin",
182
+ optionsDiscovery: async () => ({
183
+ codeOwnersPath: await tasks.getCodeownersFilePath(index.paths.targetRoot)
184
+ }),
185
+ optionsPrompts: [pluginIdPrompt(), ownerPrompt()],
186
+ async create(options, ctx) {
187
+ const id = `${options.id}-backend`;
188
+ const name = ctx.scope ? `@${ctx.scope}/plugin-${id}` : `backstage-plugin-${id}`;
189
+ tasks.Task.log();
190
+ tasks.Task.log(`Creating backend plugin ${chalk__default['default'].cyan(name)}`);
191
+ const targetDir = ctx.isMonoRepo ? index.paths.resolveTargetRoot("plugins", id) : index.paths.resolveTargetRoot(`backstage-plugin-${id}`);
192
+ await executePluginPackageTemplate(ctx, {
193
+ targetDir,
194
+ templateName: "default-backend-plugin",
195
+ values: {
196
+ id,
197
+ name,
198
+ pluginVar: `${camelCase__default['default'](id)}Plugin`,
199
+ pluginVersion: ctx.defaultVersion,
200
+ privatePackage: ctx.private,
201
+ npmRegistry: ctx.npmRegistry
202
+ }
203
+ });
204
+ if (await fs__default['default'].pathExists(index.paths.resolveTargetRoot("packages/backend"))) {
205
+ await tasks.Task.forItem("backend", "adding dependency", async () => {
206
+ await tasks.addPackageDependency(index.paths.resolveTargetRoot("packages/backend/package.json"), {
207
+ dependencies: {
208
+ [name]: `^${ctx.defaultVersion}`
209
+ }
210
+ });
211
+ });
212
+ }
213
+ if (options.owner) {
214
+ await tasks.addCodeownersEntry(`/plugins/${id}`, options.owner);
215
+ }
216
+ await tasks.Task.forCommand("yarn install", {cwd: targetDir, optional: true});
217
+ await tasks.Task.forCommand("yarn lint --fix", {
218
+ cwd: targetDir,
219
+ optional: true
220
+ });
221
+ }
222
+ });
223
+
224
+ const pluginCommon = createFactory({
225
+ name: "plugin-common",
226
+ description: "A new isomorphic common plugin package",
227
+ optionsDiscovery: async () => ({
228
+ codeOwnersPath: await tasks.getCodeownersFilePath(index.paths.targetRoot)
229
+ }),
230
+ optionsPrompts: [pluginIdPrompt(), ownerPrompt()],
231
+ async create(options, ctx) {
232
+ const {id} = options;
233
+ const suffix = `${id}-common`;
234
+ const name = ctx.scope ? `@${ctx.scope}/plugin-${suffix}` : `backstage-plugin-${suffix}`;
235
+ tasks.Task.log();
236
+ tasks.Task.log(`Creating backend plugin ${chalk__default['default'].cyan(name)}`);
237
+ const targetDir = ctx.isMonoRepo ? index.paths.resolveTargetRoot("plugins", suffix) : index.paths.resolveTargetRoot(`backstage-plugin-${suffix}`);
238
+ await executePluginPackageTemplate(ctx, {
239
+ targetDir,
240
+ templateName: "default-common-plugin-package",
241
+ values: {
242
+ id,
243
+ name,
244
+ privatePackage: ctx.private,
245
+ npmRegistry: ctx.npmRegistry,
246
+ pluginVersion: ctx.defaultVersion
247
+ }
248
+ });
249
+ if (options.owner) {
250
+ await tasks.addCodeownersEntry(`/plugins/${suffix}`, options.owner);
251
+ }
252
+ await tasks.Task.forCommand("yarn install", {cwd: targetDir, optional: true});
253
+ await tasks.Task.forCommand("yarn lint --fix", {
254
+ cwd: targetDir,
255
+ optional: true
256
+ });
257
+ }
258
+ });
259
+
260
+ const scaffolderModule = createFactory({
261
+ name: "scaffolder-module",
262
+ description: "An module exporting custom actions for @backstage/plugin-scaffolder-backend",
263
+ optionsDiscovery: async () => ({
264
+ codeOwnersPath: await tasks.getCodeownersFilePath(index.paths.targetRoot)
265
+ }),
266
+ optionsPrompts: [
267
+ {
268
+ type: "input",
269
+ name: "id",
270
+ message: "Enter the name of the module [required]",
271
+ validate: (value) => {
272
+ if (!value) {
273
+ return "Please enter the name of the module";
274
+ } else if (!/^[a-z0-9]+(-[a-z0-9]+)*$/.test(value)) {
275
+ return "Module names must be lowercase and contain only letters, digits, and dashes.";
276
+ }
277
+ return true;
278
+ }
279
+ },
280
+ ownerPrompt()
281
+ ],
282
+ async create(options, ctx) {
283
+ const {id} = options;
284
+ const slug = `scaffolder-backend-module-${id}`;
285
+ let name = `backstage-plugin-${slug}`;
286
+ if (ctx.scope) {
287
+ if (ctx.scope === "backstage") {
288
+ name = `@backstage/plugin-${slug}`;
289
+ } else {
290
+ name = `@${ctx.scope}/backstage-plugin-${slug}`;
291
+ }
292
+ }
293
+ tasks.Task.log();
294
+ tasks.Task.log(`Creating module ${chalk__default['default'].cyan(name)}`);
295
+ const targetDir = ctx.isMonoRepo ? index.paths.resolveTargetRoot("plugins", slug) : index.paths.resolveTargetRoot(`backstage-plugin-${slug}`);
296
+ await executePluginPackageTemplate(ctx, {
297
+ targetDir,
298
+ templateName: "scaffolder-module",
299
+ values: {
300
+ id,
301
+ name,
302
+ privatePackage: ctx.private,
303
+ npmRegistry: ctx.npmRegistry,
304
+ pluginVersion: ctx.defaultVersion
305
+ }
306
+ });
307
+ if (options.owner) {
308
+ await tasks.addCodeownersEntry(`/plugins/${slug}`, options.owner);
309
+ }
310
+ await tasks.Task.forCommand("yarn install", {cwd: targetDir, optional: true});
311
+ await tasks.Task.forCommand("yarn lint --fix", {
312
+ cwd: targetDir,
313
+ optional: true
314
+ });
315
+ }
316
+ });
317
+
318
+ var factories = /*#__PURE__*/Object.freeze({
319
+ __proto__: null,
320
+ frontendPlugin: frontendPlugin,
321
+ backendPlugin: backendPlugin,
322
+ pluginCommon: pluginCommon,
323
+ scaffolderModule: scaffolderModule
324
+ });
325
+
326
+ function applyPromptMessageTransforms(prompt, transforms) {
327
+ return {
328
+ ...prompt,
329
+ message: prompt.message && (async (answers) => {
330
+ if (typeof prompt.message === "function") {
331
+ return transforms.message(await prompt.message(answers));
332
+ }
333
+ return transforms.message(await prompt.message);
334
+ }),
335
+ validate: prompt.validate && (async (...args) => {
336
+ const result = await prompt.validate(...args);
337
+ if (typeof result === "string") {
338
+ return transforms.error(result);
339
+ }
340
+ return result;
341
+ })
342
+ };
343
+ }
344
+ class FactoryRegistry {
345
+ static async interactiveSelect(preselected) {
346
+ let selected = preselected;
347
+ if (!selected) {
348
+ const answers = await inquirer__default['default'].prompt([
349
+ {
350
+ type: "list",
351
+ name: "name",
352
+ message: "What do you want to create?",
353
+ choices: Array.from(this.factoryMap.values()).map((factory2) => ({
354
+ name: `${factory2.name} - ${factory2.description}`,
355
+ value: factory2.name
356
+ }))
357
+ }
358
+ ]);
359
+ selected = answers.name;
360
+ }
361
+ const factory = this.factoryMap.get(selected);
362
+ if (!factory) {
363
+ throw new Error(`Unknown selection '${selected}'`);
364
+ }
365
+ return factory;
366
+ }
367
+ static async populateOptions(factory, provided) {
368
+ let currentOptions = provided;
369
+ if (factory.optionsDiscovery) {
370
+ const discoveredOptions = await factory.optionsDiscovery();
371
+ currentOptions = {
372
+ ...currentOptions,
373
+ ...discoveredOptions
374
+ };
375
+ }
376
+ if (factory.optionsPrompts) {
377
+ const [hasAnswers, needsAnswers] = partition__default['default'](factory.optionsPrompts, (option) => option.name in currentOptions);
378
+ for (const option of hasAnswers) {
379
+ const value = provided[option.name];
380
+ if (option.validate) {
381
+ const result = option.validate(value);
382
+ if (result !== true) {
383
+ throw new Error(`Invalid option '${option.name}'. ${result}`);
384
+ }
385
+ }
386
+ }
387
+ currentOptions = await inquirer__default['default'].prompt(needsAnswers.map((option) => applyPromptMessageTransforms(option, {
388
+ message: chalk__default['default'].blue,
389
+ error: chalk__default['default'].red
390
+ })), currentOptions);
391
+ }
392
+ return currentOptions;
393
+ }
394
+ }
395
+ FactoryRegistry.factoryMap = new Map(Object.values(factories).map((factory) => [factory.name, factory]));
396
+
397
+ function parseOptions(optionStrings) {
398
+ const options = {};
399
+ for (const str of optionStrings) {
400
+ const [key] = str.split("=", 1);
401
+ const value = str.slice(key.length + 1);
402
+ if (!key || str[key.length] !== "=") {
403
+ throw new Error(`Invalid option '${str}', must be of the format <key>=<value>`);
404
+ }
405
+ options[key] = value;
406
+ }
407
+ return options;
408
+ }
409
+ var create = async (cmd) => {
410
+ var _a;
411
+ const cmdOpts = cmd.opts();
412
+ const factory = await FactoryRegistry.interactiveSelect(cmdOpts.select);
413
+ const providedOptions = parseOptions(cmdOpts.option);
414
+ const options = await FactoryRegistry.populateOptions(factory, providedOptions);
415
+ let isMonoRepo = false;
416
+ try {
417
+ const rootPackageJson = await fs__default['default'].readJson(index.paths.resolveTargetRoot("package.json"));
418
+ if (rootPackageJson.workspaces) {
419
+ isMonoRepo = true;
420
+ }
421
+ } catch (error) {
422
+ errors.assertError(error);
423
+ if (error.code !== "ENOENT") {
424
+ throw error;
425
+ }
426
+ }
427
+ let defaultVersion = "0.1.0";
428
+ try {
429
+ const rootLernaJson = await fs__default['default'].readJson(index.paths.resolveTargetRoot("lerna.json"));
430
+ if (rootLernaJson.version) {
431
+ defaultVersion = rootLernaJson.version;
432
+ }
433
+ } catch (error) {
434
+ errors.assertError(error);
435
+ if (error.code !== "ENOENT") {
436
+ throw error;
437
+ }
438
+ }
439
+ const tempDirs = new Array();
440
+ async function createTemporaryDirectory(name) {
441
+ const dir = await fs__default['default'].mkdtemp(path.join(os__default['default'].tmpdir(), name));
442
+ tempDirs.push(dir);
443
+ return dir;
444
+ }
445
+ let modified = false;
446
+ try {
447
+ await factory.create(options, {
448
+ isMonoRepo,
449
+ defaultVersion,
450
+ scope: (_a = cmdOpts.scope) == null ? void 0 : _a.replace(/^@/, ""),
451
+ npmRegistry: cmdOpts.npmRegistry,
452
+ private: Boolean(cmdOpts.private),
453
+ createTemporaryDirectory,
454
+ markAsModified() {
455
+ modified = true;
456
+ }
457
+ });
458
+ tasks.Task.log();
459
+ tasks.Task.log(`\u{1F389} Successfully created ${factory.name}`);
460
+ tasks.Task.log();
461
+ } catch (error) {
462
+ errors.assertError(error);
463
+ tasks.Task.error(error.message);
464
+ if (modified) {
465
+ tasks.Task.log("It seems that something went wrong in the creation process \u{1F914}");
466
+ tasks.Task.log();
467
+ tasks.Task.log("We have left the changes that were made intact in case you want to");
468
+ tasks.Task.log("continue manually, but you can also revert the changes and try again.");
469
+ tasks.Task.error(`\u{1F525} Failed to create ${factory.name}!`);
470
+ }
471
+ } finally {
472
+ for (const dir of tempDirs) {
473
+ try {
474
+ await fs__default['default'].remove(dir);
475
+ } catch (error) {
476
+ console.error(`Failed to remove temporary directory '${dir}', ${error}`);
477
+ }
478
+ }
479
+ }
480
+ };
481
+
482
+ exports.default = create;
483
+ //# sourceMappingURL=create-d5e65154.cjs.js.map
@@ -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-d6b72c3c.cjs.js');
14
- var index = require('./index-1db5f8d6.cjs.js');
13
+ var tasks = require('./tasks-29b7d09e.cjs.js');
14
+ var index = require('./index-8a512334.cjs.js');
15
15
  var Lockfile = require('./Lockfile-80f0eec4.cjs.js');
16
- require('./run-a312f9a6.cjs.js');
16
+ require('./run-bacdaaf1.cjs.js');
17
17
  require('handlebars');
18
18
  require('ora');
19
19
  require('recursive-readdir');
@@ -154,8 +154,8 @@ var createPlugin = async (cmd) => {
154
154
  if (!value) {
155
155
  return true;
156
156
  }
157
- const ownerIds2 = tasks.parseOwnerIds(value);
158
- if (!ownerIds2) {
157
+ const ownerIds = tasks.parseOwnerIds(value);
158
+ if (!ownerIds) {
159
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;
@@ -173,7 +173,6 @@ var createPlugin = async (cmd) => {
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
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 {
@@ -208,8 +207,8 @@ var createPlugin = async (cmd) => {
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
214
  tasks.Task.log(`\u{1F947} Successfully created ${chalk__default['default'].cyan(`${name}`)}`);
@@ -233,4 +232,4 @@ exports.addPluginExtensionToApp = addPluginExtensionToApp;
233
232
  exports.capitalize = capitalize;
234
233
  exports.default = createPlugin;
235
234
  exports.movePlugin = movePlugin;
236
- //# sourceMappingURL=createPlugin-3c802c14.cjs.js.map
235
+ //# sourceMappingURL=createPlugin-77a95bbd.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-1db5f8d6.cjs.js');
4
+ var index = require('./index-8a512334.cjs.js');
5
5
  var webpack = require('webpack');
6
- var paths = require('./paths-9f678df9.cjs.js');
6
+ var paths = require('./paths-f77bdf66.cjs.js');
7
7
  require('commander');
8
8
  require('chalk');
9
9
  require('semver');
@@ -20,7 +20,7 @@ require('terser-webpack-plugin');
20
20
  require('./parallel-a4714c72.cjs.js');
21
21
  require('mini-css-extract-plugin');
22
22
  require('./svgrTemplate-2d0d15cf.cjs.js');
23
- require('./run-a312f9a6.cjs.js');
23
+ require('./run-bacdaaf1.cjs.js');
24
24
  require('child_process');
25
25
  require('util');
26
26
  require('lodash/pickBy');
@@ -67,4 +67,4 @@ var dev = async (cmd) => {
67
67
  };
68
68
 
69
69
  exports.default = dev;
70
- //# sourceMappingURL=dev-5750e5cb.cjs.js.map
70
+ //# sourceMappingURL=dev-3b68b882.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-1db5f8d6.cjs.js');
10
+ var index = require('./index-8a512334.cjs.js');
11
11
  require('commander');
12
12
  require('semver');
13
13
  require('@backstage/cli-common');
@@ -374,4 +374,4 @@ async function readPluginData() {
374
374
  }
375
375
 
376
376
  exports.default = diff;
377
- //# sourceMappingURL=diff-86e1188b.cjs.js.map
377
+ //# sourceMappingURL=diff-7238cc6c.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-dab34362.cjs.js');
5
+ var config = require('./config-3816244a.cjs.js');
6
6
  require('@backstage/config');
7
- require('./index-1db5f8d6.cjs.js');
7
+ require('./index-8a512334.cjs.js');
8
8
  require('commander');
9
9
  require('chalk');
10
10
  require('fs-extra');
@@ -29,4 +29,4 @@ var docs = async (cmd) => {
29
29
  };
30
30
 
31
31
  exports.default = docs;
32
- //# sourceMappingURL=docs-34d3c7fe.cjs.js.map
32
+ //# sourceMappingURL=docs-f46d6945.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-1db5f8d6.cjs.js');
8
- var run = require('./run-a312f9a6.cjs.js');
7
+ var index = require('./index-8a512334.cjs.js');
8
+ var run = require('./run-bacdaaf1.cjs.js');
9
9
 
10
10
  function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
11
11
 
@@ -13,9 +13,8 @@ var fs__default = /*#__PURE__*/_interopDefaultLegacy(fs);
13
13
  var tar__default = /*#__PURE__*/_interopDefaultLegacy(tar);
14
14
 
15
15
  const UNSAFE_PACKAGES = [
16
- ...Object.keys(index.packageVersions),
17
- "@backstage/cli-common",
18
- "@backstage/config-loader"
16
+ ...Object.keys(index.dependencies),
17
+ ...Object.keys(index.devDependencies)
19
18
  ];
20
19
  async function createDistWorkspace(packageNames, options = {}) {
21
20
  var _a, _b, _c;
@@ -23,11 +22,14 @@ async function createDistWorkspace(packageNames, options = {}) {
23
22
  const targets = await findTargetPackages(packageNames);
24
23
  if (options.buildDependencies) {
25
24
  const exclude = (_b = options.buildExcludes) != null ? _b : [];
26
- const scopeArgs = targets.filter((target) => !exclude.includes(target.name)).flatMap((target) => ["--scope", target.name]);
27
- const lernaArgs = options.parallel && Number.isInteger(options.parallel) ? ["--concurrency", options.parallel.toString()] : [];
28
- await run.run("yarn", ["lerna", ...lernaArgs, "run", ...scopeArgs, "build"], {
29
- cwd: index.paths.targetRoot
30
- });
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
+ }
31
33
  }
32
34
  await moveToDistWorkspace(targetDir, targets);
33
35
  const files = (_c = options.files) != null ? _c : ["yarn.lock", "package.json"];
@@ -118,4 +120,4 @@ async function findTargetPackages(pkgNames) {
118
120
  }
119
121
 
120
122
  exports.createDistWorkspace = createDistWorkspace;
121
- //# sourceMappingURL=index-69ec4ee3.cjs.js.map
123
+ //# sourceMappingURL=index-05328067.cjs.js.map