@backstage/cli 0.27.1 → 0.28.0-next.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 (45) hide show
  1. package/CHANGELOG.md +32 -0
  2. package/dist/cjs/{build-D9YZ-dyI.cjs.js → build-gNEKjjhr.cjs.js} +9 -8
  3. package/dist/cjs/{buildBackend-CmtimF8a.cjs.js → buildBackend-DXvz7jvh.cjs.js} +6 -6
  4. package/dist/cjs/{buildWorkspace-C4wCq5WM.cjs.js → buildWorkspace-DLfI3EjD.cjs.js} +6 -5
  5. package/dist/cjs/{bump-BQ6YRL6D.cjs.js → bump-d9dS56p9.cjs.js} +73 -9
  6. package/dist/cjs/{clean-BllZTky1.cjs.js → clean-Dpgqc3P2.cjs.js} +2 -2
  7. package/dist/cjs/{clean-CVl--Ec9.cjs.js → clean-bdpRw-oZ.cjs.js} +2 -2
  8. package/dist/cjs/{config-BMsjTUVf.cjs.js → config-nCB2LQK-.cjs.js} +2 -2
  9. package/dist/cjs/{createDistWorkspace-DxOWPD6z.cjs.js → createDistWorkspace-DKzy-L-f.cjs.js} +7 -5
  10. package/dist/cjs/{docs-DPzCP6Jp.cjs.js → docs-CDE82fWG.cjs.js} +3 -3
  11. package/dist/cjs/{fix-BM8I_DZ2.cjs.js → fix-BTjof5XT.cjs.js} +2 -2
  12. package/dist/cjs/{index-CXG8-26G.cjs.js → index-7LxfekFu.cjs.js} +14 -11
  13. package/dist/cjs/{index-BgEQ8aeF.cjs.js → index-DVDDx3pk.cjs.js} +2 -2
  14. package/dist/cjs/{index-Cw0lUK20.cjs.js → index-DsP5wbju.cjs.js} +10 -9
  15. package/dist/cjs/{index-DmUbBCFk.cjs.js → index-v57xnvgT.cjs.js} +61 -79
  16. package/dist/cjs/{info-FKrzx-9W.cjs.js → info-CB7ln5K_.cjs.js} +5 -6
  17. package/dist/cjs/{lint-6vrbdjyg.cjs.js → lint-6_0f9f26.cjs.js} +2 -2
  18. package/dist/cjs/{lint-Cm_9pg85.cjs.js → lint-DYO_SeK3.cjs.js} +2 -2
  19. package/dist/cjs/{list-deprecations-C6R3rEyS.cjs.js → list-deprecations-DFgQENam.cjs.js} +2 -2
  20. package/dist/cjs/{moduleFederation-8XXecxLD.cjs.js → moduleFederation-Dq0n1quT.cjs.js} +3 -3
  21. package/dist/cjs/{new-DJUBFwiF.cjs.js → new-C0D_k25O.cjs.js} +336 -97
  22. package/dist/cjs/{pack-BqFGqZb5.cjs.js → pack-D8AK7Uem.cjs.js} +4 -3
  23. package/dist/cjs/{packageExports-DvjdOWjC.cjs.js → packageExports-bg4mFuFZ.cjs.js} +3 -3
  24. package/dist/cjs/{packageLintConfigs-DGkvTpBd.cjs.js → packageLintConfigs-BBvQehRd.cjs.js} +3 -3
  25. package/dist/cjs/{packageRole-CHz7zkIQ.cjs.js → packageRole-CkpKfhJA.cjs.js} +2 -2
  26. package/dist/cjs/{print-CQU7JzAh.cjs.js → print-BX8-7Nzg.cjs.js} +3 -3
  27. package/dist/cjs/{productionPack-BWU8WkGs.cjs.js → productionPack-Dfl28j3c.cjs.js} +105 -4
  28. package/dist/cjs/{role-8b0z7P0n.cjs.js → role-e0emQj8q.cjs.js} +2 -2
  29. package/dist/cjs/{run-CSt1n0F1.cjs.js → run-HW3lfDbM.cjs.js} +2 -2
  30. package/dist/cjs/{schema-B4250t0W.cjs.js → schema-Cabm6I6c.cjs.js} +3 -3
  31. package/dist/cjs/{test-DVUsmgyZ.cjs.js → test-5bQM0VRL.cjs.js} +3 -3
  32. package/dist/cjs/{test-Diil1uTk.cjs.js → test-YJMOGqXG.cjs.js} +3 -3
  33. package/dist/cjs/{validate-DDIGkK2r.cjs.js → validate-DKBlShmI.cjs.js} +3 -3
  34. package/dist/cjs/{Lockfile-B4mqBkH6.cjs.js → yarn-6FNAgNBK.cjs.js} +31 -1
  35. package/dist/index.cjs.js +1 -1
  36. package/package.json +9 -8
  37. package/dist/cjs/codeowners-FKKtpciN.cjs.js +0 -91
  38. package/dist/cjs/createPlugin-Dj7O_us6.cjs.js +0 -280
  39. package/dist/cjs/diff-Drt115Zb.cjs.js +0 -436
  40. package/dist/cjs/index-DRp-18FB.cjs.js +0 -1027
  41. package/dist/cjs/install-BMA3RshT.cjs.js +0 -268
  42. package/dist/cjs/lint-Dkx_fBkS.cjs.js +0 -10
  43. package/dist/cjs/packages-Cuogjl7j.cjs.js +0 -75
  44. package/dist/cjs/tasks-DtAiMv5G.cjs.js +0 -188
  45. package/dist/cjs/yarn-Ukl9MOS0.cjs.js +0 -34
@@ -1,436 +0,0 @@
1
- 'use strict';
2
-
3
- var fs = require('fs-extra');
4
- var chalk = require('chalk');
5
- var differ = require('diff');
6
- var path = require('path');
7
- var inquirer = require('inquirer');
8
- var handlebars = require('handlebars');
9
- var recursive = require('recursive-readdir');
10
- var index = require('./index-DmUbBCFk.cjs.js');
11
- require('commander');
12
- require('semver');
13
- require('@backstage/cli-common');
14
- require('@backstage/errors');
15
-
16
- function _interopDefaultCompat (e) { return e && typeof e === 'object' && 'default' in e ? e : { default: e }; }
17
-
18
- var fs__default = /*#__PURE__*/_interopDefaultCompat(fs);
19
- var chalk__default = /*#__PURE__*/_interopDefaultCompat(chalk);
20
- var inquirer__default = /*#__PURE__*/_interopDefaultCompat(inquirer);
21
- var handlebars__default = /*#__PURE__*/_interopDefaultCompat(handlebars);
22
- var recursive__default = /*#__PURE__*/_interopDefaultCompat(recursive);
23
-
24
- function sortObjectKeys(obj) {
25
- const sortedKeys = Object.keys(obj).sort();
26
- for (const key of sortedKeys) {
27
- const value = obj[key];
28
- delete obj[key];
29
- obj[key] = value;
30
- }
31
- }
32
- class PackageJsonHandler {
33
- constructor(writeFunc, prompt, pkg, targetPkg, variant) {
34
- this.writeFunc = writeFunc;
35
- this.prompt = prompt;
36
- this.pkg = pkg;
37
- this.targetPkg = targetPkg;
38
- this.variant = variant;
39
- }
40
- static async handler({ path, write, missing, targetContents, templateContents }, prompt, variant) {
41
- console.log("Checking package.json");
42
- if (missing) {
43
- throw new Error(`${path} doesn't exist`);
44
- }
45
- const pkg = JSON.parse(templateContents);
46
- const targetPkg = JSON.parse(targetContents);
47
- const handler = new PackageJsonHandler(
48
- write,
49
- prompt,
50
- pkg,
51
- targetPkg,
52
- variant
53
- );
54
- await handler.handle();
55
- }
56
- static async appHandler(file, prompt) {
57
- return PackageJsonHandler.handler(file, prompt, "app");
58
- }
59
- async handle() {
60
- await this.syncField("main");
61
- if (this.variant !== "app") {
62
- await this.syncField("main:src");
63
- }
64
- await this.syncField("types");
65
- await this.syncFiles();
66
- await this.syncScripts();
67
- await this.syncPublishConfig();
68
- await this.syncDependencies("dependencies");
69
- await this.syncDependencies("peerDependencies", true);
70
- await this.syncDependencies("devDependencies");
71
- await this.syncReactDeps();
72
- }
73
- // Make sure a field inside package.json is in sync. This mutates the targetObj and writes package.json on change.
74
- async syncField(fieldName, obj = this.pkg, targetObj = this.targetPkg, prefix, sort, optional) {
75
- const fullFieldName = chalk__default.default.cyan(
76
- prefix ? `${prefix}[${fieldName}]` : fieldName
77
- );
78
- const newValue = obj[fieldName];
79
- const coloredNewValue = chalk__default.default.cyan(JSON.stringify(newValue));
80
- if (fieldName in targetObj) {
81
- const oldValue = targetObj[fieldName];
82
- if (JSON.stringify(oldValue) === JSON.stringify(newValue)) {
83
- return;
84
- }
85
- const coloredOldValue = chalk__default.default.cyan(JSON.stringify(oldValue));
86
- const msg = `package.json has mismatched field, ${fullFieldName}, change from ${coloredOldValue} to ${coloredNewValue}?`;
87
- if (await this.prompt(msg)) {
88
- targetObj[fieldName] = newValue;
89
- if (sort) {
90
- sortObjectKeys(targetObj);
91
- }
92
- await this.write();
93
- }
94
- } else if (fieldName in obj && optional !== true) {
95
- if (await this.prompt(
96
- `package.json is missing field ${fullFieldName}, set to ${coloredNewValue}?`
97
- )) {
98
- targetObj[fieldName] = newValue;
99
- if (sort) {
100
- sortObjectKeys(targetObj);
101
- }
102
- await this.write();
103
- }
104
- }
105
- }
106
- async syncFiles() {
107
- const { configSchema } = this.targetPkg;
108
- const hasSchemaFile = typeof configSchema === "string";
109
- if (!this.targetPkg.files) {
110
- const expected = hasSchemaFile ? ["dist", configSchema] : ["dist"];
111
- if (await this.prompt(
112
- `package.json is missing field "files", set to ${JSON.stringify(
113
- expected
114
- )}?`
115
- )) {
116
- this.targetPkg.files = expected;
117
- await this.write();
118
- }
119
- } else {
120
- const missing = [];
121
- if (!this.targetPkg.files.includes("dist")) {
122
- missing.push("dist");
123
- }
124
- if (hasSchemaFile && !this.targetPkg.files.includes(configSchema)) {
125
- missing.push(configSchema);
126
- }
127
- if (missing.length) {
128
- if (await this.prompt(
129
- `package.json is missing ${JSON.stringify(
130
- missing
131
- )} in the "files" field, add?`
132
- )) {
133
- this.targetPkg.files.push(...missing);
134
- await this.write();
135
- }
136
- }
137
- }
138
- }
139
- async syncScripts() {
140
- const pkgScripts = this.pkg.scripts;
141
- const targetScripts = this.targetPkg.scripts = this.targetPkg.scripts || {};
142
- if (!pkgScripts) {
143
- return;
144
- }
145
- const hasNewScript = Object.values(targetScripts).some(
146
- (script) => String(script).includes("backstage-cli package ")
147
- );
148
- if (hasNewScript) {
149
- return;
150
- }
151
- for (const key of Object.keys(pkgScripts)) {
152
- await this.syncField(key, pkgScripts, targetScripts, "scripts");
153
- }
154
- }
155
- async syncPublishConfig() {
156
- const pkgPublishConf = this.pkg.publishConfig;
157
- const targetPublishConf = this.targetPkg.publishConfig;
158
- if (!pkgPublishConf) {
159
- return;
160
- }
161
- if (!targetPublishConf) {
162
- if (await this.prompt("Missing publishConfig, do you want to add it?")) {
163
- this.targetPkg.publishConfig = pkgPublishConf;
164
- await this.write();
165
- }
166
- return;
167
- }
168
- for (const key of Object.keys(pkgPublishConf)) {
169
- if (!["access", "registry"].includes(key)) {
170
- await this.syncField(
171
- key,
172
- pkgPublishConf,
173
- targetPublishConf,
174
- "publishConfig"
175
- );
176
- }
177
- }
178
- }
179
- async syncDependencies(fieldName, required = false) {
180
- const pkgDeps = this.pkg[fieldName];
181
- const targetDeps = this.targetPkg[fieldName] = this.targetPkg[fieldName] || {};
182
- if (!pkgDeps && !required) {
183
- return;
184
- }
185
- await this.syncField("@backstage/core", {}, targetDeps, fieldName, true);
186
- await this.syncField(
187
- "@backstage/core-api",
188
- {},
189
- targetDeps,
190
- fieldName,
191
- true
192
- );
193
- for (const key of Object.keys(pkgDeps)) {
194
- if (this.variant === "app" && key.startsWith("plugin-")) {
195
- continue;
196
- }
197
- await this.syncField(
198
- key,
199
- pkgDeps,
200
- targetDeps,
201
- fieldName,
202
- true,
203
- !required
204
- );
205
- }
206
- }
207
- async syncReactDeps() {
208
- const targetDeps = this.targetPkg.dependencies = this.targetPkg.dependencies || {};
209
- await this.syncField("react", {}, targetDeps, "dependencies");
210
- await this.syncField("react-dom", {}, targetDeps, "dependencies");
211
- }
212
- async write() {
213
- await this.writeFunc(`${JSON.stringify(this.targetPkg, null, 2)}
214
- `);
215
- }
216
- }
217
- async function exactMatchHandler({ path, write, missing, targetContents, templateContents }, prompt) {
218
- console.log(`Checking ${path}`);
219
- const coloredPath = chalk__default.default.cyan(path);
220
- if (missing) {
221
- if (await prompt(`Missing ${coloredPath}, do you want to add it?`)) {
222
- await write(templateContents);
223
- }
224
- return;
225
- }
226
- if (targetContents === templateContents) {
227
- return;
228
- }
229
- const diffs = differ.diffLines(targetContents, templateContents);
230
- for (const diff of diffs) {
231
- if (diff.added) {
232
- process.stdout.write(chalk__default.default.green(`+${diff.value}`));
233
- } else if (diff.removed) {
234
- process.stdout.write(chalk__default.default.red(`-${diff.value}`));
235
- } else {
236
- process.stdout.write(` ${diff.value}`);
237
- }
238
- }
239
- if (await prompt(
240
- `Outdated ${coloredPath}, do you want to apply the above patch?`
241
- )) {
242
- await write(templateContents);
243
- }
244
- }
245
- async function existsHandler({ path, write, missing, templateContents }, prompt) {
246
- console.log(`Making sure ${path} exists`);
247
- const coloredPath = chalk__default.default.cyan(path);
248
- if (missing) {
249
- if (await prompt(`Missing ${coloredPath}, do you want to add it?`)) {
250
- await write(templateContents);
251
- }
252
- return;
253
- }
254
- }
255
- async function skipHandler({ path }) {
256
- console.log(`Skipping ${path}`);
257
- }
258
- const handlers = {
259
- skip: skipHandler,
260
- exists: existsHandler,
261
- exactMatch: exactMatchHandler,
262
- packageJson: PackageJsonHandler.handler,
263
- appPackageJson: PackageJsonHandler.appHandler
264
- };
265
- async function handleAllFiles(fileHandlers, files, promptFunc) {
266
- for (const file of files) {
267
- const path$1 = file.path.split(path.sep).join(path.posix.sep);
268
- const fileHandler = fileHandlers.find(
269
- (handler) => handler.patterns.some(
270
- (pattern) => typeof pattern === "string" ? pattern === path$1 : pattern.test(path$1)
271
- )
272
- );
273
- if (fileHandler) {
274
- await fileHandler.handler(file, promptFunc);
275
- } else {
276
- throw new Error(`No template file handler found for ${path$1}`);
277
- }
278
- }
279
- }
280
-
281
- const inquirerPromptFunc = async (msg) => {
282
- const { result } = await inquirer__default.default.prompt({
283
- type: "confirm",
284
- name: "result",
285
- message: chalk__default.default.blue(msg)
286
- });
287
- return result;
288
- };
289
- const makeCheckPromptFunc = () => {
290
- let failed = false;
291
- const promptFunc = async (msg) => {
292
- failed = true;
293
- console.log(chalk__default.default.red(`[Check Failed] ${msg}`));
294
- return false;
295
- };
296
- const finalize = () => {
297
- if (failed) {
298
- throw new Error(
299
- "Check failed, the plugin is not in sync with the latest template"
300
- );
301
- }
302
- };
303
- return [promptFunc, finalize];
304
- };
305
- const yesPromptFunc = async (msg) => {
306
- console.log(`Accepting: "${msg}"`);
307
- return true;
308
- };
309
-
310
- async function readTemplateFile(templateFile, templateVars) {
311
- const contents = await fs__default.default.readFile(templateFile, "utf8");
312
- if (!templateFile.endsWith(".hbs")) {
313
- return contents;
314
- }
315
- const packageVersionProvider = index.createPackageVersionProvider(void 0);
316
- return handlebars__default.default.compile(contents)(templateVars, {
317
- helpers: {
318
- versionQuery(name, hint) {
319
- return packageVersionProvider(
320
- name,
321
- typeof hint === "string" ? hint : void 0
322
- );
323
- }
324
- }
325
- });
326
- }
327
- async function readTemplate(templateDir, templateVars) {
328
- const templateFilePaths = await recursive__default.default(templateDir).catch((error) => {
329
- throw new Error(`Failed to read template directory: ${error.message}`);
330
- });
331
- const templatedFiles = new Array();
332
- for (const templateFile of templateFilePaths) {
333
- const path$1 = path.relative(templateDir, templateFile).replace(/\.hbs$/, "");
334
- const contents = await readTemplateFile(templateFile, templateVars);
335
- templatedFiles.push({ path: path$1, contents });
336
- }
337
- return templatedFiles;
338
- }
339
- async function diffTemplatedFiles(targetDir, templatedFiles) {
340
- const fileDiffs = new Array();
341
- for (const { path: path$1, contents: templateContents } of templatedFiles) {
342
- const targetPath = path.resolve(targetDir, path$1);
343
- const targetExists = await fs__default.default.pathExists(targetPath);
344
- const write = async (contents) => {
345
- await fs__default.default.ensureDir(path.dirname(targetPath));
346
- await fs__default.default.writeFile(targetPath, contents, "utf8");
347
- };
348
- if (targetExists) {
349
- const targetContents = await fs__default.default.readFile(targetPath, "utf8");
350
- fileDiffs.push({
351
- path: path$1,
352
- write,
353
- missing: false,
354
- targetContents,
355
- templateContents
356
- });
357
- } else {
358
- fileDiffs.push({
359
- path: path$1,
360
- write,
361
- missing: true,
362
- targetContents: "",
363
- templateContents
364
- });
365
- }
366
- }
367
- return fileDiffs;
368
- }
369
- async function diffTemplateFiles(template, templateData) {
370
- const templateDir = index.paths.resolveOwn("templates", template);
371
- const templatedFiles = await readTemplate(templateDir, templateData);
372
- const fileDiffs = await diffTemplatedFiles(index.paths.targetDir, templatedFiles);
373
- return fileDiffs;
374
- }
375
-
376
- const fileHandlers = [
377
- {
378
- patterns: ["package.json"],
379
- handler: handlers.packageJson
380
- },
381
- {
382
- // make sure files in 1st level of src/ and dev/ exist
383
- patterns: [".eslintrc.js"],
384
- handler: handlers.exists
385
- },
386
- {
387
- patterns: ["README.md", "tsconfig.json", /^src\//, /^dev\//],
388
- handler: handlers.skip
389
- }
390
- ];
391
- var diff = async (opts) => {
392
- let promptFunc = inquirerPromptFunc;
393
- let finalize = () => {
394
- };
395
- if (opts.check) {
396
- [promptFunc, finalize] = makeCheckPromptFunc();
397
- } else if (opts.yes) {
398
- promptFunc = yesPromptFunc;
399
- }
400
- const data = await readPluginData();
401
- const templateFiles = await diffTemplateFiles("default-plugin", data);
402
- await handleAllFiles(fileHandlers, templateFiles, promptFunc);
403
- finalize();
404
- };
405
- async function readPluginData() {
406
- let name;
407
- let privatePackage;
408
- let pluginVersion;
409
- let npmRegistry;
410
- try {
411
- const pkg = require(index.paths.resolveTarget("package.json"));
412
- name = pkg.name;
413
- privatePackage = pkg.private;
414
- pluginVersion = pkg.version;
415
- const scope = name.split("/")[0];
416
- if (`${scope}:registry` in pkg.publishConfig) {
417
- const registryURL = pkg.publishConfig[`${scope}:registry`];
418
- npmRegistry = `"${scope}:registry" : "${registryURL}"`;
419
- } else npmRegistry = "";
420
- } catch (error) {
421
- throw new Error(`Failed to read target package, ${error}`);
422
- }
423
- const pluginTsContents = await fs__default.default.readFile(
424
- index.paths.resolveTarget("src/plugin.ts"),
425
- "utf8"
426
- );
427
- const pluginIdMatch = pluginTsContents.match(/id: ['"`](.+?)['"`]/);
428
- if (!pluginIdMatch) {
429
- throw new Error(`Failed to parse plugin.ts, no plugin ID found`);
430
- }
431
- const id = pluginIdMatch[1];
432
- return { id, name, privatePackage, pluginVersion, npmRegistry };
433
- }
434
-
435
- exports.default = diff;
436
- //# sourceMappingURL=diff-Drt115Zb.cjs.js.map