@backstage/cli 0.26.11-next.1 → 0.27.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 (49) hide show
  1. package/CHANGELOG.md +63 -0
  2. package/config/eslint-factory.js +1 -0
  3. package/dist/cjs/Lockfile-B4mqBkH6.cjs.js +86 -0
  4. package/dist/cjs/{build-fqzNfqa5.cjs.js → build-D5DoFqm6.cjs.js} +9 -13
  5. package/dist/cjs/{buildBackend-CrQ_GwBs.cjs.js → buildBackend-UK6nC6VL.cjs.js} +41 -38
  6. package/dist/cjs/{buildWorkspace-Bv-xt2y-.cjs.js → buildWorkspace-Z-hpJt9g.cjs.js} +4 -4
  7. package/dist/cjs/{bump-DG3jcOMS.cjs.js → bump-Qc4jNLOA.cjs.js} +7 -84
  8. package/dist/cjs/{clean-BGNU8ShE.cjs.js → clean-CB6dTqaG.cjs.js} +2 -2
  9. package/dist/cjs/{clean-83xjoKEJ.cjs.js → clean-DlsJGDLw.cjs.js} +2 -2
  10. package/dist/cjs/{codeowners-B-nGMoIG.cjs.js → codeowners-0MT7UP_S.cjs.js} +2 -2
  11. package/dist/cjs/{config-eLDUbNFK.cjs.js → config-B1bkp-HP.cjs.js} +43 -35
  12. package/dist/cjs/{createDistWorkspace-vhWGDizr.cjs.js → createDistWorkspace-0v54ePDJ.cjs.js} +3 -3
  13. package/dist/cjs/{createPlugin-B1qnN0IC.cjs.js → createPlugin-CUOGhq6P.cjs.js} +6 -6
  14. package/dist/cjs/{diff-BU6vhJMf.cjs.js → diff-BaiaASdN.cjs.js} +2 -2
  15. package/dist/cjs/{docs-GJmQNVkJ.cjs.js → docs-D8vejOxE.cjs.js} +3 -3
  16. package/dist/cjs/{fix-BhwlcHp_.cjs.js → fix-C7T4cvOB.cjs.js} +2 -2
  17. package/dist/cjs/{index-CTTm1_x6.cjs.js → index-1VtfY6wb.cjs.js} +4 -4
  18. package/dist/cjs/{index-CYI5nGsH.cjs.js → index-B8Ebu0mP.cjs.js} +38 -16
  19. package/dist/cjs/{index-DX-m2Ed0.cjs.js → index-BAcLy7dK.cjs.js} +48 -47
  20. package/dist/cjs/{index-pTrNn6sL.cjs.js → index-Bu7Vqly9.cjs.js} +50 -63
  21. package/dist/cjs/{index-D8nglRxA.cjs.js → index-F8W-9gIc.cjs.js} +2 -2
  22. package/dist/cjs/{info-CSiHnHqF.cjs.js → info-D_IhL0i0.cjs.js} +4 -4
  23. package/dist/cjs/{install-C6PA5oT4.cjs.js → install-DGaf_UuL.cjs.js} +5 -5
  24. package/dist/cjs/{lint-yikicfA4.cjs.js → lint-CRqMLZJ5.cjs.js} +2 -2
  25. package/dist/cjs/lint-Dkx_fBkS.cjs.js +10 -0
  26. package/dist/cjs/{lint-D0v-Gi6H.cjs.js → lint-EJvdRB7_.cjs.js} +2 -2
  27. package/dist/cjs/{list-deprecations-Coko6Rsb.cjs.js → list-deprecations-COfvNjrB.cjs.js} +2 -2
  28. package/dist/cjs/{packageDetection-B6lJYBh9.cjs.js → moduleFederation-CQZbFAit.cjs.js} +179 -38
  29. package/dist/cjs/{new-Da1kvXDQ.cjs.js → new-DB_oe66E.cjs.js} +6 -6
  30. package/dist/cjs/{pack-D8b4JM6B.cjs.js → pack-BcxxlYor.cjs.js} +2 -2
  31. package/dist/cjs/{packageExports-DDff9ia4.cjs.js → packageExports-FpoAU1Be.cjs.js} +3 -3
  32. package/dist/cjs/{packageLintConfigs-Bfvzg--7.cjs.js → packageLintConfigs-D7LMvTow.cjs.js} +3 -3
  33. package/dist/cjs/{packageRole-CXerjPpL.cjs.js → packageRole-BeuvccV9.cjs.js} +2 -2
  34. package/dist/cjs/{packages-BgyW9VKx.cjs.js → packages-DPPEGYIi.cjs.js} +3 -3
  35. package/dist/cjs/{print-C5tbwB1-.cjs.js → print-DuJqsJ2y.cjs.js} +3 -3
  36. package/dist/cjs/{role-BjmWpqH5.cjs.js → role-DAaP4LE5.cjs.js} +2 -2
  37. package/dist/cjs/{run-ClbD5HPt.cjs.js → run-CPcG7YxR.cjs.js} +2 -2
  38. package/dist/cjs/{schema-DbqftE60.cjs.js → schema-CR794PHv.cjs.js} +3 -3
  39. package/dist/cjs/{tasks-XfFuuYgf.cjs.js → tasks-4L8FqWEM.cjs.js} +2 -2
  40. package/dist/cjs/{test-BYKGLz-_.cjs.js → test-303IpaqN.cjs.js} +3 -3
  41. package/dist/cjs/{test-BEyXOT0e.cjs.js → test-y8AV0JOP.cjs.js} +3 -3
  42. package/dist/cjs/{validate-D4vVgxsi.cjs.js → validate-DZJIL6CK.cjs.js} +3 -3
  43. package/dist/index.cjs.js +1 -1
  44. package/package.json +12 -11
  45. package/templates/default-backend-plugin/package.json.hbs +0 -1
  46. package/templates/default-backend-plugin/src/service/router.ts +2 -3
  47. package/templates/default-plugin/src/components/ExampleComponent/ExampleComponent.test.tsx.hbs +2 -2
  48. package/dist/cjs/Lockfile-BndFvzHc.cjs.js +0 -221
  49. package/dist/cjs/lint-DqMGmvsS.cjs.js +0 -112
@@ -31,7 +31,6 @@
31
31
  "@backstage/backend-common": "{{versionQuery '@backstage/backend-common'}}",
32
32
  "@backstage/backend-defaults": "{{versionQuery '@backstage/backend-defaults'}}",
33
33
  "@backstage/backend-plugin-api": "{{versionQuery '@backstage/backend-plugin-api'}}",
34
- "@backstage/config": "{{versionQuery '@backstage/config'}}",
35
34
  "express": "{{versionQuery 'express' '4.17.1'}}",
36
35
  "express-promise-router": "{{versionQuery 'express-promise-router' '4.1.0'}}",
37
36
  "node-fetch": "{{versionQuery 'node-fetch' '2.6.7'}}"
@@ -1,12 +1,11 @@
1
1
  import { MiddlewareFactory } from '@backstage/backend-defaults/rootHttpRouter';
2
- import { LoggerService } from '@backstage/backend-plugin-api';
3
- import { Config } from '@backstage/config';
2
+ import { LoggerService, RootConfigService } from '@backstage/backend-plugin-api';
4
3
  import express from 'express';
5
4
  import Router from 'express-promise-router';
6
5
 
7
6
  export interface RouterOptions {
8
7
  logger: LoggerService;
9
- config: Config;
8
+ config: RootConfigService;
10
9
  }
11
10
 
12
11
  export async function createRouter(
@@ -4,14 +4,14 @@ import { rest } from 'msw';
4
4
  import { setupServer } from 'msw/node';
5
5
  import { screen } from '@testing-library/react';
6
6
  import {
7
- setupRequestMockHandlers,
7
+ registerMswTestHooks,
8
8
  renderInTestApp,
9
9
  } from '@backstage/test-utils';
10
10
 
11
11
  describe('ExampleComponent', () => {
12
12
  const server = setupServer();
13
13
  // Enable sane handlers for network requests
14
- setupRequestMockHandlers(server);
14
+ registerMswTestHooks(server);
15
15
 
16
16
  // setup mock response
17
17
  beforeEach(() => {
@@ -1,221 +0,0 @@
1
- 'use strict';
2
-
3
- var fs = require('fs-extra');
4
- var semver = require('semver');
5
- var parsers = require('@yarnpkg/parsers');
6
- var lockfile = require('@yarnpkg/lockfile');
7
-
8
- function _interopDefaultCompat (e) { return e && typeof e === 'object' && 'default' in e ? e : { default: e }; }
9
-
10
- var fs__default = /*#__PURE__*/_interopDefaultCompat(fs);
11
- var semver__default = /*#__PURE__*/_interopDefaultCompat(semver);
12
-
13
- const ENTRY_PATTERN = /^((?:@[^/]+\/)?[^@/]+)@(.+)$/;
14
- const NEW_HEADER = `${[
15
- `# This file is generated by running "yarn install" inside your project.
16
- `,
17
- `# Manual changes might be lost - proceed with caution!
18
- `
19
- ].join(``)}
20
- `;
21
- const LEGACY_REGEX = /^(#.*(\r?\n))*?#\s+yarn\s+lockfile\s+v1\r?\n/i;
22
- const SPECIAL_OBJECT_KEYS = [
23
- `__metadata`,
24
- `version`,
25
- `resolution`,
26
- `dependencies`,
27
- `peerDependencies`,
28
- `dependenciesMeta`,
29
- `peerDependenciesMeta`,
30
- `binaries`
31
- ];
32
- class Lockfile {
33
- constructor(packages, data, legacy = false) {
34
- this.packages = packages;
35
- this.data = data;
36
- this.legacy = legacy;
37
- }
38
- static async load(path) {
39
- const lockfileContents = await fs__default.default.readFile(path, "utf8");
40
- return Lockfile.parse(lockfileContents);
41
- }
42
- static parse(content) {
43
- const legacy = LEGACY_REGEX.test(content);
44
- let data;
45
- try {
46
- data = parsers.parseSyml(content);
47
- } catch (err) {
48
- throw new Error(`Failed yarn.lock parse, ${err}`);
49
- }
50
- const packages = /* @__PURE__ */ new Map();
51
- for (const [key, value] of Object.entries(data)) {
52
- if (SPECIAL_OBJECT_KEYS.includes(key)) continue;
53
- const [, name, ranges] = ENTRY_PATTERN.exec(key) ?? [];
54
- if (!name) {
55
- throw new Error(`Failed to parse yarn.lock entry '${key}'`);
56
- }
57
- let queries = packages.get(name);
58
- if (!queries) {
59
- queries = [];
60
- packages.set(name, queries);
61
- }
62
- for (let range of ranges.split(/\s*,\s*/)) {
63
- if (range.startsWith(`${name}@`)) {
64
- range = range.slice(`${name}@`.length);
65
- }
66
- if (range.startsWith("npm:")) {
67
- range = range.slice("npm:".length);
68
- }
69
- queries.push({ range, version: value.version, dataKey: key });
70
- }
71
- }
72
- return new Lockfile(packages, data, legacy);
73
- }
74
- /** Get the entries for a single package in the lockfile */
75
- get(name) {
76
- return this.packages.get(name);
77
- }
78
- /** Returns the name of all packages available in the lockfile */
79
- keys() {
80
- return this.packages.keys();
81
- }
82
- /** Analyzes the lockfile to identify possible actions and warnings for the entries */
83
- analyze(options) {
84
- const { filter, localPackages } = options;
85
- const result = {
86
- invalidRanges: [],
87
- newVersions: [],
88
- newRanges: []
89
- };
90
- for (const [name, allEntries] of this.packages) {
91
- if (filter && !filter(name)) {
92
- continue;
93
- }
94
- const invalid = allEntries.filter(
95
- (e) => !semver__default.default.validRange(e.range) && !e.range.startsWith("workspace:")
96
- );
97
- result.invalidRanges.push(
98
- ...invalid.map(({ range }) => ({ name, range }))
99
- );
100
- const entries = allEntries.filter((e) => semver__default.default.validRange(e.range));
101
- if (entries.length < 2) {
102
- continue;
103
- }
104
- const versions = Array.from(new Set(entries.map((e) => e.version))).map((v) => {
105
- if (v === "0.0.0-use.local") {
106
- const local = localPackages.get(name);
107
- if (!local) {
108
- throw new Error(`No local package found for ${name}`);
109
- }
110
- if (!local.packageJson.version) {
111
- throw new Error(`No version found for local package ${name}`);
112
- }
113
- return {
114
- entryVersion: v,
115
- actualVersion: local.packageJson.version
116
- };
117
- }
118
- return { entryVersion: v, actualVersion: v };
119
- }).sort((v1, v2) => semver__default.default.rcompare(v1.actualVersion, v2.actualVersion));
120
- if (versions.length < 2) {
121
- continue;
122
- }
123
- const acceptedVersions = /* @__PURE__ */ new Set();
124
- for (const { version, range } of entries) {
125
- const acceptedVersion = versions.find(
126
- (v) => semver__default.default.satisfies(v.actualVersion, range)
127
- );
128
- if (!acceptedVersion) {
129
- throw new Error(
130
- `No existing version was accepted for range ${range}, searching through ${versions}, for package ${name}`
131
- );
132
- }
133
- if (acceptedVersion.entryVersion !== version) {
134
- result.newVersions.push({
135
- name,
136
- range,
137
- newVersion: acceptedVersion.entryVersion,
138
- oldVersion: version
139
- });
140
- }
141
- acceptedVersions.add(acceptedVersion.actualVersion);
142
- }
143
- if (acceptedVersions.size === 1) {
144
- continue;
145
- }
146
- const maxVersion = Array.from(acceptedVersions).sort(semver__default.default.rcompare)[0];
147
- const maxEntry = entries.filter((e) => semver__default.default.satisfies(maxVersion, e.range)).map((e) => ({ e, min: semver__default.default.minVersion(e.range) })).filter((p) => p.min).sort((a, b) => semver__default.default.rcompare(a.min, b.min))[0]?.e;
148
- if (!maxEntry) {
149
- throw new Error(
150
- `No entry found that satisfies max version '${maxVersion}'`
151
- );
152
- }
153
- for (const { version, range } of entries) {
154
- if (semver__default.default.satisfies(maxVersion, range)) {
155
- continue;
156
- }
157
- result.newRanges.push({
158
- name,
159
- oldRange: range,
160
- newRange: maxEntry.range,
161
- oldVersion: version,
162
- newVersion: maxVersion
163
- });
164
- }
165
- }
166
- return result;
167
- }
168
- remove(name, range) {
169
- const query = `${name}@${range}`;
170
- const existed = Boolean(this.data[query]);
171
- delete this.data[query];
172
- const newEntries = this.packages.get(name)?.filter((e) => e.range !== range);
173
- if (newEntries) {
174
- this.packages.set(name, newEntries);
175
- }
176
- return existed;
177
- }
178
- /** Modifies the lockfile by bumping packages to the suggested versions */
179
- replaceVersions(results) {
180
- for (const { name, range, oldVersion, newVersion } of results) {
181
- const query = `${name}@${range}`;
182
- const entryData = this.data[query];
183
- if (!entryData) {
184
- throw new Error(`No entry data for ${query}`);
185
- }
186
- if (entryData.version !== oldVersion) {
187
- throw new Error(
188
- `Expected existing version data for ${query} to be ${oldVersion}, was ${entryData.version}`
189
- );
190
- }
191
- const matchingEntry = Object.entries(this.data).find(
192
- ([q, e]) => q.startsWith(`${name}@`) && e.version === newVersion
193
- );
194
- if (!matchingEntry) {
195
- throw new Error(
196
- `No matching entry found for ${name} at version ${newVersion}`
197
- );
198
- }
199
- this.data[query] = matchingEntry[1];
200
- const entry = this.packages.get(name)?.find((e) => e.range === range);
201
- if (!entry) {
202
- throw new Error(`No entry data for ${query}`);
203
- }
204
- if (entry.version !== oldVersion) {
205
- throw new Error(
206
- `Expected existing version data for ${query} to be ${oldVersion}, was ${entryData.version}`
207
- );
208
- }
209
- entry.version = newVersion;
210
- }
211
- }
212
- async save(path) {
213
- await fs__default.default.writeFile(path, this.toString(), "utf8");
214
- }
215
- toString() {
216
- return this.legacy ? lockfile.stringify(this.data) : NEW_HEADER + parsers.stringifySyml(this.data);
217
- }
218
- }
219
-
220
- exports.Lockfile = Lockfile;
221
- //# sourceMappingURL=Lockfile-BndFvzHc.cjs.js.map
@@ -1,112 +0,0 @@
1
- 'use strict';
2
-
3
- var Lockfile = require('./Lockfile-BndFvzHc.cjs.js');
4
- require('minimatch');
5
- require('@manypkg/get-packages');
6
- require('chalk');
7
- require('./yarn-Ukl9MOS0.cjs.js');
8
- require('./run-ClbD5HPt.cjs.js');
9
- var index = require('./index-DX-m2Ed0.cjs.js');
10
- var partition = require('lodash/partition');
11
- var cliNode = require('@backstage/cli-node');
12
- require('fs-extra');
13
- require('semver');
14
- require('@yarnpkg/parsers');
15
- require('@yarnpkg/lockfile');
16
- require('@backstage/errors');
17
- require('child_process');
18
- require('util');
19
- require('commander');
20
- require('@backstage/cli-common');
21
-
22
- function _interopDefaultCompat (e) { return e && typeof e === 'object' && 'default' in e ? e : { default: e }; }
23
-
24
- var partition__default = /*#__PURE__*/_interopDefaultCompat(partition);
25
-
26
- const INCLUDED = [/^@backstage\//];
27
- const includedFilter = (name) => INCLUDED.some((pattern) => pattern.test(name));
28
- const FORBID_DUPLICATES = [/^@backstage\/\w+-app-api$/, /^@backstage\/plugin-/];
29
- const ALLOW_DUPLICATES = [
30
- /^@backstage\/core-plugin-api$/,
31
- // Duplicates of libraries are OK
32
- // TODO(Rugvip): Check this using package role instead
33
- /^@backstage\/plugin-.*-react$/,
34
- /^@backstage\/plugin-.*-node$/,
35
- /^@backstage\/plugin-.*-common$/
36
- ];
37
- const forbiddenDuplicatesFilter = (name) => FORBID_DUPLICATES.some((pattern) => pattern.test(name)) && !ALLOW_DUPLICATES.some((pattern) => pattern.test(name));
38
- var lint = async (cmd) => {
39
- const fix = Boolean(cmd.fix);
40
- let success = true;
41
- const lockfilePath = index.paths.resolveTargetRoot("yarn.lock");
42
- const lockfile = await Lockfile.Lockfile.load(lockfilePath);
43
- const result = lockfile.analyze({
44
- filter: includedFilter,
45
- localPackages: cliNode.PackageGraph.fromPackages(
46
- await cliNode.PackageGraph.listTargetPackages()
47
- )
48
- });
49
- logArray(
50
- result.invalidRanges,
51
- "The following packages versions are invalid and can't be analyzed:",
52
- (e) => ` ${e.name} @ ${e.range}`
53
- );
54
- if (fix) {
55
- lockfile.replaceVersions(result.newVersions);
56
- await lockfile.save(lockfilePath);
57
- } else {
58
- const [newVersionsForbidden, newVersionsAllowed] = partition__default.default(
59
- result.newVersions,
60
- ({ name }) => forbiddenDuplicatesFilter(name)
61
- );
62
- if (newVersionsForbidden.length && !fix) {
63
- success = false;
64
- }
65
- logArray(
66
- newVersionsForbidden,
67
- "The following packages must be deduplicated, this can be done automatically with --fix",
68
- (e) => ` ${e.name} @ ${e.range} bumped from ${e.oldVersion} to ${e.newVersion}`
69
- );
70
- logArray(
71
- newVersionsAllowed,
72
- "The following packages can be deduplicated, this can be done automatically with --fix",
73
- (e) => ` ${e.name} @ ${e.range} bumped from ${e.oldVersion} to ${e.newVersion}`
74
- );
75
- }
76
- const [newRangesForbidden, newRangesAllowed] = partition__default.default(
77
- result.newRanges,
78
- ({ name }) => forbiddenDuplicatesFilter(name)
79
- );
80
- if (newRangesForbidden.length) {
81
- success = false;
82
- }
83
- logArray(
84
- newRangesForbidden,
85
- "The following packages must be deduplicated by updating dependencies in package.json",
86
- (e) => ` ${e.name} @ ${e.oldRange} should be changed to ${e.newRange}`
87
- );
88
- logArray(
89
- newRangesAllowed,
90
- "The following packages can be deduplicated by updating dependencies in package.json",
91
- (e) => ` ${e.name} @ ${e.oldRange} should be changed to ${e.newRange}`
92
- );
93
- if (!success) {
94
- throw new Error("Failed versioning check");
95
- }
96
- };
97
- function logArray(arr, header, each) {
98
- if (arr.length === 0) {
99
- return;
100
- }
101
- console.log(header);
102
- console.log();
103
- for (const e of arr) {
104
- console.log(each(e));
105
- }
106
- console.log();
107
- }
108
-
109
- exports.default = lint;
110
- exports.forbiddenDuplicatesFilter = forbiddenDuplicatesFilter;
111
- exports.includedFilter = includedFilter;
112
- //# sourceMappingURL=lint-DqMGmvsS.cjs.js.map