@backstage/cli 0.27.1 → 0.28.0-next.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 (47) hide show
  1. package/CHANGELOG.md +55 -0
  2. package/config/jest.js +114 -68
  3. package/dist/cjs/{build-D9YZ-dyI.cjs.js → build-CQdcGuBr.cjs.js} +10 -9
  4. package/dist/cjs/{buildBackend-CmtimF8a.cjs.js → buildBackend-CkhZWCz1.cjs.js} +6 -6
  5. package/dist/cjs/{buildWorkspace-C4wCq5WM.cjs.js → buildWorkspace-CZPp9oRm.cjs.js} +7 -6
  6. package/dist/cjs/{bump-BQ6YRL6D.cjs.js → bump-BHEh5ytx.cjs.js} +73 -9
  7. package/dist/cjs/{clean-BllZTky1.cjs.js → clean-W6nxsHeK.cjs.js} +2 -2
  8. package/dist/cjs/{clean-CVl--Ec9.cjs.js → clean-a6Q4k9Vm.cjs.js} +2 -2
  9. package/dist/cjs/{config-BMsjTUVf.cjs.js → config-DBpmZirN.cjs.js} +2 -2
  10. package/dist/cjs/{createDistWorkspace-DxOWPD6z.cjs.js → createDistWorkspace-DdHPGSMS.cjs.js} +8 -6
  11. package/dist/cjs/{docs-DPzCP6Jp.cjs.js → docs-BGyA6jwW.cjs.js} +3 -3
  12. package/dist/cjs/{entryPoints-CoHH4lBA.cjs.js → entryPoints-coip0t-x.cjs.js} +4 -1
  13. package/dist/cjs/{fix-BM8I_DZ2.cjs.js → fix-COitqgqm.cjs.js} +2 -2
  14. package/dist/cjs/{index-CXG8-26G.cjs.js → index-BXv4Xa2e.cjs.js} +15 -12
  15. package/dist/cjs/{index-Cw0lUK20.cjs.js → index-CGuAP7nv.cjs.js} +11 -10
  16. package/dist/cjs/{index-DmUbBCFk.cjs.js → index-b1ouG3q6.cjs.js} +62 -82
  17. package/dist/cjs/{index-BgEQ8aeF.cjs.js → index-j193pV_Y.cjs.js} +2 -2
  18. package/dist/cjs/{info-FKrzx-9W.cjs.js → info-DuAv1Tsx.cjs.js} +5 -6
  19. package/dist/cjs/{lint-6vrbdjyg.cjs.js → lint-BwiDJkjE.cjs.js} +2 -2
  20. package/dist/cjs/{lint-Cm_9pg85.cjs.js → lint-Dsiocf9K.cjs.js} +2 -2
  21. package/dist/cjs/{list-deprecations-C6R3rEyS.cjs.js → list-deprecations-CtUaQgaP.cjs.js} +2 -2
  22. package/dist/cjs/{moduleFederation-8XXecxLD.cjs.js → moduleFederation-DmStnvEg.cjs.js} +4 -4
  23. package/dist/cjs/{new-DJUBFwiF.cjs.js → new-CEnFhTT-.cjs.js} +336 -97
  24. package/dist/cjs/{pack-BqFGqZb5.cjs.js → pack-XLRcGJqH.cjs.js} +5 -4
  25. package/dist/cjs/{packageExports-DvjdOWjC.cjs.js → packageExports-BJBwdvUH.cjs.js} +3 -3
  26. package/dist/cjs/{packageLintConfigs-DGkvTpBd.cjs.js → packageLintConfigs-DeUGBP17.cjs.js} +3 -3
  27. package/dist/cjs/{packageRole-CHz7zkIQ.cjs.js → packageRole-Iuv9NRii.cjs.js} +2 -2
  28. package/dist/cjs/{print-CQU7JzAh.cjs.js → print-Dd6aChXU.cjs.js} +3 -3
  29. package/dist/cjs/{productionPack-BWU8WkGs.cjs.js → productionPack-BxoMbBkH.cjs.js} +106 -5
  30. package/dist/cjs/{role-8b0z7P0n.cjs.js → role-BjiBExhi.cjs.js} +2 -2
  31. package/dist/cjs/{run-CSt1n0F1.cjs.js → run-CpZGNJQr.cjs.js} +2 -2
  32. package/dist/cjs/{schema-B4250t0W.cjs.js → schema-D93FRhBL.cjs.js} +3 -3
  33. package/dist/cjs/{test-Diil1uTk.cjs.js → test-COxIko8N.cjs.js} +3 -3
  34. package/dist/cjs/{test-DVUsmgyZ.cjs.js → test-JcLI2pPM.cjs.js} +3 -3
  35. package/dist/cjs/{validate-DDIGkK2r.cjs.js → validate-CELljsEX.cjs.js} +3 -3
  36. package/dist/cjs/{Lockfile-B4mqBkH6.cjs.js → yarn-6FNAgNBK.cjs.js} +31 -1
  37. package/dist/index.cjs.js +1 -1
  38. package/package.json +21 -22
  39. package/dist/cjs/codeowners-FKKtpciN.cjs.js +0 -91
  40. package/dist/cjs/createPlugin-Dj7O_us6.cjs.js +0 -280
  41. package/dist/cjs/diff-Drt115Zb.cjs.js +0 -436
  42. package/dist/cjs/index-DRp-18FB.cjs.js +0 -1027
  43. package/dist/cjs/install-BMA3RshT.cjs.js +0 -268
  44. package/dist/cjs/lint-Dkx_fBkS.cjs.js +0 -10
  45. package/dist/cjs/packages-Cuogjl7j.cjs.js +0 -75
  46. package/dist/cjs/tasks-DtAiMv5G.cjs.js +0 -188
  47. package/dist/cjs/yarn-Ukl9MOS0.cjs.js +0 -34
@@ -1,280 +0,0 @@
1
- 'use strict';
2
-
3
- var fs = require('fs-extra');
4
- var util = require('util');
5
- var chalk = require('chalk');
6
- var inquirer = require('inquirer');
7
- var child_process = require('child_process');
8
- var path = require('path');
9
- var camelCase = require('lodash/camelCase');
10
- var upperFirst = require('lodash/upperFirst');
11
- var os = require('os');
12
- var errors = require('@backstage/errors');
13
- var codeowners = require('./codeowners-FKKtpciN.cjs.js');
14
- var index = require('./index-DmUbBCFk.cjs.js');
15
- var tasks = require('./tasks-DtAiMv5G.cjs.js');
16
- var Lockfile = require('./Lockfile-B4mqBkH6.cjs.js');
17
- require('minimatch');
18
- require('@manypkg/get-packages');
19
- require('./yarn-Ukl9MOS0.cjs.js');
20
- require('./run-CSt1n0F1.cjs.js');
21
- require('commander');
22
- require('semver');
23
- require('@backstage/cli-common');
24
- require('handlebars');
25
- require('ora');
26
- require('recursive-readdir');
27
- require('@yarnpkg/parsers');
28
- require('@yarnpkg/lockfile');
29
-
30
- function _interopDefaultCompat (e) { return e && typeof e === 'object' && 'default' in e ? e : { default: e }; }
31
-
32
- var fs__default = /*#__PURE__*/_interopDefaultCompat(fs);
33
- var chalk__default = /*#__PURE__*/_interopDefaultCompat(chalk);
34
- var inquirer__default = /*#__PURE__*/_interopDefaultCompat(inquirer);
35
- var camelCase__default = /*#__PURE__*/_interopDefaultCompat(camelCase);
36
- var upperFirst__default = /*#__PURE__*/_interopDefaultCompat(upperFirst);
37
- var os__default = /*#__PURE__*/_interopDefaultCompat(os);
38
-
39
- const exec = util.promisify(child_process.exec);
40
- async function checkExists(destination) {
41
- await tasks.Task.forItem("checking", destination, async () => {
42
- if (await fs__default.default.pathExists(destination)) {
43
- const existing = chalk__default.default.cyan(
44
- destination.replace(`${index.paths.targetRoot}/`, "")
45
- );
46
- throw new Error(
47
- `A plugin with the same name already exists: ${existing}
48
- Please try again with a different plugin ID`
49
- );
50
- }
51
- });
52
- }
53
- const sortObjectByKeys = (obj) => {
54
- return Object.keys(obj).sort().reduce((result, key) => {
55
- result[key] = obj[key];
56
- return result;
57
- }, {});
58
- };
59
- const capitalize = (str) => str.charAt(0).toUpperCase() + str.slice(1);
60
- const addExportStatement = async (file, exportStatement) => {
61
- const newContents = fs__default.default.readFileSync(file, "utf8").split("\n").filter(Boolean).concat([exportStatement]).concat([""]).join("\n");
62
- await fs__default.default.writeFile(file, newContents, "utf8");
63
- };
64
- async function addPluginDependencyToApp(rootDir, pluginPackage, versionStr) {
65
- const packageFilePath = "packages/app/package.json";
66
- const packageFile = path.resolve(rootDir, packageFilePath);
67
- await tasks.Task.forItem("processing", packageFilePath, async () => {
68
- const packageFileContent = await fs__default.default.readFile(packageFile, "utf-8");
69
- const packageFileJson = JSON.parse(packageFileContent);
70
- const dependencies = packageFileJson.dependencies;
71
- if (dependencies[pluginPackage]) {
72
- throw new Error(
73
- `Plugin ${pluginPackage} already exists in ${packageFile}`
74
- );
75
- }
76
- dependencies[pluginPackage] = `^${versionStr}`;
77
- packageFileJson.dependencies = sortObjectByKeys(dependencies);
78
- const newContents = `${JSON.stringify(packageFileJson, null, 2)}
79
- `;
80
- await fs__default.default.writeFile(packageFile, newContents, "utf-8").catch((error) => {
81
- throw new Error(
82
- `Failed to add plugin as dependency to app: ${packageFile}: ${error.message}`
83
- );
84
- });
85
- });
86
- }
87
- async function addPluginExtensionToApp(pluginId, extensionName, pluginPackage) {
88
- const pluginsFilePath = index.paths.resolveTargetRoot("packages/app/src/App.tsx");
89
- if (!await fs__default.default.pathExists(pluginsFilePath)) {
90
- return;
91
- }
92
- await tasks.Task.forItem("processing", pluginsFilePath, async () => {
93
- const content = await fs__default.default.readFile(pluginsFilePath, "utf8");
94
- const revLines = content.split("\n").reverse();
95
- const lastImportIndex = revLines.findIndex(
96
- (line) => line.match(/ from ("|').*("|')/)
97
- );
98
- const lastRouteIndex = revLines.findIndex(
99
- (line) => line.match(/<\/FlatRoutes/)
100
- );
101
- if (lastImportIndex !== -1 && lastRouteIndex !== -1) {
102
- revLines.splice(
103
- lastImportIndex,
104
- 0,
105
- `import { ${extensionName} } from '${pluginPackage}';`
106
- );
107
- const [indentation] = revLines[lastRouteIndex + 1].match(/^\s*/) ?? [];
108
- revLines.splice(
109
- lastRouteIndex + 1,
110
- 0,
111
- `${indentation}<Route path="/${pluginId}" element={<${extensionName} />}/>`
112
- );
113
- const newContent = revLines.reverse().join("\n");
114
- await fs__default.default.writeFile(pluginsFilePath, newContent, "utf8");
115
- }
116
- });
117
- }
118
- async function cleanUp(tempDir) {
119
- await tasks.Task.forItem("remove", "temporary directory", async () => {
120
- await fs__default.default.remove(tempDir);
121
- });
122
- }
123
- async function buildPlugin(pluginFolder) {
124
- const commands = [
125
- "yarn install",
126
- "yarn lint --fix",
127
- "yarn tsc",
128
- "yarn build"
129
- ];
130
- for (const command of commands) {
131
- try {
132
- await tasks.Task.forItem("executing", command, async () => {
133
- process.chdir(pluginFolder);
134
- await exec(command);
135
- }).catch((error) => {
136
- process.stdout.write(error.stderr);
137
- process.stdout.write(error.stdout);
138
- throw new Error(
139
- `Warning: Could not execute command ${chalk__default.default.cyan(command)}`
140
- );
141
- });
142
- } catch (error) {
143
- errors.assertError(error);
144
- tasks.Task.error(error.message);
145
- break;
146
- }
147
- }
148
- }
149
- async function movePlugin(tempDir, destination, id) {
150
- await tasks.Task.forItem("moving", id, async () => {
151
- await fs__default.default.move(tempDir, destination).catch((error) => {
152
- throw new Error(
153
- `Failed to move plugin from ${tempDir} to ${destination}: ${error.message}`
154
- );
155
- });
156
- });
157
- }
158
- var createPlugin = async (opts) => {
159
- const codeownersPath = await codeowners.getCodeownersFilePath(index.paths.targetRoot);
160
- const questions = [
161
- {
162
- type: "input",
163
- name: "id",
164
- message: chalk__default.default.blue("Enter an ID for the plugin [required]"),
165
- validate: (value) => {
166
- if (!value) {
167
- return chalk__default.default.red("Please enter an ID for the plugin");
168
- } else if (!/^[a-z0-9]+(-[a-z0-9]+)*$/.test(value)) {
169
- return chalk__default.default.red(
170
- "Plugin IDs must be lowercase and contain only letters, digits, and dashes."
171
- );
172
- }
173
- return true;
174
- }
175
- }
176
- ];
177
- if (codeownersPath) {
178
- questions.push({
179
- type: "input",
180
- name: "owner",
181
- message: chalk__default.default.blue(
182
- "Enter the owner(s) of the plugin. If specified, this will be added to CODEOWNERS for the plugin path. [optional]"
183
- ),
184
- validate: (value) => {
185
- if (!value) {
186
- return true;
187
- }
188
- const ownerIds = codeowners.parseOwnerIds(value);
189
- if (!ownerIds) {
190
- return chalk__default.default.red(
191
- "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)."
192
- );
193
- }
194
- return true;
195
- }
196
- });
197
- }
198
- const answers = await inquirer__default.default.prompt(questions);
199
- const pluginId = opts.backend && !answers.id.endsWith("-backend") ? `${answers.id}-backend` : answers.id;
200
- const name = opts.scope ? `@${opts.scope.replace(/^@/, "")}/plugin-${pluginId}` : `plugin-${pluginId}`;
201
- const pluginVar = `${camelCase__default.default(answers.id)}Plugin`;
202
- const extensionName = `${upperFirst__default.default(camelCase__default.default(answers.id))}Page`;
203
- const npmRegistry = opts.npmRegistry && opts.scope ? opts.npmRegistry : "";
204
- const privatePackage = opts.private === false ? false : true;
205
- const isMonoRepo = await fs__default.default.pathExists(index.paths.resolveTargetRoot("lerna.json"));
206
- const appPackage = index.paths.resolveTargetRoot("packages/app");
207
- const templateDir = index.paths.resolveOwn(
208
- opts.backend ? "templates/default-backend-plugin" : "templates/default-plugin"
209
- );
210
- const pluginDir = isMonoRepo ? index.paths.resolveTargetRoot("plugins", pluginId) : index.paths.resolveTargetRoot(pluginId);
211
- const { version: pluginVersion } = isMonoRepo ? await fs__default.default.readJson(index.paths.resolveTargetRoot("lerna.json")) : { version: "0.1.0" };
212
- const license = opts.license ?? "Apache-2.0";
213
- let lockfile;
214
- try {
215
- lockfile = await Lockfile.Lockfile.load(index.paths.resolveTargetRoot("yarn.lock"));
216
- } catch (error) {
217
- console.warn(`No yarn.lock available, ${error}`);
218
- }
219
- tasks.Task.log();
220
- tasks.Task.log("Creating the plugin...");
221
- tasks.Task.section("Checking if the plugin ID is available");
222
- await checkExists(pluginDir);
223
- tasks.Task.section("Creating a temporary plugin directory");
224
- const tempDir = await fs__default.default.mkdtemp(
225
- path.join(os__default.default.tmpdir(), `backstage-plugin-${pluginId}`)
226
- );
227
- try {
228
- tasks.Task.section("Preparing files");
229
- await tasks.templatingTask(
230
- templateDir,
231
- tempDir,
232
- {
233
- ...answers,
234
- pluginVar,
235
- pluginVersion,
236
- extensionName,
237
- name,
238
- privatePackage,
239
- npmRegistry,
240
- license
241
- },
242
- index.createPackageVersionProvider(lockfile),
243
- isMonoRepo
244
- );
245
- tasks.Task.section("Moving to final location");
246
- await movePlugin(tempDir, pluginDir, pluginId);
247
- tasks.Task.section("Building the plugin");
248
- await buildPlugin(pluginDir);
249
- if (await fs__default.default.pathExists(appPackage) && !opts.backend) {
250
- tasks.Task.section("Adding plugin as dependency in app");
251
- await addPluginDependencyToApp(index.paths.targetRoot, name, pluginVersion);
252
- tasks.Task.section("Import plugin in app");
253
- await addPluginExtensionToApp(pluginId, extensionName, name);
254
- }
255
- if (answers.owner) {
256
- await codeowners.addCodeownersEntry(`/plugins/${pluginId}`, answers.owner);
257
- }
258
- tasks.Task.log();
259
- tasks.Task.log(`\u{1F947} Successfully created ${chalk__default.default.cyan(`${name}`)}`);
260
- tasks.Task.log();
261
- tasks.Task.exit();
262
- } catch (error) {
263
- errors.assertError(error);
264
- tasks.Task.error(error.message);
265
- tasks.Task.log("It seems that something went wrong when creating the plugin \u{1F914}");
266
- tasks.Task.log("We are going to clean up, and then you can try again.");
267
- tasks.Task.section("Cleanup");
268
- await cleanUp(tempDir);
269
- tasks.Task.error("\u{1F525} Failed to create plugin!");
270
- tasks.Task.exit(1);
271
- }
272
- };
273
-
274
- exports.addExportStatement = addExportStatement;
275
- exports.addPluginDependencyToApp = addPluginDependencyToApp;
276
- exports.addPluginExtensionToApp = addPluginExtensionToApp;
277
- exports.capitalize = capitalize;
278
- exports.default = createPlugin;
279
- exports.movePlugin = movePlugin;
280
- //# sourceMappingURL=createPlugin-Dj7O_us6.cjs.js.map