From 911c25de59cefe6f77823258438123edb7f9299a Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Sun, 5 Mar 2023 20:17:14 +0100 Subject: [PATCH 001/177] eslint-plugin: add auto fix for missing imports Signed-off-by: Patrik Oldsberg --- .changeset/twelve-parrots-camp.md | 5 + packages/eslint-plugin/lib/getPackages.js | 4 + packages/eslint-plugin/lib/visitImports.js | 30 ++- .../rules/no-undeclared-imports.js | 188 +++++++++++++----- .../src/no-undeclared-imports.test.ts | 64 +++++- 5 files changed, 232 insertions(+), 59 deletions(-) create mode 100644 .changeset/twelve-parrots-camp.md diff --git a/.changeset/twelve-parrots-camp.md b/.changeset/twelve-parrots-camp.md new file mode 100644 index 0000000000..ea7e254f29 --- /dev/null +++ b/.changeset/twelve-parrots-camp.md @@ -0,0 +1,5 @@ +--- +'@backstage/eslint-plugin': patch +--- + +Add support for auto-fixing missing imports detected by the `no-undeclared-imports` rule. diff --git a/packages/eslint-plugin/lib/getPackages.js b/packages/eslint-plugin/lib/getPackages.js index f5f2c63cc1..8f4ccfacf3 100644 --- a/packages/eslint-plugin/lib/getPackages.js +++ b/packages/eslint-plugin/lib/getPackages.js @@ -31,6 +31,7 @@ const manypkg = require('@manypkg/get-packages'); * @property {ExtendedPackage} root * @property {ExtendedPackage[]} list * @property {Map} map + * @property {() => void} clearCache * @property {(path: string) => ExtendedPackage | undefined} byPath */ @@ -64,6 +65,9 @@ module.exports = (function () { pkg => !path.relative(pkg.dir, filePath).startsWith('..'), ); }, + clearCache() { + result = undefined; + }, }; lastLoadAt = Date.now(); return result; diff --git a/packages/eslint-plugin/lib/visitImports.js b/packages/eslint-plugin/lib/visitImports.js index 1a344c1101..376c37575f 100644 --- a/packages/eslint-plugin/lib/visitImports.js +++ b/packages/eslint-plugin/lib/visitImports.js @@ -24,6 +24,16 @@ const getPackages = require('./getPackages'); * @type {object} * @property {'local'} type * @property {'value' | 'type'} kind + * @property {import('estree').Node} node + * @property {string} path + */ + +/** + * @typedef ImportDirective + * @type {object} + * @property {'directive'} type + * @property {'value' | 'type'} kind + * @property {import('estree').Node} node * @property {string} path */ @@ -32,6 +42,7 @@ const getPackages = require('./getPackages'); * @type {object} * @property {'internal'} type * @property {'value' | 'type'} kind + * @property {import('estree').Node} node * @property {string} path * @property {import('./getPackages').ExtendedPackage} package * @property {string} packageName @@ -42,6 +53,7 @@ const getPackages = require('./getPackages'); * @type {object} * @property {'external'} type * @property {'value' | 'type'} kind + * @property {import('estree').Node} node * @property {string} path * @property {string} packageName */ @@ -51,6 +63,7 @@ const getPackages = require('./getPackages'); * @type {object} * @property {'builtin'} type * @property {'value' | 'type'} kind + * @property {import('estree').Literal} node * @property {string} path * @property {string} packageName */ @@ -58,7 +71,7 @@ const getPackages = require('./getPackages'); /** * @callback ImportVisitor * @param {ConsideredNode} node - * @param {LocalImport | InternalImport | ExternalImport | BuiltinImport} import + * @param {ImportDirective | LocalImport | InternalImport | ExternalImport | BuiltinImport} import */ /** @@ -68,7 +81,7 @@ const getPackages = require('./getPackages'); /** * @param {ConsideredNode} node - * @returns {undefined | {path: string, kind: 'type' | 'value'}} + * @returns {undefined | {path: string, node: import('estree').Literal, kind: 'type' | 'value'}} */ function getImportInfo(node) { /** @type {import('estree').Expression | import('estree').SpreadElement | undefined | null} */ @@ -95,7 +108,11 @@ function getImportInfo(node) { /** @type {any} */ const anyNode = node; - return { path: pathNode.value, kind: anyNode.importKind ?? 'value' }; + return { + path: pathNode.value, + node: pathNode, + kind: anyNode.importKind ?? 'value', + }; } /** @@ -122,6 +139,10 @@ module.exports = function visitImports(context, visitor) { return visitor(node, { type: 'local', ...info }); } + if (info.path.startsWith('directive:')) { + return visitor(node, { type: 'directive', ...info }); + } + const pathParts = info.path.split('/'); // Check for match with plain name, then namespaced name @@ -143,6 +164,7 @@ module.exports = function visitImports(context, visitor) { return visitor(node, { type: 'builtin', kind: info.kind, + node: info.node, path: subPath, packageName, }); @@ -151,6 +173,7 @@ module.exports = function visitImports(context, visitor) { return visitor(node, { type: 'external', kind: info.kind, + node: info.node, path: subPath, packageName, }); @@ -159,6 +182,7 @@ module.exports = function visitImports(context, visitor) { return visitor(node, { type: 'internal', kind: info.kind, + node: info.node, path: subPath, package: pkg, packageName, diff --git a/packages/eslint-plugin/rules/no-undeclared-imports.js b/packages/eslint-plugin/rules/no-undeclared-imports.js index b1e11d1b97..06f0afed46 100644 --- a/packages/eslint-plugin/rules/no-undeclared-imports.js +++ b/packages/eslint-plugin/rules/no-undeclared-imports.js @@ -20,6 +20,7 @@ const path = require('path'); const getPackageMap = require('../lib/getPackages'); const visitImports = require('../lib/visitImports'); const minimatch = require('minimatch'); +const { execFileSync } = require('child_process'); const depFields = { dep: 'dependencies', @@ -124,11 +125,13 @@ function getAddFlagForDepsField(depsField) { module.exports = { meta: { type: 'problem', + fixable: 'code', messages: { undeclared: "{{ packageName }} must be declared in {{ depsField }} of {{ packageJsonPath }}, run 'yarn --cwd {{ packagePath }} add{{ addFlag }} {{ packageName }}' from the project root.", switch: '{{ packageName }} is declared in {{ oldDepsField }}, but should be moved to {{ depsField }} in {{ packageJsonPath }}.', + switchBack: 'Switch back to import declaration', }, docs: { description: @@ -150,63 +153,150 @@ module.exports = { return {}; } - return visitImports(context, (node, imp) => { - // We leave checking of type imports to the repo-tools check, - // and we skip builtins and local imports - if ( - imp.kind === 'type' || - imp.type === 'builtin' || - imp.type === 'local' - ) { - return; - } + /** @type Array<{name: string, flag: string, node: import('estree').Node}> */ + const importsToAdd = []; - // We skip imports for the package itself - if (imp.packageName === localPkg.packageJson.name) { - return; - } + return { + // All missing imports that we detect are collected as we traverse, and then we use + // the program exit to execute all install directives that have been found. + ['Program:exit']() { + /** @type Record> */ + const byFlag = {}; - const modulePath = path.relative(localPkg.dir, filePath); - const expectedType = getExpectedDepType( - localPkg.packageJson, - imp.packageName, - modulePath, - ); + for (const { name, flag } of importsToAdd) { + byFlag[flag] = byFlag[flag] ?? new Set(); + byFlag[flag].add(name); + } - const conflict = findConflict( - localPkg.packageJson, - imp.packageName, - expectedType, - ); + for (const name of byFlag[''] ?? []) { + byFlag['--dev']?.delete(name); + } + for (const name of byFlag['--peer'] ?? []) { + byFlag['']?.delete(name); + byFlag['--dev']?.delete(name); + } - if (conflict) { - try { - const fullImport = imp.path - ? `${imp.packageName}/${imp.path}` - : imp.packageName; - require.resolve(fullImport, { - paths: [localPkg.dir], + for (const [flag, names] of Object.entries(byFlag)) { + // The security implication of this is a bit interesting, as crafted add-import + // directives could be used to install malicious packages. However, the same is true + // for adding malicious packages to package.json, so there's significant difference. + execFileSync('yarn', ['add', ...(flag || []), ...names], { + cwd: localPkg.dir, + stdio: 'inherit', }); - } catch { - // If the dependency doesn't resolve then it's likely a type import, ignore + } + + // This switches all import directives back to the original import. + for (const added of importsToAdd) { + context.report({ + node: added.node, + messageId: 'switchBack', + fix(fixer) { + return fixer.replaceText(added.node, `'${added.name}'`); + }, + }); + } + + importsToAdd.length = 0; + packages.clearCache(); + }, + ...visitImports(context, (node, imp) => { + // We leave checking of type imports to the repo-tools check, + // and we skip builtins and local imports + if ( + imp.kind === 'type' || + imp.type === 'builtin' || + imp.type === 'local' + ) { return; } - const packagePath = path.relative(packages.root.dir, localPkg.dir); - const packageJsonPath = path.join(packagePath, 'package.json'); + // Any import directive that is found is collected for processing later + if (imp.type === 'directive') { + const parts = imp.path.split(':'); + if (parts[1] !== 'add-import') { + return; + } + const [type, name] = parts.slice(2); + if (!name.match(/^(@[-\w\.~]+\/)?[-\w\.~]*$/i)) { + throw new Error( + `Invalid package name to add as dependency: '${name}'`, + ); + } - context.report({ - node, - messageId: conflict.oldDepsField ? 'switch' : 'undeclared', - data: { - ...conflict, - packagePath, - addFlag: getAddFlagForDepsField(conflict.depsField), - packageName: imp.packageName, - packageJsonPath: packageJsonPath, - }, - }); - } - }); + importsToAdd.push({ + flag: getAddFlagForDepsField(type).trim(), + name, + node: imp.node, + }); + return; + } + + // We skip imports for the package itself + if (imp.packageName === localPkg.packageJson.name) { + return; + } + + const modulePath = path.relative(localPkg.dir, filePath); + const expectedType = getExpectedDepType( + localPkg.packageJson, + imp.packageName, + modulePath, + ); + + const conflict = findConflict( + localPkg.packageJson, + imp.packageName, + expectedType, + ); + + if (conflict) { + try { + const fullImport = imp.path + ? `${imp.packageName}/${imp.path}` + : imp.packageName; + require.resolve(fullImport, { + paths: [localPkg.dir], + }); + } catch { + // If the dependency doesn't resolve then it's likely a type import, ignore + return; + } + + const packagePath = path.relative(packages.root.dir, localPkg.dir); + const packageJsonPath = path.join(packagePath, 'package.json'); + + context.report({ + node, + messageId: conflict.oldDepsField ? 'switch' : 'undeclared', + data: { + ...conflict, + packagePath, + addFlag: getAddFlagForDepsField(conflict.depsField), + packageName: imp.packageName, + packageJsonPath: packageJsonPath, + }, + // This fix callback is always executed, regardless of whether linting is run with + // fixes enabled or not. There is no way to determine if fixes are being applied, so + // instead our fix will replace the import with a directive that will be picked up + // on the next run. When ESLint applies fixes all rules are re-run to make sure the fixes + // applied correctly, which means that these directives will be picked up, executed, + // and switched back to the original import immediately. + // This is not true for all editor integrations. For example, VSCode translates there fixes + // to native editor commands, and does not re-run ESLint. This means that the import directive + // will end up in source code, and the import directive fix needs to be applied manually too. + // There is to my knowledge no way around this that doesn't get very hacky, so it will do for now. + fix: conflict.oldDepsField + ? undefined + : fixer => { + return fixer.replaceText( + imp.node, + `'directive:add-import:${conflict.depsField}:${imp.packageName}'`, + ); + }, + }); + } + }), + }; }, }; diff --git a/packages/eslint-plugin/src/no-undeclared-imports.test.ts b/packages/eslint-plugin/src/no-undeclared-imports.test.ts index 78844899ba..e92d422057 100644 --- a/packages/eslint-plugin/src/no-undeclared-imports.test.ts +++ b/packages/eslint-plugin/src/no-undeclared-imports.test.ts @@ -18,6 +18,10 @@ import { RuleTester } from 'eslint'; import { join as joinPath } from 'path'; import rule from '../rules/no-undeclared-imports'; +jest.mock('child_process', () => ({ + execFileSync: jest.fn(), +})); + const RULE = 'no-undeclared-imports'; const FIXTURE = joinPath(__dirname, '__fixtures__/monorepo'); @@ -45,6 +49,9 @@ const ERR_SWITCHED = ( 'package.json', )}.`, }); +const ERR_SWITCH_BACK = () => ({ + message: 'Switch back to import declaration', +}); process.chdir(FIXTURE); @@ -130,6 +137,7 @@ ruleTester.run(RULE, rule, { }, { code: `import 'lodash'`, + output: `import 'directive:add-import:dependencies:lodash'`, filename: joinPath(FIXTURE, 'packages/bar/src/index.ts'), errors: [ ERR_UNDECLARED('lodash', 'dependencies', joinPath('packages', 'bar')), @@ -137,6 +145,7 @@ ruleTester.run(RULE, rule, { }, { code: `import { debounce } from 'lodash'`, + output: `import { debounce } from 'directive:add-import:dependencies:lodash'`, filename: joinPath(FIXTURE, 'packages/bar/src/index.ts'), errors: [ ERR_UNDECLARED('lodash', 'dependencies', joinPath('packages', 'bar')), @@ -144,6 +153,7 @@ ruleTester.run(RULE, rule, { }, { code: `import * as _ from 'lodash'`, + output: `import * as _ from 'directive:add-import:dependencies:lodash'`, filename: joinPath(FIXTURE, 'packages/bar/src/index.ts'), errors: [ ERR_UNDECLARED('lodash', 'dependencies', joinPath('packages', 'bar')), @@ -151,6 +161,7 @@ ruleTester.run(RULE, rule, { }, { code: `import _ from 'lodash'`, + output: `import _ from 'directive:add-import:dependencies:lodash'`, filename: joinPath(FIXTURE, 'packages/bar/src/index.ts'), errors: [ ERR_UNDECLARED('lodash', 'dependencies', joinPath('packages', 'bar')), @@ -158,6 +169,7 @@ ruleTester.run(RULE, rule, { }, { code: `import('lodash')`, + output: `import('directive:add-import:dependencies:lodash')`, filename: joinPath(FIXTURE, 'packages/bar/src/index.ts'), errors: [ ERR_UNDECLARED('lodash', 'dependencies', joinPath('packages', 'bar')), @@ -165,6 +177,7 @@ ruleTester.run(RULE, rule, { }, { code: `require('lodash')`, + output: `require('directive:add-import:dependencies:lodash')`, filename: joinPath(FIXTURE, 'packages/bar/src/index.ts'), errors: [ ERR_UNDECLARED('lodash', 'dependencies', joinPath('packages', 'bar')), @@ -172,13 +185,7 @@ ruleTester.run(RULE, rule, { }, { code: `import 'lodash'`, - filename: joinPath(FIXTURE, 'packages/bar/src/index.ts'), - errors: [ - ERR_UNDECLARED('lodash', 'dependencies', joinPath('packages', 'bar')), - ], - }, - { - code: `import 'lodash'`, + output: `import 'directive:add-import:devDependencies:lodash'`, filename: joinPath(FIXTURE, 'packages/bar/src/index.test.ts'), errors: [ ERR_UNDECLARED( @@ -191,6 +198,7 @@ ruleTester.run(RULE, rule, { }, { code: `import 'react'`, + output: `import 'directive:add-import:peerDependencies:react'`, filename: joinPath(FIXTURE, 'packages/bar/src/index.ts'), errors: [ ERR_UNDECLARED( @@ -203,6 +211,7 @@ ruleTester.run(RULE, rule, { }, { code: `import 'react'`, + output: `import 'directive:add-import:peerDependencies:react'`, filename: joinPath(FIXTURE, 'packages/bar/src/index.test.ts'), errors: [ ERR_UNDECLARED( @@ -215,6 +224,7 @@ ruleTester.run(RULE, rule, { }, { code: `import 'react-dom'`, + output: `import 'directive:add-import:dependencies:react-dom'`, filename: joinPath(FIXTURE, 'packages/foo/src/index.ts'), errors: [ ERR_UNDECLARED( @@ -226,6 +236,7 @@ ruleTester.run(RULE, rule, { }, { code: `import 'react-dom'`, + output: `import 'directive:add-import:devDependencies:react-dom'`, filename: joinPath(FIXTURE, 'packages/foo/src/index.test.ts'), errors: [ ERR_UNDECLARED( @@ -238,6 +249,7 @@ ruleTester.run(RULE, rule, { }, { code: `import '@internal/foo'`, + output: `import 'directive:add-import:dependencies:@internal/foo'`, filename: joinPath(FIXTURE, 'packages/bar/src/index.ts'), errors: [ ERR_UNDECLARED( @@ -247,5 +259,43 @@ ruleTester.run(RULE, rule, { ), ], }, + + // Switching back to original import declarations + { + code: `import 'directive:add-import:dependencies:lodash'`, + output: `import 'lodash'`, + filename: joinPath(FIXTURE, 'packages/bar/src/index.ts'), + errors: [ERR_SWITCH_BACK()], + }, + { + code: `import { debounce } from 'directive:add-import:dependencies:lodash'`, + output: `import { debounce } from 'lodash'`, + filename: joinPath(FIXTURE, 'packages/bar/src/index.ts'), + errors: [ERR_SWITCH_BACK()], + }, + { + code: `import * as _ from 'directive:add-import:dependencies:lodash'`, + output: `import * as _ from 'lodash'`, + filename: joinPath(FIXTURE, 'packages/bar/src/index.ts'), + errors: [ERR_SWITCH_BACK()], + }, + { + code: `import _ from 'directive:add-import:dependencies:lodash'`, + output: `import _ from 'lodash'`, + filename: joinPath(FIXTURE, 'packages/bar/src/index.ts'), + errors: [ERR_SWITCH_BACK()], + }, + { + code: `import('directive:add-import:dependencies:lodash')`, + output: `import('lodash')`, + filename: joinPath(FIXTURE, 'packages/bar/src/index.ts'), + errors: [ERR_SWITCH_BACK()], + }, + { + code: `require('directive:add-import:dependencies:lodash')`, + output: `require('lodash')`, + filename: joinPath(FIXTURE, 'packages/bar/src/index.ts'), + errors: [ERR_SWITCH_BACK()], + }, ], }); From 19a0d5b4295e8012851dd86800cd521746400dc7 Mon Sep 17 00:00:00 2001 From: Aramis Sennyey Date: Mon, 6 Mar 2023 17:03:42 -0500 Subject: [PATCH 002/177] Add additional auth backend props and limit visibility. Signed-off-by: Aramis Sennyey --- plugins/auth-backend/config.d.ts | 97 +++++++++++++++++++++++++++++--- 1 file changed, 88 insertions(+), 9 deletions(-) diff --git a/plugins/auth-backend/config.d.ts b/plugins/auth-backend/config.d.ts index 5aff9df90a..cdd3fe1bf0 100644 --- a/plugins/auth-backend/config.d.ts +++ b/plugins/auth-backend/config.d.ts @@ -62,30 +62,72 @@ export interface Config { */ providers?: { google?: { - [authEnv: string]: { [key: string]: string }; + [authEnv: string]: { + clientId: string; + /** + * @visibility secret + */ + clientSecret: string; + callbackUrl: string; + }; }; github?: { - [authEnv: string]: { [key: string]: string }; + [authEnv: string]: { + clientId: string; + /** + * @visibility secret + */ + clientSecret: string; + callbackUrl?: string; + enterpriseInstanceUrl?: string; + }; }; gitlab?: { - [authEnv: string]: { [key: string]: string }; + [authEnv: string]: { + clientId: string; + /** + * @visibility secret + */ + clientSecret: string; + audience?: string; + callbackUrl?: string; + }; }; saml?: { entryPoint: string; logoutUrl?: string; issuer: string; + /** + * @visibility secret + */ cert: string; audience?: string; + /** + * @visibility secret + */ privateKey?: string; authnContext?: string[]; identifierFormat?: string; + /** + * @visibility secret + */ decryptionPvk?: string; signatureAlgorithm?: 'sha256' | 'sha512'; digestAlgorithm?: string; acceptedClockSkewMs?: number; }; okta?: { - [authEnv: string]: { [key: string]: string }; + [authEnv: string]: { + clientId: string; + /** + * @visibility secret + */ + clientSecret: string; + audience: string; + authServerId?: string; + idp?: string; + callbackUrl?: string; + }; }; oauth2?: { [authEnv: string]: { @@ -101,19 +143,56 @@ export interface Config { }; }; oidc?: { - [authEnv: string]: { [key: string]: string }; + [authEnv: string]: { + clientId: string; + /** + * @visibility secret + */ + clientSecret: string; + callbackUrl?: string; + metadataUrl: string; + scope?: string; + prompt?: string; + }; }; auth0?: { - [authEnv: string]: { [key: string]: string }; + [authEnv: string]: { + clientId: string; + /** + * @visibility secret + */ + clientSecret: string; + domain: string; + callbackUrl?: string; + audience?: string; + connection?: string; + connectionScope?: string; + }; }; microsoft?: { - [authEnv: string]: { [key: string]: string }; + [authEnv: string]: { + clientId: string; + /** + * @visibility secret + */ + clientSecret: string; + tenantId: string; + callbackUrl?: string; + }; }; onelogin?: { - [authEnv: string]: { [key: string]: string }; + [authEnv: string]: { + clientId: string; + /** + * @visibility secret + */ + clientSecret: string; + issuer: string; + callbackUrl?: string; + }; }; awsalb?: { - issuer?: string; + iss?: string; region: string; }; cfaccess?: { From 354295465f7e35b714ed13677be63851be4ad753 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 7 Mar 2023 09:53:11 +0000 Subject: [PATCH 003/177] fix(deps): update dependency kafkajs to v2.2.4 Signed-off-by: Renovate Bot --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 14d1ddbc05..07cfb527df 100644 --- a/yarn.lock +++ b/yarn.lock @@ -28053,9 +28053,9 @@ __metadata: linkType: hard "kafkajs@npm:^2.0.0": - version: 2.2.3 - resolution: "kafkajs@npm:2.2.3" - checksum: 30f17de75da852942334b6069c5c515e2531a7b610997f0e4c6088281f16588df45ac920218411d9ae995c09af1f69186ed4d73cbe0e5f1247ec756dd9c7678e + version: 2.2.4 + resolution: "kafkajs@npm:2.2.4" + checksum: 83e9e8bc50a09b142f4ff79f6a2bd88ecc21b83bcefe6621ab1716118d624886befb7371731274f67812ce35dd50b53140ff3b49a06e5d9169fe6b164d72fea5 languageName: node linkType: hard From f04f99a897cddc71c3137c1b4d7b693eaaa4fa93 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 7 Mar 2023 13:04:23 +0000 Subject: [PATCH 004/177] chore(deps): update graphqlcodegenerator monorepo to v3.2.2 Signed-off-by: Renovate Bot --- yarn.lock | 100 +++++++++++++++++++++++++++++------------------------- 1 file changed, 54 insertions(+), 46 deletions(-) diff --git a/yarn.lock b/yarn.lock index 2bf9c900df..337903e13e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -10604,8 +10604,8 @@ __metadata: linkType: hard "@graphql-codegen/cli@npm:^3.0.0": - version: 3.2.1 - resolution: "@graphql-codegen/cli@npm:3.2.1" + version: 3.2.2 + resolution: "@graphql-codegen/cli@npm:3.2.2" dependencies: "@babel/generator": ^7.18.13 "@babel/template": ^7.18.10 @@ -10626,12 +10626,12 @@ __metadata: "@whatwg-node/fetch": ^0.8.0 chalk: ^4.1.0 cosmiconfig: ^7.0.0 - cosmiconfig-typescript-loader: ^4.3.0 debounce: ^1.2.0 detect-indent: ^6.0.0 - graphql-config: ^4.4.0 + graphql-config: ^4.5.0 inquirer: ^8.0.0 is-glob: ^4.0.1 + jiti: ^1.17.1 json-to-pretty-yaml: ^1.2.2 listr2: ^4.0.5 log-symbols: ^4.0.0 @@ -10639,7 +10639,6 @@ __metadata: shell-quote: ^1.7.3 string-env-interpolation: ^1.0.1 ts-log: ^2.2.3 - ts-node: ^10.9.1 tslib: ^2.4.0 yaml: ^1.10.0 yargs: ^17.0.0 @@ -10650,7 +10649,7 @@ __metadata: graphql-code-generator: cjs/bin.js graphql-codegen: cjs/bin.js graphql-codegen-esm: esm/bin.js - checksum: b62e2a3cee866cb006163946272f25ba9cc59bb2d45b7b3df5d1b220096e79183929456a440e5c4980d6a5664d6b14d7870d7f1760eb250b9211f4743d2afad3 + checksum: b94284ac538a3504f96c7d507c140b7cfee30042209c4230ffc3068f05b6b27c75e1922b31c696363ab43e34e472ed194cc72996bbb10f59991cd2a4a35ff36e languageName: node linkType: hard @@ -10669,18 +10668,18 @@ __metadata: linkType: hard "@graphql-codegen/graphql-modules-preset@npm:^3.0.0": - version: 3.1.0 - resolution: "@graphql-codegen/graphql-modules-preset@npm:3.1.0" + version: 3.1.1 + resolution: "@graphql-codegen/graphql-modules-preset@npm:3.1.1" dependencies: "@graphql-codegen/plugin-helpers": ^4.1.0 - "@graphql-codegen/visitor-plugin-common": 3.0.1 + "@graphql-codegen/visitor-plugin-common": 3.0.2 "@graphql-tools/utils": ^9.0.0 change-case-all: 1.0.15 parse-filepath: ^1.0.2 tslib: ~2.5.0 peerDependencies: graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 - checksum: cee2e7f8afbc0b0d81592abfc8894422b791f0eca6e878a789de980bf1710a3c726786ade296e653cc83f920b2618aa9f5c9dbb6934ee9da0122b2d10ef5bdb5 + checksum: f437590afa33ac308c075d214b501404ae2f99888cac8071d05cc2b8c7ceaea5aef8f86bb60e7a9a45902126dc99bd20d77e951c0beef665aaa31ac3c2217e26 languageName: node linkType: hard @@ -10714,39 +10713,39 @@ __metadata: linkType: hard "@graphql-codegen/typescript-resolvers@npm:^3.0.0": - version: 3.1.0 - resolution: "@graphql-codegen/typescript-resolvers@npm:3.1.0" + version: 3.1.1 + resolution: "@graphql-codegen/typescript-resolvers@npm:3.1.1" dependencies: "@graphql-codegen/plugin-helpers": ^4.1.0 - "@graphql-codegen/typescript": ^3.0.1 - "@graphql-codegen/visitor-plugin-common": 3.0.1 + "@graphql-codegen/typescript": ^3.0.2 + "@graphql-codegen/visitor-plugin-common": 3.0.2 "@graphql-tools/utils": ^9.0.0 auto-bind: ~4.0.0 tslib: ~2.5.0 peerDependencies: graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 - checksum: 05888a9dfd1556fe15465a524750c36881334c231297e2e89bccb536450bed61fde2ba182ba4e79e34be846ce2e2439f3f6b31a67e7437f03a4e4ace62e84dcd + checksum: 88faa1ca2335096aa9939101f3591007d9fa477836d969a3c622dbf67704505600387a2e9fbb416d61b5ef42dbd79a0d351003037c0756d8d0c7f32c7961e783 languageName: node linkType: hard -"@graphql-codegen/typescript@npm:^3.0.0, @graphql-codegen/typescript@npm:^3.0.1": - version: 3.0.1 - resolution: "@graphql-codegen/typescript@npm:3.0.1" +"@graphql-codegen/typescript@npm:^3.0.0, @graphql-codegen/typescript@npm:^3.0.2": + version: 3.0.2 + resolution: "@graphql-codegen/typescript@npm:3.0.2" dependencies: "@graphql-codegen/plugin-helpers": ^4.1.0 "@graphql-codegen/schema-ast": ^3.0.1 - "@graphql-codegen/visitor-plugin-common": 3.0.1 + "@graphql-codegen/visitor-plugin-common": 3.0.2 auto-bind: ~4.0.0 tslib: ~2.5.0 peerDependencies: graphql: ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 - checksum: 56a369237971cc4a5a4987628ec0fcceed66ec03a292b3d17b6ffb64279185cd085be351268c55be6b152634c430e885b9c584d816aaa25f067d91c6996c329a + checksum: e92dc54804b6ad45fb2499b91cb89743e455a984684e2b1df1b1a8f479a0bbffa5c625be97ccb55874ac8b7316a820b546e9e312b22eda78012acd5c27594a28 languageName: node linkType: hard -"@graphql-codegen/visitor-plugin-common@npm:3.0.1": - version: 3.0.1 - resolution: "@graphql-codegen/visitor-plugin-common@npm:3.0.1" +"@graphql-codegen/visitor-plugin-common@npm:3.0.2": + version: 3.0.2 + resolution: "@graphql-codegen/visitor-plugin-common@npm:3.0.2" dependencies: "@graphql-codegen/plugin-helpers": ^4.1.0 "@graphql-tools/optimize": ^1.3.0 @@ -10760,7 +10759,7 @@ __metadata: tslib: ~2.5.0 peerDependencies: graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 - checksum: 32bf553f73938581f634b1bbdf8616b1cb30cc85c73d7a8f6088d2a81a957e198c7c278edf6582c1eee7328a4463cea4725316b1743b87b26dc3e9fdd8318648 + checksum: c8f941df7f8304b722b492ceaf15dddcf33e3a69bc29b54970908ffa12b14d92276958005bd307648e0cdc55f9e243d0fb390862f73a17a26bd50f6484ac42d6 languageName: node linkType: hard @@ -20284,18 +20283,6 @@ __metadata: languageName: node linkType: hard -"cosmiconfig-typescript-loader@npm:^4.3.0": - version: 4.3.0 - resolution: "cosmiconfig-typescript-loader@npm:4.3.0" - peerDependencies: - "@types/node": "*" - cosmiconfig: ">=7" - ts-node: ">=10" - typescript: ">=3" - checksum: ea61dfd8e112cf2bb18df0ef89280bd3ae3dd5b997b4a9fc22bbabdc02513aadfbc6d4e15e922b6a9a5d987e9dad42286fa38caf77a9b8dcdbe7d4ce1c9db4fb - languageName: node - linkType: hard - "cosmiconfig@npm:8.0.0": version: 8.0.0 resolution: "cosmiconfig@npm:8.0.0" @@ -24970,9 +24957,9 @@ __metadata: languageName: node linkType: hard -"graphql-config@npm:^4.4.0": - version: 4.4.0 - resolution: "graphql-config@npm:4.4.0" +"graphql-config@npm:^4.5.0": + version: 4.5.0 + resolution: "graphql-config@npm:4.5.0" dependencies: "@graphql-tools/graphql-file-loader": ^7.3.7 "@graphql-tools/json-file-loader": ^7.3.7 @@ -24981,14 +24968,17 @@ __metadata: "@graphql-tools/url-loader": ^7.9.7 "@graphql-tools/utils": ^9.0.0 cosmiconfig: 8.0.0 - minimatch: 4.2.1 + jiti: 1.17.1 + minimatch: 4.2.3 string-env-interpolation: 1.0.1 tslib: ^2.4.0 peerDependencies: cosmiconfig-toml-loader: ^1.0.0 - cosmiconfig-typescript-loader: ^4.0.0 graphql: ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 - checksum: 2f8cbb4710a7c0a411074eb843317bc66e5602fdab7eefa9765812d986d4b04fc2d285d3c0811ed0efaef12ea58351676561d704e79880f5848ed970badab500 + peerDependenciesMeta: + cosmiconfig-toml-loader: + optional: true + checksum: 8ab1a3ce3534598ddac2df213b6af2eecd9ebcca2268d39cc3e87a6e55749483389a6df222e9e0acd638dd2479378a5c8e8d90f980e6a54e700c4c4ae3522123 languageName: node linkType: hard @@ -27615,6 +27605,24 @@ __metadata: languageName: node linkType: hard +"jiti@npm:1.17.1": + version: 1.17.1 + resolution: "jiti@npm:1.17.1" + bin: + jiti: bin/jiti.js + checksum: 56c6d8488e7e9cc6ee66a0f0d5e18db6669cb12b2e93364f393442289a9bc75a8e8c796249f59015e01c3ebdf9478e2ca8b76c30e29072c678ee00d39de757c7 + languageName: node + linkType: hard + +"jiti@npm:^1.17.1": + version: 1.17.2 + resolution: "jiti@npm:1.17.2" + bin: + jiti: bin/jiti.js + checksum: 51941fea3622d1ff80d914ec6ec95ae463ede598a4a2317f1e8ff018823212eba6b9ea1c638c97c18f681870b1c2b9f49fbb13021b7c2415c46c8a3b1910f1e3 + languageName: node + linkType: hard + "jju@npm:~1.4.0": version: 1.4.0 resolution: "jju@npm:1.4.0" @@ -30323,12 +30331,12 @@ __metadata: languageName: node linkType: hard -"minimatch@npm:4.2.1": - version: 4.2.1 - resolution: "minimatch@npm:4.2.1" +"minimatch@npm:4.2.3": + version: 4.2.3 + resolution: "minimatch@npm:4.2.3" dependencies: brace-expansion: ^1.1.7 - checksum: 2b1514e3d0f29a549912f0db7ae7b82c5cab4a8f2dd0369f1c6451a325b3f12b2cf473c95873b6157bb8df183d6cf6db82ff03614b6adaaf1d7e055beccdfd01 + checksum: 3392388e3ef7de7ae9a3a48d48a27a323934452f4af81b925dfbe85ce2dc07da855e3dbcc69229888be4e5118f6c0b79847d30f3e7c0e0017b25e423c11c0409 languageName: node linkType: hard From e339789173e64f4eacca76492175edbd674e6334 Mon Sep 17 00:00:00 2001 From: zjpersc Date: Sat, 25 Feb 2023 00:10:13 -0600 Subject: [PATCH 005/177] Add global-agent to dependencies; Update Readme w/ instructions Signed-off-by: zjpersc --- packages/techdocs-cli/README.md | 7 +++++++ packages/techdocs-cli/package.json | 1 + 2 files changed, 8 insertions(+) diff --git a/packages/techdocs-cli/README.md b/packages/techdocs-cli/README.md index ae296d2c26..e6ba03e1d0 100644 --- a/packages/techdocs-cli/README.md +++ b/packages/techdocs-cli/README.md @@ -40,6 +40,13 @@ yarn start yarn techdocs-cli:dev [...options] ``` +### Connecting behind a proxy +```sh +# Prior to executing the techdocs-cli command +export GLOBAL_AGENT_HTTPS_PROXY=${HTTP_PROXY} +export GLOBAL_AGENT_NO_PROXY=${NO_PROXY} +``` + ### Using an example docs project For the purpose of local development, we have created an example documentation project. You are of course also free to create your own local test site - all it takes is a `docs/index.md` and an `mkdocs.yml` in a directory. diff --git a/packages/techdocs-cli/package.json b/packages/techdocs-cli/package.json index 0a3bbed06f..371ddf440f 100644 --- a/packages/techdocs-cli/package.json +++ b/packages/techdocs-cli/package.json @@ -69,6 +69,7 @@ "commander": "^9.1.0", "dockerode": "^3.3.1", "fs-extra": "^10.0.1", + "global-agent": "^3.0.0", "http-proxy": "^1.18.1", "react-dev-utils": "^12.0.0-next.60", "serve-handler": "^6.1.3", From 7b4991adb9f1b2bc86b4a3e490de22472c2d5398 Mon Sep 17 00:00:00 2001 From: zjpersc Date: Sat, 25 Feb 2023 00:37:06 -0600 Subject: [PATCH 006/177] Adding changeset Signed-off-by: zjpersc --- .changeset/short-panthers-float.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/short-panthers-float.md diff --git a/.changeset/short-panthers-float.md b/.changeset/short-panthers-float.md new file mode 100644 index 0000000000..91eafe28aa --- /dev/null +++ b/.changeset/short-panthers-float.md @@ -0,0 +1,5 @@ +--- +'@techdocs/cli': patch +--- + +Adding global-agent to enable the ability to publish through a proxy From 8af3a93d07c213b1f2b432504491ea20d1455233 Mon Sep 17 00:00:00 2001 From: zjpersc Date: Sun, 26 Feb 2023 20:40:13 -0600 Subject: [PATCH 007/177] Revert "Adding changeset" This reverts commit b83d77e1bc7b608b0478d3de91c2080a9d153872. Signed-off-by: zjpersc --- .changeset/short-panthers-float.md | 5 ----- 1 file changed, 5 deletions(-) delete mode 100644 .changeset/short-panthers-float.md diff --git a/.changeset/short-panthers-float.md b/.changeset/short-panthers-float.md deleted file mode 100644 index 91eafe28aa..0000000000 --- a/.changeset/short-panthers-float.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@techdocs/cli': patch ---- - -Adding global-agent to enable the ability to publish through a proxy From 1093f1b1cd62741029400aba24ec51b7d7121e55 Mon Sep 17 00:00:00 2001 From: zjpersc Date: Sun, 26 Feb 2023 20:40:21 -0600 Subject: [PATCH 008/177] Revert "Add global-agent to dependencies; Update Readme w/ instructions" This reverts commit 39f5a8389b8ff4afcb18fb19a0ca20d2552abc83. Signed-off-by: zjpersc --- packages/techdocs-cli/README.md | 7 ------- packages/techdocs-cli/package.json | 1 - 2 files changed, 8 deletions(-) diff --git a/packages/techdocs-cli/README.md b/packages/techdocs-cli/README.md index e6ba03e1d0..ae296d2c26 100644 --- a/packages/techdocs-cli/README.md +++ b/packages/techdocs-cli/README.md @@ -40,13 +40,6 @@ yarn start yarn techdocs-cli:dev [...options] ``` -### Connecting behind a proxy -```sh -# Prior to executing the techdocs-cli command -export GLOBAL_AGENT_HTTPS_PROXY=${HTTP_PROXY} -export GLOBAL_AGENT_NO_PROXY=${NO_PROXY} -``` - ### Using an example docs project For the purpose of local development, we have created an example documentation project. You are of course also free to create your own local test site - all it takes is a `docs/index.md` and an `mkdocs.yml` in a directory. diff --git a/packages/techdocs-cli/package.json b/packages/techdocs-cli/package.json index 371ddf440f..0a3bbed06f 100644 --- a/packages/techdocs-cli/package.json +++ b/packages/techdocs-cli/package.json @@ -69,7 +69,6 @@ "commander": "^9.1.0", "dockerode": "^3.3.1", "fs-extra": "^10.0.1", - "global-agent": "^3.0.0", "http-proxy": "^1.18.1", "react-dev-utils": "^12.0.0-next.60", "serve-handler": "^6.1.3", From b348420a804d69047c98aea9743292c9156e4e3e Mon Sep 17 00:00:00 2001 From: zjpersc Date: Sun, 26 Feb 2023 20:44:08 -0600 Subject: [PATCH 009/177] Adding global-agent to dependencies; updated README w/ instructions Signed-off-by: zjpersc --- .changeset/short-panthers-float.md | 5 +++++ packages/techdocs-cli/README.md | 7 +++++++ packages/techdocs-cli/package.json | 1 + 3 files changed, 13 insertions(+) create mode 100644 .changeset/short-panthers-float.md diff --git a/.changeset/short-panthers-float.md b/.changeset/short-panthers-float.md new file mode 100644 index 0000000000..41ec71a7aa --- /dev/null +++ b/.changeset/short-panthers-float.md @@ -0,0 +1,5 @@ +--- +'@techdocs/cli': patch +--- + +Adding global-agent to enable the ability to publish through a proxy \ No newline at end of file diff --git a/packages/techdocs-cli/README.md b/packages/techdocs-cli/README.md index ae296d2c26..e6ba03e1d0 100644 --- a/packages/techdocs-cli/README.md +++ b/packages/techdocs-cli/README.md @@ -40,6 +40,13 @@ yarn start yarn techdocs-cli:dev [...options] ``` +### Connecting behind a proxy +```sh +# Prior to executing the techdocs-cli command +export GLOBAL_AGENT_HTTPS_PROXY=${HTTP_PROXY} +export GLOBAL_AGENT_NO_PROXY=${NO_PROXY} +``` + ### Using an example docs project For the purpose of local development, we have created an example documentation project. You are of course also free to create your own local test site - all it takes is a `docs/index.md` and an `mkdocs.yml` in a directory. diff --git a/packages/techdocs-cli/package.json b/packages/techdocs-cli/package.json index 0a3bbed06f..371ddf440f 100644 --- a/packages/techdocs-cli/package.json +++ b/packages/techdocs-cli/package.json @@ -69,6 +69,7 @@ "commander": "^9.1.0", "dockerode": "^3.3.1", "fs-extra": "^10.0.1", + "global-agent": "^3.0.0", "http-proxy": "^1.18.1", "react-dev-utils": "^12.0.0-next.60", "serve-handler": "^6.1.3", From 9796fe16d731856b4e4d59bf66f7cafcafccdef1 Mon Sep 17 00:00:00 2001 From: zjpersc Date: Tue, 7 Mar 2023 14:31:34 -0600 Subject: [PATCH 010/177] Updating techdocs-cli dependency on global-agent@3.0.0 in yarn.lock Signed-off-by: zjpersc --- yarn.lock | 1 + 1 file changed, 1 insertion(+) diff --git a/yarn.lock b/yarn.lock index 6973779ac5..b335996073 100644 --- a/yarn.lock +++ b/yarn.lock @@ -13923,6 +13923,7 @@ __metadata: dockerode: ^3.3.1 find-process: ^1.4.5 fs-extra: ^10.0.1 + global-agent: ^3.0.0 http-proxy: ^1.18.1 nodemon: ^2.0.2 react-dev-utils: ^12.0.0-next.60 From 6620edc944c17302739b8717f8265d099075984b Mon Sep 17 00:00:00 2001 From: zjpersc Date: Tue, 7 Mar 2023 17:07:57 -0600 Subject: [PATCH 011/177] Fixing prettier errors Signed-off-by: zjpersc --- .changeset/short-panthers-float.md | 2 +- packages/techdocs-cli/README.md | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/.changeset/short-panthers-float.md b/.changeset/short-panthers-float.md index 41ec71a7aa..91eafe28aa 100644 --- a/.changeset/short-panthers-float.md +++ b/.changeset/short-panthers-float.md @@ -2,4 +2,4 @@ '@techdocs/cli': patch --- -Adding global-agent to enable the ability to publish through a proxy \ No newline at end of file +Adding global-agent to enable the ability to publish through a proxy diff --git a/packages/techdocs-cli/README.md b/packages/techdocs-cli/README.md index e6ba03e1d0..85c0075946 100644 --- a/packages/techdocs-cli/README.md +++ b/packages/techdocs-cli/README.md @@ -41,7 +41,8 @@ yarn techdocs-cli:dev [...options] ``` ### Connecting behind a proxy -```sh + +```sh # Prior to executing the techdocs-cli command export GLOBAL_AGENT_HTTPS_PROXY=${HTTP_PROXY} export GLOBAL_AGENT_NO_PROXY=${NO_PROXY} From 3efdf55f238fb806f112dadbb6f25ed1faeb020c Mon Sep 17 00:00:00 2001 From: Brian Fletcher Date: Wed, 8 Mar 2023 16:33:45 +0000 Subject: [PATCH 012/177] remove unhandled promise on bad creds The unhandled promise had been bringing down the whole application when the creds were bad. Signed-off-by: Brian Fletcher --- .../AwsIamKubernetesAuthTranslator.ts | 66 +++++++++---------- 1 file changed, 32 insertions(+), 34 deletions(-) diff --git a/plugins/kubernetes-backend/src/kubernetes-auth-translator/AwsIamKubernetesAuthTranslator.ts b/plugins/kubernetes-backend/src/kubernetes-auth-translator/AwsIamKubernetesAuthTranslator.ts index b89945902d..84e60c9c69 100644 --- a/plugins/kubernetes-backend/src/kubernetes-auth-translator/AwsIamKubernetesAuthTranslator.ts +++ b/plugins/kubernetes-backend/src/kubernetes-auth-translator/AwsIamKubernetesAuthTranslator.ts @@ -55,46 +55,44 @@ export class AwsIamKubernetesAuthTranslator assumeRole?: string, externalId?: string, ): Promise { - return new Promise(async (resolve, reject) => { - const awsCreds = await this.awsGetCredentials(); + const awsCreds = await this.awsGetCredentials(); - if (!(awsCreds instanceof Credentials)) - return reject(Error('No AWS credentials found.')); + if (!(awsCreds instanceof Credentials)) + throw new Error('No AWS credentials found.'); - let creds: SigningCreds = { - accessKeyId: awsCreds.accessKeyId, - secretAccessKey: awsCreds.secretAccessKey, - sessionToken: awsCreds.sessionToken, + let creds: SigningCreds = { + accessKeyId: awsCreds.accessKeyId, + secretAccessKey: awsCreds.secretAccessKey, + sessionToken: awsCreds.sessionToken, + }; + + if (!this.validCredentials(creds)) + throw new Error('Invalid AWS credentials found.'); + if (!assumeRole) return creds; + + try { + const params: AWS.STS.Types.AssumeRoleRequest = { + RoleArn: assumeRole, + RoleSessionName: 'backstage-login', }; + if (externalId) params.ExternalId = externalId; - if (!this.validCredentials(creds)) - return reject(Error('Invalid AWS credentials found.')); - if (!assumeRole) return resolve(creds); + const assumedRole = await new AWS.STS().assumeRole(params).promise(); - try { - const params: AWS.STS.Types.AssumeRoleRequest = { - RoleArn: assumeRole, - RoleSessionName: 'backstage-login', - }; - if (externalId) params.ExternalId = externalId; - - const assumedRole = await new AWS.STS().assumeRole(params).promise(); - - if (!assumedRole.Credentials) { - throw new Error(`No credentials returned for role ${assumeRole}`); - } - - creds = { - accessKeyId: assumedRole.Credentials.AccessKeyId, - secretAccessKey: assumedRole.Credentials.SecretAccessKey, - sessionToken: assumedRole.Credentials.SessionToken, - }; - } catch (e) { - console.warn(`There was an error assuming the role: ${e}`); - return reject(Error(`Unable to assume role: ${e}`)); + if (!assumedRole.Credentials) { + throw new Error(`No credentials returned for role ${assumeRole}`); } - return resolve(creds); - }); + + creds = { + accessKeyId: assumedRole.Credentials.AccessKeyId, + secretAccessKey: assumedRole.Credentials.SecretAccessKey, + sessionToken: assumedRole.Credentials.SessionToken, + }; + } catch (e) { + console.warn(`There was an error assuming the role: ${e}`); + throw new Error(`Unable to assume role: ${e}`); + } + return creds; } async getBearerToken( clusterName: string, From 75d4985f5e80c8a86bbe2dbf216da330a651994c Mon Sep 17 00:00:00 2001 From: Brian Fletcher Date: Wed, 8 Mar 2023 16:38:42 +0000 Subject: [PATCH 013/177] add changeset for k8s plugin Signed-off-by: Brian Fletcher --- .changeset/fuzzy-actors-turn.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/fuzzy-actors-turn.md diff --git a/.changeset/fuzzy-actors-turn.md b/.changeset/fuzzy-actors-turn.md new file mode 100644 index 0000000000..3cb8f84cae --- /dev/null +++ b/.changeset/fuzzy-actors-turn.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-kubernetes-backend': patch +--- + +Fixes bug whereby backstage crashes when bad aws credentials are provided to the kubernetes plugin. From bd1ee2b7403b5049e67c72458526e521328770eb Mon Sep 17 00:00:00 2001 From: Brian Fletcher Date: Wed, 8 Mar 2023 16:42:59 +0000 Subject: [PATCH 014/177] remove typo Signed-off-by: Brian Fletcher --- .changeset/fuzzy-actors-turn.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.changeset/fuzzy-actors-turn.md b/.changeset/fuzzy-actors-turn.md index 3cb8f84cae..bd92ad34ef 100644 --- a/.changeset/fuzzy-actors-turn.md +++ b/.changeset/fuzzy-actors-turn.md @@ -2,4 +2,4 @@ '@backstage/plugin-kubernetes-backend': patch --- -Fixes bug whereby backstage crashes when bad aws credentials are provided to the kubernetes plugin. +Fixes bug whereby backstage crashes when bad credentials are provided to the kubernetes plugin. From b2e182cdfa4f352d6d6907bff359854db7f8a95d Mon Sep 17 00:00:00 2001 From: Sudeep Sinha Date: Wed, 8 Mar 2023 13:54:24 -0500 Subject: [PATCH 015/177] Fix font size and color in search result item Signed-off-by: Sudeep Sinha --- .changeset/many-eggs-press.md | 6 ++++++ .../DefaultResultListItem/DefaultResultListItem.tsx | 2 ++ .../src/search/components/TechDocsSearchResultListItem.tsx | 2 ++ 3 files changed, 10 insertions(+) create mode 100644 .changeset/many-eggs-press.md diff --git a/.changeset/many-eggs-press.md b/.changeset/many-eggs-press.md new file mode 100644 index 0000000000..551cf9e759 --- /dev/null +++ b/.changeset/many-eggs-press.md @@ -0,0 +1,6 @@ +--- +'@backstage/plugin-search-react': patch +'@backstage/plugin-techdocs': patch +--- + +Fixes a UI bug in search result item which rendered the item text with incorrect font size and color diff --git a/plugins/search-react/src/components/DefaultResultListItem/DefaultResultListItem.tsx b/plugins/search-react/src/components/DefaultResultListItem/DefaultResultListItem.tsx index cf89b6a9cd..0d2c59e173 100644 --- a/plugins/search-react/src/components/DefaultResultListItem/DefaultResultListItem.tsx +++ b/plugins/search-react/src/components/DefaultResultListItem/DefaultResultListItem.tsx @@ -81,6 +81,8 @@ export const DefaultResultListItemComponent = ({ WebkitLineClamp: lineClamp, overflow: 'hidden', }} + color="textSecondary" + variant="body2" > {highlight?.fields.text ? ( {highlight?.fields.text ? ( Date: Thu, 9 Mar 2023 15:40:47 +0100 Subject: [PATCH 016/177] Cancelling the running task (executing of a scaffolder template) Signed-off-by: Bogdan Nechyporenko --- .changeset/backend-token-authentication.md | 5 + .changeset/beige-hats-cheer.md | 27 + .changeset/big-gorillas-fail1.md | 5 + .changeset/big-gorillas-fail2.md | 5 + .changeset/big-gorillas-fail3.md | 5 + .changeset/big-gorillas-fail4.md | 5 + .changeset/big-gorillas-fail5.md | 5 + .changeset/big-gorillas-fail6.md | 5 + .changeset/cold-dogs-watch.md | 5 + .changeset/create-app-1678209629.md | 5 + .changeset/curly-jobs-kneel.md | 8 + .../dull-adults-drum.md | 0 .changeset/gorgeous-pumas-speak.md | 5 + .changeset/healthy-buses-live-1.md | 5 + .changeset/healthy-buses-live-2.md | 5 + .changeset/healthy-buses-live-3.md | 5 + .changeset/healthy-buses-live-4.md | 5 + .changeset/healthy-buses-live-5.md | 5 + .changeset/healthy-buses-live-6.md | 5 + .changeset/healthy-buses-live-7.md | 5 + .changeset/healthy-buses-live-8.md | 5 + .changeset/healthy-buses-live-9.md | 5 + .changeset/honest-clouds-shout.md | 5 + .changeset/light-bees-end.md | 5 + .changeset/moody-apes-know.md | 16 + .changeset/nine-bikes-applaud.md | 5 + .changeset/pre.json | 33 +- .changeset/proud-jokes-pull.md | 5 + .changeset/rotten-cats-matter.md | 19 + .changeset/silver-bikes-breathe.md | 21 +- .changeset/stupid-games-brake.md | 5 + .changeset/twenty-insects-live.md | 5 + .changeset/witty-squids-fetch.md | 5 + .changeset/young-walls-prove.md | 5 + ADOPTERS.md | 1 + docs/auth/gitlab/provider.md | 6 +- docs/features/kubernetes/configuration.md | 5 +- docs/features/software-templates/index.md | 4 + .../writing-custom-actions.md | 7 +- docs/overview/adopting.md | 2 +- docs/releases/v1.12.0-next.2-changelog.md | 1833 +++++++++++++++++ .../src/components/simpleCard/simpleCard.tsx | 17 + .../src/pages/on-demand/_onDemandCard.tsx | 66 + microsite-next/src/pages/on-demand/index.tsx | 78 + .../src/pages/on-demand/onDemand.module.scss | 44 + .../src/pages/plugins/_pluginCard.tsx | 37 +- microsite-next/src/pages/plugins/index.tsx | 13 +- .../src/util/truncateDescription.tsx | 11 + microsite/pages/en/plugins.js | 2 +- package.json | 2 +- packages/app-defaults/CHANGELOG.md | 10 + packages/app-defaults/package.json | 2 +- packages/app/CHANGELOG.md | 64 + packages/app/package.json | 2 +- packages/backend-app-api/CHANGELOG.md | 12 + packages/backend-app-api/package.json | 2 +- packages/backend-common/CHANGELOG.md | 28 + packages/backend-common/package.json | 2 +- .../src/reading/AwsS3UrlReader.test.ts | 12 +- packages/backend-defaults/CHANGELOG.md | 9 + packages/backend-defaults/package.json | 2 +- packages/backend-next/CHANGELOG.md | 11 + packages/backend-next/package.json | 2 +- packages/backend-plugin-api/CHANGELOG.md | 9 + packages/backend-plugin-api/package.json | 2 +- packages/backend-tasks/CHANGELOG.md | 12 + packages/backend-tasks/package.json | 2 +- packages/backend-tasks/src/migrations.test.ts | 7 +- packages/backend-test-utils/CHANGELOG.md | 11 + packages/backend-test-utils/package.json | 2 +- packages/backend/CHANGELOG.md | 47 + packages/backend/package.json | 2 +- packages/core-app-api/CHANGELOG.md | 26 + packages/core-app-api/package.json | 2 +- .../auth/oauth2/OAuth2.test.ts | 24 +- .../implementations/auth/oauth2/OAuth2.ts | 5 +- packages/core-components/CHANGELOG.md | 12 + packages/core-components/package.json | 2 +- packages/core-plugin-api/CHANGELOG.md | 11 + packages/core-plugin-api/api-report.md | 6 +- packages/core-plugin-api/package.json | 2 +- .../src/apis/definitions/auth.ts | 6 +- packages/create-app/CHANGELOG.md | 6 + packages/create-app/package.json | 2 +- .../default-app/packages/app/.eslintignore | 1 + packages/dev-utils/CHANGELOG.md | 13 + packages/dev-utils/package.json | 2 +- packages/e2e-test/CHANGELOG.md | 7 + packages/e2e-test/package.json | 2 +- packages/integration-react/CHANGELOG.md | 10 + packages/integration-react/api-report.md | 6 +- packages/integration-react/package.json | 2 +- .../techdocs-cli-embedded-app/CHANGELOG.md | 17 + .../techdocs-cli-embedded-app/package.json | 2 +- packages/techdocs-cli/CHANGELOG.md | 9 + packages/techdocs-cli/package.json | 2 +- packages/test-utils/CHANGELOG.md | 10 + packages/test-utils/package.json | 2 +- plugins/adr-backend/CHANGELOG.md | 10 + plugins/adr-backend/package.json | 2 +- plugins/adr/CHANGELOG.md | 11 + plugins/adr/package.json | 2 +- plugins/airbrake-backend/CHANGELOG.md | 8 + plugins/airbrake-backend/package.json | 2 +- plugins/airbrake/CHANGELOG.md | 11 + plugins/airbrake/package.json | 2 +- plugins/allure/CHANGELOG.md | 9 + plugins/allure/package.json | 2 +- plugins/analytics-module-ga/CHANGELOG.md | 9 + plugins/analytics-module-ga/package.json | 2 +- plugins/apache-airflow/CHANGELOG.md | 8 + plugins/apache-airflow/package.json | 2 +- plugins/api-docs/CHANGELOG.md | 11 + plugins/api-docs/package.json | 2 +- plugins/apollo-explorer/CHANGELOG.md | 8 + plugins/apollo-explorer/package.json | 2 +- plugins/app-backend/CHANGELOG.md | 9 + plugins/app-backend/package.json | 2 +- plugins/auth-backend/CHANGELOG.md | 9 + plugins/auth-backend/package.json | 2 +- plugins/auth-node/CHANGELOG.md | 9 + plugins/auth-node/package.json | 2 +- plugins/azure-devops-backend/CHANGELOG.md | 8 + plugins/azure-devops-backend/package.json | 2 +- plugins/azure-devops/CHANGELOG.md | 9 + plugins/azure-devops/package.json | 2 +- plugins/azure-sites-backend/CHANGELOG.md | 8 + plugins/azure-sites-backend/package.json | 2 +- plugins/azure-sites/CHANGELOG.md | 9 + plugins/azure-sites/package.json | 2 +- plugins/badges-backend/CHANGELOG.md | 8 + plugins/badges-backend/package.json | 2 +- plugins/badges/CHANGELOG.md | 9 + plugins/badges/package.json | 2 +- plugins/bazaar-backend/CHANGELOG.md | 10 + plugins/bazaar-backend/package.json | 2 +- plugins/bazaar/CHANGELOG.md | 11 + plugins/bazaar/package.json | 2 +- plugins/bitrise/CHANGELOG.md | 9 + plugins/bitrise/package.json | 2 +- .../catalog-backend-module-aws/CHANGELOG.md | 14 + .../alpha-api-report.md | 2 +- .../catalog-backend-module-aws/api-report.md | 10 +- .../catalog-backend-module-aws/package.json | 3 +- .../catalog-backend-module-aws/src/alpha.ts | 2 +- .../catalogModuleAwsS3EntityProvider.test.ts} | 6 +- .../catalogModuleAwsS3EntityProvider.ts} | 2 +- .../src/module/index.ts | 17 + .../src/processors/AwsEKSClusterProcessor.ts | 2 +- .../AwsOrganizationCloudAccountProcessor.ts | 2 +- .../AwsS3DiscoveryProcessor.test.ts | 2 +- .../src/processors/AwsS3DiscoveryProcessor.ts | 2 +- .../src/providers/AwsS3EntityProvider.test.ts | 2 +- .../src/providers/AwsS3EntityProvider.ts | 2 +- .../catalog-backend-module-azure/CHANGELOG.md | 13 + .../alpha-api-report.md | 2 +- .../api-report.md | 10 +- .../catalog-backend-module-azure/package.json | 3 +- .../catalog-backend-module-azure/src/alpha.ts | 2 +- ...ogModuleAzureDevOpsEntityProvider.test.ts} | 6 +- ...catalogModuleAzureDevOpsEntityProvider.ts} | 2 +- .../src/module/index.ts | 17 + .../AzureDevOpsDiscoveryProcessor.test.ts | 2 +- .../AzureDevOpsDiscoveryProcessor.ts | 2 +- .../AzureDevOpsEntityProvider.test.ts | 2 +- .../providers/AzureDevOpsEntityProvider.ts | 2 +- .../CHANGELOG.md | 14 + .../alpha-api-report.md | 2 +- .../api-report.md | 4 +- .../package.json | 3 +- .../src/alpha.ts | 2 +- .../src/index.ts | 2 +- ...oduleBitbucketCloudEntityProvider.test.ts} | 8 +- ...alogModuleBitbucketCloudEntityProvider.ts} | 4 +- .../src/module/index.ts | 17 + .../BitbucketCloudEntityProvider.test.ts | 2 +- .../BitbucketCloudEntityProvider.ts | 2 +- ...BitbucketCloudEntityProviderConfig.test.ts | 0 .../BitbucketCloudEntityProviderConfig.ts | 0 .../CHANGELOG.md | 13 + .../alpha-api-report.md | 2 +- .../api-report.md | 6 +- .../package.json | 3 +- .../src/alpha.ts | 2 +- ...duleBitbucketServerEntityProvider.test.ts} | 6 +- ...logModuleBitbucketServerEntityProvider.ts} | 2 +- .../src/module/index.ts | 17 + .../BitbucketServerEntityProvider.test.ts | 2 +- .../BitbucketServerEntityProvider.ts | 2 +- .../BitbucketServerLocationParser.ts | 2 +- .../CHANGELOG.md | 10 + .../api-report.md | 8 +- .../package.json | 4 +- .../src/BitbucketDiscoveryProcessor.test.ts | 5 +- .../src/BitbucketDiscoveryProcessor.ts | 2 +- .../src/lib/BitbucketRepositoryParser.test.ts | 2 +- .../src/lib/BitbucketRepositoryParser.ts | 2 +- .../CHANGELOG.md | 13 + .../alpha-api-report.md | 2 +- .../api-report.md | 4 +- .../package.json | 3 +- .../src/alpha.ts | 2 +- ...catalogModuleGerritEntityProvider.test.ts} | 6 +- .../catalogModuleGerritEntityProvider.ts} | 2 +- .../src/module/index.ts | 17 + .../providers/GerritEntityProvider.test.ts | 2 +- .../src/providers/GerritEntityProvider.ts | 2 +- .../CHANGELOG.md | 15 + .../alpha-api-report.md | 2 +- .../api-report.md | 10 +- .../package.json | 2 +- .../src/alpha.ts | 2 +- .../src/deprecated.ts | 2 +- .../src/lib/github.ts | 4 +- ...catalogModuleGithubEntityProvider.test.ts} | 6 +- .../catalogModuleGithubEntityProvider.ts} | 2 +- .../src/module/index.ts | 17 + .../GithubDiscoveryProcessor.test.ts | 2 +- .../processors/GithubDiscoveryProcessor.ts | 2 +- .../GithubMultiOrgReaderProcessor.ts | 2 +- .../GithubOrgReaderProcessor.test.ts | 2 +- .../processors/GithubOrgReaderProcessor.ts | 2 +- .../providers/GithubEntityProvider.test.ts | 2 +- .../src/providers/GithubEntityProvider.ts | 2 +- .../providers/GithubOrgEntityProvider.test.ts | 2 +- .../src/providers/GithubOrgEntityProvider.ts | 2 +- .../CHANGELOG.md | 14 + .../alpha-api-report.md | 2 +- .../api-report.md | 10 +- .../package.json | 3 +- .../src/GitLabDiscoveryProcessor.test.ts | 2 +- .../src/GitLabDiscoveryProcessor.ts | 2 +- .../src/alpha.ts | 2 +- ...duleGitlabDiscoveryEntityProvider.test.ts} | 6 +- ...logModuleGitlabDiscoveryEntityProvider.ts} | 2 +- .../GitlabDiscoveryEntityProvider.test.ts | 2 +- .../GitlabDiscoveryEntityProvider.ts | 2 +- .../GitlabOrgDiscoveryEntityProvider.test.ts | 2 +- .../GitlabOrgDiscoveryEntityProvider.ts | 2 +- .../CHANGELOG.md | 13 + .../alpha-api-report.md | 2 +- .../api-report.md | 2 +- .../package.json | 5 +- .../IncrementalIngestionDatabaseManager.ts | 2 +- .../src/engine/IncrementalIngestionEngine.ts | 2 +- ...ncrementalIngestionEntityProvider.test.ts} | 6 +- ...duleIncrementalIngestionEntityProvider.ts} | 2 +- .../src/module/index.ts | 2 +- .../src/run.ts | 4 +- .../src/service/IncrementalCatalogBuilder.ts | 1 + .../src/types.ts | 2 +- .../catalog-backend-module-ldap/CHANGELOG.md | 9 + .../catalog-backend-module-ldap/api-report.md | 10 +- .../catalog-backend-module-ldap/package.json | 4 +- .../src/processors/LdapOrgEntityProvider.ts | 2 +- .../src/processors/LdapOrgReaderProcessor.ts | 2 +- .../CHANGELOG.md | 13 + .../alpha-api-report.md | 4 +- .../api-report.md | 10 +- .../package.json | 3 +- .../src/alpha.ts | 3 +- ...leMicrosoftGraphOrgEntityProvider.test.ts} | 6 +- ...gModuleMicrosoftGraphOrgEntityProvider.ts} | 8 +- .../src/module/index.ts | 18 + .../MicrosoftGraphOrgEntityProvider.test.ts | 2 +- .../MicrosoftGraphOrgEntityProvider.ts | 2 +- .../MicrosoftGraphOrgReaderProcessor.ts | 2 +- .../CHANGELOG.md | 11 + .../package.json | 2 +- .../CHANGELOG.md | 15 + .../alpha-api-report.md | 12 + .../api-report.md | 4 +- .../package.json | 24 +- .../src/alpha.ts} | 4 +- ...atalogModulePuppetDbEntityProvider.test.ts | 79 + .../catalogModulePuppetDbEntityProvider.ts | 51 + .../src/module/index.ts | 17 + .../providers/PuppetDbEntityProvider.test.ts | 2 +- .../src/providers/PuppetDbEntityProvider.ts | 6 +- plugins/catalog-backend/CHANGELOG.md | 12 + plugins/catalog-backend/api-report.md | 161 +- plugins/catalog-backend/package.json | 2 +- plugins/catalog-backend/src/deprecated.ts | 143 ++ plugins/catalog-backend/src/index.ts | 37 +- plugins/catalog-customized/CHANGELOG.md | 8 + plugins/catalog-customized/package.json | 2 +- plugins/catalog-graph/CHANGELOG.md | 9 + plugins/catalog-graph/package.json | 2 +- plugins/catalog-import/CHANGELOG.md | 12 + plugins/catalog-import/package.json | 2 +- .../src/api/CatalogImportClient.test.ts | 1 - plugins/catalog-node/CHANGELOG.md | 7 + plugins/catalog-node/api-report.md | 10 + plugins/catalog-node/package.json | 2 +- plugins/catalog-node/src/conversion.ts | 103 + plugins/catalog-node/src/index.ts | 1 + plugins/catalog-react/CHANGELOG.md | 11 + plugins/catalog-react/package.json | 2 +- plugins/catalog/CHANGELOG.md | 15 + plugins/catalog/package.json | 2 +- .../EntitySwitch/EntitySwitch.test.tsx | 36 + .../components/EntitySwitch/EntitySwitch.tsx | 2 +- .../CHANGELOG.md | 8 + .../package.json | 2 +- plugins/cicd-statistics/CHANGELOG.md | 8 + plugins/cicd-statistics/package.json | 2 +- plugins/circleci/CHANGELOG.md | 9 + plugins/circleci/package.json | 2 +- plugins/cloudbuild/CHANGELOG.md | 9 + plugins/cloudbuild/package.json | 2 +- plugins/code-climate/CHANGELOG.md | 9 + plugins/code-climate/package.json | 2 +- plugins/code-coverage-backend/CHANGELOG.md | 9 + plugins/code-coverage-backend/package.json | 2 +- plugins/code-coverage/CHANGELOG.md | 10 + plugins/code-coverage/package.json | 2 +- plugins/codescene/CHANGELOG.md | 9 + plugins/codescene/package.json | 2 +- plugins/config-schema/CHANGELOG.md | 9 + plugins/config-schema/package.json | 2 +- plugins/cost-insights/CHANGELOG.md | 10 + plugins/cost-insights/package.json | 2 +- plugins/dynatrace/CHANGELOG.md | 9 + plugins/dynatrace/package.json | 2 +- plugins/entity-feedback-backend/CHANGELOG.md | 9 + plugins/entity-feedback-backend/package.json | 2 +- plugins/entity-feedback/CHANGELOG.md | 9 + plugins/entity-feedback/package.json | 2 +- plugins/entity-validation/CHANGELOG.md | 9 + plugins/entity-validation/package.json | 2 +- .../CHANGELOG.md | 11 + .../alpha-api-report.md | 2 +- .../package.json | 2 +- .../src/alpha.ts | 2 +- ...duleAwsSqsConsumingEventPublisher.test.ts} | 6 +- ...ntsModuleAwsSqsConsumingEventPublisher.ts} | 4 +- .../events-backend-module-azure/CHANGELOG.md | 8 + .../alpha-api-report.md | 2 +- .../events-backend-module-azure/package.json | 2 +- .../events-backend-module-azure/src/alpha.ts | 2 +- ...ventsModuleAzureDevOpsEventRouter.test.ts} | 6 +- ... => eventsModuleAzureDevOpsEventRouter.ts} | 2 +- .../CHANGELOG.md | 8 + .../alpha-api-report.md | 2 +- .../package.json | 2 +- .../src/alpha.ts | 2 +- ...tsModuleBitbucketCloudEventRouter.test.ts} | 6 +- ... eventsModuleBitbucketCloudEventRouter.ts} | 2 +- .../events-backend-module-gerrit/CHANGELOG.md | 8 + .../alpha-api-report.md | 2 +- .../events-backend-module-gerrit/package.json | 2 +- .../events-backend-module-gerrit/src/alpha.ts | 2 +- ... => eventsModuleGerritEventRouter.test.ts} | 6 +- ...le.ts => eventsModuleGerritEventRouter.ts} | 2 +- .../events-backend-module-github/CHANGELOG.md | 9 + .../alpha-api-report.md | 4 +- .../events-backend-module-github/package.json | 2 +- .../events-backend-module-github/src/alpha.ts | 4 +- ... => eventsModuleGithubEventRouter.test.ts} | 6 +- ...le.ts => eventsModuleGithubEventRouter.ts} | 2 +- ...t.ts => eventsModuleGithubWebhook.test.ts} | 6 +- ...Module.ts => eventsModuleGithubWebhook.ts} | 2 +- .../events-backend-module-gitlab/CHANGELOG.md | 9 + .../alpha-api-report.md | 4 +- .../events-backend-module-gitlab/package.json | 2 +- .../events-backend-module-gitlab/src/alpha.ts | 4 +- ... => eventsModuleGitlabEventRouter.test.ts} | 6 +- ...le.ts => eventsModuleGitlabEventRouter.ts} | 2 +- ...t.ts => eventsModuleGitlabWebhook.test.ts} | 4 +- ...Module.ts => eventsModuleGitlabWebhook.ts} | 2 +- .../events-backend-test-utils/CHANGELOG.md | 7 + .../events-backend-test-utils/package.json | 2 +- plugins/events-backend/CHANGELOG.md | 10 + plugins/events-backend/README.md | 4 +- plugins/events-backend/package.json | 2 +- plugins/events-node/CHANGELOG.md | 7 + plugins/events-node/package.json | 2 +- .../example-todo-list-backend/CHANGELOG.md | 10 + .../example-todo-list-backend/package.json | 2 +- plugins/example-todo-list/CHANGELOG.md | 8 + plugins/example-todo-list/package.json | 2 +- plugins/explore-backend/CHANGELOG.md | 8 + plugins/explore-backend/package.json | 2 +- plugins/explore-react/CHANGELOG.md | 7 + plugins/explore-react/package.json | 2 +- plugins/explore/CHANGELOG.md | 12 + plugins/explore/package.json | 2 +- plugins/firehydrant/CHANGELOG.md | 9 + plugins/firehydrant/package.json | 2 +- plugins/fossa/CHANGELOG.md | 9 + plugins/fossa/package.json | 2 +- plugins/gcalendar/CHANGELOG.md | 8 + plugins/gcalendar/package.json | 2 +- plugins/gcp-projects/CHANGELOG.md | 8 + plugins/gcp-projects/package.json | 2 +- plugins/git-release-manager/CHANGELOG.md | 9 + plugins/git-release-manager/package.json | 2 +- plugins/github-actions/CHANGELOG.md | 10 + plugins/github-actions/package.json | 2 +- plugins/github-deployments/CHANGELOG.md | 11 + plugins/github-deployments/package.json | 2 +- plugins/github-issues/CHANGELOG.md | 10 + plugins/github-issues/package.json | 2 +- .../github-pull-requests-board/CHANGELOG.md | 10 + .../github-pull-requests-board/package.json | 2 +- plugins/gitops-profiles/CHANGELOG.md | 8 + plugins/gitops-profiles/package.json | 2 +- plugins/gocd/CHANGELOG.md | 9 + plugins/gocd/package.json | 2 +- plugins/graphiql/CHANGELOG.md | 8 + plugins/graphiql/package.json | 2 +- plugins/graphql-backend/CHANGELOG.md | 9 + plugins/graphql-backend/package.json | 2 +- plugins/graphql-voyager/CHANGELOG.md | 8 + plugins/graphql-voyager/package.json | 2 +- plugins/home/CHANGELOG.md | 10 + plugins/home/package.json | 2 +- plugins/ilert/CHANGELOG.md | 9 + plugins/ilert/package.json | 2 +- plugins/jenkins-backend/CHANGELOG.md | 9 + plugins/jenkins-backend/package.json | 2 +- plugins/jenkins/CHANGELOG.md | 9 + plugins/jenkins/package.json | 2 +- plugins/kafka-backend/CHANGELOG.md | 9 + plugins/kafka-backend/package.json | 2 +- plugins/kafka/CHANGELOG.md | 10 + plugins/kafka/package.json | 2 +- plugins/kubernetes-backend/CHANGELOG.md | 9 + plugins/kubernetes-backend/package.json | 2 +- plugins/kubernetes/CHANGELOG.md | 11 + plugins/kubernetes/package.json | 2 +- plugins/kubernetes/src/plugin.ts | 4 + plugins/lighthouse-backend/CHANGELOG.md | 9 + plugins/lighthouse-backend/package.json | 2 +- plugins/lighthouse/CHANGELOG.md | 10 + plugins/lighthouse/package.json | 2 +- plugins/linguist-backend/CHANGELOG.md | 11 + plugins/linguist-backend/package.json | 2 +- plugins/linguist/CHANGELOG.md | 9 + plugins/linguist/package.json | 2 +- plugins/microsoft-calendar/CHANGELOG.md | 8 + plugins/microsoft-calendar/package.json | 2 +- plugins/newrelic-dashboard/CHANGELOG.md | 9 + plugins/newrelic-dashboard/package.json | 2 +- plugins/newrelic/CHANGELOG.md | 8 + plugins/newrelic/package.json | 2 +- plugins/octopus-deploy/CHANGELOG.md | 9 + plugins/octopus-deploy/package.json | 2 +- plugins/org-react/CHANGELOG.md | 9 + plugins/org-react/package.json | 2 +- plugins/org/CHANGELOG.md | 10 + plugins/org/package.json | 2 +- plugins/pagerduty/CHANGELOG.md | 9 + plugins/pagerduty/package.json | 2 +- plugins/periskop-backend/CHANGELOG.md | 9 + plugins/periskop-backend/package.json | 2 +- plugins/periskop/CHANGELOG.md | 9 + plugins/periskop/package.json | 2 +- plugins/permission-backend/CHANGELOG.md | 10 + plugins/permission-backend/package.json | 2 +- plugins/permission-node/CHANGELOG.md | 9 + plugins/permission-node/package.json | 2 +- plugins/permission-react/CHANGELOG.md | 8 + plugins/permission-react/package.json | 2 +- plugins/playlist-backend/CHANGELOG.md | 10 + plugins/playlist-backend/package.json | 2 +- plugins/playlist/CHANGELOG.md | 11 + plugins/playlist/package.json | 2 +- plugins/proxy-backend/CHANGELOG.md | 9 + plugins/proxy-backend/package.json | 2 +- plugins/proxy-backend/src/service/router.ts | 5 + plugins/rollbar-backend/CHANGELOG.md | 8 + plugins/rollbar-backend/package.json | 2 +- plugins/rollbar/CHANGELOG.md | 9 + plugins/rollbar/package.json | 2 +- .../CHANGELOG.md | 12 + .../README.md | 2 + .../api-report.md | 2 +- .../package.json | 2 +- .../src/actions/fetch/cookiecutter.test.ts | 12 + .../src/actions/fetch/cookiecutter.ts | 11 +- .../CHANGELOG.md | 11 + .../package.json | 2 +- .../src/actions/fetch/rails/index.test.ts | 2 +- .../CHANGELOG.md | 8 + .../package.json | 2 +- .../CHANGELOG.md | 8 + .../package.json | 2 +- plugins/scaffolder-backend/CHANGELOG.md | 18 + plugins/scaffolder-backend/api-report.md | 34 +- plugins/scaffolder-backend/package.json | 4 +- .../actions/builtin/catalog/write.ts | 1 + .../actions/builtin/createBuiltinActions.ts | 3 +- .../scaffolder/actions/builtin/debug/index.ts | 1 + .../actions/builtin/debug/wait.test.ts | 76 + .../scaffolder/actions/builtin/debug/wait.ts | 131 ++ .../actions/builtin/publish/azure.test.ts | 11 +- .../src/scaffolder/dryrun/createDryRunner.ts | 7 +- .../tasks/DatabaseTaskStore.test.ts | 191 ++ .../src/scaffolder/tasks/DatabaseTaskStore.ts | 72 +- .../tasks/NunjucksWorkflowRunner.test.ts | 3 +- .../tasks/NunjucksWorkflowRunner.ts | 310 +-- .../src/scaffolder/tasks/StorageTaskBroker.ts | 64 +- .../src/scaffolder/tasks/TaskWorker.test.ts | 88 +- .../src/scaffolder/tasks/TaskWorker.ts | 5 +- .../src/scaffolder/tasks/types.ts | 47 +- .../scaffolder-backend/src/service/router.ts | 19 +- plugins/scaffolder-node/CHANGELOG.md | 7 + plugins/scaffolder-node/api-report.md | 1 + plugins/scaffolder-node/package.json | 2 +- plugins/scaffolder-node/src/actions/types.ts | 5 + plugins/scaffolder-react/CHANGELOG.md | 12 + plugins/scaffolder-react/api-report.md | 9 +- plugins/scaffolder-react/package.json | 2 +- plugins/scaffolder-react/src/api/types.ts | 14 +- .../src/hooks/useEventStream.ts | 13 +- .../components/Workflow/Workflow.test.tsx | 4 +- plugins/scaffolder/CHANGELOG.md | 21 + plugins/scaffolder/api-report.md | 2 + plugins/scaffolder/package.json | 2 +- plugins/scaffolder/src/api.ts | 45 +- .../ActionsPage/ActionsPage.test.tsx | 1 + .../src/components/TaskPage/TaskPage.tsx | 39 +- .../TemplatePage/TemplatePage.test.tsx | 6 +- .../src/next/OngoingTask/ContextMenu.tsx | 28 +- .../src/next/OngoingTask/OngoingTask.test.tsx | 84 + .../src/next/OngoingTask/OngoingTask.tsx | 12 +- .../TemplateWizardPage.test.tsx | 1 + .../CHANGELOG.md | 9 + .../package.json | 2 +- plugins/search-backend-module-pg/CHANGELOG.md | 9 + plugins/search-backend-module-pg/package.json | 2 +- plugins/search-backend-node/CHANGELOG.md | 9 + plugins/search-backend-node/package.json | 2 +- plugins/search-backend/CHANGELOG.md | 11 + plugins/search-backend/package.json | 2 +- plugins/search-react/CHANGELOG.md | 10 + plugins/search-react/package.json | 2 +- plugins/search/CHANGELOG.md | 12 + plugins/search/package.json | 2 +- plugins/sentry/CHANGELOG.md | 9 + plugins/sentry/package.json | 2 +- plugins/shortcuts/CHANGELOG.md | 8 + plugins/shortcuts/package.json | 2 +- plugins/sonarqube-backend/CHANGELOG.md | 8 + plugins/sonarqube-backend/package.json | 2 +- plugins/sonarqube-react/CHANGELOG.md | 7 + plugins/sonarqube-react/package.json | 2 +- plugins/sonarqube/CHANGELOG.md | 11 + plugins/sonarqube/package.json | 2 +- plugins/splunk-on-call/CHANGELOG.md | 10 + plugins/splunk-on-call/package.json | 2 +- plugins/stack-overflow-backend/CHANGELOG.md | 8 + plugins/stack-overflow-backend/package.json | 2 +- plugins/stack-overflow/CHANGELOG.md | 11 + plugins/stack-overflow/package.json | 2 +- plugins/stackstorm/CHANGELOG.md | 8 + plugins/stackstorm/package.json | 2 +- .../CHANGELOG.md | 10 + .../package.json | 2 +- plugins/tech-insights-backend/CHANGELOG.md | 10 + plugins/tech-insights-backend/package.json | 2 +- plugins/tech-insights-node/CHANGELOG.md | 9 + plugins/tech-insights-node/package.json | 2 +- plugins/tech-insights/CHANGELOG.md | 10 + plugins/tech-insights/package.json | 2 +- plugins/tech-radar/CHANGELOG.md | 8 + plugins/tech-radar/package.json | 2 +- .../techdocs-addons-test-utils/CHANGELOG.md | 15 + .../techdocs-addons-test-utils/package.json | 2 +- plugins/techdocs-backend/CHANGELOG.md | 10 + plugins/techdocs-backend/package.json | 2 +- .../CHANGELOG.md | 11 + .../package.json | 2 +- plugins/techdocs-node/CHANGELOG.md | 11 + plugins/techdocs-node/package.json | 2 +- .../src/stages/generate/helpers.test.ts | 4 +- plugins/techdocs-react/CHANGELOG.md | 10 + plugins/techdocs-react/package.json | 2 +- plugins/techdocs/CHANGELOG.md | 15 + plugins/techdocs/package.json | 2 +- plugins/todo-backend/CHANGELOG.md | 11 + plugins/todo-backend/package.json | 2 +- plugins/todo-backend/src/plugin.ts | 2 +- plugins/todo/CHANGELOG.md | 9 + plugins/todo/package.json | 2 +- plugins/user-settings-backend/CHANGELOG.md | 9 + plugins/user-settings-backend/package.json | 2 +- plugins/user-settings/CHANGELOG.md | 10 + plugins/user-settings/package.json | 2 +- plugins/vault-backend/CHANGELOG.md | 9 + plugins/vault-backend/package.json | 2 +- plugins/vault/CHANGELOG.md | 9 + plugins/vault/package.json | 2 +- plugins/xcmetrics/CHANGELOG.md | 8 + plugins/xcmetrics/package.json | 2 +- yarn.lock | 1352 +++++------- 597 files changed, 6911 insertions(+), 1680 deletions(-) create mode 100644 .changeset/backend-token-authentication.md create mode 100644 .changeset/beige-hats-cheer.md create mode 100644 .changeset/big-gorillas-fail1.md create mode 100644 .changeset/big-gorillas-fail2.md create mode 100644 .changeset/big-gorillas-fail3.md create mode 100644 .changeset/big-gorillas-fail4.md create mode 100644 .changeset/big-gorillas-fail5.md create mode 100644 .changeset/big-gorillas-fail6.md create mode 100644 .changeset/cold-dogs-watch.md create mode 100644 .changeset/create-app-1678209629.md create mode 100644 .changeset/curly-jobs-kneel.md rename {plugins/.changeset => .changeset}/dull-adults-drum.md (100%) create mode 100644 .changeset/gorgeous-pumas-speak.md create mode 100644 .changeset/healthy-buses-live-1.md create mode 100644 .changeset/healthy-buses-live-2.md create mode 100644 .changeset/healthy-buses-live-3.md create mode 100644 .changeset/healthy-buses-live-4.md create mode 100644 .changeset/healthy-buses-live-5.md create mode 100644 .changeset/healthy-buses-live-6.md create mode 100644 .changeset/healthy-buses-live-7.md create mode 100644 .changeset/healthy-buses-live-8.md create mode 100644 .changeset/healthy-buses-live-9.md create mode 100644 .changeset/honest-clouds-shout.md create mode 100644 .changeset/light-bees-end.md create mode 100644 .changeset/moody-apes-know.md create mode 100644 .changeset/nine-bikes-applaud.md create mode 100644 .changeset/proud-jokes-pull.md create mode 100644 .changeset/rotten-cats-matter.md create mode 100644 .changeset/stupid-games-brake.md create mode 100644 .changeset/twenty-insects-live.md create mode 100644 .changeset/witty-squids-fetch.md create mode 100644 .changeset/young-walls-prove.md create mode 100644 docs/releases/v1.12.0-next.2-changelog.md create mode 100644 microsite-next/src/components/simpleCard/simpleCard.tsx create mode 100644 microsite-next/src/pages/on-demand/_onDemandCard.tsx create mode 100644 microsite-next/src/pages/on-demand/index.tsx create mode 100644 microsite-next/src/pages/on-demand/onDemand.module.scss create mode 100644 microsite-next/src/util/truncateDescription.tsx create mode 100644 packages/create-app/templates/default-app/packages/app/.eslintignore rename plugins/catalog-backend-module-aws/src/{service/AwsS3EntityProviderCatalogModule.test.ts => module/catalogModuleAwsS3EntityProvider.test.ts} (92%) rename plugins/catalog-backend-module-aws/src/{service/AwsS3EntityProviderCatalogModule.ts => module/catalogModuleAwsS3EntityProvider.ts} (96%) create mode 100644 plugins/catalog-backend-module-aws/src/module/index.ts rename plugins/catalog-backend-module-azure/src/{service/AzureDevOpsEntityProviderCatalogModule.test.ts => module/catalogModuleAzureDevOpsEntityProvider.test.ts} (92%) rename plugins/catalog-backend-module-azure/src/{service/AzureDevOpsEntityProviderCatalogModule.ts => module/catalogModuleAzureDevOpsEntityProvider.ts} (96%) create mode 100644 plugins/catalog-backend-module-azure/src/module/index.ts rename plugins/catalog-backend-module-bitbucket-cloud/src/{service/BitbucketCloudEntityProviderCatalogModule.test.ts => module/catalogModuleBitbucketCloudEntityProvider.test.ts} (90%) rename plugins/catalog-backend-module-bitbucket-cloud/src/{service/BitbucketCloudEntityProviderCatalogModule.ts => module/catalogModuleBitbucketCloudEntityProvider.ts} (93%) create mode 100644 plugins/catalog-backend-module-bitbucket-cloud/src/module/index.ts rename plugins/catalog-backend-module-bitbucket-cloud/src/{ => providers}/BitbucketCloudEntityProvider.test.ts (99%) rename plugins/catalog-backend-module-bitbucket-cloud/src/{ => providers}/BitbucketCloudEntityProvider.ts (99%) rename plugins/catalog-backend-module-bitbucket-cloud/src/{ => providers}/BitbucketCloudEntityProviderConfig.test.ts (100%) rename plugins/catalog-backend-module-bitbucket-cloud/src/{ => providers}/BitbucketCloudEntityProviderConfig.ts (100%) rename plugins/catalog-backend-module-bitbucket-server/src/{service/BitbucketServerEntityProviderCatalogModule.test.ts => module/catalogModuleBitbucketServerEntityProvider.test.ts} (92%) rename plugins/catalog-backend-module-bitbucket-server/src/{service/BitbucketServerEntityProviderCatalogModule.ts => module/catalogModuleBitbucketServerEntityProvider.ts} (96%) create mode 100644 plugins/catalog-backend-module-bitbucket-server/src/module/index.ts rename plugins/catalog-backend-module-gerrit/src/{service/GerritEntityProviderCatalogModule.test.ts => module/catalogModuleGerritEntityProvider.test.ts} (93%) rename plugins/catalog-backend-module-gerrit/src/{service/GerritEntityProviderCatalogModule.ts => module/catalogModuleGerritEntityProvider.ts} (96%) create mode 100644 plugins/catalog-backend-module-gerrit/src/module/index.ts rename plugins/catalog-backend-module-github/src/{service/GithubEntityProviderCatalogModule.test.ts => module/catalogModuleGithubEntityProvider.test.ts} (92%) rename plugins/catalog-backend-module-github/src/{service/GithubEntityProviderCatalogModule.ts => module/catalogModuleGithubEntityProvider.ts} (96%) create mode 100644 plugins/catalog-backend-module-github/src/module/index.ts rename plugins/catalog-backend-module-gitlab/src/{service/GitlabDiscoveryEntityProviderCatalogModule.test.ts => module/catalogModuleGitlabDiscoveryEntityProvider.test.ts} (92%) rename plugins/catalog-backend-module-gitlab/src/{service/GitlabDiscoveryEntityProviderCatalogModule.ts => module/catalogModuleGitlabDiscoveryEntityProvider.ts} (96%) rename plugins/catalog-backend-module-incremental-ingestion/src/module/{incrementalIngestionEntityProviderCatalogModule.test.ts => catalogModuleIncrementalIngestionEntityProvider.test.ts} (91%) rename plugins/catalog-backend-module-incremental-ingestion/src/module/{incrementalIngestionEntityProviderCatalogModule.ts => catalogModuleIncrementalIngestionEntityProvider.ts} (97%) rename plugins/catalog-backend-module-msgraph/src/{service/MicrosoftGraphOrgEntityProviderCatalogModule.test.ts => module/catalogModuleMicrosoftGraphOrgEntityProvider.test.ts} (92%) rename plugins/catalog-backend-module-msgraph/src/{service/MicrosoftGraphOrgEntityProviderCatalogModule.ts => module/catalogModuleMicrosoftGraphOrgEntityProvider.ts} (91%) create mode 100644 plugins/catalog-backend-module-msgraph/src/module/index.ts create mode 100644 plugins/catalog-backend-module-puppetdb/CHANGELOG.md create mode 100644 plugins/catalog-backend-module-puppetdb/alpha-api-report.md rename plugins/{catalog-backend/src/util/index.ts => catalog-backend-module-puppetdb/src/alpha.ts} (84%) create mode 100644 plugins/catalog-backend-module-puppetdb/src/module/catalogModulePuppetDbEntityProvider.test.ts create mode 100644 plugins/catalog-backend-module-puppetdb/src/module/catalogModulePuppetDbEntityProvider.ts create mode 100644 plugins/catalog-backend-module-puppetdb/src/module/index.ts create mode 100644 plugins/catalog-backend/src/deprecated.ts create mode 100644 plugins/catalog-node/src/conversion.ts rename plugins/events-backend-module-aws-sqs/src/service/{AwsSqsConsumingEventPublisherEventsModule.test.ts => eventsModuleAwsSqsConsumingEventPublisher.test.ts} (92%) rename plugins/events-backend-module-aws-sqs/src/service/{AwsSqsConsumingEventPublisherEventsModule.ts => eventsModuleAwsSqsConsumingEventPublisher.ts} (92%) rename plugins/events-backend-module-azure/src/service/{AzureDevOpsEventRouterEventsModule.test.ts => eventsModuleAzureDevOpsEventRouter.test.ts} (88%) rename plugins/events-backend-module-azure/src/service/{AzureDevOpsEventRouterEventsModule.ts => eventsModuleAzureDevOpsEventRouter.ts} (95%) rename plugins/events-backend-module-bitbucket-cloud/src/service/{BitbucketCloudEventRouterEventsModule.test.ts => eventsModuleBitbucketCloudEventRouter.test.ts} (88%) rename plugins/events-backend-module-bitbucket-cloud/src/service/{BitbucketCloudEventRouterEventsModule.ts => eventsModuleBitbucketCloudEventRouter.ts} (95%) rename plugins/events-backend-module-gerrit/src/service/{GerritEventRouterEventsModule.test.ts => eventsModuleGerritEventRouter.test.ts} (89%) rename plugins/events-backend-module-gerrit/src/service/{GerritEventRouterEventsModule.ts => eventsModuleGerritEventRouter.ts} (95%) rename plugins/events-backend-module-github/src/service/{GithubEventRouterEventsModule.test.ts => eventsModuleGithubEventRouter.test.ts} (89%) rename plugins/events-backend-module-github/src/service/{GithubEventRouterEventsModule.ts => eventsModuleGithubEventRouter.ts} (95%) rename plugins/events-backend-module-github/src/service/{GithubWebhookEventsModule.test.ts => eventsModuleGithubWebhook.test.ts} (94%) rename plugins/events-backend-module-github/src/service/{GithubWebhookEventsModule.ts => eventsModuleGithubWebhook.ts} (95%) rename plugins/events-backend-module-gitlab/src/service/{GitlabEventRouterEventsModule.test.ts => eventsModuleGitlabEventRouter.test.ts} (89%) rename plugins/events-backend-module-gitlab/src/service/{GitlabEventRouterEventsModule.ts => eventsModuleGitlabEventRouter.ts} (95%) rename plugins/events-backend-module-gitlab/src/service/{GitlabWebhookEventsModule.test.ts => eventsModuleGitlabWebhook.test.ts} (95%) rename plugins/events-backend-module-gitlab/src/service/{GitlabWebhookEventsModule.ts => eventsModuleGitlabWebhook.ts} (95%) create mode 100644 plugins/scaffolder-backend/src/scaffolder/actions/builtin/debug/wait.test.ts create mode 100644 plugins/scaffolder-backend/src/scaffolder/actions/builtin/debug/wait.ts create mode 100644 plugins/scaffolder-backend/src/scaffolder/tasks/DatabaseTaskStore.test.ts create mode 100644 plugins/scaffolder/src/next/OngoingTask/OngoingTask.test.tsx diff --git a/.changeset/backend-token-authentication.md b/.changeset/backend-token-authentication.md new file mode 100644 index 0000000000..3b0f016800 --- /dev/null +++ b/.changeset/backend-token-authentication.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-scaffolder-backend': patch +--- + +Make identity valid if subject of token is a backstage server-2-server auth token diff --git a/.changeset/beige-hats-cheer.md b/.changeset/beige-hats-cheer.md new file mode 100644 index 0000000000..83b70d137e --- /dev/null +++ b/.changeset/beige-hats-cheer.md @@ -0,0 +1,27 @@ +--- +'@backstage/plugin-catalog-backend': patch +--- + +Add deprecations for symbols that were moved to `@backstage/plugin-catalog-node` a long time ago: + +- `CatalogProcessor` +- `CatalogProcessorCache` +- `CatalogProcessorEmit` +- `CatalogProcessorEntityResult` +- `CatalogProcessorErrorResult` +- `CatalogProcessorLocationResult` +- `CatalogProcessorParser` +- `CatalogProcessorRefreshKeysResult` +- `CatalogProcessorRelationResult` +- `CatalogProcessorResult` +- `DeferredEntity` +- `EntityProvider` +- `EntityProviderConnection` +- `EntityProviderMutation` +- `EntityRelationSpec` +- `processingResult` + +Also moved over and deprecated the following symbols: + +- `locationSpecToLocationEntity` +- `locationSpecToMetadataName` diff --git a/.changeset/big-gorillas-fail1.md b/.changeset/big-gorillas-fail1.md new file mode 100644 index 0000000000..18c2d621d7 --- /dev/null +++ b/.changeset/big-gorillas-fail1.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-events-backend-module-bitbucket-cloud': patch +--- + +Renamed `bitbucketCloudEventRouterEventsModule` to `eventsModuleBitbucketCloudEventRouter` to match the [recommended naming patterns](https://backstage.io/docs/backend-system/architecture/naming-patterns). diff --git a/.changeset/big-gorillas-fail2.md b/.changeset/big-gorillas-fail2.md new file mode 100644 index 0000000000..bc34bf9aaa --- /dev/null +++ b/.changeset/big-gorillas-fail2.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-events-backend-module-aws-sqs': patch +--- + +Renamed `awsSqsConsumingEventPublisherEventsModule` to `eventsModuleAwsSqsConsumingEventPublisher` to match the [recommended naming patterns](https://backstage.io/docs/backend-system/architecture/naming-patterns). diff --git a/.changeset/big-gorillas-fail3.md b/.changeset/big-gorillas-fail3.md new file mode 100644 index 0000000000..352c1a2cff --- /dev/null +++ b/.changeset/big-gorillas-fail3.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-events-backend-module-gerrit': patch +--- + +Renamed `gerritEventRouterEventsModule` to `eventsModuleGerritEventRouter` to match the [recommended naming patterns](https://backstage.io/docs/backend-system/architecture/naming-patterns). diff --git a/.changeset/big-gorillas-fail4.md b/.changeset/big-gorillas-fail4.md new file mode 100644 index 0000000000..add8699f8b --- /dev/null +++ b/.changeset/big-gorillas-fail4.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-events-backend-module-github': patch +--- + +Renamed `githubEventRouterEventsModule` to `eventsModuleGithubEventRouter` and `githubWebhookEventsModule` to `eventsModuleGithubWebhook`, to match the [recommended naming patterns](https://backstage.io/docs/backend-system/architecture/naming-patterns). diff --git a/.changeset/big-gorillas-fail5.md b/.changeset/big-gorillas-fail5.md new file mode 100644 index 0000000000..549eb61f24 --- /dev/null +++ b/.changeset/big-gorillas-fail5.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-events-backend-module-gitlab': patch +--- + +Renamed `gitlabEventRouterEventsModule` to `eventsModuleGitlabEventRouter` and `gitlabWebhookEventsModule` to `eventsModuleGitlabWebhook` to match the [recommended naming patterns](https://backstage.io/docs/backend-system/architecture/naming-patterns). diff --git a/.changeset/big-gorillas-fail6.md b/.changeset/big-gorillas-fail6.md new file mode 100644 index 0000000000..6622b5222e --- /dev/null +++ b/.changeset/big-gorillas-fail6.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-events-backend-module-azure': patch +--- + +Renamed `azureDevOpsEventRouterEventsModule` to `eventsModuleAzureDevOpsEventRouter` to match the [recommended naming patterns](https://backstage.io/docs/backend-system/architecture/naming-patterns). diff --git a/.changeset/cold-dogs-watch.md b/.changeset/cold-dogs-watch.md new file mode 100644 index 0000000000..99b25a833e --- /dev/null +++ b/.changeset/cold-dogs-watch.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-catalog-backend-module-puppetdb': patch +--- + +Added a `catalogModulePuppetDbEntityProvider` alpha export for the new backend system diff --git a/.changeset/create-app-1678209629.md b/.changeset/create-app-1678209629.md new file mode 100644 index 0000000000..b50d431d4b --- /dev/null +++ b/.changeset/create-app-1678209629.md @@ -0,0 +1,5 @@ +--- +'@backstage/create-app': patch +--- + +Bumped create-app version. diff --git a/.changeset/curly-jobs-kneel.md b/.changeset/curly-jobs-kneel.md new file mode 100644 index 0000000000..f313beab88 --- /dev/null +++ b/.changeset/curly-jobs-kneel.md @@ -0,0 +1,8 @@ +--- +'@backstage/plugin-scaffolder': patch +'@backstage/plugin-scaffolder-backend': patch +'@backstage/plugin-scaffolder-node': patch +'@backstage/plugin-scaffolder-react': patch +--- + +Added a possibility to cancel the running task (executing of a scaffolder template) diff --git a/plugins/.changeset/dull-adults-drum.md b/.changeset/dull-adults-drum.md similarity index 100% rename from plugins/.changeset/dull-adults-drum.md rename to .changeset/dull-adults-drum.md diff --git a/.changeset/gorgeous-pumas-speak.md b/.changeset/gorgeous-pumas-speak.md new file mode 100644 index 0000000000..60f40c6748 --- /dev/null +++ b/.changeset/gorgeous-pumas-speak.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-catalog': patch +--- + +fix entity switch rendering when there is no default case diff --git a/.changeset/healthy-buses-live-1.md b/.changeset/healthy-buses-live-1.md new file mode 100644 index 0000000000..7e433372df --- /dev/null +++ b/.changeset/healthy-buses-live-1.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-catalog-backend-module-incremental-ingestion': patch +--- + +Renamed `incrementalIngestionEntityProviderCatalogModule` to `catalogModuleIncrementalIngestionEntityProvider` to match the [recommended naming patterns](https://backstage.io/docs/backend-system/architecture/naming-patterns). diff --git a/.changeset/healthy-buses-live-2.md b/.changeset/healthy-buses-live-2.md new file mode 100644 index 0000000000..ab577276d8 --- /dev/null +++ b/.changeset/healthy-buses-live-2.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-catalog-backend-module-bitbucket-server': patch +--- + +Renamed `bitbucketServerEntityProviderCatalogModule` to `catalogModuleBitbucketServerEntityProvider` to match the [recommended naming patterns](https://backstage.io/docs/backend-system/architecture/naming-patterns). diff --git a/.changeset/healthy-buses-live-3.md b/.changeset/healthy-buses-live-3.md new file mode 100644 index 0000000000..493236ea73 --- /dev/null +++ b/.changeset/healthy-buses-live-3.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-catalog-backend-module-bitbucket-cloud': patch +--- + +Renamed `bitbucketCloudEntityProviderCatalogModule` to `catalogModuleBitbucketCloudEntityProvider` to match the [recommended naming patterns](https://backstage.io/docs/backend-system/architecture/naming-patterns). diff --git a/.changeset/healthy-buses-live-4.md b/.changeset/healthy-buses-live-4.md new file mode 100644 index 0000000000..fdc223a7f4 --- /dev/null +++ b/.changeset/healthy-buses-live-4.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-catalog-backend-module-msgraph': patch +--- + +Renamed `microsoftGraphOrgEntityProviderCatalogModule` to `catalogModuleMicrosoftGraphOrgEntityProvider` to match the [recommended naming patterns](https://backstage.io/docs/backend-system/architecture/naming-patterns). diff --git a/.changeset/healthy-buses-live-5.md b/.changeset/healthy-buses-live-5.md new file mode 100644 index 0000000000..f540751696 --- /dev/null +++ b/.changeset/healthy-buses-live-5.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-catalog-backend-module-gerrit': patch +--- + +Renamed `gerritEntityProviderCatalogModule` to `catalogModuleGerritEntityProvider` to match the [recommended naming patterns](https://backstage.io/docs/backend-system/architecture/naming-patterns). diff --git a/.changeset/healthy-buses-live-6.md b/.changeset/healthy-buses-live-6.md new file mode 100644 index 0000000000..f293e56eae --- /dev/null +++ b/.changeset/healthy-buses-live-6.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-catalog-backend-module-github': patch +--- + +Renamed `githubEntityProviderCatalogModule` to `catalogModuleGithubEntityProvider` to match the [recommended naming patterns](https://backstage.io/docs/backend-system/architecture/naming-patterns). diff --git a/.changeset/healthy-buses-live-7.md b/.changeset/healthy-buses-live-7.md new file mode 100644 index 0000000000..7e7219bf01 --- /dev/null +++ b/.changeset/healthy-buses-live-7.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-catalog-backend-module-gitlab': patch +--- + +Renamed `gitlabDiscoveryEntityProviderCatalogModule` to `catalogModuleGitlabDiscoveryEntityProvider` to match the [recommended naming patterns](https://backstage.io/docs/backend-system/architecture/naming-patterns). diff --git a/.changeset/healthy-buses-live-8.md b/.changeset/healthy-buses-live-8.md new file mode 100644 index 0000000000..9137a3b31a --- /dev/null +++ b/.changeset/healthy-buses-live-8.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-catalog-backend-module-azure': patch +--- + +Renamed `azureDevOpsEntityProviderCatalogModule` to `catalogModuleAzureDevOpsEntityProvider` to match the [recommended naming patterns](https://backstage.io/docs/backend-system/architecture/naming-patterns). diff --git a/.changeset/healthy-buses-live-9.md b/.changeset/healthy-buses-live-9.md new file mode 100644 index 0000000000..dbcba51470 --- /dev/null +++ b/.changeset/healthy-buses-live-9.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-catalog-backend-module-aws': patch +--- + +Renamed `awsS3EntityProviderCatalogModule` to `catalogModuleAwsS3EntityProviders` to match the [recommended naming patterns](https://backstage.io/docs/backend-system/architecture/naming-patterns). diff --git a/.changeset/honest-clouds-shout.md b/.changeset/honest-clouds-shout.md new file mode 100644 index 0000000000..0a7249d9ad --- /dev/null +++ b/.changeset/honest-clouds-shout.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-scaffolder-backend': patch +--- + +catalog write action should allow any shape of object diff --git a/.changeset/light-bees-end.md b/.changeset/light-bees-end.md new file mode 100644 index 0000000000..9fbbc44da0 --- /dev/null +++ b/.changeset/light-bees-end.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-kubernetes': patch +--- + +GitLab can now be used as an `oidcTokenProvider` for Kubernetes clusters diff --git a/.changeset/moody-apes-know.md b/.changeset/moody-apes-know.md new file mode 100644 index 0000000000..bd48cb108e --- /dev/null +++ b/.changeset/moody-apes-know.md @@ -0,0 +1,16 @@ +--- +'@backstage/plugin-catalog-backend-module-incremental-ingestion': patch +'@backstage/plugin-catalog-backend-module-bitbucket-server': patch +'@backstage/plugin-catalog-backend-module-bitbucket-cloud': patch +'@backstage/plugin-catalog-backend-module-bitbucket': patch +'@backstage/plugin-catalog-backend-module-puppetdb': patch +'@backstage/plugin-catalog-backend-module-msgraph': patch +'@backstage/plugin-catalog-backend-module-gerrit': patch +'@backstage/plugin-catalog-backend-module-github': patch +'@backstage/plugin-catalog-backend-module-gitlab': patch +'@backstage/plugin-catalog-backend-module-azure': patch +'@backstage/plugin-catalog-backend-module-ldap': patch +'@backstage/plugin-catalog-backend-module-aws': patch +--- + +Make sure to not use deprecated exports from `@backstage/plugin-catalog-backend` diff --git a/.changeset/nine-bikes-applaud.md b/.changeset/nine-bikes-applaud.md new file mode 100644 index 0000000000..77a1c0e4be --- /dev/null +++ b/.changeset/nine-bikes-applaud.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-scaffolder-backend-module-cookiecutter': patch +--- + +allow container runner to be undefined in cookiecutter plugin diff --git a/.changeset/pre.json b/.changeset/pre.json index 2f69a85050..fc7fbffc9a 100644 --- a/.changeset/pre.json +++ b/.changeset/pre.json @@ -1,5 +1,5 @@ { - "mode": "pre", + "mode": "exit", "tag": "next", "initialVersions": { "example-app": "0.2.80", @@ -210,44 +210,63 @@ "@backstage/plugin-vault-backend": "0.2.8", "@backstage/plugin-xcmetrics": "0.2.35", "@backstage/plugin-octopus-deploy": "0.0.0", - "@backstage/plugin-stackstorm": "0.0.0" + "@backstage/plugin-stackstorm": "0.0.0", + "@backstage/plugin-catalog-backend-module-puppetdb": "0.0.1" }, "changesets": [ "afraid-trees-stare", + "backend-token-authentication", "breezy-bees-care", "bright-kids-raise", + "clean-lemons-jump", "clean-planes-join", + "clever-dogs-cheat", "cool-clocks-prove", + "cool-feet-speak", "create-app-1676993958", + "create-app-1678209629", "curvy-pets-hang", "eight-radios-bake", + "eighty-chairs-roll", "eighty-geese-return", + "empty-books-occur", "famous-sloths-tie", + "fifty-beds-dress", "flat-kids-occur", "flat-peaches-act", "forty-snails-clap", "four-lizards-grin", + "fresh-hairs-switch", "fuzzy-trains-search", + "gentle-bears-love", "gentle-pears-clean", "great-trains-jam", "grumpy-bikes-begin", "happy-boxes-arrive", + "honest-clouds-shout", "honest-nails-bake", "khaki-poems-run", + "light-bees-end", "light-sheep-trade", "long-nails-pump", "long-wolves-drive", + "lovely-tigers-look", + "mean-toys-itch", "metal-suns-rhyme", "mighty-games-turn", "mighty-years-own", "new-jobs-deny", "nice-planets-wave", + "nine-bikes-applaud", "ninety-turtles-wait", "odd-fireants-bathe", "odd-oranges-tease", "odd-waves-rescue", "old-foxes-shave", + "olive-berries-poke", + "orange-experts-hug", "perfect-mayflies-greet", + "pink-dolls-unite", "polite-chicken-do", "polite-falcons-jump", "polite-wombats-smash", @@ -267,8 +286,13 @@ "renovate-fb85ae7", "rich-clocks-approve", "rich-wombats-rescue", + "rotten-cats-matter", + "rotten-panthers-share", + "selfish-hats-wait", "short-mayflies-fix", + "silent-dryers-end", "silly-suits-run", + "silver-bikes-breathe", "silver-lies-rest", "six-melons-rhyme", "slimy-lobsters-kneel", @@ -282,6 +306,7 @@ "tall-hats-talk", "ten-tigers-marry", "thin-candles-wait", + "tiny-llamas-jump", "tricky-jars-film", "twelve-cars-push", "twenty-jeans-speak", @@ -292,9 +317,11 @@ "wicked-lions-repeat", "wicked-spoons-call", "wild-ads-pull", + "wild-bulldogs-suffer", "witty-geckos-design", "yellow-bananas-yawn", "young-schools-double", - "young-scissors-cough" + "young-scissors-cough", + "young-walls-prove" ] } diff --git a/.changeset/proud-jokes-pull.md b/.changeset/proud-jokes-pull.md new file mode 100644 index 0000000000..7d7790889a --- /dev/null +++ b/.changeset/proud-jokes-pull.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-catalog-node': patch +--- + +Added `locationSpecToMetadataName` and `locationSpecToLocationEntity` as their new home, moved over from the backend package where they now are marked as deprecated. diff --git a/.changeset/rotten-cats-matter.md b/.changeset/rotten-cats-matter.md new file mode 100644 index 0000000000..2515db9991 --- /dev/null +++ b/.changeset/rotten-cats-matter.md @@ -0,0 +1,19 @@ +--- +'@backstage/core-app-api': minor +--- + +`OAuth2` now gets ID tokens from a session with the `openid` scope explicitly +requested. + +This should not be considered a breaking change, because spec-compliant OIDC +providers will already be returning ID tokens if and only if the `openid` scope +is granted. + +This change makes the dependence explicit, and removes the burden on +OAuth2-based providers which require an ID token (e.g. this is done by various +default [auth +handlers](https://backstage.io/docs/auth/identity-resolver/#authhandler)) to add +`openid` to their default scopes. _That_ could carry another indirect benefit: +by removing `openid` from the default scopes for a provider, grants for +resource-specific access tokens can avoid requesting excess ID token-related +scopes. diff --git a/.changeset/silver-bikes-breathe.md b/.changeset/silver-bikes-breathe.md index 63dabf7b2e..0288580bba 100644 --- a/.changeset/silver-bikes-breathe.md +++ b/.changeset/silver-bikes-breathe.md @@ -2,4 +2,23 @@ '@backstage/plugin-catalog': minor --- -allow entity switch to render all cases that match the condition +Allow `EntitySwitch` to render all cases that match the condition. + +This change introduces a new parameter for the `EntitySwitch` component +`renderMultipleMatches`. In case the parameter value is `all`, the `EntitySwitch` +will render all `EntitySwitch.Case` that contain `if` parameter, and it +evaluates to true. In case none of the cases match, the default case will be +rendered, if any. + +This means for example in the CI/CD page you can now do the following: + +```tsx + + Jenkins + CodeBuild + No CI/CD + +``` + +This allows the component to have multiple CI/CD systems and all of those are +rendered on the same page. diff --git a/.changeset/stupid-games-brake.md b/.changeset/stupid-games-brake.md new file mode 100644 index 0000000000..0a50a32ffa --- /dev/null +++ b/.changeset/stupid-games-brake.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-events-backend': patch +--- + +Updated README instructions diff --git a/.changeset/twenty-insects-live.md b/.changeset/twenty-insects-live.md new file mode 100644 index 0000000000..d3f8cdfc25 --- /dev/null +++ b/.changeset/twenty-insects-live.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-proxy-backend': patch +--- + +Ensure that `@backstage/plugin-proxy-backend` logs the requests that it proxies when log level is set to `debug`. diff --git a/.changeset/witty-squids-fetch.md b/.changeset/witty-squids-fetch.md new file mode 100644 index 0000000000..3e13421038 --- /dev/null +++ b/.changeset/witty-squids-fetch.md @@ -0,0 +1,5 @@ +--- +'@backstage/create-app': patch +--- + +Added to the template `packages/app/.eslintignore` file to packages to ignore the contents of `packages/app/public`. diff --git a/.changeset/young-walls-prove.md b/.changeset/young-walls-prove.md new file mode 100644 index 0000000000..33fafa1548 --- /dev/null +++ b/.changeset/young-walls-prove.md @@ -0,0 +1,5 @@ +--- +'@backstage/core-plugin-api': minor +--- + +The GitLab auth provider can now be used to get OpenID tokens. diff --git a/ADOPTERS.md b/ADOPTERS.md index 70b2992cf9..26f4331b70 100644 --- a/ADOPTERS.md +++ b/ADOPTERS.md @@ -233,4 +233,5 @@ _You can do this by using the [Adopter form](https://info.backstage.spotify.com/ | [Gumtree](https://www.gumtree.com.au) | [Kumar Gaurav](https://www.linkedin.com/in/kumargaurav517) | We are starting to use it as a single place to find all component information in a distributed architecture. | | [N26](https://n26.com) | [Alexei Timofti](https://www.linkedin.com/in/alexeitimofti) | We use Backstage for our service catalog and are actively looking into adopting other plugins like TechDocs, TechInsights and Software Templates. | | [The LEGO Group](https://www.lego.com) | [Waqas Ali](https://www.linkedin.com/in/waqasali47) | We are building our internal develper portal on top of Backstage. | +| [CORS.gmbh](https://www.cors.gmbh) | [@dpfaffenbauer](https://github.com/dpfaffenbauer) | Developer Portal for our Projects we develop for our Customers and Hosting them On Kubernetes. | diff --git a/docs/auth/gitlab/provider.md b/docs/auth/gitlab/provider.md index 5041e161c5..dc41617812 100644 --- a/docs/auth/gitlab/provider.md +++ b/docs/auth/gitlab/provider.md @@ -18,7 +18,11 @@ Settings for local development: - Name: Backstage (or your custom app name) - Redirect URI: `http://localhost:7007/api/auth/gitlab/handler/frame` -- Scopes: `read_api` and `read_user` +- Scopes: `read_user` for sign-in. If you also need ID tokens (e.g. if you are + using the Kubernetes plugin and have clusters with `authProvider: oidc` and + [`oidcTokenProvider: +gitlab`](https://backstage.io/docs/features/kubernetes/configuration/#clustersoidctokenprovider-optional)), + add the `openid` scope. ## Configuration diff --git a/docs/features/kubernetes/configuration.md b/docs/features/kubernetes/configuration.md index 837574aa9e..458637f316 100644 --- a/docs/features/kubernetes/configuration.md +++ b/docs/features/kubernetes/configuration.md @@ -160,8 +160,9 @@ auth: audience: ${AUTH_OKTA_AUDIENCE} ``` -The following values are supported out-of-the-box by the frontend: `google`, `microsoft`, -`okta`, `onelogin`. +The following values are supported out-of-the-box by the frontend: `gitlab` (the +application whose `clientId` is used by the auth provider should be granted the +`openid` scope), `google`, `microsoft`, `okta`, `onelogin`. Take note that `oidcTokenProvider` is just the issuer for the token, you can use any of these with an OIDC enabled cluster, like using `microsoft` as the issuer for a EKS diff --git a/docs/features/software-templates/index.md b/docs/features/software-templates/index.md index 5911e192b1..fbccf8848c 100644 --- a/docs/features/software-templates/index.md +++ b/docs/features/software-templates/index.md @@ -58,6 +58,10 @@ It shouldn't take too long, and you'll have a success screen! If it fails, you'll be able to click on each section to get the log from the step that failed which can be helpful in debugging. +You can also cancel the running process. Once you clicked on button "Cancel", the abort signal +will be sent to a task and all next steps won't be executed. The current step will be cancelled +only if it supports it. + ![Templating failed](../../assets/software-templates/failed.png) ## View Component in Catalog diff --git a/docs/features/software-templates/writing-custom-actions.md b/docs/features/software-templates/writing-custom-actions.md index 3e89e89582..7a841dfd0e 100644 --- a/docs/features/software-templates/writing-custom-actions.md +++ b/docs/features/software-templates/writing-custom-actions.md @@ -71,7 +71,7 @@ You can also choose to define your custom action using JSON schema instead of `z ```ts title="With JSON Schema" import { createTemplateAction } from '@backstage/plugin-scaffolder-node'; -import fs from 'fs-extra'; +import { writeFile } from 'fs'; export const createNewFileAction = () => { return createTemplateAction<{ contents: string; filename: string }>({ @@ -95,9 +95,12 @@ export const createNewFileAction = () => { }, }, async handler(ctx) { - await fs.outputFile( + const { signal } = ctx; + await writeFile( `${ctx.workspacePath}/${ctx.input.filename}`, ctx.input.contents, + { signal }, + _ => {}, ); }, }); diff --git a/docs/overview/adopting.md b/docs/overview/adopting.md index 0765d4a452..15450c995b 100644 --- a/docs/overview/adopting.md +++ b/docs/overview/adopting.md @@ -153,7 +153,7 @@ Backstage as _the_ platform: percentage of engineers is below 50%. Most engineers actually use Backstage on a daily basis. -Again, any feedback is appreciated. Please use the Edit button at the top of the +Again, any feedback is appreciated. Please use the Edit button at the bottom of the page to make a suggestion. _**Note!** It might be tempting to try to optimize Backstage usage and diff --git a/docs/releases/v1.12.0-next.2-changelog.md b/docs/releases/v1.12.0-next.2-changelog.md new file mode 100644 index 0000000000..7a64ec5f84 --- /dev/null +++ b/docs/releases/v1.12.0-next.2-changelog.md @@ -0,0 +1,1833 @@ +# Release v1.12.0-next.2 + +## @backstage/backend-tasks@0.5.0-next.2 + +### Minor Changes + +- 1578276708a: add functionality to get descriptions from the scheduler for triggering + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.3-next.2 + - @backstage/config@1.0.7-next.0 + +## @backstage/core-app-api@1.6.0-next.2 + +### Minor Changes + +- 456eaa8cf83: `OAuth2` now gets ID tokens from a session with the `openid` scope explicitly + requested. + + This should not be considered a breaking change, because spec-compliant OIDC + providers will already be returning ID tokens if and only if the `openid` scope + is granted. + + This change makes the dependence explicit, and removes the burden on + OAuth2-based providers which require an ID token (e.g. this is done by various + default [auth + handlers](https://backstage.io/docs/auth/identity-resolver/#authhandler)) to add + `openid` to their default scopes. _That_ could carry another indirect benefit: + by removing `openid` from the default scopes for a provider, grants for + resource-specific access tokens can avoid requesting excess ID token-related + scopes. + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.5.0-next.2 + - @backstage/config@1.0.7-next.0 + +## @backstage/core-plugin-api@1.5.0-next.2 + +### Minor Changes + +- ab750ddc4f2: The GitLab auth provider can now be used to get OpenID tokens. + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.0.7-next.0 + +## @backstage/plugin-catalog@1.9.0-next.2 + +### Minor Changes + +- 23cc40039c0: allow entity switch to render all cases that match the condition + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.5-next.2 + - @backstage/plugin-catalog-react@1.4.0-next.2 + - @backstage/plugin-search-react@1.5.1-next.2 + - @backstage/core-plugin-api@1.5.0-next.2 + - @backstage/integration-react@1.1.11-next.2 + +## @backstage/plugin-catalog-backend-module-puppetdb@0.1.0-next.0 + +### Minor Changes + +- a1efcf9a658: Initial version of the plugin. + +### Patch Changes + +- Updated dependencies + - @backstage/backend-tasks@0.5.0-next.2 + - @backstage/backend-common@0.18.3-next.2 + - @backstage/plugin-catalog-backend@1.8.0-next.2 + - @backstage/config@1.0.7-next.0 + +## @backstage/plugin-scaffolder@1.12.0-next.2 + +### Minor Changes + +- 0d61fcca9c3: Update `EntityPicker` to use the fully qualified entity ref instead of the humanized version. + +### Patch Changes + +- 65454876fb2: Minor API report tweaks +- 3c96e77b513: Make scaffolder adhere to page themes by using page `fontColor` consistently. If your theme overwrites template list or card headers, review those styles. +- 0aae4596296: Fix the scaffolder validator for arrays when the item is a field in the object +- Updated dependencies + - @backstage/core-components@0.12.5-next.2 + - @backstage/plugin-scaffolder-react@1.2.0-next.2 + - @backstage/plugin-catalog-react@1.4.0-next.2 + - @backstage/core-plugin-api@1.5.0-next.2 + - @backstage/integration-react@1.1.11-next.2 + - @backstage/plugin-permission-react@0.4.11-next.2 + - @backstage/config@1.0.7-next.0 + - @backstage/integration@1.4.3-next.0 + +## @backstage/app-defaults@1.2.1-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.5-next.2 + - @backstage/core-app-api@1.6.0-next.2 + - @backstage/core-plugin-api@1.5.0-next.2 + - @backstage/plugin-permission-react@0.4.11-next.2 + +## @backstage/backend-app-api@0.4.1-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.2.12-next.2 + - @backstage/backend-tasks@0.5.0-next.2 + - @backstage/backend-common@0.18.3-next.2 + - @backstage/backend-plugin-api@0.4.1-next.2 + - @backstage/plugin-permission-node@0.7.6-next.2 + - @backstage/config@1.0.7-next.0 + +## @backstage/backend-common@0.18.3-next.2 + +### Patch Changes + +- f75097868a7: Adds config option `backend.database.role` to set ownership for newly created schemas and tables in Postgres + + The example config below connects to the database as user `v-backstage-123` but sets the ownership of + the create schemas and tables to `backstage` + + ```yaml + backend: + database: + client: pg + pluginDivisionMode: schema + role: backstage + connection: + user: v-backstage-123 + ... + ``` + +- 87f0bbec175: AwsS3UrlReader upgraded to use aws-sdk v3 + +- Updated dependencies + - @backstage/backend-app-api@0.4.1-next.2 + - @backstage/backend-plugin-api@0.4.1-next.2 + - @backstage/config@1.0.7-next.0 + - @backstage/integration@1.4.3-next.0 + - @backstage/integration-aws-node@0.1.2-next.0 + +## @backstage/backend-defaults@0.1.8-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.3-next.2 + - @backstage/backend-app-api@0.4.1-next.2 + - @backstage/backend-plugin-api@0.4.1-next.2 + +## @backstage/backend-plugin-api@0.4.1-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.2.12-next.2 + - @backstage/backend-tasks@0.5.0-next.2 + - @backstage/config@1.0.7-next.0 + +## @backstage/backend-test-utils@0.1.35-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.2.12-next.2 + - @backstage/backend-common@0.18.3-next.2 + - @backstage/backend-app-api@0.4.1-next.2 + - @backstage/backend-plugin-api@0.4.1-next.2 + - @backstage/config@1.0.7-next.0 + +## @backstage/core-components@0.12.5-next.2 + +### Patch Changes + +- 8bbf95b5507: Button labels in the sidebar (previously displayed in uppercase) will be displayed in the case that is provided without any transformations. + For example, a sidebar button with the label "Search" will appear as Search, "search" will appear as search, "SEARCH" will appear as SEARCH etc. + This can potentially affect any overriding styles previously applied to change the appearance of Button labels in the Sidebar. +- fa004f66871: Use media queries to change layout instead of `isMobile` prop in `BackstagePage` component +- Updated dependencies + - @backstage/core-plugin-api@1.5.0-next.2 + - @backstage/config@1.0.7-next.0 + +## @backstage/create-app@0.4.38-next.2 + +### Patch Changes + +- Bumped create-app version. + +## @backstage/dev-utils@1.0.13-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.5-next.2 + - @backstage/plugin-catalog-react@1.4.0-next.2 + - @backstage/core-app-api@1.6.0-next.2 + - @backstage/core-plugin-api@1.5.0-next.2 + - @backstage/app-defaults@1.2.1-next.2 + - @backstage/integration-react@1.1.11-next.2 + - @backstage/test-utils@1.2.6-next.2 + +## @backstage/integration-react@1.1.11-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.5-next.2 + - @backstage/core-plugin-api@1.5.0-next.2 + - @backstage/config@1.0.7-next.0 + - @backstage/integration@1.4.3-next.0 + +## @techdocs/cli@1.4.0-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-techdocs-node@1.6.0-next.2 + - @backstage/backend-common@0.18.3-next.2 + - @backstage/config@1.0.7-next.0 + +## @backstage/test-utils@1.2.6-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-app-api@1.6.0-next.2 + - @backstage/core-plugin-api@1.5.0-next.2 + - @backstage/plugin-permission-react@0.4.11-next.2 + - @backstage/config@1.0.7-next.0 + +## @backstage/plugin-adr@0.4.1-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.5-next.2 + - @backstage/plugin-catalog-react@1.4.0-next.2 + - @backstage/plugin-search-react@1.5.1-next.2 + - @backstage/core-plugin-api@1.5.0-next.2 + - @backstage/integration-react@1.1.11-next.2 + +## @backstage/plugin-adr-backend@0.3.1-next.2 + +### Patch Changes + +- 2a73ded3861: Support MADR v3 format +- Updated dependencies + - @backstage/backend-common@0.18.3-next.2 + - @backstage/config@1.0.7-next.0 + - @backstage/integration@1.4.3-next.0 + +## @backstage/plugin-airbrake@0.3.16-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.5-next.2 + - @backstage/plugin-catalog-react@1.4.0-next.2 + - @backstage/core-plugin-api@1.5.0-next.2 + - @backstage/dev-utils@1.0.13-next.2 + - @backstage/test-utils@1.2.6-next.2 + +## @backstage/plugin-airbrake-backend@0.2.16-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.3-next.2 + - @backstage/config@1.0.7-next.0 + +## @backstage/plugin-allure@0.1.32-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.5-next.2 + - @backstage/plugin-catalog-react@1.4.0-next.2 + - @backstage/core-plugin-api@1.5.0-next.2 + +## @backstage/plugin-analytics-module-ga@0.1.27-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.5-next.2 + - @backstage/core-plugin-api@1.5.0-next.2 + - @backstage/config@1.0.7-next.0 + +## @backstage/plugin-apache-airflow@0.2.9-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.5-next.2 + - @backstage/core-plugin-api@1.5.0-next.2 + +## @backstage/plugin-api-docs@0.9.1-next.2 + +### Patch Changes + +- 8bc7dcec820: Fix dark theme Swagger's clear button font color. +- Updated dependencies + - @backstage/core-components@0.12.5-next.2 + - @backstage/plugin-catalog-react@1.4.0-next.2 + - @backstage/plugin-catalog@1.9.0-next.2 + - @backstage/core-plugin-api@1.5.0-next.2 + +## @backstage/plugin-apollo-explorer@0.1.9-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.5-next.2 + - @backstage/core-plugin-api@1.5.0-next.2 + +## @backstage/plugin-app-backend@0.3.43-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.3-next.2 + - @backstage/backend-plugin-api@0.4.1-next.2 + - @backstage/config@1.0.7-next.0 + +## @backstage/plugin-auth-backend@0.18.1-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.2.12-next.2 + - @backstage/backend-common@0.18.3-next.2 + - @backstage/config@1.0.7-next.0 + +## @backstage/plugin-auth-node@0.2.12-next.2 + +### Patch Changes + +- 65454876fb2: Minor API report tweaks +- Updated dependencies + - @backstage/backend-common@0.18.3-next.2 + - @backstage/config@1.0.7-next.0 + +## @backstage/plugin-azure-devops@0.2.7-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.5-next.2 + - @backstage/plugin-catalog-react@1.4.0-next.2 + - @backstage/core-plugin-api@1.5.0-next.2 + +## @backstage/plugin-azure-devops-backend@0.3.22-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.3-next.2 + - @backstage/config@1.0.7-next.0 + +## @backstage/plugin-azure-sites@0.1.5-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.5-next.2 + - @backstage/plugin-catalog-react@1.4.0-next.2 + - @backstage/core-plugin-api@1.5.0-next.2 + +## @backstage/plugin-azure-sites-backend@0.1.5-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.3-next.2 + - @backstage/config@1.0.7-next.0 + +## @backstage/plugin-badges@0.2.40-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.5-next.2 + - @backstage/plugin-catalog-react@1.4.0-next.2 + - @backstage/core-plugin-api@1.5.0-next.2 + +## @backstage/plugin-badges-backend@0.1.37-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.3-next.2 + - @backstage/config@1.0.7-next.0 + +## @backstage/plugin-bazaar@0.2.6-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.5-next.2 + - @backstage/plugin-catalog-react@1.4.0-next.2 + - @backstage/plugin-catalog@1.9.0-next.2 + - @backstage/core-plugin-api@1.5.0-next.2 + - @backstage/cli@0.22.4-next.1 + +## @backstage/plugin-bazaar-backend@0.2.6-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.2.12-next.2 + - @backstage/backend-common@0.18.3-next.2 + - @backstage/backend-plugin-api@0.4.1-next.2 + - @backstage/config@1.0.7-next.0 + +## @backstage/plugin-bitrise@0.1.43-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.5-next.2 + - @backstage/plugin-catalog-react@1.4.0-next.2 + - @backstage/core-plugin-api@1.5.0-next.2 + +## @backstage/plugin-catalog-backend@1.8.0-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.3-next.2 + - @backstage/backend-plugin-api@0.4.1-next.2 + - @backstage/plugin-permission-node@0.7.6-next.2 + - @backstage/plugin-catalog-node@1.3.4-next.2 + - @backstage/config@1.0.7-next.0 + - @backstage/integration@1.4.3-next.0 + +## @backstage/plugin-catalog-backend-module-aws@0.1.17-next.2 + +### Patch Changes + +- 87f0bbec175: AwsS3UrlReader upgraded to use aws-sdk v3 +- Updated dependencies + - @backstage/backend-tasks@0.5.0-next.2 + - @backstage/backend-common@0.18.3-next.2 + - @backstage/backend-plugin-api@0.4.1-next.2 + - @backstage/plugin-catalog-backend@1.8.0-next.2 + - @backstage/plugin-catalog-node@1.3.4-next.2 + - @backstage/config@1.0.7-next.0 + - @backstage/integration@1.4.3-next.0 + +## @backstage/plugin-catalog-backend-module-azure@0.1.14-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-tasks@0.5.0-next.2 + - @backstage/backend-common@0.18.3-next.2 + - @backstage/backend-plugin-api@0.4.1-next.2 + - @backstage/plugin-catalog-backend@1.8.0-next.2 + - @backstage/plugin-catalog-node@1.3.4-next.2 + - @backstage/config@1.0.7-next.0 + - @backstage/integration@1.4.3-next.0 + +## @backstage/plugin-catalog-backend-module-bitbucket@0.2.10-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.3-next.2 + - @backstage/plugin-catalog-backend@1.8.0-next.2 + - @backstage/config@1.0.7-next.0 + - @backstage/integration@1.4.3-next.0 + +## @backstage/plugin-catalog-backend-module-bitbucket-cloud@0.1.10-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-tasks@0.5.0-next.2 + - @backstage/backend-common@0.18.3-next.2 + - @backstage/backend-plugin-api@0.4.1-next.2 + - @backstage/plugin-catalog-backend@1.8.0-next.2 + - @backstage/plugin-catalog-node@1.3.4-next.2 + - @backstage/plugin-events-node@0.2.4-next.2 + - @backstage/config@1.0.7-next.0 + - @backstage/integration@1.4.3-next.0 + +## @backstage/plugin-catalog-backend-module-bitbucket-server@0.1.8-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-tasks@0.5.0-next.2 + - @backstage/backend-common@0.18.3-next.2 + - @backstage/backend-plugin-api@0.4.1-next.2 + - @backstage/plugin-catalog-backend@1.8.0-next.2 + - @backstage/plugin-catalog-node@1.3.4-next.2 + - @backstage/config@1.0.7-next.0 + - @backstage/integration@1.4.3-next.0 + +## @backstage/plugin-catalog-backend-module-gerrit@0.1.11-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-tasks@0.5.0-next.2 + - @backstage/backend-common@0.18.3-next.2 + - @backstage/backend-plugin-api@0.4.1-next.2 + - @backstage/plugin-catalog-backend@1.8.0-next.2 + - @backstage/plugin-catalog-node@1.3.4-next.2 + - @backstage/config@1.0.7-next.0 + - @backstage/integration@1.4.3-next.0 + +## @backstage/plugin-catalog-backend-module-github@0.2.6-next.2 + +### Patch Changes + +- 65454876fb2: Minor API report tweaks +- Updated dependencies + - @backstage/backend-tasks@0.5.0-next.2 + - @backstage/backend-common@0.18.3-next.2 + - @backstage/backend-plugin-api@0.4.1-next.2 + - @backstage/plugin-catalog-backend@1.8.0-next.2 + - @backstage/plugin-catalog-node@1.3.4-next.2 + - @backstage/plugin-events-node@0.2.4-next.2 + - @backstage/config@1.0.7-next.0 + - @backstage/integration@1.4.3-next.0 + +## @backstage/plugin-catalog-backend-module-gitlab@0.1.14-next.2 + +### Patch Changes + +- be129f8f3cd: filter gitlab groups by prefix +- Updated dependencies + - @backstage/backend-tasks@0.5.0-next.2 + - @backstage/backend-common@0.18.3-next.2 + - @backstage/backend-plugin-api@0.4.1-next.2 + - @backstage/plugin-catalog-backend@1.8.0-next.2 + - @backstage/plugin-catalog-node@1.3.4-next.2 + - @backstage/config@1.0.7-next.0 + - @backstage/integration@1.4.3-next.0 + +## @backstage/plugin-catalog-backend-module-incremental-ingestion@0.3.0-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-tasks@0.5.0-next.2 + - @backstage/backend-common@0.18.3-next.2 + - @backstage/backend-plugin-api@0.4.1-next.2 + - @backstage/plugin-catalog-backend@1.8.0-next.2 + - @backstage/plugin-catalog-node@1.3.4-next.2 + - @backstage/plugin-events-node@0.2.4-next.2 + - @backstage/config@1.0.7-next.0 + +## @backstage/plugin-catalog-backend-module-ldap@0.5.10-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-tasks@0.5.0-next.2 + - @backstage/plugin-catalog-backend@1.8.0-next.2 + - @backstage/config@1.0.7-next.0 + +## @backstage/plugin-catalog-backend-module-msgraph@0.5.2-next.2 + +### Patch Changes + +- 26eef93c547: Fixed msgraph catalog backend to use user.select option when fetching user from AzureAD +- Updated dependencies + - @backstage/backend-tasks@0.5.0-next.2 + - @backstage/backend-common@0.18.3-next.2 + - @backstage/backend-plugin-api@0.4.1-next.2 + - @backstage/plugin-catalog-backend@1.8.0-next.2 + - @backstage/plugin-catalog-node@1.3.4-next.2 + - @backstage/config@1.0.7-next.0 + +## @backstage/plugin-catalog-backend-module-openapi@0.1.9-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.3-next.2 + - @backstage/plugin-catalog-backend@1.8.0-next.2 + - @backstage/plugin-catalog-node@1.3.4-next.2 + - @backstage/config@1.0.7-next.0 + - @backstage/integration@1.4.3-next.0 + +## @backstage/plugin-catalog-graph@0.2.28-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.5-next.2 + - @backstage/plugin-catalog-react@1.4.0-next.2 + - @backstage/core-plugin-api@1.5.0-next.2 + +## @backstage/plugin-catalog-import@0.9.6-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.5-next.2 + - @backstage/plugin-catalog-react@1.4.0-next.2 + - @backstage/core-plugin-api@1.5.0-next.2 + - @backstage/integration-react@1.1.11-next.2 + - @backstage/config@1.0.7-next.0 + - @backstage/integration@1.4.3-next.0 + +## @backstage/plugin-catalog-node@1.3.4-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.4.1-next.2 + +## @backstage/plugin-catalog-react@1.4.0-next.2 + +### Patch Changes + +- 65454876fb2: Minor API report tweaks +- Updated dependencies + - @backstage/core-components@0.12.5-next.2 + - @backstage/core-plugin-api@1.5.0-next.2 + - @backstage/plugin-permission-react@0.4.11-next.2 + - @backstage/integration@1.4.3-next.0 + +## @backstage/plugin-cicd-statistics@0.1.18-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.4.0-next.2 + - @backstage/core-plugin-api@1.5.0-next.2 + +## @backstage/plugin-cicd-statistics-module-gitlab@0.1.12-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.5.0-next.2 + - @backstage/plugin-cicd-statistics@0.1.18-next.2 + +## @backstage/plugin-circleci@0.3.16-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.5-next.2 + - @backstage/plugin-catalog-react@1.4.0-next.2 + - @backstage/core-plugin-api@1.5.0-next.2 + +## @backstage/plugin-cloudbuild@0.3.16-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.5-next.2 + - @backstage/plugin-catalog-react@1.4.0-next.2 + - @backstage/core-plugin-api@1.5.0-next.2 + +## @backstage/plugin-code-climate@0.1.16-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.5-next.2 + - @backstage/plugin-catalog-react@1.4.0-next.2 + - @backstage/core-plugin-api@1.5.0-next.2 + +## @backstage/plugin-code-coverage@0.2.9-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.5-next.2 + - @backstage/plugin-catalog-react@1.4.0-next.2 + - @backstage/core-plugin-api@1.5.0-next.2 + - @backstage/config@1.0.7-next.0 + +## @backstage/plugin-code-coverage-backend@0.2.9-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.3-next.2 + - @backstage/config@1.0.7-next.0 + - @backstage/integration@1.4.3-next.0 + +## @backstage/plugin-codescene@0.1.11-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.5-next.2 + - @backstage/core-plugin-api@1.5.0-next.2 + - @backstage/config@1.0.7-next.0 + +## @backstage/plugin-config-schema@0.1.39-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.5-next.2 + - @backstage/core-plugin-api@1.5.0-next.2 + - @backstage/config@1.0.7-next.0 + +## @backstage/plugin-cost-insights@0.12.5-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.5-next.2 + - @backstage/plugin-catalog-react@1.4.0-next.2 + - @backstage/core-plugin-api@1.5.0-next.2 + - @backstage/config@1.0.7-next.0 + +## @backstage/plugin-dynatrace@3.0.0-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.5-next.2 + - @backstage/plugin-catalog-react@1.4.0-next.2 + - @backstage/core-plugin-api@1.5.0-next.2 + +## @backstage/plugin-entity-feedback@0.1.1-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.5-next.2 + - @backstage/plugin-catalog-react@1.4.0-next.2 + - @backstage/core-plugin-api@1.5.0-next.2 + +## @backstage/plugin-entity-feedback-backend@0.1.1-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.2.12-next.2 + - @backstage/backend-common@0.18.3-next.2 + - @backstage/config@1.0.7-next.0 + +## @backstage/plugin-entity-validation@0.1.1-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.5-next.2 + - @backstage/plugin-catalog-react@1.4.0-next.2 + - @backstage/core-plugin-api@1.5.0-next.2 + +## @backstage/plugin-events-backend@0.2.4-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.3-next.2 + - @backstage/backend-plugin-api@0.4.1-next.2 + - @backstage/plugin-events-node@0.2.4-next.2 + - @backstage/config@1.0.7-next.0 + +## @backstage/plugin-events-backend-module-aws-sqs@0.1.5-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-tasks@0.5.0-next.2 + - @backstage/backend-common@0.18.3-next.2 + - @backstage/backend-plugin-api@0.4.1-next.2 + - @backstage/plugin-events-node@0.2.4-next.2 + - @backstage/config@1.0.7-next.0 + +## @backstage/plugin-events-backend-module-azure@0.1.5-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.4.1-next.2 + - @backstage/plugin-events-node@0.2.4-next.2 + +## @backstage/plugin-events-backend-module-bitbucket-cloud@0.1.5-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.4.1-next.2 + - @backstage/plugin-events-node@0.2.4-next.2 + +## @backstage/plugin-events-backend-module-gerrit@0.1.5-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.4.1-next.2 + - @backstage/plugin-events-node@0.2.4-next.2 + +## @backstage/plugin-events-backend-module-github@0.1.5-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.4.1-next.2 + - @backstage/plugin-events-node@0.2.4-next.2 + - @backstage/config@1.0.7-next.0 + +## @backstage/plugin-events-backend-module-gitlab@0.1.5-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.4.1-next.2 + - @backstage/plugin-events-node@0.2.4-next.2 + - @backstage/config@1.0.7-next.0 + +## @backstage/plugin-events-backend-test-utils@0.1.5-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-events-node@0.2.4-next.2 + +## @backstage/plugin-events-node@0.2.4-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.4.1-next.2 + +## @backstage/plugin-explore@0.4.1-next.2 + +### Patch Changes + +- 65454876fb2: Minor API report tweaks +- Updated dependencies + - @backstage/core-components@0.12.5-next.2 + - @backstage/plugin-catalog-react@1.4.0-next.2 + - @backstage/plugin-search-react@1.5.1-next.2 + - @backstage/core-plugin-api@1.5.0-next.2 + - @backstage/plugin-explore-react@0.0.27-next.2 + +## @backstage/plugin-explore-backend@0.0.5-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.3-next.2 + - @backstage/config@1.0.7-next.0 + +## @backstage/plugin-explore-react@0.0.27-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.5.0-next.2 + +## @backstage/plugin-firehydrant@0.1.33-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.5-next.2 + - @backstage/plugin-catalog-react@1.4.0-next.2 + - @backstage/core-plugin-api@1.5.0-next.2 + +## @backstage/plugin-fossa@0.2.48-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.5-next.2 + - @backstage/plugin-catalog-react@1.4.0-next.2 + - @backstage/core-plugin-api@1.5.0-next.2 + +## @backstage/plugin-gcalendar@0.3.12-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.5-next.2 + - @backstage/core-plugin-api@1.5.0-next.2 + +## @backstage/plugin-gcp-projects@0.3.35-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.5-next.2 + - @backstage/core-plugin-api@1.5.0-next.2 + +## @backstage/plugin-git-release-manager@0.3.29-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.5-next.2 + - @backstage/core-plugin-api@1.5.0-next.2 + - @backstage/integration@1.4.3-next.0 + +## @backstage/plugin-github-actions@0.5.16-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.5-next.2 + - @backstage/plugin-catalog-react@1.4.0-next.2 + - @backstage/core-plugin-api@1.5.0-next.2 + - @backstage/integration@1.4.3-next.0 + +## @backstage/plugin-github-deployments@0.1.47-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.5-next.2 + - @backstage/plugin-catalog-react@1.4.0-next.2 + - @backstage/core-plugin-api@1.5.0-next.2 + - @backstage/integration-react@1.1.11-next.2 + - @backstage/integration@1.4.3-next.0 + +## @backstage/plugin-github-issues@0.2.5-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.5-next.2 + - @backstage/plugin-catalog-react@1.4.0-next.2 + - @backstage/core-plugin-api@1.5.0-next.2 + - @backstage/integration@1.4.3-next.0 + +## @backstage/plugin-github-pull-requests-board@0.1.10-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.5-next.2 + - @backstage/plugin-catalog-react@1.4.0-next.2 + - @backstage/core-plugin-api@1.5.0-next.2 + - @backstage/integration@1.4.3-next.0 + +## @backstage/plugin-gitops-profiles@0.3.34-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.5-next.2 + - @backstage/core-plugin-api@1.5.0-next.2 + +## @backstage/plugin-gocd@0.1.22-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.5-next.2 + - @backstage/plugin-catalog-react@1.4.0-next.2 + - @backstage/core-plugin-api@1.5.0-next.2 + +## @backstage/plugin-graphiql@0.2.48-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.5-next.2 + - @backstage/core-plugin-api@1.5.0-next.2 + +## @backstage/plugin-graphql-backend@0.1.33-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.3-next.2 + - @backstage/config@1.0.7-next.0 + - @backstage/plugin-catalog-graphql@0.3.19-next.1 + +## @backstage/plugin-graphql-voyager@0.1.1-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.5-next.2 + - @backstage/core-plugin-api@1.5.0-next.2 + +## @backstage/plugin-home@0.4.32-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.5-next.2 + - @backstage/plugin-catalog-react@1.4.0-next.2 + - @backstage/core-plugin-api@1.5.0-next.2 + - @backstage/config@1.0.7-next.0 + +## @backstage/plugin-ilert@0.2.5-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.5-next.2 + - @backstage/plugin-catalog-react@1.4.0-next.2 + - @backstage/core-plugin-api@1.5.0-next.2 + +## @backstage/plugin-jenkins@0.7.15-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.5-next.2 + - @backstage/plugin-catalog-react@1.4.0-next.2 + - @backstage/core-plugin-api@1.5.0-next.2 + +## @backstage/plugin-jenkins-backend@0.1.33-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.2.12-next.2 + - @backstage/backend-common@0.18.3-next.2 + - @backstage/config@1.0.7-next.0 + +## @backstage/plugin-kafka@0.3.16-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.5-next.2 + - @backstage/plugin-catalog-react@1.4.0-next.2 + - @backstage/core-plugin-api@1.5.0-next.2 + - @backstage/config@1.0.7-next.0 + +## @backstage/plugin-kafka-backend@0.2.36-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.3-next.2 + - @backstage/backend-plugin-api@0.4.1-next.2 + - @backstage/config@1.0.7-next.0 + +## @backstage/plugin-kubernetes@0.7.9-next.2 + +### Patch Changes + +- 8adeb19b37d: GitLab can now be used as an `oidcTokenProvider` for Kubernetes clusters +- Updated dependencies + - @backstage/core-components@0.12.5-next.2 + - @backstage/plugin-catalog-react@1.4.0-next.2 + - @backstage/core-plugin-api@1.5.0-next.2 + - @backstage/config@1.0.7-next.0 + +## @backstage/plugin-kubernetes-backend@0.9.4-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.2.12-next.2 + - @backstage/backend-common@0.18.3-next.2 + - @backstage/config@1.0.7-next.0 + +## @backstage/plugin-lighthouse@0.4.1-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.5-next.2 + - @backstage/plugin-catalog-react@1.4.0-next.2 + - @backstage/core-plugin-api@1.5.0-next.2 + - @backstage/config@1.0.7-next.0 + +## @backstage/plugin-lighthouse-backend@0.1.1-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-tasks@0.5.0-next.2 + - @backstage/backend-common@0.18.3-next.2 + - @backstage/config@1.0.7-next.0 + +## @backstage/plugin-linguist@0.1.1-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.5-next.2 + - @backstage/plugin-catalog-react@1.4.0-next.2 + - @backstage/core-plugin-api@1.5.0-next.2 + +## @backstage/plugin-linguist-backend@0.2.0-next.2 + +### Patch Changes + +- 8a298b47240: Added support for linguist-js options using the linguistJSOptions in the plugin, the available config can be found [here](https://www.npmjs.com/package/linguist-js#API). +- Updated dependencies + - @backstage/plugin-auth-node@0.2.12-next.2 + - @backstage/backend-tasks@0.5.0-next.2 + - @backstage/backend-common@0.18.3-next.2 + - @backstage/config@1.0.7-next.0 + +## @backstage/plugin-microsoft-calendar@0.1.1-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.5-next.2 + - @backstage/core-plugin-api@1.5.0-next.2 + +## @backstage/plugin-newrelic@0.3.34-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.5-next.2 + - @backstage/core-plugin-api@1.5.0-next.2 + +## @backstage/plugin-newrelic-dashboard@0.2.9-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.5-next.2 + - @backstage/plugin-catalog-react@1.4.0-next.2 + - @backstage/core-plugin-api@1.5.0-next.2 + +## @backstage/plugin-octopus-deploy@0.1.0-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.5-next.2 + - @backstage/plugin-catalog-react@1.4.0-next.2 + - @backstage/core-plugin-api@1.5.0-next.2 + +## @backstage/plugin-org@0.6.6-next.2 + +### Patch Changes + +- a06fcac4040: Add styling to the `MembersListCard` and `ComponentsGrid` to handle overflow text. +- Updated dependencies + - @backstage/core-components@0.12.5-next.2 + - @backstage/plugin-catalog-react@1.4.0-next.2 + - @backstage/core-plugin-api@1.5.0-next.2 + +## @backstage/plugin-org-react@0.1.5-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.5-next.2 + - @backstage/plugin-catalog-react@1.4.0-next.2 + - @backstage/core-plugin-api@1.5.0-next.2 + +## @backstage/plugin-pagerduty@0.5.9-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.5-next.2 + - @backstage/plugin-catalog-react@1.4.0-next.2 + - @backstage/core-plugin-api@1.5.0-next.2 + +## @backstage/plugin-periskop@0.1.14-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.5-next.2 + - @backstage/plugin-catalog-react@1.4.0-next.2 + - @backstage/core-plugin-api@1.5.0-next.2 + +## @backstage/plugin-periskop-backend@0.1.14-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.3-next.2 + - @backstage/backend-plugin-api@0.4.1-next.2 + - @backstage/config@1.0.7-next.0 + +## @backstage/plugin-permission-backend@0.5.18-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.2.12-next.2 + - @backstage/backend-common@0.18.3-next.2 + - @backstage/plugin-permission-node@0.7.6-next.2 + - @backstage/config@1.0.7-next.0 + +## @backstage/plugin-permission-node@0.7.6-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.2.12-next.2 + - @backstage/backend-common@0.18.3-next.2 + - @backstage/config@1.0.7-next.0 + +## @backstage/plugin-permission-react@0.4.11-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.5.0-next.2 + - @backstage/config@1.0.7-next.0 + +## @backstage/plugin-playlist@0.1.7-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.5-next.2 + - @backstage/plugin-catalog-react@1.4.0-next.2 + - @backstage/plugin-search-react@1.5.1-next.2 + - @backstage/core-plugin-api@1.5.0-next.2 + - @backstage/plugin-permission-react@0.4.11-next.2 + +## @backstage/plugin-playlist-backend@0.2.6-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.2.12-next.2 + - @backstage/backend-common@0.18.3-next.2 + - @backstage/plugin-permission-node@0.7.6-next.2 + - @backstage/config@1.0.7-next.0 + +## @backstage/plugin-proxy-backend@0.2.37-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.3-next.2 + - @backstage/backend-plugin-api@0.4.1-next.2 + - @backstage/config@1.0.7-next.0 + +## @backstage/plugin-rollbar@0.4.16-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.5-next.2 + - @backstage/plugin-catalog-react@1.4.0-next.2 + - @backstage/core-plugin-api@1.5.0-next.2 + +## @backstage/plugin-rollbar-backend@0.1.40-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.3-next.2 + - @backstage/config@1.0.7-next.0 + +## @backstage/plugin-scaffolder-backend@1.12.0-next.2 + +### Patch Changes + +- 860de10fa67: Make identity valid if subject of token is a backstage server-2-server auth token +- 65454876fb2: Minor API report tweaks +- 9968f455921: catalog write action should allow any shape of object +- Updated dependencies + - @backstage/plugin-auth-node@0.2.12-next.2 + - @backstage/backend-tasks@0.5.0-next.2 + - @backstage/backend-common@0.18.3-next.2 + - @backstage/backend-plugin-api@0.4.1-next.2 + - @backstage/plugin-catalog-backend@1.8.0-next.2 + - @backstage/plugin-catalog-node@1.3.4-next.2 + - @backstage/plugin-scaffolder-node@0.1.1-next.2 + - @backstage/config@1.0.7-next.0 + - @backstage/integration@1.4.3-next.0 + +## @backstage/plugin-scaffolder-backend-module-cookiecutter@0.2.18-next.2 + +### Patch Changes + +- 62414770ead: allow container runner to be undefined in cookiecutter plugin +- Updated dependencies + - @backstage/plugin-scaffolder-backend@1.12.0-next.2 + - @backstage/backend-common@0.18.3-next.2 + - @backstage/plugin-scaffolder-node@0.1.1-next.2 + - @backstage/config@1.0.7-next.0 + - @backstage/integration@1.4.3-next.0 + +## @backstage/plugin-scaffolder-backend-module-rails@0.4.11-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-backend@1.12.0-next.2 + - @backstage/backend-common@0.18.3-next.2 + - @backstage/plugin-scaffolder-node@0.1.1-next.2 + - @backstage/config@1.0.7-next.0 + - @backstage/integration@1.4.3-next.0 + +## @backstage/plugin-scaffolder-backend-module-sentry@0.1.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-node@0.1.1-next.2 + - @backstage/config@1.0.7-next.0 + +## @backstage/plugin-scaffolder-backend-module-yeoman@0.2.16-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-node@0.1.1-next.2 + - @backstage/config@1.0.7-next.0 + +## @backstage/plugin-scaffolder-node@0.1.1-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.4.1-next.2 + +## @backstage/plugin-scaffolder-react@1.2.0-next.2 + +### Patch Changes + +- 65454876fb2: Minor API report tweaks +- 3c96e77b513: Make scaffolder adhere to page themes by using page `fontColor` consistently. If your theme overwrites template list or card headers, review those styles. +- d9893263ba9: scaffolder/next: Fix for steps without properties +- Updated dependencies + - @backstage/core-components@0.12.5-next.2 + - @backstage/plugin-catalog-react@1.4.0-next.2 + - @backstage/core-plugin-api@1.5.0-next.2 + +## @backstage/plugin-search@1.1.1-next.2 + +### Patch Changes + +- 65454876fb2: Minor API report tweaks +- Updated dependencies + - @backstage/core-components@0.12.5-next.2 + - @backstage/plugin-catalog-react@1.4.0-next.2 + - @backstage/plugin-search-react@1.5.1-next.2 + - @backstage/core-plugin-api@1.5.0-next.2 + - @backstage/config@1.0.7-next.0 + +## @backstage/plugin-search-backend@1.2.4-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.2.12-next.2 + - @backstage/backend-common@0.18.3-next.2 + - @backstage/plugin-permission-node@0.7.6-next.2 + - @backstage/plugin-search-backend-node@1.1.4-next.2 + - @backstage/config@1.0.7-next.0 + +## @backstage/plugin-search-backend-module-elasticsearch@1.1.4-next.2 + +### Patch Changes + +- 65454876fb2: Minor API report tweaks +- Updated dependencies + - @backstage/plugin-search-backend-node@1.1.4-next.2 + - @backstage/config@1.0.7-next.0 + +## @backstage/plugin-search-backend-module-pg@0.5.4-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.3-next.2 + - @backstage/plugin-search-backend-node@1.1.4-next.2 + - @backstage/config@1.0.7-next.0 + +## @backstage/plugin-search-backend-node@1.1.4-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-tasks@0.5.0-next.2 + - @backstage/backend-common@0.18.3-next.2 + - @backstage/config@1.0.7-next.0 + +## @backstage/plugin-search-react@1.5.1-next.2 + +### Patch Changes + +- 65454876fb2: Minor API report tweaks +- 553f3c95011: Correctly disable next button in `SearchPagination` on last page +- Updated dependencies + - @backstage/core-components@0.12.5-next.2 + - @backstage/core-plugin-api@1.5.0-next.2 + +## @backstage/plugin-sentry@0.5.1-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.5-next.2 + - @backstage/plugin-catalog-react@1.4.0-next.2 + - @backstage/core-plugin-api@1.5.0-next.2 + +## @backstage/plugin-shortcuts@0.3.8-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.5-next.2 + - @backstage/core-plugin-api@1.5.0-next.2 + +## @backstage/plugin-sonarqube@0.6.5-next.2 + +### Patch Changes + +- 65454876fb2: Minor API report tweaks +- Updated dependencies + - @backstage/core-components@0.12.5-next.2 + - @backstage/plugin-catalog-react@1.4.0-next.2 + - @backstage/core-plugin-api@1.5.0-next.2 + - @backstage/plugin-sonarqube-react@0.1.4-next.2 + +## @backstage/plugin-sonarqube-backend@0.1.8-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.3-next.2 + - @backstage/config@1.0.7-next.0 + +## @backstage/plugin-sonarqube-react@0.1.4-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.5.0-next.2 + +## @backstage/plugin-splunk-on-call@0.4.5-next.2 + +### Patch Changes + +- 65454876fb2: Minor API report tweaks +- Updated dependencies + - @backstage/core-components@0.12.5-next.2 + - @backstage/plugin-catalog-react@1.4.0-next.2 + - @backstage/core-plugin-api@1.5.0-next.2 + +## @backstage/plugin-stack-overflow@0.1.12-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.5-next.2 + - @backstage/plugin-search-react@1.5.1-next.2 + - @backstage/core-plugin-api@1.5.0-next.2 + - @backstage/plugin-home@0.4.32-next.2 + - @backstage/config@1.0.7-next.0 + +## @backstage/plugin-stack-overflow-backend@0.1.12-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.3-next.2 + - @backstage/config@1.0.7-next.0 + +## @backstage/plugin-stackstorm@0.1.0-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.5-next.2 + - @backstage/core-plugin-api@1.5.0-next.2 + +## @backstage/plugin-tech-insights@0.3.8-next.2 + +### Patch Changes + +- 65454876fb2: Minor API report tweaks +- Updated dependencies + - @backstage/core-components@0.12.5-next.2 + - @backstage/plugin-catalog-react@1.4.0-next.2 + - @backstage/core-plugin-api@1.5.0-next.2 + +## @backstage/plugin-tech-insights-backend@0.5.9-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-tasks@0.5.0-next.2 + - @backstage/backend-common@0.18.3-next.2 + - @backstage/plugin-tech-insights-node@0.4.1-next.2 + - @backstage/config@1.0.7-next.0 + +## @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.27-next.2 + +### Patch Changes + +- 65454876fb2: Minor API report tweaks +- Updated dependencies + - @backstage/backend-common@0.18.3-next.2 + - @backstage/plugin-tech-insights-node@0.4.1-next.2 + - @backstage/config@1.0.7-next.0 + +## @backstage/plugin-tech-insights-node@0.4.1-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-tasks@0.5.0-next.2 + - @backstage/backend-common@0.18.3-next.2 + - @backstage/config@1.0.7-next.0 + +## @backstage/plugin-tech-radar@0.6.2-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.5-next.2 + - @backstage/core-plugin-api@1.5.0-next.2 + +## @backstage/plugin-techdocs@1.6.0-next.2 + +### Patch Changes + +- 65454876fb2: Minor API report tweaks +- Updated dependencies + - @backstage/core-components@0.12.5-next.2 + - @backstage/plugin-techdocs-react@1.1.4-next.2 + - @backstage/plugin-catalog-react@1.4.0-next.2 + - @backstage/plugin-search-react@1.5.1-next.2 + - @backstage/core-plugin-api@1.5.0-next.2 + - @backstage/integration-react@1.1.11-next.2 + - @backstage/config@1.0.7-next.0 + - @backstage/integration@1.4.3-next.0 + +## @backstage/plugin-techdocs-addons-test-utils@1.0.11-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.5-next.2 + - @backstage/plugin-techdocs-react@1.1.4-next.2 + - @backstage/plugin-search-react@1.5.1-next.2 + - @backstage/plugin-techdocs@1.6.0-next.2 + - @backstage/core-app-api@1.6.0-next.2 + - @backstage/plugin-catalog@1.9.0-next.2 + - @backstage/core-plugin-api@1.5.0-next.2 + - @backstage/integration-react@1.1.11-next.2 + - @backstage/test-utils@1.2.6-next.2 + +## @backstage/plugin-techdocs-backend@1.5.4-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-techdocs-node@1.6.0-next.2 + - @backstage/backend-common@0.18.3-next.2 + - @backstage/config@1.0.7-next.0 + - @backstage/integration@1.4.3-next.0 + +## @backstage/plugin-techdocs-module-addons-contrib@1.0.11-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.5-next.2 + - @backstage/plugin-techdocs-react@1.1.4-next.2 + - @backstage/core-plugin-api@1.5.0-next.2 + - @backstage/integration-react@1.1.11-next.2 + - @backstage/integration@1.4.3-next.0 + +## @backstage/plugin-techdocs-node@1.6.0-next.2 + +### Patch Changes + +- 65454876fb2: Minor API report tweaks +- Updated dependencies + - @backstage/backend-common@0.18.3-next.2 + - @backstage/config@1.0.7-next.0 + - @backstage/integration@1.4.3-next.0 + - @backstage/integration-aws-node@0.1.2-next.0 + +## @backstage/plugin-techdocs-react@1.1.4-next.2 + +### Patch Changes + +- 65454876fb2: Minor API report tweaks +- Updated dependencies + - @backstage/core-components@0.12.5-next.2 + - @backstage/core-plugin-api@1.5.0-next.2 + - @backstage/config@1.0.7-next.0 + +## @backstage/plugin-todo@0.2.18-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.5-next.2 + - @backstage/plugin-catalog-react@1.4.0-next.2 + - @backstage/core-plugin-api@1.5.0-next.2 + +## @backstage/plugin-todo-backend@0.1.40-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.3-next.2 + - @backstage/backend-plugin-api@0.4.1-next.2 + - @backstage/plugin-catalog-node@1.3.4-next.2 + - @backstage/config@1.0.7-next.0 + - @backstage/integration@1.4.3-next.0 + +## @backstage/plugin-user-settings@0.7.1-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.5-next.2 + - @backstage/plugin-catalog-react@1.4.0-next.2 + - @backstage/core-app-api@1.6.0-next.2 + - @backstage/core-plugin-api@1.5.0-next.2 + +## @backstage/plugin-user-settings-backend@0.1.7-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.2.12-next.2 + - @backstage/backend-common@0.18.3-next.2 + - @backstage/backend-plugin-api@0.4.1-next.2 + +## @backstage/plugin-vault@0.1.10-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.5-next.2 + - @backstage/plugin-catalog-react@1.4.0-next.2 + - @backstage/core-plugin-api@1.5.0-next.2 + +## @backstage/plugin-vault-backend@0.2.10-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-tasks@0.5.0-next.2 + - @backstage/backend-common@0.18.3-next.2 + - @backstage/config@1.0.7-next.0 + +## @backstage/plugin-xcmetrics@0.2.36-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.5-next.2 + - @backstage/core-plugin-api@1.5.0-next.2 + +## example-app@0.2.81-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.5-next.2 + - @backstage/plugin-scaffolder-react@1.2.0-next.2 + - @backstage/plugin-techdocs-react@1.1.4-next.2 + - @backstage/plugin-catalog-react@1.4.0-next.2 + - @backstage/plugin-tech-insights@0.3.8-next.2 + - @backstage/plugin-search-react@1.5.1-next.2 + - @backstage/plugin-scaffolder@1.12.0-next.2 + - @backstage/plugin-techdocs@1.6.0-next.2 + - @backstage/plugin-explore@0.4.1-next.2 + - @backstage/plugin-search@1.1.1-next.2 + - @backstage/plugin-kubernetes@0.7.9-next.2 + - @backstage/plugin-api-docs@0.9.1-next.2 + - @backstage/core-app-api@1.6.0-next.2 + - @backstage/plugin-org@0.6.6-next.2 + - @backstage/core-plugin-api@1.5.0-next.2 + - @backstage/app-defaults@1.2.1-next.2 + - @backstage/cli@0.22.4-next.1 + - @backstage/integration-react@1.1.11-next.2 + - @backstage/plugin-airbrake@0.3.16-next.2 + - @backstage/plugin-apache-airflow@0.2.9-next.2 + - @backstage/plugin-azure-devops@0.2.7-next.2 + - @backstage/plugin-azure-sites@0.1.5-next.2 + - @backstage/plugin-badges@0.2.40-next.2 + - @backstage/plugin-catalog-graph@0.2.28-next.2 + - @backstage/plugin-catalog-import@0.9.6-next.2 + - @backstage/plugin-circleci@0.3.16-next.2 + - @backstage/plugin-cloudbuild@0.3.16-next.2 + - @backstage/plugin-code-coverage@0.2.9-next.2 + - @backstage/plugin-cost-insights@0.12.5-next.2 + - @backstage/plugin-dynatrace@3.0.0-next.2 + - @backstage/plugin-entity-feedback@0.1.1-next.2 + - @backstage/plugin-gcalendar@0.3.12-next.2 + - @backstage/plugin-gcp-projects@0.3.35-next.2 + - @backstage/plugin-github-actions@0.5.16-next.2 + - @backstage/plugin-gocd@0.1.22-next.2 + - @backstage/plugin-graphiql@0.2.48-next.2 + - @backstage/plugin-home@0.4.32-next.2 + - @backstage/plugin-jenkins@0.7.15-next.2 + - @backstage/plugin-kafka@0.3.16-next.2 + - @backstage/plugin-lighthouse@0.4.1-next.2 + - @backstage/plugin-linguist@0.1.1-next.2 + - @backstage/plugin-microsoft-calendar@0.1.1-next.2 + - @backstage/plugin-newrelic@0.3.34-next.2 + - @backstage/plugin-newrelic-dashboard@0.2.9-next.2 + - @backstage/plugin-pagerduty@0.5.9-next.2 + - @backstage/plugin-playlist@0.1.7-next.2 + - @backstage/plugin-rollbar@0.4.16-next.2 + - @backstage/plugin-sentry@0.5.1-next.2 + - @backstage/plugin-shortcuts@0.3.8-next.2 + - @backstage/plugin-stack-overflow@0.1.12-next.2 + - @backstage/plugin-stackstorm@0.1.0-next.2 + - @backstage/plugin-tech-radar@0.6.2-next.2 + - @backstage/plugin-techdocs-module-addons-contrib@1.0.11-next.2 + - @backstage/plugin-todo@0.2.18-next.2 + - @backstage/plugin-user-settings@0.7.1-next.2 + - @internal/plugin-catalog-customized@0.0.8-next.2 + - @backstage/plugin-permission-react@0.4.11-next.2 + - @backstage/config@1.0.7-next.0 + +## example-backend@0.2.81-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-backend@1.12.0-next.2 + - @backstage/plugin-search-backend-module-elasticsearch@1.1.4-next.2 + - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.27-next.2 + - @backstage/plugin-auth-node@0.2.12-next.2 + - @backstage/backend-tasks@0.5.0-next.2 + - @backstage/plugin-adr-backend@0.3.1-next.2 + - @backstage/backend-common@0.18.3-next.2 + - @backstage/plugin-linguist-backend@0.2.0-next.2 + - @backstage/plugin-scaffolder-backend-module-rails@0.4.11-next.2 + - example-app@0.2.81-next.2 + - @backstage/plugin-techdocs-backend@1.5.4-next.2 + - @backstage/plugin-auth-backend@0.18.1-next.2 + - @backstage/plugin-entity-feedback-backend@0.1.1-next.2 + - @backstage/plugin-jenkins-backend@0.1.33-next.2 + - @backstage/plugin-kubernetes-backend@0.9.4-next.2 + - @backstage/plugin-permission-backend@0.5.18-next.2 + - @backstage/plugin-permission-node@0.7.6-next.2 + - @backstage/plugin-playlist-backend@0.2.6-next.2 + - @backstage/plugin-search-backend@1.2.4-next.2 + - @backstage/plugin-lighthouse-backend@0.1.1-next.2 + - @backstage/plugin-search-backend-node@1.1.4-next.2 + - @backstage/plugin-tech-insights-backend@0.5.9-next.2 + - @backstage/plugin-tech-insights-node@0.4.1-next.2 + - @backstage/plugin-app-backend@0.3.43-next.2 + - @backstage/plugin-azure-devops-backend@0.3.22-next.2 + - @backstage/plugin-azure-sites-backend@0.1.5-next.2 + - @backstage/plugin-badges-backend@0.1.37-next.2 + - @backstage/plugin-catalog-backend@1.8.0-next.2 + - @backstage/plugin-catalog-node@1.3.4-next.2 + - @backstage/plugin-code-coverage-backend@0.2.9-next.2 + - @backstage/plugin-events-backend@0.2.4-next.2 + - @backstage/plugin-explore-backend@0.0.5-next.2 + - @backstage/plugin-graphql-backend@0.1.33-next.2 + - @backstage/plugin-kafka-backend@0.2.36-next.2 + - @backstage/plugin-proxy-backend@0.2.37-next.2 + - @backstage/plugin-rollbar-backend@0.1.40-next.2 + - @backstage/plugin-search-backend-module-pg@0.5.4-next.2 + - @backstage/plugin-todo-backend@0.1.40-next.2 + - @backstage/plugin-events-node@0.2.4-next.2 + - @backstage/config@1.0.7-next.0 + - @backstage/integration@1.4.3-next.0 + +## example-backend-next@0.0.9-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-backend@1.12.0-next.2 + - @backstage/backend-defaults@0.1.8-next.2 + - @backstage/plugin-app-backend@0.3.43-next.2 + - @backstage/plugin-catalog-backend@1.8.0-next.2 + - @backstage/plugin-todo-backend@0.1.40-next.2 + +## e2e-test@0.2.1-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/create-app@0.4.38-next.2 + +## techdocs-cli-embedded-app@0.2.80-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.5-next.2 + - @backstage/plugin-techdocs-react@1.1.4-next.2 + - @backstage/plugin-techdocs@1.6.0-next.2 + - @backstage/core-app-api@1.6.0-next.2 + - @backstage/plugin-catalog@1.9.0-next.2 + - @backstage/core-plugin-api@1.5.0-next.2 + - @backstage/app-defaults@1.2.1-next.2 + - @backstage/cli@0.22.4-next.1 + - @backstage/integration-react@1.1.11-next.2 + - @backstage/test-utils@1.2.6-next.2 + - @backstage/config@1.0.7-next.0 + +## @internal/plugin-catalog-customized@0.0.8-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.4.0-next.2 + - @backstage/plugin-catalog@1.9.0-next.2 + +## @internal/plugin-todo-list@1.0.11-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.5-next.2 + - @backstage/core-plugin-api@1.5.0-next.2 + +## @internal/plugin-todo-list-backend@1.0.11-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.2.12-next.2 + - @backstage/backend-common@0.18.3-next.2 + - @backstage/backend-plugin-api@0.4.1-next.2 + - @backstage/config@1.0.7-next.0 diff --git a/microsite-next/src/components/simpleCard/simpleCard.tsx b/microsite-next/src/components/simpleCard/simpleCard.tsx new file mode 100644 index 0000000000..77be566f18 --- /dev/null +++ b/microsite-next/src/components/simpleCard/simpleCard.tsx @@ -0,0 +1,17 @@ +import React from 'react'; + +export interface ICardData { + header: React.ReactNode; + body: React.ReactNode; + footer: React.ReactNode; +} + +export const SimpleCard = ({ header, body, footer }: ICardData) => ( +
+
{header}
+ +
{body}
+ +
{footer}
+
+); diff --git a/microsite-next/src/pages/on-demand/_onDemandCard.tsx b/microsite-next/src/pages/on-demand/_onDemandCard.tsx new file mode 100644 index 0000000000..e203c80f9a --- /dev/null +++ b/microsite-next/src/pages/on-demand/_onDemandCard.tsx @@ -0,0 +1,66 @@ +import Link from '@docusaurus/Link'; +import { SimpleCard } from '@site/src/components/simpleCard/simpleCard'; +import React from 'react'; + +export interface IOnDemandData { + title: string; + category: string; + description: string; + date: string; + youtubeUrl: string; + youtubeImgUrl: string; + rsvpUrl: string; + eventUrl: string; +} + +export const OnDemandCard = ({ + title, + category, + description, + date, + youtubeUrl, + youtubeImgUrl, + rsvpUrl, + eventUrl, +}: IOnDemandData) => ( + +

{title}

+ +

on {date}

+ + {category} + + {title} + + } + body={

{description}

} + footer={ + category.toLowerCase() === 'upcoming' ? ( + <> + + Event page + + + + Remind me + + + ) : ( + + Watch on YouTube + + ) + } + /> +); diff --git a/microsite-next/src/pages/on-demand/index.tsx b/microsite-next/src/pages/on-demand/index.tsx new file mode 100644 index 0000000000..7262005f70 --- /dev/null +++ b/microsite-next/src/pages/on-demand/index.tsx @@ -0,0 +1,78 @@ +import Layout from '@theme/Layout'; +import clsx from 'clsx'; +import React from 'react'; + +import { IOnDemandData, OnDemandCard } from './_onDemandCard'; +import pluginsStyles from './onDemand.module.scss'; +import { truncateDescription } from '@site/src/util/truncateDescription'; +import Link from '@docusaurus/Link'; + +//#region Plugin data import +const onDemandContext = require.context( + '../../../../microsite/data/on-demand', + false, + /\.ya?ml/, +); + +const onDemandData = onDemandContext.keys().reduce( + (acum, id) => { + const pluginData: IOnDemandData = onDemandContext(id).default; + + acum[ + pluginData.category === 'Upcoming' ? 'upcomingEvents' : 'onDemandEvents' + ].push(truncateDescription(pluginData)); + + return acum; + }, + { + upcomingEvents: [] as IOnDemandData[], + onDemandEvents: [] as IOnDemandData[], + }, +); +//#endregion + +const Plugins = () => ( + +
+
+
+

Community sessions

+ +

+ Upcoming events and recorded sessions about updates, demos and + discussions. +

+
+ + + Add an event or recording + +
+ +
+ +

Upcoming live events

+ +
+ {onDemandData.upcomingEvents.map(eventData => ( + + ))} +
+ +

Community on demand

+ +
+ {onDemandData.onDemandEvents.map(eventData => ( + + ))} +
+
+
+); + +export default Plugins; diff --git a/microsite-next/src/pages/on-demand/onDemand.module.scss b/microsite-next/src/pages/on-demand/onDemand.module.scss new file mode 100644 index 0000000000..fba051ec97 --- /dev/null +++ b/microsite-next/src/pages/on-demand/onDemand.module.scss @@ -0,0 +1,44 @@ +.onDemandPage { + :global(.marketplaceBanner) { + display: flex; + align-items: center; + } + + :global(.marketplaceContent) { + flex: 1; + } + + :global(.card) { + max-width: 100%; + } + + :global(.card .card__header) { + display: grid; + row-gap: 0.25rem; + column-gap: 1rem; + justify-items: start; + + > * { + margin: 0; + } + + :global(img) { + width: 250px; + max-width: 100%; + justify-self: center; + } + } + + :global(.card .card__footer) { + gap: 1rem; + display: grid; + grid-template-columns: repeat(auto-fit, minmax(100px, 1fr)); + } + + :global(.cardsContainer) { + gap: 1rem; + display: grid; + grid-template-columns: repeat(auto-fill, minmax(250px, 1fr)); + justify-items: start; + } +} diff --git a/microsite-next/src/pages/plugins/_pluginCard.tsx b/microsite-next/src/pages/plugins/_pluginCard.tsx index dec62af06f..99f27b865d 100644 --- a/microsite-next/src/pages/plugins/_pluginCard.tsx +++ b/microsite-next/src/pages/plugins/_pluginCard.tsx @@ -1,4 +1,5 @@ import Link from '@docusaurus/Link'; +import { SimpleCard } from '@site/src/components/simpleCard/simpleCard'; import React from 'react'; export interface IPluginData { @@ -23,32 +24,30 @@ export const PluginCard = ({ iconUrl, title, }: IPluginData) => ( -
-
- {title} + + {title} -

{title}

+

{title}

-

- by {author} -

+

+ by {author} +

- - {category} - -
- -
-

{description}

-
- -
+ + {category} + + + } + body={

{description}

} + footer={ Explore -
-
+ } + /> ); diff --git a/microsite-next/src/pages/plugins/index.tsx b/microsite-next/src/pages/plugins/index.tsx index f8c6f78819..0e57e01994 100644 --- a/microsite-next/src/pages/plugins/index.tsx +++ b/microsite-next/src/pages/plugins/index.tsx @@ -5,18 +5,9 @@ import React from 'react'; import { IPluginData, PluginCard } from './_pluginCard'; import pluginsStyles from './plugins.module.scss'; +import { truncateDescription } from '@site/src/util/truncateDescription'; //#region Plugin data import -const maxDescLength = 160; - -const truncatePluginDescription = (pluginData: IPluginData) => - pluginData.description.length > maxDescLength - ? { - ...pluginData, - description: pluginData.description.slice(0, maxDescLength) + '...', - } - : pluginData; - const pluginsContext = require.context( '../../../../microsite/data/plugins', false, @@ -29,7 +20,7 @@ const plugins = pluginsContext.keys().reduce( acum[ pluginData.category === 'Core Feature' ? 'corePlugins' : 'otherPlugins' - ].push(truncatePluginDescription(pluginData)); + ].push(truncateDescription(pluginData)); return acum; }, diff --git a/microsite-next/src/util/truncateDescription.tsx b/microsite-next/src/util/truncateDescription.tsx new file mode 100644 index 0000000000..dc661cbd49 --- /dev/null +++ b/microsite-next/src/util/truncateDescription.tsx @@ -0,0 +1,11 @@ +export const maxDescLength = 160; + +export const truncateDescription = ( + itemData: T, +) => + itemData.description.length > maxDescLength + ? { + ...itemData, + description: itemData.description.slice(0, maxDescLength) + '...', + } + : itemData; diff --git a/microsite/pages/en/plugins.js b/microsite/pages/en/plugins.js index 237161b98a..6e2e1c09ad 100644 --- a/microsite/pages/en/plugins.js +++ b/microsite/pages/en/plugins.js @@ -24,7 +24,7 @@ const truncate = text => const newForDays = 100; const addPluginDocsLink = '/docs/plugins/add-to-marketplace'; -const defaultIconUrl = 'img/logo-gradient-on-dark.svg'; +const defaultIconUrl = '/img/logo-gradient-on-dark.svg'; const Plugins = () => (
diff --git a/package.json b/package.json index 1bdaa670c8..43a146e0a1 100644 --- a/package.json +++ b/package.json @@ -47,7 +47,7 @@ "@types/react": "^17", "@types/react-dom": "^17" }, - "version": "1.12.0-next.1", + "version": "1.12.0-next.2", "dependencies": { "@backstage/errors": "workspace:^", "@manypkg/get-packages": "^1.1.3" diff --git a/packages/app-defaults/CHANGELOG.md b/packages/app-defaults/CHANGELOG.md index 648fad21b9..0b2b813d14 100644 --- a/packages/app-defaults/CHANGELOG.md +++ b/packages/app-defaults/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/app-defaults +## 1.2.1-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.5-next.2 + - @backstage/core-app-api@1.6.0-next.2 + - @backstage/core-plugin-api@1.5.0-next.2 + - @backstage/plugin-permission-react@0.4.11-next.2 + ## 1.2.1-next.1 ### Patch Changes diff --git a/packages/app-defaults/package.json b/packages/app-defaults/package.json index 76af117a84..873a2fa28f 100644 --- a/packages/app-defaults/package.json +++ b/packages/app-defaults/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/app-defaults", "description": "Provides the default wiring of a Backstage App", - "version": "1.2.1-next.1", + "version": "1.2.1-next.2", "publishConfig": { "access": "public", "main": "dist/index.esm.js", diff --git a/packages/app/CHANGELOG.md b/packages/app/CHANGELOG.md index 301c3684fc..ac21cbad07 100644 --- a/packages/app/CHANGELOG.md +++ b/packages/app/CHANGELOG.md @@ -1,5 +1,69 @@ # example-app +## 0.2.81-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.5-next.2 + - @backstage/plugin-scaffolder-react@1.2.0-next.2 + - @backstage/plugin-techdocs-react@1.1.4-next.2 + - @backstage/plugin-catalog-react@1.4.0-next.2 + - @backstage/plugin-tech-insights@0.3.8-next.2 + - @backstage/plugin-search-react@1.5.1-next.2 + - @backstage/plugin-scaffolder@1.12.0-next.2 + - @backstage/plugin-techdocs@1.6.0-next.2 + - @backstage/plugin-explore@0.4.1-next.2 + - @backstage/plugin-search@1.1.1-next.2 + - @backstage/plugin-kubernetes@0.7.9-next.2 + - @backstage/plugin-api-docs@0.9.1-next.2 + - @backstage/core-app-api@1.6.0-next.2 + - @backstage/plugin-org@0.6.6-next.2 + - @backstage/core-plugin-api@1.5.0-next.2 + - @backstage/app-defaults@1.2.1-next.2 + - @backstage/cli@0.22.4-next.1 + - @backstage/integration-react@1.1.11-next.2 + - @backstage/plugin-airbrake@0.3.16-next.2 + - @backstage/plugin-apache-airflow@0.2.9-next.2 + - @backstage/plugin-azure-devops@0.2.7-next.2 + - @backstage/plugin-azure-sites@0.1.5-next.2 + - @backstage/plugin-badges@0.2.40-next.2 + - @backstage/plugin-catalog-graph@0.2.28-next.2 + - @backstage/plugin-catalog-import@0.9.6-next.2 + - @backstage/plugin-circleci@0.3.16-next.2 + - @backstage/plugin-cloudbuild@0.3.16-next.2 + - @backstage/plugin-code-coverage@0.2.9-next.2 + - @backstage/plugin-cost-insights@0.12.5-next.2 + - @backstage/plugin-dynatrace@3.0.0-next.2 + - @backstage/plugin-entity-feedback@0.1.1-next.2 + - @backstage/plugin-gcalendar@0.3.12-next.2 + - @backstage/plugin-gcp-projects@0.3.35-next.2 + - @backstage/plugin-github-actions@0.5.16-next.2 + - @backstage/plugin-gocd@0.1.22-next.2 + - @backstage/plugin-graphiql@0.2.48-next.2 + - @backstage/plugin-home@0.4.32-next.2 + - @backstage/plugin-jenkins@0.7.15-next.2 + - @backstage/plugin-kafka@0.3.16-next.2 + - @backstage/plugin-lighthouse@0.4.1-next.2 + - @backstage/plugin-linguist@0.1.1-next.2 + - @backstage/plugin-microsoft-calendar@0.1.1-next.2 + - @backstage/plugin-newrelic@0.3.34-next.2 + - @backstage/plugin-newrelic-dashboard@0.2.9-next.2 + - @backstage/plugin-pagerduty@0.5.9-next.2 + - @backstage/plugin-playlist@0.1.7-next.2 + - @backstage/plugin-rollbar@0.4.16-next.2 + - @backstage/plugin-sentry@0.5.1-next.2 + - @backstage/plugin-shortcuts@0.3.8-next.2 + - @backstage/plugin-stack-overflow@0.1.12-next.2 + - @backstage/plugin-stackstorm@0.1.0-next.2 + - @backstage/plugin-tech-radar@0.6.2-next.2 + - @backstage/plugin-techdocs-module-addons-contrib@1.0.11-next.2 + - @backstage/plugin-todo@0.2.18-next.2 + - @backstage/plugin-user-settings@0.7.1-next.2 + - @internal/plugin-catalog-customized@0.0.8-next.2 + - @backstage/plugin-permission-react@0.4.11-next.2 + - @backstage/config@1.0.7-next.0 + ## 0.2.81-next.1 ### Patch Changes diff --git a/packages/app/package.json b/packages/app/package.json index b74a2c7a6e..c51f8be911 100644 --- a/packages/app/package.json +++ b/packages/app/package.json @@ -1,6 +1,6 @@ { "name": "example-app", - "version": "0.2.81-next.1", + "version": "0.2.81-next.2", "private": true, "backstage": { "role": "frontend" diff --git a/packages/backend-app-api/CHANGELOG.md b/packages/backend-app-api/CHANGELOG.md index 4cbc4fa844..6ea78e983f 100644 --- a/packages/backend-app-api/CHANGELOG.md +++ b/packages/backend-app-api/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/backend-app-api +## 0.4.1-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.2.12-next.2 + - @backstage/backend-tasks@0.5.0-next.2 + - @backstage/backend-common@0.18.3-next.2 + - @backstage/backend-plugin-api@0.4.1-next.2 + - @backstage/plugin-permission-node@0.7.6-next.2 + - @backstage/config@1.0.7-next.0 + ## 0.4.1-next.1 ### Patch Changes diff --git a/packages/backend-app-api/package.json b/packages/backend-app-api/package.json index dd5a404118..f59e39ef09 100644 --- a/packages/backend-app-api/package.json +++ b/packages/backend-app-api/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/backend-app-api", "description": "Core API used by Backstage backend apps", - "version": "0.4.1-next.1", + "version": "0.4.1-next.2", "main": "src/index.ts", "types": "src/index.ts", "publishConfig": { diff --git a/packages/backend-common/CHANGELOG.md b/packages/backend-common/CHANGELOG.md index a3dfe498e9..06968a3c8a 100644 --- a/packages/backend-common/CHANGELOG.md +++ b/packages/backend-common/CHANGELOG.md @@ -1,5 +1,33 @@ # @backstage/backend-common +## 0.18.3-next.2 + +### Patch Changes + +- f75097868a7: Adds config option `backend.database.role` to set ownership for newly created schemas and tables in Postgres + + The example config below connects to the database as user `v-backstage-123` but sets the ownership of + the create schemas and tables to `backstage` + + ```yaml + backend: + database: + client: pg + pluginDivisionMode: schema + role: backstage + connection: + user: v-backstage-123 + ... + ``` + +- 87f0bbec175: AwsS3UrlReader upgraded to use aws-sdk v3 +- Updated dependencies + - @backstage/backend-app-api@0.4.1-next.2 + - @backstage/backend-plugin-api@0.4.1-next.2 + - @backstage/config@1.0.7-next.0 + - @backstage/integration@1.4.3-next.0 + - @backstage/integration-aws-node@0.1.2-next.0 + ## 0.18.3-next.1 ### Patch Changes diff --git a/packages/backend-common/package.json b/packages/backend-common/package.json index 665b14e2dd..beee72c860 100644 --- a/packages/backend-common/package.json +++ b/packages/backend-common/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/backend-common", "description": "Common functionality library for Backstage backends", - "version": "0.18.3-next.1", + "version": "0.18.3-next.2", "main": "src/index.ts", "types": "src/index.ts", "publishConfig": { diff --git a/packages/backend-common/src/reading/AwsS3UrlReader.test.ts b/packages/backend-common/src/reading/AwsS3UrlReader.test.ts index dad12c7660..0bd4d2636f 100644 --- a/packages/backend-common/src/reading/AwsS3UrlReader.test.ts +++ b/packages/backend-common/src/reading/AwsS3UrlReader.test.ts @@ -265,10 +265,8 @@ describe('AwsS3UrlReader', () => { reader.readUrl( 'https://test-bucket.s3.us-east-2.NOTamazonaws.com/file.yaml', ), - ).rejects.toThrow( - Error( - `Could not retrieve file from S3; caused by Error: Invalid AWS S3 URL https://test-bucket.s3.us-east-2.NOTamazonaws.com/file.yaml`, - ), + ).rejects.toMatchInlineSnapshot( + `[Error: Could not retrieve file from S3; caused by Error: Invalid AWS S3 URL https://test-bucket.s3.us-east-2.NOTamazonaws.com/file.yaml]`, ); }); }); @@ -325,10 +323,8 @@ describe('AwsS3UrlReader', () => { reader.readUrl!( 'https://test-bucket.s3.us-east-2.NOTamazonaws.com/file.yaml', ), - ).rejects.toThrow( - Error( - `Could not retrieve file from S3; caused by Error: Invalid AWS S3 URL https://test-bucket.s3.us-east-2.NOTamazonaws.com/file.yaml`, - ), + ).rejects.toMatchInlineSnapshot( + `[Error: Could not retrieve file from S3; caused by Error: Invalid AWS S3 URL https://test-bucket.s3.us-east-2.NOTamazonaws.com/file.yaml]`, ); }); }); diff --git a/packages/backend-defaults/CHANGELOG.md b/packages/backend-defaults/CHANGELOG.md index bbf760d6e2..7283ae89e2 100644 --- a/packages/backend-defaults/CHANGELOG.md +++ b/packages/backend-defaults/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/backend-defaults +## 0.1.8-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.3-next.2 + - @backstage/backend-app-api@0.4.1-next.2 + - @backstage/backend-plugin-api@0.4.1-next.2 + ## 0.1.8-next.1 ### Patch Changes diff --git a/packages/backend-defaults/package.json b/packages/backend-defaults/package.json index 468bcfd4ce..2ae0074849 100644 --- a/packages/backend-defaults/package.json +++ b/packages/backend-defaults/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/backend-defaults", "description": "Backend defaults used by Backstage backend apps", - "version": "0.1.8-next.1", + "version": "0.1.8-next.2", "main": "src/index.ts", "types": "src/index.ts", "publishConfig": { diff --git a/packages/backend-next/CHANGELOG.md b/packages/backend-next/CHANGELOG.md index fdce1b2096..91ded2391f 100644 --- a/packages/backend-next/CHANGELOG.md +++ b/packages/backend-next/CHANGELOG.md @@ -1,5 +1,16 @@ # example-backend-next +## 0.0.9-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-backend@1.12.0-next.2 + - @backstage/backend-defaults@0.1.8-next.2 + - @backstage/plugin-app-backend@0.3.43-next.2 + - @backstage/plugin-catalog-backend@1.8.0-next.2 + - @backstage/plugin-todo-backend@0.1.40-next.2 + ## 0.0.9-next.1 ### Patch Changes diff --git a/packages/backend-next/package.json b/packages/backend-next/package.json index 1540803b3b..9f7ec8306a 100644 --- a/packages/backend-next/package.json +++ b/packages/backend-next/package.json @@ -1,6 +1,6 @@ { "name": "example-backend-next", - "version": "0.0.9-next.1", + "version": "0.0.9-next.2", "main": "dist/index.cjs.js", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/packages/backend-plugin-api/CHANGELOG.md b/packages/backend-plugin-api/CHANGELOG.md index 8319475840..5125411eb6 100644 --- a/packages/backend-plugin-api/CHANGELOG.md +++ b/packages/backend-plugin-api/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/backend-plugin-api +## 0.4.1-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.2.12-next.2 + - @backstage/backend-tasks@0.5.0-next.2 + - @backstage/config@1.0.7-next.0 + ## 0.4.1-next.1 ### Patch Changes diff --git a/packages/backend-plugin-api/package.json b/packages/backend-plugin-api/package.json index 856f2a70e2..4d97fdcd74 100644 --- a/packages/backend-plugin-api/package.json +++ b/packages/backend-plugin-api/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/backend-plugin-api", "description": "Core API used by Backstage backend plugins", - "version": "0.4.1-next.1", + "version": "0.4.1-next.2", "main": "src/index.ts", "types": "src/index.ts", "publishConfig": { diff --git a/packages/backend-tasks/CHANGELOG.md b/packages/backend-tasks/CHANGELOG.md index acce10665a..7eb43c4677 100644 --- a/packages/backend-tasks/CHANGELOG.md +++ b/packages/backend-tasks/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/backend-tasks +## 0.5.0-next.2 + +### Minor Changes + +- 1578276708a: add functionality to get descriptions from the scheduler for triggering + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.3-next.2 + - @backstage/config@1.0.7-next.0 + ## 0.4.4-next.1 ### Patch Changes diff --git a/packages/backend-tasks/package.json b/packages/backend-tasks/package.json index 3f3c594cd4..fa826067c8 100644 --- a/packages/backend-tasks/package.json +++ b/packages/backend-tasks/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/backend-tasks", "description": "Common distributed task management library for Backstage backends", - "version": "0.4.4-next.1", + "version": "0.5.0-next.2", "main": "src/index.ts", "types": "src/index.ts", "publishConfig": { diff --git a/packages/backend-tasks/src/migrations.test.ts b/packages/backend-tasks/src/migrations.test.ts index 4d37b9d39e..74503ab9a7 100644 --- a/packages/backend-tasks/src/migrations.test.ts +++ b/packages/backend-tasks/src/migrations.test.ts @@ -71,8 +71,11 @@ describe('migrations', () => { await migrateDownOnce(knex); - await expect(knex('backstage_backend_tasks__tasks')).rejects.toThrow( - /backstage_backend_tasks__tasks/, + // This looks odd - you might expect a .toThrow at the end but that + // actually is flaky for some reason specifically on sqlite when + // performing multiple runs in sequence + await expect(knex('backstage_backend_tasks__tasks')).rejects.toEqual( + expect.anything(), ); await knex.destroy(); diff --git a/packages/backend-test-utils/CHANGELOG.md b/packages/backend-test-utils/CHANGELOG.md index d1f383bf43..3b20fe92d5 100644 --- a/packages/backend-test-utils/CHANGELOG.md +++ b/packages/backend-test-utils/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/backend-test-utils +## 0.1.35-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.2.12-next.2 + - @backstage/backend-common@0.18.3-next.2 + - @backstage/backend-app-api@0.4.1-next.2 + - @backstage/backend-plugin-api@0.4.1-next.2 + - @backstage/config@1.0.7-next.0 + ## 0.1.35-next.1 ### Patch Changes diff --git a/packages/backend-test-utils/package.json b/packages/backend-test-utils/package.json index d5ace4b8f3..e797e346ff 100644 --- a/packages/backend-test-utils/package.json +++ b/packages/backend-test-utils/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/backend-test-utils", "description": "Test helpers library for Backstage backends", - "version": "0.1.35-next.1", + "version": "0.1.35-next.2", "main": "src/index.ts", "types": "src/index.ts", "publishConfig": { diff --git a/packages/backend/CHANGELOG.md b/packages/backend/CHANGELOG.md index 8430961cc5..933d9688b9 100644 --- a/packages/backend/CHANGELOG.md +++ b/packages/backend/CHANGELOG.md @@ -1,5 +1,52 @@ # example-backend +## 0.2.81-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-backend@1.12.0-next.2 + - @backstage/plugin-search-backend-module-elasticsearch@1.1.4-next.2 + - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.27-next.2 + - @backstage/plugin-auth-node@0.2.12-next.2 + - @backstage/backend-tasks@0.5.0-next.2 + - @backstage/plugin-adr-backend@0.3.1-next.2 + - @backstage/backend-common@0.18.3-next.2 + - @backstage/plugin-linguist-backend@0.2.0-next.2 + - @backstage/plugin-scaffolder-backend-module-rails@0.4.11-next.2 + - example-app@0.2.81-next.2 + - @backstage/plugin-techdocs-backend@1.5.4-next.2 + - @backstage/plugin-auth-backend@0.18.1-next.2 + - @backstage/plugin-entity-feedback-backend@0.1.1-next.2 + - @backstage/plugin-jenkins-backend@0.1.33-next.2 + - @backstage/plugin-kubernetes-backend@0.9.4-next.2 + - @backstage/plugin-permission-backend@0.5.18-next.2 + - @backstage/plugin-permission-node@0.7.6-next.2 + - @backstage/plugin-playlist-backend@0.2.6-next.2 + - @backstage/plugin-search-backend@1.2.4-next.2 + - @backstage/plugin-lighthouse-backend@0.1.1-next.2 + - @backstage/plugin-search-backend-node@1.1.4-next.2 + - @backstage/plugin-tech-insights-backend@0.5.9-next.2 + - @backstage/plugin-tech-insights-node@0.4.1-next.2 + - @backstage/plugin-app-backend@0.3.43-next.2 + - @backstage/plugin-azure-devops-backend@0.3.22-next.2 + - @backstage/plugin-azure-sites-backend@0.1.5-next.2 + - @backstage/plugin-badges-backend@0.1.37-next.2 + - @backstage/plugin-catalog-backend@1.8.0-next.2 + - @backstage/plugin-catalog-node@1.3.4-next.2 + - @backstage/plugin-code-coverage-backend@0.2.9-next.2 + - @backstage/plugin-events-backend@0.2.4-next.2 + - @backstage/plugin-explore-backend@0.0.5-next.2 + - @backstage/plugin-graphql-backend@0.1.33-next.2 + - @backstage/plugin-kafka-backend@0.2.36-next.2 + - @backstage/plugin-proxy-backend@0.2.37-next.2 + - @backstage/plugin-rollbar-backend@0.1.40-next.2 + - @backstage/plugin-search-backend-module-pg@0.5.4-next.2 + - @backstage/plugin-todo-backend@0.1.40-next.2 + - @backstage/plugin-events-node@0.2.4-next.2 + - @backstage/config@1.0.7-next.0 + - @backstage/integration@1.4.3-next.0 + ## 0.2.81-next.1 ### Patch Changes diff --git a/packages/backend/package.json b/packages/backend/package.json index 40b47bbc7b..107a1147f1 100644 --- a/packages/backend/package.json +++ b/packages/backend/package.json @@ -1,6 +1,6 @@ { "name": "example-backend", - "version": "0.2.81-next.1", + "version": "0.2.81-next.2", "main": "dist/index.cjs.js", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/packages/core-app-api/CHANGELOG.md b/packages/core-app-api/CHANGELOG.md index 092a43cfe0..d91fa44f05 100644 --- a/packages/core-app-api/CHANGELOG.md +++ b/packages/core-app-api/CHANGELOG.md @@ -1,5 +1,31 @@ # @backstage/core-app-api +## 1.6.0-next.2 + +### Minor Changes + +- 456eaa8cf83: `OAuth2` now gets ID tokens from a session with the `openid` scope explicitly + requested. + + This should not be considered a breaking change, because spec-compliant OIDC + providers will already be returning ID tokens if and only if the `openid` scope + is granted. + + This change makes the dependence explicit, and removes the burden on + OAuth2-based providers which require an ID token (e.g. this is done by various + default [auth + handlers](https://backstage.io/docs/auth/identity-resolver/#authhandler)) to add + `openid` to their default scopes. _That_ could carry another indirect benefit: + by removing `openid` from the default scopes for a provider, grants for + resource-specific access tokens can avoid requesting excess ID token-related + scopes. + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.5.0-next.2 + - @backstage/config@1.0.7-next.0 + ## 1.5.1-next.1 ### Patch Changes diff --git a/packages/core-app-api/package.json b/packages/core-app-api/package.json index d17e05fdea..073a5a22b2 100644 --- a/packages/core-app-api/package.json +++ b/packages/core-app-api/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/core-app-api", "description": "Core app API used by Backstage apps", - "version": "1.5.1-next.1", + "version": "1.6.0-next.2", "publishConfig": { "access": "public", "main": "dist/index.esm.js", diff --git a/packages/core-app-api/src/apis/implementations/auth/oauth2/OAuth2.test.ts b/packages/core-app-api/src/apis/implementations/auth/oauth2/OAuth2.test.ts index 0bb40c23fc..63070120ef 100644 --- a/packages/core-app-api/src/apis/implementations/auth/oauth2/OAuth2.test.ts +++ b/packages/core-app-api/src/apis/implementations/auth/oauth2/OAuth2.test.ts @@ -48,9 +48,8 @@ describe('OAuth2', () => { expect(await oauth2.getAccessToken('my-scope my-scope2')).toBe( 'access-token', ); - expect(getSession).toHaveBeenCalledTimes(1); - expect(getSession.mock.calls[0][0].scopes).toEqual( - new Set(['my-scope', 'my-scope2']), + expect(getSession).toHaveBeenCalledWith( + expect.objectContaining({ scopes: new Set(['my-scope', 'my-scope2']) }), ); }); @@ -65,9 +64,10 @@ describe('OAuth2', () => { }); expect(await oauth2.getAccessToken('my-scope')).toBe('access-token'); - expect(getSession).toHaveBeenCalledTimes(1); - expect(getSession.mock.calls[0][0].scopes).toEqual( - new Set(['my-prefix/my-scope']), + expect(getSession).toHaveBeenCalledWith( + expect.objectContaining({ + scopes: new Set(['my-prefix/my-scope']), + }), ); }); @@ -82,7 +82,11 @@ describe('OAuth2', () => { }); expect(await oauth2.getIdToken()).toBe('id-token'); - expect(getSession).toHaveBeenCalledTimes(1); + expect(getSession).toHaveBeenCalledWith( + expect.objectContaining({ + scopes: new Set(['openid']), + }), + ); }); it('should get optional id token', async () => { @@ -96,7 +100,11 @@ describe('OAuth2', () => { }); expect(await oauth2.getIdToken({ optional: true })).toBe('id-token'); - expect(getSession).toHaveBeenCalledTimes(1); + expect(getSession).toHaveBeenCalledWith( + expect.objectContaining({ + scopes: new Set(['openid']), + }), + ); }); it('should share popup closed errors', async () => { diff --git a/packages/core-app-api/src/apis/implementations/auth/oauth2/OAuth2.ts b/packages/core-app-api/src/apis/implementations/auth/oauth2/OAuth2.ts index ad2d04cb56..6f88178415 100644 --- a/packages/core-app-api/src/apis/implementations/auth/oauth2/OAuth2.ts +++ b/packages/core-app-api/src/apis/implementations/auth/oauth2/OAuth2.ts @@ -153,7 +153,10 @@ export default class OAuth2 } async getIdToken(options: AuthRequestOptions = {}) { - const session = await this.sessionManager.getSession(options); + const session = await this.sessionManager.getSession({ + ...options, + scopes: new Set(['openid']), + }); return session?.providerInfo.idToken ?? ''; } diff --git a/packages/core-components/CHANGELOG.md b/packages/core-components/CHANGELOG.md index 4dbeaea64c..0eac19716d 100644 --- a/packages/core-components/CHANGELOG.md +++ b/packages/core-components/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/core-components +## 0.12.5-next.2 + +### Patch Changes + +- 8bbf95b5507: Button labels in the sidebar (previously displayed in uppercase) will be displayed in the case that is provided without any transformations. + For example, a sidebar button with the label "Search" will appear as Search, "search" will appear as search, "SEARCH" will appear as SEARCH etc. + This can potentially affect any overriding styles previously applied to change the appearance of Button labels in the Sidebar. +- fa004f66871: Use media queries to change layout instead of `isMobile` prop in `BackstagePage` component +- Updated dependencies + - @backstage/core-plugin-api@1.5.0-next.2 + - @backstage/config@1.0.7-next.0 + ## 0.12.5-next.1 ### Patch Changes diff --git a/packages/core-components/package.json b/packages/core-components/package.json index 47f882d2cc..9630d7d706 100644 --- a/packages/core-components/package.json +++ b/packages/core-components/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/core-components", "description": "Core components used by Backstage plugins and apps", - "version": "0.12.5-next.1", + "version": "0.12.5-next.2", "publishConfig": { "access": "public", "main": "dist/index.esm.js", diff --git a/packages/core-plugin-api/CHANGELOG.md b/packages/core-plugin-api/CHANGELOG.md index 278d8d6d02..1001c01e52 100644 --- a/packages/core-plugin-api/CHANGELOG.md +++ b/packages/core-plugin-api/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/core-plugin-api +## 1.5.0-next.2 + +### Minor Changes + +- ab750ddc4f2: The GitLab auth provider can now be used to get OpenID tokens. + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.0.7-next.0 + ## 1.4.1-next.1 ### Patch Changes diff --git a/packages/core-plugin-api/api-report.md b/packages/core-plugin-api/api-report.md index 4887f0b7f2..eabd300fc6 100644 --- a/packages/core-plugin-api/api-report.md +++ b/packages/core-plugin-api/api-report.md @@ -482,7 +482,11 @@ export const githubAuthApiRef: ApiRef< // @public export const gitlabAuthApiRef: ApiRef< - OAuthApi & ProfileInfoApi & BackstageIdentityApi & SessionApi + OAuthApi & + OpenIdConnectApi & + ProfileInfoApi & + BackstageIdentityApi & + SessionApi >; // @public diff --git a/packages/core-plugin-api/package.json b/packages/core-plugin-api/package.json index e765762a8a..335f0f0efd 100644 --- a/packages/core-plugin-api/package.json +++ b/packages/core-plugin-api/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/core-plugin-api", "description": "Core API used by Backstage plugins", - "version": "1.4.1-next.1", + "version": "1.5.0-next.2", "publishConfig": { "access": "public" }, diff --git a/packages/core-plugin-api/src/apis/definitions/auth.ts b/packages/core-plugin-api/src/apis/definitions/auth.ts index 43597639b6..62d0d5c810 100644 --- a/packages/core-plugin-api/src/apis/definitions/auth.ts +++ b/packages/core-plugin-api/src/apis/definitions/auth.ts @@ -357,7 +357,11 @@ export const oktaAuthApiRef: ApiRef< * for a full list of supported scopes. */ export const gitlabAuthApiRef: ApiRef< - OAuthApi & ProfileInfoApi & BackstageIdentityApi & SessionApi + OAuthApi & + OpenIdConnectApi & + ProfileInfoApi & + BackstageIdentityApi & + SessionApi > = createApiRef({ id: 'core.auth.gitlab', }); diff --git a/packages/create-app/CHANGELOG.md b/packages/create-app/CHANGELOG.md index 3a9a28e3ac..b17da7ba7b 100644 --- a/packages/create-app/CHANGELOG.md +++ b/packages/create-app/CHANGELOG.md @@ -1,5 +1,11 @@ # @backstage/create-app +## 0.4.38-next.2 + +### Patch Changes + +- Bumped create-app version. + ## 0.4.38-next.1 ### Patch Changes diff --git a/packages/create-app/package.json b/packages/create-app/package.json index ef569aee6b..4097e3bd57 100644 --- a/packages/create-app/package.json +++ b/packages/create-app/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/create-app", "description": "A CLI that helps you create your own Backstage app", - "version": "0.4.38-next.1", + "version": "0.4.38-next.2", "publishConfig": { "access": "public" }, diff --git a/packages/create-app/templates/default-app/packages/app/.eslintignore b/packages/create-app/templates/default-app/packages/app/.eslintignore new file mode 100644 index 0000000000..a48cf0de7a --- /dev/null +++ b/packages/create-app/templates/default-app/packages/app/.eslintignore @@ -0,0 +1 @@ +public diff --git a/packages/dev-utils/CHANGELOG.md b/packages/dev-utils/CHANGELOG.md index abfd8997f3..85a0c81ee7 100644 --- a/packages/dev-utils/CHANGELOG.md +++ b/packages/dev-utils/CHANGELOG.md @@ -1,5 +1,18 @@ # @backstage/dev-utils +## 1.0.13-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.5-next.2 + - @backstage/plugin-catalog-react@1.4.0-next.2 + - @backstage/core-app-api@1.6.0-next.2 + - @backstage/core-plugin-api@1.5.0-next.2 + - @backstage/app-defaults@1.2.1-next.2 + - @backstage/integration-react@1.1.11-next.2 + - @backstage/test-utils@1.2.6-next.2 + ## 1.0.13-next.1 ### Patch Changes diff --git a/packages/dev-utils/package.json b/packages/dev-utils/package.json index 119564ceae..d4f120b359 100644 --- a/packages/dev-utils/package.json +++ b/packages/dev-utils/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/dev-utils", "description": "Utilities for developing Backstage plugins.", - "version": "1.0.13-next.1", + "version": "1.0.13-next.2", "publishConfig": { "access": "public", "main": "dist/index.esm.js", diff --git a/packages/e2e-test/CHANGELOG.md b/packages/e2e-test/CHANGELOG.md index 9829e00e7f..7c3dcdbc36 100644 --- a/packages/e2e-test/CHANGELOG.md +++ b/packages/e2e-test/CHANGELOG.md @@ -1,5 +1,12 @@ # e2e-test +## 0.2.1-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/create-app@0.4.38-next.2 + ## 0.2.1-next.1 ### Patch Changes diff --git a/packages/e2e-test/package.json b/packages/e2e-test/package.json index ecc377c6e2..f8c6f815e8 100644 --- a/packages/e2e-test/package.json +++ b/packages/e2e-test/package.json @@ -1,7 +1,7 @@ { "name": "e2e-test", "description": "E2E test for verifying Backstage packages", - "version": "0.2.1-next.1", + "version": "0.2.1-next.2", "private": true, "backstage": { "role": "cli" diff --git a/packages/integration-react/CHANGELOG.md b/packages/integration-react/CHANGELOG.md index b1d72eec52..028c939822 100644 --- a/packages/integration-react/CHANGELOG.md +++ b/packages/integration-react/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/integration-react +## 1.1.11-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.5-next.2 + - @backstage/core-plugin-api@1.5.0-next.2 + - @backstage/config@1.0.7-next.0 + - @backstage/integration@1.4.3-next.0 + ## 1.1.11-next.1 ### Patch Changes diff --git a/packages/integration-react/api-report.md b/packages/integration-react/api-report.md index 5b0c9d6174..3af0704990 100644 --- a/packages/integration-react/api-report.md +++ b/packages/integration-react/api-report.md @@ -23,7 +23,11 @@ export class ScmAuth implements ScmAuthApi { ScmAuthApi, { github: OAuthApi & ProfileInfoApi & BackstageIdentityApi & SessionApi; - gitlab: OAuthApi & ProfileInfoApi & BackstageIdentityApi & SessionApi; + gitlab: OAuthApi & + OpenIdConnectApi & + ProfileInfoApi & + BackstageIdentityApi & + SessionApi; azure: OAuthApi & OpenIdConnectApi & ProfileInfoApi & diff --git a/packages/integration-react/package.json b/packages/integration-react/package.json index 62e3234439..119a8683d6 100644 --- a/packages/integration-react/package.json +++ b/packages/integration-react/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/integration-react", "description": "Frontend package for managing integrations towards external systems", - "version": "1.1.11-next.1", + "version": "1.1.11-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/packages/techdocs-cli-embedded-app/CHANGELOG.md b/packages/techdocs-cli-embedded-app/CHANGELOG.md index a350735be4..2d2b669e38 100644 --- a/packages/techdocs-cli-embedded-app/CHANGELOG.md +++ b/packages/techdocs-cli-embedded-app/CHANGELOG.md @@ -1,5 +1,22 @@ # techdocs-cli-embedded-app +## 0.2.80-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.5-next.2 + - @backstage/plugin-techdocs-react@1.1.4-next.2 + - @backstage/plugin-techdocs@1.6.0-next.2 + - @backstage/core-app-api@1.6.0-next.2 + - @backstage/plugin-catalog@1.9.0-next.2 + - @backstage/core-plugin-api@1.5.0-next.2 + - @backstage/app-defaults@1.2.1-next.2 + - @backstage/cli@0.22.4-next.1 + - @backstage/integration-react@1.1.11-next.2 + - @backstage/test-utils@1.2.6-next.2 + - @backstage/config@1.0.7-next.0 + ## 0.2.80-next.1 ### Patch Changes diff --git a/packages/techdocs-cli-embedded-app/package.json b/packages/techdocs-cli-embedded-app/package.json index cc5d64e234..2cbb1aabc8 100644 --- a/packages/techdocs-cli-embedded-app/package.json +++ b/packages/techdocs-cli-embedded-app/package.json @@ -1,6 +1,6 @@ { "name": "techdocs-cli-embedded-app", - "version": "0.2.80-next.1", + "version": "0.2.80-next.2", "private": true, "backstage": { "role": "frontend" diff --git a/packages/techdocs-cli/CHANGELOG.md b/packages/techdocs-cli/CHANGELOG.md index bddbd4a2d0..facd967e90 100644 --- a/packages/techdocs-cli/CHANGELOG.md +++ b/packages/techdocs-cli/CHANGELOG.md @@ -1,5 +1,14 @@ # @techdocs/cli +## 1.4.0-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-techdocs-node@1.6.0-next.2 + - @backstage/backend-common@0.18.3-next.2 + - @backstage/config@1.0.7-next.0 + ## 1.4.0-next.1 ### Minor Changes diff --git a/packages/techdocs-cli/package.json b/packages/techdocs-cli/package.json index 169ef04a47..e8d9277871 100644 --- a/packages/techdocs-cli/package.json +++ b/packages/techdocs-cli/package.json @@ -1,7 +1,7 @@ { "name": "@techdocs/cli", "description": "Utility CLI for managing TechDocs sites in Backstage.", - "version": "1.4.0-next.1", + "version": "1.4.0-next.2", "publishConfig": { "access": "public" }, diff --git a/packages/test-utils/CHANGELOG.md b/packages/test-utils/CHANGELOG.md index c5a30b5629..e521e9af91 100644 --- a/packages/test-utils/CHANGELOG.md +++ b/packages/test-utils/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/test-utils +## 1.2.6-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-app-api@1.6.0-next.2 + - @backstage/core-plugin-api@1.5.0-next.2 + - @backstage/plugin-permission-react@0.4.11-next.2 + - @backstage/config@1.0.7-next.0 + ## 1.2.6-next.1 ### Patch Changes diff --git a/packages/test-utils/package.json b/packages/test-utils/package.json index e43ca2a8b3..59ec2ce989 100644 --- a/packages/test-utils/package.json +++ b/packages/test-utils/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/test-utils", "description": "Utilities to test Backstage plugins and apps.", - "version": "1.2.6-next.1", + "version": "1.2.6-next.2", "publishConfig": { "access": "public" }, diff --git a/plugins/adr-backend/CHANGELOG.md b/plugins/adr-backend/CHANGELOG.md index 6b96383f68..58b37f1731 100644 --- a/plugins/adr-backend/CHANGELOG.md +++ b/plugins/adr-backend/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-adr-backend +## 0.3.1-next.2 + +### Patch Changes + +- 2a73ded3861: Support MADR v3 format +- Updated dependencies + - @backstage/backend-common@0.18.3-next.2 + - @backstage/config@1.0.7-next.0 + - @backstage/integration@1.4.3-next.0 + ## 0.3.1-next.1 ### Patch Changes diff --git a/plugins/adr-backend/package.json b/plugins/adr-backend/package.json index 452a58f4e5..f73bf159b0 100644 --- a/plugins/adr-backend/package.json +++ b/plugins/adr-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-adr-backend", - "version": "0.3.1-next.1", + "version": "0.3.1-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/adr/CHANGELOG.md b/plugins/adr/CHANGELOG.md index 13e8ad37a2..a50f1a60d3 100644 --- a/plugins/adr/CHANGELOG.md +++ b/plugins/adr/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-adr +## 0.4.1-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.5-next.2 + - @backstage/plugin-catalog-react@1.4.0-next.2 + - @backstage/plugin-search-react@1.5.1-next.2 + - @backstage/core-plugin-api@1.5.0-next.2 + - @backstage/integration-react@1.1.11-next.2 + ## 0.4.1-next.1 ### Patch Changes diff --git a/plugins/adr/package.json b/plugins/adr/package.json index 0456e3961a..5e56c39638 100644 --- a/plugins/adr/package.json +++ b/plugins/adr/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-adr", - "version": "0.4.1-next.1", + "version": "0.4.1-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/airbrake-backend/CHANGELOG.md b/plugins/airbrake-backend/CHANGELOG.md index a88cf895d0..bcbd88a755 100644 --- a/plugins/airbrake-backend/CHANGELOG.md +++ b/plugins/airbrake-backend/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-airbrake-backend +## 0.2.16-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.3-next.2 + - @backstage/config@1.0.7-next.0 + ## 0.2.16-next.1 ### Patch Changes diff --git a/plugins/airbrake-backend/package.json b/plugins/airbrake-backend/package.json index 0e5b160a86..52bd89e909 100644 --- a/plugins/airbrake-backend/package.json +++ b/plugins/airbrake-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-airbrake-backend", - "version": "0.2.16-next.1", + "version": "0.2.16-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/airbrake/CHANGELOG.md b/plugins/airbrake/CHANGELOG.md index 406564d8cf..088bfbdcf9 100644 --- a/plugins/airbrake/CHANGELOG.md +++ b/plugins/airbrake/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-airbrake +## 0.3.16-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.5-next.2 + - @backstage/plugin-catalog-react@1.4.0-next.2 + - @backstage/core-plugin-api@1.5.0-next.2 + - @backstage/dev-utils@1.0.13-next.2 + - @backstage/test-utils@1.2.6-next.2 + ## 0.3.16-next.1 ### Patch Changes diff --git a/plugins/airbrake/package.json b/plugins/airbrake/package.json index 4c31a2b5e7..e577ee8862 100644 --- a/plugins/airbrake/package.json +++ b/plugins/airbrake/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-airbrake", - "version": "0.3.16-next.1", + "version": "0.3.16-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/allure/CHANGELOG.md b/plugins/allure/CHANGELOG.md index 48ce2bd75c..efde01c0b5 100644 --- a/plugins/allure/CHANGELOG.md +++ b/plugins/allure/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-allure +## 0.1.32-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.5-next.2 + - @backstage/plugin-catalog-react@1.4.0-next.2 + - @backstage/core-plugin-api@1.5.0-next.2 + ## 0.1.32-next.1 ### Patch Changes diff --git a/plugins/allure/package.json b/plugins/allure/package.json index f6dcdda941..18bf52feab 100644 --- a/plugins/allure/package.json +++ b/plugins/allure/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-allure", "description": "A Backstage plugin that integrates with Allure", - "version": "0.1.32-next.1", + "version": "0.1.32-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/analytics-module-ga/CHANGELOG.md b/plugins/analytics-module-ga/CHANGELOG.md index c65f20cedd..e457b76bf8 100644 --- a/plugins/analytics-module-ga/CHANGELOG.md +++ b/plugins/analytics-module-ga/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-analytics-module-ga +## 0.1.27-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.5-next.2 + - @backstage/core-plugin-api@1.5.0-next.2 + - @backstage/config@1.0.7-next.0 + ## 0.1.27-next.1 ### Patch Changes diff --git a/plugins/analytics-module-ga/package.json b/plugins/analytics-module-ga/package.json index 722c34895e..b7152b1f69 100644 --- a/plugins/analytics-module-ga/package.json +++ b/plugins/analytics-module-ga/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-analytics-module-ga", - "version": "0.1.27-next.1", + "version": "0.1.27-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/apache-airflow/CHANGELOG.md b/plugins/apache-airflow/CHANGELOG.md index 8fec434e37..acc474e6e3 100644 --- a/plugins/apache-airflow/CHANGELOG.md +++ b/plugins/apache-airflow/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-apache-airflow +## 0.2.9-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.5-next.2 + - @backstage/core-plugin-api@1.5.0-next.2 + ## 0.2.9-next.1 ### Patch Changes diff --git a/plugins/apache-airflow/package.json b/plugins/apache-airflow/package.json index 87889f6c86..070cbc4136 100644 --- a/plugins/apache-airflow/package.json +++ b/plugins/apache-airflow/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-apache-airflow", - "version": "0.2.9-next.1", + "version": "0.2.9-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/api-docs/CHANGELOG.md b/plugins/api-docs/CHANGELOG.md index 3966fa5ee8..56644c2322 100644 --- a/plugins/api-docs/CHANGELOG.md +++ b/plugins/api-docs/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-api-docs +## 0.9.1-next.2 + +### Patch Changes + +- 8bc7dcec820: Fix dark theme Swagger's clear button font color. +- Updated dependencies + - @backstage/core-components@0.12.5-next.2 + - @backstage/plugin-catalog-react@1.4.0-next.2 + - @backstage/plugin-catalog@1.9.0-next.2 + - @backstage/core-plugin-api@1.5.0-next.2 + ## 0.9.1-next.1 ### Patch Changes diff --git a/plugins/api-docs/package.json b/plugins/api-docs/package.json index a3d14e7fa2..d7db6566f9 100644 --- a/plugins/api-docs/package.json +++ b/plugins/api-docs/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-api-docs", "description": "A Backstage plugin that helps represent API entities in the frontend", - "version": "0.9.1-next.1", + "version": "0.9.1-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/apollo-explorer/CHANGELOG.md b/plugins/apollo-explorer/CHANGELOG.md index 57b6934d5b..8e48be2ab8 100644 --- a/plugins/apollo-explorer/CHANGELOG.md +++ b/plugins/apollo-explorer/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-apollo-explorer +## 0.1.9-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.5-next.2 + - @backstage/core-plugin-api@1.5.0-next.2 + ## 0.1.9-next.1 ### Patch Changes diff --git a/plugins/apollo-explorer/package.json b/plugins/apollo-explorer/package.json index 2aab81c0d3..0fcc315797 100644 --- a/plugins/apollo-explorer/package.json +++ b/plugins/apollo-explorer/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-apollo-explorer", - "version": "0.1.9-next.1", + "version": "0.1.9-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/app-backend/CHANGELOG.md b/plugins/app-backend/CHANGELOG.md index 784c2d23c4..79c8276eeb 100644 --- a/plugins/app-backend/CHANGELOG.md +++ b/plugins/app-backend/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-app-backend +## 0.3.43-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.3-next.2 + - @backstage/backend-plugin-api@0.4.1-next.2 + - @backstage/config@1.0.7-next.0 + ## 0.3.43-next.1 ### Patch Changes diff --git a/plugins/app-backend/package.json b/plugins/app-backend/package.json index 43152faca1..77804372d1 100644 --- a/plugins/app-backend/package.json +++ b/plugins/app-backend/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-app-backend", "description": "A Backstage backend plugin that serves the Backstage frontend app", - "version": "0.3.43-next.1", + "version": "0.3.43-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/auth-backend/CHANGELOG.md b/plugins/auth-backend/CHANGELOG.md index 97124b3a3e..a22b2e40ee 100644 --- a/plugins/auth-backend/CHANGELOG.md +++ b/plugins/auth-backend/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-auth-backend +## 0.18.1-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.2.12-next.2 + - @backstage/backend-common@0.18.3-next.2 + - @backstage/config@1.0.7-next.0 + ## 0.18.1-next.1 ### Patch Changes diff --git a/plugins/auth-backend/package.json b/plugins/auth-backend/package.json index f399028594..bcc62814ed 100644 --- a/plugins/auth-backend/package.json +++ b/plugins/auth-backend/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-auth-backend", "description": "A Backstage backend plugin that handles authentication", - "version": "0.18.1-next.1", + "version": "0.18.1-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/auth-node/CHANGELOG.md b/plugins/auth-node/CHANGELOG.md index 71e17743b4..0e7bcefae2 100644 --- a/plugins/auth-node/CHANGELOG.md +++ b/plugins/auth-node/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-auth-node +## 0.2.12-next.2 + +### Patch Changes + +- 65454876fb2: Minor API report tweaks +- Updated dependencies + - @backstage/backend-common@0.18.3-next.2 + - @backstage/config@1.0.7-next.0 + ## 0.2.12-next.1 ### Patch Changes diff --git a/plugins/auth-node/package.json b/plugins/auth-node/package.json index ffecaf44ba..093b23add9 100644 --- a/plugins/auth-node/package.json +++ b/plugins/auth-node/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-auth-node", - "version": "0.2.12-next.1", + "version": "0.2.12-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/azure-devops-backend/CHANGELOG.md b/plugins/azure-devops-backend/CHANGELOG.md index bc92e8cdd4..a4a7492ffc 100644 --- a/plugins/azure-devops-backend/CHANGELOG.md +++ b/plugins/azure-devops-backend/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-azure-devops-backend +## 0.3.22-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.3-next.2 + - @backstage/config@1.0.7-next.0 + ## 0.3.22-next.1 ### Patch Changes diff --git a/plugins/azure-devops-backend/package.json b/plugins/azure-devops-backend/package.json index dd46929944..1d921a468a 100644 --- a/plugins/azure-devops-backend/package.json +++ b/plugins/azure-devops-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-azure-devops-backend", - "version": "0.3.22-next.1", + "version": "0.3.22-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/azure-devops/CHANGELOG.md b/plugins/azure-devops/CHANGELOG.md index 3d82d3a0dd..b9fcc646b7 100644 --- a/plugins/azure-devops/CHANGELOG.md +++ b/plugins/azure-devops/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-azure-devops +## 0.2.7-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.5-next.2 + - @backstage/plugin-catalog-react@1.4.0-next.2 + - @backstage/core-plugin-api@1.5.0-next.2 + ## 0.2.7-next.1 ### Patch Changes diff --git a/plugins/azure-devops/package.json b/plugins/azure-devops/package.json index bec734c09b..f8bc46f422 100644 --- a/plugins/azure-devops/package.json +++ b/plugins/azure-devops/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-azure-devops", - "version": "0.2.7-next.1", + "version": "0.2.7-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/azure-sites-backend/CHANGELOG.md b/plugins/azure-sites-backend/CHANGELOG.md index 439163b00d..9bc9b99388 100644 --- a/plugins/azure-sites-backend/CHANGELOG.md +++ b/plugins/azure-sites-backend/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-azure-sites-backend +## 0.1.5-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.3-next.2 + - @backstage/config@1.0.7-next.0 + ## 0.1.5-next.1 ### Patch Changes diff --git a/plugins/azure-sites-backend/package.json b/plugins/azure-sites-backend/package.json index e4a739d730..3cb7023933 100644 --- a/plugins/azure-sites-backend/package.json +++ b/plugins/azure-sites-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-azure-sites-backend", - "version": "0.1.5-next.1", + "version": "0.1.5-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/azure-sites/CHANGELOG.md b/plugins/azure-sites/CHANGELOG.md index 2bb6cfba96..1de9e7a804 100644 --- a/plugins/azure-sites/CHANGELOG.md +++ b/plugins/azure-sites/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-azure-sites +## 0.1.5-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.5-next.2 + - @backstage/plugin-catalog-react@1.4.0-next.2 + - @backstage/core-plugin-api@1.5.0-next.2 + ## 0.1.5-next.1 ### Patch Changes diff --git a/plugins/azure-sites/package.json b/plugins/azure-sites/package.json index 4c17e880ea..6daadf199a 100644 --- a/plugins/azure-sites/package.json +++ b/plugins/azure-sites/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-azure-sites", - "version": "0.1.5-next.1", + "version": "0.1.5-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/badges-backend/CHANGELOG.md b/plugins/badges-backend/CHANGELOG.md index b2e06a5a0e..837e71bcce 100644 --- a/plugins/badges-backend/CHANGELOG.md +++ b/plugins/badges-backend/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-badges-backend +## 0.1.37-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.3-next.2 + - @backstage/config@1.0.7-next.0 + ## 0.1.37-next.1 ### Patch Changes diff --git a/plugins/badges-backend/package.json b/plugins/badges-backend/package.json index 73d4930130..f570a47874 100644 --- a/plugins/badges-backend/package.json +++ b/plugins/badges-backend/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-badges-backend", "description": "A Backstage backend plugin that generates README badges for your entities", - "version": "0.1.37-next.1", + "version": "0.1.37-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/badges/CHANGELOG.md b/plugins/badges/CHANGELOG.md index 0d4f78a5ba..567c3e81d6 100644 --- a/plugins/badges/CHANGELOG.md +++ b/plugins/badges/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-badges +## 0.2.40-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.5-next.2 + - @backstage/plugin-catalog-react@1.4.0-next.2 + - @backstage/core-plugin-api@1.5.0-next.2 + ## 0.2.40-next.1 ### Patch Changes diff --git a/plugins/badges/package.json b/plugins/badges/package.json index ebed209962..7e817c024d 100644 --- a/plugins/badges/package.json +++ b/plugins/badges/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-badges", "description": "A Backstage plugin that generates README badges for your entities", - "version": "0.2.40-next.1", + "version": "0.2.40-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/bazaar-backend/CHANGELOG.md b/plugins/bazaar-backend/CHANGELOG.md index 4e579285b0..203c1ef67f 100644 --- a/plugins/bazaar-backend/CHANGELOG.md +++ b/plugins/bazaar-backend/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-bazaar-backend +## 0.2.6-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.2.12-next.2 + - @backstage/backend-common@0.18.3-next.2 + - @backstage/backend-plugin-api@0.4.1-next.2 + - @backstage/config@1.0.7-next.0 + ## 0.2.6-next.1 ### Patch Changes diff --git a/plugins/bazaar-backend/package.json b/plugins/bazaar-backend/package.json index bac1f58a41..c9221e5c69 100644 --- a/plugins/bazaar-backend/package.json +++ b/plugins/bazaar-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-bazaar-backend", - "version": "0.2.6-next.1", + "version": "0.2.6-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/bazaar/CHANGELOG.md b/plugins/bazaar/CHANGELOG.md index d13b98ef23..57ba471000 100644 --- a/plugins/bazaar/CHANGELOG.md +++ b/plugins/bazaar/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-bazaar +## 0.2.6-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.5-next.2 + - @backstage/plugin-catalog-react@1.4.0-next.2 + - @backstage/plugin-catalog@1.9.0-next.2 + - @backstage/core-plugin-api@1.5.0-next.2 + - @backstage/cli@0.22.4-next.1 + ## 0.2.6-next.1 ### Patch Changes diff --git a/plugins/bazaar/package.json b/plugins/bazaar/package.json index d1a3b435cb..6a2311004b 100644 --- a/plugins/bazaar/package.json +++ b/plugins/bazaar/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-bazaar", - "version": "0.2.6-next.1", + "version": "0.2.6-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/bitrise/CHANGELOG.md b/plugins/bitrise/CHANGELOG.md index 856f77b655..1a9d86268d 100644 --- a/plugins/bitrise/CHANGELOG.md +++ b/plugins/bitrise/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-bitrise +## 0.1.43-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.5-next.2 + - @backstage/plugin-catalog-react@1.4.0-next.2 + - @backstage/core-plugin-api@1.5.0-next.2 + ## 0.1.43-next.1 ### Patch Changes diff --git a/plugins/bitrise/package.json b/plugins/bitrise/package.json index ab34c9ef88..41cb8562b5 100644 --- a/plugins/bitrise/package.json +++ b/plugins/bitrise/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-bitrise", "description": "A Backstage plugin that integrates towards Bitrise", - "version": "0.1.43-next.1", + "version": "0.1.43-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog-backend-module-aws/CHANGELOG.md b/plugins/catalog-backend-module-aws/CHANGELOG.md index 76cd99d3c1..f4e268aae7 100644 --- a/plugins/catalog-backend-module-aws/CHANGELOG.md +++ b/plugins/catalog-backend-module-aws/CHANGELOG.md @@ -1,5 +1,19 @@ # @backstage/plugin-catalog-backend-module-aws +## 0.1.17-next.2 + +### Patch Changes + +- 87f0bbec175: AwsS3UrlReader upgraded to use aws-sdk v3 +- Updated dependencies + - @backstage/backend-tasks@0.5.0-next.2 + - @backstage/backend-common@0.18.3-next.2 + - @backstage/backend-plugin-api@0.4.1-next.2 + - @backstage/plugin-catalog-backend@1.8.0-next.2 + - @backstage/plugin-catalog-node@1.3.4-next.2 + - @backstage/config@1.0.7-next.0 + - @backstage/integration@1.4.3-next.0 + ## 0.1.17-next.1 ### Patch Changes diff --git a/plugins/catalog-backend-module-aws/alpha-api-report.md b/plugins/catalog-backend-module-aws/alpha-api-report.md index 8781975085..f78f6a802d 100644 --- a/plugins/catalog-backend-module-aws/alpha-api-report.md +++ b/plugins/catalog-backend-module-aws/alpha-api-report.md @@ -6,7 +6,7 @@ import { BackendFeature } from '@backstage/backend-plugin-api'; // @alpha -export const awsS3EntityProviderCatalogModule: () => BackendFeature; +export const catalogModuleAwsS3EntityProvider: () => BackendFeature; // (No @packageDocumentation comment for this package) ``` diff --git a/plugins/catalog-backend-module-aws/api-report.md b/plugins/catalog-backend-module-aws/api-report.md index 5086ec1ea7..491dbf497e 100644 --- a/plugins/catalog-backend-module-aws/api-report.md +++ b/plugins/catalog-backend-module-aws/api-report.md @@ -3,13 +3,13 @@ > Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/). ```ts -import { CatalogProcessor } from '@backstage/plugin-catalog-backend'; -import { CatalogProcessorEmit } from '@backstage/plugin-catalog-backend'; -import { CatalogProcessorParser } from '@backstage/plugin-catalog-backend'; +import { CatalogProcessor } from '@backstage/plugin-catalog-node'; +import { CatalogProcessorEmit } from '@backstage/plugin-catalog-node'; +import { CatalogProcessorParser } from '@backstage/plugin-catalog-node'; import { Config } from '@backstage/config'; import { Credentials } from 'aws-sdk'; -import { EntityProvider } from '@backstage/plugin-catalog-backend'; -import { EntityProviderConnection } from '@backstage/plugin-catalog-backend'; +import { EntityProvider } from '@backstage/plugin-catalog-node'; +import { EntityProviderConnection } from '@backstage/plugin-catalog-node'; import { LocationSpec } from '@backstage/plugin-catalog-common'; import { Logger } from 'winston'; import { PluginTaskScheduler } from '@backstage/backend-tasks'; diff --git a/plugins/catalog-backend-module-aws/package.json b/plugins/catalog-backend-module-aws/package.json index 18b210ae67..79271cf4de 100644 --- a/plugins/catalog-backend-module-aws/package.json +++ b/plugins/catalog-backend-module-aws/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-catalog-backend-module-aws", "description": "A Backstage catalog backend module that helps integrate towards AWS", - "version": "0.1.17-next.1", + "version": "0.1.17-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -53,7 +53,6 @@ "@backstage/config": "workspace:^", "@backstage/errors": "workspace:^", "@backstage/integration": "workspace:^", - "@backstage/plugin-catalog-backend": "workspace:^", "@backstage/plugin-catalog-common": "workspace:^", "@backstage/plugin-catalog-node": "workspace:^", "@backstage/plugin-kubernetes-common": "workspace:^", diff --git a/plugins/catalog-backend-module-aws/src/alpha.ts b/plugins/catalog-backend-module-aws/src/alpha.ts index 3ae30df0cb..c277a0a680 100644 --- a/plugins/catalog-backend-module-aws/src/alpha.ts +++ b/plugins/catalog-backend-module-aws/src/alpha.ts @@ -14,4 +14,4 @@ * limitations under the License. */ -export { awsS3EntityProviderCatalogModule } from './service/AwsS3EntityProviderCatalogModule'; +export * from './module'; diff --git a/plugins/catalog-backend-module-aws/src/service/AwsS3EntityProviderCatalogModule.test.ts b/plugins/catalog-backend-module-aws/src/module/catalogModuleAwsS3EntityProvider.test.ts similarity index 92% rename from plugins/catalog-backend-module-aws/src/service/AwsS3EntityProviderCatalogModule.test.ts rename to plugins/catalog-backend-module-aws/src/module/catalogModuleAwsS3EntityProvider.test.ts index 868a9535b4..1475da9e79 100644 --- a/plugins/catalog-backend-module-aws/src/service/AwsS3EntityProviderCatalogModule.test.ts +++ b/plugins/catalog-backend-module-aws/src/module/catalogModuleAwsS3EntityProvider.test.ts @@ -24,10 +24,10 @@ import { startTestBackend } from '@backstage/backend-test-utils'; import { ConfigReader } from '@backstage/config'; import { catalogProcessingExtensionPoint } from '@backstage/plugin-catalog-node/alpha'; import { Duration } from 'luxon'; -import { awsS3EntityProviderCatalogModule } from './AwsS3EntityProviderCatalogModule'; +import { catalogModuleAwsS3EntityProvider } from './catalogModuleAwsS3EntityProvider'; import { AwsS3EntityProvider } from '../providers'; -describe('awsS3EntityProviderCatalogModule', () => { +describe('catalogModuleAwsS3EntityProvider', () => { it('should register provider at the catalog extension point', async () => { let addedProviders: Array | undefined; let usedSchedule: TaskScheduleDefinition | undefined; @@ -66,7 +66,7 @@ describe('awsS3EntityProviderCatalogModule', () => { [coreServices.logger, getVoidLogger()], [coreServices.scheduler, scheduler], ], - features: [awsS3EntityProviderCatalogModule()], + features: [catalogModuleAwsS3EntityProvider()], }); expect(usedSchedule?.frequency).toEqual(Duration.fromISO('P1M')); diff --git a/plugins/catalog-backend-module-aws/src/service/AwsS3EntityProviderCatalogModule.ts b/plugins/catalog-backend-module-aws/src/module/catalogModuleAwsS3EntityProvider.ts similarity index 96% rename from plugins/catalog-backend-module-aws/src/service/AwsS3EntityProviderCatalogModule.ts rename to plugins/catalog-backend-module-aws/src/module/catalogModuleAwsS3EntityProvider.ts index 5d4170ec1c..452284e526 100644 --- a/plugins/catalog-backend-module-aws/src/service/AwsS3EntityProviderCatalogModule.ts +++ b/plugins/catalog-backend-module-aws/src/module/catalogModuleAwsS3EntityProvider.ts @@ -27,7 +27,7 @@ import { AwsS3EntityProvider } from '../providers'; * * @alpha */ -export const awsS3EntityProviderCatalogModule = createBackendModule({ +export const catalogModuleAwsS3EntityProvider = createBackendModule({ pluginId: 'catalog', moduleId: 'awsS3EntityProvider', register(env) { diff --git a/plugins/catalog-backend-module-aws/src/module/index.ts b/plugins/catalog-backend-module-aws/src/module/index.ts new file mode 100644 index 0000000000..5644c034ea --- /dev/null +++ b/plugins/catalog-backend-module-aws/src/module/index.ts @@ -0,0 +1,17 @@ +/* + * Copyright 2023 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +export { catalogModuleAwsS3EntityProvider } from './catalogModuleAwsS3EntityProvider'; diff --git a/plugins/catalog-backend-module-aws/src/processors/AwsEKSClusterProcessor.ts b/plugins/catalog-backend-module-aws/src/processors/AwsEKSClusterProcessor.ts index b6418ade03..05c85c7426 100644 --- a/plugins/catalog-backend-module-aws/src/processors/AwsEKSClusterProcessor.ts +++ b/plugins/catalog-backend-module-aws/src/processors/AwsEKSClusterProcessor.ts @@ -17,7 +17,7 @@ import { CatalogProcessor, CatalogProcessorEmit, -} from '@backstage/plugin-catalog-backend'; +} from '@backstage/plugin-catalog-node'; import { LocationSpec } from '@backstage/plugin-catalog-common'; import { ANNOTATION_KUBERNETES_API_SERVER, diff --git a/plugins/catalog-backend-module-aws/src/processors/AwsOrganizationCloudAccountProcessor.ts b/plugins/catalog-backend-module-aws/src/processors/AwsOrganizationCloudAccountProcessor.ts index ecc42e69ea..c0ba1e3e98 100644 --- a/plugins/catalog-backend-module-aws/src/processors/AwsOrganizationCloudAccountProcessor.ts +++ b/plugins/catalog-backend-module-aws/src/processors/AwsOrganizationCloudAccountProcessor.ts @@ -20,7 +20,7 @@ import { CatalogProcessor, CatalogProcessorEmit, processingResult, -} from '@backstage/plugin-catalog-backend'; +} from '@backstage/plugin-catalog-node'; import { LocationSpec } from '@backstage/plugin-catalog-common'; import AWS, { Credentials, Organizations } from 'aws-sdk'; import { Account, ListAccountsResponse } from 'aws-sdk/clients/organizations'; diff --git a/plugins/catalog-backend-module-aws/src/processors/AwsS3DiscoveryProcessor.test.ts b/plugins/catalog-backend-module-aws/src/processors/AwsS3DiscoveryProcessor.test.ts index ef540da7f5..7818b21bd1 100644 --- a/plugins/catalog-backend-module-aws/src/processors/AwsS3DiscoveryProcessor.test.ts +++ b/plugins/catalog-backend-module-aws/src/processors/AwsS3DiscoveryProcessor.test.ts @@ -21,7 +21,7 @@ import { CatalogProcessorEntityResult, CatalogProcessorResult, processingResult, -} from '@backstage/plugin-catalog-backend'; +} from '@backstage/plugin-catalog-node'; import { S3Client, ListObjectsV2Command, diff --git a/plugins/catalog-backend-module-aws/src/processors/AwsS3DiscoveryProcessor.ts b/plugins/catalog-backend-module-aws/src/processors/AwsS3DiscoveryProcessor.ts index 072c3d8384..d6722d046e 100644 --- a/plugins/catalog-backend-module-aws/src/processors/AwsS3DiscoveryProcessor.ts +++ b/plugins/catalog-backend-module-aws/src/processors/AwsS3DiscoveryProcessor.ts @@ -21,7 +21,7 @@ import { CatalogProcessorEmit, CatalogProcessorParser, processingResult, -} from '@backstage/plugin-catalog-backend'; +} from '@backstage/plugin-catalog-node'; import { LocationSpec } from '@backstage/plugin-catalog-common'; import limiterFactory from 'p-limit'; diff --git a/plugins/catalog-backend-module-aws/src/providers/AwsS3EntityProvider.test.ts b/plugins/catalog-backend-module-aws/src/providers/AwsS3EntityProvider.test.ts index 134a3c6338..821fb6d4f4 100644 --- a/plugins/catalog-backend-module-aws/src/providers/AwsS3EntityProvider.test.ts +++ b/plugins/catalog-backend-module-aws/src/providers/AwsS3EntityProvider.test.ts @@ -21,7 +21,7 @@ import { TaskRunner, } from '@backstage/backend-tasks'; import { ConfigReader } from '@backstage/config'; -import { EntityProviderConnection } from '@backstage/plugin-catalog-backend'; +import { EntityProviderConnection } from '@backstage/plugin-catalog-node'; import { AwsS3EntityProvider } from './AwsS3EntityProvider'; import aws from 'aws-sdk'; import AWSMock from 'aws-sdk-mock'; diff --git a/plugins/catalog-backend-module-aws/src/providers/AwsS3EntityProvider.ts b/plugins/catalog-backend-module-aws/src/providers/AwsS3EntityProvider.ts index 5e24d4dc13..8212f9279a 100644 --- a/plugins/catalog-backend-module-aws/src/providers/AwsS3EntityProvider.ts +++ b/plugins/catalog-backend-module-aws/src/providers/AwsS3EntityProvider.ts @@ -21,7 +21,7 @@ import { EntityProvider, EntityProviderConnection, locationSpecToLocationEntity, -} from '@backstage/plugin-catalog-backend'; +} from '@backstage/plugin-catalog-node'; import { LocationSpec } from '@backstage/plugin-catalog-common'; import { AwsCredentials } from '../credentials/AwsCredentials'; import { readAwsS3Configs } from './config'; diff --git a/plugins/catalog-backend-module-azure/CHANGELOG.md b/plugins/catalog-backend-module-azure/CHANGELOG.md index 1dd3f48c2d..86566d383f 100644 --- a/plugins/catalog-backend-module-azure/CHANGELOG.md +++ b/plugins/catalog-backend-module-azure/CHANGELOG.md @@ -1,5 +1,18 @@ # @backstage/plugin-catalog-backend-module-azure +## 0.1.14-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-tasks@0.5.0-next.2 + - @backstage/backend-common@0.18.3-next.2 + - @backstage/backend-plugin-api@0.4.1-next.2 + - @backstage/plugin-catalog-backend@1.8.0-next.2 + - @backstage/plugin-catalog-node@1.3.4-next.2 + - @backstage/config@1.0.7-next.0 + - @backstage/integration@1.4.3-next.0 + ## 0.1.14-next.1 ### Patch Changes diff --git a/plugins/catalog-backend-module-azure/alpha-api-report.md b/plugins/catalog-backend-module-azure/alpha-api-report.md index 486aac7775..66551a2856 100644 --- a/plugins/catalog-backend-module-azure/alpha-api-report.md +++ b/plugins/catalog-backend-module-azure/alpha-api-report.md @@ -6,7 +6,7 @@ import { BackendFeature } from '@backstage/backend-plugin-api'; // @alpha -export const azureDevOpsEntityProviderCatalogModule: () => BackendFeature; +export const catalogModuleAzureDevOpsEntityProvider: () => BackendFeature; // (No @packageDocumentation comment for this package) ``` diff --git a/plugins/catalog-backend-module-azure/api-report.md b/plugins/catalog-backend-module-azure/api-report.md index 8fb7edeb53..a1b9d706a9 100644 --- a/plugins/catalog-backend-module-azure/api-report.md +++ b/plugins/catalog-backend-module-azure/api-report.md @@ -3,12 +3,12 @@ > Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/). ```ts -import { CatalogProcessor } from '@backstage/plugin-catalog-backend'; -import { CatalogProcessorEmit } from '@backstage/plugin-catalog-backend'; +import { CatalogProcessor } from '@backstage/plugin-catalog-node'; +import { CatalogProcessorEmit } from '@backstage/plugin-catalog-node'; import { Config } from '@backstage/config'; -import { EntityProvider } from '@backstage/plugin-catalog-backend'; -import { EntityProviderConnection } from '@backstage/plugin-catalog-backend'; -import { LocationSpec } from '@backstage/plugin-catalog-backend'; +import { EntityProvider } from '@backstage/plugin-catalog-node'; +import { EntityProviderConnection } from '@backstage/plugin-catalog-node'; +import { LocationSpec } from '@backstage/plugin-catalog-node'; import { Logger } from 'winston'; import { PluginTaskScheduler } from '@backstage/backend-tasks'; import { ScmIntegrationRegistry } from '@backstage/integration'; diff --git a/plugins/catalog-backend-module-azure/package.json b/plugins/catalog-backend-module-azure/package.json index c9a8d4b921..afe85243db 100644 --- a/plugins/catalog-backend-module-azure/package.json +++ b/plugins/catalog-backend-module-azure/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-catalog-backend-module-azure", "description": "A Backstage catalog backend module that helps integrate towards Azure", - "version": "0.1.14-next.1", + "version": "0.1.14-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -52,7 +52,6 @@ "@backstage/config": "workspace:^", "@backstage/errors": "workspace:^", "@backstage/integration": "workspace:^", - "@backstage/plugin-catalog-backend": "workspace:^", "@backstage/plugin-catalog-node": "workspace:^", "@backstage/types": "workspace:^", "lodash": "^4.17.21", diff --git a/plugins/catalog-backend-module-azure/src/alpha.ts b/plugins/catalog-backend-module-azure/src/alpha.ts index cc3c4a83af..c277a0a680 100644 --- a/plugins/catalog-backend-module-azure/src/alpha.ts +++ b/plugins/catalog-backend-module-azure/src/alpha.ts @@ -14,4 +14,4 @@ * limitations under the License. */ -export { azureDevOpsEntityProviderCatalogModule } from './service/AzureDevOpsEntityProviderCatalogModule'; +export * from './module'; diff --git a/plugins/catalog-backend-module-azure/src/service/AzureDevOpsEntityProviderCatalogModule.test.ts b/plugins/catalog-backend-module-azure/src/module/catalogModuleAzureDevOpsEntityProvider.test.ts similarity index 92% rename from plugins/catalog-backend-module-azure/src/service/AzureDevOpsEntityProviderCatalogModule.test.ts rename to plugins/catalog-backend-module-azure/src/module/catalogModuleAzureDevOpsEntityProvider.test.ts index a8e526e871..fa3b3d865e 100644 --- a/plugins/catalog-backend-module-azure/src/service/AzureDevOpsEntityProviderCatalogModule.test.ts +++ b/plugins/catalog-backend-module-azure/src/module/catalogModuleAzureDevOpsEntityProvider.test.ts @@ -24,10 +24,10 @@ import { startTestBackend } from '@backstage/backend-test-utils'; import { ConfigReader } from '@backstage/config'; import { catalogProcessingExtensionPoint } from '@backstage/plugin-catalog-node/alpha'; import { Duration } from 'luxon'; -import { azureDevOpsEntityProviderCatalogModule } from './AzureDevOpsEntityProviderCatalogModule'; +import { catalogModuleAzureDevOpsEntityProvider } from './catalogModuleAzureDevOpsEntityProvider'; import { AzureDevOpsEntityProvider } from '../providers'; -describe('azureDevOpsEntityProviderCatalogModule', () => { +describe('catalogModuleAzureDevOpsEntityProvider', () => { it('should register provider at the catalog extension point', async () => { let addedProviders: Array | undefined; let usedSchedule: TaskScheduleDefinition | undefined; @@ -69,7 +69,7 @@ describe('azureDevOpsEntityProviderCatalogModule', () => { [coreServices.logger, getVoidLogger()], [coreServices.scheduler, scheduler], ], - features: [azureDevOpsEntityProviderCatalogModule()], + features: [catalogModuleAzureDevOpsEntityProvider()], }); expect(usedSchedule?.frequency).toEqual(Duration.fromISO('P1M')); diff --git a/plugins/catalog-backend-module-azure/src/service/AzureDevOpsEntityProviderCatalogModule.ts b/plugins/catalog-backend-module-azure/src/module/catalogModuleAzureDevOpsEntityProvider.ts similarity index 96% rename from plugins/catalog-backend-module-azure/src/service/AzureDevOpsEntityProviderCatalogModule.ts rename to plugins/catalog-backend-module-azure/src/module/catalogModuleAzureDevOpsEntityProvider.ts index 3fc1ddf3a4..ec8b6441ba 100644 --- a/plugins/catalog-backend-module-azure/src/service/AzureDevOpsEntityProviderCatalogModule.ts +++ b/plugins/catalog-backend-module-azure/src/module/catalogModuleAzureDevOpsEntityProvider.ts @@ -27,7 +27,7 @@ import { AzureDevOpsEntityProvider } from '../providers'; * * @alpha */ -export const azureDevOpsEntityProviderCatalogModule = createBackendModule({ +export const catalogModuleAzureDevOpsEntityProvider = createBackendModule({ pluginId: 'catalog', moduleId: 'azureDevOpsEntityProvider', register(env) { diff --git a/plugins/catalog-backend-module-azure/src/module/index.ts b/plugins/catalog-backend-module-azure/src/module/index.ts new file mode 100644 index 0000000000..cfa8c78548 --- /dev/null +++ b/plugins/catalog-backend-module-azure/src/module/index.ts @@ -0,0 +1,17 @@ +/* + * Copyright 2023 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +export { catalogModuleAzureDevOpsEntityProvider } from './catalogModuleAzureDevOpsEntityProvider'; diff --git a/plugins/catalog-backend-module-azure/src/processors/AzureDevOpsDiscoveryProcessor.test.ts b/plugins/catalog-backend-module-azure/src/processors/AzureDevOpsDiscoveryProcessor.test.ts index 38df737179..0a1ec1e3cf 100644 --- a/plugins/catalog-backend-module-azure/src/processors/AzureDevOpsDiscoveryProcessor.test.ts +++ b/plugins/catalog-backend-module-azure/src/processors/AzureDevOpsDiscoveryProcessor.test.ts @@ -16,7 +16,7 @@ import { getVoidLogger } from '@backstage/backend-common'; import { ConfigReader } from '@backstage/config'; -import { LocationSpec } from '@backstage/plugin-catalog-backend'; +import { LocationSpec } from '@backstage/plugin-catalog-node'; import { AzureDevOpsDiscoveryProcessor, parseUrl, diff --git a/plugins/catalog-backend-module-azure/src/processors/AzureDevOpsDiscoveryProcessor.ts b/plugins/catalog-backend-module-azure/src/processors/AzureDevOpsDiscoveryProcessor.ts index 8893d5d42d..fde59046ef 100644 --- a/plugins/catalog-backend-module-azure/src/processors/AzureDevOpsDiscoveryProcessor.ts +++ b/plugins/catalog-backend-module-azure/src/processors/AzureDevOpsDiscoveryProcessor.ts @@ -24,7 +24,7 @@ import { CatalogProcessorEmit, LocationSpec, processingResult, -} from '@backstage/plugin-catalog-backend'; +} from '@backstage/plugin-catalog-node'; import { Logger } from 'winston'; import { codeSearch } from '../lib'; diff --git a/plugins/catalog-backend-module-azure/src/providers/AzureDevOpsEntityProvider.test.ts b/plugins/catalog-backend-module-azure/src/providers/AzureDevOpsEntityProvider.test.ts index dff1164899..23a668d60b 100644 --- a/plugins/catalog-backend-module-azure/src/providers/AzureDevOpsEntityProvider.test.ts +++ b/plugins/catalog-backend-module-azure/src/providers/AzureDevOpsEntityProvider.test.ts @@ -21,7 +21,7 @@ import { TaskRunner, } from '@backstage/backend-tasks'; import { ConfigReader } from '@backstage/config'; -import { EntityProviderConnection } from '@backstage/plugin-catalog-backend'; +import { EntityProviderConnection } from '@backstage/plugin-catalog-node'; import { CodeSearchResultItem } from '../lib'; import { AzureDevOpsEntityProvider } from './AzureDevOpsEntityProvider'; import { codeSearch } from '../lib'; diff --git a/plugins/catalog-backend-module-azure/src/providers/AzureDevOpsEntityProvider.ts b/plugins/catalog-backend-module-azure/src/providers/AzureDevOpsEntityProvider.ts index 788b9c2f05..89572286a1 100644 --- a/plugins/catalog-backend-module-azure/src/providers/AzureDevOpsEntityProvider.ts +++ b/plugins/catalog-backend-module-azure/src/providers/AzureDevOpsEntityProvider.ts @@ -22,7 +22,7 @@ import { EntityProviderConnection, LocationSpec, locationSpecToLocationEntity, -} from '@backstage/plugin-catalog-backend'; +} from '@backstage/plugin-catalog-node'; import { readAzureDevOpsConfigs } from './config'; import { Logger } from 'winston'; import { AzureDevOpsConfig } from './types'; diff --git a/plugins/catalog-backend-module-bitbucket-cloud/CHANGELOG.md b/plugins/catalog-backend-module-bitbucket-cloud/CHANGELOG.md index 6992b44c87..b1de810710 100644 --- a/plugins/catalog-backend-module-bitbucket-cloud/CHANGELOG.md +++ b/plugins/catalog-backend-module-bitbucket-cloud/CHANGELOG.md @@ -1,5 +1,19 @@ # @backstage/plugin-catalog-backend-module-bitbucket-cloud +## 0.1.10-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-tasks@0.5.0-next.2 + - @backstage/backend-common@0.18.3-next.2 + - @backstage/backend-plugin-api@0.4.1-next.2 + - @backstage/plugin-catalog-backend@1.8.0-next.2 + - @backstage/plugin-catalog-node@1.3.4-next.2 + - @backstage/plugin-events-node@0.2.4-next.2 + - @backstage/config@1.0.7-next.0 + - @backstage/integration@1.4.3-next.0 + ## 0.1.10-next.1 ### Patch Changes diff --git a/plugins/catalog-backend-module-bitbucket-cloud/alpha-api-report.md b/plugins/catalog-backend-module-bitbucket-cloud/alpha-api-report.md index 77b4b77410..a5d0ffc665 100644 --- a/plugins/catalog-backend-module-bitbucket-cloud/alpha-api-report.md +++ b/plugins/catalog-backend-module-bitbucket-cloud/alpha-api-report.md @@ -6,7 +6,7 @@ import { BackendFeature } from '@backstage/backend-plugin-api'; // @alpha (undocumented) -export const bitbucketCloudEntityProviderCatalogModule: () => BackendFeature; +export const catalogModuleBitbucketCloudEntityProvider: () => BackendFeature; // (No @packageDocumentation comment for this package) ``` diff --git a/plugins/catalog-backend-module-bitbucket-cloud/api-report.md b/plugins/catalog-backend-module-bitbucket-cloud/api-report.md index 456ea62dd3..22eeddea3a 100644 --- a/plugins/catalog-backend-module-bitbucket-cloud/api-report.md +++ b/plugins/catalog-backend-module-bitbucket-cloud/api-report.md @@ -5,8 +5,8 @@ ```ts import { CatalogApi } from '@backstage/catalog-client'; import { Config } from '@backstage/config'; -import { EntityProvider } from '@backstage/plugin-catalog-backend'; -import { EntityProviderConnection } from '@backstage/plugin-catalog-backend'; +import { EntityProvider } from '@backstage/plugin-catalog-node'; +import { EntityProviderConnection } from '@backstage/plugin-catalog-node'; import { EventParams } from '@backstage/plugin-events-node'; import { Events } from '@backstage/plugin-bitbucket-cloud-common'; import { EventSubscriber } from '@backstage/plugin-events-node'; diff --git a/plugins/catalog-backend-module-bitbucket-cloud/package.json b/plugins/catalog-backend-module-bitbucket-cloud/package.json index 96922c7a8c..8ed58f0333 100644 --- a/plugins/catalog-backend-module-bitbucket-cloud/package.json +++ b/plugins/catalog-backend-module-bitbucket-cloud/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-catalog-backend-module-bitbucket-cloud", "description": "A Backstage catalog backend module that helps integrate towards Bitbucket Cloud", - "version": "0.1.10-next.1", + "version": "0.1.10-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -53,7 +53,6 @@ "@backstage/config": "workspace:^", "@backstage/integration": "workspace:^", "@backstage/plugin-bitbucket-cloud-common": "workspace:^", - "@backstage/plugin-catalog-backend": "workspace:^", "@backstage/plugin-catalog-common": "workspace:^", "@backstage/plugin-catalog-node": "workspace:^", "@backstage/plugin-events-node": "workspace:^", diff --git a/plugins/catalog-backend-module-bitbucket-cloud/src/alpha.ts b/plugins/catalog-backend-module-bitbucket-cloud/src/alpha.ts index e949dcb894..c277a0a680 100644 --- a/plugins/catalog-backend-module-bitbucket-cloud/src/alpha.ts +++ b/plugins/catalog-backend-module-bitbucket-cloud/src/alpha.ts @@ -14,4 +14,4 @@ * limitations under the License. */ -export { bitbucketCloudEntityProviderCatalogModule } from './service/BitbucketCloudEntityProviderCatalogModule'; +export * from './module'; diff --git a/plugins/catalog-backend-module-bitbucket-cloud/src/index.ts b/plugins/catalog-backend-module-bitbucket-cloud/src/index.ts index 1c15ad4e8f..d730d8618d 100644 --- a/plugins/catalog-backend-module-bitbucket-cloud/src/index.ts +++ b/plugins/catalog-backend-module-bitbucket-cloud/src/index.ts @@ -20,4 +20,4 @@ * @packageDocumentation */ -export { BitbucketCloudEntityProvider } from './BitbucketCloudEntityProvider'; +export { BitbucketCloudEntityProvider } from './providers/BitbucketCloudEntityProvider'; diff --git a/plugins/catalog-backend-module-bitbucket-cloud/src/service/BitbucketCloudEntityProviderCatalogModule.test.ts b/plugins/catalog-backend-module-bitbucket-cloud/src/module/catalogModuleBitbucketCloudEntityProvider.test.ts similarity index 90% rename from plugins/catalog-backend-module-bitbucket-cloud/src/service/BitbucketCloudEntityProviderCatalogModule.test.ts rename to plugins/catalog-backend-module-bitbucket-cloud/src/module/catalogModuleBitbucketCloudEntityProvider.test.ts index 630c18b134..a34eae3750 100644 --- a/plugins/catalog-backend-module-bitbucket-cloud/src/service/BitbucketCloudEntityProviderCatalogModule.test.ts +++ b/plugins/catalog-backend-module-bitbucket-cloud/src/module/catalogModuleBitbucketCloudEntityProvider.test.ts @@ -23,10 +23,10 @@ import { startTestBackend, mockServices } from '@backstage/backend-test-utils'; import { catalogProcessingExtensionPoint } from '@backstage/plugin-catalog-node/alpha'; import { eventsExtensionPoint } from '@backstage/plugin-events-node/alpha'; import { Duration } from 'luxon'; -import { bitbucketCloudEntityProviderCatalogModule } from './BitbucketCloudEntityProviderCatalogModule'; -import { BitbucketCloudEntityProvider } from '../BitbucketCloudEntityProvider'; +import { catalogModuleBitbucketCloudEntityProvider } from './catalogModuleBitbucketCloudEntityProvider'; +import { BitbucketCloudEntityProvider } from '../providers/BitbucketCloudEntityProvider'; -describe('bitbucketCloudEntityProviderCatalogModule', () => { +describe('catalogModuleBitbucketCloudEntityProvider', () => { it('should register provider at the catalog extension point', async () => { let addedProviders: Array | undefined; let addedSubscribers: Array | undefined; @@ -73,7 +73,7 @@ describe('bitbucketCloudEntityProviderCatalogModule', () => { }), [coreServices.scheduler, scheduler], ], - features: [bitbucketCloudEntityProviderCatalogModule()], + features: [catalogModuleBitbucketCloudEntityProvider()], }); expect(usedSchedule?.frequency).toEqual(Duration.fromISO('P1M')); diff --git a/plugins/catalog-backend-module-bitbucket-cloud/src/service/BitbucketCloudEntityProviderCatalogModule.ts b/plugins/catalog-backend-module-bitbucket-cloud/src/module/catalogModuleBitbucketCloudEntityProvider.ts similarity index 93% rename from plugins/catalog-backend-module-bitbucket-cloud/src/service/BitbucketCloudEntityProviderCatalogModule.ts rename to plugins/catalog-backend-module-bitbucket-cloud/src/module/catalogModuleBitbucketCloudEntityProvider.ts index a95d99ceef..7c4f4a30b2 100644 --- a/plugins/catalog-backend-module-bitbucket-cloud/src/service/BitbucketCloudEntityProviderCatalogModule.ts +++ b/plugins/catalog-backend-module-bitbucket-cloud/src/module/catalogModuleBitbucketCloudEntityProvider.ts @@ -24,12 +24,12 @@ import { catalogServiceRef, } from '@backstage/plugin-catalog-node/alpha'; import { eventsExtensionPoint } from '@backstage/plugin-events-node/alpha'; -import { BitbucketCloudEntityProvider } from '../BitbucketCloudEntityProvider'; +import { BitbucketCloudEntityProvider } from '../providers/BitbucketCloudEntityProvider'; /** * @alpha */ -export const bitbucketCloudEntityProviderCatalogModule = createBackendModule({ +export const catalogModuleBitbucketCloudEntityProvider = createBackendModule({ pluginId: 'catalog', moduleId: 'bitbucketCloudEntityProvider', register(env) { diff --git a/plugins/catalog-backend-module-bitbucket-cloud/src/module/index.ts b/plugins/catalog-backend-module-bitbucket-cloud/src/module/index.ts new file mode 100644 index 0000000000..f9654971be --- /dev/null +++ b/plugins/catalog-backend-module-bitbucket-cloud/src/module/index.ts @@ -0,0 +1,17 @@ +/* + * Copyright 2023 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +export { catalogModuleBitbucketCloudEntityProvider } from './catalogModuleBitbucketCloudEntityProvider'; diff --git a/plugins/catalog-backend-module-bitbucket-cloud/src/BitbucketCloudEntityProvider.test.ts b/plugins/catalog-backend-module-bitbucket-cloud/src/providers/BitbucketCloudEntityProvider.test.ts similarity index 99% rename from plugins/catalog-backend-module-bitbucket-cloud/src/BitbucketCloudEntityProvider.test.ts rename to plugins/catalog-backend-module-bitbucket-cloud/src/providers/BitbucketCloudEntityProvider.test.ts index 367e95b99b..727b7fd40c 100644 --- a/plugins/catalog-backend-module-bitbucket-cloud/src/BitbucketCloudEntityProvider.test.ts +++ b/plugins/catalog-backend-module-bitbucket-cloud/src/providers/BitbucketCloudEntityProvider.test.ts @@ -27,7 +27,7 @@ import { ConfigReader } from '@backstage/config'; import { EntityProviderConnection, locationSpecToLocationEntity, -} from '@backstage/plugin-catalog-backend'; +} from '@backstage/plugin-catalog-node'; import { Events } from '@backstage/plugin-bitbucket-cloud-common'; import { rest } from 'msw'; import { setupServer } from 'msw/node'; diff --git a/plugins/catalog-backend-module-bitbucket-cloud/src/BitbucketCloudEntityProvider.ts b/plugins/catalog-backend-module-bitbucket-cloud/src/providers/BitbucketCloudEntityProvider.ts similarity index 99% rename from plugins/catalog-backend-module-bitbucket-cloud/src/BitbucketCloudEntityProvider.ts rename to plugins/catalog-backend-module-bitbucket-cloud/src/providers/BitbucketCloudEntityProvider.ts index a139bd7d8d..11c872cf7b 100644 --- a/plugins/catalog-backend-module-bitbucket-cloud/src/BitbucketCloudEntityProvider.ts +++ b/plugins/catalog-backend-module-bitbucket-cloud/src/providers/BitbucketCloudEntityProvider.ts @@ -33,7 +33,7 @@ import { EntityProvider, EntityProviderConnection, locationSpecToLocationEntity, -} from '@backstage/plugin-catalog-backend'; +} from '@backstage/plugin-catalog-node'; import { LocationSpec } from '@backstage/plugin-catalog-common'; import { EventParams, EventSubscriber } from '@backstage/plugin-events-node'; import { diff --git a/plugins/catalog-backend-module-bitbucket-cloud/src/BitbucketCloudEntityProviderConfig.test.ts b/plugins/catalog-backend-module-bitbucket-cloud/src/providers/BitbucketCloudEntityProviderConfig.test.ts similarity index 100% rename from plugins/catalog-backend-module-bitbucket-cloud/src/BitbucketCloudEntityProviderConfig.test.ts rename to plugins/catalog-backend-module-bitbucket-cloud/src/providers/BitbucketCloudEntityProviderConfig.test.ts diff --git a/plugins/catalog-backend-module-bitbucket-cloud/src/BitbucketCloudEntityProviderConfig.ts b/plugins/catalog-backend-module-bitbucket-cloud/src/providers/BitbucketCloudEntityProviderConfig.ts similarity index 100% rename from plugins/catalog-backend-module-bitbucket-cloud/src/BitbucketCloudEntityProviderConfig.ts rename to plugins/catalog-backend-module-bitbucket-cloud/src/providers/BitbucketCloudEntityProviderConfig.ts diff --git a/plugins/catalog-backend-module-bitbucket-server/CHANGELOG.md b/plugins/catalog-backend-module-bitbucket-server/CHANGELOG.md index 3dbe16771d..00341a3870 100644 --- a/plugins/catalog-backend-module-bitbucket-server/CHANGELOG.md +++ b/plugins/catalog-backend-module-bitbucket-server/CHANGELOG.md @@ -1,5 +1,18 @@ # @backstage/plugin-catalog-backend-module-bitbucket-server +## 0.1.8-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-tasks@0.5.0-next.2 + - @backstage/backend-common@0.18.3-next.2 + - @backstage/backend-plugin-api@0.4.1-next.2 + - @backstage/plugin-catalog-backend@1.8.0-next.2 + - @backstage/plugin-catalog-node@1.3.4-next.2 + - @backstage/config@1.0.7-next.0 + - @backstage/integration@1.4.3-next.0 + ## 0.1.8-next.1 ### Patch Changes diff --git a/plugins/catalog-backend-module-bitbucket-server/alpha-api-report.md b/plugins/catalog-backend-module-bitbucket-server/alpha-api-report.md index 3177828f51..2cc53a3c16 100644 --- a/plugins/catalog-backend-module-bitbucket-server/alpha-api-report.md +++ b/plugins/catalog-backend-module-bitbucket-server/alpha-api-report.md @@ -6,7 +6,7 @@ import { BackendFeature } from '@backstage/backend-plugin-api'; // @alpha (undocumented) -export const bitbucketServerEntityProviderCatalogModule: () => BackendFeature; +export const catalogModuleBitbucketServerEntityProvider: () => BackendFeature; // (No @packageDocumentation comment for this package) ``` diff --git a/plugins/catalog-backend-module-bitbucket-server/api-report.md b/plugins/catalog-backend-module-bitbucket-server/api-report.md index 6c840883af..467294f3b0 100644 --- a/plugins/catalog-backend-module-bitbucket-server/api-report.md +++ b/plugins/catalog-backend-module-bitbucket-server/api-report.md @@ -6,9 +6,9 @@ import { BitbucketServerIntegrationConfig } from '@backstage/integration'; import { Config } from '@backstage/config'; import { Entity } from '@backstage/catalog-model'; -import { EntityProvider } from '@backstage/plugin-catalog-backend'; -import { EntityProviderConnection } from '@backstage/plugin-catalog-backend'; -import { LocationSpec } from '@backstage/plugin-catalog-backend'; +import { EntityProvider } from '@backstage/plugin-catalog-node'; +import { EntityProviderConnection } from '@backstage/plugin-catalog-node'; +import { LocationSpec } from '@backstage/plugin-catalog-node'; import { Logger } from 'winston'; import { PluginTaskScheduler } from '@backstage/backend-tasks'; import { Response as Response_2 } from 'node-fetch'; diff --git a/plugins/catalog-backend-module-bitbucket-server/package.json b/plugins/catalog-backend-module-bitbucket-server/package.json index 3c58377976..433d4bc907 100644 --- a/plugins/catalog-backend-module-bitbucket-server/package.json +++ b/plugins/catalog-backend-module-bitbucket-server/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-backend-module-bitbucket-server", - "version": "0.1.8-next.1", + "version": "0.1.8-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -51,7 +51,6 @@ "@backstage/config": "workspace:^", "@backstage/errors": "workspace:^", "@backstage/integration": "workspace:^", - "@backstage/plugin-catalog-backend": "workspace:^", "@backstage/plugin-catalog-node": "workspace:^", "@types/node-fetch": "^2.5.12", "node-fetch": "^2.6.7", diff --git a/plugins/catalog-backend-module-bitbucket-server/src/alpha.ts b/plugins/catalog-backend-module-bitbucket-server/src/alpha.ts index d6227c29f1..c277a0a680 100644 --- a/plugins/catalog-backend-module-bitbucket-server/src/alpha.ts +++ b/plugins/catalog-backend-module-bitbucket-server/src/alpha.ts @@ -14,4 +14,4 @@ * limitations under the License. */ -export { bitbucketServerEntityProviderCatalogModule } from './service/BitbucketServerEntityProviderCatalogModule'; +export * from './module'; diff --git a/plugins/catalog-backend-module-bitbucket-server/src/service/BitbucketServerEntityProviderCatalogModule.test.ts b/plugins/catalog-backend-module-bitbucket-server/src/module/catalogModuleBitbucketServerEntityProvider.test.ts similarity index 92% rename from plugins/catalog-backend-module-bitbucket-server/src/service/BitbucketServerEntityProviderCatalogModule.test.ts rename to plugins/catalog-backend-module-bitbucket-server/src/module/catalogModuleBitbucketServerEntityProvider.test.ts index bdd7209364..d17b4a4c96 100644 --- a/plugins/catalog-backend-module-bitbucket-server/src/service/BitbucketServerEntityProviderCatalogModule.test.ts +++ b/plugins/catalog-backend-module-bitbucket-server/src/module/catalogModuleBitbucketServerEntityProvider.test.ts @@ -23,11 +23,11 @@ import { } from '@backstage/backend-tasks'; import { startTestBackend } from '@backstage/backend-test-utils'; import { catalogProcessingExtensionPoint } from '@backstage/plugin-catalog-node/alpha'; -import { bitbucketServerEntityProviderCatalogModule } from './BitbucketServerEntityProviderCatalogModule'; +import { catalogModuleBitbucketServerEntityProvider } from './catalogModuleBitbucketServerEntityProvider'; import { Duration } from 'luxon'; import { BitbucketServerEntityProvider } from '../providers'; -describe('bitbucketServerEntityProviderCatalogModule', () => { +describe('catalogModuleBitbucketServerEntityProvider', () => { it('should register provider at the catalog extension point', async () => { let addedProviders: Array | undefined; let usedSchedule: TaskScheduleDefinition | undefined; @@ -73,7 +73,7 @@ describe('bitbucketServerEntityProviderCatalogModule', () => { [coreServices.logger, getVoidLogger()], [coreServices.scheduler, scheduler], ], - features: [bitbucketServerEntityProviderCatalogModule()], + features: [catalogModuleBitbucketServerEntityProvider()], }); expect(usedSchedule?.frequency).toEqual(Duration.fromISO('P1M')); diff --git a/plugins/catalog-backend-module-bitbucket-server/src/service/BitbucketServerEntityProviderCatalogModule.ts b/plugins/catalog-backend-module-bitbucket-server/src/module/catalogModuleBitbucketServerEntityProvider.ts similarity index 96% rename from plugins/catalog-backend-module-bitbucket-server/src/service/BitbucketServerEntityProviderCatalogModule.ts rename to plugins/catalog-backend-module-bitbucket-server/src/module/catalogModuleBitbucketServerEntityProvider.ts index deab47c9e9..354bce7d6d 100644 --- a/plugins/catalog-backend-module-bitbucket-server/src/service/BitbucketServerEntityProviderCatalogModule.ts +++ b/plugins/catalog-backend-module-bitbucket-server/src/module/catalogModuleBitbucketServerEntityProvider.ts @@ -25,7 +25,7 @@ import { BitbucketServerEntityProvider } from '../providers'; /** * @alpha */ -export const bitbucketServerEntityProviderCatalogModule = createBackendModule({ +export const catalogModuleBitbucketServerEntityProvider = createBackendModule({ pluginId: 'catalog', moduleId: 'bitbucketServerEntityProvider', register(env) { diff --git a/plugins/catalog-backend-module-bitbucket-server/src/module/index.ts b/plugins/catalog-backend-module-bitbucket-server/src/module/index.ts new file mode 100644 index 0000000000..160f099ae0 --- /dev/null +++ b/plugins/catalog-backend-module-bitbucket-server/src/module/index.ts @@ -0,0 +1,17 @@ +/* + * Copyright 2023 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +export { catalogModuleBitbucketServerEntityProvider } from './catalogModuleBitbucketServerEntityProvider'; diff --git a/plugins/catalog-backend-module-bitbucket-server/src/providers/BitbucketServerEntityProvider.test.ts b/plugins/catalog-backend-module-bitbucket-server/src/providers/BitbucketServerEntityProvider.test.ts index 20299e3452..bc3fa2ae23 100644 --- a/plugins/catalog-backend-module-bitbucket-server/src/providers/BitbucketServerEntityProvider.test.ts +++ b/plugins/catalog-backend-module-bitbucket-server/src/providers/BitbucketServerEntityProvider.test.ts @@ -22,7 +22,7 @@ import { } from '@backstage/backend-tasks'; import { setupRequestMockHandlers } from '@backstage/backend-test-utils'; import { ConfigReader } from '@backstage/config'; -import { EntityProviderConnection } from '@backstage/plugin-catalog-backend'; +import { EntityProviderConnection } from '@backstage/plugin-catalog-node'; import { rest } from 'msw'; import { setupServer } from 'msw/node'; import { BitbucketServerEntityProvider } from './BitbucketServerEntityProvider'; diff --git a/plugins/catalog-backend-module-bitbucket-server/src/providers/BitbucketServerEntityProvider.ts b/plugins/catalog-backend-module-bitbucket-server/src/providers/BitbucketServerEntityProvider.ts index 2ecdd79019..fd2b3e3959 100644 --- a/plugins/catalog-backend-module-bitbucket-server/src/providers/BitbucketServerEntityProvider.ts +++ b/plugins/catalog-backend-module-bitbucket-server/src/providers/BitbucketServerEntityProvider.ts @@ -25,7 +25,7 @@ import { import { EntityProvider, EntityProviderConnection, -} from '@backstage/plugin-catalog-backend'; +} from '@backstage/plugin-catalog-node'; import { Logger } from 'winston'; import * as uuid from 'uuid'; import { BitbucketServerClient, paginated } from '../lib'; diff --git a/plugins/catalog-backend-module-bitbucket-server/src/providers/BitbucketServerLocationParser.ts b/plugins/catalog-backend-module-bitbucket-server/src/providers/BitbucketServerLocationParser.ts index 7f6dae8872..e5d48f92b8 100644 --- a/plugins/catalog-backend-module-bitbucket-server/src/providers/BitbucketServerLocationParser.ts +++ b/plugins/catalog-backend-module-bitbucket-server/src/providers/BitbucketServerLocationParser.ts @@ -17,7 +17,7 @@ import { LocationSpec, locationSpecToLocationEntity, -} from '@backstage/plugin-catalog-backend'; +} from '@backstage/plugin-catalog-node'; import { Entity } from '@backstage/catalog-model'; import { Logger } from 'winston'; import { BitbucketServerClient } from '../lib'; diff --git a/plugins/catalog-backend-module-bitbucket/CHANGELOG.md b/plugins/catalog-backend-module-bitbucket/CHANGELOG.md index 3ede5969ae..eef6da4c0e 100644 --- a/plugins/catalog-backend-module-bitbucket/CHANGELOG.md +++ b/plugins/catalog-backend-module-bitbucket/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-catalog-backend-module-bitbucket +## 0.2.10-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.3-next.2 + - @backstage/plugin-catalog-backend@1.8.0-next.2 + - @backstage/config@1.0.7-next.0 + - @backstage/integration@1.4.3-next.0 + ## 0.2.10-next.1 ### Patch Changes diff --git a/plugins/catalog-backend-module-bitbucket/api-report.md b/plugins/catalog-backend-module-bitbucket/api-report.md index 053c6040a4..30b2a89826 100644 --- a/plugins/catalog-backend-module-bitbucket/api-report.md +++ b/plugins/catalog-backend-module-bitbucket/api-report.md @@ -4,11 +4,11 @@ ```ts import { BitbucketIntegration } from '@backstage/integration'; -import { CatalogProcessor } from '@backstage/plugin-catalog-backend'; -import { CatalogProcessorEmit } from '@backstage/plugin-catalog-backend'; -import { CatalogProcessorResult } from '@backstage/plugin-catalog-backend'; +import { CatalogProcessor } from '@backstage/plugin-catalog-node'; +import { CatalogProcessorEmit } from '@backstage/plugin-catalog-node'; +import { CatalogProcessorResult } from '@backstage/plugin-catalog-node'; import { Config } from '@backstage/config'; -import { LocationSpec } from '@backstage/plugin-catalog-backend'; +import { LocationSpec } from '@backstage/plugin-catalog-node'; import { Logger } from 'winston'; import { ScmIntegrationRegistry } from '@backstage/integration'; diff --git a/plugins/catalog-backend-module-bitbucket/package.json b/plugins/catalog-backend-module-bitbucket/package.json index 39b5399e21..79fbbe08c4 100644 --- a/plugins/catalog-backend-module-bitbucket/package.json +++ b/plugins/catalog-backend-module-bitbucket/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-catalog-backend-module-bitbucket", "description": "A Backstage catalog backend module that helps integrate towards Bitbucket", - "version": "0.2.10-next.1", + "version": "0.2.10-next.2", "deprecated": true, "main": "src/index.ts", "types": "src/index.ts", @@ -39,7 +39,7 @@ "@backstage/errors": "workspace:^", "@backstage/integration": "workspace:^", "@backstage/plugin-bitbucket-cloud-common": "workspace:^", - "@backstage/plugin-catalog-backend": "workspace:^", + "@backstage/plugin-catalog-node": "workspace:^", "@backstage/types": "workspace:^", "lodash": "^4.17.21", "node-fetch": "^2.6.7", diff --git a/plugins/catalog-backend-module-bitbucket/src/BitbucketDiscoveryProcessor.test.ts b/plugins/catalog-backend-module-bitbucket/src/BitbucketDiscoveryProcessor.test.ts index f7a56ebc8f..262fb4e6c4 100644 --- a/plugins/catalog-backend-module-bitbucket/src/BitbucketDiscoveryProcessor.test.ts +++ b/plugins/catalog-backend-module-bitbucket/src/BitbucketDiscoveryProcessor.test.ts @@ -18,10 +18,7 @@ import { getVoidLogger } from '@backstage/backend-common'; import { setupRequestMockHandlers } from '@backstage/backend-test-utils'; import { ConfigReader } from '@backstage/config'; import { Models } from '@backstage/plugin-bitbucket-cloud-common'; -import { - LocationSpec, - processingResult, -} from '@backstage/plugin-catalog-backend'; +import { LocationSpec, processingResult } from '@backstage/plugin-catalog-node'; import { RequestHandler, rest } from 'msw'; import { setupServer } from 'msw/node'; import { BitbucketDiscoveryProcessor } from './BitbucketDiscoveryProcessor'; diff --git a/plugins/catalog-backend-module-bitbucket/src/BitbucketDiscoveryProcessor.ts b/plugins/catalog-backend-module-bitbucket/src/BitbucketDiscoveryProcessor.ts index 78aa3eacfd..3f25d6ed7b 100644 --- a/plugins/catalog-backend-module-bitbucket/src/BitbucketDiscoveryProcessor.ts +++ b/plugins/catalog-backend-module-bitbucket/src/BitbucketDiscoveryProcessor.ts @@ -28,7 +28,7 @@ import { CatalogProcessor, CatalogProcessorEmit, LocationSpec, -} from '@backstage/plugin-catalog-backend'; +} from '@backstage/plugin-catalog-node'; import { Logger } from 'winston'; import { BitbucketRepository, diff --git a/plugins/catalog-backend-module-bitbucket/src/lib/BitbucketRepositoryParser.test.ts b/plugins/catalog-backend-module-bitbucket/src/lib/BitbucketRepositoryParser.test.ts index 41f467ebaa..478ccd7c52 100644 --- a/plugins/catalog-backend-module-bitbucket/src/lib/BitbucketRepositoryParser.test.ts +++ b/plugins/catalog-backend-module-bitbucket/src/lib/BitbucketRepositoryParser.test.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import { processingResult } from '@backstage/plugin-catalog-backend'; +import { processingResult } from '@backstage/plugin-catalog-node'; import { defaultRepositoryParser } from './BitbucketRepositoryParser'; describe('BitbucketRepositoryParser', () => { diff --git a/plugins/catalog-backend-module-bitbucket/src/lib/BitbucketRepositoryParser.ts b/plugins/catalog-backend-module-bitbucket/src/lib/BitbucketRepositoryParser.ts index 97225e2579..aa973f87c2 100644 --- a/plugins/catalog-backend-module-bitbucket/src/lib/BitbucketRepositoryParser.ts +++ b/plugins/catalog-backend-module-bitbucket/src/lib/BitbucketRepositoryParser.ts @@ -18,7 +18,7 @@ import { BitbucketIntegration } from '@backstage/integration'; import { CatalogProcessorResult, processingResult, -} from '@backstage/plugin-catalog-backend'; +} from '@backstage/plugin-catalog-node'; import { Logger } from 'winston'; /** diff --git a/plugins/catalog-backend-module-gerrit/CHANGELOG.md b/plugins/catalog-backend-module-gerrit/CHANGELOG.md index 7cd5eb2bb5..07ab61c8c4 100644 --- a/plugins/catalog-backend-module-gerrit/CHANGELOG.md +++ b/plugins/catalog-backend-module-gerrit/CHANGELOG.md @@ -1,5 +1,18 @@ # @backstage/plugin-catalog-backend-module-gerrit +## 0.1.11-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-tasks@0.5.0-next.2 + - @backstage/backend-common@0.18.3-next.2 + - @backstage/backend-plugin-api@0.4.1-next.2 + - @backstage/plugin-catalog-backend@1.8.0-next.2 + - @backstage/plugin-catalog-node@1.3.4-next.2 + - @backstage/config@1.0.7-next.0 + - @backstage/integration@1.4.3-next.0 + ## 0.1.11-next.1 ### Patch Changes diff --git a/plugins/catalog-backend-module-gerrit/alpha-api-report.md b/plugins/catalog-backend-module-gerrit/alpha-api-report.md index 03f5d099b9..5aee61f28a 100644 --- a/plugins/catalog-backend-module-gerrit/alpha-api-report.md +++ b/plugins/catalog-backend-module-gerrit/alpha-api-report.md @@ -6,7 +6,7 @@ import { BackendFeature } from '@backstage/backend-plugin-api'; // @alpha (undocumented) -export const gerritEntityProviderCatalogModule: () => BackendFeature; +export const catalogModuleGerritEntityProvider: () => BackendFeature; // (No @packageDocumentation comment for this package) ``` diff --git a/plugins/catalog-backend-module-gerrit/api-report.md b/plugins/catalog-backend-module-gerrit/api-report.md index 1dee786da1..f64e697555 100644 --- a/plugins/catalog-backend-module-gerrit/api-report.md +++ b/plugins/catalog-backend-module-gerrit/api-report.md @@ -4,8 +4,8 @@ ```ts import { Config } from '@backstage/config'; -import { EntityProvider } from '@backstage/plugin-catalog-backend'; -import { EntityProviderConnection } from '@backstage/plugin-catalog-backend'; +import { EntityProvider } from '@backstage/plugin-catalog-node'; +import { EntityProviderConnection } from '@backstage/plugin-catalog-node'; import { Logger } from 'winston'; import { PluginTaskScheduler } from '@backstage/backend-tasks'; import { TaskRunner } from '@backstage/backend-tasks'; diff --git a/plugins/catalog-backend-module-gerrit/package.json b/plugins/catalog-backend-module-gerrit/package.json index 357b5416bf..af9727cbf9 100644 --- a/plugins/catalog-backend-module-gerrit/package.json +++ b/plugins/catalog-backend-module-gerrit/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-backend-module-gerrit", - "version": "0.1.11-next.1", + "version": "0.1.11-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -48,7 +48,6 @@ "@backstage/config": "workspace:^", "@backstage/errors": "workspace:^", "@backstage/integration": "workspace:^", - "@backstage/plugin-catalog-backend": "workspace:^", "@backstage/plugin-catalog-node": "workspace:^", "fs-extra": "10.1.0", "node-fetch": "^2.6.7", diff --git a/plugins/catalog-backend-module-gerrit/src/alpha.ts b/plugins/catalog-backend-module-gerrit/src/alpha.ts index 8b03d9312a..c277a0a680 100644 --- a/plugins/catalog-backend-module-gerrit/src/alpha.ts +++ b/plugins/catalog-backend-module-gerrit/src/alpha.ts @@ -14,4 +14,4 @@ * limitations under the License. */ -export { gerritEntityProviderCatalogModule } from './service/GerritEntityProviderCatalogModule'; +export * from './module'; diff --git a/plugins/catalog-backend-module-gerrit/src/service/GerritEntityProviderCatalogModule.test.ts b/plugins/catalog-backend-module-gerrit/src/module/catalogModuleGerritEntityProvider.test.ts similarity index 93% rename from plugins/catalog-backend-module-gerrit/src/service/GerritEntityProviderCatalogModule.test.ts rename to plugins/catalog-backend-module-gerrit/src/module/catalogModuleGerritEntityProvider.test.ts index 51c1749c66..0511aa7b4c 100644 --- a/plugins/catalog-backend-module-gerrit/src/service/GerritEntityProviderCatalogModule.test.ts +++ b/plugins/catalog-backend-module-gerrit/src/module/catalogModuleGerritEntityProvider.test.ts @@ -24,10 +24,10 @@ import { startTestBackend } from '@backstage/backend-test-utils'; import { ConfigReader } from '@backstage/config'; import { catalogProcessingExtensionPoint } from '@backstage/plugin-catalog-node/alpha'; import { Duration } from 'luxon'; -import { gerritEntityProviderCatalogModule } from './GerritEntityProviderCatalogModule'; +import { catalogModuleGerritEntityProvider } from './catalogModuleGerritEntityProvider'; import { GerritEntityProvider } from '../providers/GerritEntityProvider'; -describe('gerritEntityProviderCatalogModule', () => { +describe('catalogModuleGerritEntityProvider', () => { it('should register provider at the catalog extension point', async () => { let addedProviders: Array | undefined; let usedSchedule: TaskScheduleDefinition | undefined; @@ -79,7 +79,7 @@ describe('gerritEntityProviderCatalogModule', () => { [coreServices.logger, getVoidLogger()], [coreServices.scheduler, scheduler], ], - features: [gerritEntityProviderCatalogModule()], + features: [catalogModuleGerritEntityProvider()], }); expect(usedSchedule?.frequency).toEqual(Duration.fromISO('P1M')); diff --git a/plugins/catalog-backend-module-gerrit/src/service/GerritEntityProviderCatalogModule.ts b/plugins/catalog-backend-module-gerrit/src/module/catalogModuleGerritEntityProvider.ts similarity index 96% rename from plugins/catalog-backend-module-gerrit/src/service/GerritEntityProviderCatalogModule.ts rename to plugins/catalog-backend-module-gerrit/src/module/catalogModuleGerritEntityProvider.ts index 782c724094..814259fb40 100644 --- a/plugins/catalog-backend-module-gerrit/src/service/GerritEntityProviderCatalogModule.ts +++ b/plugins/catalog-backend-module-gerrit/src/module/catalogModuleGerritEntityProvider.ts @@ -25,7 +25,7 @@ import { GerritEntityProvider } from '../providers/GerritEntityProvider'; /** * @alpha */ -export const gerritEntityProviderCatalogModule = createBackendModule({ +export const catalogModuleGerritEntityProvider = createBackendModule({ pluginId: 'catalog', moduleId: 'gerritEntityProvider', register(env) { diff --git a/plugins/catalog-backend-module-gerrit/src/module/index.ts b/plugins/catalog-backend-module-gerrit/src/module/index.ts new file mode 100644 index 0000000000..95760538e7 --- /dev/null +++ b/plugins/catalog-backend-module-gerrit/src/module/index.ts @@ -0,0 +1,17 @@ +/* + * Copyright 2023 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +export { catalogModuleGerritEntityProvider } from './catalogModuleGerritEntityProvider'; diff --git a/plugins/catalog-backend-module-gerrit/src/providers/GerritEntityProvider.test.ts b/plugins/catalog-backend-module-gerrit/src/providers/GerritEntityProvider.test.ts index 5d258ee94f..9892b60a21 100644 --- a/plugins/catalog-backend-module-gerrit/src/providers/GerritEntityProvider.test.ts +++ b/plugins/catalog-backend-module-gerrit/src/providers/GerritEntityProvider.test.ts @@ -22,7 +22,7 @@ import { } from '@backstage/backend-tasks'; import { setupRequestMockHandlers } from '@backstage/backend-test-utils'; import { ConfigReader } from '@backstage/config'; -import { EntityProviderConnection } from '@backstage/plugin-catalog-backend'; +import { EntityProviderConnection } from '@backstage/plugin-catalog-node'; import fs from 'fs-extra'; import { rest } from 'msw'; import { setupServer } from 'msw/node'; diff --git a/plugins/catalog-backend-module-gerrit/src/providers/GerritEntityProvider.ts b/plugins/catalog-backend-module-gerrit/src/providers/GerritEntityProvider.ts index 986f8ae60c..76cccaf37b 100644 --- a/plugins/catalog-backend-module-gerrit/src/providers/GerritEntityProvider.ts +++ b/plugins/catalog-backend-module-gerrit/src/providers/GerritEntityProvider.ts @@ -22,7 +22,7 @@ import { EntityProviderConnection, LocationSpec, locationSpecToLocationEntity, -} from '@backstage/plugin-catalog-backend'; +} from '@backstage/plugin-catalog-node'; import fetch, { Response } from 'node-fetch'; import { GerritIntegration, diff --git a/plugins/catalog-backend-module-github/CHANGELOG.md b/plugins/catalog-backend-module-github/CHANGELOG.md index c7e9e756ba..1e0c455391 100644 --- a/plugins/catalog-backend-module-github/CHANGELOG.md +++ b/plugins/catalog-backend-module-github/CHANGELOG.md @@ -1,5 +1,20 @@ # @backstage/plugin-catalog-backend-module-github +## 0.2.6-next.2 + +### Patch Changes + +- 65454876fb2: Minor API report tweaks +- Updated dependencies + - @backstage/backend-tasks@0.5.0-next.2 + - @backstage/backend-common@0.18.3-next.2 + - @backstage/backend-plugin-api@0.4.1-next.2 + - @backstage/plugin-catalog-backend@1.8.0-next.2 + - @backstage/plugin-catalog-node@1.3.4-next.2 + - @backstage/plugin-events-node@0.2.4-next.2 + - @backstage/config@1.0.7-next.0 + - @backstage/integration@1.4.3-next.0 + ## 0.2.6-next.1 ### Patch Changes diff --git a/plugins/catalog-backend-module-github/alpha-api-report.md b/plugins/catalog-backend-module-github/alpha-api-report.md index eb13ec4558..0d4e16b4ea 100644 --- a/plugins/catalog-backend-module-github/alpha-api-report.md +++ b/plugins/catalog-backend-module-github/alpha-api-report.md @@ -6,7 +6,7 @@ import { BackendFeature } from '@backstage/backend-plugin-api'; // @alpha -export const githubEntityProviderCatalogModule: () => BackendFeature; +export const catalogModuleGithubEntityProvider: () => BackendFeature; // (No @packageDocumentation comment for this package) ``` diff --git a/plugins/catalog-backend-module-github/api-report.md b/plugins/catalog-backend-module-github/api-report.md index c732740997..23faa31495 100644 --- a/plugins/catalog-backend-module-github/api-report.md +++ b/plugins/catalog-backend-module-github/api-report.md @@ -4,19 +4,19 @@ ```ts import { AnalyzeOptions } from '@backstage/plugin-catalog-backend'; -import { CatalogProcessor } from '@backstage/plugin-catalog-backend'; -import { CatalogProcessorEmit } from '@backstage/plugin-catalog-backend'; +import { CatalogProcessor } from '@backstage/plugin-catalog-node'; +import { CatalogProcessorEmit } from '@backstage/plugin-catalog-node'; import { Config } from '@backstage/config'; import { Entity } from '@backstage/catalog-model'; -import { EntityProvider } from '@backstage/plugin-catalog-backend'; -import { EntityProviderConnection } from '@backstage/plugin-catalog-backend'; +import { EntityProvider } from '@backstage/plugin-catalog-node'; +import { EntityProviderConnection } from '@backstage/plugin-catalog-node'; import { EventParams } from '@backstage/plugin-events-node'; import { EventSubscriber } from '@backstage/plugin-events-node'; import { GithubCredentialsProvider } from '@backstage/integration'; import { GithubIntegrationConfig } from '@backstage/integration'; import { graphql } from '@octokit/graphql'; import { GroupEntity } from '@backstage/catalog-model'; -import { LocationSpec } from '@backstage/plugin-catalog-backend'; +import { LocationSpec } from '@backstage/plugin-catalog-node'; import { Logger } from 'winston'; import { PluginEndpointDiscovery } from '@backstage/backend-common'; import { PluginTaskScheduler } from '@backstage/backend-tasks'; diff --git a/plugins/catalog-backend-module-github/package.json b/plugins/catalog-backend-module-github/package.json index 733c3e8dc3..fe9183917e 100644 --- a/plugins/catalog-backend-module-github/package.json +++ b/plugins/catalog-backend-module-github/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-catalog-backend-module-github", "description": "A Backstage catalog backend module that helps integrate towards GitHub", - "version": "0.2.6-next.1", + "version": "0.2.6-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog-backend-module-github/src/alpha.ts b/plugins/catalog-backend-module-github/src/alpha.ts index 1b83eead82..c277a0a680 100644 --- a/plugins/catalog-backend-module-github/src/alpha.ts +++ b/plugins/catalog-backend-module-github/src/alpha.ts @@ -14,4 +14,4 @@ * limitations under the License. */ -export { githubEntityProviderCatalogModule } from './service/GithubEntityProviderCatalogModule'; +export * from './module'; diff --git a/plugins/catalog-backend-module-github/src/deprecated.ts b/plugins/catalog-backend-module-github/src/deprecated.ts index d094bb4031..e27a856358 100644 --- a/plugins/catalog-backend-module-github/src/deprecated.ts +++ b/plugins/catalog-backend-module-github/src/deprecated.ts @@ -19,7 +19,7 @@ import { Config } from '@backstage/config'; import { EntityProvider, EntityProviderConnection, -} from '@backstage/plugin-catalog-backend'; +} from '@backstage/plugin-catalog-node'; import { Logger } from 'winston'; import { GithubEntityProvider } from './providers/GithubEntityProvider'; import { diff --git a/plugins/catalog-backend-module-github/src/lib/github.ts b/plugins/catalog-backend-module-github/src/lib/github.ts index ae6e14fc23..30e7bd83d4 100644 --- a/plugins/catalog-backend-module-github/src/lib/github.ts +++ b/plugins/catalog-backend-module-github/src/lib/github.ts @@ -26,7 +26,7 @@ import { } from './defaultTransformers'; import { withLocations } from '../providers/GithubOrgEntityProvider'; -import { DeferredEntity } from '@backstage/plugin-catalog-backend'; +import { DeferredEntity } from '@backstage/plugin-catalog-node'; // Graphql types @@ -195,7 +195,7 @@ export async function getOrganizationTeams( parentTeam { slug } members(first: 100, membership: IMMEDIATE) { pageInfo { hasNextPage } - nodes { + nodes { avatarUrl, bio, email, diff --git a/plugins/catalog-backend-module-github/src/service/GithubEntityProviderCatalogModule.test.ts b/plugins/catalog-backend-module-github/src/module/catalogModuleGithubEntityProvider.test.ts similarity index 92% rename from plugins/catalog-backend-module-github/src/service/GithubEntityProviderCatalogModule.test.ts rename to plugins/catalog-backend-module-github/src/module/catalogModuleGithubEntityProvider.test.ts index 7c08e8947d..82a5552dba 100644 --- a/plugins/catalog-backend-module-github/src/service/GithubEntityProviderCatalogModule.test.ts +++ b/plugins/catalog-backend-module-github/src/module/catalogModuleGithubEntityProvider.test.ts @@ -24,10 +24,10 @@ import { startTestBackend } from '@backstage/backend-test-utils'; import { ConfigReader } from '@backstage/config'; import { catalogProcessingExtensionPoint } from '@backstage/plugin-catalog-node/alpha'; import { Duration } from 'luxon'; -import { githubEntityProviderCatalogModule } from './GithubEntityProviderCatalogModule'; +import { catalogModuleGithubEntityProvider } from './catalogModuleGithubEntityProvider'; import { GithubEntityProvider } from '../providers/GithubEntityProvider'; -describe('githubEntityProviderCatalogModule', () => { +describe('catalogModuleGithubEntityProvider', () => { it('should register provider at the catalog extension point', async () => { let addedProviders: Array | undefined; let usedSchedule: TaskScheduleDefinition | undefined; @@ -66,7 +66,7 @@ describe('githubEntityProviderCatalogModule', () => { [coreServices.logger, getVoidLogger()], [coreServices.scheduler, scheduler], ], - features: [githubEntityProviderCatalogModule()], + features: [catalogModuleGithubEntityProvider()], }); expect(usedSchedule?.frequency).toEqual(Duration.fromISO('P1M')); diff --git a/plugins/catalog-backend-module-github/src/service/GithubEntityProviderCatalogModule.ts b/plugins/catalog-backend-module-github/src/module/catalogModuleGithubEntityProvider.ts similarity index 96% rename from plugins/catalog-backend-module-github/src/service/GithubEntityProviderCatalogModule.ts rename to plugins/catalog-backend-module-github/src/module/catalogModuleGithubEntityProvider.ts index 246f700248..997da3023b 100644 --- a/plugins/catalog-backend-module-github/src/service/GithubEntityProviderCatalogModule.ts +++ b/plugins/catalog-backend-module-github/src/module/catalogModuleGithubEntityProvider.ts @@ -27,7 +27,7 @@ import { GithubEntityProvider } from '../providers/GithubEntityProvider'; * * @alpha */ -export const githubEntityProviderCatalogModule = createBackendModule({ +export const catalogModuleGithubEntityProvider = createBackendModule({ pluginId: 'catalog', moduleId: 'githubEntityProvider', register(env) { diff --git a/plugins/catalog-backend-module-github/src/module/index.ts b/plugins/catalog-backend-module-github/src/module/index.ts new file mode 100644 index 0000000000..640a633093 --- /dev/null +++ b/plugins/catalog-backend-module-github/src/module/index.ts @@ -0,0 +1,17 @@ +/* + * Copyright 2023 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +export { catalogModuleGithubEntityProvider } from './catalogModuleGithubEntityProvider'; diff --git a/plugins/catalog-backend-module-github/src/processors/GithubDiscoveryProcessor.test.ts b/plugins/catalog-backend-module-github/src/processors/GithubDiscoveryProcessor.test.ts index f30007c677..f008c88dbe 100644 --- a/plugins/catalog-backend-module-github/src/processors/GithubDiscoveryProcessor.test.ts +++ b/plugins/catalog-backend-module-github/src/processors/GithubDiscoveryProcessor.test.ts @@ -20,7 +20,7 @@ import { DefaultGithubCredentialsProvider, ScmIntegrations, } from '@backstage/integration'; -import { LocationSpec } from '@backstage/plugin-catalog-backend'; +import { LocationSpec } from '@backstage/plugin-catalog-node'; import { GithubDiscoveryProcessor, parseUrl } from './GithubDiscoveryProcessor'; import { getOrganizationRepositories } from '../lib'; diff --git a/plugins/catalog-backend-module-github/src/processors/GithubDiscoveryProcessor.ts b/plugins/catalog-backend-module-github/src/processors/GithubDiscoveryProcessor.ts index c6733df13b..0907b8ac8d 100644 --- a/plugins/catalog-backend-module-github/src/processors/GithubDiscoveryProcessor.ts +++ b/plugins/catalog-backend-module-github/src/processors/GithubDiscoveryProcessor.ts @@ -26,7 +26,7 @@ import { CatalogProcessorEmit, LocationSpec, processingResult, -} from '@backstage/plugin-catalog-backend'; +} from '@backstage/plugin-catalog-node'; import { graphql } from '@octokit/graphql'; import { Logger } from 'winston'; import { getOrganizationRepositories } from '../lib'; diff --git a/plugins/catalog-backend-module-github/src/processors/GithubMultiOrgReaderProcessor.ts b/plugins/catalog-backend-module-github/src/processors/GithubMultiOrgReaderProcessor.ts index 7777da6b1b..9709977010 100644 --- a/plugins/catalog-backend-module-github/src/processors/GithubMultiOrgReaderProcessor.ts +++ b/plugins/catalog-backend-module-github/src/processors/GithubMultiOrgReaderProcessor.ts @@ -34,7 +34,7 @@ import { CatalogProcessorEmit, LocationSpec, processingResult, -} from '@backstage/plugin-catalog-backend'; +} from '@backstage/plugin-catalog-node'; import { graphql } from '@octokit/graphql'; import { Logger } from 'winston'; import { diff --git a/plugins/catalog-backend-module-github/src/processors/GithubOrgReaderProcessor.test.ts b/plugins/catalog-backend-module-github/src/processors/GithubOrgReaderProcessor.test.ts index ce81e2cf42..195214d561 100644 --- a/plugins/catalog-backend-module-github/src/processors/GithubOrgReaderProcessor.test.ts +++ b/plugins/catalog-backend-module-github/src/processors/GithubOrgReaderProcessor.test.ts @@ -20,7 +20,7 @@ import { GithubCredentialsProvider, ScmIntegrations, } from '@backstage/integration'; -import { LocationSpec } from '@backstage/plugin-catalog-backend'; +import { LocationSpec } from '@backstage/plugin-catalog-node'; import { graphql } from '@octokit/graphql'; import { GithubOrgReaderProcessor } from './GithubOrgReaderProcessor'; diff --git a/plugins/catalog-backend-module-github/src/processors/GithubOrgReaderProcessor.ts b/plugins/catalog-backend-module-github/src/processors/GithubOrgReaderProcessor.ts index 90c168ccf4..654deb3079 100644 --- a/plugins/catalog-backend-module-github/src/processors/GithubOrgReaderProcessor.ts +++ b/plugins/catalog-backend-module-github/src/processors/GithubOrgReaderProcessor.ts @@ -27,7 +27,7 @@ import { CatalogProcessorEmit, LocationSpec, processingResult, -} from '@backstage/plugin-catalog-backend'; +} from '@backstage/plugin-catalog-node'; import { graphql } from '@octokit/graphql'; import { Logger } from 'winston'; import { diff --git a/plugins/catalog-backend-module-github/src/providers/GithubEntityProvider.test.ts b/plugins/catalog-backend-module-github/src/providers/GithubEntityProvider.test.ts index 2be5df09fe..21e6a46fbf 100644 --- a/plugins/catalog-backend-module-github/src/providers/GithubEntityProvider.test.ts +++ b/plugins/catalog-backend-module-github/src/providers/GithubEntityProvider.test.ts @@ -21,7 +21,7 @@ import { TaskRunner, } from '@backstage/backend-tasks'; import { ConfigReader } from '@backstage/config'; -import { EntityProviderConnection } from '@backstage/plugin-catalog-backend'; +import { EntityProviderConnection } from '@backstage/plugin-catalog-node'; import { GithubEntityProvider } from './GithubEntityProvider'; import * as helpers from '../lib/github'; import { EventParams } from '@backstage/plugin-events-node'; diff --git a/plugins/catalog-backend-module-github/src/providers/GithubEntityProvider.ts b/plugins/catalog-backend-module-github/src/providers/GithubEntityProvider.ts index 3c6fd43bd0..839f40e91a 100644 --- a/plugins/catalog-backend-module-github/src/providers/GithubEntityProvider.ts +++ b/plugins/catalog-backend-module-github/src/providers/GithubEntityProvider.ts @@ -28,7 +28,7 @@ import { EntityProvider, EntityProviderConnection, locationSpecToLocationEntity, -} from '@backstage/plugin-catalog-backend'; +} from '@backstage/plugin-catalog-node'; import { LocationSpec } from '@backstage/plugin-catalog-common'; diff --git a/plugins/catalog-backend-module-github/src/providers/GithubOrgEntityProvider.test.ts b/plugins/catalog-backend-module-github/src/providers/GithubOrgEntityProvider.test.ts index 2711425998..ff42e42718 100644 --- a/plugins/catalog-backend-module-github/src/providers/GithubOrgEntityProvider.test.ts +++ b/plugins/catalog-backend-module-github/src/providers/GithubOrgEntityProvider.test.ts @@ -20,7 +20,7 @@ import { GithubCredentialsProvider, GithubIntegrationConfig, } from '@backstage/integration'; -import { EntityProviderConnection } from '@backstage/plugin-catalog-backend'; +import { EntityProviderConnection } from '@backstage/plugin-catalog-node'; import { graphql } from '@octokit/graphql'; import { EventParams } from '@backstage/plugin-events-node'; import { diff --git a/plugins/catalog-backend-module-github/src/providers/GithubOrgEntityProvider.ts b/plugins/catalog-backend-module-github/src/providers/GithubOrgEntityProvider.ts index 2a888e6f91..02e225c938 100644 --- a/plugins/catalog-backend-module-github/src/providers/GithubOrgEntityProvider.ts +++ b/plugins/catalog-backend-module-github/src/providers/GithubOrgEntityProvider.ts @@ -33,7 +33,7 @@ import { EventSubscriber } from '@backstage/plugin-events-node'; import { EntityProvider, EntityProviderConnection, -} from '@backstage/plugin-catalog-backend'; +} from '@backstage/plugin-catalog-node'; import { graphql } from '@octokit/graphql'; import { OrganizationEvent, diff --git a/plugins/catalog-backend-module-gitlab/CHANGELOG.md b/plugins/catalog-backend-module-gitlab/CHANGELOG.md index c7e0a592ca..491d972754 100644 --- a/plugins/catalog-backend-module-gitlab/CHANGELOG.md +++ b/plugins/catalog-backend-module-gitlab/CHANGELOG.md @@ -1,5 +1,19 @@ # @backstage/plugin-catalog-backend-module-gitlab +## 0.1.14-next.2 + +### Patch Changes + +- be129f8f3cd: filter gitlab groups by prefix +- Updated dependencies + - @backstage/backend-tasks@0.5.0-next.2 + - @backstage/backend-common@0.18.3-next.2 + - @backstage/backend-plugin-api@0.4.1-next.2 + - @backstage/plugin-catalog-backend@1.8.0-next.2 + - @backstage/plugin-catalog-node@1.3.4-next.2 + - @backstage/config@1.0.7-next.0 + - @backstage/integration@1.4.3-next.0 + ## 0.1.14-next.1 ### Patch Changes diff --git a/plugins/catalog-backend-module-gitlab/alpha-api-report.md b/plugins/catalog-backend-module-gitlab/alpha-api-report.md index 8912b4a7b2..f14b41d6c5 100644 --- a/plugins/catalog-backend-module-gitlab/alpha-api-report.md +++ b/plugins/catalog-backend-module-gitlab/alpha-api-report.md @@ -6,7 +6,7 @@ import { BackendFeature } from '@backstage/backend-plugin-api'; // @alpha -export const gitlabDiscoveryEntityProviderCatalogModule: () => BackendFeature; +export const catalogModuleGitlabDiscoveryEntityProvider: () => BackendFeature; // (No @packageDocumentation comment for this package) ``` diff --git a/plugins/catalog-backend-module-gitlab/api-report.md b/plugins/catalog-backend-module-gitlab/api-report.md index 68ea45169f..2596b5c99a 100644 --- a/plugins/catalog-backend-module-gitlab/api-report.md +++ b/plugins/catalog-backend-module-gitlab/api-report.md @@ -3,12 +3,12 @@ > Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/). ```ts -import { CatalogProcessor } from '@backstage/plugin-catalog-backend'; -import { CatalogProcessorEmit } from '@backstage/plugin-catalog-backend'; +import { CatalogProcessor } from '@backstage/plugin-catalog-node'; +import { CatalogProcessorEmit } from '@backstage/plugin-catalog-node'; import { Config } from '@backstage/config'; -import { EntityProvider } from '@backstage/plugin-catalog-backend'; -import { EntityProviderConnection } from '@backstage/plugin-catalog-backend'; -import { LocationSpec } from '@backstage/plugin-catalog-backend'; +import { EntityProvider } from '@backstage/plugin-catalog-node'; +import { EntityProviderConnection } from '@backstage/plugin-catalog-node'; +import { LocationSpec } from '@backstage/plugin-catalog-node'; import { Logger } from 'winston'; import { PluginTaskScheduler } from '@backstage/backend-tasks'; import { TaskRunner } from '@backstage/backend-tasks'; diff --git a/plugins/catalog-backend-module-gitlab/package.json b/plugins/catalog-backend-module-gitlab/package.json index f2042e4f8e..ed07ea842c 100644 --- a/plugins/catalog-backend-module-gitlab/package.json +++ b/plugins/catalog-backend-module-gitlab/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-catalog-backend-module-gitlab", "description": "A Backstage catalog backend module that helps integrate towards GitLab", - "version": "0.1.14-next.1", + "version": "0.1.14-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -52,7 +52,6 @@ "@backstage/config": "workspace:^", "@backstage/errors": "workspace:^", "@backstage/integration": "workspace:^", - "@backstage/plugin-catalog-backend": "workspace:^", "@backstage/plugin-catalog-node": "workspace:^", "@backstage/types": "workspace:^", "lodash": "^4.17.21", diff --git a/plugins/catalog-backend-module-gitlab/src/GitLabDiscoveryProcessor.test.ts b/plugins/catalog-backend-module-gitlab/src/GitLabDiscoveryProcessor.test.ts index 385ce59bfb..6333184ea8 100644 --- a/plugins/catalog-backend-module-gitlab/src/GitLabDiscoveryProcessor.test.ts +++ b/plugins/catalog-backend-module-gitlab/src/GitLabDiscoveryProcessor.test.ts @@ -17,7 +17,7 @@ import { getVoidLogger } from '@backstage/backend-common'; import { setupRequestMockHandlers } from '@backstage/backend-test-utils'; import { ConfigReader } from '@backstage/config'; -import { LocationSpec } from '@backstage/plugin-catalog-backend'; +import { LocationSpec } from '@backstage/plugin-catalog-node'; import { rest, RestRequest } from 'msw'; import { setupServer } from 'msw/node'; import { GitLabDiscoveryProcessor, parseUrl } from './GitLabDiscoveryProcessor'; diff --git a/plugins/catalog-backend-module-gitlab/src/GitLabDiscoveryProcessor.ts b/plugins/catalog-backend-module-gitlab/src/GitLabDiscoveryProcessor.ts index 756093bc56..9f2cd9b17a 100644 --- a/plugins/catalog-backend-module-gitlab/src/GitLabDiscoveryProcessor.ts +++ b/plugins/catalog-backend-module-gitlab/src/GitLabDiscoveryProcessor.ts @@ -29,7 +29,7 @@ import { CatalogProcessorEmit, LocationSpec, processingResult, -} from '@backstage/plugin-catalog-backend'; +} from '@backstage/plugin-catalog-node'; import { Logger } from 'winston'; import { GitLabClient, GitLabProject, paginated } from './lib'; diff --git a/plugins/catalog-backend-module-gitlab/src/alpha.ts b/plugins/catalog-backend-module-gitlab/src/alpha.ts index 883ffc13c4..ace970e3aa 100644 --- a/plugins/catalog-backend-module-gitlab/src/alpha.ts +++ b/plugins/catalog-backend-module-gitlab/src/alpha.ts @@ -14,4 +14,4 @@ * limitations under the License. */ -export { gitlabDiscoveryEntityProviderCatalogModule } from './service/GitlabDiscoveryEntityProviderCatalogModule'; +export { catalogModuleGitlabDiscoveryEntityProvider } from './module/catalogModuleGitlabDiscoveryEntityProvider'; diff --git a/plugins/catalog-backend-module-gitlab/src/service/GitlabDiscoveryEntityProviderCatalogModule.test.ts b/plugins/catalog-backend-module-gitlab/src/module/catalogModuleGitlabDiscoveryEntityProvider.test.ts similarity index 92% rename from plugins/catalog-backend-module-gitlab/src/service/GitlabDiscoveryEntityProviderCatalogModule.test.ts rename to plugins/catalog-backend-module-gitlab/src/module/catalogModuleGitlabDiscoveryEntityProvider.test.ts index efb86e4223..7a3d0a0e0d 100644 --- a/plugins/catalog-backend-module-gitlab/src/service/GitlabDiscoveryEntityProviderCatalogModule.test.ts +++ b/plugins/catalog-backend-module-gitlab/src/module/catalogModuleGitlabDiscoveryEntityProvider.test.ts @@ -24,10 +24,10 @@ import { startTestBackend } from '@backstage/backend-test-utils'; import { ConfigReader } from '@backstage/config'; import { catalogProcessingExtensionPoint } from '@backstage/plugin-catalog-node/alpha'; import { Duration } from 'luxon'; -import { gitlabDiscoveryEntityProviderCatalogModule } from './GitlabDiscoveryEntityProviderCatalogModule'; +import { catalogModuleGitlabDiscoveryEntityProvider } from './catalogModuleGitlabDiscoveryEntityProvider'; import { GitlabDiscoveryEntityProvider } from '../providers'; -describe('gitlabDiscoveryEntityProviderCatalogModule', () => { +describe('catalogModuleGitlabDiscoveryEntityProvider', () => { it('should register provider at the catalog extension point', async () => { let addedProviders: Array | undefined; let usedSchedule: TaskScheduleDefinition | undefined; @@ -78,7 +78,7 @@ describe('gitlabDiscoveryEntityProviderCatalogModule', () => { [coreServices.logger, getVoidLogger()], [coreServices.scheduler, scheduler], ], - features: [gitlabDiscoveryEntityProviderCatalogModule()], + features: [catalogModuleGitlabDiscoveryEntityProvider()], }); expect(usedSchedule?.frequency).toEqual(Duration.fromISO('P1M')); diff --git a/plugins/catalog-backend-module-gitlab/src/service/GitlabDiscoveryEntityProviderCatalogModule.ts b/plugins/catalog-backend-module-gitlab/src/module/catalogModuleGitlabDiscoveryEntityProvider.ts similarity index 96% rename from plugins/catalog-backend-module-gitlab/src/service/GitlabDiscoveryEntityProviderCatalogModule.ts rename to plugins/catalog-backend-module-gitlab/src/module/catalogModuleGitlabDiscoveryEntityProvider.ts index 0adf5b18f2..ffae233319 100644 --- a/plugins/catalog-backend-module-gitlab/src/service/GitlabDiscoveryEntityProviderCatalogModule.ts +++ b/plugins/catalog-backend-module-gitlab/src/module/catalogModuleGitlabDiscoveryEntityProvider.ts @@ -27,7 +27,7 @@ import { GitlabDiscoveryEntityProvider } from '../providers'; * * @alpha */ -export const gitlabDiscoveryEntityProviderCatalogModule = createBackendModule({ +export const catalogModuleGitlabDiscoveryEntityProvider = createBackendModule({ pluginId: 'catalog', moduleId: 'gitlabDiscoveryEntityProvider', register(env) { diff --git a/plugins/catalog-backend-module-gitlab/src/providers/GitlabDiscoveryEntityProvider.test.ts b/plugins/catalog-backend-module-gitlab/src/providers/GitlabDiscoveryEntityProvider.test.ts index ae19edc48c..42fa1b471c 100644 --- a/plugins/catalog-backend-module-gitlab/src/providers/GitlabDiscoveryEntityProvider.test.ts +++ b/plugins/catalog-backend-module-gitlab/src/providers/GitlabDiscoveryEntityProvider.test.ts @@ -22,7 +22,7 @@ import { } from '@backstage/backend-tasks'; import { setupRequestMockHandlers } from '@backstage/backend-test-utils'; import { ConfigReader } from '@backstage/config'; -import { EntityProviderConnection } from '@backstage/plugin-catalog-backend'; +import { EntityProviderConnection } from '@backstage/plugin-catalog-node'; import { rest } from 'msw'; import { setupServer } from 'msw/node'; import { GitlabDiscoveryEntityProvider } from './GitlabDiscoveryEntityProvider'; diff --git a/plugins/catalog-backend-module-gitlab/src/providers/GitlabDiscoveryEntityProvider.ts b/plugins/catalog-backend-module-gitlab/src/providers/GitlabDiscoveryEntityProvider.ts index f0d88c34f5..ece10ee8c6 100644 --- a/plugins/catalog-backend-module-gitlab/src/providers/GitlabDiscoveryEntityProvider.ts +++ b/plugins/catalog-backend-module-gitlab/src/providers/GitlabDiscoveryEntityProvider.ts @@ -22,7 +22,7 @@ import { EntityProviderConnection, LocationSpec, locationSpecToLocationEntity, -} from '@backstage/plugin-catalog-backend'; +} from '@backstage/plugin-catalog-node'; import * as uuid from 'uuid'; import { Logger } from 'winston'; import { diff --git a/plugins/catalog-backend-module-gitlab/src/providers/GitlabOrgDiscoveryEntityProvider.test.ts b/plugins/catalog-backend-module-gitlab/src/providers/GitlabOrgDiscoveryEntityProvider.test.ts index cff215acd3..5a323a8dec 100644 --- a/plugins/catalog-backend-module-gitlab/src/providers/GitlabOrgDiscoveryEntityProvider.test.ts +++ b/plugins/catalog-backend-module-gitlab/src/providers/GitlabOrgDiscoveryEntityProvider.test.ts @@ -22,7 +22,7 @@ import { } from '@backstage/backend-tasks'; import { setupRequestMockHandlers } from '@backstage/backend-test-utils'; import { ConfigReader } from '@backstage/config'; -import { EntityProviderConnection } from '@backstage/plugin-catalog-backend'; +import { EntityProviderConnection } from '@backstage/plugin-catalog-node'; import { rest } from 'msw'; import { setupServer } from 'msw/node'; import { GitlabOrgDiscoveryEntityProvider } from './GitlabOrgDiscoveryEntityProvider'; diff --git a/plugins/catalog-backend-module-gitlab/src/providers/GitlabOrgDiscoveryEntityProvider.ts b/plugins/catalog-backend-module-gitlab/src/providers/GitlabOrgDiscoveryEntityProvider.ts index db1efac86d..acfa784c2e 100644 --- a/plugins/catalog-backend-module-gitlab/src/providers/GitlabOrgDiscoveryEntityProvider.ts +++ b/plugins/catalog-backend-module-gitlab/src/providers/GitlabOrgDiscoveryEntityProvider.ts @@ -20,7 +20,7 @@ import { GitLabIntegration, ScmIntegrations } from '@backstage/integration'; import { EntityProvider, EntityProviderConnection, -} from '@backstage/plugin-catalog-backend'; +} from '@backstage/plugin-catalog-node'; import * as uuid from 'uuid'; import { Logger } from 'winston'; import { diff --git a/plugins/catalog-backend-module-incremental-ingestion/CHANGELOG.md b/plugins/catalog-backend-module-incremental-ingestion/CHANGELOG.md index ad4649ab7f..11393c6db2 100644 --- a/plugins/catalog-backend-module-incremental-ingestion/CHANGELOG.md +++ b/plugins/catalog-backend-module-incremental-ingestion/CHANGELOG.md @@ -1,5 +1,18 @@ # @backstage/plugin-catalog-backend-module-incremental-ingestion +## 0.3.0-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-tasks@0.5.0-next.2 + - @backstage/backend-common@0.18.3-next.2 + - @backstage/backend-plugin-api@0.4.1-next.2 + - @backstage/plugin-catalog-backend@1.8.0-next.2 + - @backstage/plugin-catalog-node@1.3.4-next.2 + - @backstage/plugin-events-node@0.2.4-next.2 + - @backstage/config@1.0.7-next.0 + ## 0.3.0-next.1 ### Minor Changes diff --git a/plugins/catalog-backend-module-incremental-ingestion/alpha-api-report.md b/plugins/catalog-backend-module-incremental-ingestion/alpha-api-report.md index ec9c59a4c4..b11ec43cf5 100644 --- a/plugins/catalog-backend-module-incremental-ingestion/alpha-api-report.md +++ b/plugins/catalog-backend-module-incremental-ingestion/alpha-api-report.md @@ -8,7 +8,7 @@ import { IncrementalEntityProvider } from '@backstage/plugin-catalog-backend-mod import { IncrementalEntityProviderOptions } from '@backstage/plugin-catalog-backend-module-incremental-ingestion'; // @alpha -export const incrementalIngestionEntityProviderCatalogModule: (options: { +export const catalogModuleIncrementalIngestionEntityProvider: (options: { providers: { provider: IncrementalEntityProvider; options: IncrementalEntityProviderOptions; diff --git a/plugins/catalog-backend-module-incremental-ingestion/api-report.md b/plugins/catalog-backend-module-incremental-ingestion/api-report.md index 167c07f70f..c2fad4576c 100644 --- a/plugins/catalog-backend-module-incremental-ingestion/api-report.md +++ b/plugins/catalog-backend-module-incremental-ingestion/api-report.md @@ -7,7 +7,7 @@ import { CatalogBuilder } from '@backstage/plugin-catalog-backend'; import type { Config } from '@backstage/config'; -import type { DeferredEntity } from '@backstage/plugin-catalog-backend'; +import type { DeferredEntity } from '@backstage/plugin-catalog-node'; import type { DurationObjectUnits } from 'luxon'; import { EventParams } from '@backstage/plugin-events-node'; import { EventSubscriber } from '@backstage/plugin-events-node'; diff --git a/plugins/catalog-backend-module-incremental-ingestion/package.json b/plugins/catalog-backend-module-incremental-ingestion/package.json index a88e3af1fa..5b2a534fcb 100644 --- a/plugins/catalog-backend-module-incremental-ingestion/package.json +++ b/plugins/catalog-backend-module-incremental-ingestion/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-catalog-backend-module-incremental-ingestion", "description": "An entity provider for streaming large asset sources into the catalog", - "version": "0.3.0-next.1", + "version": "0.3.0-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -69,8 +69,7 @@ "@backstage/backend-app-api": "workspace:^", "@backstage/backend-defaults": "workspace:^", "@backstage/backend-test-utils": "workspace:^", - "@backstage/cli": "workspace:^", - "@backstage/plugin-catalog-backend": "workspace:^" + "@backstage/cli": "workspace:^" }, "files": [ "dist", diff --git a/plugins/catalog-backend-module-incremental-ingestion/src/database/IncrementalIngestionDatabaseManager.ts b/plugins/catalog-backend-module-incremental-ingestion/src/database/IncrementalIngestionDatabaseManager.ts index cf47942754..527d345706 100644 --- a/plugins/catalog-backend-module-incremental-ingestion/src/database/IncrementalIngestionDatabaseManager.ts +++ b/plugins/catalog-backend-module-incremental-ingestion/src/database/IncrementalIngestionDatabaseManager.ts @@ -15,7 +15,7 @@ */ import { Knex } from 'knex'; -import type { DeferredEntity } from '@backstage/plugin-catalog-backend'; +import type { DeferredEntity } from '@backstage/plugin-catalog-node'; import { stringifyEntityRef } from '@backstage/catalog-model'; import { Duration } from 'luxon'; import { v4 } from 'uuid'; diff --git a/plugins/catalog-backend-module-incremental-ingestion/src/engine/IncrementalIngestionEngine.ts b/plugins/catalog-backend-module-incremental-ingestion/src/engine/IncrementalIngestionEngine.ts index 228c7a2505..13d5bfff71 100644 --- a/plugins/catalog-backend-module-incremental-ingestion/src/engine/IncrementalIngestionEngine.ts +++ b/plugins/catalog-backend-module-incremental-ingestion/src/engine/IncrementalIngestionEngine.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import type { DeferredEntity } from '@backstage/plugin-catalog-backend'; +import type { DeferredEntity } from '@backstage/plugin-catalog-node'; import { IterationEngine, IterationEngineOptions } from '../types'; import { IncrementalIngestionDatabaseManager } from '../database/IncrementalIngestionDatabaseManager'; import { performance } from 'perf_hooks'; diff --git a/plugins/catalog-backend-module-incremental-ingestion/src/module/incrementalIngestionEntityProviderCatalogModule.test.ts b/plugins/catalog-backend-module-incremental-ingestion/src/module/catalogModuleIncrementalIngestionEntityProvider.test.ts similarity index 91% rename from plugins/catalog-backend-module-incremental-ingestion/src/module/incrementalIngestionEntityProviderCatalogModule.test.ts rename to plugins/catalog-backend-module-incremental-ingestion/src/module/catalogModuleIncrementalIngestionEntityProvider.test.ts index dbadf573a4..ef07b4cb10 100644 --- a/plugins/catalog-backend-module-incremental-ingestion/src/module/incrementalIngestionEntityProviderCatalogModule.test.ts +++ b/plugins/catalog-backend-module-incremental-ingestion/src/module/catalogModuleIncrementalIngestionEntityProvider.test.ts @@ -20,9 +20,9 @@ import { startTestBackend } from '@backstage/backend-test-utils'; import { ConfigReader } from '@backstage/config'; import { catalogProcessingExtensionPoint } from '@backstage/plugin-catalog-node/alpha'; import { IncrementalEntityProvider } from '../types'; -import { incrementalIngestionEntityProviderCatalogModule } from './incrementalIngestionEntityProviderCatalogModule'; +import { catalogModuleIncrementalIngestionEntityProvider } from './catalogModuleIncrementalIngestionEntityProvider'; -describe('bitbucketServerEntityProviderCatalogModule', () => { +describe('catalogModuleIncrementalIngestionEntityProvider', () => { it('should register provider at the catalog extension point', async () => { const provider1: IncrementalEntityProvider = { getProviderName: () => 'provider1', @@ -57,7 +57,7 @@ describe('bitbucketServerEntityProviderCatalogModule', () => { [coreServices.scheduler, scheduler], ], features: [ - incrementalIngestionEntityProviderCatalogModule({ + catalogModuleIncrementalIngestionEntityProvider({ providers: [ { provider: provider1, diff --git a/plugins/catalog-backend-module-incremental-ingestion/src/module/incrementalIngestionEntityProviderCatalogModule.ts b/plugins/catalog-backend-module-incremental-ingestion/src/module/catalogModuleIncrementalIngestionEntityProvider.ts similarity index 97% rename from plugins/catalog-backend-module-incremental-ingestion/src/module/incrementalIngestionEntityProviderCatalogModule.ts rename to plugins/catalog-backend-module-incremental-ingestion/src/module/catalogModuleIncrementalIngestionEntityProvider.ts index 261768c142..19d5742b46 100644 --- a/plugins/catalog-backend-module-incremental-ingestion/src/module/incrementalIngestionEntityProviderCatalogModule.ts +++ b/plugins/catalog-backend-module-incremental-ingestion/src/module/catalogModuleIncrementalIngestionEntityProvider.ts @@ -30,7 +30,7 @@ import { WrapperProviders } from './WrapperProviders'; * * @alpha */ -export const incrementalIngestionEntityProviderCatalogModule = +export const catalogModuleIncrementalIngestionEntityProvider = createBackendModule( (options: { providers: Array<{ diff --git a/plugins/catalog-backend-module-incremental-ingestion/src/module/index.ts b/plugins/catalog-backend-module-incremental-ingestion/src/module/index.ts index 577cf193e2..9fcee99e01 100644 --- a/plugins/catalog-backend-module-incremental-ingestion/src/module/index.ts +++ b/plugins/catalog-backend-module-incremental-ingestion/src/module/index.ts @@ -14,4 +14,4 @@ * limitations under the License. */ -export { incrementalIngestionEntityProviderCatalogModule } from './incrementalIngestionEntityProviderCatalogModule'; +export { catalogModuleIncrementalIngestionEntityProvider } from './catalogModuleIncrementalIngestionEntityProvider'; diff --git a/plugins/catalog-backend-module-incremental-ingestion/src/run.ts b/plugins/catalog-backend-module-incremental-ingestion/src/run.ts index f1b6bd1529..f94c988237 100644 --- a/plugins/catalog-backend-module-incremental-ingestion/src/run.ts +++ b/plugins/catalog-backend-module-incremental-ingestion/src/run.ts @@ -25,7 +25,7 @@ import { import { ConfigReader } from '@backstage/config'; import { catalogPlugin } from '@backstage/plugin-catalog-backend/alpha'; import { IncrementalEntityProvider } from '.'; -import { incrementalIngestionEntityProviderCatalogModule } from './alpha'; +import { catalogModuleIncrementalIngestionEntityProvider } from './alpha'; const provider: IncrementalEntityProvider = { getProviderName: () => 'test-provider', @@ -63,7 +63,7 @@ async function main() { backend.add(catalogPlugin()); backend.add( - incrementalIngestionEntityProviderCatalogModule({ + catalogModuleIncrementalIngestionEntityProvider({ providers: [ { provider: provider, diff --git a/plugins/catalog-backend-module-incremental-ingestion/src/service/IncrementalCatalogBuilder.ts b/plugins/catalog-backend-module-incremental-ingestion/src/service/IncrementalCatalogBuilder.ts index c8458be09b..59cdf32391 100644 --- a/plugins/catalog-backend-module-incremental-ingestion/src/service/IncrementalCatalogBuilder.ts +++ b/plugins/catalog-backend-module-incremental-ingestion/src/service/IncrementalCatalogBuilder.ts @@ -13,6 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + import { IncrementalEntityProvider, IncrementalEntityProviderOptions, diff --git a/plugins/catalog-backend-module-incremental-ingestion/src/types.ts b/plugins/catalog-backend-module-incremental-ingestion/src/types.ts index cd1e63b044..5f9d0489e6 100644 --- a/plugins/catalog-backend-module-incremental-ingestion/src/types.ts +++ b/plugins/catalog-backend-module-incremental-ingestion/src/types.ts @@ -26,7 +26,7 @@ import type { Config } from '@backstage/config'; import type { DeferredEntity, EntityProviderConnection, -} from '@backstage/plugin-catalog-backend'; +} from '@backstage/plugin-catalog-node'; import { EventParams } from '@backstage/plugin-events-node'; import type { PermissionEvaluator } from '@backstage/plugin-permission-common'; import type { DurationObjectUnits } from 'luxon'; diff --git a/plugins/catalog-backend-module-ldap/CHANGELOG.md b/plugins/catalog-backend-module-ldap/CHANGELOG.md index 78614a4c31..5e176f09ba 100644 --- a/plugins/catalog-backend-module-ldap/CHANGELOG.md +++ b/plugins/catalog-backend-module-ldap/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-catalog-backend-module-ldap +## 0.5.10-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-tasks@0.5.0-next.2 + - @backstage/plugin-catalog-backend@1.8.0-next.2 + - @backstage/config@1.0.7-next.0 + ## 0.5.10-next.1 ### Patch Changes diff --git a/plugins/catalog-backend-module-ldap/api-report.md b/plugins/catalog-backend-module-ldap/api-report.md index 9876c163e8..088e34fc34 100644 --- a/plugins/catalog-backend-module-ldap/api-report.md +++ b/plugins/catalog-backend-module-ldap/api-report.md @@ -3,15 +3,15 @@ > Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/). ```ts -import { CatalogProcessor } from '@backstage/plugin-catalog-backend'; -import { CatalogProcessorEmit } from '@backstage/plugin-catalog-backend'; +import { CatalogProcessor } from '@backstage/plugin-catalog-node'; +import { CatalogProcessorEmit } from '@backstage/plugin-catalog-node'; import { Client } from 'ldapjs'; import { Config } from '@backstage/config'; -import { EntityProvider } from '@backstage/plugin-catalog-backend'; -import { EntityProviderConnection } from '@backstage/plugin-catalog-backend'; +import { EntityProvider } from '@backstage/plugin-catalog-node'; +import { EntityProviderConnection } from '@backstage/plugin-catalog-node'; import { GroupEntity } from '@backstage/catalog-model'; import { JsonValue } from '@backstage/types'; -import { LocationSpec } from '@backstage/plugin-catalog-backend'; +import { LocationSpec } from '@backstage/plugin-catalog-node'; import { Logger } from 'winston'; import { SearchEntry } from 'ldapjs'; import { SearchOptions } from 'ldapjs'; diff --git a/plugins/catalog-backend-module-ldap/package.json b/plugins/catalog-backend-module-ldap/package.json index eb8bbd1f97..06b33f1db2 100644 --- a/plugins/catalog-backend-module-ldap/package.json +++ b/plugins/catalog-backend-module-ldap/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-catalog-backend-module-ldap", "description": "A Backstage catalog backend module that helps integrate towards LDAP", - "version": "0.5.10-next.1", + "version": "0.5.10-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -36,7 +36,7 @@ "@backstage/catalog-model": "workspace:^", "@backstage/config": "workspace:^", "@backstage/errors": "workspace:^", - "@backstage/plugin-catalog-backend": "workspace:^", + "@backstage/plugin-catalog-node": "workspace:^", "@backstage/types": "workspace:^", "@types/ldapjs": "^2.2.0", "ldapjs": "^2.2.0", diff --git a/plugins/catalog-backend-module-ldap/src/processors/LdapOrgEntityProvider.ts b/plugins/catalog-backend-module-ldap/src/processors/LdapOrgEntityProvider.ts index 64d56cc8bc..811f451b26 100644 --- a/plugins/catalog-backend-module-ldap/src/processors/LdapOrgEntityProvider.ts +++ b/plugins/catalog-backend-module-ldap/src/processors/LdapOrgEntityProvider.ts @@ -24,7 +24,7 @@ import { Config } from '@backstage/config'; import { EntityProvider, EntityProviderConnection, -} from '@backstage/plugin-catalog-backend'; +} from '@backstage/plugin-catalog-node'; import { merge } from 'lodash'; import * as uuid from 'uuid'; import { Logger } from 'winston'; diff --git a/plugins/catalog-backend-module-ldap/src/processors/LdapOrgReaderProcessor.ts b/plugins/catalog-backend-module-ldap/src/processors/LdapOrgReaderProcessor.ts index fcfdb43eb1..9c5442ca0c 100644 --- a/plugins/catalog-backend-module-ldap/src/processors/LdapOrgReaderProcessor.ts +++ b/plugins/catalog-backend-module-ldap/src/processors/LdapOrgReaderProcessor.ts @@ -29,7 +29,7 @@ import { CatalogProcessorEmit, LocationSpec, processingResult, -} from '@backstage/plugin-catalog-backend'; +} from '@backstage/plugin-catalog-node'; /** * Extracts teams and users out of an LDAP server. diff --git a/plugins/catalog-backend-module-msgraph/CHANGELOG.md b/plugins/catalog-backend-module-msgraph/CHANGELOG.md index 0d1f93299f..dc1a32f25a 100644 --- a/plugins/catalog-backend-module-msgraph/CHANGELOG.md +++ b/plugins/catalog-backend-module-msgraph/CHANGELOG.md @@ -1,5 +1,18 @@ # @backstage/plugin-catalog-backend-module-msgraph +## 0.5.2-next.2 + +### Patch Changes + +- 26eef93c547: Fixed msgraph catalog backend to use user.select option when fetching user from AzureAD +- Updated dependencies + - @backstage/backend-tasks@0.5.0-next.2 + - @backstage/backend-common@0.18.3-next.2 + - @backstage/backend-plugin-api@0.4.1-next.2 + - @backstage/plugin-catalog-backend@1.8.0-next.2 + - @backstage/plugin-catalog-node@1.3.4-next.2 + - @backstage/config@1.0.7-next.0 + ## 0.5.2-next.1 ### Patch Changes diff --git a/plugins/catalog-backend-module-msgraph/alpha-api-report.md b/plugins/catalog-backend-module-msgraph/alpha-api-report.md index ed30b83bc8..0fa093a1bc 100644 --- a/plugins/catalog-backend-module-msgraph/alpha-api-report.md +++ b/plugins/catalog-backend-module-msgraph/alpha-api-report.md @@ -9,10 +9,10 @@ import { OrganizationTransformer } from '@backstage/plugin-catalog-backend-modul import { UserTransformer } from '@backstage/plugin-catalog-backend-module-msgraph'; // @alpha -export const microsoftGraphOrgEntityProviderCatalogModule: () => BackendFeature; +export const catalogModuleMicrosoftGraphOrgEntityProvider: () => BackendFeature; // @alpha -export interface MicrosoftGraphOrgEntityProviderCatalogModuleOptions { +export interface CatalogModuleMicrosoftGraphOrgEntityProviderOptions { groupTransformer?: GroupTransformer | Record; organizationTransformer?: | OrganizationTransformer diff --git a/plugins/catalog-backend-module-msgraph/api-report.md b/plugins/catalog-backend-module-msgraph/api-report.md index 10a4f405c0..bde8c06fbb 100644 --- a/plugins/catalog-backend-module-msgraph/api-report.md +++ b/plugins/catalog-backend-module-msgraph/api-report.md @@ -3,13 +3,13 @@ > Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/). ```ts -import { CatalogProcessor } from '@backstage/plugin-catalog-backend'; -import { CatalogProcessorEmit } from '@backstage/plugin-catalog-backend'; +import { CatalogProcessor } from '@backstage/plugin-catalog-node'; +import { CatalogProcessorEmit } from '@backstage/plugin-catalog-node'; import { Config } from '@backstage/config'; -import { EntityProvider } from '@backstage/plugin-catalog-backend'; -import { EntityProviderConnection } from '@backstage/plugin-catalog-backend'; +import { EntityProvider } from '@backstage/plugin-catalog-node'; +import { EntityProviderConnection } from '@backstage/plugin-catalog-node'; import { GroupEntity } from '@backstage/catalog-model'; -import { LocationSpec } from '@backstage/plugin-catalog-backend'; +import { LocationSpec } from '@backstage/plugin-catalog-node'; import { Logger } from 'winston'; import * as MicrosoftGraph from '@microsoft/microsoft-graph-types'; import { PluginTaskScheduler } from '@backstage/backend-tasks'; diff --git a/plugins/catalog-backend-module-msgraph/package.json b/plugins/catalog-backend-module-msgraph/package.json index 369daa1c6b..f66151bbc4 100644 --- a/plugins/catalog-backend-module-msgraph/package.json +++ b/plugins/catalog-backend-module-msgraph/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-catalog-backend-module-msgraph", "description": "A Backstage catalog backend module that helps integrate towards Microsoft Graph", - "version": "0.5.2-next.1", + "version": "0.5.2-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -51,7 +51,6 @@ "@backstage/backend-tasks": "workspace:^", "@backstage/catalog-model": "workspace:^", "@backstage/config": "workspace:^", - "@backstage/plugin-catalog-backend": "workspace:^", "@backstage/plugin-catalog-node": "workspace:^", "@microsoft/microsoft-graph-types": "^2.6.0", "@types/node-fetch": "^2.5.12", diff --git a/plugins/catalog-backend-module-msgraph/src/alpha.ts b/plugins/catalog-backend-module-msgraph/src/alpha.ts index 137808d881..c277a0a680 100644 --- a/plugins/catalog-backend-module-msgraph/src/alpha.ts +++ b/plugins/catalog-backend-module-msgraph/src/alpha.ts @@ -14,5 +14,4 @@ * limitations under the License. */ -export { microsoftGraphOrgEntityProviderCatalogModule } from './service/MicrosoftGraphOrgEntityProviderCatalogModule'; -export type { MicrosoftGraphOrgEntityProviderCatalogModuleOptions } from './service/MicrosoftGraphOrgEntityProviderCatalogModule'; +export * from './module'; diff --git a/plugins/catalog-backend-module-msgraph/src/service/MicrosoftGraphOrgEntityProviderCatalogModule.test.ts b/plugins/catalog-backend-module-msgraph/src/module/catalogModuleMicrosoftGraphOrgEntityProvider.test.ts similarity index 92% rename from plugins/catalog-backend-module-msgraph/src/service/MicrosoftGraphOrgEntityProviderCatalogModule.test.ts rename to plugins/catalog-backend-module-msgraph/src/module/catalogModuleMicrosoftGraphOrgEntityProvider.test.ts index 3763553162..3362c75c95 100644 --- a/plugins/catalog-backend-module-msgraph/src/service/MicrosoftGraphOrgEntityProviderCatalogModule.test.ts +++ b/plugins/catalog-backend-module-msgraph/src/module/catalogModuleMicrosoftGraphOrgEntityProvider.test.ts @@ -24,10 +24,10 @@ import { startTestBackend } from '@backstage/backend-test-utils'; import { ConfigReader } from '@backstage/config'; import { catalogProcessingExtensionPoint } from '@backstage/plugin-catalog-node/alpha'; import { Duration } from 'luxon'; -import { microsoftGraphOrgEntityProviderCatalogModule } from './MicrosoftGraphOrgEntityProviderCatalogModule'; +import { catalogModuleMicrosoftGraphOrgEntityProvider } from './catalogModuleMicrosoftGraphOrgEntityProvider'; import { MicrosoftGraphOrgEntityProvider } from '../processors'; -describe('awsS3EntityProviderCatalogModule', () => { +describe('catalogModuleMicrosoftGraphOrgEntityProvider', () => { it('should register provider at the catalog extension point', async () => { let addedProviders: Array | undefined; let usedSchedule: TaskScheduleDefinition | undefined; @@ -71,7 +71,7 @@ describe('awsS3EntityProviderCatalogModule', () => { [coreServices.logger, getVoidLogger()], [coreServices.scheduler, scheduler], ], - features: [microsoftGraphOrgEntityProviderCatalogModule()], + features: [catalogModuleMicrosoftGraphOrgEntityProvider()], }); expect(usedSchedule?.frequency).toEqual(Duration.fromISO('PT30M')); diff --git a/plugins/catalog-backend-module-msgraph/src/service/MicrosoftGraphOrgEntityProviderCatalogModule.ts b/plugins/catalog-backend-module-msgraph/src/module/catalogModuleMicrosoftGraphOrgEntityProvider.ts similarity index 91% rename from plugins/catalog-backend-module-msgraph/src/service/MicrosoftGraphOrgEntityProviderCatalogModule.ts rename to plugins/catalog-backend-module-msgraph/src/module/catalogModuleMicrosoftGraphOrgEntityProvider.ts index 11be567045..7cd8b65f0b 100644 --- a/plugins/catalog-backend-module-msgraph/src/service/MicrosoftGraphOrgEntityProviderCatalogModule.ts +++ b/plugins/catalog-backend-module-msgraph/src/module/catalogModuleMicrosoftGraphOrgEntityProvider.ts @@ -28,11 +28,11 @@ import { import { MicrosoftGraphOrgEntityProvider } from '../processors'; /** - * Options for {@link microsoftGraphOrgEntityProviderCatalogModule}. + * Options for {@link catalogModuleMicrosoftGraphOrgEntityProvider}. * * @alpha */ -export interface MicrosoftGraphOrgEntityProviderCatalogModuleOptions { +export interface CatalogModuleMicrosoftGraphOrgEntityProviderOptions { /** * The function that transforms a user entry in msgraph to an entity. * Optionally, you can pass separate transformers per provider ID. @@ -59,13 +59,13 @@ export interface MicrosoftGraphOrgEntityProviderCatalogModuleOptions { * * @alpha */ -export const microsoftGraphOrgEntityProviderCatalogModule = createBackendModule( +export const catalogModuleMicrosoftGraphOrgEntityProvider = createBackendModule( { pluginId: 'catalog', moduleId: 'microsoftGraphOrgEntityProvider', register( env, - options?: MicrosoftGraphOrgEntityProviderCatalogModuleOptions, + options?: CatalogModuleMicrosoftGraphOrgEntityProviderOptions, ) { env.registerInit({ deps: { diff --git a/plugins/catalog-backend-module-msgraph/src/module/index.ts b/plugins/catalog-backend-module-msgraph/src/module/index.ts new file mode 100644 index 0000000000..f53f41141c --- /dev/null +++ b/plugins/catalog-backend-module-msgraph/src/module/index.ts @@ -0,0 +1,18 @@ +/* + * Copyright 2023 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +export { catalogModuleMicrosoftGraphOrgEntityProvider } from './catalogModuleMicrosoftGraphOrgEntityProvider'; +export type { CatalogModuleMicrosoftGraphOrgEntityProviderOptions } from './catalogModuleMicrosoftGraphOrgEntityProvider'; diff --git a/plugins/catalog-backend-module-msgraph/src/processors/MicrosoftGraphOrgEntityProvider.test.ts b/plugins/catalog-backend-module-msgraph/src/processors/MicrosoftGraphOrgEntityProvider.test.ts index 8af327cf27..dccf7ed53d 100644 --- a/plugins/catalog-backend-module-msgraph/src/processors/MicrosoftGraphOrgEntityProvider.test.ts +++ b/plugins/catalog-backend-module-msgraph/src/processors/MicrosoftGraphOrgEntityProvider.test.ts @@ -26,7 +26,7 @@ import { GroupEntity, UserEntity, } from '@backstage/catalog-model'; -import { EntityProviderConnection } from '@backstage/plugin-catalog-backend'; +import { EntityProviderConnection } from '@backstage/plugin-catalog-node'; import { MicrosoftGraphClient, MICROSOFT_GRAPH_USER_ID_ANNOTATION, diff --git a/plugins/catalog-backend-module-msgraph/src/processors/MicrosoftGraphOrgEntityProvider.ts b/plugins/catalog-backend-module-msgraph/src/processors/MicrosoftGraphOrgEntityProvider.ts index 071fa7f266..3ef02344eb 100644 --- a/plugins/catalog-backend-module-msgraph/src/processors/MicrosoftGraphOrgEntityProvider.ts +++ b/plugins/catalog-backend-module-msgraph/src/processors/MicrosoftGraphOrgEntityProvider.ts @@ -24,7 +24,7 @@ import { Config } from '@backstage/config'; import { EntityProvider, EntityProviderConnection, -} from '@backstage/plugin-catalog-backend'; +} from '@backstage/plugin-catalog-node'; import { merge } from 'lodash'; import * as uuid from 'uuid'; import { Logger } from 'winston'; diff --git a/plugins/catalog-backend-module-msgraph/src/processors/MicrosoftGraphOrgReaderProcessor.ts b/plugins/catalog-backend-module-msgraph/src/processors/MicrosoftGraphOrgReaderProcessor.ts index 1267648481..2beef51c31 100644 --- a/plugins/catalog-backend-module-msgraph/src/processors/MicrosoftGraphOrgReaderProcessor.ts +++ b/plugins/catalog-backend-module-msgraph/src/processors/MicrosoftGraphOrgReaderProcessor.ts @@ -20,7 +20,7 @@ import { CatalogProcessorEmit, LocationSpec, processingResult, -} from '@backstage/plugin-catalog-backend'; +} from '@backstage/plugin-catalog-node'; import { Logger } from 'winston'; import { GroupTransformer, diff --git a/plugins/catalog-backend-module-openapi/CHANGELOG.md b/plugins/catalog-backend-module-openapi/CHANGELOG.md index 954eff2c98..8bf478947a 100644 --- a/plugins/catalog-backend-module-openapi/CHANGELOG.md +++ b/plugins/catalog-backend-module-openapi/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-catalog-backend-module-openapi +## 0.1.9-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.3-next.2 + - @backstage/plugin-catalog-backend@1.8.0-next.2 + - @backstage/plugin-catalog-node@1.3.4-next.2 + - @backstage/config@1.0.7-next.0 + - @backstage/integration@1.4.3-next.0 + ## 0.1.9-next.1 ### Patch Changes diff --git a/plugins/catalog-backend-module-openapi/package.json b/plugins/catalog-backend-module-openapi/package.json index 691581bf77..fee080d1bf 100644 --- a/plugins/catalog-backend-module-openapi/package.json +++ b/plugins/catalog-backend-module-openapi/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-catalog-backend-module-openapi", "description": "A Backstage catalog backend module that helps with OpenAPI specifications", - "version": "0.1.9-next.1", + "version": "0.1.9-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog-backend-module-puppetdb/CHANGELOG.md b/plugins/catalog-backend-module-puppetdb/CHANGELOG.md new file mode 100644 index 0000000000..5bc50ae148 --- /dev/null +++ b/plugins/catalog-backend-module-puppetdb/CHANGELOG.md @@ -0,0 +1,15 @@ +# @backstage/plugin-catalog-backend-module-puppetdb + +## 0.1.0-next.0 + +### Minor Changes + +- a1efcf9a658: Initial version of the plugin. + +### Patch Changes + +- Updated dependencies + - @backstage/backend-tasks@0.5.0-next.2 + - @backstage/backend-common@0.18.3-next.2 + - @backstage/plugin-catalog-backend@1.8.0-next.2 + - @backstage/config@1.0.7-next.0 diff --git a/plugins/catalog-backend-module-puppetdb/alpha-api-report.md b/plugins/catalog-backend-module-puppetdb/alpha-api-report.md new file mode 100644 index 0000000000..0856fdb836 --- /dev/null +++ b/plugins/catalog-backend-module-puppetdb/alpha-api-report.md @@ -0,0 +1,12 @@ +## API Report File for "@backstage/plugin-catalog-backend-module-puppetdb" + +> Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/). + +```ts +import { BackendFeature } from '@backstage/backend-plugin-api'; + +// @alpha +export const catalogModulePuppetDbEntityProvider: () => BackendFeature; + +// (No @packageDocumentation comment for this package) +``` diff --git a/plugins/catalog-backend-module-puppetdb/api-report.md b/plugins/catalog-backend-module-puppetdb/api-report.md index 8764ac1e7c..a4954ce6bd 100644 --- a/plugins/catalog-backend-module-puppetdb/api-report.md +++ b/plugins/catalog-backend-module-puppetdb/api-report.md @@ -4,8 +4,8 @@ ```ts import { Config } from '@backstage/config'; -import { EntityProvider } from '@backstage/plugin-catalog-backend'; -import { EntityProviderConnection } from '@backstage/plugin-catalog-backend'; +import { EntityProvider } from '@backstage/plugin-catalog-node'; +import { EntityProviderConnection } from '@backstage/plugin-catalog-node'; import { JsonValue } from '@backstage/types'; import { Logger } from 'winston'; import { PluginTaskScheduler } from '@backstage/backend-tasks'; diff --git a/plugins/catalog-backend-module-puppetdb/package.json b/plugins/catalog-backend-module-puppetdb/package.json index b6539dbbe6..252fe21969 100644 --- a/plugins/catalog-backend-module-puppetdb/package.json +++ b/plugins/catalog-backend-module-puppetdb/package.json @@ -1,14 +1,27 @@ { "name": "@backstage/plugin-catalog-backend-module-puppetdb", "description": "A Backstage catalog backend module that helps integrate towards PuppetDB", - "version": "0.0.1", + "version": "0.1.0-next.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", "publishConfig": { - "access": "public", - "main": "dist/index.cjs.js", - "types": "dist/index.d.ts" + "access": "public" + }, + "exports": { + ".": "./src/index.ts", + "./alpha": "./src/alpha.ts", + "./package.json": "./package.json" + }, + "typesVersions": { + "*": { + "alpha": [ + "src/alpha.ts" + ], + "package.json": [ + "package.json" + ] + } }, "backstage": { "role": "backend-plugin-module" @@ -35,11 +48,12 @@ }, "dependencies": { "@backstage/backend-common": "workspace:^", + "@backstage/backend-plugin-api": "workspace:^", "@backstage/backend-tasks": "workspace:^", "@backstage/catalog-model": "workspace:^", "@backstage/config": "workspace:^", "@backstage/errors": "workspace:^", - "@backstage/plugin-catalog-backend": "workspace:^", + "@backstage/plugin-catalog-node": "workspace:^", "@backstage/types": "workspace:^", "lodash": "^4.17.21", "luxon": "^3.0.0", diff --git a/plugins/catalog-backend/src/util/index.ts b/plugins/catalog-backend-module-puppetdb/src/alpha.ts similarity index 84% rename from plugins/catalog-backend/src/util/index.ts rename to plugins/catalog-backend-module-puppetdb/src/alpha.ts index b3bd4d5316..c277a0a680 100644 --- a/plugins/catalog-backend/src/util/index.ts +++ b/plugins/catalog-backend-module-puppetdb/src/alpha.ts @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Backstage Authors + * Copyright 2023 The Backstage Authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -14,4 +14,4 @@ * limitations under the License. */ -export { locationSpecToLocationEntity } from './conversion'; +export * from './module'; diff --git a/plugins/catalog-backend-module-puppetdb/src/module/catalogModulePuppetDbEntityProvider.test.ts b/plugins/catalog-backend-module-puppetdb/src/module/catalogModulePuppetDbEntityProvider.test.ts new file mode 100644 index 0000000000..e2745e9268 --- /dev/null +++ b/plugins/catalog-backend-module-puppetdb/src/module/catalogModulePuppetDbEntityProvider.test.ts @@ -0,0 +1,79 @@ +/* + * Copyright 2022 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { getVoidLogger } from '@backstage/backend-common'; +import { coreServices } from '@backstage/backend-plugin-api'; +import { + PluginTaskScheduler, + TaskScheduleDefinition, +} from '@backstage/backend-tasks'; +import { startTestBackend } from '@backstage/backend-test-utils'; +import { ConfigReader } from '@backstage/config'; +import { catalogProcessingExtensionPoint } from '@backstage/plugin-catalog-node/alpha'; +import { catalogModulePuppetDbEntityProvider } from './catalogModulePuppetDbEntityProvider'; +import { PuppetDbEntityProvider } from '../providers/PuppetDbEntityProvider'; + +describe('catalogModulePuppetDbEntityProvider', () => { + it('should register provider at the catalog extension point', async () => { + let addedProviders: Array | undefined; + let usedSchedule: TaskScheduleDefinition | undefined; + + const extensionPoint = { + addEntityProvider: (providers: any) => { + addedProviders = providers; + }, + }; + const runner = jest.fn(); + const scheduler = { + createScheduledTaskRunner: (schedule: TaskScheduleDefinition) => { + usedSchedule = schedule; + return runner; + }, + } as unknown as PluginTaskScheduler; + + const config = new ConfigReader({ + catalog: { + providers: { + puppetdb: { + baseUrl: 'http://puppetdb:8080', + schedule: { + frequency: { minutes: 10 }, + timeout: { minutes: 10 }, + }, + }, + }, + }, + }); + + await startTestBackend({ + extensionPoints: [[catalogProcessingExtensionPoint, extensionPoint]], + services: [ + [coreServices.config, config], + [coreServices.logger, getVoidLogger()], + [coreServices.scheduler, scheduler], + ], + features: [catalogModulePuppetDbEntityProvider()], + }); + + expect(usedSchedule?.frequency).toEqual({ minutes: 10 }); + expect(usedSchedule?.timeout).toEqual({ minutes: 10 }); + expect(addedProviders?.length).toEqual(1); + expect(addedProviders?.pop()?.getProviderName()).toEqual( + 'puppetdb-provider:default', + ); + expect(runner).not.toHaveBeenCalled(); + }); +}); diff --git a/plugins/catalog-backend-module-puppetdb/src/module/catalogModulePuppetDbEntityProvider.ts b/plugins/catalog-backend-module-puppetdb/src/module/catalogModulePuppetDbEntityProvider.ts new file mode 100644 index 0000000000..9a7d279cd3 --- /dev/null +++ b/plugins/catalog-backend-module-puppetdb/src/module/catalogModulePuppetDbEntityProvider.ts @@ -0,0 +1,51 @@ +/* + * Copyright 2022 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { + createBackendModule, + coreServices, +} from '@backstage/backend-plugin-api'; +import { loggerToWinstonLogger } from '@backstage/backend-common'; +import { catalogProcessingExtensionPoint } from '@backstage/plugin-catalog-node/alpha'; +import { PuppetDbEntityProvider } from '../providers/PuppetDbEntityProvider'; + +/** + * Registers the `PuppetDbEntityProvider` with the catalog processing extension point. + * + * @alpha + */ +export const catalogModulePuppetDbEntityProvider = createBackendModule({ + pluginId: 'catalog', + moduleId: 'puppetDbEntityProvider', + register(env) { + env.registerInit({ + deps: { + catalog: catalogProcessingExtensionPoint, + config: coreServices.config, + logger: coreServices.logger, + scheduler: coreServices.scheduler, + }, + async init({ catalog, config, logger, scheduler }) { + catalog.addEntityProvider( + PuppetDbEntityProvider.fromConfig(config, { + logger: loggerToWinstonLogger(logger), + scheduler, + }), + ); + }, + }); + }, +}); diff --git a/plugins/catalog-backend-module-puppetdb/src/module/index.ts b/plugins/catalog-backend-module-puppetdb/src/module/index.ts new file mode 100644 index 0000000000..f30f236df4 --- /dev/null +++ b/plugins/catalog-backend-module-puppetdb/src/module/index.ts @@ -0,0 +1,17 @@ +/* + * Copyright 2023 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +export { catalogModulePuppetDbEntityProvider } from './catalogModulePuppetDbEntityProvider'; diff --git a/plugins/catalog-backend-module-puppetdb/src/providers/PuppetDbEntityProvider.test.ts b/plugins/catalog-backend-module-puppetdb/src/providers/PuppetDbEntityProvider.test.ts index 0ab6fb35b7..ad89e1fd9a 100644 --- a/plugins/catalog-backend-module-puppetdb/src/providers/PuppetDbEntityProvider.test.ts +++ b/plugins/catalog-backend-module-puppetdb/src/providers/PuppetDbEntityProvider.test.ts @@ -21,7 +21,7 @@ import { PuppetDbEntityProvider } from './PuppetDbEntityProvider'; import { DeferredEntity, EntityProviderConnection, -} from '@backstage/plugin-catalog-backend'; +} from '@backstage/plugin-catalog-node'; import * as puppetFunctions from '../puppet/read'; import { ANNOTATION_PUPPET_CERTNAME } from '../puppet'; import { diff --git a/plugins/catalog-backend-module-puppetdb/src/providers/PuppetDbEntityProvider.ts b/plugins/catalog-backend-module-puppetdb/src/providers/PuppetDbEntityProvider.ts index b2d2738fd3..8c63baf467 100644 --- a/plugins/catalog-backend-module-puppetdb/src/providers/PuppetDbEntityProvider.ts +++ b/plugins/catalog-backend-module-puppetdb/src/providers/PuppetDbEntityProvider.ts @@ -17,7 +17,7 @@ import { EntityProvider, EntityProviderConnection, -} from '@backstage/plugin-catalog-backend'; +} from '@backstage/plugin-catalog-node'; import { Logger } from 'winston'; import { PuppetDbEntityProviderConfig, @@ -116,13 +116,13 @@ export class PuppetDbEntityProvider implements EntityProvider { this.transformer = transformer; } - /** {@inheritdoc @backstage/plugin-catalog-backend#EntityProvider.connect} */ + /** {@inheritdoc @backstage/plugin-catalog-node#EntityProvider.connect} */ async connect(connection: EntityProviderConnection): Promise { this.connection = connection; await this.scheduleFn(); } - /** {@inheritdoc @backstage/plugin-catalog-backend#EntityProvider.getProviderName} */ + /** {@inheritdoc @backstage/plugin-catalog-node#EntityProvider.getProviderName} */ getProviderName(): string { return `puppetdb-provider:${this.config.id}`; } diff --git a/plugins/catalog-backend/CHANGELOG.md b/plugins/catalog-backend/CHANGELOG.md index cbb5dd0fd4..1cc3b3620a 100644 --- a/plugins/catalog-backend/CHANGELOG.md +++ b/plugins/catalog-backend/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-catalog-backend +## 1.8.0-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.3-next.2 + - @backstage/backend-plugin-api@0.4.1-next.2 + - @backstage/plugin-permission-node@0.7.6-next.2 + - @backstage/plugin-catalog-node@1.3.4-next.2 + - @backstage/config@1.0.7-next.0 + - @backstage/integration@1.4.3-next.0 + ## 1.8.0-next.1 ### Patch Changes diff --git a/plugins/catalog-backend/api-report.md b/plugins/catalog-backend/api-report.md index 00c13a31ea..5e7b2dee02 100644 --- a/plugins/catalog-backend/api-report.md +++ b/plugins/catalog-backend/api-report.md @@ -12,29 +12,30 @@ import { AnalyzeLocationRequest as AnalyzeLocationRequest_2 } from '@backstage/p import { AnalyzeLocationResponse as AnalyzeLocationResponse_2 } from '@backstage/plugin-catalog-common'; import { CatalogApi } from '@backstage/catalog-client'; import { CatalogEntityDocument } from '@backstage/plugin-catalog-common'; -import { CatalogProcessor } from '@backstage/plugin-catalog-node'; -import { CatalogProcessorCache } from '@backstage/plugin-catalog-node'; -import { CatalogProcessorEmit } from '@backstage/plugin-catalog-node'; -import { CatalogProcessorEntityResult } from '@backstage/plugin-catalog-node'; -import { CatalogProcessorErrorResult } from '@backstage/plugin-catalog-node'; -import { CatalogProcessorLocationResult } from '@backstage/plugin-catalog-node'; -import { CatalogProcessorParser } from '@backstage/plugin-catalog-node'; -import { CatalogProcessorRefreshKeysResult } from '@backstage/plugin-catalog-node'; -import { CatalogProcessorRelationResult } from '@backstage/plugin-catalog-node'; -import { CatalogProcessorResult } from '@backstage/plugin-catalog-node'; +import { CatalogProcessor as CatalogProcessor_2 } from '@backstage/plugin-catalog-node'; +import { CatalogProcessorCache as CatalogProcessorCache_2 } from '@backstage/plugin-catalog-node'; +import { CatalogProcessorEmit as CatalogProcessorEmit_2 } from '@backstage/plugin-catalog-node'; +import { CatalogProcessorEntityResult as CatalogProcessorEntityResult_2 } from '@backstage/plugin-catalog-node'; +import { CatalogProcessorErrorResult as CatalogProcessorErrorResult_2 } from '@backstage/plugin-catalog-node'; +import { CatalogProcessorLocationResult as CatalogProcessorLocationResult_2 } from '@backstage/plugin-catalog-node'; +import { CatalogProcessorParser as CatalogProcessorParser_2 } from '@backstage/plugin-catalog-node'; +import { CatalogProcessorRefreshKeysResult as CatalogProcessorRefreshKeysResult_2 } from '@backstage/plugin-catalog-node'; +import { CatalogProcessorRelationResult as CatalogProcessorRelationResult_2 } from '@backstage/plugin-catalog-node'; +import { CatalogProcessorResult as CatalogProcessorResult_2 } from '@backstage/plugin-catalog-node'; import { Config } from '@backstage/config'; -import { DeferredEntity } from '@backstage/plugin-catalog-node'; +import { DeferredEntity as DeferredEntity_2 } from '@backstage/plugin-catalog-node'; import { DocumentCollatorFactory } from '@backstage/plugin-search-common'; import { Entity } from '@backstage/catalog-model'; import { EntityPolicy } from '@backstage/catalog-model'; -import { EntityProvider } from '@backstage/plugin-catalog-node'; -import { EntityProviderConnection } from '@backstage/plugin-catalog-node'; -import { EntityProviderMutation } from '@backstage/plugin-catalog-node'; -import { EntityRelationSpec } from '@backstage/plugin-catalog-node'; +import { EntityProvider as EntityProvider_2 } from '@backstage/plugin-catalog-node'; +import { EntityProviderConnection as EntityProviderConnection_2 } from '@backstage/plugin-catalog-node'; +import { EntityProviderMutation as EntityProviderMutation_2 } from '@backstage/plugin-catalog-node'; +import { EntityRelationSpec as EntityRelationSpec_2 } from '@backstage/plugin-catalog-node'; import { GetEntitiesRequest } from '@backstage/catalog-client'; import { JsonValue } from '@backstage/types'; -import { LocationEntityV1alpha1 } from '@backstage/catalog-model'; import { LocationSpec as LocationSpec_2 } from '@backstage/plugin-catalog-common'; +import { locationSpecToLocationEntity as locationSpecToLocationEntity_2 } from '@backstage/plugin-catalog-node'; +import { locationSpecToMetadataName as locationSpecToMetadataName_2 } from '@backstage/plugin-catalog-node'; import { Logger } from 'winston'; import { Permission } from '@backstage/plugin-permission-common'; import { PermissionAuthorizer } from '@backstage/plugin-permission-common'; @@ -43,7 +44,6 @@ import { PermissionRule } from '@backstage/plugin-permission-node'; import { PermissionRuleParams } from '@backstage/plugin-permission-common'; import { PluginDatabaseManager } from '@backstage/backend-common'; import { PluginEndpointDiscovery } from '@backstage/backend-common'; -import { processingResult } from '@backstage/plugin-catalog-node'; import { Readable } from 'stream'; import { Router } from 'express'; import { ScmIntegrationRegistry } from '@backstage/integration'; @@ -73,7 +73,7 @@ export type AnalyzeOptions = { }; // @public (undocumented) -export class AnnotateLocationEntityProcessor implements CatalogProcessor { +export class AnnotateLocationEntityProcessor implements CatalogProcessor_2 { constructor(options: { integrations: ScmIntegrationRegistry }); // (undocumented) getProcessorName(): string; @@ -81,13 +81,13 @@ export class AnnotateLocationEntityProcessor implements CatalogProcessor { preProcessEntity( entity: Entity, location: LocationSpec_2, - _: CatalogProcessorEmit, + _: CatalogProcessorEmit_2, originLocation: LocationSpec_2, ): Promise; } // @public (undocumented) -export class AnnotateScmSlugEntityProcessor implements CatalogProcessor { +export class AnnotateScmSlugEntityProcessor implements CatalogProcessor_2 { constructor(opts: { scmIntegrationRegistry: ScmIntegrationRegistry }); // (undocumented) static fromConfig(config: Config): AnnotateScmSlugEntityProcessor; @@ -98,14 +98,14 @@ export class AnnotateScmSlugEntityProcessor implements CatalogProcessor { } // @public (undocumented) -export class BuiltinKindsEntityProcessor implements CatalogProcessor { +export class BuiltinKindsEntityProcessor implements CatalogProcessor_2 { // (undocumented) getProcessorName(): string; // (undocumented) postProcessEntity( entity: Entity, _location: LocationSpec_2, - emit: CatalogProcessorEmit, + emit: CatalogProcessorEmit_2, ): Promise; // (undocumented) validateEntityKind(entity: Entity): Promise; @@ -117,7 +117,7 @@ export class CatalogBuilder { ...policies: Array> ): CatalogBuilder; addEntityProvider( - ...providers: Array> + ...providers: Array> ): CatalogBuilder; addLocationAnalyzers( ...analyzers: Array> @@ -128,18 +128,18 @@ export class CatalogBuilder { > ): this; addProcessor( - ...processors: Array> + ...processors: Array> ): CatalogBuilder; build(): Promise<{ processingEngine: CatalogProcessingEngine; router: Router; }>; static create(env: CatalogEnvironment): CatalogBuilder; - getDefaultProcessors(): CatalogProcessor[]; + getDefaultProcessors(): CatalogProcessor_2[]; replaceEntityPolicies(policies: EntityPolicy[]): CatalogBuilder; - replaceProcessors(processors: CatalogProcessor[]): CatalogBuilder; + replaceProcessors(processors: CatalogProcessor_2[]): CatalogBuilder; setAllowedLocationTypes(allowedLocationTypes: string[]): CatalogBuilder; - setEntityDataParser(parser: CatalogProcessorParser): CatalogBuilder; + setEntityDataParser(parser: CatalogProcessorParser_2): CatalogBuilder; setFieldFormatValidators(validators: Partial): CatalogBuilder; setLocationAnalyzer(locationAnalyzer: LocationAnalyzer): CatalogBuilder; setPlaceholderResolver( @@ -187,28 +187,39 @@ export interface CatalogProcessingEngine { stop(): Promise; } -export { CatalogProcessor }; +// @public @deprecated (undocumented) +export type CatalogProcessor = CatalogProcessor_2; -export { CatalogProcessorCache }; +// @public @deprecated (undocumented) +export type CatalogProcessorCache = CatalogProcessorCache_2; -export { CatalogProcessorEmit }; +// @public @deprecated (undocumented) +export type CatalogProcessorEmit = CatalogProcessorEmit_2; -export { CatalogProcessorEntityResult }; +// @public @deprecated (undocumented) +export type CatalogProcessorEntityResult = CatalogProcessorEntityResult_2; -export { CatalogProcessorErrorResult }; +// @public @deprecated (undocumented) +export type CatalogProcessorErrorResult = CatalogProcessorErrorResult_2; -export { CatalogProcessorLocationResult }; +// @public @deprecated (undocumented) +export type CatalogProcessorLocationResult = CatalogProcessorLocationResult_2; -export { CatalogProcessorParser }; +// @public @deprecated (undocumented) +export type CatalogProcessorParser = CatalogProcessorParser_2; -export { CatalogProcessorRefreshKeysResult }; +// @public @deprecated (undocumented) +export type CatalogProcessorRefreshKeysResult = + CatalogProcessorRefreshKeysResult_2; -export { CatalogProcessorRelationResult }; +// @public @deprecated (undocumented) +export type CatalogProcessorRelationResult = CatalogProcessorRelationResult_2; -export { CatalogProcessorResult }; +// @public @deprecated (undocumented) +export type CatalogProcessorResult = CatalogProcessorResult_2; // @public (undocumented) -export class CodeOwnersProcessor implements CatalogProcessor { +export class CodeOwnersProcessor implements CatalogProcessor_2 { constructor(options: { integrations: ScmIntegrationRegistry; logger: Logger; @@ -304,7 +315,8 @@ export type DefaultCatalogCollatorFactoryOptions = { entityTransformer?: CatalogCollatorEntityTransformer; }; -export { DeferredEntity }; +// @public @deprecated (undocumented) +export type DeferredEntity = DeferredEntity_2; // @public export type EntitiesSearchFilter = { @@ -325,24 +337,28 @@ export type EntityFilter = } | EntitiesSearchFilter; -export { EntityProvider }; +// @public @deprecated (undocumented) +export type EntityProvider = EntityProvider_2; -export { EntityProviderConnection }; +// @public @deprecated (undocumented) +export type EntityProviderConnection = EntityProviderConnection_2; -export { EntityProviderMutation }; +// @public @deprecated (undocumented) +export type EntityProviderMutation = EntityProviderMutation_2; -export { EntityRelationSpec }; +// @public @deprecated (undocumented) +export type EntityRelationSpec = EntityRelationSpec_2; // @public (undocumented) -export class FileReaderProcessor implements CatalogProcessor { +export class FileReaderProcessor implements CatalogProcessor_2 { // (undocumented) getProcessorName(): string; // (undocumented) readLocation( location: LocationSpec_2, optional: boolean, - emit: CatalogProcessorEmit, - parser: CatalogProcessorParser, + emit: CatalogProcessorEmit_2, + parser: CatalogProcessorParser_2, ): Promise; } @@ -354,7 +370,7 @@ export type LocationAnalyzer = { }; // @public (undocumented) -export class LocationEntityProcessor implements CatalogProcessor { +export class LocationEntityProcessor implements CatalogProcessor_2 { constructor(options: LocationEntityProcessorOptions); // (undocumented) getProcessorName(): string; @@ -362,7 +378,7 @@ export class LocationEntityProcessor implements CatalogProcessor { postProcessEntity( entity: Entity, location: LocationSpec_2, - emit: CatalogProcessorEmit, + emit: CatalogProcessorEmit_2, ): Promise; } @@ -374,20 +390,20 @@ export type LocationEntityProcessorOptions = { // @public @deprecated export type LocationSpec = LocationSpec_2; -// @public (undocumented) -export function locationSpecToLocationEntity(opts: { - location: LocationSpec_2; - parentEntity?: Entity; -}): LocationEntityV1alpha1; +// @public @deprecated (undocumented) +export const locationSpecToLocationEntity: typeof locationSpecToLocationEntity_2; + +// @public @deprecated (undocumented) +export const locationSpecToMetadataName: typeof locationSpecToMetadataName_2; // @public (undocumented) export function parseEntityYaml( data: Buffer, location: LocationSpec_2, -): Iterable; +): Iterable; // @public -export class PlaceholderProcessor implements CatalogProcessor { +export class PlaceholderProcessor implements CatalogProcessor_2 { constructor(options: PlaceholderProcessorOptions); // (undocumented) getProcessorName(): string; @@ -395,7 +411,7 @@ export class PlaceholderProcessor implements CatalogProcessor { preProcessEntity( entity: Entity, location: LocationSpec_2, - emit: CatalogProcessorEmit, + emit: CatalogProcessorEmit_2, ): Promise; } @@ -418,7 +434,7 @@ export type PlaceholderResolverParams = { baseUrl: string; read: PlaceholderResolverRead; resolveUrl: PlaceholderResolverResolveUrl; - emit: CatalogProcessorEmit; + emit: CatalogProcessorEmit_2; }; // @public (undocumented) @@ -433,7 +449,28 @@ export type PlaceholderResolverResolveUrl = ( // @public export type ProcessingIntervalFunction = () => number; -export { processingResult }; +// @public @deprecated (undocumented) +export const processingResult: Readonly<{ + readonly notFoundError: ( + atLocation: LocationSpec_2, + message: string, + ) => CatalogProcessorResult_2; + readonly inputError: ( + atLocation: LocationSpec_2, + message: string, + ) => CatalogProcessorResult_2; + readonly generalError: ( + atLocation: LocationSpec_2, + message: string, + ) => CatalogProcessorResult_2; + readonly location: (newLocation: LocationSpec_2) => CatalogProcessorResult_2; + readonly entity: ( + atLocation: LocationSpec_2, + newEntity: Entity, + ) => CatalogProcessorResult_2; + readonly relation: (spec: EntityRelationSpec_2) => CatalogProcessorResult_2; + readonly refresh: (key: string) => CatalogProcessorResult_2; +}>; // @public (undocumented) export type ScmLocationAnalyzer = { @@ -444,7 +481,7 @@ export type ScmLocationAnalyzer = { }; // @public (undocumented) -export class UrlReaderProcessor implements CatalogProcessor { +export class UrlReaderProcessor implements CatalogProcessor_2 { constructor(options: { reader: UrlReader; logger: Logger }); // (undocumented) getProcessorName(): string; @@ -452,9 +489,9 @@ export class UrlReaderProcessor implements CatalogProcessor { readLocation( location: LocationSpec_2, optional: boolean, - emit: CatalogProcessorEmit, - parser: CatalogProcessorParser, - cache: CatalogProcessorCache, + emit: CatalogProcessorEmit_2, + parser: CatalogProcessorParser_2, + cache: CatalogProcessorCache_2, ): Promise; } ``` diff --git a/plugins/catalog-backend/package.json b/plugins/catalog-backend/package.json index 5d221f2f41..35eac97cc1 100644 --- a/plugins/catalog-backend/package.json +++ b/plugins/catalog-backend/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-catalog-backend", "description": "The Backstage backend plugin that provides the Backstage catalog", - "version": "1.8.0-next.1", + "version": "1.8.0-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog-backend/src/deprecated.ts b/plugins/catalog-backend/src/deprecated.ts new file mode 100644 index 0000000000..c92ec719b7 --- /dev/null +++ b/plugins/catalog-backend/src/deprecated.ts @@ -0,0 +1,143 @@ +/* + * Copyright 2023 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { + locationSpecToMetadataName as _locationSpecToMetadataName, + locationSpecToLocationEntity as _locationSpecToLocationEntity, + processingResult as _processingResult, + type DeferredEntity as _DeferredEntity, + type EntityRelationSpec as _EntityRelationSpec, + type CatalogProcessor as _CatalogProcessor, + type CatalogProcessorParser as _CatalogProcessorParser, + type CatalogProcessorCache as _CatalogProcessorCache, + type CatalogProcessorEmit as _CatalogProcessorEmit, + type CatalogProcessorLocationResult as _CatalogProcessorLocationResult, + type CatalogProcessorEntityResult as _CatalogProcessorEntityResult, + type CatalogProcessorRelationResult as _CatalogProcessorRelationResult, + type CatalogProcessorErrorResult as _CatalogProcessorErrorResult, + type CatalogProcessorRefreshKeysResult as _CatalogProcessorRefreshKeysResult, + type CatalogProcessorResult as _CatalogProcessorResult, + type EntityProvider as _EntityProvider, + type EntityProviderConnection as _EntityProviderConnection, + type EntityProviderMutation as _EntityProviderMutation, +} from '@backstage/plugin-catalog-node'; +import { type LocationSpec as _LocationSpec } from '@backstage/plugin-catalog-common'; + +/** + * @public + * @deprecated import from `@backstage/plugin-catalog-node` instead + */ +export const locationSpecToMetadataName = _locationSpecToMetadataName; +/** + * @public + * @deprecated import from `@backstage/plugin-catalog-node` instead + */ +export const locationSpecToLocationEntity = _locationSpecToLocationEntity; +/** + * @public + * @deprecated import from `@backstage/plugin-catalog-node` instead + */ +export const processingResult = _processingResult; +/** + * @public + * @deprecated import from `@backstage/plugin-catalog-node` instead + */ +export type DeferredEntity = _DeferredEntity; +/** + * @public + * @deprecated import from `@backstage/plugin-catalog-node` instead + */ +export type EntityRelationSpec = _EntityRelationSpec; +/** + * @public + * @deprecated import from `@backstage/plugin-catalog-node` instead + */ +export type CatalogProcessor = _CatalogProcessor; +/** + * @public + * @deprecated import from `@backstage/plugin-catalog-node` instead + */ +export type CatalogProcessorParser = _CatalogProcessorParser; +/** + * @public + * @deprecated import from `@backstage/plugin-catalog-node` instead + */ +export type CatalogProcessorCache = _CatalogProcessorCache; +/** + * @public + * @deprecated import from `@backstage/plugin-catalog-node` instead + */ +export type CatalogProcessorEmit = _CatalogProcessorEmit; +/** + * @public + * @deprecated import from `@backstage/plugin-catalog-node` instead + */ +export type CatalogProcessorLocationResult = _CatalogProcessorLocationResult; +/** + * @public + * @deprecated import from `@backstage/plugin-catalog-node` instead + */ +export type CatalogProcessorEntityResult = _CatalogProcessorEntityResult; +/** + * @public + * @deprecated import from `@backstage/plugin-catalog-node` instead + */ +export type CatalogProcessorRelationResult = _CatalogProcessorRelationResult; +/** + * @public + * @deprecated import from `@backstage/plugin-catalog-node` instead + */ +export type CatalogProcessorErrorResult = _CatalogProcessorErrorResult; +/** + * @public + * @deprecated import from `@backstage/plugin-catalog-node` instead + */ +export type CatalogProcessorRefreshKeysResult = + _CatalogProcessorRefreshKeysResult; +/** + * @public + * @deprecated import from `@backstage/plugin-catalog-node` instead + */ +export type CatalogProcessorResult = _CatalogProcessorResult; +/** + * @public + * @deprecated import from `@backstage/plugin-catalog-node` instead + */ +export type EntityProvider = _EntityProvider; +/** + * @public + * @deprecated import from `@backstage/plugin-catalog-node` instead + */ +export type EntityProviderConnection = _EntityProviderConnection; +/** + * @public + * @deprecated import from `@backstage/plugin-catalog-node` instead + */ +export type EntityProviderMutation = _EntityProviderMutation; + +/** + * Holds the entity location information. + * + * @remarks + * + * `presence` flag: when using repo importer plugin, location is being created before the component yaml file is merged to the main branch. + * This flag is then set to indicate that the file can be not present. + * default value: 'required'. + * + * @public + * @deprecated use the same type from `@backstage/plugin-catalog-common` instead + */ +export type LocationSpec = _LocationSpec; diff --git a/plugins/catalog-backend/src/index.ts b/plugins/catalog-backend/src/index.ts index e52336f036..b3d2bc95c7 100644 --- a/plugins/catalog-backend/src/index.ts +++ b/plugins/catalog-backend/src/index.ts @@ -20,45 +20,10 @@ * @packageDocumentation */ -export type { - DeferredEntity, - EntityRelationSpec, - CatalogProcessor, - CatalogProcessorParser, - CatalogProcessorCache, - CatalogProcessorEmit, - CatalogProcessorLocationResult, - CatalogProcessorEntityResult, - CatalogProcessorRelationResult, - CatalogProcessorErrorResult, - CatalogProcessorRefreshKeysResult, - CatalogProcessorResult, - EntityProvider, - EntityProviderConnection, - EntityProviderMutation, -} from '@backstage/plugin-catalog-node'; -export { processingResult } from '@backstage/plugin-catalog-node'; - export * from './catalog'; export * from './ingestion'; export * from './modules'; export * from './processing'; export * from './search'; export * from './service'; -export * from './util'; - -import { LocationSpec as NonDeprecatedLocationSpec } from '@backstage/plugin-catalog-common'; - -/** - * Holds the entity location information. - * - * @remarks - * - * `presence` flag: when using repo importer plugin, location is being created before the component yaml file is merged to the main branch. - * This flag is then set to indicate that the file can be not present. - * default value: 'required'. - * - * @public - * @deprecated use the same type from `@backstage/plugin-catalog-common` instead - */ -export type LocationSpec = NonDeprecatedLocationSpec; +export * from './deprecated'; diff --git a/plugins/catalog-customized/CHANGELOG.md b/plugins/catalog-customized/CHANGELOG.md index 1b30333d89..654672a156 100644 --- a/plugins/catalog-customized/CHANGELOG.md +++ b/plugins/catalog-customized/CHANGELOG.md @@ -1,5 +1,13 @@ # @internal/plugin-catalog-customized +## 0.0.8-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.4.0-next.2 + - @backstage/plugin-catalog@1.9.0-next.2 + ## 0.0.8-next.1 ### Patch Changes diff --git a/plugins/catalog-customized/package.json b/plugins/catalog-customized/package.json index b0b4b7aba3..20ef38355b 100644 --- a/plugins/catalog-customized/package.json +++ b/plugins/catalog-customized/package.json @@ -1,7 +1,7 @@ { "name": "@internal/plugin-catalog-customized", "description": "The internal Backstage Customizable plugin for browsing the Backstage catalog", - "version": "0.0.8-next.1", + "version": "0.0.8-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog-graph/CHANGELOG.md b/plugins/catalog-graph/CHANGELOG.md index 418ae1f83a..bd0a9d7c76 100644 --- a/plugins/catalog-graph/CHANGELOG.md +++ b/plugins/catalog-graph/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-catalog-graph +## 0.2.28-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.5-next.2 + - @backstage/plugin-catalog-react@1.4.0-next.2 + - @backstage/core-plugin-api@1.5.0-next.2 + ## 0.2.28-next.1 ### Patch Changes diff --git a/plugins/catalog-graph/package.json b/plugins/catalog-graph/package.json index 2947b62b8c..ab7e7e78a9 100644 --- a/plugins/catalog-graph/package.json +++ b/plugins/catalog-graph/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-graph", - "version": "0.2.28-next.1", + "version": "0.2.28-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog-import/CHANGELOG.md b/plugins/catalog-import/CHANGELOG.md index d8eac64d15..0451769b82 100644 --- a/plugins/catalog-import/CHANGELOG.md +++ b/plugins/catalog-import/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-catalog-import +## 0.9.6-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.5-next.2 + - @backstage/plugin-catalog-react@1.4.0-next.2 + - @backstage/core-plugin-api@1.5.0-next.2 + - @backstage/integration-react@1.1.11-next.2 + - @backstage/config@1.0.7-next.0 + - @backstage/integration@1.4.3-next.0 + ## 0.9.6-next.1 ### Patch Changes diff --git a/plugins/catalog-import/package.json b/plugins/catalog-import/package.json index 6721a5bbd9..baddab4656 100644 --- a/plugins/catalog-import/package.json +++ b/plugins/catalog-import/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-catalog-import", "description": "A Backstage plugin the helps you import entities into your catalog", - "version": "0.9.6-next.1", + "version": "0.9.6-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog-import/src/api/CatalogImportClient.test.ts b/plugins/catalog-import/src/api/CatalogImportClient.test.ts index e77abc8a85..646a3b7bf9 100644 --- a/plugins/catalog-import/src/api/CatalogImportClient.test.ts +++ b/plugins/catalog-import/src/api/CatalogImportClient.test.ts @@ -121,7 +121,6 @@ describe('CatalogImportClient', () => { }); afterEach(() => { - jest.restoreAllMocks(); jest.clearAllMocks(); }); diff --git a/plugins/catalog-node/CHANGELOG.md b/plugins/catalog-node/CHANGELOG.md index d1b629247f..8ed02981ca 100644 --- a/plugins/catalog-node/CHANGELOG.md +++ b/plugins/catalog-node/CHANGELOG.md @@ -1,5 +1,12 @@ # @backstage/plugin-catalog-node +## 1.3.4-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.4.1-next.2 + ## 1.3.4-next.1 ### Patch Changes diff --git a/plugins/catalog-node/api-report.md b/plugins/catalog-node/api-report.md index 87da0b6944..47a8e66ca9 100644 --- a/plugins/catalog-node/api-report.md +++ b/plugins/catalog-node/api-report.md @@ -8,6 +8,7 @@ import { CompoundEntityRef } from '@backstage/catalog-model'; import { Entity } from '@backstage/catalog-model'; import { JsonValue } from '@backstage/types'; +import { LocationEntityV1alpha1 } from '@backstage/catalog-model'; import { LocationSpec as LocationSpec_2 } from '@backstage/plugin-catalog-common'; // @public (undocumented) @@ -142,6 +143,15 @@ export type EntityRelationSpec = { // @public @deprecated export type LocationSpec = LocationSpec_2; +// @public +export function locationSpecToLocationEntity(opts: { + location: LocationSpec_2; + parentEntity?: Entity; +}): LocationEntityV1alpha1; + +// @public +export function locationSpecToMetadataName(location: LocationSpec_2): string; + // @public export const processingResult: Readonly<{ readonly notFoundError: ( diff --git a/plugins/catalog-node/package.json b/plugins/catalog-node/package.json index 677463c52b..d5ad3b86ea 100644 --- a/plugins/catalog-node/package.json +++ b/plugins/catalog-node/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-catalog-node", "description": "The plugin-catalog-node module for @backstage/plugin-catalog-backend", - "version": "1.3.4-next.1", + "version": "1.3.4-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog-node/src/conversion.ts b/plugins/catalog-node/src/conversion.ts new file mode 100644 index 0000000000..bbaebc7e35 --- /dev/null +++ b/plugins/catalog-node/src/conversion.ts @@ -0,0 +1,103 @@ +/* + * Copyright 2021 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { + Entity, + LocationEntityV1alpha1, + ANNOTATION_LOCATION, + ANNOTATION_ORIGIN_LOCATION, + stringifyEntityRef, + stringifyLocationRef, +} from '@backstage/catalog-model'; +import { createHash } from 'crypto'; +import { LocationSpec } from '@backstage/plugin-catalog-common'; + +/** + * A standard way of producing a machine generated name for a location. + * + * @public + */ +export function locationSpecToMetadataName(location: LocationSpec) { + const hash = createHash('sha1') + .update(`${location.type}:${location.target}`) + .digest('hex'); + return `generated-${hash}`; +} + +/** + * A standard way of producing a machine generated Location kind entity for a + * location. + * + * @public + */ +export function locationSpecToLocationEntity(opts: { + location: LocationSpec; + parentEntity?: Entity; +}): LocationEntityV1alpha1 { + const location = opts.location; + const parentEntity = opts.parentEntity; + + let ownLocation: string; + let originLocation: string; + if (parentEntity) { + const maybeOwnLocation = + parentEntity.metadata.annotations?.[ANNOTATION_LOCATION]; + if (!maybeOwnLocation) { + throw new Error( + `Parent entity '${stringifyEntityRef( + parentEntity, + )}' of location '${stringifyLocationRef( + location, + )}' does not have a location annotation`, + ); + } + ownLocation = maybeOwnLocation; + const maybeOriginLocation = + parentEntity.metadata.annotations?.[ANNOTATION_ORIGIN_LOCATION]; + if (!maybeOriginLocation) { + throw new Error( + `Parent entity '${stringifyEntityRef( + parentEntity, + )}' of location '${stringifyLocationRef( + location, + )}' does not have an origin location annotation`, + ); + } + originLocation = maybeOriginLocation; + } else { + ownLocation = stringifyLocationRef(location); + originLocation = ownLocation; + } + + const result: LocationEntityV1alpha1 = { + apiVersion: 'backstage.io/v1alpha1', + kind: 'Location', + metadata: { + name: locationSpecToMetadataName(location), + annotations: { + [ANNOTATION_LOCATION]: ownLocation, + [ANNOTATION_ORIGIN_LOCATION]: originLocation, + }, + }, + spec: { + type: location.type, + target: location.target, + presence: location.presence, + }, + }; + + return result; +} diff --git a/plugins/catalog-node/src/index.ts b/plugins/catalog-node/src/index.ts index 6a1accfcbd..2dd8b5fd5a 100644 --- a/plugins/catalog-node/src/index.ts +++ b/plugins/catalog-node/src/index.ts @@ -21,4 +21,5 @@ */ export * from './api'; +export * from './conversion'; export * from './processing'; diff --git a/plugins/catalog-react/CHANGELOG.md b/plugins/catalog-react/CHANGELOG.md index e1b9da465e..4d8acf0936 100644 --- a/plugins/catalog-react/CHANGELOG.md +++ b/plugins/catalog-react/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-catalog-react +## 1.4.0-next.2 + +### Patch Changes + +- 65454876fb2: Minor API report tweaks +- Updated dependencies + - @backstage/core-components@0.12.5-next.2 + - @backstage/core-plugin-api@1.5.0-next.2 + - @backstage/plugin-permission-react@0.4.11-next.2 + - @backstage/integration@1.4.3-next.0 + ## 1.4.0-next.1 ### Patch Changes diff --git a/plugins/catalog-react/package.json b/plugins/catalog-react/package.json index 81f91374e6..8f0b9627c7 100644 --- a/plugins/catalog-react/package.json +++ b/plugins/catalog-react/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-catalog-react", "description": "A frontend library that helps other Backstage plugins interact with the catalog", - "version": "1.4.0-next.1", + "version": "1.4.0-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog/CHANGELOG.md b/plugins/catalog/CHANGELOG.md index 0b3ade1136..873c90de07 100644 --- a/plugins/catalog/CHANGELOG.md +++ b/plugins/catalog/CHANGELOG.md @@ -1,5 +1,20 @@ # @backstage/plugin-catalog +## 1.9.0-next.2 + +### Minor Changes + +- 23cc40039c0: allow entity switch to render all cases that match the condition + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.5-next.2 + - @backstage/plugin-catalog-react@1.4.0-next.2 + - @backstage/plugin-search-react@1.5.1-next.2 + - @backstage/core-plugin-api@1.5.0-next.2 + - @backstage/integration-react@1.1.11-next.2 + ## 1.9.0-next.1 ### Minor Changes diff --git a/plugins/catalog/package.json b/plugins/catalog/package.json index c65cfccfaa..c66ae8fb5e 100644 --- a/plugins/catalog/package.json +++ b/plugins/catalog/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-catalog", "description": "The Backstage plugin for browsing the Backstage catalog", - "version": "1.9.0-next.1", + "version": "1.9.0-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog/src/components/EntitySwitch/EntitySwitch.test.tsx b/plugins/catalog/src/components/EntitySwitch/EntitySwitch.test.tsx index 8ee44041c8..13e214d823 100644 --- a/plugins/catalog/src/components/EntitySwitch/EntitySwitch.test.tsx +++ b/plugins/catalog/src/components/EntitySwitch/EntitySwitch.test.tsx @@ -173,6 +173,42 @@ describe('EntitySwitch', () => { expect(screen.getByText('C')).toBeInTheDocument(); }); + it('should render nothing if no default case is set for multiple matches', () => { + const entity = { metadata: { name: 'mock' }, kind: 'component' } as Entity; + + render( + + + + A

} /> + B

} /> +
+
+
, + ); + + expect(screen.queryByText('A')).not.toBeInTheDocument(); + expect(screen.queryByText('B')).not.toBeInTheDocument(); + }); + + it('should render nothing if no default case is set for default', () => { + const entity = { metadata: { name: 'mock' }, kind: 'component' } as Entity; + + render( + + + + A

} /> + B

} /> +
+
+
, + ); + + expect(screen.queryByText('A')).not.toBeInTheDocument(); + expect(screen.queryByText('B')).not.toBeInTheDocument(); + }); + it('should switch with async condition that is true', async () => { const entity = { metadata: { name: 'mock' }, kind: 'component' } as Entity; diff --git a/plugins/catalog/src/components/EntitySwitch/EntitySwitch.tsx b/plugins/catalog/src/components/EntitySwitch/EntitySwitch.tsx index 6ad3c66ab3..3cd806faa5 100644 --- a/plugins/catalog/src/components/EntitySwitch/EntitySwitch.tsx +++ b/plugins/catalog/src/components/EntitySwitch/EntitySwitch.tsx @@ -169,7 +169,7 @@ function AsyncEntitySwitch({ } function getDefaultChildren(results: SwitchCaseResult[]) { - return results.filter(r => r.if === undefined)[0].children ?? null; + return results.filter(r => r.if === undefined)[0]?.children ?? null; } EntitySwitch.Case = EntitySwitchCaseComponent; diff --git a/plugins/cicd-statistics-module-gitlab/CHANGELOG.md b/plugins/cicd-statistics-module-gitlab/CHANGELOG.md index dc47a327c0..55ec192258 100644 --- a/plugins/cicd-statistics-module-gitlab/CHANGELOG.md +++ b/plugins/cicd-statistics-module-gitlab/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-cicd-statistics-module-gitlab +## 0.1.12-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.5.0-next.2 + - @backstage/plugin-cicd-statistics@0.1.18-next.2 + ## 0.1.12-next.1 ### Patch Changes diff --git a/plugins/cicd-statistics-module-gitlab/package.json b/plugins/cicd-statistics-module-gitlab/package.json index c5b999fefb..38de7c6799 100644 --- a/plugins/cicd-statistics-module-gitlab/package.json +++ b/plugins/cicd-statistics-module-gitlab/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-cicd-statistics-module-gitlab", "description": "CI/CD Statistics plugin module; Gitlab CICD", - "version": "0.1.12-next.1", + "version": "0.1.12-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/cicd-statistics/CHANGELOG.md b/plugins/cicd-statistics/CHANGELOG.md index 37deb19ea9..97434f99c7 100644 --- a/plugins/cicd-statistics/CHANGELOG.md +++ b/plugins/cicd-statistics/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-cicd-statistics +## 0.1.18-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.4.0-next.2 + - @backstage/core-plugin-api@1.5.0-next.2 + ## 0.1.18-next.1 ### Patch Changes diff --git a/plugins/cicd-statistics/package.json b/plugins/cicd-statistics/package.json index 6078d3a641..8262235489 100644 --- a/plugins/cicd-statistics/package.json +++ b/plugins/cicd-statistics/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-cicd-statistics", "description": "A frontend plugin visualizing CI/CD pipeline statistics (build time)", - "version": "0.1.18-next.1", + "version": "0.1.18-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/circleci/CHANGELOG.md b/plugins/circleci/CHANGELOG.md index e91f34eb87..c43162fe14 100644 --- a/plugins/circleci/CHANGELOG.md +++ b/plugins/circleci/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-circleci +## 0.3.16-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.5-next.2 + - @backstage/plugin-catalog-react@1.4.0-next.2 + - @backstage/core-plugin-api@1.5.0-next.2 + ## 0.3.16-next.1 ### Patch Changes diff --git a/plugins/circleci/package.json b/plugins/circleci/package.json index 1ba2a8f7b1..55d02ce8bd 100644 --- a/plugins/circleci/package.json +++ b/plugins/circleci/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-circleci", "description": "A Backstage plugin that integrates towards Circle CI", - "version": "0.3.16-next.1", + "version": "0.3.16-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/cloudbuild/CHANGELOG.md b/plugins/cloudbuild/CHANGELOG.md index c5c915d5a4..bc5f71d8e1 100644 --- a/plugins/cloudbuild/CHANGELOG.md +++ b/plugins/cloudbuild/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-cloudbuild +## 0.3.16-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.5-next.2 + - @backstage/plugin-catalog-react@1.4.0-next.2 + - @backstage/core-plugin-api@1.5.0-next.2 + ## 0.3.16-next.1 ### Patch Changes diff --git a/plugins/cloudbuild/package.json b/plugins/cloudbuild/package.json index f5787447c8..04fa511cb6 100644 --- a/plugins/cloudbuild/package.json +++ b/plugins/cloudbuild/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-cloudbuild", "description": "A Backstage plugin that integrates towards Google Cloud Build", - "version": "0.3.16-next.1", + "version": "0.3.16-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/code-climate/CHANGELOG.md b/plugins/code-climate/CHANGELOG.md index 90a9895eac..e98be293b8 100644 --- a/plugins/code-climate/CHANGELOG.md +++ b/plugins/code-climate/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-code-climate +## 0.1.16-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.5-next.2 + - @backstage/plugin-catalog-react@1.4.0-next.2 + - @backstage/core-plugin-api@1.5.0-next.2 + ## 0.1.16-next.1 ### Patch Changes diff --git a/plugins/code-climate/package.json b/plugins/code-climate/package.json index b6c2a04942..9890f8b95e 100644 --- a/plugins/code-climate/package.json +++ b/plugins/code-climate/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-code-climate", - "version": "0.1.16-next.1", + "version": "0.1.16-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/code-coverage-backend/CHANGELOG.md b/plugins/code-coverage-backend/CHANGELOG.md index b425cc02da..74336f32c8 100644 --- a/plugins/code-coverage-backend/CHANGELOG.md +++ b/plugins/code-coverage-backend/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-code-coverage-backend +## 0.2.9-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.3-next.2 + - @backstage/config@1.0.7-next.0 + - @backstage/integration@1.4.3-next.0 + ## 0.2.9-next.1 ### Patch Changes diff --git a/plugins/code-coverage-backend/package.json b/plugins/code-coverage-backend/package.json index 9a060d1f0f..fca52bdebc 100644 --- a/plugins/code-coverage-backend/package.json +++ b/plugins/code-coverage-backend/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-code-coverage-backend", "description": "A Backstage backend plugin that helps you keep track of your code coverage", - "version": "0.2.9-next.1", + "version": "0.2.9-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/code-coverage/CHANGELOG.md b/plugins/code-coverage/CHANGELOG.md index 73cabd8ca1..914768f638 100644 --- a/plugins/code-coverage/CHANGELOG.md +++ b/plugins/code-coverage/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-code-coverage +## 0.2.9-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.5-next.2 + - @backstage/plugin-catalog-react@1.4.0-next.2 + - @backstage/core-plugin-api@1.5.0-next.2 + - @backstage/config@1.0.7-next.0 + ## 0.2.9-next.1 ### Patch Changes diff --git a/plugins/code-coverage/package.json b/plugins/code-coverage/package.json index ae2b03416b..cfdddfc6af 100644 --- a/plugins/code-coverage/package.json +++ b/plugins/code-coverage/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-code-coverage", "description": "A Backstage plugin that helps you keep track of your code coverage", - "version": "0.2.9-next.1", + "version": "0.2.9-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/codescene/CHANGELOG.md b/plugins/codescene/CHANGELOG.md index 610487334c..7390729c48 100644 --- a/plugins/codescene/CHANGELOG.md +++ b/plugins/codescene/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-codescene +## 0.1.11-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.5-next.2 + - @backstage/core-plugin-api@1.5.0-next.2 + - @backstage/config@1.0.7-next.0 + ## 0.1.11-next.1 ### Patch Changes diff --git a/plugins/codescene/package.json b/plugins/codescene/package.json index a4b1bf6d75..49cedd3bc4 100644 --- a/plugins/codescene/package.json +++ b/plugins/codescene/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-codescene", - "version": "0.1.11-next.1", + "version": "0.1.11-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/config-schema/CHANGELOG.md b/plugins/config-schema/CHANGELOG.md index def33080f2..5e0de80621 100644 --- a/plugins/config-schema/CHANGELOG.md +++ b/plugins/config-schema/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-config-schema +## 0.1.39-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.5-next.2 + - @backstage/core-plugin-api@1.5.0-next.2 + - @backstage/config@1.0.7-next.0 + ## 0.1.39-next.1 ### Patch Changes diff --git a/plugins/config-schema/package.json b/plugins/config-schema/package.json index bb0b43729b..730265cbea 100644 --- a/plugins/config-schema/package.json +++ b/plugins/config-schema/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-config-schema", "description": "A Backstage plugin that lets you browse the configuration schema of your app", - "version": "0.1.39-next.1", + "version": "0.1.39-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/cost-insights/CHANGELOG.md b/plugins/cost-insights/CHANGELOG.md index d673749859..f108804cb6 100644 --- a/plugins/cost-insights/CHANGELOG.md +++ b/plugins/cost-insights/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-cost-insights +## 0.12.5-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.5-next.2 + - @backstage/plugin-catalog-react@1.4.0-next.2 + - @backstage/core-plugin-api@1.5.0-next.2 + - @backstage/config@1.0.7-next.0 + ## 0.12.5-next.1 ### Patch Changes diff --git a/plugins/cost-insights/package.json b/plugins/cost-insights/package.json index f2a907dfb3..aabd4d340d 100644 --- a/plugins/cost-insights/package.json +++ b/plugins/cost-insights/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-cost-insights", "description": "A Backstage plugin that helps you keep track of your cloud spend", - "version": "0.12.5-next.1", + "version": "0.12.5-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/dynatrace/CHANGELOG.md b/plugins/dynatrace/CHANGELOG.md index 4949fd5e16..402ee43c1e 100644 --- a/plugins/dynatrace/CHANGELOG.md +++ b/plugins/dynatrace/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-dynatrace +## 3.0.0-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.5-next.2 + - @backstage/plugin-catalog-react@1.4.0-next.2 + - @backstage/core-plugin-api@1.5.0-next.2 + ## 3.0.0-next.1 ### Patch Changes diff --git a/plugins/dynatrace/package.json b/plugins/dynatrace/package.json index 49c408fff3..c66ef32c7b 100644 --- a/plugins/dynatrace/package.json +++ b/plugins/dynatrace/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-dynatrace", - "version": "3.0.0-next.1", + "version": "3.0.0-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/entity-feedback-backend/CHANGELOG.md b/plugins/entity-feedback-backend/CHANGELOG.md index f0acfaef30..cac724d7ef 100644 --- a/plugins/entity-feedback-backend/CHANGELOG.md +++ b/plugins/entity-feedback-backend/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-entity-feedback-backend +## 0.1.1-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.2.12-next.2 + - @backstage/backend-common@0.18.3-next.2 + - @backstage/config@1.0.7-next.0 + ## 0.1.1-next.1 ### Patch Changes diff --git a/plugins/entity-feedback-backend/package.json b/plugins/entity-feedback-backend/package.json index 9ac805295e..b482fdb212 100644 --- a/plugins/entity-feedback-backend/package.json +++ b/plugins/entity-feedback-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-entity-feedback-backend", - "version": "0.1.1-next.1", + "version": "0.1.1-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/entity-feedback/CHANGELOG.md b/plugins/entity-feedback/CHANGELOG.md index 23016c805f..72cb7b272a 100644 --- a/plugins/entity-feedback/CHANGELOG.md +++ b/plugins/entity-feedback/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-entity-feedback +## 0.1.1-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.5-next.2 + - @backstage/plugin-catalog-react@1.4.0-next.2 + - @backstage/core-plugin-api@1.5.0-next.2 + ## 0.1.1-next.1 ### Patch Changes diff --git a/plugins/entity-feedback/package.json b/plugins/entity-feedback/package.json index da0bc0b0ca..760b192440 100644 --- a/plugins/entity-feedback/package.json +++ b/plugins/entity-feedback/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-entity-feedback", - "version": "0.1.1-next.1", + "version": "0.1.1-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/entity-validation/CHANGELOG.md b/plugins/entity-validation/CHANGELOG.md index cd37ad05f9..43ecb6527d 100644 --- a/plugins/entity-validation/CHANGELOG.md +++ b/plugins/entity-validation/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-entity-validation +## 0.1.1-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.5-next.2 + - @backstage/plugin-catalog-react@1.4.0-next.2 + - @backstage/core-plugin-api@1.5.0-next.2 + ## 0.1.1-next.1 ### Patch Changes diff --git a/plugins/entity-validation/package.json b/plugins/entity-validation/package.json index 33f0d8fc60..81c13cc46b 100644 --- a/plugins/entity-validation/package.json +++ b/plugins/entity-validation/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-entity-validation", - "version": "0.1.1-next.1", + "version": "0.1.1-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/events-backend-module-aws-sqs/CHANGELOG.md b/plugins/events-backend-module-aws-sqs/CHANGELOG.md index e80ae855d6..0e5659c538 100644 --- a/plugins/events-backend-module-aws-sqs/CHANGELOG.md +++ b/plugins/events-backend-module-aws-sqs/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-events-backend-module-aws-sqs +## 0.1.5-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-tasks@0.5.0-next.2 + - @backstage/backend-common@0.18.3-next.2 + - @backstage/backend-plugin-api@0.4.1-next.2 + - @backstage/plugin-events-node@0.2.4-next.2 + - @backstage/config@1.0.7-next.0 + ## 0.1.5-next.1 ### Patch Changes diff --git a/plugins/events-backend-module-aws-sqs/alpha-api-report.md b/plugins/events-backend-module-aws-sqs/alpha-api-report.md index b9f60c4437..e48515a414 100644 --- a/plugins/events-backend-module-aws-sqs/alpha-api-report.md +++ b/plugins/events-backend-module-aws-sqs/alpha-api-report.md @@ -6,7 +6,7 @@ import { BackendFeature } from '@backstage/backend-plugin-api'; // @alpha -export const awsSqsConsumingEventPublisherEventsModule: () => BackendFeature; +export const eventsModuleAwsSqsConsumingEventPublisher: () => BackendFeature; // (No @packageDocumentation comment for this package) ``` diff --git a/plugins/events-backend-module-aws-sqs/package.json b/plugins/events-backend-module-aws-sqs/package.json index 050e13a15f..9278099801 100644 --- a/plugins/events-backend-module-aws-sqs/package.json +++ b/plugins/events-backend-module-aws-sqs/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-events-backend-module-aws-sqs", - "version": "0.1.5-next.1", + "version": "0.1.5-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/events-backend-module-aws-sqs/src/alpha.ts b/plugins/events-backend-module-aws-sqs/src/alpha.ts index 00f08e4417..4f3ae09c42 100644 --- a/plugins/events-backend-module-aws-sqs/src/alpha.ts +++ b/plugins/events-backend-module-aws-sqs/src/alpha.ts @@ -14,4 +14,4 @@ * limitations under the License. */ -export { awsSqsConsumingEventPublisherEventsModule } from './service/AwsSqsConsumingEventPublisherEventsModule'; +export { eventsModuleAwsSqsConsumingEventPublisher } from './service/eventsModuleAwsSqsConsumingEventPublisher'; diff --git a/plugins/events-backend-module-aws-sqs/src/service/AwsSqsConsumingEventPublisherEventsModule.test.ts b/plugins/events-backend-module-aws-sqs/src/service/eventsModuleAwsSqsConsumingEventPublisher.test.ts similarity index 92% rename from plugins/events-backend-module-aws-sqs/src/service/AwsSqsConsumingEventPublisherEventsModule.test.ts rename to plugins/events-backend-module-aws-sqs/src/service/eventsModuleAwsSqsConsumingEventPublisher.test.ts index 3963b9a8b6..921dc38552 100644 --- a/plugins/events-backend-module-aws-sqs/src/service/AwsSqsConsumingEventPublisherEventsModule.test.ts +++ b/plugins/events-backend-module-aws-sqs/src/service/eventsModuleAwsSqsConsumingEventPublisher.test.ts @@ -20,10 +20,10 @@ import { startTestBackend } from '@backstage/backend-test-utils'; import { ConfigReader } from '@backstage/config'; import { eventsExtensionPoint } from '@backstage/plugin-events-node/alpha'; import { TestEventBroker } from '@backstage/plugin-events-backend-test-utils'; -import { awsSqsConsumingEventPublisherEventsModule } from './AwsSqsConsumingEventPublisherEventsModule'; +import { eventsModuleAwsSqsConsumingEventPublisher } from './eventsModuleAwsSqsConsumingEventPublisher'; import { AwsSqsConsumingEventPublisher } from '../publisher/AwsSqsConsumingEventPublisher'; -describe('awsSqsEventsModule', () => { +describe('eventsModuleAwsSqsConsumingEventPublisher', () => { it('should be correctly wired and set up', async () => { const config = new ConfigReader({ events: { @@ -68,7 +68,7 @@ describe('awsSqsEventsModule', () => { [coreServices.logger, getVoidLogger()], [coreServices.scheduler, scheduler], ], - features: [awsSqsConsumingEventPublisherEventsModule()], + features: [eventsModuleAwsSqsConsumingEventPublisher()], }); expect(addedPublishers).not.toBeUndefined(); diff --git a/plugins/events-backend-module-aws-sqs/src/service/AwsSqsConsumingEventPublisherEventsModule.ts b/plugins/events-backend-module-aws-sqs/src/service/eventsModuleAwsSqsConsumingEventPublisher.ts similarity index 92% rename from plugins/events-backend-module-aws-sqs/src/service/AwsSqsConsumingEventPublisherEventsModule.ts rename to plugins/events-backend-module-aws-sqs/src/service/eventsModuleAwsSqsConsumingEventPublisher.ts index 4205bd231b..41ae2d80d7 100644 --- a/plugins/events-backend-module-aws-sqs/src/service/AwsSqsConsumingEventPublisherEventsModule.ts +++ b/plugins/events-backend-module-aws-sqs/src/service/eventsModuleAwsSqsConsumingEventPublisher.ts @@ -27,9 +27,9 @@ import { AwsSqsConsumingEventPublisher } from '../publisher/AwsSqsConsumingEvent * * @alpha */ -export const awsSqsConsumingEventPublisherEventsModule = createBackendModule({ +export const eventsModuleAwsSqsConsumingEventPublisher = createBackendModule({ pluginId: 'events', - moduleId: 'awsSqsConsumingEventPublisherEventsModule', + moduleId: 'awsSqsConsumingEventPublisher', register(env) { env.registerInit({ deps: { diff --git a/plugins/events-backend-module-azure/CHANGELOG.md b/plugins/events-backend-module-azure/CHANGELOG.md index df7cfc4aa9..159603d965 100644 --- a/plugins/events-backend-module-azure/CHANGELOG.md +++ b/plugins/events-backend-module-azure/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-events-backend-module-azure +## 0.1.5-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.4.1-next.2 + - @backstage/plugin-events-node@0.2.4-next.2 + ## 0.1.5-next.1 ### Patch Changes diff --git a/plugins/events-backend-module-azure/alpha-api-report.md b/plugins/events-backend-module-azure/alpha-api-report.md index e3fed2cab0..1bd568d1df 100644 --- a/plugins/events-backend-module-azure/alpha-api-report.md +++ b/plugins/events-backend-module-azure/alpha-api-report.md @@ -6,7 +6,7 @@ import { BackendFeature } from '@backstage/backend-plugin-api'; // @alpha -export const azureDevOpsEventRouterEventsModule: () => BackendFeature; +export const eventsModuleAzureDevOpsEventRouter: () => BackendFeature; // (No @packageDocumentation comment for this package) ``` diff --git a/plugins/events-backend-module-azure/package.json b/plugins/events-backend-module-azure/package.json index ca0e0e614f..ef00f0f3b9 100644 --- a/plugins/events-backend-module-azure/package.json +++ b/plugins/events-backend-module-azure/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-events-backend-module-azure", - "version": "0.1.5-next.1", + "version": "0.1.5-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/events-backend-module-azure/src/alpha.ts b/plugins/events-backend-module-azure/src/alpha.ts index 8eacbd8270..07334fcbda 100644 --- a/plugins/events-backend-module-azure/src/alpha.ts +++ b/plugins/events-backend-module-azure/src/alpha.ts @@ -14,4 +14,4 @@ * limitations under the License. */ -export { azureDevOpsEventRouterEventsModule } from './service/AzureDevOpsEventRouterEventsModule'; +export { eventsModuleAzureDevOpsEventRouter } from './service/eventsModuleAzureDevOpsEventRouter'; diff --git a/plugins/events-backend-module-azure/src/service/AzureDevOpsEventRouterEventsModule.test.ts b/plugins/events-backend-module-azure/src/service/eventsModuleAzureDevOpsEventRouter.test.ts similarity index 88% rename from plugins/events-backend-module-azure/src/service/AzureDevOpsEventRouterEventsModule.test.ts rename to plugins/events-backend-module-azure/src/service/eventsModuleAzureDevOpsEventRouter.test.ts index dbd61782ae..1ff756a2d2 100644 --- a/plugins/events-backend-module-azure/src/service/AzureDevOpsEventRouterEventsModule.test.ts +++ b/plugins/events-backend-module-azure/src/service/eventsModuleAzureDevOpsEventRouter.test.ts @@ -16,10 +16,10 @@ import { startTestBackend } from '@backstage/backend-test-utils'; import { eventsExtensionPoint } from '@backstage/plugin-events-node/alpha'; -import { azureDevOpsEventRouterEventsModule } from './AzureDevOpsEventRouterEventsModule'; +import { eventsModuleAzureDevOpsEventRouter } from './eventsModuleAzureDevOpsEventRouter'; import { AzureDevOpsEventRouter } from '../router/AzureDevOpsEventRouter'; -describe('azureDevOpsEventRouterEventsModule', () => { +describe('eventsModuleAzureDevOpsEventRouter', () => { it('should be correctly wired and set up', async () => { let addedPublisher: AzureDevOpsEventRouter | undefined; let addedSubscriber: AzureDevOpsEventRouter | undefined; @@ -35,7 +35,7 @@ describe('azureDevOpsEventRouterEventsModule', () => { await startTestBackend({ extensionPoints: [[eventsExtensionPoint, extensionPoint]], services: [], - features: [azureDevOpsEventRouterEventsModule()], + features: [eventsModuleAzureDevOpsEventRouter()], }); expect(addedPublisher).not.toBeUndefined(); diff --git a/plugins/events-backend-module-azure/src/service/AzureDevOpsEventRouterEventsModule.ts b/plugins/events-backend-module-azure/src/service/eventsModuleAzureDevOpsEventRouter.ts similarity index 95% rename from plugins/events-backend-module-azure/src/service/AzureDevOpsEventRouterEventsModule.ts rename to plugins/events-backend-module-azure/src/service/eventsModuleAzureDevOpsEventRouter.ts index 18851befa4..36f3acada0 100644 --- a/plugins/events-backend-module-azure/src/service/AzureDevOpsEventRouterEventsModule.ts +++ b/plugins/events-backend-module-azure/src/service/eventsModuleAzureDevOpsEventRouter.ts @@ -25,7 +25,7 @@ import { AzureDevOpsEventRouter } from '../router/AzureDevOpsEventRouter'; * * @alpha */ -export const azureDevOpsEventRouterEventsModule = createBackendModule({ +export const eventsModuleAzureDevOpsEventRouter = createBackendModule({ pluginId: 'events', moduleId: 'azureDevOpsEventRouter', register(env) { diff --git a/plugins/events-backend-module-bitbucket-cloud/CHANGELOG.md b/plugins/events-backend-module-bitbucket-cloud/CHANGELOG.md index 5f2a679c67..9cf0d0a70e 100644 --- a/plugins/events-backend-module-bitbucket-cloud/CHANGELOG.md +++ b/plugins/events-backend-module-bitbucket-cloud/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-events-backend-module-bitbucket-cloud +## 0.1.5-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.4.1-next.2 + - @backstage/plugin-events-node@0.2.4-next.2 + ## 0.1.5-next.1 ### Patch Changes diff --git a/plugins/events-backend-module-bitbucket-cloud/alpha-api-report.md b/plugins/events-backend-module-bitbucket-cloud/alpha-api-report.md index f8e550bf98..5e63ae36c8 100644 --- a/plugins/events-backend-module-bitbucket-cloud/alpha-api-report.md +++ b/plugins/events-backend-module-bitbucket-cloud/alpha-api-report.md @@ -6,7 +6,7 @@ import { BackendFeature } from '@backstage/backend-plugin-api'; // @alpha -export const bitbucketCloudEventRouterEventsModule: () => BackendFeature; +export const eventsModuleBitbucketCloudEventRouter: () => BackendFeature; // (No @packageDocumentation comment for this package) ``` diff --git a/plugins/events-backend-module-bitbucket-cloud/package.json b/plugins/events-backend-module-bitbucket-cloud/package.json index 44849ff0fc..fa7dba892e 100644 --- a/plugins/events-backend-module-bitbucket-cloud/package.json +++ b/plugins/events-backend-module-bitbucket-cloud/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-events-backend-module-bitbucket-cloud", - "version": "0.1.5-next.1", + "version": "0.1.5-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/events-backend-module-bitbucket-cloud/src/alpha.ts b/plugins/events-backend-module-bitbucket-cloud/src/alpha.ts index e19ff9c9b5..75cda4327d 100644 --- a/plugins/events-backend-module-bitbucket-cloud/src/alpha.ts +++ b/plugins/events-backend-module-bitbucket-cloud/src/alpha.ts @@ -14,4 +14,4 @@ * limitations under the License. */ -export { bitbucketCloudEventRouterEventsModule } from './service/BitbucketCloudEventRouterEventsModule'; +export { eventsModuleBitbucketCloudEventRouter } from './service/eventsModuleBitbucketCloudEventRouter'; diff --git a/plugins/events-backend-module-bitbucket-cloud/src/service/BitbucketCloudEventRouterEventsModule.test.ts b/plugins/events-backend-module-bitbucket-cloud/src/service/eventsModuleBitbucketCloudEventRouter.test.ts similarity index 88% rename from plugins/events-backend-module-bitbucket-cloud/src/service/BitbucketCloudEventRouterEventsModule.test.ts rename to plugins/events-backend-module-bitbucket-cloud/src/service/eventsModuleBitbucketCloudEventRouter.test.ts index 60ce5b713e..17d2252c7b 100644 --- a/plugins/events-backend-module-bitbucket-cloud/src/service/BitbucketCloudEventRouterEventsModule.test.ts +++ b/plugins/events-backend-module-bitbucket-cloud/src/service/eventsModuleBitbucketCloudEventRouter.test.ts @@ -16,10 +16,10 @@ import { startTestBackend } from '@backstage/backend-test-utils'; import { eventsExtensionPoint } from '@backstage/plugin-events-node/alpha'; -import { bitbucketCloudEventRouterEventsModule } from './BitbucketCloudEventRouterEventsModule'; +import { eventsModuleBitbucketCloudEventRouter } from './eventsModuleBitbucketCloudEventRouter'; import { BitbucketCloudEventRouter } from '../router/BitbucketCloudEventRouter'; -describe('bitbucketCloudEventRouterEventsModule', () => { +describe('eventsModuleBitbucketCloudEventRouter', () => { it('should be correctly wired and set up', async () => { let addedPublisher: BitbucketCloudEventRouter | undefined; let addedSubscriber: BitbucketCloudEventRouter | undefined; @@ -35,7 +35,7 @@ describe('bitbucketCloudEventRouterEventsModule', () => { await startTestBackend({ extensionPoints: [[eventsExtensionPoint, extensionPoint]], services: [], - features: [bitbucketCloudEventRouterEventsModule()], + features: [eventsModuleBitbucketCloudEventRouter()], }); expect(addedPublisher).not.toBeUndefined(); diff --git a/plugins/events-backend-module-bitbucket-cloud/src/service/BitbucketCloudEventRouterEventsModule.ts b/plugins/events-backend-module-bitbucket-cloud/src/service/eventsModuleBitbucketCloudEventRouter.ts similarity index 95% rename from plugins/events-backend-module-bitbucket-cloud/src/service/BitbucketCloudEventRouterEventsModule.ts rename to plugins/events-backend-module-bitbucket-cloud/src/service/eventsModuleBitbucketCloudEventRouter.ts index 9516651aa3..60a8cc31c8 100644 --- a/plugins/events-backend-module-bitbucket-cloud/src/service/BitbucketCloudEventRouterEventsModule.ts +++ b/plugins/events-backend-module-bitbucket-cloud/src/service/eventsModuleBitbucketCloudEventRouter.ts @@ -25,7 +25,7 @@ import { BitbucketCloudEventRouter } from '../router/BitbucketCloudEventRouter'; * * @alpha */ -export const bitbucketCloudEventRouterEventsModule = createBackendModule({ +export const eventsModuleBitbucketCloudEventRouter = createBackendModule({ pluginId: 'events', moduleId: 'bitbucketCloudEventRouter', register(env) { diff --git a/plugins/events-backend-module-gerrit/CHANGELOG.md b/plugins/events-backend-module-gerrit/CHANGELOG.md index 263fe8ac5b..accd659217 100644 --- a/plugins/events-backend-module-gerrit/CHANGELOG.md +++ b/plugins/events-backend-module-gerrit/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-events-backend-module-gerrit +## 0.1.5-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.4.1-next.2 + - @backstage/plugin-events-node@0.2.4-next.2 + ## 0.1.5-next.1 ### Patch Changes diff --git a/plugins/events-backend-module-gerrit/alpha-api-report.md b/plugins/events-backend-module-gerrit/alpha-api-report.md index f610d518e7..d1be54730f 100644 --- a/plugins/events-backend-module-gerrit/alpha-api-report.md +++ b/plugins/events-backend-module-gerrit/alpha-api-report.md @@ -6,7 +6,7 @@ import { BackendFeature } from '@backstage/backend-plugin-api'; // @alpha -export const gerritEventRouterEventsModule: () => BackendFeature; +export const eventsModuleGerritEventRouter: () => BackendFeature; // (No @packageDocumentation comment for this package) ``` diff --git a/plugins/events-backend-module-gerrit/package.json b/plugins/events-backend-module-gerrit/package.json index 3a407cb786..de5d104781 100644 --- a/plugins/events-backend-module-gerrit/package.json +++ b/plugins/events-backend-module-gerrit/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-events-backend-module-gerrit", - "version": "0.1.5-next.1", + "version": "0.1.5-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/events-backend-module-gerrit/src/alpha.ts b/plugins/events-backend-module-gerrit/src/alpha.ts index 26fd89b14d..788331b998 100644 --- a/plugins/events-backend-module-gerrit/src/alpha.ts +++ b/plugins/events-backend-module-gerrit/src/alpha.ts @@ -14,4 +14,4 @@ * limitations under the License. */ -export { gerritEventRouterEventsModule } from './service/GerritEventRouterEventsModule'; +export { eventsModuleGerritEventRouter } from './service/eventsModuleGerritEventRouter'; diff --git a/plugins/events-backend-module-gerrit/src/service/GerritEventRouterEventsModule.test.ts b/plugins/events-backend-module-gerrit/src/service/eventsModuleGerritEventRouter.test.ts similarity index 89% rename from plugins/events-backend-module-gerrit/src/service/GerritEventRouterEventsModule.test.ts rename to plugins/events-backend-module-gerrit/src/service/eventsModuleGerritEventRouter.test.ts index 6a8f4f46ff..88ef995966 100644 --- a/plugins/events-backend-module-gerrit/src/service/GerritEventRouterEventsModule.test.ts +++ b/plugins/events-backend-module-gerrit/src/service/eventsModuleGerritEventRouter.test.ts @@ -16,10 +16,10 @@ import { startTestBackend } from '@backstage/backend-test-utils'; import { eventsExtensionPoint } from '@backstage/plugin-events-node/alpha'; -import { gerritEventRouterEventsModule } from './GerritEventRouterEventsModule'; +import { eventsModuleGerritEventRouter } from './eventsModuleGerritEventRouter'; import { GerritEventRouter } from '../router/GerritEventRouter'; -describe('gerritEventRouterEventsModule', () => { +describe('eventsModuleGerritEventRouter', () => { it('should be correctly wired and set up', async () => { let addedPublisher: GerritEventRouter | undefined; let addedSubscriber: GerritEventRouter | undefined; @@ -35,7 +35,7 @@ describe('gerritEventRouterEventsModule', () => { await startTestBackend({ extensionPoints: [[eventsExtensionPoint, extensionPoint]], services: [], - features: [gerritEventRouterEventsModule()], + features: [eventsModuleGerritEventRouter()], }); expect(addedPublisher).not.toBeUndefined(); diff --git a/plugins/events-backend-module-gerrit/src/service/GerritEventRouterEventsModule.ts b/plugins/events-backend-module-gerrit/src/service/eventsModuleGerritEventRouter.ts similarity index 95% rename from plugins/events-backend-module-gerrit/src/service/GerritEventRouterEventsModule.ts rename to plugins/events-backend-module-gerrit/src/service/eventsModuleGerritEventRouter.ts index 31f5c9b384..8d490ea0b2 100644 --- a/plugins/events-backend-module-gerrit/src/service/GerritEventRouterEventsModule.ts +++ b/plugins/events-backend-module-gerrit/src/service/eventsModuleGerritEventRouter.ts @@ -25,7 +25,7 @@ import { GerritEventRouter } from '../router/GerritEventRouter'; * * @alpha */ -export const gerritEventRouterEventsModule = createBackendModule({ +export const eventsModuleGerritEventRouter = createBackendModule({ pluginId: 'events', moduleId: 'gerritEventRouter', register(env) { diff --git a/plugins/events-backend-module-github/CHANGELOG.md b/plugins/events-backend-module-github/CHANGELOG.md index ca28508b5c..b531c5db52 100644 --- a/plugins/events-backend-module-github/CHANGELOG.md +++ b/plugins/events-backend-module-github/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-events-backend-module-github +## 0.1.5-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.4.1-next.2 + - @backstage/plugin-events-node@0.2.4-next.2 + - @backstage/config@1.0.7-next.0 + ## 0.1.5-next.1 ### Patch Changes diff --git a/plugins/events-backend-module-github/alpha-api-report.md b/plugins/events-backend-module-github/alpha-api-report.md index cb95928b17..c233df8634 100644 --- a/plugins/events-backend-module-github/alpha-api-report.md +++ b/plugins/events-backend-module-github/alpha-api-report.md @@ -6,10 +6,10 @@ import { BackendFeature } from '@backstage/backend-plugin-api'; // @alpha -export const githubEventRouterEventsModule: () => BackendFeature; +export const eventsModuleGithubEventRouter: () => BackendFeature; // @alpha -export const githubWebhookEventsModule: () => BackendFeature; +export const eventsModuleGithubWebhook: () => BackendFeature; // (No @packageDocumentation comment for this package) ``` diff --git a/plugins/events-backend-module-github/package.json b/plugins/events-backend-module-github/package.json index e19f5a66e1..4a010f5841 100644 --- a/plugins/events-backend-module-github/package.json +++ b/plugins/events-backend-module-github/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-events-backend-module-github", - "version": "0.1.5-next.1", + "version": "0.1.5-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/events-backend-module-github/src/alpha.ts b/plugins/events-backend-module-github/src/alpha.ts index 8a712cacb1..2db8e9d9aa 100644 --- a/plugins/events-backend-module-github/src/alpha.ts +++ b/plugins/events-backend-module-github/src/alpha.ts @@ -14,5 +14,5 @@ * limitations under the License. */ -export { githubEventRouterEventsModule } from './service/GithubEventRouterEventsModule'; -export { githubWebhookEventsModule } from './service/GithubWebhookEventsModule'; +export { eventsModuleGithubEventRouter } from './service/eventsModuleGithubEventRouter'; +export { eventsModuleGithubWebhook } from './service/eventsModuleGithubWebhook'; diff --git a/plugins/events-backend-module-github/src/service/GithubEventRouterEventsModule.test.ts b/plugins/events-backend-module-github/src/service/eventsModuleGithubEventRouter.test.ts similarity index 89% rename from plugins/events-backend-module-github/src/service/GithubEventRouterEventsModule.test.ts rename to plugins/events-backend-module-github/src/service/eventsModuleGithubEventRouter.test.ts index 0e2ca69366..bfa186c7bc 100644 --- a/plugins/events-backend-module-github/src/service/GithubEventRouterEventsModule.test.ts +++ b/plugins/events-backend-module-github/src/service/eventsModuleGithubEventRouter.test.ts @@ -16,10 +16,10 @@ import { startTestBackend } from '@backstage/backend-test-utils'; import { eventsExtensionPoint } from '@backstage/plugin-events-node/alpha'; -import { githubEventRouterEventsModule } from './GithubEventRouterEventsModule'; +import { eventsModuleGithubEventRouter } from './eventsModuleGithubEventRouter'; import { GithubEventRouter } from '../router/GithubEventRouter'; -describe('githubEventRouterEventsModule', () => { +describe('eventsModuleGithubEventRouter', () => { it('should be correctly wired and set up', async () => { let addedPublisher: GithubEventRouter | undefined; let addedSubscriber: GithubEventRouter | undefined; @@ -35,7 +35,7 @@ describe('githubEventRouterEventsModule', () => { await startTestBackend({ extensionPoints: [[eventsExtensionPoint, extensionPoint]], services: [], - features: [githubEventRouterEventsModule()], + features: [eventsModuleGithubEventRouter()], }); expect(addedPublisher).not.toBeUndefined(); diff --git a/plugins/events-backend-module-github/src/service/GithubEventRouterEventsModule.ts b/plugins/events-backend-module-github/src/service/eventsModuleGithubEventRouter.ts similarity index 95% rename from plugins/events-backend-module-github/src/service/GithubEventRouterEventsModule.ts rename to plugins/events-backend-module-github/src/service/eventsModuleGithubEventRouter.ts index 56cc571763..17485098c2 100644 --- a/plugins/events-backend-module-github/src/service/GithubEventRouterEventsModule.ts +++ b/plugins/events-backend-module-github/src/service/eventsModuleGithubEventRouter.ts @@ -25,7 +25,7 @@ import { GithubEventRouter } from '../router/GithubEventRouter'; * * @alpha */ -export const githubEventRouterEventsModule = createBackendModule({ +export const eventsModuleGithubEventRouter = createBackendModule({ pluginId: 'events', moduleId: 'githubEventRouter', register(env) { diff --git a/plugins/events-backend-module-github/src/service/GithubWebhookEventsModule.test.ts b/plugins/events-backend-module-github/src/service/eventsModuleGithubWebhook.test.ts similarity index 94% rename from plugins/events-backend-module-github/src/service/GithubWebhookEventsModule.test.ts rename to plugins/events-backend-module-github/src/service/eventsModuleGithubWebhook.test.ts index 9e33cac6a0..b8a252aaba 100644 --- a/plugins/events-backend-module-github/src/service/GithubWebhookEventsModule.test.ts +++ b/plugins/events-backend-module-github/src/service/eventsModuleGithubWebhook.test.ts @@ -23,9 +23,9 @@ import { RequestDetails, } from '@backstage/plugin-events-node'; import { sign } from '@octokit/webhooks-methods'; -import { githubWebhookEventsModule } from './GithubWebhookEventsModule'; +import { eventsModuleGithubWebhook } from './eventsModuleGithubWebhook'; -describe('githubWebhookEventsModule', () => { +describe('eventsModuleGithubWebhook', () => { const secret = 'valid-secret'; const payload = { test: 'payload' }; const payloadString = JSON.stringify(payload); @@ -60,7 +60,7 @@ describe('githubWebhookEventsModule', () => { await startTestBackend({ extensionPoints: [[eventsExtensionPoint, extensionPoint]], services: [[coreServices.config, config]], - features: [githubWebhookEventsModule()], + features: [eventsModuleGithubWebhook()], }); expect(addedIngress).not.toBeUndefined(); diff --git a/plugins/events-backend-module-github/src/service/GithubWebhookEventsModule.ts b/plugins/events-backend-module-github/src/service/eventsModuleGithubWebhook.ts similarity index 95% rename from plugins/events-backend-module-github/src/service/GithubWebhookEventsModule.ts rename to plugins/events-backend-module-github/src/service/eventsModuleGithubWebhook.ts index 10cb12e431..7e89ceead7 100644 --- a/plugins/events-backend-module-github/src/service/GithubWebhookEventsModule.ts +++ b/plugins/events-backend-module-github/src/service/eventsModuleGithubWebhook.ts @@ -28,7 +28,7 @@ import { createGithubSignatureValidator } from '../http/createGithubSignatureVal * * @alpha */ -export const githubWebhookEventsModule = createBackendModule({ +export const eventsModuleGithubWebhook = createBackendModule({ pluginId: 'events', moduleId: 'githubWebhook', register(env) { diff --git a/plugins/events-backend-module-gitlab/CHANGELOG.md b/plugins/events-backend-module-gitlab/CHANGELOG.md index ea0787ca23..f992585219 100644 --- a/plugins/events-backend-module-gitlab/CHANGELOG.md +++ b/plugins/events-backend-module-gitlab/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-events-backend-module-gitlab +## 0.1.5-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.4.1-next.2 + - @backstage/plugin-events-node@0.2.4-next.2 + - @backstage/config@1.0.7-next.0 + ## 0.1.5-next.1 ### Patch Changes diff --git a/plugins/events-backend-module-gitlab/alpha-api-report.md b/plugins/events-backend-module-gitlab/alpha-api-report.md index 64727cc844..bf61f66a4b 100644 --- a/plugins/events-backend-module-gitlab/alpha-api-report.md +++ b/plugins/events-backend-module-gitlab/alpha-api-report.md @@ -6,10 +6,10 @@ import { BackendFeature } from '@backstage/backend-plugin-api'; // @alpha -export const gitlabEventRouterEventsModule: () => BackendFeature; +export const eventsModuleGitlabEventRouter: () => BackendFeature; // @alpha -export const gitlabWebhookEventsModule: () => BackendFeature; +export const eventsModuleGitlabWebhook: () => BackendFeature; // (No @packageDocumentation comment for this package) ``` diff --git a/plugins/events-backend-module-gitlab/package.json b/plugins/events-backend-module-gitlab/package.json index 4e9510ad80..917f9fdb89 100644 --- a/plugins/events-backend-module-gitlab/package.json +++ b/plugins/events-backend-module-gitlab/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-events-backend-module-gitlab", - "version": "0.1.5-next.1", + "version": "0.1.5-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/events-backend-module-gitlab/src/alpha.ts b/plugins/events-backend-module-gitlab/src/alpha.ts index 357c9f81ce..65610af96c 100644 --- a/plugins/events-backend-module-gitlab/src/alpha.ts +++ b/plugins/events-backend-module-gitlab/src/alpha.ts @@ -14,5 +14,5 @@ * limitations under the License. */ -export { gitlabEventRouterEventsModule } from './service/GitlabEventRouterEventsModule'; -export { gitlabWebhookEventsModule } from './service/GitlabWebhookEventsModule'; +export { eventsModuleGitlabEventRouter } from './service/eventsModuleGitlabEventRouter'; +export { eventsModuleGitlabWebhook } from './service/eventsModuleGitlabWebhook'; diff --git a/plugins/events-backend-module-gitlab/src/service/GitlabEventRouterEventsModule.test.ts b/plugins/events-backend-module-gitlab/src/service/eventsModuleGitlabEventRouter.test.ts similarity index 89% rename from plugins/events-backend-module-gitlab/src/service/GitlabEventRouterEventsModule.test.ts rename to plugins/events-backend-module-gitlab/src/service/eventsModuleGitlabEventRouter.test.ts index f8b03bc0f3..86a0df6e68 100644 --- a/plugins/events-backend-module-gitlab/src/service/GitlabEventRouterEventsModule.test.ts +++ b/plugins/events-backend-module-gitlab/src/service/eventsModuleGitlabEventRouter.test.ts @@ -16,10 +16,10 @@ import { startTestBackend } from '@backstage/backend-test-utils'; import { eventsExtensionPoint } from '@backstage/plugin-events-node/alpha'; -import { gitlabEventRouterEventsModule } from './GitlabEventRouterEventsModule'; +import { eventsModuleGitlabEventRouter } from './eventsModuleGitlabEventRouter'; import { GitlabEventRouter } from '../router/GitlabEventRouter'; -describe('gitlabEventRouterEventsModule', () => { +describe('eventsModuleGitlabEventRouter', () => { it('should be correctly wired and set up', async () => { let addedPublisher: GitlabEventRouter | undefined; let addedSubscriber: GitlabEventRouter | undefined; @@ -35,7 +35,7 @@ describe('gitlabEventRouterEventsModule', () => { await startTestBackend({ extensionPoints: [[eventsExtensionPoint, extensionPoint]], services: [], - features: [gitlabEventRouterEventsModule()], + features: [eventsModuleGitlabEventRouter()], }); expect(addedPublisher).not.toBeUndefined(); diff --git a/plugins/events-backend-module-gitlab/src/service/GitlabEventRouterEventsModule.ts b/plugins/events-backend-module-gitlab/src/service/eventsModuleGitlabEventRouter.ts similarity index 95% rename from plugins/events-backend-module-gitlab/src/service/GitlabEventRouterEventsModule.ts rename to plugins/events-backend-module-gitlab/src/service/eventsModuleGitlabEventRouter.ts index 39ccd5cd60..3425601529 100644 --- a/plugins/events-backend-module-gitlab/src/service/GitlabEventRouterEventsModule.ts +++ b/plugins/events-backend-module-gitlab/src/service/eventsModuleGitlabEventRouter.ts @@ -25,7 +25,7 @@ import { GitlabEventRouter } from '../router/GitlabEventRouter'; * * @alpha */ -export const gitlabEventRouterEventsModule = createBackendModule({ +export const eventsModuleGitlabEventRouter = createBackendModule({ pluginId: 'events', moduleId: 'gitlabEventRouter', register(env) { diff --git a/plugins/events-backend-module-gitlab/src/service/GitlabWebhookEventsModule.test.ts b/plugins/events-backend-module-gitlab/src/service/eventsModuleGitlabWebhook.test.ts similarity index 95% rename from plugins/events-backend-module-gitlab/src/service/GitlabWebhookEventsModule.test.ts rename to plugins/events-backend-module-gitlab/src/service/eventsModuleGitlabWebhook.test.ts index b42f2c474e..c38233ecfd 100644 --- a/plugins/events-backend-module-gitlab/src/service/GitlabWebhookEventsModule.test.ts +++ b/plugins/events-backend-module-gitlab/src/service/eventsModuleGitlabWebhook.test.ts @@ -22,7 +22,7 @@ import { HttpPostIngressOptions, RequestDetails, } from '@backstage/plugin-events-node'; -import { gitlabWebhookEventsModule } from './GitlabWebhookEventsModule'; +import { eventsModuleGitlabWebhook } from './eventsModuleGitlabWebhook'; describe('gitlabWebhookEventsModule', () => { const requestWithToken = (token?: string) => { @@ -55,7 +55,7 @@ describe('gitlabWebhookEventsModule', () => { await startTestBackend({ extensionPoints: [[eventsExtensionPoint, extensionPoint]], services: [[coreServices.config, config]], - features: [gitlabWebhookEventsModule()], + features: [eventsModuleGitlabWebhook()], }); expect(addedIngress).not.toBeUndefined(); diff --git a/plugins/events-backend-module-gitlab/src/service/GitlabWebhookEventsModule.ts b/plugins/events-backend-module-gitlab/src/service/eventsModuleGitlabWebhook.ts similarity index 95% rename from plugins/events-backend-module-gitlab/src/service/GitlabWebhookEventsModule.ts rename to plugins/events-backend-module-gitlab/src/service/eventsModuleGitlabWebhook.ts index c20e55caa9..0933ef342a 100644 --- a/plugins/events-backend-module-gitlab/src/service/GitlabWebhookEventsModule.ts +++ b/plugins/events-backend-module-gitlab/src/service/eventsModuleGitlabWebhook.ts @@ -30,7 +30,7 @@ import { createGitlabTokenValidator } from '../http/createGitlabTokenValidator'; * * @alpha */ -export const gitlabWebhookEventsModule = createBackendModule({ +export const eventsModuleGitlabWebhook = createBackendModule({ pluginId: 'events', moduleId: 'gitlabWebhook', register(env) { diff --git a/plugins/events-backend-test-utils/CHANGELOG.md b/plugins/events-backend-test-utils/CHANGELOG.md index 73b92152bd..aaf14aa68b 100644 --- a/plugins/events-backend-test-utils/CHANGELOG.md +++ b/plugins/events-backend-test-utils/CHANGELOG.md @@ -1,5 +1,12 @@ # @backstage/plugin-events-backend-test-utils +## 0.1.5-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-events-node@0.2.4-next.2 + ## 0.1.5-next.1 ### Patch Changes diff --git a/plugins/events-backend-test-utils/package.json b/plugins/events-backend-test-utils/package.json index 115645436b..67d6671497 100644 --- a/plugins/events-backend-test-utils/package.json +++ b/plugins/events-backend-test-utils/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-events-backend-test-utils", "description": "The plugin-events-backend-test-utils for @backstage/plugin-events-node", - "version": "0.1.5-next.1", + "version": "0.1.5-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/events-backend/CHANGELOG.md b/plugins/events-backend/CHANGELOG.md index 9d78dc77c1..82fb0c6fc1 100644 --- a/plugins/events-backend/CHANGELOG.md +++ b/plugins/events-backend/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-events-backend +## 0.2.4-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.3-next.2 + - @backstage/backend-plugin-api@0.4.1-next.2 + - @backstage/plugin-events-node@0.2.4-next.2 + - @backstage/config@1.0.7-next.0 + ## 0.2.4-next.1 ### Patch Changes diff --git a/plugins/events-backend/README.md b/plugins/events-backend/README.md index cef8ac7330..cf89f389b2 100644 --- a/plugins/events-backend/README.md +++ b/plugins/events-backend/README.md @@ -186,9 +186,9 @@ import { eventsExtensionPoint } from '@backstage/plugin-events-node'; // [...] -export const yourModuleEventsModule = createBackendModule({ +export const eventsModuleYourFeature = createBackendModule({ pluginId: 'events', - moduleId: 'yourModule', + moduleId: 'yourFeature', register(env) { // [...] env.registerInit({ diff --git a/plugins/events-backend/package.json b/plugins/events-backend/package.json index 6e4b1684e5..4a51e56b6a 100644 --- a/plugins/events-backend/package.json +++ b/plugins/events-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-events-backend", - "version": "0.2.4-next.1", + "version": "0.2.4-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/events-node/CHANGELOG.md b/plugins/events-node/CHANGELOG.md index 0e1853b101..a19d9badc2 100644 --- a/plugins/events-node/CHANGELOG.md +++ b/plugins/events-node/CHANGELOG.md @@ -1,5 +1,12 @@ # @backstage/plugin-events-node +## 0.2.4-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.4.1-next.2 + ## 0.2.4-next.1 ### Patch Changes diff --git a/plugins/events-node/package.json b/plugins/events-node/package.json index bd473abaa7..76eb1b2bf3 100644 --- a/plugins/events-node/package.json +++ b/plugins/events-node/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-events-node", "description": "The plugin-events-node module for @backstage/plugin-events-backend", - "version": "0.2.4-next.1", + "version": "0.2.4-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/example-todo-list-backend/CHANGELOG.md b/plugins/example-todo-list-backend/CHANGELOG.md index 628d6e419d..edde9b9d54 100644 --- a/plugins/example-todo-list-backend/CHANGELOG.md +++ b/plugins/example-todo-list-backend/CHANGELOG.md @@ -1,5 +1,15 @@ # @internal/plugin-todo-list-backend +## 1.0.11-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.2.12-next.2 + - @backstage/backend-common@0.18.3-next.2 + - @backstage/backend-plugin-api@0.4.1-next.2 + - @backstage/config@1.0.7-next.0 + ## 1.0.11-next.1 ### Patch Changes diff --git a/plugins/example-todo-list-backend/package.json b/plugins/example-todo-list-backend/package.json index 562bbc0c7f..5579f748b2 100644 --- a/plugins/example-todo-list-backend/package.json +++ b/plugins/example-todo-list-backend/package.json @@ -1,6 +1,6 @@ { "name": "@internal/plugin-todo-list-backend", - "version": "1.0.11-next.1", + "version": "1.0.11-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/example-todo-list/CHANGELOG.md b/plugins/example-todo-list/CHANGELOG.md index 281928f88a..4739ab303e 100644 --- a/plugins/example-todo-list/CHANGELOG.md +++ b/plugins/example-todo-list/CHANGELOG.md @@ -1,5 +1,13 @@ # @internal/plugin-todo-list +## 1.0.11-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.5-next.2 + - @backstage/core-plugin-api@1.5.0-next.2 + ## 1.0.11-next.1 ### Patch Changes diff --git a/plugins/example-todo-list/package.json b/plugins/example-todo-list/package.json index b572bfc215..a7366ce36f 100644 --- a/plugins/example-todo-list/package.json +++ b/plugins/example-todo-list/package.json @@ -1,6 +1,6 @@ { "name": "@internal/plugin-todo-list", - "version": "1.0.11-next.1", + "version": "1.0.11-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/explore-backend/CHANGELOG.md b/plugins/explore-backend/CHANGELOG.md index bb9023f693..7874062954 100644 --- a/plugins/explore-backend/CHANGELOG.md +++ b/plugins/explore-backend/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-explore-backend +## 0.0.5-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.3-next.2 + - @backstage/config@1.0.7-next.0 + ## 0.0.5-next.1 ### Patch Changes diff --git a/plugins/explore-backend/package.json b/plugins/explore-backend/package.json index f16954ad47..dbdab19329 100644 --- a/plugins/explore-backend/package.json +++ b/plugins/explore-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-explore-backend", - "version": "0.0.5-next.1", + "version": "0.0.5-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/explore-react/CHANGELOG.md b/plugins/explore-react/CHANGELOG.md index 135369b215..1f68752e6e 100644 --- a/plugins/explore-react/CHANGELOG.md +++ b/plugins/explore-react/CHANGELOG.md @@ -1,5 +1,12 @@ # @backstage/plugin-explore-react +## 0.0.27-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.5.0-next.2 + ## 0.0.27-next.1 ### Patch Changes diff --git a/plugins/explore-react/package.json b/plugins/explore-react/package.json index 26d5b8465c..6bb7ad5f0a 100644 --- a/plugins/explore-react/package.json +++ b/plugins/explore-react/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-explore-react", "description": "A frontend library for Backstage plugins that want to interact with the explore plugin", - "version": "0.0.27-next.1", + "version": "0.0.27-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/explore/CHANGELOG.md b/plugins/explore/CHANGELOG.md index 8942e1f286..72d93cf927 100644 --- a/plugins/explore/CHANGELOG.md +++ b/plugins/explore/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-explore +## 0.4.1-next.2 + +### Patch Changes + +- 65454876fb2: Minor API report tweaks +- Updated dependencies + - @backstage/core-components@0.12.5-next.2 + - @backstage/plugin-catalog-react@1.4.0-next.2 + - @backstage/plugin-search-react@1.5.1-next.2 + - @backstage/core-plugin-api@1.5.0-next.2 + - @backstage/plugin-explore-react@0.0.27-next.2 + ## 0.4.1-next.1 ### Patch Changes diff --git a/plugins/explore/package.json b/plugins/explore/package.json index 15d642af77..c91671c816 100644 --- a/plugins/explore/package.json +++ b/plugins/explore/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-explore", "description": "A Backstage plugin for building an exploration page of your software ecosystem", - "version": "0.4.1-next.1", + "version": "0.4.1-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/firehydrant/CHANGELOG.md b/plugins/firehydrant/CHANGELOG.md index 81e7c9b7c7..1fbf09d8d4 100644 --- a/plugins/firehydrant/CHANGELOG.md +++ b/plugins/firehydrant/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-firehydrant +## 0.1.33-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.5-next.2 + - @backstage/plugin-catalog-react@1.4.0-next.2 + - @backstage/core-plugin-api@1.5.0-next.2 + ## 0.1.33-next.1 ### Patch Changes diff --git a/plugins/firehydrant/package.json b/plugins/firehydrant/package.json index 3f4b86a192..293679c2ea 100644 --- a/plugins/firehydrant/package.json +++ b/plugins/firehydrant/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-firehydrant", "description": "A Backstage plugin that integrates towards FireHydrant", - "version": "0.1.33-next.1", + "version": "0.1.33-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/fossa/CHANGELOG.md b/plugins/fossa/CHANGELOG.md index ec2b669edb..af439b6fd0 100644 --- a/plugins/fossa/CHANGELOG.md +++ b/plugins/fossa/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-fossa +## 0.2.48-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.5-next.2 + - @backstage/plugin-catalog-react@1.4.0-next.2 + - @backstage/core-plugin-api@1.5.0-next.2 + ## 0.2.48-next.1 ### Patch Changes diff --git a/plugins/fossa/package.json b/plugins/fossa/package.json index ff2d936880..1135c76bb1 100644 --- a/plugins/fossa/package.json +++ b/plugins/fossa/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-fossa", "description": "A Backstage plugin that integrates towards FOSSA", - "version": "0.2.48-next.1", + "version": "0.2.48-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/gcalendar/CHANGELOG.md b/plugins/gcalendar/CHANGELOG.md index 0f3c21ee25..2460deb73c 100644 --- a/plugins/gcalendar/CHANGELOG.md +++ b/plugins/gcalendar/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-gcalendar +## 0.3.12-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.5-next.2 + - @backstage/core-plugin-api@1.5.0-next.2 + ## 0.3.12-next.1 ### Patch Changes diff --git a/plugins/gcalendar/package.json b/plugins/gcalendar/package.json index fc0c8961f5..83471340b8 100644 --- a/plugins/gcalendar/package.json +++ b/plugins/gcalendar/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-gcalendar", - "version": "0.3.12-next.1", + "version": "0.3.12-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/gcp-projects/CHANGELOG.md b/plugins/gcp-projects/CHANGELOG.md index 3857a37d0f..ecb3ec60fc 100644 --- a/plugins/gcp-projects/CHANGELOG.md +++ b/plugins/gcp-projects/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-gcp-projects +## 0.3.35-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.5-next.2 + - @backstage/core-plugin-api@1.5.0-next.2 + ## 0.3.35-next.1 ### Patch Changes diff --git a/plugins/gcp-projects/package.json b/plugins/gcp-projects/package.json index e62870eb11..1029b37cd0 100644 --- a/plugins/gcp-projects/package.json +++ b/plugins/gcp-projects/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-gcp-projects", "description": "A Backstage plugin that helps you manage projects in GCP", - "version": "0.3.35-next.1", + "version": "0.3.35-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/git-release-manager/CHANGELOG.md b/plugins/git-release-manager/CHANGELOG.md index 52b1bfe29e..c97568b076 100644 --- a/plugins/git-release-manager/CHANGELOG.md +++ b/plugins/git-release-manager/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-git-release-manager +## 0.3.29-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.5-next.2 + - @backstage/core-plugin-api@1.5.0-next.2 + - @backstage/integration@1.4.3-next.0 + ## 0.3.29-next.1 ### Patch Changes diff --git a/plugins/git-release-manager/package.json b/plugins/git-release-manager/package.json index ce2577c7b9..0c9507bc24 100644 --- a/plugins/git-release-manager/package.json +++ b/plugins/git-release-manager/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-git-release-manager", "description": "A Backstage plugin that helps you manage releases in git", - "version": "0.3.29-next.1", + "version": "0.3.29-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/github-actions/CHANGELOG.md b/plugins/github-actions/CHANGELOG.md index 112d5ff49f..ffec353673 100644 --- a/plugins/github-actions/CHANGELOG.md +++ b/plugins/github-actions/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-github-actions +## 0.5.16-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.5-next.2 + - @backstage/plugin-catalog-react@1.4.0-next.2 + - @backstage/core-plugin-api@1.5.0-next.2 + - @backstage/integration@1.4.3-next.0 + ## 0.5.16-next.1 ### Patch Changes diff --git a/plugins/github-actions/package.json b/plugins/github-actions/package.json index 6d8103b349..d26249218e 100644 --- a/plugins/github-actions/package.json +++ b/plugins/github-actions/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-github-actions", "description": "A Backstage plugin that integrates towards GitHub Actions", - "version": "0.5.16-next.1", + "version": "0.5.16-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/github-deployments/CHANGELOG.md b/plugins/github-deployments/CHANGELOG.md index 3aa2e656bc..cc8c6a838e 100644 --- a/plugins/github-deployments/CHANGELOG.md +++ b/plugins/github-deployments/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-github-deployments +## 0.1.47-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.5-next.2 + - @backstage/plugin-catalog-react@1.4.0-next.2 + - @backstage/core-plugin-api@1.5.0-next.2 + - @backstage/integration-react@1.1.11-next.2 + - @backstage/integration@1.4.3-next.0 + ## 0.1.47-next.1 ### Patch Changes diff --git a/plugins/github-deployments/package.json b/plugins/github-deployments/package.json index 2c93cf3bc4..f9019b5029 100644 --- a/plugins/github-deployments/package.json +++ b/plugins/github-deployments/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-github-deployments", "description": "A Backstage plugin that integrates towards GitHub Deployments", - "version": "0.1.47-next.1", + "version": "0.1.47-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/github-issues/CHANGELOG.md b/plugins/github-issues/CHANGELOG.md index 6a4910e4af..5a440a28f3 100644 --- a/plugins/github-issues/CHANGELOG.md +++ b/plugins/github-issues/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-github-issues +## 0.2.5-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.5-next.2 + - @backstage/plugin-catalog-react@1.4.0-next.2 + - @backstage/core-plugin-api@1.5.0-next.2 + - @backstage/integration@1.4.3-next.0 + ## 0.2.5-next.1 ### Patch Changes diff --git a/plugins/github-issues/package.json b/plugins/github-issues/package.json index 6192130475..83e457a606 100644 --- a/plugins/github-issues/package.json +++ b/plugins/github-issues/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-github-issues", - "version": "0.2.5-next.1", + "version": "0.2.5-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/github-pull-requests-board/CHANGELOG.md b/plugins/github-pull-requests-board/CHANGELOG.md index 38abb67517..ae15428eed 100644 --- a/plugins/github-pull-requests-board/CHANGELOG.md +++ b/plugins/github-pull-requests-board/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-github-pull-requests-board +## 0.1.10-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.5-next.2 + - @backstage/plugin-catalog-react@1.4.0-next.2 + - @backstage/core-plugin-api@1.5.0-next.2 + - @backstage/integration@1.4.3-next.0 + ## 0.1.10-next.1 ### Patch Changes diff --git a/plugins/github-pull-requests-board/package.json b/plugins/github-pull-requests-board/package.json index 5872f0608d..ff5393988b 100644 --- a/plugins/github-pull-requests-board/package.json +++ b/plugins/github-pull-requests-board/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-github-pull-requests-board", "description": "A Backstage plugin that allows you to see all open Pull Requests for all the repositories owned by your team", - "version": "0.1.10-next.1", + "version": "0.1.10-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/gitops-profiles/CHANGELOG.md b/plugins/gitops-profiles/CHANGELOG.md index a276f24d9e..8522e1e16c 100644 --- a/plugins/gitops-profiles/CHANGELOG.md +++ b/plugins/gitops-profiles/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-gitops-profiles +## 0.3.34-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.5-next.2 + - @backstage/core-plugin-api@1.5.0-next.2 + ## 0.3.34-next.1 ### Patch Changes diff --git a/plugins/gitops-profiles/package.json b/plugins/gitops-profiles/package.json index c12c487f24..291b73b308 100644 --- a/plugins/gitops-profiles/package.json +++ b/plugins/gitops-profiles/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-gitops-profiles", "description": "A Backstage plugin that helps you manage GitOps profiles", - "version": "0.3.34-next.1", + "version": "0.3.34-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/gocd/CHANGELOG.md b/plugins/gocd/CHANGELOG.md index 68cdfced64..71d7aa3af0 100644 --- a/plugins/gocd/CHANGELOG.md +++ b/plugins/gocd/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-gocd +## 0.1.22-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.5-next.2 + - @backstage/plugin-catalog-react@1.4.0-next.2 + - @backstage/core-plugin-api@1.5.0-next.2 + ## 0.1.22-next.1 ### Patch Changes diff --git a/plugins/gocd/package.json b/plugins/gocd/package.json index 9f1f299d29..f9789ffde4 100644 --- a/plugins/gocd/package.json +++ b/plugins/gocd/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-gocd", "description": "A Backstage plugin that integrates towards GoCD", - "version": "0.1.22-next.1", + "version": "0.1.22-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/graphiql/CHANGELOG.md b/plugins/graphiql/CHANGELOG.md index 85e7cf021d..f110d7b813 100644 --- a/plugins/graphiql/CHANGELOG.md +++ b/plugins/graphiql/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-graphiql +## 0.2.48-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.5-next.2 + - @backstage/core-plugin-api@1.5.0-next.2 + ## 0.2.48-next.1 ### Patch Changes diff --git a/plugins/graphiql/package.json b/plugins/graphiql/package.json index 27a1ad7e07..a608ecb8db 100644 --- a/plugins/graphiql/package.json +++ b/plugins/graphiql/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-graphiql", "description": "Backstage plugin for browsing GraphQL APIs", - "version": "0.2.48-next.1", + "version": "0.2.48-next.2", "publishConfig": { "access": "public", "main": "dist/index.esm.js", diff --git a/plugins/graphql-backend/CHANGELOG.md b/plugins/graphql-backend/CHANGELOG.md index 79405f2635..0ab0918031 100644 --- a/plugins/graphql-backend/CHANGELOG.md +++ b/plugins/graphql-backend/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-graphql-backend +## 0.1.33-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.3-next.2 + - @backstage/config@1.0.7-next.0 + - @backstage/plugin-catalog-graphql@0.3.19-next.1 + ## 0.1.33-next.1 ### Patch Changes diff --git a/plugins/graphql-backend/package.json b/plugins/graphql-backend/package.json index 5293a2dbcb..401119b052 100644 --- a/plugins/graphql-backend/package.json +++ b/plugins/graphql-backend/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-graphql-backend", "description": "An experimental Backstage backend plugin for GraphQL", - "version": "0.1.33-next.1", + "version": "0.1.33-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/graphql-voyager/CHANGELOG.md b/plugins/graphql-voyager/CHANGELOG.md index 556bff7f8a..982dfec9dc 100644 --- a/plugins/graphql-voyager/CHANGELOG.md +++ b/plugins/graphql-voyager/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-graphql-voyager +## 0.1.1-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.5-next.2 + - @backstage/core-plugin-api@1.5.0-next.2 + ## 0.1.1-next.1 ### Patch Changes diff --git a/plugins/graphql-voyager/package.json b/plugins/graphql-voyager/package.json index cfaf9bb449..5d2b809bb3 100644 --- a/plugins/graphql-voyager/package.json +++ b/plugins/graphql-voyager/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-graphql-voyager", "description": "Backstage plugin for GraphQL Voyager", - "version": "0.1.1-next.1", + "version": "0.1.1-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/home/CHANGELOG.md b/plugins/home/CHANGELOG.md index cbab27bfd6..51552a0135 100644 --- a/plugins/home/CHANGELOG.md +++ b/plugins/home/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-home +## 0.4.32-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.5-next.2 + - @backstage/plugin-catalog-react@1.4.0-next.2 + - @backstage/core-plugin-api@1.5.0-next.2 + - @backstage/config@1.0.7-next.0 + ## 0.4.32-next.1 ### Patch Changes diff --git a/plugins/home/package.json b/plugins/home/package.json index 1c1d7da24d..2957625478 100644 --- a/plugins/home/package.json +++ b/plugins/home/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-home", "description": "A Backstage plugin that helps you build a home page", - "version": "0.4.32-next.1", + "version": "0.4.32-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/ilert/CHANGELOG.md b/plugins/ilert/CHANGELOG.md index 9b672bb3ab..e3d63efd71 100644 --- a/plugins/ilert/CHANGELOG.md +++ b/plugins/ilert/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-ilert +## 0.2.5-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.5-next.2 + - @backstage/plugin-catalog-react@1.4.0-next.2 + - @backstage/core-plugin-api@1.5.0-next.2 + ## 0.2.5-next.1 ### Patch Changes diff --git a/plugins/ilert/package.json b/plugins/ilert/package.json index ccfc5dbc3a..cc8183d6cb 100644 --- a/plugins/ilert/package.json +++ b/plugins/ilert/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-ilert", "description": "A Backstage plugin that integrates towards iLert", - "version": "0.2.5-next.1", + "version": "0.2.5-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/jenkins-backend/CHANGELOG.md b/plugins/jenkins-backend/CHANGELOG.md index 787e930973..f18f75d0a4 100644 --- a/plugins/jenkins-backend/CHANGELOG.md +++ b/plugins/jenkins-backend/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-jenkins-backend +## 0.1.33-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.2.12-next.2 + - @backstage/backend-common@0.18.3-next.2 + - @backstage/config@1.0.7-next.0 + ## 0.1.33-next.1 ### Patch Changes diff --git a/plugins/jenkins-backend/package.json b/plugins/jenkins-backend/package.json index 6228f6e83e..daf5073792 100644 --- a/plugins/jenkins-backend/package.json +++ b/plugins/jenkins-backend/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-jenkins-backend", "description": "A Backstage backend plugin that integrates towards Jenkins", - "version": "0.1.33-next.1", + "version": "0.1.33-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/jenkins/CHANGELOG.md b/plugins/jenkins/CHANGELOG.md index 098d3154c4..fe8f1e2d13 100644 --- a/plugins/jenkins/CHANGELOG.md +++ b/plugins/jenkins/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-jenkins +## 0.7.15-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.5-next.2 + - @backstage/plugin-catalog-react@1.4.0-next.2 + - @backstage/core-plugin-api@1.5.0-next.2 + ## 0.7.15-next.1 ### Patch Changes diff --git a/plugins/jenkins/package.json b/plugins/jenkins/package.json index 59c3d92f6c..204d88db60 100644 --- a/plugins/jenkins/package.json +++ b/plugins/jenkins/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-jenkins", "description": "A Backstage plugin that integrates towards Jenkins", - "version": "0.7.15-next.1", + "version": "0.7.15-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/kafka-backend/CHANGELOG.md b/plugins/kafka-backend/CHANGELOG.md index 02c498e3fe..92bcf3de3f 100644 --- a/plugins/kafka-backend/CHANGELOG.md +++ b/plugins/kafka-backend/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-kafka-backend +## 0.2.36-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.3-next.2 + - @backstage/backend-plugin-api@0.4.1-next.2 + - @backstage/config@1.0.7-next.0 + ## 0.2.36-next.1 ### Patch Changes diff --git a/plugins/kafka-backend/package.json b/plugins/kafka-backend/package.json index 61e32c8177..38b1f60fcb 100644 --- a/plugins/kafka-backend/package.json +++ b/plugins/kafka-backend/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-kafka-backend", "description": "A Backstage backend plugin that integrates towards Kafka", - "version": "0.2.36-next.1", + "version": "0.2.36-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/kafka/CHANGELOG.md b/plugins/kafka/CHANGELOG.md index d55d1f74ec..1706f206e7 100644 --- a/plugins/kafka/CHANGELOG.md +++ b/plugins/kafka/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-kafka +## 0.3.16-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.5-next.2 + - @backstage/plugin-catalog-react@1.4.0-next.2 + - @backstage/core-plugin-api@1.5.0-next.2 + - @backstage/config@1.0.7-next.0 + ## 0.3.16-next.1 ### Patch Changes diff --git a/plugins/kafka/package.json b/plugins/kafka/package.json index 04cb3c0da0..017c14881a 100644 --- a/plugins/kafka/package.json +++ b/plugins/kafka/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-kafka", "description": "A Backstage plugin that integrates towards Kafka", - "version": "0.3.16-next.1", + "version": "0.3.16-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/kubernetes-backend/CHANGELOG.md b/plugins/kubernetes-backend/CHANGELOG.md index a502089e13..ac1287f8aa 100644 --- a/plugins/kubernetes-backend/CHANGELOG.md +++ b/plugins/kubernetes-backend/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-kubernetes-backend +## 0.9.4-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.2.12-next.2 + - @backstage/backend-common@0.18.3-next.2 + - @backstage/config@1.0.7-next.0 + ## 0.9.4-next.1 ### Patch Changes diff --git a/plugins/kubernetes-backend/package.json b/plugins/kubernetes-backend/package.json index 3e45bed285..ee7844c76e 100644 --- a/plugins/kubernetes-backend/package.json +++ b/plugins/kubernetes-backend/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-kubernetes-backend", "description": "A Backstage backend plugin that integrates towards Kubernetes", - "version": "0.9.4-next.1", + "version": "0.9.4-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/kubernetes/CHANGELOG.md b/plugins/kubernetes/CHANGELOG.md index ea6a7f0732..05929a7d46 100644 --- a/plugins/kubernetes/CHANGELOG.md +++ b/plugins/kubernetes/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-kubernetes +## 0.7.9-next.2 + +### Patch Changes + +- 8adeb19b37d: GitLab can now be used as an `oidcTokenProvider` for Kubernetes clusters +- Updated dependencies + - @backstage/core-components@0.12.5-next.2 + - @backstage/plugin-catalog-react@1.4.0-next.2 + - @backstage/core-plugin-api@1.5.0-next.2 + - @backstage/config@1.0.7-next.0 + ## 0.7.9-next.1 ### Patch Changes diff --git a/plugins/kubernetes/package.json b/plugins/kubernetes/package.json index 39d4cfdec6..ed806ee521 100644 --- a/plugins/kubernetes/package.json +++ b/plugins/kubernetes/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-kubernetes", "description": "A Backstage plugin that integrates towards Kubernetes", - "version": "0.7.9-next.1", + "version": "0.7.9-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/kubernetes/src/plugin.ts b/plugins/kubernetes/src/plugin.ts index 124bff831b..e2b13f43fe 100644 --- a/plugins/kubernetes/src/plugin.ts +++ b/plugins/kubernetes/src/plugin.ts @@ -23,6 +23,7 @@ import { createRouteRef, discoveryApiRef, identityApiRef, + gitlabAuthApiRef, googleAuthApiRef, microsoftAuthApiRef, oktaAuthApiRef, @@ -49,18 +50,21 @@ export const kubernetesPlugin = createPlugin({ createApiFactory({ api: kubernetesAuthProvidersApiRef, deps: { + gitlabAuthApi: gitlabAuthApiRef, googleAuthApi: googleAuthApiRef, microsoftAuthApi: microsoftAuthApiRef, oktaAuthApi: oktaAuthApiRef, oneloginAuthApi: oneloginAuthApiRef, }, factory: ({ + gitlabAuthApi, googleAuthApi, microsoftAuthApi, oktaAuthApi, oneloginAuthApi, }) => { const oidcProviders = { + gitlab: gitlabAuthApi, google: googleAuthApi, microsoft: microsoftAuthApi, okta: oktaAuthApi, diff --git a/plugins/lighthouse-backend/CHANGELOG.md b/plugins/lighthouse-backend/CHANGELOG.md index 9eac651564..0caf949bd6 100644 --- a/plugins/lighthouse-backend/CHANGELOG.md +++ b/plugins/lighthouse-backend/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-lighthouse-backend +## 0.1.1-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-tasks@0.5.0-next.2 + - @backstage/backend-common@0.18.3-next.2 + - @backstage/config@1.0.7-next.0 + ## 0.1.1-next.1 ### Patch Changes diff --git a/plugins/lighthouse-backend/package.json b/plugins/lighthouse-backend/package.json index cb70cc6746..7fa51b3446 100644 --- a/plugins/lighthouse-backend/package.json +++ b/plugins/lighthouse-backend/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-lighthouse-backend", "description": "Backend functionalities for lighthouse", - "version": "0.1.1-next.1", + "version": "0.1.1-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/lighthouse/CHANGELOG.md b/plugins/lighthouse/CHANGELOG.md index 219a59b025..f326707dfa 100644 --- a/plugins/lighthouse/CHANGELOG.md +++ b/plugins/lighthouse/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-lighthouse +## 0.4.1-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.5-next.2 + - @backstage/plugin-catalog-react@1.4.0-next.2 + - @backstage/core-plugin-api@1.5.0-next.2 + - @backstage/config@1.0.7-next.0 + ## 0.4.1-next.1 ### Patch Changes diff --git a/plugins/lighthouse/package.json b/plugins/lighthouse/package.json index 6928c32e6a..3fcb24986d 100644 --- a/plugins/lighthouse/package.json +++ b/plugins/lighthouse/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-lighthouse", "description": "A Backstage plugin that integrates towards Lighthouse", - "version": "0.4.1-next.1", + "version": "0.4.1-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/linguist-backend/CHANGELOG.md b/plugins/linguist-backend/CHANGELOG.md index c7ea736e5a..ac922c735b 100644 --- a/plugins/linguist-backend/CHANGELOG.md +++ b/plugins/linguist-backend/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-linguist-backend +## 0.2.0-next.2 + +### Patch Changes + +- 8a298b47240: Added support for linguist-js options using the linguistJSOptions in the plugin, the available config can be found [here](https://www.npmjs.com/package/linguist-js#API). +- Updated dependencies + - @backstage/plugin-auth-node@0.2.12-next.2 + - @backstage/backend-tasks@0.5.0-next.2 + - @backstage/backend-common@0.18.3-next.2 + - @backstage/config@1.0.7-next.0 + ## 0.2.0-next.1 ### Patch Changes diff --git a/plugins/linguist-backend/package.json b/plugins/linguist-backend/package.json index 15d4496bc8..01c4f12afa 100644 --- a/plugins/linguist-backend/package.json +++ b/plugins/linguist-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-linguist-backend", - "version": "0.2.0-next.1", + "version": "0.2.0-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/linguist/CHANGELOG.md b/plugins/linguist/CHANGELOG.md index 471fbf4042..3d83855122 100644 --- a/plugins/linguist/CHANGELOG.md +++ b/plugins/linguist/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-linguist +## 0.1.1-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.5-next.2 + - @backstage/plugin-catalog-react@1.4.0-next.2 + - @backstage/core-plugin-api@1.5.0-next.2 + ## 0.1.1-next.1 ### Patch Changes diff --git a/plugins/linguist/package.json b/plugins/linguist/package.json index a26813a1b4..276bb81574 100644 --- a/plugins/linguist/package.json +++ b/plugins/linguist/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-linguist", - "version": "0.1.1-next.1", + "version": "0.1.1-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/microsoft-calendar/CHANGELOG.md b/plugins/microsoft-calendar/CHANGELOG.md index 6347b1bcf7..69a93bc320 100644 --- a/plugins/microsoft-calendar/CHANGELOG.md +++ b/plugins/microsoft-calendar/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-microsoft-calendar +## 0.1.1-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.5-next.2 + - @backstage/core-plugin-api@1.5.0-next.2 + ## 0.1.1-next.1 ### Patch Changes diff --git a/plugins/microsoft-calendar/package.json b/plugins/microsoft-calendar/package.json index 04f466598e..8d20a5de70 100644 --- a/plugins/microsoft-calendar/package.json +++ b/plugins/microsoft-calendar/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-microsoft-calendar", - "version": "0.1.1-next.1", + "version": "0.1.1-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/newrelic-dashboard/CHANGELOG.md b/plugins/newrelic-dashboard/CHANGELOG.md index 0cf1afb2f6..93b27ba385 100644 --- a/plugins/newrelic-dashboard/CHANGELOG.md +++ b/plugins/newrelic-dashboard/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-newrelic-dashboard +## 0.2.9-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.5-next.2 + - @backstage/plugin-catalog-react@1.4.0-next.2 + - @backstage/core-plugin-api@1.5.0-next.2 + ## 0.2.9-next.1 ### Patch Changes diff --git a/plugins/newrelic-dashboard/package.json b/plugins/newrelic-dashboard/package.json index 93b3af02d0..9958741b5f 100644 --- a/plugins/newrelic-dashboard/package.json +++ b/plugins/newrelic-dashboard/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-newrelic-dashboard", - "version": "0.2.9-next.1", + "version": "0.2.9-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/newrelic/CHANGELOG.md b/plugins/newrelic/CHANGELOG.md index 4c319caeed..bd0ef0d06f 100644 --- a/plugins/newrelic/CHANGELOG.md +++ b/plugins/newrelic/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-newrelic +## 0.3.34-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.5-next.2 + - @backstage/core-plugin-api@1.5.0-next.2 + ## 0.3.34-next.1 ### Patch Changes diff --git a/plugins/newrelic/package.json b/plugins/newrelic/package.json index bacfc2e2f1..3ad74b3949 100644 --- a/plugins/newrelic/package.json +++ b/plugins/newrelic/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-newrelic", "description": "A Backstage plugin that integrates towards New Relic", - "version": "0.3.34-next.1", + "version": "0.3.34-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/octopus-deploy/CHANGELOG.md b/plugins/octopus-deploy/CHANGELOG.md index a9020f76c3..a3743722b8 100644 --- a/plugins/octopus-deploy/CHANGELOG.md +++ b/plugins/octopus-deploy/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-octopus-deploy +## 0.1.0-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.5-next.2 + - @backstage/plugin-catalog-react@1.4.0-next.2 + - @backstage/core-plugin-api@1.5.0-next.2 + ## 0.1.0-next.1 ### Patch Changes diff --git a/plugins/octopus-deploy/package.json b/plugins/octopus-deploy/package.json index c5cdf1fed4..9ba86f1587 100644 --- a/plugins/octopus-deploy/package.json +++ b/plugins/octopus-deploy/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-octopus-deploy", - "version": "0.1.0-next.1", + "version": "0.1.0-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/org-react/CHANGELOG.md b/plugins/org-react/CHANGELOG.md index c67228c438..cb59276110 100644 --- a/plugins/org-react/CHANGELOG.md +++ b/plugins/org-react/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-org-react +## 0.1.5-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.5-next.2 + - @backstage/plugin-catalog-react@1.4.0-next.2 + - @backstage/core-plugin-api@1.5.0-next.2 + ## 0.1.5-next.1 ### Patch Changes diff --git a/plugins/org-react/package.json b/plugins/org-react/package.json index 853ba7058d..a2e6623523 100644 --- a/plugins/org-react/package.json +++ b/plugins/org-react/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-org-react", - "version": "0.1.5-next.1", + "version": "0.1.5-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/org/CHANGELOG.md b/plugins/org/CHANGELOG.md index 15cb675035..4728f8be20 100644 --- a/plugins/org/CHANGELOG.md +++ b/plugins/org/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-org +## 0.6.6-next.2 + +### Patch Changes + +- a06fcac4040: Add styling to the `MembersListCard` and `ComponentsGrid` to handle overflow text. +- Updated dependencies + - @backstage/core-components@0.12.5-next.2 + - @backstage/plugin-catalog-react@1.4.0-next.2 + - @backstage/core-plugin-api@1.5.0-next.2 + ## 0.6.6-next.1 ### Patch Changes diff --git a/plugins/org/package.json b/plugins/org/package.json index 08cadc11db..bd7ea9a344 100644 --- a/plugins/org/package.json +++ b/plugins/org/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-org", "description": "A Backstage plugin that helps you create entity pages for your organization", - "version": "0.6.6-next.1", + "version": "0.6.6-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/pagerduty/CHANGELOG.md b/plugins/pagerduty/CHANGELOG.md index e6e2519fba..37189de162 100644 --- a/plugins/pagerduty/CHANGELOG.md +++ b/plugins/pagerduty/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-pagerduty +## 0.5.9-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.5-next.2 + - @backstage/plugin-catalog-react@1.4.0-next.2 + - @backstage/core-plugin-api@1.5.0-next.2 + ## 0.5.9-next.1 ### Patch Changes diff --git a/plugins/pagerduty/package.json b/plugins/pagerduty/package.json index 9f57e8bfcd..0ae7623240 100644 --- a/plugins/pagerduty/package.json +++ b/plugins/pagerduty/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-pagerduty", "description": "A Backstage plugin that integrates towards PagerDuty", - "version": "0.5.9-next.1", + "version": "0.5.9-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/periskop-backend/CHANGELOG.md b/plugins/periskop-backend/CHANGELOG.md index 79c9e4c931..aa43870b1d 100644 --- a/plugins/periskop-backend/CHANGELOG.md +++ b/plugins/periskop-backend/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-periskop-backend +## 0.1.14-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.3-next.2 + - @backstage/backend-plugin-api@0.4.1-next.2 + - @backstage/config@1.0.7-next.0 + ## 0.1.14-next.1 ### Patch Changes diff --git a/plugins/periskop-backend/package.json b/plugins/periskop-backend/package.json index bc72277f12..11e38bcd36 100644 --- a/plugins/periskop-backend/package.json +++ b/plugins/periskop-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-periskop-backend", - "version": "0.1.14-next.1", + "version": "0.1.14-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/periskop/CHANGELOG.md b/plugins/periskop/CHANGELOG.md index 6be9142f0e..d41640b55c 100644 --- a/plugins/periskop/CHANGELOG.md +++ b/plugins/periskop/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-periskop +## 0.1.14-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.5-next.2 + - @backstage/plugin-catalog-react@1.4.0-next.2 + - @backstage/core-plugin-api@1.5.0-next.2 + ## 0.1.14-next.1 ### Patch Changes diff --git a/plugins/periskop/package.json b/plugins/periskop/package.json index 06d5827ebe..1e7ca292d1 100644 --- a/plugins/periskop/package.json +++ b/plugins/periskop/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-periskop", - "version": "0.1.14-next.1", + "version": "0.1.14-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/permission-backend/CHANGELOG.md b/plugins/permission-backend/CHANGELOG.md index d9062aa03f..a55c711386 100644 --- a/plugins/permission-backend/CHANGELOG.md +++ b/plugins/permission-backend/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-permission-backend +## 0.5.18-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.2.12-next.2 + - @backstage/backend-common@0.18.3-next.2 + - @backstage/plugin-permission-node@0.7.6-next.2 + - @backstage/config@1.0.7-next.0 + ## 0.5.18-next.1 ### Patch Changes diff --git a/plugins/permission-backend/package.json b/plugins/permission-backend/package.json index 734e8c63b0..a7202c9672 100644 --- a/plugins/permission-backend/package.json +++ b/plugins/permission-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-permission-backend", - "version": "0.5.18-next.1", + "version": "0.5.18-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/permission-node/CHANGELOG.md b/plugins/permission-node/CHANGELOG.md index c9c0fc5005..59052c2184 100644 --- a/plugins/permission-node/CHANGELOG.md +++ b/plugins/permission-node/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-permission-node +## 0.7.6-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.2.12-next.2 + - @backstage/backend-common@0.18.3-next.2 + - @backstage/config@1.0.7-next.0 + ## 0.7.6-next.1 ### Patch Changes diff --git a/plugins/permission-node/package.json b/plugins/permission-node/package.json index 1a9dacffa0..92c0a7685a 100644 --- a/plugins/permission-node/package.json +++ b/plugins/permission-node/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-permission-node", "description": "Common permission and authorization utilities for backend plugins", - "version": "0.7.6-next.1", + "version": "0.7.6-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/permission-react/CHANGELOG.md b/plugins/permission-react/CHANGELOG.md index ce5346c846..31832e9a83 100644 --- a/plugins/permission-react/CHANGELOG.md +++ b/plugins/permission-react/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-permission-react +## 0.4.11-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.5.0-next.2 + - @backstage/config@1.0.7-next.0 + ## 0.4.11-next.1 ### Patch Changes diff --git a/plugins/permission-react/package.json b/plugins/permission-react/package.json index f904830280..1d5d0713b7 100644 --- a/plugins/permission-react/package.json +++ b/plugins/permission-react/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-permission-react", - "version": "0.4.11-next.1", + "version": "0.4.11-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/playlist-backend/CHANGELOG.md b/plugins/playlist-backend/CHANGELOG.md index 7ababd2832..da2697188a 100644 --- a/plugins/playlist-backend/CHANGELOG.md +++ b/plugins/playlist-backend/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-playlist-backend +## 0.2.6-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.2.12-next.2 + - @backstage/backend-common@0.18.3-next.2 + - @backstage/plugin-permission-node@0.7.6-next.2 + - @backstage/config@1.0.7-next.0 + ## 0.2.6-next.1 ### Patch Changes diff --git a/plugins/playlist-backend/package.json b/plugins/playlist-backend/package.json index 990a651ccb..2d868b950a 100644 --- a/plugins/playlist-backend/package.json +++ b/plugins/playlist-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-playlist-backend", - "version": "0.2.6-next.1", + "version": "0.2.6-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/playlist/CHANGELOG.md b/plugins/playlist/CHANGELOG.md index 450fc880f2..bc0263fd00 100644 --- a/plugins/playlist/CHANGELOG.md +++ b/plugins/playlist/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-playlist +## 0.1.7-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.5-next.2 + - @backstage/plugin-catalog-react@1.4.0-next.2 + - @backstage/plugin-search-react@1.5.1-next.2 + - @backstage/core-plugin-api@1.5.0-next.2 + - @backstage/plugin-permission-react@0.4.11-next.2 + ## 0.1.7-next.1 ### Patch Changes diff --git a/plugins/playlist/package.json b/plugins/playlist/package.json index 18faa09cc8..445171f9b8 100644 --- a/plugins/playlist/package.json +++ b/plugins/playlist/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-playlist", - "version": "0.1.7-next.1", + "version": "0.1.7-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/proxy-backend/CHANGELOG.md b/plugins/proxy-backend/CHANGELOG.md index dc5562369c..8b649c44de 100644 --- a/plugins/proxy-backend/CHANGELOG.md +++ b/plugins/proxy-backend/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-proxy-backend +## 0.2.37-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.3-next.2 + - @backstage/backend-plugin-api@0.4.1-next.2 + - @backstage/config@1.0.7-next.0 + ## 0.2.37-next.1 ### Patch Changes diff --git a/plugins/proxy-backend/package.json b/plugins/proxy-backend/package.json index 72bbef0750..a7d320c37c 100644 --- a/plugins/proxy-backend/package.json +++ b/plugins/proxy-backend/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-proxy-backend", "description": "A Backstage backend plugin that helps you set up proxy endpoints in the backend", - "version": "0.2.37-next.1", + "version": "0.2.37-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/proxy-backend/src/service/router.ts b/plugins/proxy-backend/src/service/router.ts index b669e82f3f..6912965659 100644 --- a/plugins/proxy-backend/src/service/router.ts +++ b/plugins/proxy-backend/src/service/router.ts @@ -121,6 +121,11 @@ export function buildMiddleware( // Attach the logger to the proxy config fullConfig.logProvider = () => logger; + // http-proxy-middleware uses this log level to check if it should log the + // requests that it proxies. Setting this to the most verbose log level + // ensures that it always logs these requests. Our logger ends up deciding + // if the logs are displayed or not. + fullConfig.logLevel = 'debug'; // Only return the allowed HTTP headers to not forward unwanted secret headers const requestHeaderAllowList = new Set( diff --git a/plugins/rollbar-backend/CHANGELOG.md b/plugins/rollbar-backend/CHANGELOG.md index 2e1a515b5d..edda54dcd1 100644 --- a/plugins/rollbar-backend/CHANGELOG.md +++ b/plugins/rollbar-backend/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-rollbar-backend +## 0.1.40-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.3-next.2 + - @backstage/config@1.0.7-next.0 + ## 0.1.40-next.1 ### Patch Changes diff --git a/plugins/rollbar-backend/package.json b/plugins/rollbar-backend/package.json index 1fcb4d288b..31d802dece 100644 --- a/plugins/rollbar-backend/package.json +++ b/plugins/rollbar-backend/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-rollbar-backend", "description": "A Backstage backend plugin that integrates towards Rollbar", - "version": "0.1.40-next.1", + "version": "0.1.40-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/rollbar/CHANGELOG.md b/plugins/rollbar/CHANGELOG.md index df90e7f8bf..943db21cce 100644 --- a/plugins/rollbar/CHANGELOG.md +++ b/plugins/rollbar/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-rollbar +## 0.4.16-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.5-next.2 + - @backstage/plugin-catalog-react@1.4.0-next.2 + - @backstage/core-plugin-api@1.5.0-next.2 + ## 0.4.16-next.1 ### Patch Changes diff --git a/plugins/rollbar/package.json b/plugins/rollbar/package.json index ff4e1d3539..a3189c147d 100644 --- a/plugins/rollbar/package.json +++ b/plugins/rollbar/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-rollbar", "description": "A Backstage plugin that integrates towards Rollbar", - "version": "0.4.16-next.1", + "version": "0.4.16-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/scaffolder-backend-module-cookiecutter/CHANGELOG.md b/plugins/scaffolder-backend-module-cookiecutter/CHANGELOG.md index e7a96b1596..2dcb0eb279 100644 --- a/plugins/scaffolder-backend-module-cookiecutter/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-cookiecutter/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-scaffolder-backend-module-cookiecutter +## 0.2.18-next.2 + +### Patch Changes + +- 62414770ead: allow container runner to be undefined in cookiecutter plugin +- Updated dependencies + - @backstage/plugin-scaffolder-backend@1.12.0-next.2 + - @backstage/backend-common@0.18.3-next.2 + - @backstage/plugin-scaffolder-node@0.1.1-next.2 + - @backstage/config@1.0.7-next.0 + - @backstage/integration@1.4.3-next.0 + ## 0.2.18-next.1 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-cookiecutter/README.md b/plugins/scaffolder-backend-module-cookiecutter/README.md index ae34e09c96..0e8e11ef7d 100644 --- a/plugins/scaffolder-backend-module-cookiecutter/README.md +++ b/plugins/scaffolder-backend-module-cookiecutter/README.md @@ -161,3 +161,5 @@ You can do so by including the following lines in the last step of your Dockerfi RUN apt-get update && apt-get install -y python3 python3-pip RUN pip3 install cookiecutter ``` + +In this case, you don't have to include `containerRunner` in the action configuration. diff --git a/plugins/scaffolder-backend-module-cookiecutter/api-report.md b/plugins/scaffolder-backend-module-cookiecutter/api-report.md index 76f2ced66f..2944f5240e 100644 --- a/plugins/scaffolder-backend-module-cookiecutter/api-report.md +++ b/plugins/scaffolder-backend-module-cookiecutter/api-report.md @@ -15,7 +15,7 @@ import { UrlReader } from '@backstage/backend-common'; export function createFetchCookiecutterAction(options: { reader: UrlReader; integrations: ScmIntegrations; - containerRunner: ContainerRunner; + containerRunner?: ContainerRunner; }): TemplateAction<{ url: string; targetPath?: string | undefined; diff --git a/plugins/scaffolder-backend-module-cookiecutter/package.json b/plugins/scaffolder-backend-module-cookiecutter/package.json index e0f2368664..373320191a 100644 --- a/plugins/scaffolder-backend-module-cookiecutter/package.json +++ b/plugins/scaffolder-backend-module-cookiecutter/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-scaffolder-backend-module-cookiecutter", "description": "A module for the scaffolder backend that lets you template projects using cookiecutter", - "version": "0.2.18-next.1", + "version": "0.2.18-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/scaffolder-backend-module-cookiecutter/src/actions/fetch/cookiecutter.test.ts b/plugins/scaffolder-backend-module-cookiecutter/src/actions/fetch/cookiecutter.test.ts index f8b049f95f..9d7f06afc8 100644 --- a/plugins/scaffolder-backend-module-cookiecutter/src/actions/fetch/cookiecutter.test.ts +++ b/plugins/scaffolder-backend-module-cookiecutter/src/actions/fetch/cookiecutter.test.ts @@ -223,4 +223,16 @@ describe('fetch:cookiecutter', () => { }), ); }); + + it('should throw error if cookiecutter is not installed and containerRunner is undefined', async () => { + commandExists.mockResolvedValue(false); + const ccAction = createFetchCookiecutterAction({ + integrations, + reader: mockReader, + }); + + await expect(ccAction.handler(mockContext)).rejects.toThrow( + /Invalid state: containerRunner cannot be undefined when cookiecutter is not installed/, + ); + }); }); diff --git a/plugins/scaffolder-backend-module-cookiecutter/src/actions/fetch/cookiecutter.ts b/plugins/scaffolder-backend-module-cookiecutter/src/actions/fetch/cookiecutter.ts index 5c69b9dce2..b63a044a20 100644 --- a/plugins/scaffolder-backend-module-cookiecutter/src/actions/fetch/cookiecutter.ts +++ b/plugins/scaffolder-backend-module-cookiecutter/src/actions/fetch/cookiecutter.ts @@ -33,9 +33,9 @@ import { import { createTemplateAction } from '@backstage/plugin-scaffolder-node'; export class CookiecutterRunner { - private readonly containerRunner: ContainerRunner; + private readonly containerRunner?: ContainerRunner; - constructor({ containerRunner }: { containerRunner: ContainerRunner }) { + constructor({ containerRunner }: { containerRunner?: ContainerRunner }) { this.containerRunner = containerRunner; } @@ -101,6 +101,11 @@ export class CookiecutterRunner { logStream, }); } else { + if (this.containerRunner === undefined) { + throw new Error( + 'Invalid state: containerRunner cannot be undefined when cookiecutter is not installed', + ); + } await this.containerRunner.runContainer({ imageName: imageName ?? 'spotify/backstage-cookiecutter', command: 'cookiecutter', @@ -139,7 +144,7 @@ export class CookiecutterRunner { export function createFetchCookiecutterAction(options: { reader: UrlReader; integrations: ScmIntegrations; - containerRunner: ContainerRunner; + containerRunner?: ContainerRunner; }) { const { reader, containerRunner, integrations } = options; diff --git a/plugins/scaffolder-backend-module-rails/CHANGELOG.md b/plugins/scaffolder-backend-module-rails/CHANGELOG.md index e816de1aa9..5c7fb1dc2d 100644 --- a/plugins/scaffolder-backend-module-rails/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-rails/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-scaffolder-backend-module-rails +## 0.4.11-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-backend@1.12.0-next.2 + - @backstage/backend-common@0.18.3-next.2 + - @backstage/plugin-scaffolder-node@0.1.1-next.2 + - @backstage/config@1.0.7-next.0 + - @backstage/integration@1.4.3-next.0 + ## 0.4.11-next.1 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-rails/package.json b/plugins/scaffolder-backend-module-rails/package.json index 2ba80b2e32..be9d053340 100644 --- a/plugins/scaffolder-backend-module-rails/package.json +++ b/plugins/scaffolder-backend-module-rails/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-scaffolder-backend-module-rails", "description": "A module for the scaffolder backend that lets you template projects using Rails", - "version": "0.4.11-next.1", + "version": "0.4.11-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/scaffolder-backend-module-rails/src/actions/fetch/rails/index.test.ts b/plugins/scaffolder-backend-module-rails/src/actions/fetch/rails/index.test.ts index 56f85d002e..37d0bcac4a 100644 --- a/plugins/scaffolder-backend-module-rails/src/actions/fetch/rails/index.test.ts +++ b/plugins/scaffolder-backend-module-rails/src/actions/fetch/rails/index.test.ts @@ -91,7 +91,7 @@ describe('fetch:rails', () => { beforeEach(() => { mockFs({ [`${mockContext.workspacePath}/result`]: {} }); - jest.restoreAllMocks(); + jest.clearAllMocks(); }); afterEach(() => { diff --git a/plugins/scaffolder-backend-module-sentry/CHANGELOG.md b/plugins/scaffolder-backend-module-sentry/CHANGELOG.md index e804b6c33b..ae6d8734c9 100644 --- a/plugins/scaffolder-backend-module-sentry/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-sentry/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-scaffolder-backend-module-sentry +## 0.1.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-node@0.1.1-next.2 + - @backstage/config@1.0.7-next.0 + ## 0.1.3-next.1 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-sentry/package.json b/plugins/scaffolder-backend-module-sentry/package.json index acd7030e29..36f5139b28 100644 --- a/plugins/scaffolder-backend-module-sentry/package.json +++ b/plugins/scaffolder-backend-module-sentry/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-scaffolder-backend-module-sentry", - "version": "0.1.3-next.1", + "version": "0.1.3-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/scaffolder-backend-module-yeoman/CHANGELOG.md b/plugins/scaffolder-backend-module-yeoman/CHANGELOG.md index 786a2d1f2b..e87cf64167 100644 --- a/plugins/scaffolder-backend-module-yeoman/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-yeoman/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-scaffolder-backend-module-yeoman +## 0.2.16-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-node@0.1.1-next.2 + - @backstage/config@1.0.7-next.0 + ## 0.2.16-next.1 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-yeoman/package.json b/plugins/scaffolder-backend-module-yeoman/package.json index 82651cf781..01ba3f5eea 100644 --- a/plugins/scaffolder-backend-module-yeoman/package.json +++ b/plugins/scaffolder-backend-module-yeoman/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-scaffolder-backend-module-yeoman", - "version": "0.2.16-next.1", + "version": "0.2.16-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/scaffolder-backend/CHANGELOG.md b/plugins/scaffolder-backend/CHANGELOG.md index 2ffbda38db..65a827797f 100644 --- a/plugins/scaffolder-backend/CHANGELOG.md +++ b/plugins/scaffolder-backend/CHANGELOG.md @@ -1,5 +1,23 @@ # @backstage/plugin-scaffolder-backend +## 1.12.0-next.2 + +### Patch Changes + +- 860de10fa67: Make identity valid if subject of token is a backstage server-2-server auth token +- 65454876fb2: Minor API report tweaks +- 9968f455921: catalog write action should allow any shape of object +- Updated dependencies + - @backstage/plugin-auth-node@0.2.12-next.2 + - @backstage/backend-tasks@0.5.0-next.2 + - @backstage/backend-common@0.18.3-next.2 + - @backstage/backend-plugin-api@0.4.1-next.2 + - @backstage/plugin-catalog-backend@1.8.0-next.2 + - @backstage/plugin-catalog-node@1.3.4-next.2 + - @backstage/plugin-scaffolder-node@0.1.1-next.2 + - @backstage/config@1.0.7-next.0 + - @backstage/integration@1.4.3-next.0 + ## 1.12.0-next.1 ### Minor Changes diff --git a/plugins/scaffolder-backend/api-report.md b/plugins/scaffolder-backend/api-report.md index ca9b3543af..e0f7ddb441 100644 --- a/plugins/scaffolder-backend/api-report.md +++ b/plugins/scaffolder-backend/api-report.md @@ -11,9 +11,11 @@ import { CatalogProcessor } from '@backstage/plugin-catalog-backend'; import { CatalogProcessorEmit } from '@backstage/plugin-catalog-backend'; import { Config } from '@backstage/config'; import { createPullRequest } from 'octokit-plugin-create-pull-request'; +import { Duration } from 'luxon'; import { Entity } from '@backstage/catalog-model'; import express from 'express'; import { GithubCredentialsProvider } from '@backstage/integration'; +import { HumanDuration } from '@backstage/types'; import { IdentityApi } from '@backstage/plugin-auth-node'; import { JsonObject } from '@backstage/types'; import { JsonValue } from '@backstage/types'; @@ -527,6 +529,11 @@ export const createTemplateAction: < action: TemplateActionOptions, ) => TemplateAction_2; +// @public +export function createWaitAction(options?: { + maxWaitTime?: Duration | HumanDuration; +}): TemplateAction_2; + // @public export type CreateWorkerOptions = { taskBroker: TaskBroker; @@ -549,6 +556,14 @@ export interface CurrentClaimedTask { // @public export class DatabaseTaskStore implements TaskStore { + // (undocumented) + cancelTask( + options: TaskStoreEmitOptions< + { + message: string; + } & JsonObject + >, + ): Promise; // (undocumented) claimTask(): Promise; // (undocumented) @@ -693,6 +708,8 @@ export type SerializedTaskEvent = { // @public export interface TaskBroker { + // (undocumented) + cancel?(taskId: string): Promise; // (undocumented) claim(): Promise; // (undocumented) @@ -730,6 +747,8 @@ export type TaskCompletionState = 'failed' | 'completed'; // @public export interface TaskContext { + // (undocumented) + cancelSignal: AbortSignal; // (undocumented) complete(result: TaskCompletionState, metadata?: JsonObject): Promise; // (undocumented) @@ -749,16 +768,19 @@ export interface TaskContext { } // @public -export type TaskEventType = 'completion' | 'log'; +export type TaskEventType = 'completion' | 'log' | 'cancelled'; // @public export class TaskManager implements TaskContext { + // (undocumented) + get cancelSignal(): AbortSignal; // (undocumented) complete(result: TaskCompletionState, metadata?: JsonObject): Promise; // (undocumented) static create( task: CurrentClaimedTask, storage: TaskStore, + abortSignal: AbortSignal, logger: Logger, ): TaskManager; // (undocumented) @@ -780,14 +802,16 @@ export type TaskSecrets = TaskSecrets_2; // @public export type TaskStatus = - | 'open' - | 'processing' - | 'failed' | 'cancelled' - | 'completed'; + | 'completed' + | 'failed' + | 'open' + | 'processing'; // @public export interface TaskStore { + // (undocumented) + cancelTask?(options: TaskStoreEmitOptions): Promise; // (undocumented) claimTask(): Promise; // (undocumented) diff --git a/plugins/scaffolder-backend/package.json b/plugins/scaffolder-backend/package.json index bc4ecb8bf9..e27f3ecead 100644 --- a/plugins/scaffolder-backend/package.json +++ b/plugins/scaffolder-backend/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-scaffolder-backend", "description": "The Backstage backend plugin that helps you create new things", - "version": "1.12.0-next.1", + "version": "1.12.0-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -64,6 +64,7 @@ "@gitbeaker/node": "^35.1.0", "@octokit/webhooks": "^10.0.0", "@types/express": "^4.17.6", + "@types/luxon": "^3.0.0", "azure-devops-node-api": "^11.0.1", "command-exists": "^1.2.9", "compression": "^1.7.4", @@ -109,6 +110,7 @@ "mock-fs": "^5.1.0", "msw": "^1.0.0", "supertest": "^6.1.3", + "wait-for-expect": "^3.0.2", "yaml": "^2.0.0" }, "files": [ diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/catalog/write.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/catalog/write.ts index aaaf504833..9e823d2574 100644 --- a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/catalog/write.ts +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/catalog/write.ts @@ -70,6 +70,7 @@ export function createCatalogWriteAction() { // TODO: this should reference an zod entity validator if it existed. entity: z .object({}) + .passthrough() .describe( 'You can provide the same values used in the Entity schema.', ), diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/createBuiltinActions.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/createBuiltinActions.ts index 9ba4a27b1a..d4c8de3604 100644 --- a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/createBuiltinActions.ts +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/createBuiltinActions.ts @@ -30,7 +30,7 @@ import { } from './catalog'; import { TemplateFilter, TemplateGlobal } from '../../../lib'; -import { createDebugLogAction } from './debug'; +import { createDebugLogAction, createWaitAction } from './debug'; import { createFetchPlainAction, createFetchTemplateAction } from './fetch'; import { createFilesystemDeleteAction, @@ -159,6 +159,7 @@ export const createBuiltinActions = ( config, }), createDebugLogAction(), + createWaitAction(), createCatalogRegisterAction({ catalogClient, integrations }), createFetchCatalogEntityAction({ catalogClient }), createCatalogWriteAction(), diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/debug/index.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/debug/index.ts index 8cc50a7eba..3776ce7f03 100644 --- a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/debug/index.ts +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/debug/index.ts @@ -15,3 +15,4 @@ */ export { createDebugLogAction } from './log'; +export { createWaitAction } from './wait'; diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/debug/wait.test.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/debug/wait.test.ts new file mode 100644 index 0000000000..0d4cdaba4b --- /dev/null +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/debug/wait.test.ts @@ -0,0 +1,76 @@ +/* + * Copyright 2021 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { getVoidLogger } from '@backstage/backend-common'; +import mockFs from 'mock-fs'; +import { createWaitAction } from './wait'; +import { Writable } from 'stream'; +import os from 'os'; + +describe('debug:wait', () => { + const action = createWaitAction(); + + const logStream = { + write: jest.fn(), + } as jest.Mocked> as jest.Mocked; + + const mockTmpDir = os.tmpdir(); + const mockContext = { + input: {}, + baseUrl: 'somebase', + workspacePath: mockTmpDir, + logger: getVoidLogger(), + logStream, + output: jest.fn(), + createTemporaryDirectory: jest.fn().mockResolvedValue(mockTmpDir), + }; + + beforeEach(() => { + jest.resetAllMocks(); + }); + + afterEach(() => { + mockFs.restore(); + }); + + it('should wait for specified period of time', async () => { + const context = { + ...mockContext, + input: { + milliseconds: 50, + }, + }; + const start = new Date().getTime(); + await action.handler(context); + const end = new Date().getTime(); + expect(end - start).toBeGreaterThanOrEqual(50); + }); + + it('should not allow to set waiting time longer than the max waiting time', async () => { + const context = { + ...mockContext, + input: { + minutes: 11, + }, + }; + + await expect(async () => { + await action.handler(context); + }).rejects.toThrow( + 'Waiting duration is longer than the maximum threshold of 0 hours, 0 minutes, 30 seconds', + ); + }); +}); diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/debug/wait.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/debug/wait.ts new file mode 100644 index 0000000000..02cab239cb --- /dev/null +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/debug/wait.ts @@ -0,0 +1,131 @@ +/* + * Copyright 2021 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { createTemplateAction } from '@backstage/plugin-scaffolder-node'; +import { HumanDuration } from '@backstage/types'; +import yaml from 'yaml'; +import { Duration } from 'luxon'; + +const id = 'debug:wait'; + +const MAX_WAIT_TIME_IN_ISO = 'T00:00:30'; + +const examples = [ + { + description: 'Waiting for 5 seconds', + example: yaml.stringify({ + steps: [ + { + action: id, + id: 'wait-5sec', + name: 'Waiting for 5 seconds', + input: { + seconds: 5, + }, + }, + ], + }), + }, + { + description: 'Waiting for 5 minutes', + example: yaml.stringify({ + steps: [ + { + action: id, + id: 'wait-5min', + name: 'Waiting for 5 minutes', + input: { + minutes: 5, + }, + }, + ], + }), + }, +]; + +/** + * Waits for a certain period of time. + * + * @remarks + * + * This task is useful to give some waiting time for manual intervention. + * Has to be used in a combination with other actions. + * + * @public + */ +export function createWaitAction(options?: { + maxWaitTime?: Duration | HumanDuration; +}) { + const toDuration = ( + maxWaitTime: Duration | HumanDuration | undefined, + ): Duration => { + if (maxWaitTime) { + if (maxWaitTime instanceof Duration) { + return maxWaitTime; + } + return Duration.fromObject(maxWaitTime); + } + return Duration.fromISOTime(MAX_WAIT_TIME_IN_ISO); + }; + + return createTemplateAction({ + id, + description: 'Waits for a certain period of time.', + examples, + schema: { + input: { + type: 'object', + properties: { + minutes: { + title: 'Waiting period in minutes.', + type: 'number', + }, + seconds: { + title: 'Waiting period in seconds.', + type: 'number', + }, + milliseconds: { + title: 'Waiting period in milliseconds.', + type: 'number', + }, + }, + }, + }, + async handler(ctx) { + const delayTime = Duration.fromObject(ctx.input); + const maxWait = toDuration(options?.maxWaitTime); + + if (delayTime.minus(maxWait).toMillis() > 0) { + throw new Error( + `Waiting duration is longer than the maximum threshold of ${maxWait.toHuman()}`, + ); + } + + await new Promise(resolve => { + const controller = new AbortController(); + const timeoutHandle = setTimeout(abort, delayTime.toMillis()); + ctx.signal?.addEventListener('abort', abort); + + function abort() { + ctx.signal?.removeEventListener('abort', abort); + clearTimeout(timeoutHandle!); + controller.abort(); + resolve('finished'); + } + }); + }, + }); +} diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/azure.test.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/azure.test.ts index 2d2775572f..a2262c1f9f 100644 --- a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/azure.test.ts +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/azure.test.ts @@ -62,7 +62,7 @@ describe('publish:azure', () => { (WebApi as unknown as jest.Mock).mockImplementation(() => mockGitApi); beforeEach(() => { - jest.restoreAllMocks(); + jest.clearAllMocks(); }); it('should throw an error when the repoUrl is not well formed', async () => { @@ -183,7 +183,12 @@ describe('publish:azure', () => { id: '709e891c-dee7-4f91-b963-534713c0737f', })); - await action.handler(mockContext); + await action.handler({ + ...mockContext, + input: { + repoUrl: 'dev.azure.com?repo=bob&owner=owner&organization=org', + }, + }); expect(WebApi).toHaveBeenCalledWith( 'https://dev.azure.com/org', @@ -234,7 +239,7 @@ describe('publish:azure', () => { expect(initRepoAndPush).toHaveBeenCalledWith({ dir: mockContext.workspacePath, remoteUrl: 'https://dev.azure.com/organization/project/_git/repo', - defaultBranch: 'master', + defaultBranch: 'main', auth: { username: 'notempty', password: 'tokenlols' }, logger: mockContext.logger, commitMessage: 'initial commit', diff --git a/plugins/scaffolder-backend/src/scaffolder/dryrun/createDryRunner.ts b/plugins/scaffolder-backend/src/scaffolder/dryrun/createDryRunner.ts index 1929e3b8ac..d9302f4d74 100644 --- a/plugins/scaffolder-backend/src/scaffolder/dryrun/createDryRunner.ts +++ b/plugins/scaffolder-backend/src/scaffolder/dryrun/createDryRunner.ts @@ -25,7 +25,7 @@ import { SerializedFile, serializeDirectoryContents, } from '../../lib/files'; -import { TemplateFilter, TemplateGlobal } from '../../lib/templating'; +import { TemplateFilter, TemplateGlobal } from '../../lib'; import { TemplateActionRegistry } from '../actions'; import { NunjucksWorkflowRunner } from '../tasks/NunjucksWorkflowRunner'; import { DecoratedActionsRegistry } from './DecoratedActionsRegistry'; @@ -94,6 +94,8 @@ export function createDryRunner(options: TemplateTesterCreateOptions) { try { await deserializeDirectoryContents(contentsPath, input.directoryContents); + const abortSignal = new AbortController().signal; + const result = await workflowRunner.execute({ spec: { ...input.spec, @@ -117,6 +119,7 @@ export function createDryRunner(options: TemplateTesterCreateOptions) { done: false, isDryRun: true, getWorkspaceName: async () => `dry-run-${dryRunId}`, + cancelSignal: abortSignal, async emitLog(message: string, logMetadata?: JsonObject) { if (logMetadata?.stepId === dryRunId) { return; @@ -128,7 +131,7 @@ export function createDryRunner(options: TemplateTesterCreateOptions) { }, }); }, - async complete() { + complete: async () => { throw new Error('Not implemented'); }, }); diff --git a/plugins/scaffolder-backend/src/scaffolder/tasks/DatabaseTaskStore.test.ts b/plugins/scaffolder-backend/src/scaffolder/tasks/DatabaseTaskStore.test.ts new file mode 100644 index 0000000000..4c0eb94c82 --- /dev/null +++ b/plugins/scaffolder-backend/src/scaffolder/tasks/DatabaseTaskStore.test.ts @@ -0,0 +1,191 @@ +/* + * Copyright 2021 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { DatabaseManager } from '@backstage/backend-common'; +import { ConfigReader } from '@backstage/config'; +import { DatabaseTaskStore } from './DatabaseTaskStore'; +import { TaskSpec } from '@backstage/plugin-scaffolder-common'; +import { ConflictError } from '@backstage/errors'; + +const createStore = async () => { + const manager = DatabaseManager.fromConfig( + new ConfigReader({ + backend: { + database: { + client: 'better-sqlite3', + connection: ':memory:', + }, + }, + }), + ).forPlugin('scaffolder'); + const store = await DatabaseTaskStore.create({ + database: manager, + }); + return { store, manager }; +}; + +describe('DatabaseTaskStore', () => { + it('should create the database store and run migration', async () => { + const { store, manager } = await createStore(); + expect(store).toBeDefined(); + + const client = await manager.getClient(); + expect(client.schema.hasTable('tasks')).toBeTruthy(); + expect(client.schema.hasTable('task_events')).toBeTruthy(); + }); + + it('should list all created tasks', async () => { + const { store } = await createStore(); + await store.createTask({ + spec: {} as TaskSpec, + createdBy: 'me', + }); + + const { tasks } = await store.list({}); + expect(tasks.length).toBe(1); + expect(tasks[0].createdBy).toBe('me'); + expect(tasks[0].status).toBe('open'); + expect(tasks[0].id).toBeDefined(); + }); + + it('should list filtered created tasks by createdBy', async () => { + const { store } = await createStore(); + + await store.createTask({ + spec: {} as TaskSpec, + createdBy: 'me', + }); + + await store.createTask({ + spec: {} as TaskSpec, + createdBy: 'him', + }); + + const { tasks } = await store.list({ createdBy: 'him' }); + expect(tasks.length).toBe(1); + expect(tasks[0].createdBy).toBe('him'); + expect(tasks[0].status).toBe('open'); + expect(tasks[0].id).toBeDefined(); + }); + + it('should sent an event to start cancelling the task', async () => { + const { store } = await createStore(); + + const { taskId } = await store.createTask({ + spec: {} as TaskSpec, + createdBy: 'me', + }); + const task = await store.getTask(taskId); + expect(task.status).toBe('open'); + + await store.cancelTask({ + taskId, + body: { + message: `Step 2 has been cancelled.`, + stepId: 2, + status: 'cancelled', + }, + }); + + const { events } = await store.listEvents({ taskId }); + const event = events[0]; + expect(event.taskId).toBe(taskId); + expect(event.body.status).toBe('cancelled'); + }); + + it('should emit a log event', async () => { + const { store } = await createStore(); + const { taskId } = await store.createTask({ + spec: {} as TaskSpec, + createdBy: 'me', + }); + await store.emitLogEvent({ + taskId, + body: { + message: 'Step #2 failed', + stepId: 2, + status: 'failed', + }, + }); + const { events } = await store.listEvents({ taskId }); + const event = events[0]; + expect(event.taskId).toBe(taskId); + expect(event.body.status).toBe('failed'); + expect(event.type).toBe('log'); + }); + + it('should complete the task', async () => { + const { store } = await createStore(); + const { taskId } = await store.createTask({ + spec: {} as TaskSpec, + createdBy: 'me', + }); + const task = await store.getTask(taskId); + expect(task.status).toBe('open'); + + const message = `This task was marked as stale as it exceeded its timeout`; + await store.completeTask({ + taskId, + status: 'cancelled', + eventBody: { message }, + }); + + const taskAfterCompletion = await store.getTask(taskId); + expect(taskAfterCompletion.status).toBe('cancelled'); + }); + + it('should claim a new task', async () => { + const { store } = await createStore(); + const { taskId } = await store.createTask({ + spec: {} as TaskSpec, + createdBy: 'me', + }); + const task = await store.getTask(taskId); + expect(task.status).toBe('open'); + await store.claimTask(); + + const claimedTask = await store.getTask(taskId); + expect(claimedTask.status).toBe('processing'); + }); + + it('should shutdown the running task', async () => { + const { store } = await createStore(); + const { taskId } = await store.createTask({ + spec: {} as TaskSpec, + createdBy: 'me', + }); + const task = await store.getTask(taskId); + expect(task.status).toBe('open'); + await store.claimTask(); + await store.shutdownTask({ taskId }); + + const claimedTask = await store.getTask(taskId); + expect(claimedTask.status).toBe('failed'); + }); + + it('should be not possible to shutdown not running task', async () => { + const { store } = await createStore(); + const { taskId } = await store.createTask({ + spec: {} as TaskSpec, + createdBy: 'me', + }); + const task = await store.getTask(taskId); + expect(task.status).toBe('open'); + await expect(async () => { + await store.shutdownTask({ taskId }); + }).rejects.toThrow(ConflictError); + }); +}); diff --git a/plugins/scaffolder-backend/src/scaffolder/tasks/DatabaseTaskStore.ts b/plugins/scaffolder-backend/src/scaffolder/tasks/DatabaseTaskStore.ts index 879b457544..f3cb9b645e 100644 --- a/plugins/scaffolder-backend/src/scaffolder/tasks/DatabaseTaskStore.ts +++ b/plugins/scaffolder-backend/src/scaffolder/tasks/DatabaseTaskStore.ts @@ -220,7 +220,7 @@ export class DatabaseTaskStore implements TaskStore { .update({ status: 'processing', last_heartbeat_at: this.db.fn.now(), - // remove the secrets when moving moving to processing state. + // remove the secrets when moving to processing state. secrets: null, }); @@ -287,13 +287,14 @@ export class DatabaseTaskStore implements TaskStore { const { taskId, status, eventBody } = options; let oldStatus: string; - if (status === 'failed' || status === 'completed') { + if (['failed', 'completed', 'cancelled'].includes(status)) { oldStatus = 'processing'; } else { throw new Error( `Invalid status update of run '${taskId}' to status '${status}'`, ); } + await this.db.transaction(async tx => { const [task] = await tx('tasks') .where({ @@ -302,6 +303,40 @@ export class DatabaseTaskStore implements TaskStore { .limit(1) .select(); + const updateTask = async (criteria: { + id: string; + status?: TaskStatus; + }) => { + const updateCount = await tx('tasks') + .where(criteria) + .update({ + status, + }); + + if (updateCount !== 1) { + throw new ConflictError( + `Failed to update status to '${status}' for taskId ${taskId}`, + ); + } + + await tx('task_events').insert({ + task_id: taskId, + event_type: 'completion', + body: JSON.stringify(eventBody), + }); + }; + + if (status === 'cancelled') { + await updateTask({ + id: taskId, + }); + return; + } + + if (task.status === 'cancelled') { + return; + } + if (!task) { throw new Error(`No task with taskId ${taskId} found`); } @@ -311,25 +346,10 @@ export class DatabaseTaskStore implements TaskStore { `as it is currently '${task.status}', expected '${oldStatus}'`, ); } - const updateCount = await tx('tasks') - .where({ - id: taskId, - status: oldStatus, - }) - .update({ - status, - }); - if (updateCount !== 1) { - throw new ConflictError( - `Failed to update status to '${status}' for taskId ${taskId}`, - ); - } - - await tx('task_events').insert({ - task_id: taskId, - event_type: 'completion', - body: JSON.stringify(eventBody), + await updateTask({ + id: taskId, + status: oldStatus, }); }); } @@ -419,4 +439,16 @@ export class DatabaseTaskStore implements TaskStore { }, }); } + + async cancelTask( + options: TaskStoreEmitOptions<{ message: string } & JsonObject>, + ): Promise { + const { taskId, body } = options; + const serializedBody = JSON.stringify(body); + await this.db('task_events').insert({ + task_id: taskId, + event_type: 'cancelled', + body: serializedBody, + }); + } } diff --git a/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.test.ts b/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.test.ts index 0d2246ed36..3b6ec54249 100644 --- a/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.test.ts +++ b/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.test.ts @@ -70,6 +70,7 @@ describe('DefaultWorkflowRunner', () => { complete: async () => {}, done: false, emitLog: async () => {}, + cancelSignal: new AbortController().signal, getWorkspaceName: () => Promise.resolve('test-workspace'), }); @@ -166,7 +167,7 @@ describe('DefaultWorkflowRunner', () => { }); await expect(runner.execute(task)).rejects.toThrow( - /Invalid input passed to action jest-validated-action, instance requires property \"foo\"/, + /Invalid input passed to action jest-validated-action, instance requires property "foo"/, ); }); diff --git a/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.ts b/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.ts index 88abe05cad..629c730d48 100644 --- a/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.ts +++ b/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.ts @@ -15,7 +15,12 @@ */ import { ScmIntegrations } from '@backstage/integration'; -import { TaskContext, WorkflowResponse, WorkflowRunner } from './types'; +import { + TaskContext, + TaskTrackType, + WorkflowResponse, + WorkflowRunner, +} from './types'; import * as winston from 'winston'; import fs from 'fs-extra'; import path from 'path'; @@ -99,6 +104,7 @@ const createStepLogger = ({ export class NunjucksWorkflowRunner implements WorkflowRunner { constructor(private readonly options: NunjucksWorkflowRunnerOptions) {} + private readonly tracker = scaffoldingTracker(); private isSingleTemplateString(input: string) { @@ -180,6 +186,138 @@ export class NunjucksWorkflowRunner implements WorkflowRunner { }); } + async executeStep( + task: TaskContext, + step: TaskStep, + context: TemplateContext, + renderTemplate: (template: string, values: unknown) => string, + taskTrack: TaskTrackType, + workspacePath: string, + ) { + const stepTrack = await this.tracker.stepStart(task, step); + + if (task.cancelSignal.aborted) { + throw new Error(`Step ${step.name} has been cancelled.`); + } + + try { + if (step.if) { + const ifResult = await this.render(step.if, context, renderTemplate); + if (!isTruthy(ifResult)) { + await stepTrack.skipFalsy(); + return; + } + } + + const action: TemplateAction = + this.options.actionRegistry.get(step.action); + const { taskLogger, streamLogger } = createStepLogger({ task, step }); + + if (task.isDryRun) { + const redactedSecrets = Object.fromEntries( + Object.entries(task.secrets ?? {}).map(secret => [ + secret[0], + '[REDACTED]', + ]), + ); + const debugInput = + (step.input && + this.render( + step.input, + { + ...context, + secrets: redactedSecrets, + }, + renderTemplate, + )) ?? + {}; + taskLogger.info( + `Running ${ + action.id + } in dry-run mode with inputs (secrets redacted): ${JSON.stringify( + debugInput, + undefined, + 2, + )}`, + ); + if (!action.supportsDryRun) { + await taskTrack.skipDryRun(step, action); + const outputSchema = action.schema?.output; + if (outputSchema) { + context.steps[step.id] = { + output: generateExampleOutput(outputSchema) as { + [name in string]: JsonValue; + }, + }; + } else { + context.steps[step.id] = { output: {} }; + } + return; + } + } + + // Secrets are only passed when templating the input to actions for security reasons + const input = + (step.input && + this.render( + step.input, + { ...context, secrets: task.secrets ?? {} }, + renderTemplate, + )) ?? + {}; + + if (action.schema?.input) { + const validateResult = validateJsonSchema(input, action.schema.input); + if (!validateResult.valid) { + const errors = validateResult.errors.join(', '); + throw new InputError( + `Invalid input passed to action ${action.id}, ${errors}`, + ); + } + } + + const tmpDirs = new Array(); + const stepOutput: { [outputName: string]: JsonValue } = {}; + + await action.handler({ + input, + secrets: task.secrets ?? {}, + logger: taskLogger, + logStream: streamLogger, + workspacePath, + createTemporaryDirectory: async () => { + const tmpDir = await fs.mkdtemp(`${workspacePath}_step-${step.id}-`); + tmpDirs.push(tmpDir); + return tmpDir; + }, + output(name: string, value: JsonValue) { + stepOutput[name] = value; + }, + templateInfo: task.spec.templateInfo, + user: task.spec.user, + isDryRun: task.isDryRun, + signal: task.cancelSignal, + }); + + // Remove all temporary directories that were created when executing the action + for (const tmpDir of tmpDirs) { + await fs.remove(tmpDir); + } + + context.steps[step.id] = { output: stepOutput }; + + if (task.cancelSignal.aborted) { + throw new Error(`Step ${step.name} has been cancelled.`); + } + + await stepTrack.markSuccessful(); + } catch (err) { + await taskTrack.markFailed(step, err); + await stepTrack.markFailed(); + throw err; + } + } + async execute(task: TaskContext): Promise { if (!isValidTaskSpec(task.spec)) { throw new InputError( @@ -191,7 +329,12 @@ export class NunjucksWorkflowRunner implements WorkflowRunner { await task.getWorkspaceName(), ); - const { integrations } = this.options; + const { + additionalTemplateFilters, + additionalTemplateGlobals, + integrations, + } = this.options; + const renderTemplate = await SecureTemplater.loadRenderer({ // TODO(blam): let's work out how we can deprecate this. // We shouldn't really need to be exposing these now we can deal with @@ -200,8 +343,8 @@ export class NunjucksWorkflowRunner implements WorkflowRunner { parseRepoUrl(url: string) { return parseRepoUrl(url, integrations); }, - additionalTemplateFilters: this.options.additionalTemplateFilters, - additionalTemplateGlobals: this.options.additionalTemplateGlobals, + additionalTemplateFilters, + additionalTemplateGlobals, }); try { @@ -215,126 +358,14 @@ export class NunjucksWorkflowRunner implements WorkflowRunner { }; for (const step of task.spec.steps) { - const stepTrack = await this.tracker.stepStart(task, step); - try { - if (step.if) { - const ifResult = await this.render( - step.if, - context, - renderTemplate, - ); - if (!isTruthy(ifResult)) { - await stepTrack.skipFalsy(); - continue; - } - } - - const action = this.options.actionRegistry.get(step.action); - const { taskLogger, streamLogger } = createStepLogger({ task, step }); - - if (task.isDryRun) { - const redactedSecrets = Object.fromEntries( - Object.entries(task.secrets ?? {}).map(secret => [ - secret[0], - '[REDACTED]', - ]), - ); - const debugInput = - (step.input && - this.render( - step.input, - { - ...context, - secrets: redactedSecrets, - }, - renderTemplate, - )) ?? - {}; - taskLogger.info( - `Running ${ - action.id - } in dry-run mode with inputs (secrets redacted): ${JSON.stringify( - debugInput, - undefined, - 2, - )}`, - ); - if (!action.supportsDryRun) { - await taskTrack.skipDryRun(step, action); - const outputSchema = action.schema?.output; - if (outputSchema) { - context.steps[step.id] = { - output: generateExampleOutput(outputSchema) as { - [name in string]: JsonValue; - }, - }; - } else { - context.steps[step.id] = { output: {} }; - } - continue; - } - } - - // Secrets are only passed when templating the input to actions for security reasons - const input = - (step.input && - this.render( - step.input, - { ...context, secrets: task.secrets ?? {} }, - renderTemplate, - )) ?? - {}; - - if (action.schema?.input) { - const validateResult = validateJsonSchema( - input, - action.schema.input, - ); - if (!validateResult.valid) { - const errors = validateResult.errors.join(', '); - throw new InputError( - `Invalid input passed to action ${action.id}, ${errors}`, - ); - } - } - - const tmpDirs = new Array(); - const stepOutput: { [outputName: string]: JsonValue } = {}; - - await action.handler({ - input, - secrets: task.secrets ?? {}, - logger: taskLogger, - logStream: streamLogger, - workspacePath, - createTemporaryDirectory: async () => { - const tmpDir = await fs.mkdtemp( - `${workspacePath}_step-${step.id}-`, - ); - tmpDirs.push(tmpDir); - return tmpDir; - }, - output(name: string, value: JsonValue) { - stepOutput[name] = value; - }, - templateInfo: task.spec.templateInfo, - user: task.spec.user, - isDryRun: task.isDryRun, - }); - - // Remove all temporary directories that were created when executing the action - for (const tmpDir of tmpDirs) { - await fs.remove(tmpDir); - } - - context.steps[step.id] = { output: stepOutput }; - - await stepTrack.markSuccessful(); - } catch (err) { - await taskTrack.markFailed(step, err); - await stepTrack.markFailed(); - throw err; - } + await this.executeStep( + task, + step, + context, + renderTemplate, + taskTrack, + workspacePath, + ); } const output = this.render(task.spec.output, context, renderTemplate); @@ -380,7 +411,10 @@ function scaffoldingTracker() { template, }); - async function skipDryRun(step: TaskStep, action: TemplateAction) { + async function skipDryRun( + step: TaskStep, + action: TemplateAction, + ) { task.emitLog(`Skipping because ${action.id} does not support dry-run`, { stepId: step.id, status: 'skipped', @@ -409,8 +443,22 @@ function scaffoldingTracker() { taskTimer({ result: 'failed' }); } + async function markCancelled(step: TaskStep) { + await task.emitLog(`Step ${step.id} has been cancelled.`, { + stepId: step.id, + status: 'cancelled', + }); + taskCount.inc({ + template, + user, + result: 'cancelled', + }); + taskTimer({ result: 'cancelled' }); + } + return { skipDryRun, + markCancelled, markSuccessful, markFailed, }; @@ -441,6 +489,15 @@ function scaffoldingTracker() { stepTimer({ result: 'ok' }); } + async function markCancelled() { + stepCount.inc({ + template, + step: step.name, + result: 'cancelled', + }); + stepTimer({ result: 'cancelled' }); + } + async function markFailed() { stepCount.inc({ template, @@ -459,8 +516,9 @@ function scaffoldingTracker() { } return { - markSuccessful, + markCancelled, markFailed, + markSuccessful, skipFalsy, }; } diff --git a/plugins/scaffolder-backend/src/scaffolder/tasks/StorageTaskBroker.ts b/plugins/scaffolder-backend/src/scaffolder/tasks/StorageTaskBroker.ts index d01351d8ae..fc5a724e47 100644 --- a/plugins/scaffolder-backend/src/scaffolder/tasks/StorageTaskBroker.ts +++ b/plugins/scaffolder-backend/src/scaffolder/tasks/StorageTaskBroker.ts @@ -39,8 +39,13 @@ export class TaskManager implements TaskContext { private heartbeatTimeoutId?: ReturnType; - static create(task: CurrentClaimedTask, storage: TaskStore, logger: Logger) { - const agent = new TaskManager(task, storage, logger); + static create( + task: CurrentClaimedTask, + storage: TaskStore, + abortSignal: AbortSignal, + logger: Logger, + ) { + const agent = new TaskManager(task, storage, abortSignal, logger); agent.startTimeout(); return agent; } @@ -49,6 +54,7 @@ export class TaskManager implements TaskContext { private constructor( private readonly task: CurrentClaimedTask, private readonly storage: TaskStore, + private readonly signal: AbortSignal, private readonly logger: Logger, ) {} @@ -56,6 +62,10 @@ export class TaskManager implements TaskContext { return this.task.spec; } + get cancelSignal() { + return this.signal; + } + get secrets() { return this.task.secrets; } @@ -165,6 +175,33 @@ export class StorageTaskBroker implements TaskBroker { private deferredDispatch = defer(); + private async registerCancellable( + taskId: string, + abortController: AbortController, + ) { + let shouldUnsubscribe = false; + const subscription = this.event$({ taskId, after: undefined }).subscribe({ + error: _ => { + subscription.unsubscribe(); + }, + next: ({ events }) => { + for (const event of events) { + if (event.type === 'cancelled') { + abortController.abort(); + shouldUnsubscribe = true; + } + + if (event.type === 'completion') { + shouldUnsubscribe = true; + } + } + if (shouldUnsubscribe) { + subscription.unsubscribe(); + } + }, + }); + } + /** * {@inheritdoc TaskBroker.claim} */ @@ -172,6 +209,8 @@ export class StorageTaskBroker implements TaskBroker { for (;;) { const pendingTask = await this.storage.claimTask(); if (pendingTask) { + const abortController = new AbortController(); + await this.registerCancellable(pendingTask.id, abortController); return TaskManager.create( { taskId: pendingTask.id, @@ -180,6 +219,7 @@ export class StorageTaskBroker implements TaskBroker { createdBy: pendingTask.createdBy, }, this.storage, + abortController.signal, this.logger, ); } @@ -271,4 +311,24 @@ export class StorageTaskBroker implements TaskBroker { this.deferredDispatch.resolve(); this.deferredDispatch = defer(); } + + async cancel(taskId: string) { + const { events } = await this.storage.listEvents({ taskId }); + const currentStepId = + events.length > 0 + ? events + .filter(({ body }) => body?.stepId) + .reduce((prev, curr) => (prev.id > curr.id ? prev : curr)).body + .stepId + : 0; + + await this.storage.cancelTask?.({ + taskId, + body: { + message: `Step ${currentStepId} has been cancelled.`, + stepId: currentStepId, + status: 'cancelled', + }, + }); + } } diff --git a/plugins/scaffolder-backend/src/scaffolder/tasks/TaskWorker.test.ts b/plugins/scaffolder-backend/src/scaffolder/tasks/TaskWorker.test.ts index d39671cb67..e886b31369 100644 --- a/plugins/scaffolder-backend/src/scaffolder/tasks/TaskWorker.test.ts +++ b/plugins/scaffolder-backend/src/scaffolder/tasks/TaskWorker.test.ts @@ -15,7 +15,7 @@ */ import os from 'os'; -import { getVoidLogger, DatabaseManager } from '@backstage/backend-common'; +import { DatabaseManager, getVoidLogger } from '@backstage/backend-common'; import { ConfigReader } from '@backstage/config'; import { DatabaseTaskStore } from './DatabaseTaskStore'; import { StorageTaskBroker } from './StorageTaskBroker'; @@ -23,7 +23,14 @@ import { TaskWorker, TaskWorkerOptions } from './TaskWorker'; import { ScmIntegrations } from '@backstage/integration'; import { TemplateActionRegistry } from '../actions'; import { NunjucksWorkflowRunner } from './NunjucksWorkflowRunner'; -import { TaskBroker, TaskContext, WorkflowRunner } from './types'; +import { + SerializedTaskEvent, + TaskBroker, + TaskContext, + WorkflowRunner, +} from './types'; +import ObservableImpl from 'zen-observable'; +import waitForExpect from 'wait-for-expect'; jest.mock('./NunjucksWorkflowRunner'); const MockedNunjucksWorkflowRunner = @@ -198,6 +205,67 @@ describe('Concurrent TaskWorker', () => { }); }); +describe('Cancellable TaskWorker', () => { + let storage: DatabaseTaskStore; + const integrations: ScmIntegrations = {} as ScmIntegrations; + const actionRegistry: TemplateActionRegistry = {} as TemplateActionRegistry; + const workingDirectory = os.tmpdir(); + + let myTask: TaskContext | undefined = undefined; + + const workflowRunner: NunjucksWorkflowRunner = { + execute: (task: TaskContext) => { + myTask = task; + }, + } as unknown as NunjucksWorkflowRunner; + + beforeAll(async () => { + storage = await createStore(); + }); + + beforeEach(() => { + jest.resetAllMocks(); + MockedNunjucksWorkflowRunner.mockImplementation(() => workflowRunner); + }); + + const logger = getVoidLogger(); + + it('should be able to cancel the running task', async () => { + const taskBroker = new StorageTaskBroker(storage, logger); + const taskWorker = await TaskWorker.create({ + logger, + workingDirectory, + integrations, + taskBroker, + actionRegistry, + }); + + const steps = [...Array(10)].map(n => ({ + id: `test${n}`, + name: `test${n}`, + action: 'not-found-action', + })); + + const { taskId } = await taskBroker.dispatch({ + spec: { + apiVersion: 'scaffolder.backstage.io/v1beta3', + steps, + output: { + result: '{{ steps.test.output.testOutput }}', + }, + parameters: {}, + }, + }); + + await taskWorker.start(); + await taskBroker.cancel(taskId); + + await waitForExpect(() => { + expect(myTask?.cancelSignal.aborted).toBeTruthy(); + }); + }); +}); + describe('TaskWorker internals', () => { const TaskWorkerConstructor = TaskWorker as unknown as { new (options: TaskWorkerOptions): TaskWorker; @@ -219,10 +287,24 @@ describe('TaskWorker internals', () => { }, }; + const subscribers = new Set< + ZenObservable.SubscriptionObserver<{ events: SerializedTaskEvent[] }> + >(); + let claimedTaskCount = 0; const taskWorker = new TaskWorkerConstructor({ runners: { workflowRunner }, taskBroker: { + event$() { + return new ObservableImpl<{ events: SerializedTaskEvent[] }>( + subscriber => { + subscribers.add(subscriber); + return () => { + subscribers.delete(subscriber); + }; + }, + ); + }, async claim() { claimedTaskCount++; return { @@ -233,7 +315,7 @@ describe('TaskWorker internals', () => { async complete(_result, _metadata) {}, } as TaskContext; }, - } as TaskBroker, + } as unknown as TaskBroker, concurrentTasksLimit: 2, }); diff --git a/plugins/scaffolder-backend/src/scaffolder/tasks/TaskWorker.ts b/plugins/scaffolder-backend/src/scaffolder/tasks/TaskWorker.ts index 82829665a3..5723e7136f 100644 --- a/plugins/scaffolder-backend/src/scaffolder/tasks/TaskWorker.ts +++ b/plugins/scaffolder-backend/src/scaffolder/tasks/TaskWorker.ts @@ -21,10 +21,7 @@ import { Logger } from 'winston'; import { TemplateActionRegistry } from '../actions'; import { ScmIntegrations } from '@backstage/integration'; import { assertError } from '@backstage/errors'; -import { - TemplateFilter, - TemplateGlobal, -} from '../../lib/templating/SecureTemplater'; +import { TemplateFilter, TemplateGlobal } from '../../lib'; /** * TaskWorkerOptions diff --git a/plugins/scaffolder-backend/src/scaffolder/tasks/types.ts b/plugins/scaffolder-backend/src/scaffolder/tasks/types.ts index 5a91802f3e..112276b9dd 100644 --- a/plugins/scaffolder-backend/src/scaffolder/tasks/types.ts +++ b/plugins/scaffolder-backend/src/scaffolder/tasks/types.ts @@ -15,8 +15,9 @@ */ import { JsonValue, JsonObject, Observable } from '@backstage/types'; -import { TaskSpec } from '@backstage/plugin-scaffolder-common'; +import { TaskSpec, TaskStep } from '@backstage/plugin-scaffolder-common'; import { TaskSecrets } from '@backstage/plugin-scaffolder-node'; +import { TemplateAction } from '@backstage/plugin-scaffolder-node'; /** * The status of each step of the Task @@ -24,11 +25,11 @@ import { TaskSecrets } from '@backstage/plugin-scaffolder-node'; * @public */ export type TaskStatus = - | 'open' - | 'processing' - | 'failed' | 'cancelled' - | 'completed'; + | 'completed' + | 'failed' + | 'open' + | 'processing'; /** * The state of a completed task. @@ -57,7 +58,7 @@ export type SerializedTask = { * * @public */ -export type TaskEventType = 'completion' | 'log'; +export type TaskEventType = 'completion' | 'log' | 'cancelled'; /** * SerializedTaskEvent @@ -99,13 +100,17 @@ export type TaskBrokerDispatchOptions = { * @public */ export interface TaskContext { + cancelSignal: AbortSignal; spec: TaskSpec; secrets?: TaskSecrets; createdBy?: string; done: boolean; isDryRun?: boolean; - emitLog(message: string, logMetadata?: JsonObject): Promise; + complete(result: TaskCompletionState, metadata?: JsonObject): Promise; + + emitLog(message: string, logMetadata?: JsonObject): Promise; + getWorkspaceName(): Promise; } @@ -115,16 +120,23 @@ export interface TaskContext { * @public */ export interface TaskBroker { + cancel?(taskId: string): Promise; + claim(): Promise; + dispatch( options: TaskBrokerDispatchOptions, ): Promise; + vacuumTasks(options: { timeoutS: number }): Promise; + event$(options: { taskId: string; after: number | undefined; }): Observable<{ events: SerializedTaskEvent[] }>; + get(taskId: string): Promise; + list?(options?: { createdBy?: string }): Promise<{ tasks: SerializedTask[] }>; } @@ -181,30 +193,51 @@ export type TaskStoreCreateTaskResult = { * @public */ export interface TaskStore { + cancelTask?(options: TaskStoreEmitOptions): Promise; + createTask( options: TaskStoreCreateTaskOptions, ): Promise; + getTask(taskId: string): Promise; + claimTask(): Promise; + completeTask(options: { taskId: string; status: TaskStatus; eventBody: JsonObject; }): Promise; + heartbeatTask(taskId: string): Promise; + listStaleTasks(options: { timeoutS: number }): Promise<{ tasks: { taskId: string }[]; }>; + list?(options: { createdBy?: string }): Promise<{ tasks: SerializedTask[] }>; emitLogEvent(options: TaskStoreEmitOptions): Promise; + listEvents( options: TaskStoreListEventsOptions, ): Promise<{ events: SerializedTaskEvent[] }>; + shutdownTask?(options: TaskStoreShutDownTaskOptions): Promise; } export type WorkflowResponse = { output: { [key: string]: JsonValue } }; + export interface WorkflowRunner { execute(task: TaskContext): Promise; } + +export type TaskTrackType = { + markCancelled: (step: TaskStep) => Promise; + markFailed: (step: TaskStep, err: Error) => Promise; + markSuccessful: () => Promise; + skipDryRun: ( + step: TaskStep, + action: TemplateAction, + ) => Promise; +}; diff --git a/plugins/scaffolder-backend/src/service/router.ts b/plugins/scaffolder-backend/src/service/router.ts index e40958c778..b2be3e2749 100644 --- a/plugins/scaffolder-backend/src/service/router.ts +++ b/plugins/scaffolder-backend/src/service/router.ts @@ -94,14 +94,11 @@ function isSupportedTemplate(entity: TemplateEntityV1beta3) { * until someone explicitly passes an IdentityApi. When we have reasonable confidence that most backstage deployments * are using the IdentityApi, we can remove this function. */ -function buildDefaultIdentityClient({ - logger, -}: { - logger: Logger; -}): IdentityApi { +function buildDefaultIdentityClient(options: RouterOptions): IdentityApi { return { getIdentity: async ({ request }: IdentityApiGetIdentityRequest) => { const header = request.headers.authorization; + const { logger } = options; if (!header) { return undefined; @@ -131,6 +128,10 @@ function buildDefaultIdentityClient({ throw new TypeError('Expected string sub claim'); } + if (sub === 'backstage-server') { + return undefined; + } + // Check that it's a valid ref, otherwise this will throw. parseEntityRef(sub); @@ -178,8 +179,7 @@ export async function createRouter( const logger = parentLogger.child({ plugin: 'scaffolder' }); const identity: IdentityApi = - options.identity || buildDefaultIdentityClient({ logger }); - + options.identity || buildDefaultIdentityClient(options); const workingDirectory = await getWorkingDirectory(config, logger); const integrations = ScmIntegrations.fromConfig(config); @@ -414,6 +414,11 @@ export async function createRouter( delete task.secrets; res.status(200).json(task); }) + .post('/v2/tasks/:taskId/cancel', async (req, res) => { + const { taskId } = req.params; + await taskBroker.cancel?.(taskId); + res.status(200).json({ status: 'cancelled' }); + }) .get('/v2/tasks/:taskId/eventstream', async (req, res) => { const { taskId } = req.params; const after = diff --git a/plugins/scaffolder-node/CHANGELOG.md b/plugins/scaffolder-node/CHANGELOG.md index 6668baa16e..37b9613524 100644 --- a/plugins/scaffolder-node/CHANGELOG.md +++ b/plugins/scaffolder-node/CHANGELOG.md @@ -1,5 +1,12 @@ # @backstage/plugin-scaffolder-node +## 0.1.1-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.4.1-next.2 + ## 0.1.1-next.1 ### Patch Changes diff --git a/plugins/scaffolder-node/api-report.md b/plugins/scaffolder-node/api-report.md index 89b7171ef9..d5b9b73767 100644 --- a/plugins/scaffolder-node/api-report.md +++ b/plugins/scaffolder-node/api-report.md @@ -30,6 +30,7 @@ export type ActionContext = { entity?: UserEntity; ref?: string; }; + signal?: AbortSignal; }; // @public diff --git a/plugins/scaffolder-node/package.json b/plugins/scaffolder-node/package.json index ddb2f24083..8978c155bf 100644 --- a/plugins/scaffolder-node/package.json +++ b/plugins/scaffolder-node/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-scaffolder-node", "description": "The plugin-scaffolder-node module for @backstage/plugin-scaffolder-backend", - "version": "0.1.1-next.1", + "version": "0.1.1-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/scaffolder-node/src/actions/types.ts b/plugins/scaffolder-node/src/actions/types.ts index cce149adbe..8827aaf98c 100644 --- a/plugins/scaffolder-node/src/actions/types.ts +++ b/plugins/scaffolder-node/src/actions/types.ts @@ -60,6 +60,11 @@ export type ActionContext = { */ ref?: string; }; + + /** + * Implement the signal to make your custom step abortable https://developer.mozilla.org/en-US/docs/Web/API/AbortController/signal + */ + signal?: AbortSignal; }; /** @public */ diff --git a/plugins/scaffolder-react/CHANGELOG.md b/plugins/scaffolder-react/CHANGELOG.md index d81194d2aa..25385e4816 100644 --- a/plugins/scaffolder-react/CHANGELOG.md +++ b/plugins/scaffolder-react/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-scaffolder-react +## 1.2.0-next.2 + +### Patch Changes + +- 65454876fb2: Minor API report tweaks +- 3c96e77b513: Make scaffolder adhere to page themes by using page `fontColor` consistently. If your theme overwrites template list or card headers, review those styles. +- d9893263ba9: scaffolder/next: Fix for steps without properties +- Updated dependencies + - @backstage/core-components@0.12.5-next.2 + - @backstage/plugin-catalog-react@1.4.0-next.2 + - @backstage/core-plugin-api@1.5.0-next.2 + ## 1.2.0-next.1 ### Minor Changes diff --git a/plugins/scaffolder-react/api-report.md b/plugins/scaffolder-react/api-report.md index 0fbc8d0eed..da8309d5ec 100644 --- a/plugins/scaffolder-react/api-report.md +++ b/plugins/scaffolder-react/api-report.md @@ -113,7 +113,7 @@ export type ListActionsResponse = Array; // @public export type LogEvent = { - type: 'log' | 'completion'; + type: 'log' | 'completion' | 'cancelled'; body: { message: string; stepId?: string; @@ -126,6 +126,7 @@ export type LogEvent = { // @public export interface ScaffolderApi { + cancelTask(taskId: string): Promise; // (undocumented) dryRun?(options: ScaffolderDryRunOptions): Promise; // (undocumented) @@ -266,10 +267,11 @@ export type ScaffolderTaskOutput = { // @public export type ScaffolderTaskStatus = + | 'cancelled' + | 'completed' + | 'failed' | 'open' | 'processing' - | 'failed' - | 'completed' | 'skipped'; // @public @@ -287,6 +289,7 @@ export const SecretsContextProvider: ( // @public export type TaskStream = { + cancelled: boolean; loading: boolean; error?: Error; stepLogs: { diff --git a/plugins/scaffolder-react/package.json b/plugins/scaffolder-react/package.json index 2a22881306..4e0cb590e4 100644 --- a/plugins/scaffolder-react/package.json +++ b/plugins/scaffolder-react/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-scaffolder-react", "description": "A frontend library that helps other Backstage plugins interact with the Scaffolder", - "version": "1.2.0-next.1", + "version": "1.2.0-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/scaffolder-react/src/api/types.ts b/plugins/scaffolder-react/src/api/types.ts index 0a517e7bff..b39555c14f 100644 --- a/plugins/scaffolder-react/src/api/types.ts +++ b/plugins/scaffolder-react/src/api/types.ts @@ -24,10 +24,11 @@ import { TemplateParameterSchema } from '../types'; * @public */ export type ScaffolderTaskStatus = + | 'cancelled' + | 'completed' + | 'failed' | 'open' | 'processing' - | 'failed' - | 'completed' | 'skipped'; /** @@ -96,7 +97,7 @@ export type ScaffolderTaskOutput = { * @public */ export type LogEvent = { - type: 'log' | 'completion'; + type: 'log' | 'completion' | 'cancelled'; body: { message: string; stepId?: string; @@ -196,6 +197,13 @@ export interface ScaffolderApi { getTask(taskId: string): Promise; + /** + * Sends a signal to a task broker to cancel the running task by taskId. + * + * @param taskId - the id of the task + */ + cancelTask(taskId: string): Promise; + listTasks?(options: { filterByOwnership: 'owned' | 'all'; }): Promise<{ tasks: ScaffolderTask[] }>; diff --git a/plugins/scaffolder-react/src/hooks/useEventStream.ts b/plugins/scaffolder-react/src/hooks/useEventStream.ts index d8c9cf4c1f..ec49911471 100644 --- a/plugins/scaffolder-react/src/hooks/useEventStream.ts +++ b/plugins/scaffolder-react/src/hooks/useEventStream.ts @@ -44,6 +44,7 @@ export type ScaffolderStep = { * @public */ export type TaskStream = { + cancelled: boolean; loading: boolean; error?: Error; stepLogs: { [stepId in string]: string[] }; @@ -66,6 +67,7 @@ type ReducerLogEntry = { type ReducerAction = | { type: 'INIT'; data: ScaffolderTask } + | { type: 'CANCELLED' } | { type: 'LOGS'; data: ReducerLogEntry[] } | { type: 'COMPLETED'; data: ReducerLogEntry } | { type: 'ERROR'; data: Error }; @@ -111,7 +113,7 @@ function reducer(draft: TaskStream, action: ReducerAction) { } if ( - ['cancelled', 'failed', 'completed'].includes(currentStep.status) + ['cancelled', 'completed', 'failed'].includes(currentStep.status) ) { currentStep.endedAt = entry.createdAt; } @@ -131,6 +133,11 @@ function reducer(draft: TaskStream, action: ReducerAction) { return; } + case 'CANCELLED': { + draft.cancelled = true; + return; + } + case 'ERROR': { draft.error = action.data; draft.loading = false; @@ -151,6 +158,7 @@ function reducer(draft: TaskStream, action: ReducerAction) { export const useTaskEventStream = (taskId: string): TaskStream => { const scaffolderApi = useApi(scaffolderApiRef); const [state, dispatch] = useImmerReducer(reducer, { + cancelled: false, loading: true, completed: false, stepLogs: {} as { [stepId in string]: string[] }, @@ -196,6 +204,9 @@ export const useTaskEventStream = (taskId: string): TaskStream => { switch (event.type) { case 'log': return collectedLogEvents.push(event); + case 'cancelled': + dispatch({ type: 'CANCELLED' }); + return undefined; case 'completion': emitLogs(); dispatch({ type: 'COMPLETED', data: event }); diff --git a/plugins/scaffolder-react/src/next/components/Workflow/Workflow.test.tsx b/plugins/scaffolder-react/src/next/components/Workflow/Workflow.test.tsx index 03604881d2..81c5a697e0 100644 --- a/plugins/scaffolder-react/src/next/components/Workflow/Workflow.test.tsx +++ b/plugins/scaffolder-react/src/next/components/Workflow/Workflow.test.tsx @@ -24,10 +24,10 @@ import { act, fireEvent } from '@testing-library/react'; import React from 'react'; import { Workflow } from './Workflow'; import { analyticsApiRef } from '@backstage/core-plugin-api'; -import { ScaffolderApi } from '../../../api/types'; -import { scaffolderApiRef } from '../../../api/ref'; +import { ScaffolderApi, scaffolderApiRef } from '../../../api'; const scaffolderApiMock: jest.Mocked = { + cancelTask: jest.fn(), scaffold: jest.fn(), getTemplateParameterSchema: jest.fn(), getIntegrationsList: jest.fn(), diff --git a/plugins/scaffolder/CHANGELOG.md b/plugins/scaffolder/CHANGELOG.md index a0a6d7b750..d3c377154e 100644 --- a/plugins/scaffolder/CHANGELOG.md +++ b/plugins/scaffolder/CHANGELOG.md @@ -1,5 +1,26 @@ # @backstage/plugin-scaffolder +## 1.12.0-next.2 + +### Minor Changes + +- 0d61fcca9c3: Update `EntityPicker` to use the fully qualified entity ref instead of the humanized version. + +### Patch Changes + +- 65454876fb2: Minor API report tweaks +- 3c96e77b513: Make scaffolder adhere to page themes by using page `fontColor` consistently. If your theme overwrites template list or card headers, review those styles. +- 0aae4596296: Fix the scaffolder validator for arrays when the item is a field in the object +- Updated dependencies + - @backstage/core-components@0.12.5-next.2 + - @backstage/plugin-scaffolder-react@1.2.0-next.2 + - @backstage/plugin-catalog-react@1.4.0-next.2 + - @backstage/core-plugin-api@1.5.0-next.2 + - @backstage/integration-react@1.1.11-next.2 + - @backstage/plugin-permission-react@0.4.11-next.2 + - @backstage/config@1.0.7-next.0 + - @backstage/integration@1.4.3-next.0 + ## 1.12.0-next.1 ### Minor Changes diff --git a/plugins/scaffolder/api-report.md b/plugins/scaffolder/api-report.md index 6b8d6d345f..45d0b2675c 100644 --- a/plugins/scaffolder/api-report.md +++ b/plugins/scaffolder/api-report.md @@ -360,6 +360,8 @@ export class ScaffolderClient implements ScaffolderApi_2 { useLongPollingLogs?: boolean; }); // (undocumented) + cancelTask(taskId: string): Promise; + // (undocumented) dryRun( options: ScaffolderDryRunOptions_2, ): Promise; diff --git a/plugins/scaffolder/package.json b/plugins/scaffolder/package.json index 8258dceab9..7d939a3d1e 100644 --- a/plugins/scaffolder/package.json +++ b/plugins/scaffolder/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-scaffolder", "description": "The Backstage plugin that helps you create new things", - "version": "1.12.0-next.1", + "version": "1.12.0-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/scaffolder/src/api.ts b/plugins/scaffolder/src/api.ts index 15bd1925b3..7a3f6c14bb 100644 --- a/plugins/scaffolder/src/api.ts +++ b/plugins/scaffolder/src/api.ts @@ -229,24 +229,22 @@ export class ScaffolderClient implements ScaffolderApi { const url = `${baseUrl}/v2/tasks/${encodeURIComponent( taskId, )}/eventstream`; + + const processEvent = (event: any) => { + if (event.data) { + try { + subscriber.next(JSON.parse(event.data)); + } catch (ex) { + subscriber.error(ex); + } + } + }; + const eventSource = new EventSource(url, { withCredentials: true }); - eventSource.addEventListener('log', (event: any) => { - if (event.data) { - try { - subscriber.next(JSON.parse(event.data)); - } catch (ex) { - subscriber.error(ex); - } - } - }); + eventSource.addEventListener('log', processEvent); + eventSource.addEventListener('cancelled', processEvent); eventSource.addEventListener('completion', (event: any) => { - if (event.data) { - try { - subscriber.next(JSON.parse(event.data)); - } catch (ex) { - subscriber.error(ex); - } - } + processEvent(event); eventSource.close(); subscriber.complete(); }); @@ -310,4 +308,19 @@ export class ScaffolderClient implements ScaffolderApi { return await response.json(); } + + async cancelTask(taskId: string): Promise { + const baseUrl = await this.discoveryApi.getBaseUrl('scaffolder'); + const url = `${baseUrl}/v2/tasks/${encodeURIComponent(taskId)}/cancel`; + + const response = await this.fetchApi.fetch(url, { + method: 'POST', + }); + + if (!response.ok) { + throw await ResponseError.fromResponse(response); + } + + return await response.json(); + } } diff --git a/plugins/scaffolder/src/components/ActionsPage/ActionsPage.test.tsx b/plugins/scaffolder/src/components/ActionsPage/ActionsPage.test.tsx index 552d0cea6a..90f6f9b393 100644 --- a/plugins/scaffolder/src/components/ActionsPage/ActionsPage.test.tsx +++ b/plugins/scaffolder/src/components/ActionsPage/ActionsPage.test.tsx @@ -25,6 +25,7 @@ import { rootRouteRef } from '../../routes'; const scaffolderApiMock: jest.Mocked = { scaffold: jest.fn(), + cancelTask: jest.fn(), getTemplateParameterSchema: jest.fn(), getIntegrationsList: jest.fn(), getTask: jest.fn(), diff --git a/plugins/scaffolder/src/components/TaskPage/TaskPage.tsx b/plugins/scaffolder/src/components/TaskPage/TaskPage.tsx index f78d48e686..78cdc5d935 100644 --- a/plugins/scaffolder/src/components/TaskPage/TaskPage.tsx +++ b/plugins/scaffolder/src/components/TaskPage/TaskPage.tsx @@ -19,11 +19,15 @@ import { Content, ErrorPage, Header, - Page, LogViewer, + Page, Progress, } from '@backstage/core-components'; -import { useRouteRef, useRouteRefParams } from '@backstage/core-plugin-api'; +import { + useApi, + useRouteRef, + useRouteRefParams, +} from '@backstage/core-plugin-api'; import { BackstageTheme } from '@backstage/theme'; import { Button, @@ -59,6 +63,7 @@ import { scaffolderTaskRouteRef, selectedTemplateRouteRef, } from '../../routes'; +import { scaffolderApiRef } from '@backstage/plugin-scaffolder-react'; // typings are wrong for this library, so fallback to not parsing types. const humanizeDuration = require('humanize-duration'); @@ -188,9 +193,10 @@ export const TaskStatusStepper = memo( nonLinear > {steps.map((step, index) => { + const isCancelled = step.status === 'cancelled'; + const isActive = step.status === 'processing'; const isCompleted = step.status === 'completed'; const isFailed = step.status === 'failed'; - const isActive = step.status === 'processing'; const isSkipped = step.status === 'skipped'; return ( @@ -199,7 +205,7 @@ export const TaskStatusStepper = memo( { const { loadingText } = props; - const classes = useStyles(); const navigate = useNavigate(); const rootPath = useRouteRef(rootRouteRef); + const scaffolderApi = useApi(scaffolderApiRef); const templateRoute = useRouteRef(selectedTemplateRouteRef); const [userSelectedStepId, setUserSelectedStepId] = useState< string | undefined >(undefined); + const [clickedToCancel, setClickedToCancel] = useState(false); const [lastActiveStepId, setLastActiveStepId] = useState( undefined, ); const { taskId } = useRouteRefParams(scaffolderTaskRouteRef); const taskStream = useTaskEventStream(taskId); const completed = taskStream.completed; + const taskCancelled = taskStream.cancelled; const steps = useMemo( () => taskStream.task?.spec.steps.map(step => ({ @@ -295,9 +302,7 @@ export const TaskPage = (props: TaskPageProps) => { }, [taskStream.stepLogs, currentStepId, loadingText]); const taskNotFound = - taskStream.completed === true && - taskStream.loading === false && - !taskStream.task; + taskStream.completed && !taskStream.loading && !taskStream.task; const { output } = taskStream; @@ -320,6 +325,11 @@ export const TaskPage = (props: TaskPageProps) => { ); }; + const handleCancel = async () => { + setClickedToCancel(true); + await scaffolderApi.cancelTask(taskId); + }; + return (
{ > Start Over + diff --git a/plugins/scaffolder/src/components/TemplatePage/TemplatePage.test.tsx b/plugins/scaffolder/src/components/TemplatePage/TemplatePage.test.tsx index b4358146fd..344929fa43 100644 --- a/plugins/scaffolder/src/components/TemplatePage/TemplatePage.test.tsx +++ b/plugins/scaffolder/src/components/TemplatePage/TemplatePage.test.tsx @@ -47,6 +47,7 @@ jest.mock('react-router-dom', () => { }); const scaffolderApiMock: jest.Mocked = { + cancelTask: jest.fn(), scaffold: jest.fn(), getTemplateParameterSchema: jest.fn(), getIntegrationsList: jest.fn(), @@ -338,10 +339,7 @@ describe('TemplatePage', () => { it('should display a section or property based on a feature flag', async () => { featureFlagsApiMock.isActive.mockImplementation(flag => { - if (flag === 'experimental-feature') { - return true; - } - return false; + return flag === 'experimental-feature'; }); scaffolderApiMock.getTemplateParameterSchema.mockResolvedValue( schemaMockValue, diff --git a/plugins/scaffolder/src/next/OngoingTask/ContextMenu.tsx b/plugins/scaffolder/src/next/OngoingTask/ContextMenu.tsx index d4c771a9f8..985dd98903 100644 --- a/plugins/scaffolder/src/next/OngoingTask/ContextMenu.tsx +++ b/plugins/scaffolder/src/next/OngoingTask/ContextMenu.tsx @@ -23,15 +23,21 @@ import { MenuList, Popover, } from '@material-ui/core'; +import { useAsync } from '@react-hookz/web'; +import Cancel from '@material-ui/icons/Cancel'; import Retry from '@material-ui/icons/Repeat'; import Toc from '@material-ui/icons/Toc'; import MoreVert from '@material-ui/icons/MoreVert'; import React, { useState } from 'react'; +import { useApi } from '@backstage/core-plugin-api'; +import { scaffolderApiRef } from '@backstage/plugin-scaffolder-react'; type ContextMenuProps = { + cancelEnabled?: boolean; logsVisible?: boolean; - onToggleLogs?: (state: boolean) => void; onStartOver?: () => void; + onToggleLogs?: (state: boolean) => void; + taskId?: string; }; const useStyles = makeStyles((theme: BackstageTheme) => ({ @@ -41,10 +47,18 @@ const useStyles = makeStyles((theme: BackstageTheme) => ({ })); export const ContextMenu = (props: ContextMenuProps) => { - const { logsVisible, onToggleLogs, onStartOver } = props; + const { cancelEnabled, logsVisible, onStartOver, onToggleLogs, taskId } = + props; const classes = useStyles(); + const scaffolderApi = useApi(scaffolderApiRef); const [anchorEl, setAnchorEl] = useState(); + const [{ status: cancelStatus }, { execute: cancel }] = useAsync(async () => { + if (taskId) { + await scaffolderApi.cancelTask(taskId); + } + }); + return ( <> { + + + + + + diff --git a/plugins/scaffolder/src/next/OngoingTask/OngoingTask.test.tsx b/plugins/scaffolder/src/next/OngoingTask/OngoingTask.test.tsx new file mode 100644 index 0000000000..9e9212b9e8 --- /dev/null +++ b/plugins/scaffolder/src/next/OngoingTask/OngoingTask.test.tsx @@ -0,0 +1,84 @@ +/* + * Copyright 2022 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { OngoingTask } from './OngoingTask'; +import React from 'react'; +import { renderInTestApp, TestApiProvider } from '@backstage/test-utils'; +import { scaffolderApiRef } from '@backstage/plugin-scaffolder-react'; +import { act, fireEvent, waitFor } from '@testing-library/react'; +import { nextRouteRef } from '../routes'; + +jest.mock('react-router-dom', () => ({ + ...jest.requireActual('react-router-dom'), + useParams: () => ({ taskId: 'my-task' }), +})); + +jest.mock('@backstage/plugin-scaffolder-react', () => ({ + ...jest.requireActual('@backstage/plugin-scaffolder-react'), + useTaskEventStream: () => ({ + cancelled: false, + loading: true, + stepLogs: {}, + completed: false, + steps: {}, + task: { + spec: { + steps: [], + templateInfo: { entity: { metadata: { name: 'my-template' } } }, + }, + }, + }), +})); + +describe('OngoingTask', () => { + const mockScaffolderApi = { + cancelTask: jest.fn(), + getTask: jest.fn().mockImplementation(async () => {}), + }; + + beforeEach(() => { + jest.clearAllMocks(); + }); + + it('should trigger cancel api on "Cancel" click in context menu', async () => { + const cancelOptionLabel = 'Cancel'; + const rendered = await renderInTestApp( + + + , + { mountedRoutes: { '/': nextRouteRef } }, + ); + const { getByText, getByTestId } = rendered; + + await act(async () => { + fireEvent.click(getByTestId('menu-button')); + }); + expect(getByTestId('cancel-task')).not.toHaveClass('Mui-disabled'); + + await act(async () => { + fireEvent.click(getByText(cancelOptionLabel)); + }); + + expect(mockScaffolderApi.cancelTask).toHaveBeenCalled(); + await act(async () => { + fireEvent.click(getByTestId('menu-button')); + }); + + await waitFor(() => { + expect(getByTestId('cancel-task')).toHaveClass('Mui-disabled'); + }); + }); +}); diff --git a/plugins/scaffolder/src/next/OngoingTask/OngoingTask.tsx b/plugins/scaffolder/src/next/OngoingTask/OngoingTask.tsx index fc1c1a7413..9c64e2179b 100644 --- a/plugins/scaffolder/src/next/OngoingTask/OngoingTask.tsx +++ b/plugins/scaffolder/src/next/OngoingTask/OngoingTask.tsx @@ -13,8 +13,8 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import React, { useEffect, useMemo, useState, useCallback } from 'react'; -import { Page, Header, Content, ErrorPanel } from '@backstage/core-components'; +import React, { useCallback, useEffect, useMemo, useState } from 'react'; +import { Content, ErrorPanel, Header, Page } from '@backstage/core-components'; import { useNavigate, useParams } from 'react-router-dom'; import { Box, makeStyles, Paper } from '@material-ui/core'; import { @@ -105,6 +105,8 @@ export const OngoingTask = (props: { const templateName = taskStream.task?.spec.templateInfo?.entity?.metadata.name; + const cancelEnabled = !(taskStream.cancelled || taskStream.completed); + return (
diff --git a/plugins/scaffolder/src/next/TemplateWizardPage/TemplateWizardPage.test.tsx b/plugins/scaffolder/src/next/TemplateWizardPage/TemplateWizardPage.test.tsx index c4f9c75ceb..da4112979c 100644 --- a/plugins/scaffolder/src/next/TemplateWizardPage/TemplateWizardPage.test.tsx +++ b/plugins/scaffolder/src/next/TemplateWizardPage/TemplateWizardPage.test.tsx @@ -41,6 +41,7 @@ jest.mock('react-router-dom', () => { }); const scaffolderApiMock: jest.Mocked = { + cancelTask: jest.fn(), scaffold: jest.fn(), getTemplateParameterSchema: jest.fn(), getIntegrationsList: jest.fn(), diff --git a/plugins/search-backend-module-elasticsearch/CHANGELOG.md b/plugins/search-backend-module-elasticsearch/CHANGELOG.md index 5e1d423f65..8576e6602c 100644 --- a/plugins/search-backend-module-elasticsearch/CHANGELOG.md +++ b/plugins/search-backend-module-elasticsearch/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-search-backend-module-elasticsearch +## 1.1.4-next.2 + +### Patch Changes + +- 65454876fb2: Minor API report tweaks +- Updated dependencies + - @backstage/plugin-search-backend-node@1.1.4-next.2 + - @backstage/config@1.0.7-next.0 + ## 1.1.4-next.1 ### Patch Changes diff --git a/plugins/search-backend-module-elasticsearch/package.json b/plugins/search-backend-module-elasticsearch/package.json index 7dbc84251d..6520571ec6 100644 --- a/plugins/search-backend-module-elasticsearch/package.json +++ b/plugins/search-backend-module-elasticsearch/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-search-backend-module-elasticsearch", "description": "A module for the search backend that implements search using ElasticSearch", - "version": "1.1.4-next.1", + "version": "1.1.4-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/search-backend-module-pg/CHANGELOG.md b/plugins/search-backend-module-pg/CHANGELOG.md index 2284fb17dd..db32c01817 100644 --- a/plugins/search-backend-module-pg/CHANGELOG.md +++ b/plugins/search-backend-module-pg/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-search-backend-module-pg +## 0.5.4-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.3-next.2 + - @backstage/plugin-search-backend-node@1.1.4-next.2 + - @backstage/config@1.0.7-next.0 + ## 0.5.4-next.1 ### Patch Changes diff --git a/plugins/search-backend-module-pg/package.json b/plugins/search-backend-module-pg/package.json index a9e09db620..c6513c8e27 100644 --- a/plugins/search-backend-module-pg/package.json +++ b/plugins/search-backend-module-pg/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-search-backend-module-pg", "description": "A module for the search backend that implements search using PostgreSQL", - "version": "0.5.4-next.1", + "version": "0.5.4-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/search-backend-node/CHANGELOG.md b/plugins/search-backend-node/CHANGELOG.md index 87c8390e7c..5fcd3bd0fa 100644 --- a/plugins/search-backend-node/CHANGELOG.md +++ b/plugins/search-backend-node/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-search-backend-node +## 1.1.4-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-tasks@0.5.0-next.2 + - @backstage/backend-common@0.18.3-next.2 + - @backstage/config@1.0.7-next.0 + ## 1.1.4-next.1 ### Patch Changes diff --git a/plugins/search-backend-node/package.json b/plugins/search-backend-node/package.json index 593d459cb3..d86be92e92 100644 --- a/plugins/search-backend-node/package.json +++ b/plugins/search-backend-node/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-search-backend-node", "description": "A library for Backstage backend plugins that want to interact with the search backend plugin", - "version": "1.1.4-next.1", + "version": "1.1.4-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/search-backend/CHANGELOG.md b/plugins/search-backend/CHANGELOG.md index 29bc3ea9d3..513ee4536a 100644 --- a/plugins/search-backend/CHANGELOG.md +++ b/plugins/search-backend/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-search-backend +## 1.2.4-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.2.12-next.2 + - @backstage/backend-common@0.18.3-next.2 + - @backstage/plugin-permission-node@0.7.6-next.2 + - @backstage/plugin-search-backend-node@1.1.4-next.2 + - @backstage/config@1.0.7-next.0 + ## 1.2.4-next.1 ### Patch Changes diff --git a/plugins/search-backend/package.json b/plugins/search-backend/package.json index faadd54835..0baecca0a9 100644 --- a/plugins/search-backend/package.json +++ b/plugins/search-backend/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-search-backend", "description": "The Backstage backend plugin that provides your backstage app with search", - "version": "1.2.4-next.1", + "version": "1.2.4-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/search-react/CHANGELOG.md b/plugins/search-react/CHANGELOG.md index e1fb0049bf..9fc158de5d 100644 --- a/plugins/search-react/CHANGELOG.md +++ b/plugins/search-react/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-search-react +## 1.5.1-next.2 + +### Patch Changes + +- 65454876fb2: Minor API report tweaks +- 553f3c95011: Correctly disable next button in `SearchPagination` on last page +- Updated dependencies + - @backstage/core-components@0.12.5-next.2 + - @backstage/core-plugin-api@1.5.0-next.2 + ## 1.5.1-next.1 ### Patch Changes diff --git a/plugins/search-react/package.json b/plugins/search-react/package.json index edd00ca6cf..355191cb47 100644 --- a/plugins/search-react/package.json +++ b/plugins/search-react/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-search-react", - "version": "1.5.1-next.1", + "version": "1.5.1-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/search/CHANGELOG.md b/plugins/search/CHANGELOG.md index e326f19ef4..3d02621576 100644 --- a/plugins/search/CHANGELOG.md +++ b/plugins/search/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-search +## 1.1.1-next.2 + +### Patch Changes + +- 65454876fb2: Minor API report tweaks +- Updated dependencies + - @backstage/core-components@0.12.5-next.2 + - @backstage/plugin-catalog-react@1.4.0-next.2 + - @backstage/plugin-search-react@1.5.1-next.2 + - @backstage/core-plugin-api@1.5.0-next.2 + - @backstage/config@1.0.7-next.0 + ## 1.1.1-next.1 ### Patch Changes diff --git a/plugins/search/package.json b/plugins/search/package.json index e8aab6022d..353981cae1 100644 --- a/plugins/search/package.json +++ b/plugins/search/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-search", "description": "The Backstage plugin that provides your backstage app with search", - "version": "1.1.1-next.1", + "version": "1.1.1-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/sentry/CHANGELOG.md b/plugins/sentry/CHANGELOG.md index abfdb54ce8..89b5d8312a 100644 --- a/plugins/sentry/CHANGELOG.md +++ b/plugins/sentry/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-sentry +## 0.5.1-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.5-next.2 + - @backstage/plugin-catalog-react@1.4.0-next.2 + - @backstage/core-plugin-api@1.5.0-next.2 + ## 0.5.1-next.1 ### Patch Changes diff --git a/plugins/sentry/package.json b/plugins/sentry/package.json index 9893994cf8..1139898926 100644 --- a/plugins/sentry/package.json +++ b/plugins/sentry/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-sentry", "description": "A Backstage plugin that integrates towards Sentry", - "version": "0.5.1-next.1", + "version": "0.5.1-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/shortcuts/CHANGELOG.md b/plugins/shortcuts/CHANGELOG.md index 4b00e77e28..2360461f73 100644 --- a/plugins/shortcuts/CHANGELOG.md +++ b/plugins/shortcuts/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-shortcuts +## 0.3.8-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.5-next.2 + - @backstage/core-plugin-api@1.5.0-next.2 + ## 0.3.8-next.1 ### Patch Changes diff --git a/plugins/shortcuts/package.json b/plugins/shortcuts/package.json index bddd20e5b3..eb48088934 100644 --- a/plugins/shortcuts/package.json +++ b/plugins/shortcuts/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-shortcuts", "description": "A Backstage plugin that provides a shortcuts feature to the sidebar", - "version": "0.3.8-next.1", + "version": "0.3.8-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/sonarqube-backend/CHANGELOG.md b/plugins/sonarqube-backend/CHANGELOG.md index e44e90767b..f60f7bf047 100644 --- a/plugins/sonarqube-backend/CHANGELOG.md +++ b/plugins/sonarqube-backend/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-sonarqube-backend +## 0.1.8-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.3-next.2 + - @backstage/config@1.0.7-next.0 + ## 0.1.8-next.1 ### Patch Changes diff --git a/plugins/sonarqube-backend/package.json b/plugins/sonarqube-backend/package.json index 0a25762ae4..d7de98d307 100644 --- a/plugins/sonarqube-backend/package.json +++ b/plugins/sonarqube-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-sonarqube-backend", - "version": "0.1.8-next.1", + "version": "0.1.8-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/sonarqube-react/CHANGELOG.md b/plugins/sonarqube-react/CHANGELOG.md index d3feb6b79d..6c7d5d41f2 100644 --- a/plugins/sonarqube-react/CHANGELOG.md +++ b/plugins/sonarqube-react/CHANGELOG.md @@ -1,5 +1,12 @@ # @backstage/plugin-sonarqube-react +## 0.1.4-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.5.0-next.2 + ## 0.1.4-next.1 ### Patch Changes diff --git a/plugins/sonarqube-react/package.json b/plugins/sonarqube-react/package.json index 8700254987..d5266cd220 100644 --- a/plugins/sonarqube-react/package.json +++ b/plugins/sonarqube-react/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-sonarqube-react", - "version": "0.1.4-next.1", + "version": "0.1.4-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/sonarqube/CHANGELOG.md b/plugins/sonarqube/CHANGELOG.md index c632224252..6c6f69aaf8 100644 --- a/plugins/sonarqube/CHANGELOG.md +++ b/plugins/sonarqube/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-sonarqube +## 0.6.5-next.2 + +### Patch Changes + +- 65454876fb2: Minor API report tweaks +- Updated dependencies + - @backstage/core-components@0.12.5-next.2 + - @backstage/plugin-catalog-react@1.4.0-next.2 + - @backstage/core-plugin-api@1.5.0-next.2 + - @backstage/plugin-sonarqube-react@0.1.4-next.2 + ## 0.6.5-next.1 ### Patch Changes diff --git a/plugins/sonarqube/package.json b/plugins/sonarqube/package.json index 3775f6c30b..48d221e508 100644 --- a/plugins/sonarqube/package.json +++ b/plugins/sonarqube/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-sonarqube", "description": "", - "version": "0.6.5-next.1", + "version": "0.6.5-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/splunk-on-call/CHANGELOG.md b/plugins/splunk-on-call/CHANGELOG.md index 4c36b337e5..830c918ced 100644 --- a/plugins/splunk-on-call/CHANGELOG.md +++ b/plugins/splunk-on-call/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-splunk-on-call +## 0.4.5-next.2 + +### Patch Changes + +- 65454876fb2: Minor API report tweaks +- Updated dependencies + - @backstage/core-components@0.12.5-next.2 + - @backstage/plugin-catalog-react@1.4.0-next.2 + - @backstage/core-plugin-api@1.5.0-next.2 + ## 0.4.5-next.1 ### Patch Changes diff --git a/plugins/splunk-on-call/package.json b/plugins/splunk-on-call/package.json index 4da3a55108..97a5357bd0 100644 --- a/plugins/splunk-on-call/package.json +++ b/plugins/splunk-on-call/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-splunk-on-call", "description": "A Backstage plugin that integrates towards Splunk On-Call", - "version": "0.4.5-next.1", + "version": "0.4.5-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/stack-overflow-backend/CHANGELOG.md b/plugins/stack-overflow-backend/CHANGELOG.md index c395fe7094..fab1416363 100644 --- a/plugins/stack-overflow-backend/CHANGELOG.md +++ b/plugins/stack-overflow-backend/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-stack-overflow-backend +## 0.1.12-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.3-next.2 + - @backstage/config@1.0.7-next.0 + ## 0.1.12-next.1 ### Patch Changes diff --git a/plugins/stack-overflow-backend/package.json b/plugins/stack-overflow-backend/package.json index b3aa6573df..2dd405dc3b 100644 --- a/plugins/stack-overflow-backend/package.json +++ b/plugins/stack-overflow-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-stack-overflow-backend", - "version": "0.1.12-next.1", + "version": "0.1.12-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/stack-overflow/CHANGELOG.md b/plugins/stack-overflow/CHANGELOG.md index d69e9441b1..050900554d 100644 --- a/plugins/stack-overflow/CHANGELOG.md +++ b/plugins/stack-overflow/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-stack-overflow +## 0.1.12-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.5-next.2 + - @backstage/plugin-search-react@1.5.1-next.2 + - @backstage/core-plugin-api@1.5.0-next.2 + - @backstage/plugin-home@0.4.32-next.2 + - @backstage/config@1.0.7-next.0 + ## 0.1.12-next.1 ### Patch Changes diff --git a/plugins/stack-overflow/package.json b/plugins/stack-overflow/package.json index 3ad363962d..3675593181 100644 --- a/plugins/stack-overflow/package.json +++ b/plugins/stack-overflow/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-stack-overflow", - "version": "0.1.12-next.1", + "version": "0.1.12-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/stackstorm/CHANGELOG.md b/plugins/stackstorm/CHANGELOG.md index bbeb51a609..f68c853b7b 100644 --- a/plugins/stackstorm/CHANGELOG.md +++ b/plugins/stackstorm/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-stackstorm +## 0.1.0-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.5-next.2 + - @backstage/core-plugin-api@1.5.0-next.2 + ## 0.1.0-next.1 ### Patch Changes diff --git a/plugins/stackstorm/package.json b/plugins/stackstorm/package.json index 61ac3da384..a1ba109d76 100644 --- a/plugins/stackstorm/package.json +++ b/plugins/stackstorm/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-stackstorm", "description": "A Backstage plugin that integrates towards StackStorm", - "version": "0.1.0-next.1", + "version": "0.1.0-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/tech-insights-backend-module-jsonfc/CHANGELOG.md b/plugins/tech-insights-backend-module-jsonfc/CHANGELOG.md index 3f8e02187c..12e6693589 100644 --- a/plugins/tech-insights-backend-module-jsonfc/CHANGELOG.md +++ b/plugins/tech-insights-backend-module-jsonfc/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-tech-insights-backend-module-jsonfc +## 0.1.27-next.2 + +### Patch Changes + +- 65454876fb2: Minor API report tweaks +- Updated dependencies + - @backstage/backend-common@0.18.3-next.2 + - @backstage/plugin-tech-insights-node@0.4.1-next.2 + - @backstage/config@1.0.7-next.0 + ## 0.1.27-next.1 ### Patch Changes diff --git a/plugins/tech-insights-backend-module-jsonfc/package.json b/plugins/tech-insights-backend-module-jsonfc/package.json index 496cd1ec00..7d60ec0cdc 100644 --- a/plugins/tech-insights-backend-module-jsonfc/package.json +++ b/plugins/tech-insights-backend-module-jsonfc/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-tech-insights-backend-module-jsonfc", - "version": "0.1.27-next.1", + "version": "0.1.27-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/tech-insights-backend/CHANGELOG.md b/plugins/tech-insights-backend/CHANGELOG.md index 50bdd8f65d..c4e8061f05 100644 --- a/plugins/tech-insights-backend/CHANGELOG.md +++ b/plugins/tech-insights-backend/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-tech-insights-backend +## 0.5.9-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-tasks@0.5.0-next.2 + - @backstage/backend-common@0.18.3-next.2 + - @backstage/plugin-tech-insights-node@0.4.1-next.2 + - @backstage/config@1.0.7-next.0 + ## 0.5.9-next.1 ### Patch Changes diff --git a/plugins/tech-insights-backend/package.json b/plugins/tech-insights-backend/package.json index a7f868fbad..e11bf60e0d 100644 --- a/plugins/tech-insights-backend/package.json +++ b/plugins/tech-insights-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-tech-insights-backend", - "version": "0.5.9-next.1", + "version": "0.5.9-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/tech-insights-node/CHANGELOG.md b/plugins/tech-insights-node/CHANGELOG.md index e43a61629d..ed9f3667f0 100644 --- a/plugins/tech-insights-node/CHANGELOG.md +++ b/plugins/tech-insights-node/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-tech-insights-node +## 0.4.1-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-tasks@0.5.0-next.2 + - @backstage/backend-common@0.18.3-next.2 + - @backstage/config@1.0.7-next.0 + ## 0.4.1-next.1 ### Patch Changes diff --git a/plugins/tech-insights-node/package.json b/plugins/tech-insights-node/package.json index 428341c54d..6a546f86c1 100644 --- a/plugins/tech-insights-node/package.json +++ b/plugins/tech-insights-node/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-tech-insights-node", - "version": "0.4.1-next.1", + "version": "0.4.1-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/tech-insights/CHANGELOG.md b/plugins/tech-insights/CHANGELOG.md index a1e75d80b7..e8d57b056f 100644 --- a/plugins/tech-insights/CHANGELOG.md +++ b/plugins/tech-insights/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-tech-insights +## 0.3.8-next.2 + +### Patch Changes + +- 65454876fb2: Minor API report tweaks +- Updated dependencies + - @backstage/core-components@0.12.5-next.2 + - @backstage/plugin-catalog-react@1.4.0-next.2 + - @backstage/core-plugin-api@1.5.0-next.2 + ## 0.3.8-next.1 ### Patch Changes diff --git a/plugins/tech-insights/package.json b/plugins/tech-insights/package.json index 3eb7a5ae90..680641b1b0 100644 --- a/plugins/tech-insights/package.json +++ b/plugins/tech-insights/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-tech-insights", - "version": "0.3.8-next.1", + "version": "0.3.8-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/tech-radar/CHANGELOG.md b/plugins/tech-radar/CHANGELOG.md index 998d703860..4ad21662bd 100644 --- a/plugins/tech-radar/CHANGELOG.md +++ b/plugins/tech-radar/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-tech-radar +## 0.6.2-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.5-next.2 + - @backstage/core-plugin-api@1.5.0-next.2 + ## 0.6.2-next.1 ### Patch Changes diff --git a/plugins/tech-radar/package.json b/plugins/tech-radar/package.json index 6f67def94c..273bd79255 100644 --- a/plugins/tech-radar/package.json +++ b/plugins/tech-radar/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-tech-radar", "description": "A Backstage plugin that lets you display a Tech Radar for your organization", - "version": "0.6.2-next.1", + "version": "0.6.2-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/techdocs-addons-test-utils/CHANGELOG.md b/plugins/techdocs-addons-test-utils/CHANGELOG.md index 4396148d7d..35dedb8a0b 100644 --- a/plugins/techdocs-addons-test-utils/CHANGELOG.md +++ b/plugins/techdocs-addons-test-utils/CHANGELOG.md @@ -1,5 +1,20 @@ # @backstage/plugin-techdocs-addons-test-utils +## 1.0.11-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.5-next.2 + - @backstage/plugin-techdocs-react@1.1.4-next.2 + - @backstage/plugin-search-react@1.5.1-next.2 + - @backstage/plugin-techdocs@1.6.0-next.2 + - @backstage/core-app-api@1.6.0-next.2 + - @backstage/plugin-catalog@1.9.0-next.2 + - @backstage/core-plugin-api@1.5.0-next.2 + - @backstage/integration-react@1.1.11-next.2 + - @backstage/test-utils@1.2.6-next.2 + ## 1.0.11-next.1 ### Patch Changes diff --git a/plugins/techdocs-addons-test-utils/package.json b/plugins/techdocs-addons-test-utils/package.json index 45aa1f6f04..8dc81b2cf7 100644 --- a/plugins/techdocs-addons-test-utils/package.json +++ b/plugins/techdocs-addons-test-utils/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-techdocs-addons-test-utils", - "version": "1.0.11-next.1", + "version": "1.0.11-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/techdocs-backend/CHANGELOG.md b/plugins/techdocs-backend/CHANGELOG.md index 0b3b0bad56..8e4be204db 100644 --- a/plugins/techdocs-backend/CHANGELOG.md +++ b/plugins/techdocs-backend/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-techdocs-backend +## 1.5.4-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-techdocs-node@1.6.0-next.2 + - @backstage/backend-common@0.18.3-next.2 + - @backstage/config@1.0.7-next.0 + - @backstage/integration@1.4.3-next.0 + ## 1.5.4-next.1 ### Patch Changes diff --git a/plugins/techdocs-backend/package.json b/plugins/techdocs-backend/package.json index dbc482db47..c9fff25b70 100644 --- a/plugins/techdocs-backend/package.json +++ b/plugins/techdocs-backend/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-techdocs-backend", "description": "The Backstage backend plugin that renders technical documentation for your components", - "version": "1.5.4-next.1", + "version": "1.5.4-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/techdocs-module-addons-contrib/CHANGELOG.md b/plugins/techdocs-module-addons-contrib/CHANGELOG.md index 9c70b13dc7..69fa5d8cfd 100644 --- a/plugins/techdocs-module-addons-contrib/CHANGELOG.md +++ b/plugins/techdocs-module-addons-contrib/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-techdocs-module-addons-contrib +## 1.0.11-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.5-next.2 + - @backstage/plugin-techdocs-react@1.1.4-next.2 + - @backstage/core-plugin-api@1.5.0-next.2 + - @backstage/integration-react@1.1.11-next.2 + - @backstage/integration@1.4.3-next.0 + ## 1.0.11-next.1 ### Patch Changes diff --git a/plugins/techdocs-module-addons-contrib/package.json b/plugins/techdocs-module-addons-contrib/package.json index 9089802b41..b5aebb262c 100644 --- a/plugins/techdocs-module-addons-contrib/package.json +++ b/plugins/techdocs-module-addons-contrib/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-techdocs-module-addons-contrib", "description": "Plugin module for contributed TechDocs Addons", - "version": "1.0.11-next.1", + "version": "1.0.11-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/techdocs-node/CHANGELOG.md b/plugins/techdocs-node/CHANGELOG.md index 5c13883594..28a11e4b57 100644 --- a/plugins/techdocs-node/CHANGELOG.md +++ b/plugins/techdocs-node/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-techdocs-node +## 1.6.0-next.2 + +### Patch Changes + +- 65454876fb2: Minor API report tweaks +- Updated dependencies + - @backstage/backend-common@0.18.3-next.2 + - @backstage/config@1.0.7-next.0 + - @backstage/integration@1.4.3-next.0 + - @backstage/integration-aws-node@0.1.2-next.0 + ## 1.6.0-next.1 ### Minor Changes diff --git a/plugins/techdocs-node/package.json b/plugins/techdocs-node/package.json index 7328927307..4c3a4a3496 100644 --- a/plugins/techdocs-node/package.json +++ b/plugins/techdocs-node/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-techdocs-node", "description": "Common node.js functionalities for TechDocs, to be shared between techdocs-backend plugin and techdocs-cli", - "version": "1.6.0-next.1", + "version": "1.6.0-next.2", "main": "src/index.ts", "types": "src/index.ts", "publishConfig": { diff --git a/plugins/techdocs-node/src/stages/generate/helpers.test.ts b/plugins/techdocs-node/src/stages/generate/helpers.test.ts index b24d85430b..6bcdf0d984 100644 --- a/plugins/techdocs-node/src/stages/generate/helpers.test.ts +++ b/plugins/techdocs-node/src/stages/generate/helpers.test.ts @@ -565,7 +565,9 @@ describe('helpers', () => { } = await getMkdocsYml(inputDir, defaultSiteOptions); expect(mkdocsPath).toBe(key); - expect(content).toBe(mkdocsDefaultYml.toString()); + expect(content.split(/[\r\n]+/g)).toEqual( + mkdocsDefaultYml.toString().split(/[\r\n]+/g), + ); expect(configIsTemporary).toBe(true); }); diff --git a/plugins/techdocs-react/CHANGELOG.md b/plugins/techdocs-react/CHANGELOG.md index 7894f77a44..cbc52cf570 100644 --- a/plugins/techdocs-react/CHANGELOG.md +++ b/plugins/techdocs-react/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-techdocs-react +## 1.1.4-next.2 + +### Patch Changes + +- 65454876fb2: Minor API report tweaks +- Updated dependencies + - @backstage/core-components@0.12.5-next.2 + - @backstage/core-plugin-api@1.5.0-next.2 + - @backstage/config@1.0.7-next.0 + ## 1.1.4-next.1 ### Patch Changes diff --git a/plugins/techdocs-react/package.json b/plugins/techdocs-react/package.json index 3d31cc0e17..ae8d7e21ae 100644 --- a/plugins/techdocs-react/package.json +++ b/plugins/techdocs-react/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-techdocs-react", "description": "Shared frontend utilities for TechDocs and Addons", - "version": "1.1.4-next.1", + "version": "1.1.4-next.2", "publishConfig": { "access": "public", "main": "dist/index.esm.js", diff --git a/plugins/techdocs/CHANGELOG.md b/plugins/techdocs/CHANGELOG.md index 60d826f2c4..7ce9542731 100644 --- a/plugins/techdocs/CHANGELOG.md +++ b/plugins/techdocs/CHANGELOG.md @@ -1,5 +1,20 @@ # @backstage/plugin-techdocs +## 1.6.0-next.2 + +### Patch Changes + +- 65454876fb2: Minor API report tweaks +- Updated dependencies + - @backstage/core-components@0.12.5-next.2 + - @backstage/plugin-techdocs-react@1.1.4-next.2 + - @backstage/plugin-catalog-react@1.4.0-next.2 + - @backstage/plugin-search-react@1.5.1-next.2 + - @backstage/core-plugin-api@1.5.0-next.2 + - @backstage/integration-react@1.1.11-next.2 + - @backstage/config@1.0.7-next.0 + - @backstage/integration@1.4.3-next.0 + ## 1.6.0-next.1 ### Patch Changes diff --git a/plugins/techdocs/package.json b/plugins/techdocs/package.json index 8f15b11152..88ebb91c1b 100644 --- a/plugins/techdocs/package.json +++ b/plugins/techdocs/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-techdocs", "description": "The Backstage plugin that renders technical documentation for your components", - "version": "1.6.0-next.1", + "version": "1.6.0-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/todo-backend/CHANGELOG.md b/plugins/todo-backend/CHANGELOG.md index f22ef56503..6abd6c3562 100644 --- a/plugins/todo-backend/CHANGELOG.md +++ b/plugins/todo-backend/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-todo-backend +## 0.1.40-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.3-next.2 + - @backstage/backend-plugin-api@0.4.1-next.2 + - @backstage/plugin-catalog-node@1.3.4-next.2 + - @backstage/config@1.0.7-next.0 + - @backstage/integration@1.4.3-next.0 + ## 0.1.40-next.1 ### Patch Changes diff --git a/plugins/todo-backend/package.json b/plugins/todo-backend/package.json index ebd874b3e6..cb37bc5eb5 100644 --- a/plugins/todo-backend/package.json +++ b/plugins/todo-backend/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-todo-backend", "description": "A Backstage backend plugin that lets you browse TODO comments in your source code", - "version": "0.1.40-next.1", + "version": "0.1.40-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/todo-backend/src/plugin.ts b/plugins/todo-backend/src/plugin.ts index b9a73a84ee..640ea1a0ce 100644 --- a/plugins/todo-backend/src/plugin.ts +++ b/plugins/todo-backend/src/plugin.ts @@ -27,7 +27,7 @@ import { createRouter } from './service/router'; * @public */ export const todoPlugin = createBackendPlugin({ - pluginId: 'todo-backend', + pluginId: 'todo', register(env) { env.registerInit({ deps: { diff --git a/plugins/todo/CHANGELOG.md b/plugins/todo/CHANGELOG.md index 3eb0e8a30b..3e716065a1 100644 --- a/plugins/todo/CHANGELOG.md +++ b/plugins/todo/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-todo +## 0.2.18-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.5-next.2 + - @backstage/plugin-catalog-react@1.4.0-next.2 + - @backstage/core-plugin-api@1.5.0-next.2 + ## 0.2.18-next.1 ### Patch Changes diff --git a/plugins/todo/package.json b/plugins/todo/package.json index 01a0829835..6cc2491a78 100644 --- a/plugins/todo/package.json +++ b/plugins/todo/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-todo", "description": "A Backstage plugin that lets you browse TODO comments in your source code", - "version": "0.2.18-next.1", + "version": "0.2.18-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/user-settings-backend/CHANGELOG.md b/plugins/user-settings-backend/CHANGELOG.md index 3141c9f8b1..4bcf306e42 100644 --- a/plugins/user-settings-backend/CHANGELOG.md +++ b/plugins/user-settings-backend/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-user-settings-backend +## 0.1.7-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.2.12-next.2 + - @backstage/backend-common@0.18.3-next.2 + - @backstage/backend-plugin-api@0.4.1-next.2 + ## 0.1.7-next.1 ### Patch Changes diff --git a/plugins/user-settings-backend/package.json b/plugins/user-settings-backend/package.json index 833241dc72..a98e0e9313 100644 --- a/plugins/user-settings-backend/package.json +++ b/plugins/user-settings-backend/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-user-settings-backend", "description": "The Backstage backend plugin to manage user settings", - "version": "0.1.7-next.1", + "version": "0.1.7-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/user-settings/CHANGELOG.md b/plugins/user-settings/CHANGELOG.md index 1cb2322c4d..435fa2b2d4 100644 --- a/plugins/user-settings/CHANGELOG.md +++ b/plugins/user-settings/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-user-settings +## 0.7.1-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.5-next.2 + - @backstage/plugin-catalog-react@1.4.0-next.2 + - @backstage/core-app-api@1.6.0-next.2 + - @backstage/core-plugin-api@1.5.0-next.2 + ## 0.7.1-next.1 ### Patch Changes diff --git a/plugins/user-settings/package.json b/plugins/user-settings/package.json index 01ae0e1134..e49c54687d 100644 --- a/plugins/user-settings/package.json +++ b/plugins/user-settings/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-user-settings", "description": "A Backstage plugin that provides a settings page", - "version": "0.7.1-next.1", + "version": "0.7.1-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/vault-backend/CHANGELOG.md b/plugins/vault-backend/CHANGELOG.md index d3717a29e1..31b822c68b 100644 --- a/plugins/vault-backend/CHANGELOG.md +++ b/plugins/vault-backend/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-vault-backend +## 0.2.10-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-tasks@0.5.0-next.2 + - @backstage/backend-common@0.18.3-next.2 + - @backstage/config@1.0.7-next.0 + ## 0.2.10-next.1 ### Patch Changes diff --git a/plugins/vault-backend/package.json b/plugins/vault-backend/package.json index f9966b2316..336363e9ad 100644 --- a/plugins/vault-backend/package.json +++ b/plugins/vault-backend/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-vault-backend", "description": "A Backstage backend plugin that integrates towards Vault", - "version": "0.2.10-next.1", + "version": "0.2.10-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/vault/CHANGELOG.md b/plugins/vault/CHANGELOG.md index df3e5659d1..1f6d8446bd 100644 --- a/plugins/vault/CHANGELOG.md +++ b/plugins/vault/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-vault +## 0.1.10-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.5-next.2 + - @backstage/plugin-catalog-react@1.4.0-next.2 + - @backstage/core-plugin-api@1.5.0-next.2 + ## 0.1.10-next.1 ### Patch Changes diff --git a/plugins/vault/package.json b/plugins/vault/package.json index 20a8e235c0..127c9cf753 100644 --- a/plugins/vault/package.json +++ b/plugins/vault/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-vault", "description": "A Backstage plugin that integrates towards Vault", - "version": "0.1.10-next.1", + "version": "0.1.10-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/xcmetrics/CHANGELOG.md b/plugins/xcmetrics/CHANGELOG.md index 2ea83d9a11..e9a2023939 100644 --- a/plugins/xcmetrics/CHANGELOG.md +++ b/plugins/xcmetrics/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-xcmetrics +## 0.2.36-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.5-next.2 + - @backstage/core-plugin-api@1.5.0-next.2 + ## 0.2.36-next.1 ### Patch Changes diff --git a/plugins/xcmetrics/package.json b/plugins/xcmetrics/package.json index 5e3ffebcba..fb7695e090 100644 --- a/plugins/xcmetrics/package.json +++ b/plugins/xcmetrics/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-xcmetrics", "description": "A Backstage plugin that shows XCode build metrics for your components", - "version": "0.2.36-next.1", + "version": "0.2.36-next.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/yarn.lock b/yarn.lock index 2bf9c900df..5c0f64c734 100644 --- a/yarn.lock +++ b/yarn.lock @@ -508,88 +508,48 @@ __metadata: linkType: hard "@aws-sdk/client-sqs@npm:^3.208.0": - version: 3.276.0 - resolution: "@aws-sdk/client-sqs@npm:3.276.0" + version: 3.282.0 + resolution: "@aws-sdk/client-sqs@npm:3.282.0" dependencies: "@aws-crypto/sha256-browser": 3.0.0 "@aws-crypto/sha256-js": 3.0.0 - "@aws-sdk/client-sts": 3.276.0 - "@aws-sdk/config-resolver": 3.272.0 - "@aws-sdk/credential-provider-node": 3.272.0 - "@aws-sdk/fetch-http-handler": 3.272.0 + "@aws-sdk/client-sts": 3.282.0 + "@aws-sdk/config-resolver": 3.282.0 + "@aws-sdk/credential-provider-node": 3.282.0 + "@aws-sdk/fetch-http-handler": 3.282.0 "@aws-sdk/hash-node": 3.272.0 "@aws-sdk/invalid-dependency": 3.272.0 "@aws-sdk/md5-js": 3.272.0 - "@aws-sdk/middleware-content-length": 3.272.0 - "@aws-sdk/middleware-endpoint": 3.272.0 - "@aws-sdk/middleware-host-header": 3.272.0 + "@aws-sdk/middleware-content-length": 3.282.0 + "@aws-sdk/middleware-endpoint": 3.282.0 + "@aws-sdk/middleware-host-header": 3.282.0 "@aws-sdk/middleware-logger": 3.272.0 - "@aws-sdk/middleware-recursion-detection": 3.272.0 - "@aws-sdk/middleware-retry": 3.272.0 + "@aws-sdk/middleware-recursion-detection": 3.282.0 + "@aws-sdk/middleware-retry": 3.282.0 "@aws-sdk/middleware-sdk-sqs": 3.272.0 "@aws-sdk/middleware-serde": 3.272.0 - "@aws-sdk/middleware-signing": 3.272.0 + "@aws-sdk/middleware-signing": 3.282.0 "@aws-sdk/middleware-stack": 3.272.0 - "@aws-sdk/middleware-user-agent": 3.272.0 + "@aws-sdk/middleware-user-agent": 3.282.0 "@aws-sdk/node-config-provider": 3.272.0 - "@aws-sdk/node-http-handler": 3.272.0 - "@aws-sdk/protocol-http": 3.272.0 - "@aws-sdk/smithy-client": 3.272.0 + "@aws-sdk/node-http-handler": 3.282.0 + "@aws-sdk/protocol-http": 3.282.0 + "@aws-sdk/smithy-client": 3.279.0 "@aws-sdk/types": 3.272.0 "@aws-sdk/url-parser": 3.272.0 "@aws-sdk/util-base64": 3.208.0 "@aws-sdk/util-body-length-browser": 3.188.0 "@aws-sdk/util-body-length-node": 3.208.0 - "@aws-sdk/util-defaults-mode-browser": 3.272.0 - "@aws-sdk/util-defaults-mode-node": 3.272.0 + "@aws-sdk/util-defaults-mode-browser": 3.279.0 + "@aws-sdk/util-defaults-mode-node": 3.282.0 "@aws-sdk/util-endpoints": 3.272.0 "@aws-sdk/util-retry": 3.272.0 - "@aws-sdk/util-user-agent-browser": 3.272.0 - "@aws-sdk/util-user-agent-node": 3.272.0 + "@aws-sdk/util-user-agent-browser": 3.282.0 + "@aws-sdk/util-user-agent-node": 3.282.0 "@aws-sdk/util-utf8": 3.254.0 fast-xml-parser: 4.1.2 tslib: ^2.3.1 - checksum: 88139fde34fa6348e841de13fce5e68b2dfb735c5358c959f9956a8c918048bde8b1ff701e8e701807af5f67f6df129056986b62a7e07096cc7097f3491d36b8 - languageName: node - linkType: hard - -"@aws-sdk/client-sso-oidc@npm:3.272.0": - version: 3.272.0 - resolution: "@aws-sdk/client-sso-oidc@npm:3.272.0" - dependencies: - "@aws-crypto/sha256-browser": 3.0.0 - "@aws-crypto/sha256-js": 3.0.0 - "@aws-sdk/config-resolver": 3.272.0 - "@aws-sdk/fetch-http-handler": 3.272.0 - "@aws-sdk/hash-node": 3.272.0 - "@aws-sdk/invalid-dependency": 3.272.0 - "@aws-sdk/middleware-content-length": 3.272.0 - "@aws-sdk/middleware-endpoint": 3.272.0 - "@aws-sdk/middleware-host-header": 3.272.0 - "@aws-sdk/middleware-logger": 3.272.0 - "@aws-sdk/middleware-recursion-detection": 3.272.0 - "@aws-sdk/middleware-retry": 3.272.0 - "@aws-sdk/middleware-serde": 3.272.0 - "@aws-sdk/middleware-stack": 3.272.0 - "@aws-sdk/middleware-user-agent": 3.272.0 - "@aws-sdk/node-config-provider": 3.272.0 - "@aws-sdk/node-http-handler": 3.272.0 - "@aws-sdk/protocol-http": 3.272.0 - "@aws-sdk/smithy-client": 3.272.0 - "@aws-sdk/types": 3.272.0 - "@aws-sdk/url-parser": 3.272.0 - "@aws-sdk/util-base64": 3.208.0 - "@aws-sdk/util-body-length-browser": 3.188.0 - "@aws-sdk/util-body-length-node": 3.208.0 - "@aws-sdk/util-defaults-mode-browser": 3.272.0 - "@aws-sdk/util-defaults-mode-node": 3.272.0 - "@aws-sdk/util-endpoints": 3.272.0 - "@aws-sdk/util-retry": 3.272.0 - "@aws-sdk/util-user-agent-browser": 3.272.0 - "@aws-sdk/util-user-agent-node": 3.272.0 - "@aws-sdk/util-utf8": 3.254.0 - tslib: ^2.3.1 - checksum: a1ee61c2fc86a74439e06c98aa10c8246e31579eb480b625321f7dfe8fd26af49bd6ead803da2443700c5943eab5ba90dfc33fc4d9f23b1a680850d73526da4d + checksum: d3a2a2abb27313666aa8c9842c91a098b2570878a9853d59bf07d480669723d77b74ad2ca8e5297dc593d8e76578c78c2634f81e4eed84b84b020b06af04c423 languageName: node linkType: hard @@ -633,46 +593,6 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/client-sso@npm:3.272.0": - version: 3.272.0 - resolution: "@aws-sdk/client-sso@npm:3.272.0" - dependencies: - "@aws-crypto/sha256-browser": 3.0.0 - "@aws-crypto/sha256-js": 3.0.0 - "@aws-sdk/config-resolver": 3.272.0 - "@aws-sdk/fetch-http-handler": 3.272.0 - "@aws-sdk/hash-node": 3.272.0 - "@aws-sdk/invalid-dependency": 3.272.0 - "@aws-sdk/middleware-content-length": 3.272.0 - "@aws-sdk/middleware-endpoint": 3.272.0 - "@aws-sdk/middleware-host-header": 3.272.0 - "@aws-sdk/middleware-logger": 3.272.0 - "@aws-sdk/middleware-recursion-detection": 3.272.0 - "@aws-sdk/middleware-retry": 3.272.0 - "@aws-sdk/middleware-serde": 3.272.0 - "@aws-sdk/middleware-stack": 3.272.0 - "@aws-sdk/middleware-user-agent": 3.272.0 - "@aws-sdk/node-config-provider": 3.272.0 - "@aws-sdk/node-http-handler": 3.272.0 - "@aws-sdk/protocol-http": 3.272.0 - "@aws-sdk/smithy-client": 3.272.0 - "@aws-sdk/types": 3.272.0 - "@aws-sdk/url-parser": 3.272.0 - "@aws-sdk/util-base64": 3.208.0 - "@aws-sdk/util-body-length-browser": 3.188.0 - "@aws-sdk/util-body-length-node": 3.208.0 - "@aws-sdk/util-defaults-mode-browser": 3.272.0 - "@aws-sdk/util-defaults-mode-node": 3.272.0 - "@aws-sdk/util-endpoints": 3.272.0 - "@aws-sdk/util-retry": 3.272.0 - "@aws-sdk/util-user-agent-browser": 3.272.0 - "@aws-sdk/util-user-agent-node": 3.272.0 - "@aws-sdk/util-utf8": 3.254.0 - tslib: ^2.3.1 - checksum: 7549e813ef8088d22a0a1f9c8a42532d2d2050c932fd6e7d4f717aea2cd554938283f3af0f1fe9597b24724c6b2438947b3089452ed9c0dfafb1efad15f3ac60 - languageName: node - linkType: hard - "@aws-sdk/client-sso@npm:3.282.0": version: 3.282.0 resolution: "@aws-sdk/client-sso@npm:3.282.0" @@ -713,50 +633,6 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/client-sts@npm:3.276.0": - version: 3.276.0 - resolution: "@aws-sdk/client-sts@npm:3.276.0" - dependencies: - "@aws-crypto/sha256-browser": 3.0.0 - "@aws-crypto/sha256-js": 3.0.0 - "@aws-sdk/config-resolver": 3.272.0 - "@aws-sdk/credential-provider-node": 3.272.0 - "@aws-sdk/fetch-http-handler": 3.272.0 - "@aws-sdk/hash-node": 3.272.0 - "@aws-sdk/invalid-dependency": 3.272.0 - "@aws-sdk/middleware-content-length": 3.272.0 - "@aws-sdk/middleware-endpoint": 3.272.0 - "@aws-sdk/middleware-host-header": 3.272.0 - "@aws-sdk/middleware-logger": 3.272.0 - "@aws-sdk/middleware-recursion-detection": 3.272.0 - "@aws-sdk/middleware-retry": 3.272.0 - "@aws-sdk/middleware-sdk-sts": 3.272.0 - "@aws-sdk/middleware-serde": 3.272.0 - "@aws-sdk/middleware-signing": 3.272.0 - "@aws-sdk/middleware-stack": 3.272.0 - "@aws-sdk/middleware-user-agent": 3.272.0 - "@aws-sdk/node-config-provider": 3.272.0 - "@aws-sdk/node-http-handler": 3.272.0 - "@aws-sdk/protocol-http": 3.272.0 - "@aws-sdk/smithy-client": 3.272.0 - "@aws-sdk/types": 3.272.0 - "@aws-sdk/url-parser": 3.272.0 - "@aws-sdk/util-base64": 3.208.0 - "@aws-sdk/util-body-length-browser": 3.188.0 - "@aws-sdk/util-body-length-node": 3.208.0 - "@aws-sdk/util-defaults-mode-browser": 3.272.0 - "@aws-sdk/util-defaults-mode-node": 3.272.0 - "@aws-sdk/util-endpoints": 3.272.0 - "@aws-sdk/util-retry": 3.272.0 - "@aws-sdk/util-user-agent-browser": 3.272.0 - "@aws-sdk/util-user-agent-node": 3.272.0 - "@aws-sdk/util-utf8": 3.254.0 - fast-xml-parser: 4.1.2 - tslib: ^2.3.1 - checksum: 3250322448500789588d24b6fac295b551ab4c1661ab9aa93f173e63b4673260bb2e551c079d811da752115e583b76f5c7ffb16d94b3c66275e75e52a93f35f3 - languageName: node - linkType: hard - "@aws-sdk/client-sts@npm:3.282.0, @aws-sdk/client-sts@npm:^3.208.0": version: 3.282.0 resolution: "@aws-sdk/client-sts@npm:3.282.0" @@ -801,19 +677,6 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/config-resolver@npm:3.272.0": - version: 3.272.0 - resolution: "@aws-sdk/config-resolver@npm:3.272.0" - dependencies: - "@aws-sdk/signature-v4": 3.272.0 - "@aws-sdk/types": 3.272.0 - "@aws-sdk/util-config-provider": 3.208.0 - "@aws-sdk/util-middleware": 3.272.0 - tslib: ^2.3.1 - checksum: d2a2fa4f013ad04f50522aec1001efd34c62ababbc809b176d2e31e41828d867de616ff01bfcaa12603b344ca6838ea5946c72d21e5f2573b90828e29bad6e35 - languageName: node - linkType: hard - "@aws-sdk/config-resolver@npm:3.282.0": version: 3.282.0 resolution: "@aws-sdk/config-resolver@npm:3.282.0" @@ -863,23 +726,6 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/credential-provider-ini@npm:3.272.0": - version: 3.272.0 - resolution: "@aws-sdk/credential-provider-ini@npm:3.272.0" - dependencies: - "@aws-sdk/credential-provider-env": 3.272.0 - "@aws-sdk/credential-provider-imds": 3.272.0 - "@aws-sdk/credential-provider-process": 3.272.0 - "@aws-sdk/credential-provider-sso": 3.272.0 - "@aws-sdk/credential-provider-web-identity": 3.272.0 - "@aws-sdk/property-provider": 3.272.0 - "@aws-sdk/shared-ini-file-loader": 3.272.0 - "@aws-sdk/types": 3.272.0 - tslib: ^2.3.1 - checksum: 06c1dfc6bff09472e11dd7e2c295cfdf71c36af11cb6ba33ce0328aaf9d0baee3f99de8ceec32ff473925b55ad190c9f85f125cf43874c25e22c37e8e3c648d3 - languageName: node - linkType: hard - "@aws-sdk/credential-provider-ini@npm:3.282.0": version: 3.282.0 resolution: "@aws-sdk/credential-provider-ini@npm:3.282.0" @@ -897,24 +743,6 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/credential-provider-node@npm:3.272.0": - version: 3.272.0 - resolution: "@aws-sdk/credential-provider-node@npm:3.272.0" - dependencies: - "@aws-sdk/credential-provider-env": 3.272.0 - "@aws-sdk/credential-provider-imds": 3.272.0 - "@aws-sdk/credential-provider-ini": 3.272.0 - "@aws-sdk/credential-provider-process": 3.272.0 - "@aws-sdk/credential-provider-sso": 3.272.0 - "@aws-sdk/credential-provider-web-identity": 3.272.0 - "@aws-sdk/property-provider": 3.272.0 - "@aws-sdk/shared-ini-file-loader": 3.272.0 - "@aws-sdk/types": 3.272.0 - tslib: ^2.3.1 - checksum: 25c5ab8583821f63c7eb1a5257869dd21159d0b7643ff9a9c094e9b5c78c887bc441f1a2f974eaace62c1879d13e7d590bb3ea2623f5a5de822bf773b1aab100 - languageName: node - linkType: hard - "@aws-sdk/credential-provider-node@npm:3.282.0, @aws-sdk/credential-provider-node@npm:^3.208.0": version: 3.282.0 resolution: "@aws-sdk/credential-provider-node@npm:3.282.0" @@ -945,20 +773,6 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/credential-provider-sso@npm:3.272.0": - version: 3.272.0 - resolution: "@aws-sdk/credential-provider-sso@npm:3.272.0" - dependencies: - "@aws-sdk/client-sso": 3.272.0 - "@aws-sdk/property-provider": 3.272.0 - "@aws-sdk/shared-ini-file-loader": 3.272.0 - "@aws-sdk/token-providers": 3.272.0 - "@aws-sdk/types": 3.272.0 - tslib: ^2.3.1 - checksum: ac1ada61e67f6f0a82ed8507c0218a03fe40e2d1e4ee064578e63573f868195800088dc3e33d58d7d04877e464342987005aceb300e4db9a141080cdc695e46e - languageName: node - linkType: hard - "@aws-sdk/credential-provider-sso@npm:3.282.0": version: 3.282.0 resolution: "@aws-sdk/credential-provider-sso@npm:3.282.0" @@ -1075,19 +889,6 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/fetch-http-handler@npm:3.272.0": - version: 3.272.0 - resolution: "@aws-sdk/fetch-http-handler@npm:3.272.0" - dependencies: - "@aws-sdk/protocol-http": 3.272.0 - "@aws-sdk/querystring-builder": 3.272.0 - "@aws-sdk/types": 3.272.0 - "@aws-sdk/util-base64": 3.208.0 - tslib: ^2.3.1 - checksum: 63d047db7b7ebfee49af8bf42f3a7aa1bea37cc687e7046bc77913c23ed99056e91b5ab77739157428be73b2a2f29783a7a659ccf29a440dd63b750d313d46cc - languageName: node - linkType: hard - "@aws-sdk/fetch-http-handler@npm:3.282.0": version: 3.282.0 resolution: "@aws-sdk/fetch-http-handler@npm:3.282.0" @@ -1156,11 +957,11 @@ __metadata: linkType: hard "@aws-sdk/lib-storage@npm:^3.208.0": - version: 3.276.0 - resolution: "@aws-sdk/lib-storage@npm:3.276.0" + version: 3.282.0 + resolution: "@aws-sdk/lib-storage@npm:3.282.0" dependencies: - "@aws-sdk/middleware-endpoint": 3.272.0 - "@aws-sdk/smithy-client": 3.272.0 + "@aws-sdk/middleware-endpoint": 3.282.0 + "@aws-sdk/smithy-client": 3.279.0 buffer: 5.6.0 events: 3.3.0 stream-browserify: 3.0.0 @@ -1168,7 +969,7 @@ __metadata: peerDependencies: "@aws-sdk/abort-controller": ^3.0.0 "@aws-sdk/client-s3": ^3.0.0 - checksum: 1e34d3569c8cf2f7c42efdd7966a9faea64bf49f4fe1fcb0ff30ed86670a5ba2361bb14279e7dc1bc110a1ff9e5cec3551bc8a56b3c9c4d19f98ff4842a8de19 + checksum: 14f1f21a653d239721ca488b6d7951511576a2e2652d240f3561ac0255cd4af321bc41531c15c3c6fae4095da062f5e841c6c9b58afd80be9bf105b63a256f72 languageName: node linkType: hard @@ -1196,17 +997,6 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/middleware-content-length@npm:3.272.0": - version: 3.272.0 - resolution: "@aws-sdk/middleware-content-length@npm:3.272.0" - dependencies: - "@aws-sdk/protocol-http": 3.272.0 - "@aws-sdk/types": 3.272.0 - tslib: ^2.3.1 - checksum: e1a9c3e6fec8dcfed90bb44b25a8f4786b4ed0cbd79c6f69e3d8e91d394402ad4f2667231aafdcc05caf136a331434d54fac286a72ab5870dd90705a2e56243b - languageName: node - linkType: hard - "@aws-sdk/middleware-content-length@npm:3.282.0": version: 3.282.0 resolution: "@aws-sdk/middleware-content-length@npm:3.282.0" @@ -1218,22 +1008,6 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/middleware-endpoint@npm:3.272.0": - version: 3.272.0 - resolution: "@aws-sdk/middleware-endpoint@npm:3.272.0" - dependencies: - "@aws-sdk/middleware-serde": 3.272.0 - "@aws-sdk/protocol-http": 3.272.0 - "@aws-sdk/signature-v4": 3.272.0 - "@aws-sdk/types": 3.272.0 - "@aws-sdk/url-parser": 3.272.0 - "@aws-sdk/util-config-provider": 3.208.0 - "@aws-sdk/util-middleware": 3.272.0 - tslib: ^2.3.1 - checksum: c3acd1a35d33cff87a43df371ae138faf6c9569497c36b009cafc2fdb1f21e352671df6eb56730634d7f135bef2a47ac588ac7cdd2905676292a418b79a0eab1 - languageName: node - linkType: hard - "@aws-sdk/middleware-endpoint@npm:3.282.0": version: 3.282.0 resolution: "@aws-sdk/middleware-endpoint@npm:3.282.0" @@ -1276,17 +1050,6 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/middleware-host-header@npm:3.272.0": - version: 3.272.0 - resolution: "@aws-sdk/middleware-host-header@npm:3.272.0" - dependencies: - "@aws-sdk/protocol-http": 3.272.0 - "@aws-sdk/types": 3.272.0 - tslib: ^2.3.1 - checksum: 3e191fe72de35b517a20fe47f647527579458091d4d66d55ef7e6b08107a4f4d7abe77afdcdd061776db906309d414525ff63e472c2c05d6e2447f41582f64fb - languageName: node - linkType: hard - "@aws-sdk/middleware-host-header@npm:3.282.0": version: 3.282.0 resolution: "@aws-sdk/middleware-host-header@npm:3.282.0" @@ -1318,17 +1081,6 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/middleware-recursion-detection@npm:3.272.0": - version: 3.272.0 - resolution: "@aws-sdk/middleware-recursion-detection@npm:3.272.0" - dependencies: - "@aws-sdk/protocol-http": 3.272.0 - "@aws-sdk/types": 3.272.0 - tslib: ^2.3.1 - checksum: cdc150a4f3cbd5d7c6926befcf7eb49daea1d0ca054dbe7b82e013eb74f3850056b78603f61989c2bb3cdc748798674b6811c3011c6a8c1773e13dfa11ea3ae7 - languageName: node - linkType: hard - "@aws-sdk/middleware-recursion-detection@npm:3.282.0": version: 3.282.0 resolution: "@aws-sdk/middleware-recursion-detection@npm:3.282.0" @@ -1340,21 +1092,6 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/middleware-retry@npm:3.272.0": - version: 3.272.0 - resolution: "@aws-sdk/middleware-retry@npm:3.272.0" - dependencies: - "@aws-sdk/protocol-http": 3.272.0 - "@aws-sdk/service-error-classification": 3.272.0 - "@aws-sdk/types": 3.272.0 - "@aws-sdk/util-middleware": 3.272.0 - "@aws-sdk/util-retry": 3.272.0 - tslib: ^2.3.1 - uuid: ^8.3.2 - checksum: 208e8f1b96f5ee47d28d76d0f7738f0ae7e355cb9aa24dcb88a8c4d9aa35bf833bf333c1ad4a6d11d18ec27b1713cac0ee04e0fdac17462059416a214f366944 - languageName: node - linkType: hard - "@aws-sdk/middleware-retry@npm:3.282.0": version: 3.282.0 resolution: "@aws-sdk/middleware-retry@npm:3.282.0" @@ -1394,20 +1131,6 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/middleware-sdk-sts@npm:3.272.0": - version: 3.272.0 - resolution: "@aws-sdk/middleware-sdk-sts@npm:3.272.0" - dependencies: - "@aws-sdk/middleware-signing": 3.272.0 - "@aws-sdk/property-provider": 3.272.0 - "@aws-sdk/protocol-http": 3.272.0 - "@aws-sdk/signature-v4": 3.272.0 - "@aws-sdk/types": 3.272.0 - tslib: ^2.3.1 - checksum: d808f945ae7354ef7102737418794565f26af3ca3241c3873235284400a13faf118242e92eba1831c25fc249d9c6a15f3c16e4ae3101cd6d5ab175a669b70fcb - languageName: node - linkType: hard - "@aws-sdk/middleware-sdk-sts@npm:3.282.0": version: 3.282.0 resolution: "@aws-sdk/middleware-sdk-sts@npm:3.282.0" @@ -1432,20 +1155,6 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/middleware-signing@npm:3.272.0": - version: 3.272.0 - resolution: "@aws-sdk/middleware-signing@npm:3.272.0" - dependencies: - "@aws-sdk/property-provider": 3.272.0 - "@aws-sdk/protocol-http": 3.272.0 - "@aws-sdk/signature-v4": 3.272.0 - "@aws-sdk/types": 3.272.0 - "@aws-sdk/util-middleware": 3.272.0 - tslib: ^2.3.1 - checksum: 0b711de21b0f2b28178b211ae2de962676038ed49ff9247810c2213018b77ca399285278a0b448a0242f92796e1360b83c09aa268fe64a7f153428b9ed919edc - languageName: node - linkType: hard - "@aws-sdk/middleware-signing@npm:3.282.0": version: 3.282.0 resolution: "@aws-sdk/middleware-signing@npm:3.282.0" @@ -1479,17 +1188,6 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/middleware-user-agent@npm:3.272.0": - version: 3.272.0 - resolution: "@aws-sdk/middleware-user-agent@npm:3.272.0" - dependencies: - "@aws-sdk/protocol-http": 3.272.0 - "@aws-sdk/types": 3.272.0 - tslib: ^2.3.1 - checksum: a392a8c68509f118f008002e4ef6ba7fea9f93ade97963449e6eec951c0319a7cc8fd40cf77bda1540ff25ebbbe75785a6fc5ed4be63676144e5242892940732 - languageName: node - linkType: hard - "@aws-sdk/middleware-user-agent@npm:3.282.0": version: 3.282.0 resolution: "@aws-sdk/middleware-user-agent@npm:3.282.0" @@ -1513,19 +1211,6 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/node-http-handler@npm:3.272.0": - version: 3.272.0 - resolution: "@aws-sdk/node-http-handler@npm:3.272.0" - dependencies: - "@aws-sdk/abort-controller": 3.272.0 - "@aws-sdk/protocol-http": 3.272.0 - "@aws-sdk/querystring-builder": 3.272.0 - "@aws-sdk/types": 3.272.0 - tslib: ^2.3.1 - checksum: cbcdab82a7611d1d776197e921563ac6248173aa6e5a6f6e6486a735c71763ae69d1d6ae6de8acebcb8020cdfa089a776d9180929397291623db8f11a1f7b8a9 - languageName: node - linkType: hard - "@aws-sdk/node-http-handler@npm:3.282.0, @aws-sdk/node-http-handler@npm:^3.208.0": version: 3.282.0 resolution: "@aws-sdk/node-http-handler@npm:3.282.0" @@ -1559,16 +1244,6 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/protocol-http@npm:3.272.0": - version: 3.272.0 - resolution: "@aws-sdk/protocol-http@npm:3.272.0" - dependencies: - "@aws-sdk/types": 3.272.0 - tslib: ^2.3.1 - checksum: 59d7c97b1a46bc3c072f56caec365472c9d94638923799ad2418cee52bb0eab945ab080cd63f5351ff45ad943dde9d88b294e096af36524e184c0764b2ea6cc5 - languageName: node - linkType: hard - "@aws-sdk/protocol-http@npm:3.282.0": version: 3.282.0 resolution: "@aws-sdk/protocol-http@npm:3.282.0" @@ -1646,21 +1321,6 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/signature-v4@npm:3.272.0": - version: 3.272.0 - resolution: "@aws-sdk/signature-v4@npm:3.272.0" - dependencies: - "@aws-sdk/is-array-buffer": 3.201.0 - "@aws-sdk/types": 3.272.0 - "@aws-sdk/util-hex-encoding": 3.201.0 - "@aws-sdk/util-middleware": 3.272.0 - "@aws-sdk/util-uri-escape": 3.201.0 - "@aws-sdk/util-utf8": 3.254.0 - tslib: ^2.3.1 - checksum: bdf997ed7779e173797bd31a9ae39bc9860e12cb7d0a734b4a47c76bde435c5c1d5f56dbb3c5f1a2b26a828367fd88f34a4527b8a12d4c1a60b3b0049aacf706 - languageName: node - linkType: hard - "@aws-sdk/signature-v4@npm:3.282.0": version: 3.282.0 resolution: "@aws-sdk/signature-v4@npm:3.282.0" @@ -1676,17 +1336,6 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/smithy-client@npm:3.272.0": - version: 3.272.0 - resolution: "@aws-sdk/smithy-client@npm:3.272.0" - dependencies: - "@aws-sdk/middleware-stack": 3.272.0 - "@aws-sdk/types": 3.272.0 - tslib: ^2.3.1 - checksum: 8ba3c4733a32c7c28ec06735b0fc3dbc33a1657bfc54dc28f6770b021fda74680c693812d8c6db2291197a275f32fd80be909dddda4eb726328bf34e8d18bccc - languageName: node - linkType: hard - "@aws-sdk/smithy-client@npm:3.279.0": version: 3.279.0 resolution: "@aws-sdk/smithy-client@npm:3.279.0" @@ -1698,19 +1347,6 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/token-providers@npm:3.272.0": - version: 3.272.0 - resolution: "@aws-sdk/token-providers@npm:3.272.0" - dependencies: - "@aws-sdk/client-sso-oidc": 3.272.0 - "@aws-sdk/property-provider": 3.272.0 - "@aws-sdk/shared-ini-file-loader": 3.272.0 - "@aws-sdk/types": 3.272.0 - tslib: ^2.3.1 - checksum: 8d49846f4ad124707879a9b8adaea089c4d02dfd1c15dcceb083fecd538ecce1db65f1104e6178b13941acb2a4ae275c5cf9eb586d5d25757eb9fb454bdbb70c - languageName: node - linkType: hard - "@aws-sdk/token-providers@npm:3.282.0": version: 3.282.0 resolution: "@aws-sdk/token-providers@npm:3.282.0" @@ -1807,18 +1443,6 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/util-defaults-mode-browser@npm:3.272.0": - version: 3.272.0 - resolution: "@aws-sdk/util-defaults-mode-browser@npm:3.272.0" - dependencies: - "@aws-sdk/property-provider": 3.272.0 - "@aws-sdk/types": 3.272.0 - bowser: ^2.11.0 - tslib: ^2.3.1 - checksum: 56594cc954c6431ced3646668fd92d8229eb1c20a37d6c66b0ebf3ce88a7f9803c63d432c78412768ebf0d141fdacef01644ea0f3507e6fb295a22c80f728c1a - languageName: node - linkType: hard - "@aws-sdk/util-defaults-mode-browser@npm:3.279.0": version: 3.279.0 resolution: "@aws-sdk/util-defaults-mode-browser@npm:3.279.0" @@ -1831,20 +1455,6 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/util-defaults-mode-node@npm:3.272.0": - version: 3.272.0 - resolution: "@aws-sdk/util-defaults-mode-node@npm:3.272.0" - dependencies: - "@aws-sdk/config-resolver": 3.272.0 - "@aws-sdk/credential-provider-imds": 3.272.0 - "@aws-sdk/node-config-provider": 3.272.0 - "@aws-sdk/property-provider": 3.272.0 - "@aws-sdk/types": 3.272.0 - tslib: ^2.3.1 - checksum: ee0e44d78d70b6eab73d6e8455972218cb1a15950f47d81d72d094420b2719add34bf46218016f85242a2a155216d2a0542ed5f4e68e171efc09691125fcb6fd - languageName: node - linkType: hard - "@aws-sdk/util-defaults-mode-node@npm:3.282.0": version: 3.282.0 resolution: "@aws-sdk/util-defaults-mode-node@npm:3.282.0" @@ -1946,17 +1556,6 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/util-user-agent-browser@npm:3.272.0": - version: 3.272.0 - resolution: "@aws-sdk/util-user-agent-browser@npm:3.272.0" - dependencies: - "@aws-sdk/types": 3.272.0 - bowser: ^2.11.0 - tslib: ^2.3.1 - checksum: e5ac1b88f9af45c2e0dbec40d2aa9c616634df252ac437f2dfd3aeb316fe561a5c09d481c075945843b3a7f5edafbc10ef26741c6ccacc4d435d8be7eeab179c - languageName: node - linkType: hard - "@aws-sdk/util-user-agent-browser@npm:3.282.0": version: 3.282.0 resolution: "@aws-sdk/util-user-agent-browser@npm:3.282.0" @@ -1968,22 +1567,6 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/util-user-agent-node@npm:3.272.0": - version: 3.272.0 - resolution: "@aws-sdk/util-user-agent-node@npm:3.272.0" - dependencies: - "@aws-sdk/node-config-provider": 3.272.0 - "@aws-sdk/types": 3.272.0 - tslib: ^2.3.1 - peerDependencies: - aws-crt: ">=1.0.0" - peerDependenciesMeta: - aws-crt: - optional: true - checksum: 25d5f39349190e6323f893de4f0e7a931751bf1521808210515ef8d951c1a6a3e5f1dc1773cbd5ca9f999c5d00f3a421ad570b5f79b20dc2692012a9f833ff24 - languageName: node - linkType: hard - "@aws-sdk/util-user-agent-node@npm:3.282.0": version: 3.282.0 resolution: "@aws-sdk/util-user-agent-node@npm:3.282.0" @@ -2075,13 +1658,6 @@ __metadata: languageName: node linkType: hard -"@azure/core-asynciterator-polyfill@npm:^1.0.0": - version: 1.0.0 - resolution: "@azure/core-asynciterator-polyfill@npm:1.0.0" - checksum: b6d3ab3f0ffc0a9f426a1d2cc90b81778730b14d81af7dcab9760c9e241f7c0f6843d45fad572dcd1379232b3fb2cacd76d110a0d54a999ceb1bf0fd9ed39e99 - languageName: node - linkType: hard - "@azure/core-auth@npm:^1.1.4, @azure/core-auth@npm:^1.3.0, @azure/core-auth@npm:^1.4.0": version: 1.4.0 resolution: "@azure/core-auth@npm:1.4.0" @@ -2107,26 +1683,25 @@ __metadata: languageName: node linkType: hard -"@azure/core-http@npm:^2.0.0": - version: 2.2.4 - resolution: "@azure/core-http@npm:2.2.4" +"@azure/core-http@npm:^3.0.0": + version: 3.0.0 + resolution: "@azure/core-http@npm:3.0.0" dependencies: "@azure/abort-controller": ^1.0.0 - "@azure/core-asynciterator-polyfill": ^1.0.0 "@azure/core-auth": ^1.3.0 "@azure/core-tracing": 1.0.0-preview.13 + "@azure/core-util": ^1.1.1 "@azure/logger": ^1.0.0 "@types/node-fetch": ^2.5.0 "@types/tunnel": ^0.0.3 form-data: ^4.0.0 node-fetch: ^2.6.7 process: ^0.11.10 - tough-cookie: ^4.0.0 tslib: ^2.2.0 tunnel: ^0.0.6 uuid: ^8.3.0 xml2js: ^0.4.19 - checksum: abda8c34c6d54f61b77080b1d4c01b3828cf9a344eb100346ebcc5ef9903d8f57651fbc73c0230afad5fe497c5c6da576a77cf43827f87417cecac7d7e612967 + checksum: 9b6885a60a8fdac924cc9544e09d66757ff4ed51ed20ce3c279321e684e21c295c091ad9d45477e02baae5255e3a92c5fbb2ac46687d261d66488c294b32846f languageName: node linkType: hard @@ -2188,12 +1763,13 @@ __metadata: languageName: node linkType: hard -"@azure/core-util@npm:^1.0.0": - version: 1.0.0 - resolution: "@azure/core-util@npm:1.0.0" +"@azure/core-util@npm:^1.0.0, @azure/core-util@npm:^1.1.1": + version: 1.2.0 + resolution: "@azure/core-util@npm:1.2.0" dependencies: + "@azure/abort-controller": ^1.0.0 tslib: ^2.2.0 - checksum: a0a9cce9452f78babb224fa2ea5566811bd946c55e5c867ca75e6ecd7fcf796b2ec2aa7424e141f03d8e14141e80f048897d0d3c227a7ff0bbaa9ba3d2fc14c9 + checksum: 58c7e3c9e9fda27242c1ab1dbfcf11eab52cc3e6459a2509fa5572a3faebf3f24c6bf9d92883cd80974119fc1e2c16c7bd2c71f20cfbe670405515c73fdb4093 languageName: node linkType: hard @@ -2293,18 +1869,18 @@ __metadata: linkType: hard "@azure/storage-blob@npm:^12.5.0": - version: 12.12.0 - resolution: "@azure/storage-blob@npm:12.12.0" + version: 12.13.0 + resolution: "@azure/storage-blob@npm:12.13.0" dependencies: "@azure/abort-controller": ^1.0.0 - "@azure/core-http": ^2.0.0 + "@azure/core-http": ^3.0.0 "@azure/core-lro": ^2.2.0 "@azure/core-paging": ^1.1.1 "@azure/core-tracing": 1.0.0-preview.13 "@azure/logger": ^1.0.0 events: ^3.0.0 tslib: ^2.2.0 - checksum: bb7f6514a251f8ec337718088b8c9ba80e27b34c786b7fb380fdca19eb3735a0da917dcfcdacef27d0eb256d007a37f89f3d6b08c55405cbcc04685f2a51da3b + checksum: 1509b8904eb46937b76f9acc04e9e0c39e8e9219a3bc3f5c006df7eb4d29ff2ed0ebbecc875f9372b5a349639e79123b30bbfb407864cfe91633dd6871a9bd99 languageName: node linkType: hard @@ -5373,7 +4949,6 @@ __metadata: "@backstage/config": "workspace:^" "@backstage/errors": "workspace:^" "@backstage/integration": "workspace:^" - "@backstage/plugin-catalog-backend": "workspace:^" "@backstage/plugin-catalog-common": "workspace:^" "@backstage/plugin-catalog-node": "workspace:^" "@backstage/plugin-kubernetes-common": "workspace:^" @@ -5404,7 +4979,6 @@ __metadata: "@backstage/config": "workspace:^" "@backstage/errors": "workspace:^" "@backstage/integration": "workspace:^" - "@backstage/plugin-catalog-backend": "workspace:^" "@backstage/plugin-catalog-node": "workspace:^" "@backstage/types": "workspace:^" "@types/lodash": ^4.14.151 @@ -5431,7 +5005,6 @@ __metadata: "@backstage/config": "workspace:^" "@backstage/integration": "workspace:^" "@backstage/plugin-bitbucket-cloud-common": "workspace:^" - "@backstage/plugin-catalog-backend": "workspace:^" "@backstage/plugin-catalog-common": "workspace:^" "@backstage/plugin-catalog-node": "workspace:^" "@backstage/plugin-events-node": "workspace:^" @@ -5455,7 +5028,6 @@ __metadata: "@backstage/config": "workspace:^" "@backstage/errors": "workspace:^" "@backstage/integration": "workspace:^" - "@backstage/plugin-catalog-backend": "workspace:^" "@backstage/plugin-catalog-node": "workspace:^" "@types/node-fetch": ^2.5.12 luxon: ^3.0.0 @@ -5478,7 +5050,7 @@ __metadata: "@backstage/errors": "workspace:^" "@backstage/integration": "workspace:^" "@backstage/plugin-bitbucket-cloud-common": "workspace:^" - "@backstage/plugin-catalog-backend": "workspace:^" + "@backstage/plugin-catalog-node": "workspace:^" "@backstage/types": "workspace:^" "@types/lodash": ^4.14.151 lodash: ^4.17.21 @@ -5501,7 +5073,6 @@ __metadata: "@backstage/config": "workspace:^" "@backstage/errors": "workspace:^" "@backstage/integration": "workspace:^" - "@backstage/plugin-catalog-backend": "workspace:^" "@backstage/plugin-catalog-node": "workspace:^" "@types/fs-extra": ^9.0.1 fs-extra: 10.1.0 @@ -5559,7 +5130,6 @@ __metadata: "@backstage/config": "workspace:^" "@backstage/errors": "workspace:^" "@backstage/integration": "workspace:^" - "@backstage/plugin-catalog-backend": "workspace:^" "@backstage/plugin-catalog-node": "workspace:^" "@backstage/types": "workspace:^" "@types/lodash": ^4.14.151 @@ -5612,7 +5182,7 @@ __metadata: "@backstage/cli": "workspace:^" "@backstage/config": "workspace:^" "@backstage/errors": "workspace:^" - "@backstage/plugin-catalog-backend": "workspace:^" + "@backstage/plugin-catalog-node": "workspace:^" "@backstage/types": "workspace:^" "@types/ldapjs": ^2.2.0 "@types/lodash": ^4.14.151 @@ -5635,7 +5205,6 @@ __metadata: "@backstage/catalog-model": "workspace:^" "@backstage/cli": "workspace:^" "@backstage/config": "workspace:^" - "@backstage/plugin-catalog-backend": "workspace:^" "@backstage/plugin-catalog-node": "workspace:^" "@microsoft/microsoft-graph-types": ^2.6.0 "@types/lodash": ^4.14.151 @@ -5676,13 +5245,14 @@ __metadata: resolution: "@backstage/plugin-catalog-backend-module-puppetdb@workspace:plugins/catalog-backend-module-puppetdb" dependencies: "@backstage/backend-common": "workspace:^" + "@backstage/backend-plugin-api": "workspace:^" "@backstage/backend-tasks": "workspace:^" "@backstage/backend-test-utils": "workspace:^" "@backstage/catalog-model": "workspace:^" "@backstage/cli": "workspace:^" "@backstage/config": "workspace:^" "@backstage/errors": "workspace:^" - "@backstage/plugin-catalog-backend": "workspace:^" + "@backstage/plugin-catalog-node": "workspace:^" "@backstage/types": "workspace:^" "@types/lodash": ^4.14.151 lodash: ^4.17.21 @@ -8180,6 +7750,7 @@ __metadata: "@types/express": ^4.17.6 "@types/fs-extra": ^9.0.1 "@types/git-url-parse": ^9.0.0 + "@types/luxon": ^3.0.0 "@types/mock-fs": ^4.13.0 "@types/nunjucks": ^3.1.4 "@types/supertest": ^2.0.8 @@ -8214,6 +7785,7 @@ __metadata: supertest: ^6.1.3 uuid: ^8.2.0 vm2: ^3.9.11 + wait-for-expect: ^3.0.2 winston: ^3.2.1 yaml: ^2.0.0 zen-observable: ^0.10.0 @@ -11580,50 +11152,50 @@ __metadata: languageName: node linkType: hard -"@jest/console@npm:^29.3.1": - version: 29.3.1 - resolution: "@jest/console@npm:29.3.1" +"@jest/console@npm:^29.4.3": + version: 29.4.3 + resolution: "@jest/console@npm:29.4.3" dependencies: - "@jest/types": ^29.3.1 + "@jest/types": ^29.4.3 "@types/node": "*" chalk: ^4.0.0 - jest-message-util: ^29.3.1 - jest-util: ^29.3.1 + jest-message-util: ^29.4.3 + jest-util: ^29.4.3 slash: ^3.0.0 - checksum: 9eecbfb6df4f5b810374849b7566d321255e6fd6e804546236650384966be532ff75a3e445a3277eadefe67ddf4dc56cd38332abd72d6a450f1bea9866efc6d7 + checksum: 8d9b163febe735153b523db527742309f4d598eda22f17f04e030060329bd3da4de7420fc1f7812f7a16f08273654a7de094c4b4e8b81a99dbfc17cfb1629008 languageName: node linkType: hard -"@jest/core@npm:^29.3.1": - version: 29.3.1 - resolution: "@jest/core@npm:29.3.1" +"@jest/core@npm:^29.4.3": + version: 29.4.3 + resolution: "@jest/core@npm:29.4.3" dependencies: - "@jest/console": ^29.3.1 - "@jest/reporters": ^29.3.1 - "@jest/test-result": ^29.3.1 - "@jest/transform": ^29.3.1 - "@jest/types": ^29.3.1 + "@jest/console": ^29.4.3 + "@jest/reporters": ^29.4.3 + "@jest/test-result": ^29.4.3 + "@jest/transform": ^29.4.3 + "@jest/types": ^29.4.3 "@types/node": "*" ansi-escapes: ^4.2.1 chalk: ^4.0.0 ci-info: ^3.2.0 exit: ^0.1.2 graceful-fs: ^4.2.9 - jest-changed-files: ^29.2.0 - jest-config: ^29.3.1 - jest-haste-map: ^29.3.1 - jest-message-util: ^29.3.1 - jest-regex-util: ^29.2.0 - jest-resolve: ^29.3.1 - jest-resolve-dependencies: ^29.3.1 - jest-runner: ^29.3.1 - jest-runtime: ^29.3.1 - jest-snapshot: ^29.3.1 - jest-util: ^29.3.1 - jest-validate: ^29.3.1 - jest-watcher: ^29.3.1 + jest-changed-files: ^29.4.3 + jest-config: ^29.4.3 + jest-haste-map: ^29.4.3 + jest-message-util: ^29.4.3 + jest-regex-util: ^29.4.3 + jest-resolve: ^29.4.3 + jest-resolve-dependencies: ^29.4.3 + jest-runner: ^29.4.3 + jest-runtime: ^29.4.3 + jest-snapshot: ^29.4.3 + jest-util: ^29.4.3 + jest-validate: ^29.4.3 + jest-watcher: ^29.4.3 micromatch: ^4.0.4 - pretty-format: ^29.3.1 + pretty-format: ^29.4.3 slash: ^3.0.0 strip-ansi: ^6.0.0 peerDependencies: @@ -11631,7 +11203,7 @@ __metadata: peerDependenciesMeta: node-notifier: optional: true - checksum: e3ac9201e8a084ccd832b17877b56490402b919f227622bb24f9372931e77b869e60959d34144222ce20fb619d0a6a6be20b257adb077a6b0f430a4584a45b0f + checksum: 4aa10644d66f44f051d5dd9cdcedce27acc71216dbcc5e7adebdea458e27aefe27c78f457d7efd49f58b968c35f42de5a521590876e2013593e675120b9e6ab1 languageName: node linkType: hard @@ -11644,15 +11216,15 @@ __metadata: languageName: node linkType: hard -"@jest/environment@npm:^29.3.1": - version: 29.3.1 - resolution: "@jest/environment@npm:29.3.1" +"@jest/environment@npm:^29.4.3": + version: 29.4.3 + resolution: "@jest/environment@npm:29.4.3" dependencies: - "@jest/fake-timers": ^29.3.1 - "@jest/types": ^29.3.1 + "@jest/fake-timers": ^29.4.3 + "@jest/types": ^29.4.3 "@types/node": "*" - jest-mock: ^29.3.1 - checksum: 974102aba7cc80508f787bb5504dcc96e5392e0a7776a63dffbf54ddc2c77d52ef4a3c08ed2eedec91965befff873f70cd7c9ed56f62bb132dcdb821730e6076 + jest-mock: ^29.4.3 + checksum: 7c1b0cc4e84b90f8a3bbeca9bbf088882c88aee70a81b3b8e24265dcb1cbc302cd1eee3319089cf65bfd39adbaea344903c712afea106cb8da6c86088d99c5fb languageName: node linkType: hard @@ -11665,60 +11237,60 @@ __metadata: languageName: node linkType: hard -"@jest/expect-utils@npm:^29.3.1": - version: 29.3.1 - resolution: "@jest/expect-utils@npm:29.3.1" +"@jest/expect-utils@npm:^29.4.3": + version: 29.4.3 + resolution: "@jest/expect-utils@npm:29.4.3" dependencies: - jest-get-type: ^29.2.0 - checksum: 7f3b853eb1e4299988f66b9aa49c1aacb7b8da1cf5518dca4ccd966e865947eed8f1bde6c8f5207d8400e9af870112a44b57aa83515ad6ea5e4a04a971863adb + jest-get-type: ^29.4.3 + checksum: 2bbed39ff2fb59f5acac465a1ce7303e3b4b62b479e4f386261986c9827f7f799ea912761e22629c5daf10addf8513f16733c14a29c2647bb66d4ee625e9ff92 languageName: node linkType: hard -"@jest/expect@npm:^29.3.1": - version: 29.3.1 - resolution: "@jest/expect@npm:29.3.1" +"@jest/expect@npm:^29.4.3": + version: 29.4.3 + resolution: "@jest/expect@npm:29.4.3" dependencies: - expect: ^29.3.1 - jest-snapshot: ^29.3.1 - checksum: 1d7b5cc735c8a99bfbed884d80fdb43b23b3456f4ec88c50fd86404b097bb77fba84f44e707fc9b49f106ca1154ae03f7c54dc34754b03f8a54eeb420196e5bf + expect: ^29.4.3 + jest-snapshot: ^29.4.3 + checksum: 08d0d40077ec99a7491fe59d05821dbd31126cfba70875855d8a063698b7126b5f6c309c50811caacc6ae2f727c6e44f51bdcf1d6c1ea832b4f020045ef22d45 languageName: node linkType: hard -"@jest/fake-timers@npm:^29.3.1": - version: 29.3.1 - resolution: "@jest/fake-timers@npm:29.3.1" +"@jest/fake-timers@npm:^29.4.3": + version: 29.4.3 + resolution: "@jest/fake-timers@npm:29.4.3" dependencies: - "@jest/types": ^29.3.1 - "@sinonjs/fake-timers": ^9.1.2 + "@jest/types": ^29.4.3 + "@sinonjs/fake-timers": ^10.0.2 "@types/node": "*" - jest-message-util: ^29.3.1 - jest-mock: ^29.3.1 - jest-util: ^29.3.1 - checksum: b1dafa8cdc439ef428cd772c775f0b22703677f52615513eda11a104bbfc352d7ec69b1225db95d4ef2e1b4ef0f23e1a7d96de5313aeb0950f672e6548ae069d + jest-message-util: ^29.4.3 + jest-mock: ^29.4.3 + jest-util: ^29.4.3 + checksum: adaceb9143c395cccf3d7baa0e49b7042c3092a554e8283146df19926247e34c21b5bde5688bb90e9e87b4a02e4587926c5d858ee0a38d397a63175d0a127874 languageName: node linkType: hard -"@jest/globals@npm:^29.3.1": - version: 29.3.1 - resolution: "@jest/globals@npm:29.3.1" +"@jest/globals@npm:^29.4.3": + version: 29.4.3 + resolution: "@jest/globals@npm:29.4.3" dependencies: - "@jest/environment": ^29.3.1 - "@jest/expect": ^29.3.1 - "@jest/types": ^29.3.1 - jest-mock: ^29.3.1 - checksum: 4d2b9458aabf7c28fd167e53984477498c897b64eec67a7f84b8fff465235cae1456ee0721cb0e7943f0cda443c7656adb9801f9f34e27495b8ebbd9f3033100 + "@jest/environment": ^29.4.3 + "@jest/expect": ^29.4.3 + "@jest/types": ^29.4.3 + jest-mock: ^29.4.3 + checksum: ea76b546ceb4aa5ce2bb3726df12f989b23150b51c9f7664790caa81b943012a657cf3a8525498af1c3518cdb387f54b816cfba1b0ddd22c7b20f03b1d7290b4 languageName: node linkType: hard -"@jest/reporters@npm:^29.3.1": - version: 29.3.1 - resolution: "@jest/reporters@npm:29.3.1" +"@jest/reporters@npm:^29.4.3": + version: 29.4.3 + resolution: "@jest/reporters@npm:29.4.3" dependencies: "@bcoe/v8-coverage": ^0.2.3 - "@jest/console": ^29.3.1 - "@jest/test-result": ^29.3.1 - "@jest/transform": ^29.3.1 - "@jest/types": ^29.3.1 + "@jest/console": ^29.4.3 + "@jest/test-result": ^29.4.3 + "@jest/transform": ^29.4.3 + "@jest/types": ^29.4.3 "@jridgewell/trace-mapping": ^0.3.15 "@types/node": "*" chalk: ^4.0.0 @@ -11731,9 +11303,9 @@ __metadata: istanbul-lib-report: ^3.0.0 istanbul-lib-source-maps: ^4.0.0 istanbul-reports: ^3.1.3 - jest-message-util: ^29.3.1 - jest-util: ^29.3.1 - jest-worker: ^29.3.1 + jest-message-util: ^29.4.3 + jest-util: ^29.4.3 + jest-worker: ^29.4.3 slash: ^3.0.0 string-length: ^4.0.1 strip-ansi: ^6.0.0 @@ -11743,7 +11315,7 @@ __metadata: peerDependenciesMeta: node-notifier: optional: true - checksum: 273e0c6953285f01151e9d84ac1e55744802a1ec79fb62dafeea16a49adfe7b24e7f35bef47a0214e5e057272dbfdacf594208286b7766046fd0f3cfa2043840 + checksum: 7aa2e429c915bd96c3334962addd69d2bbf52065725757ddde26b293f8c4420a1e8c65363cc3e1e5ec89100a5273ccd3771bec58325a2cc0d97afdc81995073a languageName: node linkType: hard @@ -11756,70 +11328,70 @@ __metadata: languageName: node linkType: hard -"@jest/schemas@npm:^29.0.0": - version: 29.0.0 - resolution: "@jest/schemas@npm:29.0.0" +"@jest/schemas@npm:^29.4.3": + version: 29.4.3 + resolution: "@jest/schemas@npm:29.4.3" dependencies: - "@sinclair/typebox": ^0.24.1 - checksum: 41355c78f09eb1097e57a3c5d0ca11c9099e235e01ea5fa4e3953562a79a6a9296c1d300f1ba50ca75236048829e056b00685cd2f1ff8285e56fd2ce01249acb + "@sinclair/typebox": ^0.25.16 + checksum: ac754e245c19dc39e10ebd41dce09040214c96a4cd8efa143b82148e383e45128f24599195ab4f01433adae4ccfbe2db6574c90db2862ccd8551a86704b5bebd languageName: node linkType: hard -"@jest/source-map@npm:^29.2.0": - version: 29.2.0 - resolution: "@jest/source-map@npm:29.2.0" +"@jest/source-map@npm:^29.4.3": + version: 29.4.3 + resolution: "@jest/source-map@npm:29.4.3" dependencies: "@jridgewell/trace-mapping": ^0.3.15 callsites: ^3.0.0 graceful-fs: ^4.2.9 - checksum: 09f76ab63d15dcf44b3035a79412164f43be34ec189575930f1a00c87e36ea0211ebd6a4fbe2253c2516e19b49b131f348ddbb86223ca7b6bbac9a6bc76ec96e + checksum: 2301d225145f8123540c0be073f35a80fd26a2f5e59550fd68525d8cea580fb896d12bf65106591ffb7366a8a19790076dbebc70e0f5e6ceb51f81827ed1f89c languageName: node linkType: hard -"@jest/test-result@npm:^29.3.1": - version: 29.3.1 - resolution: "@jest/test-result@npm:29.3.1" +"@jest/test-result@npm:^29.4.3": + version: 29.4.3 + resolution: "@jest/test-result@npm:29.4.3" dependencies: - "@jest/console": ^29.3.1 - "@jest/types": ^29.3.1 + "@jest/console": ^29.4.3 + "@jest/types": ^29.4.3 "@types/istanbul-lib-coverage": ^2.0.0 collect-v8-coverage: ^1.0.0 - checksum: b24ac283321189b624c372a6369c0674b0ee6d9e3902c213452c6334d037113718156b315364bee8cee0f03419c2bdff5e2c63967193fb422830e79cbb26866a + checksum: 164f102b96619ec283c2c39e208b8048e4674f75bf3c3a4f2e95048ae0f9226105add684b25f10d286d91c221625f877e2c1cfc3da46c42d7e1804da239318cb languageName: node linkType: hard -"@jest/test-sequencer@npm:^29.3.1": - version: 29.3.1 - resolution: "@jest/test-sequencer@npm:29.3.1" +"@jest/test-sequencer@npm:^29.4.3": + version: 29.4.3 + resolution: "@jest/test-sequencer@npm:29.4.3" dependencies: - "@jest/test-result": ^29.3.1 + "@jest/test-result": ^29.4.3 graceful-fs: ^4.2.9 - jest-haste-map: ^29.3.1 + jest-haste-map: ^29.4.3 slash: ^3.0.0 - checksum: a8325b1ea0ce644486fb63bb67cedd3524d04e3d7b1e6c1e3562bf12ef477ecd0cf34044391b2a07d925e1c0c8b4e0f3285035ceca3a474a2c55980f1708caf3 + checksum: 145e1fa9379e5be3587bde6d585b8aee5cf4442b06926928a87e9aec7de5be91b581711d627c6ca13144d244fe05e5d248c13b366b51bedc404f9dcfbfd79e9e languageName: node linkType: hard -"@jest/transform@npm:^29.3.1": - version: 29.3.1 - resolution: "@jest/transform@npm:29.3.1" +"@jest/transform@npm:^29.4.3": + version: 29.4.3 + resolution: "@jest/transform@npm:29.4.3" dependencies: "@babel/core": ^7.11.6 - "@jest/types": ^29.3.1 + "@jest/types": ^29.4.3 "@jridgewell/trace-mapping": ^0.3.15 babel-plugin-istanbul: ^6.1.1 chalk: ^4.0.0 convert-source-map: ^2.0.0 fast-json-stable-stringify: ^2.1.0 graceful-fs: ^4.2.9 - jest-haste-map: ^29.3.1 - jest-regex-util: ^29.2.0 - jest-util: ^29.3.1 + jest-haste-map: ^29.4.3 + jest-regex-util: ^29.4.3 + jest-util: ^29.4.3 micromatch: ^4.0.4 pirates: ^4.0.4 slash: ^3.0.0 - write-file-atomic: ^4.0.1 - checksum: 673df5900ffc95bc811084e09d6e47948034dea6ab6cc4f81f80977e3a52468a6c2284d0ba9796daf25a62ae50d12f7e97fc9a3a0c587f11f2a479ff5493ca53 + write-file-atomic: ^4.0.2 + checksum: 082d74e04044213aa7baa8de29f8383e5010034f867969c8602a2447a4ef2f484cfaf2491eba3179ce42f369f7a0af419cbd087910f7e5caf7aa5d1fe03f2ff9 languageName: node linkType: hard @@ -11850,17 +11422,17 @@ __metadata: languageName: node linkType: hard -"@jest/types@npm:^29.3.1": - version: 29.3.1 - resolution: "@jest/types@npm:29.3.1" +"@jest/types@npm:^29.4.3": + version: 29.4.3 + resolution: "@jest/types@npm:29.4.3" dependencies: - "@jest/schemas": ^29.0.0 + "@jest/schemas": ^29.4.3 "@types/istanbul-lib-coverage": ^2.0.0 "@types/istanbul-reports": ^3.0.0 "@types/node": "*" "@types/yargs": ^17.0.8 chalk: ^4.0.0 - checksum: 6f9faf27507b845ff3839c1adc6dbd038d7046d03d37e84c9fc956f60718711a801a5094c7eeee6b39ccf42c0ab61347fdc0fa49ab493ae5a8efd2fd41228ee8 + checksum: 1756f4149d360f98567f56f434144f7af23ed49a2c42889261a314df6b6654c2de70af618fb2ee0ee39cadaf10835b885845557184509503646c9cb9dcc02bac languageName: node linkType: hard @@ -13984,6 +13556,13 @@ __metadata: languageName: node linkType: hard +"@sinclair/typebox@npm:^0.25.16": + version: 0.25.23 + resolution: "@sinclair/typebox@npm:0.25.23" + checksum: 5720daec6e604be9ac849e6361cfa30d19f4d01934c9b79a3a5f5290dfcefaa300192ea0d384bb5dd0104432d88447bbad27adfacdf0b0f042b510bf15fbd5db + languageName: node + linkType: hard + "@sindresorhus/is@npm:^4.0.0": version: 4.0.0 resolution: "@sindresorhus/is@npm:4.0.0" @@ -14009,6 +13588,15 @@ __metadata: languageName: node linkType: hard +"@sinonjs/fake-timers@npm:^10.0.2": + version: 10.0.2 + resolution: "@sinonjs/fake-timers@npm:10.0.2" + dependencies: + "@sinonjs/commons": ^2.0.0 + checksum: c62aa98e7cefda8dedc101ce227abc888dc46b8ff9706c5f0a8dfd9c3ada97d0a5611384738d9ba0b26b59f99c2ba24efece8e779bb08329e9e87358fa309824 + languageName: node + linkType: hard + "@sinonjs/fake-timers@npm:^7.0.4": version: 7.1.2 resolution: "@sinonjs/fake-timers@npm:7.1.2" @@ -15450,12 +15038,12 @@ __metadata: linkType: hard "@types/jest@npm:*, @types/jest@npm:^29.0.0": - version: 29.2.6 - resolution: "@types/jest@npm:29.2.6" + version: 29.4.0 + resolution: "@types/jest@npm:29.4.0" dependencies: expect: ^29.0.0 pretty-format: ^29.0.0 - checksum: 90190ac830334af1470d255853f9621fe657e5030b4d96773fc1f884833cd303c76580b00c1b86dc38a8db94f1c7141d462190437a10af31852b8845a57c48ba + checksum: 23760282362a252e6690314584d83a47512d4cd61663e957ed3398ecf98195fe931c45606ee2f9def12f8ed7d8aa102d492ec42d26facdaf8b78094a31e6568e languageName: node linkType: hard @@ -16195,11 +15783,11 @@ __metadata: linkType: hard "@types/sanitize-html@npm:^2.6.2": - version: 2.8.0 - resolution: "@types/sanitize-html@npm:2.8.0" + version: 2.8.1 + resolution: "@types/sanitize-html@npm:2.8.1" dependencies: htmlparser2: ^8.0.0 - checksum: 6e583cac673832536fac8da53890073f753baf2c49826fd0c2831e615cb5527692d03b2b5ba9eb8caf8694de4bfb1c31fd12398d2b68331725590a6ceb8f82fe + checksum: 9c07d3a9d925e291472f74b097fb179b32659ea01834f728887811e5fc75cf2b17d844e32e97c0e583eba993af86a3f8250c82c8fa3152abf9ff2a8582972906 languageName: node linkType: hard @@ -17424,18 +17012,18 @@ __metadata: languageName: node linkType: hard -"apollo-reporting-protobuf@npm:^3.3.1, apollo-reporting-protobuf@npm:^3.3.3": - version: 3.3.3 - resolution: "apollo-reporting-protobuf@npm:3.3.3" +"apollo-reporting-protobuf@npm:^3.3.1, apollo-reporting-protobuf@npm:^3.4.0": + version: 3.4.0 + resolution: "apollo-reporting-protobuf@npm:3.4.0" dependencies: "@apollo/protobufjs": 1.2.6 - checksum: 6900db30476ef2e888ecef4c291e26579eba9695dc874ca8b3d1f93064bea307689172790b9d574849e5bdb371953ea38f2caddc5abb51e1ca197197f3d56d28 + checksum: 5bf50e9cecd3c2334cd12e0ebe59be6c4d7b1b9ee443c7d913011ea1b84513f57561fb6c3ceb66083321acb6d1c56f72e2ab0edf378cf742693409eb8dcdc46b languageName: node linkType: hard -"apollo-server-core@npm:^3.11.1": - version: 3.11.1 - resolution: "apollo-server-core@npm:3.11.1" +"apollo-server-core@npm:^3.12.0": + version: 3.12.0 + resolution: "apollo-server-core@npm:3.12.0" dependencies: "@apollo/utils.keyvaluecache": ^1.0.1 "@apollo/utils.logger": ^1.0.0 @@ -17446,11 +17034,11 @@ __metadata: "@graphql-tools/schema": ^8.0.0 "@josephg/resolvable": ^1.0.0 apollo-datasource: ^3.3.2 - apollo-reporting-protobuf: ^3.3.3 + apollo-reporting-protobuf: ^3.4.0 apollo-server-env: ^4.2.1 apollo-server-errors: ^3.3.1 - apollo-server-plugin-base: ^3.7.1 - apollo-server-types: ^3.7.1 + apollo-server-plugin-base: ^3.7.2 + apollo-server-types: ^3.8.0 async-retry: ^1.2.1 fast-json-stable-stringify: ^2.1.0 graphql-tag: ^2.11.0 @@ -17462,7 +17050,7 @@ __metadata: whatwg-mimetype: ^3.0.0 peerDependencies: graphql: ^15.3.0 || ^16.0.0 - checksum: a5cb7cff331680c2a926c64e88f744425b724bcfae46aeb02ae636d0b6f57a605e561eb284e765618bd0b2b5f8c556c92183f69852f2e4f5889368fee6aa38dc + checksum: b7a37a78901d38a330c9df8fe870da3dcf512f43ab60fdf9ab0ba37be03977db5d4b72eabf51a830d2a9dcfb2974d7bfbc5aa8719e3afac113c8bd7222740b8f languageName: node linkType: hard @@ -17484,9 +17072,9 @@ __metadata: languageName: node linkType: hard -"apollo-server-express@npm:^3.0.0, apollo-server-express@npm:^3.11.1": - version: 3.11.1 - resolution: "apollo-server-express@npm:3.11.1" +"apollo-server-express@npm:^3.0.0, apollo-server-express@npm:^3.12.0": + version: 3.12.0 + resolution: "apollo-server-express@npm:3.12.0" dependencies: "@types/accepts": ^1.3.5 "@types/body-parser": 1.19.2 @@ -17494,54 +17082,54 @@ __metadata: "@types/express": 4.17.14 "@types/express-serve-static-core": 4.17.31 accepts: ^1.3.5 - apollo-server-core: ^3.11.1 - apollo-server-types: ^3.7.1 + apollo-server-core: ^3.12.0 + apollo-server-types: ^3.8.0 body-parser: ^1.19.0 cors: ^2.8.5 parseurl: ^1.3.3 peerDependencies: express: ^4.17.1 graphql: ^15.3.0 || ^16.0.0 - checksum: 1db1a77aaa2f760c885233ded249b632e467bb4895d1c3f797df6e197a9ca7021c5b65dd8829e88fd6dbf32d925c7dcf62b48b949a518e2e31072c490302fa60 + checksum: bd4bc213f506e2aeb2be961961de51e431f8774344b349e9b02f475714a623703eb62423ad968a8f8b6859919ae0d1912c40cf15a4df24e6f81b4f4c5653e70b languageName: node linkType: hard -"apollo-server-plugin-base@npm:^3.7.1": - version: 3.7.1 - resolution: "apollo-server-plugin-base@npm:3.7.1" +"apollo-server-plugin-base@npm:^3.7.2": + version: 3.7.2 + resolution: "apollo-server-plugin-base@npm:3.7.2" dependencies: - apollo-server-types: ^3.7.1 + apollo-server-types: ^3.8.0 peerDependencies: graphql: ^15.3.0 || ^16.0.0 - checksum: db8c5f658da8c51c067bd6659b31ec2436d4961437b6f6f6b1b2a109d26764bc52a4dbe1bdafcb3c712b0e2f13ca10ed787e90423505685d2043a77363bdfc0b + checksum: d6ea6dbfad8bb82959286eae89878ccccbd09743c3df2b76bf790f470cbf5441ba06dcb6835a25f0bf32f4df05722cce157ae983ce32db4b69de8a72c9949e2e languageName: node linkType: hard -"apollo-server-types@npm:^3.7.1": - version: 3.7.1 - resolution: "apollo-server-types@npm:3.7.1" +"apollo-server-types@npm:^3.8.0": + version: 3.8.0 + resolution: "apollo-server-types@npm:3.8.0" dependencies: "@apollo/utils.keyvaluecache": ^1.0.1 "@apollo/utils.logger": ^1.0.0 - apollo-reporting-protobuf: ^3.3.3 + apollo-reporting-protobuf: ^3.4.0 apollo-server-env: ^4.2.1 peerDependencies: graphql: ^15.3.0 || ^16.0.0 - checksum: fe9a0847d0b8ab70dbe407b4ba1f5e506d351ff1f728193f4b308806e73b958f50537478a71edeefdd66fcf3dbf32ec732b6ffe6542860d5b683b1d657a019a2 + checksum: 20accd42b65ceb95819a1610c410488fbe548ee309227d7fa22fd17dd1205e557091ba9c9a20efa532192098a4193e34eb58fc91d762b55fdf31229ac9fc7133 languageName: node linkType: hard "apollo-server@npm:^3.0.0": - version: 3.11.1 - resolution: "apollo-server@npm:3.11.1" + version: 3.12.0 + resolution: "apollo-server@npm:3.12.0" dependencies: "@types/express": 4.17.14 - apollo-server-core: ^3.11.1 - apollo-server-express: ^3.11.1 + apollo-server-core: ^3.12.0 + apollo-server-express: ^3.12.0 express: ^4.17.1 peerDependencies: graphql: ^15.3.0 || ^16.0.0 - checksum: 6d4e981682e3b60313dddfe999c408c683f7e4cdeed5c14b6d6245b708808b94cb14df67ebe1b9df38df6b5193a9291089c41e287d014f2a9f94b2f3ecc9b376 + checksum: 6f3dade76f202f04a890b2385923a0319a859a0ab48121b1636e22d5eae83afe042d7a0a501aff3d8816e67de4f29f8efa598e350814a40f41d079610dee346e languageName: node linkType: hard @@ -18102,20 +17690,20 @@ __metadata: languageName: node linkType: hard -"babel-jest@npm:^29.3.1": - version: 29.3.1 - resolution: "babel-jest@npm:29.3.1" +"babel-jest@npm:^29.4.3": + version: 29.4.3 + resolution: "babel-jest@npm:29.4.3" dependencies: - "@jest/transform": ^29.3.1 + "@jest/transform": ^29.4.3 "@types/babel__core": ^7.1.14 babel-plugin-istanbul: ^6.1.1 - babel-preset-jest: ^29.2.0 + babel-preset-jest: ^29.4.3 chalk: ^4.0.0 graceful-fs: ^4.2.9 slash: ^3.0.0 peerDependencies: "@babel/core": ^7.8.0 - checksum: 793848238a771a931ddeb5930b9ec8ab800522ac8d64933665698f4a39603d157e572e20b57d79610277e1df88d3ee82b180d59a21f3570388f602beeb38a595 + checksum: a1a95937adb5e717dbffc2eb9e583fa6d26c7e5d5b07bb492a2d7f68631510a363e9ff097eafb642ad642dfac9dc2b13872b584f680e166a4f0922c98ea95853 languageName: node linkType: hard @@ -18141,15 +17729,15 @@ __metadata: languageName: node linkType: hard -"babel-plugin-jest-hoist@npm:^29.2.0": - version: 29.2.0 - resolution: "babel-plugin-jest-hoist@npm:29.2.0" +"babel-plugin-jest-hoist@npm:^29.4.3": + version: 29.4.3 + resolution: "babel-plugin-jest-hoist@npm:29.4.3" dependencies: "@babel/template": ^7.3.3 "@babel/types": ^7.3.3 "@types/babel__core": ^7.1.14 "@types/babel__traverse": ^7.0.6 - checksum: 368d271ceae491ae6b96cd691434859ea589fbe5fd5aead7660df75d02394077273c6442f61f390e9347adffab57a32b564d0fabcf1c53c4b83cd426cb644072 + checksum: c8702a6db6b30ec39dfb9f8e72b501c13895231ed80b15ed2648448f9f0c7b7cc4b1529beac31802ae655f63479a05110ca612815aa25fb1b0e6c874e1589137 languageName: node linkType: hard @@ -18288,15 +17876,15 @@ __metadata: languageName: node linkType: hard -"babel-preset-jest@npm:^29.2.0": - version: 29.2.0 - resolution: "babel-preset-jest@npm:29.2.0" +"babel-preset-jest@npm:^29.4.3": + version: 29.4.3 + resolution: "babel-preset-jest@npm:29.4.3" dependencies: - babel-plugin-jest-hoist: ^29.2.0 + babel-plugin-jest-hoist: ^29.4.3 babel-preset-current-node-syntax: ^1.0.0 peerDependencies: "@babel/core": ^7.0.0 - checksum: 1b09a2db968c36e064daf98082cfffa39c849b63055112ddc56fc2551fd0d4783897265775b1d2f8a257960a3339745de92e74feb01bad86d41c4cecbfa854fc + checksum: a091721861ea2f8d969ace8fe06570cff8f2e847dbc6e4800abacbe63f72131abde615ce0a3b6648472c97e55a5be7f8bf7ae381e2b194ad2fa1737096febcf5 languageName: node linkType: hard @@ -21539,10 +21127,10 @@ __metadata: languageName: node linkType: hard -"diff-sequences@npm:^29.3.1": - version: 29.3.1 - resolution: "diff-sequences@npm:29.3.1" - checksum: 8edab8c383355022e470779a099852d595dd856f9f5bd7af24f177e74138a668932268b4c4fd54096eed643861575c3652d4ecbbb1a9d710488286aed3ffa443 +"diff-sequences@npm:^29.4.3": + version: 29.4.3 + resolution: "diff-sequences@npm:29.4.3" + checksum: 28b265e04fdddcf7f9f814effe102cc95a9dec0564a579b5aed140edb24fc345c611ca52d76d725a3cab55d3888b915b5e8a4702e0f6058968a90fa5f41fcde7 languageName: node linkType: hard @@ -23452,16 +23040,16 @@ __metadata: languageName: node linkType: hard -"expect@npm:^29.0.0, expect@npm:^29.3.1": - version: 29.3.1 - resolution: "expect@npm:29.3.1" +"expect@npm:^29.0.0, expect@npm:^29.4.3": + version: 29.4.3 + resolution: "expect@npm:29.4.3" dependencies: - "@jest/expect-utils": ^29.3.1 - jest-get-type: ^29.2.0 - jest-matcher-utils: ^29.3.1 - jest-message-util: ^29.3.1 - jest-util: ^29.3.1 - checksum: e9588c2a430b558b9a3dc72d4ad05f36b047cb477bc6a7bb9cfeef7614fe7e5edbab424c2c0ce82739ee21ecbbbd24596259528209f84cd72500cc612d910d30 + "@jest/expect-utils": ^29.4.3 + jest-get-type: ^29.4.3 + jest-matcher-utils: ^29.4.3 + jest-message-util: ^29.4.3 + jest-util: ^29.4.3 + checksum: ff9dd8c50c0c6fd4b2b00f6dbd7ab0e2063fe1953be81a8c10ae1c005c7f5667ba452918e2efb055504b72b701a4f82575a081a0a7158efb16d87991b0366feb languageName: node linkType: hard @@ -27050,57 +26638,57 @@ __metadata: languageName: node linkType: hard -"jest-changed-files@npm:^29.2.0": - version: 29.2.0 - resolution: "jest-changed-files@npm:29.2.0" +"jest-changed-files@npm:^29.4.3": + version: 29.4.3 + resolution: "jest-changed-files@npm:29.4.3" dependencies: execa: ^5.0.0 p-limit: ^3.1.0 - checksum: 8ad8290324db1de2ee3c9443d3e3fbfdcb6d72ec7054c5796be2854b2bc239dea38a7c797c8c9c2bd959f539d44305790f2f75b18f3046b04317ed77c7480cb1 + checksum: 9a70bd8e92b37e18ad26d8bea97c516f41119fb7046b4255a13c76d557b0e54fa0629726de5a093fadfd6a0a08ce45da65a57086664d505b8db4b3133133e141 languageName: node linkType: hard -"jest-circus@npm:^29.3.1": - version: 29.3.1 - resolution: "jest-circus@npm:29.3.1" +"jest-circus@npm:^29.4.3": + version: 29.4.3 + resolution: "jest-circus@npm:29.4.3" dependencies: - "@jest/environment": ^29.3.1 - "@jest/expect": ^29.3.1 - "@jest/test-result": ^29.3.1 - "@jest/types": ^29.3.1 + "@jest/environment": ^29.4.3 + "@jest/expect": ^29.4.3 + "@jest/test-result": ^29.4.3 + "@jest/types": ^29.4.3 "@types/node": "*" chalk: ^4.0.0 co: ^4.6.0 dedent: ^0.7.0 is-generator-fn: ^2.0.0 - jest-each: ^29.3.1 - jest-matcher-utils: ^29.3.1 - jest-message-util: ^29.3.1 - jest-runtime: ^29.3.1 - jest-snapshot: ^29.3.1 - jest-util: ^29.3.1 + jest-each: ^29.4.3 + jest-matcher-utils: ^29.4.3 + jest-message-util: ^29.4.3 + jest-runtime: ^29.4.3 + jest-snapshot: ^29.4.3 + jest-util: ^29.4.3 p-limit: ^3.1.0 - pretty-format: ^29.3.1 + pretty-format: ^29.4.3 slash: ^3.0.0 stack-utils: ^2.0.3 - checksum: 125710debd998ad9693893e7c1235e271b79f104033b8169d82afe0bc0d883f8f5245feef87adcbb22ad27ff749fd001aa998d11a132774b03b4e2b8af77d5d8 + checksum: 2739bef9c888743b49ff3fe303131381618e5d2f250f613a91240d9c86e19e6874fc904cbd8bcb02ec9ec59a84e5dae4ffec929f0c6171e87ddbc05508a137f4 languageName: node linkType: hard -"jest-cli@npm:^29.3.1": - version: 29.3.1 - resolution: "jest-cli@npm:29.3.1" +"jest-cli@npm:^29.4.3": + version: 29.4.3 + resolution: "jest-cli@npm:29.4.3" dependencies: - "@jest/core": ^29.3.1 - "@jest/test-result": ^29.3.1 - "@jest/types": ^29.3.1 + "@jest/core": ^29.4.3 + "@jest/test-result": ^29.4.3 + "@jest/types": ^29.4.3 chalk: ^4.0.0 exit: ^0.1.2 graceful-fs: ^4.2.9 import-local: ^3.0.2 - jest-config: ^29.3.1 - jest-util: ^29.3.1 - jest-validate: ^29.3.1 + jest-config: ^29.4.3 + jest-util: ^29.4.3 + jest-validate: ^29.4.3 prompts: ^2.0.1 yargs: ^17.3.1 peerDependencies: @@ -27110,34 +26698,34 @@ __metadata: optional: true bin: jest: bin/jest.js - checksum: 829895d33060042443bd1e9e87eb68993773d74f2c8a9b863acf53cece39d227ae0e7d76df2e9c5934c414bdf70ce398a34b3122cfe22164acb2499a74d7288d + checksum: f4c9f6d76cde2c60a4169acbebb3f862728be03bcf3fe0077d2e55da7f9f3c3e9483cfa6e936832d35eabf96ee5ebf0300c4b0bd43cffff099801793466bfdd8 languageName: node linkType: hard -"jest-config@npm:^29.3.1": - version: 29.3.1 - resolution: "jest-config@npm:29.3.1" +"jest-config@npm:^29.4.3": + version: 29.4.3 + resolution: "jest-config@npm:29.4.3" dependencies: "@babel/core": ^7.11.6 - "@jest/test-sequencer": ^29.3.1 - "@jest/types": ^29.3.1 - babel-jest: ^29.3.1 + "@jest/test-sequencer": ^29.4.3 + "@jest/types": ^29.4.3 + babel-jest: ^29.4.3 chalk: ^4.0.0 ci-info: ^3.2.0 deepmerge: ^4.2.2 glob: ^7.1.3 graceful-fs: ^4.2.9 - jest-circus: ^29.3.1 - jest-environment-node: ^29.3.1 - jest-get-type: ^29.2.0 - jest-regex-util: ^29.2.0 - jest-resolve: ^29.3.1 - jest-runner: ^29.3.1 - jest-util: ^29.3.1 - jest-validate: ^29.3.1 + jest-circus: ^29.4.3 + jest-environment-node: ^29.4.3 + jest-get-type: ^29.4.3 + jest-regex-util: ^29.4.3 + jest-resolve: ^29.4.3 + jest-runner: ^29.4.3 + jest-util: ^29.4.3 + jest-validate: ^29.4.3 micromatch: ^4.0.4 parse-json: ^5.2.0 - pretty-format: ^29.3.1 + pretty-format: ^29.4.3 slash: ^3.0.0 strip-json-comments: ^3.1.1 peerDependencies: @@ -27148,7 +26736,7 @@ __metadata: optional: true ts-node: optional: true - checksum: 6e663f04ae1024a53a4c2c744499b4408ca9a8b74381dd5e31b11bb3c7393311ecff0fb61b06287768709eb2c9e5a2fd166d258f5a9123abbb4c5812f99c12fe + checksum: 92f9a9c6850b18682cb01892774a33967472af23a5844438d8c68077d5f2a29b15b665e4e4db7de3d74002a6dca158cd5b2cb9f5debfd2cce5e1aee6c74e3873 languageName: node linkType: hard @@ -27173,72 +26761,72 @@ __metadata: languageName: node linkType: hard -"jest-diff@npm:^29.3.1": - version: 29.3.1 - resolution: "jest-diff@npm:29.3.1" +"jest-diff@npm:^29.4.3": + version: 29.4.3 + resolution: "jest-diff@npm:29.4.3" dependencies: chalk: ^4.0.0 - diff-sequences: ^29.3.1 - jest-get-type: ^29.2.0 - pretty-format: ^29.3.1 - checksum: ac5c09745f2b1897e6f53216acaf6ed44fc4faed8e8df053ff4ac3db5d2a1d06a17b876e49faaa15c8a7a26f5671bcbed0a93781dcc2835f781c79a716a591a9 + diff-sequences: ^29.4.3 + jest-get-type: ^29.4.3 + pretty-format: ^29.4.3 + checksum: 877fd1edffef6b319688c27b152e5b28e2bc4bcda5ce0ca90d7e137f9fafda4280bae25403d4c0bfd9806c2c0b15d966aa2dfaf5f9928ec8f1ccea7fa1d08ed6 languageName: node linkType: hard -"jest-docblock@npm:^29.2.0": - version: 29.2.0 - resolution: "jest-docblock@npm:29.2.0" +"jest-docblock@npm:^29.4.3": + version: 29.4.3 + resolution: "jest-docblock@npm:29.4.3" dependencies: detect-newline: ^3.0.0 - checksum: b3f1227b7d73fc9e4952180303475cf337b36fa65c7f730ac92f0580f1c08439983262fee21cf3dba11429aa251b4eee1e3bc74796c5777116b400d78f9d2bbe + checksum: e0e9df1485bb8926e5b33478cdf84b3387d9caf3658e7dc1eaa6dc34cb93dea0d2d74797f6e940f0233a88f3dadd60957f2288eb8f95506361f85b84bf8661df languageName: node linkType: hard -"jest-each@npm:^29.3.1": - version: 29.3.1 - resolution: "jest-each@npm:29.3.1" +"jest-each@npm:^29.4.3": + version: 29.4.3 + resolution: "jest-each@npm:29.4.3" dependencies: - "@jest/types": ^29.3.1 + "@jest/types": ^29.4.3 chalk: ^4.0.0 - jest-get-type: ^29.2.0 - jest-util: ^29.3.1 - pretty-format: ^29.3.1 - checksum: 16d51ef8f96fba44a3479f1c6f7672027e3b39236dc4e41217c38fe60a3b66b022ffcee72f8835a442f7a8a0a65980a93fb8e73a9782d192452526e442ad049a + jest-get-type: ^29.4.3 + jest-util: ^29.4.3 + pretty-format: ^29.4.3 + checksum: 1f72738338399efab0139eaea18bc198be0c6ed889770c8cbfa70bf9c724e8171fe1d3a29a94f9f39b8493ee6b2529bb350fb7c7c75e0d7eddfd28c253c79f9d languageName: node linkType: hard "jest-environment-jsdom@npm:^29.0.2": - version: 29.3.1 - resolution: "jest-environment-jsdom@npm:29.3.1" + version: 29.4.3 + resolution: "jest-environment-jsdom@npm:29.4.3" dependencies: - "@jest/environment": ^29.3.1 - "@jest/fake-timers": ^29.3.1 - "@jest/types": ^29.3.1 + "@jest/environment": ^29.4.3 + "@jest/fake-timers": ^29.4.3 + "@jest/types": ^29.4.3 "@types/jsdom": ^20.0.0 "@types/node": "*" - jest-mock: ^29.3.1 - jest-util: ^29.3.1 + jest-mock: ^29.4.3 + jest-util: ^29.4.3 jsdom: ^20.0.0 peerDependencies: canvas: ^2.5.0 peerDependenciesMeta: canvas: optional: true - checksum: 91b04ed02b2275c3a47740e20c2691f67c4295e17174c8ccd3a71fe77707239e487506bd157279b4257ce1be0a8c2be377817ee85689966a9e604bb6ef1199f0 + checksum: 3fb29bb4b472e05a38fdb235aa936ad469dfa2f6c1cab97fe3d1a7c585351976d05c7bbbd715b9747f070a225dcf10a9166df1461e0fb838ea7a377a8e64bed4 languageName: node linkType: hard -"jest-environment-node@npm:^29.3.1": - version: 29.3.1 - resolution: "jest-environment-node@npm:29.3.1" +"jest-environment-node@npm:^29.4.3": + version: 29.4.3 + resolution: "jest-environment-node@npm:29.4.3" dependencies: - "@jest/environment": ^29.3.1 - "@jest/fake-timers": ^29.3.1 - "@jest/types": ^29.3.1 + "@jest/environment": ^29.4.3 + "@jest/fake-timers": ^29.4.3 + "@jest/types": ^29.4.3 "@types/node": "*" - jest-mock: ^29.3.1 - jest-util: ^29.3.1 - checksum: 16d4854bd2d35501bd4862ca069baf27ce9f5fd7642fdcab9d2dab49acd28c082d0c8882bf2bb28ed7bbaada486da577c814c9688ddc62d1d9f74a954fde996a + jest-mock: ^29.4.3 + jest-util: ^29.4.3 + checksum: 3c7362edfdbd516e83af7367c95dde35761a482b174de9735c07633405486ec73e19624e9bea4333fca33c24e8d65eaa1aa6594e0cb6bfeeeb564ccc431ee61d languageName: node linkType: hard @@ -27249,43 +26837,43 @@ __metadata: languageName: node linkType: hard -"jest-get-type@npm:^29.2.0": - version: 29.2.0 - resolution: "jest-get-type@npm:29.2.0" - checksum: e396fd880a30d08940ed8a8e43cd4595db1b8ff09649018eb358ca701811137556bae82626af73459e3c0f8c5e972ed1e57fd3b1537b13a260893dac60a90942 +"jest-get-type@npm:^29.4.3": + version: 29.4.3 + resolution: "jest-get-type@npm:29.4.3" + checksum: 6ac7f2dde1c65e292e4355b6c63b3a4897d7e92cb4c8afcf6d397f2682f8080e094c8b0b68205a74d269882ec06bf696a9de6cd3e1b7333531e5ed7b112605ce languageName: node linkType: hard -"jest-haste-map@npm:^29.3.1": - version: 29.3.1 - resolution: "jest-haste-map@npm:29.3.1" +"jest-haste-map@npm:^29.4.3": + version: 29.4.3 + resolution: "jest-haste-map@npm:29.4.3" dependencies: - "@jest/types": ^29.3.1 + "@jest/types": ^29.4.3 "@types/graceful-fs": ^4.1.3 "@types/node": "*" anymatch: ^3.0.3 fb-watchman: ^2.0.0 fsevents: ^2.3.2 graceful-fs: ^4.2.9 - jest-regex-util: ^29.2.0 - jest-util: ^29.3.1 - jest-worker: ^29.3.1 + jest-regex-util: ^29.4.3 + jest-util: ^29.4.3 + jest-worker: ^29.4.3 micromatch: ^4.0.4 walker: ^1.0.8 dependenciesMeta: fsevents: optional: true - checksum: 97ea26af0c28a2ba568c9c65d06211487bbcd501cb4944f9d55e07fd2b00ad96653ea2cc9033f3d5b7dc1feda33e47ae9cc56b400191ea4533be213c9f82e67c + checksum: c7a83ebe6008b3fe96a96235e8153092e54b14df68e0f4205faedec57450df26b658578495a71c6d82494c01fbb44bca98c1506a6b2b9c920696dcc5d2e2bc59 languageName: node linkType: hard -"jest-leak-detector@npm:^29.3.1": - version: 29.3.1 - resolution: "jest-leak-detector@npm:29.3.1" +"jest-leak-detector@npm:^29.4.3": + version: 29.4.3 + resolution: "jest-leak-detector@npm:29.4.3" dependencies: - jest-get-type: ^29.2.0 - pretty-format: ^29.3.1 - checksum: 0dd8ed31ae0b5a3d14f13f567ca8567f2663dd2d540d1e55511d3b3fd7f80a1d075392179674ebe9fab9be0b73678bf4d2f8bbbc0f4bdd52b9815259194da559 + jest-get-type: ^29.4.3 + pretty-format: ^29.4.3 + checksum: ec2b45e6f0abce81bd0dd0f6fd06b433c24d1ec865267af7640fae540ec868b93752598e407a9184d9c7419cbf32e8789007cc8c1be1a84f8f7321a0f8ad01f1 languageName: node linkType: hard @@ -27301,15 +26889,15 @@ __metadata: languageName: node linkType: hard -"jest-matcher-utils@npm:^29.3.1": - version: 29.3.1 - resolution: "jest-matcher-utils@npm:29.3.1" +"jest-matcher-utils@npm:^29.4.3": + version: 29.4.3 + resolution: "jest-matcher-utils@npm:29.4.3" dependencies: chalk: ^4.0.0 - jest-diff: ^29.3.1 - jest-get-type: ^29.2.0 - pretty-format: ^29.3.1 - checksum: 311e8d9f1e935216afc7dd8c6acf1fbda67a7415e1afb1bf72757213dfb025c1f2dc5e2c185c08064a35cdc1f2d8e40c57616666774ed1b03e57eb311c20ec77 + jest-diff: ^29.4.3 + jest-get-type: ^29.4.3 + pretty-format: ^29.4.3 + checksum: 9e13cbe42d2113bab2691110c7c3ba5cec3b94abad2727e1de90929d0f67da444e9b2066da3b476b5bf788df53a8ede0e0a950cfb06a04e4d6d566d115ee4f1d languageName: node linkType: hard @@ -27330,31 +26918,31 @@ __metadata: languageName: node linkType: hard -"jest-message-util@npm:^29.3.1": - version: 29.3.1 - resolution: "jest-message-util@npm:29.3.1" +"jest-message-util@npm:^29.4.3": + version: 29.4.3 + resolution: "jest-message-util@npm:29.4.3" dependencies: "@babel/code-frame": ^7.12.13 - "@jest/types": ^29.3.1 + "@jest/types": ^29.4.3 "@types/stack-utils": ^2.0.0 chalk: ^4.0.0 graceful-fs: ^4.2.9 micromatch: ^4.0.4 - pretty-format: ^29.3.1 + pretty-format: ^29.4.3 slash: ^3.0.0 stack-utils: ^2.0.3 - checksum: 15d0a2fca3919eb4570bbf575734780c4b9e22de6aae903c4531b346699f7deba834c6c86fe6e9a83ad17fac0f7935511cf16dce4d71a93a71ebb25f18a6e07b + checksum: 64f06b9550021e68da0059020bea8691283cf818918810bb67192d7b7fb9b691c7eadf55c2ca3cd04df5394918f2327245077095cdc0d6b04be3532d2c7d0ced languageName: node linkType: hard -"jest-mock@npm:^29.3.1": - version: 29.3.1 - resolution: "jest-mock@npm:29.3.1" +"jest-mock@npm:^29.4.3": + version: 29.4.3 + resolution: "jest-mock@npm:29.4.3" dependencies: - "@jest/types": ^29.3.1 + "@jest/types": ^29.4.3 "@types/node": "*" - jest-util: ^29.3.1 - checksum: 9098852cb2866db4a1a59f9f7581741dfc572f648e9e574a1b187fd69f5f2f6190ad387ede21e139a8b80a6a1343ecc3d6751cd2ae1ae11d7ea9fa1950390fb2 + jest-util: ^29.4.3 + checksum: 8eb4a29b02d2cd03faac0290b6df6d23b4ffa43f72b21c7fff3c7dd04a2797355b1e85862b70b15341dd33ee3a693b17db5520a6f6e6b81ee75601987de6a1a2 languageName: node linkType: hard @@ -27370,102 +26958,102 @@ __metadata: languageName: node linkType: hard -"jest-regex-util@npm:^29.2.0": - version: 29.2.0 - resolution: "jest-regex-util@npm:29.2.0" - checksum: 7c533e51c51230dac20c0d7395b19b8366cb022f7c6e08e6bcf2921626840ff90424af4c9b4689f02f0addfc9b071c4cd5f8f7a989298a4c8e0f9c94418ca1c3 +"jest-regex-util@npm:^29.4.3": + version: 29.4.3 + resolution: "jest-regex-util@npm:29.4.3" + checksum: 96fc7fc28cd4dd73a63c13a526202c4bd8b351d4e5b68b1a2a2c88da3308c2a16e26feaa593083eb0bac38cca1aa9dd05025412e7de013ba963fb8e66af22b8a languageName: node linkType: hard -"jest-resolve-dependencies@npm:^29.3.1": - version: 29.3.1 - resolution: "jest-resolve-dependencies@npm:29.3.1" +"jest-resolve-dependencies@npm:^29.4.3": + version: 29.4.3 + resolution: "jest-resolve-dependencies@npm:29.4.3" dependencies: - jest-regex-util: ^29.2.0 - jest-snapshot: ^29.3.1 - checksum: 6ec4727a87c6e7954e93de9949ab9967b340ee2f07626144c273355f05a2b65fa47eb8dece2d6e5f4fd99cdb893510a3540aa5e14ba443f70b3feb63f6f98982 + jest-regex-util: ^29.4.3 + jest-snapshot: ^29.4.3 + checksum: 3ad934cd2170c9658d8800f84a975dafc866ec85b7ce391c640c09c3744ced337787620d8667dc8d1fa5e0b1493f973caa1a1bb980e4e6a50b46a1720baf0bd1 languageName: node linkType: hard -"jest-resolve@npm:^29.3.1": - version: 29.3.1 - resolution: "jest-resolve@npm:29.3.1" +"jest-resolve@npm:^29.4.3": + version: 29.4.3 + resolution: "jest-resolve@npm:29.4.3" dependencies: chalk: ^4.0.0 graceful-fs: ^4.2.9 - jest-haste-map: ^29.3.1 + jest-haste-map: ^29.4.3 jest-pnp-resolver: ^1.2.2 - jest-util: ^29.3.1 - jest-validate: ^29.3.1 + jest-util: ^29.4.3 + jest-validate: ^29.4.3 resolve: ^1.20.0 - resolve.exports: ^1.1.0 + resolve.exports: ^2.0.0 slash: ^3.0.0 - checksum: 0dea22ed625e07b8bfee52dea1391d3a4b453c1a0c627a0fa7c22e44bb48e1c289afe6f3c316def70753773f099c4e8f436c7a2cc12fcc6c7dd6da38cba2cd5f + checksum: 056a66beccf833f3c7e5a8fc9bfec218886e87b0b103decdbdf11893669539df489d1490cd6d5f0eea35731e8be0d2e955a6710498f970d2eae734da4df029dc languageName: node linkType: hard -"jest-runner@npm:^29.3.1": - version: 29.3.1 - resolution: "jest-runner@npm:29.3.1" +"jest-runner@npm:^29.4.3": + version: 29.4.3 + resolution: "jest-runner@npm:29.4.3" dependencies: - "@jest/console": ^29.3.1 - "@jest/environment": ^29.3.1 - "@jest/test-result": ^29.3.1 - "@jest/transform": ^29.3.1 - "@jest/types": ^29.3.1 + "@jest/console": ^29.4.3 + "@jest/environment": ^29.4.3 + "@jest/test-result": ^29.4.3 + "@jest/transform": ^29.4.3 + "@jest/types": ^29.4.3 "@types/node": "*" chalk: ^4.0.0 emittery: ^0.13.1 graceful-fs: ^4.2.9 - jest-docblock: ^29.2.0 - jest-environment-node: ^29.3.1 - jest-haste-map: ^29.3.1 - jest-leak-detector: ^29.3.1 - jest-message-util: ^29.3.1 - jest-resolve: ^29.3.1 - jest-runtime: ^29.3.1 - jest-util: ^29.3.1 - jest-watcher: ^29.3.1 - jest-worker: ^29.3.1 + jest-docblock: ^29.4.3 + jest-environment-node: ^29.4.3 + jest-haste-map: ^29.4.3 + jest-leak-detector: ^29.4.3 + jest-message-util: ^29.4.3 + jest-resolve: ^29.4.3 + jest-runtime: ^29.4.3 + jest-util: ^29.4.3 + jest-watcher: ^29.4.3 + jest-worker: ^29.4.3 p-limit: ^3.1.0 source-map-support: 0.5.13 - checksum: 61ad445d8a5f29573332f27a21fc942fb0d2a82bf901a0ea1035bf3bd7f349d1e425f71f54c3a3f89b292a54872c3248d395a2829d987f26b6025b15530ea5d2 + checksum: c41108e5da01e0b8fdc2a06c5042eb49bb1d8db0e0d4651769fd1b9fe84ab45188617c11a3a8e1c83748b29bfe57dd77001ec57e86e3e3c30f3534e0314f8882 languageName: node linkType: hard -"jest-runtime@npm:^29.0.2, jest-runtime@npm:^29.3.1": - version: 29.3.1 - resolution: "jest-runtime@npm:29.3.1" +"jest-runtime@npm:^29.0.2, jest-runtime@npm:^29.4.3": + version: 29.4.3 + resolution: "jest-runtime@npm:29.4.3" dependencies: - "@jest/environment": ^29.3.1 - "@jest/fake-timers": ^29.3.1 - "@jest/globals": ^29.3.1 - "@jest/source-map": ^29.2.0 - "@jest/test-result": ^29.3.1 - "@jest/transform": ^29.3.1 - "@jest/types": ^29.3.1 + "@jest/environment": ^29.4.3 + "@jest/fake-timers": ^29.4.3 + "@jest/globals": ^29.4.3 + "@jest/source-map": ^29.4.3 + "@jest/test-result": ^29.4.3 + "@jest/transform": ^29.4.3 + "@jest/types": ^29.4.3 "@types/node": "*" chalk: ^4.0.0 cjs-module-lexer: ^1.0.0 collect-v8-coverage: ^1.0.0 glob: ^7.1.3 graceful-fs: ^4.2.9 - jest-haste-map: ^29.3.1 - jest-message-util: ^29.3.1 - jest-mock: ^29.3.1 - jest-regex-util: ^29.2.0 - jest-resolve: ^29.3.1 - jest-snapshot: ^29.3.1 - jest-util: ^29.3.1 + jest-haste-map: ^29.4.3 + jest-message-util: ^29.4.3 + jest-mock: ^29.4.3 + jest-regex-util: ^29.4.3 + jest-resolve: ^29.4.3 + jest-snapshot: ^29.4.3 + jest-util: ^29.4.3 slash: ^3.0.0 strip-bom: ^4.0.0 - checksum: 82f27b48f000be074064a854e16e768f9453e9b791d8c5f9316606c37f871b5b10f70544c1b218ab9784f00bd972bb77f868c5ab6752c275be2cd219c351f5a7 + checksum: b99f8a910d1a38e7476058ba04ad44dfd3d93e837bb7c301d691e646a1085412fde87f06fbe271c9145f0e72d89400bfa7f6994bc30d456c7742269f37d0f570 languageName: node linkType: hard -"jest-snapshot@npm:^29.3.1": - version: 29.3.1 - resolution: "jest-snapshot@npm:29.3.1" +"jest-snapshot@npm:^29.4.3": + version: 29.4.3 + resolution: "jest-snapshot@npm:29.4.3" dependencies: "@babel/core": ^7.11.6 "@babel/generator": ^7.7.2 @@ -27473,25 +27061,25 @@ __metadata: "@babel/plugin-syntax-typescript": ^7.7.2 "@babel/traverse": ^7.7.2 "@babel/types": ^7.3.3 - "@jest/expect-utils": ^29.3.1 - "@jest/transform": ^29.3.1 - "@jest/types": ^29.3.1 + "@jest/expect-utils": ^29.4.3 + "@jest/transform": ^29.4.3 + "@jest/types": ^29.4.3 "@types/babel__traverse": ^7.0.6 "@types/prettier": ^2.1.5 babel-preset-current-node-syntax: ^1.0.0 chalk: ^4.0.0 - expect: ^29.3.1 + expect: ^29.4.3 graceful-fs: ^4.2.9 - jest-diff: ^29.3.1 - jest-get-type: ^29.2.0 - jest-haste-map: ^29.3.1 - jest-matcher-utils: ^29.3.1 - jest-message-util: ^29.3.1 - jest-util: ^29.3.1 + jest-diff: ^29.4.3 + jest-get-type: ^29.4.3 + jest-haste-map: ^29.4.3 + jest-matcher-utils: ^29.4.3 + jest-message-util: ^29.4.3 + jest-util: ^29.4.3 natural-compare: ^1.4.0 - pretty-format: ^29.3.1 + pretty-format: ^29.4.3 semver: ^7.3.5 - checksum: d7d0077935e78c353c828be78ccb092e12ba7622cb0577f21641fadd728ae63a7c1f4a0d8113bfb38db3453a64bfa232fb1cdeefe0e2b48c52ef4065b0ab75ae + checksum: 79ba52f2435e23ce72b1309be4b17fdbcb299d1c2ce97ebb61df9a62711e9463035f63b4c849181b2fe5aa17b3e09d30ee4668cc25fb3c6f59511c010b4d9494 languageName: node linkType: hard @@ -27509,47 +27097,47 @@ __metadata: languageName: node linkType: hard -"jest-util@npm:^29.3.1": - version: 29.3.1 - resolution: "jest-util@npm:29.3.1" +"jest-util@npm:^29.4.3": + version: 29.4.3 + resolution: "jest-util@npm:29.4.3" dependencies: - "@jest/types": ^29.3.1 + "@jest/types": ^29.4.3 "@types/node": "*" chalk: ^4.0.0 ci-info: ^3.2.0 graceful-fs: ^4.2.9 picomatch: ^2.2.3 - checksum: f67c60f062b94d21cb60e84b3b812d64b7bfa81fe980151de5c17a74eb666042d0134e2e756d099b7606a1fcf1d633824d2e58197d01d76dde1e2dc00dfcd413 + checksum: 606b3e6077895baf8fb4ad4d08c134f37a6b81d5ba77ae654c942b1ae4b7294ab3b5a0eb93db34f129407b367970cf3b76bf5c80897b30f215f2bc8bf20a5f3f languageName: node linkType: hard -"jest-validate@npm:^29.3.1": - version: 29.3.1 - resolution: "jest-validate@npm:29.3.1" +"jest-validate@npm:^29.4.3": + version: 29.4.3 + resolution: "jest-validate@npm:29.4.3" dependencies: - "@jest/types": ^29.3.1 + "@jest/types": ^29.4.3 camelcase: ^6.2.0 chalk: ^4.0.0 - jest-get-type: ^29.2.0 + jest-get-type: ^29.4.3 leven: ^3.1.0 - pretty-format: ^29.3.1 - checksum: 92584f0b8ac284235f12b3b812ccbc43ef6dea080a3b98b1aa81adbe009e962d0aa6131f21c8157b30ac3d58f335961694238a93d553d1d1e02ab264c923778c + pretty-format: ^29.4.3 + checksum: 983e56430d86bed238448cae031535c1d908f760aa312cd4a4ec0e92f3bc1b6675415ddf57cdeceedb8ad9c698e5bcd10f0a856dfc93a8923bdecc7733f4ba80 languageName: node linkType: hard -"jest-watcher@npm:^29.3.1": - version: 29.3.1 - resolution: "jest-watcher@npm:29.3.1" +"jest-watcher@npm:^29.4.3": + version: 29.4.3 + resolution: "jest-watcher@npm:29.4.3" dependencies: - "@jest/test-result": ^29.3.1 - "@jest/types": ^29.3.1 + "@jest/test-result": ^29.4.3 + "@jest/types": ^29.4.3 "@types/node": "*" ansi-escapes: ^4.2.1 chalk: ^4.0.0 emittery: ^0.13.1 - jest-util: ^29.3.1 + jest-util: ^29.4.3 string-length: ^4.0.1 - checksum: 60d189473486c73e9d540406a30189da5a3c67bfb0fb4ad4a83991c189135ef76d929ec99284ca5a505fe4ee9349ae3c99b54d2e00363e72837b46e77dec9642 + checksum: 44b64991b3414db853c3756f14690028f4edef7aebfb204a4291cc1901c2239fa27a8687c5c5abbecc74bf613e0bb9b1378bf766430c9febcc71e9c0cb5ad8fc languageName: node linkType: hard @@ -27584,26 +27172,26 @@ __metadata: languageName: node linkType: hard -"jest-worker@npm:^29.3.1": - version: 29.3.1 - resolution: "jest-worker@npm:29.3.1" +"jest-worker@npm:^29.4.3": + version: 29.4.3 + resolution: "jest-worker@npm:29.4.3" dependencies: "@types/node": "*" - jest-util: ^29.3.1 + jest-util: ^29.4.3 merge-stream: ^2.0.0 supports-color: ^8.0.0 - checksum: 38687fcbdc2b7ddc70bbb5dfc703ae095b46b3c7f206d62ecdf5f4d16e336178e217302138f3b906125576bb1cfe4cfe8d43681276fa5899d138ed9422099fb3 + checksum: c99ae66f257564613e72c5797c3a68f21a22e1c1fb5f30d14695ff5b508a0d2405f22748f13a3df8d1015b5e16abb130170f81f047ff68f58b6b1d2ff6ebc51b languageName: node linkType: hard "jest@npm:^29.0.2": - version: 29.3.1 - resolution: "jest@npm:29.3.1" + version: 29.4.3 + resolution: "jest@npm:29.4.3" dependencies: - "@jest/core": ^29.3.1 - "@jest/types": ^29.3.1 + "@jest/core": ^29.4.3 + "@jest/types": ^29.4.3 import-local: ^3.0.2 - jest-cli: ^29.3.1 + jest-cli: ^29.4.3 peerDependencies: node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 peerDependenciesMeta: @@ -27611,7 +27199,7 @@ __metadata: optional: true bin: jest: bin/jest.js - checksum: 613f4ec657b14dd84c0056b2fef1468502927fd551bef0b19d4a91576a609678fb316c6a5b5fc6120dd30dd4ff4569070ffef3cb507db9bb0260b28ddaa18d7a + checksum: 084d10d1ceaade3c40e6d3bbd71b9b71b8919ba6fbd6f1f6699bdc259a6ba2f7350c7ccbfa10c11f7e3e01662853650a6244210179542fe4ba87e77dc3f3109f languageName: node linkType: hard @@ -33286,14 +32874,14 @@ __metadata: languageName: node linkType: hard -"pretty-format@npm:^29.0.0, pretty-format@npm:^29.3.1": - version: 29.3.1 - resolution: "pretty-format@npm:29.3.1" +"pretty-format@npm:^29.0.0, pretty-format@npm:^29.4.3": + version: 29.4.3 + resolution: "pretty-format@npm:29.4.3" dependencies: - "@jest/schemas": ^29.0.0 + "@jest/schemas": ^29.4.3 ansi-styles: ^5.0.0 react-is: ^18.0.0 - checksum: 9917a0bb859cd7a24a343363f70d5222402c86d10eb45bcc2f77b23a4e67586257390e959061aec22762a782fe6bafb59bf34eb94527bc2e5d211afdb287eb4e + checksum: 3258b9a010bd79b3cf73783ad1e4592b6326fc981b6e31b742f316f14e7fbac09b48a9dbf274d092d9bde404db9fe16f518370e121837dc078a597392e6e5cc5 languageName: node linkType: hard @@ -35066,10 +34654,10 @@ __metadata: languageName: node linkType: hard -"resolve.exports@npm:^1.1.0": - version: 1.1.0 - resolution: "resolve.exports@npm:1.1.0" - checksum: 52865af8edb088f6c7759a328584a5de6b226754f004b742523adcfe398cfbc4559515104bc2ae87b8e78b1e4de46c9baec400b3fb1f7d517b86d2d48a098a2d +"resolve.exports@npm:^2.0.0": + version: 2.0.0 + resolution: "resolve.exports@npm:2.0.0" + checksum: d8bee3b0cc0a0ae6c8323710983505bc6a3a2574f718e96f01e048a0f0af035941434b386cc9efc7eededc5e1199726185c306ec6f6a1aa55d5fbad926fd0634 languageName: node linkType: hard @@ -37332,13 +36920,13 @@ __metadata: linkType: hard "swr@npm:^2.0.0": - version: 2.0.4 - resolution: "swr@npm:2.0.4" + version: 2.1.0 + resolution: "swr@npm:2.1.0" dependencies: use-sync-external-store: ^1.2.0 peerDependencies: react: ^16.11.0 || ^17.0.0 || ^18.0.0 - checksum: 2fd26baed9a0ad3ecf24d7a64c4929f9c3be71c942e883ab369c3929aa297a47b0512c29ed8cdfd0ce2e3f5ee3f181d80c16b2b95128a0ae58bc133b4a0ea5a8 + checksum: 7de1799f319c7ebfb996cb843279169144b7087215ce7318dd6011590908341ac7d5bca93a197666557c2450b0297d9efbc610fd069b82dc3387130c619965fc languageName: node linkType: hard @@ -39609,7 +39197,7 @@ __metadata: languageName: node linkType: hard -"write-file-atomic@npm:^4.0.0, write-file-atomic@npm:^4.0.1": +"write-file-atomic@npm:^4.0.0, write-file-atomic@npm:^4.0.2": version: 4.0.2 resolution: "write-file-atomic@npm:4.0.2" dependencies: From 9b8c374ace558489fe2b6b8a3f69e5ac4fc99f9b Mon Sep 17 00:00:00 2001 From: afalco Date: Thu, 9 Mar 2023 10:49:34 -0600 Subject: [PATCH 017/177] Do not show timer for skipped steps Signed-off-by: afalco --- .changeset/mean-emus-hide.md | 5 +++++ .../src/next/components/TaskSteps/TaskSteps.tsx | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) create mode 100644 .changeset/mean-emus-hide.md diff --git a/.changeset/mean-emus-hide.md b/.changeset/mean-emus-hide.md new file mode 100644 index 0000000000..955e25d258 --- /dev/null +++ b/.changeset/mean-emus-hide.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-scaffolder-react': patch +--- + +Remove timer for skipped steps in Scaffolder Next's TaskSteps diff --git a/plugins/scaffolder-react/src/next/components/TaskSteps/TaskSteps.tsx b/plugins/scaffolder-react/src/next/components/TaskSteps/TaskSteps.tsx index 632500f07e..668306fa9e 100644 --- a/plugins/scaffolder-react/src/next/components/TaskSteps/TaskSteps.tsx +++ b/plugins/scaffolder-react/src/next/components/TaskSteps/TaskSteps.tsx @@ -80,7 +80,7 @@ export const TaskSteps = (props: TaskStepsProps) => { StepIconComponent={StepIcon} > {step.name} - + {!isSkipped && } From e2e3dd08a5444cf7a4aac96018274a02f2b86199 Mon Sep 17 00:00:00 2001 From: Dustin Brewer Date: Thu, 9 Mar 2023 22:47:17 +0000 Subject: [PATCH 018/177] Add FireHydrant annotation option Signed-off-by: Dustin Brewer --- .changeset/tidy-planes-unite.md | 5 ++++ plugins/firehydrant/README.md | 8 ++++++ plugins/firehydrant/package.json | 1 + plugins/firehydrant/src/api/index.ts | 5 +++- .../ServiceDetailsCard/ServiceDetailsCard.tsx | 7 ++--- plugins/firehydrant/src/components/hooks.ts | 27 +++++++++++++++++++ .../src/components/serviceDetails.ts | 13 +++++++-- plugins/firehydrant/src/index.ts | 6 ++++- plugins/firehydrant/src/plugin.ts | 3 +++ yarn.lock | 1 + 10 files changed, 69 insertions(+), 7 deletions(-) create mode 100644 .changeset/tidy-planes-unite.md create mode 100644 plugins/firehydrant/src/components/hooks.ts diff --git a/.changeset/tidy-planes-unite.md b/.changeset/tidy-planes-unite.md new file mode 100644 index 0000000000..158498d381 --- /dev/null +++ b/.changeset/tidy-planes-unite.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-firehydrant': minor +--- + +Allow firehydrant to use component annotation diff --git a/plugins/firehydrant/README.md b/plugins/firehydrant/README.md index d7169e08f0..4472536245 100644 --- a/plugins/firehydrant/README.md +++ b/plugins/firehydrant/README.md @@ -56,3 +56,11 @@ proxy: # Supply the token you generated from https://app.firehydrant.io/organizations/bots Authorization: Bearer fhb-e4911b22bcd788c4a4afeb0c111ffbfa ``` + +4. Optionally add an annotation to the yaml config file of a component + +```yaml +metadata: + annotations: + firehydrant.com/service-name: +``` diff --git a/plugins/firehydrant/package.json b/plugins/firehydrant/package.json index 293679c2ea..8084876f69 100644 --- a/plugins/firehydrant/package.json +++ b/plugins/firehydrant/package.json @@ -23,6 +23,7 @@ "clean": "backstage-cli package clean" }, "dependencies": { + "@backstage/catalog-model": "workspace:^", "@backstage/core-components": "workspace:^", "@backstage/core-plugin-api": "workspace:^", "@backstage/plugin-catalog-react": "workspace:^", diff --git a/plugins/firehydrant/src/api/index.ts b/plugins/firehydrant/src/api/index.ts index 7101b5dc62..45834d90e9 100644 --- a/plugins/firehydrant/src/api/index.ts +++ b/plugins/firehydrant/src/api/index.ts @@ -30,6 +30,7 @@ export interface FireHydrantAPI { getServiceDetails(options: { serviceName: string; + lookupByName: boolean; }): Promise; getServiceIncidents(options: { @@ -77,10 +78,12 @@ export class FireHydrantAPIClient implements FireHydrantAPI { async getServiceDetails(options: { serviceName: string; + lookupByName: boolean; }): Promise { + const queryOpt = options.lookupByName ? 'name' : 'query'; const proxyUrl = await this.getApiUrl(); const response = await fetch( - `${proxyUrl}/services?query=${options.serviceName}`, + `${proxyUrl}/services?${queryOpt}=${options.serviceName}`, ); if (!response.ok) { diff --git a/plugins/firehydrant/src/components/ServiceDetailsCard/ServiceDetailsCard.tsx b/plugins/firehydrant/src/components/ServiceDetailsCard/ServiceDetailsCard.tsx index bc2dd46fef..b6bfbcc13b 100644 --- a/plugins/firehydrant/src/components/ServiceDetailsCard/ServiceDetailsCard.tsx +++ b/plugins/firehydrant/src/components/ServiceDetailsCard/ServiceDetailsCard.tsx @@ -39,6 +39,7 @@ import { ResponseErrorPanel, } from '@backstage/core-components'; import { configApiRef, useApi } from '@backstage/core-plugin-api'; +import { isFireHydrantAvailable, getFireHydrantServiceName } from '../hooks'; const useStyles = makeStyles(theme => ({ button: { @@ -149,14 +150,14 @@ export const ServiceDetailsCard = () => { const startDate = DateTime.now().minus({ days: 30 }).toUTC(); const endDate = DateTime.now().toUTC(); + // The service name is provided by an annotation or a Backstage generated service name. // The Backstage service name in FireHydrant is a unique formatted string // that requires the entity's kind, name, and namespace. - const fireHydrantServiceName = `${entity?.kind}:${ - entity?.metadata?.namespace ?? 'default' - }/${entity?.metadata?.name}`; + const fireHydrantServiceName = getFireHydrantServiceName(entity); const { loading, value, error } = useServiceDetails({ serviceName: fireHydrantServiceName, + lookupByName: isFireHydrantAvailable(entity), }); const activeIncidents: string[] = value?.service?.active_incidents ?? []; diff --git a/plugins/firehydrant/src/components/hooks.ts b/plugins/firehydrant/src/components/hooks.ts new file mode 100644 index 0000000000..e8129e1b28 --- /dev/null +++ b/plugins/firehydrant/src/components/hooks.ts @@ -0,0 +1,27 @@ +/* + * Copyright 2023 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { Entity } from '@backstage/catalog-model'; + +export const FIREHYDRANT_SERVICE_NAME_ANNOTATION = + 'firehydrant.com/service-name'; +export const isFireHydrantAvailable = (entity: Entity) => + Boolean(entity.metadata.annotations?.[FIREHYDRANT_SERVICE_NAME_ANNOTATION]); +export const getFireHydrantServiceName = (entity: Entity) => + isFireHydrantAvailable(entity) + ? entity?.metadata.annotations?.[FIREHYDRANT_SERVICE_NAME_ANNOTATION] ?? '' + : `${entity?.kind}:${entity?.metadata?.namespace ?? 'default'}/${ + entity?.metadata?.name + }`; diff --git a/plugins/firehydrant/src/components/serviceDetails.ts b/plugins/firehydrant/src/components/serviceDetails.ts index 9c12677577..f0ea325419 100644 --- a/plugins/firehydrant/src/components/serviceDetails.ts +++ b/plugins/firehydrant/src/components/serviceDetails.ts @@ -17,13 +17,22 @@ import useAsyncRetry from 'react-use/lib/useAsyncRetry'; import { fireHydrantApiRef } from '../api'; import { errorApiRef, useApi } from '@backstage/core-plugin-api'; -export const useServiceDetails = ({ serviceName }: { serviceName: string }) => { +export const useServiceDetails = ({ + serviceName, + lookupByName, +}: { + serviceName: string; + lookupByName: boolean; +}) => { const api = useApi(fireHydrantApiRef); const errorApi = useApi(errorApiRef); const { loading, value, error, retry } = useAsyncRetry(async () => { try { - return await api.getServiceDetails({ serviceName: serviceName }); + return await api.getServiceDetails({ + serviceName: serviceName, + lookupByName: lookupByName, + }); } catch (e) { errorApi.post(e); return Promise.reject(e); diff --git a/plugins/firehydrant/src/index.ts b/plugins/firehydrant/src/index.ts index f1ef66fd3e..218b944244 100644 --- a/plugins/firehydrant/src/index.ts +++ b/plugins/firehydrant/src/index.ts @@ -20,4 +20,8 @@ * @packageDocumentation */ -export { firehydrantPlugin, FirehydrantCard } from './plugin'; +export { + firehydrantPlugin, + FirehydrantCard, + isFireHydrantAvailable, +} from './plugin'; diff --git a/plugins/firehydrant/src/plugin.ts b/plugins/firehydrant/src/plugin.ts index 6deefe4fce..14a8c53c66 100644 --- a/plugins/firehydrant/src/plugin.ts +++ b/plugins/firehydrant/src/plugin.ts @@ -50,3 +50,6 @@ export const FirehydrantCard = firehydrantPlugin.provide( }, }), ); + +/** @public */ +export { isFireHydrantAvailable } from './components/hooks'; diff --git a/yarn.lock b/yarn.lock index 4ad5e727d0..5d3cd95dbb 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6249,6 +6249,7 @@ __metadata: version: 0.0.0-use.local resolution: "@backstage/plugin-firehydrant@workspace:plugins/firehydrant" dependencies: + "@backstage/catalog-model": "workspace:^" "@backstage/cli": "workspace:^" "@backstage/core-app-api": "workspace:^" "@backstage/core-components": "workspace:^" From cce21f4cc4a4468f9d63385ea944ac2a4f3c04a0 Mon Sep 17 00:00:00 2001 From: Dustin Brewer Date: Thu, 9 Mar 2023 23:06:14 +0000 Subject: [PATCH 019/177] Add a few tests Signed-off-by: Dustin Brewer --- .../firehydrant/src/components/hooks.test.ts | 67 +++++++++++++++++++ 1 file changed, 67 insertions(+) create mode 100644 plugins/firehydrant/src/components/hooks.test.ts diff --git a/plugins/firehydrant/src/components/hooks.test.ts b/plugins/firehydrant/src/components/hooks.test.ts new file mode 100644 index 0000000000..4278911ebb --- /dev/null +++ b/plugins/firehydrant/src/components/hooks.test.ts @@ -0,0 +1,67 @@ +/* + * Copyright 2021 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { Entity } from '@backstage/catalog-model'; +import { isFireHydrantAvailable, getFireHydrantServiceName } from './hooks'; + +describe('firehydrant-hooks-isFireHydrantAvailable', () => { + it('should find an annotation', () => { + const e: Entity = { + metadata: { + annotations: { + 'firehydrant.com/service-name': 'test-fh-name', + }, + }, + }; + expect(isFireHydrantAvailable(e)).toEqual(true); + }); + + it('should not find an annotation', () => { + const e: Entity = { + metadata: {}, + }; + expect(isFireHydrantAvailable(e)).toEqual(false); + }); +}); + +describe('firehydrant-hooks-getFireHydrantServiceName', () => { + it('should return annotation service name', () => { + const expected = 'test-fh-name'; + const e: Entity = { + kind: 'Component', + metadata: { + namespace: 'default', + name: 'test-fh-name', + annotations: { + 'firehydrant.com/service-name': expected, + }, + }, + }; + expect(getFireHydrantServiceName(e)).toEqual(expected); + }); + + it('should return generated service name', () => { + const expected = 'Component:default/test-fh-name'; + const e: Entity = { + kind: 'Component', + metadata: { + namespace: 'default', + name: 'test-fh-name', + annotations: {}, + }, + }; + expect(getFireHydrantServiceName(e)).toEqual(expected); + }); +}); From 88da0bcff21a9f83b81c49c7eb9b5ac96435a64e Mon Sep 17 00:00:00 2001 From: Kurt King Date: Thu, 9 Mar 2023 16:18:32 -0700 Subject: [PATCH 020/177] add plugId property Signed-off-by: Kurt King --- docs/plugins/feature-flags.md | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/docs/plugins/feature-flags.md b/docs/plugins/feature-flags.md index a572143d6e..d6847d3f65 100644 --- a/docs/plugins/feature-flags.md +++ b/docs/plugins/feature-flags.md @@ -37,7 +37,12 @@ Defining feature flag in the application is done by adding feature flags in`feat const app = createApp({ // ... featureFlags: [ - { name: 'tech-radar', description: 'Enables the tech radar plugin' }, + // pluginId can be left empty for feature flags used in the application. It is required for feature flags used in plugins + { + pluginId: '', + name: 'tech-radar', + description: 'Enables the tech radar plugin', + }, ], // ... }); From 0708a169de2bb16e787912cef8cc086ddb7e842c Mon Sep 17 00:00:00 2001 From: Kurt King Date: Thu, 9 Mar 2023 16:20:46 -0700 Subject: [PATCH 021/177] move comment after prettier ran Signed-off-by: Kurt King --- docs/plugins/feature-flags.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/docs/plugins/feature-flags.md b/docs/plugins/feature-flags.md index d6847d3f65..7b7a6c1435 100644 --- a/docs/plugins/feature-flags.md +++ b/docs/plugins/feature-flags.md @@ -37,9 +37,8 @@ Defining feature flag in the application is done by adding feature flags in`feat const app = createApp({ // ... featureFlags: [ - // pluginId can be left empty for feature flags used in the application. It is required for feature flags used in plugins { - pluginId: '', + pluginId: '', // pluginId is required for feature flags in plugins. It can be left blank for a feature flag leveraged in the application. name: 'tech-radar', description: 'Enables the tech radar plugin', }, From 392e71fa7fbfea1bc652ca28fe72e135dc04c253 Mon Sep 17 00:00:00 2001 From: Dustin Brewer Date: Thu, 9 Mar 2023 23:22:54 +0000 Subject: [PATCH 022/177] Correcting Entity in tests Signed-off-by: Dustin Brewer --- plugins/firehydrant/src/components/hooks.test.ts | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/plugins/firehydrant/src/components/hooks.test.ts b/plugins/firehydrant/src/components/hooks.test.ts index 4278911ebb..2fbf1e2d57 100644 --- a/plugins/firehydrant/src/components/hooks.test.ts +++ b/plugins/firehydrant/src/components/hooks.test.ts @@ -19,7 +19,11 @@ import { isFireHydrantAvailable, getFireHydrantServiceName } from './hooks'; describe('firehydrant-hooks-isFireHydrantAvailable', () => { it('should find an annotation', () => { const e: Entity = { + apiVersion: 'backstage.io/v1alpha1', + kind: 'Component', metadata: { + namespace: 'default', + name: 'test-fh-name', annotations: { 'firehydrant.com/service-name': 'test-fh-name', }, @@ -30,7 +34,12 @@ describe('firehydrant-hooks-isFireHydrantAvailable', () => { it('should not find an annotation', () => { const e: Entity = { - metadata: {}, + apiVersion: 'backstage.io/v1alpha1', + kind: 'Component', + metadata: { + namespace: 'default', + name: 'test-fh-name', + }, }; expect(isFireHydrantAvailable(e)).toEqual(false); }); @@ -40,6 +49,7 @@ describe('firehydrant-hooks-getFireHydrantServiceName', () => { it('should return annotation service name', () => { const expected = 'test-fh-name'; const e: Entity = { + apiVersion: 'backstage.io/v1alpha1', kind: 'Component', metadata: { namespace: 'default', @@ -55,6 +65,7 @@ describe('firehydrant-hooks-getFireHydrantServiceName', () => { it('should return generated service name', () => { const expected = 'Component:default/test-fh-name'; const e: Entity = { + apiVersion: 'backstage.io/v1alpha1', kind: 'Component', metadata: { namespace: 'default', From ad4840b0f579fee2c724b0cbebaf94cc426c3f3b Mon Sep 17 00:00:00 2001 From: Dustin Brewer Date: Fri, 10 Mar 2023 00:08:59 +0000 Subject: [PATCH 023/177] Correcting the api-report Signed-off-by: Dustin Brewer --- plugins/firehydrant/api-report.md | 4 ++++ plugins/firehydrant/src/components/hooks.ts | 1 + 2 files changed, 5 insertions(+) diff --git a/plugins/firehydrant/api-report.md b/plugins/firehydrant/api-report.md index 2e3bcf6385..0ff5bbc62a 100644 --- a/plugins/firehydrant/api-report.md +++ b/plugins/firehydrant/api-report.md @@ -6,6 +6,7 @@ /// import { BackstagePlugin } from '@backstage/core-plugin-api'; +import { Entity } from '@backstage/catalog-model'; import { RouteRef } from '@backstage/core-plugin-api'; // @public (undocumented) @@ -19,4 +20,7 @@ export const firehydrantPlugin: BackstagePlugin< {}, {} >; + +// @public (undocumented) +export const isFireHydrantAvailable: (entity: Entity) => boolean; ``` diff --git a/plugins/firehydrant/src/components/hooks.ts b/plugins/firehydrant/src/components/hooks.ts index e8129e1b28..d9145f13f0 100644 --- a/plugins/firehydrant/src/components/hooks.ts +++ b/plugins/firehydrant/src/components/hooks.ts @@ -17,6 +17,7 @@ import { Entity } from '@backstage/catalog-model'; export const FIREHYDRANT_SERVICE_NAME_ANNOTATION = 'firehydrant.com/service-name'; +/** @public */ export const isFireHydrantAvailable = (entity: Entity) => Boolean(entity.metadata.annotations?.[FIREHYDRANT_SERVICE_NAME_ANNOTATION]); export const getFireHydrantServiceName = (entity: Entity) => From bf1019508b310f60e735bd52ef59e7572d09dad5 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 10 Mar 2023 13:48:52 +0000 Subject: [PATCH 024/177] fix(deps): update dependency @swc/core to v1.3.39 Signed-off-by: Renovate Bot --- microsite/yarn.lock | 86 ++++++++++++++++++++++----------------------- storybook/yarn.lock | 86 ++++++++++++++++++++++----------------------- yarn.lock | 86 ++++++++++++++++++++++----------------------- 3 files changed, 129 insertions(+), 129 deletions(-) diff --git a/microsite/yarn.lock b/microsite/yarn.lock index a9db81ead4..078cdc2546 100644 --- a/microsite/yarn.lock +++ b/microsite/yarn.lock @@ -2623,90 +2623,90 @@ __metadata: languageName: node linkType: hard -"@swc/core-darwin-arm64@npm:1.3.38": - version: 1.3.38 - resolution: "@swc/core-darwin-arm64@npm:1.3.38" +"@swc/core-darwin-arm64@npm:1.3.39": + version: 1.3.39 + resolution: "@swc/core-darwin-arm64@npm:1.3.39" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@swc/core-darwin-x64@npm:1.3.38": - version: 1.3.38 - resolution: "@swc/core-darwin-x64@npm:1.3.38" +"@swc/core-darwin-x64@npm:1.3.39": + version: 1.3.39 + resolution: "@swc/core-darwin-x64@npm:1.3.39" conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"@swc/core-linux-arm-gnueabihf@npm:1.3.38": - version: 1.3.38 - resolution: "@swc/core-linux-arm-gnueabihf@npm:1.3.38" +"@swc/core-linux-arm-gnueabihf@npm:1.3.39": + version: 1.3.39 + resolution: "@swc/core-linux-arm-gnueabihf@npm:1.3.39" conditions: os=linux & cpu=arm languageName: node linkType: hard -"@swc/core-linux-arm64-gnu@npm:1.3.38": - version: 1.3.38 - resolution: "@swc/core-linux-arm64-gnu@npm:1.3.38" +"@swc/core-linux-arm64-gnu@npm:1.3.39": + version: 1.3.39 + resolution: "@swc/core-linux-arm64-gnu@npm:1.3.39" conditions: os=linux & cpu=arm64 & libc=glibc languageName: node linkType: hard -"@swc/core-linux-arm64-musl@npm:1.3.38": - version: 1.3.38 - resolution: "@swc/core-linux-arm64-musl@npm:1.3.38" +"@swc/core-linux-arm64-musl@npm:1.3.39": + version: 1.3.39 + resolution: "@swc/core-linux-arm64-musl@npm:1.3.39" conditions: os=linux & cpu=arm64 & libc=musl languageName: node linkType: hard -"@swc/core-linux-x64-gnu@npm:1.3.38": - version: 1.3.38 - resolution: "@swc/core-linux-x64-gnu@npm:1.3.38" +"@swc/core-linux-x64-gnu@npm:1.3.39": + version: 1.3.39 + resolution: "@swc/core-linux-x64-gnu@npm:1.3.39" conditions: os=linux & cpu=x64 & libc=glibc languageName: node linkType: hard -"@swc/core-linux-x64-musl@npm:1.3.38": - version: 1.3.38 - resolution: "@swc/core-linux-x64-musl@npm:1.3.38" +"@swc/core-linux-x64-musl@npm:1.3.39": + version: 1.3.39 + resolution: "@swc/core-linux-x64-musl@npm:1.3.39" conditions: os=linux & cpu=x64 & libc=musl languageName: node linkType: hard -"@swc/core-win32-arm64-msvc@npm:1.3.38": - version: 1.3.38 - resolution: "@swc/core-win32-arm64-msvc@npm:1.3.38" +"@swc/core-win32-arm64-msvc@npm:1.3.39": + version: 1.3.39 + resolution: "@swc/core-win32-arm64-msvc@npm:1.3.39" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"@swc/core-win32-ia32-msvc@npm:1.3.38": - version: 1.3.38 - resolution: "@swc/core-win32-ia32-msvc@npm:1.3.38" +"@swc/core-win32-ia32-msvc@npm:1.3.39": + version: 1.3.39 + resolution: "@swc/core-win32-ia32-msvc@npm:1.3.39" conditions: os=win32 & cpu=ia32 languageName: node linkType: hard -"@swc/core-win32-x64-msvc@npm:1.3.38": - version: 1.3.38 - resolution: "@swc/core-win32-x64-msvc@npm:1.3.38" +"@swc/core-win32-x64-msvc@npm:1.3.39": + version: 1.3.39 + resolution: "@swc/core-win32-x64-msvc@npm:1.3.39" conditions: os=win32 & cpu=x64 languageName: node linkType: hard "@swc/core@npm:^1.3.36": - version: 1.3.38 - resolution: "@swc/core@npm:1.3.38" + version: 1.3.39 + resolution: "@swc/core@npm:1.3.39" dependencies: - "@swc/core-darwin-arm64": 1.3.38 - "@swc/core-darwin-x64": 1.3.38 - "@swc/core-linux-arm-gnueabihf": 1.3.38 - "@swc/core-linux-arm64-gnu": 1.3.38 - "@swc/core-linux-arm64-musl": 1.3.38 - "@swc/core-linux-x64-gnu": 1.3.38 - "@swc/core-linux-x64-musl": 1.3.38 - "@swc/core-win32-arm64-msvc": 1.3.38 - "@swc/core-win32-ia32-msvc": 1.3.38 - "@swc/core-win32-x64-msvc": 1.3.38 + "@swc/core-darwin-arm64": 1.3.39 + "@swc/core-darwin-x64": 1.3.39 + "@swc/core-linux-arm-gnueabihf": 1.3.39 + "@swc/core-linux-arm64-gnu": 1.3.39 + "@swc/core-linux-arm64-musl": 1.3.39 + "@swc/core-linux-x64-gnu": 1.3.39 + "@swc/core-linux-x64-musl": 1.3.39 + "@swc/core-win32-arm64-msvc": 1.3.39 + "@swc/core-win32-ia32-msvc": 1.3.39 + "@swc/core-win32-x64-msvc": 1.3.39 dependenciesMeta: "@swc/core-darwin-arm64": optional: true @@ -2728,7 +2728,7 @@ __metadata: optional: true "@swc/core-win32-x64-msvc": optional: true - checksum: c55d30e57638bcd21f788add8490c3f3e71bfe027aa5a8b153e1b1b9686ecddd6deeaaa6a6b17717c7eab4c1e2a232b465b6755b6c891506fc0d03139badfbf7 + checksum: 2c5376627587302d9146a13670ab88d49d236361f226058625a287e275952a282e46c6f8620ec756917406c2ab801093c28668d95837646e39742d65e193965d languageName: node linkType: hard diff --git a/storybook/yarn.lock b/storybook/yarn.lock index 9c05864306..eb70dadd2f 100644 --- a/storybook/yarn.lock +++ b/storybook/yarn.lock @@ -2966,90 +2966,90 @@ __metadata: languageName: node linkType: hard -"@swc/core-darwin-arm64@npm:1.3.38": - version: 1.3.38 - resolution: "@swc/core-darwin-arm64@npm:1.3.38" +"@swc/core-darwin-arm64@npm:1.3.39": + version: 1.3.39 + resolution: "@swc/core-darwin-arm64@npm:1.3.39" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@swc/core-darwin-x64@npm:1.3.38": - version: 1.3.38 - resolution: "@swc/core-darwin-x64@npm:1.3.38" +"@swc/core-darwin-x64@npm:1.3.39": + version: 1.3.39 + resolution: "@swc/core-darwin-x64@npm:1.3.39" conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"@swc/core-linux-arm-gnueabihf@npm:1.3.38": - version: 1.3.38 - resolution: "@swc/core-linux-arm-gnueabihf@npm:1.3.38" +"@swc/core-linux-arm-gnueabihf@npm:1.3.39": + version: 1.3.39 + resolution: "@swc/core-linux-arm-gnueabihf@npm:1.3.39" conditions: os=linux & cpu=arm languageName: node linkType: hard -"@swc/core-linux-arm64-gnu@npm:1.3.38": - version: 1.3.38 - resolution: "@swc/core-linux-arm64-gnu@npm:1.3.38" +"@swc/core-linux-arm64-gnu@npm:1.3.39": + version: 1.3.39 + resolution: "@swc/core-linux-arm64-gnu@npm:1.3.39" conditions: os=linux & cpu=arm64 & libc=glibc languageName: node linkType: hard -"@swc/core-linux-arm64-musl@npm:1.3.38": - version: 1.3.38 - resolution: "@swc/core-linux-arm64-musl@npm:1.3.38" +"@swc/core-linux-arm64-musl@npm:1.3.39": + version: 1.3.39 + resolution: "@swc/core-linux-arm64-musl@npm:1.3.39" conditions: os=linux & cpu=arm64 & libc=musl languageName: node linkType: hard -"@swc/core-linux-x64-gnu@npm:1.3.38": - version: 1.3.38 - resolution: "@swc/core-linux-x64-gnu@npm:1.3.38" +"@swc/core-linux-x64-gnu@npm:1.3.39": + version: 1.3.39 + resolution: "@swc/core-linux-x64-gnu@npm:1.3.39" conditions: os=linux & cpu=x64 & libc=glibc languageName: node linkType: hard -"@swc/core-linux-x64-musl@npm:1.3.38": - version: 1.3.38 - resolution: "@swc/core-linux-x64-musl@npm:1.3.38" +"@swc/core-linux-x64-musl@npm:1.3.39": + version: 1.3.39 + resolution: "@swc/core-linux-x64-musl@npm:1.3.39" conditions: os=linux & cpu=x64 & libc=musl languageName: node linkType: hard -"@swc/core-win32-arm64-msvc@npm:1.3.38": - version: 1.3.38 - resolution: "@swc/core-win32-arm64-msvc@npm:1.3.38" +"@swc/core-win32-arm64-msvc@npm:1.3.39": + version: 1.3.39 + resolution: "@swc/core-win32-arm64-msvc@npm:1.3.39" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"@swc/core-win32-ia32-msvc@npm:1.3.38": - version: 1.3.38 - resolution: "@swc/core-win32-ia32-msvc@npm:1.3.38" +"@swc/core-win32-ia32-msvc@npm:1.3.39": + version: 1.3.39 + resolution: "@swc/core-win32-ia32-msvc@npm:1.3.39" conditions: os=win32 & cpu=ia32 languageName: node linkType: hard -"@swc/core-win32-x64-msvc@npm:1.3.38": - version: 1.3.38 - resolution: "@swc/core-win32-x64-msvc@npm:1.3.38" +"@swc/core-win32-x64-msvc@npm:1.3.39": + version: 1.3.39 + resolution: "@swc/core-win32-x64-msvc@npm:1.3.39" conditions: os=win32 & cpu=x64 languageName: node linkType: hard "@swc/core@npm:^1.3.9": - version: 1.3.38 - resolution: "@swc/core@npm:1.3.38" + version: 1.3.39 + resolution: "@swc/core@npm:1.3.39" dependencies: - "@swc/core-darwin-arm64": 1.3.38 - "@swc/core-darwin-x64": 1.3.38 - "@swc/core-linux-arm-gnueabihf": 1.3.38 - "@swc/core-linux-arm64-gnu": 1.3.38 - "@swc/core-linux-arm64-musl": 1.3.38 - "@swc/core-linux-x64-gnu": 1.3.38 - "@swc/core-linux-x64-musl": 1.3.38 - "@swc/core-win32-arm64-msvc": 1.3.38 - "@swc/core-win32-ia32-msvc": 1.3.38 - "@swc/core-win32-x64-msvc": 1.3.38 + "@swc/core-darwin-arm64": 1.3.39 + "@swc/core-darwin-x64": 1.3.39 + "@swc/core-linux-arm-gnueabihf": 1.3.39 + "@swc/core-linux-arm64-gnu": 1.3.39 + "@swc/core-linux-arm64-musl": 1.3.39 + "@swc/core-linux-x64-gnu": 1.3.39 + "@swc/core-linux-x64-musl": 1.3.39 + "@swc/core-win32-arm64-msvc": 1.3.39 + "@swc/core-win32-ia32-msvc": 1.3.39 + "@swc/core-win32-x64-msvc": 1.3.39 dependenciesMeta: "@swc/core-darwin-arm64": optional: true @@ -3071,7 +3071,7 @@ __metadata: optional: true "@swc/core-win32-x64-msvc": optional: true - checksum: c55d30e57638bcd21f788add8490c3f3e71bfe027aa5a8b153e1b1b9686ecddd6deeaaa6a6b17717c7eab4c1e2a232b465b6755b6c891506fc0d03139badfbf7 + checksum: 2c5376627587302d9146a13670ab88d49d236361f226058625a287e275952a282e46c6f8620ec756917406c2ab801093c28668d95837646e39742d65e193965d languageName: node linkType: hard diff --git a/yarn.lock b/yarn.lock index 663107e961..2f46341024 100644 --- a/yarn.lock +++ b/yarn.lock @@ -13866,90 +13866,90 @@ __metadata: languageName: node linkType: hard -"@swc/core-darwin-arm64@npm:1.3.38": - version: 1.3.38 - resolution: "@swc/core-darwin-arm64@npm:1.3.38" +"@swc/core-darwin-arm64@npm:1.3.39": + version: 1.3.39 + resolution: "@swc/core-darwin-arm64@npm:1.3.39" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@swc/core-darwin-x64@npm:1.3.38": - version: 1.3.38 - resolution: "@swc/core-darwin-x64@npm:1.3.38" +"@swc/core-darwin-x64@npm:1.3.39": + version: 1.3.39 + resolution: "@swc/core-darwin-x64@npm:1.3.39" conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"@swc/core-linux-arm-gnueabihf@npm:1.3.38": - version: 1.3.38 - resolution: "@swc/core-linux-arm-gnueabihf@npm:1.3.38" +"@swc/core-linux-arm-gnueabihf@npm:1.3.39": + version: 1.3.39 + resolution: "@swc/core-linux-arm-gnueabihf@npm:1.3.39" conditions: os=linux & cpu=arm languageName: node linkType: hard -"@swc/core-linux-arm64-gnu@npm:1.3.38": - version: 1.3.38 - resolution: "@swc/core-linux-arm64-gnu@npm:1.3.38" +"@swc/core-linux-arm64-gnu@npm:1.3.39": + version: 1.3.39 + resolution: "@swc/core-linux-arm64-gnu@npm:1.3.39" conditions: os=linux & cpu=arm64 & libc=glibc languageName: node linkType: hard -"@swc/core-linux-arm64-musl@npm:1.3.38": - version: 1.3.38 - resolution: "@swc/core-linux-arm64-musl@npm:1.3.38" +"@swc/core-linux-arm64-musl@npm:1.3.39": + version: 1.3.39 + resolution: "@swc/core-linux-arm64-musl@npm:1.3.39" conditions: os=linux & cpu=arm64 & libc=musl languageName: node linkType: hard -"@swc/core-linux-x64-gnu@npm:1.3.38": - version: 1.3.38 - resolution: "@swc/core-linux-x64-gnu@npm:1.3.38" +"@swc/core-linux-x64-gnu@npm:1.3.39": + version: 1.3.39 + resolution: "@swc/core-linux-x64-gnu@npm:1.3.39" conditions: os=linux & cpu=x64 & libc=glibc languageName: node linkType: hard -"@swc/core-linux-x64-musl@npm:1.3.38": - version: 1.3.38 - resolution: "@swc/core-linux-x64-musl@npm:1.3.38" +"@swc/core-linux-x64-musl@npm:1.3.39": + version: 1.3.39 + resolution: "@swc/core-linux-x64-musl@npm:1.3.39" conditions: os=linux & cpu=x64 & libc=musl languageName: node linkType: hard -"@swc/core-win32-arm64-msvc@npm:1.3.38": - version: 1.3.38 - resolution: "@swc/core-win32-arm64-msvc@npm:1.3.38" +"@swc/core-win32-arm64-msvc@npm:1.3.39": + version: 1.3.39 + resolution: "@swc/core-win32-arm64-msvc@npm:1.3.39" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"@swc/core-win32-ia32-msvc@npm:1.3.38": - version: 1.3.38 - resolution: "@swc/core-win32-ia32-msvc@npm:1.3.38" +"@swc/core-win32-ia32-msvc@npm:1.3.39": + version: 1.3.39 + resolution: "@swc/core-win32-ia32-msvc@npm:1.3.39" conditions: os=win32 & cpu=ia32 languageName: node linkType: hard -"@swc/core-win32-x64-msvc@npm:1.3.38": - version: 1.3.38 - resolution: "@swc/core-win32-x64-msvc@npm:1.3.38" +"@swc/core-win32-x64-msvc@npm:1.3.39": + version: 1.3.39 + resolution: "@swc/core-win32-x64-msvc@npm:1.3.39" conditions: os=win32 & cpu=x64 languageName: node linkType: hard "@swc/core@npm:^1.3.9": - version: 1.3.38 - resolution: "@swc/core@npm:1.3.38" + version: 1.3.39 + resolution: "@swc/core@npm:1.3.39" dependencies: - "@swc/core-darwin-arm64": 1.3.38 - "@swc/core-darwin-x64": 1.3.38 - "@swc/core-linux-arm-gnueabihf": 1.3.38 - "@swc/core-linux-arm64-gnu": 1.3.38 - "@swc/core-linux-arm64-musl": 1.3.38 - "@swc/core-linux-x64-gnu": 1.3.38 - "@swc/core-linux-x64-musl": 1.3.38 - "@swc/core-win32-arm64-msvc": 1.3.38 - "@swc/core-win32-ia32-msvc": 1.3.38 - "@swc/core-win32-x64-msvc": 1.3.38 + "@swc/core-darwin-arm64": 1.3.39 + "@swc/core-darwin-x64": 1.3.39 + "@swc/core-linux-arm-gnueabihf": 1.3.39 + "@swc/core-linux-arm64-gnu": 1.3.39 + "@swc/core-linux-arm64-musl": 1.3.39 + "@swc/core-linux-x64-gnu": 1.3.39 + "@swc/core-linux-x64-musl": 1.3.39 + "@swc/core-win32-arm64-msvc": 1.3.39 + "@swc/core-win32-ia32-msvc": 1.3.39 + "@swc/core-win32-x64-msvc": 1.3.39 dependenciesMeta: "@swc/core-darwin-arm64": optional: true @@ -13971,7 +13971,7 @@ __metadata: optional: true "@swc/core-win32-x64-msvc": optional: true - checksum: c55d30e57638bcd21f788add8490c3f3e71bfe027aa5a8b153e1b1b9686ecddd6deeaaa6a6b17717c7eab4c1e2a232b465b6755b6c891506fc0d03139badfbf7 + checksum: 2c5376627587302d9146a13670ab88d49d236361f226058625a287e275952a282e46c6f8620ec756917406c2ab801093c28668d95837646e39742d65e193965d languageName: node linkType: hard From 3ef5fb09ca5017d61a47edd33d7c44d189987204 Mon Sep 17 00:00:00 2001 From: Emma Indal Date: Fri, 10 Mar 2023 15:41:08 +0100 Subject: [PATCH 025/177] fix broken stack overflow stories - mock stack overflow api Signed-off-by: Emma Indal --- .changeset/silver-donkeys-eat.md | 5 +++ .../templates/DefaultTemplate.stories.tsx | 32 +++++++++++++++---- plugins/stack-overflow/api-report.md | 11 +++++++ .../src/api/StackOverflowApi.ts | 6 ++++ .../StackOverflowQuestions.stories.tsx | 21 ++++++++++++ plugins/stack-overflow/src/index.ts | 2 ++ 6 files changed, 71 insertions(+), 6 deletions(-) create mode 100644 .changeset/silver-donkeys-eat.md diff --git a/.changeset/silver-donkeys-eat.md b/.changeset/silver-donkeys-eat.md new file mode 100644 index 0000000000..0995a2025c --- /dev/null +++ b/.changeset/silver-donkeys-eat.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-stack-overflow': patch +--- + +Export api ref and StackOverflowApi type diff --git a/packages/app/src/components/home/templates/DefaultTemplate.stories.tsx b/packages/app/src/components/home/templates/DefaultTemplate.stories.tsx index 638fe8bc29..9cf2e8ab35 100644 --- a/packages/app/src/components/home/templates/DefaultTemplate.stories.tsx +++ b/packages/app/src/components/home/templates/DefaultTemplate.stories.tsx @@ -19,7 +19,7 @@ import { HomePageCompanyLogo, HomePageStarredEntities, TemplateBackstageLogo, - TemplateBackstageLogoIcon + TemplateBackstageLogoIcon, } from '@backstage/plugin-home'; import { wrapInTestApp, TestApiProvider } from '@backstage/test-utils'; import { Content, Page, InfoCard } from '@backstage/core-components'; @@ -31,12 +31,12 @@ import { } from '@backstage/plugin-catalog-react'; import { configApiRef } from '@backstage/core-plugin-api'; import { ConfigReader } from '@backstage/config'; +import { HomePageSearchBar, searchPlugin } from '@backstage/plugin-search'; import { - HomePageSearchBar, - searchPlugin, -} from '@backstage/plugin-search'; -import { searchApiRef, SearchContextProvider } from '@backstage/plugin-search-react'; -import { HomePageStackOverflowQuestions } from '@backstage/plugin-stack-overflow'; + searchApiRef, + SearchContextProvider, +} from '@backstage/plugin-search-react'; +import { stackOverflowApiRef, HomePageStackOverflowQuestions } from '@backstage/plugin-stack-overflow'; import { Grid, makeStyles } from '@material-ui/core'; import React, { ComponentType } from 'react'; @@ -79,6 +79,25 @@ const mockCatalogApi = { getEntities: async () => ({ items: entities }), }; +const mockStackOverflowApi = { + listQuestions: async () => [ + { + title: 'Customizing Spotify backstage UI', + link: 'stackoverflow.question/1', + answer_count: 0, + tags: ['backstage'], + owner: { 'some owner': 'name' }, + }, + { + title: 'Customizing Spotify backstage UI', + link: 'stackoverflow.question/1', + answer_count: 0, + tags: ['backstage'], + owner: { 'some owner': 'name' }, + }, + ], +}; + const starredEntitiesApi = new MockStarredEntitiesApi(); starredEntitiesApi.toggleStarred('component:default/example-starred-entity'); starredEntitiesApi.toggleStarred('component:default/example-starred-entity-2'); @@ -93,6 +112,7 @@ export default { <> Promise.resolve({ results: [] }) }], diff --git a/plugins/stack-overflow/api-report.md b/plugins/stack-overflow/api-report.md index fe2a970c13..598bd06a04 100644 --- a/plugins/stack-overflow/api-report.md +++ b/plugins/stack-overflow/api-report.md @@ -5,6 +5,7 @@ ```ts /// +import { ApiRef } from '@backstage/core-plugin-api'; import { BackstagePlugin } from '@backstage/core-plugin-api'; import { CardExtensionProps } from '@backstage/plugin-home'; import { ReactNode } from 'react'; @@ -15,6 +16,16 @@ export const HomePageStackOverflowQuestions: ( props: CardExtensionProps, ) => JSX.Element; +// @public (undocumented) +export type StackOverflowApi = { + listQuestions(options?: { + requestParams: StackOverflowQuestionsRequestParams; + }): Promise; +}; + +// @public (undocumented) +export const stackOverflowApiRef: ApiRef; + // @public export const StackOverflowIcon: () => JSX.Element; diff --git a/plugins/stack-overflow/src/api/StackOverflowApi.ts b/plugins/stack-overflow/src/api/StackOverflowApi.ts index 6e76f51409..d470e879e7 100644 --- a/plugins/stack-overflow/src/api/StackOverflowApi.ts +++ b/plugins/stack-overflow/src/api/StackOverflowApi.ts @@ -20,10 +20,16 @@ import { StackOverflowQuestionsRequestParams, } from '../types'; +/** + * @public + */ export const stackOverflowApiRef = createApiRef({ id: 'plugin.stackoverflow.service', }); +/** + * @public + */ export type StackOverflowApi = { listQuestions(options?: { requestParams: StackOverflowQuestionsRequestParams; diff --git a/plugins/stack-overflow/src/home/StackOverflowQuestions/StackOverflowQuestions.stories.tsx b/plugins/stack-overflow/src/home/StackOverflowQuestions/StackOverflowQuestions.stories.tsx index 35ace44c14..aed1ed25aa 100644 --- a/plugins/stack-overflow/src/home/StackOverflowQuestions/StackOverflowQuestions.stories.tsx +++ b/plugins/stack-overflow/src/home/StackOverflowQuestions/StackOverflowQuestions.stories.tsx @@ -21,6 +21,26 @@ import { ConfigReader } from '@backstage/config'; import { Grid } from '@material-ui/core'; import React, { ComponentType } from 'react'; import { StackOverflowIcon } from '../../icons'; +import { stackOverflowApiRef } from '../../api'; + +const mockStackOverflowApi = { + listQuestions: async () => [ + { + title: 'Customizing Spotify backstage UI', + link: 'stackoverflow.question/1', + answer_count: 0, + tags: ['backstage'], + owner: { 'some owner': 'name' }, + }, + { + title: 'Customizing Spotify backstage UI', + link: 'stackoverflow.question/1', + answer_count: 0, + tags: ['backstage'], + owner: { 'some owner': 'name' }, + }, + ], +}; export default { title: 'Plugins/Home/Components/StackOverflow', @@ -39,6 +59,7 @@ export default { }, }), ], + [stackOverflowApiRef, mockStackOverflowApi], ]} > diff --git a/plugins/stack-overflow/src/index.ts b/plugins/stack-overflow/src/index.ts index 5965d66983..a796f563eb 100644 --- a/plugins/stack-overflow/src/index.ts +++ b/plugins/stack-overflow/src/index.ts @@ -30,3 +30,5 @@ export type { StackOverflowQuestionsContentProps, StackOverflowQuestionsRequestParams, } from './types'; +export { stackOverflowApiRef } from './api'; +export type { StackOverflowApi } from './api'; From 92b495328bd3a3627c2b91b107c3175b10d44ab2 Mon Sep 17 00:00:00 2001 From: Oleg S <97077423+RobotSail@users.noreply.github.com> Date: Mon, 6 Mar 2023 17:00:01 -0500 Subject: [PATCH 026/177] expose the techdocs-backend plugin using the new system Signed-off-by: Oleg S <97077423+RobotSail@users.noreply.github.com> --- .changeset/large-feet-wash.md | 6 ++ packages/backend-next/package.json | 1 + packages/backend-next/src/index.ts | 2 + plugins/techdocs-backend/api-report.md | 4 ++ plugins/techdocs-backend/package.json | 1 + plugins/techdocs-backend/src/index.ts | 1 + plugins/techdocs-backend/src/plugin.ts | 95 ++++++++++++++++++++++++++ yarn.lock | 2 + 8 files changed, 112 insertions(+) create mode 100644 .changeset/large-feet-wash.md create mode 100644 plugins/techdocs-backend/src/plugin.ts diff --git a/.changeset/large-feet-wash.md b/.changeset/large-feet-wash.md new file mode 100644 index 0000000000..15e3c54b42 --- /dev/null +++ b/.changeset/large-feet-wash.md @@ -0,0 +1,6 @@ +--- +'@backstage/plugin-techdocs-backend': minor +'example-backend-next': minor +--- + +Expose the techdocs-backend plugin using the new plugin system diff --git a/packages/backend-next/package.json b/packages/backend-next/package.json index 9f7ec8306a..5d8a8cb1ec 100644 --- a/packages/backend-next/package.json +++ b/packages/backend-next/package.json @@ -29,6 +29,7 @@ "@backstage/plugin-app-backend": "workspace:^", "@backstage/plugin-catalog-backend": "workspace:^", "@backstage/plugin-scaffolder-backend": "workspace:^", + "@backstage/plugin-techdocs-backend": "workspace:^", "@backstage/plugin-todo-backend": "workspace:^" }, "devDependencies": { diff --git a/packages/backend-next/src/index.ts b/packages/backend-next/src/index.ts index 8e29244ebf..0f7af110e9 100644 --- a/packages/backend-next/src/index.ts +++ b/packages/backend-next/src/index.ts @@ -19,6 +19,7 @@ import { catalogModuleTemplateKind } from '@backstage/plugin-scaffolder-backend/ import { createBackend } from '@backstage/backend-defaults'; import { appPlugin } from '@backstage/plugin-app-backend/alpha'; import { todoPlugin } from '@backstage/plugin-todo-backend'; +import { techdocsPlugin } from '@backstage/plugin-techdocs-backend'; const backend = createBackend(); @@ -26,4 +27,5 @@ backend.add(catalogPlugin()); backend.add(catalogModuleTemplateKind()); backend.add(appPlugin({ appPackageName: 'example-app' })); backend.add(todoPlugin()); +backend.add(techdocsPlugin()); backend.start(); diff --git a/plugins/techdocs-backend/api-report.md b/plugins/techdocs-backend/api-report.md index 1f6aa1d66a..fe8db9a135 100644 --- a/plugins/techdocs-backend/api-report.md +++ b/plugins/techdocs-backend/api-report.md @@ -5,6 +5,7 @@ ```ts /// +import { BackendFeature } from '@backstage/backend-plugin-api'; import { CatalogApi } from '@backstage/catalog-client'; import { CatalogClient } from '@backstage/catalog-client'; import { Config } from '@backstage/config'; @@ -129,5 +130,8 @@ export type TechDocsCollatorOptions = { export { TechDocsDocument }; +// @public +export const techdocsPlugin: () => BackendFeature; + export * from '@backstage/plugin-techdocs-node'; ``` diff --git a/plugins/techdocs-backend/package.json b/plugins/techdocs-backend/package.json index c9fff25b70..6389487eec 100644 --- a/plugins/techdocs-backend/package.json +++ b/plugins/techdocs-backend/package.json @@ -34,6 +34,7 @@ }, "dependencies": { "@backstage/backend-common": "workspace:^", + "@backstage/backend-plugin-api": "workspace:^", "@backstage/catalog-client": "workspace:^", "@backstage/catalog-model": "workspace:^", "@backstage/config": "workspace:^", diff --git a/plugins/techdocs-backend/src/index.ts b/plugins/techdocs-backend/src/index.ts index dc5d87d1b3..06259d3d3c 100644 --- a/plugins/techdocs-backend/src/index.ts +++ b/plugins/techdocs-backend/src/index.ts @@ -37,6 +37,7 @@ export type { TechDocsCollatorFactoryOptions, TechDocsCollatorOptions, } from './search'; +export { techdocsPlugin } from './plugin'; /** * @deprecated Use directly from @backstage/plugin-techdocs-node diff --git a/plugins/techdocs-backend/src/plugin.ts b/plugins/techdocs-backend/src/plugin.ts new file mode 100644 index 0000000000..7cffcc8fbd --- /dev/null +++ b/plugins/techdocs-backend/src/plugin.ts @@ -0,0 +1,95 @@ +/* + * Copyright 2023 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { + DockerContainerRunner, + loggerToWinstonLogger, + cacheToPluginCacheManager, +} from '@backstage/backend-common'; +import { + coreServices, + createBackendPlugin, +} from '@backstage/backend-plugin-api'; + +import { + Preparers, + Generators, + Publisher, +} from '@backstage/plugin-techdocs-node'; +import Docker from 'dockerode'; +import { createRouter } from './service'; + +/** + * The TechDocs plugin is responsible for serving and building documentation for any entity. + * @public + */ +export const techdocsPlugin = createBackendPlugin({ + pluginId: 'techdocs-backend', + register(env) { + env.registerInit({ + deps: { + config: coreServices.config, + logger: coreServices.logger, + urlReader: coreServices.urlReader, + http: coreServices.httpRouter, + discovery: coreServices.discovery, + cache: coreServices.cache, + }, + async init({ config, logger, urlReader, http, discovery, cache }) { + const winstonLogger = loggerToWinstonLogger(logger); + // Preparers are responsible for fetching source files for documentation. + const preparers = await Preparers.fromConfig(config, { + reader: urlReader, + logger: winstonLogger, + }); + + // Docker client (conditionally) used by the generators, based on techdocs.generators config. + const dockerClient = new Docker(); + const containerRunner = new DockerContainerRunner({ dockerClient }); + + // Generators are used for generating documentation sites. + const generators = await Generators.fromConfig(config, { + logger: winstonLogger, + containerRunner, + }); + + // Publisher is used for + // 1. Publishing generated files to storage + // 2. Fetching files from storage and passing them to TechDocs frontend. + const publisher = await Publisher.fromConfig(config, { + logger: winstonLogger, + discovery: discovery, + }); + + // checks if the publisher is working and logs the result + await publisher.getReadiness(); + + const cacheManager = cacheToPluginCacheManager(cache); + http.use( + await createRouter({ + logger: winstonLogger, + cache: cacheManager, + preparers, + generators, + publisher, + config, + discovery, + }), + ); + }, + }); + }, +}); diff --git a/yarn.lock b/yarn.lock index 663107e961..6a8317bfce 100644 --- a/yarn.lock +++ b/yarn.lock @@ -8538,6 +8538,7 @@ __metadata: resolution: "@backstage/plugin-techdocs-backend@workspace:plugins/techdocs-backend" dependencies: "@backstage/backend-common": "workspace:^" + "@backstage/backend-plugin-api": "workspace:^" "@backstage/backend-test-utils": "workspace:^" "@backstage/catalog-client": "workspace:^" "@backstage/catalog-model": "workspace:^" @@ -22870,6 +22871,7 @@ __metadata: "@backstage/plugin-app-backend": "workspace:^" "@backstage/plugin-catalog-backend": "workspace:^" "@backstage/plugin-scaffolder-backend": "workspace:^" + "@backstage/plugin-techdocs-backend": "workspace:^" "@backstage/plugin-todo-backend": "workspace:^" languageName: unknown linkType: soft From c041efd53d64b72db7e217acb70f9d367b54bd35 Mon Sep 17 00:00:00 2001 From: Oleg S <97077423+RobotSail@users.noreply.github.com> Date: Wed, 8 Mar 2023 15:30:37 -0500 Subject: [PATCH 027/177] exposes the techdocs plugin as an alpha plugin Signed-off-by: Oleg S <97077423+RobotSail@users.noreply.github.com> --- .changeset/large-feet-wash.md | 3 +-- packages/backend-next/src/index.ts | 2 +- plugins/techdocs-backend/alpha-api-report.md | 12 ++++++++++++ plugins/techdocs-backend/api-report.md | 4 ---- plugins/techdocs-backend/package.json | 15 +++++++++++++++ plugins/techdocs-backend/src/alpha.ts | 16 ++++++++++++++++ plugins/techdocs-backend/src/index.ts | 1 - plugins/techdocs-backend/src/plugin.ts | 4 ++-- 8 files changed, 47 insertions(+), 10 deletions(-) create mode 100644 plugins/techdocs-backend/alpha-api-report.md create mode 100644 plugins/techdocs-backend/src/alpha.ts diff --git a/.changeset/large-feet-wash.md b/.changeset/large-feet-wash.md index 15e3c54b42..d663661725 100644 --- a/.changeset/large-feet-wash.md +++ b/.changeset/large-feet-wash.md @@ -1,6 +1,5 @@ --- '@backstage/plugin-techdocs-backend': minor -'example-backend-next': minor --- -Expose the techdocs-backend plugin using the new plugin system +Added alpha export of the `techdocsPlugin` using the new backend system diff --git a/packages/backend-next/src/index.ts b/packages/backend-next/src/index.ts index 0f7af110e9..8f8984b192 100644 --- a/packages/backend-next/src/index.ts +++ b/packages/backend-next/src/index.ts @@ -19,7 +19,7 @@ import { catalogModuleTemplateKind } from '@backstage/plugin-scaffolder-backend/ import { createBackend } from '@backstage/backend-defaults'; import { appPlugin } from '@backstage/plugin-app-backend/alpha'; import { todoPlugin } from '@backstage/plugin-todo-backend'; -import { techdocsPlugin } from '@backstage/plugin-techdocs-backend'; +import { techdocsPlugin } from '@backstage/plugin-techdocs-backend/alpha'; const backend = createBackend(); diff --git a/plugins/techdocs-backend/alpha-api-report.md b/plugins/techdocs-backend/alpha-api-report.md new file mode 100644 index 0000000000..16db84c216 --- /dev/null +++ b/plugins/techdocs-backend/alpha-api-report.md @@ -0,0 +1,12 @@ +## API Report File for "@backstage/plugin-techdocs-backend" + +> Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/). + +```ts +import { BackendFeature } from '@backstage/backend-plugin-api'; + +// @alpha +export const techdocsPlugin: () => BackendFeature; + +// (No @packageDocumentation comment for this package) +``` diff --git a/plugins/techdocs-backend/api-report.md b/plugins/techdocs-backend/api-report.md index fe8db9a135..1f6aa1d66a 100644 --- a/plugins/techdocs-backend/api-report.md +++ b/plugins/techdocs-backend/api-report.md @@ -5,7 +5,6 @@ ```ts /// -import { BackendFeature } from '@backstage/backend-plugin-api'; import { CatalogApi } from '@backstage/catalog-client'; import { CatalogClient } from '@backstage/catalog-client'; import { Config } from '@backstage/config'; @@ -130,8 +129,5 @@ export type TechDocsCollatorOptions = { export { TechDocsDocument }; -// @public -export const techdocsPlugin: () => BackendFeature; - export * from '@backstage/plugin-techdocs-node'; ``` diff --git a/plugins/techdocs-backend/package.json b/plugins/techdocs-backend/package.json index 6389487eec..1d2f4400eb 100644 --- a/plugins/techdocs-backend/package.json +++ b/plugins/techdocs-backend/package.json @@ -10,6 +10,21 @@ "main": "dist/index.cjs.js", "types": "dist/index.d.ts" }, + "exports": { + ".": "./src/index.ts", + "./alpha": "./src/alpha.ts", + "./package.json": "./package.json" + }, + "typesVersions": { + "*": { + "alpha": [ + "src/alpha.ts" + ], + "package.json": [ + "package.json" + ] + } + }, "backstage": { "role": "backend-plugin" }, diff --git a/plugins/techdocs-backend/src/alpha.ts b/plugins/techdocs-backend/src/alpha.ts new file mode 100644 index 0000000000..1a36c5a1f5 --- /dev/null +++ b/plugins/techdocs-backend/src/alpha.ts @@ -0,0 +1,16 @@ +/* + * Copyright 2023 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +export { techdocsPlugin } from './plugin'; diff --git a/plugins/techdocs-backend/src/index.ts b/plugins/techdocs-backend/src/index.ts index 06259d3d3c..dc5d87d1b3 100644 --- a/plugins/techdocs-backend/src/index.ts +++ b/plugins/techdocs-backend/src/index.ts @@ -37,7 +37,6 @@ export type { TechDocsCollatorFactoryOptions, TechDocsCollatorOptions, } from './search'; -export { techdocsPlugin } from './plugin'; /** * @deprecated Use directly from @backstage/plugin-techdocs-node diff --git a/plugins/techdocs-backend/src/plugin.ts b/plugins/techdocs-backend/src/plugin.ts index 7cffcc8fbd..4b0ebbe366 100644 --- a/plugins/techdocs-backend/src/plugin.ts +++ b/plugins/techdocs-backend/src/plugin.ts @@ -30,11 +30,11 @@ import { Publisher, } from '@backstage/plugin-techdocs-node'; import Docker from 'dockerode'; -import { createRouter } from './service'; +import { createRouter } from '@backstage/plugin-techdocs-backend'; /** * The TechDocs plugin is responsible for serving and building documentation for any entity. - * @public + * @alpha */ export const techdocsPlugin = createBackendPlugin({ pluginId: 'techdocs-backend', From a09223a505fd36574d0b57beb340896eddb12702 Mon Sep 17 00:00:00 2001 From: Oleg S <97077423+RobotSail@users.noreply.github.com> Date: Thu, 9 Mar 2023 09:52:33 -0500 Subject: [PATCH 028/177] rename pluginId for todo-backend & techdocs-backend to 'todo' and 'techdocs' Signed-off-by: Oleg S <97077423+RobotSail@users.noreply.github.com> --- .changeset/large-feet-wash.md | 3 ++- plugins/techdocs-backend/src/plugin.ts | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/.changeset/large-feet-wash.md b/.changeset/large-feet-wash.md index d663661725..2a55aab2c9 100644 --- a/.changeset/large-feet-wash.md +++ b/.changeset/large-feet-wash.md @@ -1,5 +1,6 @@ --- '@backstage/plugin-techdocs-backend': minor +'@backstage/plugin-todo-backend': patch --- -Added alpha export of the `techdocsPlugin` using the new backend system +Added alpha export of the `techdocsPlugin` using the new backend system. Renamed the `todoPlugin` pluginId from `todo-backend` to `todo`. diff --git a/plugins/techdocs-backend/src/plugin.ts b/plugins/techdocs-backend/src/plugin.ts index 4b0ebbe366..134de2bba6 100644 --- a/plugins/techdocs-backend/src/plugin.ts +++ b/plugins/techdocs-backend/src/plugin.ts @@ -37,7 +37,7 @@ import { createRouter } from '@backstage/plugin-techdocs-backend'; * @alpha */ export const techdocsPlugin = createBackendPlugin({ - pluginId: 'techdocs-backend', + pluginId: 'techdocs', register(env) { env.registerInit({ deps: { From 2f2f5112adad5bd11d923d3aabf850afd00a5e3b Mon Sep 17 00:00:00 2001 From: Oleg S <97077423+RobotSail@users.noreply.github.com> Date: Thu, 9 Mar 2023 11:23:18 -0500 Subject: [PATCH 029/177] spelling Signed-off-by: Oleg S <97077423+RobotSail@users.noreply.github.com> --- .changeset/large-feet-wash.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.changeset/large-feet-wash.md b/.changeset/large-feet-wash.md index 2a55aab2c9..88a28f9d60 100644 --- a/.changeset/large-feet-wash.md +++ b/.changeset/large-feet-wash.md @@ -1,6 +1,5 @@ --- '@backstage/plugin-techdocs-backend': minor -'@backstage/plugin-todo-backend': patch --- -Added alpha export of the `techdocsPlugin` using the new backend system. Renamed the `todoPlugin` pluginId from `todo-backend` to `todo`. +Introduced alpha export of the `techdocsPlugin` using the new backend system. From 8b925744164998e0d3bea832dce1f4f7bf7569fa Mon Sep 17 00:00:00 2001 From: afalco Date: Fri, 10 Mar 2023 09:37:51 -0600 Subject: [PATCH 030/177] Add tests for step timers Signed-off-by: afalco --- .../components/TaskSteps/TaskSteps.test.tsx | 51 +++++++++++++++++++ .../next/components/TaskSteps/TaskSteps.tsx | 1 + 2 files changed, 52 insertions(+) diff --git a/plugins/scaffolder-react/src/next/components/TaskSteps/TaskSteps.test.tsx b/plugins/scaffolder-react/src/next/components/TaskSteps/TaskSteps.test.tsx index 0945843961..cbc87c2d53 100644 --- a/plugins/scaffolder-react/src/next/components/TaskSteps/TaskSteps.test.tsx +++ b/plugins/scaffolder-react/src/next/components/TaskSteps/TaskSteps.test.tsx @@ -61,4 +61,55 @@ describe('TaskSteps', () => { expect(getByText(step.name)).toBeInTheDocument(); } }); + it('should only show timer for in progress, failed, and completed steps', async () => { + const steps = [ + { + id: '1', + name: 'Fail', + status: 'failed' as ScaffolderTaskStatus, + + startedAt: Date.now().toLocaleString(), + endedAt: Date.now().toLocaleString(), + action: 'action1', + }, + { + id: '2', + name: 'Process', + status: 'processing' as ScaffolderTaskStatus, + startedAt: Date.now().toLocaleString(), + action: 'action2', + }, + { + id: '3', + name: 'Complete', + status: 'completed' as ScaffolderTaskStatus, + startedAt: Date.now().toLocaleString(), + endedAt: Date.now().toLocaleString(), + action: 'action3', + }, + { + id: '4', + name: 'Skip', + status: 'skipped' as ScaffolderTaskStatus, + startedAt: Date.now().toLocaleString(), + action: 'action4', + }, + { + id: '5', + name: 'Not Started', + status: 'open' as ScaffolderTaskStatus, + action: 'action5', + }, + ]; + + const screen = await renderInTestApp(); + const stepLabels = await screen.findAllByTestId('step-label'); + expect(stepLabels.length).toBe(steps.length); + for (let i = 0; i < steps.length; i++) { + expect(stepLabels[i].textContent?.startsWith(steps[i].name)).toBe(true); + expect(stepLabels[i].textContent?.endsWith('seconds')).toBe( + steps[i].status !== 'skipped' && !!steps[i].startedAt, + ); + } + }); }); diff --git a/plugins/scaffolder-react/src/next/components/TaskSteps/TaskSteps.tsx b/plugins/scaffolder-react/src/next/components/TaskSteps/TaskSteps.tsx index 668306fa9e..d783351eca 100644 --- a/plugins/scaffolder-react/src/next/components/TaskSteps/TaskSteps.tsx +++ b/plugins/scaffolder-react/src/next/components/TaskSteps/TaskSteps.tsx @@ -78,6 +78,7 @@ export const TaskSteps = (props: TaskStepsProps) => { {step.name} {!isSkipped && } From 078f46ea3269a61faaaab1d21290741c511d199e Mon Sep 17 00:00:00 2001 From: Dustin Brewer Date: Fri, 10 Mar 2023 15:45:48 +0000 Subject: [PATCH 031/177] Cleanup building FireHydrant service name Remove the reduntant check for the annotation, and utilize stringifyEntityRef as recommended Signed-off-by: Dustin Brewer --- .../ServiceDetailsCard/ServiceDetailsCard.test.tsx | 4 +++- plugins/firehydrant/src/components/hooks.test.ts | 2 +- plugins/firehydrant/src/components/hooks.ts | 9 +++------ 3 files changed, 7 insertions(+), 8 deletions(-) diff --git a/plugins/firehydrant/src/components/ServiceDetailsCard/ServiceDetailsCard.test.tsx b/plugins/firehydrant/src/components/ServiceDetailsCard/ServiceDetailsCard.test.tsx index 20dbb77e86..ce2b1f5391 100644 --- a/plugins/firehydrant/src/components/ServiceDetailsCard/ServiceDetailsCard.test.tsx +++ b/plugins/firehydrant/src/components/ServiceDetailsCard/ServiceDetailsCard.test.tsx @@ -30,7 +30,9 @@ const apis = TestApiRegistry.from([fireHydrantApiRef, mockFireHydrantApi]); jest.mock('@backstage/plugin-catalog-react', () => ({ useEntity: () => { - return { entity: { metadata: { name: 'service-example' } } }; + return { + entity: { kind: 'Component', metadata: { name: 'service-example' } }, + }; }, })); diff --git a/plugins/firehydrant/src/components/hooks.test.ts b/plugins/firehydrant/src/components/hooks.test.ts index 2fbf1e2d57..f35d6774ce 100644 --- a/plugins/firehydrant/src/components/hooks.test.ts +++ b/plugins/firehydrant/src/components/hooks.test.ts @@ -63,7 +63,7 @@ describe('firehydrant-hooks-getFireHydrantServiceName', () => { }); it('should return generated service name', () => { - const expected = 'Component:default/test-fh-name'; + const expected = 'component:default/test-fh-name'; const e: Entity = { apiVersion: 'backstage.io/v1alpha1', kind: 'Component', diff --git a/plugins/firehydrant/src/components/hooks.ts b/plugins/firehydrant/src/components/hooks.ts index d9145f13f0..c4055b1724 100644 --- a/plugins/firehydrant/src/components/hooks.ts +++ b/plugins/firehydrant/src/components/hooks.ts @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { Entity } from '@backstage/catalog-model'; +import { Entity, stringifyEntityRef } from '@backstage/catalog-model'; export const FIREHYDRANT_SERVICE_NAME_ANNOTATION = 'firehydrant.com/service-name'; @@ -21,8 +21,5 @@ export const FIREHYDRANT_SERVICE_NAME_ANNOTATION = export const isFireHydrantAvailable = (entity: Entity) => Boolean(entity.metadata.annotations?.[FIREHYDRANT_SERVICE_NAME_ANNOTATION]); export const getFireHydrantServiceName = (entity: Entity) => - isFireHydrantAvailable(entity) - ? entity?.metadata.annotations?.[FIREHYDRANT_SERVICE_NAME_ANNOTATION] ?? '' - : `${entity?.kind}:${entity?.metadata?.namespace ?? 'default'}/${ - entity?.metadata?.name - }`; + entity?.metadata.annotations?.[FIREHYDRANT_SERVICE_NAME_ANNOTATION] ?? + stringifyEntityRef(entity); From c5afe933bbbaa6037e42b6516156fc135d11905b Mon Sep 17 00:00:00 2001 From: Dustin Brewer Date: Fri, 10 Mar 2023 16:00:32 +0000 Subject: [PATCH 032/177] Cleanup query string encoding on services API call Signed-off-by: Dustin Brewer --- plugins/firehydrant/src/api/index.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/plugins/firehydrant/src/api/index.ts b/plugins/firehydrant/src/api/index.ts index 45834d90e9..1cbf10ec9b 100644 --- a/plugins/firehydrant/src/api/index.ts +++ b/plugins/firehydrant/src/api/index.ts @@ -81,10 +81,10 @@ export class FireHydrantAPIClient implements FireHydrantAPI { lookupByName: boolean; }): Promise { const queryOpt = options.lookupByName ? 'name' : 'query'; + const query = new URLSearchParams(); + query.set(queryOpt, options.serviceName); const proxyUrl = await this.getApiUrl(); - const response = await fetch( - `${proxyUrl}/services?${queryOpt}=${options.serviceName}`, - ); + const response = await fetch(`${proxyUrl}/services?${query}`); if (!response.ok) { throw new Error( From cf90b966989babe15a7656195fcb578772db1e1d Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 10 Mar 2023 16:48:29 +0000 Subject: [PATCH 033/177] chore(deps): update dependency lint-staged to v13.2.0 Signed-off-by: Renovate Bot --- yarn.lock | 96 +++++++++++++++++++++++++++++++------------------------ 1 file changed, 55 insertions(+), 41 deletions(-) diff --git a/yarn.lock b/yarn.lock index b1b60ba15e..cdcd999a2a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -18749,6 +18749,13 @@ __metadata: languageName: node linkType: hard +"chalk@npm:5.2.0": + version: 5.2.0 + resolution: "chalk@npm:5.2.0" + checksum: 03d8060277de6cf2fd567dc25fcf770593eb5bb85f460ce443e49255a30ff1242edd0c90a06a03803b0466ff0687a939b41db1757bec987113e83de89a003caa + languageName: node + linkType: hard + "chalk@npm:^3.0.0": version: 3.0.0 resolution: "chalk@npm:3.0.0" @@ -19430,10 +19437,10 @@ __metadata: languageName: node linkType: hard -"commander@npm:*, commander@npm:^9.1.0, commander@npm:^9.4.1, commander@npm:^9.5.0": - version: 9.5.0 - resolution: "commander@npm:9.5.0" - checksum: c7a3e27aa59e913b54a1bafd366b88650bc41d6651f0cbe258d4ff09d43d6a7394232a4dadd0bf518b3e696fdf595db1028a0d82c785b88bd61f8a440cecfade +"commander@npm:*, commander@npm:^10.0.0": + version: 10.0.0 + resolution: "commander@npm:10.0.0" + checksum: 9f6495651f878213005ac744dd87a85fa3d9f2b8b90d1c19d0866d666bda7f735adfd7c2f10dfff345782e2f80ea258f98bb4efcef58e4e502f25f883940acfd languageName: node linkType: hard @@ -19486,6 +19493,13 @@ __metadata: languageName: node linkType: hard +"commander@npm:^9.1.0, commander@npm:^9.5.0": + version: 9.5.0 + resolution: "commander@npm:9.5.0" + checksum: c7a3e27aa59e913b54a1bafd366b88650bc41d6651f0cbe258d4ff09d43d6a7394232a4dadd0bf518b3e696fdf595db1028a0d82c785b88bd61f8a440cecfade + languageName: node + linkType: hard + "common-ancestor-path@npm:^1.0.1": version: 1.0.1 resolution: "common-ancestor-path@npm:1.0.1" @@ -22978,20 +22992,20 @@ __metadata: languageName: node linkType: hard -"execa@npm:^6.1.0": - version: 6.1.0 - resolution: "execa@npm:6.1.0" +"execa@npm:^7.0.0": + version: 7.0.0 + resolution: "execa@npm:7.0.0" dependencies: cross-spawn: ^7.0.3 get-stream: ^6.0.1 - human-signals: ^3.0.1 + human-signals: ^4.3.0 is-stream: ^3.0.0 merge-stream: ^2.0.0 npm-run-path: ^5.1.0 onetime: ^6.0.0 signal-exit: ^3.0.7 strip-final-newline: ^3.0.0 - checksum: 1a4af799839134f5c72eb63d525b87304c1114a63aa71676c91d57ccef2e26f2f53e14c11384ab11c4ec479be1efa83d11c8190e00040355c2c5c3364327fa8e + checksum: be7c7b6d1e5473f628e46888b0cf8279da483c1a6000dd494a2059cc26591ded57ba46be1c9bdde1ec895e7eb8b18911174aba425cd971d41d140a9405da9a02 languageName: node linkType: hard @@ -25287,10 +25301,10 @@ __metadata: languageName: node linkType: hard -"human-signals@npm:^3.0.1": - version: 3.0.1 - resolution: "human-signals@npm:3.0.1" - checksum: f252a7769c8094a5c9dc6772816bdb417b188820b04c8b42d0fc468e03a0ba905b1dd07afabe9385cc83504af1ccc2b985cd1e4aeeeb8e0029896c5af2e6f354 +"human-signals@npm:^4.3.0": + version: 4.3.0 + resolution: "human-signals@npm:4.3.0" + checksum: 662b976b1063a8afb8fd7fa50bde6975997e17ea6ceba2aad54aacf1dc239a2cd7d14d27b3ceca0c6288627f4b45c56c2c89618455ff52cd9377c02d6328cd7c languageName: node linkType: hard @@ -28301,10 +28315,10 @@ __metadata: languageName: node linkType: hard -"lilconfig@npm:2.0.6, lilconfig@npm:^2.0.3": - version: 2.0.6 - resolution: "lilconfig@npm:2.0.6" - checksum: 40a3cd72f103b1be5975f2ac1850810b61d4053e20ab09be8d3aeddfe042187e1ba70b4651a7e70f95efa1642e7dc8b2ae395b317b7d7753b241b43cef7c0f7d +"lilconfig@npm:2.1.0, lilconfig@npm:^2.0.3": + version: 2.1.0 + resolution: "lilconfig@npm:2.1.0" + checksum: 8549bb352b8192375fed4a74694cd61ad293904eee33f9d4866c2192865c44c4eb35d10782966242634e0cbc1e91fe62b1247f148dc5514918e3a966da7ea117 languageName: node linkType: hard @@ -28344,25 +28358,25 @@ __metadata: linkType: hard "lint-staged@npm:^13.0.0": - version: 13.1.2 - resolution: "lint-staged@npm:13.1.2" + version: 13.2.0 + resolution: "lint-staged@npm:13.2.0" dependencies: + chalk: 5.2.0 cli-truncate: ^3.1.0 - colorette: ^2.0.19 - commander: ^9.4.1 + commander: ^10.0.0 debug: ^4.3.4 - execa: ^6.1.0 - lilconfig: 2.0.6 - listr2: ^5.0.5 + execa: ^7.0.0 + lilconfig: 2.1.0 + listr2: ^5.0.7 micromatch: ^4.0.5 normalize-path: ^3.0.0 - object-inspect: ^1.12.2 + object-inspect: ^1.12.3 pidtree: ^0.6.0 string-argv: ^0.3.1 - yaml: ^2.1.3 + yaml: ^2.2.1 bin: lint-staged: bin/lint-staged.js - checksum: f854ad5c88542b8f06e27f3b4046927a4f3d4a451a04e079526559d819a325762268f65bd2df7156bcc0cb5f531f621c42cdb824b403f537c78305adc9e56a54 + checksum: dcaa8fbbde567eb8ac27230a18b3a22f30c278c524c0e27cf7d4110d662d5d33ed68a585a2e1b05075ef1c262e853f557a5ae046188b723603246d63e6b9f07b languageName: node linkType: hard @@ -28408,16 +28422,16 @@ __metadata: languageName: node linkType: hard -"listr2@npm:^5.0.5": - version: 5.0.5 - resolution: "listr2@npm:5.0.5" +"listr2@npm:^5.0.7": + version: 5.0.7 + resolution: "listr2@npm:5.0.7" dependencies: cli-truncate: ^2.1.0 colorette: ^2.0.19 log-update: ^4.0.0 p-map: ^4.0.0 rfdc: ^1.3.0 - rxjs: ^7.5.6 + rxjs: ^7.8.0 through: ^2.3.8 wrap-ansi: ^7.0.0 peerDependencies: @@ -28425,7 +28439,7 @@ __metadata: peerDependenciesMeta: enquirer: optional: true - checksum: 71c44eb648405d2725f248747ef8d5e192dd16938ec81df854c4a7e74ff1b3f4c3149461b1cff31c761bfbdf110f7f2603c9957c908294a1c6db299c9168608c + checksum: 5c2cb6ba3f7a5cfd548f89405febe73dc937acb6060227198c05da0ed5d5285a8107c61fcc4e33884e3bbdd447411aff7580af396bd22b6a11047ceab4950fab languageName: node linkType: hard @@ -30981,10 +30995,10 @@ __metadata: languageName: node linkType: hard -"object-inspect@npm:^1.12.2, object-inspect@npm:^1.9.0": - version: 1.12.2 - resolution: "object-inspect@npm:1.12.2" - checksum: a534fc1b8534284ed71f25ce3a496013b7ea030f3d1b77118f6b7b1713829262be9e6243acbcb3ef8c626e2b64186112cb7f6db74e37b2789b9c789ca23048b2 +"object-inspect@npm:^1.12.2, object-inspect@npm:^1.12.3, object-inspect@npm:^1.9.0": + version: 1.12.3 + resolution: "object-inspect@npm:1.12.3" + checksum: dabfd824d97a5f407e6d5d24810d888859f6be394d8b733a77442b277e0808860555176719c5905e765e3743a7cada6b8b0a3b85e5331c530fd418cc8ae991db languageName: node linkType: hard @@ -35093,7 +35107,7 @@ __metadata: languageName: node linkType: hard -"rxjs@npm:^7.0.0, rxjs@npm:^7.2.0, rxjs@npm:^7.5.1, rxjs@npm:^7.5.5, rxjs@npm:^7.5.6, rxjs@npm:^7.8.0": +"rxjs@npm:^7.0.0, rxjs@npm:^7.2.0, rxjs@npm:^7.5.1, rxjs@npm:^7.5.5, rxjs@npm:^7.8.0": version: 7.8.0 resolution: "rxjs@npm:7.8.0" dependencies: @@ -39460,10 +39474,10 @@ __metadata: languageName: node linkType: hard -"yaml@npm:^2.0.0, yaml@npm:^2.1.1, yaml@npm:^2.1.3": - version: 2.1.3 - resolution: "yaml@npm:2.1.3" - checksum: 91316062324a93f9cb547469092392e7d004ff8f70c40fecb420f042a4870b2181557350da56c92f07bd44b8f7a252b0be26e6ade1f548e1f4351bdd01c9d3c7 +"yaml@npm:^2.0.0, yaml@npm:^2.1.1, yaml@npm:^2.2.1": + version: 2.2.1 + resolution: "yaml@npm:2.2.1" + checksum: 84f68cbe462d5da4e7ded4a8bded949ffa912bc264472e5a684c3d45b22d8f73a3019963a32164023bdf3d83cfb6f5b58ff7b2b10ef5b717c630f40bd6369a23 languageName: node linkType: hard From edecccabe47b23c5c78118ee46def576afbb8e6d Mon Sep 17 00:00:00 2001 From: zjpersc Date: Fri, 10 Mar 2023 14:01:24 -0600 Subject: [PATCH 034/177] Updating the feature doc for techdocs-cli Signed-off-by: zjpersc --- docs/features/techdocs/cli.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/docs/features/techdocs/cli.md b/docs/features/techdocs/cli.md index b174896d6a..76589de5a8 100644 --- a/docs/features/techdocs/cli.md +++ b/docs/features/techdocs/cli.md @@ -200,6 +200,15 @@ Options: -h, --help display help for command ``` +#### Publishing from behind a proxy + +For users attempting to publish TechDocs content behind a proxy, the TechDocs CLI leverages `global-agent` to navigate the proxy to successfully connect to that location. To enable `global-agent`, the following variables need to be set prior to running the techdocs-cli command: + +```bash +export GLOBAL_AGENT_HTTPS_PROXY=${HTTP_PROXY} +export GLOBAL_AGENT_NO_PROXY=${NO_PROXY} +``` + ### Migrate content for case-insensitive access Prior to the beta version of TechDocs (`v[0.11.0]`), TechDocs were stored in From 1b3ab31a2be25f7deda63a2f3449540da550fbd1 Mon Sep 17 00:00:00 2001 From: Bogdan Nechyporenko Date: Fri, 10 Mar 2023 23:49:46 +0100 Subject: [PATCH 035/177] removed microservice-next leftovers Signed-off-by: Bogdan Nechyporenko --- .../src/components/simpleCard/simpleCard.tsx | 17 ---- .../src/pages/on-demand/_onDemandCard.tsx | 66 ---------------- microsite-next/src/pages/on-demand/index.tsx | 78 ------------------- .../src/pages/on-demand/onDemand.module.scss | 44 ----------- .../src/util/truncateDescription.tsx | 11 --- 5 files changed, 216 deletions(-) delete mode 100644 microsite-next/src/components/simpleCard/simpleCard.tsx delete mode 100644 microsite-next/src/pages/on-demand/_onDemandCard.tsx delete mode 100644 microsite-next/src/pages/on-demand/index.tsx delete mode 100644 microsite-next/src/pages/on-demand/onDemand.module.scss delete mode 100644 microsite-next/src/util/truncateDescription.tsx diff --git a/microsite-next/src/components/simpleCard/simpleCard.tsx b/microsite-next/src/components/simpleCard/simpleCard.tsx deleted file mode 100644 index 77be566f18..0000000000 --- a/microsite-next/src/components/simpleCard/simpleCard.tsx +++ /dev/null @@ -1,17 +0,0 @@ -import React from 'react'; - -export interface ICardData { - header: React.ReactNode; - body: React.ReactNode; - footer: React.ReactNode; -} - -export const SimpleCard = ({ header, body, footer }: ICardData) => ( -
-
{header}
- -
{body}
- -
{footer}
-
-); diff --git a/microsite-next/src/pages/on-demand/_onDemandCard.tsx b/microsite-next/src/pages/on-demand/_onDemandCard.tsx deleted file mode 100644 index e203c80f9a..0000000000 --- a/microsite-next/src/pages/on-demand/_onDemandCard.tsx +++ /dev/null @@ -1,66 +0,0 @@ -import Link from '@docusaurus/Link'; -import { SimpleCard } from '@site/src/components/simpleCard/simpleCard'; -import React from 'react'; - -export interface IOnDemandData { - title: string; - category: string; - description: string; - date: string; - youtubeUrl: string; - youtubeImgUrl: string; - rsvpUrl: string; - eventUrl: string; -} - -export const OnDemandCard = ({ - title, - category, - description, - date, - youtubeUrl, - youtubeImgUrl, - rsvpUrl, - eventUrl, -}: IOnDemandData) => ( - -

{title}

- -

on {date}

- - {category} - - {title} - - } - body={

{description}

} - footer={ - category.toLowerCase() === 'upcoming' ? ( - <> - - Event page - - - - Remind me - - - ) : ( - - Watch on YouTube - - ) - } - /> -); diff --git a/microsite-next/src/pages/on-demand/index.tsx b/microsite-next/src/pages/on-demand/index.tsx deleted file mode 100644 index 7262005f70..0000000000 --- a/microsite-next/src/pages/on-demand/index.tsx +++ /dev/null @@ -1,78 +0,0 @@ -import Layout from '@theme/Layout'; -import clsx from 'clsx'; -import React from 'react'; - -import { IOnDemandData, OnDemandCard } from './_onDemandCard'; -import pluginsStyles from './onDemand.module.scss'; -import { truncateDescription } from '@site/src/util/truncateDescription'; -import Link from '@docusaurus/Link'; - -//#region Plugin data import -const onDemandContext = require.context( - '../../../../microsite/data/on-demand', - false, - /\.ya?ml/, -); - -const onDemandData = onDemandContext.keys().reduce( - (acum, id) => { - const pluginData: IOnDemandData = onDemandContext(id).default; - - acum[ - pluginData.category === 'Upcoming' ? 'upcomingEvents' : 'onDemandEvents' - ].push(truncateDescription(pluginData)); - - return acum; - }, - { - upcomingEvents: [] as IOnDemandData[], - onDemandEvents: [] as IOnDemandData[], - }, -); -//#endregion - -const Plugins = () => ( - -
-
-
-

Community sessions

- -

- Upcoming events and recorded sessions about updates, demos and - discussions. -

-
- - - Add an event or recording - -
- -
- -

Upcoming live events

- -
- {onDemandData.upcomingEvents.map(eventData => ( - - ))} -
- -

Community on demand

- -
- {onDemandData.onDemandEvents.map(eventData => ( - - ))} -
-
-
-); - -export default Plugins; diff --git a/microsite-next/src/pages/on-demand/onDemand.module.scss b/microsite-next/src/pages/on-demand/onDemand.module.scss deleted file mode 100644 index fba051ec97..0000000000 --- a/microsite-next/src/pages/on-demand/onDemand.module.scss +++ /dev/null @@ -1,44 +0,0 @@ -.onDemandPage { - :global(.marketplaceBanner) { - display: flex; - align-items: center; - } - - :global(.marketplaceContent) { - flex: 1; - } - - :global(.card) { - max-width: 100%; - } - - :global(.card .card__header) { - display: grid; - row-gap: 0.25rem; - column-gap: 1rem; - justify-items: start; - - > * { - margin: 0; - } - - :global(img) { - width: 250px; - max-width: 100%; - justify-self: center; - } - } - - :global(.card .card__footer) { - gap: 1rem; - display: grid; - grid-template-columns: repeat(auto-fit, minmax(100px, 1fr)); - } - - :global(.cardsContainer) { - gap: 1rem; - display: grid; - grid-template-columns: repeat(auto-fill, minmax(250px, 1fr)); - justify-items: start; - } -} diff --git a/microsite-next/src/util/truncateDescription.tsx b/microsite-next/src/util/truncateDescription.tsx deleted file mode 100644 index dc661cbd49..0000000000 --- a/microsite-next/src/util/truncateDescription.tsx +++ /dev/null @@ -1,11 +0,0 @@ -export const maxDescLength = 160; - -export const truncateDescription = ( - itemData: T, -) => - itemData.description.length > maxDescLength - ? { - ...itemData, - description: itemData.description.slice(0, maxDescLength) + '...', - } - : itemData; From 09d9c07199e74a9ff5561d8b03a4f2c2e2badea3 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sat, 11 Mar 2023 16:49:49 +0000 Subject: [PATCH 036/177] chore(deps): update dependency @tsconfig/docusaurus to v1.0.7 Signed-off-by: Renovate Bot --- microsite/yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/microsite/yarn.lock b/microsite/yarn.lock index a9db81ead4..81b78f043b 100644 --- a/microsite/yarn.lock +++ b/microsite/yarn.lock @@ -2756,9 +2756,9 @@ __metadata: linkType: hard "@tsconfig/docusaurus@npm:^1.0.6": - version: 1.0.6 - resolution: "@tsconfig/docusaurus@npm:1.0.6" - checksum: fb0d7965c01fe64fc6369a72695b903d654bd5fb145f373d707c2bae3c2d828703517d812cef1c041ae44b108f44e52778b9d9837a54fdf782e68e6619a90a4d + version: 1.0.7 + resolution: "@tsconfig/docusaurus@npm:1.0.7" + checksum: 8f5b14005d90b2008f10daf03a5edec86d2a7603e5641c579ea936a5c2d165a8c3007a72254fc4c2adb0554d73062f52bb97b30ff818f01c9215957822f3c4db languageName: node linkType: hard From 80a75f03fc950a32ac90f966604293f3ba2234a3 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sun, 12 Mar 2023 03:42:21 +0000 Subject: [PATCH 037/177] chore(deps): update react-router monorepo to v6.9.0 Signed-off-by: Renovate Bot --- yarn.lock | 33 ++++++++++++++++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) diff --git a/yarn.lock b/yarn.lock index b1b60ba15e..41da512bc6 100644 --- a/yarn.lock +++ b/yarn.lock @@ -13152,6 +13152,13 @@ __metadata: languageName: node linkType: hard +"@remix-run/router@npm:1.4.0": + version: 1.4.0 + resolution: "@remix-run/router@npm:1.4.0" + checksum: 707dce35a2b8138005cf19e63f6fd3c4da05b4b892e9e9118e8b727c3b95953efe27307ca2df35084044df30fa1fc367cf0bbc98d1ded9020c82e61e6242caaf + languageName: node + linkType: hard + "@repeaterjs/repeater@npm:3.0.4": version: 3.0.4 resolution: "@repeaterjs/repeater@npm:3.0.4" @@ -33789,7 +33796,7 @@ __metadata: languageName: node linkType: hard -"react-router-dom-stable@npm:react-router-dom@^6.3.0, react-router-dom@npm:^6.3.0": +"react-router-dom-stable@npm:react-router-dom@^6.3.0": version: 6.8.1 resolution: "react-router-dom@npm:6.8.1" dependencies: @@ -33802,6 +33809,19 @@ __metadata: languageName: node linkType: hard +"react-router-dom@npm:^6.3.0": + version: 6.9.0 + resolution: "react-router-dom@npm:6.9.0" + dependencies: + "@remix-run/router": 1.4.0 + react-router: 6.9.0 + peerDependencies: + react: ">=16.8" + react-dom: ">=16.8" + checksum: 4d593491ab8db5611feda70002c62902baebb84d5c1c5e5b6172496f31f91130deee132bf4240dea634a88cb86c76d6da348f15b9cd5e5197be455efd88edf72 + languageName: node + linkType: hard + "react-router-stable@npm:react-router@^6.3.0, react-router@npm:6.8.1": version: 6.8.1 resolution: "react-router@npm:6.8.1" @@ -33813,6 +33833,17 @@ __metadata: languageName: node linkType: hard +"react-router@npm:6.9.0": + version: 6.9.0 + resolution: "react-router@npm:6.9.0" + dependencies: + "@remix-run/router": 1.4.0 + peerDependencies: + react: ">=16.8" + checksum: b2a5f42e042bee7a7f116ca7817b0e58359e5353d84887c9fe7a633d7490c03b1e0ae37cd01830c2a381e3d1e7d501bb4751e53cc3d491e25f36582d3f6e0546 + languageName: node + linkType: hard + "react-side-effect@npm:^2.1.0": version: 2.1.0 resolution: "react-side-effect@npm:2.1.0" From 86d9e2a7389590b8d56179562ea7f12ef9566917 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sun, 12 Mar 2023 04:27:53 +0000 Subject: [PATCH 038/177] chore(deps): update dependency @types/archiver to v5.3.2 Signed-off-by: Renovate Bot --- yarn.lock | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/yarn.lock b/yarn.lock index 41da512bc6..ee6c14da1c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -14262,11 +14262,11 @@ __metadata: linkType: hard "@types/archiver@npm:^5.1.0, @types/archiver@npm:^5.3.1": - version: 5.3.1 - resolution: "@types/archiver@npm:5.3.1" + version: 5.3.2 + resolution: "@types/archiver@npm:5.3.2" dependencies: - "@types/glob": "*" - checksum: 1c6babc7f50acf5bf7fa3d5fa76bb68702e4463e6a412d259cdddff611dbbb9832ea4b2f41d675fd95ac1aa8b087daa882423073e41db9e296f14d41f2ea88e6 + "@types/readdir-glob": "*" + checksum: 9db5b4fdc1740fa07d08340ed827598cc6eda97406ac18a06a158670c7124d4120650a3b9cd660e9e39b42f033cf8f052566da32681e8ad91163473df88a3c4c languageName: node linkType: hard @@ -15688,6 +15688,15 @@ __metadata: languageName: node linkType: hard +"@types/readdir-glob@npm:*": + version: 1.1.0 + resolution: "@types/readdir-glob@npm:1.1.0" + dependencies: + "@types/node": "*" + checksum: 98cabfac6beddd3aeb3624e05d57b8dd1354431e436e9e795aaf74ddf2f1c23342d7b8df7586cc3d1374ceeee0d7975638fae97cb1739572d8a4067ebebb91d9 + languageName: node + linkType: hard + "@types/recharts@npm:^1.8.14, @types/recharts@npm:^1.8.15": version: 1.8.23 resolution: "@types/recharts@npm:1.8.23" From 4a44c97bfa133c4c8920b805ceb22badbc98e30f Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sun, 12 Mar 2023 05:17:32 +0000 Subject: [PATCH 039/177] chore(deps): update dependency aws-sdk-client-mock to v2.1.1 Signed-off-by: Renovate Bot --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index ee6c14da1c..78ceb0fba1 100644 --- a/yarn.lock +++ b/yarn.lock @@ -17574,13 +17574,13 @@ __metadata: linkType: hard "aws-sdk-client-mock@npm:^2.0.0": - version: 2.1.0 - resolution: "aws-sdk-client-mock@npm:2.1.0" + version: 2.1.1 + resolution: "aws-sdk-client-mock@npm:2.1.1" dependencies: "@types/sinon": ^10.0.10 sinon: ^14.0.2 tslib: ^2.1.0 - checksum: c6179c5528709ff1ad7e7308d03c74850fb5b973ca3d63836ca9973ca70de0c3dd7846fcbd3fd02bf4dabe6cae1095683b38c4202878458c8369e7e837962cd2 + checksum: 8330b88cdaeae401390ece094344ed727db0b007369d862a88afc0a29249828b95cce809faa0c2289c1af99528af0e765b4aba8156b948d01a12299390195cea languageName: node linkType: hard From c8ded0d4192d6d9f60f7ab32b3f4a0b5ebb76b8f Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sun, 12 Mar 2023 06:09:17 +0000 Subject: [PATCH 040/177] chore(deps): update dependency aws-sdk-client-mock-jest to v2.1.1 Signed-off-by: Renovate Bot --- yarn.lock | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/yarn.lock b/yarn.lock index 78ceb0fba1..d7597a4bfc 100644 --- a/yarn.lock +++ b/yarn.lock @@ -17562,14 +17562,14 @@ __metadata: linkType: hard "aws-sdk-client-mock-jest@npm:^2.0.0": - version: 2.1.0 - resolution: "aws-sdk-client-mock-jest@npm:2.1.0" + version: 2.1.1 + resolution: "aws-sdk-client-mock-jest@npm:2.1.1" dependencies: "@types/jest": ^28.1.3 tslib: ^2.1.0 peerDependencies: - aws-sdk-client-mock: 2.1.0 - checksum: 567e2084d71c90f71e5bfa82f2a4b592fec5ea818cb4edf3586f922454cee4fec1403d4161d3d91a3db3ccebe1db5babe069754d76204c7f6986ab71bafb1084 + aws-sdk-client-mock: 2.1.1 + checksum: 4b5ca96bbcaa60ea3ea947821c7ff1f073c1342a12ce5c778b70832bdcc6106e10591e98e09b22c5b0d83dfc6fe554e8a08d5df5cf067a7eaadb804087b891ed languageName: node linkType: hard From e262738b8a0cd43ce4cfea116adc05aef8c9061c Mon Sep 17 00:00:00 2001 From: Adi Krhan Date: Mon, 13 Mar 2023 09:23:59 +0100 Subject: [PATCH 041/177] Handle token difference in Microsoft provider Signed-off-by: Adi Krhan --- .changeset/many-carpets-act.md | 5 +++++ plugins/auth-backend/src/providers/microsoft/provider.ts | 9 ++++++++- 2 files changed, 13 insertions(+), 1 deletion(-) create mode 100644 .changeset/many-carpets-act.md diff --git a/.changeset/many-carpets-act.md b/.changeset/many-carpets-act.md new file mode 100644 index 0000000000..5285eeebbd --- /dev/null +++ b/.changeset/many-carpets-act.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-auth-backend': patch +--- + +Handle difference in expiration time between Microsoft session and Backstage session which caused the Backstage token to be invalid during a time frame. diff --git a/plugins/auth-backend/src/providers/microsoft/provider.ts b/plugins/auth-backend/src/providers/microsoft/provider.ts index fd2a1529a7..9b14a3c91b 100644 --- a/plugins/auth-backend/src/providers/microsoft/provider.ts +++ b/plugins/auth-backend/src/providers/microsoft/provider.ts @@ -50,6 +50,8 @@ import { import { Logger } from 'winston'; import fetch from 'node-fetch'; +const BACKSTAGE_SESSION_EXPIRATION = 3600; + type PrivateInfo = { refreshToken: string; }; @@ -145,12 +147,17 @@ export class MicrosoftAuthProvider implements OAuthHandlers { const { profile } = await this.authHandler(result, this.resolverContext); + const expiresInSeconds = + result.params.expires_in === undefined + ? BACKSTAGE_SESSION_EXPIRATION + : Math.min(result.params.expires_in, BACKSTAGE_SESSION_EXPIRATION); + const response: OAuthResponse = { providerInfo: { idToken: result.params.id_token, accessToken: result.accessToken, scope: result.params.scope, - expiresInSeconds: result.params.expires_in, + expiresInSeconds, }, profile, }; From c630360631f67ac7e05eef99f61391364d6635c1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20Adel=C3=B6w?= Date: Mon, 13 Mar 2023 13:36:06 +0100 Subject: [PATCH 042/177] catalog-client: getEntitiesByRefs should return undefined MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Fredrik Adelöw --- .changeset/tidy-ties-guess.md | 5 +++++ packages/catalog-client/src/CatalogClient.test.ts | 2 +- packages/catalog-client/src/CatalogClient.ts | 6 ++++-- 3 files changed, 10 insertions(+), 3 deletions(-) create mode 100644 .changeset/tidy-ties-guess.md diff --git a/.changeset/tidy-ties-guess.md b/.changeset/tidy-ties-guess.md new file mode 100644 index 0000000000..63247c3819 --- /dev/null +++ b/.changeset/tidy-ties-guess.md @@ -0,0 +1,5 @@ +--- +'@backstage/catalog-client': patch +--- + +Ensure that `getEntitiesByRefs` returns `undefined` instead of `null` for missing items diff --git a/packages/catalog-client/src/CatalogClient.test.ts b/packages/catalog-client/src/CatalogClient.test.ts index c235ff1592..53bb55b95f 100644 --- a/packages/catalog-client/src/CatalogClient.test.ts +++ b/packages/catalog-client/src/CatalogClient.test.ts @@ -249,7 +249,7 @@ describe('CatalogClient', () => { { token }, ); - expect(response).toEqual({ items: [entity, null] }); + expect(response).toEqual({ items: [entity, undefined] }); }); }); diff --git a/packages/catalog-client/src/CatalogClient.ts b/packages/catalog-client/src/CatalogClient.ts index 4984d394d4..be4ae6289d 100644 --- a/packages/catalog-client/src/CatalogClient.ts +++ b/packages/catalog-client/src/CatalogClient.ts @@ -199,9 +199,11 @@ export class CatalogClient implements CatalogApi { throw await ResponseError.fromResponse(response); } - const { items } = await response.json(); + const { items } = (await response.json()) as { + items: Array; + }; - return { items }; + return { items: items.map(i => i ?? undefined) }; } /** From 7af12854970a51f6f88fc9788b8557f4def54d39 Mon Sep 17 00:00:00 2001 From: Heikki Hellgren Date: Thu, 2 Mar 2023 14:22:31 +0200 Subject: [PATCH 043/177] feat: add scaffolder action to get multiple entities uses the catalog client getEntitiesByRefs to return the entities for the template Signed-off-by: Heikki Hellgren --- .changeset/sharp-hairs-arrive.md | 5 + plugins/scaffolder-backend/api-report.md | 3 +- .../actions/builtin/catalog/fetch.test.ts | 132 +++++++++++++++--- .../actions/builtin/catalog/fetch.ts | 85 ++++++++--- 4 files changed, 188 insertions(+), 37 deletions(-) create mode 100644 .changeset/sharp-hairs-arrive.md diff --git a/.changeset/sharp-hairs-arrive.md b/.changeset/sharp-hairs-arrive.md new file mode 100644 index 0000000000..a7f922566a --- /dev/null +++ b/.changeset/sharp-hairs-arrive.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-scaffolder-backend': patch +--- + +Extended scaffolder action `catalog:fetch` to fetch multiple catalog entities by entity references. diff --git a/plugins/scaffolder-backend/api-report.md b/plugins/scaffolder-backend/api-report.md index 293ff7ed29..3a409a39e2 100644 --- a/plugins/scaffolder-backend/api-report.md +++ b/plugins/scaffolder-backend/api-report.md @@ -85,7 +85,8 @@ export function createDebugLogAction(): TemplateAction_2<{ export function createFetchCatalogEntityAction(options: { catalogClient: CatalogApi; }): TemplateAction_2<{ - entityRef: string; + entityRef?: string | undefined; + entityRefs?: string[] | undefined; optional?: boolean | undefined; }>; diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/catalog/fetch.test.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/catalog/fetch.test.ts index 52c76c8769..1cce7d66cb 100644 --- a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/catalog/fetch.test.ts +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/catalog/fetch.test.ts @@ -23,8 +23,11 @@ import { createFetchCatalogEntityAction } from './fetch'; describe('catalog:fetch', () => { const getEntityByRef = jest.fn(); + const getEntitiesByRefs = jest.fn(); + const catalogClient = { getEntityByRef: getEntityByRef, + getEntitiesByRefs: getEntitiesByRefs, }; const action = createFetchCatalogEntityAction({ @@ -71,25 +74,6 @@ describe('catalog:fetch', () => { }); }); - it('should return null if entity not in catalog and optional is true', async () => { - getEntityByRef.mockImplementationOnce(() => { - throw new Error('Not found'); - }); - - await action.handler({ - ...mockContext, - input: { - entityRef: 'component:default/test', - optional: true, - }, - }); - - expect(getEntityByRef).toHaveBeenCalledWith('component:default/test', { - token: 'secret', - }); - expect(mockContext.output).toHaveBeenCalledWith('entity', null); - }); - it('should throw error if entity fetch fails from catalog and optional is false', async () => { getEntityByRef.mockImplementationOnce(() => { throw new Error('Not found'); @@ -127,4 +111,114 @@ describe('catalog:fetch', () => { }); expect(mockContext.output).not.toHaveBeenCalled(); }); + + it('should return entities from catalog', async () => { + getEntitiesByRefs.mockReturnValueOnce({ + items: [ + { + metadata: { + namespace: 'default', + name: 'test', + }, + kind: 'Component', + } as Entity, + ], + }); + + await action.handler({ + ...mockContext, + input: { + entityRefs: ['component:default/test'], + }, + }); + + expect(getEntitiesByRefs).toHaveBeenCalledWith( + { entityRefs: ['component:default/test'] }, + { + token: 'secret', + }, + ); + expect(mockContext.output).toHaveBeenCalledWith('entities', [ + { + metadata: { + namespace: 'default', + name: 'test', + }, + kind: 'Component', + }, + ]); + }); + + it('should throw error if undefined is returned for some entity', async () => { + getEntitiesByRefs.mockReturnValueOnce({ + items: [ + { + metadata: { + namespace: 'default', + name: 'test', + }, + kind: 'Component', + } as Entity, + undefined, + ], + }); + + await expect( + action.handler({ + ...mockContext, + input: { + entityRefs: ['component:default/test', 'component:default/test2'], + optional: false, + }, + }), + ).rejects.toThrow('Entity component:default/test2 not found'); + + expect(getEntitiesByRefs).toHaveBeenCalledWith( + { entityRefs: ['component:default/test', 'component:default/test2'] }, + { + token: 'secret', + }, + ); + expect(mockContext.output).not.toHaveBeenCalled(); + }); + + it('should return null in case some of the entities not found and optional is true', async () => { + getEntitiesByRefs.mockReturnValueOnce({ + items: [ + { + metadata: { + namespace: 'default', + name: 'test', + }, + kind: 'Component', + } as Entity, + undefined, + ], + }); + + await action.handler({ + ...mockContext, + input: { + entityRefs: ['component:default/test', 'component:default/test2'], + optional: true, + }, + }); + + expect(getEntitiesByRefs).toHaveBeenCalledWith( + { entityRefs: ['component:default/test', 'component:default/test2'] }, + { + token: 'secret', + }, + ); + expect(mockContext.output).toHaveBeenCalledWith('entities', [ + { + metadata: { + namespace: 'default', + name: 'test', + }, + kind: 'Component', + }, + null, + ]); + }); }); diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/catalog/fetch.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/catalog/fetch.ts index 17e510ce64..1bcbfa0006 100644 --- a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/catalog/fetch.ts +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/catalog/fetch.ts @@ -36,10 +36,26 @@ const examples = [ ], }), }, + { + description: 'Fetch multiple entities by referencse', + example: yaml.stringify({ + steps: [ + { + action: id, + id: 'fetchMultiple', + name: 'Fetch catalog entities', + input: { + entityRefs: ['component:default/name'], + }, + }, + ], + }), + }, ]; /** - * Returns entity from the catalog by entity reference. + * Returns entity or entities from the catalog by entity reference(s). + * * @public */ export function createFetchCatalogEntityAction(options: { @@ -47,13 +63,17 @@ export function createFetchCatalogEntityAction(options: { }) { const { catalogClient } = options; - return createTemplateAction<{ entityRef: string; optional?: boolean }>({ + return createTemplateAction<{ + entityRef?: string; + entityRefs?: string[]; + optional?: boolean; + }>({ id, - description: 'Returns entity from the catalog by entity reference', + description: + 'Returns entity or entities from the catalog by entity reference(s)', examples, schema: { input: { - required: ['entityRef'], type: 'object', properties: { entityRef: { @@ -61,10 +81,15 @@ export function createFetchCatalogEntityAction(options: { title: 'Entity reference', description: 'Entity reference of the entity to get', }, + entityRefs: { + type: 'array', + title: 'Entity references', + description: 'Entity references of the entities to get', + }, optional: { title: 'Optional', description: - 'Permit the entity to optionally exist. Default: false', + 'Allow the entity or entities to optionally exist. Default: false', type: 'boolean', }, }, @@ -76,29 +101,55 @@ export function createFetchCatalogEntityAction(options: { title: 'Entity found by the entity reference', type: 'object', description: - 'Object containing same values used in the Entity schema.', + 'Object containing same values used in the Entity schema. Only when used with `entityRef` parameter.', + }, + entities: { + title: 'Entities found by the entity references', + type: 'array', + items: { type: 'object' }, + description: + 'Array containing objects with same values used in the Entity schema. Only when used with `entityRefs` parameter.', }, }, }, }, async handler(ctx) { - const { entityRef, optional } = ctx.input; - let entity; - try { - entity = await catalogClient.getEntityByRef(entityRef, { + const { entityRef, entityRefs, optional } = ctx.input; + if (!entityRef && !entityRefs) { + if (optional) { + return; + } + throw new Error('Missing entity reference or references'); + } + + if (entityRef) { + const entity = await catalogClient.getEntityByRef(entityRef, { token: ctx.secrets?.backstageToken, }); - } catch (e) { - if (!optional) { - throw e; + + if (!entity && !optional) { + throw new Error(`Entity ${entityRef} not found`); } + ctx.output('entity', entity ?? null); } - if (!entity && !optional) { - throw new Error(`Entity ${entityRef} not found`); - } + if (entityRefs) { + const entities = await catalogClient.getEntitiesByRefs( + { entityRefs }, + { + token: ctx.secrets?.backstageToken, + }, + ); - ctx.output('entity', entity ?? null); + const finalEntities = entities.items.map((e, i) => { + if (!e && !optional) { + throw new Error(`Entity ${entityRefs[i]} not found`); + } + return e ?? null; + }); + + ctx.output('entities', finalEntities); + } }, }); } From e6ac8e69b5b779444817d32f6782aa93740193b1 Mon Sep 17 00:00:00 2001 From: Alec Jacobs Date: Mon, 13 Mar 2023 09:27:50 -0700 Subject: [PATCH 044/177] fix(shortcuts): client handles state updates from storageApi Signed-off-by: Alec Jacobs --- .../src/api/LocalStoredShortcuts.test.ts | 3 +- .../shortcuts/src/api/LocalStoredShortcuts.ts | 54 +++++++++++++------ 2 files changed, 41 insertions(+), 16 deletions(-) diff --git a/plugins/shortcuts/src/api/LocalStoredShortcuts.test.ts b/plugins/shortcuts/src/api/LocalStoredShortcuts.test.ts index dbea91863c..86890fc75b 100644 --- a/plugins/shortcuts/src/api/LocalStoredShortcuts.test.ts +++ b/plugins/shortcuts/src/api/LocalStoredShortcuts.test.ts @@ -36,8 +36,9 @@ describe('LocalStoredShortcuts', () => { resolve(); }, }); - shortcutApi.add(shortcut); }); + observerNextHandler.mockClear(); // handler is called with current state to start + await shortcutApi.add(shortcut); expect(observerNextHandler).toHaveBeenCalledTimes(1); expect(observerNextHandler).toHaveBeenCalledWith( diff --git a/plugins/shortcuts/src/api/LocalStoredShortcuts.ts b/plugins/shortcuts/src/api/LocalStoredShortcuts.ts index 65aeb86e3f..44f7364f69 100644 --- a/plugins/shortcuts/src/api/LocalStoredShortcuts.ts +++ b/plugins/shortcuts/src/api/LocalStoredShortcuts.ts @@ -16,10 +16,10 @@ import { pageTheme } from '@backstage/theme'; import { v4 as uuid } from 'uuid'; -import { ShortcutApi } from './ShortcutApi'; -import { Shortcut } from '../types'; -import { StorageApi } from '@backstage/core-plugin-api'; -import Observable from 'zen-observable'; +import { ShortcutApi, type Shortcut } from '@backstage/plugin-shortcuts'; +import type { StorageApi } from '@backstage/core-plugin-api'; +import type { Observable } from '@backstage/types'; +import ObservableImpl from 'zen-observable'; /** * Implementation of the ShortcutApi that uses the StorageApi to store shortcuts. @@ -27,27 +27,41 @@ import Observable from 'zen-observable'; * @public */ export class LocalStoredShortcuts implements ShortcutApi { - private readonly shortcuts: Observable; + private shortcuts: Shortcut[]; + private readonly subscribers = new Set< + ZenObservable.SubscriptionObserver + >(); + + private readonly observable = new ObservableImpl(subscriber => { + // forward the the latest value + subscriber.next(this.shortcuts); + + this.subscribers.add(subscriber); + return () => { + this.subscribers.delete(subscriber); + }; + }); constructor(private readonly storageApi: StorageApi) { - this.shortcuts = Observable.from( - this.storageApi.observe$('items'), - ).map(snapshot => snapshot.value ?? []); + this.shortcuts = this.storageApi.snapshot('items').value ?? []; + this.storageApi.observe$('items').subscribe({ + next: next => { + this.shortcuts = next.value ?? []; + this.notifyChanges(); + }, + }); } - shortcut$() { - return this.shortcuts; + shortcut$(): Observable { + return this.observable; } get() { - return Array.from( - this.storageApi.snapshot('items').value ?? [], - ).sort((a, b) => (a.title >= b.title ? 1 : -1)); + return this.shortcuts; } async add(shortcut: Omit) { - const shortcuts = this.get(); - shortcuts.push({ ...shortcut, id: uuid() }); + const shortcuts = this.sort([...this.get(), { ...shortcut, id: uuid() }]); await this.storageApi.set('items', shortcuts); } @@ -78,4 +92,14 @@ export class LocalStoredShortcuts implements ShortcutApi { catalog: 'home', docs: 'documentation', }; + + private sort(shortcuts: Shortcut[]): Shortcut[] { + return shortcuts.slice().sort((a, b) => (a.title >= b.title ? 1 : -1)); + } + + private notifyChanges() { + for (const subscription of this.subscribers) { + subscription.next(this.shortcuts); + } + } } From 7c38e565d1fba9bb68d93a856d69bafa0c3b1cd7 Mon Sep 17 00:00:00 2001 From: Alec Jacobs Date: Mon, 13 Mar 2023 09:34:20 -0700 Subject: [PATCH 045/177] docs(changeset): add patch changeset Signed-off-by: Alec Jacobs --- .changeset/pink-apples-design.md | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 .changeset/pink-apples-design.md diff --git a/.changeset/pink-apples-design.md b/.changeset/pink-apples-design.md new file mode 100644 index 0000000000..411786370a --- /dev/null +++ b/.changeset/pink-apples-design.md @@ -0,0 +1,7 @@ +--- +'@backstage/plugin-shortcuts': patch +--- + +Fixed bug in LocalStoredShortcuts client where adding new Shortcut results in replacing entire shortcut list. + +Refactored LocalStoredShortcuts client to listen to `storageApi` updates to ensure that local state is always up to date. From f538b9c5b83a67bf22b587e43d44071e9bfcb35f Mon Sep 17 00:00:00 2001 From: Miguel Alexandre Date: Mon, 13 Mar 2023 17:59:54 +0100 Subject: [PATCH 046/177] Include the failureMetadata and successMetadata in TechInsightsApi Signed-off-by: Miguel Alexandre --- .changeset/lazy-monkeys-worry.md | 5 ++++ plugins/tech-insights/src/api/types.ts | 37 ++++++++++++++++++++++++++ 2 files changed, 42 insertions(+) create mode 100644 .changeset/lazy-monkeys-worry.md diff --git a/.changeset/lazy-monkeys-worry.md b/.changeset/lazy-monkeys-worry.md new file mode 100644 index 0000000000..2c7e2ba4a2 --- /dev/null +++ b/.changeset/lazy-monkeys-worry.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-tech-insights': minor +--- + +The Check class now includes the failureMetadata and successMetadata as returned by the runChecks call. diff --git a/plugins/tech-insights/src/api/types.ts b/plugins/tech-insights/src/api/types.ts index ac1f2e44ee..aa073dcbc4 100644 --- a/plugins/tech-insights/src/api/types.ts +++ b/plugins/tech-insights/src/api/types.ts @@ -22,11 +22,48 @@ import { JsonValue } from '@backstage/types'; * @public */ export type Check = { + /** + * Unique identifier of the check + * + * Used to identify which checks to use when running checks. + */ id: string; + + /** + * Type identifier for the check. + * Can be used to determine storage options, logical routing to correct FactChecker implementation + * or to help frontend render correct component types based on this + */ type: string; + + /** + * Human readable name of the check, may be displayed in the UI + */ name: string; + + /** + * Human readable description of the check, may be displayed in the UI + */ description: string; + + /** + * A collection of string referencing fact rows that a check will be run against. + * + * References the fact container, aka fact retriever itself which may or may not contain multiple individual facts and values + */ factIds: string[]; + + /** + * Metadata to be returned in case a check has been successfully evaluated + * Can contain links, description texts or other actionable items + */ + successMetadata?: Record; + + /** + * Metadata to be returned in case a check evaluation has ended in failure + * Can contain links, description texts or other actionable items + */ + failureMetadata?: Record; }; /** From c5a57d15e29a53a796fbfc27ca018d673b62427e Mon Sep 17 00:00:00 2001 From: Alec Jacobs Date: Mon, 13 Mar 2023 10:28:38 -0700 Subject: [PATCH 047/177] docs(shortcuts): regen api-report.md Signed-off-by: Alec Jacobs --- plugins/shortcuts/api-report.md | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/plugins/shortcuts/api-report.md b/plugins/shortcuts/api-report.md index 1aa1dea003..19c0035a55 100644 --- a/plugins/shortcuts/api-report.md +++ b/plugins/shortcuts/api-report.md @@ -9,24 +9,25 @@ import { ApiRef } from '@backstage/core-plugin-api'; import { BackstagePlugin } from '@backstage/core-plugin-api'; import { IconComponent } from '@backstage/core-plugin-api'; import { Observable } from '@backstage/types'; -import { default as Observable_2 } from 'zen-observable'; -import { StorageApi } from '@backstage/core-plugin-api'; +import { Shortcut as Shortcut_2 } from '@backstage/plugin-shortcuts'; +import { ShortcutApi as ShortcutApi_2 } from '@backstage/plugin-shortcuts'; +import type { StorageApi } from '@backstage/core-plugin-api'; // @public -export class LocalStoredShortcuts implements ShortcutApi { +export class LocalStoredShortcuts implements ShortcutApi_2 { constructor(storageApi: StorageApi); // (undocumented) - add(shortcut: Omit): Promise; + add(shortcut: Omit): Promise; // (undocumented) - get(): Shortcut[]; + get(): Shortcut_2[]; // (undocumented) getColor(url: string): string; // (undocumented) remove(id: string): Promise; // (undocumented) - shortcut$(): Observable_2; + shortcut$(): Observable; // (undocumented) - update(shortcut: Shortcut): Promise; + update(shortcut: Shortcut_2): Promise; } // @public (undocumented) From 2d20ea246518fca3c5de9a517faa82ec422f5c05 Mon Sep 17 00:00:00 2001 From: Alec Jacobs Date: Mon, 13 Mar 2023 10:47:06 -0700 Subject: [PATCH 048/177] build(shortcuts): move @types/zen-observable to devDependencies Signed-off-by: Alec Jacobs --- plugins/shortcuts/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/shortcuts/package.json b/plugins/shortcuts/package.json index eb48088934..22c0456342 100644 --- a/plugins/shortcuts/package.json +++ b/plugins/shortcuts/package.json @@ -30,7 +30,6 @@ "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", "@material-ui/lab": "4.0.0-alpha.57", - "@types/zen-observable": "^0.8.2", "react-hook-form": "^7.12.2", "react-use": "^17.2.4", "uuid": "^8.3.2", @@ -49,6 +48,7 @@ "@testing-library/react": "^12.1.3", "@testing-library/user-event": "^14.0.0", "@types/node": "^16.11.26", + "@types/zen-observable": "^0.8.2", "cross-fetch": "^3.1.5", "msw": "^1.0.0" }, From c1ee073a82b5c7294a3f243ad86834c8c4518cb1 Mon Sep 17 00:00:00 2001 From: Andrew Thauer Date: Mon, 13 Mar 2023 16:06:08 -0400 Subject: [PATCH 049/177] feat: add lastModifiedAt to UrlReader methods Signed-off-by: Andrew Thauer --- .changeset/sharp-rings-cry.md | 6 ++ packages/backend-common/api-report.md | 2 + .../src/reading/AwsS3UrlReader.test.ts | 42 +++++++++- .../src/reading/AwsS3UrlReader.ts | 30 ++++---- .../src/reading/AzureUrlReader.ts | 1 + .../reading/BitbucketCloudUrlReader.test.ts | 77 +++++++++++++++++++ .../src/reading/BitbucketCloudUrlReader.ts | 10 ++- .../src/reading/BitbucketServerUrlReader.ts | 10 ++- .../src/reading/BitbucketUrlReader.test.ts | 77 +++++++++++++++++++ .../src/reading/BitbucketUrlReader.ts | 10 ++- .../src/reading/FetchUrlReader.test.ts | 25 +++++- .../src/reading/FetchUrlReader.ts | 7 ++ .../src/reading/GiteaUrlReader.test.ts | 48 +++++++++++- .../src/reading/GiteaUrlReader.ts | 4 + .../src/reading/GithubUrlReader.test.ts | 8 +- .../src/reading/GithubUrlReader.ts | 8 ++ .../src/reading/GitlabUrlReader.test.ts | 38 ++++++++- .../src/reading/GitlabUrlReader.ts | 10 ++- .../src/reading/ReadUrlResponseFactory.ts | 1 + .../src/reading/tree/ReadableArrayResponse.ts | 1 + .../reading/tree/TarArchiveResponse.test.ts | 5 ++ .../reading/tree/ZipArchiveResponse.test.ts | 5 ++ .../src/reading/tree/ZipArchiveResponse.ts | 3 + packages/backend-common/src/reading/types.ts | 7 ++ packages/backend-common/src/reading/util.ts | 23 ++++++ packages/backend-plugin-api/api-report.md | 4 + .../services/definitions/UrlReaderService.ts | 42 ++++++++++ 27 files changed, 477 insertions(+), 27 deletions(-) create mode 100644 .changeset/sharp-rings-cry.md create mode 100644 packages/backend-common/src/reading/util.ts diff --git a/.changeset/sharp-rings-cry.md b/.changeset/sharp-rings-cry.md new file mode 100644 index 0000000000..9e32a53526 --- /dev/null +++ b/.changeset/sharp-rings-cry.md @@ -0,0 +1,6 @@ +--- +'@backstage/backend-common': minor +'@backstage/backend-plugin-api': minor +--- + +Added `lastModifiedAt` field on `UrlReaderService` responses and a `lastModifiedAfter` option to `UrlReaderService.readUrl`. diff --git a/packages/backend-common/api-report.md b/packages/backend-common/api-report.md index ebdd7315c9..f1d8a74dbe 100644 --- a/packages/backend-common/api-report.md +++ b/packages/backend-common/api-report.md @@ -301,6 +301,7 @@ export class FetchUrlReader implements UrlReader { export type FromReadableArrayOptions = Array<{ data: Readable; path: string; + lastModifiedAt?: Date; }>; // @public @@ -635,6 +636,7 @@ export class ReadUrlResponseFactory { // @public export type ReadUrlResponseFactoryFromStreamOptions = { etag?: string; + lastModifiedAt?: Date; }; // @public diff --git a/packages/backend-common/src/reading/AwsS3UrlReader.test.ts b/packages/backend-common/src/reading/AwsS3UrlReader.test.ts index 0bd4d2636f..b37a052c1d 100644 --- a/packages/backend-common/src/reading/AwsS3UrlReader.test.ts +++ b/packages/backend-common/src/reading/AwsS3UrlReader.test.ts @@ -297,23 +297,26 @@ describe('AwsS3UrlReader', () => { ), ), ETag: '123abc', + LastModified: new Date('2020-01-01T00:00:00Z'), }); }); it('returns contents of an object in a bucket via buffer', async () => { - const { buffer, etag } = await reader.readUrl( + const { buffer, etag, lastModifiedAt } = await reader.readUrl( 'https://test-bucket.s3.us-east-2.amazonaws.com/awsS3-mock-object.yaml', ); expect(etag).toBe('123abc'); + expect(lastModifiedAt).toEqual(new Date('2020-01-01T00:00:00Z')); const response = await buffer(); expect(response.toString().trim()).toBe('site_name: Test'); }); it('returns contents of an object in a bucket via stream', async () => { - const { buffer, etag } = await reader.readUrl( + const { buffer, etag, lastModifiedAt } = await reader.readUrl( 'https://test-bucket.s3.us-east-2.amazonaws.com/awsS3-mock-object.yaml', ); expect(etag).toBe('123abc'); + expect(lastModifiedAt).toEqual(new Date('2020-01-01T00:00:00Z')); const response = await buffer(); expect(response.toString().trim()).toBe('site_name: Test'); }); @@ -403,6 +406,41 @@ describe('AwsS3UrlReader', () => { }); }); + describe('readUrl with lastModifiedAfter', () => { + const [{ reader }] = createReader({ + integrations: { + awsS3: [ + { + host: 'amazonaws.com', + accessKeyId: 'fake-access-key', + secretAccessKey: 'fake-secret-key', + }, + ], + }, + }); + + beforeEach(() => { + s3Client.reset(); + const t = new S3ServiceException({ + name: '304', + $fault: 'client', + $metadata: { httpStatusCode: 304 }, + }); + s3Client.on(GetObjectCommand).rejects(t); + }); + + it('returns contents of an object in a bucket', async () => { + await expect( + reader.readUrl!( + 'https://test-bucket.s3.us-east-2.amazonaws.com/awsS3-mock-object.yaml', + { + lastModifiedAfter: new Date('2020-01-01T00:00:00Z'), + }, + ), + ).rejects.toThrow(NotModifiedError); + }); + }); + describe('readTree', () => { let awsS3UrlReader: AwsS3UrlReader; diff --git a/packages/backend-common/src/reading/AwsS3UrlReader.ts b/packages/backend-common/src/reading/AwsS3UrlReader.ts index d06e2d0ad6..4d4c28071f 100644 --- a/packages/backend-common/src/reading/AwsS3UrlReader.ts +++ b/packages/backend-common/src/reading/AwsS3UrlReader.ts @@ -41,6 +41,7 @@ import { ListObjectsV2Command, ListObjectsV2CommandOutput, GetObjectCommand, + GetObjectCommandInput, } from '@aws-sdk/client-s3'; import { AbortController } from '@aws-sdk/abort-controller'; import { ReadUrlResponseFactory } from './ReadUrlResponseFactory'; @@ -253,6 +254,8 @@ export class AwsS3UrlReader implements UrlReader { url: string, options?: ReadUrlOptions, ): Promise { + const { etag, lastModifiedAfter } = options ?? {}; + try { const { path, bucket, region } = parseUrl(url, this.integration.config); const s3Client = await this.buildS3Client( @@ -262,19 +265,15 @@ export class AwsS3UrlReader implements UrlReader { ); const abortController = new AbortController(); - let params; - if (options?.etag) { - params = { - Bucket: bucket, - Key: path, - IfNoneMatch: options.etag, - }; - } else { - params = { - Bucket: bucket, - Key: path, - }; - } + const params: GetObjectCommandInput = { + Bucket: bucket, + Key: path, + ...(etag && { IfNoneMatch: etag }), + ...(lastModifiedAfter && { + IfModifiedSince: lastModifiedAfter, + }), + }; + options?.signal?.addEventListener('abort', () => abortController.abort()); const getObjectCommand = new GetObjectCommand(params); const response = await s3Client.send(getObjectCommand, { @@ -284,10 +283,10 @@ export class AwsS3UrlReader implements UrlReader { const s3ObjectData = await this.retrieveS3ObjectData( response.Body as Readable, ); - const etag = response.ETag; return ReadUrlResponseFactory.fromReadable(s3ObjectData, { - etag: etag, + etag: response.ETag, + lastModifiedAt: response.LastModified, }); } catch (e) { if (e.$metadata && e.$metadata.httpStatusCode === 304) { @@ -347,6 +346,7 @@ export class AwsS3UrlReader implements UrlReader { responses.push({ data: s3ObjectData, path: String(allObjects[i]), + lastModifiedAt: response?.LastModified ?? undefined, }); } diff --git a/packages/backend-common/src/reading/AzureUrlReader.ts b/packages/backend-common/src/reading/AzureUrlReader.ts index 08e3917b38..90cf8f29bd 100644 --- a/packages/backend-common/src/reading/AzureUrlReader.ts +++ b/packages/backend-common/src/reading/AzureUrlReader.ts @@ -192,6 +192,7 @@ export class AzureUrlReader implements UrlReader { base: url, }), content: file.content, + lastModifiedAt: file.lastModifiedAt, })), }; } diff --git a/packages/backend-common/src/reading/BitbucketCloudUrlReader.test.ts b/packages/backend-common/src/reading/BitbucketCloudUrlReader.test.ts index ca6e15a005..c00aeba124 100644 --- a/packages/backend-common/src/reading/BitbucketCloudUrlReader.test.ts +++ b/packages/backend-common/src/reading/BitbucketCloudUrlReader.test.ts @@ -156,6 +156,83 @@ describe('BitbucketCloudUrlReader', () => { expect(buffer.toString()).toBe('foo'); expect(result.etag).toBe('new-etag-value'); }); + + it('should be able to readUrl via buffer without If-Modified-Since', async () => { + worker.use( + rest.get( + 'https://api.bitbucket.org/2.0/repositories/backstage-verification/test-template/src/master/template.yaml', + (req, res, ctx) => { + expect(req.headers.get('If-None-Match')).toBeNull(); + return res( + ctx.status(200), + ctx.body('foo'), + ctx.set('ETag', 'etag-value'), + ctx.set( + 'Last-Modified', + new Date('2020-01-01T00:00:00Z').toUTCString(), + ), + ); + }, + ), + ); + + const result = await reader.readUrl( + 'https://bitbucket.org/backstage-verification/test-template/src/master/template.yaml', + ); + const buffer = await result.buffer(); + expect(result.lastModifiedAt).toEqual(new Date('2020-01-01T00:00:00Z')); + expect(buffer.toString()).toBe('foo'); + }); + + it('should be throw not modified when If-Modified-Since returns a 304', async () => { + worker.use( + rest.get( + 'https://api.bitbucket.org/2.0/repositories/backstage-verification/test-template/src/master/template.yaml', + (req, res, ctx) => { + expect(req.headers.get('If-Modified-Since')).toBe( + new Date('1999 12 31 23:59:59 GMT').toUTCString(), + ); + return res(ctx.status(304)); + }, + ), + ); + + await expect( + reader.readUrl( + 'https://bitbucket.org/backstage-verification/test-template/src/master/template.yaml', + { lastModifiedAfter: new Date('1999 12 31 23:59:59 GMT') }, + ), + ).rejects.toThrow(NotModifiedError); + }); + + it('should be able to readUrl when If-Modified-Since is before Last-Modified', async () => { + worker.use( + rest.get( + 'https://api.bitbucket.org/2.0/repositories/backstage-verification/test-template/src/master/template.yaml', + (req, res, ctx) => { + expect(req.headers.get('If-Modified-Since')).toBe( + new Date('1999 12 31 23:59:59 GMT').toUTCString(), + ); + return res( + ctx.status(200), + ctx.set( + 'Last-Modified', + new Date('2020-01-01T00:00:00Z').toUTCString(), + ), + ctx.body('foo'), + ); + }, + ), + ); + + const result = await reader.readUrl( + 'https://bitbucket.org/backstage-verification/test-template/src/master/template.yaml', + { lastModifiedAfter: new Date('1999 12 31 23:59:59 GMT') }, + ); + const buffer = await result.buffer(); + expect(buffer.toString()).toBe('foo'); + expect(result.lastModifiedAt).toEqual(new Date('2020-01-01T00:00:00Z')); + }); }); describe('read', () => { diff --git a/packages/backend-common/src/reading/BitbucketCloudUrlReader.ts b/packages/backend-common/src/reading/BitbucketCloudUrlReader.ts index b83e012423..1522b7678d 100644 --- a/packages/backend-common/src/reading/BitbucketCloudUrlReader.ts +++ b/packages/backend-common/src/reading/BitbucketCloudUrlReader.ts @@ -40,6 +40,7 @@ import { UrlReader, } from './types'; import { ReadUrlResponseFactory } from './ReadUrlResponseFactory'; +import { parseLastModified } from './util'; /** * Implements a {@link @backstage/backend-plugin-api#UrlReaderService} for files from Bitbucket Cloud. @@ -80,7 +81,7 @@ export class BitbucketCloudUrlReader implements UrlReader { url: string, options?: ReadUrlOptions, ): Promise { - const { etag, signal } = options ?? {}; + const { etag, lastModifiedAfter, signal } = options ?? {}; const bitbucketUrl = getBitbucketCloudFileFetchUrl( url, this.integration.config, @@ -95,6 +96,9 @@ export class BitbucketCloudUrlReader implements UrlReader { headers: { ...requestOptions.headers, ...(etag && { 'If-None-Match': etag }), + ...(lastModifiedAfter && { + 'If-Modified-Since': lastModifiedAfter.toUTCString(), + }), }, // TODO(freben): The signal cast is there because pre-3.x versions of // node-fetch have a very slightly deviating AbortSignal type signature. @@ -115,6 +119,9 @@ export class BitbucketCloudUrlReader implements UrlReader { if (response.ok) { return ReadUrlResponseFactory.fromNodeJSReadable(response.body, { etag: response.headers.get('ETag') ?? undefined, + lastModifiedAt: parseLastModified( + response.headers.get('Last-Modified'), + ), }); } @@ -184,6 +191,7 @@ export class BitbucketCloudUrlReader implements UrlReader { base: url, }), content: file.content, + lastModifiedAt: file.lastModifiedAt, })), }; } diff --git a/packages/backend-common/src/reading/BitbucketServerUrlReader.ts b/packages/backend-common/src/reading/BitbucketServerUrlReader.ts index a97c3b39bb..2b6b5a1f8f 100644 --- a/packages/backend-common/src/reading/BitbucketServerUrlReader.ts +++ b/packages/backend-common/src/reading/BitbucketServerUrlReader.ts @@ -39,6 +39,7 @@ import { UrlReader, } from './types'; import { ReadUrlResponseFactory } from './ReadUrlResponseFactory'; +import { parseLastModified } from './util'; /** * Implements a {@link @backstage/backend-plugin-api#UrlReaderService} for files from Bitbucket Server APIs. @@ -71,7 +72,7 @@ export class BitbucketServerUrlReader implements UrlReader { url: string, options?: ReadUrlOptions, ): Promise { - const { etag, signal } = options ?? {}; + const { etag, lastModifiedAfter, signal } = options ?? {}; const bitbucketUrl = getBitbucketServerFileFetchUrl( url, this.integration.config, @@ -86,6 +87,9 @@ export class BitbucketServerUrlReader implements UrlReader { headers: { ...requestOptions.headers, ...(etag && { 'If-None-Match': etag }), + ...(lastModifiedAfter && { + 'If-Modified-Since': lastModifiedAfter.toUTCString(), + }), }, // TODO(freben): The signal cast is there because pre-3.x versions of // node-fetch have a very slightly deviating AbortSignal type signature. @@ -106,6 +110,9 @@ export class BitbucketServerUrlReader implements UrlReader { if (response.ok) { return ReadUrlResponseFactory.fromNodeJSReadable(response.body, { etag: response.headers.get('ETag') ?? undefined, + lastModifiedAt: parseLastModified( + response.headers.get('Last-Modified'), + ), }); } @@ -175,6 +182,7 @@ export class BitbucketServerUrlReader implements UrlReader { base: url, }), content: file.content, + lastModifiedAt: file.lastModifiedAt, })), }; } diff --git a/packages/backend-common/src/reading/BitbucketUrlReader.test.ts b/packages/backend-common/src/reading/BitbucketUrlReader.test.ts index 922480f8e7..15e007d516 100644 --- a/packages/backend-common/src/reading/BitbucketUrlReader.test.ts +++ b/packages/backend-common/src/reading/BitbucketUrlReader.test.ts @@ -204,6 +204,83 @@ describe('BitbucketUrlReader', () => { expect(buffer.toString()).toBe('foo'); expect(result.etag).toBe('new-etag-value'); }); + + it('should be able to readUrl via buffer without If-Modified-Since', async () => { + worker.use( + rest.get( + 'https://api.bitbucket.org/2.0/repositories/backstage-verification/test-template/src/master/template.yaml', + (req, res, ctx) => { + expect(req.headers.get('If-None-Match')).toBeNull(); + return res( + ctx.status(200), + ctx.body('foo'), + ctx.set('ETag', 'etag-value'), + ctx.set( + 'Last-Modified', + new Date('2020-01-01T00:00:00Z').toUTCString(), + ), + ); + }, + ), + ); + + const result = await bitbucketProcessor.readUrl( + 'https://bitbucket.org/backstage-verification/test-template/src/master/template.yaml', + ); + const buffer = await result.buffer(); + expect(result.lastModifiedAt).toEqual(new Date('2020-01-01T00:00:00Z')); + expect(buffer.toString()).toBe('foo'); + }); + + it('should be throw not modified when If-Modified-Since returns a 304', async () => { + worker.use( + rest.get( + 'https://api.bitbucket.org/2.0/repositories/backstage-verification/test-template/src/master/template.yaml', + (req, res, ctx) => { + expect(req.headers.get('If-Modified-Since')).toBe( + new Date('1999 12 31 23:59:59 GMT').toUTCString(), + ); + return res(ctx.status(304)); + }, + ), + ); + + await expect( + bitbucketProcessor.readUrl( + 'https://bitbucket.org/backstage-verification/test-template/src/master/template.yaml', + { lastModifiedAfter: new Date('1999 12 31 23:59:59 GMT') }, + ), + ).rejects.toThrow(NotModifiedError); + }); + + it('should be able to readUrl when If-Modified-Since is before Last-Modified', async () => { + worker.use( + rest.get( + 'https://api.bitbucket.org/2.0/repositories/backstage-verification/test-template/src/master/template.yaml', + (req, res, ctx) => { + expect(req.headers.get('If-Modified-Since')).toBe( + new Date('1999 12 31 23:59:59 GMT').toUTCString(), + ); + return res( + ctx.status(200), + ctx.set( + 'Last-Modified', + new Date('2020-01-01T00:00:00Z').toUTCString(), + ), + ctx.body('foo'), + ); + }, + ), + ); + + const result = await bitbucketProcessor.readUrl( + 'https://bitbucket.org/backstage-verification/test-template/src/master/template.yaml', + { lastModifiedAfter: new Date('1999 12 31 23:59:59 GMT') }, + ); + const buffer = await result.buffer(); + expect(buffer.toString()).toBe('foo'); + expect(result.lastModifiedAt).toEqual(new Date('2020-01-01T00:00:00Z')); + }); }); describe('read', () => { diff --git a/packages/backend-common/src/reading/BitbucketUrlReader.ts b/packages/backend-common/src/reading/BitbucketUrlReader.ts index 01539594dd..3a34c725c6 100644 --- a/packages/backend-common/src/reading/BitbucketUrlReader.ts +++ b/packages/backend-common/src/reading/BitbucketUrlReader.ts @@ -41,6 +41,7 @@ import { UrlReader, } from './types'; import { ReadUrlResponseFactory } from './ReadUrlResponseFactory'; +import { parseLastModified } from './util'; /** * Implements a {@link @backstage/backend-plugin-api#UrlReaderService} for files from Bitbucket v1 and v2 APIs, such @@ -96,7 +97,7 @@ export class BitbucketUrlReader implements UrlReader { url: string, options?: ReadUrlOptions, ): Promise { - const { etag, signal } = options ?? {}; + const { etag, lastModifiedAfter, signal } = options ?? {}; const bitbucketUrl = getBitbucketFileFetchUrl(url, this.integration.config); const requestOptions = getBitbucketRequestOptions(this.integration.config); @@ -106,6 +107,9 @@ export class BitbucketUrlReader implements UrlReader { headers: { ...requestOptions.headers, ...(etag && { 'If-None-Match': etag }), + ...(lastModifiedAfter && { + 'If-Modified-Since': lastModifiedAfter.toUTCString(), + }), }, // TODO(freben): The signal cast is there because pre-3.x versions of // node-fetch have a very slightly deviating AbortSignal type signature. @@ -126,6 +130,9 @@ export class BitbucketUrlReader implements UrlReader { if (response.ok) { return ReadUrlResponseFactory.fromNodeJSReadable(response.body, { etag: response.headers.get('ETag') ?? undefined, + lastModifiedAt: parseLastModified( + response.headers.get('Last-Modified'), + ), }); } @@ -195,6 +202,7 @@ export class BitbucketUrlReader implements UrlReader { base: url, }), content: file.content, + lastModifiedAt: file.lastModifiedAt, })), }; } diff --git a/packages/backend-common/src/reading/FetchUrlReader.test.ts b/packages/backend-common/src/reading/FetchUrlReader.test.ts index e45117a106..ad834c64ef 100644 --- a/packages/backend-common/src/reading/FetchUrlReader.test.ts +++ b/packages/backend-common/src/reading/FetchUrlReader.test.ts @@ -45,6 +45,21 @@ describe('FetchUrlReader', () => { ); } + if ( + req.headers.get('if-modified-since') && + new Date(req.headers.get('if-modified-since') ?? '') < + new Date('2021-01-01T00:00:00Z') + ) { + return res( + ctx.status(304), + ctx.set('Content-Type', 'text/plain'), + ctx.set( + 'last-modified', + new Date('2021-01-01T00:00:00Z').toUTCString(), + ), + ); + } + return res( ctx.status(200), ctx.set('Content-Type', 'text/plain'), @@ -192,7 +207,7 @@ describe('FetchUrlReader', () => { }); describe('readUrl', () => { - it('should throw NotModified if server responds with 304', async () => { + it('should throw NotModified if server responds with 304 from etag', async () => { await expect( fetchUrlReader.readUrl('https://backstage.io/some-resource', { etag: 'foo', @@ -200,6 +215,14 @@ describe('FetchUrlReader', () => { ).rejects.toThrow(NotModifiedError); }); + it('should throw NotModified if server responds with 304 from lastModifiedAfter', async () => { + await expect( + fetchUrlReader.readUrl('https://backstage.io/some-resource', { + lastModifiedAfter: new Date('2020-01-01T00:00:00Z'), + }), + ).rejects.toThrow(NotModifiedError); + }); + it('should return etag from the response', async () => { const response = await fetchUrlReader.readUrl( 'https://backstage.io/some-resource', diff --git a/packages/backend-common/src/reading/FetchUrlReader.ts b/packages/backend-common/src/reading/FetchUrlReader.ts index 20b78d63c3..90c1cf6c26 100644 --- a/packages/backend-common/src/reading/FetchUrlReader.ts +++ b/packages/backend-common/src/reading/FetchUrlReader.ts @@ -26,6 +26,7 @@ import { } from './types'; import path from 'path'; import { ReadUrlResponseFactory } from './ReadUrlResponseFactory'; +import { parseLastModified } from './util'; const isInRange = (num: number, [start, end]: [number, number]) => { return num >= start && num <= end; @@ -127,6 +128,9 @@ export class FetchUrlReader implements UrlReader { response = await fetch(url, { headers: { ...(options?.etag && { 'If-None-Match': options.etag }), + ...(options?.lastModifiedAfter && { + 'If-Modified-Since': options.lastModifiedAfter.toUTCString(), + }), }, // TODO(freben): The signal cast is there because pre-3.x versions of // node-fetch have a very slightly deviating AbortSignal type signature. @@ -147,6 +151,9 @@ export class FetchUrlReader implements UrlReader { if (response.ok) { return ReadUrlResponseFactory.fromNodeJSReadable(response.body, { etag: response.headers.get('ETag') ?? undefined, + lastModifiedAt: parseLastModified( + response.headers.get('Last-Modified'), + ), }); } diff --git a/packages/backend-common/src/reading/GiteaUrlReader.test.ts b/packages/backend-common/src/reading/GiteaUrlReader.test.ts index 6c8722d2e5..1860d9f461 100644 --- a/packages/backend-common/src/reading/GiteaUrlReader.test.ts +++ b/packages/backend-common/src/reading/GiteaUrlReader.test.ts @@ -25,7 +25,7 @@ import { UrlReaderPredicateTuple } from './types'; import { DefaultReadTreeResponseFactory } from './tree'; import getRawBody from 'raw-body'; import { GiteaUrlReader } from './GiteaUrlReader'; -import { NotFoundError } from '@backstage/errors'; +import { NotFoundError, NotModifiedError } from '@backstage/errors'; const treeResponseFactory = DefaultReadTreeResponseFactory.create({ config: new ConfigReader({}), @@ -200,5 +200,51 @@ describe('GiteaUrlReader', () => { 'https://gitea.com/owner/project/src/branch/branch2/LICENSE could not be read as https://gitea.com/api/v1/repos/owner/project/contents/LICENSE?ref=branch2, 500 Error!!!', ); }); + + it('should throw NotModified if server responds with 304 from etag', async () => { + worker.use( + rest.get( + 'https://gitea.com/api/v1/repos/owner/project/contents/LICENSE', + (_, res, ctx) => { + return res(ctx.set('ETag', 'foo'), ctx.status(304, 'Error!!!')); + }, + ), + ); + + await expect( + giteaProcessor.readUrl( + 'https://gitea.com/owner/project/src/branch/branch2/LICENSE', + { + etag: 'foo', + }, + ), + ).rejects.toThrow(NotModifiedError); + }); + + it('should throw NotModified if server responds with 304 from lastModifiedAfter', async () => { + worker.use( + rest.get( + 'https://gitea.com/api/v1/repos/owner/project/contents/LICENSE', + (_, res, ctx) => { + return res( + ctx.set( + 'Last-Modified', + new Date('2020-01-01T00:00:00Z').toUTCString(), + ), + ctx.status(304, 'Error!!!'), + ); + }, + ), + ); + + await expect( + giteaProcessor.readUrl( + 'https://gitea.com/owner/project/src/branch/branch2/LICENSE', + { + lastModifiedAfter: new Date('2020-01-01T00:00:00Z'), + }, + ), + ).rejects.toThrow(NotModifiedError); + }); }); }); diff --git a/packages/backend-common/src/reading/GiteaUrlReader.ts b/packages/backend-common/src/reading/GiteaUrlReader.ts index 1471bab608..34542e878e 100644 --- a/packages/backend-common/src/reading/GiteaUrlReader.ts +++ b/packages/backend-common/src/reading/GiteaUrlReader.ts @@ -34,6 +34,7 @@ import { NotModifiedError, } from '@backstage/errors'; import { Readable } from 'stream'; +import { parseLastModified } from './util'; /** * Implements a {@link @backstage/backend-plugin-api#UrlReaderService} for the Gitea v1 api. @@ -86,6 +87,9 @@ export class GiteaUrlReader implements UrlReader { Readable.from(Buffer.from(content, 'base64')), { etag: response.headers.get('ETag') ?? undefined, + lastModifiedAt: parseLastModified( + response.headers.get('Last-Modified'), + ), }, ); } diff --git a/packages/backend-common/src/reading/GithubUrlReader.test.ts b/packages/backend-common/src/reading/GithubUrlReader.test.ts index 2315d1f9e8..1ee25920f2 100644 --- a/packages/backend-common/src/reading/GithubUrlReader.test.ts +++ b/packages/backend-common/src/reading/GithubUrlReader.test.ts @@ -247,7 +247,7 @@ describe('GithubUrlReader', () => { ).rejects.toThrow(/rate limit exceeded/); }); - it('should return etag from the response', async () => { + it('should return etag and last-modified from the response', async () => { (mockCredentialsProvider.getCredentials as jest.Mock).mockResolvedValue({ headers: { Authorization: 'bearer blah', @@ -261,6 +261,11 @@ describe('GithubUrlReader', () => { return res( ctx.status(200), ctx.set('Etag', 'foo'), + ctx.set( + 'Last-Modified', + new Date('2021-01-01T00:00:00Z').toUTCString(), + ), + ctx.body('bar'), ); }, @@ -271,6 +276,7 @@ describe('GithubUrlReader', () => { 'https://github.com/backstage/mock/tree/blob/main', ); expect(response.etag).toBe('foo'); + expect(response.lastModifiedAt).toEqual(new Date('2021-01-01T00:00:00Z')); }); }); diff --git a/packages/backend-common/src/reading/GithubUrlReader.ts b/packages/backend-common/src/reading/GithubUrlReader.ts index d91c35621d..ee781daf0b 100644 --- a/packages/backend-common/src/reading/GithubUrlReader.ts +++ b/packages/backend-common/src/reading/GithubUrlReader.ts @@ -40,6 +40,7 @@ import { ReadUrlResponse, } from './types'; import { ReadUrlResponseFactory } from './ReadUrlResponseFactory'; +import { parseLastModified } from './util'; export type GhRepoResponse = RestEndpointMethodTypes['repos']['get']['response']['data']; @@ -109,6 +110,9 @@ export class GithubUrlReader implements UrlReader { headers: { ...credentials?.headers, ...(options?.etag && { 'If-None-Match': options.etag }), + ...(options?.lastModifiedAfter && { + 'If-Modified-Since': options.lastModifiedAfter.toUTCString(), + }), Accept: 'application/vnd.github.v3.raw', }, // TODO(freben): The signal cast is there because pre-3.x versions of @@ -130,6 +134,9 @@ export class GithubUrlReader implements UrlReader { if (response.ok) { return ReadUrlResponseFactory.fromNodeJSReadable(response.body, { etag: response.headers.get('ETag') ?? undefined, + lastModifiedAt: parseLastModified( + response.headers.get('Last-Modified'), + ), }); } @@ -290,6 +297,7 @@ export class GithubUrlReader implements UrlReader { return files.map(file => ({ url: pathToUrl(file.path), content: file.content, + lastModifiedAt: file.lastModifiedAt, })); } diff --git a/packages/backend-common/src/reading/GitlabUrlReader.test.ts b/packages/backend-common/src/reading/GitlabUrlReader.test.ts index 3751ee868e..d926b2be9b 100644 --- a/packages/backend-common/src/reading/GitlabUrlReader.test.ts +++ b/packages/backend-common/src/reading/GitlabUrlReader.test.ts @@ -184,7 +184,7 @@ describe('GitlabUrlReader', () => { treeResponseFactory, }); - it('should throw NotModified on HTTP 304', async () => { + it('should throw NotModified on HTTP 304 from etag', async () => { worker.use( rest.get('*/api/v4/projects/:name', (_, res, ctx) => res(ctx.status(200), ctx.json({ id: 12345 })), @@ -205,13 +205,44 @@ describe('GitlabUrlReader', () => { ).rejects.toThrow(NotModifiedError); }); - it('should return etag in response', async () => { + it('should throw NotModified on HTTP 304 from lastModifiedAt', async () => { + worker.use( + rest.get('*/api/v4/projects/:name', (_, res, ctx) => + res(ctx.status(200), ctx.json({ id: 12345 })), + ), + rest.get('*', (req, res, ctx) => { + expect(req.headers.get('If-Modified-Since')).toBe( + new Date('2019 12 31 23:59:59 GMT').toUTCString(), + ); + return res(ctx.status(304)); + }), + ); + + await expect( + reader.readUrl!( + 'https://gitlab.com/groupA/teams/teamA/subgroupA/repoA/-/blob/branch/my/path/to/file.yaml', + { + lastModifiedAfter: new Date('2019 12 31 23:59:59 GMT'), + }, + ), + ).rejects.toThrow(NotModifiedError); + }); + + it('should return etag and last-modified in response', async () => { worker.use( rest.get('*/api/v4/projects/:name', (_, res, ctx) => res(ctx.status(200), ctx.json({ id: 12345 })), ), rest.get('*', (_req, res, ctx) => { - return res(ctx.status(200), ctx.set('ETag', '999'), ctx.body('foo')); + return res( + ctx.status(200), + ctx.set('ETag', '999'), + ctx.set( + 'Last-Modified', + new Date('2020 01 01 00:0:00 GMT').toUTCString(), + ), + ctx.body('foo'), + ); }), ); @@ -219,6 +250,7 @@ describe('GitlabUrlReader', () => { 'https://gitlab.com/groupA/teams/teamA/subgroupA/repoA/-/blob/branch/my/path/to/file.yaml', ); expect(result.etag).toBe('999'); + expect(result.lastModifiedAt).toEqual(new Date('2020 01 01 00:0:00 GMT')); const content = await result.buffer(); expect(content.toString()).toBe('foo'); }); diff --git a/packages/backend-common/src/reading/GitlabUrlReader.ts b/packages/backend-common/src/reading/GitlabUrlReader.ts index bebc7453d0..df8441c1f7 100644 --- a/packages/backend-common/src/reading/GitlabUrlReader.ts +++ b/packages/backend-common/src/reading/GitlabUrlReader.ts @@ -40,6 +40,7 @@ import { } from './types'; import { trimEnd, trimStart } from 'lodash'; import { ReadUrlResponseFactory } from './ReadUrlResponseFactory'; +import { parseLastModified } from './util'; /** * Implements a {@link @backstage/backend-plugin-api#UrlReaderService} for files on GitLab. @@ -72,7 +73,7 @@ export class GitlabUrlReader implements UrlReader { url: string, options?: ReadUrlOptions, ): Promise { - const { etag, signal } = options ?? {}; + const { etag, lastModifiedAfter, signal } = options ?? {}; const builtUrl = await this.getGitlabFetchUrl(url); let response: Response; @@ -81,6 +82,9 @@ export class GitlabUrlReader implements UrlReader { headers: { ...getGitLabRequestOptions(this.integration.config).headers, ...(etag && { 'If-None-Match': etag }), + ...(lastModifiedAfter && { + 'If-Modified-Since': lastModifiedAfter.toUTCString(), + }), }, // TODO(freben): The signal cast is there because pre-3.x versions of // node-fetch have a very slightly deviating AbortSignal type signature. @@ -101,6 +105,9 @@ export class GitlabUrlReader implements UrlReader { if (response.ok) { return ReadUrlResponseFactory.fromNodeJSReadable(response.body, { etag: response.headers.get('ETag') ?? undefined, + lastModifiedAt: parseLastModified( + response.headers.get('Last-Modified'), + ), }); } @@ -247,6 +254,7 @@ export class GitlabUrlReader implements UrlReader { files: files.map(file => ({ url: this.integration.resolveUrl({ url: `/${file.path}`, base: url }), content: file.content, + lastModifiedAt: file.lastModifiedAt, })), }; } diff --git a/packages/backend-common/src/reading/ReadUrlResponseFactory.ts b/packages/backend-common/src/reading/ReadUrlResponseFactory.ts index 91d1939c24..69b9c6c16a 100644 --- a/packages/backend-common/src/reading/ReadUrlResponseFactory.ts +++ b/packages/backend-common/src/reading/ReadUrlResponseFactory.ts @@ -61,6 +61,7 @@ export class ReadUrlResponseFactory { return stream; }, etag: options?.etag, + lastModifiedAt: options?.lastModifiedAt, }; } diff --git a/packages/backend-common/src/reading/tree/ReadableArrayResponse.ts b/packages/backend-common/src/reading/tree/ReadableArrayResponse.ts index eabaa3bc56..1429931142 100644 --- a/packages/backend-common/src/reading/tree/ReadableArrayResponse.ts +++ b/packages/backend-common/src/reading/tree/ReadableArrayResponse.ts @@ -63,6 +63,7 @@ export class ReadableArrayResponse implements ReadTreeResponse { files.push({ path: this.stream[i].path, content: () => getRawBody(this.stream[i].data), + lastModifiedAt: this.stream[i]?.lastModifiedAt, }); } } diff --git a/packages/backend-common/src/reading/tree/TarArchiveResponse.test.ts b/packages/backend-common/src/reading/tree/TarArchiveResponse.test.ts index f0cbc6a612..1765a41156 100644 --- a/packages/backend-common/src/reading/tree/TarArchiveResponse.test.ts +++ b/packages/backend-common/src/reading/tree/TarArchiveResponse.test.ts @@ -45,10 +45,12 @@ describe('TarArchiveResponse', () => { { path: 'mkdocs.yml', content: expect.any(Function), + lastModifiedAt: undefined, }, { path: 'docs/index.md', content: expect.any(Function), + lastModifiedAt: undefined, }, ]); const contents = await Promise.all(files.map(f => f.content())); @@ -70,6 +72,7 @@ describe('TarArchiveResponse', () => { { path: 'mkdocs.yml', content: expect.any(Function), + lastModifiedAt: undefined, }, ]); const content = await files[0].content(); @@ -93,10 +96,12 @@ describe('TarArchiveResponse', () => { { path: 'mkdocs.yml', content: expect.any(Function), + lastModifiedAt: undefined, }, { path: 'docs/index.md', content: expect.any(Function), + lastModifiedAt: undefined, }, ]); const contents = await Promise.all(files.map(f => f.content())); diff --git a/packages/backend-common/src/reading/tree/ZipArchiveResponse.test.ts b/packages/backend-common/src/reading/tree/ZipArchiveResponse.test.ts index e45a25db66..0b010565dd 100644 --- a/packages/backend-common/src/reading/tree/ZipArchiveResponse.test.ts +++ b/packages/backend-common/src/reading/tree/ZipArchiveResponse.test.ts @@ -59,10 +59,12 @@ describe('ZipArchiveResponse', () => { { path: 'mkdocs.yml', content: expect.any(Function), + lastModifiedAt: expect.any(Date), }, { path: 'docs/index.md', content: expect.any(Function), + lastModifiedAt: expect.any(Date), }, ]); @@ -85,6 +87,7 @@ describe('ZipArchiveResponse', () => { { path: 'mkdocs.yml', content: expect.any(Function), + lastModifiedAt: expect.any(Date), }, ]); const content = await files[0].content(); @@ -108,10 +111,12 @@ describe('ZipArchiveResponse', () => { { path: 'mkdocs.yml', content: expect.any(Function), + lastModifiedAt: expect.any(Date), }, { path: 'docs/index.md', content: expect.any(Function), + lastModifiedAt: expect.any(Date), }, ]); const contents = await Promise.all(files.map(f => f.content())); diff --git a/packages/backend-common/src/reading/tree/ZipArchiveResponse.ts b/packages/backend-common/src/reading/tree/ZipArchiveResponse.ts index 5a1c5f9688..1e55150310 100644 --- a/packages/backend-common/src/reading/tree/ZipArchiveResponse.ts +++ b/packages/backend-common/src/reading/tree/ZipArchiveResponse.ts @@ -146,6 +146,9 @@ export class ZipArchiveResponse implements ReadTreeResponse { files.push({ path: this.getInnerPath(entry.fileName), content: async () => await streamToBuffer(content), + lastModifiedAt: entry.lastModFileTime + ? new Date(entry.lastModFileTime) + : undefined, }); }); diff --git a/packages/backend-common/src/reading/types.ts b/packages/backend-common/src/reading/types.ts index 35380029e2..7f4d407fd0 100644 --- a/packages/backend-common/src/reading/types.ts +++ b/packages/backend-common/src/reading/types.ts @@ -65,6 +65,7 @@ export type ReaderFactory = (options: { */ export type ReadUrlResponseFactoryFromStreamOptions = { etag?: string; + lastModifiedAt?: Date; }; /** @@ -95,10 +96,16 @@ export type FromReadableArrayOptions = Array<{ * The raw data itself. */ data: Readable; + /** * The filepath of the data. */ path: string; + + /** + * Last modified date of the file contents. + */ + lastModifiedAt?: Date; }>; /** diff --git a/packages/backend-common/src/reading/util.ts b/packages/backend-common/src/reading/util.ts new file mode 100644 index 0000000000..3d65c2c527 --- /dev/null +++ b/packages/backend-common/src/reading/util.ts @@ -0,0 +1,23 @@ +/* + * Copyright 2022 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +export function parseLastModified(value: string | null | undefined) { + if (!value) { + return undefined; + } + + return new Date(value); +} diff --git a/packages/backend-plugin-api/api-report.md b/packages/backend-plugin-api/api-report.md index 5e64502b78..7dc6ae97b3 100644 --- a/packages/backend-plugin-api/api-report.md +++ b/packages/backend-plugin-api/api-report.md @@ -359,11 +359,13 @@ export type ReadTreeResponseDirOptions = { export type ReadTreeResponseFile = { path: string; content(): Promise; + lastModifiedAt?: Date; }; // @public export type ReadUrlOptions = { etag?: string; + lastModifiedAfter?: Date; signal?: AbortSignal; }; @@ -372,6 +374,7 @@ export type ReadUrlResponse = { buffer(): Promise; stream?(): Readable; etag?: string; + lastModifiedAt?: Date; }; // @public (undocumented) @@ -420,6 +423,7 @@ export type SearchResponse = { export type SearchResponseFile = { url: string; content(): Promise; + lastModifiedAt?: Date; }; // @public (undocumented) diff --git a/packages/backend-plugin-api/src/services/definitions/UrlReaderService.ts b/packages/backend-plugin-api/src/services/definitions/UrlReaderService.ts index ef825a7fcd..c189b4a339 100644 --- a/packages/backend-plugin-api/src/services/definitions/UrlReaderService.ts +++ b/packages/backend-plugin-api/src/services/definitions/UrlReaderService.ts @@ -64,6 +64,26 @@ export type ReadUrlOptions = { */ etag?: string; + /** + * A date which can be provided to check whether a + * {@link UrlReaderService.readUrl} response has changed since the lastModifiedAt. + * + * @remarks + * + * In the {@link UrlReaderService.readUrl} response, an lastModifiedAt is returned + * along with data. The lastModifiedAt date represents the last time the data + * was modified. + * + * When an lastModifiedAfter is given in ReadUrlOptions, {@link UrlReaderService.readUrl} + * will compare the lastModifiedAfter against the lastModifiedAt of the target. If + * the data has not been modified since this date, the {@link UrlReaderService.readUrl} + * will throw a {@link @backstage/errors#NotModifiedError} indicating that the + * response does not contain any new data. If they do not match, + * {@link UrlReaderService.readUrl} will return the rest of the response along with new + * lastModifiedAt date. + */ + lastModifiedAfter?: Date; + /** * An abort signal to pass down to the underlying request. * @@ -102,6 +122,11 @@ export type ReadUrlResponse = { * Can be used to compare and cache responses when doing subsequent calls. */ etag?: string; + + /** + * Last modified date of the file contents. + */ + lastModifiedAt?: Date; }; /** @@ -213,8 +238,20 @@ export type ReadTreeResponse = { * @public */ export type ReadTreeResponseFile = { + /** + * The filepath of the data. + */ path: string; + + /** + * The binary contents of the file. + */ content(): Promise; + + /** + * The last modified timestamp of the data. + */ + lastModifiedAt?: Date; }; /** @@ -278,4 +315,9 @@ export type SearchResponseFile = { * The binary contents of the file. */ content(): Promise; + + /** + * The last modified timestamp of the data. + */ + lastModifiedAt?: Date; }; From 13226881189232e2b3e77ecd0bc06f03645a7cfe Mon Sep 17 00:00:00 2001 From: Marcus Eide Date: Thu, 9 Feb 2023 09:09:33 +0100 Subject: [PATCH 050/177] cli: Add admin skeleton command Signed-off-by: Marcus Eide --- packages/cli/src/commands/admin/command.ts | 31 ++++++++++++++++++++++ packages/cli/src/commands/admin/index.ts | 17 ++++++++++++ packages/cli/src/commands/index.ts | 8 ++++++ 3 files changed, 56 insertions(+) create mode 100644 packages/cli/src/commands/admin/command.ts create mode 100644 packages/cli/src/commands/admin/index.ts diff --git a/packages/cli/src/commands/admin/command.ts b/packages/cli/src/commands/admin/command.ts new file mode 100644 index 0000000000..3539ddc40c --- /dev/null +++ b/packages/cli/src/commands/admin/command.ts @@ -0,0 +1,31 @@ +/* + * Copyright 2023 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import chalk from 'chalk'; +import inquirer from 'inquirer'; +import { Task } from '../../lib/tasks'; + +export async function command(): Promise { + const answers = await inquirer.prompt<{ github: boolean }>([ + { + type: 'confirm', + name: 'github', + message: chalk.blue('Do you want to set up GitHub Authentication?'), + }, + ]); + + Task.log(answers.github ? 'Ok!' : 'Maybe next time'); +} diff --git a/packages/cli/src/commands/admin/index.ts b/packages/cli/src/commands/admin/index.ts new file mode 100644 index 0000000000..4c23ea6e48 --- /dev/null +++ b/packages/cli/src/commands/admin/index.ts @@ -0,0 +1,17 @@ +/* + * Copyright 2023 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +export { command } from './command'; diff --git a/packages/cli/src/commands/index.ts b/packages/cli/src/commands/index.ts index ddec5c6a4a..2baf1aac9b 100644 --- a/packages/cli/src/commands/index.ts +++ b/packages/cli/src/commands/index.ts @@ -25,6 +25,13 @@ const configOption = [ Array(), ] as const; +export function registerAdminCommand(program: Command) { + program + .command('admin') + .description('Get help setting up your Backstage App.') + .action(lazy(() => import('./admin').then(m => m.command))); +} + export function registerRepoCommand(program: Command) { const command = program .command('repo [command]') @@ -360,6 +367,7 @@ export function registerCommands(program: Command) { registerRepoCommand(program); registerScriptCommand(program); registerMigrateCommand(program); + registerAdminCommand(program); program .command('versions:bump') From 7af6c36adfea09e08dbb9a95c307e5c2c272e7e8 Mon Sep 17 00:00:00 2001 From: Marcus Eide Date: Thu, 9 Feb 2023 14:33:17 +0100 Subject: [PATCH 051/177] cli: Expand admin command to setup basic authenticaton for gihub Signed-off-by: Marcus Eide --- packages/cli/src/commands/admin/command.ts | 54 ++++++++++- packages/cli/src/commands/admin/file.ts | 48 ++++++++++ packages/cli/src/commands/admin/github.ts | 104 +++++++++++++++++++++ 3 files changed, 202 insertions(+), 4 deletions(-) create mode 100644 packages/cli/src/commands/admin/file.ts create mode 100644 packages/cli/src/commands/admin/github.ts diff --git a/packages/cli/src/commands/admin/command.ts b/packages/cli/src/commands/admin/command.ts index 3539ddc40c..5e8256c14f 100644 --- a/packages/cli/src/commands/admin/command.ts +++ b/packages/cli/src/commands/admin/command.ts @@ -17,15 +17,61 @@ import chalk from 'chalk'; import inquirer from 'inquirer'; import { Task } from '../../lib/tasks'; +import { github } from './github'; +import { updateConfigFile, updateEnvFile } from './file'; export async function command(): Promise { - const answers = await inquirer.prompt<{ github: boolean }>([ + const answers = await inquirer.prompt<{ + shouldSetupAuth: boolean; + useEnvForSecrets?: boolean; + provider?: string; + }>([ { type: 'confirm', - name: 'github', - message: chalk.blue('Do you want to set up GitHub Authentication?'), + name: 'shouldSetupAuth', + message: chalk.blue( + 'Do you want to set up Authentication for this project?', + ), + }, + { + type: 'confirm', + name: 'useEnvForSecrets', + message: + 'Would you like to store sensitive configuration details such as secrets as environment variables? (recommended)', + when: ({ shouldSetupAuth }) => shouldSetupAuth, + }, + { + type: 'list', + name: 'provider', + message: 'Please select a provider:', + choices: ['github'], + when: ({ shouldSetupAuth }) => shouldSetupAuth, }, ]); - Task.log(answers.github ? 'Ok!' : 'Maybe next time'); + if (!answers.shouldSetupAuth) { + // TODO(eide): Can we add a Task.warning() method? + console.log( + chalk.yellow( + 'If you change your mind, feel free to re-run this command.', + ), + ); + process.exit(1); + } + + switch (answers.provider) { + case 'github': { + const { useEnvForSecrets } = answers; + const config = await github(useEnvForSecrets); + await updateConfigFile(config); + if (useEnvForSecrets) { + await updateEnvFile(config); + } + break; + } + default: + throw new Error(`Provider ${answers.provider} not implemented yet.`); + } + + Task.log(`Done setting up ${answers.provider}!`); } diff --git a/packages/cli/src/commands/admin/file.ts b/packages/cli/src/commands/admin/file.ts new file mode 100644 index 0000000000..52a55c3776 --- /dev/null +++ b/packages/cli/src/commands/admin/file.ts @@ -0,0 +1,48 @@ +/* + * Copyright 2023 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import * as path from 'path'; +import * as fs from 'fs-extra'; +import yaml from 'yaml'; +import { findPaths } from '@backstage/cli-common'; +import { GithubAuthConfig } from './github'; + +/* eslint-disable-next-line no-restricted-syntax */ +const { targetRoot } = findPaths(__dirname); +const APP_CONFIG_FILE = path.join(targetRoot, 'app-config.development.yaml'); +const ENV_CONFIG_FILE = path.join(targetRoot, '.env.development'); + +// export const readAppConfig = async (file: string) => { +// return yaml.parse(await fs.readFile(file, 'utf8')); +// }; + +export const updateConfigFile = async (config: GithubAuthConfig) => { + return await fs.writeFile( + APP_CONFIG_FILE, + yaml.stringify(config, { + indent: 2, + }), + 'utf8', + ); +}; + +export const updateEnvFile = async (config: GithubAuthConfig) => { + const content = ` +AUTH_GITHUB_CLIENT_ID=${config.auth.providers.github.clientId} +AUTH_GITHUB_CLIENT_SECRET=${config.auth.providers.github.clientId}`; + + return await fs.writeFile(ENV_CONFIG_FILE, content, 'utf8'); +}; diff --git a/packages/cli/src/commands/admin/github.ts b/packages/cli/src/commands/admin/github.ts new file mode 100644 index 0000000000..5b359ecb33 --- /dev/null +++ b/packages/cli/src/commands/admin/github.ts @@ -0,0 +1,104 @@ +/* + * Copyright 2023 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import chalk from 'chalk'; +import inquirer from 'inquirer'; +import { Task } from '../../lib/tasks'; + +export type GithubAuthConfig = { + auth: { + providers: { + github: { + clientId: string; + clientSecret: string; + enterpriseInstanceUrl?: string; + }; + }; + }; +}; + +export const github = async ( + useEnvForSecrets?: boolean, +): Promise => { + Task.log(` + To add GitHub authentication, you must create an OAuth App from the GitHub developer settings: ${chalk.blue( + 'https://github.com/settings/developers', + )} + The Homepage URL should point to Backstage's frontend, while the Authorization callback URL will point to the auth backend. + + You can find the full documentation page here: ${chalk.blue( + 'https://backstage.io/docs/auth/github/provider', + )} + `); + + const answers = await inquirer.prompt<{ + clientSecret: string; + clientId: string; + hasGithubEnterprise: boolean; + enterpriseInstanceUrl?: string; + }>([ + { + type: 'input', + name: 'clientSecret', + message: 'What is your Client Secret?', + // TODO(eide): Is there another way to validate? + // validate(input) { + // if (/([a-f0-9]{40})/g.test(input)) { + // return true; + // } + + // throw Error('Please provide a valid client secret.'); + // }, + }, + { + type: 'input', + name: 'clientId', + message: 'What is your Client Id?', + }, + { + type: 'confirm', + name: 'hasGithubEnterprise', + message: 'Are you using Github Enterprise?', + }, + { + type: 'input', + name: 'enterpriseInstanceUrl', + message: 'What is your URL for Github Enterprise?', + when: ({ hasGithubEnterprise }) => hasGithubEnterprise, + validate(input: string) { + return Boolean(new URL(input)); + }, + }, + ]); + + return { + auth: { + providers: { + github: { + clientId: useEnvForSecrets + ? '${AUTH_GITHUB_CLIENT_ID}' + : answers.clientId, + clientSecret: useEnvForSecrets + ? '${AUTH_GITHUB_CLIENT_SECRET}' + : answers.clientSecret, + ...(answers.hasGithubEnterprise && { + enterpriseInstanceUrl: answers.enterpriseInstanceUrl, + }), + }, + }, + }, + }; +}; From e1754adefa7f34b67d47bfe4b8f504177dbf6540 Mon Sep 17 00:00:00 2001 From: Marcus Eide Date: Thu, 9 Feb 2023 14:38:42 +0100 Subject: [PATCH 052/177] cli: Set admin command to hidden Signed-off-by: Marcus Eide --- packages/cli/src/commands/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/cli/src/commands/index.ts b/packages/cli/src/commands/index.ts index 2baf1aac9b..df0689b4b5 100644 --- a/packages/cli/src/commands/index.ts +++ b/packages/cli/src/commands/index.ts @@ -27,7 +27,7 @@ const configOption = [ export function registerAdminCommand(program: Command) { program - .command('admin') + .command('admin', { hidden: true }) .description('Get help setting up your Backstage App.') .action(lazy(() => import('./admin').then(m => m.command))); } From 29534d24534c5aa37ed3b3b2e27fbee4b8b1d15c Mon Sep 17 00:00:00 2001 From: Philipp Hugenroth Date: Thu, 9 Feb 2023 17:37:44 +0100 Subject: [PATCH 053/177] Add gh-auth Signed-off-by: Philipp Hugenroth --- packages/cli/src/commands/admin/gh-auth.ts | 30 +++++++++++++++++++ .../GithubCreateAppServer.ts | 5 +++- .../src/commands/create-github-app/index.ts | 1 + 3 files changed, 35 insertions(+), 1 deletion(-) create mode 100644 packages/cli/src/commands/admin/gh-auth.ts diff --git a/packages/cli/src/commands/admin/gh-auth.ts b/packages/cli/src/commands/admin/gh-auth.ts new file mode 100644 index 0000000000..da3036d087 --- /dev/null +++ b/packages/cli/src/commands/admin/gh-auth.ts @@ -0,0 +1,30 @@ +/* + * Copyright 2023 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import chalk from 'chalk'; +import inquirer from 'inquirer'; +import createGithubApp from '../create-github-app'; + +export default async () => { + // TODO: Make the GitHub Org optional + const input = await inquirer.prompt<{ org: string }>([ + { + type: 'input', + name: 'org', + message: chalk.blue('Enter a GitHub Org [required]'), + }, + ]); + await createGithubApp(input.org); +}; diff --git a/packages/cli/src/commands/create-github-app/GithubCreateAppServer.ts b/packages/cli/src/commands/create-github-app/GithubCreateAppServer.ts index 70b8c0ca53..ca5eb2c02a 100644 --- a/packages/cli/src/commands/create-github-app/GithubCreateAppServer.ts +++ b/packages/cli/src/commands/create-github-app/GithubCreateAppServer.ts @@ -117,8 +117,11 @@ export class GithubCreateAppServer { ...(this.permissions.includes('members') && { members: 'read' }), ...(this.permissions.includes('read') && { contents: 'read' }), ...(this.permissions.includes('write') && { + administration: 'write', contents: 'write', - actions: 'write', + pull_requests: 'write', + issues: 'write', + workflows: 'write', }), }, name: 'Backstage-', diff --git a/packages/cli/src/commands/create-github-app/index.ts b/packages/cli/src/commands/create-github-app/index.ts index 6b3e732f18..e04e39fdf6 100644 --- a/packages/cli/src/commands/create-github-app/index.ts +++ b/packages/cli/src/commands/create-github-app/index.ts @@ -26,6 +26,7 @@ import openBrowser from 'react-dev-utils/openBrowser'; // due to lacking support for creating apps from manifests. // https://docs.github.com/en/free-pro-team@latest/developers/apps/creating-a-github-app-from-a-manifest export default async (org: string) => { + // Why is the Org check not done here? const answers: Answers = await inquirer.prompt({ name: 'appType', type: 'checkbox', From 250fb2af40eb01e96d58235460963a54bb8090a9 Mon Sep 17 00:00:00 2001 From: Philipp Hugenroth Date: Fri, 10 Feb 2023 13:43:16 +0100 Subject: [PATCH 054/177] Add GHA option to auth flow Signed-off-by: Philipp Hugenroth --- packages/cli/src/commands/admin/command.ts | 26 ++- packages/cli/src/commands/admin/gh-auth.ts | 7 +- .../GithubCreateAppServer.ts | 2 +- .../src/commands/create-github-app/index.ts | 160 +++++++++++++----- 4 files changed, 141 insertions(+), 54 deletions(-) diff --git a/packages/cli/src/commands/admin/command.ts b/packages/cli/src/commands/admin/command.ts index 5e8256c14f..d7ea348571 100644 --- a/packages/cli/src/commands/admin/command.ts +++ b/packages/cli/src/commands/admin/command.ts @@ -19,6 +19,7 @@ import inquirer from 'inquirer'; import { Task } from '../../lib/tasks'; import { github } from './github'; import { updateConfigFile, updateEnvFile } from './file'; +import ghAuth from './gh-auth'; export async function command(): Promise { const answers = await inquirer.prompt<{ @@ -44,7 +45,7 @@ export async function command(): Promise { type: 'list', name: 'provider', message: 'Please select a provider:', - choices: ['github'], + choices: ['GitHub OAuth', 'GitHub App'], when: ({ shouldSetupAuth }) => shouldSetupAuth, }, ]); @@ -59,9 +60,10 @@ export async function command(): Promise { process.exit(1); } + const { useEnvForSecrets } = answers; + switch (answers.provider) { - case 'github': { - const { useEnvForSecrets } = answers; + case 'GitHub OAuth': { const config = await github(useEnvForSecrets); await updateConfigFile(config); if (useEnvForSecrets) { @@ -69,6 +71,24 @@ export async function command(): Promise { } break; } + case 'GitHub App': { + const config = await ghAuth(); + // TODO(tudi2d): Also change integrations + if (useEnvForSecrets) { + await updateEnvFile({ + auth: config.auth, + }); + config.auth.providers.github.clientId = '${AUTH_GITHUB_CLIENT_ID}'; + config.auth.providers.github.clientSecret = + '${AUTH_GITHUB_CLIENT_SECRET}'; + await updateConfigFile({ + auth: config.auth, + }); + } else { + await updateConfigFile({ auth: config.auth }); + } + break; + } default: throw new Error(`Provider ${answers.provider} not implemented yet.`); } diff --git a/packages/cli/src/commands/admin/gh-auth.ts b/packages/cli/src/commands/admin/gh-auth.ts index da3036d087..ee5bbfb2c6 100644 --- a/packages/cli/src/commands/admin/gh-auth.ts +++ b/packages/cli/src/commands/admin/gh-auth.ts @@ -15,10 +15,11 @@ */ import chalk from 'chalk'; import inquirer from 'inquirer'; -import createGithubApp from '../create-github-app'; +import { adminCli } from '../create-github-app'; +// TODO(tudi2d): Wrapper for admin CLI around `create-github-app` - potentially to be removed export default async () => { - // TODO: Make the GitHub Org optional + // TODO(tudi2d): Make the GitHub Org optional const input = await inquirer.prompt<{ org: string }>([ { type: 'input', @@ -26,5 +27,5 @@ export default async () => { message: chalk.blue('Enter a GitHub Org [required]'), }, ]); - await createGithubApp(input.org); + return await adminCli(input.org); }; diff --git a/packages/cli/src/commands/create-github-app/GithubCreateAppServer.ts b/packages/cli/src/commands/create-github-app/GithubCreateAppServer.ts index ca5eb2c02a..cb2613c691 100644 --- a/packages/cli/src/commands/create-github-app/GithubCreateAppServer.ts +++ b/packages/cli/src/commands/create-github-app/GithubCreateAppServer.ts @@ -33,7 +33,7 @@ const FORM_PAGE = ` `; -type GithubAppConfig = { +export type GithubAppConfig = { appId: number; slug?: string; name?: string; diff --git a/packages/cli/src/commands/create-github-app/index.ts b/packages/cli/src/commands/create-github-app/index.ts index e04e39fdf6..16cb921ce4 100644 --- a/packages/cli/src/commands/create-github-app/index.ts +++ b/packages/cli/src/commands/create-github-app/index.ts @@ -14,62 +14,26 @@ * limitations under the License. */ -import fs from 'fs-extra'; import chalk from 'chalk'; -import { stringify as stringifyYaml } from 'yaml'; -import inquirer, { Question, Answers } from 'inquirer'; -import { paths } from '../../lib/paths'; -import { GithubCreateAppServer } from './GithubCreateAppServer'; +import fs from 'fs-extra'; +import inquirer, { Question } from 'inquirer'; import fetch from 'node-fetch'; import openBrowser from 'react-dev-utils/openBrowser'; +import { stringify as stringifyYaml } from 'yaml'; +import { GithubAppConfig } from '@backstage/integration'; + +import { paths } from '../../lib/paths'; +import { GithubCreateAppServer } from './GithubCreateAppServer'; + // This is an experimental command that at this point does not support GitHub Enterprise // due to lacking support for creating apps from manifests. // https://docs.github.com/en/free-pro-team@latest/developers/apps/creating-a-github-app-from-a-manifest export default async (org: string) => { - // Why is the Org check not done here? - const answers: Answers = await inquirer.prompt({ - name: 'appType', - type: 'checkbox', - message: - 'Select permissions [required] (these can be changed later but then require approvals in all installations)', - choices: [ - { - name: 'Read access to content (required by Software Catalog to ingest data from repositories)', - value: 'read', - checked: true, - }, - { - name: 'Read access to members (required by Software Catalog to ingest GitHub teams)', - value: 'members', - checked: true, - }, - { - name: 'Read and Write to content and actions (required by Software Templates to create new repositories)', - value: 'write', - }, - ], - }); - - if (answers.appType.length === 0) { - console.log(chalk.red('You must select at least one permission')); - process.exit(1); - } - + // TODO(tudi2d): Why is the Org check not done here? + const answers = await permissionAnswers(); await verifyGithubOrg(org); - const { slug, name, ...config } = await GithubCreateAppServer.run({ - org, - permissions: answers.appType, - }); + const { fileName } = await createGHAYaml(org, answers.appType); - const fileName = `github-app-${slug}-credentials.yaml`; - const content = `# Name: ${name}\n${stringifyYaml(config)}`; - await fs.writeFile(paths.resolveTargetRoot(fileName), content); - console.log(`GitHub App configuration written to ${chalk.cyan(fileName)}`); - console.log( - chalk.yellow( - 'This file contains sensitive credentials, it should not be committed to version control and handled with care!', - ), - ); console.log( "Here's an example on how to update the integrations section in app-config.yaml", ); @@ -83,6 +47,42 @@ integrations: ); }; +/** + * + * @param org string: GitHub Organisation + * @returns Promise: Partial App Config for Admin CLI + */ +export async function adminCli(org: string) { + await verifyGithubOrg(org); + const answers = await permissionAnswers({ + read: true, + members: true, + write: true, + }); + const { fileName, config } = await createGHAYaml(org, answers.appType); + const auth = { + providers: { + github: { + clientId: config.clientId, + clientSecret: config.clientSecret, + }, + }, + }; + const integration = { + github: { + host: 'github.com', + apps: { + $include: `${fileName}`, + }, + }, + }; + + return { + auth, + integration, + }; +} + async function verifyGithubOrg(org: string): Promise { let response; @@ -121,6 +121,7 @@ async function verifyGithubOrg(org: string): Promise { openBrowser('https://github.com/account/organizations/new'); + // TODO(tudi2d): Could we maybe re-run the command rather than exit? console.log( chalk.yellow( 'Please re-run this command when you have created your new organization', @@ -130,3 +131,68 @@ async function verifyGithubOrg(org: string): Promise { process.exit(0); } } + +async function permissionAnswers( + checked: { read: boolean; members: boolean; write: boolean } = { + read: true, + members: true, + write: false, + }, +) { + const answers = await inquirer.prompt<{ appType: string[] }>({ + name: 'appType', + type: 'checkbox', + message: + 'Select permissions [required] (these can be changed later but then require approvals in all installations)', + choices: [ + { + name: 'Read access to content (required by Software Catalog to ingest data from repositories)', + value: 'read', + checked: checked.read, + }, + { + name: 'Read access to members (required by Software Catalog to ingest GitHub teams)', + value: 'members', + checked: checked.members, + }, + { + name: 'Read and Write to content and actions (required by Software Templates to create new repositories)', + value: 'write', + checked: checked.write, + }, + ], + }); + + if (answers.appType.length === 0) { + console.log(chalk.red('You must select at least one permission')); + // TODO(tudi2d): Maybe re-do input rather than exit? + process.exit(1); + } + + return answers; +} + +async function createGHAYaml( + org: string, + permissions: string[], +): Promise<{ fileName: string; config: GithubAppConfig }> { + const { slug, name, ...config } = await GithubCreateAppServer.run({ + org, + permissions, + }); + + const fileName = `github-app-${slug}-credentials.yaml`; + const content = `# Name: ${name}\n${stringifyYaml(config)}`; + await fs.writeFile(paths.resolveTargetRoot(fileName), content); + console.log(`GitHub App configuration written to ${chalk.cyan(fileName)}`); + console.log( + chalk.yellow( + 'This file contains sensitive credentials, it should not be committed to version control and handled with care!', + ), + ); + + return { + fileName, + config, + }; +} From d844a31fc414bf0b8ff06aa5da9fbfeab3f66cd4 Mon Sep 17 00:00:00 2001 From: Marcus Eide Date: Fri, 10 Feb 2023 14:08:43 +0100 Subject: [PATCH 055/177] cli: Add validation for github credentials Signed-off-by: Marcus Eide --- packages/cli/package.json | 1 + packages/cli/src/commands/admin/command.ts | 5 +- packages/cli/src/commands/admin/github.ts | 83 +++++++++++++++------- yarn.lock | 40 +++-------- 4 files changed, 66 insertions(+), 63 deletions(-) diff --git a/packages/cli/package.json b/packages/cli/package.json index 8c76c7888b..8a0848a243 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -39,6 +39,7 @@ "@backstage/types": "workspace:^", "@esbuild-kit/cjs-loader": "^2.4.1", "@manypkg/get-packages": "^1.1.3", + "@octokit/oauth-app": "^4.2.0", "@octokit/request": "^6.0.0", "@pmmmwh/react-refresh-webpack-plugin": "^0.5.7", "@rollup/plugin-commonjs": "^23.0.0", diff --git a/packages/cli/src/commands/admin/command.ts b/packages/cli/src/commands/admin/command.ts index d7ea348571..eb0ba0b512 100644 --- a/packages/cli/src/commands/admin/command.ts +++ b/packages/cli/src/commands/admin/command.ts @@ -30,9 +30,7 @@ export async function command(): Promise { { type: 'confirm', name: 'shouldSetupAuth', - message: chalk.blue( - 'Do you want to set up Authentication for this project?', - ), + message: 'Do you want to set up Authentication for this project?', }, { type: 'confirm', @@ -51,7 +49,6 @@ export async function command(): Promise { ]); if (!answers.shouldSetupAuth) { - // TODO(eide): Can we add a Task.warning() method? console.log( chalk.yellow( 'If you change your mind, feel free to re-run this command.', diff --git a/packages/cli/src/commands/admin/github.ts b/packages/cli/src/commands/admin/github.ts index 5b359ecb33..0cb900c85d 100644 --- a/packages/cli/src/commands/admin/github.ts +++ b/packages/cli/src/commands/admin/github.ts @@ -14,6 +14,7 @@ * limitations under the License. */ +import { OAuthApp } from '@octokit/oauth-app'; import chalk from 'chalk'; import inquirer from 'inquirer'; import { Task } from '../../lib/tasks'; @@ -22,14 +23,41 @@ export type GithubAuthConfig = { auth: { providers: { github: { - clientId: string; - clientSecret: string; - enterpriseInstanceUrl?: string; + development: { + clientId: string; + clientSecret: string; + enterpriseInstanceUrl?: string; + }; }; }; }; }; +const validateCredentials = async (clientId: string, clientSecret: string) => { + try { + const app = new OAuthApp({ + clientId, + clientSecret, + }); + await app.createToken({ + code: '%NOT-VALID-CODE%', + }); + } catch (error) { + // @octokit/request returns a error.response object when a request is rejected. + // We can check it to see what kind of error we received. + + // If error.response is successful we can double-check that the error itself was due to the bad code. + // If that's the case then we can assume that the client id and secret exists as we otherwise would + // have gotten a 400/404. + if ( + error.response.status !== 200 && + error.response.data.error !== 'bad_verification_code' + ) { + throw new Error(`Validating Github Credentials failed.`); + } + } +}; + export const github = async ( useEnvForSecrets?: boolean, ): Promise => { @@ -39,6 +67,11 @@ export const github = async ( )} The Homepage URL should point to Backstage's frontend, while the Authorization callback URL will point to the auth backend. + Settings for local development: + ${chalk.cyan(` + Homepage URL: http://localhost:3000 + Authorization callback URL: http://localhost:7007/api/auth/github/handler/frame`)} + You can find the full documentation page here: ${chalk.blue( 'https://backstage.io/docs/auth/github/provider', )} @@ -52,21 +85,15 @@ export const github = async ( }>([ { type: 'input', - name: 'clientSecret', - message: 'What is your Client Secret?', - // TODO(eide): Is there another way to validate? - // validate(input) { - // if (/([a-f0-9]{40})/g.test(input)) { - // return true; - // } - - // throw Error('Please provide a valid client secret.'); - // }, + name: 'clientId', + message: 'What is your Client Id?', + validate: (input: string) => (input.length ? true : false), }, { type: 'input', - name: 'clientId', - message: 'What is your Client Id?', + name: 'clientSecret', + message: 'What is your Client Secret?', + validate: (input: string) => (input.length ? true : false), }, { type: 'confirm', @@ -78,25 +105,27 @@ export const github = async ( name: 'enterpriseInstanceUrl', message: 'What is your URL for Github Enterprise?', when: ({ hasGithubEnterprise }) => hasGithubEnterprise, - validate(input: string) { - return Boolean(new URL(input)); - }, + validate: (input: string) => Boolean(new URL(input)), }, ]); + await validateCredentials(answers.clientId, answers.clientSecret); + return { auth: { providers: { github: { - clientId: useEnvForSecrets - ? '${AUTH_GITHUB_CLIENT_ID}' - : answers.clientId, - clientSecret: useEnvForSecrets - ? '${AUTH_GITHUB_CLIENT_SECRET}' - : answers.clientSecret, - ...(answers.hasGithubEnterprise && { - enterpriseInstanceUrl: answers.enterpriseInstanceUrl, - }), + development: { + clientId: useEnvForSecrets + ? '${AUTH_GITHUB_CLIENT_ID}' + : answers.clientId, + clientSecret: useEnvForSecrets + ? '${AUTH_GITHUB_CLIENT_SECRET}' + : answers.clientSecret, + ...(answers.hasGithubEnterprise && { + enterpriseInstanceUrl: answers.enterpriseInstanceUrl, + }), + }, }, }, }, diff --git a/yarn.lock b/yarn.lock index cd69bd547b..f867cadce5 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3678,6 +3678,7 @@ __metadata: "@backstage/types": "workspace:^" "@esbuild-kit/cjs-loader": ^2.4.1 "@manypkg/get-packages": ^1.1.3 + "@octokit/oauth-app": ^4.2.0 "@octokit/request": ^6.0.0 "@pmmmwh/react-refresh-webpack-plugin": ^0.5.7 "@rollup/plugin-commonjs": ^23.0.0 @@ -12534,9 +12535,9 @@ __metadata: languageName: node linkType: hard -"@octokit/oauth-app@npm:^4.0.4, @octokit/oauth-app@npm:^4.0.6": - version: 4.0.6 - resolution: "@octokit/oauth-app@npm:4.0.6" +"@octokit/oauth-app@npm:^4.0.4, @octokit/oauth-app@npm:^4.0.6, @octokit/oauth-app@npm:^4.2.0": + version: 4.2.0 + resolution: "@octokit/oauth-app@npm:4.2.0" dependencies: "@octokit/auth-oauth-app": ^5.0.0 "@octokit/auth-oauth-user": ^2.0.0 @@ -12545,13 +12546,9 @@ __metadata: "@octokit/oauth-authorization-url": ^5.0.0 "@octokit/oauth-methods": ^2.0.0 "@types/aws-lambda": ^8.10.83 - aws-lambda: ^1.0.7 fromentries: ^1.3.1 universal-user-agent: ^6.0.0 - dependenciesMeta: - aws-lambda: - optional: true - checksum: 0d7ceadda4668748a436f52f6c4ae3160a4a5c81a92592c0a6cfc75b0a065ed480880d8861efcabc6ca41b3ccf753d1c1044782a6c8d5fb481d6e8a0acf6d32e + checksum: 6cf5638d27e589daa577653177f2b135c0c346c8f74cc420d9fd0dc0f559a84040073eee147bd555a55bb5756bd0940e6dc4c3a6b3a508a818e3d5bee3837095 languageName: node linkType: hard @@ -17536,20 +17533,6 @@ __metadata: languageName: node linkType: hard -"aws-lambda@npm:^1.0.7": - version: 1.0.7 - resolution: "aws-lambda@npm:1.0.7" - dependencies: - aws-sdk: ^2.814.0 - commander: ^3.0.2 - js-yaml: ^3.14.1 - watchpack: ^2.0.0-beta.10 - bin: - lambda: bin/lambda - checksum: 11316e87b5c4fc36e6bd0495742a3c0ed13befc9527a7b251a58180d141d9afd68b684f37aeb3b53d117d3c2f96747eace31826b683543f1edddc03f392865fd - languageName: node - linkType: hard - "aws-os-connection@npm:^0.2.0": version: 0.2.0 resolution: "aws-os-connection@npm:0.2.0" @@ -17596,7 +17579,7 @@ __metadata: languageName: node linkType: hard -"aws-sdk@npm:^2.1231.0, aws-sdk@npm:^2.814.0, aws-sdk@npm:^2.840.0, aws-sdk@npm:^2.948.0": +"aws-sdk@npm:^2.1231.0, aws-sdk@npm:^2.840.0, aws-sdk@npm:^2.948.0": version: 2.1279.0 resolution: "aws-sdk@npm:2.1279.0" dependencies: @@ -19475,13 +19458,6 @@ __metadata: languageName: node linkType: hard -"commander@npm:^3.0.2": - version: 3.0.2 - resolution: "commander@npm:3.0.2" - checksum: 6d14ad030d1904428139487ed31febcb04c1604db2b8d9fae711f60ee6718828dc0e11602249e91c8a97b0e721e9c6d53edbc166bad3cde1596851d59a8f824d - languageName: node - linkType: hard - "commander@npm:^4.0.0": version: 4.1.1 resolution: "commander@npm:4.1.1" @@ -27320,7 +27296,7 @@ __metadata: languageName: node linkType: hard -"js-yaml@npm:^3.10.0, js-yaml@npm:^3.13.0, js-yaml@npm:^3.13.1, js-yaml@npm:^3.14.1, js-yaml@npm:^3.6.1, js-yaml@npm:^3.8.3": +"js-yaml@npm:^3.10.0, js-yaml@npm:^3.13.0, js-yaml@npm:^3.13.1, js-yaml@npm:^3.6.1, js-yaml@npm:^3.8.3": version: 3.14.1 resolution: "js-yaml@npm:3.14.1" dependencies: @@ -38736,7 +38712,7 @@ __metadata: languageName: node linkType: hard -"watchpack@npm:^2.0.0-beta.10, watchpack@npm:^2.4.0": +"watchpack@npm:^2.4.0": version: 2.4.0 resolution: "watchpack@npm:2.4.0" dependencies: From 184602db0af82e8b0481502cde16b77e5fcd7222 Mon Sep 17 00:00:00 2001 From: Marcus Eide Date: Fri, 10 Feb 2023 14:09:47 +0100 Subject: [PATCH 056/177] cli: Handle appending config when setting up github auth Signed-off-by: Marcus Eide --- packages/cli/src/commands/admin/file.ts | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/packages/cli/src/commands/admin/file.ts b/packages/cli/src/commands/admin/file.ts index 52a55c3776..6135c53ebf 100644 --- a/packages/cli/src/commands/admin/file.ts +++ b/packages/cli/src/commands/admin/file.ts @@ -22,17 +22,21 @@ import { GithubAuthConfig } from './github'; /* eslint-disable-next-line no-restricted-syntax */ const { targetRoot } = findPaths(__dirname); -const APP_CONFIG_FILE = path.join(targetRoot, 'app-config.development.yaml'); +const APP_CONFIG_FILE = path.join(targetRoot, 'app-config.local.yaml'); const ENV_CONFIG_FILE = path.join(targetRoot, '.env.development'); -// export const readAppConfig = async (file: string) => { -// return yaml.parse(await fs.readFile(file, 'utf8')); -// }; +const readConfigFile = async (file: string) => { + return yaml.parse(await fs.readFile(file, 'utf8')); +}; export const updateConfigFile = async (config: GithubAuthConfig) => { + const content = fs.existsSync(APP_CONFIG_FILE) + ? { ...(await readConfigFile(APP_CONFIG_FILE)), ...config } + : config; + return await fs.writeFile( APP_CONFIG_FILE, - yaml.stringify(config, { + yaml.stringify(content, { indent: 2, }), 'utf8', @@ -41,8 +45,12 @@ export const updateConfigFile = async (config: GithubAuthConfig) => { export const updateEnvFile = async (config: GithubAuthConfig) => { const content = ` -AUTH_GITHUB_CLIENT_ID=${config.auth.providers.github.clientId} -AUTH_GITHUB_CLIENT_SECRET=${config.auth.providers.github.clientId}`; +AUTH_GITHUB_CLIENT_ID=${config.auth.providers.github.development.clientId} +AUTH_GITHUB_CLIENT_SECRET=${config.auth.providers.github.development.clientId}`; + + if (fs.existsSync(ENV_CONFIG_FILE)) { + await fs.appendFile(ENV_CONFIG_FILE, content, 'utf8'); + } return await fs.writeFile(ENV_CONFIG_FILE, content, 'utf8'); }; From d9893cb7942bd728a4f7cf56743e09757ef3f478 Mon Sep 17 00:00:00 2001 From: Marcus Eide Date: Fri, 10 Feb 2023 14:10:42 +0100 Subject: [PATCH 057/177] cli: Fix github auth not including environment key Signed-off-by: Marcus Eide --- packages/cli/src/commands/admin/command.ts | 5 +++-- packages/cli/src/commands/create-github-app/index.ts | 6 ++++-- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/packages/cli/src/commands/admin/command.ts b/packages/cli/src/commands/admin/command.ts index eb0ba0b512..33dd7bd20f 100644 --- a/packages/cli/src/commands/admin/command.ts +++ b/packages/cli/src/commands/admin/command.ts @@ -75,8 +75,9 @@ export async function command(): Promise { await updateEnvFile({ auth: config.auth, }); - config.auth.providers.github.clientId = '${AUTH_GITHUB_CLIENT_ID}'; - config.auth.providers.github.clientSecret = + config.auth.providers.github.development.clientId = + '${AUTH_GITHUB_CLIENT_ID}'; + config.auth.providers.github.development.clientSecret = '${AUTH_GITHUB_CLIENT_SECRET}'; await updateConfigFile({ auth: config.auth, diff --git a/packages/cli/src/commands/create-github-app/index.ts b/packages/cli/src/commands/create-github-app/index.ts index 16cb921ce4..606e982bd4 100644 --- a/packages/cli/src/commands/create-github-app/index.ts +++ b/packages/cli/src/commands/create-github-app/index.ts @@ -63,8 +63,10 @@ export async function adminCli(org: string) { const auth = { providers: { github: { - clientId: config.clientId, - clientSecret: config.clientSecret, + development: { + clientId: config.clientId, + clientSecret: config.clientSecret, + }, }, }, }; From ba46a192328b7c488c99e9c9d425407f4e32ecc5 Mon Sep 17 00:00:00 2001 From: Marcus Eide Date: Mon, 13 Feb 2023 13:02:10 +0100 Subject: [PATCH 058/177] cli: Move to folder and split up into different questions Signed-off-by: Marcus Eide --- .../cli/src/commands/admin/{ => auth}/file.ts | 15 ++++- .../admin/{gh-auth.ts => auth/github/app.ts} | 4 +- .../src/commands/admin/auth/github/index.ts | 64 +++++++++++++++++++ .../admin/{github.ts => auth/github/oauth.ts} | 23 +------ packages/cli/src/commands/admin/auth/index.ts | 45 +++++++++++++ packages/cli/src/commands/admin/command.ts | 56 +--------------- 6 files changed, 130 insertions(+), 77 deletions(-) rename packages/cli/src/commands/admin/{ => auth}/file.ts (88%) rename packages/cli/src/commands/admin/{gh-auth.ts => auth/github/app.ts} (92%) create mode 100644 packages/cli/src/commands/admin/auth/github/index.ts rename packages/cli/src/commands/admin/{github.ts => auth/github/oauth.ts} (90%) create mode 100644 packages/cli/src/commands/admin/auth/index.ts diff --git a/packages/cli/src/commands/admin/file.ts b/packages/cli/src/commands/admin/auth/file.ts similarity index 88% rename from packages/cli/src/commands/admin/file.ts rename to packages/cli/src/commands/admin/auth/file.ts index 6135c53ebf..14a8a151f8 100644 --- a/packages/cli/src/commands/admin/file.ts +++ b/packages/cli/src/commands/admin/auth/file.ts @@ -18,7 +18,20 @@ import * as path from 'path'; import * as fs from 'fs-extra'; import yaml from 'yaml'; import { findPaths } from '@backstage/cli-common'; -import { GithubAuthConfig } from './github'; + +export type GithubAuthConfig = { + auth: { + providers: { + github: { + development: { + clientId: string; + clientSecret: string; + enterpriseInstanceUrl?: string; + }; + }; + }; + }; +}; /* eslint-disable-next-line no-restricted-syntax */ const { targetRoot } = findPaths(__dirname); diff --git a/packages/cli/src/commands/admin/gh-auth.ts b/packages/cli/src/commands/admin/auth/github/app.ts similarity index 92% rename from packages/cli/src/commands/admin/gh-auth.ts rename to packages/cli/src/commands/admin/auth/github/app.ts index ee5bbfb2c6..234f8d1e29 100644 --- a/packages/cli/src/commands/admin/gh-auth.ts +++ b/packages/cli/src/commands/admin/auth/github/app.ts @@ -15,10 +15,10 @@ */ import chalk from 'chalk'; import inquirer from 'inquirer'; -import { adminCli } from '../create-github-app'; +import { adminCli } from '../../../create-github-app'; // TODO(tudi2d): Wrapper for admin CLI around `create-github-app` - potentially to be removed -export default async () => { +export const app = async () => { // TODO(tudi2d): Make the GitHub Org optional const input = await inquirer.prompt<{ org: string }>([ { diff --git a/packages/cli/src/commands/admin/auth/github/index.ts b/packages/cli/src/commands/admin/auth/github/index.ts new file mode 100644 index 0000000000..8ea7e63bc9 --- /dev/null +++ b/packages/cli/src/commands/admin/auth/github/index.ts @@ -0,0 +1,64 @@ +/* + * Copyright 2023 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import inquirer from 'inquirer'; +import { GithubAuthConfig, updateConfigFile, updateEnvFile } from '../file'; +import { app } from './app'; +import { oauth } from './oauth'; + +export const github = async () => { + const answers = await inquirer.prompt<{ + useEnvForSecrets: boolean; + type: string; + }>([ + { + type: 'confirm', + name: 'useEnvForSecrets', + message: + 'Would you like to store sensitive configuration details such as secrets as environment variables? (recommended)', + }, + { + type: 'list', + name: 'type', + message: 'Do you want to use a Github App or a Github OAuth?', + choices: ['GitHub OAuth', 'GitHub App'], + }, + ]); + + const { type, useEnvForSecrets } = answers; + + switch (type) { + case 'GitHub OAuth': { + const config: GithubAuthConfig = await oauth(useEnvForSecrets); + await updateConfigFile(config); + if (useEnvForSecrets) { + await updateEnvFile(config); + } + break; + } + case 'GitHub App': { + const { auth }: GithubAuthConfig = await app(); + // TODO(tudi2d): Also change integrations + await updateConfigFile({ auth }); + if (useEnvForSecrets) { + await updateEnvFile({ auth }); + } + break; + } + default: + throw new Error(`Unknown selection: ${type}.`); + } +}; diff --git a/packages/cli/src/commands/admin/github.ts b/packages/cli/src/commands/admin/auth/github/oauth.ts similarity index 90% rename from packages/cli/src/commands/admin/github.ts rename to packages/cli/src/commands/admin/auth/github/oauth.ts index 0cb900c85d..4daccdfd8c 100644 --- a/packages/cli/src/commands/admin/github.ts +++ b/packages/cli/src/commands/admin/auth/github/oauth.ts @@ -17,21 +17,7 @@ import { OAuthApp } from '@octokit/oauth-app'; import chalk from 'chalk'; import inquirer from 'inquirer'; -import { Task } from '../../lib/tasks'; - -export type GithubAuthConfig = { - auth: { - providers: { - github: { - development: { - clientId: string; - clientSecret: string; - enterpriseInstanceUrl?: string; - }; - }; - }; - }; -}; +import { Task } from '../../../../lib/tasks'; const validateCredentials = async (clientId: string, clientSecret: string) => { try { @@ -58,9 +44,7 @@ const validateCredentials = async (clientId: string, clientSecret: string) => { } }; -export const github = async ( - useEnvForSecrets?: boolean, -): Promise => { +export const oauth = async (useEnvForSecrets?: boolean) => { Task.log(` To add GitHub authentication, you must create an OAuth App from the GitHub developer settings: ${chalk.blue( 'https://github.com/settings/developers', @@ -74,8 +58,7 @@ export const github = async ( You can find the full documentation page here: ${chalk.blue( 'https://backstage.io/docs/auth/github/provider', - )} - `); + )}`); const answers = await inquirer.prompt<{ clientSecret: string; diff --git a/packages/cli/src/commands/admin/auth/index.ts b/packages/cli/src/commands/admin/auth/index.ts new file mode 100644 index 0000000000..9af145dcf3 --- /dev/null +++ b/packages/cli/src/commands/admin/auth/index.ts @@ -0,0 +1,45 @@ +/* + * Copyright 2023 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import inquirer from 'inquirer'; +import { Task } from '../../../lib/tasks'; +import { github } from './github'; + +export async function auth(): Promise { + const answers = await inquirer.prompt<{ + provider?: string; + }>([ + { + type: 'list', + name: 'provider', + message: 'Please select a provider:', + choices: ['Github'], + }, + ]); + + const { provider } = answers; + + switch (provider) { + case 'Github': { + await github(); + break; + } + default: + throw new Error(`Provider ${provider} not implemented yet.`); + } + + Task.log(`Done setting up ${provider}!`); +} diff --git a/packages/cli/src/commands/admin/command.ts b/packages/cli/src/commands/admin/command.ts index 33dd7bd20f..4c49631a80 100644 --- a/packages/cli/src/commands/admin/command.ts +++ b/packages/cli/src/commands/admin/command.ts @@ -16,15 +16,11 @@ import chalk from 'chalk'; import inquirer from 'inquirer'; -import { Task } from '../../lib/tasks'; -import { github } from './github'; -import { updateConfigFile, updateEnvFile } from './file'; -import ghAuth from './gh-auth'; +import { auth } from './auth'; export async function command(): Promise { const answers = await inquirer.prompt<{ shouldSetupAuth: boolean; - useEnvForSecrets?: boolean; provider?: string; }>([ { @@ -32,20 +28,6 @@ export async function command(): Promise { name: 'shouldSetupAuth', message: 'Do you want to set up Authentication for this project?', }, - { - type: 'confirm', - name: 'useEnvForSecrets', - message: - 'Would you like to store sensitive configuration details such as secrets as environment variables? (recommended)', - when: ({ shouldSetupAuth }) => shouldSetupAuth, - }, - { - type: 'list', - name: 'provider', - message: 'Please select a provider:', - choices: ['GitHub OAuth', 'GitHub App'], - when: ({ shouldSetupAuth }) => shouldSetupAuth, - }, ]); if (!answers.shouldSetupAuth) { @@ -57,39 +39,5 @@ export async function command(): Promise { process.exit(1); } - const { useEnvForSecrets } = answers; - - switch (answers.provider) { - case 'GitHub OAuth': { - const config = await github(useEnvForSecrets); - await updateConfigFile(config); - if (useEnvForSecrets) { - await updateEnvFile(config); - } - break; - } - case 'GitHub App': { - const config = await ghAuth(); - // TODO(tudi2d): Also change integrations - if (useEnvForSecrets) { - await updateEnvFile({ - auth: config.auth, - }); - config.auth.providers.github.development.clientId = - '${AUTH_GITHUB_CLIENT_ID}'; - config.auth.providers.github.development.clientSecret = - '${AUTH_GITHUB_CLIENT_SECRET}'; - await updateConfigFile({ - auth: config.auth, - }); - } else { - await updateConfigFile({ auth: config.auth }); - } - break; - } - default: - throw new Error(`Provider ${answers.provider} not implemented yet.`); - } - - Task.log(`Done setting up ${answers.provider}!`); + await auth(); } From e3e0b14ec45125f7689a56e687fe48dfe1c3b3e4 Mon Sep 17 00:00:00 2001 From: Marcus Eide Date: Mon, 13 Feb 2023 13:40:21 +0100 Subject: [PATCH 059/177] cli: Move file logic to each type of github auth to simplify logic Signed-off-by: Marcus Eide --- packages/cli/src/commands/admin/auth/file.ts | 10 +++--- .../cli/src/commands/admin/auth/github/app.ts | 14 ++++++-- .../src/commands/admin/auth/github/index.ts | 13 ++----- .../src/commands/admin/auth/github/oauth.ts | 36 ++++++++++--------- 4 files changed, 39 insertions(+), 34 deletions(-) diff --git a/packages/cli/src/commands/admin/auth/file.ts b/packages/cli/src/commands/admin/auth/file.ts index 14a8a151f8..baafacc8c6 100644 --- a/packages/cli/src/commands/admin/auth/file.ts +++ b/packages/cli/src/commands/admin/auth/file.ts @@ -19,7 +19,7 @@ import * as fs from 'fs-extra'; import yaml from 'yaml'; import { findPaths } from '@backstage/cli-common'; -export type GithubAuthConfig = { +type GithubAuthConfig = { auth: { providers: { github: { @@ -36,7 +36,7 @@ export type GithubAuthConfig = { /* eslint-disable-next-line no-restricted-syntax */ const { targetRoot } = findPaths(__dirname); const APP_CONFIG_FILE = path.join(targetRoot, 'app-config.local.yaml'); -const ENV_CONFIG_FILE = path.join(targetRoot, '.env.development'); +const ENV_CONFIG_FILE = path.join(targetRoot, '.env.local'); const readConfigFile = async (file: string) => { return yaml.parse(await fs.readFile(file, 'utf8')); @@ -56,10 +56,10 @@ export const updateConfigFile = async (config: GithubAuthConfig) => { ); }; -export const updateEnvFile = async (config: GithubAuthConfig) => { +export const updateEnvFile = async (clientId: string, clientSecret: string) => { const content = ` -AUTH_GITHUB_CLIENT_ID=${config.auth.providers.github.development.clientId} -AUTH_GITHUB_CLIENT_SECRET=${config.auth.providers.github.development.clientId}`; +AUTH_GITHUB_CLIENT_ID=${clientId} +AUTH_GITHUB_CLIENT_SECRET=${clientSecret}`; if (fs.existsSync(ENV_CONFIG_FILE)) { await fs.appendFile(ENV_CONFIG_FILE, content, 'utf8'); diff --git a/packages/cli/src/commands/admin/auth/github/app.ts b/packages/cli/src/commands/admin/auth/github/app.ts index 234f8d1e29..8ab067989f 100644 --- a/packages/cli/src/commands/admin/auth/github/app.ts +++ b/packages/cli/src/commands/admin/auth/github/app.ts @@ -16,9 +16,10 @@ import chalk from 'chalk'; import inquirer from 'inquirer'; import { adminCli } from '../../../create-github-app'; +import { updateConfigFile, updateEnvFile } from '../file'; // TODO(tudi2d): Wrapper for admin CLI around `create-github-app` - potentially to be removed -export const app = async () => { +export const app = async (useEnvForSecrets: boolean) => { // TODO(tudi2d): Make the GitHub Org optional const input = await inquirer.prompt<{ org: string }>([ { @@ -27,5 +28,14 @@ export const app = async () => { message: chalk.blue('Enter a GitHub Org [required]'), }, ]); - return await adminCli(input.org); + + const { auth } = await adminCli(input.org); + + await updateConfigFile({ auth }); + if (useEnvForSecrets) { + await updateEnvFile( + auth.providers.github.development.clientId, + auth.providers.github.development.clientSecret, + ); + } }; diff --git a/packages/cli/src/commands/admin/auth/github/index.ts b/packages/cli/src/commands/admin/auth/github/index.ts index 8ea7e63bc9..f8348d554d 100644 --- a/packages/cli/src/commands/admin/auth/github/index.ts +++ b/packages/cli/src/commands/admin/auth/github/index.ts @@ -15,7 +15,6 @@ */ import inquirer from 'inquirer'; -import { GithubAuthConfig, updateConfigFile, updateEnvFile } from '../file'; import { app } from './app'; import { oauth } from './oauth'; @@ -42,20 +41,12 @@ export const github = async () => { switch (type) { case 'GitHub OAuth': { - const config: GithubAuthConfig = await oauth(useEnvForSecrets); - await updateConfigFile(config); - if (useEnvForSecrets) { - await updateEnvFile(config); - } + await oauth(useEnvForSecrets); break; } case 'GitHub App': { - const { auth }: GithubAuthConfig = await app(); // TODO(tudi2d): Also change integrations - await updateConfigFile({ auth }); - if (useEnvForSecrets) { - await updateEnvFile({ auth }); - } + await app(useEnvForSecrets); break; } default: diff --git a/packages/cli/src/commands/admin/auth/github/oauth.ts b/packages/cli/src/commands/admin/auth/github/oauth.ts index 4daccdfd8c..159592bc2c 100644 --- a/packages/cli/src/commands/admin/auth/github/oauth.ts +++ b/packages/cli/src/commands/admin/auth/github/oauth.ts @@ -18,6 +18,7 @@ import { OAuthApp } from '@octokit/oauth-app'; import chalk from 'chalk'; import inquirer from 'inquirer'; import { Task } from '../../../../lib/tasks'; +import { updateConfigFile, updateEnvFile } from '../file'; const validateCredentials = async (clientId: string, clientSecret: string) => { try { @@ -44,7 +45,7 @@ const validateCredentials = async (clientId: string, clientSecret: string) => { } }; -export const oauth = async (useEnvForSecrets?: boolean) => { +export const oauth = async (useEnvForSecrets: boolean) => { Task.log(` To add GitHub authentication, you must create an OAuth App from the GitHub developer settings: ${chalk.blue( 'https://github.com/settings/developers', @@ -94,23 +95,26 @@ export const oauth = async (useEnvForSecrets?: boolean) => { await validateCredentials(answers.clientId, answers.clientSecret); - return { - auth: { - providers: { - github: { - development: { - clientId: useEnvForSecrets - ? '${AUTH_GITHUB_CLIENT_ID}' - : answers.clientId, - clientSecret: useEnvForSecrets - ? '${AUTH_GITHUB_CLIENT_SECRET}' - : answers.clientSecret, - ...(answers.hasGithubEnterprise && { - enterpriseInstanceUrl: answers.enterpriseInstanceUrl, - }), - }, + const auth = { + providers: { + github: { + development: { + clientId: useEnvForSecrets + ? '${AUTH_GITHUB_CLIENT_ID}' + : answers.clientId, + clientSecret: useEnvForSecrets + ? '${AUTH_GITHUB_CLIENT_SECRET}' + : answers.clientSecret, + ...(answers.hasGithubEnterprise && { + enterpriseInstanceUrl: answers.enterpriseInstanceUrl, + }), }, }, }, }; + + await updateConfigFile({ auth }); + if (useEnvForSecrets) { + await updateEnvFile(answers.clientId, answers.clientSecret); + } }; From 67c693c6b2b38f7131ae1a4f942f94d89bae8f4c Mon Sep 17 00:00:00 2001 From: Marcus Eide Date: Thu, 16 Feb 2023 13:50:56 +0100 Subject: [PATCH 060/177] cli: Add ability to patch existing files Signed-off-by: Marcus Eide --- .../admin/auth/{file.ts => config.ts} | 32 ++++---- packages/cli/src/commands/admin/auth/files.ts | 34 +++++++++ .../cli/src/commands/admin/auth/github/app.ts | 11 ++- .../src/commands/admin/auth/github/diffs.ts | 76 +++++++++++++++++++ .../src/commands/admin/auth/github/index.ts | 3 +- .../src/commands/admin/auth/github/oauth.ts | 38 ++++++---- packages/cli/src/commands/admin/auth/patch.ts | 25 ++++++ 7 files changed, 184 insertions(+), 35 deletions(-) rename packages/cli/src/commands/admin/auth/{file.ts => config.ts} (59%) create mode 100644 packages/cli/src/commands/admin/auth/files.ts create mode 100644 packages/cli/src/commands/admin/auth/github/diffs.ts create mode 100644 packages/cli/src/commands/admin/auth/patch.ts diff --git a/packages/cli/src/commands/admin/auth/file.ts b/packages/cli/src/commands/admin/auth/config.ts similarity index 59% rename from packages/cli/src/commands/admin/auth/file.ts rename to packages/cli/src/commands/admin/auth/config.ts index baafacc8c6..d358e8e89d 100644 --- a/packages/cli/src/commands/admin/auth/file.ts +++ b/packages/cli/src/commands/admin/auth/config.ts @@ -14,10 +14,8 @@ * limitations under the License. */ -import * as path from 'path'; import * as fs from 'fs-extra'; import yaml from 'yaml'; -import { findPaths } from '@backstage/cli-common'; type GithubAuthConfig = { auth: { @@ -33,22 +31,20 @@ type GithubAuthConfig = { }; }; -/* eslint-disable-next-line no-restricted-syntax */ -const { targetRoot } = findPaths(__dirname); -const APP_CONFIG_FILE = path.join(targetRoot, 'app-config.local.yaml'); -const ENV_CONFIG_FILE = path.join(targetRoot, '.env.local'); - -const readConfigFile = async (file: string) => { +const readYaml = async (file: string) => { return yaml.parse(await fs.readFile(file, 'utf8')); }; -export const updateConfigFile = async (config: GithubAuthConfig) => { - const content = fs.existsSync(APP_CONFIG_FILE) - ? { ...(await readConfigFile(APP_CONFIG_FILE)), ...config } +export const updateConfigFile = async ( + file: string, + config: GithubAuthConfig, +) => { + const content = fs.existsSync(file) + ? { ...(await readYaml(file)), ...config } : config; return await fs.writeFile( - APP_CONFIG_FILE, + file, yaml.stringify(content, { indent: 2, }), @@ -56,14 +52,18 @@ export const updateConfigFile = async (config: GithubAuthConfig) => { ); }; -export const updateEnvFile = async (clientId: string, clientSecret: string) => { +export const updateEnvFile = async ( + file: string, + clientId: string, + clientSecret: string, +) => { const content = ` AUTH_GITHUB_CLIENT_ID=${clientId} AUTH_GITHUB_CLIENT_SECRET=${clientSecret}`; - if (fs.existsSync(ENV_CONFIG_FILE)) { - await fs.appendFile(ENV_CONFIG_FILE, content, 'utf8'); + if (fs.existsSync(file)) { + return await fs.appendFile(file, content, 'utf8'); } - return await fs.writeFile(ENV_CONFIG_FILE, content, 'utf8'); + return await fs.writeFile(file, content, 'utf8'); }; diff --git a/packages/cli/src/commands/admin/auth/files.ts b/packages/cli/src/commands/admin/auth/files.ts new file mode 100644 index 0000000000..479cda0472 --- /dev/null +++ b/packages/cli/src/commands/admin/auth/files.ts @@ -0,0 +1,34 @@ +/* + * Copyright 2023 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { findPaths } from '@backstage/cli-common'; +import * as path from 'path'; + +/* eslint-disable-next-line no-restricted-syntax */ +const { targetRoot, resolveTargetRoot } = findPaths(__dirname); +export const APP_CONFIG_FILE = path.join(targetRoot, 'app-config.local.yaml'); +export const ENV_CONFIG_FILE = path.join(targetRoot, '.env.local'); +export const APP_TSX_FILE = path.join( + resolveTargetRoot('packages/app'), + 'src', + 'App.tsx', +); +export const AUTH_BACKEND_PLUGIN_FILE = path.join( + resolveTargetRoot('packages/backend'), + 'src', + 'plugins', + 'auth.ts', +); diff --git a/packages/cli/src/commands/admin/auth/github/app.ts b/packages/cli/src/commands/admin/auth/github/app.ts index 8ab067989f..d78fe2a3d2 100644 --- a/packages/cli/src/commands/admin/auth/github/app.ts +++ b/packages/cli/src/commands/admin/auth/github/app.ts @@ -13,10 +13,11 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import chalk from 'chalk'; + import inquirer from 'inquirer'; import { adminCli } from '../../../create-github-app'; -import { updateConfigFile, updateEnvFile } from '../file'; +import { updateConfigFile, updateEnvFile } from '../config'; +import { APP_CONFIG_FILE, ENV_CONFIG_FILE } from '../files'; // TODO(tudi2d): Wrapper for admin CLI around `create-github-app` - potentially to be removed export const app = async (useEnvForSecrets: boolean) => { @@ -25,15 +26,17 @@ export const app = async (useEnvForSecrets: boolean) => { { type: 'input', name: 'org', - message: chalk.blue('Enter a GitHub Org [required]'), + message: 'Enter a GitHub Org [required]', }, ]); const { auth } = await adminCli(input.org); - await updateConfigFile({ auth }); + // TODO(tudi2d): Also change integrations + await updateConfigFile(APP_CONFIG_FILE, { auth }); if (useEnvForSecrets) { await updateEnvFile( + ENV_CONFIG_FILE, auth.providers.github.development.clientId, auth.providers.github.development.clientSecret, ); diff --git a/packages/cli/src/commands/admin/auth/github/diffs.ts b/packages/cli/src/commands/admin/auth/github/diffs.ts new file mode 100644 index 0000000000..43b6013d4e --- /dev/null +++ b/packages/cli/src/commands/admin/auth/github/diffs.ts @@ -0,0 +1,76 @@ +/* + * Copyright 2023 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +export const addSignInPageDiff = + '@@ -32,11 +32,27 @@\n' + + " import { AppRouter, FlatRoutes } from '@backstage/core-app-api';\n" + + " import { CatalogGraphPage } from '@backstage/plugin-catalog-graph';\n" + + " import { RequirePermission } from '@backstage/plugin-permission-react';\n" + + " import { catalogEntityCreatePermission } from '@backstage/plugin-catalog-common/alpha';\n" + + "+import { githubAuthApiRef } from '@backstage/core-plugin-api';\n" + + "+import { SignInPage } from '@backstage/core-components';\n" + + ' \n' + + ' const app = createApp({\n' + + ' apis,\n' + + '+ components: {\n' + + '+ SignInPage: props => (\n' + + '+ \n' + + '+ ),\n' + + '+ },\n' + + ' bindRoutes({ bind }) {\n' + + ' bind(catalogPlugin.externalRoutes, {\n' + + ' createComponent: scaffolderPlugin.routes.root,\n' + + ' viewTechDoc: techdocsPlugin.routes.docRoot,\n'; + +export const replaceSignInResolverDiff = + '@@ -36,18 +36,18 @@\n' + + ' //\n' + + ' // https://backstage.io/docs/auth/identity-resolver\n' + + ' github: providers.github.create({\n' + + ' signIn: {\n' + + '- resolver(_, ctx) {\n' + + "- const userRef = 'user:default/guest'; // Must be a full entity reference\n" + + '- return ctx.issueToken({\n' + + '- claims: {\n' + + "- sub: userRef, // The user's own identity\n" + + '- ent: [userRef], // A list of identities that the user claims ownership through\n' + + '- },\n' + + '- });\n' + + '- },\n' + + '- // resolver: providers.github.resolvers.usernameMatchingUserEntityName(),\n' + + '+ // resolver(_, ctx) {\n' + + "+ // const userRef = 'user:default/guest'; // Must be a full entity reference\n" + + '+ // return ctx.issueToken({\n' + + '+ // claims: {\n' + + "+ // sub: userRef, // The user's own identity\n" + + '+ // ent: [userRef], // A list of identities that the user claims ownership through\n' + + '+ // },\n' + + '+ // });\n' + + '+ // },\n' + + '+ resolver: providers.github.resolvers.usernameMatchingUserEntityName(),\n' + + ' },\n' + + ' }),\n' + + ' },\n' + + ' });\n'; diff --git a/packages/cli/src/commands/admin/auth/github/index.ts b/packages/cli/src/commands/admin/auth/github/index.ts index f8348d554d..d140b98dd3 100644 --- a/packages/cli/src/commands/admin/auth/github/index.ts +++ b/packages/cli/src/commands/admin/auth/github/index.ts @@ -32,7 +32,7 @@ export const github = async () => { { type: 'list', name: 'type', - message: 'Do you want to use a Github App or a Github OAuth?', + message: 'Do you want to use a Github App or Github OAuth?', choices: ['GitHub OAuth', 'GitHub App'], }, ]); @@ -45,7 +45,6 @@ export const github = async () => { break; } case 'GitHub App': { - // TODO(tudi2d): Also change integrations await app(useEnvForSecrets); break; } diff --git a/packages/cli/src/commands/admin/auth/github/oauth.ts b/packages/cli/src/commands/admin/auth/github/oauth.ts index 159592bc2c..27dbe24f74 100644 --- a/packages/cli/src/commands/admin/auth/github/oauth.ts +++ b/packages/cli/src/commands/admin/auth/github/oauth.ts @@ -18,7 +18,15 @@ import { OAuthApp } from '@octokit/oauth-app'; import chalk from 'chalk'; import inquirer from 'inquirer'; import { Task } from '../../../../lib/tasks'; -import { updateConfigFile, updateEnvFile } from '../file'; +import { updateConfigFile, updateEnvFile } from '../config'; +import { + APP_CONFIG_FILE, + APP_TSX_FILE, + AUTH_BACKEND_PLUGIN_FILE, + ENV_CONFIG_FILE, +} from '../files'; +import { patch } from '../patch'; +import { addSignInPageDiff, replaceSignInResolverDiff } from './diffs'; const validateCredentials = async (clientId: string, clientSecret: string) => { try { @@ -64,7 +72,7 @@ export const oauth = async (useEnvForSecrets: boolean) => { const answers = await inquirer.prompt<{ clientSecret: string; clientId: string; - hasGithubEnterprise: boolean; + hasEnterprise: boolean; enterpriseInstanceUrl?: string; }>([ { @@ -81,40 +89,44 @@ export const oauth = async (useEnvForSecrets: boolean) => { }, { type: 'confirm', - name: 'hasGithubEnterprise', + name: 'hasEnterprise', message: 'Are you using Github Enterprise?', }, { type: 'input', name: 'enterpriseInstanceUrl', message: 'What is your URL for Github Enterprise?', - when: ({ hasGithubEnterprise }) => hasGithubEnterprise, + when: ({ hasEnterprise }) => hasEnterprise, validate: (input: string) => Boolean(new URL(input)), }, ]); - await validateCredentials(answers.clientId, answers.clientSecret); + const { clientId, clientSecret, hasEnterprise, enterpriseInstanceUrl } = + answers; + + await validateCredentials(clientId, clientSecret); const auth = { providers: { github: { development: { - clientId: useEnvForSecrets - ? '${AUTH_GITHUB_CLIENT_ID}' - : answers.clientId, + clientId: useEnvForSecrets ? '${AUTH_GITHUB_CLIENT_ID}' : clientId, clientSecret: useEnvForSecrets ? '${AUTH_GITHUB_CLIENT_SECRET}' - : answers.clientSecret, - ...(answers.hasGithubEnterprise && { - enterpriseInstanceUrl: answers.enterpriseInstanceUrl, + : clientSecret, + ...(hasEnterprise && { + enterpriseInstanceUrl: enterpriseInstanceUrl, }), }, }, }, }; - await updateConfigFile({ auth }); + await updateConfigFile(APP_CONFIG_FILE, { auth }); if (useEnvForSecrets) { - await updateEnvFile(answers.clientId, answers.clientSecret); + await updateEnvFile(ENV_CONFIG_FILE, clientId, clientSecret); } + + await patch(APP_TSX_FILE, addSignInPageDiff); + await patch(AUTH_BACKEND_PLUGIN_FILE, replaceSignInResolverDiff); }; diff --git a/packages/cli/src/commands/admin/auth/patch.ts b/packages/cli/src/commands/admin/auth/patch.ts new file mode 100644 index 0000000000..2a4eccdb9e --- /dev/null +++ b/packages/cli/src/commands/admin/auth/patch.ts @@ -0,0 +1,25 @@ +/* + * Copyright 2023 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import * as fs from 'fs-extra'; +import * as differ from 'diff'; + +export const patch = async (file: string, diff: string) => { + const oldContent = await fs.readFile(file, 'utf8'); + const newContent = differ.applyPatch(oldContent, diff); + + return await fs.writeFile(file, newContent, 'utf8'); +}; From 2f851a3945de3e5bb80ffe15e7ecd939d72d67e3 Mon Sep 17 00:00:00 2001 From: Marcus Eide Date: Thu, 16 Feb 2023 14:05:16 +0100 Subject: [PATCH 061/177] cli: Add minimal instructions for how to try locally Signed-off-by: Marcus Eide --- packages/cli/src/commands/admin/README.md | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 packages/cli/src/commands/admin/README.md diff --git a/packages/cli/src/commands/admin/README.md b/packages/cli/src/commands/admin/README.md new file mode 100644 index 0000000000..d2a6e10256 --- /dev/null +++ b/packages/cli/src/commands/admin/README.md @@ -0,0 +1,23 @@ +# admin tool + +## Local dev + +```bash +# Checkout the branch +cd backstage +git fetch +git checkout goa/cli-admin-command + +# Create a new app +cd .. +npx @backstage/create-app +cd new-backstage-app + +# Run the modded cli in the new app +../github/backstage/packages/cli/bin/backstage-cli admin +? Do you want to set up Authentication for this project? (Y/n) +... + +# Try the app with the new changes +yarn dev +``` From 5663de4a3737d51615ceb5d2b5a9802fe21355a0 Mon Sep 17 00:00:00 2001 From: Marcus Eide Date: Thu, 16 Feb 2023 16:18:22 +0100 Subject: [PATCH 062/177] cli: Add user entity to local catalog in auth flow Signed-off-by: Marcus Eide --- .../cli/src/commands/admin/auth/config.ts | 31 +++++++ packages/cli/src/commands/admin/auth/files.ts | 2 + .../src/commands/admin/auth/github/oauth.ts | 86 +++++++++++++------ packages/cli/src/commands/admin/auth/index.ts | 2 + 4 files changed, 96 insertions(+), 25 deletions(-) diff --git a/packages/cli/src/commands/admin/auth/config.ts b/packages/cli/src/commands/admin/auth/config.ts index d358e8e89d..659c356360 100644 --- a/packages/cli/src/commands/admin/auth/config.ts +++ b/packages/cli/src/commands/admin/auth/config.ts @@ -29,6 +29,13 @@ type GithubAuthConfig = { }; }; }; + catalog?: { + locations: Array<{ + type: string; + target: string; + rules: Array<{ allow: Array }>; + }>; + }; }; const readYaml = async (file: string) => { @@ -67,3 +74,27 @@ AUTH_GITHUB_CLIENT_SECRET=${clientSecret}`; return await fs.writeFile(file, content, 'utf8'); }; + +export const addUserEntity = async (file: string, username: string) => { + const content = { + apiVersion: 'backstage.io/v1alpha1', + kind: 'User', + metadata: { + name: username, + annotations: { + 'github.com/user-login': username, + }, + }, + spec: { + memberOf: [], + }, + }; + + return await fs.writeFile( + file, + yaml.stringify(content, { + indent: 2, + }), + 'utf8', + ); +}; diff --git a/packages/cli/src/commands/admin/auth/files.ts b/packages/cli/src/commands/admin/auth/files.ts index 479cda0472..ad9b53a894 100644 --- a/packages/cli/src/commands/admin/auth/files.ts +++ b/packages/cli/src/commands/admin/auth/files.ts @@ -21,6 +21,8 @@ import * as path from 'path'; const { targetRoot, resolveTargetRoot } = findPaths(__dirname); export const APP_CONFIG_FILE = path.join(targetRoot, 'app-config.local.yaml'); export const ENV_CONFIG_FILE = path.join(targetRoot, '.env.local'); +export const USER_ENTITY_FILE = path.join(targetRoot, 'user-info.yaml'); + export const APP_TSX_FILE = path.join( resolveTargetRoot('packages/app'), 'src', diff --git a/packages/cli/src/commands/admin/auth/github/oauth.ts b/packages/cli/src/commands/admin/auth/github/oauth.ts index 27dbe24f74..64abf520cf 100644 --- a/packages/cli/src/commands/admin/auth/github/oauth.ts +++ b/packages/cli/src/commands/admin/auth/github/oauth.ts @@ -17,13 +17,15 @@ import { OAuthApp } from '@octokit/oauth-app'; import chalk from 'chalk'; import inquirer from 'inquirer'; +import fetch from 'node-fetch'; import { Task } from '../../../../lib/tasks'; -import { updateConfigFile, updateEnvFile } from '../config'; +import { addUserEntity, updateConfigFile, updateEnvFile } from '../config'; import { APP_CONFIG_FILE, APP_TSX_FILE, AUTH_BACKEND_PLUGIN_FILE, ENV_CONFIG_FILE, + USER_ENTITY_FILE, } from '../files'; import { patch } from '../patch'; import { addSignInPageDiff, replaceSignInResolverDiff } from './diffs'; @@ -53,6 +55,46 @@ const validateCredentials = async (clientId: string, clientSecret: string) => { } }; +const getConfig = (answers: Answers, useEnvForSecrets: boolean) => { + const { clientId, clientSecret, hasEnterprise, enterpriseInstanceUrl } = + answers; + + return { + auth: { + providers: { + github: { + development: { + clientId: useEnvForSecrets ? '${AUTH_GITHUB_CLIENT_ID}' : clientId, + clientSecret: useEnvForSecrets + ? '${AUTH_GITHUB_CLIENT_SECRET}' + : clientSecret, + ...(hasEnterprise && { + enterpriseInstanceUrl: enterpriseInstanceUrl, + }), + }, + }, + }, + }, + catalog: { + locations: [ + { + type: 'file', + target: '../../user-info.yaml', + rules: [{ allow: ['User'] }], + }, + ], + }, + }; +}; + +type Answers = { + username: string; + clientSecret: string; + clientId: string; + hasEnterprise: boolean; + enterpriseInstanceUrl?: string; +}; + export const oauth = async (useEnvForSecrets: boolean) => { Task.log(` To add GitHub authentication, you must create an OAuth App from the GitHub developer settings: ${chalk.blue( @@ -69,12 +111,19 @@ export const oauth = async (useEnvForSecrets: boolean) => { 'https://backstage.io/docs/auth/github/provider', )}`); - const answers = await inquirer.prompt<{ - clientSecret: string; - clientId: string; - hasEnterprise: boolean; - enterpriseInstanceUrl?: string; - }>([ + const answers = await inquirer.prompt([ + { + type: 'input', + name: 'username', + message: 'What is your Github username?', + validate: async (input: string) => { + const response = await fetch(`https://api.github.com/users/${input}`); + if (!response.ok) { + return chalk.red('Unknown user. Please try again.'); + } + return true; + }, + }, { type: 'input', name: 'clientId', @@ -101,32 +150,19 @@ export const oauth = async (useEnvForSecrets: boolean) => { }, ]); - const { clientId, clientSecret, hasEnterprise, enterpriseInstanceUrl } = - answers; + const { username, clientId, clientSecret } = answers; await validateCredentials(clientId, clientSecret); - const auth = { - providers: { - github: { - development: { - clientId: useEnvForSecrets ? '${AUTH_GITHUB_CLIENT_ID}' : clientId, - clientSecret: useEnvForSecrets - ? '${AUTH_GITHUB_CLIENT_SECRET}' - : clientSecret, - ...(hasEnterprise && { - enterpriseInstanceUrl: enterpriseInstanceUrl, - }), - }, - }, - }, - }; + const config = getConfig(answers, useEnvForSecrets); + await updateConfigFile(APP_CONFIG_FILE, config); - await updateConfigFile(APP_CONFIG_FILE, { auth }); if (useEnvForSecrets) { await updateEnvFile(ENV_CONFIG_FILE, clientId, clientSecret); } + await addUserEntity(USER_ENTITY_FILE, username); + await patch(APP_TSX_FILE, addSignInPageDiff); await patch(AUTH_BACKEND_PLUGIN_FILE, replaceSignInResolverDiff); }; diff --git a/packages/cli/src/commands/admin/auth/index.ts b/packages/cli/src/commands/admin/auth/index.ts index 9af145dcf3..ce39748b09 100644 --- a/packages/cli/src/commands/admin/auth/index.ts +++ b/packages/cli/src/commands/admin/auth/index.ts @@ -14,6 +14,7 @@ * limitations under the License. */ +import chalk from 'chalk'; import inquirer from 'inquirer'; import { Task } from '../../../lib/tasks'; import { github } from './github'; @@ -42,4 +43,5 @@ export async function auth(): Promise { } Task.log(`Done setting up ${provider}!`); + Task.log(`You can now start you app with ${chalk.inverse('yarn dev')}`); } From eaece17af0b751acc8b0c25a39a048e2eacd9647 Mon Sep 17 00:00:00 2001 From: Philipp Hugenroth Date: Mon, 20 Feb 2023 12:59:18 +0100 Subject: [PATCH 063/177] Remove GHA approach for now Signed-off-by: Philipp Hugenroth --- .../cli/src/commands/admin/auth/github/app.ts | 44 ------------------- .../src/commands/admin/auth/github/index.ts | 22 +--------- packages/cli/src/commands/admin/auth/index.ts | 4 +- 3 files changed, 4 insertions(+), 66 deletions(-) delete mode 100644 packages/cli/src/commands/admin/auth/github/app.ts diff --git a/packages/cli/src/commands/admin/auth/github/app.ts b/packages/cli/src/commands/admin/auth/github/app.ts deleted file mode 100644 index d78fe2a3d2..0000000000 --- a/packages/cli/src/commands/admin/auth/github/app.ts +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Copyright 2023 The Backstage Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import inquirer from 'inquirer'; -import { adminCli } from '../../../create-github-app'; -import { updateConfigFile, updateEnvFile } from '../config'; -import { APP_CONFIG_FILE, ENV_CONFIG_FILE } from '../files'; - -// TODO(tudi2d): Wrapper for admin CLI around `create-github-app` - potentially to be removed -export const app = async (useEnvForSecrets: boolean) => { - // TODO(tudi2d): Make the GitHub Org optional - const input = await inquirer.prompt<{ org: string }>([ - { - type: 'input', - name: 'org', - message: 'Enter a GitHub Org [required]', - }, - ]); - - const { auth } = await adminCli(input.org); - - // TODO(tudi2d): Also change integrations - await updateConfigFile(APP_CONFIG_FILE, { auth }); - if (useEnvForSecrets) { - await updateEnvFile( - ENV_CONFIG_FILE, - auth.providers.github.development.clientId, - auth.providers.github.development.clientSecret, - ); - } -}; diff --git a/packages/cli/src/commands/admin/auth/github/index.ts b/packages/cli/src/commands/admin/auth/github/index.ts index d140b98dd3..fa22cacef8 100644 --- a/packages/cli/src/commands/admin/auth/github/index.ts +++ b/packages/cli/src/commands/admin/auth/github/index.ts @@ -15,7 +15,6 @@ */ import inquirer from 'inquirer'; -import { app } from './app'; import { oauth } from './oauth'; export const github = async () => { @@ -29,26 +28,9 @@ export const github = async () => { message: 'Would you like to store sensitive configuration details such as secrets as environment variables? (recommended)', }, - { - type: 'list', - name: 'type', - message: 'Do you want to use a Github App or Github OAuth?', - choices: ['GitHub OAuth', 'GitHub App'], - }, ]); - const { type, useEnvForSecrets } = answers; + const { useEnvForSecrets } = answers; - switch (type) { - case 'GitHub OAuth': { - await oauth(useEnvForSecrets); - break; - } - case 'GitHub App': { - await app(useEnvForSecrets); - break; - } - default: - throw new Error(`Unknown selection: ${type}.`); - } + await oauth(useEnvForSecrets); }; diff --git a/packages/cli/src/commands/admin/auth/index.ts b/packages/cli/src/commands/admin/auth/index.ts index ce39748b09..ce8e55556b 100644 --- a/packages/cli/src/commands/admin/auth/index.ts +++ b/packages/cli/src/commands/admin/auth/index.ts @@ -27,14 +27,14 @@ export async function auth(): Promise { type: 'list', name: 'provider', message: 'Please select a provider:', - choices: ['Github'], + choices: ['GitHub'], }, ]); const { provider } = answers; switch (provider) { - case 'Github': { + case 'GitHub': { await github(); break; } From 0a60451b6f3816e7a0f234416f3a8085dbf98031 Mon Sep 17 00:00:00 2001 From: Philipp Hugenroth Date: Mon, 20 Feb 2023 13:08:35 +0100 Subject: [PATCH 064/177] Revert create-github-app changes Signed-off-by: Philipp Hugenroth --- .../GithubCreateAppServer.ts | 7 +- .../src/commands/create-github-app/index.ts | 161 +++++------------- 2 files changed, 48 insertions(+), 120 deletions(-) diff --git a/packages/cli/src/commands/create-github-app/GithubCreateAppServer.ts b/packages/cli/src/commands/create-github-app/GithubCreateAppServer.ts index cb2613c691..70b8c0ca53 100644 --- a/packages/cli/src/commands/create-github-app/GithubCreateAppServer.ts +++ b/packages/cli/src/commands/create-github-app/GithubCreateAppServer.ts @@ -33,7 +33,7 @@ const FORM_PAGE = ` `; -export type GithubAppConfig = { +type GithubAppConfig = { appId: number; slug?: string; name?: string; @@ -117,11 +117,8 @@ export class GithubCreateAppServer { ...(this.permissions.includes('members') && { members: 'read' }), ...(this.permissions.includes('read') && { contents: 'read' }), ...(this.permissions.includes('write') && { - administration: 'write', contents: 'write', - pull_requests: 'write', - issues: 'write', - workflows: 'write', + actions: 'write', }), }, name: 'Backstage-', diff --git a/packages/cli/src/commands/create-github-app/index.ts b/packages/cli/src/commands/create-github-app/index.ts index 606e982bd4..6b3e732f18 100644 --- a/packages/cli/src/commands/create-github-app/index.ts +++ b/packages/cli/src/commands/create-github-app/index.ts @@ -14,26 +14,61 @@ * limitations under the License. */ -import chalk from 'chalk'; import fs from 'fs-extra'; -import inquirer, { Question } from 'inquirer'; -import fetch from 'node-fetch'; -import openBrowser from 'react-dev-utils/openBrowser'; +import chalk from 'chalk'; import { stringify as stringifyYaml } from 'yaml'; -import { GithubAppConfig } from '@backstage/integration'; - +import inquirer, { Question, Answers } from 'inquirer'; import { paths } from '../../lib/paths'; import { GithubCreateAppServer } from './GithubCreateAppServer'; - +import fetch from 'node-fetch'; +import openBrowser from 'react-dev-utils/openBrowser'; // This is an experimental command that at this point does not support GitHub Enterprise // due to lacking support for creating apps from manifests. // https://docs.github.com/en/free-pro-team@latest/developers/apps/creating-a-github-app-from-a-manifest export default async (org: string) => { - // TODO(tudi2d): Why is the Org check not done here? - const answers = await permissionAnswers(); - await verifyGithubOrg(org); - const { fileName } = await createGHAYaml(org, answers.appType); + const answers: Answers = await inquirer.prompt({ + name: 'appType', + type: 'checkbox', + message: + 'Select permissions [required] (these can be changed later but then require approvals in all installations)', + choices: [ + { + name: 'Read access to content (required by Software Catalog to ingest data from repositories)', + value: 'read', + checked: true, + }, + { + name: 'Read access to members (required by Software Catalog to ingest GitHub teams)', + value: 'members', + checked: true, + }, + { + name: 'Read and Write to content and actions (required by Software Templates to create new repositories)', + value: 'write', + }, + ], + }); + if (answers.appType.length === 0) { + console.log(chalk.red('You must select at least one permission')); + process.exit(1); + } + + await verifyGithubOrg(org); + const { slug, name, ...config } = await GithubCreateAppServer.run({ + org, + permissions: answers.appType, + }); + + const fileName = `github-app-${slug}-credentials.yaml`; + const content = `# Name: ${name}\n${stringifyYaml(config)}`; + await fs.writeFile(paths.resolveTargetRoot(fileName), content); + console.log(`GitHub App configuration written to ${chalk.cyan(fileName)}`); + console.log( + chalk.yellow( + 'This file contains sensitive credentials, it should not be committed to version control and handled with care!', + ), + ); console.log( "Here's an example on how to update the integrations section in app-config.yaml", ); @@ -47,44 +82,6 @@ integrations: ); }; -/** - * - * @param org string: GitHub Organisation - * @returns Promise: Partial App Config for Admin CLI - */ -export async function adminCli(org: string) { - await verifyGithubOrg(org); - const answers = await permissionAnswers({ - read: true, - members: true, - write: true, - }); - const { fileName, config } = await createGHAYaml(org, answers.appType); - const auth = { - providers: { - github: { - development: { - clientId: config.clientId, - clientSecret: config.clientSecret, - }, - }, - }, - }; - const integration = { - github: { - host: 'github.com', - apps: { - $include: `${fileName}`, - }, - }, - }; - - return { - auth, - integration, - }; -} - async function verifyGithubOrg(org: string): Promise { let response; @@ -123,7 +120,6 @@ async function verifyGithubOrg(org: string): Promise { openBrowser('https://github.com/account/organizations/new'); - // TODO(tudi2d): Could we maybe re-run the command rather than exit? console.log( chalk.yellow( 'Please re-run this command when you have created your new organization', @@ -133,68 +129,3 @@ async function verifyGithubOrg(org: string): Promise { process.exit(0); } } - -async function permissionAnswers( - checked: { read: boolean; members: boolean; write: boolean } = { - read: true, - members: true, - write: false, - }, -) { - const answers = await inquirer.prompt<{ appType: string[] }>({ - name: 'appType', - type: 'checkbox', - message: - 'Select permissions [required] (these can be changed later but then require approvals in all installations)', - choices: [ - { - name: 'Read access to content (required by Software Catalog to ingest data from repositories)', - value: 'read', - checked: checked.read, - }, - { - name: 'Read access to members (required by Software Catalog to ingest GitHub teams)', - value: 'members', - checked: checked.members, - }, - { - name: 'Read and Write to content and actions (required by Software Templates to create new repositories)', - value: 'write', - checked: checked.write, - }, - ], - }); - - if (answers.appType.length === 0) { - console.log(chalk.red('You must select at least one permission')); - // TODO(tudi2d): Maybe re-do input rather than exit? - process.exit(1); - } - - return answers; -} - -async function createGHAYaml( - org: string, - permissions: string[], -): Promise<{ fileName: string; config: GithubAppConfig }> { - const { slug, name, ...config } = await GithubCreateAppServer.run({ - org, - permissions, - }); - - const fileName = `github-app-${slug}-credentials.yaml`; - const content = `# Name: ${name}\n${stringifyYaml(config)}`; - await fs.writeFile(paths.resolveTargetRoot(fileName), content); - console.log(`GitHub App configuration written to ${chalk.cyan(fileName)}`); - console.log( - chalk.yellow( - 'This file contains sensitive credentials, it should not be committed to version control and handled with care!', - ), - ); - - return { - fileName, - config, - }; -} From ed89e409653ab678f1191c9d67ee4faf7d3de2f7 Mon Sep 17 00:00:00 2001 From: Marcus Eide Date: Mon, 20 Feb 2023 14:44:48 +0100 Subject: [PATCH 065/177] cli: Use .patch files instead Signed-off-by: Marcus Eide --- packages/cli/src/commands/admin/auth/files.ts | 20 ++++- .../src/commands/admin/auth/github/diffs.ts | 76 ------------------- .../src/commands/admin/auth/github/oauth.ts | 57 ++++++++++---- packages/cli/src/commands/admin/auth/index.ts | 4 +- packages/cli/src/commands/admin/auth/patch.ts | 5 +- .../auth/patches/01-github.App.tsx.patch | 24 ++++++ .../auth/patches/02-github.auth.ts.patch | 12 +++ 7 files changed, 100 insertions(+), 98 deletions(-) delete mode 100644 packages/cli/src/commands/admin/auth/github/diffs.ts create mode 100644 packages/cli/src/commands/admin/auth/patches/01-github.App.tsx.patch create mode 100644 packages/cli/src/commands/admin/auth/patches/02-github.auth.ts.patch diff --git a/packages/cli/src/commands/admin/auth/files.ts b/packages/cli/src/commands/admin/auth/files.ts index ad9b53a894..166538335f 100644 --- a/packages/cli/src/commands/admin/auth/files.ts +++ b/packages/cli/src/commands/admin/auth/files.ts @@ -18,19 +18,33 @@ import { findPaths } from '@backstage/cli-common'; import * as path from 'path'; /* eslint-disable-next-line no-restricted-syntax */ -const { targetRoot, resolveTargetRoot } = findPaths(__dirname); +const { targetRoot, ownDir, resolveTargetRoot } = findPaths(__dirname); export const APP_CONFIG_FILE = path.join(targetRoot, 'app-config.local.yaml'); export const ENV_CONFIG_FILE = path.join(targetRoot, '.env.local'); export const USER_ENTITY_FILE = path.join(targetRoot, 'user-info.yaml'); -export const APP_TSX_FILE = path.join( +const APP_TSX_FILE = path.join( resolveTargetRoot('packages/app'), 'src', 'App.tsx', ); -export const AUTH_BACKEND_PLUGIN_FILE = path.join( +const AUTH_BACKEND_PLUGIN_FILE = path.join( resolveTargetRoot('packages/backend'), 'src', 'plugins', 'auth.ts', ); + +export const PATCH_FOLDER = path.join( + ownDir, + 'src', + 'commands', + 'admin', + 'auth', + 'patches', +); + +export const patchMap: Record = { + 'App.tsx': APP_TSX_FILE, + 'auth.ts': AUTH_BACKEND_PLUGIN_FILE, +}; diff --git a/packages/cli/src/commands/admin/auth/github/diffs.ts b/packages/cli/src/commands/admin/auth/github/diffs.ts deleted file mode 100644 index 43b6013d4e..0000000000 --- a/packages/cli/src/commands/admin/auth/github/diffs.ts +++ /dev/null @@ -1,76 +0,0 @@ -/* - * Copyright 2023 The Backstage Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -export const addSignInPageDiff = - '@@ -32,11 +32,27 @@\n' + - " import { AppRouter, FlatRoutes } from '@backstage/core-app-api';\n" + - " import { CatalogGraphPage } from '@backstage/plugin-catalog-graph';\n" + - " import { RequirePermission } from '@backstage/plugin-permission-react';\n" + - " import { catalogEntityCreatePermission } from '@backstage/plugin-catalog-common/alpha';\n" + - "+import { githubAuthApiRef } from '@backstage/core-plugin-api';\n" + - "+import { SignInPage } from '@backstage/core-components';\n" + - ' \n' + - ' const app = createApp({\n' + - ' apis,\n' + - '+ components: {\n' + - '+ SignInPage: props => (\n' + - '+ \n' + - '+ ),\n' + - '+ },\n' + - ' bindRoutes({ bind }) {\n' + - ' bind(catalogPlugin.externalRoutes, {\n' + - ' createComponent: scaffolderPlugin.routes.root,\n' + - ' viewTechDoc: techdocsPlugin.routes.docRoot,\n'; - -export const replaceSignInResolverDiff = - '@@ -36,18 +36,18 @@\n' + - ' //\n' + - ' // https://backstage.io/docs/auth/identity-resolver\n' + - ' github: providers.github.create({\n' + - ' signIn: {\n' + - '- resolver(_, ctx) {\n' + - "- const userRef = 'user:default/guest'; // Must be a full entity reference\n" + - '- return ctx.issueToken({\n' + - '- claims: {\n' + - "- sub: userRef, // The user's own identity\n" + - '- ent: [userRef], // A list of identities that the user claims ownership through\n' + - '- },\n' + - '- });\n' + - '- },\n' + - '- // resolver: providers.github.resolvers.usernameMatchingUserEntityName(),\n' + - '+ // resolver(_, ctx) {\n' + - "+ // const userRef = 'user:default/guest'; // Must be a full entity reference\n" + - '+ // return ctx.issueToken({\n' + - '+ // claims: {\n' + - "+ // sub: userRef, // The user's own identity\n" + - '+ // ent: [userRef], // A list of identities that the user claims ownership through\n' + - '+ // },\n' + - '+ // });\n' + - '+ // },\n' + - '+ resolver: providers.github.resolvers.usernameMatchingUserEntityName(),\n' + - ' },\n' + - ' }),\n' + - ' },\n' + - ' });\n'; diff --git a/packages/cli/src/commands/admin/auth/github/oauth.ts b/packages/cli/src/commands/admin/auth/github/oauth.ts index 64abf520cf..fe05b6431a 100644 --- a/packages/cli/src/commands/admin/auth/github/oauth.ts +++ b/packages/cli/src/commands/admin/auth/github/oauth.ts @@ -18,17 +18,18 @@ import { OAuthApp } from '@octokit/oauth-app'; import chalk from 'chalk'; import inquirer from 'inquirer'; import fetch from 'node-fetch'; +import * as fs from 'fs-extra'; +import * as path from 'path'; import { Task } from '../../../../lib/tasks'; import { addUserEntity, updateConfigFile, updateEnvFile } from '../config'; import { APP_CONFIG_FILE, - APP_TSX_FILE, - AUTH_BACKEND_PLUGIN_FILE, ENV_CONFIG_FILE, + patchMap, + PATCH_FOLDER, USER_ENTITY_FILE, } from '../files'; import { patch } from '../patch'; -import { addSignInPageDiff, replaceSignInResolverDiff } from './diffs'; const validateCredentials = async (clientId: string, clientSecret: string) => { try { @@ -50,7 +51,7 @@ const validateCredentials = async (clientId: string, clientSecret: string) => { error.response.status !== 200 && error.response.data.error !== 'bad_verification_code' ) { - throw new Error(`Validating Github Credentials failed.`); + throw new Error(`Validating GitHub Credentials failed.`); } } }; @@ -109,13 +110,14 @@ export const oauth = async (useEnvForSecrets: boolean) => { You can find the full documentation page here: ${chalk.blue( 'https://backstage.io/docs/auth/github/provider', - )}`); + )} + `); const answers = await inquirer.prompt([ { type: 'input', name: 'username', - message: 'What is your Github username?', + message: 'What is your GitHub username?', validate: async (input: string) => { const response = await fetch(`https://api.github.com/users/${input}`); if (!response.ok) { @@ -139,30 +141,53 @@ export const oauth = async (useEnvForSecrets: boolean) => { { type: 'confirm', name: 'hasEnterprise', - message: 'Are you using Github Enterprise?', + message: 'Are you using GitHub Enterprise?', }, { type: 'input', name: 'enterpriseInstanceUrl', - message: 'What is your URL for Github Enterprise?', + message: 'What is your URL for GitHub Enterprise?', when: ({ hasEnterprise }) => hasEnterprise, validate: (input: string) => Boolean(new URL(input)), }, ]); const { username, clientId, clientSecret } = answers; - - await validateCredentials(clientId, clientSecret); - const config = getConfig(answers, useEnvForSecrets); - await updateConfigFile(APP_CONFIG_FILE, config); + Task.log('Setting up GitHub Authentication for you...'); + + await Task.forItem( + 'Validating', + 'credentials', + async () => await validateCredentials(clientId, clientSecret), + ); + await Task.forItem( + 'Updating', + APP_CONFIG_FILE, + async () => await updateConfigFile(APP_CONFIG_FILE, config), + ); if (useEnvForSecrets) { - await updateEnvFile(ENV_CONFIG_FILE, clientId, clientSecret); + await Task.forItem( + 'Updating', + ENV_CONFIG_FILE, + async () => await updateEnvFile(ENV_CONFIG_FILE, clientId, clientSecret), + ); } + await Task.forItem( + 'Creating', + USER_ENTITY_FILE, + async () => await addUserEntity(USER_ENTITY_FILE, username), + ); - await addUserEntity(USER_ENTITY_FILE, username); + const patches = await fs.readdir(PATCH_FOLDER); + for (const patchFile of patches) { + const target = patchFile + .replace(/[0-9]+-github\./, '') + .replace('.patch', ''); - await patch(APP_TSX_FILE, addSignInPageDiff); - await patch(AUTH_BACKEND_PLUGIN_FILE, replaceSignInResolverDiff); + await Task.forItem('Pactching', target, async () => { + await patch(patchMap[target], path.join(PATCH_FOLDER, patchFile)); + }); + } }; diff --git a/packages/cli/src/commands/admin/auth/index.ts b/packages/cli/src/commands/admin/auth/index.ts index ce8e55556b..728a2ffc2c 100644 --- a/packages/cli/src/commands/admin/auth/index.ts +++ b/packages/cli/src/commands/admin/auth/index.ts @@ -43,5 +43,7 @@ export async function auth(): Promise { } Task.log(`Done setting up ${provider}!`); - Task.log(`You can now start you app with ${chalk.inverse('yarn dev')}`); + Task.log( + `You can now start you app with ${chalk.inverse(chalk.italic('yarn dev'))}`, + ); } diff --git a/packages/cli/src/commands/admin/auth/patch.ts b/packages/cli/src/commands/admin/auth/patch.ts index 2a4eccdb9e..cf466f9408 100644 --- a/packages/cli/src/commands/admin/auth/patch.ts +++ b/packages/cli/src/commands/admin/auth/patch.ts @@ -17,9 +17,10 @@ import * as fs from 'fs-extra'; import * as differ from 'diff'; -export const patch = async (file: string, diff: string) => { +export const patch = async (file: string, patchFile: string) => { + const patchContent = await fs.readFile(patchFile, 'utf8'); const oldContent = await fs.readFile(file, 'utf8'); - const newContent = differ.applyPatch(oldContent, diff); + const newContent = differ.applyPatch(oldContent, patchContent); return await fs.writeFile(file, newContent, 'utf8'); }; diff --git a/packages/cli/src/commands/admin/auth/patches/01-github.App.tsx.patch b/packages/cli/src/commands/admin/auth/patches/01-github.App.tsx.patch new file mode 100644 index 0000000000..a7e0c150a5 --- /dev/null +++ b/packages/cli/src/commands/admin/auth/patches/01-github.App.tsx.patch @@ -0,0 +1,24 @@ +@@ -30 +30,5 @@ import { Root } from './components/Root'; +-import { AlertDisplay, OAuthRequestDialog } from '@backstage/core-components'; ++import { ++ AlertDisplay, ++ OAuthRequestDialog, ++ SignInPage, ++} from '@backstage/core-components'; +@@ -35,0 +40 @@ import { catalogEntityCreatePermission } from '@backstage/plugin-catalog-common/ ++import { githubAuthApiRef } from '@backstage/core-plugin-api'; +@@ -38,0 +44,14 @@ const app = createApp({ ++ components: { ++ SignInPage: props => ( ++ ++ ), ++ }, \ No newline at end of file diff --git a/packages/cli/src/commands/admin/auth/patches/02-github.auth.ts.patch b/packages/cli/src/commands/admin/auth/patches/02-github.auth.ts.patch new file mode 100644 index 0000000000..e6e65e7b74 --- /dev/null +++ b/packages/cli/src/commands/admin/auth/patches/02-github.auth.ts.patch @@ -0,0 +1,12 @@ +@@ -40,10 +40 @@ export default async function createPlugin( +- resolver(_, ctx) { +- const userRef = 'user:default/guest'; // Must be a full entity reference +- return ctx.issueToken({ +- claims: { +- sub: userRef, // The user's own identity +- ent: [userRef], // A list of identities that the user claims ownership through +- }, +- }); +- }, +- // resolver: providers.github.resolvers.usernameMatchingUserEntityName(), ++ resolver: providers.github.resolvers.usernameMatchingUserEntityName(), \ No newline at end of file From 20fc4735683b51bb81714757d018d31f6448b3d6 Mon Sep 17 00:00:00 2001 From: Philipp Hugenroth Date: Tue, 21 Feb 2023 13:22:57 +0100 Subject: [PATCH 066/177] Don't use environment variables Signed-off-by: Philipp Hugenroth --- .../cli/src/commands/admin/auth/config.ts | 16 ------------ packages/cli/src/commands/admin/auth/files.ts | 1 - .../src/commands/admin/auth/github/index.ts | 19 +------------- .../src/commands/admin/auth/github/oauth.ts | 26 ++++++------------- 4 files changed, 9 insertions(+), 53 deletions(-) diff --git a/packages/cli/src/commands/admin/auth/config.ts b/packages/cli/src/commands/admin/auth/config.ts index 659c356360..54c103cdf8 100644 --- a/packages/cli/src/commands/admin/auth/config.ts +++ b/packages/cli/src/commands/admin/auth/config.ts @@ -59,22 +59,6 @@ export const updateConfigFile = async ( ); }; -export const updateEnvFile = async ( - file: string, - clientId: string, - clientSecret: string, -) => { - const content = ` -AUTH_GITHUB_CLIENT_ID=${clientId} -AUTH_GITHUB_CLIENT_SECRET=${clientSecret}`; - - if (fs.existsSync(file)) { - return await fs.appendFile(file, content, 'utf8'); - } - - return await fs.writeFile(file, content, 'utf8'); -}; - export const addUserEntity = async (file: string, username: string) => { const content = { apiVersion: 'backstage.io/v1alpha1', diff --git a/packages/cli/src/commands/admin/auth/files.ts b/packages/cli/src/commands/admin/auth/files.ts index 166538335f..f84c77fe60 100644 --- a/packages/cli/src/commands/admin/auth/files.ts +++ b/packages/cli/src/commands/admin/auth/files.ts @@ -20,7 +20,6 @@ import * as path from 'path'; /* eslint-disable-next-line no-restricted-syntax */ const { targetRoot, ownDir, resolveTargetRoot } = findPaths(__dirname); export const APP_CONFIG_FILE = path.join(targetRoot, 'app-config.local.yaml'); -export const ENV_CONFIG_FILE = path.join(targetRoot, '.env.local'); export const USER_ENTITY_FILE = path.join(targetRoot, 'user-info.yaml'); const APP_TSX_FILE = path.join( diff --git a/packages/cli/src/commands/admin/auth/github/index.ts b/packages/cli/src/commands/admin/auth/github/index.ts index fa22cacef8..cc2653bc05 100644 --- a/packages/cli/src/commands/admin/auth/github/index.ts +++ b/packages/cli/src/commands/admin/auth/github/index.ts @@ -14,23 +14,6 @@ * limitations under the License. */ -import inquirer from 'inquirer'; import { oauth } from './oauth'; -export const github = async () => { - const answers = await inquirer.prompt<{ - useEnvForSecrets: boolean; - type: string; - }>([ - { - type: 'confirm', - name: 'useEnvForSecrets', - message: - 'Would you like to store sensitive configuration details such as secrets as environment variables? (recommended)', - }, - ]); - - const { useEnvForSecrets } = answers; - - await oauth(useEnvForSecrets); -}; +export const github = async () => await oauth(); diff --git a/packages/cli/src/commands/admin/auth/github/oauth.ts b/packages/cli/src/commands/admin/auth/github/oauth.ts index fe05b6431a..00bfbef23d 100644 --- a/packages/cli/src/commands/admin/auth/github/oauth.ts +++ b/packages/cli/src/commands/admin/auth/github/oauth.ts @@ -16,15 +16,14 @@ import { OAuthApp } from '@octokit/oauth-app'; import chalk from 'chalk'; +import * as fs from 'fs-extra'; import inquirer from 'inquirer'; import fetch from 'node-fetch'; -import * as fs from 'fs-extra'; import * as path from 'path'; import { Task } from '../../../../lib/tasks'; -import { addUserEntity, updateConfigFile, updateEnvFile } from '../config'; +import { addUserEntity, updateConfigFile } from '../config'; import { APP_CONFIG_FILE, - ENV_CONFIG_FILE, patchMap, PATCH_FOLDER, USER_ENTITY_FILE, @@ -56,7 +55,7 @@ const validateCredentials = async (clientId: string, clientSecret: string) => { } }; -const getConfig = (answers: Answers, useEnvForSecrets: boolean) => { +const getConfig = (answers: Answers) => { const { clientId, clientSecret, hasEnterprise, enterpriseInstanceUrl } = answers; @@ -65,12 +64,10 @@ const getConfig = (answers: Answers, useEnvForSecrets: boolean) => { providers: { github: { development: { - clientId: useEnvForSecrets ? '${AUTH_GITHUB_CLIENT_ID}' : clientId, - clientSecret: useEnvForSecrets - ? '${AUTH_GITHUB_CLIENT_SECRET}' - : clientSecret, + clientId, + clientSecret, ...(hasEnterprise && { - enterpriseInstanceUrl: enterpriseInstanceUrl, + enterpriseInstanceUrl, }), }, }, @@ -96,7 +93,7 @@ type Answers = { enterpriseInstanceUrl?: string; }; -export const oauth = async (useEnvForSecrets: boolean) => { +export const oauth = async () => { Task.log(` To add GitHub authentication, you must create an OAuth App from the GitHub developer settings: ${chalk.blue( 'https://github.com/settings/developers', @@ -153,7 +150,7 @@ export const oauth = async (useEnvForSecrets: boolean) => { ]); const { username, clientId, clientSecret } = answers; - const config = getConfig(answers, useEnvForSecrets); + const config = getConfig(answers); Task.log('Setting up GitHub Authentication for you...'); @@ -167,13 +164,6 @@ export const oauth = async (useEnvForSecrets: boolean) => { APP_CONFIG_FILE, async () => await updateConfigFile(APP_CONFIG_FILE, config), ); - if (useEnvForSecrets) { - await Task.forItem( - 'Updating', - ENV_CONFIG_FILE, - async () => await updateEnvFile(ENV_CONFIG_FILE, clientId, clientSecret), - ); - } await Task.forItem( 'Creating', USER_ENTITY_FILE, From 977a5c8f96ab98d999eec729ab84bd72b37166a3 Mon Sep 17 00:00:00 2001 From: Marcus Eide Date: Tue, 21 Feb 2023 15:17:52 +0100 Subject: [PATCH 067/177] cli: Simplify patching by reading target file from path Signed-off-by: Marcus Eide --- packages/cli/src/commands/admin/auth/files.ts | 20 +------------------ .../src/commands/admin/auth/github/oauth.ts | 16 +++------------ packages/cli/src/commands/admin/auth/patch.ts | 19 ++++++++++++++---- ...x.patch => 01-github.Add-SignInPage.patch} | 2 ++ ...ch => 02-github.Use-signIn-resolver.patch} | 2 ++ 5 files changed, 23 insertions(+), 36 deletions(-) rename packages/cli/src/commands/admin/auth/patches/{01-github.App.tsx.patch => 01-github.Add-SignInPage.patch} (92%) rename packages/cli/src/commands/admin/auth/patches/{02-github.auth.ts.patch => 02-github.Use-signIn-resolver.patch} (87%) diff --git a/packages/cli/src/commands/admin/auth/files.ts b/packages/cli/src/commands/admin/auth/files.ts index f84c77fe60..6ce58dc527 100644 --- a/packages/cli/src/commands/admin/auth/files.ts +++ b/packages/cli/src/commands/admin/auth/files.ts @@ -18,22 +18,9 @@ import { findPaths } from '@backstage/cli-common'; import * as path from 'path'; /* eslint-disable-next-line no-restricted-syntax */ -const { targetRoot, ownDir, resolveTargetRoot } = findPaths(__dirname); +const { targetRoot, ownDir } = findPaths(__dirname); export const APP_CONFIG_FILE = path.join(targetRoot, 'app-config.local.yaml'); export const USER_ENTITY_FILE = path.join(targetRoot, 'user-info.yaml'); - -const APP_TSX_FILE = path.join( - resolveTargetRoot('packages/app'), - 'src', - 'App.tsx', -); -const AUTH_BACKEND_PLUGIN_FILE = path.join( - resolveTargetRoot('packages/backend'), - 'src', - 'plugins', - 'auth.ts', -); - export const PATCH_FOLDER = path.join( ownDir, 'src', @@ -42,8 +29,3 @@ export const PATCH_FOLDER = path.join( 'auth', 'patches', ); - -export const patchMap: Record = { - 'App.tsx': APP_TSX_FILE, - 'auth.ts': AUTH_BACKEND_PLUGIN_FILE, -}; diff --git a/packages/cli/src/commands/admin/auth/github/oauth.ts b/packages/cli/src/commands/admin/auth/github/oauth.ts index 00bfbef23d..1de6b2a4c4 100644 --- a/packages/cli/src/commands/admin/auth/github/oauth.ts +++ b/packages/cli/src/commands/admin/auth/github/oauth.ts @@ -19,15 +19,9 @@ import chalk from 'chalk'; import * as fs from 'fs-extra'; import inquirer from 'inquirer'; import fetch from 'node-fetch'; -import * as path from 'path'; import { Task } from '../../../../lib/tasks'; import { addUserEntity, updateConfigFile } from '../config'; -import { - APP_CONFIG_FILE, - patchMap, - PATCH_FOLDER, - USER_ENTITY_FILE, -} from '../files'; +import { APP_CONFIG_FILE, PATCH_FOLDER, USER_ENTITY_FILE } from '../files'; import { patch } from '../patch'; const validateCredentials = async (clientId: string, clientSecret: string) => { @@ -172,12 +166,8 @@ export const oauth = async () => { const patches = await fs.readdir(PATCH_FOLDER); for (const patchFile of patches) { - const target = patchFile - .replace(/[0-9]+-github\./, '') - .replace('.patch', ''); - - await Task.forItem('Pactching', target, async () => { - await patch(patchMap[target], path.join(PATCH_FOLDER, patchFile)); + await Task.forItem('Patching', patchFile, async () => { + await patch(patchFile); }); } }; diff --git a/packages/cli/src/commands/admin/auth/patch.ts b/packages/cli/src/commands/admin/auth/patch.ts index cf466f9408..2333275064 100644 --- a/packages/cli/src/commands/admin/auth/patch.ts +++ b/packages/cli/src/commands/admin/auth/patch.ts @@ -15,12 +15,23 @@ */ import * as fs from 'fs-extra'; +import * as path from 'path'; import * as differ from 'diff'; +import { PATCH_FOLDER } from './files'; +import { findPaths } from '@backstage/cli-common'; -export const patch = async (file: string, patchFile: string) => { - const patchContent = await fs.readFile(patchFile, 'utf8'); - const oldContent = await fs.readFile(file, 'utf8'); +/* eslint-disable-next-line no-restricted-syntax */ +const { targetRoot } = findPaths(__dirname); + +export const patch = async (patchFile: string) => { + const patchContent = await fs.readFile( + path.join(PATCH_FOLDER, patchFile), + 'utf8', + ); + const targetName = patchContent.split('\n')[0].replace('--- a', ''); + const targetFile = path.join(targetRoot, targetName); + const oldContent = await fs.readFile(targetFile, 'utf8'); const newContent = differ.applyPatch(oldContent, patchContent); - return await fs.writeFile(file, newContent, 'utf8'); + return await fs.writeFile(targetFile, newContent, 'utf8'); }; diff --git a/packages/cli/src/commands/admin/auth/patches/01-github.App.tsx.patch b/packages/cli/src/commands/admin/auth/patches/01-github.Add-SignInPage.patch similarity index 92% rename from packages/cli/src/commands/admin/auth/patches/01-github.App.tsx.patch rename to packages/cli/src/commands/admin/auth/patches/01-github.Add-SignInPage.patch index a7e0c150a5..8a3401fea1 100644 --- a/packages/cli/src/commands/admin/auth/patches/01-github.App.tsx.patch +++ b/packages/cli/src/commands/admin/auth/patches/01-github.Add-SignInPage.patch @@ -1,3 +1,5 @@ +--- a/packages/app/src/App.tsx ++++ b/packages/app/src/App.tsx @@ -30 +30,5 @@ import { Root } from './components/Root'; -import { AlertDisplay, OAuthRequestDialog } from '@backstage/core-components'; +import { diff --git a/packages/cli/src/commands/admin/auth/patches/02-github.auth.ts.patch b/packages/cli/src/commands/admin/auth/patches/02-github.Use-signIn-resolver.patch similarity index 87% rename from packages/cli/src/commands/admin/auth/patches/02-github.auth.ts.patch rename to packages/cli/src/commands/admin/auth/patches/02-github.Use-signIn-resolver.patch index e6e65e7b74..2baaff7cf9 100644 --- a/packages/cli/src/commands/admin/auth/patches/02-github.auth.ts.patch +++ b/packages/cli/src/commands/admin/auth/patches/02-github.Use-signIn-resolver.patch @@ -1,3 +1,5 @@ +--- a/packages/backend/src/plugins/auth.ts ++++ b/packages/backend/src/plugins/auth.ts @@ -40,10 +40 @@ export default async function createPlugin( - resolver(_, ctx) { - const userRef = 'user:default/guest'; // Must be a full entity reference From 4e4a0507ca83cb4f309152e7265a14b48506d416 Mon Sep 17 00:00:00 2001 From: Marcus Eide Date: Tue, 21 Feb 2023 15:22:27 +0100 Subject: [PATCH 068/177] cli: Consolidate oauth.ts into index.ts Signed-off-by: Marcus Eide --- .../src/commands/admin/auth/github/index.ts | 158 +++++++++++++++- .../src/commands/admin/auth/github/oauth.ts | 173 ------------------ 2 files changed, 156 insertions(+), 175 deletions(-) delete mode 100644 packages/cli/src/commands/admin/auth/github/oauth.ts diff --git a/packages/cli/src/commands/admin/auth/github/index.ts b/packages/cli/src/commands/admin/auth/github/index.ts index cc2653bc05..def97bf619 100644 --- a/packages/cli/src/commands/admin/auth/github/index.ts +++ b/packages/cli/src/commands/admin/auth/github/index.ts @@ -14,6 +14,160 @@ * limitations under the License. */ -import { oauth } from './oauth'; +import { OAuthApp } from '@octokit/oauth-app'; +import chalk from 'chalk'; +import * as fs from 'fs-extra'; +import inquirer from 'inquirer'; +import fetch from 'node-fetch'; +import { Task } from '../../../../lib/tasks'; +import { addUserEntity, updateConfigFile } from '../config'; +import { APP_CONFIG_FILE, PATCH_FOLDER, USER_ENTITY_FILE } from '../files'; +import { patch } from '../patch'; -export const github = async () => await oauth(); +const validateCredentials = async (clientId: string, clientSecret: string) => { + try { + const app = new OAuthApp({ + clientId, + clientSecret, + }); + await app.createToken({ + code: '%NOT-VALID-CODE%', + }); + } catch (error) { + // @octokit/request returns a error.response object when a request is rejected. + // We can check it to see what kind of error we received. + + // If error.response is successful we can double-check that the error itself was due to the bad code. + // If that's the case then we can assume that the client id and secret exists as we otherwise would + // have gotten a 400/404. + if ( + error.response.status !== 200 && + error.response.data.error !== 'bad_verification_code' + ) { + throw new Error(`Validating GitHub Credentials failed.`); + } + } +}; + +const getConfig = (answers: Answers) => { + const { clientId, clientSecret, hasEnterprise, enterpriseInstanceUrl } = + answers; + + return { + auth: { + providers: { + github: { + development: { + clientId, + clientSecret, + ...(hasEnterprise && { + enterpriseInstanceUrl, + }), + }, + }, + }, + }, + catalog: { + locations: [ + { + type: 'file', + target: '../../user-info.yaml', + rules: [{ allow: ['User'] }], + }, + ], + }, + }; +}; + +type Answers = { + username: string; + clientSecret: string; + clientId: string; + hasEnterprise: boolean; + enterpriseInstanceUrl?: string; +}; + +export const github = async () => { + Task.log(` + To add GitHub authentication, you must create an OAuth App from the GitHub developer settings: ${chalk.blue( + 'https://github.com/settings/developers', + )} + The Homepage URL should point to Backstage's frontend, while the Authorization callback URL will point to the auth backend. + + Settings for local development: + ${chalk.cyan(` + Homepage URL: http://localhost:3000 + Authorization callback URL: http://localhost:7007/api/auth/github/handler/frame`)} + + You can find the full documentation page here: ${chalk.blue( + 'https://backstage.io/docs/auth/github/provider', + )} + `); + + const answers = await inquirer.prompt([ + { + type: 'input', + name: 'username', + message: 'What is your GitHub username?', + validate: async (input: string) => { + const response = await fetch(`https://api.github.com/users/${input}`); + if (!response.ok) { + return chalk.red('Unknown user. Please try again.'); + } + return true; + }, + }, + { + type: 'input', + name: 'clientId', + message: 'What is your Client Id?', + validate: (input: string) => (input.length ? true : false), + }, + { + type: 'input', + name: 'clientSecret', + message: 'What is your Client Secret?', + validate: (input: string) => (input.length ? true : false), + }, + { + type: 'confirm', + name: 'hasEnterprise', + message: 'Are you using GitHub Enterprise?', + }, + { + type: 'input', + name: 'enterpriseInstanceUrl', + message: 'What is your URL for GitHub Enterprise?', + when: ({ hasEnterprise }) => hasEnterprise, + validate: (input: string) => Boolean(new URL(input)), + }, + ]); + + const { username, clientId, clientSecret } = answers; + const config = getConfig(answers); + + Task.log('Setting up GitHub Authentication for you...'); + + await Task.forItem( + 'Validating', + 'credentials', + async () => await validateCredentials(clientId, clientSecret), + ); + await Task.forItem( + 'Updating', + APP_CONFIG_FILE, + async () => await updateConfigFile(APP_CONFIG_FILE, config), + ); + await Task.forItem( + 'Creating', + USER_ENTITY_FILE, + async () => await addUserEntity(USER_ENTITY_FILE, username), + ); + + const patches = await fs.readdir(PATCH_FOLDER); + for (const patchFile of patches) { + await Task.forItem('Patching', patchFile, async () => { + await patch(patchFile); + }); + } +}; diff --git a/packages/cli/src/commands/admin/auth/github/oauth.ts b/packages/cli/src/commands/admin/auth/github/oauth.ts deleted file mode 100644 index 1de6b2a4c4..0000000000 --- a/packages/cli/src/commands/admin/auth/github/oauth.ts +++ /dev/null @@ -1,173 +0,0 @@ -/* - * Copyright 2023 The Backstage Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { OAuthApp } from '@octokit/oauth-app'; -import chalk from 'chalk'; -import * as fs from 'fs-extra'; -import inquirer from 'inquirer'; -import fetch from 'node-fetch'; -import { Task } from '../../../../lib/tasks'; -import { addUserEntity, updateConfigFile } from '../config'; -import { APP_CONFIG_FILE, PATCH_FOLDER, USER_ENTITY_FILE } from '../files'; -import { patch } from '../patch'; - -const validateCredentials = async (clientId: string, clientSecret: string) => { - try { - const app = new OAuthApp({ - clientId, - clientSecret, - }); - await app.createToken({ - code: '%NOT-VALID-CODE%', - }); - } catch (error) { - // @octokit/request returns a error.response object when a request is rejected. - // We can check it to see what kind of error we received. - - // If error.response is successful we can double-check that the error itself was due to the bad code. - // If that's the case then we can assume that the client id and secret exists as we otherwise would - // have gotten a 400/404. - if ( - error.response.status !== 200 && - error.response.data.error !== 'bad_verification_code' - ) { - throw new Error(`Validating GitHub Credentials failed.`); - } - } -}; - -const getConfig = (answers: Answers) => { - const { clientId, clientSecret, hasEnterprise, enterpriseInstanceUrl } = - answers; - - return { - auth: { - providers: { - github: { - development: { - clientId, - clientSecret, - ...(hasEnterprise && { - enterpriseInstanceUrl, - }), - }, - }, - }, - }, - catalog: { - locations: [ - { - type: 'file', - target: '../../user-info.yaml', - rules: [{ allow: ['User'] }], - }, - ], - }, - }; -}; - -type Answers = { - username: string; - clientSecret: string; - clientId: string; - hasEnterprise: boolean; - enterpriseInstanceUrl?: string; -}; - -export const oauth = async () => { - Task.log(` - To add GitHub authentication, you must create an OAuth App from the GitHub developer settings: ${chalk.blue( - 'https://github.com/settings/developers', - )} - The Homepage URL should point to Backstage's frontend, while the Authorization callback URL will point to the auth backend. - - Settings for local development: - ${chalk.cyan(` - Homepage URL: http://localhost:3000 - Authorization callback URL: http://localhost:7007/api/auth/github/handler/frame`)} - - You can find the full documentation page here: ${chalk.blue( - 'https://backstage.io/docs/auth/github/provider', - )} - `); - - const answers = await inquirer.prompt([ - { - type: 'input', - name: 'username', - message: 'What is your GitHub username?', - validate: async (input: string) => { - const response = await fetch(`https://api.github.com/users/${input}`); - if (!response.ok) { - return chalk.red('Unknown user. Please try again.'); - } - return true; - }, - }, - { - type: 'input', - name: 'clientId', - message: 'What is your Client Id?', - validate: (input: string) => (input.length ? true : false), - }, - { - type: 'input', - name: 'clientSecret', - message: 'What is your Client Secret?', - validate: (input: string) => (input.length ? true : false), - }, - { - type: 'confirm', - name: 'hasEnterprise', - message: 'Are you using GitHub Enterprise?', - }, - { - type: 'input', - name: 'enterpriseInstanceUrl', - message: 'What is your URL for GitHub Enterprise?', - when: ({ hasEnterprise }) => hasEnterprise, - validate: (input: string) => Boolean(new URL(input)), - }, - ]); - - const { username, clientId, clientSecret } = answers; - const config = getConfig(answers); - - Task.log('Setting up GitHub Authentication for you...'); - - await Task.forItem( - 'Validating', - 'credentials', - async () => await validateCredentials(clientId, clientSecret), - ); - await Task.forItem( - 'Updating', - APP_CONFIG_FILE, - async () => await updateConfigFile(APP_CONFIG_FILE, config), - ); - await Task.forItem( - 'Creating', - USER_ENTITY_FILE, - async () => await addUserEntity(USER_ENTITY_FILE, username), - ); - - const patches = await fs.readdir(PATCH_FOLDER); - for (const patchFile of patches) { - await Task.forItem('Patching', patchFile, async () => { - await patch(patchFile); - }); - } -}; From e1771deebb82cf83b7efda65d9a3ce5456f4adf5 Mon Sep 17 00:00:00 2001 From: Marcus Eide Date: Tue, 21 Feb 2023 15:27:53 +0100 Subject: [PATCH 069/177] cli: Rename command to onboard Signed-off-by: Marcus Eide --- packages/cli/src/commands/index.ts | 8 ++++---- packages/cli/src/commands/{admin => onboard}/README.md | 0 .../cli/src/commands/{admin => onboard}/auth/config.ts | 0 .../cli/src/commands/{admin => onboard}/auth/files.ts | 2 +- .../src/commands/{admin => onboard}/auth/github/index.ts | 0 .../cli/src/commands/{admin => onboard}/auth/index.ts | 0 .../cli/src/commands/{admin => onboard}/auth/patch.ts | 0 .../auth/patches/01-github.Add-SignInPage.patch | 0 .../auth/patches/02-github.Use-signIn-resolver.patch | 0 packages/cli/src/commands/{admin => onboard}/command.ts | 0 packages/cli/src/commands/{admin => onboard}/index.ts | 0 11 files changed, 5 insertions(+), 5 deletions(-) rename packages/cli/src/commands/{admin => onboard}/README.md (100%) rename packages/cli/src/commands/{admin => onboard}/auth/config.ts (100%) rename packages/cli/src/commands/{admin => onboard}/auth/files.ts (98%) rename packages/cli/src/commands/{admin => onboard}/auth/github/index.ts (100%) rename packages/cli/src/commands/{admin => onboard}/auth/index.ts (100%) rename packages/cli/src/commands/{admin => onboard}/auth/patch.ts (100%) rename packages/cli/src/commands/{admin => onboard}/auth/patches/01-github.Add-SignInPage.patch (100%) rename packages/cli/src/commands/{admin => onboard}/auth/patches/02-github.Use-signIn-resolver.patch (100%) rename packages/cli/src/commands/{admin => onboard}/command.ts (100%) rename packages/cli/src/commands/{admin => onboard}/index.ts (100%) diff --git a/packages/cli/src/commands/index.ts b/packages/cli/src/commands/index.ts index df0689b4b5..ba11a53cfd 100644 --- a/packages/cli/src/commands/index.ts +++ b/packages/cli/src/commands/index.ts @@ -25,11 +25,11 @@ const configOption = [ Array(), ] as const; -export function registerAdminCommand(program: Command) { +export function registerOnboardCommand(program: Command) { program - .command('admin', { hidden: true }) + .command('onboard', { hidden: true }) .description('Get help setting up your Backstage App.') - .action(lazy(() => import('./admin').then(m => m.command))); + .action(lazy(() => import('./onboard').then(m => m.command))); } export function registerRepoCommand(program: Command) { @@ -367,7 +367,7 @@ export function registerCommands(program: Command) { registerRepoCommand(program); registerScriptCommand(program); registerMigrateCommand(program); - registerAdminCommand(program); + registerOnboardCommand(program); program .command('versions:bump') diff --git a/packages/cli/src/commands/admin/README.md b/packages/cli/src/commands/onboard/README.md similarity index 100% rename from packages/cli/src/commands/admin/README.md rename to packages/cli/src/commands/onboard/README.md diff --git a/packages/cli/src/commands/admin/auth/config.ts b/packages/cli/src/commands/onboard/auth/config.ts similarity index 100% rename from packages/cli/src/commands/admin/auth/config.ts rename to packages/cli/src/commands/onboard/auth/config.ts diff --git a/packages/cli/src/commands/admin/auth/files.ts b/packages/cli/src/commands/onboard/auth/files.ts similarity index 98% rename from packages/cli/src/commands/admin/auth/files.ts rename to packages/cli/src/commands/onboard/auth/files.ts index 6ce58dc527..af07ef254b 100644 --- a/packages/cli/src/commands/admin/auth/files.ts +++ b/packages/cli/src/commands/onboard/auth/files.ts @@ -25,7 +25,7 @@ export const PATCH_FOLDER = path.join( ownDir, 'src', 'commands', - 'admin', + 'onboard', 'auth', 'patches', ); diff --git a/packages/cli/src/commands/admin/auth/github/index.ts b/packages/cli/src/commands/onboard/auth/github/index.ts similarity index 100% rename from packages/cli/src/commands/admin/auth/github/index.ts rename to packages/cli/src/commands/onboard/auth/github/index.ts diff --git a/packages/cli/src/commands/admin/auth/index.ts b/packages/cli/src/commands/onboard/auth/index.ts similarity index 100% rename from packages/cli/src/commands/admin/auth/index.ts rename to packages/cli/src/commands/onboard/auth/index.ts diff --git a/packages/cli/src/commands/admin/auth/patch.ts b/packages/cli/src/commands/onboard/auth/patch.ts similarity index 100% rename from packages/cli/src/commands/admin/auth/patch.ts rename to packages/cli/src/commands/onboard/auth/patch.ts diff --git a/packages/cli/src/commands/admin/auth/patches/01-github.Add-SignInPage.patch b/packages/cli/src/commands/onboard/auth/patches/01-github.Add-SignInPage.patch similarity index 100% rename from packages/cli/src/commands/admin/auth/patches/01-github.Add-SignInPage.patch rename to packages/cli/src/commands/onboard/auth/patches/01-github.Add-SignInPage.patch diff --git a/packages/cli/src/commands/admin/auth/patches/02-github.Use-signIn-resolver.patch b/packages/cli/src/commands/onboard/auth/patches/02-github.Use-signIn-resolver.patch similarity index 100% rename from packages/cli/src/commands/admin/auth/patches/02-github.Use-signIn-resolver.patch rename to packages/cli/src/commands/onboard/auth/patches/02-github.Use-signIn-resolver.patch diff --git a/packages/cli/src/commands/admin/command.ts b/packages/cli/src/commands/onboard/command.ts similarity index 100% rename from packages/cli/src/commands/admin/command.ts rename to packages/cli/src/commands/onboard/command.ts diff --git a/packages/cli/src/commands/admin/index.ts b/packages/cli/src/commands/onboard/index.ts similarity index 100% rename from packages/cli/src/commands/admin/index.ts rename to packages/cli/src/commands/onboard/index.ts From c07c3b7364bcfa3e1f861997e61c9717fa8a2c27 Mon Sep 17 00:00:00 2001 From: Marcus Eide Date: Wed, 22 Feb 2023 09:49:14 +0100 Subject: [PATCH 070/177] cli: Add changeset Signed-off-by: Marcus Eide --- .changeset/sour-dragons-cheat.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/sour-dragons-cheat.md diff --git a/.changeset/sour-dragons-cheat.md b/.changeset/sour-dragons-cheat.md new file mode 100644 index 0000000000..1b577d85f7 --- /dev/null +++ b/.changeset/sour-dragons-cheat.md @@ -0,0 +1,5 @@ +--- +'@backstage/cli': patch +--- + +Add `onboard` command. While still in development, this command aims to guide users in setting up their Backstage App. From 284810a0a1c4e0d76cf98b7390bf2daaea6ff1c1 Mon Sep 17 00:00:00 2001 From: Marcus Eide Date: Wed, 22 Feb 2023 10:45:17 +0100 Subject: [PATCH 071/177] cli: Add better error message if a patch failed Signed-off-by: Marcus Eide --- packages/cli/src/commands/onboard/auth/patch.ts | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/packages/cli/src/commands/onboard/auth/patch.ts b/packages/cli/src/commands/onboard/auth/patch.ts index 2333275064..2ebca2aab2 100644 --- a/packages/cli/src/commands/onboard/auth/patch.ts +++ b/packages/cli/src/commands/onboard/auth/patch.ts @@ -32,6 +32,12 @@ export const patch = async (patchFile: string) => { const targetFile = path.join(targetRoot, targetName); const oldContent = await fs.readFile(targetFile, 'utf8'); const newContent = differ.applyPatch(oldContent, patchContent); + if (!newContent) { + throw new Error( + `Patch ${patchFile} was not applied correctly. + Did you change ${targetName} manually before running this command?`, + ); + } return await fs.writeFile(targetFile, newContent, 'utf8'); }; From ff8bffb063ec36d72fc3bf959c3fc1a881238fa4 Mon Sep 17 00:00:00 2001 From: Marcus Eide Date: Wed, 22 Feb 2023 10:46:25 +0100 Subject: [PATCH 072/177] cli: Remove unused answer variable Signed-off-by: Marcus Eide --- packages/cli/src/commands/onboard/command.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/cli/src/commands/onboard/command.ts b/packages/cli/src/commands/onboard/command.ts index 4c49631a80..5bad1211ab 100644 --- a/packages/cli/src/commands/onboard/command.ts +++ b/packages/cli/src/commands/onboard/command.ts @@ -21,7 +21,6 @@ import { auth } from './auth'; export async function command(): Promise { const answers = await inquirer.prompt<{ shouldSetupAuth: boolean; - provider?: string; }>([ { type: 'confirm', From 711f8c427290547f680fef3b26306ce895fc85b9 Mon Sep 17 00:00:00 2001 From: Marcus Eide Date: Wed, 22 Feb 2023 10:57:26 +0100 Subject: [PATCH 073/177] cli: Fix typo Signed-off-by: Marcus Eide --- packages/cli/src/commands/onboard/auth/index.ts | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/packages/cli/src/commands/onboard/auth/index.ts b/packages/cli/src/commands/onboard/auth/index.ts index 728a2ffc2c..279a8cea7d 100644 --- a/packages/cli/src/commands/onboard/auth/index.ts +++ b/packages/cli/src/commands/onboard/auth/index.ts @@ -42,8 +42,11 @@ export async function auth(): Promise { throw new Error(`Provider ${provider} not implemented yet.`); } - Task.log(`Done setting up ${provider}!`); + Task.log(`Done setting up ${provider} Authentication!`); + Task.log(); Task.log( - `You can now start you app with ${chalk.inverse(chalk.italic('yarn dev'))}`, + `You can now start your app with ${chalk.inverse( + chalk.italic('yarn dev'), + )}`, ); } From c24703bd5aeda4feb606fe753ab37e621d7c914d Mon Sep 17 00:00:00 2001 From: Marcus Eide Date: Fri, 24 Feb 2023 15:28:02 +0100 Subject: [PATCH 074/177] cli: Add GitLab option to setting up auth Signed-off-by: Marcus Eide --- .../cli/src/commands/onboard/auth/config.ts | 43 +++--- .../src/commands/onboard/auth/github/index.ts | 16 +-- .../src/commands/onboard/auth/gitlab/index.ts | 126 ++++++++++++++++++ .../cli/src/commands/onboard/auth/index.ts | 7 +- .../patches/01-github.Add-SignInPage.patch | 1 - .../patches/03-gitlab.Add-SignInPage.patch | 25 ++++ .../04-gitlab.Use-signIn-resolver.patch | 27 ++++ 7 files changed, 215 insertions(+), 30 deletions(-) create mode 100644 packages/cli/src/commands/onboard/auth/gitlab/index.ts create mode 100644 packages/cli/src/commands/onboard/auth/patches/03-gitlab.Add-SignInPage.patch create mode 100644 packages/cli/src/commands/onboard/auth/patches/04-gitlab.Use-signIn-resolver.patch diff --git a/packages/cli/src/commands/onboard/auth/config.ts b/packages/cli/src/commands/onboard/auth/config.ts index 54c103cdf8..01afc5f96c 100644 --- a/packages/cli/src/commands/onboard/auth/config.ts +++ b/packages/cli/src/commands/onboard/auth/config.ts @@ -14,28 +14,35 @@ * limitations under the License. */ +import { UserEntity } from '@backstage/catalog-model'; import * as fs from 'fs-extra'; import yaml from 'yaml'; -type GithubAuthConfig = { +type AuthConfig = { auth: { providers: { - github: { + [key: string]: { development: { clientId: string; clientSecret: string; enterpriseInstanceUrl?: string; + audience?: string; }; }; }; }; - catalog?: { - locations: Array<{ - type: string; - target: string; - rules: Array<{ allow: Array }>; - }>; - }; +}; + +const catalogUserLocation = { + catalog: { + locations: [ + { + type: 'file', + target: '../../user-info.yaml', + rules: [{ allow: ['User'] }], + }, + ], + }, }; const readYaml = async (file: string) => { @@ -44,11 +51,11 @@ const readYaml = async (file: string) => { export const updateConfigFile = async ( file: string, - config: GithubAuthConfig, + authConfig: AuthConfig, ) => { const content = fs.existsSync(file) - ? { ...(await readYaml(file)), ...config } - : config; + ? { ...(await readYaml(file)), ...authConfig, ...catalogUserLocation } + : { ...authConfig, ...catalogUserLocation }; return await fs.writeFile( file, @@ -59,15 +66,17 @@ export const updateConfigFile = async ( ); }; -export const addUserEntity = async (file: string, username: string) => { - const content = { +export const addUserEntity = async ( + file: string, + username: string, + annotations?: Record, +) => { + const content: UserEntity = { apiVersion: 'backstage.io/v1alpha1', kind: 'User', metadata: { name: username, - annotations: { - 'github.com/user-login': username, - }, + annotations: { ...annotations }, }, spec: { memberOf: [], diff --git a/packages/cli/src/commands/onboard/auth/github/index.ts b/packages/cli/src/commands/onboard/auth/github/index.ts index def97bf619..c1789fa64d 100644 --- a/packages/cli/src/commands/onboard/auth/github/index.ts +++ b/packages/cli/src/commands/onboard/auth/github/index.ts @@ -67,15 +67,6 @@ const getConfig = (answers: Answers) => { }, }, }, - catalog: { - locations: [ - { - type: 'file', - target: '../../user-info.yaml', - rules: [{ allow: ['User'] }], - }, - ], - }, }; }; @@ -161,11 +152,14 @@ export const github = async () => { await Task.forItem( 'Creating', USER_ENTITY_FILE, - async () => await addUserEntity(USER_ENTITY_FILE, username), + async () => + await addUserEntity(USER_ENTITY_FILE, username, { + 'github.com/user-login': username, + }), ); const patches = await fs.readdir(PATCH_FOLDER); - for (const patchFile of patches) { + for (const patchFile of patches.filter(p => p.includes('github'))) { await Task.forItem('Patching', patchFile, async () => { await patch(patchFile); }); diff --git a/packages/cli/src/commands/onboard/auth/gitlab/index.ts b/packages/cli/src/commands/onboard/auth/gitlab/index.ts new file mode 100644 index 0000000000..4fa77f6b02 --- /dev/null +++ b/packages/cli/src/commands/onboard/auth/gitlab/index.ts @@ -0,0 +1,126 @@ +/* + * Copyright 2023 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import chalk from 'chalk'; +import * as fs from 'fs-extra'; +import inquirer from 'inquirer'; +import { Task } from '../../../../lib/tasks'; +import { addUserEntity, updateConfigFile } from '../config'; +import { APP_CONFIG_FILE, PATCH_FOLDER, USER_ENTITY_FILE } from '../files'; +import { patch } from '../patch'; + +const getConfig = (answers: Answers) => { + const { clientId, clientSecret, hasAudience, audience } = answers; + + return { + auth: { + providers: { + gitlab: { + development: { + clientId, + clientSecret, + ...(hasAudience && { + audience, + }), + }, + }, + }, + }, + }; +}; + +type Answers = { + username: string; + clientSecret: string; + clientId: string; + hasAudience: boolean; + audience?: string; +}; + +export const gitlab = async () => { + Task.log(` + To add GitLub authentication, you must create an Application from the GitLab Settings: ${chalk.blue( + 'https://gitlab.com/-/profile/applications', + )} + The Redirect URI should point to your Backstage backend auth handler. + + Settings for local development: + ${chalk.cyan(` + Name: Backstage (or your custom app name) + Redirect URI: http://localhost:7007/api/auth/gitlab/handler/frame + Scopes: read_api and read_user`)} + + You can find the full documentation page here: ${chalk.blue( + 'https://backstage.io/docs/auth/gitlab/provider', + )} + `); + + const answers = await inquirer.prompt([ + { + type: 'input', + name: 'username', + message: 'What is your GitLab username?', + validate: (input: string) => (input.length ? true : false), + }, + { + type: 'input', + name: 'clientId', + message: 'What is your Application Id?', + validate: (input: string) => (input.length ? true : false), + }, + { + type: 'input', + name: 'clientSecret', + message: 'What is your Application Secret?', + validate: (input: string) => (input.length ? true : false), + }, + { + type: 'confirm', + name: 'hasAudience', + message: 'Do you have a self-hosted instance of GitLab?', + }, + { + type: 'input', + name: 'audience', + message: 'What is the URL for your GitLab instance?', + when: ({ hasAudience }) => hasAudience, + validate: (input: string) => Boolean(new URL(input)), + }, + ]); + + const { username } = answers; + const config = getConfig(answers); + + Task.log('Setting up GitLab Authentication for you...'); + + await Task.forItem( + 'Updating', + APP_CONFIG_FILE, + async () => await updateConfigFile(APP_CONFIG_FILE, config), + ); + await Task.forItem( + 'Creating', + USER_ENTITY_FILE, + async () => await addUserEntity(USER_ENTITY_FILE, username), + ); + + const patches = await fs.readdir(PATCH_FOLDER); + for (const patchFile of patches.filter(p => p.includes('gitlab'))) { + await Task.forItem('Patching', patchFile, async () => { + await patch(patchFile); + }); + } +}; diff --git a/packages/cli/src/commands/onboard/auth/index.ts b/packages/cli/src/commands/onboard/auth/index.ts index 279a8cea7d..df9471e1db 100644 --- a/packages/cli/src/commands/onboard/auth/index.ts +++ b/packages/cli/src/commands/onboard/auth/index.ts @@ -18,6 +18,7 @@ import chalk from 'chalk'; import inquirer from 'inquirer'; import { Task } from '../../../lib/tasks'; import { github } from './github'; +import { gitlab } from './gitlab'; export async function auth(): Promise { const answers = await inquirer.prompt<{ @@ -27,7 +28,7 @@ export async function auth(): Promise { type: 'list', name: 'provider', message: 'Please select a provider:', - choices: ['GitHub'], + choices: ['GitHub', 'GitLab'], }, ]); @@ -38,6 +39,10 @@ export async function auth(): Promise { await github(); break; } + case 'GitLab': { + await gitlab(); + break; + } default: throw new Error(`Provider ${provider} not implemented yet.`); } diff --git a/packages/cli/src/commands/onboard/auth/patches/01-github.Add-SignInPage.patch b/packages/cli/src/commands/onboard/auth/patches/01-github.Add-SignInPage.patch index 8a3401fea1..db9f5228e8 100644 --- a/packages/cli/src/commands/onboard/auth/patches/01-github.Add-SignInPage.patch +++ b/packages/cli/src/commands/onboard/auth/patches/01-github.Add-SignInPage.patch @@ -14,7 +14,6 @@ + SignInPage: props => ( + ( ++ ++ ), ++ }, \ No newline at end of file diff --git a/packages/cli/src/commands/onboard/auth/patches/04-gitlab.Use-signIn-resolver.patch b/packages/cli/src/commands/onboard/auth/patches/04-gitlab.Use-signIn-resolver.patch new file mode 100644 index 0000000000..04b432c179 --- /dev/null +++ b/packages/cli/src/commands/onboard/auth/patches/04-gitlab.Use-signIn-resolver.patch @@ -0,0 +1,27 @@ +--- a/packages/backend/src/plugins/auth.ts ++++ b/packages/backend/src/plugins/auth.ts +@@ -38 +38 @@ export default async function createPlugin( +- github: providers.github.create({ ++ gitlab: providers.gitlab.create({ +@@ -40,8 +40,11 @@ export default async function createPlugin( +- resolver(_, ctx) { +- const userRef = 'user:default/guest'; // Must be a full entity reference +- return ctx.issueToken({ +- claims: { +- sub: userRef, // The user's own identity +- ent: [userRef], // A list of identities that the user claims ownership through +- }, +- }); ++ async resolver(info, ctx) { ++ const { fullProfile } = info.result; ++ ++ const userId = fullProfile.username; ++ if (!userId) { ++ throw new Error( ++ `GitLab user profile does not contain a username`, ++ ); ++ } ++ ++ return ctx.signInWithCatalogUser({ entityRef: { name: userId } }); +@@ -49 +51,0 @@ export default async function createPlugin( +- // resolver: providers.github.resolvers.usernameMatchingUserEntityName(), \ No newline at end of file From 55f802caa65afe8505f0d83b70de525f9aecb045 Mon Sep 17 00:00:00 2001 From: Philipp Hugenroth Date: Mon, 27 Feb 2023 19:00:45 +0100 Subject: [PATCH 075/177] Add GitHub integration to Onboard CLI Signed-off-by: Philipp Hugenroth --- packages/cli/src/commands/onboard/command.ts | 64 +++++++++++----- .../onboard/integrations/github/index.ts | 73 +++++++++++++++++++ .../commands/onboard/integrations/index.ts | 49 +++++++++++++ 3 files changed, 168 insertions(+), 18 deletions(-) create mode 100644 packages/cli/src/commands/onboard/integrations/github/index.ts create mode 100644 packages/cli/src/commands/onboard/integrations/index.ts diff --git a/packages/cli/src/commands/onboard/command.ts b/packages/cli/src/commands/onboard/command.ts index 5bad1211ab..1cfaabed12 100644 --- a/packages/cli/src/commands/onboard/command.ts +++ b/packages/cli/src/commands/onboard/command.ts @@ -17,26 +17,54 @@ import chalk from 'chalk'; import inquirer from 'inquirer'; import { auth } from './auth'; +import { integrations } from './integrations'; export async function command(): Promise { - const answers = await inquirer.prompt<{ - shouldSetupAuth: boolean; - }>([ - { - type: 'confirm', - name: 'shouldSetupAuth', - message: 'Do you want to set up Authentication for this project?', - }, - ]); + try { + // TODO(tudi2d): Is there a way to make this cleaner? + const answers = await inquirer.prompt<{ + shouldSetupAuth: boolean; + }>([ + { + type: 'confirm', + name: 'shouldSetupAuth', + message: 'Do you want to set up Authentication for this project?', + default: true, + }, + ]); - if (!answers.shouldSetupAuth) { - console.log( - chalk.yellow( - 'If you change your mind, feel free to re-run this command.', - ), - ); - process.exit(1); + if (!answers.shouldSetupAuth) { + console.log( + chalk.yellow( + 'If you change your mind, feel free to re-run this command.', + ), + ); + } else { + await auth(); + } + + // TODO(tudi2d): Select "Core Features" here such that we can determin if the integrations need to be setup for either Catalog, Scaffollder or both + await inquirer + .prompt<{ + setupScaffolder: boolean; + }>([ + { + type: 'confirm', + name: 'setupScaffolder', + message: 'Do you want to setup Sofware Templates?', + default: true, + }, + ]) + .then(async ({ setupScaffolder }) => + setupScaffolder + ? await integrations() + : console.log( + chalk.yellow( + 'If you change your mind, feel free to re-run this command.', + ), + ), + ); + } catch (err) { + process.exit(-1); } - - await auth(); } diff --git a/packages/cli/src/commands/onboard/integrations/github/index.ts b/packages/cli/src/commands/onboard/integrations/github/index.ts new file mode 100644 index 0000000000..73416699e4 --- /dev/null +++ b/packages/cli/src/commands/onboard/integrations/github/index.ts @@ -0,0 +1,73 @@ +/* + * Copyright 2023 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import chalk from 'chalk'; +import inquirer from 'inquirer'; +import { Task } from '../../../../lib/tasks'; + +export const github = async () => { + const host = 'https://github.com'; + const answers = await inquirer.prompt<{ hasEnterprise: boolean }>([ + { + type: 'confirm', + name: 'hasEnterprise', + message: 'Are you using GitHub Enterprise?', + }, + ]); + + if (answers.hasEnterprise) { + await inquirer.prompt<{ hasEnterprise: boolean }>([ + { + type: 'confirm', + name: 'hasEnterprise', + message: 'Are you using GitHub Enterprise?', + }, + { + type: 'input', + name: 'enterpriseInstanceUrl', + message: 'What is your GitHub Enterprise URL (e.g. ghe.example.net)?', + when: ({ hasEnterprise }) => hasEnterprise, + validate: (input: string) => Boolean(new URL(input)), + }, + ]); + } + + Task.log(` + To create new repositories in GitHub using Software Templates you first need to create a personal access token: ${chalk.blue( + `${host}/settings/tokens/new', + )} + + Select the following scopes: + + Reading software components:${chalk.cyan(` + - "repo"`)} + + Reading organization data:${chalk.cyan(` + - "read:org" + - "read:user" + - "user:email"`)} + + Publishing software templates:${chalk.cyan(` + - "repo" + - "workflow" (if templates include GitHub workflows) + `)} + + You can find the full documentation page here: ${chalk.blue( + 'https://backstage.io/docs/integrations/github/locations', + )} + `, + )}`); +}; diff --git a/packages/cli/src/commands/onboard/integrations/index.ts b/packages/cli/src/commands/onboard/integrations/index.ts new file mode 100644 index 0000000000..2b55ab2bba --- /dev/null +++ b/packages/cli/src/commands/onboard/integrations/index.ts @@ -0,0 +1,49 @@ +/* + * Copyright 2023 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import inquirer from 'inquirer'; +import { github } from './github'; + +enum Integration { + GITHUB = 'GitHub', +} + +const Integrations: Integration[] = [Integration.GITHUB]; + +export async function integrations(): Promise { + await inquirer + .prompt<{ + integration?: Integration; + }>([ + { + // TODO(tudi2d): Should be multiple choice + type: 'list', + name: 'integration', + message: 'Please select an integration:', + choices: Integrations, + }, + ]) + .then(async ({ integration }) => { + if (integration) { + switch (integration) { + case Integration.GITHUB: + await github(); + break; + default: + } + } + }); +} From 87dc2beb2179cedd9c25e2f76e5ac450ffe6a52d Mon Sep 17 00:00:00 2001 From: Philipp Hugenroth Date: Wed, 1 Mar 2023 10:10:12 +0100 Subject: [PATCH 076/177] Setup basic GitHub & GHE integration using CLI Signed-off-by: Philipp Hugenroth --- .../src/commands/onboard/auth/github/index.ts | 38 ++++-- .../src/commands/onboard/auth/gitlab/index.ts | 4 +- .../cli/src/commands/onboard/auth/patch.ts | 2 +- .../src/commands/onboard/{auth => }/config.ts | 36 +----- .../src/commands/onboard/{auth => }/files.ts | 0 .../onboard/integrations/github/index.ts | 113 ++++++++++++++---- .../commands/onboard/integrations/index.ts | 2 +- 7 files changed, 126 insertions(+), 69 deletions(-) rename packages/cli/src/commands/onboard/{auth => }/config.ts (68%) rename packages/cli/src/commands/onboard/{auth => }/files.ts (100%) diff --git a/packages/cli/src/commands/onboard/auth/github/index.ts b/packages/cli/src/commands/onboard/auth/github/index.ts index c1789fa64d..ce53d23ad3 100644 --- a/packages/cli/src/commands/onboard/auth/github/index.ts +++ b/packages/cli/src/commands/onboard/auth/github/index.ts @@ -20,10 +20,30 @@ import * as fs from 'fs-extra'; import inquirer from 'inquirer'; import fetch from 'node-fetch'; import { Task } from '../../../../lib/tasks'; -import { addUserEntity, updateConfigFile } from '../config'; -import { APP_CONFIG_FILE, PATCH_FOLDER, USER_ENTITY_FILE } from '../files'; +import { addUserEntity, updateConfigFile } from '../../config'; +import { APP_CONFIG_FILE, PATCH_FOLDER, USER_ENTITY_FILE } from '../../files'; import { patch } from '../patch'; +type Answers = { + username: string; + clientSecret: string; + clientId: string; + hasEnterprise: boolean; + enterpriseInstanceUrl?: string; +}; + +const catalogUserLocation = { + catalog: { + locations: [ + { + type: 'file', + target: '../../user-info.yaml', + rules: [{ allow: ['User'] }], + }, + ], + }, +}; + const validateCredentials = async (clientId: string, clientSecret: string) => { try { const app = new OAuthApp({ @@ -70,14 +90,6 @@ const getConfig = (answers: Answers) => { }; }; -type Answers = { - username: string; - clientSecret: string; - clientId: string; - hasEnterprise: boolean; - enterpriseInstanceUrl?: string; -}; - export const github = async () => { Task.log(` To add GitHub authentication, you must create an OAuth App from the GitHub developer settings: ${chalk.blue( @@ -147,7 +159,11 @@ export const github = async () => { await Task.forItem( 'Updating', APP_CONFIG_FILE, - async () => await updateConfigFile(APP_CONFIG_FILE, config), + async () => + await updateConfigFile(APP_CONFIG_FILE, { + ...config, + ...catalogUserLocation, + }), ); await Task.forItem( 'Creating', diff --git a/packages/cli/src/commands/onboard/auth/gitlab/index.ts b/packages/cli/src/commands/onboard/auth/gitlab/index.ts index 4fa77f6b02..9e2a674a9a 100644 --- a/packages/cli/src/commands/onboard/auth/gitlab/index.ts +++ b/packages/cli/src/commands/onboard/auth/gitlab/index.ts @@ -18,8 +18,8 @@ import chalk from 'chalk'; import * as fs from 'fs-extra'; import inquirer from 'inquirer'; import { Task } from '../../../../lib/tasks'; -import { addUserEntity, updateConfigFile } from '../config'; -import { APP_CONFIG_FILE, PATCH_FOLDER, USER_ENTITY_FILE } from '../files'; +import { addUserEntity, updateConfigFile } from '../../config'; +import { APP_CONFIG_FILE, PATCH_FOLDER, USER_ENTITY_FILE } from '../../files'; import { patch } from '../patch'; const getConfig = (answers: Answers) => { diff --git a/packages/cli/src/commands/onboard/auth/patch.ts b/packages/cli/src/commands/onboard/auth/patch.ts index 2ebca2aab2..d004eeb157 100644 --- a/packages/cli/src/commands/onboard/auth/patch.ts +++ b/packages/cli/src/commands/onboard/auth/patch.ts @@ -17,7 +17,7 @@ import * as fs from 'fs-extra'; import * as path from 'path'; import * as differ from 'diff'; -import { PATCH_FOLDER } from './files'; +import { PATCH_FOLDER } from '../files'; import { findPaths } from '@backstage/cli-common'; /* eslint-disable-next-line no-restricted-syntax */ diff --git a/packages/cli/src/commands/onboard/auth/config.ts b/packages/cli/src/commands/onboard/config.ts similarity index 68% rename from packages/cli/src/commands/onboard/auth/config.ts rename to packages/cli/src/commands/onboard/config.ts index 01afc5f96c..b5a2336a0a 100644 --- a/packages/cli/src/commands/onboard/auth/config.ts +++ b/packages/cli/src/commands/onboard/config.ts @@ -18,44 +18,14 @@ import { UserEntity } from '@backstage/catalog-model'; import * as fs from 'fs-extra'; import yaml from 'yaml'; -type AuthConfig = { - auth: { - providers: { - [key: string]: { - development: { - clientId: string; - clientSecret: string; - enterpriseInstanceUrl?: string; - audience?: string; - }; - }; - }; - }; -}; - -const catalogUserLocation = { - catalog: { - locations: [ - { - type: 'file', - target: '../../user-info.yaml', - rules: [{ allow: ['User'] }], - }, - ], - }, -}; - const readYaml = async (file: string) => { return yaml.parse(await fs.readFile(file, 'utf8')); }; -export const updateConfigFile = async ( - file: string, - authConfig: AuthConfig, -) => { +export const updateConfigFile = async (file: string, config: T) => { const content = fs.existsSync(file) - ? { ...(await readYaml(file)), ...authConfig, ...catalogUserLocation } - : { ...authConfig, ...catalogUserLocation }; + ? { ...(await readYaml(file)), ...config } + : { ...config }; return await fs.writeFile( file, diff --git a/packages/cli/src/commands/onboard/auth/files.ts b/packages/cli/src/commands/onboard/files.ts similarity index 100% rename from packages/cli/src/commands/onboard/auth/files.ts rename to packages/cli/src/commands/onboard/files.ts diff --git a/packages/cli/src/commands/onboard/integrations/github/index.ts b/packages/cli/src/commands/onboard/integrations/github/index.ts index 73416699e4..1a0d7a5ef5 100644 --- a/packages/cli/src/commands/onboard/integrations/github/index.ts +++ b/packages/cli/src/commands/onboard/integrations/github/index.ts @@ -17,37 +17,82 @@ import chalk from 'chalk'; import inquirer from 'inquirer'; import { Task } from '../../../../lib/tasks'; +import { updateConfigFile } from '../../config'; +import { APP_CONFIG_FILE } from '../../files'; + +type Answers = { + isEnterprise: boolean; + host: string; + apiBaseUrl?: string; + token: string; +}; + +const getConfig = ({ isEnterprise, host, apiBaseUrl, token }: Answers) => ({ + integrations: { + github: isEnterprise + ? [ + { + host, + apiBaseUrl, + token, + }, + ] + : [ + { + host, + token, + }, + ], + }, +}); export const github = async () => { - const host = 'https://github.com'; - const answers = await inquirer.prompt<{ hasEnterprise: boolean }>([ + let host = 'github.com'; + let apiBaseUrl: string | undefined; + + // TODO(tudi2d): Is GitHub Enterprise a valid setup if there is no Authentication? + const { isEnterprise } = await inquirer.prompt<{ + isEnterprise: Answers['isEnterprise']; + }>([ { type: 'confirm', - name: 'hasEnterprise', + name: 'isEnterprise', message: 'Are you using GitHub Enterprise?', }, ]); - if (answers.hasEnterprise) { - await inquirer.prompt<{ hasEnterprise: boolean }>([ - { - type: 'confirm', - name: 'hasEnterprise', - message: 'Are you using GitHub Enterprise?', - }, - { - type: 'input', - name: 'enterpriseInstanceUrl', - message: 'What is your GitHub Enterprise URL (e.g. ghe.example.net)?', - when: ({ hasEnterprise }) => hasEnterprise, - validate: (input: string) => Boolean(new URL(input)), - }, - ]); + if (isEnterprise) { + try { + const answers = await inquirer.prompt< + Pick + >([ + { + type: 'input', + name: 'apiBaseUrl', + message: + 'What is your GitHub Enterprise REST API URL (e.g. https://ghe.example.net/api/v3)?', + // TODO(tudi2d): Fetch API using OAuth Token if Auth was set up + validate: (input: string) => Boolean(new URL(input)), + }, + { + type: 'input', + name: 'host', + message: + 'What is your GitHub Enterprise Host (e.g. ghe.example.net)?', + // TODO(tudi2d): validate: Must the host be part of the REST API URL? + }, + ]); + + host = answers.host; + apiBaseUrl = answers.apiBaseUrl; + } catch (err) { + return; + } } Task.log(` To create new repositories in GitHub using Software Templates you first need to create a personal access token: ${chalk.blue( - `${host}/settings/tokens/new', + `https://${host}/settings/tokens/new`, )} Select the following scopes: @@ -68,6 +113,32 @@ export const github = async () => { You can find the full documentation page here: ${chalk.blue( 'https://backstage.io/docs/integrations/github/locations', )} - `, - )}`); + `); + + const { token } = await inquirer.prompt<{ + token: Answers['token']; + }>([ + { + type: 'input', + name: 'token', + message: + 'Please insert your personal access token to setup the GitHub Integration', + // TODO(tudi2d): validate: Must the host be part of the REST API URL? + }, + ]); + + const config = getConfig({ + token, + isEnterprise, + host, + apiBaseUrl, + }); + + Task.log('Setting up GitHub Integration for you...'); + + await Task.forItem( + 'Updating', + APP_CONFIG_FILE, + async () => await updateConfigFile(APP_CONFIG_FILE, config), + ); }; diff --git a/packages/cli/src/commands/onboard/integrations/index.ts b/packages/cli/src/commands/onboard/integrations/index.ts index 2b55ab2bba..f3ac6754d6 100644 --- a/packages/cli/src/commands/onboard/integrations/index.ts +++ b/packages/cli/src/commands/onboard/integrations/index.ts @@ -29,7 +29,7 @@ export async function integrations(): Promise { integration?: Integration; }>([ { - // TODO(tudi2d): Should be multiple choice + // TODO(tudi2d): Let's start with one, but it should be multiple choice in the future type: 'list', name: 'integration', message: 'Please select an integration:', From 3d121668268fd1f1494d3d4471e055e50cdd8190 Mon Sep 17 00:00:00 2001 From: Philipp Hugenroth Date: Mon, 6 Mar 2023 13:14:37 +0100 Subject: [PATCH 077/177] Chain Scaffolder inquirer prompts Signed-off-by: Philipp Hugenroth --- .../src/commands/onboard/auth/gitlab/index.ts | 2 +- .../onboard/integrations/github/index.ts | 54 +++++++++---------- 2 files changed, 26 insertions(+), 30 deletions(-) diff --git a/packages/cli/src/commands/onboard/auth/gitlab/index.ts b/packages/cli/src/commands/onboard/auth/gitlab/index.ts index 9e2a674a9a..702537fe70 100644 --- a/packages/cli/src/commands/onboard/auth/gitlab/index.ts +++ b/packages/cli/src/commands/onboard/auth/gitlab/index.ts @@ -52,7 +52,7 @@ type Answers = { export const gitlab = async () => { Task.log(` - To add GitLub authentication, you must create an Application from the GitLab Settings: ${chalk.blue( + To add GitLab authentication, you must create an Application from the GitLab Settings: ${chalk.blue( 'https://gitlab.com/-/profile/applications', )} The Redirect URI should point to your Backstage backend auth handler. diff --git a/packages/cli/src/commands/onboard/integrations/github/index.ts b/packages/cli/src/commands/onboard/integrations/github/index.ts index 1a0d7a5ef5..ac4fd37406 100644 --- a/packages/cli/src/commands/onboard/integrations/github/index.ts +++ b/packages/cli/src/commands/onboard/integrations/github/index.ts @@ -48,46 +48,42 @@ const getConfig = ({ isEnterprise, host, apiBaseUrl, token }: Answers) => ({ export const github = async () => { let host = 'github.com'; - let apiBaseUrl: string | undefined; // TODO(tudi2d): Is GitHub Enterprise a valid setup if there is no Authentication? - const { isEnterprise } = await inquirer.prompt<{ + const { + isEnterprise, + host: _host, + apiBaseUrl, + } = await inquirer.prompt<{ isEnterprise: Answers['isEnterprise']; + apiBaseUrl: Answers['apiBaseUrl']; + host: Answers['host']; }>([ { type: 'confirm', name: 'isEnterprise', message: 'Are you using GitHub Enterprise?', }, + { + type: 'input', + name: 'apiBaseUrl', + when: ({ isEnterprise: _isEnterprise }) => _isEnterprise, + message: + 'What is your GitHub Enterprise REST API URL (e.g. https://ghe.example.net/api/v3)?', + // TODO(tudi2d): Fetch API using OAuth Token if Auth was set up + validate: (input: string) => Boolean(new URL(input)), + }, + { + type: 'input', + name: 'host', + when: ({ isEnterprise: _isEnterprise }) => _isEnterprise, + message: 'What is your GitHub Enterprise Host (e.g. ghe.example.net)?', + // TODO(tudi2d): validate: Must the host be part of the REST API URL? + }, ]); if (isEnterprise) { - try { - const answers = await inquirer.prompt< - Pick - >([ - { - type: 'input', - name: 'apiBaseUrl', - message: - 'What is your GitHub Enterprise REST API URL (e.g. https://ghe.example.net/api/v3)?', - // TODO(tudi2d): Fetch API using OAuth Token if Auth was set up - validate: (input: string) => Boolean(new URL(input)), - }, - { - type: 'input', - name: 'host', - message: - 'What is your GitHub Enterprise Host (e.g. ghe.example.net)?', - // TODO(tudi2d): validate: Must the host be part of the REST API URL? - }, - ]); - - host = answers.host; - apiBaseUrl = answers.apiBaseUrl; - } catch (err) { - return; - } + host = _host; } Task.log(` @@ -123,7 +119,7 @@ export const github = async () => { name: 'token', message: 'Please insert your personal access token to setup the GitHub Integration', - // TODO(tudi2d): validate: Must the host be part of the REST API URL? + // TODO(tudi2d): validate }, ]); From 8e254c06bc3655bc4ef93c76bbb727fd50f6959e Mon Sep 17 00:00:00 2001 From: Marcus Eide Date: Wed, 8 Mar 2023 09:48:47 +0100 Subject: [PATCH 078/177] cli: Use custom resolver to sign-in as guest instead, do not add user-info to catalog. Signed-off-by: Marcus Eide --- .../src/commands/onboard/auth/github/index.ts | 46 ++----------------- .../src/commands/onboard/auth/gitlab/index.ts | 17 +------ .../02-github.Use-signIn-resolver.patch | 14 ------ ...e.patch => 02-gitlab.Add-SignInPage.patch} | 0 .../03-gitlab.Change-signIn-resolver.patch | 5 ++ .../04-gitlab.Use-signIn-resolver.patch | 27 ----------- packages/cli/src/commands/onboard/config.ts | 27 ----------- packages/cli/src/commands/onboard/files.ts | 1 - 8 files changed, 11 insertions(+), 126 deletions(-) delete mode 100644 packages/cli/src/commands/onboard/auth/patches/02-github.Use-signIn-resolver.patch rename packages/cli/src/commands/onboard/auth/patches/{03-gitlab.Add-SignInPage.patch => 02-gitlab.Add-SignInPage.patch} (100%) create mode 100644 packages/cli/src/commands/onboard/auth/patches/03-gitlab.Change-signIn-resolver.patch delete mode 100644 packages/cli/src/commands/onboard/auth/patches/04-gitlab.Use-signIn-resolver.patch diff --git a/packages/cli/src/commands/onboard/auth/github/index.ts b/packages/cli/src/commands/onboard/auth/github/index.ts index ce53d23ad3..7e1e63a8fe 100644 --- a/packages/cli/src/commands/onboard/auth/github/index.ts +++ b/packages/cli/src/commands/onboard/auth/github/index.ts @@ -18,32 +18,18 @@ import { OAuthApp } from '@octokit/oauth-app'; import chalk from 'chalk'; import * as fs from 'fs-extra'; import inquirer from 'inquirer'; -import fetch from 'node-fetch'; import { Task } from '../../../../lib/tasks'; -import { addUserEntity, updateConfigFile } from '../../config'; -import { APP_CONFIG_FILE, PATCH_FOLDER, USER_ENTITY_FILE } from '../../files'; +import { updateConfigFile } from '../../config'; +import { APP_CONFIG_FILE, PATCH_FOLDER } from '../../files'; import { patch } from '../patch'; type Answers = { - username: string; clientSecret: string; clientId: string; hasEnterprise: boolean; enterpriseInstanceUrl?: string; }; -const catalogUserLocation = { - catalog: { - locations: [ - { - type: 'file', - target: '../../user-info.yaml', - rules: [{ allow: ['User'] }], - }, - ], - }, -}; - const validateCredentials = async (clientId: string, clientSecret: string) => { try { const app = new OAuthApp({ @@ -108,18 +94,6 @@ export const github = async () => { `); const answers = await inquirer.prompt([ - { - type: 'input', - name: 'username', - message: 'What is your GitHub username?', - validate: async (input: string) => { - const response = await fetch(`https://api.github.com/users/${input}`); - if (!response.ok) { - return chalk.red('Unknown user. Please try again.'); - } - return true; - }, - }, { type: 'input', name: 'clientId', @@ -146,7 +120,7 @@ export const github = async () => { }, ]); - const { username, clientId, clientSecret } = answers; + const { clientId, clientSecret } = answers; const config = getConfig(answers); Task.log('Setting up GitHub Authentication for you...'); @@ -159,19 +133,7 @@ export const github = async () => { await Task.forItem( 'Updating', APP_CONFIG_FILE, - async () => - await updateConfigFile(APP_CONFIG_FILE, { - ...config, - ...catalogUserLocation, - }), - ); - await Task.forItem( - 'Creating', - USER_ENTITY_FILE, - async () => - await addUserEntity(USER_ENTITY_FILE, username, { - 'github.com/user-login': username, - }), + async () => await updateConfigFile(APP_CONFIG_FILE, config), ); const patches = await fs.readdir(PATCH_FOLDER); diff --git a/packages/cli/src/commands/onboard/auth/gitlab/index.ts b/packages/cli/src/commands/onboard/auth/gitlab/index.ts index 702537fe70..1940f66017 100644 --- a/packages/cli/src/commands/onboard/auth/gitlab/index.ts +++ b/packages/cli/src/commands/onboard/auth/gitlab/index.ts @@ -18,8 +18,8 @@ import chalk from 'chalk'; import * as fs from 'fs-extra'; import inquirer from 'inquirer'; import { Task } from '../../../../lib/tasks'; -import { addUserEntity, updateConfigFile } from '../../config'; -import { APP_CONFIG_FILE, PATCH_FOLDER, USER_ENTITY_FILE } from '../../files'; +import { updateConfigFile } from '../../config'; +import { APP_CONFIG_FILE, PATCH_FOLDER } from '../../files'; import { patch } from '../patch'; const getConfig = (answers: Answers) => { @@ -43,7 +43,6 @@ const getConfig = (answers: Answers) => { }; type Answers = { - username: string; clientSecret: string; clientId: string; hasAudience: boolean; @@ -69,12 +68,6 @@ export const gitlab = async () => { `); const answers = await inquirer.prompt([ - { - type: 'input', - name: 'username', - message: 'What is your GitLab username?', - validate: (input: string) => (input.length ? true : false), - }, { type: 'input', name: 'clientId', @@ -101,7 +94,6 @@ export const gitlab = async () => { }, ]); - const { username } = answers; const config = getConfig(answers); Task.log('Setting up GitLab Authentication for you...'); @@ -111,11 +103,6 @@ export const gitlab = async () => { APP_CONFIG_FILE, async () => await updateConfigFile(APP_CONFIG_FILE, config), ); - await Task.forItem( - 'Creating', - USER_ENTITY_FILE, - async () => await addUserEntity(USER_ENTITY_FILE, username), - ); const patches = await fs.readdir(PATCH_FOLDER); for (const patchFile of patches.filter(p => p.includes('gitlab'))) { diff --git a/packages/cli/src/commands/onboard/auth/patches/02-github.Use-signIn-resolver.patch b/packages/cli/src/commands/onboard/auth/patches/02-github.Use-signIn-resolver.patch deleted file mode 100644 index 2baaff7cf9..0000000000 --- a/packages/cli/src/commands/onboard/auth/patches/02-github.Use-signIn-resolver.patch +++ /dev/null @@ -1,14 +0,0 @@ ---- a/packages/backend/src/plugins/auth.ts -+++ b/packages/backend/src/plugins/auth.ts -@@ -40,10 +40 @@ export default async function createPlugin( -- resolver(_, ctx) { -- const userRef = 'user:default/guest'; // Must be a full entity reference -- return ctx.issueToken({ -- claims: { -- sub: userRef, // The user's own identity -- ent: [userRef], // A list of identities that the user claims ownership through -- }, -- }); -- }, -- // resolver: providers.github.resolvers.usernameMatchingUserEntityName(), -+ resolver: providers.github.resolvers.usernameMatchingUserEntityName(), \ No newline at end of file diff --git a/packages/cli/src/commands/onboard/auth/patches/03-gitlab.Add-SignInPage.patch b/packages/cli/src/commands/onboard/auth/patches/02-gitlab.Add-SignInPage.patch similarity index 100% rename from packages/cli/src/commands/onboard/auth/patches/03-gitlab.Add-SignInPage.patch rename to packages/cli/src/commands/onboard/auth/patches/02-gitlab.Add-SignInPage.patch diff --git a/packages/cli/src/commands/onboard/auth/patches/03-gitlab.Change-signIn-resolver.patch b/packages/cli/src/commands/onboard/auth/patches/03-gitlab.Change-signIn-resolver.patch new file mode 100644 index 0000000000..7a69669674 --- /dev/null +++ b/packages/cli/src/commands/onboard/auth/patches/03-gitlab.Change-signIn-resolver.patch @@ -0,0 +1,5 @@ +--- a/packages/backend/src/plugins/auth.ts ++++ b/packages/backend/src/plugins/auth.ts +@@ -38 +38 @@ export default async function createPlugin( +- github: providers.github.create({ ++ gitlab: providers.gitlab.create({ \ No newline at end of file diff --git a/packages/cli/src/commands/onboard/auth/patches/04-gitlab.Use-signIn-resolver.patch b/packages/cli/src/commands/onboard/auth/patches/04-gitlab.Use-signIn-resolver.patch deleted file mode 100644 index 04b432c179..0000000000 --- a/packages/cli/src/commands/onboard/auth/patches/04-gitlab.Use-signIn-resolver.patch +++ /dev/null @@ -1,27 +0,0 @@ ---- a/packages/backend/src/plugins/auth.ts -+++ b/packages/backend/src/plugins/auth.ts -@@ -38 +38 @@ export default async function createPlugin( -- github: providers.github.create({ -+ gitlab: providers.gitlab.create({ -@@ -40,8 +40,11 @@ export default async function createPlugin( -- resolver(_, ctx) { -- const userRef = 'user:default/guest'; // Must be a full entity reference -- return ctx.issueToken({ -- claims: { -- sub: userRef, // The user's own identity -- ent: [userRef], // A list of identities that the user claims ownership through -- }, -- }); -+ async resolver(info, ctx) { -+ const { fullProfile } = info.result; -+ -+ const userId = fullProfile.username; -+ if (!userId) { -+ throw new Error( -+ `GitLab user profile does not contain a username`, -+ ); -+ } -+ -+ return ctx.signInWithCatalogUser({ entityRef: { name: userId } }); -@@ -49 +51,0 @@ export default async function createPlugin( -- // resolver: providers.github.resolvers.usernameMatchingUserEntityName(), \ No newline at end of file diff --git a/packages/cli/src/commands/onboard/config.ts b/packages/cli/src/commands/onboard/config.ts index b5a2336a0a..8d419dd71a 100644 --- a/packages/cli/src/commands/onboard/config.ts +++ b/packages/cli/src/commands/onboard/config.ts @@ -14,7 +14,6 @@ * limitations under the License. */ -import { UserEntity } from '@backstage/catalog-model'; import * as fs from 'fs-extra'; import yaml from 'yaml'; @@ -35,29 +34,3 @@ export const updateConfigFile = async (file: string, config: T) => { 'utf8', ); }; - -export const addUserEntity = async ( - file: string, - username: string, - annotations?: Record, -) => { - const content: UserEntity = { - apiVersion: 'backstage.io/v1alpha1', - kind: 'User', - metadata: { - name: username, - annotations: { ...annotations }, - }, - spec: { - memberOf: [], - }, - }; - - return await fs.writeFile( - file, - yaml.stringify(content, { - indent: 2, - }), - 'utf8', - ); -}; diff --git a/packages/cli/src/commands/onboard/files.ts b/packages/cli/src/commands/onboard/files.ts index af07ef254b..17f8a0f85e 100644 --- a/packages/cli/src/commands/onboard/files.ts +++ b/packages/cli/src/commands/onboard/files.ts @@ -20,7 +20,6 @@ import * as path from 'path'; /* eslint-disable-next-line no-restricted-syntax */ const { targetRoot, ownDir } = findPaths(__dirname); export const APP_CONFIG_FILE = path.join(targetRoot, 'app-config.local.yaml'); -export const USER_ENTITY_FILE = path.join(targetRoot, 'user-info.yaml'); export const PATCH_FOLDER = path.join( ownDir, 'src', From b590c95ed8e64705e3a68e4b37afda9da9249a33 Mon Sep 17 00:00:00 2001 From: Marcus Eide Date: Wed, 8 Mar 2023 16:00:42 +0100 Subject: [PATCH 079/177] cli: Remember provider selection from auth setup when setting up software templates Signed-off-by: Marcus Eide --- .../src/commands/onboard/auth/github/index.ts | 6 +- .../src/commands/onboard/auth/gitlab/index.ts | 6 +- .../cli/src/commands/onboard/auth/index.ts | 32 +++--- packages/cli/src/commands/onboard/command.ts | 87 ++++++++------- .../onboard/integrations/github/index.ts | 100 +++++++++--------- .../commands/onboard/integrations/index.ts | 72 +++++++++---- 6 files changed, 167 insertions(+), 136 deletions(-) diff --git a/packages/cli/src/commands/onboard/auth/github/index.ts b/packages/cli/src/commands/onboard/auth/github/index.ts index 7e1e63a8fe..36c6b02038 100644 --- a/packages/cli/src/commands/onboard/auth/github/index.ts +++ b/packages/cli/src/commands/onboard/auth/github/index.ts @@ -23,7 +23,7 @@ import { updateConfigFile } from '../../config'; import { APP_CONFIG_FILE, PATCH_FOLDER } from '../../files'; import { patch } from '../patch'; -type Answers = { +export type Answers = { clientSecret: string; clientId: string; hasEnterprise: boolean; @@ -76,7 +76,7 @@ const getConfig = (answers: Answers) => { }; }; -export const github = async () => { +export const github = async (): Promise => { Task.log(` To add GitHub authentication, you must create an OAuth App from the GitHub developer settings: ${chalk.blue( 'https://github.com/settings/developers', @@ -142,4 +142,6 @@ export const github = async () => { await patch(patchFile); }); } + + return answers; }; diff --git a/packages/cli/src/commands/onboard/auth/gitlab/index.ts b/packages/cli/src/commands/onboard/auth/gitlab/index.ts index 1940f66017..bc5491111c 100644 --- a/packages/cli/src/commands/onboard/auth/gitlab/index.ts +++ b/packages/cli/src/commands/onboard/auth/gitlab/index.ts @@ -42,14 +42,14 @@ const getConfig = (answers: Answers) => { }; }; -type Answers = { +export type Answers = { clientSecret: string; clientId: string; hasAudience: boolean; audience?: string; }; -export const gitlab = async () => { +export const gitlab = async (): Promise => { Task.log(` To add GitLab authentication, you must create an Application from the GitLab Settings: ${chalk.blue( 'https://gitlab.com/-/profile/applications', @@ -110,4 +110,6 @@ export const gitlab = async () => { await patch(patchFile); }); } + + return answers; }; diff --git a/packages/cli/src/commands/onboard/auth/index.ts b/packages/cli/src/commands/onboard/auth/index.ts index df9471e1db..5a299e2fb5 100644 --- a/packages/cli/src/commands/onboard/auth/index.ts +++ b/packages/cli/src/commands/onboard/auth/index.ts @@ -14,44 +14,50 @@ * limitations under the License. */ -import chalk from 'chalk'; import inquirer from 'inquirer'; import { Task } from '../../../lib/tasks'; -import { github } from './github'; -import { gitlab } from './gitlab'; +import { github, Answers as GitHubAnswers } from './github'; +import { gitlab, Answers as GitLabAnswers } from './gitlab'; -export async function auth(): Promise { +export { type GitHubAnswers, type GitLabAnswers }; + +export async function auth(): Promise<{ + provider: string; + answers: GitHubAnswers | GitLabAnswers; +}> { const answers = await inquirer.prompt<{ - provider?: string; + provider: string; }>([ { type: 'list', name: 'provider', - message: 'Please select a provider:', + message: 'Please select an authentication provider:', choices: ['GitHub', 'GitLab'], }, ]); const { provider } = answers; + let providerAnswers; switch (provider) { case 'GitHub': { - await github(); + providerAnswers = await github(); break; } case 'GitLab': { - await gitlab(); + providerAnswers = await gitlab(); break; } default: throw new Error(`Provider ${provider} not implemented yet.`); } + Task.log(); Task.log(`Done setting up ${provider} Authentication!`); Task.log(); - Task.log( - `You can now start your app with ${chalk.inverse( - chalk.italic('yarn dev'), - )}`, - ); + + return { + provider, + answers: providerAnswers, + }; } diff --git a/packages/cli/src/commands/onboard/command.ts b/packages/cli/src/commands/onboard/command.ts index 1cfaabed12..5cf25953ab 100644 --- a/packages/cli/src/commands/onboard/command.ts +++ b/packages/cli/src/commands/onboard/command.ts @@ -16,55 +16,54 @@ import chalk from 'chalk'; import inquirer from 'inquirer'; +import { Task } from '../../lib/tasks'; import { auth } from './auth'; import { integrations } from './integrations'; export async function command(): Promise { - try { - // TODO(tudi2d): Is there a way to make this cleaner? - const answers = await inquirer.prompt<{ - shouldSetupAuth: boolean; - }>([ - { - type: 'confirm', - name: 'shouldSetupAuth', - message: 'Do you want to set up Authentication for this project?', - default: true, - }, - ]); + const answers = await inquirer.prompt<{ + shouldSetupAuth: boolean; + shouldSetupScaffolder: boolean; + }>([ + { + type: 'confirm', + name: 'shouldSetupAuth', + message: 'Do you want to set up Authentication for this project?', + default: true, + }, + { + type: 'confirm', + name: 'shouldSetupScaffolder', + message: 'Do you want to use Software Templates in this project?', + default: true, + }, + ]); - if (!answers.shouldSetupAuth) { - console.log( - chalk.yellow( - 'If you change your mind, feel free to re-run this command.', - ), - ); - } else { - await auth(); - } + const { shouldSetupAuth, shouldSetupScaffolder } = answers; - // TODO(tudi2d): Select "Core Features" here such that we can determin if the integrations need to be setup for either Catalog, Scaffollder or both - await inquirer - .prompt<{ - setupScaffolder: boolean; - }>([ - { - type: 'confirm', - name: 'setupScaffolder', - message: 'Do you want to setup Sofware Templates?', - default: true, - }, - ]) - .then(async ({ setupScaffolder }) => - setupScaffolder - ? await integrations() - : console.log( - chalk.yellow( - 'If you change your mind, feel free to re-run this command.', - ), - ), - ); - } catch (err) { - process.exit(-1); + let providerInfo; + if (shouldSetupAuth) { + providerInfo = await auth(); } + + if (shouldSetupScaffolder) { + await integrations(providerInfo); + } + + if (!shouldSetupAuth && !shouldSetupScaffolder) { + Task.log( + chalk.yellow( + 'If you change your mind, feel free to re-run this command.', + ), + ); + return; + } + + Task.log(); + Task.log( + `You can now start your app with ${chalk.inverse( + chalk.italic('yarn dev'), + )}`, + ); + Task.log(); } diff --git a/packages/cli/src/commands/onboard/integrations/github/index.ts b/packages/cli/src/commands/onboard/integrations/github/index.ts index ac4fd37406..883a119c00 100644 --- a/packages/cli/src/commands/onboard/integrations/github/index.ts +++ b/packages/cli/src/commands/onboard/integrations/github/index.ts @@ -19,76 +19,74 @@ import inquirer from 'inquirer'; import { Task } from '../../../../lib/tasks'; import { updateConfigFile } from '../../config'; import { APP_CONFIG_FILE } from '../../files'; +import { GitHubAnswers } from '../../auth'; type Answers = { - isEnterprise: boolean; - host: string; - apiBaseUrl?: string; - token: string; + hasEnterprise: boolean; + enterpriseInstanceUrl: string; + apiBaseUrl: string; }; -const getConfig = ({ isEnterprise, host, apiBaseUrl, token }: Answers) => ({ +const getConfig = ({ + hasEnterprise, + apiBaseUrl, + host, + token, +}: { + hasEnterprise: boolean; + apiBaseUrl: string; + host: string; + token: string; +}) => ({ integrations: { - github: isEnterprise - ? [ - { - host, - apiBaseUrl, - token, - }, - ] - : [ - { - host, - token, - }, - ], + github: [ + { + host, + token, + ...(hasEnterprise && { + apiBaseUrl, + }), + }, + ], }, }); -export const github = async () => { - let host = 'github.com'; - +export const github = async (providerAnswers?: GitHubAnswers) => { // TODO(tudi2d): Is GitHub Enterprise a valid setup if there is no Authentication? - const { - isEnterprise, - host: _host, - apiBaseUrl, - } = await inquirer.prompt<{ - isEnterprise: Answers['isEnterprise']; - apiBaseUrl: Answers['apiBaseUrl']; - host: Answers['host']; - }>([ + const answers = await inquirer.prompt([ { type: 'confirm', - name: 'isEnterprise', + name: 'hasEnterprise', message: 'Are you using GitHub Enterprise?', + when: () => typeof providerAnswers === 'undefined', }, { type: 'input', - name: 'apiBaseUrl', - when: ({ isEnterprise: _isEnterprise }) => _isEnterprise, - message: - 'What is your GitHub Enterprise REST API URL (e.g. https://ghe.example.net/api/v3)?', - // TODO(tudi2d): Fetch API using OAuth Token if Auth was set up + name: 'enterpriseInstanceUrl', + message: 'What is your URL for GitHub Enterprise?', + when: ({ hasEnterprise }) => hasEnterprise, validate: (input: string) => Boolean(new URL(input)), }, { type: 'input', - name: 'host', - when: ({ isEnterprise: _isEnterprise }) => _isEnterprise, - message: 'What is your GitHub Enterprise Host (e.g. ghe.example.net)?', - // TODO(tudi2d): validate: Must the host be part of the REST API URL? + name: 'apiBaseUrl', + message: 'What is your GitHub Enterprise API path?', + default: '/api/v3', + when: ({ hasEnterprise }) => + hasEnterprise || providerAnswers?.hasEnterprise, + // TODO(tudi2d): Fetch API using OAuth Token if Auth was set up }, ]); - if (isEnterprise) { - host = _host; - } + const host = new URL( + providerAnswers?.enterpriseInstanceUrl ?? + answers?.enterpriseInstanceUrl ?? + 'http://github.com', + ); Task.log(` To create new repositories in GitHub using Software Templates you first need to create a personal access token: ${chalk.blue( - `https://${host}/settings/tokens/new`, + `${host.origin}/settings/tokens/new`, )} Select the following scopes: @@ -111,9 +109,7 @@ export const github = async () => { )} `); - const { token } = await inquirer.prompt<{ - token: Answers['token']; - }>([ + const { token } = await inquirer.prompt<{ token: string }>([ { type: 'input', name: 'token', @@ -124,13 +120,13 @@ export const github = async () => { ]); const config = getConfig({ + hasEnterprise: providerAnswers?.hasEnterprise ?? answers.hasEnterprise, + apiBaseUrl: host.origin + answers.apiBaseUrl, + host: host.hostname, token, - isEnterprise, - host, - apiBaseUrl, }); - Task.log('Setting up GitHub Integration for you...'); + Task.log('Setting up Software Templates using GitHub integration for you...'); await Task.forItem( 'Updating', diff --git a/packages/cli/src/commands/onboard/integrations/index.ts b/packages/cli/src/commands/onboard/integrations/index.ts index f3ac6754d6..5cb2f95b38 100644 --- a/packages/cli/src/commands/onboard/integrations/index.ts +++ b/packages/cli/src/commands/onboard/integrations/index.ts @@ -15,6 +15,8 @@ */ import inquirer from 'inquirer'; +import { Task } from '../../../lib/tasks'; +import { GitHubAnswers, GitLabAnswers } from '../auth'; import { github } from './github'; enum Integration { @@ -23,27 +25,51 @@ enum Integration { const Integrations: Integration[] = [Integration.GITHUB]; -export async function integrations(): Promise { - await inquirer - .prompt<{ - integration?: Integration; - }>([ - { - // TODO(tudi2d): Let's start with one, but it should be multiple choice in the future - type: 'list', - name: 'integration', - message: 'Please select an integration:', - choices: Integrations, - }, - ]) - .then(async ({ integration }) => { - if (integration) { - switch (integration) { - case Integration.GITHUB: - await github(); - break; - default: - } - } - }); +export async function integrations(providerInfo?: { + provider: string; + answers: GitHubAnswers | GitLabAnswers; +}): Promise { + const answers = await inquirer.prompt<{ + integration?: Integration; + shouldUsePreviousProvider: boolean; + }>([ + { + type: 'confirm', + name: 'shouldUsePreviousProvider', + message: `Do you want to keep using ${providerInfo?.provider} as your provider when setting up Software Templates?`, + when: () => + providerInfo?.provider && + Object.values(Integrations).includes( + providerInfo!.provider as Integration, + ), + }, + { + // TODO(tudi2d): Let's start with one, but it should be multiple choice in the future + type: 'list', + name: 'integration', + message: 'Please select an integration provider:', + choices: Integrations, + when: ({ shouldUsePreviousProvider }) => !shouldUsePreviousProvider, + }, + ]); + + if (answers.shouldUsePreviousProvider) { + answers.integration = providerInfo!.provider as Integration; + } + + switch (answers.integration) { + case Integration.GITHUB: { + const providerAnswers = + providerInfo?.provider === 'GitHub' + ? (providerInfo!.answers as GitHubAnswers) + : undefined; + await github(providerAnswers); + break; + } + default: + } + + Task.log(); + Task.log(`Done setting up ${answers.integration} Integration!`); + Task.log(); } From 349b70af35962d1f99b544e09eeda6a346f340e7 Mon Sep 17 00:00:00 2001 From: Philipp Hugenroth Date: Thu, 9 Mar 2023 16:53:10 +0100 Subject: [PATCH 080/177] Update packages/cli/src/commands/onboard/README.md Co-authored-by: Patrik Oldsberg Signed-off-by: Philipp Hugenroth --- packages/cli/src/commands/onboard/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/cli/src/commands/onboard/README.md b/packages/cli/src/commands/onboard/README.md index d2a6e10256..71e51a2077 100644 --- a/packages/cli/src/commands/onboard/README.md +++ b/packages/cli/src/commands/onboard/README.md @@ -14,7 +14,7 @@ npx @backstage/create-app cd new-backstage-app # Run the modded cli in the new app -../github/backstage/packages/cli/bin/backstage-cli admin +../github/backstage/packages/cli/bin/backstage-cli onboard ? Do you want to set up Authentication for this project? (Y/n) ... From 3c5b436237a23f82ef09ad574b02720115bb9451 Mon Sep 17 00:00:00 2001 From: Philipp Hugenroth Date: Tue, 14 Mar 2023 11:13:41 +0100 Subject: [PATCH 081/177] Adjust PR to review - Add comment in local config indicating override - Restructure files & folders to avoid folders with only one index file Signed-off-by: Philipp Hugenroth --- packages/cli/src/commands/onboard/README.md | 13 ++++----- .../cli/src/commands/onboard/auth/index.ts | 4 +-- .../{github/index.ts => providers/github.ts} | 0 .../{gitlab/index.ts => providers/gitlab.ts} | 0 packages/cli/src/commands/onboard/config.ts | 29 ++++++++++++------- .../{github/index.ts => github.ts} | 8 ++--- 6 files changed, 31 insertions(+), 23 deletions(-) rename packages/cli/src/commands/onboard/auth/{github/index.ts => providers/github.ts} (100%) rename packages/cli/src/commands/onboard/auth/{gitlab/index.ts => providers/gitlab.ts} (100%) rename packages/cli/src/commands/onboard/integrations/{github/index.ts => github.ts} (95%) diff --git a/packages/cli/src/commands/onboard/README.md b/packages/cli/src/commands/onboard/README.md index 71e51a2077..8ab2d5f795 100644 --- a/packages/cli/src/commands/onboard/README.md +++ b/packages/cli/src/commands/onboard/README.md @@ -2,22 +2,21 @@ ## Local dev -```bash -# Checkout the branch -cd backstage -git fetch -git checkout goa/cli-admin-command - # Create a new app + +```bash cd .. npx @backstage/create-app cd new-backstage-app # Run the modded cli in the new app -../github/backstage/packages/cli/bin/backstage-cli onboard + +../RELATIVE_PATH_TO_PROJECT/backstage/packages/cli/bin/backstage-cli onboard ? Do you want to set up Authentication for this project? (Y/n) ... # Try the app with the new changes + yarn dev + ``` diff --git a/packages/cli/src/commands/onboard/auth/index.ts b/packages/cli/src/commands/onboard/auth/index.ts index 5a299e2fb5..0f4537b110 100644 --- a/packages/cli/src/commands/onboard/auth/index.ts +++ b/packages/cli/src/commands/onboard/auth/index.ts @@ -16,8 +16,8 @@ import inquirer from 'inquirer'; import { Task } from '../../../lib/tasks'; -import { github, Answers as GitHubAnswers } from './github'; -import { gitlab, Answers as GitLabAnswers } from './gitlab'; +import { github, Answers as GitHubAnswers } from './providers/github'; +import { gitlab, Answers as GitLabAnswers } from './providers/gitlab'; export { type GitHubAnswers, type GitLabAnswers }; diff --git a/packages/cli/src/commands/onboard/auth/github/index.ts b/packages/cli/src/commands/onboard/auth/providers/github.ts similarity index 100% rename from packages/cli/src/commands/onboard/auth/github/index.ts rename to packages/cli/src/commands/onboard/auth/providers/github.ts diff --git a/packages/cli/src/commands/onboard/auth/gitlab/index.ts b/packages/cli/src/commands/onboard/auth/providers/gitlab.ts similarity index 100% rename from packages/cli/src/commands/onboard/auth/gitlab/index.ts rename to packages/cli/src/commands/onboard/auth/providers/gitlab.ts diff --git a/packages/cli/src/commands/onboard/config.ts b/packages/cli/src/commands/onboard/config.ts index 8d419dd71a..cce3119fcc 100644 --- a/packages/cli/src/commands/onboard/config.ts +++ b/packages/cli/src/commands/onboard/config.ts @@ -22,15 +22,24 @@ const readYaml = async (file: string) => { }; export const updateConfigFile = async (file: string, config: T) => { - const content = fs.existsSync(file) - ? { ...(await readYaml(file)), ...config } - : { ...config }; + const staticContent = + '# Backstage override configuration for your local development environment \n'; - return await fs.writeFile( - file, - yaml.stringify(content, { - indent: 2, - }), - 'utf8', - ); + const content = fs.existsSync(file) + ? yaml.stringify( + { ...(await readYaml(file)), ...config }, + { + indent: 2, + }, + ) + : staticContent.concat( + yaml.stringify( + { ...config }, + { + indent: 2, + }, + ), + ); + + return await fs.writeFile(file, content, 'utf8'); }; diff --git a/packages/cli/src/commands/onboard/integrations/github/index.ts b/packages/cli/src/commands/onboard/integrations/github.ts similarity index 95% rename from packages/cli/src/commands/onboard/integrations/github/index.ts rename to packages/cli/src/commands/onboard/integrations/github.ts index 883a119c00..a0538c7ace 100644 --- a/packages/cli/src/commands/onboard/integrations/github/index.ts +++ b/packages/cli/src/commands/onboard/integrations/github.ts @@ -16,10 +16,10 @@ import chalk from 'chalk'; import inquirer from 'inquirer'; -import { Task } from '../../../../lib/tasks'; -import { updateConfigFile } from '../../config'; -import { APP_CONFIG_FILE } from '../../files'; -import { GitHubAnswers } from '../../auth'; +import { Task } from '../../../lib/tasks'; +import { updateConfigFile } from '../config'; +import { APP_CONFIG_FILE } from '../files'; +import { GitHubAnswers } from '../auth'; type Answers = { hasEnterprise: boolean; From 3fa416968208bbc7a462174a3a926cffc5a611e8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20Adel=C3=B6w?= Date: Tue, 14 Mar 2023 13:10:07 +0100 Subject: [PATCH 082/177] Make the "Copied!" message disappear automatically after some time MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Fredrik Adelöw --- .changeset/brave-planets-grab.md | 5 +++++ .../components/EntityContextMenu/EntityContextMenu.tsx | 10 +++++++--- 2 files changed, 12 insertions(+), 3 deletions(-) create mode 100644 .changeset/brave-planets-grab.md diff --git a/.changeset/brave-planets-grab.md b/.changeset/brave-planets-grab.md new file mode 100644 index 0000000000..8b99978695 --- /dev/null +++ b/.changeset/brave-planets-grab.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-catalog': patch +--- + +Make the "Copied!" message disappear automatically after some time diff --git a/plugins/catalog/src/components/EntityContextMenu/EntityContextMenu.tsx b/plugins/catalog/src/components/EntityContextMenu/EntityContextMenu.tsx index 675f74fa8d..1961fe6cac 100644 --- a/plugins/catalog/src/components/EntityContextMenu/EntityContextMenu.tsx +++ b/plugins/catalog/src/components/EntityContextMenu/EntityContextMenu.tsx @@ -90,9 +90,13 @@ export function EntityContextMenu(props: EntityContextMenuProps) { const alertApi = useApi(alertApiRef); const copyToClipboard = useCallback(() => { - window.navigator.clipboard - .writeText(window.location.toString()) - .then(() => alertApi.post({ message: 'Copied!', severity: 'info' })); + window.navigator.clipboard.writeText(window.location.toString()).then(() => + alertApi.post({ + message: 'Copied!', + severity: 'info', + display: 'transient', + }), + ); }, [alertApi]); const extraItems = UNSTABLE_extraContextMenuItems && [ From 2d6efa32792a2273bb31671228ea4713cb5fbb15 Mon Sep 17 00:00:00 2001 From: Brian Fletcher Date: Tue, 14 Mar 2023 12:55:17 +0000 Subject: [PATCH 083/177] dont fail if cluster auth fails for one cluster Signed-off-by: Brian Fletcher --- .../AwsIamKubernetesAuthTranslator.ts | 66 +++++++++---------- .../src/service/KubernetesFanOutHandler.ts | 17 ++++- 2 files changed, 47 insertions(+), 36 deletions(-) diff --git a/plugins/kubernetes-backend/src/kubernetes-auth-translator/AwsIamKubernetesAuthTranslator.ts b/plugins/kubernetes-backend/src/kubernetes-auth-translator/AwsIamKubernetesAuthTranslator.ts index b89945902d..84e60c9c69 100644 --- a/plugins/kubernetes-backend/src/kubernetes-auth-translator/AwsIamKubernetesAuthTranslator.ts +++ b/plugins/kubernetes-backend/src/kubernetes-auth-translator/AwsIamKubernetesAuthTranslator.ts @@ -55,46 +55,44 @@ export class AwsIamKubernetesAuthTranslator assumeRole?: string, externalId?: string, ): Promise { - return new Promise(async (resolve, reject) => { - const awsCreds = await this.awsGetCredentials(); + const awsCreds = await this.awsGetCredentials(); - if (!(awsCreds instanceof Credentials)) - return reject(Error('No AWS credentials found.')); + if (!(awsCreds instanceof Credentials)) + throw new Error('No AWS credentials found.'); - let creds: SigningCreds = { - accessKeyId: awsCreds.accessKeyId, - secretAccessKey: awsCreds.secretAccessKey, - sessionToken: awsCreds.sessionToken, + let creds: SigningCreds = { + accessKeyId: awsCreds.accessKeyId, + secretAccessKey: awsCreds.secretAccessKey, + sessionToken: awsCreds.sessionToken, + }; + + if (!this.validCredentials(creds)) + throw new Error('Invalid AWS credentials found.'); + if (!assumeRole) return creds; + + try { + const params: AWS.STS.Types.AssumeRoleRequest = { + RoleArn: assumeRole, + RoleSessionName: 'backstage-login', }; + if (externalId) params.ExternalId = externalId; - if (!this.validCredentials(creds)) - return reject(Error('Invalid AWS credentials found.')); - if (!assumeRole) return resolve(creds); + const assumedRole = await new AWS.STS().assumeRole(params).promise(); - try { - const params: AWS.STS.Types.AssumeRoleRequest = { - RoleArn: assumeRole, - RoleSessionName: 'backstage-login', - }; - if (externalId) params.ExternalId = externalId; - - const assumedRole = await new AWS.STS().assumeRole(params).promise(); - - if (!assumedRole.Credentials) { - throw new Error(`No credentials returned for role ${assumeRole}`); - } - - creds = { - accessKeyId: assumedRole.Credentials.AccessKeyId, - secretAccessKey: assumedRole.Credentials.SecretAccessKey, - sessionToken: assumedRole.Credentials.SessionToken, - }; - } catch (e) { - console.warn(`There was an error assuming the role: ${e}`); - return reject(Error(`Unable to assume role: ${e}`)); + if (!assumedRole.Credentials) { + throw new Error(`No credentials returned for role ${assumeRole}`); } - return resolve(creds); - }); + + creds = { + accessKeyId: assumedRole.Credentials.AccessKeyId, + secretAccessKey: assumedRole.Credentials.SecretAccessKey, + sessionToken: assumedRole.Credentials.SessionToken, + }; + } catch (e) { + console.warn(`There was an error assuming the role: ${e}`); + throw new Error(`Unable to assume role: ${e}`); + } + return creds; } async getBearerToken( clusterName: string, diff --git a/plugins/kubernetes-backend/src/service/KubernetesFanOutHandler.ts b/plugins/kubernetes-backend/src/service/KubernetesFanOutHandler.ts index 63e46a44e3..0c1bc670fd 100644 --- a/plugins/kubernetes-backend/src/service/KubernetesFanOutHandler.ts +++ b/plugins/kubernetes-backend/src/service/KubernetesFanOutHandler.ts @@ -49,6 +49,14 @@ import { PodStatus, } from '@kubernetes/client-node'; +const isRejected = ( + input: PromiseSettledResult, +): input is PromiseRejectedResult => input.status === 'rejected'; + +const isFulfilled = ( + input: PromiseSettledResult, +): input is PromiseFulfilledResult => input.status === 'fulfilled'; + /** * * @public @@ -298,12 +306,12 @@ export class KubernetesFanOutHandler { auth: KubernetesRequestAuth, requestContext: ServiceLocatorRequestContext, ) { - const clusterDetails: ClusterDetails[] = await ( + const clusterDetails: ClusterDetails[] = ( await this.serviceLocator.getClustersByEntity(entity, requestContext) ).clusters; // Execute all of these async actions simultaneously/without blocking sequentially as no common object is modified by them - return await Promise.all( + const promiseResults = await Promise.allSettled( clusterDetails.map(cd => { const kubernetesAuthTranslator: KubernetesAuthTranslator = this.getAuthTranslator(cd.authProvider); @@ -313,6 +321,11 @@ export class KubernetesFanOutHandler { ); }), ); + + promiseResults.filter(isRejected).map(item => { + this.logger.info(`Failed to decorate cluster details: ${item.reason}`); + }); + return promiseResults.filter(isFulfilled).map(item => item.value); } toObjectsByEntityResponse( From 3dacb23b76f0db5dab8ccd6824445d4191e632e9 Mon Sep 17 00:00:00 2001 From: Abhay-soni-developer Date: Tue, 14 Mar 2023 18:48:34 +0530 Subject: [PATCH 084/177] credits added Signed-off-by: Abhay-soni-developer --- .github/CODEOWNERS | 2 +- plugins/microsoft-calendar/README.md | 3 +-- plugins/microsoft-calendar/package.json | 20 +++++++++++++++++--- 3 files changed, 19 insertions(+), 6 deletions(-) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 010af451af..294286d3bf 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -62,7 +62,7 @@ yarn.lock @backstage/maintainers @back /plugins/kafka-backend @backstage/maintainers @nirga @andrewthauer /plugins/kubernetes @backstage/maintainers @backstage/warpspeed /plugins/kubernetes-* @backstage/maintainers @backstage/warpspeed -/plugins/microsoft-calendar @backstage/maintainers @abhay-soni-developer +/plugins/microsoft-calendar @backstage/maintainers @abhay-soni-developer @statusneo /plugins/newrelic-dashboard @backstage/maintainers @mufaddal7 /plugins/playlist @backstage/maintainers @kuangp /plugins/playlist-* @backstage/maintainers @kuangp diff --git a/plugins/microsoft-calendar/README.md b/plugins/microsoft-calendar/README.md index 219a7cf2dc..92421046e2 100644 --- a/plugins/microsoft-calendar/README.md +++ b/plugins/microsoft-calendar/README.md @@ -1,7 +1,6 @@ # Microsoft-Calendar Plugin -Welcome to the Microsoft calendar plugin! -_This plugin was created through the Backstage CLI_ +This plugin is contributed by [StatusNeo](https://statusneo.com/) ## Features diff --git a/plugins/microsoft-calendar/package.json b/plugins/microsoft-calendar/package.json index 8d20a5de70..f476284ebe 100644 --- a/plugins/microsoft-calendar/package.json +++ b/plugins/microsoft-calendar/package.json @@ -13,10 +13,24 @@ "role": "frontend-plugin" }, "author": { - "name": "Abhay Soni", - "email": "abhaysoni.developer@gmail.com", - "url": "https://github.com/Abhay-soni-developer" + "name": "Statusneo", + "email": "reach@statusneo.com", + "url": "https://statusneo.com/" }, + "contributors": [ + { + "email": "abhaysoni.developer@gmail.com", + "url": "https://github.com/Abhay-soni-developer", + "name": "abhaysoni" + } + ], + "maintainers": [ + { + "email": "abhaysoni.developer@gmail.com", + "url": "https://github.com/Abhay-soni-developer", + "name": "abhaysoni" + } + ], "scripts": { "start": "backstage-cli package start", "build": "backstage-cli package build", From d642532f486f211600dabafbb262fd2bdf336cf2 Mon Sep 17 00:00:00 2001 From: Abhay-soni-developer Date: Tue, 14 Mar 2023 19:09:06 +0530 Subject: [PATCH 085/177] bump Signed-off-by: Abhay-soni-developer --- .github/CODEOWNERS | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 294286d3bf..90ce81f73c 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -62,7 +62,7 @@ yarn.lock @backstage/maintainers @back /plugins/kafka-backend @backstage/maintainers @nirga @andrewthauer /plugins/kubernetes @backstage/maintainers @backstage/warpspeed /plugins/kubernetes-* @backstage/maintainers @backstage/warpspeed -/plugins/microsoft-calendar @backstage/maintainers @abhay-soni-developer @statusneo +/plugins/microsoft-calendar @backstage/maintainers @abhay-soni-developer @statusNeo /plugins/newrelic-dashboard @backstage/maintainers @mufaddal7 /plugins/playlist @backstage/maintainers @kuangp /plugins/playlist-* @backstage/maintainers @kuangp From 34041c45c80c2a785248e369238cccd250d5454a Mon Sep 17 00:00:00 2001 From: Ben Lambert Date: Tue, 14 Mar 2023 14:57:55 +0100 Subject: [PATCH 086/177] Update sharp-rings-cry.md Signed-off-by: Ben Lambert --- .changeset/sharp-rings-cry.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.changeset/sharp-rings-cry.md b/.changeset/sharp-rings-cry.md index 9e32a53526..ada106b251 100644 --- a/.changeset/sharp-rings-cry.md +++ b/.changeset/sharp-rings-cry.md @@ -1,5 +1,5 @@ --- -'@backstage/backend-common': minor +'@backstage/backend-common': patch '@backstage/backend-plugin-api': minor --- From 24632ad94b8b1838f2be363b813334138eaab2b4 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Tue, 14 Mar 2023 14:31:40 +0000 Subject: [PATCH 087/177] Version Packages --- .changeset/afraid-trees-stare.md | 5 - .changeset/backend-token-authentication.md | 5 - .changeset/beige-hats-cheer.md | 27 - .changeset/big-gorillas-fail1.md | 5 - .changeset/big-gorillas-fail2.md | 5 - .changeset/big-gorillas-fail3.md | 5 - .changeset/big-gorillas-fail4.md | 5 - .changeset/big-gorillas-fail5.md | 5 - .changeset/big-gorillas-fail6.md | 5 - .changeset/brave-planets-grab.md | 5 - .changeset/breezy-bees-care.md | 5 - .changeset/bright-kids-raise.md | 5 - .changeset/clean-lemons-jump.md | 7 - .changeset/clean-planes-join.md | 5 - .changeset/clever-dogs-cheat.md | 21 - .changeset/cold-dogs-watch.md | 5 - .changeset/cold-plants-boil.md | 5 - .changeset/cool-clocks-prove.md | 5 - .changeset/cool-feet-speak.md | 6 - .changeset/create-app-1676993958.md | 5 - .changeset/create-app-1678209629.md | 5 - .changeset/curvy-pets-hang.md | 5 - .changeset/cyan-sheep-tap.md | 5 - .changeset/dull-adults-drum.md | 5 - .changeset/eight-radios-bake.md | 5 - .changeset/eighty-chairs-roll.md | 5 - .changeset/eighty-geese-return.md | 5 - .changeset/empty-books-occur.md | 5 - .changeset/famous-sloths-tie.md | 5 - .changeset/fifty-beds-dress.md | 5 - .changeset/flat-kids-occur.md | 6 - .changeset/flat-peaches-act.md | 5 - .changeset/forty-snails-clap.md | 5 - .changeset/four-lizards-grin.md | 5 - .changeset/fresh-hairs-switch.md | 5 - .changeset/fuzzy-trains-search.md | 5 - .changeset/gentle-bears-love.md | 5 - .changeset/gentle-pears-clean.md | 5 - .changeset/gorgeous-pumas-speak.md | 5 - .changeset/great-trains-jam.md | 5 - .changeset/grumpy-bikes-begin.md | 5 - .changeset/happy-boxes-arrive.md | 5 - .changeset/healthy-buses-live-1.md | 5 - .changeset/healthy-buses-live-2.md | 5 - .changeset/healthy-buses-live-3.md | 5 - .changeset/healthy-buses-live-4.md | 5 - .changeset/healthy-buses-live-5.md | 5 - .changeset/healthy-buses-live-6.md | 5 - .changeset/healthy-buses-live-7.md | 5 - .changeset/healthy-buses-live-8.md | 5 - .changeset/healthy-buses-live-9.md | 5 - .changeset/honest-clouds-shout.md | 5 - .changeset/honest-nails-bake.md | 5 - .changeset/khaki-poems-run.md | 5 - .changeset/large-feet-wash.md | 5 - .changeset/light-bees-end.md | 5 - .changeset/light-sheep-trade.md | 5 - .changeset/long-nails-pump.md | 5 - .changeset/long-wolves-drive.md | 5 - .changeset/lovely-tigers-look.md | 5 - .changeset/many-carpets-act.md | 5 - .changeset/mean-emus-hide.md | 5 - .changeset/mean-toys-itch.md | 19 - .changeset/metal-suns-rhyme.md | 5 - .changeset/mighty-games-turn.md | 5 - .changeset/mighty-years-own.md | 5 - .changeset/modern-colts-exercise.md | 6 - .changeset/moody-apes-know.md | 16 - .changeset/new-jobs-deny.md | 5 - .changeset/nice-planets-wave.md | 5 - .changeset/nine-bikes-applaud.md | 5 - .changeset/ninety-turtles-wait.md | 5 - .changeset/odd-fireants-bathe.md | 6 - .changeset/odd-oranges-tease.md | 21 - .changeset/odd-waves-rescue.md | 5 - .changeset/old-foxes-shave.md | 5 - .changeset/olive-berries-poke.md | 5 - .changeset/orange-experts-hug.md | 5 - .changeset/perfect-mayflies-greet.md | 5 - .changeset/pink-apples-design.md | 7 - .changeset/pink-dolls-unite.md | 5 - .changeset/polite-chicken-do.md | 5 - .changeset/polite-falcons-jump.md | 5 - .changeset/polite-wombats-smash.md | 5 - .changeset/pre.json | 327 -- .changeset/proud-jokes-pull.md | 5 - .changeset/purple-days-film.md | 5 - .changeset/quick-coats-sneeze.md | 5 - .changeset/quick-schools-dress.md | 5 - .changeset/quick-tables-listen.md | 5 - .changeset/quiet-ghosts-float.md | 12 - .changeset/rare-buses-swim.md | 5 - .changeset/rare-grapes-count.md | 45 - .changeset/rare-pandas-hope.md | 5 - .changeset/rename-for-the-win.md | 6 - .changeset/renovate-3672e5e.md | 5 - .changeset/renovate-4775edd.md | 8 - .changeset/renovate-488b7e7.md | 5 - .changeset/renovate-80f8787.md | 6 - .changeset/renovate-fb85ae7.md | 125 - .changeset/rich-clocks-approve.md | 5 - .changeset/rich-wombats-rescue.md | 5 - .changeset/rotten-cats-matter.md | 19 - .changeset/rotten-panthers-share.md | 6 - .changeset/selfish-hats-wait.md | 5 - .changeset/sharp-hairs-arrive.md | 5 - .changeset/sharp-rings-cry.md | 6 - .changeset/short-mayflies-fix.md | 5 - .changeset/silent-dryers-end.md | 5 - .changeset/silly-suits-run.md | 7 - .changeset/silver-bikes-breathe.md | 24 - .changeset/silver-donkeys-eat.md | 5 - .changeset/silver-lies-rest.md | 7 - .changeset/six-melons-rhyme.md | 5 - .changeset/slimy-lobsters-kneel.md | 5 - .changeset/slow-insects-cheat.md | 7 - .changeset/slow-pens-compare.md | 5 - .changeset/slow-suits-grab.md | 5 - .changeset/spotty-bees-tell.md | 6 - .changeset/spotty-turtles-reply.md | 5 - .changeset/spotty-wasps-complain.md | 5 - .changeset/stupid-games-brake.md | 5 - .changeset/swift-bags-wave.md | 6 - .changeset/tall-hats-talk.md | 5 - .changeset/ten-tigers-marry.md | 16 - .changeset/thin-candles-wait.md | 5 - .changeset/tidy-planes-unite.md | 5 - .changeset/tidy-pumpkins-clean.md | 5 - .changeset/tidy-ties-guess.md | 5 - .changeset/tiny-llamas-jump.md | 5 - .changeset/tricky-jars-film.md | 5 - .changeset/twelve-cars-push.md | 20 - .changeset/twenty-insects-live.md | 5 - .changeset/twenty-jeans-speak.md | 5 - .changeset/unlucky-sloths-explain.md | 5 - .changeset/warm-vans-fail.md | 5 - .changeset/weak-coats-allow.md | 5 - .changeset/what-is-going-on-babe.md | 5 - .changeset/wicked-lions-repeat.md | 6 - .changeset/wicked-spoons-call.md | 5 - .changeset/wild-ads-pull.md | 5 - .changeset/wild-bulldogs-suffer.md | 5 - .changeset/witty-geckos-design.md | 9 - .changeset/witty-squids-fetch.md | 5 - .changeset/yellow-bananas-yawn.md | 5 - .changeset/young-schools-double.md | 5 - .changeset/young-scissors-cough.md | 5 - .changeset/young-walls-prove.md | 5 - docs/releases/v1.12.0-changelog.md | 2933 +++++++++++++++++ package.json | 2 +- packages/app-defaults/CHANGELOG.md | 11 + packages/app-defaults/package.json | 2 +- packages/app/CHANGELOG.md | 69 + packages/app/package.json | 2 +- packages/backend-app-api/CHANGELOG.md | 19 + packages/backend-app-api/package.json | 2 +- packages/backend-common/CHANGELOG.md | 37 + packages/backend-common/package.json | 2 +- packages/backend-defaults/CHANGELOG.md | 12 + packages/backend-defaults/package.json | 2 +- packages/backend-dev-utils/CHANGELOG.md | 6 + packages/backend-dev-utils/package.json | 2 +- packages/backend-next/CHANGELOG.md | 12 + packages/backend-next/package.json | 2 +- packages/backend-plugin-api/CHANGELOG.md | 17 + packages/backend-plugin-api/package.json | 2 +- packages/backend-tasks/CHANGELOG.md | 16 + packages/backend-tasks/package.json | 2 +- packages/backend-test-utils/CHANGELOG.md | 15 + packages/backend-test-utils/package.json | 2 +- packages/backend/CHANGELOG.md | 51 + packages/backend/package.json | 2 +- packages/catalog-client/CHANGELOG.md | 14 + packages/catalog-client/package.json | 2 +- packages/catalog-model/CHANGELOG.md | 10 + packages/catalog-model/package.json | 2 +- packages/cli-common/CHANGELOG.md | 6 + packages/cli-common/package.json | 2 +- packages/cli/CHANGELOG.md | 24 + packages/cli/package.json | 2 +- packages/codemods/CHANGELOG.md | 8 + packages/codemods/package.json | 2 +- packages/config-loader/CHANGELOG.md | 12 + packages/config-loader/package.json | 2 +- packages/config/CHANGELOG.md | 8 + packages/config/package.json | 2 +- packages/core-app-api/CHANGELOG.md | 29 + packages/core-app-api/package.json | 2 +- packages/core-components/CHANGELOG.md | 20 + packages/core-components/package.json | 2 +- packages/core-plugin-api/CHANGELOG.md | 15 + packages/core-plugin-api/package.json | 2 +- packages/create-app/CHANGELOG.md | 11 + packages/create-app/package.json | 2 +- packages/dev-utils/CHANGELOG.md | 16 + packages/dev-utils/package.json | 2 +- packages/e2e-test/CHANGELOG.md | 9 + packages/e2e-test/package.json | 2 +- packages/errors/CHANGELOG.md | 8 + packages/errors/package.json | 2 +- packages/eslint-plugin/CHANGELOG.md | 6 + packages/eslint-plugin/package.json | 2 +- packages/integration-aws-node/CHANGELOG.md | 8 + packages/integration-aws-node/package.json | 2 +- packages/integration-react/CHANGELOG.md | 12 + packages/integration-react/package.json | 2 +- packages/integration/CHANGELOG.md | 9 + packages/integration/package.json | 2 +- packages/release-manifests/CHANGELOG.md | 6 + packages/release-manifests/package.json | 2 +- packages/repo-tools/CHANGELOG.md | 10 + packages/repo-tools/package.json | 2 +- .../techdocs-cli-embedded-app/CHANGELOG.md | 19 + .../techdocs-cli-embedded-app/package.json | 2 +- packages/techdocs-cli/CHANGELOG.md | 16 + packages/techdocs-cli/package.json | 2 +- packages/test-utils/CHANGELOG.md | 16 + packages/test-utils/package.json | 2 +- packages/theme/CHANGELOG.md | 6 + packages/theme/package.json | 2 +- plugins/adr-backend/CHANGELOG.md | 17 + plugins/adr-backend/package.json | 2 +- plugins/adr-common/CHANGELOG.md | 9 + plugins/adr-common/package.json | 2 +- plugins/adr/CHANGELOG.md | 17 + plugins/adr/package.json | 2 +- plugins/airbrake-backend/CHANGELOG.md | 9 + plugins/airbrake-backend/package.json | 2 +- plugins/airbrake/CHANGELOG.md | 14 + plugins/airbrake/package.json | 2 +- plugins/allure/CHANGELOG.md | 12 + plugins/allure/package.json | 2 +- plugins/analytics-module-ga/CHANGELOG.md | 11 + plugins/analytics-module-ga/package.json | 2 +- plugins/apache-airflow/CHANGELOG.md | 9 + plugins/apache-airflow/package.json | 2 +- plugins/api-docs/CHANGELOG.md | 16 + plugins/api-docs/package.json | 2 +- plugins/apollo-explorer/CHANGELOG.md | 10 + plugins/apollo-explorer/package.json | 2 +- plugins/app-backend/CHANGELOG.md | 13 + plugins/app-backend/package.json | 2 +- plugins/auth-backend/CHANGELOG.md | 17 + plugins/auth-backend/package.json | 2 +- plugins/auth-node/CHANGELOG.md | 11 + plugins/auth-node/package.json | 2 +- plugins/azure-devops-backend/CHANGELOG.md | 10 + plugins/azure-devops-backend/package.json | 2 +- plugins/azure-devops/CHANGELOG.md | 14 + plugins/azure-devops/package.json | 2 +- plugins/azure-sites-backend/CHANGELOG.md | 10 + plugins/azure-sites-backend/package.json | 2 +- plugins/azure-sites/CHANGELOG.md | 14 + plugins/azure-sites/package.json | 2 +- plugins/badges-backend/CHANGELOG.md | 11 + plugins/badges-backend/package.json | 2 +- plugins/badges/CHANGELOG.md | 13 + plugins/badges/package.json | 2 +- plugins/bazaar-backend/CHANGELOG.md | 11 + plugins/bazaar-backend/package.json | 2 +- plugins/bazaar/CHANGELOG.md | 15 + plugins/bazaar/package.json | 2 +- plugins/bitbucket-cloud-common/CHANGELOG.md | 8 + plugins/bitbucket-cloud-common/package.json | 2 +- plugins/bitrise/CHANGELOG.md | 12 + plugins/bitrise/package.json | 2 +- .../catalog-backend-module-aws/CHANGELOG.md | 22 + .../catalog-backend-module-aws/package.json | 2 +- .../catalog-backend-module-azure/CHANGELOG.md | 21 + .../catalog-backend-module-azure/package.json | 2 +- .../CHANGELOG.md | 21 + .../package.json | 2 +- .../CHANGELOG.md | 18 + .../package.json | 2 +- .../CHANGELOG.md | 16 + .../package.json | 2 +- .../CHANGELOG.md | 18 + .../package.json | 2 +- .../CHANGELOG.md | 24 + .../package.json | 2 +- .../CHANGELOG.md | 23 + .../package.json | 2 +- .../CHANGELOG.md | 25 + .../package.json | 2 +- .../catalog-backend-module-ldap/CHANGELOG.md | 13 + .../catalog-backend-module-ldap/package.json | 2 +- .../CHANGELOG.md | 19 + .../package.json | 2 +- .../CHANGELOG.md | 13 + .../package.json | 2 +- .../CHANGELOG.md | 20 + .../package.json | 2 +- plugins/catalog-backend/CHANGELOG.md | 54 + plugins/catalog-backend/package.json | 2 +- plugins/catalog-common/CHANGELOG.md | 10 + plugins/catalog-common/package.json | 2 +- plugins/catalog-customized/CHANGELOG.md | 8 + plugins/catalog-customized/package.json | 2 +- plugins/catalog-graph/CHANGELOG.md | 12 + plugins/catalog-graph/package.json | 2 +- plugins/catalog-graphql/CHANGELOG.md | 14 + plugins/catalog-graphql/package.json | 2 +- plugins/catalog-import/CHANGELOG.md | 17 + plugins/catalog-import/package.json | 2 +- plugins/catalog-node/CHANGELOG.md | 14 + plugins/catalog-node/package.json | 2 +- plugins/catalog-react/CHANGELOG.md | 25 + plugins/catalog-react/package.json | 2 +- plugins/catalog/CHANGELOG.md | 49 + plugins/catalog/package.json | 2 +- .../CHANGELOG.md | 9 + .../package.json | 2 +- plugins/cicd-statistics/CHANGELOG.md | 9 + plugins/cicd-statistics/package.json | 2 +- plugins/circleci/CHANGELOG.md | 13 + plugins/circleci/package.json | 2 +- plugins/cloudbuild/CHANGELOG.md | 12 + plugins/cloudbuild/package.json | 2 +- plugins/code-climate/CHANGELOG.md | 13 + plugins/code-climate/package.json | 2 +- plugins/code-coverage-backend/CHANGELOG.md | 13 + plugins/code-coverage-backend/package.json | 2 +- plugins/code-coverage/CHANGELOG.md | 15 + plugins/code-coverage/package.json | 2 +- plugins/codescene/CHANGELOG.md | 12 + plugins/codescene/package.json | 2 +- plugins/config-schema/CHANGELOG.md | 13 + plugins/config-schema/package.json | 2 +- plugins/cost-insights/CHANGELOG.md | 15 + plugins/cost-insights/package.json | 2 +- plugins/dynatrace/CHANGELOG.md | 12 + plugins/dynatrace/package.json | 2 +- plugins/entity-feedback-backend/CHANGELOG.md | 13 + plugins/entity-feedback-backend/package.json | 2 +- plugins/entity-feedback/CHANGELOG.md | 14 + plugins/entity-feedback/package.json | 2 +- plugins/entity-validation/CHANGELOG.md | 17 + plugins/entity-validation/package.json | 2 +- .../CHANGELOG.md | 14 + .../package.json | 2 +- .../events-backend-module-azure/CHANGELOG.md | 10 + .../events-backend-module-azure/package.json | 2 +- .../CHANGELOG.md | 10 + .../package.json | 2 +- .../events-backend-module-gerrit/CHANGELOG.md | 10 + .../events-backend-module-gerrit/package.json | 2 +- .../events-backend-module-github/CHANGELOG.md | 11 + .../events-backend-module-github/package.json | 2 +- .../events-backend-module-gitlab/CHANGELOG.md | 11 + .../events-backend-module-gitlab/package.json | 2 +- .../events-backend-test-utils/CHANGELOG.md | 7 + .../events-backend-test-utils/package.json | 2 +- plugins/events-backend/CHANGELOG.md | 12 + plugins/events-backend/package.json | 2 +- plugins/events-node/CHANGELOG.md | 8 + plugins/events-node/package.json | 2 +- .../example-todo-list-backend/CHANGELOG.md | 11 + .../example-todo-list-backend/package.json | 2 +- plugins/example-todo-list-common/CHANGELOG.md | 7 + plugins/example-todo-list-common/package.json | 2 +- plugins/example-todo-list/CHANGELOG.md | 9 + plugins/example-todo-list/package.json | 2 +- plugins/explore-backend/CHANGELOG.md | 11 + plugins/explore-backend/package.json | 2 +- plugins/explore-react/CHANGELOG.md | 9 + plugins/explore-react/package.json | 2 +- plugins/explore/CHANGELOG.md | 21 + plugins/explore/package.json | 2 +- plugins/firehydrant/CHANGELOG.md | 17 + plugins/firehydrant/package.json | 2 +- plugins/fossa/CHANGELOG.md | 13 + plugins/fossa/package.json | 2 +- plugins/gcalendar/CHANGELOG.md | 12 + plugins/gcalendar/package.json | 2 +- plugins/gcp-projects/CHANGELOG.md | 10 + plugins/gcp-projects/package.json | 2 +- plugins/git-release-manager/CHANGELOG.md | 12 + plugins/git-release-manager/package.json | 2 +- plugins/github-actions/CHANGELOG.md | 13 + plugins/github-actions/package.json | 2 +- plugins/github-deployments/CHANGELOG.md | 15 + plugins/github-deployments/package.json | 2 +- plugins/github-issues/CHANGELOG.md | 14 + plugins/github-issues/package.json | 2 +- .../github-pull-requests-board/CHANGELOG.md | 13 + .../github-pull-requests-board/package.json | 2 +- plugins/gitops-profiles/CHANGELOG.md | 10 + plugins/gitops-profiles/package.json | 2 +- plugins/gocd/CHANGELOG.md | 13 + plugins/gocd/package.json | 2 +- plugins/graphiql/CHANGELOG.md | 10 + plugins/graphiql/package.json | 2 +- plugins/graphql-backend/CHANGELOG.md | 10 + plugins/graphql-backend/package.json | 2 +- plugins/graphql-voyager/CHANGELOG.md | 10 + plugins/graphql-voyager/package.json | 2 +- plugins/home/CHANGELOG.md | 13 + plugins/home/package.json | 2 +- plugins/ilert/CHANGELOG.md | 14 + plugins/ilert/package.json | 2 +- plugins/jenkins-backend/CHANGELOG.md | 15 + plugins/jenkins-backend/package.json | 2 +- plugins/jenkins-common/CHANGELOG.md | 9 + plugins/jenkins-common/package.json | 2 +- plugins/jenkins/CHANGELOG.md | 15 + plugins/jenkins/package.json | 2 +- plugins/kafka-backend/CHANGELOG.md | 11 + plugins/kafka-backend/package.json | 2 +- plugins/kafka/CHANGELOG.md | 13 + plugins/kafka/package.json | 2 +- plugins/kubernetes-backend/CHANGELOG.md | 14 + plugins/kubernetes-backend/package.json | 2 +- plugins/kubernetes-common/CHANGELOG.md | 7 + plugins/kubernetes-common/package.json | 2 +- plugins/kubernetes/CHANGELOG.md | 16 + plugins/kubernetes/package.json | 2 +- plugins/lighthouse-backend/CHANGELOG.md | 14 + plugins/lighthouse-backend/package.json | 2 +- plugins/lighthouse-common/CHANGELOG.md | 7 + plugins/lighthouse-common/package.json | 2 +- plugins/lighthouse/CHANGELOG.md | 14 + plugins/lighthouse/package.json | 2 +- plugins/linguist-backend/CHANGELOG.md | 28 + plugins/linguist-backend/package.json | 2 +- plugins/linguist/CHANGELOG.md | 15 + plugins/linguist/package.json | 2 +- plugins/microsoft-calendar/CHANGELOG.md | 12 + plugins/microsoft-calendar/package.json | 2 +- plugins/newrelic-dashboard/CHANGELOG.md | 12 + plugins/newrelic-dashboard/package.json | 2 +- plugins/newrelic/CHANGELOG.md | 11 + plugins/newrelic/package.json | 2 +- plugins/octopus-deploy/CHANGELOG.md | 17 + plugins/octopus-deploy/package.json | 2 +- plugins/org-react/CHANGELOG.md | 13 + plugins/org-react/package.json | 2 +- plugins/org/CHANGELOG.md | 15 + plugins/org/package.json | 2 +- plugins/pagerduty/CHANGELOG.md | 14 + plugins/pagerduty/package.json | 2 +- plugins/periskop-backend/CHANGELOG.md | 10 + plugins/periskop-backend/package.json | 2 +- plugins/periskop/CHANGELOG.md | 13 + plugins/periskop/package.json | 2 +- plugins/permission-backend/CHANGELOG.md | 13 + plugins/permission-backend/package.json | 2 +- plugins/permission-common/CHANGELOG.md | 10 + plugins/permission-common/package.json | 2 +- plugins/permission-node/CHANGELOG.md | 15 + plugins/permission-node/package.json | 2 +- plugins/permission-react/CHANGELOG.md | 9 + plugins/permission-react/package.json | 2 +- plugins/playlist-backend/CHANGELOG.md | 16 + plugins/playlist-backend/package.json | 2 +- plugins/playlist-common/CHANGELOG.md | 7 + plugins/playlist-common/package.json | 2 +- plugins/playlist/CHANGELOG.md | 20 + plugins/playlist/package.json | 2 +- plugins/proxy-backend/CHANGELOG.md | 24 + plugins/proxy-backend/package.json | 2 +- plugins/rollbar-backend/CHANGELOG.md | 9 + plugins/rollbar-backend/package.json | 2 +- plugins/rollbar/CHANGELOG.md | 12 + plugins/rollbar/package.json | 2 +- .../CHANGELOG.md | 15 + .../package.json | 2 +- .../CHANGELOG.md | 13 + .../package.json | 2 +- .../CHANGELOG.md | 9 + .../package.json | 2 +- .../CHANGELOG.md | 9 + .../package.json | 2 +- plugins/scaffolder-backend/CHANGELOG.md | 31 + plugins/scaffolder-backend/package.json | 2 +- plugins/scaffolder-common/CHANGELOG.md | 8 + plugins/scaffolder-common/package.json | 2 +- plugins/scaffolder-node/CHANGELOG.md | 10 + plugins/scaffolder-node/package.json | 2 +- plugins/scaffolder-react/CHANGELOG.md | 29 + plugins/scaffolder-react/package.json | 2 +- plugins/scaffolder/CHANGELOG.md | 35 + plugins/scaffolder/package.json | 2 +- .../CHANGELOG.md | 10 + .../package.json | 2 +- plugins/search-backend-module-pg/CHANGELOG.md | 10 + plugins/search-backend-module-pg/package.json | 2 +- plugins/search-backend-node/CHANGELOG.md | 12 + plugins/search-backend-node/package.json | 2 +- plugins/search-backend/CHANGELOG.md | 15 + plugins/search-backend/package.json | 2 +- plugins/search-common/CHANGELOG.md | 8 + plugins/search-common/package.json | 2 +- plugins/search-react/CHANGELOG.md | 14 + plugins/search-react/package.json | 2 +- plugins/search/CHANGELOG.md | 19 + plugins/search/package.json | 2 +- plugins/sentry/CHANGELOG.md | 12 + plugins/sentry/package.json | 2 +- plugins/shortcuts/CHANGELOG.md | 16 + plugins/shortcuts/package.json | 2 +- plugins/sonarqube-backend/CHANGELOG.md | 10 + plugins/sonarqube-backend/package.json | 2 +- plugins/sonarqube-react/CHANGELOG.md | 10 + plugins/sonarqube-react/package.json | 2 +- plugins/sonarqube/CHANGELOG.md | 17 + plugins/sonarqube/package.json | 2 +- plugins/splunk-on-call/CHANGELOG.md | 13 + plugins/splunk-on-call/package.json | 2 +- plugins/stack-overflow-backend/CHANGELOG.md | 10 + plugins/stack-overflow-backend/package.json | 2 +- plugins/stack-overflow/CHANGELOG.md | 15 + plugins/stack-overflow/package.json | 2 +- plugins/stackstorm/CHANGELOG.md | 15 + plugins/stackstorm/package.json | 2 +- .../CHANGELOG.md | 12 + .../package.json | 2 +- plugins/tech-insights-backend/CHANGELOG.md | 16 + plugins/tech-insights-backend/package.json | 2 +- plugins/tech-insights-node/CHANGELOG.md | 11 + plugins/tech-insights-node/package.json | 2 +- plugins/tech-insights/CHANGELOG.md | 16 + plugins/tech-insights/package.json | 2 +- plugins/tech-radar/CHANGELOG.md | 12 + plugins/tech-radar/package.json | 2 +- .../techdocs-addons-test-utils/CHANGELOG.md | 18 + .../techdocs-addons-test-utils/package.json | 2 +- plugins/techdocs-backend/CHANGELOG.md | 24 + plugins/techdocs-backend/package.json | 2 +- .../CHANGELOG.md | 14 + .../package.json | 2 +- plugins/techdocs-node/CHANGELOG.md | 20 + plugins/techdocs-node/package.json | 2 +- plugins/techdocs-react/CHANGELOG.md | 14 + plugins/techdocs-react/package.json | 2 +- plugins/techdocs/CHANGELOG.md | 30 + plugins/techdocs/package.json | 2 +- plugins/todo-backend/CHANGELOG.md | 16 + plugins/todo-backend/package.json | 2 +- plugins/todo/CHANGELOG.md | 13 + plugins/todo/package.json | 2 +- plugins/user-settings-backend/CHANGELOG.md | 12 + plugins/user-settings-backend/package.json | 2 +- plugins/user-settings/CHANGELOG.md | 14 + plugins/user-settings/package.json | 2 +- plugins/vault-backend/CHANGELOG.md | 12 + plugins/vault-backend/package.json | 2 +- plugins/vault/CHANGELOG.md | 13 + plugins/vault/package.json | 2 +- plugins/xcmetrics/CHANGELOG.md | 11 + plugins/xcmetrics/package.json | 2 +- yarn.lock | 292 +- 551 files changed, 6060 insertions(+), 1877 deletions(-) delete mode 100644 .changeset/afraid-trees-stare.md delete mode 100644 .changeset/backend-token-authentication.md delete mode 100644 .changeset/beige-hats-cheer.md delete mode 100644 .changeset/big-gorillas-fail1.md delete mode 100644 .changeset/big-gorillas-fail2.md delete mode 100644 .changeset/big-gorillas-fail3.md delete mode 100644 .changeset/big-gorillas-fail4.md delete mode 100644 .changeset/big-gorillas-fail5.md delete mode 100644 .changeset/big-gorillas-fail6.md delete mode 100644 .changeset/brave-planets-grab.md delete mode 100644 .changeset/breezy-bees-care.md delete mode 100644 .changeset/bright-kids-raise.md delete mode 100644 .changeset/clean-lemons-jump.md delete mode 100644 .changeset/clean-planes-join.md delete mode 100644 .changeset/clever-dogs-cheat.md delete mode 100644 .changeset/cold-dogs-watch.md delete mode 100644 .changeset/cold-plants-boil.md delete mode 100644 .changeset/cool-clocks-prove.md delete mode 100644 .changeset/cool-feet-speak.md delete mode 100644 .changeset/create-app-1676993958.md delete mode 100644 .changeset/create-app-1678209629.md delete mode 100644 .changeset/curvy-pets-hang.md delete mode 100644 .changeset/cyan-sheep-tap.md delete mode 100644 .changeset/dull-adults-drum.md delete mode 100644 .changeset/eight-radios-bake.md delete mode 100644 .changeset/eighty-chairs-roll.md delete mode 100644 .changeset/eighty-geese-return.md delete mode 100644 .changeset/empty-books-occur.md delete mode 100644 .changeset/famous-sloths-tie.md delete mode 100644 .changeset/fifty-beds-dress.md delete mode 100644 .changeset/flat-kids-occur.md delete mode 100644 .changeset/flat-peaches-act.md delete mode 100644 .changeset/forty-snails-clap.md delete mode 100644 .changeset/four-lizards-grin.md delete mode 100644 .changeset/fresh-hairs-switch.md delete mode 100644 .changeset/fuzzy-trains-search.md delete mode 100644 .changeset/gentle-bears-love.md delete mode 100644 .changeset/gentle-pears-clean.md delete mode 100644 .changeset/gorgeous-pumas-speak.md delete mode 100644 .changeset/great-trains-jam.md delete mode 100644 .changeset/grumpy-bikes-begin.md delete mode 100644 .changeset/happy-boxes-arrive.md delete mode 100644 .changeset/healthy-buses-live-1.md delete mode 100644 .changeset/healthy-buses-live-2.md delete mode 100644 .changeset/healthy-buses-live-3.md delete mode 100644 .changeset/healthy-buses-live-4.md delete mode 100644 .changeset/healthy-buses-live-5.md delete mode 100644 .changeset/healthy-buses-live-6.md delete mode 100644 .changeset/healthy-buses-live-7.md delete mode 100644 .changeset/healthy-buses-live-8.md delete mode 100644 .changeset/healthy-buses-live-9.md delete mode 100644 .changeset/honest-clouds-shout.md delete mode 100644 .changeset/honest-nails-bake.md delete mode 100644 .changeset/khaki-poems-run.md delete mode 100644 .changeset/large-feet-wash.md delete mode 100644 .changeset/light-bees-end.md delete mode 100644 .changeset/light-sheep-trade.md delete mode 100644 .changeset/long-nails-pump.md delete mode 100644 .changeset/long-wolves-drive.md delete mode 100644 .changeset/lovely-tigers-look.md delete mode 100644 .changeset/many-carpets-act.md delete mode 100644 .changeset/mean-emus-hide.md delete mode 100644 .changeset/mean-toys-itch.md delete mode 100644 .changeset/metal-suns-rhyme.md delete mode 100644 .changeset/mighty-games-turn.md delete mode 100644 .changeset/mighty-years-own.md delete mode 100644 .changeset/modern-colts-exercise.md delete mode 100644 .changeset/moody-apes-know.md delete mode 100644 .changeset/new-jobs-deny.md delete mode 100644 .changeset/nice-planets-wave.md delete mode 100644 .changeset/nine-bikes-applaud.md delete mode 100644 .changeset/ninety-turtles-wait.md delete mode 100644 .changeset/odd-fireants-bathe.md delete mode 100644 .changeset/odd-oranges-tease.md delete mode 100644 .changeset/odd-waves-rescue.md delete mode 100644 .changeset/old-foxes-shave.md delete mode 100644 .changeset/olive-berries-poke.md delete mode 100644 .changeset/orange-experts-hug.md delete mode 100644 .changeset/perfect-mayflies-greet.md delete mode 100644 .changeset/pink-apples-design.md delete mode 100644 .changeset/pink-dolls-unite.md delete mode 100644 .changeset/polite-chicken-do.md delete mode 100644 .changeset/polite-falcons-jump.md delete mode 100644 .changeset/polite-wombats-smash.md delete mode 100644 .changeset/pre.json delete mode 100644 .changeset/proud-jokes-pull.md delete mode 100644 .changeset/purple-days-film.md delete mode 100644 .changeset/quick-coats-sneeze.md delete mode 100644 .changeset/quick-schools-dress.md delete mode 100644 .changeset/quick-tables-listen.md delete mode 100644 .changeset/quiet-ghosts-float.md delete mode 100644 .changeset/rare-buses-swim.md delete mode 100644 .changeset/rare-grapes-count.md delete mode 100644 .changeset/rare-pandas-hope.md delete mode 100644 .changeset/rename-for-the-win.md delete mode 100644 .changeset/renovate-3672e5e.md delete mode 100644 .changeset/renovate-4775edd.md delete mode 100644 .changeset/renovate-488b7e7.md delete mode 100644 .changeset/renovate-80f8787.md delete mode 100644 .changeset/renovate-fb85ae7.md delete mode 100644 .changeset/rich-clocks-approve.md delete mode 100644 .changeset/rich-wombats-rescue.md delete mode 100644 .changeset/rotten-cats-matter.md delete mode 100644 .changeset/rotten-panthers-share.md delete mode 100644 .changeset/selfish-hats-wait.md delete mode 100644 .changeset/sharp-hairs-arrive.md delete mode 100644 .changeset/sharp-rings-cry.md delete mode 100644 .changeset/short-mayflies-fix.md delete mode 100644 .changeset/silent-dryers-end.md delete mode 100644 .changeset/silly-suits-run.md delete mode 100644 .changeset/silver-bikes-breathe.md delete mode 100644 .changeset/silver-donkeys-eat.md delete mode 100644 .changeset/silver-lies-rest.md delete mode 100644 .changeset/six-melons-rhyme.md delete mode 100644 .changeset/slimy-lobsters-kneel.md delete mode 100644 .changeset/slow-insects-cheat.md delete mode 100644 .changeset/slow-pens-compare.md delete mode 100644 .changeset/slow-suits-grab.md delete mode 100644 .changeset/spotty-bees-tell.md delete mode 100644 .changeset/spotty-turtles-reply.md delete mode 100644 .changeset/spotty-wasps-complain.md delete mode 100644 .changeset/stupid-games-brake.md delete mode 100644 .changeset/swift-bags-wave.md delete mode 100644 .changeset/tall-hats-talk.md delete mode 100644 .changeset/ten-tigers-marry.md delete mode 100644 .changeset/thin-candles-wait.md delete mode 100644 .changeset/tidy-planes-unite.md delete mode 100644 .changeset/tidy-pumpkins-clean.md delete mode 100644 .changeset/tidy-ties-guess.md delete mode 100644 .changeset/tiny-llamas-jump.md delete mode 100644 .changeset/tricky-jars-film.md delete mode 100644 .changeset/twelve-cars-push.md delete mode 100644 .changeset/twenty-insects-live.md delete mode 100644 .changeset/twenty-jeans-speak.md delete mode 100644 .changeset/unlucky-sloths-explain.md delete mode 100644 .changeset/warm-vans-fail.md delete mode 100644 .changeset/weak-coats-allow.md delete mode 100644 .changeset/what-is-going-on-babe.md delete mode 100644 .changeset/wicked-lions-repeat.md delete mode 100644 .changeset/wicked-spoons-call.md delete mode 100644 .changeset/wild-ads-pull.md delete mode 100644 .changeset/wild-bulldogs-suffer.md delete mode 100644 .changeset/witty-geckos-design.md delete mode 100644 .changeset/witty-squids-fetch.md delete mode 100644 .changeset/yellow-bananas-yawn.md delete mode 100644 .changeset/young-schools-double.md delete mode 100644 .changeset/young-scissors-cough.md delete mode 100644 .changeset/young-walls-prove.md create mode 100644 docs/releases/v1.12.0-changelog.md diff --git a/.changeset/afraid-trees-stare.md b/.changeset/afraid-trees-stare.md deleted file mode 100644 index 748bbb3cfe..0000000000 --- a/.changeset/afraid-trees-stare.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-scaffolder-backend': minor ---- - -Added the ability to be able to define an actions `input` and `output` schema using `zod` instead of hand writing types and `jsonschema` diff --git a/.changeset/backend-token-authentication.md b/.changeset/backend-token-authentication.md deleted file mode 100644 index 3b0f016800..0000000000 --- a/.changeset/backend-token-authentication.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-scaffolder-backend': patch ---- - -Make identity valid if subject of token is a backstage server-2-server auth token diff --git a/.changeset/beige-hats-cheer.md b/.changeset/beige-hats-cheer.md deleted file mode 100644 index 83b70d137e..0000000000 --- a/.changeset/beige-hats-cheer.md +++ /dev/null @@ -1,27 +0,0 @@ ---- -'@backstage/plugin-catalog-backend': patch ---- - -Add deprecations for symbols that were moved to `@backstage/plugin-catalog-node` a long time ago: - -- `CatalogProcessor` -- `CatalogProcessorCache` -- `CatalogProcessorEmit` -- `CatalogProcessorEntityResult` -- `CatalogProcessorErrorResult` -- `CatalogProcessorLocationResult` -- `CatalogProcessorParser` -- `CatalogProcessorRefreshKeysResult` -- `CatalogProcessorRelationResult` -- `CatalogProcessorResult` -- `DeferredEntity` -- `EntityProvider` -- `EntityProviderConnection` -- `EntityProviderMutation` -- `EntityRelationSpec` -- `processingResult` - -Also moved over and deprecated the following symbols: - -- `locationSpecToLocationEntity` -- `locationSpecToMetadataName` diff --git a/.changeset/big-gorillas-fail1.md b/.changeset/big-gorillas-fail1.md deleted file mode 100644 index 18c2d621d7..0000000000 --- a/.changeset/big-gorillas-fail1.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-events-backend-module-bitbucket-cloud': patch ---- - -Renamed `bitbucketCloudEventRouterEventsModule` to `eventsModuleBitbucketCloudEventRouter` to match the [recommended naming patterns](https://backstage.io/docs/backend-system/architecture/naming-patterns). diff --git a/.changeset/big-gorillas-fail2.md b/.changeset/big-gorillas-fail2.md deleted file mode 100644 index bc34bf9aaa..0000000000 --- a/.changeset/big-gorillas-fail2.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-events-backend-module-aws-sqs': patch ---- - -Renamed `awsSqsConsumingEventPublisherEventsModule` to `eventsModuleAwsSqsConsumingEventPublisher` to match the [recommended naming patterns](https://backstage.io/docs/backend-system/architecture/naming-patterns). diff --git a/.changeset/big-gorillas-fail3.md b/.changeset/big-gorillas-fail3.md deleted file mode 100644 index 352c1a2cff..0000000000 --- a/.changeset/big-gorillas-fail3.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-events-backend-module-gerrit': patch ---- - -Renamed `gerritEventRouterEventsModule` to `eventsModuleGerritEventRouter` to match the [recommended naming patterns](https://backstage.io/docs/backend-system/architecture/naming-patterns). diff --git a/.changeset/big-gorillas-fail4.md b/.changeset/big-gorillas-fail4.md deleted file mode 100644 index add8699f8b..0000000000 --- a/.changeset/big-gorillas-fail4.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-events-backend-module-github': patch ---- - -Renamed `githubEventRouterEventsModule` to `eventsModuleGithubEventRouter` and `githubWebhookEventsModule` to `eventsModuleGithubWebhook`, to match the [recommended naming patterns](https://backstage.io/docs/backend-system/architecture/naming-patterns). diff --git a/.changeset/big-gorillas-fail5.md b/.changeset/big-gorillas-fail5.md deleted file mode 100644 index 549eb61f24..0000000000 --- a/.changeset/big-gorillas-fail5.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-events-backend-module-gitlab': patch ---- - -Renamed `gitlabEventRouterEventsModule` to `eventsModuleGitlabEventRouter` and `gitlabWebhookEventsModule` to `eventsModuleGitlabWebhook` to match the [recommended naming patterns](https://backstage.io/docs/backend-system/architecture/naming-patterns). diff --git a/.changeset/big-gorillas-fail6.md b/.changeset/big-gorillas-fail6.md deleted file mode 100644 index 6622b5222e..0000000000 --- a/.changeset/big-gorillas-fail6.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-events-backend-module-azure': patch ---- - -Renamed `azureDevOpsEventRouterEventsModule` to `eventsModuleAzureDevOpsEventRouter` to match the [recommended naming patterns](https://backstage.io/docs/backend-system/architecture/naming-patterns). diff --git a/.changeset/brave-planets-grab.md b/.changeset/brave-planets-grab.md deleted file mode 100644 index 8b99978695..0000000000 --- a/.changeset/brave-planets-grab.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-catalog': patch ---- - -Make the "Copied!" message disappear automatically after some time diff --git a/.changeset/breezy-bees-care.md b/.changeset/breezy-bees-care.md deleted file mode 100644 index 9a5b59fe03..0000000000 --- a/.changeset/breezy-bees-care.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/catalog-client': minor ---- - -Add `queryEntities` method to `CatalogApi`. diff --git a/.changeset/bright-kids-raise.md b/.changeset/bright-kids-raise.md deleted file mode 100644 index e0d69e0c71..0000000000 --- a/.changeset/bright-kids-raise.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-todo-backend': patch ---- - -todo-backend is now exposed as a plugin which uses the new plugin system diff --git a/.changeset/clean-lemons-jump.md b/.changeset/clean-lemons-jump.md deleted file mode 100644 index ab6f22136a..0000000000 --- a/.changeset/clean-lemons-jump.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -'@backstage/core-components': patch ---- - -Button labels in the sidebar (previously displayed in uppercase) will be displayed in the case that is provided without any transformations. -For example, a sidebar button with the label "Search" will appear as Search, "search" will appear as search, "SEARCH" will appear as SEARCH etc. -This can potentially affect any overriding styles previously applied to change the appearance of Button labels in the Sidebar. diff --git a/.changeset/clean-planes-join.md b/.changeset/clean-planes-join.md deleted file mode 100644 index dd8280f553..0000000000 --- a/.changeset/clean-planes-join.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-permission-node': patch ---- - -Changed the `createPermissionIntegrationRouter` API to allow `getResources`, `resourceType` and `rules` to be optional diff --git a/.changeset/clever-dogs-cheat.md b/.changeset/clever-dogs-cheat.md deleted file mode 100644 index 56fcf3d30c..0000000000 --- a/.changeset/clever-dogs-cheat.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -'@backstage/plugin-search-backend-module-elasticsearch': patch -'@backstage/plugin-tech-insights-backend-module-jsonfc': patch -'@backstage/plugin-catalog-backend-module-github': patch -'@backstage/plugin-scaffolder-backend': patch -'@backstage/plugin-scaffolder-react': patch -'@backstage/plugin-splunk-on-call': patch -'@backstage/plugin-techdocs-react': patch -'@backstage/plugin-catalog-react': patch -'@backstage/plugin-tech-insights': patch -'@backstage/plugin-techdocs-node': patch -'@backstage/plugin-search-react': patch -'@backstage/plugin-scaffolder': patch -'@backstage/plugin-auth-node': patch -'@backstage/plugin-sonarqube': patch -'@backstage/plugin-techdocs': patch -'@backstage/plugin-explore': patch -'@backstage/plugin-search': patch ---- - -Minor API report tweaks diff --git a/.changeset/cold-dogs-watch.md b/.changeset/cold-dogs-watch.md deleted file mode 100644 index 99b25a833e..0000000000 --- a/.changeset/cold-dogs-watch.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-catalog-backend-module-puppetdb': patch ---- - -Added a `catalogModulePuppetDbEntityProvider` alpha export for the new backend system diff --git a/.changeset/cold-plants-boil.md b/.changeset/cold-plants-boil.md deleted file mode 100644 index a991601a88..0000000000 --- a/.changeset/cold-plants-boil.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-techdocs-node': patch ---- - -Update to a newer version of `@trendyol-js/openstack-swift-sdk` diff --git a/.changeset/cool-clocks-prove.md b/.changeset/cool-clocks-prove.md deleted file mode 100644 index dfd7b8c5eb..0000000000 --- a/.changeset/cool-clocks-prove.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/cli': patch ---- - -Fixed a bug where additional backend package entry points where not properly marked as internal during local development. diff --git a/.changeset/cool-feet-speak.md b/.changeset/cool-feet-speak.md deleted file mode 100644 index 9240c5bb52..0000000000 --- a/.changeset/cool-feet-speak.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -'@backstage/plugin-scaffolder-react': patch -'@backstage/plugin-scaffolder': patch ---- - -Make scaffolder adhere to page themes by using page `fontColor` consistently. If your theme overwrites template list or card headers, review those styles. diff --git a/.changeset/create-app-1676993958.md b/.changeset/create-app-1676993958.md deleted file mode 100644 index b50d431d4b..0000000000 --- a/.changeset/create-app-1676993958.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/create-app': patch ---- - -Bumped create-app version. diff --git a/.changeset/create-app-1678209629.md b/.changeset/create-app-1678209629.md deleted file mode 100644 index b50d431d4b..0000000000 --- a/.changeset/create-app-1678209629.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/create-app': patch ---- - -Bumped create-app version. diff --git a/.changeset/curvy-pets-hang.md b/.changeset/curvy-pets-hang.md deleted file mode 100644 index 3a2d11ac12..0000000000 --- a/.changeset/curvy-pets-hang.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/repo-tools': patch ---- - -Tweaked type dependency check to trim wildcard type imports. diff --git a/.changeset/cyan-sheep-tap.md b/.changeset/cyan-sheep-tap.md deleted file mode 100644 index 7812e6b6c6..0000000000 --- a/.changeset/cyan-sheep-tap.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/cli': patch ---- - -Added templates for new plugin Web and Node.js libraries. diff --git a/.changeset/dull-adults-drum.md b/.changeset/dull-adults-drum.md deleted file mode 100644 index 088eb1539e..0000000000 --- a/.changeset/dull-adults-drum.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-adr': patch ---- - -Updated readme instructions diff --git a/.changeset/eight-radios-bake.md b/.changeset/eight-radios-bake.md deleted file mode 100644 index 173739a625..0000000000 --- a/.changeset/eight-radios-bake.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-scaffolder-backend': patch ---- - -throw error from catalog:fetch scaffolder action when entity is null and optional is false diff --git a/.changeset/eighty-chairs-roll.md b/.changeset/eighty-chairs-roll.md deleted file mode 100644 index c981229378..0000000000 --- a/.changeset/eighty-chairs-roll.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-scaffolder': minor ---- - -Update `EntityPicker` to use the fully qualified entity ref instead of the humanized version. diff --git a/.changeset/eighty-geese-return.md b/.changeset/eighty-geese-return.md deleted file mode 100644 index 49361de8e7..0000000000 --- a/.changeset/eighty-geese-return.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-catalog-backend-module-msgraph': patch ---- - -Revert using `baseUrl` for MS Graph provider as it breaks token retrieval diff --git a/.changeset/empty-books-occur.md b/.changeset/empty-books-occur.md deleted file mode 100644 index 69218c5cfa..0000000000 --- a/.changeset/empty-books-occur.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-search-react': patch ---- - -Correctly disable next button in `SearchPagination` on last page diff --git a/.changeset/famous-sloths-tie.md b/.changeset/famous-sloths-tie.md deleted file mode 100644 index 53932afab6..0000000000 --- a/.changeset/famous-sloths-tie.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-scaffolder': patch ---- - -Getting credentials in the RepoUrlPicker now also works for targets without owner (e.g. Bitbucket Server). diff --git a/.changeset/fifty-beds-dress.md b/.changeset/fifty-beds-dress.md deleted file mode 100644 index 19049732cc..0000000000 --- a/.changeset/fifty-beds-dress.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-catalog-backend-module-puppetdb': minor ---- - -Initial version of the plugin. diff --git a/.changeset/flat-kids-occur.md b/.changeset/flat-kids-occur.md deleted file mode 100644 index 4e4c002928..0000000000 --- a/.changeset/flat-kids-occur.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -'@backstage/plugin-scaffolder-react': minor -'@backstage/plugin-scaffolder': minor ---- - -Move `useTaskStream`, `TaskBorder`, `TaskLogStream` and `TaskSteps` into `scaffolder-react`. diff --git a/.changeset/flat-peaches-act.md b/.changeset/flat-peaches-act.md deleted file mode 100644 index e4b4138ee5..0000000000 --- a/.changeset/flat-peaches-act.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-techdocs-backend': patch ---- - -Techdocs backend explains a bit more about what might have caused the docs not being found when building techdocs. diff --git a/.changeset/forty-snails-clap.md b/.changeset/forty-snails-clap.md deleted file mode 100644 index f5aef12d9d..0000000000 --- a/.changeset/forty-snails-clap.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-catalog-backend-module-incremental-ingestion': minor ---- - -Added endpoint to get a list of known incremental entity providers diff --git a/.changeset/four-lizards-grin.md b/.changeset/four-lizards-grin.md deleted file mode 100644 index 6fa5f57243..0000000000 --- a/.changeset/four-lizards-grin.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-catalog-backend': patch ---- - -Fix export of `defaultCatalogCollatorEntityTransformer`. diff --git a/.changeset/fresh-hairs-switch.md b/.changeset/fresh-hairs-switch.md deleted file mode 100644 index 16d3b119e5..0000000000 --- a/.changeset/fresh-hairs-switch.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/backend-tasks': minor ---- - -add functionality to get descriptions from the scheduler for triggering diff --git a/.changeset/fuzzy-trains-search.md b/.changeset/fuzzy-trains-search.md deleted file mode 100644 index 229d25f3b5..0000000000 --- a/.changeset/fuzzy-trains-search.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-catalog': patch ---- - -Fix icon alignment in `CatalogSearchResultListItem` diff --git a/.changeset/gentle-bears-love.md b/.changeset/gentle-bears-love.md deleted file mode 100644 index b6f6e3cfcf..0000000000 --- a/.changeset/gentle-bears-love.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-catalog-backend-module-msgraph': patch ---- - -Fixed msgraph catalog backend to use user.select option when fetching user from AzureAD diff --git a/.changeset/gentle-pears-clean.md b/.changeset/gentle-pears-clean.md deleted file mode 100644 index d92c3709ae..0000000000 --- a/.changeset/gentle-pears-clean.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/eslint-plugin': patch ---- - -Fixing a bug that we should check internal dependencies too diff --git a/.changeset/gorgeous-pumas-speak.md b/.changeset/gorgeous-pumas-speak.md deleted file mode 100644 index 60f40c6748..0000000000 --- a/.changeset/gorgeous-pumas-speak.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-catalog': patch ---- - -fix entity switch rendering when there is no default case diff --git a/.changeset/great-trains-jam.md b/.changeset/great-trains-jam.md deleted file mode 100644 index 91133bfe32..0000000000 --- a/.changeset/great-trains-jam.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-techdocs': patch ---- - -Fix bug that caused next and previous links not to work with certain versions of mkdocs-material diff --git a/.changeset/grumpy-bikes-begin.md b/.changeset/grumpy-bikes-begin.md deleted file mode 100644 index a98e6651f5..0000000000 --- a/.changeset/grumpy-bikes-begin.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-tech-insights-backend': patch ---- - -Add DB index to improve latency of latest fact query diff --git a/.changeset/happy-boxes-arrive.md b/.changeset/happy-boxes-arrive.md deleted file mode 100644 index 85998c1bdd..0000000000 --- a/.changeset/happy-boxes-arrive.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-scaffolder-react': patch ---- - -fix bug with `hasErrors` returning false when dealing with empty objects diff --git a/.changeset/healthy-buses-live-1.md b/.changeset/healthy-buses-live-1.md deleted file mode 100644 index 7e433372df..0000000000 --- a/.changeset/healthy-buses-live-1.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-catalog-backend-module-incremental-ingestion': patch ---- - -Renamed `incrementalIngestionEntityProviderCatalogModule` to `catalogModuleIncrementalIngestionEntityProvider` to match the [recommended naming patterns](https://backstage.io/docs/backend-system/architecture/naming-patterns). diff --git a/.changeset/healthy-buses-live-2.md b/.changeset/healthy-buses-live-2.md deleted file mode 100644 index ab577276d8..0000000000 --- a/.changeset/healthy-buses-live-2.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-catalog-backend-module-bitbucket-server': patch ---- - -Renamed `bitbucketServerEntityProviderCatalogModule` to `catalogModuleBitbucketServerEntityProvider` to match the [recommended naming patterns](https://backstage.io/docs/backend-system/architecture/naming-patterns). diff --git a/.changeset/healthy-buses-live-3.md b/.changeset/healthy-buses-live-3.md deleted file mode 100644 index 493236ea73..0000000000 --- a/.changeset/healthy-buses-live-3.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-catalog-backend-module-bitbucket-cloud': patch ---- - -Renamed `bitbucketCloudEntityProviderCatalogModule` to `catalogModuleBitbucketCloudEntityProvider` to match the [recommended naming patterns](https://backstage.io/docs/backend-system/architecture/naming-patterns). diff --git a/.changeset/healthy-buses-live-4.md b/.changeset/healthy-buses-live-4.md deleted file mode 100644 index fdc223a7f4..0000000000 --- a/.changeset/healthy-buses-live-4.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-catalog-backend-module-msgraph': patch ---- - -Renamed `microsoftGraphOrgEntityProviderCatalogModule` to `catalogModuleMicrosoftGraphOrgEntityProvider` to match the [recommended naming patterns](https://backstage.io/docs/backend-system/architecture/naming-patterns). diff --git a/.changeset/healthy-buses-live-5.md b/.changeset/healthy-buses-live-5.md deleted file mode 100644 index f540751696..0000000000 --- a/.changeset/healthy-buses-live-5.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-catalog-backend-module-gerrit': patch ---- - -Renamed `gerritEntityProviderCatalogModule` to `catalogModuleGerritEntityProvider` to match the [recommended naming patterns](https://backstage.io/docs/backend-system/architecture/naming-patterns). diff --git a/.changeset/healthy-buses-live-6.md b/.changeset/healthy-buses-live-6.md deleted file mode 100644 index f293e56eae..0000000000 --- a/.changeset/healthy-buses-live-6.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-catalog-backend-module-github': patch ---- - -Renamed `githubEntityProviderCatalogModule` to `catalogModuleGithubEntityProvider` to match the [recommended naming patterns](https://backstage.io/docs/backend-system/architecture/naming-patterns). diff --git a/.changeset/healthy-buses-live-7.md b/.changeset/healthy-buses-live-7.md deleted file mode 100644 index 7e7219bf01..0000000000 --- a/.changeset/healthy-buses-live-7.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-catalog-backend-module-gitlab': patch ---- - -Renamed `gitlabDiscoveryEntityProviderCatalogModule` to `catalogModuleGitlabDiscoveryEntityProvider` to match the [recommended naming patterns](https://backstage.io/docs/backend-system/architecture/naming-patterns). diff --git a/.changeset/healthy-buses-live-8.md b/.changeset/healthy-buses-live-8.md deleted file mode 100644 index 9137a3b31a..0000000000 --- a/.changeset/healthy-buses-live-8.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-catalog-backend-module-azure': patch ---- - -Renamed `azureDevOpsEntityProviderCatalogModule` to `catalogModuleAzureDevOpsEntityProvider` to match the [recommended naming patterns](https://backstage.io/docs/backend-system/architecture/naming-patterns). diff --git a/.changeset/healthy-buses-live-9.md b/.changeset/healthy-buses-live-9.md deleted file mode 100644 index dbcba51470..0000000000 --- a/.changeset/healthy-buses-live-9.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-catalog-backend-module-aws': patch ---- - -Renamed `awsS3EntityProviderCatalogModule` to `catalogModuleAwsS3EntityProviders` to match the [recommended naming patterns](https://backstage.io/docs/backend-system/architecture/naming-patterns). diff --git a/.changeset/honest-clouds-shout.md b/.changeset/honest-clouds-shout.md deleted file mode 100644 index 0a7249d9ad..0000000000 --- a/.changeset/honest-clouds-shout.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-scaffolder-backend': patch ---- - -catalog write action should allow any shape of object diff --git a/.changeset/honest-nails-bake.md b/.changeset/honest-nails-bake.md deleted file mode 100644 index 03d5a080c9..0000000000 --- a/.changeset/honest-nails-bake.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-octopus-deploy': minor ---- - -Initial version diff --git a/.changeset/khaki-poems-run.md b/.changeset/khaki-poems-run.md deleted file mode 100644 index 74db902c02..0000000000 --- a/.changeset/khaki-poems-run.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-entity-validation': patch ---- - -Fixed bug in EntityVaidation plugin where string in text box was unable to be updated. diff --git a/.changeset/large-feet-wash.md b/.changeset/large-feet-wash.md deleted file mode 100644 index 88a28f9d60..0000000000 --- a/.changeset/large-feet-wash.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-techdocs-backend': minor ---- - -Introduced alpha export of the `techdocsPlugin` using the new backend system. diff --git a/.changeset/light-bees-end.md b/.changeset/light-bees-end.md deleted file mode 100644 index 9fbbc44da0..0000000000 --- a/.changeset/light-bees-end.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-kubernetes': patch ---- - -GitLab can now be used as an `oidcTokenProvider` for Kubernetes clusters diff --git a/.changeset/light-sheep-trade.md b/.changeset/light-sheep-trade.md deleted file mode 100644 index 480ffc973e..0000000000 --- a/.changeset/light-sheep-trade.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/cli': patch ---- - -Updated the ESLint plugin configuration that is enabled through `yarn start --check` to only pick up valid source files. diff --git a/.changeset/long-nails-pump.md b/.changeset/long-nails-pump.md deleted file mode 100644 index d9eefc0249..0000000000 --- a/.changeset/long-nails-pump.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/cli': patch ---- - -Added a new `migrate package-exports` command that synchronizes package exports fields in all `package.json`s. diff --git a/.changeset/long-wolves-drive.md b/.changeset/long-wolves-drive.md deleted file mode 100644 index 1c3ffadb5a..0000000000 --- a/.changeset/long-wolves-drive.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-octopus-deploy': patch ---- - -Added Octopus Deploy logo diff --git a/.changeset/lovely-tigers-look.md b/.changeset/lovely-tigers-look.md deleted file mode 100644 index 5e7d230e6d..0000000000 --- a/.changeset/lovely-tigers-look.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-adr-backend': patch ---- - -Support MADR v3 format diff --git a/.changeset/many-carpets-act.md b/.changeset/many-carpets-act.md deleted file mode 100644 index 5285eeebbd..0000000000 --- a/.changeset/many-carpets-act.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-auth-backend': patch ---- - -Handle difference in expiration time between Microsoft session and Backstage session which caused the Backstage token to be invalid during a time frame. diff --git a/.changeset/mean-emus-hide.md b/.changeset/mean-emus-hide.md deleted file mode 100644 index 955e25d258..0000000000 --- a/.changeset/mean-emus-hide.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-scaffolder-react': patch ---- - -Remove timer for skipped steps in Scaffolder Next's TaskSteps diff --git a/.changeset/mean-toys-itch.md b/.changeset/mean-toys-itch.md deleted file mode 100644 index 75252b3482..0000000000 --- a/.changeset/mean-toys-itch.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -'@backstage/backend-common': patch ---- - -Adds config option `backend.database.role` to set ownership for newly created schemas and tables in Postgres - -The example config below connects to the database as user `v-backstage-123` but sets the ownership of -the create schemas and tables to `backstage` - -```yaml -backend: - database: - client: pg - pluginDivisionMode: schema - role: backstage - connection: - user: v-backstage-123 - ... -``` diff --git a/.changeset/metal-suns-rhyme.md b/.changeset/metal-suns-rhyme.md deleted file mode 100644 index 3fefdca7c6..0000000000 --- a/.changeset/metal-suns-rhyme.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/cli': patch ---- - -Bumped the `msw` version in templates to 1.0.0 diff --git a/.changeset/mighty-games-turn.md b/.changeset/mighty-games-turn.md deleted file mode 100644 index 38c2487835..0000000000 --- a/.changeset/mighty-games-turn.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-tech-radar': patch ---- - -Update colors to match Zalando's tech radar, also add coloring on title and legend to match ring color. diff --git a/.changeset/mighty-years-own.md b/.changeset/mighty-years-own.md deleted file mode 100644 index b14b974bc4..0000000000 --- a/.changeset/mighty-years-own.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-scaffolder-react': patch ---- - -scaffolder/next: Move the `uiSchema` to its own property in the validation `context` to align with component development and access of `ui:options` diff --git a/.changeset/modern-colts-exercise.md b/.changeset/modern-colts-exercise.md deleted file mode 100644 index 651f10bc98..0000000000 --- a/.changeset/modern-colts-exercise.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -'@backstage/plugin-catalog-backend-module-azure': patch ---- - -Add branch filter support -https://backstage.io/docs/integrations/azure/discovery diff --git a/.changeset/moody-apes-know.md b/.changeset/moody-apes-know.md deleted file mode 100644 index bd48cb108e..0000000000 --- a/.changeset/moody-apes-know.md +++ /dev/null @@ -1,16 +0,0 @@ ---- -'@backstage/plugin-catalog-backend-module-incremental-ingestion': patch -'@backstage/plugin-catalog-backend-module-bitbucket-server': patch -'@backstage/plugin-catalog-backend-module-bitbucket-cloud': patch -'@backstage/plugin-catalog-backend-module-bitbucket': patch -'@backstage/plugin-catalog-backend-module-puppetdb': patch -'@backstage/plugin-catalog-backend-module-msgraph': patch -'@backstage/plugin-catalog-backend-module-gerrit': patch -'@backstage/plugin-catalog-backend-module-github': patch -'@backstage/plugin-catalog-backend-module-gitlab': patch -'@backstage/plugin-catalog-backend-module-azure': patch -'@backstage/plugin-catalog-backend-module-ldap': patch -'@backstage/plugin-catalog-backend-module-aws': patch ---- - -Make sure to not use deprecated exports from `@backstage/plugin-catalog-backend` diff --git a/.changeset/new-jobs-deny.md b/.changeset/new-jobs-deny.md deleted file mode 100644 index e7b5bff71a..0000000000 --- a/.changeset/new-jobs-deny.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-catalog-react': minor ---- - -Add possibility to re-use EntityPicker for filters with multiple select. diff --git a/.changeset/nice-planets-wave.md b/.changeset/nice-planets-wave.md deleted file mode 100644 index 2af1a14d83..0000000000 --- a/.changeset/nice-planets-wave.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-linguist-backend': minor ---- - -**BREAKING** The linguist-backend `createRouter` now requires that the `tokenManger` is passed to the router. diff --git a/.changeset/nine-bikes-applaud.md b/.changeset/nine-bikes-applaud.md deleted file mode 100644 index 77a1c0e4be..0000000000 --- a/.changeset/nine-bikes-applaud.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-scaffolder-backend-module-cookiecutter': patch ---- - -allow container runner to be undefined in cookiecutter plugin diff --git a/.changeset/ninety-turtles-wait.md b/.changeset/ninety-turtles-wait.md deleted file mode 100644 index 683583528f..0000000000 --- a/.changeset/ninety-turtles-wait.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-techdocs': patch ---- - -The HTML tag attributes in the documentation content inserted to shadow DOM is preserved to improve accessibility diff --git a/.changeset/odd-fireants-bathe.md b/.changeset/odd-fireants-bathe.md deleted file mode 100644 index d4b7f5dc5a..0000000000 --- a/.changeset/odd-fireants-bathe.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -'@backstage/plugin-adr-backend': patch -'@backstage/cli': patch ---- - -Adjust express dependencies to be the same as the rest of the project diff --git a/.changeset/odd-oranges-tease.md b/.changeset/odd-oranges-tease.md deleted file mode 100644 index f9d5e60d19..0000000000 --- a/.changeset/odd-oranges-tease.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -'@backstage/plugin-git-release-manager': patch -'@backstage/plugin-microsoft-calendar': patch -'@backstage/plugin-newrelic-dashboard': patch -'@backstage/core-components': patch -'@backstage/plugin-code-coverage': patch -'@backstage/plugin-code-climate': patch -'@backstage/plugin-azure-sites': patch -'@backstage/plugin-firehydrant': patch -'@backstage/plugin-scaffolder': patch -'@backstage/plugin-tech-radar': patch -'@backstage/plugin-gcalendar': patch -'@backstage/plugin-shortcuts': patch -'@backstage/plugin-techdocs': patch -'@backstage/plugin-catalog': patch -'@backstage/plugin-explore': patch -'@backstage/plugin-ilert': patch -'@backstage/plugin-org': patch ---- - -Change black & white colors to be theme aware diff --git a/.changeset/odd-waves-rescue.md b/.changeset/odd-waves-rescue.md deleted file mode 100644 index e435bc9962..0000000000 --- a/.changeset/odd-waves-rescue.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-scaffolder': patch ---- - -Create an "Other Templates" group when groups are given to scaffolder/next. diff --git a/.changeset/old-foxes-shave.md b/.changeset/old-foxes-shave.md deleted file mode 100644 index 4cd0808103..0000000000 --- a/.changeset/old-foxes-shave.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-api-docs': patch ---- - -Add ApiDefinitionDialog component for fast access to the API definition in ProvidedApiCards and ConsumedApiCards. diff --git a/.changeset/olive-berries-poke.md b/.changeset/olive-berries-poke.md deleted file mode 100644 index 48bde329c8..0000000000 --- a/.changeset/olive-berries-poke.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-scaffolder-react': patch ---- - -scaffolder/next: Fix for steps without properties diff --git a/.changeset/orange-experts-hug.md b/.changeset/orange-experts-hug.md deleted file mode 100644 index 1bf8b4a7d7..0000000000 --- a/.changeset/orange-experts-hug.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-api-docs': patch ---- - -Fix dark theme Swagger's clear button font color. diff --git a/.changeset/perfect-mayflies-greet.md b/.changeset/perfect-mayflies-greet.md deleted file mode 100644 index 7e57507dae..0000000000 --- a/.changeset/perfect-mayflies-greet.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/cli': patch ---- - -Updated frontend plugin template to use some more recent features diff --git a/.changeset/pink-apples-design.md b/.changeset/pink-apples-design.md deleted file mode 100644 index 411786370a..0000000000 --- a/.changeset/pink-apples-design.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -'@backstage/plugin-shortcuts': patch ---- - -Fixed bug in LocalStoredShortcuts client where adding new Shortcut results in replacing entire shortcut list. - -Refactored LocalStoredShortcuts client to listen to `storageApi` updates to ensure that local state is always up to date. diff --git a/.changeset/pink-dolls-unite.md b/.changeset/pink-dolls-unite.md deleted file mode 100644 index 418edfd92b..0000000000 --- a/.changeset/pink-dolls-unite.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-linguist-backend': patch ---- - -Added support for linguist-js options using the linguistJSOptions in the plugin, the available config can be found [here](https://www.npmjs.com/package/linguist-js#API). diff --git a/.changeset/polite-chicken-do.md b/.changeset/polite-chicken-do.md deleted file mode 100644 index 33e4149253..0000000000 --- a/.changeset/polite-chicken-do.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-vault-backend': patch ---- - -Ignore the `eslint` error diff --git a/.changeset/polite-falcons-jump.md b/.changeset/polite-falcons-jump.md deleted file mode 100644 index ab9209913d..0000000000 --- a/.changeset/polite-falcons-jump.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-org': patch ---- - -Fix small UI-glitch in MemberListCard diff --git a/.changeset/polite-wombats-smash.md b/.changeset/polite-wombats-smash.md deleted file mode 100644 index 98569e1799..0000000000 --- a/.changeset/polite-wombats-smash.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/errors': patch ---- - -Added `NotImplementedError`, which can be used when the server does not recognize the request method and is incapable of supporting it for any resource. diff --git a/.changeset/pre.json b/.changeset/pre.json deleted file mode 100644 index fc7fbffc9a..0000000000 --- a/.changeset/pre.json +++ /dev/null @@ -1,327 +0,0 @@ -{ - "mode": "exit", - "tag": "next", - "initialVersions": { - "example-app": "0.2.80", - "@backstage/app-defaults": "1.2.0", - "example-backend": "0.2.80", - "@backstage/backend-app-api": "0.4.0", - "@backstage/backend-common": "0.18.2", - "@backstage/backend-defaults": "0.1.7", - "@backstage/backend-dev-utils": "0.1.0", - "example-backend-next": "0.0.8", - "@backstage/backend-plugin-api": "0.4.0", - "@backstage/backend-tasks": "0.4.3", - "@backstage/backend-test-utils": "0.1.34", - "@backstage/catalog-client": "1.3.1", - "@backstage/catalog-model": "1.2.0", - "@backstage/cli": "0.22.2", - "@backstage/cli-common": "0.1.11", - "@backstage/codemods": "0.1.43", - "@backstage/config": "1.0.6", - "@backstage/config-loader": "1.1.8", - "@backstage/core-app-api": "1.5.0", - "@backstage/core-components": "0.12.4", - "@backstage/core-plugin-api": "1.4.0", - "@backstage/create-app": "0.4.37", - "@backstage/dev-utils": "1.0.12", - "e2e-test": "0.2.0", - "@backstage/errors": "1.1.4", - "@backstage/eslint-plugin": "0.1.0", - "@backstage/integration": "1.4.2", - "@backstage/integration-aws-node": "0.1.1", - "@backstage/integration-react": "1.1.10", - "@backstage/release-manifests": "0.0.8", - "@backstage/repo-tools": "0.1.2", - "@techdocs/cli": "1.3.2", - "techdocs-cli-embedded-app": "0.2.79", - "@backstage/test-utils": "1.2.5", - "@backstage/theme": "0.2.17", - "@backstage/types": "1.0.2", - "@backstage/version-bridge": "1.0.3", - "@backstage/plugin-adr": "0.4.0", - "@backstage/plugin-adr-backend": "0.3.0", - "@backstage/plugin-adr-common": "0.2.6", - "@backstage/plugin-airbrake": "0.3.15", - "@backstage/plugin-airbrake-backend": "0.2.15", - "@backstage/plugin-allure": "0.1.31", - "@backstage/plugin-analytics-module-ga": "0.1.26", - "@backstage/plugin-apache-airflow": "0.2.8", - "@backstage/plugin-api-docs": "0.9.0", - "@backstage/plugin-api-docs-module-protoc-gen-doc": "0.1.1", - "@backstage/plugin-apollo-explorer": "0.1.8", - "@backstage/plugin-app-backend": "0.3.42", - "@backstage/plugin-auth-backend": "0.18.0", - "@backstage/plugin-auth-node": "0.2.11", - "@backstage/plugin-azure-devops": "0.2.6", - "@backstage/plugin-azure-devops-backend": "0.3.21", - "@backstage/plugin-azure-devops-common": "0.3.0", - "@backstage/plugin-azure-sites": "0.1.4", - "@backstage/plugin-azure-sites-backend": "0.1.4", - "@backstage/plugin-azure-sites-common": "0.1.0", - "@backstage/plugin-badges": "0.2.39", - "@backstage/plugin-badges-backend": "0.1.36", - "@backstage/plugin-bazaar": "0.2.4", - "@backstage/plugin-bazaar-backend": "0.2.5", - "@backstage/plugin-bitbucket-cloud-common": "0.2.3", - "@backstage/plugin-bitrise": "0.1.42", - "@backstage/plugin-catalog": "1.8.0", - "@backstage/plugin-catalog-backend": "1.7.2", - "@backstage/plugin-catalog-backend-module-aws": "0.1.15", - "@backstage/plugin-catalog-backend-module-azure": "0.1.13", - "@backstage/plugin-catalog-backend-module-bitbucket": "0.2.9", - "@backstage/plugin-catalog-backend-module-bitbucket-cloud": "0.1.9", - "@backstage/plugin-catalog-backend-module-bitbucket-server": "0.1.7", - "@backstage/plugin-catalog-backend-module-gerrit": "0.1.10", - "@backstage/plugin-catalog-backend-module-github": "0.2.5", - "@backstage/plugin-catalog-backend-module-gitlab": "0.1.13", - "@backstage/plugin-catalog-backend-module-incremental-ingestion": "0.2.0", - "@backstage/plugin-catalog-backend-module-ldap": "0.5.9", - "@backstage/plugin-catalog-backend-module-msgraph": "0.5.0", - "@backstage/plugin-catalog-backend-module-openapi": "0.1.8", - "@backstage/plugin-catalog-common": "1.0.11", - "@internal/plugin-catalog-customized": "0.0.7", - "@backstage/plugin-catalog-graph": "0.2.27", - "@backstage/plugin-catalog-graphql": "0.3.18", - "@backstage/plugin-catalog-import": "0.9.5", - "@backstage/plugin-catalog-node": "1.3.3", - "@backstage/plugin-catalog-react": "1.3.0", - "@backstage/plugin-cicd-statistics": "0.1.17", - "@backstage/plugin-cicd-statistics-module-gitlab": "0.1.11", - "@backstage/plugin-circleci": "0.3.15", - "@backstage/plugin-cloudbuild": "0.3.15", - "@backstage/plugin-code-climate": "0.1.15", - "@backstage/plugin-code-coverage": "0.2.8", - "@backstage/plugin-code-coverage-backend": "0.2.8", - "@backstage/plugin-codescene": "0.1.10", - "@backstage/plugin-config-schema": "0.1.38", - "@backstage/plugin-cost-insights": "0.12.4", - "@backstage/plugin-cost-insights-common": "0.1.1", - "@backstage/plugin-dynatrace": "2.0.0", - "@backstage/plugin-entity-feedback": "0.1.0", - "@backstage/plugin-entity-feedback-backend": "0.1.0", - "@backstage/plugin-entity-feedback-common": "0.1.0", - "@backstage/plugin-entity-validation": "0.1.0", - "@backstage/plugin-events-backend": "0.2.3", - "@backstage/plugin-events-backend-module-aws-sqs": "0.1.4", - "@backstage/plugin-events-backend-module-azure": "0.1.4", - "@backstage/plugin-events-backend-module-bitbucket-cloud": "0.1.4", - "@backstage/plugin-events-backend-module-gerrit": "0.1.4", - "@backstage/plugin-events-backend-module-github": "0.1.4", - "@backstage/plugin-events-backend-module-gitlab": "0.1.4", - "@backstage/plugin-events-backend-test-utils": "0.1.4", - "@backstage/plugin-events-node": "0.2.3", - "@internal/plugin-todo-list": "1.0.10", - "@internal/plugin-todo-list-backend": "1.0.10", - "@internal/plugin-todo-list-common": "1.0.8", - "@backstage/plugin-explore": "0.4.0", - "@backstage/plugin-explore-backend": "0.0.4", - "@backstage/plugin-explore-common": "0.0.1", - "@backstage/plugin-explore-react": "0.0.26", - "@backstage/plugin-firehydrant": "0.1.32", - "@backstage/plugin-fossa": "0.2.47", - "@backstage/plugin-gcalendar": "0.3.11", - "@backstage/plugin-gcp-projects": "0.3.34", - "@backstage/plugin-git-release-manager": "0.3.28", - "@backstage/plugin-github-actions": "0.5.15", - "@backstage/plugin-github-deployments": "0.1.46", - "@backstage/plugin-github-issues": "0.2.4", - "@backstage/plugin-github-pull-requests-board": "0.1.9", - "@backstage/plugin-gitops-profiles": "0.3.33", - "@backstage/plugin-gocd": "0.1.21", - "@backstage/plugin-graphiql": "0.2.47", - "@backstage/plugin-graphql-backend": "0.1.32", - "@backstage/plugin-graphql-voyager": "0.1.0", - "@backstage/plugin-home": "0.4.31", - "@backstage/plugin-ilert": "0.2.4", - "@backstage/plugin-jenkins": "0.7.14", - "@backstage/plugin-jenkins-backend": "0.1.32", - "@backstage/plugin-jenkins-common": "0.1.13", - "@backstage/plugin-kafka": "0.3.15", - "@backstage/plugin-kafka-backend": "0.2.35", - "@backstage/plugin-kubernetes": "0.7.8", - "@backstage/plugin-kubernetes-backend": "0.9.3", - "@backstage/plugin-kubernetes-common": "0.6.0", - "@backstage/plugin-lighthouse": "0.4.0", - "@backstage/plugin-lighthouse-backend": "0.1.0", - "@backstage/plugin-lighthouse-common": "0.1.0", - "@backstage/plugin-linguist": "0.1.0", - "@backstage/plugin-linguist-backend": "0.1.0", - "@backstage/plugin-linguist-common": "0.1.0", - "@backstage/plugin-microsoft-calendar": "0.1.0", - "@backstage/plugin-newrelic": "0.3.33", - "@backstage/plugin-newrelic-dashboard": "0.2.8", - "@backstage/plugin-org": "0.6.5", - "@backstage/plugin-org-react": "0.1.4", - "@backstage/plugin-pagerduty": "0.5.8", - "@backstage/plugin-periskop": "0.1.13", - "@backstage/plugin-periskop-backend": "0.1.13", - "@backstage/plugin-permission-backend": "0.5.17", - "@backstage/plugin-permission-common": "0.7.3", - "@backstage/plugin-permission-node": "0.7.5", - "@backstage/plugin-permission-react": "0.4.10", - "@backstage/plugin-playlist": "0.1.6", - "@backstage/plugin-playlist-backend": "0.2.5", - "@backstage/plugin-playlist-common": "0.1.4", - "@backstage/plugin-proxy-backend": "0.2.36", - "@backstage/plugin-rollbar": "0.4.15", - "@backstage/plugin-rollbar-backend": "0.1.39", - "@backstage/plugin-scaffolder": "1.11.0", - "@backstage/plugin-scaffolder-backend": "1.11.0", - "@backstage/plugin-scaffolder-backend-module-cookiecutter": "0.2.17", - "@backstage/plugin-scaffolder-backend-module-rails": "0.4.10", - "@backstage/plugin-scaffolder-backend-module-sentry": "0.1.2", - "@backstage/plugin-scaffolder-backend-module-yeoman": "0.2.15", - "@backstage/plugin-scaffolder-common": "1.2.5", - "@backstage/plugin-scaffolder-node": "0.1.0", - "@backstage/plugin-scaffolder-react": "1.1.0", - "@backstage/plugin-search": "1.1.0", - "@backstage/plugin-search-backend": "1.2.3", - "@backstage/plugin-search-backend-module-elasticsearch": "1.1.3", - "@backstage/plugin-search-backend-module-pg": "0.5.3", - "@backstage/plugin-search-backend-node": "1.1.3", - "@backstage/plugin-search-common": "1.2.1", - "@backstage/plugin-search-react": "1.5.0", - "@backstage/plugin-sentry": "0.5.0", - "@backstage/plugin-shortcuts": "0.3.7", - "@backstage/plugin-sonarqube": "0.6.3", - "@backstage/plugin-sonarqube-backend": "0.1.7", - "@backstage/plugin-sonarqube-react": "0.1.2", - "@backstage/plugin-splunk-on-call": "0.4.4", - "@backstage/plugin-stack-overflow": "0.1.11", - "@backstage/plugin-stack-overflow-backend": "0.1.11", - "@backstage/plugin-tech-insights": "0.3.7", - "@backstage/plugin-tech-insights-backend": "0.5.8", - "@backstage/plugin-tech-insights-backend-module-jsonfc": "0.1.26", - "@backstage/plugin-tech-insights-common": "0.2.10", - "@backstage/plugin-tech-insights-node": "0.4.0", - "@backstage/plugin-tech-radar": "0.6.1", - "@backstage/plugin-techdocs": "1.5.0", - "@backstage/plugin-techdocs-addons-test-utils": "1.0.10", - "@backstage/plugin-techdocs-backend": "1.5.3", - "@backstage/plugin-techdocs-module-addons-contrib": "1.0.10", - "@backstage/plugin-techdocs-node": "1.5.0", - "@backstage/plugin-techdocs-react": "1.1.3", - "@backstage/plugin-todo": "0.2.17", - "@backstage/plugin-todo-backend": "0.1.39", - "@backstage/plugin-user-settings": "0.7.0", - "@backstage/plugin-user-settings-backend": "0.1.6", - "@backstage/plugin-vault": "0.1.9", - "@backstage/plugin-vault-backend": "0.2.8", - "@backstage/plugin-xcmetrics": "0.2.35", - "@backstage/plugin-octopus-deploy": "0.0.0", - "@backstage/plugin-stackstorm": "0.0.0", - "@backstage/plugin-catalog-backend-module-puppetdb": "0.0.1" - }, - "changesets": [ - "afraid-trees-stare", - "backend-token-authentication", - "breezy-bees-care", - "bright-kids-raise", - "clean-lemons-jump", - "clean-planes-join", - "clever-dogs-cheat", - "cool-clocks-prove", - "cool-feet-speak", - "create-app-1676993958", - "create-app-1678209629", - "curvy-pets-hang", - "eight-radios-bake", - "eighty-chairs-roll", - "eighty-geese-return", - "empty-books-occur", - "famous-sloths-tie", - "fifty-beds-dress", - "flat-kids-occur", - "flat-peaches-act", - "forty-snails-clap", - "four-lizards-grin", - "fresh-hairs-switch", - "fuzzy-trains-search", - "gentle-bears-love", - "gentle-pears-clean", - "great-trains-jam", - "grumpy-bikes-begin", - "happy-boxes-arrive", - "honest-clouds-shout", - "honest-nails-bake", - "khaki-poems-run", - "light-bees-end", - "light-sheep-trade", - "long-nails-pump", - "long-wolves-drive", - "lovely-tigers-look", - "mean-toys-itch", - "metal-suns-rhyme", - "mighty-games-turn", - "mighty-years-own", - "new-jobs-deny", - "nice-planets-wave", - "nine-bikes-applaud", - "ninety-turtles-wait", - "odd-fireants-bathe", - "odd-oranges-tease", - "odd-waves-rescue", - "old-foxes-shave", - "olive-berries-poke", - "orange-experts-hug", - "perfect-mayflies-greet", - "pink-dolls-unite", - "polite-chicken-do", - "polite-falcons-jump", - "polite-wombats-smash", - "purple-days-film", - "quick-coats-sneeze", - "quick-schools-dress", - "quick-tables-listen", - "quiet-ghosts-float", - "rare-buses-swim", - "rare-grapes-count", - "rare-pandas-hope", - "rename-for-the-win", - "renovate-3672e5e", - "renovate-4775edd", - "renovate-488b7e7", - "renovate-80f8787", - "renovate-fb85ae7", - "rich-clocks-approve", - "rich-wombats-rescue", - "rotten-cats-matter", - "rotten-panthers-share", - "selfish-hats-wait", - "short-mayflies-fix", - "silent-dryers-end", - "silly-suits-run", - "silver-bikes-breathe", - "silver-lies-rest", - "six-melons-rhyme", - "slimy-lobsters-kneel", - "slow-insects-cheat", - "slow-pens-compare", - "slow-suits-grab", - "spotty-bees-tell", - "spotty-turtles-reply", - "spotty-wasps-complain", - "swift-bags-wave", - "tall-hats-talk", - "ten-tigers-marry", - "thin-candles-wait", - "tiny-llamas-jump", - "tricky-jars-film", - "twelve-cars-push", - "twenty-jeans-speak", - "unlucky-sloths-explain", - "warm-vans-fail", - "weak-coats-allow", - "what-is-going-on-babe", - "wicked-lions-repeat", - "wicked-spoons-call", - "wild-ads-pull", - "wild-bulldogs-suffer", - "witty-geckos-design", - "yellow-bananas-yawn", - "young-schools-double", - "young-scissors-cough", - "young-walls-prove" - ] -} diff --git a/.changeset/proud-jokes-pull.md b/.changeset/proud-jokes-pull.md deleted file mode 100644 index 7d7790889a..0000000000 --- a/.changeset/proud-jokes-pull.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-catalog-node': patch ---- - -Added `locationSpecToMetadataName` and `locationSpecToLocationEntity` as their new home, moved over from the backend package where they now are marked as deprecated. diff --git a/.changeset/purple-days-film.md b/.changeset/purple-days-film.md deleted file mode 100644 index 09d760c33e..0000000000 --- a/.changeset/purple-days-film.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-techdocs-node': patch ---- - -Fixed bug that prevented deletion of stale files when non-empty directories where tried to be deleted as well. diff --git a/.changeset/quick-coats-sneeze.md b/.changeset/quick-coats-sneeze.md deleted file mode 100644 index 24f7f70e83..0000000000 --- a/.changeset/quick-coats-sneeze.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@techdocs/cli': minor ---- - -Running `@techdocs/cli generate` with the `--verbose` flag will now print the mkdocs output. diff --git a/.changeset/quick-schools-dress.md b/.changeset/quick-schools-dress.md deleted file mode 100644 index 511709461e..0000000000 --- a/.changeset/quick-schools-dress.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-techdocs-addons-test-utils': patch ---- - -Fix bug/problem with test helper diff --git a/.changeset/quick-tables-listen.md b/.changeset/quick-tables-listen.md deleted file mode 100644 index fab9ef7969..0000000000 --- a/.changeset/quick-tables-listen.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-stackstorm': minor ---- - -Add StackStorm plugin to Backstage which is interfacing with StackStorm API. It allows users to view workflow executions, packs and actions. For installation and configuration instructions please view [README.md](https://github.com/backstage/backstage/tree/master/plugins/stackstorm/README.md) diff --git a/.changeset/quiet-ghosts-float.md b/.changeset/quiet-ghosts-float.md deleted file mode 100644 index dc8df90206..0000000000 --- a/.changeset/quiet-ghosts-float.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -'@backstage/plugin-entity-validation': patch -'@backstage/core-components': patch -'@backstage/plugin-kubernetes': patch -'@backstage/plugin-scaffolder': patch -'@backstage/plugin-circleci': patch -'@backstage/plugin-playlist': patch -'@backstage/plugin-techdocs': patch -'@backstage/plugin-explore': patch ---- - -Switch to using `LinkButton` instead of the deprecated `Button` diff --git a/.changeset/rare-buses-swim.md b/.changeset/rare-buses-swim.md deleted file mode 100644 index 4626343ca3..0000000000 --- a/.changeset/rare-buses-swim.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/backend-tasks': patch ---- - -Added the adapted query to mysql and sqlite3 databases to not returning warning on logs diff --git a/.changeset/rare-grapes-count.md b/.changeset/rare-grapes-count.md deleted file mode 100644 index fdeb653f3c..0000000000 --- a/.changeset/rare-grapes-count.md +++ /dev/null @@ -1,45 +0,0 @@ ---- -'@backstage/plugin-catalog-backend-module-incremental-ingestion': patch -'@backstage/plugin-catalog-backend-module-bitbucket-server': patch -'@backstage/plugin-catalog-backend-module-bitbucket-cloud': patch -'@backstage/plugin-events-backend-module-bitbucket-cloud': patch -'@backstage/plugin-catalog-backend-module-msgraph': patch -'@backstage/plugin-catalog-backend-module-gerrit': patch -'@backstage/plugin-catalog-backend-module-github': patch -'@backstage/plugin-catalog-backend-module-gitlab': patch -'@backstage/plugin-events-backend-module-aws-sqs': patch -'@backstage/plugin-catalog-backend-module-azure': patch -'@backstage/plugin-events-backend-module-gerrit': patch -'@backstage/plugin-events-backend-module-github': patch -'@backstage/plugin-events-backend-module-gitlab': patch -'@backstage/plugin-events-backend-module-azure': patch -'@backstage/plugin-catalog-backend-module-aws': patch -'@backstage/backend-plugin-api': patch -'@backstage/backend-test-utils': patch -'@backstage/plugin-scaffolder-backend': patch -'@backstage/backend-defaults': patch -'@backstage/backend-app-api': patch -'@backstage/core-plugin-api': patch -'@backstage/plugin-scaffolder-react': patch -'@backstage/plugin-techdocs-backend': patch -'@backstage/backend-common': patch -'@backstage/plugin-catalog-backend': patch -'@backstage/plugin-sonarqube-react': patch -'@backstage/catalog-model': patch -'@backstage/plugin-catalog-common': patch -'@backstage/plugin-events-backend': patch -'@backstage/plugin-jenkins-common': patch -'@backstage/plugin-techdocs-react': patch -'@backstage/plugin-catalog-react': patch -'@backstage/plugin-cost-insights': patch -'@backstage/plugin-catalog-node': patch -'@backstage/test-utils': patch -'@backstage/plugin-app-backend': patch -'@backstage/plugin-events-node': patch -'@backstage/plugin-scaffolder': patch -'@backstage/plugin-sonarqube': patch -'@backstage/plugin-catalog': patch -'@backstage/plugin-jenkins': patch ---- - -Internal refactor of `/alpha` exports. diff --git a/.changeset/rare-pandas-hope.md b/.changeset/rare-pandas-hope.md deleted file mode 100644 index 6e8e81fcfb..0000000000 --- a/.changeset/rare-pandas-hope.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-playlist': patch ---- - -Internal update to work with newer versions of react-router diff --git a/.changeset/rename-for-the-win.md b/.changeset/rename-for-the-win.md deleted file mode 100644 index 8b3dc6df58..0000000000 --- a/.changeset/rename-for-the-win.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -'@backstage/plugin-permission-node': patch ---- - -Update the service-to-service auth docs URL in error message. -`` diff --git a/.changeset/renovate-3672e5e.md b/.changeset/renovate-3672e5e.md deleted file mode 100644 index c94eec2245..0000000000 --- a/.changeset/renovate-3672e5e.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/cli': patch ---- - -Updated dependency `del` to `^7.0.0`. diff --git a/.changeset/renovate-4775edd.md b/.changeset/renovate-4775edd.md deleted file mode 100644 index 6472fac254..0000000000 --- a/.changeset/renovate-4775edd.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -'@backstage/plugin-catalog-graphql': patch ---- - -Updated dependency `@graphql-codegen/cli` to `^3.0.0`. -Updated dependency `@graphql-codegen/graphql-modules-preset` to `^3.0.0`. -Updated dependency `@graphql-codegen/typescript` to `^3.0.0`. -Updated dependency `@graphql-codegen/typescript-resolvers` to `^3.0.0`. diff --git a/.changeset/renovate-488b7e7.md b/.changeset/renovate-488b7e7.md deleted file mode 100644 index 35940f474b..0000000000 --- a/.changeset/renovate-488b7e7.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-auth-backend': patch ---- - -Updated dependency `@types/passport-microsoft` to `^1.0.0`. diff --git a/.changeset/renovate-80f8787.md b/.changeset/renovate-80f8787.md deleted file mode 100644 index addac46355..0000000000 --- a/.changeset/renovate-80f8787.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -'@backstage/plugin-techdocs-react': patch -'@backstage/plugin-techdocs': patch ---- - -Updated dependency `jss` to `~10.10.0`. diff --git a/.changeset/renovate-fb85ae7.md b/.changeset/renovate-fb85ae7.md deleted file mode 100644 index 920469850c..0000000000 --- a/.changeset/renovate-fb85ae7.md +++ /dev/null @@ -1,125 +0,0 @@ ---- -'@backstage/backend-common': patch -'@backstage/backend-test-utils': patch -'@backstage/catalog-client': patch -'@backstage/cli': patch -'@backstage/config-loader': patch -'@backstage/core-app-api': patch -'@backstage/core-components': patch -'@backstage/core-plugin-api': patch -'@backstage/integration-react': patch -'@backstage/integration': patch -'@backstage/release-manifests': patch -'@backstage/test-utils': patch -'@backstage/plugin-adr-backend': patch -'@backstage/plugin-adr': patch -'@backstage/plugin-airbrake-backend': patch -'@backstage/plugin-airbrake': patch -'@backstage/plugin-allure': patch -'@backstage/plugin-analytics-module-ga': patch -'@backstage/plugin-apache-airflow': patch -'@backstage/plugin-api-docs': patch -'@backstage/plugin-apollo-explorer': patch -'@backstage/plugin-app-backend': patch -'@backstage/plugin-auth-backend': patch -'@backstage/plugin-auth-node': patch -'@backstage/plugin-azure-devops-backend': patch -'@backstage/plugin-azure-devops': patch -'@backstage/plugin-azure-sites-backend': patch -'@backstage/plugin-azure-sites': patch -'@backstage/plugin-badges': patch -'@backstage/plugin-bitbucket-cloud-common': patch -'@backstage/plugin-bitrise': patch -'@backstage/plugin-catalog-backend-module-azure': patch -'@backstage/plugin-catalog-backend-module-bitbucket-cloud': patch -'@backstage/plugin-catalog-backend-module-bitbucket-server': patch -'@backstage/plugin-catalog-backend-module-bitbucket': patch -'@backstage/plugin-catalog-backend-module-gerrit': patch -'@backstage/plugin-catalog-backend-module-github': patch -'@backstage/plugin-catalog-backend-module-gitlab': patch -'@backstage/plugin-catalog-backend-module-msgraph': patch -'@backstage/plugin-catalog-backend': patch -'@backstage/plugin-catalog-graphql': patch -'@backstage/plugin-catalog-import': patch -'@backstage/plugin-circleci': patch -'@backstage/plugin-cloudbuild': patch -'@backstage/plugin-code-climate': patch -'@backstage/plugin-code-coverage-backend': patch -'@backstage/plugin-code-coverage': patch -'@backstage/plugin-codescene': patch -'@backstage/plugin-config-schema': patch -'@backstage/plugin-cost-insights': patch -'@backstage/plugin-dynatrace': patch -'@backstage/plugin-entity-feedback-backend': patch -'@backstage/plugin-entity-feedback': patch -'@backstage/plugin-entity-validation': patch -'@backstage/plugin-explore-backend': patch -'@backstage/plugin-explore-react': patch -'@backstage/plugin-explore': patch -'@backstage/plugin-firehydrant': patch -'@backstage/plugin-fossa': patch -'@backstage/plugin-gcalendar': patch -'@backstage/plugin-gcp-projects': patch -'@backstage/plugin-git-release-manager': patch -'@backstage/plugin-github-actions': patch -'@backstage/plugin-github-deployments': patch -'@backstage/plugin-github-issues': patch -'@backstage/plugin-github-pull-requests-board': patch -'@backstage/plugin-gitops-profiles': patch -'@backstage/plugin-gocd': patch -'@backstage/plugin-graphiql': patch -'@backstage/plugin-graphql-backend': patch -'@backstage/plugin-graphql-voyager': patch -'@backstage/plugin-home': patch -'@backstage/plugin-ilert': patch -'@backstage/plugin-jenkins-backend': patch -'@backstage/plugin-jenkins': patch -'@backstage/plugin-kafka': patch -'@backstage/plugin-kubernetes-backend': patch -'@backstage/plugin-kubernetes': patch -'@backstage/plugin-lighthouse': patch -'@backstage/plugin-linguist-backend': patch -'@backstage/plugin-linguist': patch -'@backstage/plugin-microsoft-calendar': patch -'@backstage/plugin-newrelic': patch -'@backstage/plugin-octopus-deploy': patch -'@backstage/plugin-org-react': patch -'@backstage/plugin-org': patch -'@backstage/plugin-pagerduty': patch -'@backstage/plugin-periskop-backend': patch -'@backstage/plugin-periskop': patch -'@backstage/plugin-permission-backend': patch -'@backstage/plugin-permission-common': patch -'@backstage/plugin-permission-node': patch -'@backstage/plugin-playlist-backend': patch -'@backstage/plugin-playlist': patch -'@backstage/plugin-proxy-backend': patch -'@backstage/plugin-rollbar-backend': patch -'@backstage/plugin-rollbar': patch -'@backstage/plugin-scaffolder-backend-module-cookiecutter': patch -'@backstage/plugin-scaffolder-backend': patch -'@backstage/plugin-scaffolder': patch -'@backstage/plugin-search': patch -'@backstage/plugin-sentry': patch -'@backstage/plugin-shortcuts': patch -'@backstage/plugin-sonarqube-backend': patch -'@backstage/plugin-sonarqube': patch -'@backstage/plugin-splunk-on-call': patch -'@backstage/plugin-stack-overflow-backend': patch -'@backstage/plugin-stack-overflow': patch -'@backstage/plugin-stackstorm': patch -'@backstage/plugin-tech-insights': patch -'@backstage/plugin-tech-radar': patch -'@backstage/plugin-techdocs-addons-test-utils': patch -'@backstage/plugin-techdocs-backend': patch -'@backstage/plugin-techdocs-module-addons-contrib': patch -'@backstage/plugin-techdocs': patch -'@backstage/plugin-todo-backend': patch -'@backstage/plugin-todo': patch -'@backstage/plugin-user-settings': patch -'@backstage/plugin-vault-backend': patch -'@backstage/plugin-vault': patch -'@backstage/plugin-xcmetrics': patch ---- - -Updated dependency `msw` to `^1.0.0`. diff --git a/.changeset/rich-clocks-approve.md b/.changeset/rich-clocks-approve.md deleted file mode 100644 index 319a8a7c9c..0000000000 --- a/.changeset/rich-clocks-approve.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-lighthouse-backend': patch ---- - -Update README.md; typo with plugin name & removed unneeded "import { Router } from 'express';" diff --git a/.changeset/rich-wombats-rescue.md b/.changeset/rich-wombats-rescue.md deleted file mode 100644 index d62f38cb4a..0000000000 --- a/.changeset/rich-wombats-rescue.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/core-components': patch ---- - -Updated the `aria-label` of the `HeaderTabs` component. diff --git a/.changeset/rotten-cats-matter.md b/.changeset/rotten-cats-matter.md deleted file mode 100644 index 2515db9991..0000000000 --- a/.changeset/rotten-cats-matter.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -'@backstage/core-app-api': minor ---- - -`OAuth2` now gets ID tokens from a session with the `openid` scope explicitly -requested. - -This should not be considered a breaking change, because spec-compliant OIDC -providers will already be returning ID tokens if and only if the `openid` scope -is granted. - -This change makes the dependence explicit, and removes the burden on -OAuth2-based providers which require an ID token (e.g. this is done by various -default [auth -handlers](https://backstage.io/docs/auth/identity-resolver/#authhandler)) to add -`openid` to their default scopes. _That_ could carry another indirect benefit: -by removing `openid` from the default scopes for a provider, grants for -resource-specific access tokens can avoid requesting excess ID token-related -scopes. diff --git a/.changeset/rotten-panthers-share.md b/.changeset/rotten-panthers-share.md deleted file mode 100644 index b9f0dd6691..0000000000 --- a/.changeset/rotten-panthers-share.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -'@backstage/backend-common': patch -'@backstage/plugin-catalog-backend-module-aws': patch ---- - -AwsS3UrlReader upgraded to use aws-sdk v3 diff --git a/.changeset/selfish-hats-wait.md b/.changeset/selfish-hats-wait.md deleted file mode 100644 index d706d42e8e..0000000000 --- a/.changeset/selfish-hats-wait.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-org': patch ---- - -Add styling to the `MembersListCard` and `ComponentsGrid` to handle overflow text. diff --git a/.changeset/sharp-hairs-arrive.md b/.changeset/sharp-hairs-arrive.md deleted file mode 100644 index a7f922566a..0000000000 --- a/.changeset/sharp-hairs-arrive.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-scaffolder-backend': patch ---- - -Extended scaffolder action `catalog:fetch` to fetch multiple catalog entities by entity references. diff --git a/.changeset/sharp-rings-cry.md b/.changeset/sharp-rings-cry.md deleted file mode 100644 index ada106b251..0000000000 --- a/.changeset/sharp-rings-cry.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -'@backstage/backend-common': patch -'@backstage/backend-plugin-api': minor ---- - -Added `lastModifiedAt` field on `UrlReaderService` responses and a `lastModifiedAfter` option to `UrlReaderService.readUrl`. diff --git a/.changeset/short-mayflies-fix.md b/.changeset/short-mayflies-fix.md deleted file mode 100644 index 9d68a85da7..0000000000 --- a/.changeset/short-mayflies-fix.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-pagerduty': patch ---- - -Update readme link for discord channel diff --git a/.changeset/silent-dryers-end.md b/.changeset/silent-dryers-end.md deleted file mode 100644 index d15ea602ae..0000000000 --- a/.changeset/silent-dryers-end.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-scaffolder': patch ---- - -Fix the scaffolder validator for arrays when the item is a field in the object diff --git a/.changeset/silly-suits-run.md b/.changeset/silly-suits-run.md deleted file mode 100644 index ec371e4077..0000000000 --- a/.changeset/silly-suits-run.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -'@backstage/plugin-catalog-backend': minor ---- - -Add /entities/by-query endpoint returning paginated entities. - -The endpoint supports cursor base pagination and server side sorting of the entities diff --git a/.changeset/silver-bikes-breathe.md b/.changeset/silver-bikes-breathe.md deleted file mode 100644 index 0288580bba..0000000000 --- a/.changeset/silver-bikes-breathe.md +++ /dev/null @@ -1,24 +0,0 @@ ---- -'@backstage/plugin-catalog': minor ---- - -Allow `EntitySwitch` to render all cases that match the condition. - -This change introduces a new parameter for the `EntitySwitch` component -`renderMultipleMatches`. In case the parameter value is `all`, the `EntitySwitch` -will render all `EntitySwitch.Case` that contain `if` parameter, and it -evaluates to true. In case none of the cases match, the default case will be -rendered, if any. - -This means for example in the CI/CD page you can now do the following: - -```tsx - - Jenkins - CodeBuild - No CI/CD - -``` - -This allows the component to have multiple CI/CD systems and all of those are -rendered on the same page. diff --git a/.changeset/silver-donkeys-eat.md b/.changeset/silver-donkeys-eat.md deleted file mode 100644 index 0995a2025c..0000000000 --- a/.changeset/silver-donkeys-eat.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-stack-overflow': patch ---- - -Export api ref and StackOverflowApi type diff --git a/.changeset/silver-lies-rest.md b/.changeset/silver-lies-rest.md deleted file mode 100644 index 34b77f5375..0000000000 --- a/.changeset/silver-lies-rest.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -'@backstage/plugin-catalog-backend-module-gitlab': patch ---- - -The configuration key `branch` of the `GitlabDiscoveryEntityProvider` has been deprecated in favor of the configuration key `fallbackBranch`. -It will be reused in future release to enforce a concrete branch to be used in catalog file discovery. -To migrate to the new configuration value, rename `branch` to `fallbackBranch`. diff --git a/.changeset/six-melons-rhyme.md b/.changeset/six-melons-rhyme.md deleted file mode 100644 index dbb878fc89..0000000000 --- a/.changeset/six-melons-rhyme.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-scaffolder-react': patch ---- - -scaffolder/next: Added the ability to get the fields definition in the schema in the validation function diff --git a/.changeset/slimy-lobsters-kneel.md b/.changeset/slimy-lobsters-kneel.md deleted file mode 100644 index 40ff476a64..0000000000 --- a/.changeset/slimy-lobsters-kneel.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-linguist-backend': patch ---- - -Fixed bug in LinguistBackendApi that caused initial batch of entities to be skipped. diff --git a/.changeset/slow-insects-cheat.md b/.changeset/slow-insects-cheat.md deleted file mode 100644 index 70b7bbf69b..0000000000 --- a/.changeset/slow-insects-cheat.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -'@backstage/plugin-techdocs': minor -'@backstage/plugin-catalog': minor -'@backstage/plugin-explore': patch ---- - -Add ability to pass icon as function to have ability to customize it by search item diff --git a/.changeset/slow-pens-compare.md b/.changeset/slow-pens-compare.md deleted file mode 100644 index 158cb6f760..0000000000 --- a/.changeset/slow-pens-compare.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-catalog-backend': patch ---- - -Fix a bug where the batch fetch by ref endpoint did not work in conjunction with filtering (e.g. if authorization was enabled). diff --git a/.changeset/slow-suits-grab.md b/.changeset/slow-suits-grab.md deleted file mode 100644 index 4a741cac6b..0000000000 --- a/.changeset/slow-suits-grab.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-catalog-backend-module-msgraph': patch ---- - -properly support custom graph api URL diff --git a/.changeset/spotty-bees-tell.md b/.changeset/spotty-bees-tell.md deleted file mode 100644 index 5267d8a6a0..0000000000 --- a/.changeset/spotty-bees-tell.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -'@backstage/plugin-catalog-backend-module-incremental-ingestion': patch -'@backstage/plugin-catalog-backend-module-aws': patch ---- - -Fix missing `dependencies` in `package.json` diff --git a/.changeset/spotty-turtles-reply.md b/.changeset/spotty-turtles-reply.md deleted file mode 100644 index 2dfc12a176..0000000000 --- a/.changeset/spotty-turtles-reply.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-techdocs': patch ---- - -Copy to clipboard now works in a not secure context. diff --git a/.changeset/spotty-wasps-complain.md b/.changeset/spotty-wasps-complain.md deleted file mode 100644 index 7b1e42b2a0..0000000000 --- a/.changeset/spotty-wasps-complain.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-scaffolder-react': patch ---- - -Fix alignment bug for owners on `TemplateCard` diff --git a/.changeset/stupid-games-brake.md b/.changeset/stupid-games-brake.md deleted file mode 100644 index 0a50a32ffa..0000000000 --- a/.changeset/stupid-games-brake.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-events-backend': patch ---- - -Updated README instructions diff --git a/.changeset/swift-bags-wave.md b/.changeset/swift-bags-wave.md deleted file mode 100644 index 8f57c7f89b..0000000000 --- a/.changeset/swift-bags-wave.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -'@backstage/plugin-sonarqube-react': patch -'@backstage/plugin-sonarqube': patch ---- - -Moved imports from `/alpha` to main public exports. diff --git a/.changeset/tall-hats-talk.md b/.changeset/tall-hats-talk.md deleted file mode 100644 index b10af002f6..0000000000 --- a/.changeset/tall-hats-talk.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/cli': patch ---- - -Keep custom exports entry points in package.json diff --git a/.changeset/ten-tigers-marry.md b/.changeset/ten-tigers-marry.md deleted file mode 100644 index f90f7b3ea2..0000000000 --- a/.changeset/ten-tigers-marry.md +++ /dev/null @@ -1,16 +0,0 @@ ---- -'@backstage/plugin-proxy-backend': patch ---- - -The proxy-backend plugin now supports reviving request bodies that have previously been consumed by an express middleware (e.g. `express.json()`). This is done by setting `reviveConsumedRequestBodies: true` on the proxy `RouterOptions`. In order to preserve the current behavior, the proxy will **not** revive request bodies by default. - -The following is an example of a proxy `createRouter` invocation that revives request bodies: - -```diff -const router = await createRouter({ - config, - logger, - discovery, -+ reviveConsumedRequestBodies: true, -}); -``` diff --git a/.changeset/thin-candles-wait.md b/.changeset/thin-candles-wait.md deleted file mode 100644 index c7e18367b5..0000000000 --- a/.changeset/thin-candles-wait.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-sonarqube': patch ---- - -Show a more appropriate icon if there are no code smells and/or vulnerabilities. diff --git a/.changeset/tidy-planes-unite.md b/.changeset/tidy-planes-unite.md deleted file mode 100644 index 158498d381..0000000000 --- a/.changeset/tidy-planes-unite.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-firehydrant': minor ---- - -Allow firehydrant to use component annotation diff --git a/.changeset/tidy-pumpkins-clean.md b/.changeset/tidy-pumpkins-clean.md deleted file mode 100644 index c5a067a98c..0000000000 --- a/.changeset/tidy-pumpkins-clean.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/core-components': patch ---- - -Fix bug where `` component would not take into account header styles defined in `columns[*].headerStyle`. diff --git a/.changeset/tidy-ties-guess.md b/.changeset/tidy-ties-guess.md deleted file mode 100644 index 63247c3819..0000000000 --- a/.changeset/tidy-ties-guess.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/catalog-client': patch ---- - -Ensure that `getEntitiesByRefs` returns `undefined` instead of `null` for missing items diff --git a/.changeset/tiny-llamas-jump.md b/.changeset/tiny-llamas-jump.md deleted file mode 100644 index ccf42cd514..0000000000 --- a/.changeset/tiny-llamas-jump.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/core-components': patch ---- - -Use media queries to change layout instead of `isMobile` prop in `BackstagePage` component diff --git a/.changeset/tricky-jars-film.md b/.changeset/tricky-jars-film.md deleted file mode 100644 index 9533634614..0000000000 --- a/.changeset/tricky-jars-film.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-catalog-backend-module-incremental-ingestion': patch ---- - -Move `@backstage/backend-defaults` to `devDependencies` diff --git a/.changeset/twelve-cars-push.md b/.changeset/twelve-cars-push.md deleted file mode 100644 index 599d456d2b..0000000000 --- a/.changeset/twelve-cars-push.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -'@backstage/backend-plugin-api': patch -'@backstage/backend-test-utils': patch -'@backstage/backend-dev-utils': patch -'@backstage/backend-defaults': patch -'@backstage/backend-app-api': patch -'@backstage/backend-common': patch -'@backstage/backend-tasks': patch -'@backstage/config-loader': patch -'@backstage/cli-common': patch -'@backstage/create-app': patch -'@backstage/test-utils': patch -'@backstage/dev-utils': patch -'@backstage/codemods': patch -'@backstage/config': patch -'@backstage/theme': patch -'@backstage/cli': patch ---- - -Updated link to docs. diff --git a/.changeset/twenty-insects-live.md b/.changeset/twenty-insects-live.md deleted file mode 100644 index d3f8cdfc25..0000000000 --- a/.changeset/twenty-insects-live.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-proxy-backend': patch ---- - -Ensure that `@backstage/plugin-proxy-backend` logs the requests that it proxies when log level is set to `debug`. diff --git a/.changeset/twenty-jeans-speak.md b/.changeset/twenty-jeans-speak.md deleted file mode 100644 index fddcc2eedd..0000000000 --- a/.changeset/twenty-jeans-speak.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-auth-backend': patch ---- - -Added authentication provider for Azure Easy Authentication. diff --git a/.changeset/unlucky-sloths-explain.md b/.changeset/unlucky-sloths-explain.md deleted file mode 100644 index 3d5f963a73..0000000000 --- a/.changeset/unlucky-sloths-explain.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-techdocs-module-addons-contrib': patch ---- - -Fixed bug in IssueLink component where the URL was not generated properly when the repository was located inside a Gitlab subgroup diff --git a/.changeset/warm-vans-fail.md b/.changeset/warm-vans-fail.md deleted file mode 100644 index 6cbd3a4e8f..0000000000 --- a/.changeset/warm-vans-fail.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-catalog': minor ---- - -Add a `columns` prop to certain components that use the `EntityTable` for easier extensibility. diff --git a/.changeset/weak-coats-allow.md b/.changeset/weak-coats-allow.md deleted file mode 100644 index 31fc592326..0000000000 --- a/.changeset/weak-coats-allow.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-linguist': patch ---- - -Updated `README.md` to removed images with refresh button as this feature was not implemented in the current version diff --git a/.changeset/what-is-going-on-babe.md b/.changeset/what-is-going-on-babe.md deleted file mode 100644 index c22d69d1de..0000000000 --- a/.changeset/what-is-going-on-babe.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/backend-app-api': patch ---- - -Add support for `NotImplementedError`, properly returning 501 as status code. diff --git a/.changeset/wicked-lions-repeat.md b/.changeset/wicked-lions-repeat.md deleted file mode 100644 index c48545c6bc..0000000000 --- a/.changeset/wicked-lions-repeat.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -'@techdocs/cli': minor -'@backstage/plugin-techdocs-node': minor ---- - -Added support for an HTTPS proxy for techdocs AWS S3 requests diff --git a/.changeset/wicked-spoons-call.md b/.changeset/wicked-spoons-call.md deleted file mode 100644 index c57860349b..0000000000 --- a/.changeset/wicked-spoons-call.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-newrelic': patch ---- - -Updated installation instructions diff --git a/.changeset/wild-ads-pull.md b/.changeset/wild-ads-pull.md deleted file mode 100644 index 5a40787358..0000000000 --- a/.changeset/wild-ads-pull.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-api-docs': patch ---- - -Add a `columns` prop to certain components that use the `EntityTable` for easier extensibility. diff --git a/.changeset/wild-bulldogs-suffer.md b/.changeset/wild-bulldogs-suffer.md deleted file mode 100644 index 02f50927e9..0000000000 --- a/.changeset/wild-bulldogs-suffer.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-catalog-backend-module-gitlab': patch ---- - -filter gitlab groups by prefix diff --git a/.changeset/witty-geckos-design.md b/.changeset/witty-geckos-design.md deleted file mode 100644 index d482332c23..0000000000 --- a/.changeset/witty-geckos-design.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -'@backstage/plugin-linguist-backend': patch ---- - -Allow kind to be configurable - -```ts -return createRouter({ schedule: schedule, kind: ['Component'] }, { ...env }); -``` diff --git a/.changeset/witty-squids-fetch.md b/.changeset/witty-squids-fetch.md deleted file mode 100644 index 3e13421038..0000000000 --- a/.changeset/witty-squids-fetch.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/create-app': patch ---- - -Added to the template `packages/app/.eslintignore` file to packages to ignore the contents of `packages/app/public`. diff --git a/.changeset/yellow-bananas-yawn.md b/.changeset/yellow-bananas-yawn.md deleted file mode 100644 index d9c522a429..0000000000 --- a/.changeset/yellow-bananas-yawn.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/repo-tools': patch ---- - -The API report generation process is now able to detect and generate reports for additional entry points declared in the package `"exports"` field. diff --git a/.changeset/young-schools-double.md b/.changeset/young-schools-double.md deleted file mode 100644 index 8cba2ec8f3..0000000000 --- a/.changeset/young-schools-double.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-catalog-react': patch ---- - -Do not close `Autocomplete` powered multiple-selection filters when checking boxes diff --git a/.changeset/young-scissors-cough.md b/.changeset/young-scissors-cough.md deleted file mode 100644 index fa35588224..0000000000 --- a/.changeset/young-scissors-cough.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/backend-defaults': patch ---- - -Added a workaround for the cyclic dependency bug across `@backstage/backend-common` and `@backstage/backend-app-api`. diff --git a/.changeset/young-walls-prove.md b/.changeset/young-walls-prove.md deleted file mode 100644 index 33fafa1548..0000000000 --- a/.changeset/young-walls-prove.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/core-plugin-api': minor ---- - -The GitLab auth provider can now be used to get OpenID tokens. diff --git a/docs/releases/v1.12.0-changelog.md b/docs/releases/v1.12.0-changelog.md new file mode 100644 index 0000000000..7a8b52e33b --- /dev/null +++ b/docs/releases/v1.12.0-changelog.md @@ -0,0 +1,2933 @@ +# Release v1.12.0 + +## @backstage/backend-plugin-api@0.5.0 + +### Minor Changes + +- c1ee073a82b: Added `lastModifiedAt` field on `UrlReaderService` responses and a `lastModifiedAfter` option to `UrlReaderService.readUrl`. + +### Patch Changes + +- 928a12a9b3e: Internal refactor of `/alpha` exports. +- 482dae5de1c: Updated link to docs. +- Updated dependencies + - @backstage/plugin-auth-node@0.2.12 + - @backstage/backend-tasks@0.5.0 + - @backstage/plugin-permission-common@0.7.4 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + +## @backstage/backend-tasks@0.5.0 + +### Minor Changes + +- 1578276708a: add functionality to get descriptions from the scheduler for triggering + +### Patch Changes + +- f0685193efa: Added the adapted query to mysql and sqlite3 databases to not returning warning on logs +- 482dae5de1c: Updated link to docs. +- Updated dependencies + - @backstage/backend-common@0.18.3 + - @backstage/errors@1.1.5 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + +## @backstage/catalog-client@1.4.0 + +### Minor Changes + +- 8c030b1826c: Add `queryEntities` method to `CatalogApi`. + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- c630360631f: Ensure that `getEntitiesByRefs` returns `undefined` instead of `null` for missing items +- Updated dependencies + - @backstage/errors@1.1.5 + - @backstage/catalog-model@1.2.1 + +## @backstage/core-app-api@1.6.0 + +### Minor Changes + +- 456eaa8cf83: `OAuth2` now gets ID tokens from a session with the `openid` scope explicitly + requested. + + This should not be considered a breaking change, because spec-compliant OIDC + providers will already be returning ID tokens if and only if the `openid` scope + is granted. + + This change makes the dependence explicit, and removes the burden on + OAuth2-based providers which require an ID token (e.g. this is done by various + default [auth + handlers](https://backstage.io/docs/auth/identity-resolver/#authhandler)) to add + `openid` to their default scopes. _That_ could carry another indirect benefit: + by removing `openid` from the default scopes for a provider, grants for + resource-specific access tokens can avoid requesting excess ID token-related + scopes. + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-plugin-api@1.5.0 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + - @backstage/version-bridge@1.0.3 + +## @backstage/core-plugin-api@1.5.0 + +### Minor Changes + +- ab750ddc4f2: The GitLab auth provider can now be used to get OpenID tokens. + +### Patch Changes + +- 928a12a9b3e: Internal refactor of `/alpha` exports. +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + - @backstage/version-bridge@1.0.3 + +## @techdocs/cli@1.4.0 + +### Minor Changes + +- 8e465ce52e2: Running `@techdocs/cli generate` with the `--verbose` flag will now print the mkdocs output. +- ea2bbef1b16: Added support for an HTTPS proxy for techdocs AWS S3 requests + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-techdocs-node@1.6.0 + - @backstage/backend-common@0.18.3 + - @backstage/catalog-model@1.2.1 + - @backstage/cli-common@0.1.12 + - @backstage/config@1.0.7 + +## @backstage/plugin-catalog@1.9.0 + +### Minor Changes + +- 23cc40039c0: Allow `EntitySwitch` to render all cases that match the condition. + + This change introduces a new parameter for the `EntitySwitch` component + `renderMultipleMatches`. In case the parameter value is `all`, the `EntitySwitch` + will render all `EntitySwitch.Case` that contain `if` parameter, and it + evaluates to true. In case none of the cases match, the default case will be + rendered, if any. + + This means for example in the CI/CD page you can now do the following: + + ```tsx + + Jenkins + CodeBuild + No CI/CD + + ``` + + This allows the component to have multiple CI/CD systems and all of those are + rendered on the same page. + +- 3f75b7607ca: Add ability to pass icon as function to have ability to customize it by search item + +- c9a9f3c834f: Add a `columns` prop to certain components that use the `EntityTable` for easier extensibility. + +### Patch Changes + +- 3fa41696820: Make the "Copied!" message disappear automatically after some time +- 7e8930ae1c6: Fix icon alignment in `CatalogSearchResultListItem` +- dbbde6ed353: fix entity switch rendering when there is no default case +- cb8ec97cdeb: Change black & white colors to be theme aware +- 928a12a9b3e: Internal refactor of `/alpha` exports. +- Updated dependencies + - @backstage/catalog-client@1.4.0 + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/plugin-search-react@1.5.1 + - @backstage/errors@1.1.5 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/plugin-catalog-common@1.0.12 + - @backstage/integration-react@1.1.11 + - @backstage/theme@0.2.18 + - @backstage/types@1.0.2 + - @backstage/plugin-search-common@1.2.2 + +## @backstage/plugin-catalog-backend@1.8.0 + +### Minor Changes + +- 7f4ea3d3602: Add /entities/by-query endpoint returning paginated entities. + + The endpoint supports cursor base pagination and server side sorting of the entities + +### Patch Changes + +- e675f902980: Add deprecations for symbols that were moved to `@backstage/plugin-catalog-node` a long time ago: + + - `CatalogProcessor` + - `CatalogProcessorCache` + - `CatalogProcessorEmit` + - `CatalogProcessorEntityResult` + - `CatalogProcessorErrorResult` + - `CatalogProcessorLocationResult` + - `CatalogProcessorParser` + - `CatalogProcessorRefreshKeysResult` + - `CatalogProcessorRelationResult` + - `CatalogProcessorResult` + - `DeferredEntity` + - `EntityProvider` + - `EntityProviderConnection` + - `EntityProviderMutation` + - `EntityRelationSpec` + - `processingResult` + + Also moved over and deprecated the following symbols: + + - `locationSpecToLocationEntity` + - `locationSpecToMetadataName` + +- ac8929f2f31: Fix export of `defaultCatalogCollatorEntityTransformer`. + +- 928a12a9b3e: Internal refactor of `/alpha` exports. + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. + +- f093ce83d58: Fix a bug where the batch fetch by ref endpoint did not work in conjunction with filtering (e.g. if authorization was enabled). + +- Updated dependencies + - @backstage/catalog-client@1.4.0 + - @backstage/plugin-permission-node@0.7.6 + - @backstage/backend-common@0.18.3 + - @backstage/errors@1.1.5 + - @backstage/plugin-catalog-node@1.3.4 + - @backstage/backend-plugin-api@0.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/plugin-catalog-common@1.0.12 + - @backstage/integration@1.4.3 + - @backstage/plugin-permission-common@0.7.4 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + - @backstage/plugin-scaffolder-common@1.2.6 + - @backstage/plugin-search-common@1.2.2 + +## @backstage/plugin-catalog-backend-module-incremental-ingestion@0.3.0 + +### Minor Changes + +- a811bd246c4: Added endpoint to get a list of known incremental entity providers + +### Patch Changes + +- 90469c02c8c: Renamed `incrementalIngestionEntityProviderCatalogModule` to `catalogModuleIncrementalIngestionEntityProvider` to match the [recommended naming patterns](https://backstage.io/docs/backend-system/architecture/naming-patterns). +- e675f902980: Make sure to not use deprecated exports from `@backstage/plugin-catalog-backend` +- 928a12a9b3e: Internal refactor of `/alpha` exports. +- bf611cf019a: Fix missing `dependencies` in `package.json` +- 6e612b58577: Move `@backstage/backend-defaults` to `devDependencies` +- Updated dependencies + - @backstage/plugin-catalog-backend@1.8.0 + - @backstage/backend-tasks@0.5.0 + - @backstage/backend-common@0.18.3 + - @backstage/errors@1.1.5 + - @backstage/plugin-catalog-node@1.3.4 + - @backstage/backend-plugin-api@0.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/plugin-events-node@0.2.4 + - @backstage/plugin-permission-common@0.7.4 + - @backstage/config@1.0.7 + +## @backstage/plugin-catalog-backend-module-puppetdb@0.1.0 + +### Minor Changes + +- a1efcf9a658: Initial version of the plugin. + +### Patch Changes + +- 561ce41191d: Added a `catalogModulePuppetDbEntityProvider` alpha export for the new backend system +- e675f902980: Make sure to not use deprecated exports from `@backstage/plugin-catalog-backend` +- Updated dependencies + - @backstage/backend-tasks@0.5.0 + - @backstage/backend-common@0.18.3 + - @backstage/errors@1.1.5 + - @backstage/plugin-catalog-node@1.3.4 + - @backstage/backend-plugin-api@0.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + +## @backstage/plugin-catalog-react@1.4.0 + +### Minor Changes + +- 0a5b73b2926: Add possibility to re-use EntityPicker for filters with multiple select. + +### Patch Changes + +- 65454876fb2: Minor API report tweaks +- 928a12a9b3e: Internal refactor of `/alpha` exports. +- 24916d23494: Do not close `Autocomplete` powered multiple-selection filters when checking boxes +- Updated dependencies + - @backstage/catalog-client@1.4.0 + - @backstage/core-components@0.12.5 + - @backstage/errors@1.1.5 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/plugin-catalog-common@1.0.12 + - @backstage/integration@1.4.3 + - @backstage/plugin-permission-common@0.7.4 + - @backstage/theme@0.2.18 + - @backstage/types@1.0.2 + - @backstage/version-bridge@1.0.3 + - @backstage/plugin-permission-react@0.4.11 + +## @backstage/plugin-firehydrant@0.2.0 + +### Minor Changes + +- e2e3dd08a54: Allow firehydrant to use component annotation + +### Patch Changes + +- cb8ec97cdeb: Change black & white colors to be theme aware +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.18 + +## @backstage/plugin-linguist-backend@0.2.0 + +### Minor Changes + +- 4a1c318853d: **BREAKING** The linguist-backend `createRouter` now requires that the `tokenManger` is passed to the router. + +### Patch Changes + +- 8a298b47240: Added support for linguist-js options using the linguistJSOptions in the plugin, the available config can be found [here](https://www.npmjs.com/package/linguist-js#API). + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. + +- 2ea57821629: Fixed bug in LinguistBackendApi that caused initial batch of entities to be skipped. + +- b271d5ca052: Allow kind to be configurable + + ```ts + return createRouter({ schedule: schedule, kind: ['Component'] }, { ...env }); + ``` + +- Updated dependencies + - @backstage/catalog-client@1.4.0 + - @backstage/plugin-auth-node@0.2.12 + - @backstage/backend-tasks@0.5.0 + - @backstage/backend-common@0.18.3 + - @backstage/errors@1.1.5 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + - @backstage/plugin-linguist-common@0.1.0 + +## @backstage/plugin-octopus-deploy@0.1.0 + +### Minor Changes + +- b7fff1171f0: Initial version + +### Patch Changes + +- cb0fc15a992: Added Octopus Deploy logo +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.18 + +## @backstage/plugin-scaffolder@1.12.0 + +### Minor Changes + +- 0d61fcca9c3: Update `EntityPicker` to use the fully qualified entity ref instead of the humanized version. +- 8f4d13f21cf: Move `useTaskStream`, `TaskBorder`, `TaskLogStream` and `TaskSteps` into `scaffolder-react`. + +### Patch Changes + +- 65454876fb2: Minor API report tweaks +- 3c96e77b513: Make scaffolder adhere to page themes by using page `fontColor` consistently. If your theme overwrites template list or card headers, review those styles. +- be3cddaab5f: Getting credentials in the RepoUrlPicker now also works for targets without owner (e.g. Bitbucket Server). +- cb8ec97cdeb: Change black & white colors to be theme aware +- eb877bad736: Create an "Other Templates" group when groups are given to scaffolder/next. +- c10384a9235: Switch to using `LinkButton` instead of the deprecated `Button` +- 928a12a9b3e: Internal refactor of `/alpha` exports. +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- 0aae4596296: Fix the scaffolder validator for arrays when the item is a field in the object +- Updated dependencies + - @backstage/catalog-client@1.4.0 + - @backstage/core-components@0.12.5 + - @backstage/plugin-scaffolder-react@1.2.0 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/errors@1.1.5 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/plugin-catalog-common@1.0.12 + - @backstage/integration-react@1.1.11 + - @backstage/integration@1.4.3 + - @backstage/config@1.0.7 + - @backstage/theme@0.2.18 + - @backstage/types@1.0.2 + - @backstage/plugin-permission-react@0.4.11 + - @backstage/plugin-scaffolder-common@1.2.6 + +## @backstage/plugin-scaffolder-backend@1.12.0 + +### Minor Changes + +- 7d724d8ef56: Added the ability to be able to define an actions `input` and `output` schema using `zod` instead of hand writing types and `jsonschema` + +### Patch Changes + +- 860de10fa67: Make identity valid if subject of token is a backstage server-2-server auth token +- 65454876fb2: Minor API report tweaks +- c6c78b4acbe: throw error from catalog:fetch scaffolder action when entity is null and optional is false +- 9968f455921: catalog write action should allow any shape of object +- 928a12a9b3e: Internal refactor of `/alpha` exports. +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- 7af12854970: Extended scaffolder action `catalog:fetch` to fetch multiple catalog entities by entity references. +- Updated dependencies + - @backstage/plugin-catalog-backend@1.8.0 + - @backstage/catalog-client@1.4.0 + - @backstage/plugin-auth-node@0.2.12 + - @backstage/backend-tasks@0.5.0 + - @backstage/backend-common@0.18.3 + - @backstage/errors@1.1.5 + - @backstage/plugin-catalog-node@1.3.4 + - @backstage/backend-plugin-api@0.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/integration@1.4.3 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + - @backstage/plugin-scaffolder-common@1.2.6 + - @backstage/plugin-scaffolder-node@0.1.1 + +## @backstage/plugin-scaffolder-react@1.2.0 + +### Minor Changes + +- 8f4d13f21cf: Move `useTaskStream`, `TaskBorder`, `TaskLogStream` and `TaskSteps` into `scaffolder-react`. + +### Patch Changes + +- 65454876fb2: Minor API report tweaks +- 3c96e77b513: Make scaffolder adhere to page themes by using page `fontColor` consistently. If your theme overwrites template list or card headers, review those styles. +- c8d78b9ae9d: fix bug with `hasErrors` returning false when dealing with empty objects +- 9b8c374ace5: Remove timer for skipped steps in Scaffolder Next's TaskSteps +- 44941fc97eb: scaffolder/next: Move the `uiSchema` to its own property in the validation `context` to align with component development and access of `ui:options` +- d9893263ba9: scaffolder/next: Fix for steps without properties +- 928a12a9b3e: Internal refactor of `/alpha` exports. +- cc418d652a7: scaffolder/next: Added the ability to get the fields definition in the schema in the validation function +- d4100d0ec42: Fix alignment bug for owners on `TemplateCard` +- Updated dependencies + - @backstage/catalog-client@1.4.0 + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/errors@1.1.5 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.18 + - @backstage/types@1.0.2 + - @backstage/version-bridge@1.0.3 + - @backstage/plugin-scaffolder-common@1.2.6 + +## @backstage/plugin-stackstorm@0.1.0 + +### Minor Changes + +- f3a15259e91: Add StackStorm plugin to Backstage which is interfacing with StackStorm API. It allows users to view workflow executions, packs and actions. For installation and configuration instructions please view [README.md](https://github.com/backstage/backstage/tree/master/plugins/stackstorm/README.md) + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/errors@1.1.5 + - @backstage/core-plugin-api@1.5.0 + - @backstage/theme@0.2.18 + +## @backstage/plugin-techdocs@1.6.0 + +### Minor Changes + +- 3f75b7607ca: Add ability to pass icon as function to have ability to customize it by search item + +### Patch Changes + +- 65454876fb2: Minor API report tweaks +- 54a1e133b56: Fix bug that caused next and previous links not to work with certain versions of mkdocs-material +- f320c299c67: The HTML tag attributes in the documentation content inserted to shadow DOM is preserved to improve accessibility +- cb8ec97cdeb: Change black & white colors to be theme aware +- c10384a9235: Switch to using `LinkButton` instead of the deprecated `Button` +- 8adfda60ae1: Updated dependency `jss` to `~10.10.0`. +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- 238cf657c09: Copy to clipboard now works in a not secure context. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/plugin-techdocs-react@1.1.4 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/plugin-search-react@1.5.1 + - @backstage/errors@1.1.5 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/integration-react@1.1.11 + - @backstage/integration@1.4.3 + - @backstage/config@1.0.7 + - @backstage/theme@0.2.18 + - @backstage/plugin-search-common@1.2.2 + +## @backstage/plugin-techdocs-backend@1.6.0 + +### Minor Changes + +- 92b495328bd: Introduced alpha export of the `techdocsPlugin` using the new backend system. + +### Patch Changes + +- 40298b02778: Techdocs backend explains a bit more about what might have caused the docs not being found when building techdocs. +- 928a12a9b3e: Internal refactor of `/alpha` exports. +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/catalog-client@1.4.0 + - @backstage/plugin-techdocs-node@1.6.0 + - @backstage/backend-common@0.18.3 + - @backstage/errors@1.1.5 + - @backstage/backend-plugin-api@0.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/plugin-catalog-common@1.0.12 + - @backstage/integration@1.4.3 + - @backstage/plugin-permission-common@0.7.4 + - @backstage/config@1.0.7 + - @backstage/plugin-search-common@1.2.2 + +## @backstage/plugin-techdocs-node@1.6.0 + +### Minor Changes + +- ea2bbef1b16: Added support for an HTTPS proxy for techdocs AWS S3 requests + +### Patch Changes + +- 65454876fb2: Minor API report tweaks +- bf493710f50: Update to a newer version of `@trendyol-js/openstack-swift-sdk` +- bfe350ef4ce: Fixed bug that prevented deletion of stale files when non-empty directories where tried to be deleted as well. +- Updated dependencies + - @backstage/backend-common@0.18.3 + - @backstage/errors@1.1.5 + - @backstage/catalog-model@1.2.1 + - @backstage/integration@1.4.3 + - @backstage/config@1.0.7 + - @backstage/integration-aws-node@0.1.2 + - @backstage/plugin-search-common@1.2.2 + +## @backstage/app-defaults@1.2.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/core-plugin-api@1.5.0 + - @backstage/core-app-api@1.6.0 + - @backstage/theme@0.2.18 + - @backstage/plugin-permission-react@0.4.11 + +## @backstage/backend-app-api@0.4.1 + +### Patch Changes + +- 928a12a9b3e: Internal refactor of `/alpha` exports. +- 482dae5de1c: Updated link to docs. +- 915e46622cf: Add support for `NotImplementedError`, properly returning 501 as status code. +- Updated dependencies + - @backstage/plugin-permission-node@0.7.6 + - @backstage/plugin-auth-node@0.2.12 + - @backstage/backend-tasks@0.5.0 + - @backstage/backend-common@0.18.3 + - @backstage/errors@1.1.5 + - @backstage/backend-plugin-api@0.5.0 + - @backstage/config-loader@1.1.9 + - @backstage/cli-common@0.1.12 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + +## @backstage/backend-common@0.18.3 + +### Patch Changes + +- f75097868a7: Adds config option `backend.database.role` to set ownership for newly created schemas and tables in Postgres + + The example config below connects to the database as user `v-backstage-123` but sets the ownership of + the create schemas and tables to `backstage` + + ```yaml + backend: + database: + client: pg + pluginDivisionMode: schema + role: backstage + connection: + user: v-backstage-123 + ... + ``` + +- 928a12a9b3e: Internal refactor of `/alpha` exports. + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. + +- 87f0bbec175: AwsS3UrlReader upgraded to use aws-sdk v3 + +- c1ee073a82b: Added `lastModifiedAt` field on `UrlReaderService` responses and a `lastModifiedAfter` option to `UrlReaderService.readUrl`. + +- 482dae5de1c: Updated link to docs. + +- Updated dependencies + - @backstage/errors@1.1.5 + - @backstage/backend-plugin-api@0.5.0 + - @backstage/backend-app-api@0.4.1 + - @backstage/config-loader@1.1.9 + - @backstage/integration@1.4.3 + - @backstage/backend-dev-utils@0.1.1 + - @backstage/cli-common@0.1.12 + - @backstage/config@1.0.7 + - @backstage/integration-aws-node@0.1.2 + - @backstage/types@1.0.2 + +## @backstage/backend-defaults@0.1.8 + +### Patch Changes + +- 928a12a9b3e: Internal refactor of `/alpha` exports. +- 482dae5de1c: Updated link to docs. +- 5d0693edc09: Added a workaround for the cyclic dependency bug across `@backstage/backend-common` and `@backstage/backend-app-api`. +- Updated dependencies + - @backstage/backend-common@0.18.3 + - @backstage/backend-plugin-api@0.5.0 + - @backstage/backend-app-api@0.4.1 + +## @backstage/backend-dev-utils@0.1.1 + +### Patch Changes + +- 482dae5de1c: Updated link to docs. + +## @backstage/backend-test-utils@0.1.35 + +### Patch Changes + +- 928a12a9b3e: Internal refactor of `/alpha` exports. +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- 482dae5de1c: Updated link to docs. +- Updated dependencies + - @backstage/plugin-auth-node@0.2.12 + - @backstage/backend-common@0.18.3 + - @backstage/backend-plugin-api@0.5.0 + - @backstage/backend-app-api@0.4.1 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + +## @backstage/catalog-model@1.2.1 + +### Patch Changes + +- 928a12a9b3e: Internal refactor of `/alpha` exports. +- Updated dependencies + - @backstage/errors@1.1.5 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + +## @backstage/cli@0.22.4 + +### Patch Changes + +- 1ad8d885d30: Fixed a bug where additional backend package entry points where not properly marked as internal during local development. +- 2011b86052c: Added templates for new plugin Web and Node.js libraries. +- 867f4752ca1: Updated the ESLint plugin configuration that is enabled through `yarn start --check` to only pick up valid source files. +- b4cd145b574: Added a new `migrate package-exports` command that synchronizes package exports fields in all `package.json`s. +- 9bf50a36674: Bumped the `msw` version in templates to 1.0.0 +- 8bf24946c66: Adjust express dependencies to be the same as the rest of the project +- 17271841de8: Updated frontend plugin template to use some more recent features +- 4b4998466b4: Updated dependency `del` to `^7.0.0`. +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- a11b9a23f5a: Keep custom exports entry points in package.json +- 482dae5de1c: Updated link to docs. +- Updated dependencies + - @backstage/eslint-plugin@0.1.2 + - @backstage/errors@1.1.5 + - @backstage/config-loader@1.1.9 + - @backstage/release-manifests@0.0.9 + - @backstage/cli-common@0.1.12 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + +## @backstage/cli-common@0.1.12 + +### Patch Changes + +- 482dae5de1c: Updated link to docs. + +## @backstage/codemods@0.1.44 + +### Patch Changes + +- 482dae5de1c: Updated link to docs. +- Updated dependencies + - @backstage/cli-common@0.1.12 + +## @backstage/config@1.0.7 + +### Patch Changes + +- 482dae5de1c: Updated link to docs. +- Updated dependencies + - @backstage/types@1.0.2 + +## @backstage/config-loader@1.1.9 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- 482dae5de1c: Updated link to docs. +- Updated dependencies + - @backstage/errors@1.1.5 + - @backstage/cli-common@0.1.12 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + +## @backstage/core-components@0.12.5 + +### Patch Changes + +- 8bbf95b5507: Button labels in the sidebar (previously displayed in uppercase) will be displayed in the case that is provided without any transformations. + For example, a sidebar button with the label "Search" will appear as Search, "search" will appear as search, "SEARCH" will appear as SEARCH etc. + This can potentially affect any overriding styles previously applied to change the appearance of Button labels in the Sidebar. +- cb8ec97cdeb: Change black & white colors to be theme aware +- c10384a9235: Switch to using `LinkButton` instead of the deprecated `Button` +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- e1aae2f5a0c: Updated the `aria-label` of the `HeaderTabs` component. +- 6a51a49a810: Fix bug where `
` component would not take into account header styles defined in `columns[*].headerStyle`. +- fa004f66871: Use media queries to change layout instead of `isMobile` prop in `BackstagePage` component +- Updated dependencies + - @backstage/errors@1.1.5 + - @backstage/core-plugin-api@1.5.0 + - @backstage/config@1.0.7 + - @backstage/theme@0.2.18 + - @backstage/version-bridge@1.0.3 + +## @backstage/create-app@0.4.38 + +### Patch Changes + +- b4627f23b28: Bumped create-app version. +- 0eceadb9502: Bumped create-app version. +- 482dae5de1c: Updated link to docs. +- 6ace2dd2c58: Added to the template `packages/app/.eslintignore` file to packages to ignore the contents of `packages/app/public`. +- Updated dependencies + - @backstage/cli-common@0.1.12 + +## @backstage/dev-utils@1.0.13 + +### Patch Changes + +- 482dae5de1c: Updated link to docs. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/test-utils@1.2.6 + - @backstage/core-app-api@1.6.0 + - @backstage/integration-react@1.1.11 + - @backstage/theme@0.2.18 + - @backstage/app-defaults@1.2.1 + +## @backstage/errors@1.1.5 + +### Patch Changes + +- 3bf83a2aabf: Added `NotImplementedError`, which can be used when the server does not recognize the request method and is incapable of supporting it for any resource. +- Updated dependencies + - @backstage/types@1.0.2 + +## @backstage/eslint-plugin@0.1.2 + +### Patch Changes + +- a061c466d66: Fixing a bug that we should check internal dependencies too + +## @backstage/integration@1.4.3 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/errors@1.1.5 + - @backstage/config@1.0.7 + +## @backstage/integration-aws-node@0.1.2 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.1.5 + - @backstage/config@1.0.7 + +## @backstage/integration-react@1.1.11 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/core-plugin-api@1.5.0 + - @backstage/integration@1.4.3 + - @backstage/config@1.0.7 + - @backstage/theme@0.2.18 + +## @backstage/release-manifests@0.0.9 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. + +## @backstage/repo-tools@0.1.3 + +### Patch Changes + +- 32a4a05838c: Tweaked type dependency check to trim wildcard type imports. +- 6ba8faf22ac: The API report generation process is now able to detect and generate reports for additional entry points declared in the package `"exports"` field. +- Updated dependencies + - @backstage/errors@1.1.5 + - @backstage/cli-common@0.1.12 + +## @backstage/test-utils@1.2.6 + +### Patch Changes + +- 928a12a9b3e: Internal refactor of `/alpha` exports. +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- 482dae5de1c: Updated link to docs. +- Updated dependencies + - @backstage/core-plugin-api@1.5.0 + - @backstage/core-app-api@1.6.0 + - @backstage/plugin-permission-common@0.7.4 + - @backstage/config@1.0.7 + - @backstage/theme@0.2.18 + - @backstage/types@1.0.2 + - @backstage/plugin-permission-react@0.4.11 + +## @backstage/theme@0.2.18 + +### Patch Changes + +- 482dae5de1c: Updated link to docs. + +## @backstage/plugin-adr@0.4.1 + +### Patch Changes + +- d293f4aaf83: Updated readme instructions +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/plugin-search-react@1.5.1 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/integration-react@1.1.11 + - @backstage/theme@0.2.18 + - @backstage/plugin-adr-common@0.2.7 + - @backstage/plugin-search-common@1.2.2 + +## @backstage/plugin-adr-backend@0.3.1 + +### Patch Changes + +- 2a73ded3861: Support MADR v3 format +- 8bf24946c66: Adjust express dependencies to be the same as the rest of the project +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/catalog-client@1.4.0 + - @backstage/backend-common@0.18.3 + - @backstage/errors@1.1.5 + - @backstage/catalog-model@1.2.1 + - @backstage/integration@1.4.3 + - @backstage/config@1.0.7 + - @backstage/plugin-adr-common@0.2.7 + - @backstage/plugin-search-common@1.2.2 + +## @backstage/plugin-adr-common@0.2.7 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.2.1 + - @backstage/integration@1.4.3 + - @backstage/plugin-search-common@1.2.2 + +## @backstage/plugin-airbrake@0.3.16 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/test-utils@1.2.6 + - @backstage/dev-utils@1.0.13 + - @backstage/theme@0.2.18 + +## @backstage/plugin-airbrake-backend@0.2.16 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/backend-common@0.18.3 + - @backstage/config@1.0.7 + +## @backstage/plugin-allure@0.1.32 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.18 + +## @backstage/plugin-analytics-module-ga@0.1.27 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/core-plugin-api@1.5.0 + - @backstage/config@1.0.7 + - @backstage/theme@0.2.18 + +## @backstage/plugin-apache-airflow@0.2.9 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/core-plugin-api@1.5.0 + +## @backstage/plugin-api-docs@0.9.1 + +### Patch Changes + +- 095e755d9b5: Add ApiDefinitionDialog component for fast access to the API definition in ProvidedApiCards and ConsumedApiCards. +- 8bc7dcec820: Fix dark theme Swagger's clear button font color. +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- 9820eb5d24f: Add a `columns` prop to certain components that use the `EntityTable` for easier extensibility. +- Updated dependencies + - @backstage/plugin-catalog@1.9.0 + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.18 + +## @backstage/plugin-apollo-explorer@0.1.9 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/core-plugin-api@1.5.0 + - @backstage/theme@0.2.18 + +## @backstage/plugin-app-backend@0.3.43 + +### Patch Changes + +- 928a12a9b3e: Internal refactor of `/alpha` exports. +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/backend-common@0.18.3 + - @backstage/backend-plugin-api@0.5.0 + - @backstage/config-loader@1.1.9 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + +## @backstage/plugin-auth-backend@0.18.1 + +### Patch Changes + +- e262738b8a0: Handle difference in expiration time between Microsoft session and Backstage session which caused the Backstage token to be invalid during a time frame. +- 86cece2c1fb: Updated dependency `@types/passport-microsoft` to `^1.0.0`. +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- 529de8c4211: Added authentication provider for Azure Easy Authentication. +- Updated dependencies + - @backstage/catalog-client@1.4.0 + - @backstage/plugin-auth-node@0.2.12 + - @backstage/backend-common@0.18.3 + - @backstage/errors@1.1.5 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + +## @backstage/plugin-auth-node@0.2.12 + +### Patch Changes + +- 65454876fb2: Minor API report tweaks +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/backend-common@0.18.3 + - @backstage/errors@1.1.5 + - @backstage/config@1.0.7 + +## @backstage/plugin-azure-devops@0.2.7 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/errors@1.1.5 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.18 + - @backstage/plugin-azure-devops-common@0.3.0 + +## @backstage/plugin-azure-devops-backend@0.3.22 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/backend-common@0.18.3 + - @backstage/config@1.0.7 + - @backstage/plugin-azure-devops-common@0.3.0 + +## @backstage/plugin-azure-sites@0.1.5 + +### Patch Changes + +- cb8ec97cdeb: Change black & white colors to be theme aware +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.18 + - @backstage/plugin-azure-sites-common@0.1.0 + +## @backstage/plugin-azure-sites-backend@0.1.5 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/backend-common@0.18.3 + - @backstage/config@1.0.7 + - @backstage/plugin-azure-sites-common@0.1.0 + +## @backstage/plugin-badges@0.2.40 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/errors@1.1.5 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.18 + +## @backstage/plugin-badges-backend@0.1.37 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-client@1.4.0 + - @backstage/backend-common@0.18.3 + - @backstage/errors@1.1.5 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + +## @backstage/plugin-bazaar@0.2.6 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog@1.9.0 + - @backstage/catalog-client@1.4.0 + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/cli@0.22.4 + - @backstage/errors@1.1.5 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.18 + +## @backstage/plugin-bazaar-backend@0.2.6 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.2.12 + - @backstage/backend-common@0.18.3 + - @backstage/errors@1.1.5 + - @backstage/backend-plugin-api@0.5.0 + - @backstage/config@1.0.7 + +## @backstage/plugin-bitbucket-cloud-common@0.2.4 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/integration@1.4.3 + +## @backstage/plugin-bitrise@0.1.43 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.18 + +## @backstage/plugin-catalog-backend-module-aws@0.1.17 + +### Patch Changes + +- 90469c02c8c: Renamed `awsS3EntityProviderCatalogModule` to `catalogModuleAwsS3EntityProviders` to match the [recommended naming patterns](https://backstage.io/docs/backend-system/architecture/naming-patterns). +- e675f902980: Make sure to not use deprecated exports from `@backstage/plugin-catalog-backend` +- 928a12a9b3e: Internal refactor of `/alpha` exports. +- 87f0bbec175: AwsS3UrlReader upgraded to use aws-sdk v3 +- bf611cf019a: Fix missing `dependencies` in `package.json` +- Updated dependencies + - @backstage/backend-tasks@0.5.0 + - @backstage/backend-common@0.18.3 + - @backstage/errors@1.1.5 + - @backstage/plugin-catalog-node@1.3.4 + - @backstage/backend-plugin-api@0.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/plugin-catalog-common@1.0.12 + - @backstage/integration@1.4.3 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + - @backstage/plugin-kubernetes-common@0.6.1 + +## @backstage/plugin-catalog-backend-module-azure@0.1.14 + +### Patch Changes + +- 90469c02c8c: Renamed `azureDevOpsEntityProviderCatalogModule` to `catalogModuleAzureDevOpsEntityProvider` to match the [recommended naming patterns](https://backstage.io/docs/backend-system/architecture/naming-patterns). +- c17fa101825: Add branch filter support + +- e675f902980: Make sure to not use deprecated exports from `@backstage/plugin-catalog-backend` +- 928a12a9b3e: Internal refactor of `/alpha` exports. +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/backend-tasks@0.5.0 + - @backstage/backend-common@0.18.3 + - @backstage/errors@1.1.5 + - @backstage/plugin-catalog-node@1.3.4 + - @backstage/backend-plugin-api@0.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/integration@1.4.3 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + +## @backstage/plugin-catalog-backend-module-bitbucket@0.2.10 + +### Patch Changes + +- e675f902980: Make sure to not use deprecated exports from `@backstage/plugin-catalog-backend` +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/backend-common@0.18.3 + - @backstage/errors@1.1.5 + - @backstage/plugin-catalog-node@1.3.4 + - @backstage/catalog-model@1.2.1 + - @backstage/integration@1.4.3 + - @backstage/plugin-bitbucket-cloud-common@0.2.4 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + +## @backstage/plugin-catalog-backend-module-bitbucket-cloud@0.1.10 + +### Patch Changes + +- 90469c02c8c: Renamed `bitbucketCloudEntityProviderCatalogModule` to `catalogModuleBitbucketCloudEntityProvider` to match the [recommended naming patterns](https://backstage.io/docs/backend-system/architecture/naming-patterns). +- e675f902980: Make sure to not use deprecated exports from `@backstage/plugin-catalog-backend` +- 928a12a9b3e: Internal refactor of `/alpha` exports. +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/catalog-client@1.4.0 + - @backstage/backend-tasks@0.5.0 + - @backstage/backend-common@0.18.3 + - @backstage/plugin-catalog-node@1.3.4 + - @backstage/backend-plugin-api@0.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/plugin-catalog-common@1.0.12 + - @backstage/plugin-events-node@0.2.4 + - @backstage/integration@1.4.3 + - @backstage/plugin-bitbucket-cloud-common@0.2.4 + - @backstage/config@1.0.7 + +## @backstage/plugin-catalog-backend-module-bitbucket-server@0.1.8 + +### Patch Changes + +- 90469c02c8c: Renamed `bitbucketServerEntityProviderCatalogModule` to `catalogModuleBitbucketServerEntityProvider` to match the [recommended naming patterns](https://backstage.io/docs/backend-system/architecture/naming-patterns). +- e675f902980: Make sure to not use deprecated exports from `@backstage/plugin-catalog-backend` +- 928a12a9b3e: Internal refactor of `/alpha` exports. +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/backend-tasks@0.5.0 + - @backstage/backend-common@0.18.3 + - @backstage/errors@1.1.5 + - @backstage/plugin-catalog-node@1.3.4 + - @backstage/backend-plugin-api@0.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/integration@1.4.3 + - @backstage/config@1.0.7 + +## @backstage/plugin-catalog-backend-module-gerrit@0.1.11 + +### Patch Changes + +- 90469c02c8c: Renamed `gerritEntityProviderCatalogModule` to `catalogModuleGerritEntityProvider` to match the [recommended naming patterns](https://backstage.io/docs/backend-system/architecture/naming-patterns). +- e675f902980: Make sure to not use deprecated exports from `@backstage/plugin-catalog-backend` +- 928a12a9b3e: Internal refactor of `/alpha` exports. +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/backend-tasks@0.5.0 + - @backstage/backend-common@0.18.3 + - @backstage/errors@1.1.5 + - @backstage/plugin-catalog-node@1.3.4 + - @backstage/backend-plugin-api@0.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/integration@1.4.3 + - @backstage/config@1.0.7 + +## @backstage/plugin-catalog-backend-module-github@0.2.6 + +### Patch Changes + +- 65454876fb2: Minor API report tweaks +- 90469c02c8c: Renamed `githubEntityProviderCatalogModule` to `catalogModuleGithubEntityProvider` to match the [recommended naming patterns](https://backstage.io/docs/backend-system/architecture/naming-patterns). +- e675f902980: Make sure to not use deprecated exports from `@backstage/plugin-catalog-backend` +- 928a12a9b3e: Internal refactor of `/alpha` exports. +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/plugin-catalog-backend@1.8.0 + - @backstage/catalog-client@1.4.0 + - @backstage/backend-tasks@0.5.0 + - @backstage/backend-common@0.18.3 + - @backstage/errors@1.1.5 + - @backstage/plugin-catalog-node@1.3.4 + - @backstage/backend-plugin-api@0.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/plugin-catalog-common@1.0.12 + - @backstage/plugin-events-node@0.2.4 + - @backstage/integration@1.4.3 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + +## @backstage/plugin-catalog-backend-module-gitlab@0.1.14 + +### Patch Changes + +- 90469c02c8c: Renamed `gitlabDiscoveryEntityProviderCatalogModule` to `catalogModuleGitlabDiscoveryEntityProvider` to match the [recommended naming patterns](https://backstage.io/docs/backend-system/architecture/naming-patterns). +- e675f902980: Make sure to not use deprecated exports from `@backstage/plugin-catalog-backend` +- 928a12a9b3e: Internal refactor of `/alpha` exports. +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- af1095f1e11: The configuration key `branch` of the `GitlabDiscoveryEntityProvider` has been deprecated in favor of the configuration key `fallbackBranch`. + It will be reused in future release to enforce a concrete branch to be used in catalog file discovery. + To migrate to the new configuration value, rename `branch` to `fallbackBranch`. +- be129f8f3cd: filter gitlab groups by prefix +- Updated dependencies + - @backstage/backend-tasks@0.5.0 + - @backstage/backend-common@0.18.3 + - @backstage/errors@1.1.5 + - @backstage/plugin-catalog-node@1.3.4 + - @backstage/backend-plugin-api@0.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/integration@1.4.3 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + +## @backstage/plugin-catalog-backend-module-ldap@0.5.10 + +### Patch Changes + +- e675f902980: Make sure to not use deprecated exports from `@backstage/plugin-catalog-backend` +- Updated dependencies + - @backstage/backend-tasks@0.5.0 + - @backstage/errors@1.1.5 + - @backstage/plugin-catalog-node@1.3.4 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + +## @backstage/plugin-catalog-backend-module-msgraph@0.5.2 + +### Patch Changes + +- a4ebd513527: Revert using `baseUrl` for MS Graph provider as it breaks token retrieval +- 26eef93c547: Fixed msgraph catalog backend to use user.select option when fetching user from AzureAD +- 90469c02c8c: Renamed `microsoftGraphOrgEntityProviderCatalogModule` to `catalogModuleMicrosoftGraphOrgEntityProvider` to match the [recommended naming patterns](https://backstage.io/docs/backend-system/architecture/naming-patterns). +- e675f902980: Make sure to not use deprecated exports from `@backstage/plugin-catalog-backend` +- 928a12a9b3e: Internal refactor of `/alpha` exports. +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- 2c234a89325: properly support custom graph api URL +- Updated dependencies + - @backstage/backend-tasks@0.5.0 + - @backstage/backend-common@0.18.3 + - @backstage/plugin-catalog-node@1.3.4 + - @backstage/backend-plugin-api@0.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + +## @backstage/plugin-catalog-backend-module-openapi@0.1.9 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-backend@1.8.0 + - @backstage/backend-common@0.18.3 + - @backstage/plugin-catalog-node@1.3.4 + - @backstage/catalog-model@1.2.1 + - @backstage/integration@1.4.3 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + +## @backstage/plugin-catalog-common@1.0.12 + +### Patch Changes + +- 928a12a9b3e: Internal refactor of `/alpha` exports. +- Updated dependencies + - @backstage/catalog-model@1.2.1 + - @backstage/plugin-permission-common@0.7.4 + - @backstage/plugin-search-common@1.2.2 + +## @backstage/plugin-catalog-graph@0.2.28 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-client@1.4.0 + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.18 + +## @backstage/plugin-catalog-graphql@0.3.19 + +### Patch Changes + +- b990021ddeb: Updated dependency `@graphql-codegen/cli` to `^3.0.0`. + Updated dependency `@graphql-codegen/graphql-modules-preset` to `^3.0.0`. + Updated dependency `@graphql-codegen/typescript` to `^3.0.0`. + Updated dependency `@graphql-codegen/typescript-resolvers` to `^3.0.0`. +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + +## @backstage/plugin-catalog-import@0.9.6 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/catalog-client@1.4.0 + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/errors@1.1.5 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/plugin-catalog-common@1.0.12 + - @backstage/integration-react@1.1.11 + - @backstage/integration@1.4.3 + - @backstage/config@1.0.7 + +## @backstage/plugin-catalog-node@1.3.4 + +### Patch Changes + +- e675f902980: Added `locationSpecToMetadataName` and `locationSpecToLocationEntity` as their new home, moved over from the backend package where they now are marked as deprecated. +- 928a12a9b3e: Internal refactor of `/alpha` exports. +- Updated dependencies + - @backstage/catalog-client@1.4.0 + - @backstage/errors@1.1.5 + - @backstage/backend-plugin-api@0.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/plugin-catalog-common@1.0.12 + - @backstage/types@1.0.2 + +## @backstage/plugin-cicd-statistics@0.1.18 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + +## @backstage/plugin-cicd-statistics-module-gitlab@0.1.12 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/plugin-cicd-statistics@0.1.18 + +## @backstage/plugin-circleci@0.3.16 + +### Patch Changes + +- c10384a9235: Switch to using `LinkButton` instead of the deprecated `Button` +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.18 + +## @backstage/plugin-cloudbuild@0.3.16 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.18 + +## @backstage/plugin-code-climate@0.1.16 + +### Patch Changes + +- cb8ec97cdeb: Change black & white colors to be theme aware +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.18 + +## @backstage/plugin-code-coverage@0.2.9 + +### Patch Changes + +- cb8ec97cdeb: Change black & white colors to be theme aware +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/errors@1.1.5 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/theme@0.2.18 + +## @backstage/plugin-code-coverage-backend@0.2.9 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/catalog-client@1.4.0 + - @backstage/backend-common@0.18.3 + - @backstage/errors@1.1.5 + - @backstage/catalog-model@1.2.1 + - @backstage/integration@1.4.3 + - @backstage/config@1.0.7 + +## @backstage/plugin-codescene@0.1.11 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/errors@1.1.5 + - @backstage/core-plugin-api@1.5.0 + - @backstage/config@1.0.7 + - @backstage/theme@0.2.18 + +## @backstage/plugin-config-schema@0.1.39 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/errors@1.1.5 + - @backstage/core-plugin-api@1.5.0 + - @backstage/config@1.0.7 + - @backstage/theme@0.2.18 + - @backstage/types@1.0.2 + +## @backstage/plugin-cost-insights@0.12.5 + +### Patch Changes + +- 928a12a9b3e: Internal refactor of `/alpha` exports. +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/theme@0.2.18 + - @backstage/plugin-cost-insights-common@0.1.1 + +## @backstage/plugin-dynatrace@3.0.0 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.18 + +## @backstage/plugin-entity-feedback@0.1.1 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/errors@1.1.5 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.18 + - @backstage/plugin-entity-feedback-common@0.1.0 + +## @backstage/plugin-entity-feedback-backend@0.1.1 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/catalog-client@1.4.0 + - @backstage/plugin-auth-node@0.2.12 + - @backstage/backend-common@0.18.3 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/plugin-entity-feedback-common@0.1.0 + +## @backstage/plugin-entity-validation@0.1.1 + +### Patch Changes + +- 47d246691ac: Fixed bug in EntityVaidation plugin where string in text box was unable to be updated. +- c10384a9235: Switch to using `LinkButton` instead of the deprecated `Button` +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/catalog-client@1.4.0 + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/errors@1.1.5 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/plugin-catalog-common@1.0.12 + - @backstage/theme@0.2.18 + +## @backstage/plugin-events-backend@0.2.4 + +### Patch Changes + +- 928a12a9b3e: Internal refactor of `/alpha` exports. +- a5de745ac17: Updated README instructions +- Updated dependencies + - @backstage/backend-common@0.18.3 + - @backstage/backend-plugin-api@0.5.0 + - @backstage/plugin-events-node@0.2.4 + - @backstage/config@1.0.7 + +## @backstage/plugin-events-backend-module-aws-sqs@0.1.5 + +### Patch Changes + +- a5de745ac17: Renamed `awsSqsConsumingEventPublisherEventsModule` to `eventsModuleAwsSqsConsumingEventPublisher` to match the [recommended naming patterns](https://backstage.io/docs/backend-system/architecture/naming-patterns). +- 928a12a9b3e: Internal refactor of `/alpha` exports. +- Updated dependencies + - @backstage/backend-tasks@0.5.0 + - @backstage/backend-common@0.18.3 + - @backstage/backend-plugin-api@0.5.0 + - @backstage/plugin-events-node@0.2.4 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + +## @backstage/plugin-events-backend-module-azure@0.1.5 + +### Patch Changes + +- a5de745ac17: Renamed `azureDevOpsEventRouterEventsModule` to `eventsModuleAzureDevOpsEventRouter` to match the [recommended naming patterns](https://backstage.io/docs/backend-system/architecture/naming-patterns). +- 928a12a9b3e: Internal refactor of `/alpha` exports. +- Updated dependencies + - @backstage/backend-plugin-api@0.5.0 + - @backstage/plugin-events-node@0.2.4 + +## @backstage/plugin-events-backend-module-bitbucket-cloud@0.1.5 + +### Patch Changes + +- a5de745ac17: Renamed `bitbucketCloudEventRouterEventsModule` to `eventsModuleBitbucketCloudEventRouter` to match the [recommended naming patterns](https://backstage.io/docs/backend-system/architecture/naming-patterns). +- 928a12a9b3e: Internal refactor of `/alpha` exports. +- Updated dependencies + - @backstage/backend-plugin-api@0.5.0 + - @backstage/plugin-events-node@0.2.4 + +## @backstage/plugin-events-backend-module-gerrit@0.1.5 + +### Patch Changes + +- a5de745ac17: Renamed `gerritEventRouterEventsModule` to `eventsModuleGerritEventRouter` to match the [recommended naming patterns](https://backstage.io/docs/backend-system/architecture/naming-patterns). +- 928a12a9b3e: Internal refactor of `/alpha` exports. +- Updated dependencies + - @backstage/backend-plugin-api@0.5.0 + - @backstage/plugin-events-node@0.2.4 + +## @backstage/plugin-events-backend-module-github@0.1.5 + +### Patch Changes + +- a5de745ac17: Renamed `githubEventRouterEventsModule` to `eventsModuleGithubEventRouter` and `githubWebhookEventsModule` to `eventsModuleGithubWebhook`, to match the [recommended naming patterns](https://backstage.io/docs/backend-system/architecture/naming-patterns). +- 928a12a9b3e: Internal refactor of `/alpha` exports. +- Updated dependencies + - @backstage/backend-plugin-api@0.5.0 + - @backstage/plugin-events-node@0.2.4 + - @backstage/config@1.0.7 + +## @backstage/plugin-events-backend-module-gitlab@0.1.5 + +### Patch Changes + +- a5de745ac17: Renamed `gitlabEventRouterEventsModule` to `eventsModuleGitlabEventRouter` and `gitlabWebhookEventsModule` to `eventsModuleGitlabWebhook` to match the [recommended naming patterns](https://backstage.io/docs/backend-system/architecture/naming-patterns). +- 928a12a9b3e: Internal refactor of `/alpha` exports. +- Updated dependencies + - @backstage/backend-plugin-api@0.5.0 + - @backstage/plugin-events-node@0.2.4 + - @backstage/config@1.0.7 + +## @backstage/plugin-events-backend-test-utils@0.1.5 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-events-node@0.2.4 + +## @backstage/plugin-events-node@0.2.4 + +### Patch Changes + +- 928a12a9b3e: Internal refactor of `/alpha` exports. +- Updated dependencies + - @backstage/backend-plugin-api@0.5.0 + +## @backstage/plugin-explore@0.4.1 + +### Patch Changes + +- 65454876fb2: Minor API report tweaks +- cb8ec97cdeb: Change black & white colors to be theme aware +- c10384a9235: Switch to using `LinkButton` instead of the deprecated `Button` +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- 3f75b7607ca: Add ability to pass icon as function to have ability to customize it by search item +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/plugin-search-react@1.5.1 + - @backstage/errors@1.1.5 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/plugin-explore-react@0.0.27 + - @backstage/theme@0.2.18 + - @backstage/plugin-explore-common@0.0.1 + - @backstage/plugin-search-common@1.2.2 + +## @backstage/plugin-explore-backend@0.0.5 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/backend-common@0.18.3 + - @backstage/config@1.0.7 + - @backstage/plugin-explore-common@0.0.1 + - @backstage/plugin-search-common@1.2.2 + +## @backstage/plugin-explore-react@0.0.27 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-plugin-api@1.5.0 + - @backstage/plugin-explore-common@0.0.1 + +## @backstage/plugin-fossa@0.2.48 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/errors@1.1.5 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.18 + +## @backstage/plugin-gcalendar@0.3.12 + +### Patch Changes + +- cb8ec97cdeb: Change black & white colors to be theme aware +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/errors@1.1.5 + - @backstage/core-plugin-api@1.5.0 + - @backstage/theme@0.2.18 + +## @backstage/plugin-gcp-projects@0.3.35 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/core-plugin-api@1.5.0 + - @backstage/theme@0.2.18 + +## @backstage/plugin-git-release-manager@0.3.29 + +### Patch Changes + +- cb8ec97cdeb: Change black & white colors to be theme aware +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/core-plugin-api@1.5.0 + - @backstage/integration@1.4.3 + - @backstage/theme@0.2.18 + +## @backstage/plugin-github-actions@0.5.16 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/integration@1.4.3 + - @backstage/theme@0.2.18 + +## @backstage/plugin-github-deployments@0.1.47 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/errors@1.1.5 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/integration-react@1.1.11 + - @backstage/integration@1.4.3 + - @backstage/theme@0.2.18 + +## @backstage/plugin-github-issues@0.2.5 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/errors@1.1.5 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/integration@1.4.3 + - @backstage/theme@0.2.18 + +## @backstage/plugin-github-pull-requests-board@0.1.10 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/integration@1.4.3 + - @backstage/theme@0.2.18 + +## @backstage/plugin-gitops-profiles@0.3.34 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/core-plugin-api@1.5.0 + - @backstage/theme@0.2.18 + +## @backstage/plugin-gocd@0.1.22 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/errors@1.1.5 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.18 + +## @backstage/plugin-graphiql@0.2.48 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/core-plugin-api@1.5.0 + - @backstage/theme@0.2.18 + +## @backstage/plugin-graphql-backend@0.1.33 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/backend-common@0.18.3 + - @backstage/plugin-catalog-graphql@0.3.19 + - @backstage/config@1.0.7 + +## @backstage/plugin-graphql-voyager@0.1.1 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/core-plugin-api@1.5.0 + - @backstage/theme@0.2.18 + +## @backstage/plugin-home@0.4.32 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/theme@0.2.18 + +## @backstage/plugin-ilert@0.2.5 + +### Patch Changes + +- cb8ec97cdeb: Change black & white colors to be theme aware +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/errors@1.1.5 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.18 + +## @backstage/plugin-jenkins@0.7.15 + +### Patch Changes + +- 928a12a9b3e: Internal refactor of `/alpha` exports. +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/errors@1.1.5 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/plugin-jenkins-common@0.1.14 + - @backstage/theme@0.2.18 + +## @backstage/plugin-jenkins-backend@0.1.33 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/catalog-client@1.4.0 + - @backstage/plugin-auth-node@0.2.12 + - @backstage/backend-common@0.18.3 + - @backstage/errors@1.1.5 + - @backstage/catalog-model@1.2.1 + - @backstage/plugin-jenkins-common@0.1.14 + - @backstage/plugin-permission-common@0.7.4 + - @backstage/config@1.0.7 + +## @backstage/plugin-jenkins-common@0.1.14 + +### Patch Changes + +- 928a12a9b3e: Internal refactor of `/alpha` exports. +- Updated dependencies + - @backstage/plugin-catalog-common@1.0.12 + - @backstage/plugin-permission-common@0.7.4 + +## @backstage/plugin-kafka@0.3.16 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/theme@0.2.18 + +## @backstage/plugin-kafka-backend@0.2.36 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.3 + - @backstage/errors@1.1.5 + - @backstage/backend-plugin-api@0.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + +## @backstage/plugin-kubernetes@0.7.9 + +### Patch Changes + +- 8adeb19b37d: GitLab can now be used as an `oidcTokenProvider` for Kubernetes clusters +- c10384a9235: Switch to using `LinkButton` instead of the deprecated `Button` +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/theme@0.2.18 + - @backstage/plugin-kubernetes-common@0.6.1 + +## @backstage/plugin-kubernetes-backend@0.9.4 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/catalog-client@1.4.0 + - @backstage/plugin-auth-node@0.2.12 + - @backstage/backend-common@0.18.3 + - @backstage/errors@1.1.5 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/plugin-kubernetes-common@0.6.1 + +## @backstage/plugin-kubernetes-common@0.6.1 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.2.1 + +## @backstage/plugin-lighthouse@0.4.1 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/theme@0.2.18 + - @backstage/plugin-lighthouse-common@0.1.1 + +## @backstage/plugin-lighthouse-backend@0.1.1 + +### Patch Changes + +- 46829bc2f0e: Update README.md; typo with plugin name & removed unneeded "import { Router } from 'express';" +- Updated dependencies + - @backstage/catalog-client@1.4.0 + - @backstage/backend-tasks@0.5.0 + - @backstage/backend-common@0.18.3 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + - @backstage/plugin-lighthouse-common@0.1.1 + +## @backstage/plugin-lighthouse-common@0.1.1 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.0.7 + +## @backstage/plugin-linguist@0.1.1 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- ab997ce243f: Updated `README.md` to removed images with refresh button as this feature was not implemented in the current version +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/errors@1.1.5 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.18 + - @backstage/plugin-linguist-common@0.1.0 + +## @backstage/plugin-microsoft-calendar@0.1.1 + +### Patch Changes + +- cb8ec97cdeb: Change black & white colors to be theme aware +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/errors@1.1.5 + - @backstage/core-plugin-api@1.5.0 + - @backstage/theme@0.2.18 + +## @backstage/plugin-newrelic@0.3.34 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- 66fdf05a1ef: Updated installation instructions +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/core-plugin-api@1.5.0 + - @backstage/theme@0.2.18 + +## @backstage/plugin-newrelic-dashboard@0.2.9 + +### Patch Changes + +- cb8ec97cdeb: Change black & white colors to be theme aware +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/errors@1.1.5 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + +## @backstage/plugin-org@0.6.6 + +### Patch Changes + +- cb8ec97cdeb: Change black & white colors to be theme aware +- 36bccb5252f: Fix small UI-glitch in MemberListCard +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- a06fcac4040: Add styling to the `MembersListCard` and `ComponentsGrid` to handle overflow text. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.18 + +## @backstage/plugin-org-react@0.1.5 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/catalog-client@1.4.0 + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.18 + +## @backstage/plugin-pagerduty@0.5.9 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- 9c08ecbaa4b: Update readme link for discord channel +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/errors@1.1.5 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.18 + +## @backstage/plugin-periskop@0.1.14 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/errors@1.1.5 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.18 + +## @backstage/plugin-periskop-backend@0.1.14 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/backend-common@0.18.3 + - @backstage/backend-plugin-api@0.5.0 + - @backstage/config@1.0.7 + +## @backstage/plugin-permission-backend@0.5.18 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/plugin-permission-node@0.7.6 + - @backstage/plugin-auth-node@0.2.12 + - @backstage/backend-common@0.18.3 + - @backstage/errors@1.1.5 + - @backstage/plugin-permission-common@0.7.4 + - @backstage/config@1.0.7 + +## @backstage/plugin-permission-common@0.7.4 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/errors@1.1.5 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + +## @backstage/plugin-permission-node@0.7.6 + +### Patch Changes + +- 27a103ca07b: Changed the `createPermissionIntegrationRouter` API to allow `getResources`, `resourceType` and `rules` to be optional +- 37e9215c793: Update the service-to-service auth docs URL in error message. + \`\` +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/plugin-auth-node@0.2.12 + - @backstage/backend-common@0.18.3 + - @backstage/errors@1.1.5 + - @backstage/plugin-permission-common@0.7.4 + - @backstage/config@1.0.7 + +## @backstage/plugin-permission-react@0.4.11 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.5.0 + - @backstage/plugin-permission-common@0.7.4 + - @backstage/config@1.0.7 + +## @backstage/plugin-playlist@0.1.7 + +### Patch Changes + +- c10384a9235: Switch to using `LinkButton` instead of the deprecated `Button` +- 122a37a880e: Internal update to work with newer versions of react-router +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/plugin-search-react@1.5.1 + - @backstage/errors@1.1.5 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/plugin-catalog-common@1.0.12 + - @backstage/plugin-permission-common@0.7.4 + - @backstage/theme@0.2.18 + - @backstage/plugin-permission-react@0.4.11 + - @backstage/plugin-playlist-common@0.1.5 + +## @backstage/plugin-playlist-backend@0.2.6 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/catalog-client@1.4.0 + - @backstage/plugin-permission-node@0.7.6 + - @backstage/plugin-auth-node@0.2.12 + - @backstage/backend-common@0.18.3 + - @backstage/errors@1.1.5 + - @backstage/catalog-model@1.2.1 + - @backstage/plugin-permission-common@0.7.4 + - @backstage/config@1.0.7 + - @backstage/plugin-playlist-common@0.1.5 + +## @backstage/plugin-playlist-common@0.1.5 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-permission-common@0.7.4 + +## @backstage/plugin-proxy-backend@0.2.37 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. + +- 3e3eea4bc7e: The proxy-backend plugin now supports reviving request bodies that have previously been consumed by an express middleware (e.g. `express.json()`). This is done by setting `reviveConsumedRequestBodies: true` on the proxy `RouterOptions`. In order to preserve the current behavior, the proxy will **not** revive request bodies by default. + + The following is an example of a proxy `createRouter` invocation that revives request bodies: + + ```diff + const router = await createRouter({ + config, + logger, + discovery, + + reviveConsumedRequestBodies: true, + }); + ``` + +- 4acd93dae1d: Ensure that `@backstage/plugin-proxy-backend` logs the requests that it proxies when log level is set to `debug`. + +- Updated dependencies + - @backstage/backend-common@0.18.3 + - @backstage/backend-plugin-api@0.5.0 + - @backstage/config@1.0.7 + +## @backstage/plugin-rollbar@0.4.16 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.18 + +## @backstage/plugin-rollbar-backend@0.1.40 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/backend-common@0.18.3 + - @backstage/config@1.0.7 + +## @backstage/plugin-scaffolder-backend-module-cookiecutter@0.2.18 + +### Patch Changes + +- 62414770ead: allow container runner to be undefined in cookiecutter plugin +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/plugin-scaffolder-backend@1.12.0 + - @backstage/backend-common@0.18.3 + - @backstage/errors@1.1.5 + - @backstage/integration@1.4.3 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + - @backstage/plugin-scaffolder-node@0.1.1 + +## @backstage/plugin-scaffolder-backend-module-rails@0.4.11 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-backend@1.12.0 + - @backstage/backend-common@0.18.3 + - @backstage/errors@1.1.5 + - @backstage/integration@1.4.3 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + - @backstage/plugin-scaffolder-node@0.1.1 + +## @backstage/plugin-scaffolder-backend-module-sentry@0.1.3 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.1.5 + - @backstage/config@1.0.7 + - @backstage/plugin-scaffolder-node@0.1.1 + +## @backstage/plugin-scaffolder-backend-module-yeoman@0.2.16 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + - @backstage/plugin-scaffolder-node@0.1.1 + +## @backstage/plugin-scaffolder-common@1.2.6 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.2.1 + - @backstage/types@1.0.2 + +## @backstage/plugin-scaffolder-node@0.1.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/types@1.0.2 + - @backstage/plugin-scaffolder-common@1.2.6 + +## @backstage/plugin-search@1.1.1 + +### Patch Changes + +- 65454876fb2: Minor API report tweaks +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/plugin-search-react@1.5.1 + - @backstage/errors@1.1.5 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/theme@0.2.18 + - @backstage/types@1.0.2 + - @backstage/version-bridge@1.0.3 + - @backstage/plugin-search-common@1.2.2 + +## @backstage/plugin-search-backend@1.2.4 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-permission-node@0.7.6 + - @backstage/plugin-auth-node@0.2.12 + - @backstage/backend-common@0.18.3 + - @backstage/errors@1.1.5 + - @backstage/plugin-permission-common@0.7.4 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + - @backstage/plugin-search-backend-node@1.1.4 + - @backstage/plugin-search-common@1.2.2 + +## @backstage/plugin-search-backend-module-elasticsearch@1.1.4 + +### Patch Changes + +- 65454876fb2: Minor API report tweaks +- Updated dependencies + - @backstage/config@1.0.7 + - @backstage/plugin-search-backend-node@1.1.4 + - @backstage/plugin-search-common@1.2.2 + +## @backstage/plugin-search-backend-module-pg@0.5.4 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.3 + - @backstage/config@1.0.7 + - @backstage/plugin-search-backend-node@1.1.4 + - @backstage/plugin-search-common@1.2.2 + +## @backstage/plugin-search-backend-node@1.1.4 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-tasks@0.5.0 + - @backstage/backend-common@0.18.3 + - @backstage/errors@1.1.5 + - @backstage/plugin-permission-common@0.7.4 + - @backstage/config@1.0.7 + - @backstage/plugin-search-common@1.2.2 + +## @backstage/plugin-search-common@1.2.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-permission-common@0.7.4 + - @backstage/types@1.0.2 + +## @backstage/plugin-search-react@1.5.1 + +### Patch Changes + +- 65454876fb2: Minor API report tweaks +- 553f3c95011: Correctly disable next button in `SearchPagination` on last page +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/core-plugin-api@1.5.0 + - @backstage/theme@0.2.18 + - @backstage/types@1.0.2 + - @backstage/version-bridge@1.0.3 + - @backstage/plugin-search-common@1.2.2 + +## @backstage/plugin-sentry@0.5.1 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.18 + +## @backstage/plugin-shortcuts@0.3.8 + +### Patch Changes + +- cb8ec97cdeb: Change black & white colors to be theme aware + +- 7c38e565d1f: Fixed bug in LocalStoredShortcuts client where adding new Shortcut results in replacing entire shortcut list. + + Refactored LocalStoredShortcuts client to listen to `storageApi` updates to ensure that local state is always up to date. + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. + +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/core-plugin-api@1.5.0 + - @backstage/theme@0.2.18 + - @backstage/types@1.0.2 + +## @backstage/plugin-sonarqube@0.6.5 + +### Patch Changes + +- 65454876fb2: Minor API report tweaks +- 928a12a9b3e: Internal refactor of `/alpha` exports. +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- 8ae65a0bc1d: Moved imports from `/alpha` to main public exports. +- d3d624e8e8d: Show a more appropriate icon if there are no code smells and/or vulnerabilities. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/plugin-sonarqube-react@0.1.4 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.18 + +## @backstage/plugin-sonarqube-backend@0.1.8 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/backend-common@0.18.3 + - @backstage/errors@1.1.5 + - @backstage/config@1.0.7 + +## @backstage/plugin-sonarqube-react@0.1.4 + +### Patch Changes + +- 928a12a9b3e: Internal refactor of `/alpha` exports. +- 8ae65a0bc1d: Moved imports from `/alpha` to main public exports. +- Updated dependencies + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + +## @backstage/plugin-splunk-on-call@0.4.5 + +### Patch Changes + +- 65454876fb2: Minor API report tweaks +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.18 + +## @backstage/plugin-stack-overflow@0.1.12 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- 3ef5fb09ca5: Export api ref and StackOverflowApi type +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/plugin-search-react@1.5.1 + - @backstage/core-plugin-api@1.5.0 + - @backstage/plugin-home@0.4.32 + - @backstage/config@1.0.7 + - @backstage/theme@0.2.18 + - @backstage/plugin-search-common@1.2.2 + +## @backstage/plugin-stack-overflow-backend@0.1.12 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/backend-common@0.18.3 + - @backstage/config@1.0.7 + - @backstage/plugin-search-common@1.2.2 + +## @backstage/plugin-tech-insights@0.3.8 + +### Patch Changes + +- 65454876fb2: Minor API report tweaks +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/errors@1.1.5 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.18 + - @backstage/types@1.0.2 + - @backstage/plugin-tech-insights-common@0.2.10 + +## @backstage/plugin-tech-insights-backend@0.5.9 + +### Patch Changes + +- f244b589163: Add DB index to improve latency of latest fact query +- Updated dependencies + - @backstage/catalog-client@1.4.0 + - @backstage/backend-tasks@0.5.0 + - @backstage/backend-common@0.18.3 + - @backstage/errors@1.1.5 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + - @backstage/plugin-tech-insights-common@0.2.10 + - @backstage/plugin-tech-insights-node@0.4.1 + +## @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.27 + +### Patch Changes + +- 65454876fb2: Minor API report tweaks +- Updated dependencies + - @backstage/backend-common@0.18.3 + - @backstage/errors@1.1.5 + - @backstage/config@1.0.7 + - @backstage/plugin-tech-insights-common@0.2.10 + - @backstage/plugin-tech-insights-node@0.4.1 + +## @backstage/plugin-tech-insights-node@0.4.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-tasks@0.5.0 + - @backstage/backend-common@0.18.3 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + - @backstage/plugin-tech-insights-common@0.2.10 + +## @backstage/plugin-tech-radar@0.6.2 + +### Patch Changes + +- e14dcfa4994: Update colors to match Zalando's tech radar, also add coloring on title and legend to match ring color. +- cb8ec97cdeb: Change black & white colors to be theme aware +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/core-plugin-api@1.5.0 + - @backstage/theme@0.2.18 + +## @backstage/plugin-techdocs-addons-test-utils@1.0.11 + +### Patch Changes + +- 2b00d8a225c: Fix bug/problem with test helper +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/plugin-catalog@1.9.0 + - @backstage/core-components@0.12.5 + - @backstage/plugin-techdocs-react@1.1.4 + - @backstage/plugin-search-react@1.5.1 + - @backstage/plugin-techdocs@1.6.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/test-utils@1.2.6 + - @backstage/core-app-api@1.6.0 + - @backstage/integration-react@1.1.11 + - @backstage/theme@0.2.18 + +## @backstage/plugin-techdocs-module-addons-contrib@1.0.11 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- 37cf85fb85c: Fixed bug in IssueLink component where the URL was not generated properly when the repository was located inside a Gitlab subgroup +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/plugin-techdocs-react@1.1.4 + - @backstage/core-plugin-api@1.5.0 + - @backstage/integration-react@1.1.11 + - @backstage/integration@1.4.3 + - @backstage/theme@0.2.18 + +## @backstage/plugin-techdocs-react@1.1.4 + +### Patch Changes + +- 65454876fb2: Minor API report tweaks +- 928a12a9b3e: Internal refactor of `/alpha` exports. +- 8adfda60ae1: Updated dependency `jss` to `~10.10.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/version-bridge@1.0.3 + +## @backstage/plugin-todo@0.2.18 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/errors@1.1.5 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.18 + +## @backstage/plugin-todo-backend@0.1.40 + +### Patch Changes + +- 4120513412a: todo-backend is now exposed as a plugin which uses the new plugin system +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/catalog-client@1.4.0 + - @backstage/backend-common@0.18.3 + - @backstage/errors@1.1.5 + - @backstage/plugin-catalog-node@1.3.4 + - @backstage/backend-plugin-api@0.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/integration@1.4.3 + - @backstage/config@1.0.7 + +## @backstage/plugin-user-settings@0.7.1 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/errors@1.1.5 + - @backstage/core-plugin-api@1.5.0 + - @backstage/core-app-api@1.6.0 + - @backstage/theme@0.2.18 + - @backstage/types@1.0.2 + +## @backstage/plugin-user-settings-backend@0.1.7 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.2.12 + - @backstage/backend-common@0.18.3 + - @backstage/errors@1.1.5 + - @backstage/backend-plugin-api@0.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/types@1.0.2 + +## @backstage/plugin-vault@0.1.10 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/errors@1.1.5 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.18 + +## @backstage/plugin-vault-backend@0.2.10 + +### Patch Changes + +- 66b3a3956b8: Ignore the `eslint` error +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/backend-tasks@0.5.0 + - @backstage/backend-common@0.18.3 + - @backstage/errors@1.1.5 + - @backstage/config@1.0.7 + +## @backstage/plugin-xcmetrics@0.2.36 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/errors@1.1.5 + - @backstage/core-plugin-api@1.5.0 + - @backstage/theme@0.2.18 + +## example-app@0.2.81 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/plugin-scaffolder-react@1.2.0 + - @backstage/plugin-techdocs-react@1.1.4 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/plugin-tech-insights@0.3.8 + - @backstage/plugin-search-react@1.5.1 + - @backstage/plugin-scaffolder@1.12.0 + - @backstage/plugin-techdocs@1.6.0 + - @backstage/plugin-explore@0.4.1 + - @backstage/plugin-search@1.1.1 + - @backstage/cli@0.22.4 + - @backstage/plugin-kubernetes@0.7.9 + - @backstage/plugin-tech-radar@0.6.2 + - @backstage/plugin-microsoft-calendar@0.1.1 + - @backstage/plugin-newrelic-dashboard@0.2.9 + - @backstage/plugin-code-coverage@0.2.9 + - @backstage/plugin-azure-sites@0.1.5 + - @backstage/plugin-gcalendar@0.3.12 + - @backstage/plugin-shortcuts@0.3.8 + - @backstage/plugin-org@0.6.6 + - @backstage/plugin-api-docs@0.9.1 + - @backstage/plugin-stackstorm@0.1.0 + - @backstage/plugin-circleci@0.3.16 + - @backstage/plugin-playlist@0.1.7 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/plugin-catalog-common@1.0.12 + - @backstage/plugin-cost-insights@0.12.5 + - @backstage/plugin-jenkins@0.7.15 + - @backstage/core-app-api@1.6.0 + - @backstage/integration-react@1.1.11 + - @backstage/plugin-airbrake@0.3.16 + - @backstage/plugin-apache-airflow@0.2.9 + - @backstage/plugin-azure-devops@0.2.7 + - @backstage/plugin-badges@0.2.40 + - @backstage/plugin-catalog-import@0.9.6 + - @backstage/plugin-cloudbuild@0.3.16 + - @backstage/plugin-dynatrace@3.0.0 + - @backstage/plugin-entity-feedback@0.1.1 + - @backstage/plugin-gcp-projects@0.3.35 + - @backstage/plugin-github-actions@0.5.16 + - @backstage/plugin-gocd@0.1.22 + - @backstage/plugin-graphiql@0.2.48 + - @backstage/plugin-home@0.4.32 + - @backstage/plugin-kafka@0.3.16 + - @backstage/plugin-lighthouse@0.4.1 + - @backstage/plugin-linguist@0.1.1 + - @backstage/plugin-newrelic@0.3.34 + - @backstage/plugin-pagerduty@0.5.9 + - @backstage/plugin-rollbar@0.4.16 + - @backstage/plugin-sentry@0.5.1 + - @backstage/plugin-stack-overflow@0.1.12 + - @backstage/plugin-techdocs-module-addons-contrib@1.0.11 + - @backstage/plugin-todo@0.2.18 + - @backstage/plugin-user-settings@0.7.1 + - @backstage/config@1.0.7 + - @backstage/theme@0.2.18 + - @internal/plugin-catalog-customized@0.0.8 + - @backstage/plugin-catalog-graph@0.2.28 + - @backstage/app-defaults@1.2.1 + - @backstage/plugin-linguist-common@0.1.0 + - @backstage/plugin-permission-react@0.4.11 + - @backstage/plugin-search-common@1.2.2 + +## example-backend@0.2.81 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-backend@1.12.0 + - @backstage/plugin-catalog-backend@1.8.0 + - @backstage/catalog-client@1.4.0 + - @backstage/plugin-todo-backend@0.1.40 + - @backstage/plugin-permission-node@0.7.6 + - @backstage/plugin-search-backend-module-elasticsearch@1.1.4 + - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.27 + - @backstage/plugin-auth-node@0.2.12 + - @backstage/plugin-techdocs-backend@1.6.0 + - @backstage/backend-tasks@0.5.0 + - @backstage/plugin-tech-insights-backend@0.5.9 + - @backstage/plugin-adr-backend@0.3.1 + - @backstage/plugin-auth-backend@0.18.1 + - @backstage/backend-common@0.18.3 + - @backstage/plugin-linguist-backend@0.2.0 + - @backstage/plugin-catalog-node@1.3.4 + - @backstage/catalog-model@1.2.1 + - @backstage/plugin-events-backend@0.2.4 + - @backstage/plugin-app-backend@0.3.43 + - @backstage/plugin-events-node@0.2.4 + - @backstage/integration@1.4.3 + - @backstage/plugin-azure-devops-backend@0.3.22 + - @backstage/plugin-azure-sites-backend@0.1.5 + - @backstage/plugin-code-coverage-backend@0.2.9 + - @backstage/plugin-entity-feedback-backend@0.1.1 + - @backstage/plugin-explore-backend@0.0.5 + - @backstage/plugin-graphql-backend@0.1.33 + - @backstage/plugin-jenkins-backend@0.1.33 + - @backstage/plugin-kubernetes-backend@0.9.4 + - @backstage/plugin-permission-backend@0.5.18 + - @backstage/plugin-permission-common@0.7.4 + - @backstage/plugin-playlist-backend@0.2.6 + - @backstage/plugin-proxy-backend@0.2.37 + - @backstage/plugin-rollbar-backend@0.1.40 + - @backstage/plugin-lighthouse-backend@0.1.1 + - @backstage/config@1.0.7 + - @backstage/plugin-scaffolder-backend-module-rails@0.4.11 + - @backstage/plugin-badges-backend@0.1.37 + - example-app@0.2.81 + - @backstage/plugin-search-backend@1.2.4 + - @backstage/plugin-kafka-backend@0.2.36 + - @backstage/plugin-search-backend-module-pg@0.5.4 + - @backstage/plugin-search-backend-node@1.1.4 + - @backstage/plugin-search-common@1.2.2 + - @backstage/plugin-tech-insights-node@0.4.1 + +## example-backend-next@0.0.9 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-backend@1.12.0 + - @backstage/plugin-catalog-backend@1.8.0 + - @backstage/plugin-todo-backend@0.1.40 + - @backstage/plugin-techdocs-backend@1.6.0 + - @backstage/backend-defaults@0.1.8 + - @backstage/plugin-app-backend@0.3.43 + +## e2e-test@0.2.1 + +### Patch Changes + +- Updated dependencies + - @backstage/create-app@0.4.38 + - @backstage/errors@1.1.5 + - @backstage/cli-common@0.1.12 + +## techdocs-cli-embedded-app@0.2.80 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog@1.9.0 + - @backstage/core-components@0.12.5 + - @backstage/plugin-techdocs-react@1.1.4 + - @backstage/plugin-techdocs@1.6.0 + - @backstage/cli@0.22.4 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/test-utils@1.2.6 + - @backstage/core-app-api@1.6.0 + - @backstage/integration-react@1.1.11 + - @backstage/config@1.0.7 + - @backstage/theme@0.2.18 + - @backstage/app-defaults@1.2.1 + +## @internal/plugin-catalog-customized@0.0.8 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog@1.9.0 + - @backstage/plugin-catalog-react@1.4.0 + +## @internal/plugin-todo-list@1.0.11 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/core-plugin-api@1.5.0 + - @backstage/theme@0.2.18 + +## @internal/plugin-todo-list-backend@1.0.11 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.2.12 + - @backstage/backend-common@0.18.3 + - @backstage/errors@1.1.5 + - @backstage/backend-plugin-api@0.5.0 + - @backstage/config@1.0.7 + +## @internal/plugin-todo-list-common@1.0.9 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-permission-common@0.7.4 diff --git a/package.json b/package.json index 43a146e0a1..e4cb3ef1d3 100644 --- a/package.json +++ b/package.json @@ -47,7 +47,7 @@ "@types/react": "^17", "@types/react-dom": "^17" }, - "version": "1.12.0-next.2", + "version": "1.12.0", "dependencies": { "@backstage/errors": "workspace:^", "@manypkg/get-packages": "^1.1.3" diff --git a/packages/app-defaults/CHANGELOG.md b/packages/app-defaults/CHANGELOG.md index 0b2b813d14..e388b3e4ad 100644 --- a/packages/app-defaults/CHANGELOG.md +++ b/packages/app-defaults/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/app-defaults +## 1.2.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/core-plugin-api@1.5.0 + - @backstage/core-app-api@1.6.0 + - @backstage/theme@0.2.18 + - @backstage/plugin-permission-react@0.4.11 + ## 1.2.1-next.2 ### Patch Changes diff --git a/packages/app-defaults/package.json b/packages/app-defaults/package.json index 873a2fa28f..31fb64a079 100644 --- a/packages/app-defaults/package.json +++ b/packages/app-defaults/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/app-defaults", "description": "Provides the default wiring of a Backstage App", - "version": "1.2.1-next.2", + "version": "1.2.1", "publishConfig": { "access": "public", "main": "dist/index.esm.js", diff --git a/packages/app/CHANGELOG.md b/packages/app/CHANGELOG.md index ac21cbad07..4b24b827b4 100644 --- a/packages/app/CHANGELOG.md +++ b/packages/app/CHANGELOG.md @@ -1,5 +1,74 @@ # example-app +## 0.2.81 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/plugin-scaffolder-react@1.2.0 + - @backstage/plugin-techdocs-react@1.1.4 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/plugin-tech-insights@0.3.8 + - @backstage/plugin-search-react@1.5.1 + - @backstage/plugin-scaffolder@1.12.0 + - @backstage/plugin-techdocs@1.6.0 + - @backstage/plugin-explore@0.4.1 + - @backstage/plugin-search@1.1.1 + - @backstage/cli@0.22.4 + - @backstage/plugin-kubernetes@0.7.9 + - @backstage/plugin-tech-radar@0.6.2 + - @backstage/plugin-microsoft-calendar@0.1.1 + - @backstage/plugin-newrelic-dashboard@0.2.9 + - @backstage/plugin-code-coverage@0.2.9 + - @backstage/plugin-azure-sites@0.1.5 + - @backstage/plugin-gcalendar@0.3.12 + - @backstage/plugin-shortcuts@0.3.8 + - @backstage/plugin-org@0.6.6 + - @backstage/plugin-api-docs@0.9.1 + - @backstage/plugin-stackstorm@0.1.0 + - @backstage/plugin-circleci@0.3.16 + - @backstage/plugin-playlist@0.1.7 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/plugin-catalog-common@1.0.12 + - @backstage/plugin-cost-insights@0.12.5 + - @backstage/plugin-jenkins@0.7.15 + - @backstage/core-app-api@1.6.0 + - @backstage/integration-react@1.1.11 + - @backstage/plugin-airbrake@0.3.16 + - @backstage/plugin-apache-airflow@0.2.9 + - @backstage/plugin-azure-devops@0.2.7 + - @backstage/plugin-badges@0.2.40 + - @backstage/plugin-catalog-import@0.9.6 + - @backstage/plugin-cloudbuild@0.3.16 + - @backstage/plugin-dynatrace@3.0.0 + - @backstage/plugin-entity-feedback@0.1.1 + - @backstage/plugin-gcp-projects@0.3.35 + - @backstage/plugin-github-actions@0.5.16 + - @backstage/plugin-gocd@0.1.22 + - @backstage/plugin-graphiql@0.2.48 + - @backstage/plugin-home@0.4.32 + - @backstage/plugin-kafka@0.3.16 + - @backstage/plugin-lighthouse@0.4.1 + - @backstage/plugin-linguist@0.1.1 + - @backstage/plugin-newrelic@0.3.34 + - @backstage/plugin-pagerduty@0.5.9 + - @backstage/plugin-rollbar@0.4.16 + - @backstage/plugin-sentry@0.5.1 + - @backstage/plugin-stack-overflow@0.1.12 + - @backstage/plugin-techdocs-module-addons-contrib@1.0.11 + - @backstage/plugin-todo@0.2.18 + - @backstage/plugin-user-settings@0.7.1 + - @backstage/config@1.0.7 + - @backstage/theme@0.2.18 + - @internal/plugin-catalog-customized@0.0.8 + - @backstage/plugin-catalog-graph@0.2.28 + - @backstage/app-defaults@1.2.1 + - @backstage/plugin-linguist-common@0.1.0 + - @backstage/plugin-permission-react@0.4.11 + - @backstage/plugin-search-common@1.2.2 + ## 0.2.81-next.2 ### Patch Changes diff --git a/packages/app/package.json b/packages/app/package.json index c51f8be911..a5a420c621 100644 --- a/packages/app/package.json +++ b/packages/app/package.json @@ -1,6 +1,6 @@ { "name": "example-app", - "version": "0.2.81-next.2", + "version": "0.2.81", "private": true, "backstage": { "role": "frontend" diff --git a/packages/backend-app-api/CHANGELOG.md b/packages/backend-app-api/CHANGELOG.md index 6ea78e983f..1e587b94a3 100644 --- a/packages/backend-app-api/CHANGELOG.md +++ b/packages/backend-app-api/CHANGELOG.md @@ -1,5 +1,24 @@ # @backstage/backend-app-api +## 0.4.1 + +### Patch Changes + +- 928a12a9b3e: Internal refactor of `/alpha` exports. +- 482dae5de1c: Updated link to docs. +- 915e46622cf: Add support for `NotImplementedError`, properly returning 501 as status code. +- Updated dependencies + - @backstage/plugin-permission-node@0.7.6 + - @backstage/plugin-auth-node@0.2.12 + - @backstage/backend-tasks@0.5.0 + - @backstage/backend-common@0.18.3 + - @backstage/errors@1.1.5 + - @backstage/backend-plugin-api@0.5.0 + - @backstage/config-loader@1.1.9 + - @backstage/cli-common@0.1.12 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + ## 0.4.1-next.2 ### Patch Changes diff --git a/packages/backend-app-api/package.json b/packages/backend-app-api/package.json index f59e39ef09..8ed273b451 100644 --- a/packages/backend-app-api/package.json +++ b/packages/backend-app-api/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/backend-app-api", "description": "Core API used by Backstage backend apps", - "version": "0.4.1-next.2", + "version": "0.4.1", "main": "src/index.ts", "types": "src/index.ts", "publishConfig": { diff --git a/packages/backend-common/CHANGELOG.md b/packages/backend-common/CHANGELOG.md index 06968a3c8a..8d73268bc1 100644 --- a/packages/backend-common/CHANGELOG.md +++ b/packages/backend-common/CHANGELOG.md @@ -1,5 +1,42 @@ # @backstage/backend-common +## 0.18.3 + +### Patch Changes + +- f75097868a7: Adds config option `backend.database.role` to set ownership for newly created schemas and tables in Postgres + + The example config below connects to the database as user `v-backstage-123` but sets the ownership of + the create schemas and tables to `backstage` + + ```yaml + backend: + database: + client: pg + pluginDivisionMode: schema + role: backstage + connection: + user: v-backstage-123 + ... + ``` + +- 928a12a9b3e: Internal refactor of `/alpha` exports. +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- 87f0bbec175: AwsS3UrlReader upgraded to use aws-sdk v3 +- c1ee073a82b: Added `lastModifiedAt` field on `UrlReaderService` responses and a `lastModifiedAfter` option to `UrlReaderService.readUrl`. +- 482dae5de1c: Updated link to docs. +- Updated dependencies + - @backstage/errors@1.1.5 + - @backstage/backend-plugin-api@0.5.0 + - @backstage/backend-app-api@0.4.1 + - @backstage/config-loader@1.1.9 + - @backstage/integration@1.4.3 + - @backstage/backend-dev-utils@0.1.1 + - @backstage/cli-common@0.1.12 + - @backstage/config@1.0.7 + - @backstage/integration-aws-node@0.1.2 + - @backstage/types@1.0.2 + ## 0.18.3-next.2 ### Patch Changes diff --git a/packages/backend-common/package.json b/packages/backend-common/package.json index beee72c860..5d54e5ae12 100644 --- a/packages/backend-common/package.json +++ b/packages/backend-common/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/backend-common", "description": "Common functionality library for Backstage backends", - "version": "0.18.3-next.2", + "version": "0.18.3", "main": "src/index.ts", "types": "src/index.ts", "publishConfig": { diff --git a/packages/backend-defaults/CHANGELOG.md b/packages/backend-defaults/CHANGELOG.md index 7283ae89e2..edfc39bd91 100644 --- a/packages/backend-defaults/CHANGELOG.md +++ b/packages/backend-defaults/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/backend-defaults +## 0.1.8 + +### Patch Changes + +- 928a12a9b3e: Internal refactor of `/alpha` exports. +- 482dae5de1c: Updated link to docs. +- 5d0693edc09: Added a workaround for the cyclic dependency bug across `@backstage/backend-common` and `@backstage/backend-app-api`. +- Updated dependencies + - @backstage/backend-common@0.18.3 + - @backstage/backend-plugin-api@0.5.0 + - @backstage/backend-app-api@0.4.1 + ## 0.1.8-next.2 ### Patch Changes diff --git a/packages/backend-defaults/package.json b/packages/backend-defaults/package.json index 2ae0074849..2759c3c089 100644 --- a/packages/backend-defaults/package.json +++ b/packages/backend-defaults/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/backend-defaults", "description": "Backend defaults used by Backstage backend apps", - "version": "0.1.8-next.2", + "version": "0.1.8", "main": "src/index.ts", "types": "src/index.ts", "publishConfig": { diff --git a/packages/backend-dev-utils/CHANGELOG.md b/packages/backend-dev-utils/CHANGELOG.md index 84a1cbc3f1..6b505e917e 100644 --- a/packages/backend-dev-utils/CHANGELOG.md +++ b/packages/backend-dev-utils/CHANGELOG.md @@ -1,5 +1,11 @@ # @backstage/backend-dev-utils +## 0.1.1 + +### Patch Changes + +- 482dae5de1c: Updated link to docs. + ## 0.1.1-next.0 ### Patch Changes diff --git a/packages/backend-dev-utils/package.json b/packages/backend-dev-utils/package.json index 9fea6a34cf..0928032977 100644 --- a/packages/backend-dev-utils/package.json +++ b/packages/backend-dev-utils/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/backend-dev-utils", - "version": "0.1.1-next.0", + "version": "0.1.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/packages/backend-next/CHANGELOG.md b/packages/backend-next/CHANGELOG.md index 91ded2391f..e51c65963d 100644 --- a/packages/backend-next/CHANGELOG.md +++ b/packages/backend-next/CHANGELOG.md @@ -1,5 +1,17 @@ # example-backend-next +## 0.0.9 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-backend@1.12.0 + - @backstage/plugin-catalog-backend@1.8.0 + - @backstage/plugin-todo-backend@0.1.40 + - @backstage/plugin-techdocs-backend@1.6.0 + - @backstage/backend-defaults@0.1.8 + - @backstage/plugin-app-backend@0.3.43 + ## 0.0.9-next.2 ### Patch Changes diff --git a/packages/backend-next/package.json b/packages/backend-next/package.json index 5d8a8cb1ec..14ec71f352 100644 --- a/packages/backend-next/package.json +++ b/packages/backend-next/package.json @@ -1,6 +1,6 @@ { "name": "example-backend-next", - "version": "0.0.9-next.2", + "version": "0.0.9", "main": "dist/index.cjs.js", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/packages/backend-plugin-api/CHANGELOG.md b/packages/backend-plugin-api/CHANGELOG.md index 5125411eb6..dd78ffaca1 100644 --- a/packages/backend-plugin-api/CHANGELOG.md +++ b/packages/backend-plugin-api/CHANGELOG.md @@ -1,5 +1,22 @@ # @backstage/backend-plugin-api +## 0.5.0 + +### Minor Changes + +- c1ee073a82b: Added `lastModifiedAt` field on `UrlReaderService` responses and a `lastModifiedAfter` option to `UrlReaderService.readUrl`. + +### Patch Changes + +- 928a12a9b3e: Internal refactor of `/alpha` exports. +- 482dae5de1c: Updated link to docs. +- Updated dependencies + - @backstage/plugin-auth-node@0.2.12 + - @backstage/backend-tasks@0.5.0 + - @backstage/plugin-permission-common@0.7.4 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + ## 0.4.1-next.2 ### Patch Changes diff --git a/packages/backend-plugin-api/package.json b/packages/backend-plugin-api/package.json index 4d97fdcd74..cc155fe546 100644 --- a/packages/backend-plugin-api/package.json +++ b/packages/backend-plugin-api/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/backend-plugin-api", "description": "Core API used by Backstage backend plugins", - "version": "0.4.1-next.2", + "version": "0.5.0", "main": "src/index.ts", "types": "src/index.ts", "publishConfig": { diff --git a/packages/backend-tasks/CHANGELOG.md b/packages/backend-tasks/CHANGELOG.md index 7eb43c4677..dea40d399b 100644 --- a/packages/backend-tasks/CHANGELOG.md +++ b/packages/backend-tasks/CHANGELOG.md @@ -1,5 +1,21 @@ # @backstage/backend-tasks +## 0.5.0 + +### Minor Changes + +- 1578276708a: add functionality to get descriptions from the scheduler for triggering + +### Patch Changes + +- f0685193efa: Added the adapted query to mysql and sqlite3 databases to not returning warning on logs +- 482dae5de1c: Updated link to docs. +- Updated dependencies + - @backstage/backend-common@0.18.3 + - @backstage/errors@1.1.5 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + ## 0.5.0-next.2 ### Minor Changes diff --git a/packages/backend-tasks/package.json b/packages/backend-tasks/package.json index fa826067c8..5042ff735a 100644 --- a/packages/backend-tasks/package.json +++ b/packages/backend-tasks/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/backend-tasks", "description": "Common distributed task management library for Backstage backends", - "version": "0.5.0-next.2", + "version": "0.5.0", "main": "src/index.ts", "types": "src/index.ts", "publishConfig": { diff --git a/packages/backend-test-utils/CHANGELOG.md b/packages/backend-test-utils/CHANGELOG.md index 3b20fe92d5..529c92d423 100644 --- a/packages/backend-test-utils/CHANGELOG.md +++ b/packages/backend-test-utils/CHANGELOG.md @@ -1,5 +1,20 @@ # @backstage/backend-test-utils +## 0.1.35 + +### Patch Changes + +- 928a12a9b3e: Internal refactor of `/alpha` exports. +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- 482dae5de1c: Updated link to docs. +- Updated dependencies + - @backstage/plugin-auth-node@0.2.12 + - @backstage/backend-common@0.18.3 + - @backstage/backend-plugin-api@0.5.0 + - @backstage/backend-app-api@0.4.1 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + ## 0.1.35-next.2 ### Patch Changes diff --git a/packages/backend-test-utils/package.json b/packages/backend-test-utils/package.json index e797e346ff..80135ad4a9 100644 --- a/packages/backend-test-utils/package.json +++ b/packages/backend-test-utils/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/backend-test-utils", "description": "Test helpers library for Backstage backends", - "version": "0.1.35-next.2", + "version": "0.1.35", "main": "src/index.ts", "types": "src/index.ts", "publishConfig": { diff --git a/packages/backend/CHANGELOG.md b/packages/backend/CHANGELOG.md index 933d9688b9..7ead0abeb6 100644 --- a/packages/backend/CHANGELOG.md +++ b/packages/backend/CHANGELOG.md @@ -1,5 +1,56 @@ # example-backend +## 0.2.81 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-backend@1.12.0 + - @backstage/plugin-catalog-backend@1.8.0 + - @backstage/catalog-client@1.4.0 + - @backstage/plugin-todo-backend@0.1.40 + - @backstage/plugin-permission-node@0.7.6 + - @backstage/plugin-search-backend-module-elasticsearch@1.1.4 + - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.27 + - @backstage/plugin-auth-node@0.2.12 + - @backstage/plugin-techdocs-backend@1.6.0 + - @backstage/backend-tasks@0.5.0 + - @backstage/plugin-tech-insights-backend@0.5.9 + - @backstage/plugin-adr-backend@0.3.1 + - @backstage/plugin-auth-backend@0.18.1 + - @backstage/backend-common@0.18.3 + - @backstage/plugin-linguist-backend@0.2.0 + - @backstage/plugin-catalog-node@1.3.4 + - @backstage/catalog-model@1.2.1 + - @backstage/plugin-events-backend@0.2.4 + - @backstage/plugin-app-backend@0.3.43 + - @backstage/plugin-events-node@0.2.4 + - @backstage/integration@1.4.3 + - @backstage/plugin-azure-devops-backend@0.3.22 + - @backstage/plugin-azure-sites-backend@0.1.5 + - @backstage/plugin-code-coverage-backend@0.2.9 + - @backstage/plugin-entity-feedback-backend@0.1.1 + - @backstage/plugin-explore-backend@0.0.5 + - @backstage/plugin-graphql-backend@0.1.33 + - @backstage/plugin-jenkins-backend@0.1.33 + - @backstage/plugin-kubernetes-backend@0.9.4 + - @backstage/plugin-permission-backend@0.5.18 + - @backstage/plugin-permission-common@0.7.4 + - @backstage/plugin-playlist-backend@0.2.6 + - @backstage/plugin-proxy-backend@0.2.37 + - @backstage/plugin-rollbar-backend@0.1.40 + - @backstage/plugin-lighthouse-backend@0.1.1 + - @backstage/config@1.0.7 + - @backstage/plugin-scaffolder-backend-module-rails@0.4.11 + - @backstage/plugin-badges-backend@0.1.37 + - example-app@0.2.81 + - @backstage/plugin-search-backend@1.2.4 + - @backstage/plugin-kafka-backend@0.2.36 + - @backstage/plugin-search-backend-module-pg@0.5.4 + - @backstage/plugin-search-backend-node@1.1.4 + - @backstage/plugin-search-common@1.2.2 + - @backstage/plugin-tech-insights-node@0.4.1 + ## 0.2.81-next.2 ### Patch Changes diff --git a/packages/backend/package.json b/packages/backend/package.json index 107a1147f1..54dbe640df 100644 --- a/packages/backend/package.json +++ b/packages/backend/package.json @@ -1,6 +1,6 @@ { "name": "example-backend", - "version": "0.2.81-next.2", + "version": "0.2.81", "main": "dist/index.cjs.js", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/packages/catalog-client/CHANGELOG.md b/packages/catalog-client/CHANGELOG.md index 52eef0291e..edd3811ef8 100644 --- a/packages/catalog-client/CHANGELOG.md +++ b/packages/catalog-client/CHANGELOG.md @@ -1,5 +1,19 @@ # @backstage/catalog-client +## 1.4.0 + +### Minor Changes + +- 8c030b1826c: Add `queryEntities` method to `CatalogApi`. + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- c630360631f: Ensure that `getEntitiesByRefs` returns `undefined` instead of `null` for missing items +- Updated dependencies + - @backstage/errors@1.1.5 + - @backstage/catalog-model@1.2.1 + ## 1.4.0-next.1 ### Patch Changes diff --git a/packages/catalog-client/package.json b/packages/catalog-client/package.json index f72ce4464a..07709d8c65 100644 --- a/packages/catalog-client/package.json +++ b/packages/catalog-client/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/catalog-client", "description": "An isomorphic client for the catalog backend", - "version": "1.4.0-next.1", + "version": "1.4.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/packages/catalog-model/CHANGELOG.md b/packages/catalog-model/CHANGELOG.md index 08560cbec7..fa20368b86 100644 --- a/packages/catalog-model/CHANGELOG.md +++ b/packages/catalog-model/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/catalog-model +## 1.2.1 + +### Patch Changes + +- 928a12a9b3e: Internal refactor of `/alpha` exports. +- Updated dependencies + - @backstage/errors@1.1.5 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + ## 1.2.1-next.1 ### Patch Changes diff --git a/packages/catalog-model/package.json b/packages/catalog-model/package.json index f6355bd74b..e23d399a37 100644 --- a/packages/catalog-model/package.json +++ b/packages/catalog-model/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/catalog-model", "description": "Types and validators that help describe the model of a Backstage Catalog", - "version": "1.2.1-next.1", + "version": "1.2.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/packages/cli-common/CHANGELOG.md b/packages/cli-common/CHANGELOG.md index 030b743fca..bb6e2756a0 100644 --- a/packages/cli-common/CHANGELOG.md +++ b/packages/cli-common/CHANGELOG.md @@ -1,5 +1,11 @@ # @backstage/cli-common +## 0.1.12 + +### Patch Changes + +- 482dae5de1c: Updated link to docs. + ## 0.1.12-next.0 ### Patch Changes diff --git a/packages/cli-common/package.json b/packages/cli-common/package.json index ad7ed92e98..38779eba07 100644 --- a/packages/cli-common/package.json +++ b/packages/cli-common/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/cli-common", "description": "Common functionality used by cli, backend, and create-app", - "version": "0.1.12-next.0", + "version": "0.1.12", "main": "src/index.ts", "types": "src/index.ts", "publishConfig": { diff --git a/packages/cli/CHANGELOG.md b/packages/cli/CHANGELOG.md index 4db4e1afa1..6903e61425 100644 --- a/packages/cli/CHANGELOG.md +++ b/packages/cli/CHANGELOG.md @@ -1,5 +1,29 @@ # @backstage/cli +## 0.22.4 + +### Patch Changes + +- 1ad8d885d30: Fixed a bug where additional backend package entry points where not properly marked as internal during local development. +- 2011b86052c: Added templates for new plugin Web and Node.js libraries. +- 867f4752ca1: Updated the ESLint plugin configuration that is enabled through `yarn start --check` to only pick up valid source files. +- b4cd145b574: Added a new `migrate package-exports` command that synchronizes package exports fields in all `package.json`s. +- 9bf50a36674: Bumped the `msw` version in templates to 1.0.0 +- 8bf24946c66: Adjust express dependencies to be the same as the rest of the project +- 17271841de8: Updated frontend plugin template to use some more recent features +- 4b4998466b4: Updated dependency `del` to `^7.0.0`. +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- a11b9a23f5a: Keep custom exports entry points in package.json +- 482dae5de1c: Updated link to docs. +- Updated dependencies + - @backstage/eslint-plugin@0.1.2 + - @backstage/errors@1.1.5 + - @backstage/config-loader@1.1.9 + - @backstage/release-manifests@0.0.9 + - @backstage/cli-common@0.1.12 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + ## 0.22.4-next.1 ### Patch Changes diff --git a/packages/cli/package.json b/packages/cli/package.json index 8c76c7888b..fd7f9a20c1 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/cli", "description": "CLI for developing Backstage plugins and apps", - "version": "0.22.4-next.1", + "version": "0.22.4", "publishConfig": { "access": "public" }, diff --git a/packages/codemods/CHANGELOG.md b/packages/codemods/CHANGELOG.md index 7104ce9cf4..d19c01a7d5 100644 --- a/packages/codemods/CHANGELOG.md +++ b/packages/codemods/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/codemods +## 0.1.44 + +### Patch Changes + +- 482dae5de1c: Updated link to docs. +- Updated dependencies + - @backstage/cli-common@0.1.12 + ## 0.1.44-next.0 ### Patch Changes diff --git a/packages/codemods/package.json b/packages/codemods/package.json index 8f4ab51a98..acb0f10dd1 100644 --- a/packages/codemods/package.json +++ b/packages/codemods/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/codemods", "description": "A collection of codemods for Backstage projects", - "version": "0.1.44-next.0", + "version": "0.1.44", "publishConfig": { "access": "public", "main": "dist/index.cjs.js" diff --git a/packages/config-loader/CHANGELOG.md b/packages/config-loader/CHANGELOG.md index 5dbed6c46d..d1eb56d9af 100644 --- a/packages/config-loader/CHANGELOG.md +++ b/packages/config-loader/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/config-loader +## 1.1.9 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- 482dae5de1c: Updated link to docs. +- Updated dependencies + - @backstage/errors@1.1.5 + - @backstage/cli-common@0.1.12 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + ## 1.1.9-next.0 ### Patch Changes diff --git a/packages/config-loader/package.json b/packages/config-loader/package.json index f842f77809..1ef8d41955 100644 --- a/packages/config-loader/package.json +++ b/packages/config-loader/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/config-loader", "description": "Config loading functionality used by Backstage backend, and CLI", - "version": "1.1.9-next.0", + "version": "1.1.9", "publishConfig": { "access": "public", "main": "dist/index.cjs.js", diff --git a/packages/config/CHANGELOG.md b/packages/config/CHANGELOG.md index c809e158b7..8b20f72905 100644 --- a/packages/config/CHANGELOG.md +++ b/packages/config/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/config +## 1.0.7 + +### Patch Changes + +- 482dae5de1c: Updated link to docs. +- Updated dependencies + - @backstage/types@1.0.2 + ## 1.0.7-next.0 ### Patch Changes diff --git a/packages/config/package.json b/packages/config/package.json index 5b8ac4279b..c90b7d4c5f 100644 --- a/packages/config/package.json +++ b/packages/config/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/config", "description": "Config API used by Backstage core, backend, and CLI", - "version": "1.0.7-next.0", + "version": "1.0.7", "publishConfig": { "access": "public", "main": "dist/index.cjs.js", diff --git a/packages/core-app-api/CHANGELOG.md b/packages/core-app-api/CHANGELOG.md index d91fa44f05..2f54b5d041 100644 --- a/packages/core-app-api/CHANGELOG.md +++ b/packages/core-app-api/CHANGELOG.md @@ -1,5 +1,34 @@ # @backstage/core-app-api +## 1.6.0 + +### Minor Changes + +- 456eaa8cf83: `OAuth2` now gets ID tokens from a session with the `openid` scope explicitly + requested. + + This should not be considered a breaking change, because spec-compliant OIDC + providers will already be returning ID tokens if and only if the `openid` scope + is granted. + + This change makes the dependence explicit, and removes the burden on + OAuth2-based providers which require an ID token (e.g. this is done by various + default [auth + handlers](https://backstage.io/docs/auth/identity-resolver/#authhandler)) to add + `openid` to their default scopes. _That_ could carry another indirect benefit: + by removing `openid` from the default scopes for a provider, grants for + resource-specific access tokens can avoid requesting excess ID token-related + scopes. + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-plugin-api@1.5.0 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + - @backstage/version-bridge@1.0.3 + ## 1.6.0-next.2 ### Minor Changes diff --git a/packages/core-app-api/package.json b/packages/core-app-api/package.json index 073a5a22b2..c9ae2abc25 100644 --- a/packages/core-app-api/package.json +++ b/packages/core-app-api/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/core-app-api", "description": "Core app API used by Backstage apps", - "version": "1.6.0-next.2", + "version": "1.6.0", "publishConfig": { "access": "public", "main": "dist/index.esm.js", diff --git a/packages/core-components/CHANGELOG.md b/packages/core-components/CHANGELOG.md index 0eac19716d..a7ca828bb3 100644 --- a/packages/core-components/CHANGELOG.md +++ b/packages/core-components/CHANGELOG.md @@ -1,5 +1,25 @@ # @backstage/core-components +## 0.12.5 + +### Patch Changes + +- 8bbf95b5507: Button labels in the sidebar (previously displayed in uppercase) will be displayed in the case that is provided without any transformations. + For example, a sidebar button with the label "Search" will appear as Search, "search" will appear as search, "SEARCH" will appear as SEARCH etc. + This can potentially affect any overriding styles previously applied to change the appearance of Button labels in the Sidebar. +- cb8ec97cdeb: Change black & white colors to be theme aware +- c10384a9235: Switch to using `LinkButton` instead of the deprecated `Button` +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- e1aae2f5a0c: Updated the `aria-label` of the `HeaderTabs` component. +- 6a51a49a810: Fix bug where `
` component would not take into account header styles defined in `columns[*].headerStyle`. +- fa004f66871: Use media queries to change layout instead of `isMobile` prop in `BackstagePage` component +- Updated dependencies + - @backstage/errors@1.1.5 + - @backstage/core-plugin-api@1.5.0 + - @backstage/config@1.0.7 + - @backstage/theme@0.2.18 + - @backstage/version-bridge@1.0.3 + ## 0.12.5-next.2 ### Patch Changes diff --git a/packages/core-components/package.json b/packages/core-components/package.json index 9630d7d706..77e91aa751 100644 --- a/packages/core-components/package.json +++ b/packages/core-components/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/core-components", "description": "Core components used by Backstage plugins and apps", - "version": "0.12.5-next.2", + "version": "0.12.5", "publishConfig": { "access": "public", "main": "dist/index.esm.js", diff --git a/packages/core-plugin-api/CHANGELOG.md b/packages/core-plugin-api/CHANGELOG.md index 1001c01e52..9292367463 100644 --- a/packages/core-plugin-api/CHANGELOG.md +++ b/packages/core-plugin-api/CHANGELOG.md @@ -1,5 +1,20 @@ # @backstage/core-plugin-api +## 1.5.0 + +### Minor Changes + +- ab750ddc4f2: The GitLab auth provider can now be used to get OpenID tokens. + +### Patch Changes + +- 928a12a9b3e: Internal refactor of `/alpha` exports. +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + - @backstage/version-bridge@1.0.3 + ## 1.5.0-next.2 ### Minor Changes diff --git a/packages/core-plugin-api/package.json b/packages/core-plugin-api/package.json index 335f0f0efd..283e2b7e34 100644 --- a/packages/core-plugin-api/package.json +++ b/packages/core-plugin-api/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/core-plugin-api", "description": "Core API used by Backstage plugins", - "version": "1.5.0-next.2", + "version": "1.5.0", "publishConfig": { "access": "public" }, diff --git a/packages/create-app/CHANGELOG.md b/packages/create-app/CHANGELOG.md index b17da7ba7b..2639ba9a59 100644 --- a/packages/create-app/CHANGELOG.md +++ b/packages/create-app/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/create-app +## 0.4.38 + +### Patch Changes + +- b4627f23b28: Bumped create-app version. +- 0eceadb9502: Bumped create-app version. +- 482dae5de1c: Updated link to docs. +- 6ace2dd2c58: Added to the template `packages/app/.eslintignore` file to packages to ignore the contents of `packages/app/public`. +- Updated dependencies + - @backstage/cli-common@0.1.12 + ## 0.4.38-next.2 ### Patch Changes diff --git a/packages/create-app/package.json b/packages/create-app/package.json index 4097e3bd57..9f797f5d8c 100644 --- a/packages/create-app/package.json +++ b/packages/create-app/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/create-app", "description": "A CLI that helps you create your own Backstage app", - "version": "0.4.38-next.2", + "version": "0.4.38", "publishConfig": { "access": "public" }, diff --git a/packages/dev-utils/CHANGELOG.md b/packages/dev-utils/CHANGELOG.md index 85a0c81ee7..3c6fbaefd5 100644 --- a/packages/dev-utils/CHANGELOG.md +++ b/packages/dev-utils/CHANGELOG.md @@ -1,5 +1,21 @@ # @backstage/dev-utils +## 1.0.13 + +### Patch Changes + +- 482dae5de1c: Updated link to docs. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/test-utils@1.2.6 + - @backstage/core-app-api@1.6.0 + - @backstage/integration-react@1.1.11 + - @backstage/theme@0.2.18 + - @backstage/app-defaults@1.2.1 + ## 1.0.13-next.2 ### Patch Changes diff --git a/packages/dev-utils/package.json b/packages/dev-utils/package.json index d4f120b359..d8559535d8 100644 --- a/packages/dev-utils/package.json +++ b/packages/dev-utils/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/dev-utils", "description": "Utilities for developing Backstage plugins.", - "version": "1.0.13-next.2", + "version": "1.0.13", "publishConfig": { "access": "public", "main": "dist/index.esm.js", diff --git a/packages/e2e-test/CHANGELOG.md b/packages/e2e-test/CHANGELOG.md index 7c3dcdbc36..2f7c5d0704 100644 --- a/packages/e2e-test/CHANGELOG.md +++ b/packages/e2e-test/CHANGELOG.md @@ -1,5 +1,14 @@ # e2e-test +## 0.2.1 + +### Patch Changes + +- Updated dependencies + - @backstage/create-app@0.4.38 + - @backstage/errors@1.1.5 + - @backstage/cli-common@0.1.12 + ## 0.2.1-next.2 ### Patch Changes diff --git a/packages/e2e-test/package.json b/packages/e2e-test/package.json index f8c6f815e8..d2c11a7e15 100644 --- a/packages/e2e-test/package.json +++ b/packages/e2e-test/package.json @@ -1,7 +1,7 @@ { "name": "e2e-test", "description": "E2E test for verifying Backstage packages", - "version": "0.2.1-next.2", + "version": "0.2.1", "private": true, "backstage": { "role": "cli" diff --git a/packages/errors/CHANGELOG.md b/packages/errors/CHANGELOG.md index 88b0c4b8d1..398b058bbb 100644 --- a/packages/errors/CHANGELOG.md +++ b/packages/errors/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/errors +## 1.1.5 + +### Patch Changes + +- 3bf83a2aabf: Added `NotImplementedError`, which can be used when the server does not recognize the request method and is incapable of supporting it for any resource. +- Updated dependencies + - @backstage/types@1.0.2 + ## 1.1.5-next.0 ### Patch Changes diff --git a/packages/errors/package.json b/packages/errors/package.json index 7eeacb0e81..1f4da3b2b2 100644 --- a/packages/errors/package.json +++ b/packages/errors/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/errors", "description": "Common utilities for error handling within Backstage", - "version": "1.1.5-next.0", + "version": "1.1.5", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/packages/eslint-plugin/CHANGELOG.md b/packages/eslint-plugin/CHANGELOG.md index 7e5a3efbae..49cf9b5df5 100644 --- a/packages/eslint-plugin/CHANGELOG.md +++ b/packages/eslint-plugin/CHANGELOG.md @@ -1,5 +1,11 @@ # @backstage/eslint-plugin +## 0.1.2 + +### Patch Changes + +- a061c466d66: Fixing a bug that we should check internal dependencies too + ## 0.1.2-next.0 ### Patch Changes diff --git a/packages/eslint-plugin/package.json b/packages/eslint-plugin/package.json index fcc038cdbf..feb03921fd 100644 --- a/packages/eslint-plugin/package.json +++ b/packages/eslint-plugin/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/eslint-plugin", "description": "Backstage ESLint plugin", - "version": "0.1.2-next.0", + "version": "0.1.2", "publishConfig": { "access": "public" }, diff --git a/packages/integration-aws-node/CHANGELOG.md b/packages/integration-aws-node/CHANGELOG.md index e5ac2a8532..40192bdfaf 100644 --- a/packages/integration-aws-node/CHANGELOG.md +++ b/packages/integration-aws-node/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/integration-aws-node +## 0.1.2 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.1.5 + - @backstage/config@1.0.7 + ## 0.1.2-next.0 ### Patch Changes diff --git a/packages/integration-aws-node/package.json b/packages/integration-aws-node/package.json index a45cb03e14..7afc31cc47 100644 --- a/packages/integration-aws-node/package.json +++ b/packages/integration-aws-node/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/integration-aws-node", "description": "Helpers for fetching AWS account credentials", - "version": "0.1.2-next.0", + "version": "0.1.2", "main": "src/index.ts", "types": "src/index.ts", "publishConfig": { diff --git a/packages/integration-react/CHANGELOG.md b/packages/integration-react/CHANGELOG.md index 028c939822..06568497df 100644 --- a/packages/integration-react/CHANGELOG.md +++ b/packages/integration-react/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/integration-react +## 1.1.11 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/core-plugin-api@1.5.0 + - @backstage/integration@1.4.3 + - @backstage/config@1.0.7 + - @backstage/theme@0.2.18 + ## 1.1.11-next.2 ### Patch Changes diff --git a/packages/integration-react/package.json b/packages/integration-react/package.json index 119a8683d6..681542a313 100644 --- a/packages/integration-react/package.json +++ b/packages/integration-react/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/integration-react", "description": "Frontend package for managing integrations towards external systems", - "version": "1.1.11-next.2", + "version": "1.1.11", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/packages/integration/CHANGELOG.md b/packages/integration/CHANGELOG.md index 3a84452505..f81b1824fe 100644 --- a/packages/integration/CHANGELOG.md +++ b/packages/integration/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/integration +## 1.4.3 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/errors@1.1.5 + - @backstage/config@1.0.7 + ## 1.4.3-next.0 ### Patch Changes diff --git a/packages/integration/package.json b/packages/integration/package.json index 02c19e1b1d..25e6ba8bf7 100644 --- a/packages/integration/package.json +++ b/packages/integration/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/integration", "description": "Helpers for managing integrations towards external systems", - "version": "1.4.3-next.0", + "version": "1.4.3", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/packages/release-manifests/CHANGELOG.md b/packages/release-manifests/CHANGELOG.md index fa15839a35..f59447666f 100644 --- a/packages/release-manifests/CHANGELOG.md +++ b/packages/release-manifests/CHANGELOG.md @@ -1,5 +1,11 @@ # @backstage/release-manifests +## 0.0.9 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. + ## 0.0.9-next.0 ### Patch Changes diff --git a/packages/release-manifests/package.json b/packages/release-manifests/package.json index 65d1026ca6..0c6ad64446 100644 --- a/packages/release-manifests/package.json +++ b/packages/release-manifests/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/release-manifests", "description": "Helper library for receiving release manifests", - "version": "0.0.9-next.0", + "version": "0.0.9", "main": "src/index.ts", "types": "src/index.ts", "publishConfig": { diff --git a/packages/repo-tools/CHANGELOG.md b/packages/repo-tools/CHANGELOG.md index 996377c198..c7577cb711 100644 --- a/packages/repo-tools/CHANGELOG.md +++ b/packages/repo-tools/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/repo-tools +## 0.1.3 + +### Patch Changes + +- 32a4a05838c: Tweaked type dependency check to trim wildcard type imports. +- 6ba8faf22ac: The API report generation process is now able to detect and generate reports for additional entry points declared in the package `"exports"` field. +- Updated dependencies + - @backstage/errors@1.1.5 + - @backstage/cli-common@0.1.12 + ## 0.1.3-next.1 ### Patch Changes diff --git a/packages/repo-tools/package.json b/packages/repo-tools/package.json index 9d24bfad2c..35ea6165d3 100644 --- a/packages/repo-tools/package.json +++ b/packages/repo-tools/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/repo-tools", "description": "CLI for Backstage repo tooling ", - "version": "0.1.3-next.1", + "version": "0.1.3", "publishConfig": { "access": "public" }, diff --git a/packages/techdocs-cli-embedded-app/CHANGELOG.md b/packages/techdocs-cli-embedded-app/CHANGELOG.md index 2d2b669e38..4b74967ddf 100644 --- a/packages/techdocs-cli-embedded-app/CHANGELOG.md +++ b/packages/techdocs-cli-embedded-app/CHANGELOG.md @@ -1,5 +1,24 @@ # techdocs-cli-embedded-app +## 0.2.80 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog@1.9.0 + - @backstage/core-components@0.12.5 + - @backstage/plugin-techdocs-react@1.1.4 + - @backstage/plugin-techdocs@1.6.0 + - @backstage/cli@0.22.4 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/test-utils@1.2.6 + - @backstage/core-app-api@1.6.0 + - @backstage/integration-react@1.1.11 + - @backstage/config@1.0.7 + - @backstage/theme@0.2.18 + - @backstage/app-defaults@1.2.1 + ## 0.2.80-next.2 ### Patch Changes diff --git a/packages/techdocs-cli-embedded-app/package.json b/packages/techdocs-cli-embedded-app/package.json index 2cbb1aabc8..4400ff082d 100644 --- a/packages/techdocs-cli-embedded-app/package.json +++ b/packages/techdocs-cli-embedded-app/package.json @@ -1,6 +1,6 @@ { "name": "techdocs-cli-embedded-app", - "version": "0.2.80-next.2", + "version": "0.2.80", "private": true, "backstage": { "role": "frontend" diff --git a/packages/techdocs-cli/CHANGELOG.md b/packages/techdocs-cli/CHANGELOG.md index facd967e90..3467fe86a5 100644 --- a/packages/techdocs-cli/CHANGELOG.md +++ b/packages/techdocs-cli/CHANGELOG.md @@ -1,5 +1,21 @@ # @techdocs/cli +## 1.4.0 + +### Minor Changes + +- 8e465ce52e2: Running `@techdocs/cli generate` with the `--verbose` flag will now print the mkdocs output. +- ea2bbef1b16: Added support for an HTTPS proxy for techdocs AWS S3 requests + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-techdocs-node@1.6.0 + - @backstage/backend-common@0.18.3 + - @backstage/catalog-model@1.2.1 + - @backstage/cli-common@0.1.12 + - @backstage/config@1.0.7 + ## 1.4.0-next.2 ### Patch Changes diff --git a/packages/techdocs-cli/package.json b/packages/techdocs-cli/package.json index e8d9277871..d18213d490 100644 --- a/packages/techdocs-cli/package.json +++ b/packages/techdocs-cli/package.json @@ -1,7 +1,7 @@ { "name": "@techdocs/cli", "description": "Utility CLI for managing TechDocs sites in Backstage.", - "version": "1.4.0-next.2", + "version": "1.4.0", "publishConfig": { "access": "public" }, diff --git a/packages/test-utils/CHANGELOG.md b/packages/test-utils/CHANGELOG.md index e521e9af91..2d0f57cf12 100644 --- a/packages/test-utils/CHANGELOG.md +++ b/packages/test-utils/CHANGELOG.md @@ -1,5 +1,21 @@ # @backstage/test-utils +## 1.2.6 + +### Patch Changes + +- 928a12a9b3e: Internal refactor of `/alpha` exports. +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- 482dae5de1c: Updated link to docs. +- Updated dependencies + - @backstage/core-plugin-api@1.5.0 + - @backstage/core-app-api@1.6.0 + - @backstage/plugin-permission-common@0.7.4 + - @backstage/config@1.0.7 + - @backstage/theme@0.2.18 + - @backstage/types@1.0.2 + - @backstage/plugin-permission-react@0.4.11 + ## 1.2.6-next.2 ### Patch Changes diff --git a/packages/test-utils/package.json b/packages/test-utils/package.json index 59ec2ce989..7bd93443e9 100644 --- a/packages/test-utils/package.json +++ b/packages/test-utils/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/test-utils", "description": "Utilities to test Backstage plugins and apps.", - "version": "1.2.6-next.2", + "version": "1.2.6", "publishConfig": { "access": "public" }, diff --git a/packages/theme/CHANGELOG.md b/packages/theme/CHANGELOG.md index 2950839e68..5f25f513d4 100644 --- a/packages/theme/CHANGELOG.md +++ b/packages/theme/CHANGELOG.md @@ -1,5 +1,11 @@ # @backstage/theme +## 0.2.18 + +### Patch Changes + +- 482dae5de1c: Updated link to docs. + ## 0.2.18-next.0 ### Patch Changes diff --git a/packages/theme/package.json b/packages/theme/package.json index d24a43abdb..999fb02dac 100644 --- a/packages/theme/package.json +++ b/packages/theme/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/theme", "description": "material-ui theme for use with Backstage.", - "version": "0.2.18-next.0", + "version": "0.2.18", "publishConfig": { "access": "public", "main": "dist/index.esm.js", diff --git a/plugins/adr-backend/CHANGELOG.md b/plugins/adr-backend/CHANGELOG.md index 58b37f1731..c74dbd116a 100644 --- a/plugins/adr-backend/CHANGELOG.md +++ b/plugins/adr-backend/CHANGELOG.md @@ -1,5 +1,22 @@ # @backstage/plugin-adr-backend +## 0.3.1 + +### Patch Changes + +- 2a73ded3861: Support MADR v3 format +- 8bf24946c66: Adjust express dependencies to be the same as the rest of the project +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/catalog-client@1.4.0 + - @backstage/backend-common@0.18.3 + - @backstage/errors@1.1.5 + - @backstage/catalog-model@1.2.1 + - @backstage/integration@1.4.3 + - @backstage/config@1.0.7 + - @backstage/plugin-adr-common@0.2.7 + - @backstage/plugin-search-common@1.2.2 + ## 0.3.1-next.2 ### Patch Changes diff --git a/plugins/adr-backend/package.json b/plugins/adr-backend/package.json index f73bf159b0..e759373e6c 100644 --- a/plugins/adr-backend/package.json +++ b/plugins/adr-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-adr-backend", - "version": "0.3.1-next.2", + "version": "0.3.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/adr-common/CHANGELOG.md b/plugins/adr-common/CHANGELOG.md index 5040e0955c..6b5a58da2a 100644 --- a/plugins/adr-common/CHANGELOG.md +++ b/plugins/adr-common/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-adr-common +## 0.2.7 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.2.1 + - @backstage/integration@1.4.3 + - @backstage/plugin-search-common@1.2.2 + ## 0.2.7-next.1 ### Patch Changes diff --git a/plugins/adr-common/package.json b/plugins/adr-common/package.json index 9eeeeb2803..e6364f7915 100644 --- a/plugins/adr-common/package.json +++ b/plugins/adr-common/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-adr-common", "description": "Common functionalities for the adr plugin", - "version": "0.2.7-next.1", + "version": "0.2.7", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/adr/CHANGELOG.md b/plugins/adr/CHANGELOG.md index a50f1a60d3..b5942d88a4 100644 --- a/plugins/adr/CHANGELOG.md +++ b/plugins/adr/CHANGELOG.md @@ -1,5 +1,22 @@ # @backstage/plugin-adr +## 0.4.1 + +### Patch Changes + +- d293f4aaf83: Updated readme instructions +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/plugin-search-react@1.5.1 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/integration-react@1.1.11 + - @backstage/theme@0.2.18 + - @backstage/plugin-adr-common@0.2.7 + - @backstage/plugin-search-common@1.2.2 + ## 0.4.1-next.2 ### Patch Changes diff --git a/plugins/adr/package.json b/plugins/adr/package.json index 5e56c39638..7b636f4b1a 100644 --- a/plugins/adr/package.json +++ b/plugins/adr/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-adr", - "version": "0.4.1-next.2", + "version": "0.4.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/airbrake-backend/CHANGELOG.md b/plugins/airbrake-backend/CHANGELOG.md index bcbd88a755..df44bfa651 100644 --- a/plugins/airbrake-backend/CHANGELOG.md +++ b/plugins/airbrake-backend/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-airbrake-backend +## 0.2.16 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/backend-common@0.18.3 + - @backstage/config@1.0.7 + ## 0.2.16-next.2 ### Patch Changes diff --git a/plugins/airbrake-backend/package.json b/plugins/airbrake-backend/package.json index 52bd89e909..a292f05a14 100644 --- a/plugins/airbrake-backend/package.json +++ b/plugins/airbrake-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-airbrake-backend", - "version": "0.2.16-next.2", + "version": "0.2.16", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/airbrake/CHANGELOG.md b/plugins/airbrake/CHANGELOG.md index 088bfbdcf9..3efe9aabcd 100644 --- a/plugins/airbrake/CHANGELOG.md +++ b/plugins/airbrake/CHANGELOG.md @@ -1,5 +1,19 @@ # @backstage/plugin-airbrake +## 0.3.16 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/test-utils@1.2.6 + - @backstage/dev-utils@1.0.13 + - @backstage/theme@0.2.18 + ## 0.3.16-next.2 ### Patch Changes diff --git a/plugins/airbrake/package.json b/plugins/airbrake/package.json index e577ee8862..6fb594951b 100644 --- a/plugins/airbrake/package.json +++ b/plugins/airbrake/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-airbrake", - "version": "0.3.16-next.2", + "version": "0.3.16", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/allure/CHANGELOG.md b/plugins/allure/CHANGELOG.md index efde01c0b5..2e4346de7d 100644 --- a/plugins/allure/CHANGELOG.md +++ b/plugins/allure/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-allure +## 0.1.32 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.18 + ## 0.1.32-next.2 ### Patch Changes diff --git a/plugins/allure/package.json b/plugins/allure/package.json index 18bf52feab..d76a4d455b 100644 --- a/plugins/allure/package.json +++ b/plugins/allure/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-allure", "description": "A Backstage plugin that integrates with Allure", - "version": "0.1.32-next.2", + "version": "0.1.32", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/analytics-module-ga/CHANGELOG.md b/plugins/analytics-module-ga/CHANGELOG.md index e457b76bf8..6a896c5447 100644 --- a/plugins/analytics-module-ga/CHANGELOG.md +++ b/plugins/analytics-module-ga/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-analytics-module-ga +## 0.1.27 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/core-plugin-api@1.5.0 + - @backstage/config@1.0.7 + - @backstage/theme@0.2.18 + ## 0.1.27-next.2 ### Patch Changes diff --git a/plugins/analytics-module-ga/package.json b/plugins/analytics-module-ga/package.json index b7152b1f69..fa5ee74367 100644 --- a/plugins/analytics-module-ga/package.json +++ b/plugins/analytics-module-ga/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-analytics-module-ga", - "version": "0.1.27-next.2", + "version": "0.1.27", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/apache-airflow/CHANGELOG.md b/plugins/apache-airflow/CHANGELOG.md index acc474e6e3..58348fbc56 100644 --- a/plugins/apache-airflow/CHANGELOG.md +++ b/plugins/apache-airflow/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-apache-airflow +## 0.2.9 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/core-plugin-api@1.5.0 + ## 0.2.9-next.2 ### Patch Changes diff --git a/plugins/apache-airflow/package.json b/plugins/apache-airflow/package.json index 070cbc4136..9856b4608a 100644 --- a/plugins/apache-airflow/package.json +++ b/plugins/apache-airflow/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-apache-airflow", - "version": "0.2.9-next.2", + "version": "0.2.9", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/api-docs/CHANGELOG.md b/plugins/api-docs/CHANGELOG.md index 56644c2322..8735ac91f8 100644 --- a/plugins/api-docs/CHANGELOG.md +++ b/plugins/api-docs/CHANGELOG.md @@ -1,5 +1,21 @@ # @backstage/plugin-api-docs +## 0.9.1 + +### Patch Changes + +- 095e755d9b5: Add ApiDefinitionDialog component for fast access to the API definition in ProvidedApiCards and ConsumedApiCards. +- 8bc7dcec820: Fix dark theme Swagger's clear button font color. +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- 9820eb5d24f: Add a `columns` prop to certain components that use the `EntityTable` for easier extensibility. +- Updated dependencies + - @backstage/plugin-catalog@1.9.0 + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.18 + ## 0.9.1-next.2 ### Patch Changes diff --git a/plugins/api-docs/package.json b/plugins/api-docs/package.json index d7db6566f9..3e1fa380c3 100644 --- a/plugins/api-docs/package.json +++ b/plugins/api-docs/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-api-docs", "description": "A Backstage plugin that helps represent API entities in the frontend", - "version": "0.9.1-next.2", + "version": "0.9.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/apollo-explorer/CHANGELOG.md b/plugins/apollo-explorer/CHANGELOG.md index 8e48be2ab8..8771768cc1 100644 --- a/plugins/apollo-explorer/CHANGELOG.md +++ b/plugins/apollo-explorer/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-apollo-explorer +## 0.1.9 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/core-plugin-api@1.5.0 + - @backstage/theme@0.2.18 + ## 0.1.9-next.2 ### Patch Changes diff --git a/plugins/apollo-explorer/package.json b/plugins/apollo-explorer/package.json index 0fcc315797..746f29d393 100644 --- a/plugins/apollo-explorer/package.json +++ b/plugins/apollo-explorer/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-apollo-explorer", - "version": "0.1.9-next.2", + "version": "0.1.9", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/app-backend/CHANGELOG.md b/plugins/app-backend/CHANGELOG.md index 79c8276eeb..6de2196bb6 100644 --- a/plugins/app-backend/CHANGELOG.md +++ b/plugins/app-backend/CHANGELOG.md @@ -1,5 +1,18 @@ # @backstage/plugin-app-backend +## 0.3.43 + +### Patch Changes + +- 928a12a9b3e: Internal refactor of `/alpha` exports. +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/backend-common@0.18.3 + - @backstage/backend-plugin-api@0.5.0 + - @backstage/config-loader@1.1.9 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + ## 0.3.43-next.2 ### Patch Changes diff --git a/plugins/app-backend/package.json b/plugins/app-backend/package.json index 77804372d1..2c24657363 100644 --- a/plugins/app-backend/package.json +++ b/plugins/app-backend/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-app-backend", "description": "A Backstage backend plugin that serves the Backstage frontend app", - "version": "0.3.43-next.2", + "version": "0.3.43", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/auth-backend/CHANGELOG.md b/plugins/auth-backend/CHANGELOG.md index a22b2e40ee..69fe145e82 100644 --- a/plugins/auth-backend/CHANGELOG.md +++ b/plugins/auth-backend/CHANGELOG.md @@ -1,5 +1,22 @@ # @backstage/plugin-auth-backend +## 0.18.1 + +### Patch Changes + +- e262738b8a0: Handle difference in expiration time between Microsoft session and Backstage session which caused the Backstage token to be invalid during a time frame. +- 86cece2c1fb: Updated dependency `@types/passport-microsoft` to `^1.0.0`. +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- 529de8c4211: Added authentication provider for Azure Easy Authentication. +- Updated dependencies + - @backstage/catalog-client@1.4.0 + - @backstage/plugin-auth-node@0.2.12 + - @backstage/backend-common@0.18.3 + - @backstage/errors@1.1.5 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + ## 0.18.1-next.2 ### Patch Changes diff --git a/plugins/auth-backend/package.json b/plugins/auth-backend/package.json index bcc62814ed..3c0fe10a5b 100644 --- a/plugins/auth-backend/package.json +++ b/plugins/auth-backend/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-auth-backend", "description": "A Backstage backend plugin that handles authentication", - "version": "0.18.1-next.2", + "version": "0.18.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/auth-node/CHANGELOG.md b/plugins/auth-node/CHANGELOG.md index 0e7bcefae2..6c629ad208 100644 --- a/plugins/auth-node/CHANGELOG.md +++ b/plugins/auth-node/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-auth-node +## 0.2.12 + +### Patch Changes + +- 65454876fb2: Minor API report tweaks +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/backend-common@0.18.3 + - @backstage/errors@1.1.5 + - @backstage/config@1.0.7 + ## 0.2.12-next.2 ### Patch Changes diff --git a/plugins/auth-node/package.json b/plugins/auth-node/package.json index 093b23add9..690f67b868 100644 --- a/plugins/auth-node/package.json +++ b/plugins/auth-node/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-auth-node", - "version": "0.2.12-next.2", + "version": "0.2.12", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/azure-devops-backend/CHANGELOG.md b/plugins/azure-devops-backend/CHANGELOG.md index a4a7492ffc..a59697c5b0 100644 --- a/plugins/azure-devops-backend/CHANGELOG.md +++ b/plugins/azure-devops-backend/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-azure-devops-backend +## 0.3.22 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/backend-common@0.18.3 + - @backstage/config@1.0.7 + - @backstage/plugin-azure-devops-common@0.3.0 + ## 0.3.22-next.2 ### Patch Changes diff --git a/plugins/azure-devops-backend/package.json b/plugins/azure-devops-backend/package.json index 1d921a468a..8b2e3caf57 100644 --- a/plugins/azure-devops-backend/package.json +++ b/plugins/azure-devops-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-azure-devops-backend", - "version": "0.3.22-next.2", + "version": "0.3.22", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/azure-devops/CHANGELOG.md b/plugins/azure-devops/CHANGELOG.md index b9fcc646b7..9682fe8de8 100644 --- a/plugins/azure-devops/CHANGELOG.md +++ b/plugins/azure-devops/CHANGELOG.md @@ -1,5 +1,19 @@ # @backstage/plugin-azure-devops +## 0.2.7 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/errors@1.1.5 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.18 + - @backstage/plugin-azure-devops-common@0.3.0 + ## 0.2.7-next.2 ### Patch Changes diff --git a/plugins/azure-devops/package.json b/plugins/azure-devops/package.json index f8bc46f422..01e898978f 100644 --- a/plugins/azure-devops/package.json +++ b/plugins/azure-devops/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-azure-devops", - "version": "0.2.7-next.2", + "version": "0.2.7", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/azure-sites-backend/CHANGELOG.md b/plugins/azure-sites-backend/CHANGELOG.md index 9bc9b99388..d09e308269 100644 --- a/plugins/azure-sites-backend/CHANGELOG.md +++ b/plugins/azure-sites-backend/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-azure-sites-backend +## 0.1.5 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/backend-common@0.18.3 + - @backstage/config@1.0.7 + - @backstage/plugin-azure-sites-common@0.1.0 + ## 0.1.5-next.2 ### Patch Changes diff --git a/plugins/azure-sites-backend/package.json b/plugins/azure-sites-backend/package.json index 3cb7023933..0289ed01bd 100644 --- a/plugins/azure-sites-backend/package.json +++ b/plugins/azure-sites-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-azure-sites-backend", - "version": "0.1.5-next.2", + "version": "0.1.5", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/azure-sites/CHANGELOG.md b/plugins/azure-sites/CHANGELOG.md index 1de9e7a804..99f3c57cda 100644 --- a/plugins/azure-sites/CHANGELOG.md +++ b/plugins/azure-sites/CHANGELOG.md @@ -1,5 +1,19 @@ # @backstage/plugin-azure-sites +## 0.1.5 + +### Patch Changes + +- cb8ec97cdeb: Change black & white colors to be theme aware +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.18 + - @backstage/plugin-azure-sites-common@0.1.0 + ## 0.1.5-next.2 ### Patch Changes diff --git a/plugins/azure-sites/package.json b/plugins/azure-sites/package.json index 6daadf199a..418d4ff578 100644 --- a/plugins/azure-sites/package.json +++ b/plugins/azure-sites/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-azure-sites", - "version": "0.1.5-next.2", + "version": "0.1.5", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/badges-backend/CHANGELOG.md b/plugins/badges-backend/CHANGELOG.md index 837e71bcce..4d3242f09d 100644 --- a/plugins/badges-backend/CHANGELOG.md +++ b/plugins/badges-backend/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-badges-backend +## 0.1.37 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-client@1.4.0 + - @backstage/backend-common@0.18.3 + - @backstage/errors@1.1.5 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + ## 0.1.37-next.2 ### Patch Changes diff --git a/plugins/badges-backend/package.json b/plugins/badges-backend/package.json index f570a47874..88dac005e0 100644 --- a/plugins/badges-backend/package.json +++ b/plugins/badges-backend/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-badges-backend", "description": "A Backstage backend plugin that generates README badges for your entities", - "version": "0.1.37-next.2", + "version": "0.1.37", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/badges/CHANGELOG.md b/plugins/badges/CHANGELOG.md index 567c3e81d6..6f3aaa3897 100644 --- a/plugins/badges/CHANGELOG.md +++ b/plugins/badges/CHANGELOG.md @@ -1,5 +1,18 @@ # @backstage/plugin-badges +## 0.2.40 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/errors@1.1.5 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.18 + ## 0.2.40-next.2 ### Patch Changes diff --git a/plugins/badges/package.json b/plugins/badges/package.json index 7e817c024d..337d36c6cf 100644 --- a/plugins/badges/package.json +++ b/plugins/badges/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-badges", "description": "A Backstage plugin that generates README badges for your entities", - "version": "0.2.40-next.2", + "version": "0.2.40", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/bazaar-backend/CHANGELOG.md b/plugins/bazaar-backend/CHANGELOG.md index 203c1ef67f..29aaf96358 100644 --- a/plugins/bazaar-backend/CHANGELOG.md +++ b/plugins/bazaar-backend/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-bazaar-backend +## 0.2.6 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.2.12 + - @backstage/backend-common@0.18.3 + - @backstage/errors@1.1.5 + - @backstage/backend-plugin-api@0.5.0 + - @backstage/config@1.0.7 + ## 0.2.6-next.2 ### Patch Changes diff --git a/plugins/bazaar-backend/package.json b/plugins/bazaar-backend/package.json index c9221e5c69..97c61156d4 100644 --- a/plugins/bazaar-backend/package.json +++ b/plugins/bazaar-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-bazaar-backend", - "version": "0.2.6-next.2", + "version": "0.2.6", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/bazaar/CHANGELOG.md b/plugins/bazaar/CHANGELOG.md index 57ba471000..ff9fe6e97e 100644 --- a/plugins/bazaar/CHANGELOG.md +++ b/plugins/bazaar/CHANGELOG.md @@ -1,5 +1,20 @@ # @backstage/plugin-bazaar +## 0.2.6 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog@1.9.0 + - @backstage/catalog-client@1.4.0 + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/cli@0.22.4 + - @backstage/errors@1.1.5 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.18 + ## 0.2.6-next.2 ### Patch Changes diff --git a/plugins/bazaar/package.json b/plugins/bazaar/package.json index 6a2311004b..e1cf6a81b7 100644 --- a/plugins/bazaar/package.json +++ b/plugins/bazaar/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-bazaar", - "version": "0.2.6-next.2", + "version": "0.2.6", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/bitbucket-cloud-common/CHANGELOG.md b/plugins/bitbucket-cloud-common/CHANGELOG.md index 0902619c92..faeeca7d48 100644 --- a/plugins/bitbucket-cloud-common/CHANGELOG.md +++ b/plugins/bitbucket-cloud-common/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-bitbucket-cloud-common +## 0.2.4 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/integration@1.4.3 + ## 0.2.4-next.0 ### Patch Changes diff --git a/plugins/bitbucket-cloud-common/package.json b/plugins/bitbucket-cloud-common/package.json index 1290d9c8b8..c5cf434a60 100644 --- a/plugins/bitbucket-cloud-common/package.json +++ b/plugins/bitbucket-cloud-common/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-bitbucket-cloud-common", "description": "Common functionalities for bitbucket-cloud plugins", - "version": "0.2.4-next.0", + "version": "0.2.4", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/bitrise/CHANGELOG.md b/plugins/bitrise/CHANGELOG.md index 1a9d86268d..cd4b948675 100644 --- a/plugins/bitrise/CHANGELOG.md +++ b/plugins/bitrise/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-bitrise +## 0.1.43 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.18 + ## 0.1.43-next.2 ### Patch Changes diff --git a/plugins/bitrise/package.json b/plugins/bitrise/package.json index 41cb8562b5..17f7faf835 100644 --- a/plugins/bitrise/package.json +++ b/plugins/bitrise/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-bitrise", "description": "A Backstage plugin that integrates towards Bitrise", - "version": "0.1.43-next.2", + "version": "0.1.43", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog-backend-module-aws/CHANGELOG.md b/plugins/catalog-backend-module-aws/CHANGELOG.md index f4e268aae7..7b556b2d53 100644 --- a/plugins/catalog-backend-module-aws/CHANGELOG.md +++ b/plugins/catalog-backend-module-aws/CHANGELOG.md @@ -1,5 +1,27 @@ # @backstage/plugin-catalog-backend-module-aws +## 0.1.17 + +### Patch Changes + +- 90469c02c8c: Renamed `awsS3EntityProviderCatalogModule` to `catalogModuleAwsS3EntityProviders` to match the [recommended naming patterns](https://backstage.io/docs/backend-system/architecture/naming-patterns). +- e675f902980: Make sure to not use deprecated exports from `@backstage/plugin-catalog-backend` +- 928a12a9b3e: Internal refactor of `/alpha` exports. +- 87f0bbec175: AwsS3UrlReader upgraded to use aws-sdk v3 +- bf611cf019a: Fix missing `dependencies` in `package.json` +- Updated dependencies + - @backstage/backend-tasks@0.5.0 + - @backstage/backend-common@0.18.3 + - @backstage/errors@1.1.5 + - @backstage/plugin-catalog-node@1.3.4 + - @backstage/backend-plugin-api@0.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/plugin-catalog-common@1.0.12 + - @backstage/integration@1.4.3 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + - @backstage/plugin-kubernetes-common@0.6.1 + ## 0.1.17-next.2 ### Patch Changes diff --git a/plugins/catalog-backend-module-aws/package.json b/plugins/catalog-backend-module-aws/package.json index 79271cf4de..c0e2463cfd 100644 --- a/plugins/catalog-backend-module-aws/package.json +++ b/plugins/catalog-backend-module-aws/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-catalog-backend-module-aws", "description": "A Backstage catalog backend module that helps integrate towards AWS", - "version": "0.1.17-next.2", + "version": "0.1.17", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog-backend-module-azure/CHANGELOG.md b/plugins/catalog-backend-module-azure/CHANGELOG.md index 86566d383f..30ccea2776 100644 --- a/plugins/catalog-backend-module-azure/CHANGELOG.md +++ b/plugins/catalog-backend-module-azure/CHANGELOG.md @@ -1,5 +1,26 @@ # @backstage/plugin-catalog-backend-module-azure +## 0.1.14 + +### Patch Changes + +- 90469c02c8c: Renamed `azureDevOpsEntityProviderCatalogModule` to `catalogModuleAzureDevOpsEntityProvider` to match the [recommended naming patterns](https://backstage.io/docs/backend-system/architecture/naming-patterns). +- c17fa101825: Add branch filter support + https://backstage.io/docs/integrations/azure/discovery +- e675f902980: Make sure to not use deprecated exports from `@backstage/plugin-catalog-backend` +- 928a12a9b3e: Internal refactor of `/alpha` exports. +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/backend-tasks@0.5.0 + - @backstage/backend-common@0.18.3 + - @backstage/errors@1.1.5 + - @backstage/plugin-catalog-node@1.3.4 + - @backstage/backend-plugin-api@0.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/integration@1.4.3 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + ## 0.1.14-next.2 ### Patch Changes diff --git a/plugins/catalog-backend-module-azure/package.json b/plugins/catalog-backend-module-azure/package.json index afe85243db..4015eb07f2 100644 --- a/plugins/catalog-backend-module-azure/package.json +++ b/plugins/catalog-backend-module-azure/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-catalog-backend-module-azure", "description": "A Backstage catalog backend module that helps integrate towards Azure", - "version": "0.1.14-next.2", + "version": "0.1.14", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog-backend-module-bitbucket-cloud/CHANGELOG.md b/plugins/catalog-backend-module-bitbucket-cloud/CHANGELOG.md index b1de810710..90d939638c 100644 --- a/plugins/catalog-backend-module-bitbucket-cloud/CHANGELOG.md +++ b/plugins/catalog-backend-module-bitbucket-cloud/CHANGELOG.md @@ -1,5 +1,26 @@ # @backstage/plugin-catalog-backend-module-bitbucket-cloud +## 0.1.10 + +### Patch Changes + +- 90469c02c8c: Renamed `bitbucketCloudEntityProviderCatalogModule` to `catalogModuleBitbucketCloudEntityProvider` to match the [recommended naming patterns](https://backstage.io/docs/backend-system/architecture/naming-patterns). +- e675f902980: Make sure to not use deprecated exports from `@backstage/plugin-catalog-backend` +- 928a12a9b3e: Internal refactor of `/alpha` exports. +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/catalog-client@1.4.0 + - @backstage/backend-tasks@0.5.0 + - @backstage/backend-common@0.18.3 + - @backstage/plugin-catalog-node@1.3.4 + - @backstage/backend-plugin-api@0.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/plugin-catalog-common@1.0.12 + - @backstage/plugin-events-node@0.2.4 + - @backstage/integration@1.4.3 + - @backstage/plugin-bitbucket-cloud-common@0.2.4 + - @backstage/config@1.0.7 + ## 0.1.10-next.2 ### Patch Changes diff --git a/plugins/catalog-backend-module-bitbucket-cloud/package.json b/plugins/catalog-backend-module-bitbucket-cloud/package.json index 8ed58f0333..af3b21d2d0 100644 --- a/plugins/catalog-backend-module-bitbucket-cloud/package.json +++ b/plugins/catalog-backend-module-bitbucket-cloud/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-catalog-backend-module-bitbucket-cloud", "description": "A Backstage catalog backend module that helps integrate towards Bitbucket Cloud", - "version": "0.1.10-next.2", + "version": "0.1.10", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog-backend-module-bitbucket-server/CHANGELOG.md b/plugins/catalog-backend-module-bitbucket-server/CHANGELOG.md index 00341a3870..216b7f6a9a 100644 --- a/plugins/catalog-backend-module-bitbucket-server/CHANGELOG.md +++ b/plugins/catalog-backend-module-bitbucket-server/CHANGELOG.md @@ -1,5 +1,23 @@ # @backstage/plugin-catalog-backend-module-bitbucket-server +## 0.1.8 + +### Patch Changes + +- 90469c02c8c: Renamed `bitbucketServerEntityProviderCatalogModule` to `catalogModuleBitbucketServerEntityProvider` to match the [recommended naming patterns](https://backstage.io/docs/backend-system/architecture/naming-patterns). +- e675f902980: Make sure to not use deprecated exports from `@backstage/plugin-catalog-backend` +- 928a12a9b3e: Internal refactor of `/alpha` exports. +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/backend-tasks@0.5.0 + - @backstage/backend-common@0.18.3 + - @backstage/errors@1.1.5 + - @backstage/plugin-catalog-node@1.3.4 + - @backstage/backend-plugin-api@0.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/integration@1.4.3 + - @backstage/config@1.0.7 + ## 0.1.8-next.2 ### Patch Changes diff --git a/plugins/catalog-backend-module-bitbucket-server/package.json b/plugins/catalog-backend-module-bitbucket-server/package.json index 433d4bc907..6cf06b432e 100644 --- a/plugins/catalog-backend-module-bitbucket-server/package.json +++ b/plugins/catalog-backend-module-bitbucket-server/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-backend-module-bitbucket-server", - "version": "0.1.8-next.2", + "version": "0.1.8", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog-backend-module-bitbucket/CHANGELOG.md b/plugins/catalog-backend-module-bitbucket/CHANGELOG.md index eef6da4c0e..936303e285 100644 --- a/plugins/catalog-backend-module-bitbucket/CHANGELOG.md +++ b/plugins/catalog-backend-module-bitbucket/CHANGELOG.md @@ -1,5 +1,21 @@ # @backstage/plugin-catalog-backend-module-bitbucket +## 0.2.10 + +### Patch Changes + +- e675f902980: Make sure to not use deprecated exports from `@backstage/plugin-catalog-backend` +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/backend-common@0.18.3 + - @backstage/errors@1.1.5 + - @backstage/plugin-catalog-node@1.3.4 + - @backstage/catalog-model@1.2.1 + - @backstage/integration@1.4.3 + - @backstage/plugin-bitbucket-cloud-common@0.2.4 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + ## 0.2.10-next.2 ### Patch Changes diff --git a/plugins/catalog-backend-module-bitbucket/package.json b/plugins/catalog-backend-module-bitbucket/package.json index 79fbbe08c4..48fad40034 100644 --- a/plugins/catalog-backend-module-bitbucket/package.json +++ b/plugins/catalog-backend-module-bitbucket/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-catalog-backend-module-bitbucket", "description": "A Backstage catalog backend module that helps integrate towards Bitbucket", - "version": "0.2.10-next.2", + "version": "0.2.10", "deprecated": true, "main": "src/index.ts", "types": "src/index.ts", diff --git a/plugins/catalog-backend-module-gerrit/CHANGELOG.md b/plugins/catalog-backend-module-gerrit/CHANGELOG.md index 07ab61c8c4..35913b542f 100644 --- a/plugins/catalog-backend-module-gerrit/CHANGELOG.md +++ b/plugins/catalog-backend-module-gerrit/CHANGELOG.md @@ -1,5 +1,23 @@ # @backstage/plugin-catalog-backend-module-gerrit +## 0.1.11 + +### Patch Changes + +- 90469c02c8c: Renamed `gerritEntityProviderCatalogModule` to `catalogModuleGerritEntityProvider` to match the [recommended naming patterns](https://backstage.io/docs/backend-system/architecture/naming-patterns). +- e675f902980: Make sure to not use deprecated exports from `@backstage/plugin-catalog-backend` +- 928a12a9b3e: Internal refactor of `/alpha` exports. +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/backend-tasks@0.5.0 + - @backstage/backend-common@0.18.3 + - @backstage/errors@1.1.5 + - @backstage/plugin-catalog-node@1.3.4 + - @backstage/backend-plugin-api@0.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/integration@1.4.3 + - @backstage/config@1.0.7 + ## 0.1.11-next.2 ### Patch Changes diff --git a/plugins/catalog-backend-module-gerrit/package.json b/plugins/catalog-backend-module-gerrit/package.json index af9727cbf9..244bcdf1ed 100644 --- a/plugins/catalog-backend-module-gerrit/package.json +++ b/plugins/catalog-backend-module-gerrit/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-backend-module-gerrit", - "version": "0.1.11-next.2", + "version": "0.1.11", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog-backend-module-github/CHANGELOG.md b/plugins/catalog-backend-module-github/CHANGELOG.md index 1e0c455391..22d4e10583 100644 --- a/plugins/catalog-backend-module-github/CHANGELOG.md +++ b/plugins/catalog-backend-module-github/CHANGELOG.md @@ -1,5 +1,29 @@ # @backstage/plugin-catalog-backend-module-github +## 0.2.6 + +### Patch Changes + +- 65454876fb2: Minor API report tweaks +- 90469c02c8c: Renamed `githubEntityProviderCatalogModule` to `catalogModuleGithubEntityProvider` to match the [recommended naming patterns](https://backstage.io/docs/backend-system/architecture/naming-patterns). +- e675f902980: Make sure to not use deprecated exports from `@backstage/plugin-catalog-backend` +- 928a12a9b3e: Internal refactor of `/alpha` exports. +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/plugin-catalog-backend@1.8.0 + - @backstage/catalog-client@1.4.0 + - @backstage/backend-tasks@0.5.0 + - @backstage/backend-common@0.18.3 + - @backstage/errors@1.1.5 + - @backstage/plugin-catalog-node@1.3.4 + - @backstage/backend-plugin-api@0.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/plugin-catalog-common@1.0.12 + - @backstage/plugin-events-node@0.2.4 + - @backstage/integration@1.4.3 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + ## 0.2.6-next.2 ### Patch Changes diff --git a/plugins/catalog-backend-module-github/package.json b/plugins/catalog-backend-module-github/package.json index fe9183917e..5c9f7f67e1 100644 --- a/plugins/catalog-backend-module-github/package.json +++ b/plugins/catalog-backend-module-github/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-catalog-backend-module-github", "description": "A Backstage catalog backend module that helps integrate towards GitHub", - "version": "0.2.6-next.2", + "version": "0.2.6", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog-backend-module-gitlab/CHANGELOG.md b/plugins/catalog-backend-module-gitlab/CHANGELOG.md index 491d972754..2bde8b2635 100644 --- a/plugins/catalog-backend-module-gitlab/CHANGELOG.md +++ b/plugins/catalog-backend-module-gitlab/CHANGELOG.md @@ -1,5 +1,28 @@ # @backstage/plugin-catalog-backend-module-gitlab +## 0.1.14 + +### Patch Changes + +- 90469c02c8c: Renamed `gitlabDiscoveryEntityProviderCatalogModule` to `catalogModuleGitlabDiscoveryEntityProvider` to match the [recommended naming patterns](https://backstage.io/docs/backend-system/architecture/naming-patterns). +- e675f902980: Make sure to not use deprecated exports from `@backstage/plugin-catalog-backend` +- 928a12a9b3e: Internal refactor of `/alpha` exports. +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- af1095f1e11: The configuration key `branch` of the `GitlabDiscoveryEntityProvider` has been deprecated in favor of the configuration key `fallbackBranch`. + It will be reused in future release to enforce a concrete branch to be used in catalog file discovery. + To migrate to the new configuration value, rename `branch` to `fallbackBranch`. +- be129f8f3cd: filter gitlab groups by prefix +- Updated dependencies + - @backstage/backend-tasks@0.5.0 + - @backstage/backend-common@0.18.3 + - @backstage/errors@1.1.5 + - @backstage/plugin-catalog-node@1.3.4 + - @backstage/backend-plugin-api@0.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/integration@1.4.3 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + ## 0.1.14-next.2 ### Patch Changes diff --git a/plugins/catalog-backend-module-gitlab/package.json b/plugins/catalog-backend-module-gitlab/package.json index ed07ea842c..b6437cd46b 100644 --- a/plugins/catalog-backend-module-gitlab/package.json +++ b/plugins/catalog-backend-module-gitlab/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-catalog-backend-module-gitlab", "description": "A Backstage catalog backend module that helps integrate towards GitLab", - "version": "0.1.14-next.2", + "version": "0.1.14", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog-backend-module-incremental-ingestion/CHANGELOG.md b/plugins/catalog-backend-module-incremental-ingestion/CHANGELOG.md index 11393c6db2..d411c63ed2 100644 --- a/plugins/catalog-backend-module-incremental-ingestion/CHANGELOG.md +++ b/plugins/catalog-backend-module-incremental-ingestion/CHANGELOG.md @@ -1,5 +1,30 @@ # @backstage/plugin-catalog-backend-module-incremental-ingestion +## 0.3.0 + +### Minor Changes + +- a811bd246c4: Added endpoint to get a list of known incremental entity providers + +### Patch Changes + +- 90469c02c8c: Renamed `incrementalIngestionEntityProviderCatalogModule` to `catalogModuleIncrementalIngestionEntityProvider` to match the [recommended naming patterns](https://backstage.io/docs/backend-system/architecture/naming-patterns). +- e675f902980: Make sure to not use deprecated exports from `@backstage/plugin-catalog-backend` +- 928a12a9b3e: Internal refactor of `/alpha` exports. +- bf611cf019a: Fix missing `dependencies` in `package.json` +- 6e612b58577: Move `@backstage/backend-defaults` to `devDependencies` +- Updated dependencies + - @backstage/plugin-catalog-backend@1.8.0 + - @backstage/backend-tasks@0.5.0 + - @backstage/backend-common@0.18.3 + - @backstage/errors@1.1.5 + - @backstage/plugin-catalog-node@1.3.4 + - @backstage/backend-plugin-api@0.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/plugin-events-node@0.2.4 + - @backstage/plugin-permission-common@0.7.4 + - @backstage/config@1.0.7 + ## 0.3.0-next.2 ### Patch Changes diff --git a/plugins/catalog-backend-module-incremental-ingestion/package.json b/plugins/catalog-backend-module-incremental-ingestion/package.json index 5b2a534fcb..df86610dce 100644 --- a/plugins/catalog-backend-module-incremental-ingestion/package.json +++ b/plugins/catalog-backend-module-incremental-ingestion/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-catalog-backend-module-incremental-ingestion", "description": "An entity provider for streaming large asset sources into the catalog", - "version": "0.3.0-next.2", + "version": "0.3.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog-backend-module-ldap/CHANGELOG.md b/plugins/catalog-backend-module-ldap/CHANGELOG.md index 5e176f09ba..99503f83bf 100644 --- a/plugins/catalog-backend-module-ldap/CHANGELOG.md +++ b/plugins/catalog-backend-module-ldap/CHANGELOG.md @@ -1,5 +1,18 @@ # @backstage/plugin-catalog-backend-module-ldap +## 0.5.10 + +### Patch Changes + +- e675f902980: Make sure to not use deprecated exports from `@backstage/plugin-catalog-backend` +- Updated dependencies + - @backstage/backend-tasks@0.5.0 + - @backstage/errors@1.1.5 + - @backstage/plugin-catalog-node@1.3.4 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + ## 0.5.10-next.2 ### Patch Changes diff --git a/plugins/catalog-backend-module-ldap/package.json b/plugins/catalog-backend-module-ldap/package.json index 06b33f1db2..d483baa914 100644 --- a/plugins/catalog-backend-module-ldap/package.json +++ b/plugins/catalog-backend-module-ldap/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-catalog-backend-module-ldap", "description": "A Backstage catalog backend module that helps integrate towards LDAP", - "version": "0.5.10-next.2", + "version": "0.5.10", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog-backend-module-msgraph/CHANGELOG.md b/plugins/catalog-backend-module-msgraph/CHANGELOG.md index dc1a32f25a..37393dfd7b 100644 --- a/plugins/catalog-backend-module-msgraph/CHANGELOG.md +++ b/plugins/catalog-backend-module-msgraph/CHANGELOG.md @@ -1,5 +1,24 @@ # @backstage/plugin-catalog-backend-module-msgraph +## 0.5.2 + +### Patch Changes + +- a4ebd513527: Revert using `baseUrl` for MS Graph provider as it breaks token retrieval +- 26eef93c547: Fixed msgraph catalog backend to use user.select option when fetching user from AzureAD +- 90469c02c8c: Renamed `microsoftGraphOrgEntityProviderCatalogModule` to `catalogModuleMicrosoftGraphOrgEntityProvider` to match the [recommended naming patterns](https://backstage.io/docs/backend-system/architecture/naming-patterns). +- e675f902980: Make sure to not use deprecated exports from `@backstage/plugin-catalog-backend` +- 928a12a9b3e: Internal refactor of `/alpha` exports. +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- 2c234a89325: properly support custom graph api URL +- Updated dependencies + - @backstage/backend-tasks@0.5.0 + - @backstage/backend-common@0.18.3 + - @backstage/plugin-catalog-node@1.3.4 + - @backstage/backend-plugin-api@0.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + ## 0.5.2-next.2 ### Patch Changes diff --git a/plugins/catalog-backend-module-msgraph/package.json b/plugins/catalog-backend-module-msgraph/package.json index f66151bbc4..3201e0b8d4 100644 --- a/plugins/catalog-backend-module-msgraph/package.json +++ b/plugins/catalog-backend-module-msgraph/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-catalog-backend-module-msgraph", "description": "A Backstage catalog backend module that helps integrate towards Microsoft Graph", - "version": "0.5.2-next.2", + "version": "0.5.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog-backend-module-openapi/CHANGELOG.md b/plugins/catalog-backend-module-openapi/CHANGELOG.md index 8bf478947a..414f7960cd 100644 --- a/plugins/catalog-backend-module-openapi/CHANGELOG.md +++ b/plugins/catalog-backend-module-openapi/CHANGELOG.md @@ -1,5 +1,18 @@ # @backstage/plugin-catalog-backend-module-openapi +## 0.1.9 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-backend@1.8.0 + - @backstage/backend-common@0.18.3 + - @backstage/plugin-catalog-node@1.3.4 + - @backstage/catalog-model@1.2.1 + - @backstage/integration@1.4.3 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + ## 0.1.9-next.2 ### Patch Changes diff --git a/plugins/catalog-backend-module-openapi/package.json b/plugins/catalog-backend-module-openapi/package.json index fee080d1bf..6bb9d66ec5 100644 --- a/plugins/catalog-backend-module-openapi/package.json +++ b/plugins/catalog-backend-module-openapi/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-catalog-backend-module-openapi", "description": "A Backstage catalog backend module that helps with OpenAPI specifications", - "version": "0.1.9-next.2", + "version": "0.1.9", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog-backend-module-puppetdb/CHANGELOG.md b/plugins/catalog-backend-module-puppetdb/CHANGELOG.md index 5bc50ae148..d3ccdb6782 100644 --- a/plugins/catalog-backend-module-puppetdb/CHANGELOG.md +++ b/plugins/catalog-backend-module-puppetdb/CHANGELOG.md @@ -1,5 +1,25 @@ # @backstage/plugin-catalog-backend-module-puppetdb +## 0.1.0 + +### Minor Changes + +- a1efcf9a658: Initial version of the plugin. + +### Patch Changes + +- 561ce41191d: Added a `catalogModulePuppetDbEntityProvider` alpha export for the new backend system +- e675f902980: Make sure to not use deprecated exports from `@backstage/plugin-catalog-backend` +- Updated dependencies + - @backstage/backend-tasks@0.5.0 + - @backstage/backend-common@0.18.3 + - @backstage/errors@1.1.5 + - @backstage/plugin-catalog-node@1.3.4 + - @backstage/backend-plugin-api@0.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + ## 0.1.0-next.0 ### Minor Changes diff --git a/plugins/catalog-backend-module-puppetdb/package.json b/plugins/catalog-backend-module-puppetdb/package.json index 252fe21969..3334e3d204 100644 --- a/plugins/catalog-backend-module-puppetdb/package.json +++ b/plugins/catalog-backend-module-puppetdb/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-catalog-backend-module-puppetdb", "description": "A Backstage catalog backend module that helps integrate towards PuppetDB", - "version": "0.1.0-next.0", + "version": "0.1.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog-backend/CHANGELOG.md b/plugins/catalog-backend/CHANGELOG.md index 1cc3b3620a..0a3c5853e0 100644 --- a/plugins/catalog-backend/CHANGELOG.md +++ b/plugins/catalog-backend/CHANGELOG.md @@ -1,5 +1,59 @@ # @backstage/plugin-catalog-backend +## 1.8.0 + +### Minor Changes + +- 7f4ea3d3602: Add /entities/by-query endpoint returning paginated entities. + + The endpoint supports cursor base pagination and server side sorting of the entities + +### Patch Changes + +- e675f902980: Add deprecations for symbols that were moved to `@backstage/plugin-catalog-node` a long time ago: + + - `CatalogProcessor` + - `CatalogProcessorCache` + - `CatalogProcessorEmit` + - `CatalogProcessorEntityResult` + - `CatalogProcessorErrorResult` + - `CatalogProcessorLocationResult` + - `CatalogProcessorParser` + - `CatalogProcessorRefreshKeysResult` + - `CatalogProcessorRelationResult` + - `CatalogProcessorResult` + - `DeferredEntity` + - `EntityProvider` + - `EntityProviderConnection` + - `EntityProviderMutation` + - `EntityRelationSpec` + - `processingResult` + + Also moved over and deprecated the following symbols: + + - `locationSpecToLocationEntity` + - `locationSpecToMetadataName` + +- ac8929f2f31: Fix export of `defaultCatalogCollatorEntityTransformer`. +- 928a12a9b3e: Internal refactor of `/alpha` exports. +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- f093ce83d58: Fix a bug where the batch fetch by ref endpoint did not work in conjunction with filtering (e.g. if authorization was enabled). +- Updated dependencies + - @backstage/catalog-client@1.4.0 + - @backstage/plugin-permission-node@0.7.6 + - @backstage/backend-common@0.18.3 + - @backstage/errors@1.1.5 + - @backstage/plugin-catalog-node@1.3.4 + - @backstage/backend-plugin-api@0.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/plugin-catalog-common@1.0.12 + - @backstage/integration@1.4.3 + - @backstage/plugin-permission-common@0.7.4 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + - @backstage/plugin-scaffolder-common@1.2.6 + - @backstage/plugin-search-common@1.2.2 + ## 1.8.0-next.2 ### Patch Changes diff --git a/plugins/catalog-backend/package.json b/plugins/catalog-backend/package.json index 35eac97cc1..1e837fd9ba 100644 --- a/plugins/catalog-backend/package.json +++ b/plugins/catalog-backend/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-catalog-backend", "description": "The Backstage backend plugin that provides the Backstage catalog", - "version": "1.8.0-next.2", + "version": "1.8.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog-common/CHANGELOG.md b/plugins/catalog-common/CHANGELOG.md index 813d888be2..37862d47bd 100644 --- a/plugins/catalog-common/CHANGELOG.md +++ b/plugins/catalog-common/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-catalog-common +## 1.0.12 + +### Patch Changes + +- 928a12a9b3e: Internal refactor of `/alpha` exports. +- Updated dependencies + - @backstage/catalog-model@1.2.1 + - @backstage/plugin-permission-common@0.7.4 + - @backstage/plugin-search-common@1.2.2 + ## 1.0.12-next.1 ### Patch Changes diff --git a/plugins/catalog-common/package.json b/plugins/catalog-common/package.json index e2423f834b..aa7f26f4df 100644 --- a/plugins/catalog-common/package.json +++ b/plugins/catalog-common/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-catalog-common", "description": "Common functionalities for the catalog plugin", - "version": "1.0.12-next.1", + "version": "1.0.12", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog-customized/CHANGELOG.md b/plugins/catalog-customized/CHANGELOG.md index 654672a156..c155405317 100644 --- a/plugins/catalog-customized/CHANGELOG.md +++ b/plugins/catalog-customized/CHANGELOG.md @@ -1,5 +1,13 @@ # @internal/plugin-catalog-customized +## 0.0.8 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog@1.9.0 + - @backstage/plugin-catalog-react@1.4.0 + ## 0.0.8-next.2 ### Patch Changes diff --git a/plugins/catalog-customized/package.json b/plugins/catalog-customized/package.json index 20ef38355b..59159bfe84 100644 --- a/plugins/catalog-customized/package.json +++ b/plugins/catalog-customized/package.json @@ -1,7 +1,7 @@ { "name": "@internal/plugin-catalog-customized", "description": "The internal Backstage Customizable plugin for browsing the Backstage catalog", - "version": "0.0.8-next.2", + "version": "0.0.8", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog-graph/CHANGELOG.md b/plugins/catalog-graph/CHANGELOG.md index bd0a9d7c76..04d714d024 100644 --- a/plugins/catalog-graph/CHANGELOG.md +++ b/plugins/catalog-graph/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-catalog-graph +## 0.2.28 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-client@1.4.0 + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.18 + ## 0.2.28-next.2 ### Patch Changes diff --git a/plugins/catalog-graph/package.json b/plugins/catalog-graph/package.json index ab7e7e78a9..1ae663f32c 100644 --- a/plugins/catalog-graph/package.json +++ b/plugins/catalog-graph/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-graph", - "version": "0.2.28-next.2", + "version": "0.2.28", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog-graphql/CHANGELOG.md b/plugins/catalog-graphql/CHANGELOG.md index 64721ef98e..740ed8905a 100644 --- a/plugins/catalog-graphql/CHANGELOG.md +++ b/plugins/catalog-graphql/CHANGELOG.md @@ -1,5 +1,19 @@ # @backstage/plugin-catalog-graphql +## 0.3.19 + +### Patch Changes + +- b990021ddeb: Updated dependency `@graphql-codegen/cli` to `^3.0.0`. + Updated dependency `@graphql-codegen/graphql-modules-preset` to `^3.0.0`. + Updated dependency `@graphql-codegen/typescript` to `^3.0.0`. + Updated dependency `@graphql-codegen/typescript-resolvers` to `^3.0.0`. +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + ## 0.3.19-next.1 ### Patch Changes diff --git a/plugins/catalog-graphql/package.json b/plugins/catalog-graphql/package.json index 0c6fc28c09..274828db86 100644 --- a/plugins/catalog-graphql/package.json +++ b/plugins/catalog-graphql/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-catalog-graphql", "description": "An experimental Backstage catalog GraphQL module", - "version": "0.3.19-next.1", + "version": "0.3.19", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog-import/CHANGELOG.md b/plugins/catalog-import/CHANGELOG.md index 0451769b82..d29890d836 100644 --- a/plugins/catalog-import/CHANGELOG.md +++ b/plugins/catalog-import/CHANGELOG.md @@ -1,5 +1,22 @@ # @backstage/plugin-catalog-import +## 0.9.6 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/catalog-client@1.4.0 + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/errors@1.1.5 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/plugin-catalog-common@1.0.12 + - @backstage/integration-react@1.1.11 + - @backstage/integration@1.4.3 + - @backstage/config@1.0.7 + ## 0.9.6-next.2 ### Patch Changes diff --git a/plugins/catalog-import/package.json b/plugins/catalog-import/package.json index baddab4656..a9e38367b9 100644 --- a/plugins/catalog-import/package.json +++ b/plugins/catalog-import/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-catalog-import", "description": "A Backstage plugin the helps you import entities into your catalog", - "version": "0.9.6-next.2", + "version": "0.9.6", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog-node/CHANGELOG.md b/plugins/catalog-node/CHANGELOG.md index 8ed02981ca..71333f339c 100644 --- a/plugins/catalog-node/CHANGELOG.md +++ b/plugins/catalog-node/CHANGELOG.md @@ -1,5 +1,19 @@ # @backstage/plugin-catalog-node +## 1.3.4 + +### Patch Changes + +- e675f902980: Added `locationSpecToMetadataName` and `locationSpecToLocationEntity` as their new home, moved over from the backend package where they now are marked as deprecated. +- 928a12a9b3e: Internal refactor of `/alpha` exports. +- Updated dependencies + - @backstage/catalog-client@1.4.0 + - @backstage/errors@1.1.5 + - @backstage/backend-plugin-api@0.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/plugin-catalog-common@1.0.12 + - @backstage/types@1.0.2 + ## 1.3.4-next.2 ### Patch Changes diff --git a/plugins/catalog-node/package.json b/plugins/catalog-node/package.json index d5ad3b86ea..e95258f59b 100644 --- a/plugins/catalog-node/package.json +++ b/plugins/catalog-node/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-catalog-node", "description": "The plugin-catalog-node module for @backstage/plugin-catalog-backend", - "version": "1.3.4-next.2", + "version": "1.3.4", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog-react/CHANGELOG.md b/plugins/catalog-react/CHANGELOG.md index 4d8acf0936..1436ea2b2f 100644 --- a/plugins/catalog-react/CHANGELOG.md +++ b/plugins/catalog-react/CHANGELOG.md @@ -1,5 +1,30 @@ # @backstage/plugin-catalog-react +## 1.4.0 + +### Minor Changes + +- 0a5b73b2926: Add possibility to re-use EntityPicker for filters with multiple select. + +### Patch Changes + +- 65454876fb2: Minor API report tweaks +- 928a12a9b3e: Internal refactor of `/alpha` exports. +- 24916d23494: Do not close `Autocomplete` powered multiple-selection filters when checking boxes +- Updated dependencies + - @backstage/catalog-client@1.4.0 + - @backstage/core-components@0.12.5 + - @backstage/errors@1.1.5 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/plugin-catalog-common@1.0.12 + - @backstage/integration@1.4.3 + - @backstage/plugin-permission-common@0.7.4 + - @backstage/theme@0.2.18 + - @backstage/types@1.0.2 + - @backstage/version-bridge@1.0.3 + - @backstage/plugin-permission-react@0.4.11 + ## 1.4.0-next.2 ### Patch Changes diff --git a/plugins/catalog-react/package.json b/plugins/catalog-react/package.json index 8f0b9627c7..a905dea1f6 100644 --- a/plugins/catalog-react/package.json +++ b/plugins/catalog-react/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-catalog-react", "description": "A frontend library that helps other Backstage plugins interact with the catalog", - "version": "1.4.0-next.2", + "version": "1.4.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/catalog/CHANGELOG.md b/plugins/catalog/CHANGELOG.md index 873c90de07..239a7e6057 100644 --- a/plugins/catalog/CHANGELOG.md +++ b/plugins/catalog/CHANGELOG.md @@ -1,5 +1,54 @@ # @backstage/plugin-catalog +## 1.9.0 + +### Minor Changes + +- 23cc40039c0: Allow `EntitySwitch` to render all cases that match the condition. + + This change introduces a new parameter for the `EntitySwitch` component + `renderMultipleMatches`. In case the parameter value is `all`, the `EntitySwitch` + will render all `EntitySwitch.Case` that contain `if` parameter, and it + evaluates to true. In case none of the cases match, the default case will be + rendered, if any. + + This means for example in the CI/CD page you can now do the following: + + ```tsx + + Jenkins + CodeBuild + No CI/CD + + ``` + + This allows the component to have multiple CI/CD systems and all of those are + rendered on the same page. + +- 3f75b7607ca: Add ability to pass icon as function to have ability to customize it by search item +- c9a9f3c834f: Add a `columns` prop to certain components that use the `EntityTable` for easier extensibility. + +### Patch Changes + +- 3fa41696820: Make the "Copied!" message disappear automatically after some time +- 7e8930ae1c6: Fix icon alignment in `CatalogSearchResultListItem` +- dbbde6ed353: fix entity switch rendering when there is no default case +- cb8ec97cdeb: Change black & white colors to be theme aware +- 928a12a9b3e: Internal refactor of `/alpha` exports. +- Updated dependencies + - @backstage/catalog-client@1.4.0 + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/plugin-search-react@1.5.1 + - @backstage/errors@1.1.5 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/plugin-catalog-common@1.0.12 + - @backstage/integration-react@1.1.11 + - @backstage/theme@0.2.18 + - @backstage/types@1.0.2 + - @backstage/plugin-search-common@1.2.2 + ## 1.9.0-next.2 ### Minor Changes diff --git a/plugins/catalog/package.json b/plugins/catalog/package.json index c66ae8fb5e..782ab6051a 100644 --- a/plugins/catalog/package.json +++ b/plugins/catalog/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-catalog", "description": "The Backstage plugin for browsing the Backstage catalog", - "version": "1.9.0-next.2", + "version": "1.9.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/cicd-statistics-module-gitlab/CHANGELOG.md b/plugins/cicd-statistics-module-gitlab/CHANGELOG.md index 55ec192258..a8519377a6 100644 --- a/plugins/cicd-statistics-module-gitlab/CHANGELOG.md +++ b/plugins/cicd-statistics-module-gitlab/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-cicd-statistics-module-gitlab +## 0.1.12 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/plugin-cicd-statistics@0.1.18 + ## 0.1.12-next.2 ### Patch Changes diff --git a/plugins/cicd-statistics-module-gitlab/package.json b/plugins/cicd-statistics-module-gitlab/package.json index 38de7c6799..8144319eaa 100644 --- a/plugins/cicd-statistics-module-gitlab/package.json +++ b/plugins/cicd-statistics-module-gitlab/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-cicd-statistics-module-gitlab", "description": "CI/CD Statistics plugin module; Gitlab CICD", - "version": "0.1.12-next.2", + "version": "0.1.12", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/cicd-statistics/CHANGELOG.md b/plugins/cicd-statistics/CHANGELOG.md index 97434f99c7..bc91b2611b 100644 --- a/plugins/cicd-statistics/CHANGELOG.md +++ b/plugins/cicd-statistics/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-cicd-statistics +## 0.1.18 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + ## 0.1.18-next.2 ### Patch Changes diff --git a/plugins/cicd-statistics/package.json b/plugins/cicd-statistics/package.json index 8262235489..967aa89f7c 100644 --- a/plugins/cicd-statistics/package.json +++ b/plugins/cicd-statistics/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-cicd-statistics", "description": "A frontend plugin visualizing CI/CD pipeline statistics (build time)", - "version": "0.1.18-next.2", + "version": "0.1.18", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/circleci/CHANGELOG.md b/plugins/circleci/CHANGELOG.md index c43162fe14..93dd50f6be 100644 --- a/plugins/circleci/CHANGELOG.md +++ b/plugins/circleci/CHANGELOG.md @@ -1,5 +1,18 @@ # @backstage/plugin-circleci +## 0.3.16 + +### Patch Changes + +- c10384a9235: Switch to using `LinkButton` instead of the deprecated `Button` +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.18 + ## 0.3.16-next.2 ### Patch Changes diff --git a/plugins/circleci/package.json b/plugins/circleci/package.json index 55d02ce8bd..6f093a24b3 100644 --- a/plugins/circleci/package.json +++ b/plugins/circleci/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-circleci", "description": "A Backstage plugin that integrates towards Circle CI", - "version": "0.3.16-next.2", + "version": "0.3.16", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/cloudbuild/CHANGELOG.md b/plugins/cloudbuild/CHANGELOG.md index bc5f71d8e1..935cb3e7bb 100644 --- a/plugins/cloudbuild/CHANGELOG.md +++ b/plugins/cloudbuild/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-cloudbuild +## 0.3.16 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.18 + ## 0.3.16-next.2 ### Patch Changes diff --git a/plugins/cloudbuild/package.json b/plugins/cloudbuild/package.json index 04fa511cb6..153c0a69b6 100644 --- a/plugins/cloudbuild/package.json +++ b/plugins/cloudbuild/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-cloudbuild", "description": "A Backstage plugin that integrates towards Google Cloud Build", - "version": "0.3.16-next.2", + "version": "0.3.16", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/code-climate/CHANGELOG.md b/plugins/code-climate/CHANGELOG.md index e98be293b8..59599c528e 100644 --- a/plugins/code-climate/CHANGELOG.md +++ b/plugins/code-climate/CHANGELOG.md @@ -1,5 +1,18 @@ # @backstage/plugin-code-climate +## 0.1.16 + +### Patch Changes + +- cb8ec97cdeb: Change black & white colors to be theme aware +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.18 + ## 0.1.16-next.2 ### Patch Changes diff --git a/plugins/code-climate/package.json b/plugins/code-climate/package.json index 9890f8b95e..9ba3f290cf 100644 --- a/plugins/code-climate/package.json +++ b/plugins/code-climate/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-code-climate", - "version": "0.1.16-next.2", + "version": "0.1.16", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/code-coverage-backend/CHANGELOG.md b/plugins/code-coverage-backend/CHANGELOG.md index 74336f32c8..65a9ce5a60 100644 --- a/plugins/code-coverage-backend/CHANGELOG.md +++ b/plugins/code-coverage-backend/CHANGELOG.md @@ -1,5 +1,18 @@ # @backstage/plugin-code-coverage-backend +## 0.2.9 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/catalog-client@1.4.0 + - @backstage/backend-common@0.18.3 + - @backstage/errors@1.1.5 + - @backstage/catalog-model@1.2.1 + - @backstage/integration@1.4.3 + - @backstage/config@1.0.7 + ## 0.2.9-next.2 ### Patch Changes diff --git a/plugins/code-coverage-backend/package.json b/plugins/code-coverage-backend/package.json index fca52bdebc..affbfb79b9 100644 --- a/plugins/code-coverage-backend/package.json +++ b/plugins/code-coverage-backend/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-code-coverage-backend", "description": "A Backstage backend plugin that helps you keep track of your code coverage", - "version": "0.2.9-next.2", + "version": "0.2.9", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/code-coverage/CHANGELOG.md b/plugins/code-coverage/CHANGELOG.md index 914768f638..8782089171 100644 --- a/plugins/code-coverage/CHANGELOG.md +++ b/plugins/code-coverage/CHANGELOG.md @@ -1,5 +1,20 @@ # @backstage/plugin-code-coverage +## 0.2.9 + +### Patch Changes + +- cb8ec97cdeb: Change black & white colors to be theme aware +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/errors@1.1.5 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/theme@0.2.18 + ## 0.2.9-next.2 ### Patch Changes diff --git a/plugins/code-coverage/package.json b/plugins/code-coverage/package.json index cfdddfc6af..b51862702c 100644 --- a/plugins/code-coverage/package.json +++ b/plugins/code-coverage/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-code-coverage", "description": "A Backstage plugin that helps you keep track of your code coverage", - "version": "0.2.9-next.2", + "version": "0.2.9", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/codescene/CHANGELOG.md b/plugins/codescene/CHANGELOG.md index 7390729c48..b6f69daacb 100644 --- a/plugins/codescene/CHANGELOG.md +++ b/plugins/codescene/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-codescene +## 0.1.11 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/errors@1.1.5 + - @backstage/core-plugin-api@1.5.0 + - @backstage/config@1.0.7 + - @backstage/theme@0.2.18 + ## 0.1.11-next.2 ### Patch Changes diff --git a/plugins/codescene/package.json b/plugins/codescene/package.json index 49cedd3bc4..f7d132affa 100644 --- a/plugins/codescene/package.json +++ b/plugins/codescene/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-codescene", - "version": "0.1.11-next.2", + "version": "0.1.11", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/config-schema/CHANGELOG.md b/plugins/config-schema/CHANGELOG.md index 5e0de80621..e78a82a633 100644 --- a/plugins/config-schema/CHANGELOG.md +++ b/plugins/config-schema/CHANGELOG.md @@ -1,5 +1,18 @@ # @backstage/plugin-config-schema +## 0.1.39 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/errors@1.1.5 + - @backstage/core-plugin-api@1.5.0 + - @backstage/config@1.0.7 + - @backstage/theme@0.2.18 + - @backstage/types@1.0.2 + ## 0.1.39-next.2 ### Patch Changes diff --git a/plugins/config-schema/package.json b/plugins/config-schema/package.json index 730265cbea..cb543cd3a2 100644 --- a/plugins/config-schema/package.json +++ b/plugins/config-schema/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-config-schema", "description": "A Backstage plugin that lets you browse the configuration schema of your app", - "version": "0.1.39-next.2", + "version": "0.1.39", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/cost-insights/CHANGELOG.md b/plugins/cost-insights/CHANGELOG.md index f108804cb6..2cf77c9aa9 100644 --- a/plugins/cost-insights/CHANGELOG.md +++ b/plugins/cost-insights/CHANGELOG.md @@ -1,5 +1,20 @@ # @backstage/plugin-cost-insights +## 0.12.5 + +### Patch Changes + +- 928a12a9b3e: Internal refactor of `/alpha` exports. +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/theme@0.2.18 + - @backstage/plugin-cost-insights-common@0.1.1 + ## 0.12.5-next.2 ### Patch Changes diff --git a/plugins/cost-insights/package.json b/plugins/cost-insights/package.json index aabd4d340d..6d35d006a9 100644 --- a/plugins/cost-insights/package.json +++ b/plugins/cost-insights/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-cost-insights", "description": "A Backstage plugin that helps you keep track of your cloud spend", - "version": "0.12.5-next.2", + "version": "0.12.5", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/dynatrace/CHANGELOG.md b/plugins/dynatrace/CHANGELOG.md index 402ee43c1e..451da29bf0 100644 --- a/plugins/dynatrace/CHANGELOG.md +++ b/plugins/dynatrace/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-dynatrace +## 3.0.0 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.18 + ## 3.0.0-next.2 ### Patch Changes diff --git a/plugins/dynatrace/package.json b/plugins/dynatrace/package.json index c66ef32c7b..b4a9e76c59 100644 --- a/plugins/dynatrace/package.json +++ b/plugins/dynatrace/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-dynatrace", - "version": "3.0.0-next.2", + "version": "3.0.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/entity-feedback-backend/CHANGELOG.md b/plugins/entity-feedback-backend/CHANGELOG.md index cac724d7ef..2bf4189393 100644 --- a/plugins/entity-feedback-backend/CHANGELOG.md +++ b/plugins/entity-feedback-backend/CHANGELOG.md @@ -1,5 +1,18 @@ # @backstage/plugin-entity-feedback-backend +## 0.1.1 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/catalog-client@1.4.0 + - @backstage/plugin-auth-node@0.2.12 + - @backstage/backend-common@0.18.3 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/plugin-entity-feedback-common@0.1.0 + ## 0.1.1-next.2 ### Patch Changes diff --git a/plugins/entity-feedback-backend/package.json b/plugins/entity-feedback-backend/package.json index b482fdb212..48ab43af9f 100644 --- a/plugins/entity-feedback-backend/package.json +++ b/plugins/entity-feedback-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-entity-feedback-backend", - "version": "0.1.1-next.2", + "version": "0.1.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/entity-feedback/CHANGELOG.md b/plugins/entity-feedback/CHANGELOG.md index 72cb7b272a..e19b5e17b1 100644 --- a/plugins/entity-feedback/CHANGELOG.md +++ b/plugins/entity-feedback/CHANGELOG.md @@ -1,5 +1,19 @@ # @backstage/plugin-entity-feedback +## 0.1.1 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/errors@1.1.5 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.18 + - @backstage/plugin-entity-feedback-common@0.1.0 + ## 0.1.1-next.2 ### Patch Changes diff --git a/plugins/entity-feedback/package.json b/plugins/entity-feedback/package.json index 760b192440..ba88e02b70 100644 --- a/plugins/entity-feedback/package.json +++ b/plugins/entity-feedback/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-entity-feedback", - "version": "0.1.1-next.2", + "version": "0.1.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/entity-validation/CHANGELOG.md b/plugins/entity-validation/CHANGELOG.md index 43ecb6527d..a714918b45 100644 --- a/plugins/entity-validation/CHANGELOG.md +++ b/plugins/entity-validation/CHANGELOG.md @@ -1,5 +1,22 @@ # @backstage/plugin-entity-validation +## 0.1.1 + +### Patch Changes + +- 47d246691ac: Fixed bug in EntityVaidation plugin where string in text box was unable to be updated. +- c10384a9235: Switch to using `LinkButton` instead of the deprecated `Button` +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/catalog-client@1.4.0 + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/errors@1.1.5 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/plugin-catalog-common@1.0.12 + - @backstage/theme@0.2.18 + ## 0.1.1-next.2 ### Patch Changes diff --git a/plugins/entity-validation/package.json b/plugins/entity-validation/package.json index 81c13cc46b..c7cd754547 100644 --- a/plugins/entity-validation/package.json +++ b/plugins/entity-validation/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-entity-validation", - "version": "0.1.1-next.2", + "version": "0.1.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/events-backend-module-aws-sqs/CHANGELOG.md b/plugins/events-backend-module-aws-sqs/CHANGELOG.md index 0e5659c538..ac076e463b 100644 --- a/plugins/events-backend-module-aws-sqs/CHANGELOG.md +++ b/plugins/events-backend-module-aws-sqs/CHANGELOG.md @@ -1,5 +1,19 @@ # @backstage/plugin-events-backend-module-aws-sqs +## 0.1.5 + +### Patch Changes + +- a5de745ac17: Renamed `awsSqsConsumingEventPublisherEventsModule` to `eventsModuleAwsSqsConsumingEventPublisher` to match the [recommended naming patterns](https://backstage.io/docs/backend-system/architecture/naming-patterns). +- 928a12a9b3e: Internal refactor of `/alpha` exports. +- Updated dependencies + - @backstage/backend-tasks@0.5.0 + - @backstage/backend-common@0.18.3 + - @backstage/backend-plugin-api@0.5.0 + - @backstage/plugin-events-node@0.2.4 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + ## 0.1.5-next.2 ### Patch Changes diff --git a/plugins/events-backend-module-aws-sqs/package.json b/plugins/events-backend-module-aws-sqs/package.json index 9278099801..046d3363d2 100644 --- a/plugins/events-backend-module-aws-sqs/package.json +++ b/plugins/events-backend-module-aws-sqs/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-events-backend-module-aws-sqs", - "version": "0.1.5-next.2", + "version": "0.1.5", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/events-backend-module-azure/CHANGELOG.md b/plugins/events-backend-module-azure/CHANGELOG.md index 159603d965..cf3de9b750 100644 --- a/plugins/events-backend-module-azure/CHANGELOG.md +++ b/plugins/events-backend-module-azure/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-events-backend-module-azure +## 0.1.5 + +### Patch Changes + +- a5de745ac17: Renamed `azureDevOpsEventRouterEventsModule` to `eventsModuleAzureDevOpsEventRouter` to match the [recommended naming patterns](https://backstage.io/docs/backend-system/architecture/naming-patterns). +- 928a12a9b3e: Internal refactor of `/alpha` exports. +- Updated dependencies + - @backstage/backend-plugin-api@0.5.0 + - @backstage/plugin-events-node@0.2.4 + ## 0.1.5-next.2 ### Patch Changes diff --git a/plugins/events-backend-module-azure/package.json b/plugins/events-backend-module-azure/package.json index ef00f0f3b9..6ac861253a 100644 --- a/plugins/events-backend-module-azure/package.json +++ b/plugins/events-backend-module-azure/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-events-backend-module-azure", - "version": "0.1.5-next.2", + "version": "0.1.5", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/events-backend-module-bitbucket-cloud/CHANGELOG.md b/plugins/events-backend-module-bitbucket-cloud/CHANGELOG.md index 9cf0d0a70e..be247852e9 100644 --- a/plugins/events-backend-module-bitbucket-cloud/CHANGELOG.md +++ b/plugins/events-backend-module-bitbucket-cloud/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-events-backend-module-bitbucket-cloud +## 0.1.5 + +### Patch Changes + +- a5de745ac17: Renamed `bitbucketCloudEventRouterEventsModule` to `eventsModuleBitbucketCloudEventRouter` to match the [recommended naming patterns](https://backstage.io/docs/backend-system/architecture/naming-patterns). +- 928a12a9b3e: Internal refactor of `/alpha` exports. +- Updated dependencies + - @backstage/backend-plugin-api@0.5.0 + - @backstage/plugin-events-node@0.2.4 + ## 0.1.5-next.2 ### Patch Changes diff --git a/plugins/events-backend-module-bitbucket-cloud/package.json b/plugins/events-backend-module-bitbucket-cloud/package.json index fa7dba892e..5a908876cb 100644 --- a/plugins/events-backend-module-bitbucket-cloud/package.json +++ b/plugins/events-backend-module-bitbucket-cloud/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-events-backend-module-bitbucket-cloud", - "version": "0.1.5-next.2", + "version": "0.1.5", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/events-backend-module-gerrit/CHANGELOG.md b/plugins/events-backend-module-gerrit/CHANGELOG.md index accd659217..7388fe6c96 100644 --- a/plugins/events-backend-module-gerrit/CHANGELOG.md +++ b/plugins/events-backend-module-gerrit/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-events-backend-module-gerrit +## 0.1.5 + +### Patch Changes + +- a5de745ac17: Renamed `gerritEventRouterEventsModule` to `eventsModuleGerritEventRouter` to match the [recommended naming patterns](https://backstage.io/docs/backend-system/architecture/naming-patterns). +- 928a12a9b3e: Internal refactor of `/alpha` exports. +- Updated dependencies + - @backstage/backend-plugin-api@0.5.0 + - @backstage/plugin-events-node@0.2.4 + ## 0.1.5-next.2 ### Patch Changes diff --git a/plugins/events-backend-module-gerrit/package.json b/plugins/events-backend-module-gerrit/package.json index de5d104781..3666179cd1 100644 --- a/plugins/events-backend-module-gerrit/package.json +++ b/plugins/events-backend-module-gerrit/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-events-backend-module-gerrit", - "version": "0.1.5-next.2", + "version": "0.1.5", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/events-backend-module-github/CHANGELOG.md b/plugins/events-backend-module-github/CHANGELOG.md index b531c5db52..f20041f8d8 100644 --- a/plugins/events-backend-module-github/CHANGELOG.md +++ b/plugins/events-backend-module-github/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-events-backend-module-github +## 0.1.5 + +### Patch Changes + +- a5de745ac17: Renamed `githubEventRouterEventsModule` to `eventsModuleGithubEventRouter` and `githubWebhookEventsModule` to `eventsModuleGithubWebhook`, to match the [recommended naming patterns](https://backstage.io/docs/backend-system/architecture/naming-patterns). +- 928a12a9b3e: Internal refactor of `/alpha` exports. +- Updated dependencies + - @backstage/backend-plugin-api@0.5.0 + - @backstage/plugin-events-node@0.2.4 + - @backstage/config@1.0.7 + ## 0.1.5-next.2 ### Patch Changes diff --git a/plugins/events-backend-module-github/package.json b/plugins/events-backend-module-github/package.json index 4a010f5841..cbe8713836 100644 --- a/plugins/events-backend-module-github/package.json +++ b/plugins/events-backend-module-github/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-events-backend-module-github", - "version": "0.1.5-next.2", + "version": "0.1.5", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/events-backend-module-gitlab/CHANGELOG.md b/plugins/events-backend-module-gitlab/CHANGELOG.md index f992585219..6d9895360d 100644 --- a/plugins/events-backend-module-gitlab/CHANGELOG.md +++ b/plugins/events-backend-module-gitlab/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-events-backend-module-gitlab +## 0.1.5 + +### Patch Changes + +- a5de745ac17: Renamed `gitlabEventRouterEventsModule` to `eventsModuleGitlabEventRouter` and `gitlabWebhookEventsModule` to `eventsModuleGitlabWebhook` to match the [recommended naming patterns](https://backstage.io/docs/backend-system/architecture/naming-patterns). +- 928a12a9b3e: Internal refactor of `/alpha` exports. +- Updated dependencies + - @backstage/backend-plugin-api@0.5.0 + - @backstage/plugin-events-node@0.2.4 + - @backstage/config@1.0.7 + ## 0.1.5-next.2 ### Patch Changes diff --git a/plugins/events-backend-module-gitlab/package.json b/plugins/events-backend-module-gitlab/package.json index 917f9fdb89..420bbb782e 100644 --- a/plugins/events-backend-module-gitlab/package.json +++ b/plugins/events-backend-module-gitlab/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-events-backend-module-gitlab", - "version": "0.1.5-next.2", + "version": "0.1.5", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/events-backend-test-utils/CHANGELOG.md b/plugins/events-backend-test-utils/CHANGELOG.md index aaf14aa68b..dad7faf979 100644 --- a/plugins/events-backend-test-utils/CHANGELOG.md +++ b/plugins/events-backend-test-utils/CHANGELOG.md @@ -1,5 +1,12 @@ # @backstage/plugin-events-backend-test-utils +## 0.1.5 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-events-node@0.2.4 + ## 0.1.5-next.2 ### Patch Changes diff --git a/plugins/events-backend-test-utils/package.json b/plugins/events-backend-test-utils/package.json index 67d6671497..77cecd0219 100644 --- a/plugins/events-backend-test-utils/package.json +++ b/plugins/events-backend-test-utils/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-events-backend-test-utils", "description": "The plugin-events-backend-test-utils for @backstage/plugin-events-node", - "version": "0.1.5-next.2", + "version": "0.1.5", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/events-backend/CHANGELOG.md b/plugins/events-backend/CHANGELOG.md index 82fb0c6fc1..0b72628ccf 100644 --- a/plugins/events-backend/CHANGELOG.md +++ b/plugins/events-backend/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-events-backend +## 0.2.4 + +### Patch Changes + +- 928a12a9b3e: Internal refactor of `/alpha` exports. +- a5de745ac17: Updated README instructions +- Updated dependencies + - @backstage/backend-common@0.18.3 + - @backstage/backend-plugin-api@0.5.0 + - @backstage/plugin-events-node@0.2.4 + - @backstage/config@1.0.7 + ## 0.2.4-next.2 ### Patch Changes diff --git a/plugins/events-backend/package.json b/plugins/events-backend/package.json index 4a51e56b6a..d2abad4cb8 100644 --- a/plugins/events-backend/package.json +++ b/plugins/events-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-events-backend", - "version": "0.2.4-next.2", + "version": "0.2.4", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/events-node/CHANGELOG.md b/plugins/events-node/CHANGELOG.md index a19d9badc2..9b1599c25a 100644 --- a/plugins/events-node/CHANGELOG.md +++ b/plugins/events-node/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-events-node +## 0.2.4 + +### Patch Changes + +- 928a12a9b3e: Internal refactor of `/alpha` exports. +- Updated dependencies + - @backstage/backend-plugin-api@0.5.0 + ## 0.2.4-next.2 ### Patch Changes diff --git a/plugins/events-node/package.json b/plugins/events-node/package.json index 76eb1b2bf3..22c64dd012 100644 --- a/plugins/events-node/package.json +++ b/plugins/events-node/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-events-node", "description": "The plugin-events-node module for @backstage/plugin-events-backend", - "version": "0.2.4-next.2", + "version": "0.2.4", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/example-todo-list-backend/CHANGELOG.md b/plugins/example-todo-list-backend/CHANGELOG.md index edde9b9d54..65488cd80e 100644 --- a/plugins/example-todo-list-backend/CHANGELOG.md +++ b/plugins/example-todo-list-backend/CHANGELOG.md @@ -1,5 +1,16 @@ # @internal/plugin-todo-list-backend +## 1.0.11 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.2.12 + - @backstage/backend-common@0.18.3 + - @backstage/errors@1.1.5 + - @backstage/backend-plugin-api@0.5.0 + - @backstage/config@1.0.7 + ## 1.0.11-next.2 ### Patch Changes diff --git a/plugins/example-todo-list-backend/package.json b/plugins/example-todo-list-backend/package.json index 5579f748b2..8baa490b31 100644 --- a/plugins/example-todo-list-backend/package.json +++ b/plugins/example-todo-list-backend/package.json @@ -1,6 +1,6 @@ { "name": "@internal/plugin-todo-list-backend", - "version": "1.0.11-next.2", + "version": "1.0.11", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/example-todo-list-common/CHANGELOG.md b/plugins/example-todo-list-common/CHANGELOG.md index 2596387d2d..40909ff841 100644 --- a/plugins/example-todo-list-common/CHANGELOG.md +++ b/plugins/example-todo-list-common/CHANGELOG.md @@ -1,5 +1,12 @@ # @internal/plugin-todo-list-common +## 1.0.9 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-permission-common@0.7.4 + ## 1.0.9-next.0 ### Patch Changes diff --git a/plugins/example-todo-list-common/package.json b/plugins/example-todo-list-common/package.json index 5463a19348..7c48939e8b 100644 --- a/plugins/example-todo-list-common/package.json +++ b/plugins/example-todo-list-common/package.json @@ -1,6 +1,6 @@ { "name": "@internal/plugin-todo-list-common", - "version": "1.0.9-next.0", + "version": "1.0.9", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/example-todo-list/CHANGELOG.md b/plugins/example-todo-list/CHANGELOG.md index 4739ab303e..022a8e8fb3 100644 --- a/plugins/example-todo-list/CHANGELOG.md +++ b/plugins/example-todo-list/CHANGELOG.md @@ -1,5 +1,14 @@ # @internal/plugin-todo-list +## 1.0.11 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/core-plugin-api@1.5.0 + - @backstage/theme@0.2.18 + ## 1.0.11-next.2 ### Patch Changes diff --git a/plugins/example-todo-list/package.json b/plugins/example-todo-list/package.json index a7366ce36f..9c90b71b52 100644 --- a/plugins/example-todo-list/package.json +++ b/plugins/example-todo-list/package.json @@ -1,6 +1,6 @@ { "name": "@internal/plugin-todo-list", - "version": "1.0.11-next.2", + "version": "1.0.11", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/explore-backend/CHANGELOG.md b/plugins/explore-backend/CHANGELOG.md index 7874062954..be73174a06 100644 --- a/plugins/explore-backend/CHANGELOG.md +++ b/plugins/explore-backend/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-explore-backend +## 0.0.5 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/backend-common@0.18.3 + - @backstage/config@1.0.7 + - @backstage/plugin-explore-common@0.0.1 + - @backstage/plugin-search-common@1.2.2 + ## 0.0.5-next.2 ### Patch Changes diff --git a/plugins/explore-backend/package.json b/plugins/explore-backend/package.json index dbdab19329..00629c8da4 100644 --- a/plugins/explore-backend/package.json +++ b/plugins/explore-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-explore-backend", - "version": "0.0.5-next.2", + "version": "0.0.5", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/explore-react/CHANGELOG.md b/plugins/explore-react/CHANGELOG.md index 1f68752e6e..954492e81e 100644 --- a/plugins/explore-react/CHANGELOG.md +++ b/plugins/explore-react/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-explore-react +## 0.0.27 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-plugin-api@1.5.0 + - @backstage/plugin-explore-common@0.0.1 + ## 0.0.27-next.2 ### Patch Changes diff --git a/plugins/explore-react/package.json b/plugins/explore-react/package.json index 6bb7ad5f0a..fbbde21b0f 100644 --- a/plugins/explore-react/package.json +++ b/plugins/explore-react/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-explore-react", "description": "A frontend library for Backstage plugins that want to interact with the explore plugin", - "version": "0.0.27-next.2", + "version": "0.0.27", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/explore/CHANGELOG.md b/plugins/explore/CHANGELOG.md index 72d93cf927..46cf23bc90 100644 --- a/plugins/explore/CHANGELOG.md +++ b/plugins/explore/CHANGELOG.md @@ -1,5 +1,26 @@ # @backstage/plugin-explore +## 0.4.1 + +### Patch Changes + +- 65454876fb2: Minor API report tweaks +- cb8ec97cdeb: Change black & white colors to be theme aware +- c10384a9235: Switch to using `LinkButton` instead of the deprecated `Button` +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- 3f75b7607ca: Add ability to pass icon as function to have ability to customize it by search item +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/plugin-search-react@1.5.1 + - @backstage/errors@1.1.5 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/plugin-explore-react@0.0.27 + - @backstage/theme@0.2.18 + - @backstage/plugin-explore-common@0.0.1 + - @backstage/plugin-search-common@1.2.2 + ## 0.4.1-next.2 ### Patch Changes diff --git a/plugins/explore/package.json b/plugins/explore/package.json index c91671c816..d14a276ecc 100644 --- a/plugins/explore/package.json +++ b/plugins/explore/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-explore", "description": "A Backstage plugin for building an exploration page of your software ecosystem", - "version": "0.4.1-next.2", + "version": "0.4.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/firehydrant/CHANGELOG.md b/plugins/firehydrant/CHANGELOG.md index 1fbf09d8d4..2987daa5ff 100644 --- a/plugins/firehydrant/CHANGELOG.md +++ b/plugins/firehydrant/CHANGELOG.md @@ -1,5 +1,22 @@ # @backstage/plugin-firehydrant +## 0.2.0 + +### Minor Changes + +- e2e3dd08a54: Allow firehydrant to use component annotation + +### Patch Changes + +- cb8ec97cdeb: Change black & white colors to be theme aware +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.18 + ## 0.1.33-next.2 ### Patch Changes diff --git a/plugins/firehydrant/package.json b/plugins/firehydrant/package.json index 8084876f69..0aacc34906 100644 --- a/plugins/firehydrant/package.json +++ b/plugins/firehydrant/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-firehydrant", "description": "A Backstage plugin that integrates towards FireHydrant", - "version": "0.1.33-next.2", + "version": "0.2.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/fossa/CHANGELOG.md b/plugins/fossa/CHANGELOG.md index af439b6fd0..7c713d6730 100644 --- a/plugins/fossa/CHANGELOG.md +++ b/plugins/fossa/CHANGELOG.md @@ -1,5 +1,18 @@ # @backstage/plugin-fossa +## 0.2.48 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/errors@1.1.5 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.18 + ## 0.2.48-next.2 ### Patch Changes diff --git a/plugins/fossa/package.json b/plugins/fossa/package.json index 1135c76bb1..8d4b8bb7aa 100644 --- a/plugins/fossa/package.json +++ b/plugins/fossa/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-fossa", "description": "A Backstage plugin that integrates towards FOSSA", - "version": "0.2.48-next.2", + "version": "0.2.48", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/gcalendar/CHANGELOG.md b/plugins/gcalendar/CHANGELOG.md index 2460deb73c..d9d1021f02 100644 --- a/plugins/gcalendar/CHANGELOG.md +++ b/plugins/gcalendar/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-gcalendar +## 0.3.12 + +### Patch Changes + +- cb8ec97cdeb: Change black & white colors to be theme aware +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/errors@1.1.5 + - @backstage/core-plugin-api@1.5.0 + - @backstage/theme@0.2.18 + ## 0.3.12-next.2 ### Patch Changes diff --git a/plugins/gcalendar/package.json b/plugins/gcalendar/package.json index 83471340b8..603936d75a 100644 --- a/plugins/gcalendar/package.json +++ b/plugins/gcalendar/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-gcalendar", - "version": "0.3.12-next.2", + "version": "0.3.12", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/gcp-projects/CHANGELOG.md b/plugins/gcp-projects/CHANGELOG.md index ecb3ec60fc..b501db40d7 100644 --- a/plugins/gcp-projects/CHANGELOG.md +++ b/plugins/gcp-projects/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-gcp-projects +## 0.3.35 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/core-plugin-api@1.5.0 + - @backstage/theme@0.2.18 + ## 0.3.35-next.2 ### Patch Changes diff --git a/plugins/gcp-projects/package.json b/plugins/gcp-projects/package.json index 1029b37cd0..162aff640c 100644 --- a/plugins/gcp-projects/package.json +++ b/plugins/gcp-projects/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-gcp-projects", "description": "A Backstage plugin that helps you manage projects in GCP", - "version": "0.3.35-next.2", + "version": "0.3.35", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/git-release-manager/CHANGELOG.md b/plugins/git-release-manager/CHANGELOG.md index c97568b076..cec4a630bc 100644 --- a/plugins/git-release-manager/CHANGELOG.md +++ b/plugins/git-release-manager/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-git-release-manager +## 0.3.29 + +### Patch Changes + +- cb8ec97cdeb: Change black & white colors to be theme aware +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/core-plugin-api@1.5.0 + - @backstage/integration@1.4.3 + - @backstage/theme@0.2.18 + ## 0.3.29-next.2 ### Patch Changes diff --git a/plugins/git-release-manager/package.json b/plugins/git-release-manager/package.json index 0c9507bc24..53fca75a4f 100644 --- a/plugins/git-release-manager/package.json +++ b/plugins/git-release-manager/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-git-release-manager", "description": "A Backstage plugin that helps you manage releases in git", - "version": "0.3.29-next.2", + "version": "0.3.29", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/github-actions/CHANGELOG.md b/plugins/github-actions/CHANGELOG.md index ffec353673..a8cf2cd18f 100644 --- a/plugins/github-actions/CHANGELOG.md +++ b/plugins/github-actions/CHANGELOG.md @@ -1,5 +1,18 @@ # @backstage/plugin-github-actions +## 0.5.16 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/integration@1.4.3 + - @backstage/theme@0.2.18 + ## 0.5.16-next.2 ### Patch Changes diff --git a/plugins/github-actions/package.json b/plugins/github-actions/package.json index d26249218e..48f20a6722 100644 --- a/plugins/github-actions/package.json +++ b/plugins/github-actions/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-github-actions", "description": "A Backstage plugin that integrates towards GitHub Actions", - "version": "0.5.16-next.2", + "version": "0.5.16", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/github-deployments/CHANGELOG.md b/plugins/github-deployments/CHANGELOG.md index cc8c6a838e..a66a149b8b 100644 --- a/plugins/github-deployments/CHANGELOG.md +++ b/plugins/github-deployments/CHANGELOG.md @@ -1,5 +1,20 @@ # @backstage/plugin-github-deployments +## 0.1.47 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/errors@1.1.5 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/integration-react@1.1.11 + - @backstage/integration@1.4.3 + - @backstage/theme@0.2.18 + ## 0.1.47-next.2 ### Patch Changes diff --git a/plugins/github-deployments/package.json b/plugins/github-deployments/package.json index f9019b5029..0d56c6bb1b 100644 --- a/plugins/github-deployments/package.json +++ b/plugins/github-deployments/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-github-deployments", "description": "A Backstage plugin that integrates towards GitHub Deployments", - "version": "0.1.47-next.2", + "version": "0.1.47", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/github-issues/CHANGELOG.md b/plugins/github-issues/CHANGELOG.md index 5a440a28f3..46352a55d2 100644 --- a/plugins/github-issues/CHANGELOG.md +++ b/plugins/github-issues/CHANGELOG.md @@ -1,5 +1,19 @@ # @backstage/plugin-github-issues +## 0.2.5 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/errors@1.1.5 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/integration@1.4.3 + - @backstage/theme@0.2.18 + ## 0.2.5-next.2 ### Patch Changes diff --git a/plugins/github-issues/package.json b/plugins/github-issues/package.json index 83e457a606..419a5babcb 100644 --- a/plugins/github-issues/package.json +++ b/plugins/github-issues/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-github-issues", - "version": "0.2.5-next.2", + "version": "0.2.5", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/github-pull-requests-board/CHANGELOG.md b/plugins/github-pull-requests-board/CHANGELOG.md index ae15428eed..3480ae5f6e 100644 --- a/plugins/github-pull-requests-board/CHANGELOG.md +++ b/plugins/github-pull-requests-board/CHANGELOG.md @@ -1,5 +1,18 @@ # @backstage/plugin-github-pull-requests-board +## 0.1.10 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/integration@1.4.3 + - @backstage/theme@0.2.18 + ## 0.1.10-next.2 ### Patch Changes diff --git a/plugins/github-pull-requests-board/package.json b/plugins/github-pull-requests-board/package.json index ff5393988b..689359ba1a 100644 --- a/plugins/github-pull-requests-board/package.json +++ b/plugins/github-pull-requests-board/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-github-pull-requests-board", "description": "A Backstage plugin that allows you to see all open Pull Requests for all the repositories owned by your team", - "version": "0.1.10-next.2", + "version": "0.1.10", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/gitops-profiles/CHANGELOG.md b/plugins/gitops-profiles/CHANGELOG.md index 8522e1e16c..5c7f777ddc 100644 --- a/plugins/gitops-profiles/CHANGELOG.md +++ b/plugins/gitops-profiles/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-gitops-profiles +## 0.3.34 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/core-plugin-api@1.5.0 + - @backstage/theme@0.2.18 + ## 0.3.34-next.2 ### Patch Changes diff --git a/plugins/gitops-profiles/package.json b/plugins/gitops-profiles/package.json index 291b73b308..d61efb7706 100644 --- a/plugins/gitops-profiles/package.json +++ b/plugins/gitops-profiles/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-gitops-profiles", "description": "A Backstage plugin that helps you manage GitOps profiles", - "version": "0.3.34-next.2", + "version": "0.3.34", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/gocd/CHANGELOG.md b/plugins/gocd/CHANGELOG.md index 71d7aa3af0..544bb848dc 100644 --- a/plugins/gocd/CHANGELOG.md +++ b/plugins/gocd/CHANGELOG.md @@ -1,5 +1,18 @@ # @backstage/plugin-gocd +## 0.1.22 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/errors@1.1.5 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.18 + ## 0.1.22-next.2 ### Patch Changes diff --git a/plugins/gocd/package.json b/plugins/gocd/package.json index f9789ffde4..e5727302f6 100644 --- a/plugins/gocd/package.json +++ b/plugins/gocd/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-gocd", "description": "A Backstage plugin that integrates towards GoCD", - "version": "0.1.22-next.2", + "version": "0.1.22", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/graphiql/CHANGELOG.md b/plugins/graphiql/CHANGELOG.md index f110d7b813..35d00a5080 100644 --- a/plugins/graphiql/CHANGELOG.md +++ b/plugins/graphiql/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-graphiql +## 0.2.48 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/core-plugin-api@1.5.0 + - @backstage/theme@0.2.18 + ## 0.2.48-next.2 ### Patch Changes diff --git a/plugins/graphiql/package.json b/plugins/graphiql/package.json index a608ecb8db..a91f8647ec 100644 --- a/plugins/graphiql/package.json +++ b/plugins/graphiql/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-graphiql", "description": "Backstage plugin for browsing GraphQL APIs", - "version": "0.2.48-next.2", + "version": "0.2.48", "publishConfig": { "access": "public", "main": "dist/index.esm.js", diff --git a/plugins/graphql-backend/CHANGELOG.md b/plugins/graphql-backend/CHANGELOG.md index 0ab0918031..87f2fe54e0 100644 --- a/plugins/graphql-backend/CHANGELOG.md +++ b/plugins/graphql-backend/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-graphql-backend +## 0.1.33 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/backend-common@0.18.3 + - @backstage/plugin-catalog-graphql@0.3.19 + - @backstage/config@1.0.7 + ## 0.1.33-next.2 ### Patch Changes diff --git a/plugins/graphql-backend/package.json b/plugins/graphql-backend/package.json index 401119b052..10e3f6eca6 100644 --- a/plugins/graphql-backend/package.json +++ b/plugins/graphql-backend/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-graphql-backend", "description": "An experimental Backstage backend plugin for GraphQL", - "version": "0.1.33-next.2", + "version": "0.1.33", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/graphql-voyager/CHANGELOG.md b/plugins/graphql-voyager/CHANGELOG.md index 982dfec9dc..43d2b66fd8 100644 --- a/plugins/graphql-voyager/CHANGELOG.md +++ b/plugins/graphql-voyager/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-graphql-voyager +## 0.1.1 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/core-plugin-api@1.5.0 + - @backstage/theme@0.2.18 + ## 0.1.1-next.2 ### Patch Changes diff --git a/plugins/graphql-voyager/package.json b/plugins/graphql-voyager/package.json index 5d2b809bb3..25f947e455 100644 --- a/plugins/graphql-voyager/package.json +++ b/plugins/graphql-voyager/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-graphql-voyager", "description": "Backstage plugin for GraphQL Voyager", - "version": "0.1.1-next.2", + "version": "0.1.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/home/CHANGELOG.md b/plugins/home/CHANGELOG.md index 51552a0135..1deba56290 100644 --- a/plugins/home/CHANGELOG.md +++ b/plugins/home/CHANGELOG.md @@ -1,5 +1,18 @@ # @backstage/plugin-home +## 0.4.32 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/theme@0.2.18 + ## 0.4.32-next.2 ### Patch Changes diff --git a/plugins/home/package.json b/plugins/home/package.json index 2957625478..1896a15006 100644 --- a/plugins/home/package.json +++ b/plugins/home/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-home", "description": "A Backstage plugin that helps you build a home page", - "version": "0.4.32-next.2", + "version": "0.4.32", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/ilert/CHANGELOG.md b/plugins/ilert/CHANGELOG.md index e3d63efd71..ff0683d4a8 100644 --- a/plugins/ilert/CHANGELOG.md +++ b/plugins/ilert/CHANGELOG.md @@ -1,5 +1,19 @@ # @backstage/plugin-ilert +## 0.2.5 + +### Patch Changes + +- cb8ec97cdeb: Change black & white colors to be theme aware +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/errors@1.1.5 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.18 + ## 0.2.5-next.2 ### Patch Changes diff --git a/plugins/ilert/package.json b/plugins/ilert/package.json index cc8183d6cb..903b69523e 100644 --- a/plugins/ilert/package.json +++ b/plugins/ilert/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-ilert", "description": "A Backstage plugin that integrates towards iLert", - "version": "0.2.5-next.2", + "version": "0.2.5", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/jenkins-backend/CHANGELOG.md b/plugins/jenkins-backend/CHANGELOG.md index f18f75d0a4..a9f6bcaac4 100644 --- a/plugins/jenkins-backend/CHANGELOG.md +++ b/plugins/jenkins-backend/CHANGELOG.md @@ -1,5 +1,20 @@ # @backstage/plugin-jenkins-backend +## 0.1.33 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/catalog-client@1.4.0 + - @backstage/plugin-auth-node@0.2.12 + - @backstage/backend-common@0.18.3 + - @backstage/errors@1.1.5 + - @backstage/catalog-model@1.2.1 + - @backstage/plugin-jenkins-common@0.1.14 + - @backstage/plugin-permission-common@0.7.4 + - @backstage/config@1.0.7 + ## 0.1.33-next.2 ### Patch Changes diff --git a/plugins/jenkins-backend/package.json b/plugins/jenkins-backend/package.json index daf5073792..9f85185900 100644 --- a/plugins/jenkins-backend/package.json +++ b/plugins/jenkins-backend/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-jenkins-backend", "description": "A Backstage backend plugin that integrates towards Jenkins", - "version": "0.1.33-next.2", + "version": "0.1.33", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/jenkins-common/CHANGELOG.md b/plugins/jenkins-common/CHANGELOG.md index 820a600fc1..73be4b306c 100644 --- a/plugins/jenkins-common/CHANGELOG.md +++ b/plugins/jenkins-common/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-jenkins-common +## 0.1.14 + +### Patch Changes + +- 928a12a9b3e: Internal refactor of `/alpha` exports. +- Updated dependencies + - @backstage/plugin-catalog-common@1.0.12 + - @backstage/plugin-permission-common@0.7.4 + ## 0.1.14-next.1 ### Patch Changes diff --git a/plugins/jenkins-common/package.json b/plugins/jenkins-common/package.json index 8786afd22c..04cc34b48d 100644 --- a/plugins/jenkins-common/package.json +++ b/plugins/jenkins-common/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-jenkins-common", - "version": "0.1.14-next.1", + "version": "0.1.14", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/jenkins/CHANGELOG.md b/plugins/jenkins/CHANGELOG.md index fe8f1e2d13..19c41d8931 100644 --- a/plugins/jenkins/CHANGELOG.md +++ b/plugins/jenkins/CHANGELOG.md @@ -1,5 +1,20 @@ # @backstage/plugin-jenkins +## 0.7.15 + +### Patch Changes + +- 928a12a9b3e: Internal refactor of `/alpha` exports. +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/errors@1.1.5 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/plugin-jenkins-common@0.1.14 + - @backstage/theme@0.2.18 + ## 0.7.15-next.2 ### Patch Changes diff --git a/plugins/jenkins/package.json b/plugins/jenkins/package.json index 204d88db60..fbb95c8303 100644 --- a/plugins/jenkins/package.json +++ b/plugins/jenkins/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-jenkins", "description": "A Backstage plugin that integrates towards Jenkins", - "version": "0.7.15-next.2", + "version": "0.7.15", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/kafka-backend/CHANGELOG.md b/plugins/kafka-backend/CHANGELOG.md index 92bcf3de3f..a21c47dd96 100644 --- a/plugins/kafka-backend/CHANGELOG.md +++ b/plugins/kafka-backend/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-kafka-backend +## 0.2.36 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.3 + - @backstage/errors@1.1.5 + - @backstage/backend-plugin-api@0.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + ## 0.2.36-next.2 ### Patch Changes diff --git a/plugins/kafka-backend/package.json b/plugins/kafka-backend/package.json index 38b1f60fcb..3f43fac671 100644 --- a/plugins/kafka-backend/package.json +++ b/plugins/kafka-backend/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-kafka-backend", "description": "A Backstage backend plugin that integrates towards Kafka", - "version": "0.2.36-next.2", + "version": "0.2.36", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/kafka/CHANGELOG.md b/plugins/kafka/CHANGELOG.md index 1706f206e7..0ed581fc62 100644 --- a/plugins/kafka/CHANGELOG.md +++ b/plugins/kafka/CHANGELOG.md @@ -1,5 +1,18 @@ # @backstage/plugin-kafka +## 0.3.16 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/theme@0.2.18 + ## 0.3.16-next.2 ### Patch Changes diff --git a/plugins/kafka/package.json b/plugins/kafka/package.json index 017c14881a..d3eab939e6 100644 --- a/plugins/kafka/package.json +++ b/plugins/kafka/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-kafka", "description": "A Backstage plugin that integrates towards Kafka", - "version": "0.3.16-next.2", + "version": "0.3.16", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/kubernetes-backend/CHANGELOG.md b/plugins/kubernetes-backend/CHANGELOG.md index ac1287f8aa..617a9d16f9 100644 --- a/plugins/kubernetes-backend/CHANGELOG.md +++ b/plugins/kubernetes-backend/CHANGELOG.md @@ -1,5 +1,19 @@ # @backstage/plugin-kubernetes-backend +## 0.9.4 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/catalog-client@1.4.0 + - @backstage/plugin-auth-node@0.2.12 + - @backstage/backend-common@0.18.3 + - @backstage/errors@1.1.5 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/plugin-kubernetes-common@0.6.1 + ## 0.9.4-next.2 ### Patch Changes diff --git a/plugins/kubernetes-backend/package.json b/plugins/kubernetes-backend/package.json index ee7844c76e..850f3c67f4 100644 --- a/plugins/kubernetes-backend/package.json +++ b/plugins/kubernetes-backend/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-kubernetes-backend", "description": "A Backstage backend plugin that integrates towards Kubernetes", - "version": "0.9.4-next.2", + "version": "0.9.4", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/kubernetes-common/CHANGELOG.md b/plugins/kubernetes-common/CHANGELOG.md index 35044f7576..d12719a9f2 100644 --- a/plugins/kubernetes-common/CHANGELOG.md +++ b/plugins/kubernetes-common/CHANGELOG.md @@ -1,5 +1,12 @@ # @backstage/plugin-kubernetes-common +## 0.6.1 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.2.1 + ## 0.6.1-next.1 ### Patch Changes diff --git a/plugins/kubernetes-common/package.json b/plugins/kubernetes-common/package.json index e100b64500..2d83db84d4 100644 --- a/plugins/kubernetes-common/package.json +++ b/plugins/kubernetes-common/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-kubernetes-common", "description": "Common functionalities for kubernetes, to be shared between kubernetes and kubernetes-backend plugin", - "version": "0.6.1-next.1", + "version": "0.6.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/kubernetes/CHANGELOG.md b/plugins/kubernetes/CHANGELOG.md index 05929a7d46..02dbba634d 100644 --- a/plugins/kubernetes/CHANGELOG.md +++ b/plugins/kubernetes/CHANGELOG.md @@ -1,5 +1,21 @@ # @backstage/plugin-kubernetes +## 0.7.9 + +### Patch Changes + +- 8adeb19b37d: GitLab can now be used as an `oidcTokenProvider` for Kubernetes clusters +- c10384a9235: Switch to using `LinkButton` instead of the deprecated `Button` +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/theme@0.2.18 + - @backstage/plugin-kubernetes-common@0.6.1 + ## 0.7.9-next.2 ### Patch Changes diff --git a/plugins/kubernetes/package.json b/plugins/kubernetes/package.json index ed806ee521..b22d50681d 100644 --- a/plugins/kubernetes/package.json +++ b/plugins/kubernetes/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-kubernetes", "description": "A Backstage plugin that integrates towards Kubernetes", - "version": "0.7.9-next.2", + "version": "0.7.9", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/lighthouse-backend/CHANGELOG.md b/plugins/lighthouse-backend/CHANGELOG.md index 0caf949bd6..860493f57b 100644 --- a/plugins/lighthouse-backend/CHANGELOG.md +++ b/plugins/lighthouse-backend/CHANGELOG.md @@ -1,5 +1,19 @@ # @backstage/plugin-lighthouse-backend +## 0.1.1 + +### Patch Changes + +- 46829bc2f0e: Update README.md; typo with plugin name & removed unneeded "import { Router } from 'express';" +- Updated dependencies + - @backstage/catalog-client@1.4.0 + - @backstage/backend-tasks@0.5.0 + - @backstage/backend-common@0.18.3 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + - @backstage/plugin-lighthouse-common@0.1.1 + ## 0.1.1-next.2 ### Patch Changes diff --git a/plugins/lighthouse-backend/package.json b/plugins/lighthouse-backend/package.json index 7fa51b3446..d13e1487e9 100644 --- a/plugins/lighthouse-backend/package.json +++ b/plugins/lighthouse-backend/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-lighthouse-backend", "description": "Backend functionalities for lighthouse", - "version": "0.1.1-next.2", + "version": "0.1.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/lighthouse-common/CHANGELOG.md b/plugins/lighthouse-common/CHANGELOG.md index 001182cf98..a44c2b52a6 100644 --- a/plugins/lighthouse-common/CHANGELOG.md +++ b/plugins/lighthouse-common/CHANGELOG.md @@ -1,5 +1,12 @@ # @backstage/plugin-lighthouse-common +## 0.1.1 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.0.7 + ## 0.1.1-next.0 ### Patch Changes diff --git a/plugins/lighthouse-common/package.json b/plugins/lighthouse-common/package.json index cf7a598ce8..9cd13e7510 100644 --- a/plugins/lighthouse-common/package.json +++ b/plugins/lighthouse-common/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-lighthouse-common", "description": "Common functionalities for lighthouse, to be shared between lighthouse and lighthouse-backend plugin", - "version": "0.1.1-next.0", + "version": "0.1.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/lighthouse/CHANGELOG.md b/plugins/lighthouse/CHANGELOG.md index f326707dfa..df404fb220 100644 --- a/plugins/lighthouse/CHANGELOG.md +++ b/plugins/lighthouse/CHANGELOG.md @@ -1,5 +1,19 @@ # @backstage/plugin-lighthouse +## 0.4.1 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/theme@0.2.18 + - @backstage/plugin-lighthouse-common@0.1.1 + ## 0.4.1-next.2 ### Patch Changes diff --git a/plugins/lighthouse/package.json b/plugins/lighthouse/package.json index 3fcb24986d..e9c70378e5 100644 --- a/plugins/lighthouse/package.json +++ b/plugins/lighthouse/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-lighthouse", "description": "A Backstage plugin that integrates towards Lighthouse", - "version": "0.4.1-next.2", + "version": "0.4.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/linguist-backend/CHANGELOG.md b/plugins/linguist-backend/CHANGELOG.md index ac922c735b..e94a176158 100644 --- a/plugins/linguist-backend/CHANGELOG.md +++ b/plugins/linguist-backend/CHANGELOG.md @@ -1,5 +1,33 @@ # @backstage/plugin-linguist-backend +## 0.2.0 + +### Minor Changes + +- 4a1c318853d: **BREAKING** The linguist-backend `createRouter` now requires that the `tokenManger` is passed to the router. + +### Patch Changes + +- 8a298b47240: Added support for linguist-js options using the linguistJSOptions in the plugin, the available config can be found [here](https://www.npmjs.com/package/linguist-js#API). +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- 2ea57821629: Fixed bug in LinguistBackendApi that caused initial batch of entities to be skipped. +- b271d5ca052: Allow kind to be configurable + + ```ts + return createRouter({ schedule: schedule, kind: ['Component'] }, { ...env }); + ``` + +- Updated dependencies + - @backstage/catalog-client@1.4.0 + - @backstage/plugin-auth-node@0.2.12 + - @backstage/backend-tasks@0.5.0 + - @backstage/backend-common@0.18.3 + - @backstage/errors@1.1.5 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + - @backstage/plugin-linguist-common@0.1.0 + ## 0.2.0-next.2 ### Patch Changes diff --git a/plugins/linguist-backend/package.json b/plugins/linguist-backend/package.json index 01c4f12afa..755b1b959a 100644 --- a/plugins/linguist-backend/package.json +++ b/plugins/linguist-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-linguist-backend", - "version": "0.2.0-next.2", + "version": "0.2.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/linguist/CHANGELOG.md b/plugins/linguist/CHANGELOG.md index 3d83855122..d289a06299 100644 --- a/plugins/linguist/CHANGELOG.md +++ b/plugins/linguist/CHANGELOG.md @@ -1,5 +1,20 @@ # @backstage/plugin-linguist +## 0.1.1 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- ab997ce243f: Updated `README.md` to removed images with refresh button as this feature was not implemented in the current version +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/errors@1.1.5 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.18 + - @backstage/plugin-linguist-common@0.1.0 + ## 0.1.1-next.2 ### Patch Changes diff --git a/plugins/linguist/package.json b/plugins/linguist/package.json index 276bb81574..f589b26bd3 100644 --- a/plugins/linguist/package.json +++ b/plugins/linguist/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-linguist", - "version": "0.1.1-next.2", + "version": "0.1.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/microsoft-calendar/CHANGELOG.md b/plugins/microsoft-calendar/CHANGELOG.md index 69a93bc320..93d51a338c 100644 --- a/plugins/microsoft-calendar/CHANGELOG.md +++ b/plugins/microsoft-calendar/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-microsoft-calendar +## 0.1.1 + +### Patch Changes + +- cb8ec97cdeb: Change black & white colors to be theme aware +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/errors@1.1.5 + - @backstage/core-plugin-api@1.5.0 + - @backstage/theme@0.2.18 + ## 0.1.1-next.2 ### Patch Changes diff --git a/plugins/microsoft-calendar/package.json b/plugins/microsoft-calendar/package.json index 8d20a5de70..cb125480f2 100644 --- a/plugins/microsoft-calendar/package.json +++ b/plugins/microsoft-calendar/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-microsoft-calendar", - "version": "0.1.1-next.2", + "version": "0.1.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/newrelic-dashboard/CHANGELOG.md b/plugins/newrelic-dashboard/CHANGELOG.md index 93b27ba385..44122710e5 100644 --- a/plugins/newrelic-dashboard/CHANGELOG.md +++ b/plugins/newrelic-dashboard/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-newrelic-dashboard +## 0.2.9 + +### Patch Changes + +- cb8ec97cdeb: Change black & white colors to be theme aware +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/errors@1.1.5 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + ## 0.2.9-next.2 ### Patch Changes diff --git a/plugins/newrelic-dashboard/package.json b/plugins/newrelic-dashboard/package.json index 9958741b5f..83aa0811b6 100644 --- a/plugins/newrelic-dashboard/package.json +++ b/plugins/newrelic-dashboard/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-newrelic-dashboard", - "version": "0.2.9-next.2", + "version": "0.2.9", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/newrelic/CHANGELOG.md b/plugins/newrelic/CHANGELOG.md index bd0ef0d06f..d241da2d28 100644 --- a/plugins/newrelic/CHANGELOG.md +++ b/plugins/newrelic/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-newrelic +## 0.3.34 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- 66fdf05a1ef: Updated installation instructions +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/core-plugin-api@1.5.0 + - @backstage/theme@0.2.18 + ## 0.3.34-next.2 ### Patch Changes diff --git a/plugins/newrelic/package.json b/plugins/newrelic/package.json index 3ad74b3949..08d4ad0970 100644 --- a/plugins/newrelic/package.json +++ b/plugins/newrelic/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-newrelic", "description": "A Backstage plugin that integrates towards New Relic", - "version": "0.3.34-next.2", + "version": "0.3.34", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/octopus-deploy/CHANGELOG.md b/plugins/octopus-deploy/CHANGELOG.md index a3743722b8..8ab8d174db 100644 --- a/plugins/octopus-deploy/CHANGELOG.md +++ b/plugins/octopus-deploy/CHANGELOG.md @@ -1,5 +1,22 @@ # @backstage/plugin-octopus-deploy +## 0.1.0 + +### Minor Changes + +- b7fff1171f0: Initial version + +### Patch Changes + +- cb0fc15a992: Added Octopus Deploy logo +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.18 + ## 0.1.0-next.2 ### Patch Changes diff --git a/plugins/octopus-deploy/package.json b/plugins/octopus-deploy/package.json index 9ba86f1587..4cbe40b006 100644 --- a/plugins/octopus-deploy/package.json +++ b/plugins/octopus-deploy/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-octopus-deploy", - "version": "0.1.0-next.2", + "version": "0.1.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/org-react/CHANGELOG.md b/plugins/org-react/CHANGELOG.md index cb59276110..a8b59a4bc1 100644 --- a/plugins/org-react/CHANGELOG.md +++ b/plugins/org-react/CHANGELOG.md @@ -1,5 +1,18 @@ # @backstage/plugin-org-react +## 0.1.5 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/catalog-client@1.4.0 + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.18 + ## 0.1.5-next.2 ### Patch Changes diff --git a/plugins/org-react/package.json b/plugins/org-react/package.json index a2e6623523..027e34c391 100644 --- a/plugins/org-react/package.json +++ b/plugins/org-react/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-org-react", - "version": "0.1.5-next.2", + "version": "0.1.5", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/org/CHANGELOG.md b/plugins/org/CHANGELOG.md index 4728f8be20..4251195733 100644 --- a/plugins/org/CHANGELOG.md +++ b/plugins/org/CHANGELOG.md @@ -1,5 +1,20 @@ # @backstage/plugin-org +## 0.6.6 + +### Patch Changes + +- cb8ec97cdeb: Change black & white colors to be theme aware +- 36bccb5252f: Fix small UI-glitch in MemberListCard +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- a06fcac4040: Add styling to the `MembersListCard` and `ComponentsGrid` to handle overflow text. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.18 + ## 0.6.6-next.2 ### Patch Changes diff --git a/plugins/org/package.json b/plugins/org/package.json index bd7ea9a344..1e948703c5 100644 --- a/plugins/org/package.json +++ b/plugins/org/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-org", "description": "A Backstage plugin that helps you create entity pages for your organization", - "version": "0.6.6-next.2", + "version": "0.6.6", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/pagerduty/CHANGELOG.md b/plugins/pagerduty/CHANGELOG.md index 37189de162..2e0529fa8b 100644 --- a/plugins/pagerduty/CHANGELOG.md +++ b/plugins/pagerduty/CHANGELOG.md @@ -1,5 +1,19 @@ # @backstage/plugin-pagerduty +## 0.5.9 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- 9c08ecbaa4b: Update readme link for discord channel +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/errors@1.1.5 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.18 + ## 0.5.9-next.2 ### Patch Changes diff --git a/plugins/pagerduty/package.json b/plugins/pagerduty/package.json index 0ae7623240..31caf51e33 100644 --- a/plugins/pagerduty/package.json +++ b/plugins/pagerduty/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-pagerduty", "description": "A Backstage plugin that integrates towards PagerDuty", - "version": "0.5.9-next.2", + "version": "0.5.9", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/periskop-backend/CHANGELOG.md b/plugins/periskop-backend/CHANGELOG.md index aa43870b1d..b2690caf40 100644 --- a/plugins/periskop-backend/CHANGELOG.md +++ b/plugins/periskop-backend/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-periskop-backend +## 0.1.14 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/backend-common@0.18.3 + - @backstage/backend-plugin-api@0.5.0 + - @backstage/config@1.0.7 + ## 0.1.14-next.2 ### Patch Changes diff --git a/plugins/periskop-backend/package.json b/plugins/periskop-backend/package.json index 11e38bcd36..5c101dbf29 100644 --- a/plugins/periskop-backend/package.json +++ b/plugins/periskop-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-periskop-backend", - "version": "0.1.14-next.2", + "version": "0.1.14", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/periskop/CHANGELOG.md b/plugins/periskop/CHANGELOG.md index d41640b55c..f5cc2e9b3d 100644 --- a/plugins/periskop/CHANGELOG.md +++ b/plugins/periskop/CHANGELOG.md @@ -1,5 +1,18 @@ # @backstage/plugin-periskop +## 0.1.14 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/errors@1.1.5 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.18 + ## 0.1.14-next.2 ### Patch Changes diff --git a/plugins/periskop/package.json b/plugins/periskop/package.json index 1e7ca292d1..f3cd97b1ff 100644 --- a/plugins/periskop/package.json +++ b/plugins/periskop/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-periskop", - "version": "0.1.14-next.2", + "version": "0.1.14", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/permission-backend/CHANGELOG.md b/plugins/permission-backend/CHANGELOG.md index a55c711386..8e2f0c2987 100644 --- a/plugins/permission-backend/CHANGELOG.md +++ b/plugins/permission-backend/CHANGELOG.md @@ -1,5 +1,18 @@ # @backstage/plugin-permission-backend +## 0.5.18 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/plugin-permission-node@0.7.6 + - @backstage/plugin-auth-node@0.2.12 + - @backstage/backend-common@0.18.3 + - @backstage/errors@1.1.5 + - @backstage/plugin-permission-common@0.7.4 + - @backstage/config@1.0.7 + ## 0.5.18-next.2 ### Patch Changes diff --git a/plugins/permission-backend/package.json b/plugins/permission-backend/package.json index a7202c9672..f7778bf7b2 100644 --- a/plugins/permission-backend/package.json +++ b/plugins/permission-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-permission-backend", - "version": "0.5.18-next.2", + "version": "0.5.18", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/permission-common/CHANGELOG.md b/plugins/permission-common/CHANGELOG.md index e193c4f8e6..be9d35ef6a 100644 --- a/plugins/permission-common/CHANGELOG.md +++ b/plugins/permission-common/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-permission-common +## 0.7.4 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/errors@1.1.5 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + ## 0.7.4-next.0 ### Patch Changes diff --git a/plugins/permission-common/package.json b/plugins/permission-common/package.json index 5b1abb5d94..4d45347f7a 100644 --- a/plugins/permission-common/package.json +++ b/plugins/permission-common/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-permission-common", "description": "Isomorphic types and client for Backstage permissions and authorization", - "version": "0.7.4-next.0", + "version": "0.7.4", "main": "src/index.ts", "types": "src/index.ts", "publishConfig": { diff --git a/plugins/permission-node/CHANGELOG.md b/plugins/permission-node/CHANGELOG.md index 59052c2184..472fa004a1 100644 --- a/plugins/permission-node/CHANGELOG.md +++ b/plugins/permission-node/CHANGELOG.md @@ -1,5 +1,20 @@ # @backstage/plugin-permission-node +## 0.7.6 + +### Patch Changes + +- 27a103ca07b: Changed the `createPermissionIntegrationRouter` API to allow `getResources`, `resourceType` and `rules` to be optional +- 37e9215c793: Update the service-to-service auth docs URL in error message. + `` +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/plugin-auth-node@0.2.12 + - @backstage/backend-common@0.18.3 + - @backstage/errors@1.1.5 + - @backstage/plugin-permission-common@0.7.4 + - @backstage/config@1.0.7 + ## 0.7.6-next.2 ### Patch Changes diff --git a/plugins/permission-node/package.json b/plugins/permission-node/package.json index 92c0a7685a..1473de80b2 100644 --- a/plugins/permission-node/package.json +++ b/plugins/permission-node/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-permission-node", "description": "Common permission and authorization utilities for backend plugins", - "version": "0.7.6-next.2", + "version": "0.7.6", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/permission-react/CHANGELOG.md b/plugins/permission-react/CHANGELOG.md index 31832e9a83..9da20a2875 100644 --- a/plugins/permission-react/CHANGELOG.md +++ b/plugins/permission-react/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-permission-react +## 0.4.11 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.5.0 + - @backstage/plugin-permission-common@0.7.4 + - @backstage/config@1.0.7 + ## 0.4.11-next.2 ### Patch Changes diff --git a/plugins/permission-react/package.json b/plugins/permission-react/package.json index 1d5d0713b7..afa4a4768e 100644 --- a/plugins/permission-react/package.json +++ b/plugins/permission-react/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-permission-react", - "version": "0.4.11-next.2", + "version": "0.4.11", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/playlist-backend/CHANGELOG.md b/plugins/playlist-backend/CHANGELOG.md index da2697188a..195cdb1f50 100644 --- a/plugins/playlist-backend/CHANGELOG.md +++ b/plugins/playlist-backend/CHANGELOG.md @@ -1,5 +1,21 @@ # @backstage/plugin-playlist-backend +## 0.2.6 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/catalog-client@1.4.0 + - @backstage/plugin-permission-node@0.7.6 + - @backstage/plugin-auth-node@0.2.12 + - @backstage/backend-common@0.18.3 + - @backstage/errors@1.1.5 + - @backstage/catalog-model@1.2.1 + - @backstage/plugin-permission-common@0.7.4 + - @backstage/config@1.0.7 + - @backstage/plugin-playlist-common@0.1.5 + ## 0.2.6-next.2 ### Patch Changes diff --git a/plugins/playlist-backend/package.json b/plugins/playlist-backend/package.json index 2d868b950a..90e5813247 100644 --- a/plugins/playlist-backend/package.json +++ b/plugins/playlist-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-playlist-backend", - "version": "0.2.6-next.2", + "version": "0.2.6", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/playlist-common/CHANGELOG.md b/plugins/playlist-common/CHANGELOG.md index 13e19e9204..15eebfc59b 100644 --- a/plugins/playlist-common/CHANGELOG.md +++ b/plugins/playlist-common/CHANGELOG.md @@ -1,5 +1,12 @@ # @backstage/plugin-playlist-common +## 0.1.5 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-permission-common@0.7.4 + ## 0.1.5-next.0 ### Patch Changes diff --git a/plugins/playlist-common/package.json b/plugins/playlist-common/package.json index 1bf0b8be27..440e46713d 100644 --- a/plugins/playlist-common/package.json +++ b/plugins/playlist-common/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-playlist-common", "description": "Common functionalities for the playlist plugin", - "version": "0.1.5-next.0", + "version": "0.1.5", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/playlist/CHANGELOG.md b/plugins/playlist/CHANGELOG.md index bc0263fd00..43a7ff4e4d 100644 --- a/plugins/playlist/CHANGELOG.md +++ b/plugins/playlist/CHANGELOG.md @@ -1,5 +1,25 @@ # @backstage/plugin-playlist +## 0.1.7 + +### Patch Changes + +- c10384a9235: Switch to using `LinkButton` instead of the deprecated `Button` +- 122a37a880e: Internal update to work with newer versions of react-router +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/plugin-search-react@1.5.1 + - @backstage/errors@1.1.5 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/plugin-catalog-common@1.0.12 + - @backstage/plugin-permission-common@0.7.4 + - @backstage/theme@0.2.18 + - @backstage/plugin-permission-react@0.4.11 + - @backstage/plugin-playlist-common@0.1.5 + ## 0.1.7-next.2 ### Patch Changes diff --git a/plugins/playlist/package.json b/plugins/playlist/package.json index 445171f9b8..59cde3f246 100644 --- a/plugins/playlist/package.json +++ b/plugins/playlist/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-playlist", - "version": "0.1.7-next.2", + "version": "0.1.7", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/proxy-backend/CHANGELOG.md b/plugins/proxy-backend/CHANGELOG.md index 8b649c44de..8c4ef92ea5 100644 --- a/plugins/proxy-backend/CHANGELOG.md +++ b/plugins/proxy-backend/CHANGELOG.md @@ -1,5 +1,29 @@ # @backstage/plugin-proxy-backend +## 0.2.37 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- 3e3eea4bc7e: The proxy-backend plugin now supports reviving request bodies that have previously been consumed by an express middleware (e.g. `express.json()`). This is done by setting `reviveConsumedRequestBodies: true` on the proxy `RouterOptions`. In order to preserve the current behavior, the proxy will **not** revive request bodies by default. + + The following is an example of a proxy `createRouter` invocation that revives request bodies: + + ```diff + const router = await createRouter({ + config, + logger, + discovery, + + reviveConsumedRequestBodies: true, + }); + ``` + +- 4acd93dae1d: Ensure that `@backstage/plugin-proxy-backend` logs the requests that it proxies when log level is set to `debug`. +- Updated dependencies + - @backstage/backend-common@0.18.3 + - @backstage/backend-plugin-api@0.5.0 + - @backstage/config@1.0.7 + ## 0.2.37-next.2 ### Patch Changes diff --git a/plugins/proxy-backend/package.json b/plugins/proxy-backend/package.json index a7d320c37c..6b9c115dbb 100644 --- a/plugins/proxy-backend/package.json +++ b/plugins/proxy-backend/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-proxy-backend", "description": "A Backstage backend plugin that helps you set up proxy endpoints in the backend", - "version": "0.2.37-next.2", + "version": "0.2.37", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/rollbar-backend/CHANGELOG.md b/plugins/rollbar-backend/CHANGELOG.md index edda54dcd1..f69c395c83 100644 --- a/plugins/rollbar-backend/CHANGELOG.md +++ b/plugins/rollbar-backend/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-rollbar-backend +## 0.1.40 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/backend-common@0.18.3 + - @backstage/config@1.0.7 + ## 0.1.40-next.2 ### Patch Changes diff --git a/plugins/rollbar-backend/package.json b/plugins/rollbar-backend/package.json index 31d802dece..0bba2d3888 100644 --- a/plugins/rollbar-backend/package.json +++ b/plugins/rollbar-backend/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-rollbar-backend", "description": "A Backstage backend plugin that integrates towards Rollbar", - "version": "0.1.40-next.2", + "version": "0.1.40", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/rollbar/CHANGELOG.md b/plugins/rollbar/CHANGELOG.md index 943db21cce..2693bf4b5b 100644 --- a/plugins/rollbar/CHANGELOG.md +++ b/plugins/rollbar/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-rollbar +## 0.4.16 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.18 + ## 0.4.16-next.2 ### Patch Changes diff --git a/plugins/rollbar/package.json b/plugins/rollbar/package.json index a3189c147d..9b46d91db6 100644 --- a/plugins/rollbar/package.json +++ b/plugins/rollbar/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-rollbar", "description": "A Backstage plugin that integrates towards Rollbar", - "version": "0.4.16-next.2", + "version": "0.4.16", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/scaffolder-backend-module-cookiecutter/CHANGELOG.md b/plugins/scaffolder-backend-module-cookiecutter/CHANGELOG.md index 2dcb0eb279..284e381553 100644 --- a/plugins/scaffolder-backend-module-cookiecutter/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-cookiecutter/CHANGELOG.md @@ -1,5 +1,20 @@ # @backstage/plugin-scaffolder-backend-module-cookiecutter +## 0.2.18 + +### Patch Changes + +- 62414770ead: allow container runner to be undefined in cookiecutter plugin +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/plugin-scaffolder-backend@1.12.0 + - @backstage/backend-common@0.18.3 + - @backstage/errors@1.1.5 + - @backstage/integration@1.4.3 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + - @backstage/plugin-scaffolder-node@0.1.1 + ## 0.2.18-next.2 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-cookiecutter/package.json b/plugins/scaffolder-backend-module-cookiecutter/package.json index 373320191a..da8f92da5c 100644 --- a/plugins/scaffolder-backend-module-cookiecutter/package.json +++ b/plugins/scaffolder-backend-module-cookiecutter/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-scaffolder-backend-module-cookiecutter", "description": "A module for the scaffolder backend that lets you template projects using cookiecutter", - "version": "0.2.18-next.2", + "version": "0.2.18", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/scaffolder-backend-module-rails/CHANGELOG.md b/plugins/scaffolder-backend-module-rails/CHANGELOG.md index 5c7fb1dc2d..457cef36bb 100644 --- a/plugins/scaffolder-backend-module-rails/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-rails/CHANGELOG.md @@ -1,5 +1,18 @@ # @backstage/plugin-scaffolder-backend-module-rails +## 0.4.11 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-backend@1.12.0 + - @backstage/backend-common@0.18.3 + - @backstage/errors@1.1.5 + - @backstage/integration@1.4.3 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + - @backstage/plugin-scaffolder-node@0.1.1 + ## 0.4.11-next.2 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-rails/package.json b/plugins/scaffolder-backend-module-rails/package.json index be9d053340..96da1120e8 100644 --- a/plugins/scaffolder-backend-module-rails/package.json +++ b/plugins/scaffolder-backend-module-rails/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-scaffolder-backend-module-rails", "description": "A module for the scaffolder backend that lets you template projects using Rails", - "version": "0.4.11-next.2", + "version": "0.4.11", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/scaffolder-backend-module-sentry/CHANGELOG.md b/plugins/scaffolder-backend-module-sentry/CHANGELOG.md index ae6d8734c9..5207cdec38 100644 --- a/plugins/scaffolder-backend-module-sentry/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-sentry/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-scaffolder-backend-module-sentry +## 0.1.3 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.1.5 + - @backstage/config@1.0.7 + - @backstage/plugin-scaffolder-node@0.1.1 + ## 0.1.3-next.2 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-sentry/package.json b/plugins/scaffolder-backend-module-sentry/package.json index 36f5139b28..bff7043171 100644 --- a/plugins/scaffolder-backend-module-sentry/package.json +++ b/plugins/scaffolder-backend-module-sentry/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-scaffolder-backend-module-sentry", - "version": "0.1.3-next.2", + "version": "0.1.3", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/scaffolder-backend-module-yeoman/CHANGELOG.md b/plugins/scaffolder-backend-module-yeoman/CHANGELOG.md index e87cf64167..36e965218d 100644 --- a/plugins/scaffolder-backend-module-yeoman/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-yeoman/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-scaffolder-backend-module-yeoman +## 0.2.16 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + - @backstage/plugin-scaffolder-node@0.1.1 + ## 0.2.16-next.2 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-yeoman/package.json b/plugins/scaffolder-backend-module-yeoman/package.json index 01ba3f5eea..9aeee3ec51 100644 --- a/plugins/scaffolder-backend-module-yeoman/package.json +++ b/plugins/scaffolder-backend-module-yeoman/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-scaffolder-backend-module-yeoman", - "version": "0.2.16-next.2", + "version": "0.2.16", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/scaffolder-backend/CHANGELOG.md b/plugins/scaffolder-backend/CHANGELOG.md index 65a827797f..0cd0e43f9d 100644 --- a/plugins/scaffolder-backend/CHANGELOG.md +++ b/plugins/scaffolder-backend/CHANGELOG.md @@ -1,5 +1,36 @@ # @backstage/plugin-scaffolder-backend +## 1.12.0 + +### Minor Changes + +- 7d724d8ef56: Added the ability to be able to define an actions `input` and `output` schema using `zod` instead of hand writing types and `jsonschema` + +### Patch Changes + +- 860de10fa67: Make identity valid if subject of token is a backstage server-2-server auth token +- 65454876fb2: Minor API report tweaks +- c6c78b4acbe: throw error from catalog:fetch scaffolder action when entity is null and optional is false +- 9968f455921: catalog write action should allow any shape of object +- 928a12a9b3e: Internal refactor of `/alpha` exports. +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- 7af12854970: Extended scaffolder action `catalog:fetch` to fetch multiple catalog entities by entity references. +- Updated dependencies + - @backstage/plugin-catalog-backend@1.8.0 + - @backstage/catalog-client@1.4.0 + - @backstage/plugin-auth-node@0.2.12 + - @backstage/backend-tasks@0.5.0 + - @backstage/backend-common@0.18.3 + - @backstage/errors@1.1.5 + - @backstage/plugin-catalog-node@1.3.4 + - @backstage/backend-plugin-api@0.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/integration@1.4.3 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + - @backstage/plugin-scaffolder-common@1.2.6 + - @backstage/plugin-scaffolder-node@0.1.1 + ## 1.12.0-next.2 ### Patch Changes diff --git a/plugins/scaffolder-backend/package.json b/plugins/scaffolder-backend/package.json index 03f813b036..d7eae0580a 100644 --- a/plugins/scaffolder-backend/package.json +++ b/plugins/scaffolder-backend/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-scaffolder-backend", "description": "The Backstage backend plugin that helps you create new things", - "version": "1.12.0-next.2", + "version": "1.12.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/scaffolder-common/CHANGELOG.md b/plugins/scaffolder-common/CHANGELOG.md index 8b50ec85a9..4f76c33e36 100644 --- a/plugins/scaffolder-common/CHANGELOG.md +++ b/plugins/scaffolder-common/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-scaffolder-common +## 1.2.6 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.2.1 + - @backstage/types@1.0.2 + ## 1.2.6-next.1 ### Patch Changes diff --git a/plugins/scaffolder-common/package.json b/plugins/scaffolder-common/package.json index a64185d681..c08763d98b 100644 --- a/plugins/scaffolder-common/package.json +++ b/plugins/scaffolder-common/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-scaffolder-common", "description": "Common functionalities for the scaffolder, to be shared between scaffolder and scaffolder-backend plugin", - "version": "1.2.6-next.1", + "version": "1.2.6", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/scaffolder-node/CHANGELOG.md b/plugins/scaffolder-node/CHANGELOG.md index 37b9613524..663d7b1c39 100644 --- a/plugins/scaffolder-node/CHANGELOG.md +++ b/plugins/scaffolder-node/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-scaffolder-node +## 0.1.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/types@1.0.2 + - @backstage/plugin-scaffolder-common@1.2.6 + ## 0.1.1-next.2 ### Patch Changes diff --git a/plugins/scaffolder-node/package.json b/plugins/scaffolder-node/package.json index 8978c155bf..d349e41ec4 100644 --- a/plugins/scaffolder-node/package.json +++ b/plugins/scaffolder-node/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-scaffolder-node", "description": "The plugin-scaffolder-node module for @backstage/plugin-scaffolder-backend", - "version": "0.1.1-next.2", + "version": "0.1.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/scaffolder-react/CHANGELOG.md b/plugins/scaffolder-react/CHANGELOG.md index 25385e4816..744d687349 100644 --- a/plugins/scaffolder-react/CHANGELOG.md +++ b/plugins/scaffolder-react/CHANGELOG.md @@ -1,5 +1,34 @@ # @backstage/plugin-scaffolder-react +## 1.2.0 + +### Minor Changes + +- 8f4d13f21cf: Move `useTaskStream`, `TaskBorder`, `TaskLogStream` and `TaskSteps` into `scaffolder-react`. + +### Patch Changes + +- 65454876fb2: Minor API report tweaks +- 3c96e77b513: Make scaffolder adhere to page themes by using page `fontColor` consistently. If your theme overwrites template list or card headers, review those styles. +- c8d78b9ae9d: fix bug with `hasErrors` returning false when dealing with empty objects +- 9b8c374ace5: Remove timer for skipped steps in Scaffolder Next's TaskSteps +- 44941fc97eb: scaffolder/next: Move the `uiSchema` to its own property in the validation `context` to align with component development and access of `ui:options` +- d9893263ba9: scaffolder/next: Fix for steps without properties +- 928a12a9b3e: Internal refactor of `/alpha` exports. +- cc418d652a7: scaffolder/next: Added the ability to get the fields definition in the schema in the validation function +- d4100d0ec42: Fix alignment bug for owners on `TemplateCard` +- Updated dependencies + - @backstage/catalog-client@1.4.0 + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/errors@1.1.5 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.18 + - @backstage/types@1.0.2 + - @backstage/version-bridge@1.0.3 + - @backstage/plugin-scaffolder-common@1.2.6 + ## 1.2.0-next.2 ### Patch Changes diff --git a/plugins/scaffolder-react/package.json b/plugins/scaffolder-react/package.json index 4e0cb590e4..012baa6aa5 100644 --- a/plugins/scaffolder-react/package.json +++ b/plugins/scaffolder-react/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-scaffolder-react", "description": "A frontend library that helps other Backstage plugins interact with the Scaffolder", - "version": "1.2.0-next.2", + "version": "1.2.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/scaffolder/CHANGELOG.md b/plugins/scaffolder/CHANGELOG.md index d3c377154e..f304d7b621 100644 --- a/plugins/scaffolder/CHANGELOG.md +++ b/plugins/scaffolder/CHANGELOG.md @@ -1,5 +1,40 @@ # @backstage/plugin-scaffolder +## 1.12.0 + +### Minor Changes + +- 0d61fcca9c3: Update `EntityPicker` to use the fully qualified entity ref instead of the humanized version. +- 8f4d13f21cf: Move `useTaskStream`, `TaskBorder`, `TaskLogStream` and `TaskSteps` into `scaffolder-react`. + +### Patch Changes + +- 65454876fb2: Minor API report tweaks +- 3c96e77b513: Make scaffolder adhere to page themes by using page `fontColor` consistently. If your theme overwrites template list or card headers, review those styles. +- be3cddaab5f: Getting credentials in the RepoUrlPicker now also works for targets without owner (e.g. Bitbucket Server). +- cb8ec97cdeb: Change black & white colors to be theme aware +- eb877bad736: Create an "Other Templates" group when groups are given to scaffolder/next. +- c10384a9235: Switch to using `LinkButton` instead of the deprecated `Button` +- 928a12a9b3e: Internal refactor of `/alpha` exports. +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- 0aae4596296: Fix the scaffolder validator for arrays when the item is a field in the object +- Updated dependencies + - @backstage/catalog-client@1.4.0 + - @backstage/core-components@0.12.5 + - @backstage/plugin-scaffolder-react@1.2.0 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/errors@1.1.5 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/plugin-catalog-common@1.0.12 + - @backstage/integration-react@1.1.11 + - @backstage/integration@1.4.3 + - @backstage/config@1.0.7 + - @backstage/theme@0.2.18 + - @backstage/types@1.0.2 + - @backstage/plugin-permission-react@0.4.11 + - @backstage/plugin-scaffolder-common@1.2.6 + ## 1.12.0-next.2 ### Minor Changes diff --git a/plugins/scaffolder/package.json b/plugins/scaffolder/package.json index 7d939a3d1e..dc75dd1d01 100644 --- a/plugins/scaffolder/package.json +++ b/plugins/scaffolder/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-scaffolder", "description": "The Backstage plugin that helps you create new things", - "version": "1.12.0-next.2", + "version": "1.12.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/search-backend-module-elasticsearch/CHANGELOG.md b/plugins/search-backend-module-elasticsearch/CHANGELOG.md index 8576e6602c..b72c36dec2 100644 --- a/plugins/search-backend-module-elasticsearch/CHANGELOG.md +++ b/plugins/search-backend-module-elasticsearch/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-search-backend-module-elasticsearch +## 1.1.4 + +### Patch Changes + +- 65454876fb2: Minor API report tweaks +- Updated dependencies + - @backstage/config@1.0.7 + - @backstage/plugin-search-backend-node@1.1.4 + - @backstage/plugin-search-common@1.2.2 + ## 1.1.4-next.2 ### Patch Changes diff --git a/plugins/search-backend-module-elasticsearch/package.json b/plugins/search-backend-module-elasticsearch/package.json index 6520571ec6..e854687360 100644 --- a/plugins/search-backend-module-elasticsearch/package.json +++ b/plugins/search-backend-module-elasticsearch/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-search-backend-module-elasticsearch", "description": "A module for the search backend that implements search using ElasticSearch", - "version": "1.1.4-next.2", + "version": "1.1.4", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/search-backend-module-pg/CHANGELOG.md b/plugins/search-backend-module-pg/CHANGELOG.md index db32c01817..50a9fc9d91 100644 --- a/plugins/search-backend-module-pg/CHANGELOG.md +++ b/plugins/search-backend-module-pg/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-search-backend-module-pg +## 0.5.4 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.3 + - @backstage/config@1.0.7 + - @backstage/plugin-search-backend-node@1.1.4 + - @backstage/plugin-search-common@1.2.2 + ## 0.5.4-next.2 ### Patch Changes diff --git a/plugins/search-backend-module-pg/package.json b/plugins/search-backend-module-pg/package.json index c6513c8e27..b284557369 100644 --- a/plugins/search-backend-module-pg/package.json +++ b/plugins/search-backend-module-pg/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-search-backend-module-pg", "description": "A module for the search backend that implements search using PostgreSQL", - "version": "0.5.4-next.2", + "version": "0.5.4", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/search-backend-node/CHANGELOG.md b/plugins/search-backend-node/CHANGELOG.md index 5fcd3bd0fa..69cc5ac718 100644 --- a/plugins/search-backend-node/CHANGELOG.md +++ b/plugins/search-backend-node/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-search-backend-node +## 1.1.4 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-tasks@0.5.0 + - @backstage/backend-common@0.18.3 + - @backstage/errors@1.1.5 + - @backstage/plugin-permission-common@0.7.4 + - @backstage/config@1.0.7 + - @backstage/plugin-search-common@1.2.2 + ## 1.1.4-next.2 ### Patch Changes diff --git a/plugins/search-backend-node/package.json b/plugins/search-backend-node/package.json index d86be92e92..2abc0a8ef0 100644 --- a/plugins/search-backend-node/package.json +++ b/plugins/search-backend-node/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-search-backend-node", "description": "A library for Backstage backend plugins that want to interact with the search backend plugin", - "version": "1.1.4-next.2", + "version": "1.1.4", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/search-backend/CHANGELOG.md b/plugins/search-backend/CHANGELOG.md index 513ee4536a..72d9e53c08 100644 --- a/plugins/search-backend/CHANGELOG.md +++ b/plugins/search-backend/CHANGELOG.md @@ -1,5 +1,20 @@ # @backstage/plugin-search-backend +## 1.2.4 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-permission-node@0.7.6 + - @backstage/plugin-auth-node@0.2.12 + - @backstage/backend-common@0.18.3 + - @backstage/errors@1.1.5 + - @backstage/plugin-permission-common@0.7.4 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + - @backstage/plugin-search-backend-node@1.1.4 + - @backstage/plugin-search-common@1.2.2 + ## 1.2.4-next.2 ### Patch Changes diff --git a/plugins/search-backend/package.json b/plugins/search-backend/package.json index 0baecca0a9..02d4d53a92 100644 --- a/plugins/search-backend/package.json +++ b/plugins/search-backend/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-search-backend", "description": "The Backstage backend plugin that provides your backstage app with search", - "version": "1.2.4-next.2", + "version": "1.2.4", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/search-common/CHANGELOG.md b/plugins/search-common/CHANGELOG.md index b0a0479ed3..893e6cc89d 100644 --- a/plugins/search-common/CHANGELOG.md +++ b/plugins/search-common/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-search-common +## 1.2.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-permission-common@0.7.4 + - @backstage/types@1.0.2 + ## 1.2.2-next.0 ### Patch Changes diff --git a/plugins/search-common/package.json b/plugins/search-common/package.json index ba767f7019..a7c8de1c9f 100644 --- a/plugins/search-common/package.json +++ b/plugins/search-common/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-search-common", "description": "Common functionalities for Search, to be shared between various search-enabled plugins", - "version": "1.2.2-next.0", + "version": "1.2.2", "main": "src/index.ts", "types": "src/index.ts", "publishConfig": { diff --git a/plugins/search-react/CHANGELOG.md b/plugins/search-react/CHANGELOG.md index 9fc158de5d..cf6138956c 100644 --- a/plugins/search-react/CHANGELOG.md +++ b/plugins/search-react/CHANGELOG.md @@ -1,5 +1,19 @@ # @backstage/plugin-search-react +## 1.5.1 + +### Patch Changes + +- 65454876fb2: Minor API report tweaks +- 553f3c95011: Correctly disable next button in `SearchPagination` on last page +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/core-plugin-api@1.5.0 + - @backstage/theme@0.2.18 + - @backstage/types@1.0.2 + - @backstage/version-bridge@1.0.3 + - @backstage/plugin-search-common@1.2.2 + ## 1.5.1-next.2 ### Patch Changes diff --git a/plugins/search-react/package.json b/plugins/search-react/package.json index 355191cb47..f14a62ccea 100644 --- a/plugins/search-react/package.json +++ b/plugins/search-react/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-search-react", - "version": "1.5.1-next.2", + "version": "1.5.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/search/CHANGELOG.md b/plugins/search/CHANGELOG.md index 3d02621576..3160da8753 100644 --- a/plugins/search/CHANGELOG.md +++ b/plugins/search/CHANGELOG.md @@ -1,5 +1,24 @@ # @backstage/plugin-search +## 1.1.1 + +### Patch Changes + +- 65454876fb2: Minor API report tweaks +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/plugin-search-react@1.5.1 + - @backstage/errors@1.1.5 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/theme@0.2.18 + - @backstage/types@1.0.2 + - @backstage/version-bridge@1.0.3 + - @backstage/plugin-search-common@1.2.2 + ## 1.1.1-next.2 ### Patch Changes diff --git a/plugins/search/package.json b/plugins/search/package.json index 353981cae1..143f64d1bf 100644 --- a/plugins/search/package.json +++ b/plugins/search/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-search", "description": "The Backstage plugin that provides your backstage app with search", - "version": "1.1.1-next.2", + "version": "1.1.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/sentry/CHANGELOG.md b/plugins/sentry/CHANGELOG.md index 89b5d8312a..de40027a7e 100644 --- a/plugins/sentry/CHANGELOG.md +++ b/plugins/sentry/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-sentry +## 0.5.1 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.18 + ## 0.5.1-next.2 ### Patch Changes diff --git a/plugins/sentry/package.json b/plugins/sentry/package.json index 1139898926..c14e397ab9 100644 --- a/plugins/sentry/package.json +++ b/plugins/sentry/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-sentry", "description": "A Backstage plugin that integrates towards Sentry", - "version": "0.5.1-next.2", + "version": "0.5.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/shortcuts/CHANGELOG.md b/plugins/shortcuts/CHANGELOG.md index 2360461f73..f75675260e 100644 --- a/plugins/shortcuts/CHANGELOG.md +++ b/plugins/shortcuts/CHANGELOG.md @@ -1,5 +1,21 @@ # @backstage/plugin-shortcuts +## 0.3.8 + +### Patch Changes + +- cb8ec97cdeb: Change black & white colors to be theme aware +- 7c38e565d1f: Fixed bug in LocalStoredShortcuts client where adding new Shortcut results in replacing entire shortcut list. + + Refactored LocalStoredShortcuts client to listen to `storageApi` updates to ensure that local state is always up to date. + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/core-plugin-api@1.5.0 + - @backstage/theme@0.2.18 + - @backstage/types@1.0.2 + ## 0.3.8-next.2 ### Patch Changes diff --git a/plugins/shortcuts/package.json b/plugins/shortcuts/package.json index 22c0456342..1901198b80 100644 --- a/plugins/shortcuts/package.json +++ b/plugins/shortcuts/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-shortcuts", "description": "A Backstage plugin that provides a shortcuts feature to the sidebar", - "version": "0.3.8-next.2", + "version": "0.3.8", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/sonarqube-backend/CHANGELOG.md b/plugins/sonarqube-backend/CHANGELOG.md index f60f7bf047..0f2ff1d996 100644 --- a/plugins/sonarqube-backend/CHANGELOG.md +++ b/plugins/sonarqube-backend/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-sonarqube-backend +## 0.1.8 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/backend-common@0.18.3 + - @backstage/errors@1.1.5 + - @backstage/config@1.0.7 + ## 0.1.8-next.2 ### Patch Changes diff --git a/plugins/sonarqube-backend/package.json b/plugins/sonarqube-backend/package.json index d7de98d307..a3f3b42f43 100644 --- a/plugins/sonarqube-backend/package.json +++ b/plugins/sonarqube-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-sonarqube-backend", - "version": "0.1.8-next.2", + "version": "0.1.8", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/sonarqube-react/CHANGELOG.md b/plugins/sonarqube-react/CHANGELOG.md index 6c7d5d41f2..ae337f220e 100644 --- a/plugins/sonarqube-react/CHANGELOG.md +++ b/plugins/sonarqube-react/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-sonarqube-react +## 0.1.4 + +### Patch Changes + +- 928a12a9b3e: Internal refactor of `/alpha` exports. +- 8ae65a0bc1d: Moved imports from `/alpha` to main public exports. +- Updated dependencies + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + ## 0.1.4-next.2 ### Patch Changes diff --git a/plugins/sonarqube-react/package.json b/plugins/sonarqube-react/package.json index d5266cd220..442a747717 100644 --- a/plugins/sonarqube-react/package.json +++ b/plugins/sonarqube-react/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-sonarqube-react", - "version": "0.1.4-next.2", + "version": "0.1.4", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/sonarqube/CHANGELOG.md b/plugins/sonarqube/CHANGELOG.md index 6c6f69aaf8..6eeea22725 100644 --- a/plugins/sonarqube/CHANGELOG.md +++ b/plugins/sonarqube/CHANGELOG.md @@ -1,5 +1,22 @@ # @backstage/plugin-sonarqube +## 0.6.5 + +### Patch Changes + +- 65454876fb2: Minor API report tweaks +- 928a12a9b3e: Internal refactor of `/alpha` exports. +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- 8ae65a0bc1d: Moved imports from `/alpha` to main public exports. +- d3d624e8e8d: Show a more appropriate icon if there are no code smells and/or vulnerabilities. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/plugin-sonarqube-react@0.1.4 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.18 + ## 0.6.5-next.2 ### Patch Changes diff --git a/plugins/sonarqube/package.json b/plugins/sonarqube/package.json index 48d221e508..5815032f6a 100644 --- a/plugins/sonarqube/package.json +++ b/plugins/sonarqube/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-sonarqube", "description": "", - "version": "0.6.5-next.2", + "version": "0.6.5", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/splunk-on-call/CHANGELOG.md b/plugins/splunk-on-call/CHANGELOG.md index 830c918ced..011e513852 100644 --- a/plugins/splunk-on-call/CHANGELOG.md +++ b/plugins/splunk-on-call/CHANGELOG.md @@ -1,5 +1,18 @@ # @backstage/plugin-splunk-on-call +## 0.4.5 + +### Patch Changes + +- 65454876fb2: Minor API report tweaks +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.18 + ## 0.4.5-next.2 ### Patch Changes diff --git a/plugins/splunk-on-call/package.json b/plugins/splunk-on-call/package.json index 97a5357bd0..98a6291791 100644 --- a/plugins/splunk-on-call/package.json +++ b/plugins/splunk-on-call/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-splunk-on-call", "description": "A Backstage plugin that integrates towards Splunk On-Call", - "version": "0.4.5-next.2", + "version": "0.4.5", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/stack-overflow-backend/CHANGELOG.md b/plugins/stack-overflow-backend/CHANGELOG.md index fab1416363..ba743be981 100644 --- a/plugins/stack-overflow-backend/CHANGELOG.md +++ b/plugins/stack-overflow-backend/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-stack-overflow-backend +## 0.1.12 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/backend-common@0.18.3 + - @backstage/config@1.0.7 + - @backstage/plugin-search-common@1.2.2 + ## 0.1.12-next.2 ### Patch Changes diff --git a/plugins/stack-overflow-backend/package.json b/plugins/stack-overflow-backend/package.json index 2dd405dc3b..8d1203577d 100644 --- a/plugins/stack-overflow-backend/package.json +++ b/plugins/stack-overflow-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-stack-overflow-backend", - "version": "0.1.12-next.2", + "version": "0.1.12", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/stack-overflow/CHANGELOG.md b/plugins/stack-overflow/CHANGELOG.md index 050900554d..c8641592a6 100644 --- a/plugins/stack-overflow/CHANGELOG.md +++ b/plugins/stack-overflow/CHANGELOG.md @@ -1,5 +1,20 @@ # @backstage/plugin-stack-overflow +## 0.1.12 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- 3ef5fb09ca5: Export api ref and StackOverflowApi type +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/plugin-search-react@1.5.1 + - @backstage/core-plugin-api@1.5.0 + - @backstage/plugin-home@0.4.32 + - @backstage/config@1.0.7 + - @backstage/theme@0.2.18 + - @backstage/plugin-search-common@1.2.2 + ## 0.1.12-next.2 ### Patch Changes diff --git a/plugins/stack-overflow/package.json b/plugins/stack-overflow/package.json index 3675593181..952471fd50 100644 --- a/plugins/stack-overflow/package.json +++ b/plugins/stack-overflow/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-stack-overflow", - "version": "0.1.12-next.2", + "version": "0.1.12", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/stackstorm/CHANGELOG.md b/plugins/stackstorm/CHANGELOG.md index f68c853b7b..3af84cd8a6 100644 --- a/plugins/stackstorm/CHANGELOG.md +++ b/plugins/stackstorm/CHANGELOG.md @@ -1,5 +1,20 @@ # @backstage/plugin-stackstorm +## 0.1.0 + +### Minor Changes + +- f3a15259e91: Add StackStorm plugin to Backstage which is interfacing with StackStorm API. It allows users to view workflow executions, packs and actions. For installation and configuration instructions please view [README.md](https://github.com/backstage/backstage/tree/master/plugins/stackstorm/README.md) + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/errors@1.1.5 + - @backstage/core-plugin-api@1.5.0 + - @backstage/theme@0.2.18 + ## 0.1.0-next.2 ### Patch Changes diff --git a/plugins/stackstorm/package.json b/plugins/stackstorm/package.json index a1ba109d76..2819fc0e33 100644 --- a/plugins/stackstorm/package.json +++ b/plugins/stackstorm/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-stackstorm", "description": "A Backstage plugin that integrates towards StackStorm", - "version": "0.1.0-next.2", + "version": "0.1.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/tech-insights-backend-module-jsonfc/CHANGELOG.md b/plugins/tech-insights-backend-module-jsonfc/CHANGELOG.md index 12e6693589..17334e90b7 100644 --- a/plugins/tech-insights-backend-module-jsonfc/CHANGELOG.md +++ b/plugins/tech-insights-backend-module-jsonfc/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-tech-insights-backend-module-jsonfc +## 0.1.27 + +### Patch Changes + +- 65454876fb2: Minor API report tweaks +- Updated dependencies + - @backstage/backend-common@0.18.3 + - @backstage/errors@1.1.5 + - @backstage/config@1.0.7 + - @backstage/plugin-tech-insights-common@0.2.10 + - @backstage/plugin-tech-insights-node@0.4.1 + ## 0.1.27-next.2 ### Patch Changes diff --git a/plugins/tech-insights-backend-module-jsonfc/package.json b/plugins/tech-insights-backend-module-jsonfc/package.json index 7d60ec0cdc..a6bc32a990 100644 --- a/plugins/tech-insights-backend-module-jsonfc/package.json +++ b/plugins/tech-insights-backend-module-jsonfc/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-tech-insights-backend-module-jsonfc", - "version": "0.1.27-next.2", + "version": "0.1.27", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/tech-insights-backend/CHANGELOG.md b/plugins/tech-insights-backend/CHANGELOG.md index c4e8061f05..8071740295 100644 --- a/plugins/tech-insights-backend/CHANGELOG.md +++ b/plugins/tech-insights-backend/CHANGELOG.md @@ -1,5 +1,21 @@ # @backstage/plugin-tech-insights-backend +## 0.5.9 + +### Patch Changes + +- f244b589163: Add DB index to improve latency of latest fact query +- Updated dependencies + - @backstage/catalog-client@1.4.0 + - @backstage/backend-tasks@0.5.0 + - @backstage/backend-common@0.18.3 + - @backstage/errors@1.1.5 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + - @backstage/plugin-tech-insights-common@0.2.10 + - @backstage/plugin-tech-insights-node@0.4.1 + ## 0.5.9-next.2 ### Patch Changes diff --git a/plugins/tech-insights-backend/package.json b/plugins/tech-insights-backend/package.json index e11bf60e0d..c1887906e9 100644 --- a/plugins/tech-insights-backend/package.json +++ b/plugins/tech-insights-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-tech-insights-backend", - "version": "0.5.9-next.2", + "version": "0.5.9", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/tech-insights-node/CHANGELOG.md b/plugins/tech-insights-node/CHANGELOG.md index ed9f3667f0..71eb372214 100644 --- a/plugins/tech-insights-node/CHANGELOG.md +++ b/plugins/tech-insights-node/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-tech-insights-node +## 0.4.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-tasks@0.5.0 + - @backstage/backend-common@0.18.3 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + - @backstage/plugin-tech-insights-common@0.2.10 + ## 0.4.1-next.2 ### Patch Changes diff --git a/plugins/tech-insights-node/package.json b/plugins/tech-insights-node/package.json index 6a546f86c1..bfa4d893c0 100644 --- a/plugins/tech-insights-node/package.json +++ b/plugins/tech-insights-node/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-tech-insights-node", - "version": "0.4.1-next.2", + "version": "0.4.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/tech-insights/CHANGELOG.md b/plugins/tech-insights/CHANGELOG.md index e8d57b056f..056b15cb8b 100644 --- a/plugins/tech-insights/CHANGELOG.md +++ b/plugins/tech-insights/CHANGELOG.md @@ -1,5 +1,21 @@ # @backstage/plugin-tech-insights +## 0.3.8 + +### Patch Changes + +- 65454876fb2: Minor API report tweaks +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/errors@1.1.5 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.18 + - @backstage/types@1.0.2 + - @backstage/plugin-tech-insights-common@0.2.10 + ## 0.3.8-next.2 ### Patch Changes diff --git a/plugins/tech-insights/package.json b/plugins/tech-insights/package.json index 680641b1b0..1c912083fd 100644 --- a/plugins/tech-insights/package.json +++ b/plugins/tech-insights/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-tech-insights", - "version": "0.3.8-next.2", + "version": "0.3.8", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/tech-radar/CHANGELOG.md b/plugins/tech-radar/CHANGELOG.md index 4ad21662bd..694e07eeac 100644 --- a/plugins/tech-radar/CHANGELOG.md +++ b/plugins/tech-radar/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-tech-radar +## 0.6.2 + +### Patch Changes + +- e14dcfa4994: Update colors to match Zalando's tech radar, also add coloring on title and legend to match ring color. +- cb8ec97cdeb: Change black & white colors to be theme aware +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/core-plugin-api@1.5.0 + - @backstage/theme@0.2.18 + ## 0.6.2-next.2 ### Patch Changes diff --git a/plugins/tech-radar/package.json b/plugins/tech-radar/package.json index 273bd79255..f47e2a80c7 100644 --- a/plugins/tech-radar/package.json +++ b/plugins/tech-radar/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-tech-radar", "description": "A Backstage plugin that lets you display a Tech Radar for your organization", - "version": "0.6.2-next.2", + "version": "0.6.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/techdocs-addons-test-utils/CHANGELOG.md b/plugins/techdocs-addons-test-utils/CHANGELOG.md index 35dedb8a0b..6aad4ffd2d 100644 --- a/plugins/techdocs-addons-test-utils/CHANGELOG.md +++ b/plugins/techdocs-addons-test-utils/CHANGELOG.md @@ -1,5 +1,23 @@ # @backstage/plugin-techdocs-addons-test-utils +## 1.0.11 + +### Patch Changes + +- 2b00d8a225c: Fix bug/problem with test helper +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/plugin-catalog@1.9.0 + - @backstage/core-components@0.12.5 + - @backstage/plugin-techdocs-react@1.1.4 + - @backstage/plugin-search-react@1.5.1 + - @backstage/plugin-techdocs@1.6.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/test-utils@1.2.6 + - @backstage/core-app-api@1.6.0 + - @backstage/integration-react@1.1.11 + - @backstage/theme@0.2.18 + ## 1.0.11-next.2 ### Patch Changes diff --git a/plugins/techdocs-addons-test-utils/package.json b/plugins/techdocs-addons-test-utils/package.json index 8dc81b2cf7..d8c6242adc 100644 --- a/plugins/techdocs-addons-test-utils/package.json +++ b/plugins/techdocs-addons-test-utils/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-techdocs-addons-test-utils", - "version": "1.0.11-next.2", + "version": "1.0.11", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/techdocs-backend/CHANGELOG.md b/plugins/techdocs-backend/CHANGELOG.md index 8e4be204db..e39e58589d 100644 --- a/plugins/techdocs-backend/CHANGELOG.md +++ b/plugins/techdocs-backend/CHANGELOG.md @@ -1,5 +1,29 @@ # @backstage/plugin-techdocs-backend +## 1.6.0 + +### Minor Changes + +- 92b495328bd: Introduced alpha export of the `techdocsPlugin` using the new backend system. + +### Patch Changes + +- 40298b02778: Techdocs backend explains a bit more about what might have caused the docs not being found when building techdocs. +- 928a12a9b3e: Internal refactor of `/alpha` exports. +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/catalog-client@1.4.0 + - @backstage/plugin-techdocs-node@1.6.0 + - @backstage/backend-common@0.18.3 + - @backstage/errors@1.1.5 + - @backstage/backend-plugin-api@0.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/plugin-catalog-common@1.0.12 + - @backstage/integration@1.4.3 + - @backstage/plugin-permission-common@0.7.4 + - @backstage/config@1.0.7 + - @backstage/plugin-search-common@1.2.2 + ## 1.5.4-next.2 ### Patch Changes diff --git a/plugins/techdocs-backend/package.json b/plugins/techdocs-backend/package.json index 1d2f4400eb..1d6ca8931e 100644 --- a/plugins/techdocs-backend/package.json +++ b/plugins/techdocs-backend/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-techdocs-backend", "description": "The Backstage backend plugin that renders technical documentation for your components", - "version": "1.5.4-next.2", + "version": "1.6.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/techdocs-module-addons-contrib/CHANGELOG.md b/plugins/techdocs-module-addons-contrib/CHANGELOG.md index 69fa5d8cfd..005c38f64c 100644 --- a/plugins/techdocs-module-addons-contrib/CHANGELOG.md +++ b/plugins/techdocs-module-addons-contrib/CHANGELOG.md @@ -1,5 +1,19 @@ # @backstage/plugin-techdocs-module-addons-contrib +## 1.0.11 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- 37cf85fb85c: Fixed bug in IssueLink component where the URL was not generated properly when the repository was located inside a Gitlab subgroup +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/plugin-techdocs-react@1.1.4 + - @backstage/core-plugin-api@1.5.0 + - @backstage/integration-react@1.1.11 + - @backstage/integration@1.4.3 + - @backstage/theme@0.2.18 + ## 1.0.11-next.2 ### Patch Changes diff --git a/plugins/techdocs-module-addons-contrib/package.json b/plugins/techdocs-module-addons-contrib/package.json index b5aebb262c..12b30d3cc2 100644 --- a/plugins/techdocs-module-addons-contrib/package.json +++ b/plugins/techdocs-module-addons-contrib/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-techdocs-module-addons-contrib", "description": "Plugin module for contributed TechDocs Addons", - "version": "1.0.11-next.2", + "version": "1.0.11", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/techdocs-node/CHANGELOG.md b/plugins/techdocs-node/CHANGELOG.md index 28a11e4b57..f4221afc3a 100644 --- a/plugins/techdocs-node/CHANGELOG.md +++ b/plugins/techdocs-node/CHANGELOG.md @@ -1,5 +1,25 @@ # @backstage/plugin-techdocs-node +## 1.6.0 + +### Minor Changes + +- ea2bbef1b16: Added support for an HTTPS proxy for techdocs AWS S3 requests + +### Patch Changes + +- 65454876fb2: Minor API report tweaks +- bf493710f50: Update to a newer version of `@trendyol-js/openstack-swift-sdk` +- bfe350ef4ce: Fixed bug that prevented deletion of stale files when non-empty directories where tried to be deleted as well. +- Updated dependencies + - @backstage/backend-common@0.18.3 + - @backstage/errors@1.1.5 + - @backstage/catalog-model@1.2.1 + - @backstage/integration@1.4.3 + - @backstage/config@1.0.7 + - @backstage/integration-aws-node@0.1.2 + - @backstage/plugin-search-common@1.2.2 + ## 1.6.0-next.2 ### Patch Changes diff --git a/plugins/techdocs-node/package.json b/plugins/techdocs-node/package.json index a247ef483e..fe23c88367 100644 --- a/plugins/techdocs-node/package.json +++ b/plugins/techdocs-node/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-techdocs-node", "description": "Common node.js functionalities for TechDocs, to be shared between techdocs-backend plugin and techdocs-cli", - "version": "1.6.0-next.2", + "version": "1.6.0", "main": "src/index.ts", "types": "src/index.ts", "publishConfig": { diff --git a/plugins/techdocs-react/CHANGELOG.md b/plugins/techdocs-react/CHANGELOG.md index cbc52cf570..b0f163836a 100644 --- a/plugins/techdocs-react/CHANGELOG.md +++ b/plugins/techdocs-react/CHANGELOG.md @@ -1,5 +1,19 @@ # @backstage/plugin-techdocs-react +## 1.1.4 + +### Patch Changes + +- 65454876fb2: Minor API report tweaks +- 928a12a9b3e: Internal refactor of `/alpha` exports. +- 8adfda60ae1: Updated dependency `jss` to `~10.10.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/version-bridge@1.0.3 + ## 1.1.4-next.2 ### Patch Changes diff --git a/plugins/techdocs-react/package.json b/plugins/techdocs-react/package.json index ae8d7e21ae..c605838215 100644 --- a/plugins/techdocs-react/package.json +++ b/plugins/techdocs-react/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-techdocs-react", "description": "Shared frontend utilities for TechDocs and Addons", - "version": "1.1.4-next.2", + "version": "1.1.4", "publishConfig": { "access": "public", "main": "dist/index.esm.js", diff --git a/plugins/techdocs/CHANGELOG.md b/plugins/techdocs/CHANGELOG.md index 7ce9542731..f66e0fa3a4 100644 --- a/plugins/techdocs/CHANGELOG.md +++ b/plugins/techdocs/CHANGELOG.md @@ -1,5 +1,35 @@ # @backstage/plugin-techdocs +## 1.6.0 + +### Minor Changes + +- 3f75b7607ca: Add ability to pass icon as function to have ability to customize it by search item + +### Patch Changes + +- 65454876fb2: Minor API report tweaks +- 54a1e133b56: Fix bug that caused next and previous links not to work with certain versions of mkdocs-material +- f320c299c67: The HTML tag attributes in the documentation content inserted to shadow DOM is preserved to improve accessibility +- cb8ec97cdeb: Change black & white colors to be theme aware +- c10384a9235: Switch to using `LinkButton` instead of the deprecated `Button` +- 8adfda60ae1: Updated dependency `jss` to `~10.10.0`. +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- 238cf657c09: Copy to clipboard now works in a not secure context. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/plugin-techdocs-react@1.1.4 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/plugin-search-react@1.5.1 + - @backstage/errors@1.1.5 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/integration-react@1.1.11 + - @backstage/integration@1.4.3 + - @backstage/config@1.0.7 + - @backstage/theme@0.2.18 + - @backstage/plugin-search-common@1.2.2 + ## 1.6.0-next.2 ### Patch Changes diff --git a/plugins/techdocs/package.json b/plugins/techdocs/package.json index 88ebb91c1b..ae0a31ab4d 100644 --- a/plugins/techdocs/package.json +++ b/plugins/techdocs/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-techdocs", "description": "The Backstage plugin that renders technical documentation for your components", - "version": "1.6.0-next.2", + "version": "1.6.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/todo-backend/CHANGELOG.md b/plugins/todo-backend/CHANGELOG.md index 6abd6c3562..77e3c02668 100644 --- a/plugins/todo-backend/CHANGELOG.md +++ b/plugins/todo-backend/CHANGELOG.md @@ -1,5 +1,21 @@ # @backstage/plugin-todo-backend +## 0.1.40 + +### Patch Changes + +- 4120513412a: todo-backend is now exposed as a plugin which uses the new plugin system +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/catalog-client@1.4.0 + - @backstage/backend-common@0.18.3 + - @backstage/errors@1.1.5 + - @backstage/plugin-catalog-node@1.3.4 + - @backstage/backend-plugin-api@0.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/integration@1.4.3 + - @backstage/config@1.0.7 + ## 0.1.40-next.2 ### Patch Changes diff --git a/plugins/todo-backend/package.json b/plugins/todo-backend/package.json index cb37bc5eb5..ece341b736 100644 --- a/plugins/todo-backend/package.json +++ b/plugins/todo-backend/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-todo-backend", "description": "A Backstage backend plugin that lets you browse TODO comments in your source code", - "version": "0.1.40-next.2", + "version": "0.1.40", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/todo/CHANGELOG.md b/plugins/todo/CHANGELOG.md index 3e716065a1..1ea1c6ec88 100644 --- a/plugins/todo/CHANGELOG.md +++ b/plugins/todo/CHANGELOG.md @@ -1,5 +1,18 @@ # @backstage/plugin-todo +## 0.2.18 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/errors@1.1.5 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.18 + ## 0.2.18-next.2 ### Patch Changes diff --git a/plugins/todo/package.json b/plugins/todo/package.json index 6cc2491a78..0a0177f9d9 100644 --- a/plugins/todo/package.json +++ b/plugins/todo/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-todo", "description": "A Backstage plugin that lets you browse TODO comments in your source code", - "version": "0.2.18-next.2", + "version": "0.2.18", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/user-settings-backend/CHANGELOG.md b/plugins/user-settings-backend/CHANGELOG.md index 4bcf306e42..baecd1e286 100644 --- a/plugins/user-settings-backend/CHANGELOG.md +++ b/plugins/user-settings-backend/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-user-settings-backend +## 0.1.7 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.2.12 + - @backstage/backend-common@0.18.3 + - @backstage/errors@1.1.5 + - @backstage/backend-plugin-api@0.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/types@1.0.2 + ## 0.1.7-next.2 ### Patch Changes diff --git a/plugins/user-settings-backend/package.json b/plugins/user-settings-backend/package.json index a98e0e9313..c3757fc9cf 100644 --- a/plugins/user-settings-backend/package.json +++ b/plugins/user-settings-backend/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-user-settings-backend", "description": "The Backstage backend plugin to manage user settings", - "version": "0.1.7-next.2", + "version": "0.1.7", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/user-settings/CHANGELOG.md b/plugins/user-settings/CHANGELOG.md index 435fa2b2d4..85e175e822 100644 --- a/plugins/user-settings/CHANGELOG.md +++ b/plugins/user-settings/CHANGELOG.md @@ -1,5 +1,19 @@ # @backstage/plugin-user-settings +## 0.7.1 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/errors@1.1.5 + - @backstage/core-plugin-api@1.5.0 + - @backstage/core-app-api@1.6.0 + - @backstage/theme@0.2.18 + - @backstage/types@1.0.2 + ## 0.7.1-next.2 ### Patch Changes diff --git a/plugins/user-settings/package.json b/plugins/user-settings/package.json index e49c54687d..aa1b6f2fb7 100644 --- a/plugins/user-settings/package.json +++ b/plugins/user-settings/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-user-settings", "description": "A Backstage plugin that provides a settings page", - "version": "0.7.1-next.2", + "version": "0.7.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/vault-backend/CHANGELOG.md b/plugins/vault-backend/CHANGELOG.md index 31b822c68b..a5a5e8ddaa 100644 --- a/plugins/vault-backend/CHANGELOG.md +++ b/plugins/vault-backend/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-vault-backend +## 0.2.10 + +### Patch Changes + +- 66b3a3956b8: Ignore the `eslint` error +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/backend-tasks@0.5.0 + - @backstage/backend-common@0.18.3 + - @backstage/errors@1.1.5 + - @backstage/config@1.0.7 + ## 0.2.10-next.2 ### Patch Changes diff --git a/plugins/vault-backend/package.json b/plugins/vault-backend/package.json index 336363e9ad..41c9bef499 100644 --- a/plugins/vault-backend/package.json +++ b/plugins/vault-backend/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-vault-backend", "description": "A Backstage backend plugin that integrates towards Vault", - "version": "0.2.10-next.2", + "version": "0.2.10", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/vault/CHANGELOG.md b/plugins/vault/CHANGELOG.md index 1f6d8446bd..4cb3473c9f 100644 --- a/plugins/vault/CHANGELOG.md +++ b/plugins/vault/CHANGELOG.md @@ -1,5 +1,18 @@ # @backstage/plugin-vault +## 0.1.10 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/errors@1.1.5 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.18 + ## 0.1.10-next.2 ### Patch Changes diff --git a/plugins/vault/package.json b/plugins/vault/package.json index 127c9cf753..b5835661cd 100644 --- a/plugins/vault/package.json +++ b/plugins/vault/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-vault", "description": "A Backstage plugin that integrates towards Vault", - "version": "0.1.10-next.2", + "version": "0.1.10", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/xcmetrics/CHANGELOG.md b/plugins/xcmetrics/CHANGELOG.md index e9a2023939..617cb08281 100644 --- a/plugins/xcmetrics/CHANGELOG.md +++ b/plugins/xcmetrics/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-xcmetrics +## 0.2.36 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/errors@1.1.5 + - @backstage/core-plugin-api@1.5.0 + - @backstage/theme@0.2.18 + ## 0.2.36-next.2 ### Patch Changes diff --git a/plugins/xcmetrics/package.json b/plugins/xcmetrics/package.json index fb7695e090..2d549c7b84 100644 --- a/plugins/xcmetrics/package.json +++ b/plugins/xcmetrics/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-xcmetrics", "description": "A Backstage plugin that shows XCode build metrics for your components", - "version": "0.2.36-next.2", + "version": "0.2.36", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/yarn.lock b/yarn.lock index 5cb6af842b..878fea817f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3593,17 +3593,6 @@ __metadata: languageName: unknown linkType: soft -"@backstage/catalog-client@npm:^1.3.1": - version: 1.3.1 - resolution: "@backstage/catalog-client@npm:1.3.1" - dependencies: - "@backstage/catalog-model": ^1.2.0 - "@backstage/errors": ^1.1.4 - cross-fetch: ^3.1.5 - checksum: e2e0050d93f509fbaed40d89228ce9af7c9f32372c721d5faea29ef312e488cbfc1426959f39d61790d41406fbd6bc895bed2c3427bbdf6cab6a412f449c2efe - languageName: node - linkType: hard - "@backstage/catalog-client@workspace:^, @backstage/catalog-client@workspace:packages/catalog-client": version: 0.0.0-use.local resolution: "@backstage/catalog-client@workspace:packages/catalog-client" @@ -3616,22 +3605,7 @@ __metadata: languageName: unknown linkType: soft -"@backstage/catalog-model@npm:^1.1.3, @backstage/catalog-model@npm:^1.1.5, @backstage/catalog-model@npm:^1.2.0": - version: 1.2.0 - resolution: "@backstage/catalog-model@npm:1.2.0" - dependencies: - "@backstage/config": ^1.0.6 - "@backstage/errors": ^1.1.4 - "@backstage/types": ^1.0.2 - ajv: ^8.10.0 - json-schema: ^0.4.0 - lodash: ^4.17.21 - uuid: ^8.0.0 - checksum: d4e07e91e501b4ecbc9d0b754518277dd2ed93f22f801740cc539dbcbd905ba8111b1651d20fb725e44d7cd99a96faec6fd56cd51fdf8e1d7f39a6e177f31efa - languageName: node - linkType: hard - -"@backstage/catalog-model@workspace:^, @backstage/catalog-model@workspace:packages/catalog-model": +"@backstage/catalog-model@^1.1.3, @backstage/catalog-model@^1.1.5, @backstage/catalog-model@^1.2.0, @backstage/catalog-model@workspace:^, @backstage/catalog-model@workspace:packages/catalog-model": version: 0.0.0-use.local resolution: "@backstage/catalog-model@workspace:packages/catalog-model" dependencies: @@ -3846,17 +3820,7 @@ __metadata: languageName: unknown linkType: soft -"@backstage/config@npm:^1.0.4, @backstage/config@npm:^1.0.6": - version: 1.0.6 - resolution: "@backstage/config@npm:1.0.6" - dependencies: - "@backstage/types": ^1.0.2 - lodash: ^4.17.21 - checksum: 5cd2b409237091eb523a61c11df49c183ad1548dce90df343c9b0204eec7147508f41c832f931f82783c458ccdcc9d9fb73511cdd373fdb023db67bc738fcc67 - languageName: node - linkType: hard - -"@backstage/config@workspace:^, @backstage/config@workspace:packages/config": +"@backstage/config@^1.0.4, @backstage/config@workspace:^, @backstage/config@workspace:packages/config": version: 0.0.0-use.local resolution: "@backstage/config@workspace:packages/config" dependencies: @@ -3902,57 +3866,7 @@ __metadata: languageName: unknown linkType: soft -"@backstage/core-components@npm:^0.12.0, @backstage/core-components@npm:^0.12.3, @backstage/core-components@npm:^0.12.4": - version: 0.12.4 - resolution: "@backstage/core-components@npm:0.12.4" - dependencies: - "@backstage/config": ^1.0.6 - "@backstage/core-plugin-api": ^1.4.0 - "@backstage/errors": ^1.1.4 - "@backstage/theme": ^0.2.17 - "@backstage/version-bridge": ^1.0.3 - "@material-table/core": ^3.1.0 - "@material-ui/core": ^4.12.2 - "@material-ui/icons": ^4.9.1 - "@material-ui/lab": 4.0.0-alpha.57 - "@react-hookz/web": ^20.0.0 - "@types/react-sparklines": ^1.7.0 - "@types/react-text-truncate": ^0.14.0 - ansi-regex: ^6.0.1 - classnames: ^2.2.6 - d3-selection: ^3.0.0 - d3-shape: ^3.0.0 - d3-zoom: ^3.0.0 - dagre: ^0.8.5 - history: ^5.0.0 - immer: ^9.0.1 - lodash: ^4.17.21 - pluralize: ^8.0.0 - prop-types: ^15.7.2 - qs: ^6.9.4 - rc-progress: 3.4.1 - react-helmet: 6.1.0 - react-hook-form: ^7.12.2 - react-markdown: ^8.0.0 - react-sparklines: ^1.7.0 - react-syntax-highlighter: ^15.4.5 - react-text-truncate: ^0.19.0 - react-use: ^17.3.2 - react-virtualized-auto-sizer: ^1.0.6 - react-window: ^1.8.6 - remark-gfm: ^3.0.1 - zen-observable: ^0.10.0 - zod: ~3.18.0 - peerDependencies: - "@types/react": ^16.13.1 || ^17.0.0 - react: ^16.13.1 || ^17.0.0 - react-dom: ^16.13.1 || ^17.0.0 - react-router-dom: 6.0.0-beta.0 || ^6.3.0 - checksum: 476160ad54a399e7393bb70fc34fc01b69519431606797fdecc974d5e826315527d8ab71af5dd4d1c8d88bfe797aa37e781fd5fd31d8293c19982704e4f7cfdc - languageName: node - linkType: hard - -"@backstage/core-components@workspace:^, @backstage/core-components@workspace:packages/core-components": +"@backstage/core-components@^0.12.0, @backstage/core-components@^0.12.3, @backstage/core-components@^0.12.4, @backstage/core-components@workspace:^, @backstage/core-components@workspace:packages/core-components": version: 0.0.0-use.local resolution: "@backstage/core-components@workspace:packages/core-components" dependencies: @@ -4023,25 +3937,7 @@ __metadata: languageName: unknown linkType: soft -"@backstage/core-plugin-api@npm:^1.1.0, @backstage/core-plugin-api@npm:^1.3.0, @backstage/core-plugin-api@npm:^1.4.0": - version: 1.4.0 - resolution: "@backstage/core-plugin-api@npm:1.4.0" - dependencies: - "@backstage/config": ^1.0.6 - "@backstage/types": ^1.0.2 - "@backstage/version-bridge": ^1.0.3 - history: ^5.0.0 - prop-types: ^15.7.2 - zen-observable: ^0.10.0 - peerDependencies: - "@types/react": ^16.13.1 || ^17.0.0 - react: ^16.13.1 || ^17.0.0 - react-router-dom: 6.0.0-beta.0 || ^6.3.0 - checksum: 046d0fcb52b3110d6a926eeaf766486c753c2eeca70f7897f4ded45e0cf7da8591ec7df337433427bc50de7193e7a6d875356a027a8d1733fa07d87509e561a1 - languageName: node - linkType: hard - -"@backstage/core-plugin-api@workspace:^, @backstage/core-plugin-api@workspace:packages/core-plugin-api": +"@backstage/core-plugin-api@^1.1.0, @backstage/core-plugin-api@^1.3.0, @backstage/core-plugin-api@^1.4.0, @backstage/core-plugin-api@workspace:^, @backstage/core-plugin-api@workspace:packages/core-plugin-api": version: 0.0.0-use.local resolution: "@backstage/core-plugin-api@workspace:packages/core-plugin-api" dependencies: @@ -4126,17 +4022,6 @@ __metadata: languageName: unknown linkType: soft -"@backstage/errors@npm:^1.1.4": - version: 1.1.4 - resolution: "@backstage/errors@npm:1.1.4" - dependencies: - "@backstage/types": ^1.0.2 - cross-fetch: ^3.1.5 - serialize-error: ^8.0.1 - checksum: 1f0915a29fbeeff0e7fb82f1b4858248d99e9fa6a1aec65d617a241fab812f7939ec418ef0751370833753a2ee2c989463c5e26b40d7ea6aa297e5b6aee96584 - languageName: node - linkType: hard - "@backstage/errors@workspace:^, @backstage/errors@workspace:packages/errors": version: 0.0.0-use.local resolution: "@backstage/errors@workspace:packages/errors" @@ -4178,26 +4063,7 @@ __metadata: languageName: unknown linkType: soft -"@backstage/integration-react@npm:^1.1.10": - version: 1.1.10 - resolution: "@backstage/integration-react@npm:1.1.10" - dependencies: - "@backstage/config": ^1.0.6 - "@backstage/core-components": ^0.12.4 - "@backstage/core-plugin-api": ^1.4.0 - "@backstage/integration": ^1.4.2 - "@backstage/theme": ^0.2.17 - "@material-ui/core": ^4.12.2 - "@material-ui/icons": ^4.9.1 - "@material-ui/lab": 4.0.0-alpha.57 - react-use: ^17.2.4 - peerDependencies: - react: ^16.13.1 || ^17.0.0 - checksum: 248e11c74fed7fb6d5fcc9cf7f7d7baffe94a6a4091aff60afc46c797b08a63486baaffe32812c237e29e3cb295d429b1cd740ca704b43b7dc4704a910184716 - languageName: node - linkType: hard - -"@backstage/integration-react@workspace:^, @backstage/integration-react@workspace:packages/integration-react": +"@backstage/integration-react@^1.1.10, @backstage/integration-react@workspace:^, @backstage/integration-react@workspace:packages/integration-react": version: 0.0.0-use.local resolution: "@backstage/integration-react@workspace:packages/integration-react" dependencies: @@ -4224,22 +4090,6 @@ __metadata: languageName: unknown linkType: soft -"@backstage/integration@npm:^1.4.2": - version: 1.4.2 - resolution: "@backstage/integration@npm:1.4.2" - dependencies: - "@backstage/config": ^1.0.6 - "@backstage/errors": ^1.1.4 - "@octokit/auth-app": ^4.0.0 - "@octokit/rest": ^19.0.3 - cross-fetch: ^3.1.5 - git-url-parse: ^13.0.0 - lodash: ^4.17.21 - luxon: ^3.0.0 - checksum: b1fceb1c7d08d1db29529d1ba1d661019e9829dec8a004414fedc5ceec13b7087a1bdc7f4839e8e818f3386dc93aa94d74e8b65f9be75330a28b34305374126c - languageName: node - linkType: hard - "@backstage/integration@workspace:^, @backstage/integration@workspace:packages/integration": version: 0.0.0-use.local resolution: "@backstage/integration@workspace:packages/integration" @@ -5319,18 +5169,7 @@ __metadata: languageName: unknown linkType: soft -"@backstage/plugin-catalog-common@npm:^1.0.11, @backstage/plugin-catalog-common@npm:^1.0.8": - version: 1.0.11 - resolution: "@backstage/plugin-catalog-common@npm:1.0.11" - dependencies: - "@backstage/catalog-model": ^1.2.0 - "@backstage/plugin-permission-common": ^0.7.3 - "@backstage/plugin-search-common": ^1.2.1 - checksum: e0e37a96b4d97230c590fc4f1e17f252167a3cbbc79533c7e29a26d3480e82435c57ae6f7952aaf694bd8dc22245410c9fd29853249b1b73ed3a009dd49bce6b - languageName: node - linkType: hard - -"@backstage/plugin-catalog-common@workspace:^, @backstage/plugin-catalog-common@workspace:plugins/catalog-common": +"@backstage/plugin-catalog-common@^1.0.8, @backstage/plugin-catalog-common@workspace:^, @backstage/plugin-catalog-common@workspace:plugins/catalog-common": version: 0.0.0-use.local resolution: "@backstage/plugin-catalog-common@workspace:plugins/catalog-common" dependencies: @@ -5458,42 +5297,7 @@ __metadata: languageName: unknown linkType: soft -"@backstage/plugin-catalog-react@npm:^1.2.1, @backstage/plugin-catalog-react@npm:^1.2.4, @backstage/plugin-catalog-react@npm:^1.3.0": - version: 1.3.0 - resolution: "@backstage/plugin-catalog-react@npm:1.3.0" - dependencies: - "@backstage/catalog-client": ^1.3.1 - "@backstage/catalog-model": ^1.2.0 - "@backstage/core-components": ^0.12.4 - "@backstage/core-plugin-api": ^1.4.0 - "@backstage/errors": ^1.1.4 - "@backstage/integration": ^1.4.2 - "@backstage/plugin-catalog-common": ^1.0.11 - "@backstage/plugin-permission-common": ^0.7.3 - "@backstage/plugin-permission-react": ^0.4.10 - "@backstage/theme": ^0.2.17 - "@backstage/types": ^1.0.2 - "@backstage/version-bridge": ^1.0.3 - "@material-ui/core": ^4.12.2 - "@material-ui/icons": ^4.9.1 - "@material-ui/lab": 4.0.0-alpha.57 - classnames: ^2.2.6 - jwt-decode: ^3.1.0 - lodash: ^4.17.21 - material-ui-popup-state: ^1.9.3 - qs: ^6.9.4 - react-use: ^17.2.4 - yaml: ^2.0.0 - zen-observable: ^0.10.0 - peerDependencies: - "@types/react": ^16.13.1 || ^17.0.0 - react: ^16.13.1 || ^17.0.0 - react-router-dom: 6.0.0-beta.0 || ^6.3.0 - checksum: 03cd5a270154c0cde63bd33104d11ba5811690205c697441f207606d961935f5c45ad2a8e17f591c5ac8b294601c1855852bac35ccb30125e2ab6df13daf82d2 - languageName: node - linkType: hard - -"@backstage/plugin-catalog-react@workspace:^, @backstage/plugin-catalog-react@workspace:plugins/catalog-react": +"@backstage/plugin-catalog-react@^1.2.1, @backstage/plugin-catalog-react@^1.2.4, @backstage/plugin-catalog-react@^1.3.0, @backstage/plugin-catalog-react@workspace:^, @backstage/plugin-catalog-react@workspace:plugins/catalog-react": version: 0.0.0-use.local resolution: "@backstage/plugin-catalog-react@workspace:plugins/catalog-react" dependencies: @@ -6680,30 +6484,7 @@ __metadata: languageName: unknown linkType: soft -"@backstage/plugin-home@npm:^0.4.30": - version: 0.4.31 - resolution: "@backstage/plugin-home@npm:0.4.31" - dependencies: - "@backstage/catalog-model": ^1.2.0 - "@backstage/config": ^1.0.6 - "@backstage/core-components": ^0.12.4 - "@backstage/core-plugin-api": ^1.4.0 - "@backstage/plugin-catalog-react": ^1.3.0 - "@backstage/theme": ^0.2.17 - "@material-ui/core": ^4.12.2 - "@material-ui/icons": ^4.9.1 - "@material-ui/lab": 4.0.0-alpha.57 - lodash: ^4.17.21 - react-use: ^17.2.4 - peerDependencies: - "@types/react": ^16.13.1 || ^17.0.0 - react: ^16.13.1 || ^17.0.0 - react-router-dom: 6.0.0-beta.0 || ^6.3.0 - checksum: 2ba5d377713540a4f9ab7083bc1595361678b59c80d57f26f2fe0bd660ec77926a6bfdeb52a2c6179e809e5186360333ae1bb41f51e741c4bdb7fc3edfda60c3 - languageName: node - linkType: hard - -"@backstage/plugin-home@workspace:^, @backstage/plugin-home@workspace:plugins/home": +"@backstage/plugin-home@^0.4.30, @backstage/plugin-home@workspace:^, @backstage/plugin-home@workspace:plugins/home": version: 0.0.0-use.local resolution: "@backstage/plugin-home@workspace:plugins/home" dependencies: @@ -7397,20 +7178,6 @@ __metadata: languageName: unknown linkType: soft -"@backstage/plugin-permission-common@npm:^0.7.3": - version: 0.7.3 - resolution: "@backstage/plugin-permission-common@npm:0.7.3" - dependencies: - "@backstage/config": ^1.0.6 - "@backstage/errors": ^1.1.4 - "@backstage/types": ^1.0.2 - cross-fetch: ^3.1.5 - uuid: ^8.0.0 - zod: ~3.18.0 - checksum: b3aa1e4a487ec7c4edd20c60bc216ee54841431e8e932fa9778c72f13dfa369044186f9afbf44316a9017e9bca0ffa774bbec7847711f04557981fb7cd6af080 - languageName: node - linkType: hard - "@backstage/plugin-permission-common@workspace:^, @backstage/plugin-permission-common@workspace:plugins/permission-common": version: 0.0.0-use.local resolution: "@backstage/plugin-permission-common@workspace:plugins/permission-common" @@ -7448,24 +7215,6 @@ __metadata: languageName: unknown linkType: soft -"@backstage/plugin-permission-react@npm:^0.4.10": - version: 0.4.10 - resolution: "@backstage/plugin-permission-react@npm:0.4.10" - dependencies: - "@backstage/config": ^1.0.6 - "@backstage/core-plugin-api": ^1.4.0 - "@backstage/plugin-permission-common": ^0.7.3 - cross-fetch: ^3.1.5 - react-use: ^17.2.4 - swr: ^2.0.0 - peerDependencies: - "@types/react": ^16.13.1 || ^17.0.0 - react: ^16.13.1 || ^17.0.0 - react-router-dom: 6.0.0-beta.0 || ^6.3.0 - checksum: f7a82648a31a8fe9873492abdbcc524549205e3fd11fe144ab225e6263ce2b2e46abd642e6c370d692d424c51e7c55b9259d8178500f9bfbfc9267d09596843c - languageName: node - linkType: hard - "@backstage/plugin-permission-react@workspace:^, @backstage/plugin-permission-react@workspace:plugins/permission-react": version: 0.0.0-use.local resolution: "@backstage/plugin-permission-react@workspace:plugins/permission-react" @@ -8029,16 +7778,6 @@ __metadata: languageName: unknown linkType: soft -"@backstage/plugin-search-common@npm:^1.2.1": - version: 1.2.1 - resolution: "@backstage/plugin-search-common@npm:1.2.1" - dependencies: - "@backstage/plugin-permission-common": ^0.7.3 - "@backstage/types": ^1.0.2 - checksum: ebeacfd26dccd906e1d72f8b2df4a585294e31c6759aaabe0de245f0d93dfc1e0f44b8359e951116c619a7700bf71d22dad901c9fbd6dfb79b9385832989fe00 - languageName: node - linkType: hard - "@backstage/plugin-search-common@workspace:^, @backstage/plugin-search-common@workspace:plugins/search-common": version: 0.0.0-use.local resolution: "@backstage/plugin-search-common@workspace:plugins/search-common" @@ -8998,16 +8737,7 @@ __metadata: languageName: unknown linkType: soft -"@backstage/theme@npm:^0.2.16, @backstage/theme@npm:^0.2.17": - version: 0.2.17 - resolution: "@backstage/theme@npm:0.2.17" - dependencies: - "@material-ui/core": ^4.12.2 - checksum: 4be1d9bf2c3fce611a75f3b5b80f91365dcb67b8e5a417f9c760ffbc9c6f3dd9c243082347278569ad343cf017b76ebaf2143eb9aebfa07a58513c38dbbca97e - languageName: node - linkType: hard - -"@backstage/theme@workspace:^, @backstage/theme@workspace:packages/theme": +"@backstage/theme@^0.2.16, @backstage/theme@^0.2.17, @backstage/theme@workspace:^, @backstage/theme@workspace:packages/theme": version: 0.0.0-use.local resolution: "@backstage/theme@workspace:packages/theme" dependencies: @@ -9016,7 +8746,7 @@ __metadata: languageName: unknown linkType: soft -"@backstage/types@^1.0.1, @backstage/types@^1.0.2, @backstage/types@workspace:^, @backstage/types@workspace:packages/types": +"@backstage/types@^1.0.1, @backstage/types@workspace:^, @backstage/types@workspace:packages/types": version: 0.0.0-use.local resolution: "@backstage/types@workspace:packages/types" dependencies: @@ -9027,7 +8757,7 @@ __metadata: languageName: unknown linkType: soft -"@backstage/version-bridge@^1.0.2, @backstage/version-bridge@^1.0.3, @backstage/version-bridge@workspace:^, @backstage/version-bridge@workspace:packages/version-bridge": +"@backstage/version-bridge@^1.0.2, @backstage/version-bridge@workspace:^, @backstage/version-bridge@workspace:packages/version-bridge": version: 0.0.0-use.local resolution: "@backstage/version-bridge@workspace:packages/version-bridge" dependencies: From 5e959c9eb62d76f3ac482b97063747a2b98a6cdc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20Adel=C3=B6w?= Date: Tue, 14 Mar 2023 15:58:09 +0100 Subject: [PATCH 088/177] vault-backend: accept interface, not concrete client MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Fredrik Adelöw --- .changeset/khaki-doors-compare.md | 5 ++++ plugins/vault-backend/api-report.md | 5 +--- .../vault-backend/src/service/VaultBuilder.ts | 27 ++++++++++--------- plugins/vault-backend/src/service/vaultApi.ts | 2 +- 4 files changed, 21 insertions(+), 18 deletions(-) create mode 100644 .changeset/khaki-doors-compare.md diff --git a/.changeset/khaki-doors-compare.md b/.changeset/khaki-doors-compare.md new file mode 100644 index 0000000000..a2c4de020a --- /dev/null +++ b/.changeset/khaki-doors-compare.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-vault-backend': minor +--- + +Allow generic Vault clients to be passed into the builder diff --git a/plugins/vault-backend/api-report.md b/plugins/vault-backend/api-report.md index 2b1fb14bd0..4890e585b4 100644 --- a/plugins/vault-backend/api-report.md +++ b/plugins/vault-backend/api-report.md @@ -33,12 +33,9 @@ export interface VaultApi { export class VaultBuilder { constructor(env: VaultEnvironment); build(): VaultBuilderReturn; - protected buildRouter(vaultClient: VaultClient): express.Router; static createBuilder(env: VaultEnvironment): VaultBuilder; enableTokenRenew(schedule?: TaskRunner): Promise; - // (undocumented) - protected readonly env: VaultEnvironment; - setVaultClient(vaultClient: VaultClient): this; + setVaultClient(vaultApi: VaultApi): this; } // @public diff --git a/plugins/vault-backend/src/service/VaultBuilder.ts b/plugins/vault-backend/src/service/VaultBuilder.ts index 788b90ff01..a61d99ac70 100644 --- a/plugins/vault-backend/src/service/VaultBuilder.ts +++ b/plugins/vault-backend/src/service/VaultBuilder.ts @@ -19,7 +19,7 @@ import { InputError } from '@backstage/errors'; import { Logger } from 'winston'; import express from 'express'; import Router from 'express-promise-router'; -import { VaultClient } from './vaultApi'; +import { VaultApi, VaultClient } from './vaultApi'; import { TaskRunner, PluginTaskScheduler } from '@backstage/backend-tasks'; import { errorHandler } from '@backstage/backend-common'; @@ -47,7 +47,7 @@ export type VaultBuilderReturn = { * @public */ export class VaultBuilder { - private vaultClient?: VaultClient; + private vaultApi?: VaultApi; /** * Creates a new instance of the VaultBuilder. @@ -58,7 +58,8 @@ export class VaultBuilder { static createBuilder(env: VaultEnvironment) { return new VaultBuilder(env); } - constructor(protected readonly env: VaultEnvironment) {} + + constructor(private readonly env: VaultEnvironment) {} /** * Builds the routes for Vault. @@ -79,9 +80,9 @@ export class VaultBuilder { }; } - this.vaultClient = this.vaultClient ?? new VaultClient(this.env); + this.vaultApi = this.vaultApi ?? new VaultClient(this.env); - const router = this.buildRouter(this.vaultClient); + const router = this.buildRouter(this.vaultApi); return { router: router, @@ -91,11 +92,11 @@ export class VaultBuilder { /** * Overwrites the current vault client. * - * @param vaultClient - The new Vault client + * @param vaultApi - The new Vault client * @returns */ - public setVaultClient(vaultClient: VaultClient) { - this.vaultClient = vaultClient; + public setVaultClient(vaultApi: VaultApi) { + this.vaultApi = vaultApi; return this; } @@ -116,8 +117,8 @@ export class VaultBuilder { id: 'refresh-vault-token', fn: async () => { this.env.logger.info('Renewing Vault token'); - const vaultClient = this.vaultClient ?? new VaultClient(this.env); - await vaultClient.renewToken(); + const vaultApi = this.vaultApi ?? new VaultClient(this.env); + await vaultApi.renewToken?.(); }, }); return this; @@ -126,10 +127,10 @@ export class VaultBuilder { /** * Builds the backend routes for Vault. * - * @param vaultClient - The Vault client used to list the secrets. + * @param vaultApi - The Vault client used to list the secrets. * @returns The generated backend router */ - protected buildRouter(vaultClient: VaultClient): express.Router { + private buildRouter(vaultApi: VaultApi): express.Router { const router = Router(); router.use(express.json()); @@ -143,7 +144,7 @@ export class VaultBuilder { throw new InputError(`Invalid path: ${path}`); } - const secrets = await vaultClient.listSecrets(path); + const secrets = await vaultApi.listSecrets(path); res.json({ items: secrets }); }); diff --git a/plugins/vault-backend/src/service/vaultApi.ts b/plugins/vault-backend/src/service/vaultApi.ts index 7510ff218e..b75ea76368 100644 --- a/plugins/vault-backend/src/service/vaultApi.ts +++ b/plugins/vault-backend/src/service/vaultApi.ts @@ -56,7 +56,7 @@ type RenewTokenResponse = { */ export interface VaultApi { /** - * Returns the URL to acces the Vault UI with the defined config. + * Returns the URL to access the Vault UI with the defined config. */ getFrontendSecretsUrl(): string; /** From e185fd1e5de583b67852093b534229bfd2cd58ff Mon Sep 17 00:00:00 2001 From: Brian Fletcher Date: Tue, 14 Mar 2023 15:18:32 +0000 Subject: [PATCH 089/177] add a test Signed-off-by: Brian Fletcher --- .../AwsIamKubernetesAuthTranslator.test.ts | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/plugins/kubernetes-backend/src/kubernetes-auth-translator/AwsIamKubernetesAuthTranslator.test.ts b/plugins/kubernetes-backend/src/kubernetes-auth-translator/AwsIamKubernetesAuthTranslator.test.ts index 2696587e69..1f8d525ea8 100644 --- a/plugins/kubernetes-backend/src/kubernetes-auth-translator/AwsIamKubernetesAuthTranslator.test.ts +++ b/plugins/kubernetes-backend/src/kubernetes-auth-translator/AwsIamKubernetesAuthTranslator.test.ts @@ -17,6 +17,13 @@ import AWS from 'aws-sdk'; import AWSMock from 'aws-sdk-mock'; import { AwsIamKubernetesAuthTranslator } from './AwsIamKubernetesAuthTranslator'; +const awsError: AWS.AWSError = { + code: '123', + message: 'no way', + name: 'nope', + time: new Date(), +}; + describe('AwsIamKubernetesAuthTranslator tests', () => { let role: any = undefined; const credentials: any = { @@ -84,6 +91,25 @@ describe('AwsIamKubernetesAuthTranslator tests', () => { expect(response.serviceAccountToken).toBeDefined(); }); + describe('When the credentials is failing', () => { + beforeEach(() => { + jest.spyOn(AWS.config, 'getCredentials').mockImplementation(cb => { + cb(awsError, null); + }); + }); + it('throws the right error', async () => { + const authTranslator = new AwsIamKubernetesAuthTranslator(); + await expect( + authTranslator.decorateClusterDetailsWithAuth({ + assumeRole: role, + name: 'test-cluster', + url: '', + authProvider: 'aws', + }), + ).rejects.toEqual(awsError); + }); + }); + describe('When the role is assumed', () => { // These credentials are not real. // Pulled from example in docs: https://docs.aws.amazon.com/general/latest/gr/aws-sec-cred-types.html From 7245e744ab1883b7162a3ee6c157b903cec1def1 Mon Sep 17 00:00:00 2001 From: Tim Hansen Date: Tue, 14 Mar 2023 11:46:16 -0600 Subject: [PATCH 090/177] Fix colors in HeaderLabel not following page theme Signed-off-by: Tim Hansen --- .changeset/thirty-crabs-tell.md | 5 +++++ .../src/layout/HeaderLabel/HeaderLabel.tsx | 9 +++++---- 2 files changed, 10 insertions(+), 4 deletions(-) create mode 100644 .changeset/thirty-crabs-tell.md diff --git a/.changeset/thirty-crabs-tell.md b/.changeset/thirty-crabs-tell.md new file mode 100644 index 0000000000..2ca5e8cd34 --- /dev/null +++ b/.changeset/thirty-crabs-tell.md @@ -0,0 +1,5 @@ +--- +'@backstage/core-components': patch +--- + +Fixed the font color on `BackstageHeaderLabel` to respect the active page theme. diff --git a/packages/core-components/src/layout/HeaderLabel/HeaderLabel.tsx b/packages/core-components/src/layout/HeaderLabel/HeaderLabel.tsx index e3b6299f85..757aca688a 100644 --- a/packages/core-components/src/layout/HeaderLabel/HeaderLabel.tsx +++ b/packages/core-components/src/layout/HeaderLabel/HeaderLabel.tsx @@ -14,8 +14,9 @@ * limitations under the License. */ +import { BackstageTheme } from '@backstage/theme'; import Grid from '@material-ui/core/Grid'; -import { makeStyles } from '@material-ui/core/styles'; +import { alpha, makeStyles } from '@material-ui/core/styles'; import Typography from '@material-ui/core/Typography'; import React from 'react'; import { Link } from '../../components/Link'; @@ -23,13 +24,13 @@ import { Link } from '../../components/Link'; /** @public */ export type HeaderLabelClassKey = 'root' | 'label' | 'value'; -const useStyles = makeStyles( +const useStyles = makeStyles( theme => ({ root: { textAlign: 'left', }, label: { - color: theme.palette.common.white, + color: theme.page.fontColor, fontWeight: theme.typography.fontWeightBold, letterSpacing: 0, fontSize: theme.typography.fontSize, @@ -37,7 +38,7 @@ const useStyles = makeStyles( lineHeight: 1, }, value: { - color: 'rgba(255, 255, 255, 0.8)', + color: alpha(theme.page.fontColor, 0.8), fontSize: theme.typography.fontSize, lineHeight: 1, }, From 83d250badc60fb7c450f6497582fd95bce2acc4a Mon Sep 17 00:00:00 2001 From: Brian Fletcher Date: Tue, 14 Mar 2023 19:44:18 +0000 Subject: [PATCH 091/177] fix bug where response is badly formed. (#16830) * fix bug where response is badly formed. Ideally the client would validate that the response is in the format it expects upfront before any of this processing is done. This change provides a minimal fix. Signed-off-by: Brian Fletcher * Update plugins/kubernetes-backend/src/service/KubernetesFanOutHandler.ts Co-authored-by: Sam Blausten Signed-off-by: Brian Fletcher * prettier Signed-off-by: Brian Fletcher --------- Signed-off-by: Brian Fletcher Co-authored-by: Sam Blausten --- .changeset/old-cougars-sit.md | 5 +++ .../service/KubernetesFanOutHandler.test.ts | 41 +++++++++++++++++++ .../src/service/KubernetesFanOutHandler.ts | 2 +- 3 files changed, 47 insertions(+), 1 deletion(-) create mode 100644 .changeset/old-cougars-sit.md diff --git a/.changeset/old-cougars-sit.md b/.changeset/old-cougars-sit.md new file mode 100644 index 0000000000..cdab8b1291 --- /dev/null +++ b/.changeset/old-cougars-sit.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-kubernetes-backend': patch +--- + +Fix parsing error when kubernetes api is returning badly structured data. diff --git a/plugins/kubernetes-backend/src/service/KubernetesFanOutHandler.test.ts b/plugins/kubernetes-backend/src/service/KubernetesFanOutHandler.test.ts index 17a86eb30d..53aaa1ad3a 100644 --- a/plugins/kubernetes-backend/src/service/KubernetesFanOutHandler.test.ts +++ b/plugins/kubernetes-backend/src/service/KubernetesFanOutHandler.test.ts @@ -502,6 +502,47 @@ describe('getKubernetesObjectsByEntity', () => { }); }); + it('pods api is returning garbage', async () => { + getClustersByEntity.mockImplementation(() => + Promise.resolve({ + clusters: [ + { + name: 'test-cluster', + authProvider: 'serviceAccount', + }, + ], + }), + ); + + fetchObjectsForService.mockImplementation((_: ObjectFetchParams) => + Promise.resolve({ + errors: [], + responses: [ + { + garbage: ['thrash', 'rubbish'], + }, + ], + }), + ); + + mockMetrics(fetchPodMetricsByNamespaces); + + const sut = getKubernetesFanOutHandler([]); + + const result = await sut.getKubernetesObjectsByEntity({ + entity, + auth: {}, + }); + + expect(getClustersByEntity.mock.calls.length).toBe(1); + expect(fetchObjectsForService.mock.calls.length).toBe(1); + expect(fetchPodMetricsByNamespaces.mock.calls.length).toBe(0); + + expect(result).toStrictEqual({ + items: [], + }); + }); + it('retrieve objects for two clusters', async () => { getClustersByEntity.mockImplementation(() => Promise.resolve({ diff --git a/plugins/kubernetes-backend/src/service/KubernetesFanOutHandler.ts b/plugins/kubernetes-backend/src/service/KubernetesFanOutHandler.ts index 63e46a44e3..e0a6c21c4a 100644 --- a/plugins/kubernetes-backend/src/service/KubernetesFanOutHandler.ts +++ b/plugins/kubernetes-backend/src/service/KubernetesFanOutHandler.ts @@ -324,7 +324,7 @@ export class KubernetesFanOutHandler { (item.errors !== undefined && item.errors.length >= 1) || (item.resources !== undefined && item.resources.length >= 1 && - item.resources.some(fr => fr.resources.length >= 1)), + item.resources.some(fr => fr.resources?.length >= 1)), ), }; } From 3984e7b44d9d8e649006a31d7377ad915a43200b Mon Sep 17 00:00:00 2001 From: Jamie Klassen Date: Tue, 14 Mar 2023 00:06:56 -0400 Subject: [PATCH 092/177] backfill tests for GitLabClient's org data methods Signed-off-by: Jamie Klassen --- .../src/lib/client.test.ts | 136 ++++++++++++++++++ .../src/lib/client.ts | 15 +- 2 files changed, 141 insertions(+), 10 deletions(-) diff --git a/plugins/catalog-backend-module-gitlab/src/lib/client.test.ts b/plugins/catalog-backend-module-gitlab/src/lib/client.test.ts index 513a5b937f..4ac7d23390 100644 --- a/plugins/catalog-backend-module-gitlab/src/lib/client.test.ts +++ b/plugins/catalog-backend-module-gitlab/src/lib/client.test.ts @@ -21,6 +21,7 @@ import { getVoidLogger } from '@backstage/backend-common'; import { rest } from 'msw'; import { setupServer, SetupServerApi } from 'msw/node'; import { GitLabClient, paginated } from './client'; +import { GitLabUser } from './types'; const server = setupServer(); setupRequestMockHandlers(server); @@ -259,6 +260,141 @@ describe('GitLabClient', () => { expect(allProjects).toHaveLength(2); }); }); + + it('listUsers gets all users in the instance', async () => { + server.use( + rest.get(`${MOCK_CONFIG.apiBaseUrl}/users`, (_, res, ctx) => + res( + ctx.set('x-next-page', ''), + ctx.json([ + { + id: 1, + username: 'test1', + name: 'Test Testit', + state: 'active', + avatar_url: 'https://secure.gravatar.com/', + web_url: 'https://gitlab.example/test1', + created_at: '2023-01-19T07:27:03.333Z', + bio: '', + location: null, + public_email: null, + skype: '', + linkedin: '', + twitter: '', + website_url: '', + organization: null, + job_title: '', + pronouns: null, + bot: false, + work_information: null, + followers: 0, + following: 0, + is_followed: false, + local_time: null, + last_sign_in_at: '2023-01-19T07:27:49.601Z', + confirmed_at: '2023-01-19T07:27:02.905Z', + last_activity_on: '2023-01-19', + email: 'test@example.com', + theme_id: 1, + color_scheme_id: 1, + projects_limit: 100000, + current_sign_in_at: '2023-01-19T09:09:10.676Z', + identities: [], + can_create_group: true, + can_create_project: true, + two_factor_enabled: false, + external: false, + private_profile: false, + commit_email: 'test@example.com', + is_admin: false, + note: '', + }, + ]), + ), + ), + ); + const client = new GitLabClient({ + config: MOCK_CONFIG, + logger: getVoidLogger(), + }); + + const allUsers: GitLabUser[] = []; + for await (const user of paginated( + options => client.listUsers(options), + {}, + )) { + allUsers.push(user); + } + + expect(allUsers).toMatchObject([ + { + id: 1, + username: 'test1', + email: 'test@example.com', + name: 'Test Testit', + state: 'active', + web_url: 'https://gitlab.example/test1', + avatar_url: 'https://secure.gravatar.com/', + }, + ]); + }); + it('listGroups gets all groups in the instance', async () => { + server.use( + rest.get(`${MOCK_CONFIG.apiBaseUrl}/groups`, (_, res, ctx) => + res( + ctx.set('x-next-page', ''), + ctx.json([ + { + id: 1, + web_url: 'https://gitlab.example/groups/group1', + name: 'group1', + path: 'group1', + description: '', + visibility: 'internal', + share_with_group_lock: false, + require_two_factor_authentication: false, + two_factor_grace_period: 48, + project_creation_level: 'developer', + auto_devops_enabled: null, + subgroup_creation_level: 'owner', + emails_disabled: null, + mentions_disabled: null, + lfs_enabled: true, + default_branch_protection: 2, + avatar_url: null, + request_access_enabled: false, + full_name: '8020', + full_path: '8020', + created_at: '2017-06-19T06:42:34.160Z', + parent_id: null, + }, + ]), + ), + ), + ); + const client = new GitLabClient({ + config: MOCK_CONFIG, + logger: getVoidLogger(), + }); + + const allGroups: GitLabGroup[] = []; + for await (const group of paginated( + options => client.listGroups(options), + {}, + )) { + allGroups.push(group); + } + + expect(allGroups).toMatchObject([ + { + id: 1, + name: 'group1', + full_path: '8020', + description: '', + parent_id: null, + }, + ]); + }); }); describe('paginated', () => { diff --git a/plugins/catalog-backend-module-gitlab/src/lib/client.ts b/plugins/catalog-backend-module-gitlab/src/lib/client.ts index bad0eb2a86..e36c0d72c6 100644 --- a/plugins/catalog-backend-module-gitlab/src/lib/client.ts +++ b/plugins/catalog-backend-module-gitlab/src/lib/client.ts @@ -78,16 +78,11 @@ export class GitLabClient { async listUsers( options?: UserListOptions, ): Promise> { - let requestOptions = options; - - if (!requestOptions) { - requestOptions = {}; - } - - requestOptions.without_project_bots = true; - requestOptions.exclude_internal = true; - - return this.pagedRequest(`/users?`, requestOptions); + return this.pagedRequest(`/users?`, { + ...options, + without_project_bots: true, + exclude_internal: true, + }); } async listGroups( From 7b1b7bfdb7b8e9ee13bbe3245c4acb1e4fda4f52 Mon Sep 17 00:00:00 2001 From: Jamie Klassen Date: Tue, 14 Mar 2023 16:11:29 -0400 Subject: [PATCH 093/177] get group members via graphQL The new `getGroupMembers` method replaces the existing `getUserMemberships` on `GitLabClient`. Signed-off-by: Jamie Klassen --- .changeset/hungry-lies-cry.md | 8 +++ docs/integrations/gitlab/org.md | 25 +++++---- .../src/lib/client.test.ts | 32 ++++++++++- .../src/lib/client.ts | 55 +++++++++++-------- .../src/lib/types.ts | 18 ++++-- .../GitlabOrgDiscoveryEntityProvider.test.ts | 32 ++++++----- .../GitlabOrgDiscoveryEntityProvider.ts | 48 +++++++--------- 7 files changed, 132 insertions(+), 86 deletions(-) create mode 100644 .changeset/hungry-lies-cry.md diff --git a/.changeset/hungry-lies-cry.md b/.changeset/hungry-lies-cry.md new file mode 100644 index 0000000000..712aef6172 --- /dev/null +++ b/.changeset/hungry-lies-cry.md @@ -0,0 +1,8 @@ +--- +'@backstage/plugin-catalog-backend-module-gitlab': patch +--- + +The gitlab org data integration now makes use of the GraphQL API to determine +the relationships between imported User and Group entities, effectively making +this integration usable without an administrator account's Personal Access +Token. diff --git a/docs/integrations/gitlab/org.md b/docs/integrations/gitlab/org.md index 7ddc5202b5..d78b0ed388 100644 --- a/docs/integrations/gitlab/org.md +++ b/docs/integrations/gitlab/org.md @@ -2,15 +2,14 @@ id: org title: GitLab Organizational Data sidebar_label: Org Data -description: Importing users and groups from a GitLab organization into Backstage +description: Importing users and groups from GitLab into Backstage --- -The Backstage catalog can be set up to ingest organizational data - users and -teams - directly from an organization in GitLab. The result -is a hierarchy of +The Backstage catalog can be set up to ingest organizational data -- users and +groups -- directly from GitLab. The result is a hierarchy of [`User`](../../features/software-catalog/descriptor-format.md#kind-user) and -[`Group`](../../features/software-catalog/descriptor-format.md#kind-group) kind -entities that mirror your org setup. +[`Group`](../../features/software-catalog/descriptor-format.md#kind-group) +entities that mirrors your org setup. ```yaml integrations: @@ -19,10 +18,11 @@ integrations: token: ${GITLAB_TOKEN} ``` -This will query all users and groups from your gitlab installation. Depending on the size -of the Gitlab Instance, this can take some time and resources. +This will query all users and groups from your GitLab instance. Depending on the +amount of data, this can take significant time and resources. -The token that is used for the Organization Integration, has to be an Admin Personal Access Token (PAT). +The token used must have the `read_api` scope, and the Users and Groups fetched +will be those visible to the account which provisioned the token. ```yaml catalog: @@ -35,6 +35,7 @@ catalog: groupPattern: '[\s\S]*' # Optional. Filters found groups based on provided pattern. Defaults to `[\s\S]*`, which means to not filter anything ``` -When the `group` parameter is provided, the corresponding path prefix will be stripped out from each matching group -when computing the unique entity name. e.g. If `group` is `org/teams`, the name for `org/teams/avengers/gotg` will -be `avengers-gotg`. +When the `group` parameter is provided, the corresponding path prefix will be +stripped out from each matching group when computing the unique entity name. +e.g. If `group` is `org/teams`, the name for `org/teams/avengers/gotg` will be +`avengers-gotg`. diff --git a/plugins/catalog-backend-module-gitlab/src/lib/client.test.ts b/plugins/catalog-backend-module-gitlab/src/lib/client.test.ts index 4ac7d23390..66c04f6cc4 100644 --- a/plugins/catalog-backend-module-gitlab/src/lib/client.test.ts +++ b/plugins/catalog-backend-module-gitlab/src/lib/client.test.ts @@ -18,10 +18,10 @@ import { ConfigReader } from '@backstage/config'; import { setupRequestMockHandlers } from '@backstage/backend-test-utils'; import { readGitLabIntegrationConfig } from '@backstage/integration'; import { getVoidLogger } from '@backstage/backend-common'; -import { rest } from 'msw'; +import { graphql, rest } from 'msw'; import { setupServer, SetupServerApi } from 'msw/node'; import { GitLabClient, paginated } from './client'; -import { GitLabUser } from './types'; +import { GitLabGroup, GitLabUser } from './types'; const server = setupServer(); setupRequestMockHandlers(server); @@ -31,6 +31,7 @@ const MOCK_CONFIG = readGitLabIntegrationConfig( host: 'example.com', token: 'test-token', apiBaseUrl: 'https://example.com/api/v4', + baseUrl: 'https://example.com', }), ); const FAKE_PAGED_ENDPOINT = `/some-endpoint`; @@ -338,6 +339,7 @@ describe('GitLabClient', () => { }, ]); }); + it('listGroups gets all groups in the instance', async () => { server.use( rest.get(`${MOCK_CONFIG.apiBaseUrl}/groups`, (_, res, ctx) => @@ -395,6 +397,32 @@ describe('GitLabClient', () => { }, ]); }); + + it('getGroupMembers gets member IDs', async () => { + server.use( + graphql + .link(`${MOCK_CONFIG.baseUrl}/api/graphql`) + .operation((_, res, ctx) => + res( + ctx.data({ + group: { + groupMembers: { + nodes: [{ user: { id: 'gid://gitlab/User/1' } }], + }, + }, + }), + ), + ), + ); + const client = new GitLabClient({ + config: MOCK_CONFIG, + logger: getVoidLogger(), + }); + + const members = await client.getGroupMembers('group1'); + + expect(members).toEqual([1]); + }); }); describe('paginated', () => { diff --git a/plugins/catalog-backend-module-gitlab/src/lib/client.ts b/plugins/catalog-backend-module-gitlab/src/lib/client.ts index e36c0d72c6..74a3a4be71 100644 --- a/plugins/catalog-backend-module-gitlab/src/lib/client.ts +++ b/plugins/catalog-backend-module-gitlab/src/lib/client.ts @@ -20,7 +20,7 @@ import { GitLabIntegrationConfig, } from '@backstage/integration'; import { Logger } from 'winston'; -import { GitLabGroup, GitLabMembership, GitLabUser } from './types'; +import { GitLabGroup, GitLabGroupMembersResponse, GitLabUser } from './types'; export type CommonListOptions = { [key: string]: string | number | boolean | undefined; @@ -91,30 +91,37 @@ export class GitLabClient { return this.pagedRequest(`/groups`, options); } - async getUserMemberships(userId: number): Promise { - const endpoint: string = `/users/${encodeURIComponent(userId)}/memberships`; - const request = new URL(`${this.config.apiBaseUrl}${endpoint}`); - request.searchParams.append('per_page', '100'); + async getGroupMembers(groupPath: string): Promise { + const response: GitLabGroupMembersResponse = await fetch( + `${this.config.baseUrl}/api/graphql`, + { + method: 'POST', + headers: { + ...getGitLabRequestOptions(this.config).headers, + ['Content-Type']: 'application/json', + }, + body: JSON.stringify({ + variables: { group: groupPath }, + query: `query($group: ID!) { + group(fullPath: $group) { + groupMembers(first: 10, relations: [DIRECT]) { + nodes { + user { + id + } + } + } + } + }`, + }), + }, + ).then(r => r.json()); + this.logger.debug(`got GraphQL response: ${JSON.stringify(response)}`); - const response = await fetch(request.toString(), { - headers: getGitLabRequestOptions(this.config).headers, - method: 'GET', - }); - - if (!response.ok) { - if (response.status >= 500) { - this.logger.debug( - `Unexpected response when fetching ${request.toString()}. Expected 200 but got ${ - response.status - } - ${response.statusText}`, - ); - } - return []; - } - - return response.json().then(items => { - return items as GitLabMembership[]; - }); + return response.data.group.groupMembers.nodes.map( + (node: { user: { id: string } }) => + Number(node.user.id.replace(/^gid:\/\/gitlab\/User\//, '')), + ); } /** diff --git a/plugins/catalog-backend-module-gitlab/src/lib/types.ts b/plugins/catalog-backend-module-gitlab/src/lib/types.ts index c3fc8a4ede..b4480efdc2 100644 --- a/plugins/catalog-backend-module-gitlab/src/lib/types.ts +++ b/plugins/catalog-backend-module-gitlab/src/lib/types.ts @@ -50,11 +50,19 @@ export type GitLabGroup = { parent_id?: number; }; -export type GitLabMembership = { - source_id: number; - source_name: string; - source_type: string; - access_level: number; +export type GitLabGroupMembersResponse = { + errors: { message: string }[]; + data: { + group: { + groupMembers: { + nodes: { user: { id: string } }[]; + pageInfo: { + endCursor: string; + hasNextPage: boolean; + }; + }; + }; + }; }; export type GitlabProviderConfig = { diff --git a/plugins/catalog-backend-module-gitlab/src/providers/GitlabOrgDiscoveryEntityProvider.test.ts b/plugins/catalog-backend-module-gitlab/src/providers/GitlabOrgDiscoveryEntityProvider.test.ts index 5a323a8dec..88f8d58bf2 100644 --- a/plugins/catalog-backend-module-gitlab/src/providers/GitlabOrgDiscoveryEntityProvider.test.ts +++ b/plugins/catalog-backend-module-gitlab/src/providers/GitlabOrgDiscoveryEntityProvider.test.ts @@ -23,7 +23,7 @@ import { import { setupRequestMockHandlers } from '@backstage/backend-test-utils'; import { ConfigReader } from '@backstage/config'; import { EntityProviderConnection } from '@backstage/plugin-catalog-node'; -import { rest } from 'msw'; +import { graphql, rest } from 'msw'; import { setupServer } from 'msw/node'; import { GitlabOrgDiscoveryEntityProvider } from './GitlabOrgDiscoveryEntityProvider'; @@ -318,20 +318,22 @@ describe('GitlabOrgDiscoveryEntityProvider', () => { ]; return res(ctx.json(response)); }), - rest.get( - `https://api.gitlab.example/api/v4/users/1/memberships`, - (_req, res, ctx) => { - const response = [ - { - source_id: 2, - source_name: 'Group 2', - source_type: 'Namespace', - access_level: 50, - }, - ]; - return res(ctx.json(response)); - }, - ), + graphql + .link('https://test-gitlab/api/graphql') + .operation(async (req, res, ctx) => + res( + ctx.data({ + group: { + groupMembers: { + nodes: + req.variables.group === 'group1/group2' + ? [{ user: { id: 'gid://gitlab/User/1' } }] + : [], + }, + }, + }), + ), + ), ); await provider.connect(entityProviderConnection); diff --git a/plugins/catalog-backend-module-gitlab/src/providers/GitlabOrgDiscoveryEntityProvider.ts b/plugins/catalog-backend-module-gitlab/src/providers/GitlabOrgDiscoveryEntityProvider.ts index acfa784c2e..12cdf40e0c 100644 --- a/plugins/catalog-backend-module-gitlab/src/providers/GitlabOrgDiscoveryEntityProvider.ts +++ b/plugins/catalog-backend-module-gitlab/src/providers/GitlabOrgDiscoveryEntityProvider.ts @@ -185,7 +185,7 @@ export class GitlabOrgDiscoveryEntityProvider implements EntityProvider { }, ); - const idMappedGroup: { [groupId: number]: GitLabGroup } = {}; + const idMappedUser: { [userId: number]: GitLabUser } = {}; const res: Result = { scanned: 0, @@ -197,6 +197,21 @@ export class GitlabOrgDiscoveryEntityProvider implements EntityProvider { matches: [], }; + for await (const user of users) { + if (!this.config.userPattern.test(user.email ?? user.username ?? '')) { + continue; + } + + res.scanned++; + + if (user.state !== 'active') { + continue; + } + + idMappedUser[user.id] = user; + res.matches.push(user); + } + for await (const group of groups) { if (!this.config.groupPattern.test(group.full_path ?? '')) { continue; @@ -212,35 +227,12 @@ export class GitlabOrgDiscoveryEntityProvider implements EntityProvider { groupRes.scanned++; groupRes.matches.push(group); - idMappedGroup[group.id] = group; - } - - for await (const user of users) { - if (!this.config.userPattern.test(user.email ?? user.username ?? '')) { - continue; - } - - res.scanned++; - - if (user.state !== 'active') { - continue; - } - - const memberships = await client.getUserMemberships(user.id); - const userGroups: GitLabGroup[] = []; - - for (const i of memberships) { - if ( - i.source_type === 'Namespace' && - idMappedGroup.hasOwnProperty(i.source_id) - ) { - userGroups.push(idMappedGroup[i.source_id]); + for (const id of await client.getGroupMembers(group.full_path)) { + const user = idMappedUser[id]; + if (user) { + user.groups = (user.groups ?? []).concat(group); } } - - user.groups = userGroups; - - res.matches.push(user); } const groupsWithUsers = groupRes.matches.filter(group => { From c35eebedad9d0992f5cd6fedb90503c7ef3ad965 Mon Sep 17 00:00:00 2001 From: Jamie Klassen Date: Tue, 14 Mar 2023 13:08:24 -0400 Subject: [PATCH 094/177] add light error handling to getGroupMembers Signed-off-by: Jamie Klassen --- .../src/lib/client.test.ts | 62 +++++++++++++------ .../src/lib/client.ts | 4 +- 2 files changed, 46 insertions(+), 20 deletions(-) diff --git a/plugins/catalog-backend-module-gitlab/src/lib/client.test.ts b/plugins/catalog-backend-module-gitlab/src/lib/client.test.ts index 66c04f6cc4..0a50742a27 100644 --- a/plugins/catalog-backend-module-gitlab/src/lib/client.test.ts +++ b/plugins/catalog-backend-module-gitlab/src/lib/client.test.ts @@ -398,30 +398,54 @@ describe('GitLabClient', () => { ]); }); - it('getGroupMembers gets member IDs', async () => { - server.use( - graphql - .link(`${MOCK_CONFIG.baseUrl}/api/graphql`) - .operation((_, res, ctx) => - res( - ctx.data({ - group: { - groupMembers: { - nodes: [{ user: { id: 'gid://gitlab/User/1' } }], + describe('getGroupMembers', () => { + it('gets member IDs', async () => { + server.use( + graphql + .link(`${MOCK_CONFIG.baseUrl}/api/graphql`) + .operation((_, res, ctx) => + res( + ctx.data({ + group: { + groupMembers: { + nodes: [{ user: { id: 'gid://gitlab/User/1' } }], + }, }, - }, - }), + }), + ), ), - ), - ); - const client = new GitLabClient({ - config: MOCK_CONFIG, - logger: getVoidLogger(), + ); + const client = new GitLabClient({ + config: MOCK_CONFIG, + logger: getVoidLogger(), + }); + + const members = await client.getGroupMembers('group1'); + + expect(members).toEqual([1]); }); - const members = await client.getGroupMembers('group1'); + it('rejects when GraphQL returns errors', async () => { + server.use( + graphql + .link(`${MOCK_CONFIG.baseUrl}/api/graphql`) + .operation((_, res, ctx) => + res( + ctx.errors([ + { message: 'Unexpected end of document', locations: [] }, + ]), + ), + ), + ); + const client = new GitLabClient({ + config: MOCK_CONFIG, + logger: getVoidLogger(), + }); - expect(members).toEqual([1]); + await expect(() => client.getGroupMembers('group1')).rejects.toThrow( + 'GraphQL errors: [{"message":"Unexpected end of document","locations":[]}]', + ); + }); }); }); diff --git a/plugins/catalog-backend-module-gitlab/src/lib/client.ts b/plugins/catalog-backend-module-gitlab/src/lib/client.ts index 74a3a4be71..a2d8ec971a 100644 --- a/plugins/catalog-backend-module-gitlab/src/lib/client.ts +++ b/plugins/catalog-backend-module-gitlab/src/lib/client.ts @@ -116,7 +116,9 @@ export class GitLabClient { }), }, ).then(r => r.json()); - this.logger.debug(`got GraphQL response: ${JSON.stringify(response)}`); + if (response.errors) { + throw new Error(`GraphQL errors: ${JSON.stringify(response.errors)}`); + } return response.data.group.groupMembers.nodes.map( (node: { user: { id: string } }) => From 67892fd4d9b5075ad97bcc5414e6f16f976404c0 Mon Sep 17 00:00:00 2001 From: Jamie Klassen Date: Tue, 14 Mar 2023 16:06:19 -0400 Subject: [PATCH 095/177] support multiple pages of group members Signed-off-by: Jamie Klassen --- .../src/lib/client.test.ts | 36 ++++++++++ .../src/lib/client.ts | 72 +++++++++++-------- .../GitlabOrgDiscoveryEntityProvider.test.ts | 4 ++ 3 files changed, 82 insertions(+), 30 deletions(-) diff --git a/plugins/catalog-backend-module-gitlab/src/lib/client.test.ts b/plugins/catalog-backend-module-gitlab/src/lib/client.test.ts index 0a50742a27..a3bcd140ee 100644 --- a/plugins/catalog-backend-module-gitlab/src/lib/client.test.ts +++ b/plugins/catalog-backend-module-gitlab/src/lib/client.test.ts @@ -409,6 +409,10 @@ describe('GitLabClient', () => { group: { groupMembers: { nodes: [{ user: { id: 'gid://gitlab/User/1' } }], + pageInfo: { + endCursor: 'end', + hasNextPage: false, + }, }, }, }), @@ -446,6 +450,38 @@ describe('GitLabClient', () => { 'GraphQL errors: [{"message":"Unexpected end of document","locations":[]}]', ); }); + + it('traverses multi-page results', async () => { + server.use( + graphql + .link(`${MOCK_CONFIG.baseUrl}/api/graphql`) + .operation((req, res, ctx) => + res( + ctx.data({ + group: { + groupMembers: { + nodes: req.variables.endCursor + ? [{ user: { id: 'gid://gitlab/User/2' } }] + : [{ user: { id: 'gid://gitlab/User/1' } }], + pageInfo: { + endCursor: req.variables.endCursor ? 'end' : 'next', + hasNextPage: !req.variables.endCursor, + }, + }, + }, + }), + ), + ), + ); + const client = new GitLabClient({ + config: MOCK_CONFIG, + logger: getVoidLogger(), + }); + + const members = await client.getGroupMembers('group1'); + + expect(members).toEqual([1, 2]); + }); }); }); diff --git a/plugins/catalog-backend-module-gitlab/src/lib/client.ts b/plugins/catalog-backend-module-gitlab/src/lib/client.ts index a2d8ec971a..8f8c67895c 100644 --- a/plugins/catalog-backend-module-gitlab/src/lib/client.ts +++ b/plugins/catalog-backend-module-gitlab/src/lib/client.ts @@ -92,38 +92,50 @@ export class GitLabClient { } async getGroupMembers(groupPath: string): Promise { - const response: GitLabGroupMembersResponse = await fetch( - `${this.config.baseUrl}/api/graphql`, - { - method: 'POST', - headers: { - ...getGitLabRequestOptions(this.config).headers, - ['Content-Type']: 'application/json', - }, - body: JSON.stringify({ - variables: { group: groupPath }, - query: `query($group: ID!) { - group(fullPath: $group) { - groupMembers(first: 10, relations: [DIRECT]) { - nodes { - user { - id + const memberIds = []; + let hasNextPage: boolean = false; + let endCursor: string | null = null; + do { + const response: GitLabGroupMembersResponse = await fetch( + `${this.config.baseUrl}/api/graphql`, + { + method: 'POST', + headers: { + ...getGitLabRequestOptions(this.config).headers, + ['Content-Type']: 'application/json', + }, + body: JSON.stringify({ + variables: { group: groupPath, endCursor }, + query: `query($group: ID!, $endCursor: String) { + group(fullPath: $group) { + groupMembers(first: 100, relations: [DIRECT], after: $endCursor) { + nodes { + user { + id + } + } + pageInfo { + endCursor + hasNextPage + } } } - } - } - }`, - }), - }, - ).then(r => r.json()); - if (response.errors) { - throw new Error(`GraphQL errors: ${JSON.stringify(response.errors)}`); - } - - return response.data.group.groupMembers.nodes.map( - (node: { user: { id: string } }) => - Number(node.user.id.replace(/^gid:\/\/gitlab\/User\//, '')), - ); + }`, + }), + }, + ).then(r => r.json()); + if (response.errors) { + throw new Error(`GraphQL errors: ${JSON.stringify(response.errors)}`); + } + memberIds.push( + ...response.data.group.groupMembers.nodes.map( + (node: { user: { id: string } }) => + Number(node.user.id.replace(/^gid:\/\/gitlab\/User\//, '')), + ), + ); + ({ hasNextPage, endCursor } = response.data.group.groupMembers.pageInfo); + } while (hasNextPage); + return memberIds; } /** diff --git a/plugins/catalog-backend-module-gitlab/src/providers/GitlabOrgDiscoveryEntityProvider.test.ts b/plugins/catalog-backend-module-gitlab/src/providers/GitlabOrgDiscoveryEntityProvider.test.ts index 88f8d58bf2..3d6ff0a91a 100644 --- a/plugins/catalog-backend-module-gitlab/src/providers/GitlabOrgDiscoveryEntityProvider.test.ts +++ b/plugins/catalog-backend-module-gitlab/src/providers/GitlabOrgDiscoveryEntityProvider.test.ts @@ -329,6 +329,10 @@ describe('GitlabOrgDiscoveryEntityProvider', () => { req.variables.group === 'group1/group2' ? [{ user: { id: 'gid://gitlab/User/1' } }] : [], + pageInfo: { + endCursor: 'end', + hasNextPage: false, + }, }, }, }), From cd0e596dd54c59ca435c4114c72a964c38e897e7 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 15 Mar 2023 04:08:27 +0000 Subject: [PATCH 096/177] build(deps): bump webpack from 5.74.0 to 5.76.0 Bumps [webpack](https://github.com/webpack/webpack) from 5.74.0 to 5.76.0. - [Release notes](https://github.com/webpack/webpack/releases) - [Commits](https://github.com/webpack/webpack/compare/v5.74.0...v5.76.0) --- updated-dependencies: - dependency-name: webpack dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 878fea817f..1c58cace3f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -38647,8 +38647,8 @@ __metadata: linkType: hard "webpack@npm:^5, webpack@npm:^5.70.0": - version: 5.74.0 - resolution: "webpack@npm:5.74.0" + version: 5.76.1 + resolution: "webpack@npm:5.76.1" dependencies: "@types/eslint-scope": ^3.7.3 "@types/estree": ^0.0.51 @@ -38679,7 +38679,7 @@ __metadata: optional: true bin: webpack: bin/webpack.js - checksum: 320c41369a75051b19e18c63f408b3dcc481852e992f83d311771c5ec0f05f2946385e8ebef62030cf3587f0a3d2f12779ffdb191569a966847289ba7313f946 + checksum: b01fe0bc2dbca0e10d290ddb0bf81e807a031de48028176e2b21afd696b4d3f25ab9accdad888ef4a1f7c7f4d41f13d5bf2395b7653fdf3e5e3dafa54e56dab2 languageName: node linkType: hard From 529f657fdf3143381fa93b04ef3125a21993125b Mon Sep 17 00:00:00 2001 From: Brian Fletcher Date: Wed, 15 Mar 2023 08:30:19 +0000 Subject: [PATCH 097/177] Fix docs for deprecated type Signed-off-by: Brian Fletcher --- docs/features/software-catalog/external-integrations.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/docs/features/software-catalog/external-integrations.md b/docs/features/software-catalog/external-integrations.md index 6f957625bd..61f22c1645 100644 --- a/docs/features/software-catalog/external-integrations.md +++ b/docs/features/software-catalog/external-integrations.md @@ -506,9 +506,12 @@ import { processingResult, CatalogProcessor, CatalogProcessorEmit, - LocationSpec, } from '@backstage/plugin-catalog-node'; +import { + LocationSpec +} from "@backstage/plugin-catalog-common" + // A processor that reads from the fictional System-X export class SystemXReaderProcessor implements CatalogProcessor { constructor(private readonly reader: UrlReader) {} From 0d1a4daaacc44514d5e0d77429831deb24f97978 Mon Sep 17 00:00:00 2001 From: Brian Fletcher Date: Wed, 15 Mar 2023 08:57:30 +0000 Subject: [PATCH 098/177] prettier Signed-off-by: Brian Fletcher --- docs/features/software-catalog/external-integrations.md | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/docs/features/software-catalog/external-integrations.md b/docs/features/software-catalog/external-integrations.md index 61f22c1645..0f2459d6e0 100644 --- a/docs/features/software-catalog/external-integrations.md +++ b/docs/features/software-catalog/external-integrations.md @@ -508,9 +508,7 @@ import { CatalogProcessorEmit, } from '@backstage/plugin-catalog-node'; -import { - LocationSpec -} from "@backstage/plugin-catalog-common" +import { LocationSpec } from '@backstage/plugin-catalog-common'; // A processor that reads from the fictional System-X export class SystemXReaderProcessor implements CatalogProcessor { From 4dbf3d3e4daacc77a60bc125c6dbdbb0de9aabc2 Mon Sep 17 00:00:00 2001 From: dlaird-ovo Date: Wed, 15 Mar 2023 09:42:45 +0000 Subject: [PATCH 099/177] Adding new EntitySwitch for differing views depending on ResourceType Signed-off-by: dlaird-ovo --- .changeset/hungry-monkeys-reply.md | 5 +++ plugins/catalog/api-report.md | 5 +++ .../EntitySwitch/conditions.test.ts | 41 ++++++++++++++++++- .../src/components/EntitySwitch/conditions.ts | 20 ++++++++- .../src/components/EntitySwitch/index.ts | 7 +++- 5 files changed, 75 insertions(+), 3 deletions(-) create mode 100644 .changeset/hungry-monkeys-reply.md diff --git a/.changeset/hungry-monkeys-reply.md b/.changeset/hungry-monkeys-reply.md new file mode 100644 index 0000000000..c7f5d54ea1 --- /dev/null +++ b/.changeset/hungry-monkeys-reply.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-catalog': minor +--- + +Added a new EntitySwitch isResourceType to allow different views depending on Resource type diff --git a/plugins/catalog/api-report.md b/plugins/catalog/api-report.md index d891ebb7c8..5a81ea8d76 100644 --- a/plugins/catalog/api-report.md +++ b/plugins/catalog/api-report.md @@ -433,6 +433,11 @@ export function isComponentType( types: string | string[], ): (entity: Entity) => boolean; +// @public +export function isResourceType( + types: string | string[], +): (entity: Entity) => boolean; + // @public export function isKind(kinds: string | string[]): (entity: Entity) => boolean; diff --git a/plugins/catalog/src/components/EntitySwitch/conditions.test.ts b/plugins/catalog/src/components/EntitySwitch/conditions.test.ts index dfed546fd8..079a6f5943 100644 --- a/plugins/catalog/src/components/EntitySwitch/conditions.test.ts +++ b/plugins/catalog/src/components/EntitySwitch/conditions.test.ts @@ -15,7 +15,26 @@ */ import { Entity } from '@backstage/catalog-model'; -import { isComponentType, isKind, isNamespace } from './conditions'; +import { + isComponentType, + isKind, + isNamespace, + isResourceType, +} from './conditions'; + +const kubernetesClusterResource: Entity = { + apiVersion: '', + kind: 'resource', + metadata: { name: 'aKubernetesCluster' }, + spec: { type: 'kubernetes-cluster' }, +}; + +const databaseResource: Entity = { + apiVersion: '', + kind: 'resource', + metadata: { name: 'aDatabase' }, + spec: { type: 'database' }, +}; const serviceComponent: Entity = { apiVersion: '', @@ -59,6 +78,26 @@ const bNamespace: Entity = { spec: { type: 'service' }, }; +describe('isResourceType', () => { + it('should false on non component kinds', () => { + const checkEntity = isResourceType('service'); + + expect(checkEntity(notComponent)).not.toBeTruthy(); + }); + it('should check for the intended type', () => { + const checkEntity = isResourceType('kubernetes-cluster'); + + expect(checkEntity(databaseResource)).not.toBeTruthy(); + expect(checkEntity(kubernetesClusterResource)).toBeTruthy(); + }); + it('should check for multiple types', () => { + const checkEntity = isResourceType(['database', 'kubernetes-cluster']); + + expect(checkEntity(databaseResource)).toBeTruthy(); + expect(checkEntity(kubernetesClusterResource)).toBeTruthy(); + }); +}); + describe('isComponentType', () => { it('should false on non component kinds', () => { const checkEntity = isComponentType('service'); diff --git a/plugins/catalog/src/components/EntitySwitch/conditions.ts b/plugins/catalog/src/components/EntitySwitch/conditions.ts index 86fd38a900..222a76b0a9 100644 --- a/plugins/catalog/src/components/EntitySwitch/conditions.ts +++ b/plugins/catalog/src/components/EntitySwitch/conditions.ts @@ -14,7 +14,11 @@ * limitations under the License. */ -import { ComponentEntity, Entity } from '@backstage/catalog-model'; +import { + ComponentEntity, + ResourceEntity, + Entity, +} from '@backstage/catalog-model'; function strCmp(a: string | undefined, b: string | undefined): boolean { return Boolean( @@ -50,6 +54,20 @@ export function isComponentType(types: string | string[]) { }; } +/** + * For use in EntitySwitch.Case. Matches if the entity is a Resource of a given spec.type. + * @public + */ +export function isResourceType(types: string | string[]) { + return (entity: Entity) => { + if (!strCmp(entity.kind, 'resource')) { + return false; + } + const resourceEntity = entity as ResourceEntity; + return strCmpAll(resourceEntity.spec.type, types); + }; +} + /** * For use in EntitySwitch.Case. Matches if the entity is in a given namespace. * @public diff --git a/plugins/catalog/src/components/EntitySwitch/index.ts b/plugins/catalog/src/components/EntitySwitch/index.ts index 6cccf4be6e..0cb85ae6eb 100644 --- a/plugins/catalog/src/components/EntitySwitch/index.ts +++ b/plugins/catalog/src/components/EntitySwitch/index.ts @@ -16,4 +16,9 @@ export { EntitySwitch } from './EntitySwitch'; export type { EntitySwitchProps, EntitySwitchCaseProps } from './EntitySwitch'; -export { isKind, isNamespace, isComponentType } from './conditions'; +export { + isKind, + isNamespace, + isComponentType, + isResourceType, +} from './conditions'; From 77bd287b0ae2372b99cfb7adad00e0471f7673e3 Mon Sep 17 00:00:00 2001 From: blam Date: Wed, 15 Mar 2023 11:05:50 +0100 Subject: [PATCH 100/177] chore: added a redirect for the getting-involved page Signed-off-by: blam --- microsite/docusaurus.config.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/microsite/docusaurus.config.js b/microsite/docusaurus.config.js index 025c773a9c..59441d6e58 100644 --- a/microsite/docusaurus.config.js +++ b/microsite/docusaurus.config.js @@ -120,6 +120,10 @@ module.exports = { from: '/docs/features/search/search-overview', to: '/docs/features/search/', }, + { + from: '/getting-involved', + to: '/docs/getting-started/getting-involved' + }, ], }, ], From 3d18705f02fd087a7c498f5d634e99176df1849f Mon Sep 17 00:00:00 2001 From: blam Date: Wed, 15 Mar 2023 11:12:07 +0100 Subject: [PATCH 101/177] chore: release notes for 1.12.0 Signed-off-by: blam --- docs/releases/v1.12.0.md | 62 ++++++++++++++++++++++++++++++++++ microsite/docusaurus.config.js | 2 +- microsite/sidebars.json | 1 + 3 files changed, 64 insertions(+), 1 deletion(-) create mode 100644 docs/releases/v1.12.0.md diff --git a/docs/releases/v1.12.0.md b/docs/releases/v1.12.0.md new file mode 100644 index 0000000000..da163ea4ae --- /dev/null +++ b/docs/releases/v1.12.0.md @@ -0,0 +1,62 @@ +--- +id: v1.12.0 +title: v1.12.0 +description: Backstage Release v1.12.0 +--- + +These are the release notes for the v1.12.0 release of [Backstage](https://backstage.io/). + +A huge thanks to the whole team of maintainers and contributors as well as the amazing Backstage Community for the hard work in getting this release developed and done. + +## Highlights + +This release mostly contains a bunch of smaller additions and bug fixes, but on top of that, there’s also some quality of life improvements and features as listed below. Enjoy! + +### Using `zod` for action definitions + +As a convenience, it is now possible to define your action inputs and outputs as `zod` schemas. This tends to be more convenient than writing JSON schema by hand, and gives you instant type feedback in your editor. + +Added by [@zcason](https://github.com/zcason) in [#15561](https://github.com/backstage/backstage/pull/15561) + +### Reading paginated data from the catalog + +The catalog has a new backend endpoint and corresponding client method, for fetching entities with proper cursor based pagination and server side filtering and ordering. This will be used to target performance hot-spots in the frontend and elsewhere. + +Added by [@vinzscam](https://github.com/vinzscam) in [#12246](https://github.com/backstage/backstage/pull/12246) + +### Renamed backend system related plugin exports + +As we settle the new backend system bit by bit, we have renamed a number of exports from individual plugins, to match the new [recommended naming patterns](https://backstage.io/docs/backend-system/architecture/naming-patterns). If you are already leveraging the new backend system, you may find that you need to update some imports. For example, `githubEntityProviderCatalogModule` was renamed to `catalogModuleGithubEntityProvider`. These were considered non-breaking since they are still in alpha. More details can be found in #16760 and #16764. + +### New plugin: `catalog-backend` `puppetdb` module + +Added a `catalogModulePuppetDbEntityProvider` alpha export for the new backend system. Contributed by [@tdabasinskas](https://github.com/tdabasinskas) in [#16184](https://github.com/backstage/backstage/pull/16184) + +### New plugin: Octopus deploy + +[Octopus](https://octopus.com) deployment plugin. Contributed by [@jmezach](https://github.com/jmezach) in [#16353](https://github.com/backstage/backstage/pull/16353) + +### New plugin: StackStorm + +Integration with [StackStorm](https://stackstorm.com). Contributed by [@pamelin](https://github.com/pamelin) in [#16152](https://github.com/backstage/backstage/pull/16152) + +## Security Fixes + +This release does not contain any security fixes. + +## Upgrade path + +We recommend that you keep your Backstage project up to date with this latest release. For more guidance on how to upgrade, check out the documentation for [keeping Backstage updated](https://backstage.io/docs/getting-started/keeping-backstage-updated). + +## Links and References + +Below you can find a list of links and references to help you learn about and start using this new release. + +- [Backstage official website](https://backstage.io/), [documentation](https://backstage.io/docs/), and [getting started guide](https://backstage.io/docs/getting-started/) +- [GitHub repository](https://github.com/backstage/backstage) +- Backstage's [versioning and support policy](https://backstage.io/docs/overview/versioning-policy) +- [Community Discord](https://discord.gg/backstage-687207715902193673) for discussions and support +- [Changelog](https://github.com/backstage/backstage/tree/master/docs/releases/v1.12.0-changelog.md) +- Backstage [Demos](https://backstage.io/demos), [Blog](https://backstage.io/blog), [Roadmap](https://backstage.io/docs/overview/roadmap) and [Plugins](https://backstage.io/plugins) + +Sign up for our [newsletter](https://mailchi.mp/spotify/backstage-community) if you want to be informed about what is happening in the world of Backstage. diff --git a/microsite/docusaurus.config.js b/microsite/docusaurus.config.js index 025c773a9c..b7d8453e21 100644 --- a/microsite/docusaurus.config.js +++ b/microsite/docusaurus.config.js @@ -158,7 +158,7 @@ module.exports = { position: 'left', }, { - to: 'docs/releases/v1.11.0', + to: 'docs/releases/v1.12.0', label: 'Releases', position: 'left', }, diff --git a/microsite/sidebars.json b/microsite/sidebars.json index ebb387f81c..09727685a0 100644 --- a/microsite/sidebars.json +++ b/microsite/sidebars.json @@ -1,6 +1,7 @@ { "releases": { "Release Notes": [ + "releases/v1.12.0", "releases/v1.11.0", "releases/v1.10.0", "releases/v1.9.0", From 39eecf5c8f946dbf0170cbf6505d21c4eafe763f Mon Sep 17 00:00:00 2001 From: blam Date: Wed, 15 Mar 2023 11:16:20 +0100 Subject: [PATCH 102/177] chore: enter prerelease Signed-off-by: blam --- .changeset/pre.json | 217 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 217 insertions(+) create mode 100644 .changeset/pre.json diff --git a/.changeset/pre.json b/.changeset/pre.json new file mode 100644 index 0000000000..8ed335e113 --- /dev/null +++ b/.changeset/pre.json @@ -0,0 +1,217 @@ +{ + "mode": "pre", + "tag": "next", + "initialVersions": { + "example-app": "0.2.81", + "@backstage/app-defaults": "1.2.1", + "example-backend": "0.2.81", + "@backstage/backend-app-api": "0.4.1", + "@backstage/backend-common": "0.18.3", + "@backstage/backend-defaults": "0.1.8", + "@backstage/backend-dev-utils": "0.1.1", + "example-backend-next": "0.0.9", + "@backstage/backend-plugin-api": "0.5.0", + "@backstage/backend-tasks": "0.5.0", + "@backstage/backend-test-utils": "0.1.35", + "@backstage/catalog-client": "1.4.0", + "@backstage/catalog-model": "1.2.1", + "@backstage/cli": "0.22.4", + "@backstage/cli-common": "0.1.12", + "@backstage/codemods": "0.1.44", + "@backstage/config": "1.0.7", + "@backstage/config-loader": "1.1.9", + "@backstage/core-app-api": "1.6.0", + "@backstage/core-components": "0.12.5", + "@backstage/core-plugin-api": "1.5.0", + "@backstage/create-app": "0.4.38", + "@backstage/dev-utils": "1.0.13", + "e2e-test": "0.2.1", + "@backstage/errors": "1.1.5", + "@backstage/eslint-plugin": "0.1.2", + "@backstage/integration": "1.4.3", + "@backstage/integration-aws-node": "0.1.2", + "@backstage/integration-react": "1.1.11", + "@backstage/release-manifests": "0.0.9", + "@backstage/repo-tools": "0.1.3", + "@techdocs/cli": "1.4.0", + "techdocs-cli-embedded-app": "0.2.80", + "@backstage/test-utils": "1.2.6", + "@backstage/theme": "0.2.18", + "@backstage/types": "1.0.2", + "@backstage/version-bridge": "1.0.3", + "@backstage/plugin-adr": "0.4.1", + "@backstage/plugin-adr-backend": "0.3.1", + "@backstage/plugin-adr-common": "0.2.7", + "@backstage/plugin-airbrake": "0.3.16", + "@backstage/plugin-airbrake-backend": "0.2.16", + "@backstage/plugin-allure": "0.1.32", + "@backstage/plugin-analytics-module-ga": "0.1.27", + "@backstage/plugin-apache-airflow": "0.2.9", + "@backstage/plugin-api-docs": "0.9.1", + "@backstage/plugin-api-docs-module-protoc-gen-doc": "0.1.1", + "@backstage/plugin-apollo-explorer": "0.1.9", + "@backstage/plugin-app-backend": "0.3.43", + "@backstage/plugin-auth-backend": "0.18.1", + "@backstage/plugin-auth-node": "0.2.12", + "@backstage/plugin-azure-devops": "0.2.7", + "@backstage/plugin-azure-devops-backend": "0.3.22", + "@backstage/plugin-azure-devops-common": "0.3.0", + "@backstage/plugin-azure-sites": "0.1.5", + "@backstage/plugin-azure-sites-backend": "0.1.5", + "@backstage/plugin-azure-sites-common": "0.1.0", + "@backstage/plugin-badges": "0.2.40", + "@backstage/plugin-badges-backend": "0.1.37", + "@backstage/plugin-bazaar": "0.2.6", + "@backstage/plugin-bazaar-backend": "0.2.6", + "@backstage/plugin-bitbucket-cloud-common": "0.2.4", + "@backstage/plugin-bitrise": "0.1.43", + "@backstage/plugin-catalog": "1.9.0", + "@backstage/plugin-catalog-backend": "1.8.0", + "@backstage/plugin-catalog-backend-module-aws": "0.1.17", + "@backstage/plugin-catalog-backend-module-azure": "0.1.14", + "@backstage/plugin-catalog-backend-module-bitbucket": "0.2.10", + "@backstage/plugin-catalog-backend-module-bitbucket-cloud": "0.1.10", + "@backstage/plugin-catalog-backend-module-bitbucket-server": "0.1.8", + "@backstage/plugin-catalog-backend-module-gerrit": "0.1.11", + "@backstage/plugin-catalog-backend-module-github": "0.2.6", + "@backstage/plugin-catalog-backend-module-gitlab": "0.1.14", + "@backstage/plugin-catalog-backend-module-incremental-ingestion": "0.3.0", + "@backstage/plugin-catalog-backend-module-ldap": "0.5.10", + "@backstage/plugin-catalog-backend-module-msgraph": "0.5.2", + "@backstage/plugin-catalog-backend-module-openapi": "0.1.9", + "@backstage/plugin-catalog-backend-module-puppetdb": "0.1.0", + "@backstage/plugin-catalog-common": "1.0.12", + "@internal/plugin-catalog-customized": "0.0.8", + "@backstage/plugin-catalog-graph": "0.2.28", + "@backstage/plugin-catalog-graphql": "0.3.19", + "@backstage/plugin-catalog-import": "0.9.6", + "@backstage/plugin-catalog-node": "1.3.4", + "@backstage/plugin-catalog-react": "1.4.0", + "@backstage/plugin-cicd-statistics": "0.1.18", + "@backstage/plugin-cicd-statistics-module-gitlab": "0.1.12", + "@backstage/plugin-circleci": "0.3.16", + "@backstage/plugin-cloudbuild": "0.3.16", + "@backstage/plugin-code-climate": "0.1.16", + "@backstage/plugin-code-coverage": "0.2.9", + "@backstage/plugin-code-coverage-backend": "0.2.9", + "@backstage/plugin-codescene": "0.1.11", + "@backstage/plugin-config-schema": "0.1.39", + "@backstage/plugin-cost-insights": "0.12.5", + "@backstage/plugin-cost-insights-common": "0.1.1", + "@backstage/plugin-dynatrace": "3.0.0", + "@backstage/plugin-entity-feedback": "0.1.1", + "@backstage/plugin-entity-feedback-backend": "0.1.1", + "@backstage/plugin-entity-feedback-common": "0.1.0", + "@backstage/plugin-entity-validation": "0.1.1", + "@backstage/plugin-events-backend": "0.2.4", + "@backstage/plugin-events-backend-module-aws-sqs": "0.1.5", + "@backstage/plugin-events-backend-module-azure": "0.1.5", + "@backstage/plugin-events-backend-module-bitbucket-cloud": "0.1.5", + "@backstage/plugin-events-backend-module-gerrit": "0.1.5", + "@backstage/plugin-events-backend-module-github": "0.1.5", + "@backstage/plugin-events-backend-module-gitlab": "0.1.5", + "@backstage/plugin-events-backend-test-utils": "0.1.5", + "@backstage/plugin-events-node": "0.2.4", + "@internal/plugin-todo-list": "1.0.11", + "@internal/plugin-todo-list-backend": "1.0.11", + "@internal/plugin-todo-list-common": "1.0.9", + "@backstage/plugin-explore": "0.4.1", + "@backstage/plugin-explore-backend": "0.0.5", + "@backstage/plugin-explore-common": "0.0.1", + "@backstage/plugin-explore-react": "0.0.27", + "@backstage/plugin-firehydrant": "0.2.0", + "@backstage/plugin-fossa": "0.2.48", + "@backstage/plugin-gcalendar": "0.3.12", + "@backstage/plugin-gcp-projects": "0.3.35", + "@backstage/plugin-git-release-manager": "0.3.29", + "@backstage/plugin-github-actions": "0.5.16", + "@backstage/plugin-github-deployments": "0.1.47", + "@backstage/plugin-github-issues": "0.2.5", + "@backstage/plugin-github-pull-requests-board": "0.1.10", + "@backstage/plugin-gitops-profiles": "0.3.34", + "@backstage/plugin-gocd": "0.1.22", + "@backstage/plugin-graphiql": "0.2.48", + "@backstage/plugin-graphql-backend": "0.1.33", + "@backstage/plugin-graphql-voyager": "0.1.1", + "@backstage/plugin-home": "0.4.32", + "@backstage/plugin-ilert": "0.2.5", + "@backstage/plugin-jenkins": "0.7.15", + "@backstage/plugin-jenkins-backend": "0.1.33", + "@backstage/plugin-jenkins-common": "0.1.14", + "@backstage/plugin-kafka": "0.3.16", + "@backstage/plugin-kafka-backend": "0.2.36", + "@backstage/plugin-kubernetes": "0.7.9", + "@backstage/plugin-kubernetes-backend": "0.9.4", + "@backstage/plugin-kubernetes-common": "0.6.1", + "@backstage/plugin-lighthouse": "0.4.1", + "@backstage/plugin-lighthouse-backend": "0.1.1", + "@backstage/plugin-lighthouse-common": "0.1.1", + "@backstage/plugin-linguist": "0.1.1", + "@backstage/plugin-linguist-backend": "0.2.0", + "@backstage/plugin-linguist-common": "0.1.0", + "@backstage/plugin-microsoft-calendar": "0.1.1", + "@backstage/plugin-newrelic": "0.3.34", + "@backstage/plugin-newrelic-dashboard": "0.2.9", + "@backstage/plugin-octopus-deploy": "0.1.0", + "@backstage/plugin-org": "0.6.6", + "@backstage/plugin-org-react": "0.1.5", + "@backstage/plugin-pagerduty": "0.5.9", + "@backstage/plugin-periskop": "0.1.14", + "@backstage/plugin-periskop-backend": "0.1.14", + "@backstage/plugin-permission-backend": "0.5.18", + "@backstage/plugin-permission-common": "0.7.4", + "@backstage/plugin-permission-node": "0.7.6", + "@backstage/plugin-permission-react": "0.4.11", + "@backstage/plugin-playlist": "0.1.7", + "@backstage/plugin-playlist-backend": "0.2.6", + "@backstage/plugin-playlist-common": "0.1.5", + "@backstage/plugin-proxy-backend": "0.2.37", + "@backstage/plugin-rollbar": "0.4.16", + "@backstage/plugin-rollbar-backend": "0.1.40", + "@backstage/plugin-scaffolder": "1.12.0", + "@backstage/plugin-scaffolder-backend": "1.12.0", + "@backstage/plugin-scaffolder-backend-module-cookiecutter": "0.2.18", + "@backstage/plugin-scaffolder-backend-module-rails": "0.4.11", + "@backstage/plugin-scaffolder-backend-module-sentry": "0.1.3", + "@backstage/plugin-scaffolder-backend-module-yeoman": "0.2.16", + "@backstage/plugin-scaffolder-common": "1.2.6", + "@backstage/plugin-scaffolder-node": "0.1.1", + "@backstage/plugin-scaffolder-react": "1.2.0", + "@backstage/plugin-search": "1.1.1", + "@backstage/plugin-search-backend": "1.2.4", + "@backstage/plugin-search-backend-module-elasticsearch": "1.1.4", + "@backstage/plugin-search-backend-module-pg": "0.5.4", + "@backstage/plugin-search-backend-node": "1.1.4", + "@backstage/plugin-search-common": "1.2.2", + "@backstage/plugin-search-react": "1.5.1", + "@backstage/plugin-sentry": "0.5.1", + "@backstage/plugin-shortcuts": "0.3.8", + "@backstage/plugin-sonarqube": "0.6.5", + "@backstage/plugin-sonarqube-backend": "0.1.8", + "@backstage/plugin-sonarqube-react": "0.1.4", + "@backstage/plugin-splunk-on-call": "0.4.5", + "@backstage/plugin-stack-overflow": "0.1.12", + "@backstage/plugin-stack-overflow-backend": "0.1.12", + "@backstage/plugin-stackstorm": "0.1.0", + "@backstage/plugin-tech-insights": "0.3.8", + "@backstage/plugin-tech-insights-backend": "0.5.9", + "@backstage/plugin-tech-insights-backend-module-jsonfc": "0.1.27", + "@backstage/plugin-tech-insights-common": "0.2.10", + "@backstage/plugin-tech-insights-node": "0.4.1", + "@backstage/plugin-tech-radar": "0.6.2", + "@backstage/plugin-techdocs": "1.6.0", + "@backstage/plugin-techdocs-addons-test-utils": "1.0.11", + "@backstage/plugin-techdocs-backend": "1.6.0", + "@backstage/plugin-techdocs-module-addons-contrib": "1.0.11", + "@backstage/plugin-techdocs-node": "1.6.0", + "@backstage/plugin-techdocs-react": "1.1.4", + "@backstage/plugin-todo": "0.2.18", + "@backstage/plugin-todo-backend": "0.1.40", + "@backstage/plugin-user-settings": "0.7.1", + "@backstage/plugin-user-settings-backend": "0.1.7", + "@backstage/plugin-vault": "0.1.10", + "@backstage/plugin-vault-backend": "0.2.10", + "@backstage/plugin-xcmetrics": "0.2.36" + }, + "changesets": [] +} From 89a1988194085a43701dd9e2e2c0372b860696f8 Mon Sep 17 00:00:00 2001 From: blam Date: Wed, 15 Mar 2023 11:19:53 +0100 Subject: [PATCH 103/177] chore: prettier Signed-off-by: blam --- microsite/docusaurus.config.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/microsite/docusaurus.config.js b/microsite/docusaurus.config.js index 59441d6e58..04327424f9 100644 --- a/microsite/docusaurus.config.js +++ b/microsite/docusaurus.config.js @@ -122,7 +122,7 @@ module.exports = { }, { from: '/getting-involved', - to: '/docs/getting-started/getting-involved' + to: '/docs/getting-started/getting-involved', }, ], }, From 76b1c126bd1b3571abe701d9a7bcb0647d963434 Mon Sep 17 00:00:00 2001 From: dlaird-ovo Date: Wed, 15 Mar 2023 10:20:41 +0000 Subject: [PATCH 104/177] fixing up api-report.md Signed-off-by: dlaird-ovo --- plugins/catalog/api-report.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/plugins/catalog/api-report.md b/plugins/catalog/api-report.md index 5a81ea8d76..c678ce1d3d 100644 --- a/plugins/catalog/api-report.md +++ b/plugins/catalog/api-report.md @@ -433,11 +433,6 @@ export function isComponentType( types: string | string[], ): (entity: Entity) => boolean; -// @public -export function isResourceType( - types: string | string[], -): (entity: Entity) => boolean; - // @public export function isKind(kinds: string | string[]): (entity: Entity) => boolean; @@ -449,6 +444,11 @@ export function isNamespace( // @public export function isOrphan(entity: Entity): boolean; +// @public +export function isResourceType( + types: string | string[], +): (entity: Entity) => boolean; + // @public (undocumented) export type PluginCatalogComponentsNameToClassKey = { PluginCatalogEntityLinksEmptyState: EntityLinksEmptyStateClassKey; From 36e80c1f0b149bdafaa003fc7cfe353726bdf870 Mon Sep 17 00:00:00 2001 From: Ben Lambert Date: Wed, 15 Mar 2023 11:22:11 +0100 Subject: [PATCH 105/177] Update docs/releases/v1.12.0.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Fredrik Adelöw Signed-off-by: Ben Lambert --- docs/releases/v1.12.0.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/releases/v1.12.0.md b/docs/releases/v1.12.0.md index da163ea4ae..789be8beca 100644 --- a/docs/releases/v1.12.0.md +++ b/docs/releases/v1.12.0.md @@ -26,7 +26,7 @@ Added by [@vinzscam](https://github.com/vinzscam) in [#12246](https://github.com ### Renamed backend system related plugin exports -As we settle the new backend system bit by bit, we have renamed a number of exports from individual plugins, to match the new [recommended naming patterns](https://backstage.io/docs/backend-system/architecture/naming-patterns). If you are already leveraging the new backend system, you may find that you need to update some imports. For example, `githubEntityProviderCatalogModule` was renamed to `catalogModuleGithubEntityProvider`. These were considered non-breaking since they are still in alpha. More details can be found in #16760 and #16764. +As we settle the new backend system bit by bit, we have renamed a number of exports from individual plugins, to match the new [recommended naming patterns](https://backstage.io/docs/backend-system/architecture/naming-patterns). If you are already leveraging the new backend system, you may find that you need to update some imports. For example, `githubEntityProviderCatalogModule` was renamed to `catalogModuleGithubEntityProvider`. These were considered non-breaking since they are still in alpha. More details can be found in [#16760](https://github.com/backstage/backstage/pull/16760) and [#16764](https://github.com/backstage/backstage/pull/16764). ### New plugin: `catalog-backend` `puppetdb` module From bf3c5a655ccd63f9ff0023143ea8d3977dc87de1 Mon Sep 17 00:00:00 2001 From: Abhay-soni-developer Date: Wed, 15 Mar 2023 16:29:55 +0530 Subject: [PATCH 106/177] codeowners modified Signed-off-by: Abhay-soni-developer --- .github/CODEOWNERS | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 90ce81f73c..e7bdaa8b69 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -62,7 +62,7 @@ yarn.lock @backstage/maintainers @back /plugins/kafka-backend @backstage/maintainers @nirga @andrewthauer /plugins/kubernetes @backstage/maintainers @backstage/warpspeed /plugins/kubernetes-* @backstage/maintainers @backstage/warpspeed -/plugins/microsoft-calendar @backstage/maintainers @abhay-soni-developer @statusNeo +/plugins/microsoft-calendar @backstage/maintainers @abhay-soni-developer @NishkarshRaj /plugins/newrelic-dashboard @backstage/maintainers @mufaddal7 /plugins/playlist @backstage/maintainers @kuangp /plugins/playlist-* @backstage/maintainers @kuangp From 44e3878a8d797892a83d065dfb478e56955ae011 Mon Sep 17 00:00:00 2001 From: dlaird-ovo Date: Wed, 15 Mar 2023 11:22:24 +0000 Subject: [PATCH 107/177] Fix review feedback Signed-off-by: dlaird-ovo --- .../components/EntitySwitch/conditions.test.ts | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/plugins/catalog/src/components/EntitySwitch/conditions.test.ts b/plugins/catalog/src/components/EntitySwitch/conditions.test.ts index 079a6f5943..5d8c7c8898 100644 --- a/plugins/catalog/src/components/EntitySwitch/conditions.test.ts +++ b/plugins/catalog/src/components/EntitySwitch/conditions.test.ts @@ -24,18 +24,25 @@ import { const kubernetesClusterResource: Entity = { apiVersion: '', - kind: 'resource', + kind: 'Resource', metadata: { name: 'aKubernetesCluster' }, spec: { type: 'kubernetes-cluster' }, }; const databaseResource: Entity = { apiVersion: '', - kind: 'resource', + kind: 'Resource', metadata: { name: 'aDatabase' }, spec: { type: 'database' }, }; +const notResource: Entity = { + apiVersion: '', + kind: 'not-Resource', + metadata: { name: 'aService' }, + spec: { type: 'service' }, +}; + const serviceComponent: Entity = { apiVersion: '', kind: 'component', @@ -79,10 +86,10 @@ const bNamespace: Entity = { }; describe('isResourceType', () => { - it('should false on non component kinds', () => { - const checkEntity = isResourceType('service'); + it('should false on non resource kinds', () => { + const checkEntity = isResourceType('kubernetes-cluster'); - expect(checkEntity(notComponent)).not.toBeTruthy(); + expect(checkEntity(notResource)).not.toBeTruthy(); }); it('should check for the intended type', () => { const checkEntity = isResourceType('kubernetes-cluster'); From 3382cafa9e5ad0a38b8f91170bf241bbdcf2d639 Mon Sep 17 00:00:00 2001 From: Philipp Hugenroth Date: Wed, 15 Mar 2023 12:27:03 +0100 Subject: [PATCH 108/177] Set @backstage/sharks to CODEOWNERS for CLI onboard command Signed-off-by: Philipp Hugenroth --- .github/CODEOWNERS | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 010af451af..4d375a76f2 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -13,6 +13,7 @@ yarn.lock @backstage/maintainers @back /docs/features/search @backstage/techdocs-core /docs/features/techdocs @backstage/techdocs-core /docs/plugins/integrating-search-into-plugins.md @backstage/techdocs-core +/packages/cli/src/commands/onboard @backstage/sharks /packages/techdocs-cli @backstage/techdocs-core /packages/techdocs-cli-embedded-app @backstage/techdocs-core /plugins/adr @backstage/maintainers @kuangp From f156c539e778b3f7257b851b3e45c49fdc39d03b Mon Sep 17 00:00:00 2001 From: blam Date: Wed, 15 Mar 2023 13:13:44 +0100 Subject: [PATCH 109/177] chore: drop multiple buttons Signed-off-by: blam --- microsite/src/pages/plugins/_pluginCard.tsx | 2 +- microsite/src/pages/plugins/plugins.module.scss | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/microsite/src/pages/plugins/_pluginCard.tsx b/microsite/src/pages/plugins/_pluginCard.tsx index 99f27b865d..7eeb86af0a 100644 --- a/microsite/src/pages/plugins/_pluginCard.tsx +++ b/microsite/src/pages/plugins/_pluginCard.tsx @@ -35,7 +35,7 @@ export const PluginCard = ({ by {author}

- + {category} diff --git a/microsite/src/pages/plugins/plugins.module.scss b/microsite/src/pages/plugins/plugins.module.scss index d21444583a..bb08c2fd33 100644 --- a/microsite/src/pages/plugins/plugins.module.scss +++ b/microsite/src/pages/plugins/plugins.module.scss @@ -30,4 +30,8 @@ display: grid; grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); } + + :global(.fit-content) { + width: fit-content; + } } From 177ab4b4a964f027d546569501688aa240061402 Mon Sep 17 00:00:00 2001 From: Abhay-soni-developer Date: Wed, 15 Mar 2023 17:54:38 +0530 Subject: [PATCH 110/177] adding microsoft calendar plugin to backstage marketplace Signed-off-by: Abhay-soni-developer --- microsite/data/plugins/microsoft-calendar.yaml | 17 +++++++++++++++++ microsite/static/img/statusneo-logo.jpeg | Bin 0 -> 5171 bytes 2 files changed, 17 insertions(+) create mode 100644 microsite/data/plugins/microsoft-calendar.yaml create mode 100644 microsite/static/img/statusneo-logo.jpeg diff --git a/microsite/data/plugins/microsoft-calendar.yaml b/microsite/data/plugins/microsoft-calendar.yaml new file mode 100644 index 0000000000..c0df66c418 --- /dev/null +++ b/microsite/data/plugins/microsoft-calendar.yaml @@ -0,0 +1,17 @@ +--- +title: Microsoft Calendar +author: StatusNeo +authorUrl: https://statusneo.com/ +category: Productivity +description: | + The plugin integrates with your Microsoft Calendar. + It displays all your calendars and events in it. +documentation: https://statusneo.com/23392-2 +iconUrl: img/statusneo-logo.jpeg +npmPackageName: '@backstage/plugin-microsoft-calendar' +tags: + - Microsoft + - calendar + - StatusNeo + - Management +addedDate: '2023-03-015' diff --git a/microsite/static/img/statusneo-logo.jpeg b/microsite/static/img/statusneo-logo.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..536e5e8a99830eaa8639250a97f3b3aabca42a72 GIT binary patch literal 5171 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 B$)W%N literal 0 HcmV?d00001 From c9a0fdcd2c83253488afdae62ed46f1088755674 Mon Sep 17 00:00:00 2001 From: Brian Fletcher Date: Wed, 15 Mar 2023 12:27:35 +0000 Subject: [PATCH 111/177] update imports for deprecated types Signed-off-by: Brian Fletcher --- .changeset/khaki-guests-turn.md | 9 +++++++++ .../src/processors/LdapOrgReaderProcessor.ts | 2 +- .../src/processors/MicrosoftGraphOrgReaderProcessor.ts | 2 +- .../src/OpenApiRefProcessor.ts | 6 ++---- .../src/modules/core/LocationEntityProcessor.test.ts | 2 +- .../src/processor/ScaffolderEntitiesProcessor.ts | 4 ++-- 6 files changed, 16 insertions(+), 9 deletions(-) create mode 100644 .changeset/khaki-guests-turn.md diff --git a/.changeset/khaki-guests-turn.md b/.changeset/khaki-guests-turn.md new file mode 100644 index 0000000000..5676236aae --- /dev/null +++ b/.changeset/khaki-guests-turn.md @@ -0,0 +1,9 @@ +--- +'@backstage/plugin-catalog-backend-module-msgraph': patch +'@backstage/plugin-catalog-backend-module-openapi': patch +'@backstage/plugin-catalog-backend-module-ldap': patch +'@backstage/plugin-scaffolder-backend': patch +'@backstage/plugin-catalog-backend': patch +--- + +Fix deprecated types. diff --git a/plugins/catalog-backend-module-ldap/src/processors/LdapOrgReaderProcessor.ts b/plugins/catalog-backend-module-ldap/src/processors/LdapOrgReaderProcessor.ts index 9c5442ca0c..00578ac3a4 100644 --- a/plugins/catalog-backend-module-ldap/src/processors/LdapOrgReaderProcessor.ts +++ b/plugins/catalog-backend-module-ldap/src/processors/LdapOrgReaderProcessor.ts @@ -27,9 +27,9 @@ import { import { CatalogProcessor, CatalogProcessorEmit, - LocationSpec, processingResult, } from '@backstage/plugin-catalog-node'; +import { LocationSpec } from '@backstage/plugin-catalog-common'; /** * Extracts teams and users out of an LDAP server. diff --git a/plugins/catalog-backend-module-msgraph/src/processors/MicrosoftGraphOrgReaderProcessor.ts b/plugins/catalog-backend-module-msgraph/src/processors/MicrosoftGraphOrgReaderProcessor.ts index 2beef51c31..d9119a3c4d 100644 --- a/plugins/catalog-backend-module-msgraph/src/processors/MicrosoftGraphOrgReaderProcessor.ts +++ b/plugins/catalog-backend-module-msgraph/src/processors/MicrosoftGraphOrgReaderProcessor.ts @@ -18,9 +18,9 @@ import { Config } from '@backstage/config'; import { CatalogProcessor, CatalogProcessorEmit, - LocationSpec, processingResult, } from '@backstage/plugin-catalog-node'; +import { LocationSpec } from '@backstage/plugin-catalog-common'; import { Logger } from 'winston'; import { GroupTransformer, diff --git a/plugins/catalog-backend-module-openapi/src/OpenApiRefProcessor.ts b/plugins/catalog-backend-module-openapi/src/OpenApiRefProcessor.ts index 9dcadad61d..6b00519b2f 100644 --- a/plugins/catalog-backend-module-openapi/src/OpenApiRefProcessor.ts +++ b/plugins/catalog-backend-module-openapi/src/OpenApiRefProcessor.ts @@ -17,10 +17,8 @@ import { UrlReader } from '@backstage/backend-common'; import { Entity } from '@backstage/catalog-model'; import { Config } from '@backstage/config'; import { ScmIntegrations } from '@backstage/integration'; -import { - CatalogProcessor, - LocationSpec, -} from '@backstage/plugin-catalog-backend'; +import { CatalogProcessor } from '@backstage/plugin-catalog-node'; +import { LocationSpec } from '@backstage/plugin-catalog-common'; import { bundleFileWithRefs } from './lib'; import { Logger } from 'winston'; diff --git a/plugins/catalog-backend/src/modules/core/LocationEntityProcessor.test.ts b/plugins/catalog-backend/src/modules/core/LocationEntityProcessor.test.ts index 68c073eb0a..5e000f87d6 100644 --- a/plugins/catalog-backend/src/modules/core/LocationEntityProcessor.test.ts +++ b/plugins/catalog-backend/src/modules/core/LocationEntityProcessor.test.ts @@ -21,7 +21,7 @@ import { } from '@backstage/integration'; import path from 'path'; import { toAbsoluteUrl } from './LocationEntityProcessor'; -import { LocationSpec } from '@backstage/plugin-catalog-node'; +import { LocationSpec } from '@backstage/plugin-catalog-common'; describe('LocationEntityProcessor', () => { describe('toAbsoluteUrl', () => { diff --git a/plugins/scaffolder-backend/src/processor/ScaffolderEntitiesProcessor.ts b/plugins/scaffolder-backend/src/processor/ScaffolderEntitiesProcessor.ts index d095b77b4c..1de381a8ff 100644 --- a/plugins/scaffolder-backend/src/processor/ScaffolderEntitiesProcessor.ts +++ b/plugins/scaffolder-backend/src/processor/ScaffolderEntitiesProcessor.ts @@ -24,9 +24,9 @@ import { import { CatalogProcessor, CatalogProcessorEmit, - LocationSpec, processingResult, -} from '@backstage/plugin-catalog-backend'; +} from '@backstage/plugin-catalog-node'; +import { LocationSpec } from '@backstage/plugin-catalog-common'; import { TemplateEntityV1beta3, templateEntityV1beta3Validator, From b933e6a8630cc1c09cc65fe612c99b0c0c50f984 Mon Sep 17 00:00:00 2001 From: blam Date: Wed, 15 Mar 2023 13:28:02 +0100 Subject: [PATCH 112/177] chore: pretty Signed-off-by: blam --- microsite/src/pages/plugins/_pluginCard.tsx | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/microsite/src/pages/plugins/_pluginCard.tsx b/microsite/src/pages/plugins/_pluginCard.tsx index 7eeb86af0a..d6b4017db5 100644 --- a/microsite/src/pages/plugins/_pluginCard.tsx +++ b/microsite/src/pages/plugins/_pluginCard.tsx @@ -35,9 +35,7 @@ export const PluginCard = ({ by {author}

- - {category} - + {category} } body={

{description}

} From c5f396ccf919c138dc023014f3cf376234278ef8 Mon Sep 17 00:00:00 2001 From: Brian Fletcher Date: Wed, 15 Mar 2023 12:46:09 +0000 Subject: [PATCH 113/177] api reports Signed-off-by: Brian Fletcher --- plugins/catalog-backend-module-ldap/api-report.md | 2 +- plugins/catalog-backend-module-ldap/package.json | 1 + plugins/catalog-backend-module-msgraph/api-report.md | 2 +- plugins/catalog-backend-module-msgraph/package.json | 1 + plugins/catalog-backend-module-openapi/api-report.md | 4 ++-- plugins/catalog-backend-module-openapi/package.json | 1 + plugins/scaffolder-backend/api-report.md | 8 ++++---- plugins/scaffolder-backend/package.json | 1 + yarn.lock | 4 ++++ 9 files changed, 16 insertions(+), 8 deletions(-) diff --git a/plugins/catalog-backend-module-ldap/api-report.md b/plugins/catalog-backend-module-ldap/api-report.md index 088e34fc34..997ad55560 100644 --- a/plugins/catalog-backend-module-ldap/api-report.md +++ b/plugins/catalog-backend-module-ldap/api-report.md @@ -11,7 +11,7 @@ import { EntityProvider } from '@backstage/plugin-catalog-node'; import { EntityProviderConnection } from '@backstage/plugin-catalog-node'; import { GroupEntity } from '@backstage/catalog-model'; import { JsonValue } from '@backstage/types'; -import { LocationSpec } from '@backstage/plugin-catalog-node'; +import { LocationSpec } from '@backstage/plugin-catalog-common'; import { Logger } from 'winston'; import { SearchEntry } from 'ldapjs'; import { SearchOptions } from 'ldapjs'; diff --git a/plugins/catalog-backend-module-ldap/package.json b/plugins/catalog-backend-module-ldap/package.json index d483baa914..84f5ea88d2 100644 --- a/plugins/catalog-backend-module-ldap/package.json +++ b/plugins/catalog-backend-module-ldap/package.json @@ -36,6 +36,7 @@ "@backstage/catalog-model": "workspace:^", "@backstage/config": "workspace:^", "@backstage/errors": "workspace:^", + "@backstage/plugin-catalog-common": "workspace:^", "@backstage/plugin-catalog-node": "workspace:^", "@backstage/types": "workspace:^", "@types/ldapjs": "^2.2.0", diff --git a/plugins/catalog-backend-module-msgraph/api-report.md b/plugins/catalog-backend-module-msgraph/api-report.md index bde8c06fbb..3e4d8d99bc 100644 --- a/plugins/catalog-backend-module-msgraph/api-report.md +++ b/plugins/catalog-backend-module-msgraph/api-report.md @@ -9,7 +9,7 @@ import { Config } from '@backstage/config'; import { EntityProvider } from '@backstage/plugin-catalog-node'; import { EntityProviderConnection } from '@backstage/plugin-catalog-node'; import { GroupEntity } from '@backstage/catalog-model'; -import { LocationSpec } from '@backstage/plugin-catalog-node'; +import { LocationSpec } from '@backstage/plugin-catalog-common'; import { Logger } from 'winston'; import * as MicrosoftGraph from '@microsoft/microsoft-graph-types'; import { PluginTaskScheduler } from '@backstage/backend-tasks'; diff --git a/plugins/catalog-backend-module-msgraph/package.json b/plugins/catalog-backend-module-msgraph/package.json index 3201e0b8d4..9df7e8f361 100644 --- a/plugins/catalog-backend-module-msgraph/package.json +++ b/plugins/catalog-backend-module-msgraph/package.json @@ -51,6 +51,7 @@ "@backstage/backend-tasks": "workspace:^", "@backstage/catalog-model": "workspace:^", "@backstage/config": "workspace:^", + "@backstage/plugin-catalog-common": "workspace:^", "@backstage/plugin-catalog-node": "workspace:^", "@microsoft/microsoft-graph-types": "^2.6.0", "@types/node-fetch": "^2.5.12", diff --git a/plugins/catalog-backend-module-openapi/api-report.md b/plugins/catalog-backend-module-openapi/api-report.md index c2af9cbe01..455816645a 100644 --- a/plugins/catalog-backend-module-openapi/api-report.md +++ b/plugins/catalog-backend-module-openapi/api-report.md @@ -3,11 +3,11 @@ > Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/). ```ts -import { CatalogProcessor } from '@backstage/plugin-catalog-backend'; +import { CatalogProcessor } from '@backstage/plugin-catalog-node'; import { Config } from '@backstage/config'; import { Entity } from '@backstage/catalog-model'; import { JsonValue } from '@backstage/types'; -import { LocationSpec } from '@backstage/plugin-catalog-backend'; +import { LocationSpec } from '@backstage/plugin-catalog-common'; import { Logger } from 'winston'; import { PlaceholderResolverParams } from '@backstage/plugin-catalog-backend'; import { ScmIntegrations } from '@backstage/integration'; diff --git a/plugins/catalog-backend-module-openapi/package.json b/plugins/catalog-backend-module-openapi/package.json index 6bb9d66ec5..948409a11c 100644 --- a/plugins/catalog-backend-module-openapi/package.json +++ b/plugins/catalog-backend-module-openapi/package.json @@ -38,6 +38,7 @@ "@backstage/config": "workspace:^", "@backstage/integration": "workspace:^", "@backstage/plugin-catalog-backend": "workspace:^", + "@backstage/plugin-catalog-common": "workspace:^", "@backstage/plugin-catalog-node": "workspace:^", "@backstage/types": "workspace:^", "winston": "^3.2.1", diff --git a/plugins/scaffolder-backend/api-report.md b/plugins/scaffolder-backend/api-report.md index 452689c2ea..b732770a59 100644 --- a/plugins/scaffolder-backend/api-report.md +++ b/plugins/scaffolder-backend/api-report.md @@ -7,8 +7,8 @@ import { ActionContext as ActionContext_2 } from '@backstage/plugin-scaffolder-node'; import { CatalogApi } from '@backstage/catalog-client'; -import { CatalogProcessor } from '@backstage/plugin-catalog-backend'; -import { CatalogProcessorEmit } from '@backstage/plugin-catalog-backend'; +import { CatalogProcessor } from '@backstage/plugin-catalog-node'; +import { CatalogProcessorEmit } from '@backstage/plugin-catalog-node'; import { Config } from '@backstage/config'; import { createPullRequest } from 'octokit-plugin-create-pull-request'; import { Entity } from '@backstage/catalog-model'; @@ -18,7 +18,7 @@ import { IdentityApi } from '@backstage/plugin-auth-node'; import { JsonObject } from '@backstage/types'; import { JsonValue } from '@backstage/types'; import { Knex } from 'knex'; -import { LocationSpec } from '@backstage/plugin-catalog-backend'; +import { LocationSpec } from '@backstage/plugin-catalog-common'; import { Logger } from 'winston'; import { Observable } from '@backstage/types'; import { Octokit } from 'octokit'; @@ -507,7 +507,7 @@ export const createPublishGitlabMergeRequestAction: (options: { sourcePath?: string | undefined; targetPath?: string | undefined; token?: string | undefined; - commitAction?: 'update' | 'delete' | 'create' | undefined; + commitAction?: 'update' | 'create' | 'delete' | undefined; projectid?: string | undefined; removeSourceBranch?: boolean | undefined; assignee?: string | undefined; diff --git a/plugins/scaffolder-backend/package.json b/plugins/scaffolder-backend/package.json index d7eae0580a..2e9acd4033 100644 --- a/plugins/scaffolder-backend/package.json +++ b/plugins/scaffolder-backend/package.json @@ -56,6 +56,7 @@ "@backstage/integration": "workspace:^", "@backstage/plugin-auth-node": "workspace:^", "@backstage/plugin-catalog-backend": "workspace:^", + "@backstage/plugin-catalog-common": "workspace:^", "@backstage/plugin-catalog-node": "workspace:^", "@backstage/plugin-scaffolder-common": "workspace:^", "@backstage/plugin-scaffolder-node": "workspace:^", diff --git a/yarn.lock b/yarn.lock index ee7146e5d6..85228167d7 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5032,6 +5032,7 @@ __metadata: "@backstage/cli": "workspace:^" "@backstage/config": "workspace:^" "@backstage/errors": "workspace:^" + "@backstage/plugin-catalog-common": "workspace:^" "@backstage/plugin-catalog-node": "workspace:^" "@backstage/types": "workspace:^" "@types/ldapjs": ^2.2.0 @@ -5055,6 +5056,7 @@ __metadata: "@backstage/catalog-model": "workspace:^" "@backstage/cli": "workspace:^" "@backstage/config": "workspace:^" + "@backstage/plugin-catalog-common": "workspace:^" "@backstage/plugin-catalog-node": "workspace:^" "@microsoft/microsoft-graph-types": ^2.6.0 "@types/lodash": ^4.14.151 @@ -5082,6 +5084,7 @@ __metadata: "@backstage/config": "workspace:^" "@backstage/integration": "workspace:^" "@backstage/plugin-catalog-backend": "workspace:^" + "@backstage/plugin-catalog-common": "workspace:^" "@backstage/plugin-catalog-node": "workspace:^" "@backstage/types": "workspace:^" openapi-types: ^12.0.0 @@ -7489,6 +7492,7 @@ __metadata: "@backstage/integration": "workspace:^" "@backstage/plugin-auth-node": "workspace:^" "@backstage/plugin-catalog-backend": "workspace:^" + "@backstage/plugin-catalog-common": "workspace:^" "@backstage/plugin-catalog-node": "workspace:^" "@backstage/plugin-scaffolder-common": "workspace:^" "@backstage/plugin-scaffolder-node": "workspace:^" From 96f2a8919d94e56e3e6984908bf87fc9f34b26fe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20Adel=C3=B6w?= Date: Wed, 15 Mar 2023 13:47:53 +0100 Subject: [PATCH 114/177] remove extra file MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Fredrik Adelöw --- microsite/pages/en/plugins.js | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 microsite/pages/en/plugins.js diff --git a/microsite/pages/en/plugins.js b/microsite/pages/en/plugins.js deleted file mode 100644 index e69de29bb2..0000000000 From 7ff9fb642f98cee6e702b6df0c37593a4df41341 Mon Sep 17 00:00:00 2001 From: blam Date: Wed, 15 Mar 2023 13:57:24 +0100 Subject: [PATCH 115/177] chore: redirect needs to be done like this as it's top level Signed-off-by: blam --- microsite/docusaurus.config.js | 4 ---- microsite/src/pages/getting-involved/index.tsx | 6 ++++++ 2 files changed, 6 insertions(+), 4 deletions(-) create mode 100644 microsite/src/pages/getting-involved/index.tsx diff --git a/microsite/docusaurus.config.js b/microsite/docusaurus.config.js index 7edfed5e83..b7d8453e21 100644 --- a/microsite/docusaurus.config.js +++ b/microsite/docusaurus.config.js @@ -120,10 +120,6 @@ module.exports = { from: '/docs/features/search/search-overview', to: '/docs/features/search/', }, - { - from: '/getting-involved', - to: '/docs/getting-started/getting-involved', - }, ], }, ], diff --git a/microsite/src/pages/getting-involved/index.tsx b/microsite/src/pages/getting-involved/index.tsx new file mode 100644 index 0000000000..f5702706a6 --- /dev/null +++ b/microsite/src/pages/getting-involved/index.tsx @@ -0,0 +1,6 @@ +import React from 'react'; +import { Redirect } from "@docusaurus/router" + +export default () => { + return +} From 07c98b361bd399ad16e7c6bdfc95b13608754965 Mon Sep 17 00:00:00 2001 From: blam Date: Wed, 15 Mar 2023 13:57:48 +0100 Subject: [PATCH 116/177] chore: fixing prettier Signed-off-by: blam --- microsite/src/pages/getting-involved/index.tsx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/microsite/src/pages/getting-involved/index.tsx b/microsite/src/pages/getting-involved/index.tsx index f5702706a6..d838f5d25b 100644 --- a/microsite/src/pages/getting-involved/index.tsx +++ b/microsite/src/pages/getting-involved/index.tsx @@ -1,6 +1,6 @@ import React from 'react'; -import { Redirect } from "@docusaurus/router" +import { Redirect } from '@docusaurus/router'; export default () => { - return -} + return ; +}; From ad0d4ecefd077b6f82356d941ba16e60e998c0db Mon Sep 17 00:00:00 2001 From: Brian Fletcher Date: Wed, 15 Mar 2023 14:00:53 +0000 Subject: [PATCH 117/177] try fix api report Signed-off-by: Brian Fletcher --- plugins/scaffolder-backend/api-report.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/scaffolder-backend/api-report.md b/plugins/scaffolder-backend/api-report.md index b732770a59..644fd79f78 100644 --- a/plugins/scaffolder-backend/api-report.md +++ b/plugins/scaffolder-backend/api-report.md @@ -507,7 +507,7 @@ export const createPublishGitlabMergeRequestAction: (options: { sourcePath?: string | undefined; targetPath?: string | undefined; token?: string | undefined; - commitAction?: 'update' | 'create' | 'delete' | undefined; + commitAction?: 'update' | 'delete' | 'create' | undefined; projectid?: string | undefined; removeSourceBranch?: boolean | undefined; assignee?: string | undefined; From ff8212e40a7c0d00db9542ff456de28ef28f1278 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 15 Mar 2023 14:07:10 +0000 Subject: [PATCH 118/177] fix(deps): update dependency @gitbeaker/browser to v35.8.1 Signed-off-by: Renovate Bot --- yarn.lock | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/yarn.lock b/yarn.lock index 3e3833a50b..f56c47527c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9755,28 +9755,28 @@ __metadata: linkType: hard "@gitbeaker/browser@npm:^35.6.0": - version: 35.8.0 - resolution: "@gitbeaker/browser@npm:35.8.0" + version: 35.8.1 + resolution: "@gitbeaker/browser@npm:35.8.1" dependencies: - "@gitbeaker/core": ^35.8.0 - "@gitbeaker/requester-utils": ^35.8.0 + "@gitbeaker/core": ^35.8.1 + "@gitbeaker/requester-utils": ^35.8.1 delay: ^5.0.0 ky: 0.28.7 - checksum: 23fa14d64661108c03a5d141123037aebb68e257d84e26bd8f6241df65a0958eaa79b8b491e0f08159e325cdc3244f79b2426dedcc2354ad106316ea499415ac + checksum: 8a76322cfd19da3d691fb08c7ebc79971da02cfb950841578523f20de02cb5e2dcf9741eca048dfa17d6a9620eb4884c9a29d84a230ba9c8d18fc528deb830cd languageName: node linkType: hard -"@gitbeaker/core@npm:^35.6.0, @gitbeaker/core@npm:^35.8.0": - version: 35.8.0 - resolution: "@gitbeaker/core@npm:35.8.0" +"@gitbeaker/core@npm:^35.6.0, @gitbeaker/core@npm:^35.8.0, @gitbeaker/core@npm:^35.8.1": + version: 35.8.1 + resolution: "@gitbeaker/core@npm:35.8.1" dependencies: - "@gitbeaker/requester-utils": ^35.8.0 + "@gitbeaker/requester-utils": ^35.8.1 form-data: ^4.0.0 li: ^1.3.0 mime: ^3.0.0 query-string: ^7.0.0 xcase: ^2.0.1 - checksum: b894e1ac86dc8ac85f2db51d83d392899c10bb555b2448900f502ffeb49d9f36c1063c7151128ca96951ac472c11be6320584c4bec873501e96607bd7c25a37b + checksum: 8fc7b8d32a2162b70fd8e8ec4e019a3654da3fd1bcb7204b5030e8c9b4af52f4e7addafcd5503042e31dd4e4e3bdd7f8245dd963c77427d4471ab2e331266cf7 languageName: node linkType: hard @@ -9793,14 +9793,14 @@ __metadata: languageName: node linkType: hard -"@gitbeaker/requester-utils@npm:^35.8.0": - version: 35.8.0 - resolution: "@gitbeaker/requester-utils@npm:35.8.0" +"@gitbeaker/requester-utils@npm:^35.8.0, @gitbeaker/requester-utils@npm:^35.8.1": + version: 35.8.1 + resolution: "@gitbeaker/requester-utils@npm:35.8.1" dependencies: form-data: ^4.0.0 qs: ^6.10.1 xcase: ^2.0.1 - checksum: 6bd49b821fb6f262c6306c06fc4812f41902c864a7d941b0d112381b352f680e50ebd6180840e21a89d761427cb1326d9829b74c98c95bf9fa2a5d53872a400a + checksum: c3c94ad90dab481887380f5bcff0416c1e1eee935fc3ca4f12d8db83d85c5f0d47f7f35cee6f2b05491bda99c03fb7eb88b849c986822eae3b1bfc26641ec899 languageName: node linkType: hard From 6b23db2b811a1e813fb088621ede07818bbc6073 Mon Sep 17 00:00:00 2001 From: Philipp Hugenroth Date: Wed, 15 Mar 2023 15:09:03 +0100 Subject: [PATCH 119/177] Update packages/cli/src/commands/onboard/README.md Co-authored-by: Johan Haals Signed-off-by: Philipp Hugenroth --- packages/cli/src/commands/onboard/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/cli/src/commands/onboard/README.md b/packages/cli/src/commands/onboard/README.md index 8ab2d5f795..0fb4d22666 100644 --- a/packages/cli/src/commands/onboard/README.md +++ b/packages/cli/src/commands/onboard/README.md @@ -1,4 +1,4 @@ -# admin tool +# onboard ## Local dev From 0f5de31cb116d7d35681ac7e48179199cea4e73e Mon Sep 17 00:00:00 2001 From: Abhay-soni-developer Date: Wed, 15 Mar 2023 19:54:22 +0530 Subject: [PATCH 120/177] adding statusneo github plugin in backstage marketplace Signed-off-by: Abhay-soni-developer --- .../data/plugins/statusneo-github-plugin.yaml | 15 +++++++++++++++ microsite/static/img/github-statusneo.png | Bin 0 -> 15936 bytes 2 files changed, 15 insertions(+) create mode 100644 microsite/data/plugins/statusneo-github-plugin.yaml create mode 100644 microsite/static/img/github-statusneo.png diff --git a/microsite/data/plugins/statusneo-github-plugin.yaml b/microsite/data/plugins/statusneo-github-plugin.yaml new file mode 100644 index 0000000000..94b182cdb0 --- /dev/null +++ b/microsite/data/plugins/statusneo-github-plugin.yaml @@ -0,0 +1,15 @@ +title: Statusneo Github Plugin +author: Statusneo +authorUrl: https://statusneo.com/ +category: GitHub +description: | + This plugin integrates with github and brings the logged in user data. + It contains actions table and pull request table. +documentation: https://statusneo.com/23468-2/ +iconUrl: /img/github-statusneo.png +npmPackageName: '@statusneo/backstage-plugin-github' +tags: + - GitHub + - Monitoring + - Productivity +addedDate: '2023-02-15' diff --git a/microsite/static/img/github-statusneo.png b/microsite/static/img/github-statusneo.png new file mode 100644 index 0000000000000000000000000000000000000000..927ace351a4b99c1508d72e08d3b7d3074644d1e GIT binary patch literal 15936 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 Sb)fIvz$nV9$y7<1zxzLTTHOr* literal 0 HcmV?d00001 From 8db98416acfa3875abaaa9c6d369ad374b3cb6cc Mon Sep 17 00:00:00 2001 From: Abhay-soni-developer Date: Wed, 15 Mar 2023 20:02:20 +0530 Subject: [PATCH 121/177] modifying icon Signed-off-by: Abhay-soni-developer --- microsite/data/plugins/microsoft-calendar.yaml | 4 ++-- microsite/static/img/outlook-statusneo.png | Bin 0 -> 35104 bytes microsite/static/img/statusneo-logo.jpeg | Bin 5171 -> 0 bytes 3 files changed, 2 insertions(+), 2 deletions(-) create mode 100644 microsite/static/img/outlook-statusneo.png delete mode 100644 microsite/static/img/statusneo-logo.jpeg diff --git a/microsite/data/plugins/microsoft-calendar.yaml b/microsite/data/plugins/microsoft-calendar.yaml index c0df66c418..42d50bb74b 100644 --- a/microsite/data/plugins/microsoft-calendar.yaml +++ b/microsite/data/plugins/microsoft-calendar.yaml @@ -7,11 +7,11 @@ description: | The plugin integrates with your Microsoft Calendar. It displays all your calendars and events in it. documentation: https://statusneo.com/23392-2 -iconUrl: img/statusneo-logo.jpeg +iconUrl: /img/outlook-statusneo.png npmPackageName: '@backstage/plugin-microsoft-calendar' tags: - Microsoft - calendar - StatusNeo - Management -addedDate: '2023-03-015' +addedDate: '2023-03-15' diff --git a/microsite/static/img/outlook-statusneo.png b/microsite/static/img/outlook-statusneo.png new file mode 100644 index 0000000000000000000000000000000000000000..99e3b6a0bcc92d05550248e7584e2d4326e9a24b GIT binary patch literal 35104 zcmeFYWpEr#vNk$mW@cH;%oZ~te4c^;pdmlMbe+n~008P? zFI7z!Wg~ZD2PbMYAt-IiIs4`5;|{W(edy^PKx}$GT?c&MHt=+}!j&-i2cRb~pHNDwqll zIv>92d(JBJl}CT|?(vnM{taANw|aU)8T9+Tv=qGfuyiCt^|1b%^65_((CAiu$MDh* z3X9G_??d_uYo4R}6`+n9lc{hLg6bah2ONoRe42 zvJ0g-q@VTpKT518S@nj*T6Eoq&R%@mN9e`7 zVi{kz-fp)EtMVTY%%@+)-VWm!$M;~rwPm@l0xy3*?3|lsW*_KRJMHg#RJv!4UnTm# zYKWmW$M4)}W3_8f4qIX{oCrJ=a<2WOlE{NEmy1TvPo;VEM4m5Z2v>}DI2 zJ%GXVW*>Fqq5U>!Z>{I2G>m9<*)h{KgiK?1>N7Quei-0}tY;C*)_M5y+ymd5^14Ie z3;%_cbK%ddPf_cOdMB{P+%{H^c@oWY6&FPm*(ipBJ z9M2Rb2|Qm^e%4908@h%`j+bj%x=Y}`n!29t-5E!IX|&Ox!<@mzOG$-_!OuNmNOIRNbmybF9Id~t;VcRG30Al zIUw;#Skp%&-9U=+&lT@;2I5w9jIRf&OyhnbMcQc?087T1xF~)PYW|i$EgBb_C=S3g zsnkI2Fbi|_7Vnxr(7WSbJuq|pMIpSED2ps}`pt(1#7&cw4DBm+?jupB)C1*9=><3E z2uzOYlebMHq8Fz;g1__fE0?^Ym2Q%sh3?4vT;$zGvG4VGbSu#eTi5Ff?b?ilT~F-U zDx%v`@uA6&X1=1$bidOi#F@eA3s*DAHWo-SE~ELV${D4*W${%O2pw$>&| zuWJn3?F{;_1jg<0uEWW7k>~XX6_yjmZt|oPI7YoI;?>asX8j`~er27vMJYO{w4tZj zoi+xL;8M`Zy_vRjzLxa9+USh5@l^vl=GtKdKxX4bZO z0O2$}RG0}1iY+ENyO5S45omEz^aj!-%LbQSieyMBJX7o>0Hr*l3UP$9)nU8lgm55!f~C{Xdql@% z-R_IF$iVzdMX+y!V~xuM)BXgs}Vj;g`f^Rg0MUkI zE*=&y($kc(qc0wGvqs(~NGU*#Jh(tmuGWCB6DrF@<~w#5>ELz-NXG9jZ(ZJ~4EMWQ zetzhaChuGn=S1gQLvucSX$v%-5m8{SZ+RF&jwD3|0K z1p(YQh#We04RQPP)16rqtTs4!(#U=muo(#WeDf@%70gApb98DTmGPE%H}!48RO~6# zP7pmnyc)&@ftmhG{3XKEF(ZUc86FCle5UJShHYtRdt`u5mhe0|rX9Cx9@-cHB5xI6 zgy6x+8^o4(ILfcbS`eztg13+<{N^&=7Tya2zULiA<#tXT+56@|n<8j}#nhbHJ0{zJ zi5(UX>l=Lvf(qs|I@Vy}^CnhW2G}i#NZ}6fzOoslHxy0fIEPC(4xP#{d@@_ed|gZ5 z?6wMJyG@Yv=SEl+Q2c%{y_#vGMMOr4_7D6a<9?Wrqg#P4d61g&qif-O_ z#pF!4o4)d4)ZfV7YKlt{gdVt;GTvGI3fYfw7${#8AHdN#VIdPBi{ry5@G{!Ci$(x> zI9VLLJ;vLbSLB3G#3bzQH3NYhVx{VDcqoA{zT?Klj8V(jI)cP6L9%@>5d{fMl3~Fg zCOa$>AuFecTaMPUt;WHdkegkO zn7kcR{Qka`I~920|Gn6en<~6dvmg(+ym$3w@fHz$lktNCKVgq16HCz-gIO+!Q`r!$ zOUGVhipY*Lz$rVB6v%IXAZPIrOy;>YHJ7+`Ra*FfJnTs_Xa&j;+-5YW0d7@t?)~$n zGcBbV+DU(}qxPs(957q6&vWu1ON`Mj*y8Du>4kI+j=v2VSm4NLmBu=lrcxjRfFdk; zVm`%;>ZCM0chS3+dVqUB^)RwSV!4@*!2%Lav>jTr*u0TBfyc;7cdvr9By6tJiIMur zT*N+0HXPnu=3?!M@t3wQ?PHvCjP5eg88x=G)@~Oq0g%n&N%|FhwzGyq@miAh+QmE?3*SqnqhFPK>M@gm!x(_{z zI0G3e1p)Ho*4~KAEjmBj?q!j0gxpA&0{L-re(^#_671AO2Ezp9A7@m=TR3=(i*%O# z{-G#qUU)611HUJT3))Xm9qDHsIX+=p6@_g(a1p797ks-*%{(OuY&1QjpN6r^-)>j5 zi6q{E4I(k&m(GBKBxf4E2CxE4S267f@ts73oF?Ox&CRAj8LE<;Jxvgd`nFEd$4Cu4 z>sOI`2yc{VdeIYPlGg~4Q@ZNNnnuQiQZa)dlI5a;k$_^5ITi=8nx=bFN(rP4{lj6j zcwA!8PdUZjRm<$Uj)6!*k?NAGymh_($w%wTZZMGF($W>i0TSTkLa>y)=~om4DDXG| z2U+4mX6KeE0-T=QN+FKA3B%CM{N%ka_wzT0ts{^l*hNaId^a}-dffyoSk;+QWMn)l6K=&ma`cIqu7pw+@#>IH5Z< z0>ulsak$A7&dspFY-VH_d-Kp?-9wxVMX{{|Pq?0u0pMOJSNY6(HO35y*MeX3qqDM3NYakpc>S2oy>mor#f{CdbO{pbOk+G!5*?vWJ^DBd8w^3MrN+nUZH)u;A zl^i0a)(Ny>w)afiwQDTk9yx&1P4`Ku?U@z}oKwFJbk}r!01dd@$+r_O$E*tui1h(p zBC+xWz=7MPdbNQ>b$8HBT}sAp`m4U|e!bGd+94~!9$|lP_3DyLk9<#5f;Ocx&uinR zBymf4o?atahrN=HSYEgHtiiJT4#n30Q^J`1qApbp1NFzq*WUC~R}>V}0V=H>PY$-z z_~2Z35_GOiA>7p|OJr%njT~b9@Z0X3u?Vv4q!}x;)DvBHu=ZW4^UESX;gIy6*WdmF zr9)i@zh$y04n8~+IbY6>9wV=6hg3LBF92Zq^^ynfe%Wy{fx5_mL>a1e=@CJg{_TF1 zxV?a7Gs@A37v=J;0Txl!44)d ztPp2WgV(c*UlXo3AEW`FgAi=Ssqpu}Jh{f&)Y!kW3 zAF$g(O@;nKHvlh`rhth>y~c)R#!lTv>zNefVM|&|aO87E1qvH_FTpx7$zZtT>hKK6 z!}G1gga+RFf{>Eg_cduVVr^lHg1do^hJtxeww(1~2=muA;`ChpMU9iST5D5c#p8Z8^Rbf>H6S*QSyZIV7;h&g`rAG2&c__Re|F zmY|ypV(8jbnYZexvGp3ss#%!U$V*_DVAWC07jinW5a}iSO?l*RLu&LhOhbnBHZ=6| zTojOB;q$7HDT=o(_V@}aEWJ6eT*1!2y&f5C#R5pZGTB*JOopmjthf_?7_v03t)-k3 z)`#y4P`PB}(q=RB6wp*Yk_U;WI^0Y;*M1em)t%J{3~|-Ir*2DL)y7EYb7PeXB#zVM zKM+FK=@iZt%GDJ={C|DTI6HZ@o}NjTXE!;D z?2bDxXf>T@!Rj{$9Ti(xwOVxG=+Qt!`q}137MG(Bu~9Nud*WZ}v}bOFGR7)dB9#j2 z@{)0DrU*9Pgy|6||7ASgIr$ZOI=!t)Zv>qdCAqs)cUaVjy@w*uql6xBAfrTR9Rgoo zdfJm~Sd@w~R>gXx=CCavoNy80XwxoyE1>Q1GHtz;&l%}Aj(`C|TEdt6RviozfKUq{ z&&8-;v4lxBNEK_vsZ}om(>O!jI*JBc(0)w>QQT9higXRjviZcLiR_y+@w3Cnz&F-J zesD1dR5}m6Qkta)j=JW7BYolA^89gUNc2+apd>ZfugjAmV5{Kys*wC1#A~)e%y0qc zbrlM*6v5tO35%BCkeguT8KMJuuQAt~9TKLMdpQsiXIO235kA8zxIMvl?O=j43q+4F zBh#N(*zpEgM_+LNkTvzNG!+_`+sRnNFGPb zj{@?w(~2?dg+`m42Y8L+2w$Osz*j!gB^G}p3lSH+NqFJFx$bbZ?ZT%KRkN?>-UY23 zr3NSAiR%t~$&bo->n8sqw9TJKDR<0$F&PSmKli;YIdvWjNI)$MNE8(WkjvSAj# z{-prb4Z=Z1A>c{G}scElr|zT>T4AME}hpZ*+X;RRl*F>TrjL(+;#2 z;`uzb!@1iT8M-6{q@R7568kwkqqxX##*O+5ZnTbjHT}g>Q(MjYN z5zV9AMoU4!6*8X!8*!s7wkCMYw;f^$_nsOcEQ~OPDo$OH({d^%-MU;&JY7=AL*sRs z72~5)BC-P==z2a0iuhL9%r!~fXr?^2ud(ns8R!L>K0p7jv`@R zVE8)zr~pV4nJL0->Z{l~`wviFQvWj_mZ|cio=f1NAiw~LSi(-fuVB7sU;XjG00e7*4hfE1uM4W7XuX8n=Q$? zw?hJ)9KxxNscbu$B-b5X^$znO{LgZTVD7Nlq!u6&}kZtUnN1Q=1#JfyuRS3TW2k+svRE!YnHu<*}3y= zH&;d6@xL^27r^>WDOE+?#hxwr_V!^KQaoN!N|>6II}A-$x-dwvQwmhDv@BL)hQ^9$ zvDC%k2%_aB)u_?(;z{i^VspvPl-W>FvQ9(Mh`~28U9txeU!vLaMG9ct_MJ+yw7rM@ zK;v$yCJdw)UySNUgMTd2Fnv`@!=^5Oo+^^@wEB`y{-93EWGRcyEJ;JRUOW;mG^ZWG za9|~rX);ZKfjHHF{-Bzk&?QPWN-mOYJ$4B;dQCy5U(T(g;z)=W7`)gYO9?l9h288X zG&{p%!>5#u-O8YrLAE>@D@q65?pwB}tY;WA3^Eif%GaPCsemw%T6N%Dj*W#ORmM)`_*2)&}#^qf(mDkkD) z339`vYBwqvKob@i!Hb&eur;O1C<>P|GQW#?8C`C+>{>oLJQqkYv10{c+TU6NW~7zQ zu*-(I?Gd7QDH-M(t)Ns1b{VAzY99|JSpSR&0kL52FbXYGA4Lp%LR2>)YV5(W&ZSu8 zsm7FNj+_Ec-Pa#r$&wBUodOjcznvBwIIrpEuxw?7sS?ZqsGr^0`5A=TEm@7@nN<{} zq|3EpsuHM4QsH}99uTe?JqXttTfV%(6iI$59TP$$q)U#~Jep2#jqT$bB|btwZ{h{g zx#_uXq}CV3oFCP&vi%JNi+?Dnp4I>zNQO&;31=3LBzBqAbQ_cff?`61>$Vsy+bY%5 z)pLzD+KI&NIv-epNpPmq&FTQRusp!5SA60{xzl@{Rv{$AEOdmp7B*SK$8{%WQB8Za z{M7{{1uUegBJs$-+QbxNni$;@V~=b^hAbpNFFYSi6Wve9h(2w~hgL@bq)IP8&5;5A zr)M+@nzoCsPi}{elh}mL3*g|Q%U9<_&m_e+oyH23jd25F1Oy>nZGE~PJs9q0j5SDT zPkj^$(N24JaR>EUE}HcEEXl~%^s<2u2h*H`EN8T3)+pU_Qtp!A=!hJT$Mk@tju5`3x;XtZrYdttss%g4=2<|vt6Ee#6Tk9 z$K}Xrg?graBV6y8m`a~yW0_W`lfXqB00X|LPWoMHx1^>HaV(if?7mFRXPo&fm^Oy; zu=JPeRO1e~RUfIc?>nPsQp7U>93^A>a!z!6oTu9g%4)G+uQV(I*DPxJ6qD_cDYcix zDJPT@>2Nz)l$EC3wpTpW4`Szbye?SgSIc-cLr$$|z6XR4OhpyV)vJ#@vI_)}&d_oP z_d2(nSP}5^ZGzIO+tYNo_$0mI_?ajM&eB&37A0Y-sR@dc<$Ta_OpCO3 zJ*L)g9@3xU^9-e3pZCpHDg3)jI;{+u-UuNZs@|}HrNZ(`-%Y~30Jp!GrnOP}y&m?J zLND8lmNnXlk6Cpv7%XpgxZr|i8WQ81i zHtg}0<3Rx6cTCfvYl_SS)xtJt#)|gJPq$P{sp|Op1Vjvwj4iSDp_NuwM|Ffk6WLq$ zFxPqel=ST5-Yr_RXcdcsOPX)hRv_?rYSKv?dI{HJnxJsTycNUcixry;d(YL7?K&>v z;N`d$MW{Nh`+}l8D3IWJ=5>dj5D^F(;zgiLvV6@jHp^v!Y!HeKNL#<8805k7!g&^w z1=KttA?AxXRB1`17Yus7;t#ig$*K($fyE};PvP;XdfEUtDcCbfS>`)ar-+viy4 z)*jvje~;JW&hD|3MJ%Y4)DzbMiiF+uzRl2egjTc=ZWHAPtx2^lkY0k~}rCD}$r|5v5>F~TcrV`C_8(*h|goja}v=L{u+DL2D*`A9yQew&#?gW%NjI8ykFBo^mMskoX!Z{Q@E_1nnybZD;2^-3%S6lXGery+ zqa;@Z$5gE%^S~i)!GXasrNPQ)A(|FAk=e}8Mf$?A_@=dV)|KgU!na}AL~BD9+3@bg z8}uWTjZPU-I?DK2HEW!7o-(>0Y<#XT8s=vm3VO<5353gr^Xuul&+KuIM5R^i3%sSHbK%m_qJ zSqyx=6}O_*_O0ibg=Gy4`2!9XRJ zafrHkZSp#cP|0>;Y2H3F=*_zWg{*Xc6~J zqjK@^t6`pgCv364Z6U^Um9#IWPJ#C&B`Je2uM25SC8n4_$iPfwBxJV*tJXM@9UXb} z>W$K61`4|<5bpC&*(TjuG0i`660Q|^S*qZwg;p9T=ny-Nn7z~M7)AT6HnkM4ybRYE zKg%lEi9v;zq(|9`g(e*-i0Lb#@~zI$3?F(;l^M{cn=DLmEkTEe(TueoW31zlQD)E} z2FeunT?J!wNTI(0Oj5x0+gV2n6*m=h!GuQEAR&ErbnW$Y{-}6pSGViykoX4tkcOtD z%Y-Gjs_6xD;V&fL(5;ib(+{;Tw+Op$|8*?d2=aki2<}~003PFjsa74W4h|!0Vxf7` z-`2f%y8;1;-(>s{>AO*}mug&}>VWbSkIpEJO9!=5S}Aq$3)-vYPWwq-q&A6+J2Mf@ zVLGiy2vIm$IL+zwOrST)udQ+~lPv@thH_8jy$ctLKy_Y-sF~TI_zY_7ArZc?*d0)1rwIvse-FR6Uq)0rhAOV zv47~z|L)GD2yeJowSp3v9YnIj9$Btm)dmV5CVt6wWOt%Xy1iT6zdC*lE$&S0V^wek zj-IgU;wJpD<_`RI_G~0B%Yjq0cs-d=oim~$REA&HNTFGe>KC2% zoBg~^vtj(;(oGzL(`B3|&7!0=ePqf&bymzm%w%;h!Rxps`Ic)81Mfs7e-sswdPI75 z5i6AaR9a3c=?!02*Tjf$O*|2cw0U?4jy$cevtFJ1CQROCZ39j!OcFzfQ~Ax7-#l%} z>}TqfF`yl#Bpt)9A%HuNgc9{LkFrC}Mur-;m`(H`CAy)~X;=2Q zIG*jBJC0>0Y@5q1y|H%fe4)W%^efFx5OfzBiz}+3a<~^SCfEeC+Uc4CAzp?dDtU5@ z^lTQB@Nhv0U?7B7Dp+>zNgFOyUjq}`)FKdr(ANh^zsASiC7TQpA^Tr4V}hDl97!}W zk=^3KFiEbhMZ+mL+Y{hGPn5~-e%C16JvqT1Ez?S4$mwO$|rL{BrAO*!8xHRrtC)r_wyEB#fH(nn_fE-4RM3 zep+(b2HoM}d`X7x^uAyEnzsJIVo3|&K2d!rO0+8tnbYG-E4O z#u5$o2x!hwLr9utHcCr1T5B4-Ryx)(Y4jMy*rb-jw3D3F_2n}I zv!sh9MI4jYQ;A*8U4Qj9!k6~ydV~DX<+A9lu=`zK!EQ3t{R=Hl+RQapbb#%<;uAnw zR-3`Fb3&cbRz+Fi2Ub~@XHTC|B}lc9&2qvFlPBu(Fk%Xrt{%XvTEDocm~DZ7eB*M! zTFsj{-&Wj>Vb-!dsmu!>7{_OYVaA}%O6p7ws^8ZV^^%4A#da%NG!+?+NnnD2s6Ejq`=*N2Y2Pud2m)B27KW1vQAbCp z_u|BF_oa~e%He^|%y`NXyEp-h9KtMiOokyQNY`R$iy%0|AvSTf#G~-!nSEGlN_Z3h zhc}8!7CPfzy`*v6`4=7%LMGixQp2nqaQ7l^vL#r_;B9zM2I@D7I!KZJy)iQXSQIAd zgU|d&2aO%zNn~9tE82)>-lZS^z~KQRB9dUe=v?VeF$OMOyF<*{eUGC#(1YNlgV-Jv z5NBE@F8JppM<}?;dP!Gb06l+~&PfRsVKI3sil%F1jZs)Q`Wr?cc9S(e+%}uUs|o=T z906X(Vt#^{RG!wyEJ+DuU5BCsVtFlUT{8!7M$GCrFN#TMBzg22oZ9t2iGp`hFW~vc zCM&b4UeMYd2htsH0Xy@mo?9HU;)g5|IMKDSm<~hqKHX7W7mJcuK9!XU6~eSx6lJv& zgmVLW<6&5>=qVrbCUSL%Gu6Mk6}dJoMzErXE9nZCv_#Z^e{_ZnAR(qY&O0Y{Ir%j( z9PgaUITeCD4RcT1y^|KnR7xgj09x#PiO01mg9N6TfnUc_OJpX+Uqr`XI4ZW%PUmTu zfnL4ZRtZbeGlF+TOAWdn1C<|gF7x(CGkT|?`SVLJ_dtX@1|K3u0V02bDp94c>j~}U zzhF*O@a+|-XW=e{y~)CAICeMS+OP=CJXFq0!6VnS?1k6)x-0-6y*-!aFqSkrKMLTDR1 zO4~ZO($s~)95SYlBMs58jvRgjKjB7lAHcq1)#0T~-AL&kj3c~-=p{ZS*jcf+L>$^W z-tRlPf9?dwV}4IPQP)`Sch<%c6;cJZ$IPU$XMVee8n8lAU8buojdB(x#3AG!K~$gP zf+r-SwN}|7>s!#O;F>6m8-r9OlXWN9eb_8nT@9PZnhkXx5`Mo7Y2MVzRncq+egH?U zRH1!%Nve22h*Lq9G~Xu`qIwaqz|q(>n&r|W!E%lknRnd1?-i;eF6=%CBa?`-Az>C+ zwYoZm5K*>4o;g7>v=&a-VsNLUbi|&{*a)l-W3jK@ke!PM6QwJeFd5DF5;>6w=k$ z#S%p{FzDd?jW4`cI;3jhwxW6%eu%}Khi$Lf>MaN#xSFsJu7XoOfMy?k>GlJoq%omW zlqRh9Ppy2L$+OXtk!mI>^XnN#7@o-MImTp*=*t2vJmZ&M8{c2OiaRfI6y2e2r|YmC zm}P~niMq;b?>ZnB{?8B~xd!#fFKS^AQ0(uQ8Be?RXswxv^Ug6xEvp$d26SNFRxynO z8b30#Sj1hcGg+WI!%vz)3-m0l z*;LijT+Ahj?^mHj;(sVCSuy8k?ZZ21AocWEXy*IYt#}nBTC4hPfl9to1!R71E=(D6 zzBodE-kw~6`LG8oQIavt`0VHQ1Q}ccZ|9i`T`hjjkk`Uv_Yzk-Xg7wXMB<&))>3)w z7&1$1y=CNU`3y3UW42Ap#1l*l?yl#-8|IYRGf<-J%8 zYMGYb=!vga+bko)V)EJ5?)c9vcOUNA+#lv*fqrWW;Us1p?+a2ch&R8vA`vq`2Bln< zUpeKS9v=L&O^D%c;lwrvCvqu|zFR{3bGjeMEAl1OZ)n*{)Jk2xE|QhK)jUAhv3D9+ zI2inV3vOwG<&0SXxix!m8mD1PYW8<*<1cYd~tXyWk4%@E-G=%^HkUs<}$ zn0h?HIt_@Mpa4)o*}jBq`MN)UgQC*g$BTruK*B=B8&aIlp}Js^gUf z5H24mKC0tg>)2hkej3%B3lSn?NeX`UhNK2JztsR`Tx&YFQw*N}*ioqjSH#R>C)4%) z;sY>$1xYGptLOGv;2B~mBBCfIBJy7~ou8GQS-y#Ul6`{s0|q+9B=iKQ#5)Q3JX+`& zuJbhL`NCxw+OAA(w{RJ3WYi3CLDoGz@dFjX(G4|-H9^FWAUh{JMMos$?~K%q5m#HS zL>K3L=bIq!;-TecOW1iN0EMyX})3;c#-7h%4Du_oN z5ME2`o7yj2z5teawG&7#F7UAElwapp=Q)#`?|gG77f`?2oCc; zWO;!0whTrl_Qs|R9<~mjHMjr(uYiYx5zyMyh1l5C+|rJZW<1KG;{SyByy7FVaB*?qVPtf7 zcV}>CWw3WLXJqE)=4NDKVPs*U|J0y&_Ox>`@}ReKCjATI9~h#h&Oj$i2Nz3wJL11E zjg0MGUHC{yKHG`^%RXBNIk|tq+d2P}g-<>hJ&YU}nHiWEZEYFX$Y^R~YWoT5{AnNaf9Shdn*BFf|6$u-Eq}Z7?}mI1_b>ea(Ecyq|5pCgl9S^R zwFkQXHK>#*AIV?#@|f5IElqg-KILQua&d5SFwvU7dO<7G? zjkt_hIsOew%Ffxv$PQ@w7t|*>gXJfVDXSTmkr}56y$Kf!H$9sv8#g^SI~OOt36R;y z$b_8<_<8&rgo2ahXI2{7{JT|uL799)F|!-7e|9mU=QQTvqG#hUHKpe=26ED~o3eAW z8F86%v$1jg4fR(Xc!U(C_()h7{sI2CMA62`#mwHxmXAcv2uQ4;^543umbRuUE=GT` z#>~OV_4(r9WMN}r`LZ~3P)JR(k}MlSYFs`mCad?bIFM*J7#znbMf=aY$%i;<|2 zi|OZROf0NCOst>Yt1@%*uyFFQGtn}!^RWJ#zP*X1ndkqP_FuDynD-wsm$Y>L9N+VA z(Lbh?imBs2uKsapWBK=7A}0QOR`3`B|KWnOk(;T>-*$dt{i6wJVPt1+`ni1kGhhEp zZux)61!gm24$jX|(HofpKhufL*o58)$iYI-V#?0RWnyB?%*JK*pXko^W-jhVPNqWU zpFDnY^_ic4b45(`j}TJ-r@Fg^>0j~rWQ?APmHxjOWBDgzjQ{kQ@vl|mzg*^J{C|#gj zP5zX?I7n(a0|0Pnf4xBf8Clq$LMRt0IWee1FeC(SwvSE_K>&alASEiK>alwI%RLQW zy39suBi=Hk*}G;{2>GO9UY} zM<6e_6I?c_02cT2bV^rP31_YF6Eux|Yzm+9BQ)}AvD7gW$#3z;6qlNHP3N=9O)S!d z2dQZ!k{xk&Txwr%NZXb1`tGj86orV}Qjvw$5{}#88@_~w0^FDse$Zg8nR`N^y@lfC z?hx(8?ZedIH-g@Zve{Lc%-q-j=E$QF&s z>q)~GdCKetzuZSqifxp?GVkhDKtLuTwpcKqu2juEcNLn9wJPLB|LMd?G_u#8kmRb7 z8=04Askm}}LXzFuFLqm2mZY8km^iC|0sq;pRrjc1JpRP&BntQLe&QK1)))c>IVHi> zPL)(eW%2&xtS?o@%px7H2bRt1de^B)Xc=!oOij4C_mcRIy5m?%u2v;p3we5 z*;4Joq`g^TdMq=@Y5`B>?F0#j;!ZXvP7>`o1Ywld8`Cd8R$NDP==rJ(yt=@OYe74P z?t?LuC!zU28YfqOuzu4#*o-^;L9;ynow7f2rj;YG#mr_k@+`^{OnxBf-s{lM`yH4% z=+RRF&dA-F%(~RiJbO?GW5tLB5L`$gY_+~O1IZxV_qVH^(y-&{|5#@qZ+_D+l53Dm zopSfwZQJC&pTq@#2p2>D|aMq{^#H~UGEoU97bHb zj0sftPyvCiaD`4cLb^rPQl^JAWCB8n1l86@41{n7?fu*+Mjk2`mys~r0?^WP5r zXGoM<(`T3aEp%J1=I$*bjz|UgjC!;!-z8z&k3)$CEbS@s=rvxekS^NYkbXa&DHb7w z*ZtfL((imcfM}hBzekFAb3WF+%T;8ce;jtUzIyu*-TNu|R4HSn+IB6|@ifqPED1)k zjX_EIbj}_vNnu6?{Tej+t`QND3K8JQ!Q=ojN{JGe{wu}bioSizb>Q~KZ!))c&3(L(Bi}M)1Tk(1}~2X7h#2% zL{d`DTVwV)0xD6?0yqpQZL|*xKOk{Sf}VY_s4qnOI|=vCs=*?T72mg3|M=(b(0{la z%+Hci)Bg556t3ZFux|f4Tsv#YuW99)S8|C)uPEYy1A%73Q zQua+kSsl{_hwx=y8B=};Isc@=@Ljw8*u{+b z|7{;0zsrfWxpI029Kd*UnsAip{qunTwR5pA-PBR2R&Xyml6_pE1GqN6l!s;gM1^L`8L61huO zoSsu?Az+Ukt(~cNO2lUXg%Rss$%dn=?XOjSbF1-(3+b$mTEki2RC-W0E-qGX^N_XKRbl8f$S-m*LrF3mj z3$C#StWFX&1z}P9(*yE`nrptXML$dMeb_(*XfN&Jsi9eV#=__MizmFLSGFWRwU2tQi9gaP;TLDIv27356m7KvaJGX!@W_`0;qW z^nGsnrlo`15|NQea0@DcTx!e^Gps>)5ppG)l$sSwus!~#l1iok(sgIL+?$TV%bFkZ z785+gq<;(dm7#T!W@sbQi+FcK12_P1r27Oi3&w^CUK0JxIeicx20{v|qMAbpCWV!Q z2l{&w6@ZKau~{pUX)nAt2Cb4tlsD(1k2V<#$fL&*oWqdHs|9l_a&ZF)26A7rE=c%` zR2=Sie~ZY88HEkm9K3&@lY49GF+`8w2>RCYOg9zs1w6;TZqz z`aV?n)9=9_?X6<+qpfPKh3gl}rC3BuL9(66acZsh>A)xw8nn3B5AN-FNM6Q=!pp9L zKdQk+wnmr~+(4O7b}YZ} zSBP}g1XN~M49?xDHx`4EVLvL_gA`@n@VoL;TLmjO+Dm}iC8z8^rH_ES{w{m|`Yp`mApE;*e8SNqG z&Bwx-!74JLziCD~hHBQP3(@k-Ac~BkfD;!4+0LF+8-zxNr`!YG6L^AzsRqZ4^Kz|eDJ#-t|9sPO(5e%Ix zuJF|lot1_j($fr6N~TvB$!{%xM1*B`XYmM>7LqOrp&)UHw31 z&Bw+?kvFfXdlQBxG6LXRoA?P8-xEYLGoJvzUCCoyv;FHuz z%Nr0?t3B=W9iBp{v1j}e3v+9FSdEjdls9PYo_Ixwhyuy(j23wfE?3Je_8UDfRLIim z8=6t6qTAg$E6|WAn6h3c&?r?~O*(Kj8g3WOL3pZ>A!`#0(*xe`__J^?H2LwzMww_1 z6+6&$xx4i~@_%CXDAGVYJ#$N1Uc+7P1^zUjx}G4cM+yhy;o|ymnL*@ev5*hgDw3m0 zoP`Itx6*rVJH?e#v9&V%NLRLSNI`G>wI!Sh?lqdJ>h3q3&2bqm9876xCnFq8ie`w( z97_EICXwtoQ2-GF(C$B{yK}89st?(YXi7a?Kn!2!B)WFp^+mNHciK!adtLw*0a5;Y z1c<0vw+FYrG75n0mnX)kgrcW)-f0^Hndk~-^{ooEfNqNdr zBQyk`iImR_q9mL!43GVNZhaQ%C!=`9MY84_F^S#27WXztE!#l#))w5%u10kh)1)A= zU5Lu}0WMq5n1vf%bw&rRWz(ZbIK8$7^6-Y#d?i!&(R#$#R z8gJQM47@0Hj~UKDE^KB3MlwK91@Bqv>u(XR%DU>}UTh62bA#OmNJ`!9g2Jz@r~UGi zC-HMQm9L%7sA1eNnu~uNMw6D8-y2I`jjU6N1il@VOyID%L7E|?uFM1z#=+-BVmBIs zer`)rP0KdJepG11b^SR0nTdnDzGn2;(9rI2b1Ze>CeMdiF^8e=W0HkMgmbu6wy%R! z`t(64&ziP?gO7{~JR4`&d@Hc? z`kH|T&P{3L@qnZE(^M~sag%fWgEwPPc>~s4TO6MF8Z1WRV2caP;mu#7?2DGs za&aSB7V8gPM*W@@jc6773E}Tk`aJQUTxwtUc%k+F&Rv@z`Ye;+Y(c1h$`h#83LetH zw7MA)Y=8xntRdxP>H_4DbYredEWM|^M1m>r9Ev9bZk8w>clK|Nq#FIK4$EbXUyrUm zeU4H^)>#r@lsM%O5#n|LBsjGb5}?_5gspJfp-tAV>}Y~o??x((i2B8MSJwhj4;VSL zruSHSxoZ!p4egK1V+XR{Q`@w!bJ-$3hgUAgO^DG;$VCosy}i#=+J`?p^m==}Xe*op z-n#H?{!rjuIIp$8;%$Cah9Z%HzA24^thvV3kl-K;t~KYZu%=?avQFckQJ3 zE}O}iA9w_T@wrQ}fZv`Ze7^ZTGuH>U7LaT`NO>_y_?;^Qoc0yj8tfL-XB1(OA6Jgq zKF?~-<|%WM0sg!#ng35=UlkQs(?mPC4(<-Yg1fsDJh%_;?(XjHZV4{IgS!(vAMU}O z8T|4;-1~ahI_K#;boHt3uBzR;s(NguoOqJ7RIfij%F_0moHJ%Szdulo0lO%Ud3qoj zpPCPr5H1-QyYKXW+(t;@9gp@a-n?ikd5cMmiqG~npH-IrbTKQ7@y zzZy@pnE%=~Ck@(6CD5)rJ6JFij23Jau3@D0f3N5<@En5TXv+`fWuz6O0`Q#&1o=w} zyc7WeVmaHl-yBS>uep!Gjg}@CiKW|)B!^~wBIB7b?^3e*Nb3r?WdEfc?iT3wdS0;= zbrfg0z3g)fU;Xf5(Jo3oPykmkKollT%-%`{9Il|F0ifzGFzm!|)F^??7xvaRF39qN z`Ent*_XBj6SK+E5C*IqcL)hzIug4~fKGDub&F`K-l53xJ;LFqNRg~@Q(c`0f>ODAj z<#Q)l=dIK^7U_AAqWoDyH<>AlWg;a*0GK$rbwMx^IwIY-Oz_a3`W5_K?27l1{qOM+ zo+b+vmmZRA6-klcw(SLeL&_>KCahx=QVZ5GUD z`c)w=y2`bD$*uVmG8V0*Q-N++k}l3ZE}iF!Mt;K<|M0_^`tp=iNA19>aQ@yIxWblU zh;hZe(XxK=wszpc9-1WcSrm6uV>7swHKks&ujn9MrlUgBf+6RjU0gS8+uu`LY2fqp znYngqN8=H)yYAZ*9u8P zDKJv(>NZ6Z#C?COd160sWp3d8FflPNeZ%ArsY1BcJcDIpjxh#kWh8A0L>mtg!v^x@i9 zmCFsO81tMjKs4^&4q_XL+%$^jSjMjdpBp8S3+Eig?hoZq_qgniFz&s&E?VEUz{~Ov zSl0UW_BtCWg`7*QL3NQW>yHbxPi(vgn6P+BOL=(T(S3qAZZd$$@JAjtE=cLVZOhxo z@zyR99BUDG2Npncmgu!EY7hp{ukdUJ1z1Al@vtJYH6s_(-`8F}C47Jv=hJsR1QrKb z$9^dtmQ` zmGyuyP+{*}Uqgk%0Wh0(jFGykZ0;-fl8p{6t{C5p7V&Go*35y);MhiUYEFrHk~D)YhfJH3V1X#FrY`oxGz z>|6xt0VmhA{e$I56~pStKu14vF+ZocZNICrBwz4iOb#@lq-)NAU^nbR2sE+IYuCyC zk*XVHH%*iu9}%?-^Ho2fvD99x^jQl_go|j)iGvKdHe5UK$A8BLSM#Mw@;vBm5B$0d zBiQG>lE9e@#nqgJ?f{>zKFzV}F?~1+o-lIl*BM{ece56}0aQmv>NRCh7-kn>WH@#m&M820HGK4~@DYq|X`w}K zcG+dgw+sZ&>V=ei3OeHJoB%PBMd`%{wHjBRho)-42C7@HOQK8mqi_fkgSkqr`cP6-$bR9jM+)C84 zNgvB1mypQ+e(*Xab{*l(G|MI8c$p9zV+87RM6D^OHAX!kpibZFXX1#+pgC}>ne}(p z+ri<@^OUZQ$1MkA8)BoQ3xr{d$66t)%zG858NNM0YmL3d*mA_O327_*;lQ{SzU@i6=KK7X=C+*Jq|4crA3LqAWLTe|W(z@ZO!qyR z7wl#Y{^6EGkZ^G}Knpf6KW5xG)mfIi^{EfzE#AHUKOqMZKtbqgUw&1$YT;(aAqcqJ zrd?RbWEf8y4sYxt0f`rTk!8wzeAzuMTQkvBP!!{$wDRSx0pUXVt}vON(476#ZRxn_ zr==F#3gK2cyFLn1)AaJq59a23Ih`On*Y9|kNVyISws1-O%)OEu`zF#`SvxS<6u?5q zf_4RXy%2-f_grgnVTWoNgtfM!E7lXpd~810OUw4V{iZl=;~6l5@ua_?@3^`Y`F;Wu ztmpekBpK%9Yg%4O_4}!|{~%{T zxwy1$Jt|1(YCrvSPMP5Wb-nq2a3sTm?sRfXh_IXteDv_`o;T)~jO|c?M&12~%|uwC zWJH>dn?m1yPQU`ufsWu1_r=J(FWJgrX{7HIV zAqz zZOd$pM9dvM(C_RC{;={J1$f1 zamrq85rK&$E_G`DysG}#MJWm#ebS3C_!7XOU|;7mXw!GNVthbV2@{lIw47^csEU1^ z!nXR_?KiFiTXra1XlLXk(I@}RBH{caO}eP6t<_gG^f~hT&i7u8Ws~t#C^1C?p#!BV zTAwjpL+*f>B4N(K$N-}OH=M6TVAj``JyQk~GwAo~;HyZ>zm1|(+{tzr5`fG{D)+A|i83)jnn zkM~^$7ZJ$lY!<0^1pZ|#7CXpSYkBQ34m?}T(w*51x)YMA-mkVW~M zfN;&$FZGI!DH+gf#3V$oL4j`3pEH75exA%WK#YO-!cj_V$dEWIvbA)k6dR zk(M>mak@ku`yN*xuLh$tpmkYcK5v(Nh~eyrS8R>@O@ za?1%){#S4P9bGhVcEJljUEiDvml?urwy8eQD}Oxc&8q5-o^nG>+RZhpQm-q;VH6Z` zL3Hb5?w6V1CybT=d$qW3qtnuVSYE;Y+;tZ9qM_w;;RU{#7GeF7W_sm0tH>Crk}~M{ zd#9)38!7(MrZdou&a(8LEG-*za+_%+=z8R(23pJlqqanK63^@VT*EVCcztBArpcAo z;DC1ARq>usXueSAm#L`Uz9iPZK=DoC(Nf2#EV7I11^6Hk-22gLl(%IAuX1L2m)S4V z0FCN>s>r2x9FV}@DA))3785Pp;6zsGvd?RRuWvk5hBJOf7FK#+THrtKOSm>kU!JBd z?kuOl-*>RvQE%g{WN7JwbZE$mkT;7zwey)udJmP=;|EahWkheTay}w7SJTeAGi`9Qfw%D^NM6B$%%z za(x%J@!N%qq+gQ_hGA4LJiA)R8I0|)X`bbvzlar)1RjyASK4uJOS9|KDqo-rYriW9 z5*xOW7iU1NIVmqtpChX6cTh=iKFRWG3RI{(EIN3<&^3D7_UrT+k{b~~6rE|G9{4MQ z(wH5~YvXpzcVAdoZe@6ks{T$pkCCEpuw3OQ?_yzgscjkQ@bg~lFh9hj9IeJ2{vgO{ z?c(OYhKs$rWB0q>tVfQj3370M^dX8D+RZk4IqmnW)I%l{c*U=GDukS%Hbn%-&}=ly zP62UK7k?S`_sA}>^gP4wH*pwyN{lWQ@WvBH*{0UcKeu}$oIYa#@JiKF++CN?I=^9O zD>P9JWLvLjPxOk|(piHJZF{+7CjkwJ$7u)r?-^$@A`urUm2uzMdwC{|`en77g0;0! zYUBTM0h}iGB_3}RP=PFCJn*vq?{7zv{)g>h2LApCSp~TV5j9vIW5Dv}$;~|3&fPy; zyrP1WYkD-e3lZG3y?u}KAk4)hqIEtRB_>mOHJ6$c^E*!Ggor<11;at&08zj6@LO(Gz3J@ zh}LeKodU?&*{%KzoY}cLzF+Beu%0o3?Ps0m#4IH=cFUu?*=04QX*_K&kyJ#cKOhd;sO9NE@iYvsbxW=XuUF)zR8^dxLAg$dpZ+PK80iSU_CEtcIu|K_s(t%Xbr%^u(MiO}nsT=%w;f zZs~TcO0OZ@w@RGENv`V?5((KH6c67_fPY|t4PE{O1_cHgHNNXH&@|0aqmyH)?OaITK>rvp^?EJ z%!aCn#s0({A6|(TA~er(^c~=*dFYA>o0vw+L651JKPW>$xog2EddmxRUG9mm z`5HnAa#rd^8WFMW0$hBGe=ARmYi;#3K+-eFz)Ri#rsijNPiv@JLxzvL-Rq;x1j;R? z9i3W=LjV-6_moP&SM=+wnHw0zOB!NwqI_bJnzX^JmN`4ZNYpg$jwf~~jRb~#uO;ZN ztOr-;J1CjQs`Z8u5M zNc=OK#>O8BfW$peJXQAz)Mb%XPd-j;>aQ6>JbXr*cfkR zU=Z7i(m+O(pubh*Mfr?{7Mk`5Ny#8W*SlKkAFAoyx+Mdx0+3S=RV@lBTwRrHo$YVH z?%|V&xr^*|@xAnsa<2-$UxyScEu76MM62^H%~_YY!USJv)XD8kdWGr=fErvVmh2eu zRS;Tm5TQ%6US&Ei+HE78XwkvyrCuWN`c#qd0T+Wz-*e^esWi*;h_ zYPax3Kv00;3Nxf5%Y%nj?%eR}@vp z-}5wmD;m?GzHcxNv+%Ux5uXMasPlmZvMM8MG*4Xlby=uvQrF+~LG)`2G@@?}*`~?5 ztoL%6bInQlVM1f_bqE=D11-zP?zm|uJYu+eKRPATv8kTmE=j*XbRU1mvui*Q*Aecj z0L)%e(FST-ZW8!fPh9s|#U~iF;6r3;te*pT@|^E^rc`nYq?}9=Ur|~{YfN{`DbQ5-Bu8^72(! zD@Vc^khDB(G1qg^U+#v0|?aCm0gXvefRDZt}b>9%@%&n19fOx8KrGs*iLyn z@;H;v6;cg0xOq&h2E9yg+tcMKXwwpBxHEa(?M+9<15hu$<2Tm}cRQJrnr-xRk3Hj? zgXXQA$IU*(lQ1J3wX;PWMF`el7VU z|CH{YoEmD#X5@qhjEV&Mg1A2c`T)tp&&9_ZUyFVmVDR^s0t%6503!ft7pL+5eF0dr z)S_@z^(X|D0kB_q_-+bUjP;;~G|vE)fwWTHAbk_}(MG87Ig69clgMAcKh^tGow=MPREOqEZbb)%TSYsFr#AGEOR3}1O zK@H>A;KkjAR_d5Mca+|l18}xZA4jJ_r&*Re*@3;I+1*v&+?8W*oc@*Yxbti;Za;Kj zA+-1-|BeQEcz>YlwJzds$gAUQCqzZZ`_y8Cn)N`0RoAelJOQehOigoWfZ6RI z8;bF*%HJTLbABV@Oqr-t=^FNEJwW*n-k%-tCIpaX8bT%AyCf>rsf!?sF{s(;*T{#ycarUw zzj!?7B*63ysK((XsG5+jxC0VjyhcidhJt<>_CRMtG$j%bSK+=nq&N00=Mh4ZmsGDC zJFx%dq^C*@aGC*-O+l{S;yg5}Li{CY2FL#CdwOT3keQBex2;p5?x>{WJ=ON}ozUta@d`E^-%+i#Z| zL?*$3zf-KhP{RZCR8Wj+#=$!ERqg!fC8WgC$rvR4IH+m5NNqR2Y(uL@G_QlzGsnEw z^X5Q*$lsVhb_<5cJWioQ|Dpi+b?--&8b<$FVe(g#5gEoYZ@Y6Ai_eOEg(6EU2>A|A zFxd!zp*6vf9b^prsXp~J@Q>pI)5)tQ+%N3BA)kE0A_XLn8(jT2`%ETkFtwArB&pyg`F_ZZ~#z9_(ZG)*gWgp&TA8&-C9&O-NLhoJ(Og|!B98tPrVgM*6gdpKFM55Ta`fC898wNSvMlJ=$GxrT{7D51f^Rs_{w zU-t18zN3gt^!>df{EnRqBq0N+u2@}Lx07BzM}>ON4I;^G66sF7u<@Ri=qo($ zW)7_d95-GoEiZx?J3nvHj0!G&eu7rpiMAaRt@a8Pe93HwpIWF`1VEVyE6#*#N=UZj zb&uxv^UT#@_XMv?-vzRTXDbn4BL@~hMThqDRFkLmi7+JS#}(PKSn)y>s{rk8dWqvm z7RT;q34zynu0Hq?a`gf<$}P+x72Q|KKnzhflU@l`@`{DppNTE)Q~Ad_?+0{{BlN(T zFk%_GIMa9vElhuZ)E$sCv~6J#Q}JweixXAlx{F_lt(8ewvrUtgSeRA917Yk49LbWp z;`DCuvD;>YCx`p>{_l6CIkv0lzJ1GX5LL1qFko>P0O0r23Q0PhuS`e&zzXEvySb|l z69WSNu*4egs~Rys1~A7O+e`8p!qeGY!@mI##|0NgTR{@n8w6DSMFMlpJ27ClizKqc zU0_+fj@YJH#K=^Er2@T5aq<4&a_VF3MjBayP}L#-rI3Q+qc&LjbbIDK1hCrpQD)@i zb0+Z>p@nMD;JUG>*w`)WEoY{(7R2UYmy<`j*1h35ox!-aE|SQjFnx)3(ev0Y@`85-iza=Tuq>z*FJ! zDS@W8VDATmPpnVU2kyt)P?V3mS#E7dGRma%Z>oa!eX@7xi-nCo0iJt0M6^^9`>!NKn1Su@0OP((aDK~f-R}j*JfS`i(J|)qKaxL{c6SIG z53{~XA(6pi{D(h_%S&)YsWIf3V^zL7`M$*(3sGsO?ctjg^GVo;DEK$U#Z19Qkmq%l zIajo#)XQ#9fdiXT#&{|Tal=&ba1<%k5g%giSV3;THf0+Ln9$JbX`PpL=(E{nOViu{ z$^{f-!xr>)8*PEvXF>1O#}0nvtXYPKbcE6X)irOUJwn;7AJsp7eZexpV#`}blQurU zSe2gv9F>rzG6f}u4{;v;!-!!vhn0R&PXkKm zZnJLW$0M#7n#@30OaRWWyjjgW;4N$G`VCN^y?TL1?4}}pkCS^O3!dS<+;yc2G7=;x zFX^v~>ZOc<_4_|_e#^6uquGbE&f_M^$mZBqGDt{(gGMl)h~tk+#%#bKonpl7Vt{l) zRF?=tXEKFd@&=D%m7dRbj|qDb_roh< z^TAtzC=K64#14?80`NbS} zRJ1Sz)6uXmsj7%vdKgw*WG_kj@-XWC_8U!yPV;hKAAPk5X??SO%+T$KaP8%l$xSGq zTNiM%fIa?8yk!e&rT-&oIH{m8k0bwhTfxvd-;PNg=^dg?LSYvO@&^GYh^Z!KX!8u+ z`CyMPiy49=%lby7vOc^N2@_$IjE$iTsHfWOQHtX2(eKjQWMc$~rP{SYB#Ez}X3^%L zCFng{-DjyjM_ekU*`&lyu zip6q^3bN1SYvfZPiivBCNQg zDf4hB*{b7Z7pErCJGkcfBROfesvPPRTKvC^dJ)eu+_Ae zXbwgO1DEYGx9KYAC9&y_mu59=RbN%bC`uF~;{J|Gwi}PVsra4~f0sg`J&6y9j2RG# z)plNleY)|IHIOodP0~^1_bPCnwUKo>>QYYB6PjM|(e1)Ut7ink(u{@^r^Ny1)i?;J z1|%~t5O$Z;kKGnx3^xL{F~FityoiSVV{)j*D5dBVIoM`O)Upf3nR3m$5LU zM7p@80tK4;L24esA4KD{d(%)Zc(^gVht*s+bAjS-LPzuM;}u>L^fig$`!9n06@7We zTR8{E?Lanr*bFA~yG!Xf=KLfoShOkRD^NfY0{Qlg;ajAFw(->F4VdQ#xJctTs7_Mf zG4t}>xRn>?`p_o-=i*DQ7zm!uOG72hLBrX%psBoQH~Sk5Zr@rHJ{FVFrTrn;>m$Fa z&76Sr?7)Eqh>qJ=cNFRwff~t&7q-SU_Q`h%<;1`HPXYCqY&*`H=$w*(ySS-1%M&M~ zpZRzv8GQsLG}V6A##-$R^RAitS6*5svRxLU!ttma?Q`c-p`krLn?R(x-Zb@mQ}R*s zy9H+3Ma#yAVx~vZM|O*{pFXxA>Ra_`z*zKe3jL*@ZPnOxtg8QSjV%8W_#C~DMvhL!FvT6@|-OgY2O>x4I>E^-J@MRZ^S8IG! z66IIPILA9Leb3_UEzR=!T_0tpJ>tBur8A$@N;v$0Nf(!Ek7mCI$0KT{8#YlZgz$W(hp?g>zeWv#&NgS=vR__p<=ZEv*}h5ZzhFW3N% z9wTTi<`bBvAr7V*P2u8GcRt@rPb(mncSAEcnGq0=-I(#M3^d`5>BTQo{HGE}^}~Em z2n}~Y0F6pSMyB7q$-OKGEpu+-y09kG^`_J9->4)Pak*5Q%Sfu~X$4<>^{<`UD zXYI5d8=d#4iLJ!I*%u+mWkkZ)Fm4S^gJZ|i?J*pN2;q|wo0x|o&Q-z;#RE+sMM}b& z*yM7{4lA}=djScpf2|0y>6Jm>;{vv!N9LyBZjL)o5`jW}tjFF%z*Jj#$1d_fNB^Ed zd~EUYMn|PkaE}YkTU;7M7kwIW4|Puv&m(ex5Z=mMD3p!&WXucs{GoY|GI!#TLJt1a zR2Fk4v@HHVab=PJZbL-%he+t6mB(LL>;w54V+mmGGJZ9n+RwSpy{Uv`+1jGm7z3Oy zViLSIX2>wu5|^&l7)u}vpiiOXZ|T7z-0@cjktO!x;fA~aj8kOYn6Qfw*9hKFQ1J^H z^Zorv%vz#rc8D8$2yp)B%)gi+PujB~Cu&MX+#rpn;ZdR{<^(%r`=5uD?f8NM_S#?w zAH4sfbbF7$v5Yo-UN_r>VJ+Q_Up-I)1p!O`&%bwE=yx%#(G5ya< z%zlwcZJvHXQomHjJxiMZgS&sLU1wrKNAZ`$YXZwRS`SWhNOjWct_`)D=e=5&Ca`iw z3BXbaz5WvgcK8y?e zj+fIzb|Y7r{C(|*(5!(DN98QnK-07NdlLh-cr!KD8Qrs^>(oWT6L%U}KAbWWeIpEM zK0f3;FJF7_Bece{8TxDVbv%H(_Y{YQazW{YIwxXBsYA(YQ>Ww9{{~On+!X4z2xoe- z2T3$l!k&tN@o^a*x~l(Qza};BX4JgQGKx*Q0#xs=pw`Tcabe5!S#g)hL&a6 zmt+scU>K@j__a zcc(jg7-NG(^%vk5&9SH|0w!EgxSMffGH#qH0p>6P>dh$wZLuvBdVDHb>-m~+v~L)2 ziBz-k3jd@ioWTJTx%SyT^p}zFrN&PWD%H1RR(ZY0ib{OCk>JG(iks494+ay1f;6{W z=DTyAw)1ObD}BXAu*abJ2gP^R=$EYiwl+e%**Lc)jwpUZm+O{daq8Y=uhYNmZS$|A zHm(mjpb?ItKU0Q<|79M|TW^)8I>#m3vQg*EB6fq#=a;moJ4@A={{_jfrqEQuwIjgD z(QKvY3;&=L_JiC-EaI=*Xa{-)qRMACjW5UI^hitkJbcS?G&@T~O;g{U^mdz0nwx^C z=H_WTsb${N@Slzom|3quTyx zT>lq;$d>LhRWpJ+=Oihpm(lPI9Ny_J0~3tq6o~HZ!%wa_r1kNWidE0@=}^Y%nZXo~ z{+*!krCVNeAu=@xet?61c$hNB`Q+l;f#7zN4{XGg16;k-VktVd&T}bSRXfVqCU5UQ z)eKKsv#Tt|8cm^X)1HD65BAvWAT>8qd9Yea#ZZEG7$FKk;MWswaS_U@tKA%$#uPU> zpG~;2<7sYY1Tj~QoW$VQK;YTD%61eGsXTXTN53OK3z#3kbHzPpwKI@o|JU}eZk@tH z7vqgiOtIz1e>Waz)%79<*|K6|94R$$CG#c?>#8rvCwgzHLxe}u=T8Vm5##8X`&yp; zimeq<-Imf>hr=R*%zpy58Vd}TY{(|_zK6My_(}xiY}gCqFzPkVS#hOVID7vZcPg$6 z@}bP?SfZ%z$UWRCQ4FKGIr3z0U0Y+*Rz~eV|GU1e7XG6|01I0slK~TkOqfW8k%3Z~q^zF|WtJ>wZ6%{4wamhK8)dX;`8;`1gxxOo9DrG_^+E5kd2b z^P4FT*MNzr`Fd{HGmq%%?+IAIjPAM8jMlne^)wqMM!{oe;y22`pzHE zKZ1)qeI7eeCCl)J8=zp!rwIw-klc=lq7MNSIo|$S(7}~$_47+dNvWAu7$WG+plS`n z@<%&cALS^!r_-mCrh~i|3w7g(OE6J0o)I@;`WKxpYC;A9mTjr9<=@b(g3#UQ=4-#1 zX9mKC2qxx2#sz_KRrfsG7#K_|^nzY!%_a)5zwp_(5wM%#a+^9~n!-&6LSYx0guLvH z)qg53Dgl)N zbL;5bt72Ae?xdYX>(1wngBekkY^1Pq+}PTKPvmTcd-WBn>Yd4vjEc-~@DpmgQd|`5 zLm_=|iAMO^O@dzL(kQYoCyblwqJS3~bhn50Ivbh4RjLhltv zx-{Eo2$f5!F7fGuHoKFEEo3L1hd5bU7rUYC%!Z_07 z-Yo6H9D|oI#l28BH?IA7D=_r%NAAdsc%G6>yjoO`2{W+4)xwRZm1s&%&zwp?q2RJ4 zid(oH*JO|Wh1kh$ssC_KYriI8q=V^R?@ny$g;w$id<0MwLoBC;azwOP&MZx`a8U0O z1m6ew1nOGt|DL$Km`y%zmJw(-j+(}p{N|$sb(I1D=r#YV3s8zY>JUuMMiAEsy+XeN z0SP5D{fN8i?tdmQwO`wFTMhdPFB~^OmpR3w5g-x@jKspkN^Atxo80U(J0--t1S_6Uu@gJdz;C&I0$(}(I8fUA%R6VzEZ$QWbvB)x9YkIn zcVOnCV4_@hMS}YG(N#X1_V$`A5e=8Sa^6832jgPXwpt@Tuu+ip-l&y55l-=QN@KE@ z2V@yJ^ri{q4$qvYdrAeUoQ<7(|&f{Pj_a4h~3*kw$TOH z--5ag19YP~KK}%mm7ep6j!XOwv(t36=^k)sb@=R+Ec-@zi0TK_qL{A7-E>7>ijwXQR>(-OC3{fiWb0*DZt9L=kunh^ zNgHDfya(8N_xH!}Tt4<$KF%1?IsOS!un4q?IKwZYkBEj+iWNl!u#DA3bjtRI+`Kxr zW@@iMZ_~6MqLKPIIw%3ee0Q!eJG0xePS}uWVFnh^rm9pFT;?jmUT-tLzQ0N(sb|uo zbVo=jI_Gmtyz7mC6DaBjE?uwT3X1!qmy6W4~-~;k2;|G32=_ZdE7yQZySvJ zqQ=_3vE36KFrvV}Q;$K@USoXSH^nebobUUUrmiA@l@nz9MPrAgHmJQ4eio&IS>Tt? z*TI%(>KyLxVUqG^eQlU?MVDYF>c$nSZZe4W)^mu{?K*<&gk}E_+}O|o!Eaz#yP0?p zTIgY_+wt`uul#-+J9TP%qS`1v9{f{#Rc-<=|3E0JkcBvDO&G`x+yhKBHuKVQ!~q|^oxTma4E{Od3S75lht zn|$XKyfHE7ctK_MQfvmL)!noZkqWyf-bHB_qBgHK3{I&93E@u&M3d7;et|a=46`39 z*gRhr>3vKS{(bQVzTQzsql&5aDC;~Zf7+c8+s_YHL+sdd*--1r_j+{w%=x!>$CfL8 zHdJyl(!>L3w9}|<4c4ar_X?fx0OUF|YWa6Yo#lE$gYPnVN+8eMCj=kO7v3U|T#2iI z!69U7Sh$7m^s+AKy?so!y9yqHG7Ob>r=m@WNirQVTSC~r66+y2MX_aOAk$5wOl$NO zW|tAbGRF=$mjmCtSZ6#nIDn8V=QG{t0mR99+G8u-$^<2YbV+Jd`-pYES2@wCr-v#Kt9F@J$I2O z7fL$>LvsHe_m?nrgR2PFdgEltwrBR|5?v`i0#GTS`jhqPm!2vAOUF}&PbFF8>Zs0l zHQ;3xVI0jl{@v6$iB54uuK6%Vgj{A(a*PFlc zTJ!l6te-qCRTf&)K-afO=9 z6ZVcnlT5W-xWdM*J<2&^55&YYRYgao@gLnLA`0?7XV;Sp@gDoC@f9DTif4B(O6r-l z`^{U5mmhymQ$(4EQVX zQDTy_U=hL3?@AW!^Zv@p|0cBY#c1>N%0m%}j^ZV_cW513vm07P6l19@`aj>1dTGUY z8oHi>8kY62lYcv1#O;kXXB5>eqj#=cqKE|<{?s5~Lp2T9I%mpZA}$WB54&^#i6t)w zrT}W=@lgiD3Mf1vamqrWc3W$6omRD#ei!;SZ{e7RY=2?J+A!odfql(36r9&@m305; z+>r#I`A(<7H>27!hjXlFR)<)0Rdi4%_#0Fe1+ydiKx-?O3f;tngXz?Mh2*@;^C6$J zqnp*Brd$-|ys5!`k>FuJE2%iP{%5(HD#uk7#ABzQMWDx+6M@u>D*yCV1IpVXTCxUqb%SF4nz5kvm_jstMu08lbubDh)D`B{uy&m7aQ9H;peX`ZfVFE`JbHZTB5 z9>~hmlSE<`3Le&Qe+H}m%(g*KW=m4SqThKR)dbC=?!cV#Bh>#R04@QD_sQuWvD3l0 zicx*V!qY66&c}5of4YKpEshqM6e0dryOe>i-F2uIu>N6kM9CnF;?#q-C)5E+7^%r4 zExH8)t-}weD+ALqhO$q70@!n_qT-7~iE6gzf5;)BAVs2dmShZU!yO4KlK~k#7A}`E zyUb=@YTDrrmqTbSb}Xu&yOivprE7ZTq+WVedc~r4p`wF{FdRB6!3_o^I$kxm}h+#4sBefpwL}}aP5Reb!r@z)T zQ}VSbPjyHHarhg^{?H-WS@Jjtj$&~;{><>!P$r!Uao}|r^c8VX0=a8C^f;LilC!?r zx3||yFX|b8_coDd&hd0IND)!kKW(ydcLf!_rkFt+FAIEm!x(RhceKDB=I$FP+~^sC`r&WPGc3*@d4~|iavBxB+%*Y z5L#;$k}=c_dyA3I#-BEZ{V}{{zxbIHe0^-JR#0e??^}p3^6#nUgDRAnr|=jT4NjgA zQ&4u@j$OpNA>yJAFXnk>I2D1ixmhar2fNOBs@&ev1~jNkqFk~MN}v0uaV>^WHwBJ9 z0bX~8Z;ChnZCKyJwoiCX0N(NYtn2N)FpE1HWu_)Qssvz;k6=UMknE$Y>NRp0QZK== z8VTiNP@)t6QMx0(L+ta{)Y`7j-0FpBYlFx{ol3%Ce@tiD0j2%HS48RV$M8zP{gR-~ zLXSMERfwL_zXhzYh&YLq7r=L^-HD290zUbxDNW7`VpZFswX4NC8OJTv3@x<{hcSMdS8B%s`jD? z`M$2}#FEDCB(EuHYxLc5)X8z6S>*>}dK<=XYZLm*$#wO2Cf>o}3$!j)@~RfExsu^V)<`=C#k3JN zv*w&%1_CZc#yRfi_y1&@m~ULOWmuRCDX?6ndNJkaN9}jO!tj(7OY7!P;^0kYMZ~b8 zd{=i=*ELbQL$1{`QPW2^teT#1g3L}R0P9~_1H%Ac zk$3MFu{K25BX7F{4Zd>cc>WQ!bj>U?YCy{=v4z=OpX>!34R$~Y;Xq9HftBzJ$}Jjl&LmVZI=Hi zCm`-ul6+<{zZADb+(+H-Gy{;MU{RLK*M_RP$-xsy5WwEykLFY4en^*FXoQu~$Cmzo e9)-Lh0A%OXO|wD4>9fKgKwer|s$K#V`hNfj!EY@9 literal 0 HcmV?d00001 diff --git a/microsite/static/img/statusneo-logo.jpeg b/microsite/static/img/statusneo-logo.jpeg deleted file mode 100644 index 536e5e8a99830eaa8639250a97f3b3aabca42a72..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5171 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 B$)W%N From 3023b49d10b66198583c3b2052267157f8a8e01c Mon Sep 17 00:00:00 2001 From: Abhay-soni-developer Date: Wed, 15 Mar 2023 20:24:56 +0530 Subject: [PATCH 122/177] yaml prettier run Signed-off-by: Abhay-soni-developer --- microsite/data/plugins/microsoft-calendar.yaml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/microsite/data/plugins/microsoft-calendar.yaml b/microsite/data/plugins/microsoft-calendar.yaml index 42d50bb74b..80844d7096 100644 --- a/microsite/data/plugins/microsoft-calendar.yaml +++ b/microsite/data/plugins/microsoft-calendar.yaml @@ -5,13 +5,13 @@ authorUrl: https://statusneo.com/ category: Productivity description: | The plugin integrates with your Microsoft Calendar. - It displays all your calendars and events in it. + It displays all your calendars and events in it. documentation: https://statusneo.com/23392-2 iconUrl: /img/outlook-statusneo.png -npmPackageName: '@backstage/plugin-microsoft-calendar' +npmPackageName: "@backstage/plugin-microsoft-calendar" tags: - Microsoft - calendar - StatusNeo - Management -addedDate: '2023-03-15' +addedDate: "2023-03-15" From 04843c8e129353f447ebb4bad3150dab189e5945 Mon Sep 17 00:00:00 2001 From: Adam Harvey Date: Wed, 15 Mar 2023 12:03:11 -0400 Subject: [PATCH 123/177] fix(docs): Special encoding not needed in code fence examples Signed-off-by: Adam Harvey --- docs/local-dev/cli-commands.md | 44 +++++++++++++++++----------------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/docs/local-dev/cli-commands.md b/docs/local-dev/cli-commands.md index 8c1e061237..c4c057ffe6 100644 --- a/docs/local-dev/cli-commands.md +++ b/docs/local-dev/cli-commands.md @@ -73,7 +73,7 @@ Build packages in the project, excluding bundled app and backend packages. Options: --all Build all packages, including bundled app and backend packages. - --since <ref> Only build packages and their dev dependents that changed since the specified ref + --since Only build packages and their dev dependents that changed since the specified ref ``` ## repo lint @@ -86,8 +86,8 @@ Usage: backstage-cli repo lint [options] Lint all packages in the project Options: - --format <format> Lint report output format (default: "eslint-formatter-friendly") - --since <ref> Only lint packages that changed since the specified ref + --format Lint report output format (default: "eslint-formatter-friendly") + --since Only lint packages that changed since the specified ref --fix Attempt to automatically fix violations ``` @@ -101,8 +101,8 @@ Usage: backstage-cli package start [options] Start a package for local development Options: - --config <path> Config files to load instead of app-config.yaml (default: []) - --role <name> Run the command with an explicit package role + --config Config files to load instead of app-config.yaml (default: []) + --role Run the command with an explicit package role --check Enable type checking and linting if available --inspect Enable debugger in Node.js environments --inspect-brk Enable debugger in Node.js environments, breaking before code starts @@ -118,11 +118,11 @@ Usage: backstage-cli package build [options] Build a package for production deployment or publishing Options: - --role <name> Run the command with an explicit package role + --role Run the command with an explicit package role --minify Minify the generated code. Does not apply to app or backend packages. --skip-build-dependencies Skip the automatic building of local dependencies. Applies to backend packages only. --stats If bundle stats are available, write them to the output directory. Applies to app packages only. - --config <path> Config files to load instead of app-config.yaml. Applies to app packages only. (default: []) + --config Config files to load instead of app-config.yaml. Applies to app packages only. (default: []) ``` ## package lint @@ -138,7 +138,7 @@ Usage: backstage-cli package lint [options] Lint a package Options: - --format <format> Lint report output format (default: "eslint-formatter-friendly") + --format Lint report output format (default: "eslint-formatter-friendly") --fix Attempt to automatically fix violations ``` @@ -227,10 +227,10 @@ that owns the app repo. For example you may have it set up like this: Usage: backstage-cli create [options] Options: - --select <name> Select the thing you want to be creating upfront - --option <name>=<value> Pre-fill options for the creation process (default: []) - --scope <scope> The scope to use for new packages - --npm-registry <URL> The package registry to use for new packages + --select Select the thing you want to be creating upfront + --option = Pre-fill options for the creation process (default: []) + --scope The scope to use for new packages + --npm-registry The package registry to use for new packages --no-private Do not mark new packages as private -h, --help display help for command ``` @@ -248,7 +248,7 @@ Usage: backstage-cli config:docs [options] Browse the configuration reference documentation Options: - --package <name> Only include the schema that applies to the given package + --package Only include the schema that applies to the given package -h, --help display help for command ``` @@ -268,12 +268,12 @@ yarn backstage-cli config:print --frontend --package my-app Usage: backstage-cli config:print [options] Options: - --package <name> Only load config schema that applies to the given package + --package Only load config schema that applies to the given package --lax Do not require environment variables to be set --frontend Print only the frontend configuration --with-secrets Include secrets in the printed configuration - --format <format> Format to print the configuration in, either json or yaml [yaml] - --config <path> Config files to load instead of app-config.yaml (default: []) + --format Format to print the configuration in, either json or yaml [yaml] + --config Config files to load instead of app-config.yaml (default: []) -h, --help display help for command ``` @@ -287,11 +287,11 @@ local packages in the repo. Usage: backstage-cli config:check [options] Options: - --package <name> Only load config schema that applies to the given package + --package Only load config schema that applies to the given package --lax Do not require environment variables to be set --frontend Only validate the frontend configuration --deprecated List all deprecated configuration settings - --config <path> Config files to load instead of app-config.yaml (default: []) + --config Config files to load instead of app-config.yaml (default: []) -h, --help display help for command ``` @@ -309,8 +309,8 @@ Usage: backstage-cli config:schema [options] Print configuration schema Options: - --package <name> Only output config schema that applies to the given package - --format <format> Format to print the schema in, either json or yaml [yaml] + --package Only output config schema that applies to the given package + --format Format to print the schema in, either json or yaml [yaml] -h, --help display help for command ``` @@ -325,8 +325,8 @@ Usage: backstage-cli versions:bump [options] Options: -h, --help display help for command - --pattern <glob> Override glob for matching packages to upgrade - --release <version|next|main> Bump to a specific Backstage release line or version (default: "main") + --pattern Override glob for matching packages to upgrade + --release Bump to a specific Backstage release line or version (default: "main") ``` ## versions:check From 756c99c81772c6747f1a5d330bd2a55d94d545b6 Mon Sep 17 00:00:00 2001 From: blam Date: Wed, 15 Mar 2023 17:34:51 +0100 Subject: [PATCH 124/177] chore: added blog post Signed-off-by: blam --- .../blog/2023-03-15-backstage-turns-3.md | 79 +++++++++++++++++++ 1 file changed, 79 insertions(+) create mode 100644 microsite/blog/2023-03-15-backstage-turns-3.md diff --git a/microsite/blog/2023-03-15-backstage-turns-3.md b/microsite/blog/2023-03-15-backstage-turns-3.md new file mode 100644 index 0000000000..6fcd47ded0 --- /dev/null +++ b/microsite/blog/2023-03-15-backstage-turns-3.md @@ -0,0 +1,79 @@ +--- +title: Backstage Turns Three! +author: Ben Lambert +authorURL: https://github.com/benjdlambert +authorImageURL: https://avatars.githubusercontent.com/u/3645856?v=4 +--- + +**tl;dr** Spotify released Backstage into open source three years ago today. Since then, the community has grown by leaps and bounds to stretch across the globe (and the Discord server!). Now that Backstage is a threenager, the growing pains are real. So, on this birthday, we want to cover our collective efforts to make it easier to adopt and contribute to Backstage. + + + +## They grow up so fast, don’t they? + +Happy birthday, Backstage! Three years ago, Spotify released its homegrown developer portal into the wild after a small team collaborated on an internal Hack Week project. We’d had a lot of conversations with companies looking to build out something similar to what we’d been running for years, so our Hack Week sprint started as an experiment to see if the Backstage core plugins could be valuable in open source. + +It's cliché at this point — because we’ve said it a million times — but no one could have predicted what came next. + +In three short years, Backstage has grown to a Cloud Native Computing Foundation Incubating project, with more than 900 adopters and 1,500 contributors worldwide. Companies like CVS Health, Siemens, LinkedIn, REI, Vodafone, and Lego are building out their own developer portals from the Backstage framework and bringing their learnings to the project + +A few more stats we love to see (mainly coming from the [project repo](https://github.com/backstage/backstage)): + +- 3k+ project forks +- 38k+ commits +- 12k+ PRs +- 15k+ total contributions +- 21k+ stars on GitHub +- 9k+ Discord members +- 100+ open source plugins in the [plugin marketplace](https://backstage.io/plugins) + +But, without a doubt, the best thing about the Backstage project is the people in this community. People who are curious, collaborative, and excited to share knowledge. People who’ll sift through Discord at all hours to answer questions and support one another. People who come from all over the world but share a common trait: being passionate about enabling developers to do their best work. + +Don’t take our word for it! Take a look at this birthday video we put together with a few community members. + +[VIDEO HERE] + +## The growing pains are real + +But it's not all sunshine and roses in Backstage-land. If Year 1 was about getting this community going and Year 2 was focused on maturing the platform, then Year 3 needs to address some of the inevitable growing pains a project undergoes as it gains ground. + +We hear two things pretty consistently from the community: + +- **Backstage is a steep learning curve:** Over the past three years, the project has grown in scope and breadth which can translate to complexity. This is especially true for newcomers looking to get their arms wrapped around the key concepts. +- **Backstage has barriers to adoption:** Backstage adopters tell us driving widespread adoption of their developer portal remains the biggest challenge they face. Adoption barriers can be technical but are often cultural. + +The maintainers and some of our most involved community members are actively tackling how we can make the Backstage onboarding process easier for contributors. There are also lots of ways the project could better support adopters on that journey and make adoption faster and smoother. + +We’re looking at everything from cleaning up documentation to opinionated catalog ingestors being discussed in both the Catalog and Adoption monthly SIGs (running meeting notes [here](https://docs.google.com/document/d/1xg57CDfX2R5jTGbbWANzifm2szEb664kuTwfEEvKgZU/) and [here](https://docs.google.com/document/d/1zeYSzXYgh897bxPQmwy2btOwCFlEjlUDLf00riySLRc)). A few priorities that we’ve already mapped out: + +- Make it easier to install, customize, and maintain Backstage +- Provide Golden Paths for adoption +- Improve the experience and the content on [backstage.io](https://backstage.io/docs/overview/what-is-backstage) + +Because there are now so many mature adopters — Spotify included — there’s so much knowledge on how to create a roadmap for adoption and use cases, how to roll out your developer portal to your teams and drive inner source contributions, how to measure and attribute developer productivity gains, etc. + +Our goal is to tap into the knowledge those adopters have gained and create more tangible resources for the entire community. But we can’t do it without help. And that’s where you come in! + +## Getting (more) involved + +We’re very grateful for the Backstage ride-or-dies: the contributors who show up to every community session, attend every SIG, and are always ready to jump in on any PR or issue. + +But one of the areas where we think the project could greatly improve (and better address some of the growing pains I mentioned above!) is more active contribution — both the total number of people contributing and what they’re contributing. + +We’ve already shared a bit on this but the maintainer team is starting to address this challenge by proposing the following three initiatives: + +- Introduce more steps in between first-time contributor and maintainer in the form of a contributor ladder (loosely based on the [CNCF Project Template](https://github.com/cncf/project-template/blob/main/CONTRIBUTOR_LADDER.md)). +- Change the ownership model, for example, divide the project up into several project areas, each covering particular parts of the project. +- Introduce a new process for large contributions in the form of Backstage Enhancement Proposals (BEPs). + +These two RFCs on [Updated Backstage Governance](https://github.com/backstage/backstage/issues/15317) and [Backstage Enhancement Proposals](https://github.com/backstage/backstage/issues/15318) remain open so feel free to read and join the discussion! Watch this space as we’ll share more on the go-forward governance and BEPs plan soon. + +But if you’re brand-new and just looking to get your feet wet, we’ve also [compiled some small steps](https://backstage.io/docs/getting-started/getting-involved/) you can take to get involved: + +- Report (or squash) bugs: Look through the GitHub issues for [bugs](https://github.com/backstage/backstage/labels/bug), [good first issues](https://github.com/backstage/backstage/labels/good%20first%20issue) or [help wanted](https://github.com/backstage/backstage/labels/help%20wanted) +- Build or suggest a plugin: The Backstage project grows with every new plugin that gets added +- Add non-code contributions: We welcome things that help the community at large, but may not fit into the scope of the core project +- Write documentation or improve the website: The current documentation and project site are pretty limited. Better content helps a lot of those growing pains. +- Contribute to Storybook: Help us [create new components](https://github.com/backstage/backstage/labels/help%20wanted) or improve stories for the existing ones +- Submit feedback: The best way to send feedback is to file [an issue](https://github.com/backstage/backstage/issues) with as much detail as possible +- Add your company to ADOPTERS: Adding your company to [ADOPTERS](https://github.com/backstage/backstage/blob/master/ADOPTERS.md) really helps the project, you can do this by filling out this [adopter form](https://form.typeform.com/to/zcOaKikB) From da7aba5c565909e4c7d11e949cb551237c552a4a Mon Sep 17 00:00:00 2001 From: blam Date: Wed, 15 Mar 2023 17:39:47 +0100 Subject: [PATCH 125/177] chore: added header image Signed-off-by: blam --- .../blog/2023-03-15-backstage-turns-3.md | 2 ++ microsite/blog/assets/2023-03-15/birthday.gif | Bin 0 -> 1211031 bytes 2 files changed, 2 insertions(+) create mode 100644 microsite/blog/assets/2023-03-15/birthday.gif diff --git a/microsite/blog/2023-03-15-backstage-turns-3.md b/microsite/blog/2023-03-15-backstage-turns-3.md index 6fcd47ded0..6e0f99d2e9 100644 --- a/microsite/blog/2023-03-15-backstage-turns-3.md +++ b/microsite/blog/2023-03-15-backstage-turns-3.md @@ -5,6 +5,8 @@ authorURL: https://github.com/benjdlambert authorImageURL: https://avatars.githubusercontent.com/u/3645856?v=4 --- +![backstage turns 3 header image](assets/2023-03-15/birthday.gif) + **tl;dr** Spotify released Backstage into open source three years ago today. Since then, the community has grown by leaps and bounds to stretch across the globe (and the Discord server!). Now that Backstage is a threenager, the growing pains are real. So, on this birthday, we want to cover our collective efforts to make it easier to adopt and contribute to Backstage. diff --git a/microsite/blog/assets/2023-03-15/birthday.gif b/microsite/blog/assets/2023-03-15/birthday.gif new file mode 100644 index 0000000000000000000000000000000000000000..0c489bc536ed59e5d6a98ed7d3a4f2492213cb56 GIT binary patch literal 1211031 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
>&qtNfrR5Stb~d5-`v~ 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�g$!# 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

SnzBGt6kyScq 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
xk4yY_n4?1!-r&w>pmctjV1kGx0I9AfL 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≫g`;JsT5=*yT10y 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

DGX8E4b5UJYQ@ouED^N50fEF%6kgrxe`)%pMI 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%0De&ajAGZ6c~b68l9L&O?5rBH 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 S(UpaU(&I-xE| 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 (t$-L=8O%YN&#u22iAGKu}QBNg)I& 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

EE*pC$#uale&`+vWf6)dw7>)}r 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

n!Z*L&L5MT;;>9DMslU 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 SH3e5!!dP9!lGuhgqzb?q4+RVoxnVIo> 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 z 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�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 F{|gy?nL+>n literal 0 HcmV?d00001 From c039f66cbe735836e9c4cef0a539fc6672f15954 Mon Sep 17 00:00:00 2001 From: blam Date: Wed, 15 Mar 2023 17:46:49 +0100 Subject: [PATCH 126/177] chore: fixing spelling and making value happy Signed-off-by: blam --- .github/vale/Vocab/Backstage/accept.txt | 3 +++ microsite/blog/2023-03-15-backstage-turns-3.md | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/.github/vale/Vocab/Backstage/accept.txt b/.github/vale/Vocab/Backstage/accept.txt index 63fa474115..82c6251d12 100644 --- a/.github/vale/Vocab/Backstage/accept.txt +++ b/.github/vale/Vocab/Backstage/accept.txt @@ -158,6 +158,7 @@ img incentivised Indal indexable +ingestors inlined inlinehilite integrator's @@ -367,6 +368,7 @@ templaters Templaters TFRecord theia +threenager thumbsup todo todos @@ -403,6 +405,7 @@ validator validators varchar VMware +Vodafone VPCs VSCode Wayfair diff --git a/microsite/blog/2023-03-15-backstage-turns-3.md b/microsite/blog/2023-03-15-backstage-turns-3.md index 6e0f99d2e9..d0ee9c9efe 100644 --- a/microsite/blog/2023-03-15-backstage-turns-3.md +++ b/microsite/blog/2023-03-15-backstage-turns-3.md @@ -17,7 +17,7 @@ Happy birthday, Backstage! Three years ago, Spotify released its homegrown devel It's cliché at this point — because we’ve said it a million times — but no one could have predicted what came next. -In three short years, Backstage has grown to a Cloud Native Computing Foundation Incubating project, with more than 900 adopters and 1,500 contributors worldwide. Companies like CVS Health, Siemens, LinkedIn, REI, Vodafone, and Lego are building out their own developer portals from the Backstage framework and bringing their learnings to the project +In three short years, Backstage has grown to a Cloud Native Computing Foundation Incubating project, with more than 900 adopters and 1000+ contributors worldwide. Companies like CVS Health, Siemens, LinkedIn, REI, Vodafone, and Lego are building out their own developer portals from the Backstage framework and bringing their learnings to the project A few more stats we love to see (mainly coming from the [project repo](https://github.com/backstage/backstage)): From d197f9f7827c4cb0df79a83a177211495e337ec7 Mon Sep 17 00:00:00 2001 From: Miguel Alexandre Date: Wed, 15 Mar 2023 17:43:01 +0100 Subject: [PATCH 127/177] Include suggested changes Signed-off-by: Miguel Alexandre --- plugins/tech-insights/api-report.md | 2 ++ plugins/tech-insights/src/api/types.ts | 4 ++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/plugins/tech-insights/api-report.md b/plugins/tech-insights/api-report.md index 83509e1673..47aa8bbbea 100644 --- a/plugins/tech-insights/api-report.md +++ b/plugins/tech-insights/api-report.md @@ -27,6 +27,8 @@ export type Check = { name: string; description: string; factIds: string[]; + successMetadata?: Record; + failureMetadata?: Record; }; // @public diff --git a/plugins/tech-insights/src/api/types.ts b/plugins/tech-insights/src/api/types.ts index aa073dcbc4..b08f63ecc2 100644 --- a/plugins/tech-insights/src/api/types.ts +++ b/plugins/tech-insights/src/api/types.ts @@ -57,13 +57,13 @@ export type Check = { * Metadata to be returned in case a check has been successfully evaluated * Can contain links, description texts or other actionable items */ - successMetadata?: Record; + successMetadata?: Record; /** * Metadata to be returned in case a check evaluation has ended in failure * Can contain links, description texts or other actionable items */ - failureMetadata?: Record; + failureMetadata?: Record; }; /** From 196a4aa7e789318a62f23f42d1cc941c7ae42346 Mon Sep 17 00:00:00 2001 From: Miguel Alexandre Date: Wed, 15 Mar 2023 17:43:14 +0100 Subject: [PATCH 128/177] Generate api-report Signed-off-by: Miguel Alexandre --- .changeset/lazy-monkeys-worry.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.changeset/lazy-monkeys-worry.md b/.changeset/lazy-monkeys-worry.md index 2c7e2ba4a2..9dc3ea514e 100644 --- a/.changeset/lazy-monkeys-worry.md +++ b/.changeset/lazy-monkeys-worry.md @@ -1,5 +1,5 @@ --- -'@backstage/plugin-tech-insights': minor +'@backstage/plugin-tech-insights': patch --- -The Check class now includes the failureMetadata and successMetadata as returned by the runChecks call. +The `Check` type now optionally includes the `failureMetadata` and `successMetadata` as returned by the `runChecks` call. From 9e2714b0d7e86fca9079e2ef48f6b555ec142ece Mon Sep 17 00:00:00 2001 From: Abhay-soni-developer Date: Wed, 15 Mar 2023 23:18:53 +0530 Subject: [PATCH 129/177] yaml prettier run Signed-off-by: Abhay-soni-developer --- microsite/data/plugins/microsoft-calendar.yaml | 1 - 1 file changed, 1 deletion(-) diff --git a/microsite/data/plugins/microsoft-calendar.yaml b/microsite/data/plugins/microsoft-calendar.yaml index 80844d7096..374ffd60ba 100644 --- a/microsite/data/plugins/microsoft-calendar.yaml +++ b/microsite/data/plugins/microsoft-calendar.yaml @@ -1,4 +1,3 @@ ---- title: Microsoft Calendar author: StatusNeo authorUrl: https://statusneo.com/ From 6eca8337720012160c514e73de53f09ca6bb585c Mon Sep 17 00:00:00 2001 From: Abhay-soni-developer Date: Wed, 15 Mar 2023 23:35:17 +0530 Subject: [PATCH 130/177] yaml prettier run Signed-off-by: Abhay-soni-developer --- microsite/data/plugins/microsoft-calendar.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/microsite/data/plugins/microsoft-calendar.yaml b/microsite/data/plugins/microsoft-calendar.yaml index 374ffd60ba..c2c2552568 100644 --- a/microsite/data/plugins/microsoft-calendar.yaml +++ b/microsite/data/plugins/microsoft-calendar.yaml @@ -7,10 +7,10 @@ description: | It displays all your calendars and events in it. documentation: https://statusneo.com/23392-2 iconUrl: /img/outlook-statusneo.png -npmPackageName: "@backstage/plugin-microsoft-calendar" +npmPackageName: '@backstage/plugin-microsoft-calendar' tags: - Microsoft - calendar - StatusNeo - Management -addedDate: "2023-03-15" +addedDate: '2023-03-15' From 2a2298f9c65562460b3c1ba86fc7df704c81541d Mon Sep 17 00:00:00 2001 From: Carlos Esteban Lopez Date: Wed, 15 Mar 2023 19:54:36 -0500 Subject: [PATCH 131/177] feat(microsite): Add diagonal lines & small theme improvements to microsite Signed-off-by: Carlos Esteban Lopez --- microsite/docusaurus.config.js | 2 +- .../bannerSection/bannerSection.module.scss | 36 +++++++++++++++++++ .../bannerSection/bannerSection.tsx | 6 ++++ .../bannerSectionGrid.module.scss | 4 +-- microsite/src/pages/community/index.tsx | 8 ++--- microsite/src/pages/demos/index.tsx | 2 ++ microsite/src/pages/home/_home.tsx | 28 +++++++-------- microsite/src/pages/home/home.module.scss | 6 ++-- .../customTheme.scss} | 0 microsite/src/theme/variables.scss | 2 ++ 10 files changed, 70 insertions(+), 24 deletions(-) rename microsite/src/{css/customTheme.css => theme/customTheme.scss} (100%) create mode 100644 microsite/src/theme/variables.scss diff --git a/microsite/docusaurus.config.js b/microsite/docusaurus.config.js index b7d8453e21..2e5c6f6251 100644 --- a/microsite/docusaurus.config.js +++ b/microsite/docusaurus.config.js @@ -55,7 +55,7 @@ module.exports = { path: 'blog', }, theme: { - customCss: 'src/css/customTheme.css', + customCss: 'src/theme/customTheme.scss', }, gtag: { trackingID: 'G-KSEVGGNCJW', diff --git a/microsite/src/components/bannerSection/bannerSection.module.scss b/microsite/src/components/bannerSection/bannerSection.module.scss index 2beabf9738..64f4967d11 100644 --- a/microsite/src/components/bannerSection/bannerSection.module.scss +++ b/microsite/src/components/bannerSection/bannerSection.module.scss @@ -1,5 +1,41 @@ +@use 'src/theme/variables'; + .bannerSection { + --diagonalBorderHeight: 40px; + display: block; + background: var(--ifm-background-color); + + @media (min-width: variables.$desktopUpBreakpoint) { + --diagonalBorderHeight: 80px; + } + + &:global(:is(.diagonalBorder, .diagonalBottomBorder)) { + padding-bottom: var(--diagonalBorderHeight); + + & + section { + margin-top: calc(var(--diagonalBorderHeight) * -1); + padding-top: var(--diagonalBorderHeight); + } + } + + &:global(.diagonalBorder) { + clip-path: polygon( + 0 var(--diagonalBorderHeight), + 100% 0, + 100% calc(100% - var(--diagonalBorderHeight)), + 0 100% + ); + } + + &:global(.diagonalBottomBorder) { + clip-path: polygon( + 0 0, + 100% 0, + 100% calc(100% - var(--diagonalBorderHeight)), + 0 100% + ); + } &:global(.greyBackground) { background: linear-gradient(90.49deg, #121212 15.36%, #282828 70.44%); diff --git a/microsite/src/components/bannerSection/bannerSection.tsx b/microsite/src/components/bannerSection/bannerSection.tsx index 64c8d246c8..5dc99eecf0 100644 --- a/microsite/src/components/bannerSection/bannerSection.tsx +++ b/microsite/src/components/bannerSection/bannerSection.tsx @@ -6,6 +6,8 @@ import bannerStyles from './bannerSection.module.scss'; export type IBannerSectionProps = PropsWithChildren<{ className?: string; greyBackground?: boolean; + diagonalBorder?: boolean; + diagonalBottomBorder?: boolean; greenGradientBackground?: boolean; greenBottomGradientBackground?: boolean; greenCallToActionGradientBackground?: boolean; @@ -15,6 +17,8 @@ export const BannerSection = ({ children, className, greyBackground = false, + diagonalBorder = false, + diagonalBottomBorder = false, greenGradientBackground = false, greenBottomGradientBackground = false, greenCallToActionGradientBackground = false, @@ -22,6 +26,8 @@ export const BannerSection = ({

{ return (
- + { - + @@ -199,7 +199,7 @@ const Community = () => { - + Community initiatives} > @@ -223,7 +223,7 @@ const Community = () => { - + Trainings and Certifications diff --git a/microsite/src/pages/demos/index.tsx b/microsite/src/pages/demos/index.tsx index 2ca77e5c89..1221c38a63 100644 --- a/microsite/src/pages/demos/index.tsx +++ b/microsite/src/pages/demos/index.tsx @@ -167,6 +167,8 @@ const Demos = () => { {demoItems.map((demoItem, index) => ( 0 && index < demoItems.length - 1} greyBackground={index % 2 === 0} className={demosStyles.banner} > diff --git a/microsite/src/pages/home/_home.tsx b/microsite/src/pages/home/_home.tsx index ea22062d28..deb0d4cd6f 100644 --- a/microsite/src/pages/home/_home.tsx +++ b/microsite/src/pages/home/_home.tsx @@ -28,7 +28,7 @@ const HomePage = () => { return (
- + { - + { - +
{
- +

Learn more about the software catalog

@@ -196,7 +196,7 @@ const HomePage = () => {
- +
{
- +

Build your own software templates

@@ -260,7 +260,7 @@ const HomePage = () => {
- +
{
- +

Learn more about TechDocs

@@ -320,7 +320,7 @@ const HomePage = () => {
- +
{
- +

Learn more about Backstage Search

@@ -381,7 +381,7 @@ const HomePage = () => {
- + { - +

Learn more about the K8s plugin

@@ -437,7 +437,7 @@ const HomePage = () => {
- +
{
- +

Build a plugin

diff --git a/microsite/src/pages/home/home.module.scss b/microsite/src/pages/home/home.module.scss index 57f2b9acde..5877f7b5f5 100644 --- a/microsite/src/pages/home/home.module.scss +++ b/microsite/src/pages/home/home.module.scss @@ -1,4 +1,4 @@ -$desktopUpBreakpoint: 997px; +@use '../../theme/variables.scss'; .homePage { font-size: 1.25rem; @@ -70,7 +70,7 @@ $desktopUpBreakpoint: 997px; } .catalogContainer { - @media (min-width: $desktopUpBreakpoint) { + @media (min-width: variables.$desktopUpBreakpoint) { grid-template-columns: repeat(4, 1fr); picture { @@ -85,7 +85,7 @@ $desktopUpBreakpoint: 997px; } .softwareTemplatesContainer { - @media (min-width: $desktopUpBreakpoint) { + @media (min-width: variables.$desktopUpBreakpoint) { grid: repeat(2, auto) / repeat(4, 1fr); picture { diff --git a/microsite/src/css/customTheme.css b/microsite/src/theme/customTheme.scss similarity index 100% rename from microsite/src/css/customTheme.css rename to microsite/src/theme/customTheme.scss diff --git a/microsite/src/theme/variables.scss b/microsite/src/theme/variables.scss new file mode 100644 index 0000000000..3d74e59c9c --- /dev/null +++ b/microsite/src/theme/variables.scss @@ -0,0 +1,2 @@ +$xlUpBreakpoint: 1441px; +$desktopUpBreakpoint: 997px; From 1d704bc5e130b05141f8eb8df89a006fbff6c608 Mon Sep 17 00:00:00 2001 From: Waleed Malik Date: Thu, 16 Mar 2023 12:47:38 +0500 Subject: [PATCH 132/177] Remove traces of k8s.gcr.io Signed-off-by: Waleed Malik --- .../kubernetes-backend/examples/dice-roller/metrics-server.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/kubernetes-backend/examples/dice-roller/metrics-server.yaml b/plugins/kubernetes-backend/examples/dice-roller/metrics-server.yaml index 673064aaf2..06875a5cf1 100644 --- a/plugins/kubernetes-backend/examples/dice-roller/metrics-server.yaml +++ b/plugins/kubernetes-backend/examples/dice-roller/metrics-server.yaml @@ -82,7 +82,7 @@ spec: emptyDir: {} containers: - name: metrics-server - image: k8s.gcr.io/metrics-server-amd64:v0.3.1 + image: registry.k8s.io/metrics-server-amd64:v0.3.1 args: - --kubelet-insecure-tls - --kubelet-preferred-address-types=InternalIP From e47e69eadf03c4c61d56f41f6654a22a08f300a3 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 16 Mar 2023 08:58:22 +0000 Subject: [PATCH 133/177] fix(deps): replace apollo graphql packages with @apollo/server ^4.0.0 Signed-off-by: Renovate Bot --- .changeset/renovate-c574b04.md | 6 + plugins/catalog-graphql/package.json | 2 +- plugins/graphql-backend/package.json | 4 +- yarn.lock | 522 ++++++++++----------------- 4 files changed, 196 insertions(+), 338 deletions(-) create mode 100644 .changeset/renovate-c574b04.md diff --git a/.changeset/renovate-c574b04.md b/.changeset/renovate-c574b04.md new file mode 100644 index 0000000000..e409c71940 --- /dev/null +++ b/.changeset/renovate-c574b04.md @@ -0,0 +1,6 @@ +--- +'@backstage/plugin-catalog-graphql': patch +'@backstage/plugin-graphql-backend': patch +--- + +Updated dependency `@apollo/server` to `^4.0.0`. diff --git a/plugins/catalog-graphql/package.json b/plugins/catalog-graphql/package.json index 274828db86..5116d89067 100644 --- a/plugins/catalog-graphql/package.json +++ b/plugins/catalog-graphql/package.json @@ -37,7 +37,7 @@ "@backstage/catalog-model": "workspace:^", "@backstage/config": "workspace:^", "@backstage/types": "workspace:^", - "apollo-server": "^3.0.0", + "@apollo/server": "^4.0.0", "graphql": "^16.0.0", "graphql-modules": "^2.0.0", "graphql-tag": "^2.11.0", diff --git a/plugins/graphql-backend/package.json b/plugins/graphql-backend/package.json index 10e3f6eca6..7cd2b54117 100644 --- a/plugins/graphql-backend/package.json +++ b/plugins/graphql-backend/package.json @@ -38,8 +38,8 @@ "@backstage/plugin-catalog-graphql": "workspace:^", "@graphql-tools/schema": "^9.0.0", "@types/express": "^4.17.6", - "apollo-server": "^3.0.0", - "apollo-server-express": "^3.0.0", + "@apollo/server": "^4.0.0", + "@apollo/server": "^4.0.0", "express": "^4.17.1", "express-promise-router": "^4.1.0", "graphql": "^16.0.0", diff --git a/yarn.lock b/yarn.lock index d6e118f364..60b6bb89a9 100644 --- a/yarn.lock +++ b/yarn.lock @@ -33,6 +33,15 @@ __metadata: languageName: node linkType: hard +"@apollo/cache-control-types@npm:^1.0.2": + version: 1.0.2 + resolution: "@apollo/cache-control-types@npm:1.0.2" + peerDependencies: + graphql: 14.x || 15.x || 16.x + checksum: 1e00c57b45fbd8656c96cdcd254658f332c1955bd8db9274c665e1c6ef8ac881a6b6a3f953b60638ae5f59fdfce6b005adb9a5b945b694903579a9665499e823 + languageName: node + linkType: hard + "@apollo/explorer@npm:^2.0.0": version: 2.0.2 resolution: "@apollo/explorer@npm:2.0.2" @@ -57,9 +66,9 @@ __metadata: languageName: node linkType: hard -"@apollo/protobufjs@npm:1.2.6": - version: 1.2.6 - resolution: "@apollo/protobufjs@npm:1.2.6" +"@apollo/protobufjs@npm:1.2.7": + version: 1.2.7 + resolution: "@apollo/protobufjs@npm:1.2.7" dependencies: "@protobufjs/aspromise": ^1.1.2 "@protobufjs/base64": ^1.1.2 @@ -72,110 +81,181 @@ __metadata: "@protobufjs/pool": ^1.1.0 "@protobufjs/utf8": ^1.1.0 "@types/long": ^4.0.0 - "@types/node": ^10.1.0 long: ^4.0.0 bin: apollo-pbjs: bin/pbjs apollo-pbts: bin/pbts - checksum: 1410e94f87f7ce202491f2c45633ddea0590f5279bd3eaaeb25aa114345d09a5041f15d79b75e5915b23813dc71ec52e71fc1fda858fee21dead890dcb768416 + checksum: e01a33984ae06d6679f6796bb44e55260112ddd090ebc9f87d3f952c45153dd5df5c91ac4bf91ba60fb72ff8c1218059ce4bf8bb2eb08c5049c783de0098eec0 languageName: node linkType: hard -"@apollo/utils.dropunuseddefinitions@npm:^1.1.0": +"@apollo/server-gateway-interface@npm:^1.1.0": version: 1.1.0 - resolution: "@apollo/utils.dropunuseddefinitions@npm:1.1.0" - peerDependencies: - graphql: 14.x || 15.x || 16.x - checksum: b66e07086ea65bcb94d84cfd5e6d90d0406c4e7f602c9a5e793c2001273380a4f61c287f60ee1d81d47d49d3a62ef3f0afb8049243540d3021ff445869124094 - languageName: node - linkType: hard - -"@apollo/utils.keyvaluecache@npm:^1.0.1": - version: 1.0.1 - resolution: "@apollo/utils.keyvaluecache@npm:1.0.1" + resolution: "@apollo/server-gateway-interface@npm:1.1.0" dependencies: - "@apollo/utils.logger": ^1.0.0 + "@apollo/usage-reporting-protobuf": ^4.0.0 + "@apollo/utils.fetcher": ^2.0.0 + "@apollo/utils.keyvaluecache": ^2.1.0 + "@apollo/utils.logger": ^2.0.0 + peerDependencies: + graphql: 14.x || 15.x || 16.x + checksum: 0ad0b3b9dfb53cc664245acac638b3a3db0d56c496c8bf6c56928a92c21e9b3062bec47bd42c2c0f85a4469443467b245c772bb558c2733c1c0dde194722c82b + languageName: node + linkType: hard + +"@apollo/server@npm:^4.0.0": + version: 4.5.0 + resolution: "@apollo/server@npm:4.5.0" + dependencies: + "@apollo/cache-control-types": ^1.0.2 + "@apollo/server-gateway-interface": ^1.1.0 + "@apollo/usage-reporting-protobuf": ^4.1.0 + "@apollo/utils.createhash": ^2.0.0 + "@apollo/utils.fetcher": ^2.0.0 + "@apollo/utils.isnodelike": ^2.0.0 + "@apollo/utils.keyvaluecache": ^2.1.0 + "@apollo/utils.logger": ^2.0.0 + "@apollo/utils.usagereporting": ^2.0.0 + "@apollo/utils.withrequired": ^2.0.0 + "@graphql-tools/schema": ^9.0.0 + "@josephg/resolvable": ^1.0.0 + "@types/express": ^4.17.13 + "@types/express-serve-static-core": ^4.17.30 + "@types/node-fetch": ^2.6.1 + async-retry: ^1.2.1 + body-parser: ^1.20.0 + cors: ^2.8.5 + express: ^4.17.1 + loglevel: ^1.6.8 lru-cache: ^7.10.1 - checksum: 1a5dbd2eae0575905e25d471430d431d145b767ee6f5e8efe3ba64ed44208db131f437e36cf17df6623ae6de97a87c4c8691b4a274510b52ab49f6afe9627a3b + negotiator: ^0.6.3 + node-abort-controller: ^3.1.1 + node-fetch: ^2.6.7 + uuid: ^9.0.0 + whatwg-mimetype: ^3.0.0 + peerDependencies: + graphql: ^16.6.0 + checksum: 193b5f6913c945aafb8fc6b5b75fcfff250e5b84dc2727f6a0472b304da08a6cd90a21ae45591e6408e9413e8bee323bbf4c9586b511a4f426b562da5328e4d0 languageName: node linkType: hard -"@apollo/utils.logger@npm:^1.0.0": - version: 1.0.0 - resolution: "@apollo/utils.logger@npm:1.0.0" - checksum: 9be2b269d6d1cf2235c7b49a5edbb36c87589facf79516521df66d0c782709b7301a1365693b6e15d77f482d231bbb0fea4c2ae42faac7068cc4e014ce338c68 +"@apollo/usage-reporting-protobuf@npm:^4.0.0, @apollo/usage-reporting-protobuf@npm:^4.1.0": + version: 4.1.0 + resolution: "@apollo/usage-reporting-protobuf@npm:4.1.0" + dependencies: + "@apollo/protobufjs": 1.2.7 + checksum: 442532d7077a728a499de6c2c2340d106b26f14695446361f947a14d3092e4109239a86cfb99e4bb795d913523c1f61a05bb799b45fc72615560693bbd62e645 languageName: node linkType: hard -"@apollo/utils.printwithreducedwhitespace@npm:^1.1.0": - version: 1.1.0 - resolution: "@apollo/utils.printwithreducedwhitespace@npm:1.1.0" +"@apollo/utils.createhash@npm:^2.0.0": + version: 2.0.0 + resolution: "@apollo/utils.createhash@npm:2.0.0" + dependencies: + "@apollo/utils.isnodelike": ^2.0.0 + sha.js: ^2.4.11 + checksum: 467558891f22b05293ca2d9c04fb4815d8b13e9e03cac6f6f5eb752d06f00eb46a3f237c93250d83d53753326c289899b177f3147cd368079b7e74098392b1b7 + languageName: node + linkType: hard + +"@apollo/utils.dropunuseddefinitions@npm:^2.0.0": + version: 2.0.0 + resolution: "@apollo/utils.dropunuseddefinitions@npm:2.0.0" peerDependencies: graphql: 14.x || 15.x || 16.x - checksum: 86536751681c64f35a2d37b0c2f69a39d91ea0e4f0c3c993d9f76fa109f85e9d306e6994bd6e38eef1e4e5b83245125aaa125ecc94e185d90b3255f06a538503 + checksum: aaabd487ce25b56488f6bbf6606aecdc2b1f57805ec1b7fa16e21510947d4d5b4b1d557ebaa499dfecb8dfaef4058b696812feed6896bac5d7fb52e9bb1e1b2c languageName: node linkType: hard -"@apollo/utils.removealiases@npm:1.0.0": - version: 1.0.0 - resolution: "@apollo/utils.removealiases@npm:1.0.0" +"@apollo/utils.fetcher@npm:^2.0.0": + version: 2.0.0 + resolution: "@apollo/utils.fetcher@npm:2.0.0" + checksum: e9f4b696f496751d1b781836f394608115ae1fab673cb30ede223748d04eb983384b5c9e01f8350bb0530d841fd0ccb41be3a3a4bcae0a141b2478862add29cc + languageName: node + linkType: hard + +"@apollo/utils.isnodelike@npm:^2.0.0": + version: 2.0.0 + resolution: "@apollo/utils.isnodelike@npm:2.0.0" + checksum: 436853000037c955e7112d19b60ca82e6d453e7bc715f3360ab23384fe1153039b06f9329e85e1adb030a1b22f0b9e960b28a5ccd92f7c61a1af57e58401a1aa + languageName: node + linkType: hard + +"@apollo/utils.keyvaluecache@npm:^2.1.0": + version: 2.1.0 + resolution: "@apollo/utils.keyvaluecache@npm:2.1.0" + dependencies: + "@apollo/utils.logger": ^2.0.0 + lru-cache: ^7.14.1 + checksum: 1e1c9cdea98384c01864250bd8e39cffaa822adbd60f9387ecf5c6565f69c2fd23b3ebdc499990b39535d4df0e3991fe73ec2d59a2798631ede04d8834d8c384 + languageName: node + linkType: hard + +"@apollo/utils.logger@npm:^2.0.0": + version: 2.0.0 + resolution: "@apollo/utils.logger@npm:2.0.0" + checksum: bfe87036382adaf1b5f05acc8e926b6316a8b37dc0c0b20ae0c2010b61085d018620203eda9cb6884e650f3d971a4dfdbc30980deedba99d219ba2abd9bd8ffa + languageName: node + linkType: hard + +"@apollo/utils.printwithreducedwhitespace@npm:^2.0.0": + version: 2.0.0 + resolution: "@apollo/utils.printwithreducedwhitespace@npm:2.0.0" peerDependencies: graphql: 14.x || 15.x || 16.x - checksum: fda30ad4ee1fbf012e4289b9963b8b75a102eadbdfa5e558dc923cfc68df42eff6e232dc20c34b7e7563e5aac7ae3781d17919cd8f5eccb90c4225a274b2af93 + checksum: 0e1d374f2e0afd2d0fd31ff1c6717476b4ddeb642981d8f731a44420137f4991a28c1f9e278abf4229bb3174ae68037736e8cd8e13de5e316bf384dc32246518 languageName: node linkType: hard -"@apollo/utils.sortast@npm:^1.1.0": - version: 1.1.0 - resolution: "@apollo/utils.sortast@npm:1.1.0" +"@apollo/utils.removealiases@npm:2.0.0": + version: 2.0.0 + resolution: "@apollo/utils.removealiases@npm:2.0.0" + peerDependencies: + graphql: 14.x || 15.x || 16.x + checksum: 4f97e5864353386b8326eb62dd923be19c7e1f6b7ddc0935ceac1e34462aa471908d015f223f47a9cdd819e2d844f9dbdd27800bb451f5ffb4f376c4da8d2c41 + languageName: node + linkType: hard + +"@apollo/utils.sortast@npm:^2.0.0": + version: 2.0.0 + resolution: "@apollo/utils.sortast@npm:2.0.0" dependencies: lodash.sortby: ^4.7.0 peerDependencies: graphql: 14.x || 15.x || 16.x - checksum: 5ec695d8c91efd82ad75cb3e27662644c71e22be71793908135b38965be6fe1f229c24fd2f4fed1bc1829b84bec2a1f6470817a83c633d95292db7635a625471 + checksum: 50cfbdb6b8af735e9786af225edd6d4350e7530f5109bc330ae7f32edf38f15eed7711184d133a0801c5673fbc9a988a6521c7f69f3dc27910f2bd9fb6fbbb22 languageName: node linkType: hard -"@apollo/utils.stripsensitiveliterals@npm:^1.2.0": - version: 1.2.0 - resolution: "@apollo/utils.stripsensitiveliterals@npm:1.2.0" +"@apollo/utils.stripsensitiveliterals@npm:^2.0.0": + version: 2.0.0 + resolution: "@apollo/utils.stripsensitiveliterals@npm:2.0.0" peerDependencies: graphql: 14.x || 15.x || 16.x - checksum: 5910186a30be23fac59652d350e83a8a7a53adb9146ed545906f6893ad9c8d380752e679348ee210ae01fa39cc0487692b632e960003dcedc2282bd28de2aa01 + checksum: d0a740a6d1e525b72c7d7066fa87a4ee273b3ce7401f3578542278121819bf90c97d32227270e07c923ab205afee2b52afb03261865175ba0040666a8988d479 languageName: node linkType: hard -"@apollo/utils.usagereporting@npm:^1.0.0": - version: 1.0.0 - resolution: "@apollo/utils.usagereporting@npm:1.0.0" +"@apollo/utils.usagereporting@npm:^2.0.0": + version: 2.0.0 + resolution: "@apollo/utils.usagereporting@npm:2.0.0" dependencies: - "@apollo/utils.dropunuseddefinitions": ^1.1.0 - "@apollo/utils.printwithreducedwhitespace": ^1.1.0 - "@apollo/utils.removealiases": 1.0.0 - "@apollo/utils.sortast": ^1.1.0 - "@apollo/utils.stripsensitiveliterals": ^1.2.0 - apollo-reporting-protobuf: ^3.3.1 + "@apollo/usage-reporting-protobuf": ^4.0.0 + "@apollo/utils.dropunuseddefinitions": ^2.0.0 + "@apollo/utils.printwithreducedwhitespace": ^2.0.0 + "@apollo/utils.removealiases": 2.0.0 + "@apollo/utils.sortast": ^2.0.0 + "@apollo/utils.stripsensitiveliterals": ^2.0.0 peerDependencies: graphql: 14.x || 15.x || 16.x - checksum: 9f4d1b8381fc7930619c51ce96580e61e604455e01701de9c822245d3a7583553a0cc4c050450ddf80d8e556682b2ac79ed784c58a8b98b52cf097d344c5d1d8 + checksum: 599e44d236728d6e57953c6fb9372cc35bc5e8e0d572b951907c94683228c134662efef4e97e456e7655d2871215319b912cabc3662c799111b5265de7873880 languageName: node linkType: hard -"@apollographql/apollo-tools@npm:^0.5.3": - version: 0.5.3 - resolution: "@apollographql/apollo-tools@npm:0.5.3" - peerDependencies: - graphql: ^14.2.1 || ^15.0.0 || ^16.0.0 - checksum: 652f16f8ae4afb65a2cb62a47e46882f49368f8f2c115f421773c3f8aa47b466ab9a6758fc18138495bd010baea5fda05d3c313edd11c4f4b3e8f8783b54d5a2 - languageName: node - linkType: hard - -"@apollographql/graphql-playground-html@npm:1.6.29": - version: 1.6.29 - resolution: "@apollographql/graphql-playground-html@npm:1.6.29" - dependencies: - xss: ^1.0.8 - checksum: 32984ae225de572f3fe286409553884e4d252a35019abfd5bd6ef40f52173ba810fd0a4d23915e727425cd993fd178115e6a2557315789085e235114228dfe4a +"@apollo/utils.withrequired@npm:^2.0.0": + version: 2.0.0 + resolution: "@apollo/utils.withrequired@npm:2.0.0" + checksum: 144cef2859318879b3478693eb891c31afa75f30e807bdfbef98ec3aa93c74cb0a3f76d245dbdedd4954f52c1b9ec8bebbccc69eb5d8bb8109c88c4352225e24 languageName: node linkType: hard @@ -5222,6 +5302,7 @@ __metadata: version: 0.0.0-use.local resolution: "@backstage/plugin-catalog-graphql@workspace:plugins/catalog-graphql" dependencies: + "@apollo/server": ^4.0.0 "@backstage/catalog-model": "workspace:^" "@backstage/cli": "workspace:^" "@backstage/config": "workspace:^" @@ -5232,7 +5313,6 @@ __metadata: "@graphql-codegen/typescript": ^3.0.0 "@graphql-codegen/typescript-resolvers": ^3.0.0 "@graphql-tools/schema": ^9.0.0 - apollo-server: ^3.0.0 graphql: ^16.0.0 graphql-modules: ^2.0.0 graphql-tag: ^2.11.0 @@ -6438,6 +6518,7 @@ __metadata: version: 0.0.0-use.local resolution: "@backstage/plugin-graphql-backend@workspace:plugins/graphql-backend" dependencies: + "@apollo/server": ^4.0.0 "@backstage/backend-common": "workspace:^" "@backstage/cli": "workspace:^" "@backstage/config": "workspace:^" @@ -6445,8 +6526,6 @@ __metadata: "@graphql-tools/schema": ^9.0.0 "@types/express": ^4.17.6 "@types/supertest": ^2.0.8 - apollo-server: ^3.0.0 - apollo-server-express: ^3.0.0 express: ^4.17.1 express-promise-router: ^4.1.0 graphql: ^16.0.0 @@ -10346,18 +10425,6 @@ __metadata: languageName: node linkType: hard -"@graphql-tools/merge@npm:8.2.10": - version: 8.2.10 - resolution: "@graphql-tools/merge@npm:8.2.10" - dependencies: - "@graphql-tools/utils": 8.6.9 - tslib: ~2.3.0 - peerDependencies: - graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 - checksum: 7059d9f68cfb9b7c04d6024f528e5638fab165e681b3307877a6bad0fc461686595d19375350875bb5f4f7572b21d10272a1e4b08a8af5b6a67950a4a950012b - languageName: node - linkType: hard - "@graphql-tools/merge@npm:8.3.1": version: 8.3.1 resolution: "@graphql-tools/merge@npm:8.3.1" @@ -10406,20 +10473,6 @@ __metadata: languageName: node linkType: hard -"@graphql-tools/mock@npm:^8.1.2": - version: 8.6.8 - resolution: "@graphql-tools/mock@npm:8.6.8" - dependencies: - "@graphql-tools/schema": 8.3.10 - "@graphql-tools/utils": 8.6.9 - fast-json-stable-stringify: ^2.1.0 - tslib: ~2.3.0 - peerDependencies: - graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 - checksum: 594abfbb7766806e07910624d80e5c27cdf15e0b2d1a0eff4336b2d6c63bde3587ae6f7c889374217cb0893d8e9e87f696daf1cf1ce2fdae787dae22b8b4d228 - languageName: node - linkType: hard - "@graphql-tools/optimize@npm:^1.3.0": version: 1.3.0 resolution: "@graphql-tools/optimize@npm:1.3.0" @@ -10473,21 +10526,7 @@ __metadata: languageName: node linkType: hard -"@graphql-tools/schema@npm:8.3.10": - version: 8.3.10 - resolution: "@graphql-tools/schema@npm:8.3.10" - dependencies: - "@graphql-tools/merge": 8.2.10 - "@graphql-tools/utils": 8.6.9 - tslib: ~2.3.0 - value-or-promise: 1.0.11 - peerDependencies: - graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 - checksum: 8b225f4ae87d3f1d8d9772df605a27dfde069a2372f2af0a1459859c4310c5fef8243c1276c1959e316420f1584d739b9f52c55dd230d2ad177cde1019155b81 - languageName: node - linkType: hard - -"@graphql-tools/schema@npm:8.5.1, @graphql-tools/schema@npm:^8.0.0, @graphql-tools/schema@npm:^8.3.1": +"@graphql-tools/schema@npm:8.5.1, @graphql-tools/schema@npm:^8.3.1": version: 8.5.1 resolution: "@graphql-tools/schema@npm:8.5.1" dependencies: @@ -10566,17 +10605,6 @@ __metadata: languageName: node linkType: hard -"@graphql-tools/utils@npm:8.6.9": - version: 8.6.9 - resolution: "@graphql-tools/utils@npm:8.6.9" - dependencies: - tslib: ~2.3.0 - peerDependencies: - graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 - checksum: 73b9569a9c2409f86a6a9005f19026cfab6d136bf884dfbff436996a47fb0561ae24d3f6bb2abcfd600197aab85d6dfc177b9a0cbaba23905ba0c7591ef12110 - languageName: node - linkType: hard - "@graphql-tools/utils@npm:8.8.0": version: 8.8.0 resolution: "@graphql-tools/utils@npm:8.8.0" @@ -13982,15 +14010,6 @@ __metadata: languageName: node linkType: hard -"@types/accepts@npm:^1.3.5": - version: 1.3.5 - resolution: "@types/accepts@npm:1.3.5" - dependencies: - "@types/node": "*" - checksum: 590b7580570534a640510c071e09074cf63b5958b237a728f94322567350aea4d239f8a9d897a12b15c856b992ee4d7907e9812bb079886af2c00714e7fb3f60 - languageName: node - linkType: hard - "@types/ansi-regex@npm:^5.0.0": version: 5.0.0 resolution: "@types/ansi-regex@npm:5.0.0" @@ -14089,7 +14108,7 @@ __metadata: languageName: node linkType: hard -"@types/body-parser@npm:*, @types/body-parser@npm:1.19.2, @types/body-parser@npm:^1.19.0": +"@types/body-parser@npm:*, @types/body-parser@npm:^1.19.0": version: 1.19.2 resolution: "@types/body-parser@npm:1.19.2" dependencies: @@ -14260,13 +14279,6 @@ __metadata: languageName: node linkType: hard -"@types/cors@npm:2.8.12": - version: 2.8.12 - resolution: "@types/cors@npm:2.8.12" - checksum: 8c45f112c7d1d2d831b4b266f2e6ed33a1887a35dcbfe2a18b28370751fababb7cd045e745ef84a523c33a25932678097bf79afaa367c6cb3fa0daa7a6438257 - languageName: node - linkType: hard - "@types/cors@npm:^2.8.6": version: 2.8.13 resolution: "@types/cors@npm:2.8.13" @@ -14522,7 +14534,7 @@ __metadata: languageName: node linkType: hard -"@types/express-serve-static-core@npm:*, @types/express-serve-static-core@npm:^4.17.18, @types/express-serve-static-core@npm:^4.17.31, @types/express-serve-static-core@npm:^4.17.5": +"@types/express-serve-static-core@npm:*, @types/express-serve-static-core@npm:^4.17.30, @types/express-serve-static-core@npm:^4.17.31, @types/express-serve-static-core@npm:^4.17.5": version: 4.17.33 resolution: "@types/express-serve-static-core@npm:4.17.33" dependencies: @@ -14533,17 +14545,6 @@ __metadata: languageName: node linkType: hard -"@types/express-serve-static-core@npm:4.17.31": - version: 4.17.31 - resolution: "@types/express-serve-static-core@npm:4.17.31" - dependencies: - "@types/node": "*" - "@types/qs": "*" - "@types/range-parser": "*" - checksum: 009bfbe1070837454a1056aa710d0390ee5fb8c05dfe5a1691cc3e2ca88dc256f80e1ca27cb51a978681631d2f6431bfc9ec352ea46dd0c6eb183d0170bde5df - languageName: node - linkType: hard - "@types/express-session@npm:^1.17.2": version: 1.17.6 resolution: "@types/express-session@npm:1.17.6" @@ -14575,18 +14576,6 @@ __metadata: languageName: node linkType: hard -"@types/express@npm:4.17.14": - version: 4.17.14 - resolution: "@types/express@npm:4.17.14" - dependencies: - "@types/body-parser": "*" - "@types/express-serve-static-core": ^4.17.18 - "@types/qs": "*" - "@types/serve-static": "*" - checksum: 15c1af46d02de834e4a225eccaa9d85c0370fdbb3ed4e1bc2d323d24872309961542b993ae236335aeb3e278630224a6ea002078d39e651d78a3b0356b1eaa79 - languageName: node - linkType: hard - "@types/fs-extra@npm:^9.0.1, @types/fs-extra@npm:^9.0.3, @types/fs-extra@npm:^9.0.5, @types/fs-extra@npm:^9.0.6": version: 9.0.13 resolution: "@types/fs-extra@npm:9.0.13" @@ -15082,7 +15071,7 @@ __metadata: languageName: node linkType: hard -"@types/node-fetch@npm:^2.5.0, @types/node-fetch@npm:^2.5.12, @types/node-fetch@npm:^2.5.7": +"@types/node-fetch@npm:^2.5.0, @types/node-fetch@npm:^2.5.12, @types/node-fetch@npm:^2.5.7, @types/node-fetch@npm:^2.6.1": version: 2.6.2 resolution: "@types/node-fetch@npm:2.6.2" dependencies: @@ -15115,13 +15104,6 @@ __metadata: languageName: node linkType: hard -"@types/node@npm:^10.1.0": - version: 10.17.60 - resolution: "@types/node@npm:10.17.60" - checksum: 2cdb3a77d071ba8513e5e8306fa64bf50e3c3302390feeaeff1fd325dd25c8441369715dfc8e3701011a72fed5958c7dfa94eb9239a81b3c286caa4d97db6eef - languageName: node - linkType: hard - "@types/node@npm:^12.7.1": version: 12.20.55 resolution: "@types/node@npm:12.20.55" @@ -16455,7 +16437,7 @@ __metadata: languageName: node linkType: hard -"accepts@npm:^1.3.5, accepts@npm:~1.3.4, accepts@npm:~1.3.5, accepts@npm:~1.3.8": +"accepts@npm:~1.3.4, accepts@npm:~1.3.5, accepts@npm:~1.3.8": version: 1.3.8 resolution: "accepts@npm:1.3.8" dependencies: @@ -16755,137 +16737,6 @@ __metadata: languageName: node linkType: hard -"apollo-datasource@npm:^3.3.2": - version: 3.3.2 - resolution: "apollo-datasource@npm:3.3.2" - dependencies: - "@apollo/utils.keyvaluecache": ^1.0.1 - apollo-server-env: ^4.2.1 - checksum: 70244e792655b357213b92e9dd0e8ca553724857847c9bedb53a1dbf7a92fc0d8b05a60d77203d6c30331599b44c5d7cc5f4d94c934465fa05b146b681ed2293 - languageName: node - linkType: hard - -"apollo-reporting-protobuf@npm:^3.3.1, apollo-reporting-protobuf@npm:^3.4.0": - version: 3.4.0 - resolution: "apollo-reporting-protobuf@npm:3.4.0" - dependencies: - "@apollo/protobufjs": 1.2.6 - checksum: 5bf50e9cecd3c2334cd12e0ebe59be6c4d7b1b9ee443c7d913011ea1b84513f57561fb6c3ceb66083321acb6d1c56f72e2ab0edf378cf742693409eb8dcdc46b - languageName: node - linkType: hard - -"apollo-server-core@npm:^3.12.0": - version: 3.12.0 - resolution: "apollo-server-core@npm:3.12.0" - dependencies: - "@apollo/utils.keyvaluecache": ^1.0.1 - "@apollo/utils.logger": ^1.0.0 - "@apollo/utils.usagereporting": ^1.0.0 - "@apollographql/apollo-tools": ^0.5.3 - "@apollographql/graphql-playground-html": 1.6.29 - "@graphql-tools/mock": ^8.1.2 - "@graphql-tools/schema": ^8.0.0 - "@josephg/resolvable": ^1.0.0 - apollo-datasource: ^3.3.2 - apollo-reporting-protobuf: ^3.4.0 - apollo-server-env: ^4.2.1 - apollo-server-errors: ^3.3.1 - apollo-server-plugin-base: ^3.7.2 - apollo-server-types: ^3.8.0 - async-retry: ^1.2.1 - fast-json-stable-stringify: ^2.1.0 - graphql-tag: ^2.11.0 - loglevel: ^1.6.8 - lru-cache: ^6.0.0 - node-abort-controller: ^3.0.1 - sha.js: ^2.4.11 - uuid: ^9.0.0 - whatwg-mimetype: ^3.0.0 - peerDependencies: - graphql: ^15.3.0 || ^16.0.0 - checksum: b7a37a78901d38a330c9df8fe870da3dcf512f43ab60fdf9ab0ba37be03977db5d4b72eabf51a830d2a9dcfb2974d7bfbc5aa8719e3afac113c8bd7222740b8f - languageName: node - linkType: hard - -"apollo-server-env@npm:^4.2.1": - version: 4.2.1 - resolution: "apollo-server-env@npm:4.2.1" - dependencies: - node-fetch: ^2.6.7 - checksum: 039c7eeed82aff072237f9943629ab24b7c62b97535d756a31178f9e7352187951ee654a377d49d775d2ac221fe024914d9989257ca8a7e65c8e5f438c044f18 - languageName: node - linkType: hard - -"apollo-server-errors@npm:^3.3.1": - version: 3.3.1 - resolution: "apollo-server-errors@npm:3.3.1" - peerDependencies: - graphql: ^15.3.0 || ^16.0.0 - checksum: d09b66e7ac3e2cbc60774280d30118ac4d98f945b5cc1013bb81b9970aae49c0717a550e161fe978d69d7039ec053aeba495890f6eebf452532a2c5e94071a80 - languageName: node - linkType: hard - -"apollo-server-express@npm:^3.0.0, apollo-server-express@npm:^3.12.0": - version: 3.12.0 - resolution: "apollo-server-express@npm:3.12.0" - dependencies: - "@types/accepts": ^1.3.5 - "@types/body-parser": 1.19.2 - "@types/cors": 2.8.12 - "@types/express": 4.17.14 - "@types/express-serve-static-core": 4.17.31 - accepts: ^1.3.5 - apollo-server-core: ^3.12.0 - apollo-server-types: ^3.8.0 - body-parser: ^1.19.0 - cors: ^2.8.5 - parseurl: ^1.3.3 - peerDependencies: - express: ^4.17.1 - graphql: ^15.3.0 || ^16.0.0 - checksum: bd4bc213f506e2aeb2be961961de51e431f8774344b349e9b02f475714a623703eb62423ad968a8f8b6859919ae0d1912c40cf15a4df24e6f81b4f4c5653e70b - languageName: node - linkType: hard - -"apollo-server-plugin-base@npm:^3.7.2": - version: 3.7.2 - resolution: "apollo-server-plugin-base@npm:3.7.2" - dependencies: - apollo-server-types: ^3.8.0 - peerDependencies: - graphql: ^15.3.0 || ^16.0.0 - checksum: d6ea6dbfad8bb82959286eae89878ccccbd09743c3df2b76bf790f470cbf5441ba06dcb6835a25f0bf32f4df05722cce157ae983ce32db4b69de8a72c9949e2e - languageName: node - linkType: hard - -"apollo-server-types@npm:^3.8.0": - version: 3.8.0 - resolution: "apollo-server-types@npm:3.8.0" - dependencies: - "@apollo/utils.keyvaluecache": ^1.0.1 - "@apollo/utils.logger": ^1.0.0 - apollo-reporting-protobuf: ^3.4.0 - apollo-server-env: ^4.2.1 - peerDependencies: - graphql: ^15.3.0 || ^16.0.0 - checksum: 20accd42b65ceb95819a1610c410488fbe548ee309227d7fa22fd17dd1205e557091ba9c9a20efa532192098a4193e34eb58fc91d762b55fdf31229ac9fc7133 - languageName: node - linkType: hard - -"apollo-server@npm:^3.0.0": - version: 3.12.0 - resolution: "apollo-server@npm:3.12.0" - dependencies: - "@types/express": 4.17.14 - apollo-server-core: ^3.12.0 - apollo-server-express: ^3.12.0 - express: ^4.17.1 - peerDependencies: - graphql: ^15.3.0 || ^16.0.0 - checksum: 6f3dade76f202f04a890b2385923a0319a859a0ab48121b1636e22d5eae83afe042d7a0a501aff3d8816e67de4f29f8efa598e350814a40f41d079610dee346e - languageName: node - linkType: hard - "aproba@npm:^1.0.3": version: 1.2.0 resolution: "aproba@npm:1.2.0" @@ -17882,7 +17733,7 @@ __metadata: languageName: node linkType: hard -"body-parser@npm:1.20.1, body-parser@npm:^1.19.0": +"body-parser@npm:1.20.1": version: 1.20.1 resolution: "body-parser@npm:1.20.1" dependencies: @@ -17902,6 +17753,26 @@ __metadata: languageName: node linkType: hard +"body-parser@npm:^1.20.0": + version: 1.20.2 + resolution: "body-parser@npm:1.20.2" + dependencies: + bytes: 3.1.2 + content-type: ~1.0.5 + debug: 2.6.9 + depd: 2.0.0 + destroy: 1.2.0 + http-errors: 2.0.0 + iconv-lite: 0.4.24 + on-finished: 2.4.1 + qs: 6.11.0 + raw-body: 2.5.2 + type-is: ~1.6.18 + unpipe: 1.0.0 + checksum: 14d37ec638ab5c93f6099ecaed7f28f890d222c650c69306872e00b9efa081ff6c596cd9afb9930656aae4d6c4e1c17537bea12bb73c87a217cb3cfea8896737 + languageName: node + linkType: hard + "bonjour-service@npm:^1.0.11": version: 1.0.11 resolution: "bonjour-service@npm:1.0.11" @@ -19213,7 +19084,7 @@ __metadata: languageName: node linkType: hard -"commander@npm:^2.20.0, commander@npm:^2.20.3, commander@npm:^2.7.1": +"commander@npm:^2.20.0, commander@npm:^2.7.1": version: 2.20.3 resolution: "commander@npm:2.20.3" checksum: ab8c07884e42c3a8dbc5dd9592c606176c7eb5c1ca5ff274bcf907039b2c41de3626f684ea75ccf4d361ba004bbaff1f577d5384c155f3871e456bdf27becf9e @@ -19507,10 +19378,10 @@ __metadata: languageName: node linkType: hard -"content-type@npm:~1.0.4": - version: 1.0.4 - resolution: "content-type@npm:1.0.4" - checksum: 3d93585fda985d1554eca5ebd251994327608d2e200978fdbfba21c0c679914d5faf266d17027de44b34a72c7b0745b18584ecccaa7e1fdfb6a68ac7114f12e0 +"content-type@npm:~1.0.4, content-type@npm:~1.0.5": + version: 1.0.5 + resolution: "content-type@npm:1.0.5" + checksum: 566271e0a251642254cde0f845f9dd4f9856e52d988f4eb0d0dcffbb7a1f8ec98de7a5215fc628f3bce30fe2fb6fd2bc064b562d721658c59b544e2d34ea2766 languageName: node linkType: hard @@ -20014,13 +19885,6 @@ __metadata: languageName: node linkType: hard -"cssfilter@npm:0.0.10": - version: 0.0.10 - resolution: "cssfilter@npm:0.0.10" - checksum: bc2c52bbb3426c3f2e4832edb6f8573e6cfa65b40b540932762d1e018f0f0157725e2991b77344bbc8266c6bbf4daa2803b0707cfb1bd0877505bf83a68e4b04 - languageName: node - linkType: hard - "cssnano-preset-default@npm:^5.1.7": version: 5.1.7 resolution: "cssnano-preset-default@npm:5.1.7" @@ -28636,10 +28500,10 @@ __metadata: languageName: node linkType: hard -"lru-cache@npm:^7.10.1, lru-cache@npm:^7.7.1": - version: 7.10.1 - resolution: "lru-cache@npm:7.10.1" - checksum: e8b190d71ed0fcd7b29c71a3e9b01f851c92d1ef8865ff06b5581ca991db1e5e006920ed4da8b56da1910664ed51abfd76c46fb55e82ac252ff6c970ff910d72 +"lru-cache@npm:^7.10.1, lru-cache@npm:^7.14.1, lru-cache@npm:^7.7.1": + version: 7.18.3 + resolution: "lru-cache@npm:7.18.3" + checksum: e550d772384709deea3f141af34b6d4fa392e2e418c1498c078de0ee63670f1f46f5eee746e8ef7e69e1c895af0d4224e62ee33e66a543a14763b0f2e74c1356 languageName: node linkType: hard @@ -30202,10 +30066,10 @@ __metadata: languageName: node linkType: hard -"node-abort-controller@npm:^3.0.1": - version: 3.0.1 - resolution: "node-abort-controller@npm:3.0.1" - checksum: 2b3d75c65249fea99e8ba22da3a8bc553f034f44dd12f5f4b38b520f718b01c88718c978f0c24c2a460fc01de9a80b567028f547b94440cb47adeacfeb82c2ee +"node-abort-controller@npm:^3.0.1, node-abort-controller@npm:^3.1.1": + version: 3.1.1 + resolution: "node-abort-controller@npm:3.1.1" + checksum: 2c340916af9710328b11c0828223fc65ba320e0d082214a211311bf64c2891028e42ef276b9799188c4ada9e6e1c54cf7a0b7c05dd9d59fcdc8cd633304c8047 languageName: node linkType: hard @@ -31412,7 +31276,7 @@ __metadata: languageName: node linkType: hard -"parseurl@npm:^1.3.3, parseurl@npm:~1.3.2, parseurl@npm:~1.3.3": +"parseurl@npm:~1.3.2, parseurl@npm:~1.3.3": version: 1.3.3 resolution: "parseurl@npm:1.3.3" checksum: 407cee8e0a3a4c5cd472559bca8b6a45b82c124e9a4703302326e9ab60fc1081442ada4e02628efef1eb16197ddc7f8822f5a91fd7d7c86b51f530aedb17dfa2 @@ -33171,7 +33035,7 @@ __metadata: languageName: node linkType: hard -"raw-body@npm:^2.4.1": +"raw-body@npm:2.5.2, raw-body@npm:^2.4.1": version: 2.5.2 resolution: "raw-body@npm:2.5.2" dependencies: @@ -37400,7 +37264,7 @@ __metadata: languageName: node linkType: hard -"tslib@npm:2.3.1, tslib@npm:~2.3.0": +"tslib@npm:2.3.1": version: 2.3.1 resolution: "tslib@npm:2.3.1" checksum: de17a98d4614481f7fcb5cd53ffc1aaf8654313be0291e1bfaee4b4bb31a20494b7d218ff2e15017883e8ea9626599b3b0e0229c18383ba9dce89da2adf15cb9 @@ -39179,18 +39043,6 @@ __metadata: languageName: node linkType: hard -"xss@npm:^1.0.8": - version: 1.0.10 - resolution: "xss@npm:1.0.10" - dependencies: - commander: ^2.20.3 - cssfilter: 0.0.10 - bin: - xss: bin/xss - checksum: 0dbc70a716020d854569610d5bc949ba9d3b7f530b7af5508ffe84edaea228c34a4e1227f71cb3a4741373b1c49c3cb691f69dddefda45a594a31f112ae6a738 - languageName: node - linkType: hard - "xtend@npm:^4.0.0": version: 4.0.2 resolution: "xtend@npm:4.0.2" From 9a450cc44809d3f8cebf5e9fe6549104e40602db Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 16 Mar 2023 10:17:21 +0000 Subject: [PATCH 134/177] build(deps): bump webpack from 5.75.0 to 5.76.2 in /microsite Bumps [webpack](https://github.com/webpack/webpack) from 5.75.0 to 5.76.2. - [Release notes](https://github.com/webpack/webpack/releases) - [Commits](https://github.com/webpack/webpack/compare/v5.75.0...v5.76.2) --- updated-dependencies: - dependency-name: webpack dependency-type: indirect ... Signed-off-by: dependabot[bot] --- microsite/yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/microsite/yarn.lock b/microsite/yarn.lock index 04ef288c87..874d696626 100644 --- a/microsite/yarn.lock +++ b/microsite/yarn.lock @@ -10889,8 +10889,8 @@ __metadata: linkType: hard "webpack@npm:^5.73.0": - version: 5.75.0 - resolution: "webpack@npm:5.75.0" + version: 5.76.2 + resolution: "webpack@npm:5.76.2" dependencies: "@types/eslint-scope": ^3.7.3 "@types/estree": ^0.0.51 @@ -10921,7 +10921,7 @@ __metadata: optional: true bin: webpack: bin/webpack.js - checksum: 2bcc5f3c195f375944e8af2f00bf2feea39cb9fda5f763b0d1b00077f1c51783db25c94d3fae96a07dead9fa085e6ae7474417e5ab31719c9776ea5969ceb83a + checksum: 86db98299a175c371031449c26077e87b33acd8f45de7f7945ed4b9b37c8ca11bc5169af9c44743efccd4d55e08042a3aa3a3bc42aff831309a0821ffbcd395e languageName: node linkType: hard From d1cec7952740145b4fdcad9164c01740683a361b Mon Sep 17 00:00:00 2001 From: Djam Date: Thu, 16 Mar 2023 11:57:43 +0100 Subject: [PATCH 135/177] chore: extend .prettierignore of microsite I build the docs locally and then why I ran the `yarn prettier:check` it also checked the `build` folder. Probably don't need that. Signed-off-by: Djam --- microsite/.prettierignore | 1 + 1 file changed, 1 insertion(+) diff --git a/microsite/.prettierignore b/microsite/.prettierignore index b52c4a85c3..65d3600479 100644 --- a/microsite/.prettierignore +++ b/microsite/.prettierignore @@ -1 +1,2 @@ +build .docusaurus From 7eba760e6f60cfa1d1f18f166f1fdd89316b6512 Mon Sep 17 00:00:00 2001 From: Roohn Date: Mon, 13 Mar 2023 16:10:52 +0100 Subject: [PATCH 136/177] Add aggregate results by entityRef Signed-off-by: Roohn --- .changeset/fast-snakes-buy.md | 7 +++++++ .../src/service/router.test.ts | 16 ++++++++++++++++ .../src/service/router.ts | 18 +++++++++++++++++- plugins/entity-feedback-common/api-report.md | 10 +++++++--- plugins/entity-feedback-common/src/index.ts | 11 ++++++++--- plugins/entity-feedback/api-report.md | 4 ++++ .../src/api/EntityFeedbackApi.ts | 6 ++++++ .../src/api/EntityFeedbackClient.test.ts | 18 ++++++++++++++++++ .../src/api/EntityFeedbackClient.ts | 17 +++++++++++++++++ 9 files changed, 100 insertions(+), 7 deletions(-) create mode 100644 .changeset/fast-snakes-buy.md diff --git a/.changeset/fast-snakes-buy.md b/.changeset/fast-snakes-buy.md new file mode 100644 index 0000000000..711588918d --- /dev/null +++ b/.changeset/fast-snakes-buy.md @@ -0,0 +1,7 @@ +--- +'@backstage/plugin-entity-feedback': minor +'@backstage/plugin-entity-feedback-backend': patch +'@backstage/plugin-entity-feedback-common': patch +--- + +Added an endpoint to fetch anonymous aggregated results from an entity diff --git a/plugins/entity-feedback-backend/src/service/router.test.ts b/plugins/entity-feedback-backend/src/service/router.test.ts index 74fae8248b..5df0c5cf9d 100644 --- a/plugins/entity-feedback-backend/src/service/router.test.ts +++ b/plugins/entity-feedback-backend/src/service/router.test.ts @@ -258,6 +258,22 @@ describe('createRouter', () => { }); }); + describe('GET /ratings/:entityRef/aggregate', () => { + it('should get aggregated ratings for an entity correctly', async () => { + const response = await request(app) + .get('/ratings/component%3Adefault%2Fservice/aggregate') + .send(); + expect(mockDbHandler.getRatings).toHaveBeenCalledWith( + 'component:default/service', + ); + expect(response.status).toEqual(200); + expect(response.body).toEqual({ + DISLIKE: 1, + LIKE: 2, + }); + }); + }); + describe('POST /responses/:entityRef', () => { it('should record a response correctly', async () => { const body = { response: 'blah', comments: 'feedback', consent: true }; diff --git a/plugins/entity-feedback-backend/src/service/router.ts b/plugins/entity-feedback-backend/src/service/router.ts index e1243cedaf..ea759c1639 100644 --- a/plugins/entity-feedback-backend/src/service/router.ts +++ b/plugins/entity-feedback-backend/src/service/router.ts @@ -25,7 +25,10 @@ import { getBearerTokenFromAuthorizationHeader, IdentityApi, } from '@backstage/plugin-auth-node'; -import { EntityRatingsData } from '@backstage/plugin-entity-feedback-common'; +import { + EntityRatingsData, + Ratings, +} from '@backstage/plugin-entity-feedback-common'; import express from 'express'; import Router from 'express-promise-router'; import { Logger } from 'winston'; @@ -167,6 +170,19 @@ export async function createRouter( res.json(ratings.filter(r => accessibleEntityRefs.includes(r.userRef))); }); + router.get('/ratings/:entityRef/aggregate', async (req, res) => { + const entityRatings = ( + await dbHandler.getRatings(req.params.entityRef) + ).reduce((ratings: Ratings, { rating }) => { + ratings[rating] = ratings[rating] ?? 0; + ratings[rating]++; + + return ratings; + }, {}); + + res.json(entityRatings); + }); + router.post('/responses/:entityRef', async (req, res) => { const user = await identity.getIdentity({ request: req }); const { response, comments, consent } = req.body; diff --git a/plugins/entity-feedback-common/api-report.md b/plugins/entity-feedback-common/api-report.md index 118e6c78f2..f31bb0d041 100644 --- a/plugins/entity-feedback-common/api-report.md +++ b/plugins/entity-feedback-common/api-report.md @@ -10,9 +10,7 @@ export interface EntityRatingsData { // (undocumented) entityTitle?: string; // (undocumented) - ratings: { - [ratingValue: string]: number; - }; + ratings: Ratings; } // @public (undocumented) @@ -38,4 +36,10 @@ export interface Rating { // (undocumented) userRef: string; } + +// @public (undocumented) +export interface Ratings { + // (undocumented) + [ratingValue: string]: number; +} ``` diff --git a/plugins/entity-feedback-common/src/index.ts b/plugins/entity-feedback-common/src/index.ts index eea289a899..247a5a5d54 100644 --- a/plugins/entity-feedback-common/src/index.ts +++ b/plugins/entity-feedback-common/src/index.ts @@ -40,13 +40,18 @@ export interface FeedbackResponse { userRef: string; } +/** + * @public + */ +export interface Ratings { + [ratingValue: string]: number; +} + /** * @public */ export interface EntityRatingsData { entityRef: string; entityTitle?: string; - ratings: { - [ratingValue: string]: number; - }; + ratings: Ratings; } diff --git a/plugins/entity-feedback/api-report.md b/plugins/entity-feedback/api-report.md index 06b0166b0d..696536aef4 100644 --- a/plugins/entity-feedback/api-report.md +++ b/plugins/entity-feedback/api-report.md @@ -13,6 +13,7 @@ import { EntityRatingsData } from '@backstage/plugin-entity-feedback-common'; import { FeedbackResponse } from '@backstage/plugin-entity-feedback-common'; import { FetchApi } from '@backstage/core-plugin-api'; import { Rating } from '@backstage/plugin-entity-feedback-common'; +import { Ratings } from '@backstage/plugin-entity-feedback-common'; import { ReactNode } from 'react'; import { RouteRef } from '@backstage/core-plugin-api'; @@ -22,6 +23,7 @@ export interface EntityFeedbackApi { getAllRatings(): Promise; // (undocumented) getOwnedRatings(ownerRef: string): Promise; + getRatingAggregates(entityRef: string): Promise; // (undocumented) getRatings(entityRef: string): Promise[]>; // (undocumented) @@ -48,6 +50,8 @@ export class EntityFeedbackClient implements EntityFeedbackApi { // (undocumented) getOwnedRatings(ownerRef: string): Promise; // (undocumented) + getRatingAggregates(entityRef: string): Promise; + // (undocumented) getRatings(entityRef: string): Promise[]>; // (undocumented) getResponses( diff --git a/plugins/entity-feedback/src/api/EntityFeedbackApi.ts b/plugins/entity-feedback/src/api/EntityFeedbackApi.ts index d2f1a46f55..7ec6a447f0 100644 --- a/plugins/entity-feedback/src/api/EntityFeedbackApi.ts +++ b/plugins/entity-feedback/src/api/EntityFeedbackApi.ts @@ -19,6 +19,7 @@ import { EntityRatingsData, FeedbackResponse, Rating, + Ratings, } from '@backstage/plugin-entity-feedback-common'; /** @@ -40,6 +41,11 @@ export interface EntityFeedbackApi { getRatings(entityRef: string): Promise[]>; + /** + * Returns anonymized aggregated results for one entityRef + */ + getRatingAggregates(entityRef: string): Promise; + recordResponse( entityRef: string, response: Omit, diff --git a/plugins/entity-feedback/src/api/EntityFeedbackClient.test.ts b/plugins/entity-feedback/src/api/EntityFeedbackClient.test.ts index 694fd66b06..8ef6810115 100644 --- a/plugins/entity-feedback/src/api/EntityFeedbackClient.test.ts +++ b/plugins/entity-feedback/src/api/EntityFeedbackClient.test.ts @@ -121,6 +121,24 @@ describe('EntityFeedbackClient', () => { expect(response).toEqual(ratings); }); + it('getRatingAggregates', async () => { + const ratings = { LIKE: 3, DISLIKE: 5 }; + + server.use( + rest.get( + `${mockBaseUrl}/ratings/${encodeURIComponent( + 'component:default/service', + )}/aggregate`, + (_, res, ctx) => res(ctx.json(ratings)), + ), + ); + + const response = await client.getRatingAggregates( + 'component:default/service', + ); + expect(response).toEqual(ratings); + }); + it('recordResponse', async () => { expect.assertions(1); const response = { diff --git a/plugins/entity-feedback/src/api/EntityFeedbackClient.ts b/plugins/entity-feedback/src/api/EntityFeedbackClient.ts index 34856473c8..f911cdc7f8 100644 --- a/plugins/entity-feedback/src/api/EntityFeedbackClient.ts +++ b/plugins/entity-feedback/src/api/EntityFeedbackClient.ts @@ -20,6 +20,7 @@ import { EntityRatingsData, FeedbackResponse, Rating, + Ratings, } from '@backstage/plugin-entity-feedback-common'; import { EntityFeedbackApi } from './EntityFeedbackApi'; @@ -97,6 +98,22 @@ export class EntityFeedbackClient implements EntityFeedbackApi { return resp.json(); } + async getRatingAggregates(entityRef: string): Promise { + const baseUrl = await this.discoveryApi.getBaseUrl('entity-feedback'); + const resp = await this.fetchApi.fetch( + `${baseUrl}/ratings/${encodeURIComponent(entityRef)}/aggregate`, + { + method: 'GET', + }, + ); + + if (!resp.ok) { + throw await ResponseError.fromResponse(resp); + } + + return resp.json(); + } + async recordResponse( entityRef: string, response: Omit, From 04a366c65ccb9fdce6ef9b641f7c76a9ec59a829 Mon Sep 17 00:00:00 2001 From: blam Date: Thu, 16 Mar 2023 13:27:26 +0100 Subject: [PATCH 137/177] chore: added video Signed-off-by: blam --- microsite/blog/2023-03-15-backstage-turns-3.md | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/microsite/blog/2023-03-15-backstage-turns-3.md b/microsite/blog/2023-03-15-backstage-turns-3.md index d0ee9c9efe..fffd4a70b0 100644 --- a/microsite/blog/2023-03-15-backstage-turns-3.md +++ b/microsite/blog/2023-03-15-backstage-turns-3.md @@ -17,7 +17,7 @@ Happy birthday, Backstage! Three years ago, Spotify released its homegrown devel It's cliché at this point — because we’ve said it a million times — but no one could have predicted what came next. -In three short years, Backstage has grown to a Cloud Native Computing Foundation Incubating project, with more than 900 adopters and 1000+ contributors worldwide. Companies like CVS Health, Siemens, LinkedIn, REI, Vodafone, and Lego are building out their own developer portals from the Backstage framework and bringing their learnings to the project +In three short years, Backstage has grown to a Cloud Native Computing Foundation Incubating project, with more than 900 adopters and 1000+ contributors worldwide. Companies like CVS Health, Siemens, LinkedIn, REI, Vodafone, and Lego are building out their own developer portals from the Backstage framework and bringing their learnings to the project. A few more stats we love to see (mainly coming from the [project repo](https://github.com/backstage/backstage)): @@ -33,7 +33,10 @@ But, without a doubt, the best thing about the Backstage project is the people i Don’t take our word for it! Take a look at this birthday video we put together with a few community members. -[VIDEO HERE] +
+ +
## The growing pains are real From ca50c3bbea11251f3853e7077fd81662bd710eb4 Mon Sep 17 00:00:00 2001 From: Justin Edelson Date: Tue, 14 Mar 2023 10:44:44 -0400 Subject: [PATCH 138/177] fix(api-docs): Corrected styling of nested objects in AsyncAPI to avoid inappropriate uppercasing of nested objects Fixes #16848 Signed-off-by: Justin Edelson --- .changeset/curly-boats-trade.md | 5 +++++ .../api-docs/dev/asyncapi-example-api.yaml | 19 +++++++++++++++++++ .../AsyncApiDefinition.tsx | 2 ++ 3 files changed, 26 insertions(+) create mode 100644 .changeset/curly-boats-trade.md diff --git a/.changeset/curly-boats-trade.md b/.changeset/curly-boats-trade.md new file mode 100644 index 0000000000..773d66734c --- /dev/null +++ b/.changeset/curly-boats-trade.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-api-docs': patch +--- + +Corrected styling of nested objects in AsyncAPI to avoid inappropriate uppercase text transformation of nested objects. diff --git a/plugins/api-docs/dev/asyncapi-example-api.yaml b/plugins/api-docs/dev/asyncapi-example-api.yaml index 725811d0cc..3895006979 100644 --- a/plugins/api-docs/dev/asyncapi-example-api.yaml +++ b/plugins/api-docs/dev/asyncapi-example-api.yaml @@ -133,6 +133,8 @@ spec: description: Light intensity measured in lumens. sentAt: $ref: "#/components/schemas/sentAt" + sentBy: + $ref: "#/components/schemas/sentBy" turnOnOffPayload: type: object properties: @@ -144,6 +146,8 @@ spec: description: Whether to turn on or off the light. sentAt: $ref: "#/components/schemas/sentAt" + sentBy: + $ref: "#/components/schemas/sentBy" dimLightPayload: type: object properties: @@ -154,10 +158,25 @@ spec: maximum: 100 sentAt: $ref: "#/components/schemas/sentAt" + sentBy: + $ref: "#/components/schemas/sentBy" sentAt: type: string format: date-time description: Date and time when the message was sent. + sentBy: + type: object + description: Description of the message sender. + properties: + name: + type: string + description: Name of the sender. + type: + type: string + description: Type of the sender. + enum: + - user + - machine securitySchemes: apiKey: diff --git a/plugins/api-docs/src/components/AsyncApiDefinitionWidget/AsyncApiDefinition.tsx b/plugins/api-docs/src/components/AsyncApiDefinitionWidget/AsyncApiDefinition.tsx index fd8948828c..64452b7191 100644 --- a/plugins/api-docs/src/components/AsyncApiDefinitionWidget/AsyncApiDefinition.tsx +++ b/plugins/api-docs/src/components/AsyncApiDefinitionWidget/AsyncApiDefinition.tsx @@ -76,6 +76,8 @@ const useStyles = makeStyles((theme: BackstageTheme) => ({ ...theme.typography.button, borderRadius: theme.shape.borderRadius, color: theme.palette.primary.main, + // override whatever may be in the theme's typography to ensure consistency with asyncapi + textTransform: 'inherit', }, '& a': { color: theme.palette.link, From 078069edf5370b89be6f481d37f97a044768d23d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20Adel=C3=B6w?= Date: Thu, 16 Mar 2023 14:34:44 +0100 Subject: [PATCH 139/177] fixup MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Fredrik Adelöw --- plugins/catalog-graphql/package.json | 3 +- .../src/graphql/module.test.ts | 2 +- plugins/graphql-backend/package.json | 3 +- plugins/graphql-backend/src/service/router.ts | 7 +- yarn.lock | 103 +++++++++++++++++- 5 files changed, 107 insertions(+), 11 deletions(-) diff --git a/plugins/catalog-graphql/package.json b/plugins/catalog-graphql/package.json index 5116d89067..ba7641febe 100644 --- a/plugins/catalog-graphql/package.json +++ b/plugins/catalog-graphql/package.json @@ -34,10 +34,11 @@ "clean": "backstage-cli package clean" }, "dependencies": { + "@apollo/client": "^3.0.0", + "@apollo/server": "^4.0.0", "@backstage/catalog-model": "workspace:^", "@backstage/config": "workspace:^", "@backstage/types": "workspace:^", - "@apollo/server": "^4.0.0", "graphql": "^16.0.0", "graphql-modules": "^2.0.0", "graphql-tag": "^2.11.0", diff --git a/plugins/catalog-graphql/src/graphql/module.test.ts b/plugins/catalog-graphql/src/graphql/module.test.ts index 5490c2030a..d4589a2625 100644 --- a/plugins/catalog-graphql/src/graphql/module.test.ts +++ b/plugins/catalog-graphql/src/graphql/module.test.ts @@ -22,7 +22,7 @@ import { ConfigReader } from '@backstage/config'; import { ReaderEntity } from '../service/client'; import { createLogger } from 'winston'; import { setupRequestMockHandlers } from '@backstage/test-utils'; -import { gql } from 'apollo-server'; +import { gql } from '@apollo/client'; import { Module, createApplication, testkit } from 'graphql-modules'; describe('Catalog Module', () => { diff --git a/plugins/graphql-backend/package.json b/plugins/graphql-backend/package.json index 7cd2b54117..2cef4a7298 100644 --- a/plugins/graphql-backend/package.json +++ b/plugins/graphql-backend/package.json @@ -33,13 +33,12 @@ "clean": "backstage-cli package clean" }, "dependencies": { + "@apollo/server": "^4.0.0", "@backstage/backend-common": "workspace:^", "@backstage/config": "workspace:^", "@backstage/plugin-catalog-graphql": "workspace:^", "@graphql-tools/schema": "^9.0.0", "@types/express": "^4.17.6", - "@apollo/server": "^4.0.0", - "@apollo/server": "^4.0.0", "express": "^4.17.1", "express-promise-router": "^4.1.0", "graphql": "^16.0.0", diff --git a/plugins/graphql-backend/src/service/router.ts b/plugins/graphql-backend/src/service/router.ts index aa83b51beb..fbddee435f 100644 --- a/plugins/graphql-backend/src/service/router.ts +++ b/plugins/graphql-backend/src/service/router.ts @@ -19,7 +19,8 @@ import express from 'express'; import Router from 'express-promise-router'; import { Logger } from 'winston'; import { createApplication } from 'graphql-modules'; -import { ApolloServer } from 'apollo-server-express'; +import { ApolloServer } from '@apollo/server'; +import { expressMiddleware } from '@apollo/server/express4'; import { createModule as createCatalogModule } from '@backstage/plugin-catalog-graphql'; import { Config } from '@backstage/config'; import helmet from 'helmet'; @@ -61,8 +62,6 @@ export async function createRouter( response.json({ status: 'ok' }); }); - const apolloMiddleware = server.getMiddleware({ path: '/' }); - if (process.env.NODE_ENV === 'development') router.use( helmet.contentSecurityPolicy({ @@ -72,7 +71,7 @@ export async function createRouter( }), ); - router.use(apolloMiddleware); + router.use(expressMiddleware(server)); router.use(errorHandler()); return router; diff --git a/yarn.lock b/yarn.lock index 60b6bb89a9..6de4c25d2d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -42,6 +42,42 @@ __metadata: languageName: node linkType: hard +"@apollo/client@npm:^3.0.0": + version: 3.7.10 + resolution: "@apollo/client@npm:3.7.10" + dependencies: + "@graphql-typed-document-node/core": ^3.1.1 + "@wry/context": ^0.7.0 + "@wry/equality": ^0.5.0 + "@wry/trie": ^0.3.0 + graphql-tag: ^2.12.6 + hoist-non-react-statics: ^3.3.2 + optimism: ^0.16.1 + prop-types: ^15.7.2 + response-iterator: ^0.2.6 + symbol-observable: ^4.0.0 + ts-invariant: ^0.10.3 + tslib: ^2.3.0 + zen-observable-ts: ^1.2.5 + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 + graphql-ws: ^5.5.5 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + subscriptions-transport-ws: ^0.9.0 || ^0.11.0 + peerDependenciesMeta: + graphql-ws: + optional: true + react: + optional: true + react-dom: + optional: true + subscriptions-transport-ws: + optional: true + checksum: d74a68f8042e76e3a81990c79a89aefc07c8899d354f3b469591356508001005106bba0fa953652c3ec19756d44bdec6730ac98f62fa836bd76acbcb7eff42ce + languageName: node + linkType: hard + "@apollo/explorer@npm:^2.0.0": version: 2.0.2 resolution: "@apollo/explorer@npm:2.0.2" @@ -5302,6 +5338,7 @@ __metadata: version: 0.0.0-use.local resolution: "@backstage/plugin-catalog-graphql@workspace:plugins/catalog-graphql" dependencies: + "@apollo/client": ^3.0.0 "@apollo/server": ^4.0.0 "@backstage/catalog-model": "workspace:^" "@backstage/cli": "workspace:^" @@ -16348,6 +16385,33 @@ __metadata: languageName: node linkType: hard +"@wry/context@npm:^0.7.0": + version: 0.7.0 + resolution: "@wry/context@npm:0.7.0" + dependencies: + tslib: ^2.3.0 + checksum: f4ff78023a0b949122037aae766232b7d2284dc415204d22d9ea6d7969ff8f5f29b18128bc9a40e68dc054c8a12b1bf5868a357fdb50c398c447290c3a5b0496 + languageName: node + linkType: hard + +"@wry/equality@npm:^0.5.0": + version: 0.5.3 + resolution: "@wry/equality@npm:0.5.3" + dependencies: + tslib: ^2.3.0 + checksum: 7ea8ded51462911217183b93cc3ffbb4d18dc02a62d4a79e0d9983463739bf54106aaeb25649bf33168120bd044b61d135018bfcf4fefad8099c13eac9238aa6 + languageName: node + linkType: hard + +"@wry/trie@npm:^0.3.0": + version: 0.3.2 + resolution: "@wry/trie@npm:0.3.2" + dependencies: + tslib: ^2.3.0 + checksum: 151d06b519e1ff1c3acf6ee6846161b1d7d50bbecd4c48e5cd1b05f9e37c30602aff02e88f20105f6e6c54ae4123f9c4eb7715044d7fd927d4ba4ec3e755cd36 + languageName: node + linkType: hard + "@xmldom/xmldom@npm:^0.7.0, @xmldom/xmldom@npm:^0.7.5, @xmldom/xmldom@npm:^0.7.6": version: 0.7.9 resolution: "@xmldom/xmldom@npm:0.7.9" @@ -24254,7 +24318,7 @@ __metadata: languageName: node linkType: hard -"graphql-tag@npm:^2.11.0": +"graphql-tag@npm:^2.11.0, graphql-tag@npm:^2.12.6": version: 2.12.6 resolution: "graphql-tag@npm:2.12.6" dependencies: @@ -30844,6 +30908,16 @@ __metadata: languageName: node linkType: hard +"optimism@npm:^0.16.1": + version: 0.16.2 + resolution: "optimism@npm:0.16.2" + dependencies: + "@wry/context": ^0.7.0 + "@wry/trie": ^0.3.0 + checksum: a98ed9a0b8ee2b031010222099b60860d52860bf8182889f2695a7cf2185f21aca59020f78e2b47c0ae7697843caa576798d792967314ff59f6aa7c5d9de7f3a + languageName: node + linkType: hard + "optionator@npm:^0.8.1": version: 0.8.3 resolution: "optionator@npm:0.8.3" @@ -34407,6 +34481,13 @@ __metadata: languageName: node linkType: hard +"response-iterator@npm:^0.2.6": + version: 0.2.6 + resolution: "response-iterator@npm:0.2.6" + checksum: b0db3c0665a0d698d65512951de9623c086b9c84ce015a76076d4bd0bf733779601d0b41f0931d16ae38132fba29e1ce291c1f8e6550fc32daaa2dc3ab4f338d + languageName: node + linkType: hard + "responselike@npm:^2.0.0": version: 2.0.0 resolution: "responselike@npm:2.0.0" @@ -36593,6 +36674,13 @@ __metadata: languageName: node linkType: hard +"symbol-observable@npm:^4.0.0": + version: 4.0.0 + resolution: "symbol-observable@npm:4.0.0" + checksum: 212c7edce6186634d671336a88c0e0bbd626c2ab51ed57498dc90698cce541839a261b969c2a1e8dd43762133d47672e8b62e0b1ce9cf4157934ba45fd172ba8 + languageName: node + linkType: hard + "symbol-tree@npm:^3.2.4": version: 3.2.4 resolution: "symbol-tree@npm:3.2.4" @@ -37190,6 +37278,15 @@ __metadata: languageName: node linkType: hard +"ts-invariant@npm:^0.10.3": + version: 0.10.3 + resolution: "ts-invariant@npm:0.10.3" + dependencies: + tslib: ^2.1.0 + checksum: bb07d56fe4aae69d8860e0301dfdee2d375281159054bc24bf1e49e513fb0835bf7f70a11351344d213a79199c5e695f37ebbf5a447188a377ce0cd81d91ddb5 + languageName: node + linkType: hard + "ts-log@npm:^2.2.3": version: 2.2.3 resolution: "ts-log@npm:2.2.3" @@ -37278,7 +37375,7 @@ __metadata: languageName: node linkType: hard -"tslib@npm:^2.0.0, tslib@npm:^2.0.1, tslib@npm:^2.0.3, tslib@npm:^2.1.0, tslib@npm:^2.2.0, tslib@npm:^2.3.1, tslib@npm:^2.4.0, tslib@npm:^2.4.1, tslib@npm:~2.5.0": +"tslib@npm:^2.0.0, tslib@npm:^2.0.1, tslib@npm:^2.0.3, tslib@npm:^2.1.0, tslib@npm:^2.2.0, tslib@npm:^2.3.0, tslib@npm:^2.3.1, tslib@npm:^2.4.0, tslib@npm:^2.4.1, tslib@npm:~2.5.0": version: 2.5.0 resolution: "tslib@npm:2.5.0" checksum: ae3ed5f9ce29932d049908ebfdf21b3a003a85653a9a140d614da6b767a93ef94f460e52c3d787f0e4f383546981713f165037dc2274df212ea9f8a4541004e1 @@ -39354,7 +39451,7 @@ __metadata: languageName: node linkType: hard -"zen-observable-ts@npm:^1.1.0": +"zen-observable-ts@npm:^1.1.0, zen-observable-ts@npm:^1.2.5": version: 1.2.5 resolution: "zen-observable-ts@npm:1.2.5" dependencies: From a64df816e56be7752669934e4491127617f0fa98 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 16 Mar 2023 14:42:20 +0000 Subject: [PATCH 140/177] fix(deps): update dependency @opentelemetry/api to v1.4.1 Signed-off-by: Renovate Bot --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index ad03a668e0..7fc869e38d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -12668,9 +12668,9 @@ __metadata: linkType: hard "@opentelemetry/api@npm:^1.0.1, @opentelemetry/api@npm:^1.3.0": - version: 1.4.0 - resolution: "@opentelemetry/api@npm:1.4.0" - checksum: 8dc522194e20d2e8aa6cac155dbce19d3fc9cfac59e953ece1064158c6348ccd9560ee99d2f2381e82c2f8c9a129b57fa7b640027383315504de1fa712b6d7f1 + version: 1.4.1 + resolution: "@opentelemetry/api@npm:1.4.1" + checksum: e783c40d1a518abf9c4c5d65223237c1392cd9a6c53ac6e2c3ef0c05ff7266e3dfc4fd9874316dae0dcb7a97950878deb513bcbadfaad653d48f0215f2a0911b languageName: node linkType: hard From 591135bd47114b5052ffa41ba3231721c07f5cdb Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 16 Mar 2023 14:42:46 +0000 Subject: [PATCH 141/177] fix(deps): update dependency @oriflame/backstage-plugin-score-card to v0.6.3 Signed-off-by: Renovate Bot --- yarn.lock | 38 +++++++++++++++++++------------------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/yarn.lock b/yarn.lock index ad03a668e0..2b86a49f8a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3605,7 +3605,7 @@ __metadata: languageName: unknown linkType: soft -"@backstage/catalog-model@^1.1.3, @backstage/catalog-model@^1.1.5, @backstage/catalog-model@^1.2.0, @backstage/catalog-model@workspace:^, @backstage/catalog-model@workspace:packages/catalog-model": +"@backstage/catalog-model@^1.1.5, @backstage/catalog-model@^1.2.0, @backstage/catalog-model@workspace:^, @backstage/catalog-model@workspace:packages/catalog-model": version: 0.0.0-use.local resolution: "@backstage/catalog-model@workspace:packages/catalog-model" dependencies: @@ -3821,7 +3821,7 @@ __metadata: languageName: unknown linkType: soft -"@backstage/config@^1.0.4, @backstage/config@workspace:^, @backstage/config@workspace:packages/config": +"@backstage/config@^1.0.6, @backstage/config@workspace:^, @backstage/config@workspace:packages/config": version: 0.0.0-use.local resolution: "@backstage/config@workspace:packages/config" dependencies: @@ -3867,7 +3867,7 @@ __metadata: languageName: unknown linkType: soft -"@backstage/core-components@^0.12.0, @backstage/core-components@^0.12.3, @backstage/core-components@^0.12.4, @backstage/core-components@workspace:^, @backstage/core-components@workspace:packages/core-components": +"@backstage/core-components@^0.12.3, @backstage/core-components@^0.12.4, @backstage/core-components@workspace:^, @backstage/core-components@workspace:packages/core-components": version: 0.0.0-use.local resolution: "@backstage/core-components@workspace:packages/core-components" dependencies: @@ -3938,7 +3938,7 @@ __metadata: languageName: unknown linkType: soft -"@backstage/core-plugin-api@^1.1.0, @backstage/core-plugin-api@^1.3.0, @backstage/core-plugin-api@^1.4.0, @backstage/core-plugin-api@workspace:^, @backstage/core-plugin-api@workspace:packages/core-plugin-api": +"@backstage/core-plugin-api@^1.3.0, @backstage/core-plugin-api@^1.4.0, @backstage/core-plugin-api@workspace:^, @backstage/core-plugin-api@workspace:packages/core-plugin-api": version: 0.0.0-use.local resolution: "@backstage/core-plugin-api@workspace:packages/core-plugin-api" dependencies: @@ -5173,7 +5173,7 @@ __metadata: languageName: unknown linkType: soft -"@backstage/plugin-catalog-common@^1.0.8, @backstage/plugin-catalog-common@workspace:^, @backstage/plugin-catalog-common@workspace:plugins/catalog-common": +"@backstage/plugin-catalog-common@^1.0.10, @backstage/plugin-catalog-common@workspace:^, @backstage/plugin-catalog-common@workspace:plugins/catalog-common": version: 0.0.0-use.local resolution: "@backstage/plugin-catalog-common@workspace:plugins/catalog-common" dependencies: @@ -5301,7 +5301,7 @@ __metadata: languageName: unknown linkType: soft -"@backstage/plugin-catalog-react@^1.2.1, @backstage/plugin-catalog-react@^1.2.4, @backstage/plugin-catalog-react@^1.3.0, @backstage/plugin-catalog-react@workspace:^, @backstage/plugin-catalog-react@workspace:plugins/catalog-react": +"@backstage/plugin-catalog-react@^1.2.4, @backstage/plugin-catalog-react@^1.3.0, @backstage/plugin-catalog-react@workspace:^, @backstage/plugin-catalog-react@workspace:plugins/catalog-react": version: 0.0.0-use.local resolution: "@backstage/plugin-catalog-react@workspace:plugins/catalog-react" dependencies: @@ -8753,7 +8753,7 @@ __metadata: languageName: unknown linkType: soft -"@backstage/types@^1.0.1, @backstage/types@workspace:^, @backstage/types@workspace:packages/types": +"@backstage/types@^1.0.2, @backstage/types@workspace:^, @backstage/types@workspace:packages/types": version: 0.0.0-use.local resolution: "@backstage/types@workspace:packages/types" dependencies: @@ -8764,7 +8764,7 @@ __metadata: languageName: unknown linkType: soft -"@backstage/version-bridge@^1.0.2, @backstage/version-bridge@workspace:^, @backstage/version-bridge@workspace:packages/version-bridge": +"@backstage/version-bridge@^1.0.3, @backstage/version-bridge@workspace:^, @backstage/version-bridge@workspace:packages/version-bridge": version: 0.0.0-use.local resolution: "@backstage/version-bridge@workspace:packages/version-bridge" dependencies: @@ -12675,18 +12675,18 @@ __metadata: linkType: hard "@oriflame/backstage-plugin-score-card@npm:^0.6.0": - version: 0.6.2 - resolution: "@oriflame/backstage-plugin-score-card@npm:0.6.2" + version: 0.6.3 + resolution: "@oriflame/backstage-plugin-score-card@npm:0.6.3" dependencies: - "@backstage/catalog-model": ^1.1.3 - "@backstage/config": ^1.0.4 - "@backstage/core-components": ^0.12.0 - "@backstage/core-plugin-api": ^1.1.0 - "@backstage/plugin-catalog-common": ^1.0.8 - "@backstage/plugin-catalog-react": ^1.2.1 + "@backstage/catalog-model": ^1.1.5 + "@backstage/config": ^1.0.6 + "@backstage/core-components": ^0.12.3 + "@backstage/core-plugin-api": ^1.3.0 + "@backstage/plugin-catalog-common": ^1.0.10 + "@backstage/plugin-catalog-react": ^1.2.4 "@backstage/theme": ^0.2.16 - "@backstage/types": ^1.0.1 - "@backstage/version-bridge": ^1.0.2 + "@backstage/types": ^1.0.2 + "@backstage/version-bridge": ^1.0.3 "@material-ui/core": ^4.12.2 "@material-ui/icons": ^4.11.2 "@material-ui/lab": ^4.0.0-alpha.57 @@ -12694,7 +12694,7 @@ __metadata: peerDependencies: react: ^16.13.1 || ^17.0.0 react-dom: ^16.13.1 || ^17.0.0 - checksum: 6c8ca85981fde5af8e3951f0f5fc9c3873c890d286fd29067215246e9b8e9022ceea308c9caa8b0ccfe5380fe5640aaede48c9963a57c3c98f5c3b5feade9aae + checksum: cdf57bb0ea42b1ef3699b65e558c0d9f2483555fefd03bc3ff4e4d75524c904d723e4808987e8718eac63ab60da6257af82e7d45c70cd42fc00bb1a4c392578b languageName: node linkType: hard From e23abb37ec10e16591c0c54aa6d31cd10535965e Mon Sep 17 00:00:00 2001 From: Andreas Berger Date: Thu, 16 Mar 2023 16:09:01 +0100 Subject: [PATCH 142/177] Rename output parameter `mergeRequestURL` of `publish:gitlab:merge-request` action to `mergeRequestUrl` Signed-off-by: Andreas Berger --- .changeset/bright-pumpkins-bake.md | 5 +++++ .../scaffolder/actions/builtin/publish/gitlabMergeRequest.ts | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) create mode 100644 .changeset/bright-pumpkins-bake.md diff --git a/.changeset/bright-pumpkins-bake.md b/.changeset/bright-pumpkins-bake.md new file mode 100644 index 0000000000..4c16e307ec --- /dev/null +++ b/.changeset/bright-pumpkins-bake.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-scaffolder-backend': patch +--- + +Rename output parameter `mergeRequestURL` of `publish:gitlab:merge-request` action to `mergeRequestUrl`. diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/gitlabMergeRequest.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/gitlabMergeRequest.ts index bb27410402..06e056cda3 100644 --- a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/gitlabMergeRequest.ts +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/gitlabMergeRequest.ts @@ -127,7 +127,7 @@ export const createPublishGitlabMergeRequestAction = (options: { title: 'Gitlab Project path', type: 'string', }, - mergeRequestURL: { + mergeRequestUrl: { title: 'MergeRequest(MR) URL', type: 'string', description: 'Link to the merge request in GitLab', From d8f774c30dfac5c24ad317740fedb0173e9470e6 Mon Sep 17 00:00:00 2001 From: Aramis Sennyey Date: Thu, 16 Mar 2023 11:16:28 -0400 Subject: [PATCH 143/177] Add changeset. Signed-off-by: Aramis Sennyey --- .changeset/khaki-cars-drum.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/khaki-cars-drum.md diff --git a/.changeset/khaki-cars-drum.md b/.changeset/khaki-cars-drum.md new file mode 100644 index 0000000000..325b0f8ba5 --- /dev/null +++ b/.changeset/khaki-cars-drum.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-auth-backend': patch +--- + +Enforce the secret visibility of certificates and client secrets in the auth backend. Also, document all known options for each auth plugin. From 9d47191719f015932fdf06dd5cd74150be475566 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 16 Mar 2023 15:21:01 +0000 Subject: [PATCH 144/177] fix(deps): update dependency dockerode to v3.3.5 Signed-off-by: Renovate Bot --- yarn.lock | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/yarn.lock b/yarn.lock index 34baffe120..06d1d33a58 100644 --- a/yarn.lock +++ b/yarn.lock @@ -14494,12 +14494,12 @@ __metadata: linkType: hard "@types/dockerode@npm:^3.3.0, @types/dockerode@npm:^3.3.8": - version: 3.3.14 - resolution: "@types/dockerode@npm:3.3.14" + version: 3.3.15 + resolution: "@types/dockerode@npm:3.3.15" dependencies: "@types/docker-modem": "*" "@types/node": "*" - checksum: 6a8472622861fb0c97908963a8236d6e439c9feefc845b866326272ad0e5c33f537206fb4633424c5e3c8ec63559cb14bc737e2f88f0fcdf11496a9162d5b139 + checksum: b8fa13f86c761175a5813eb41fbd1e46d0646f008e5c84738b51c1aa82ce4f3758502efe8c3c583463e7cb7dc77e2faadfff91f4e6274e844e68a0ebf9deeae5 languageName: node linkType: hard @@ -20871,13 +20871,13 @@ __metadata: linkType: hard "dockerode@npm:^3.3.1": - version: 3.3.4 - resolution: "dockerode@npm:3.3.4" + version: 3.3.5 + resolution: "dockerode@npm:3.3.5" dependencies: "@balena/dockerignore": ^1.0.2 docker-modem: ^3.0.0 tar-fs: ~2.0.1 - checksum: 6cb4b9d1c42feb3acfa77daf103b070cc412351dc7dc0a1553cc774ccd1be1a1412a87f8aa13c3155c63ec5c61a7cadc833b4248c4d8342814bbf708f795b952 + checksum: 7f6650422b07fa7ea9d5801f04b1a432634446b5fe37b995b8302b953b64e93abf1bb4596c2fb574ba47aafee685ef2ab959cc86c9654add5a26d09541bbbcc6 languageName: node linkType: hard From c65a80bb3c8c4801ddde99abcbcdc0f3a0afd892 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 16 Mar 2023 15:21:28 +0000 Subject: [PATCH 145/177] fix(deps): update dependency graphql-modules to v2.1.1 Signed-off-by: Renovate Bot --- yarn.lock | 149 +++++++++++++++++++++++++++--------------------------- 1 file changed, 74 insertions(+), 75 deletions(-) diff --git a/yarn.lock b/yarn.lock index 34baffe120..841237a265 100644 --- a/yarn.lock +++ b/yarn.lock @@ -10202,20 +10202,6 @@ __metadata: languageName: node linkType: hard -"@graphql-tools/batch-execute@npm:8.5.1": - version: 8.5.1 - resolution: "@graphql-tools/batch-execute@npm:8.5.1" - dependencies: - "@graphql-tools/utils": 8.9.0 - dataloader: 2.1.0 - tslib: ^2.4.0 - value-or-promise: 1.0.11 - peerDependencies: - graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 - checksum: 56c3b9bbab7e3402710186df4de5ae716dc31caa16f3dc51434b5167f0a513881afc1cd835f3df8ff0536f80462394dbb12e5246cda999dcee043e9bf37bcbe2 - languageName: node - linkType: hard - "@graphql-tools/batch-execute@npm:8.5.14": version: 8.5.14 resolution: "@graphql-tools/batch-execute@npm:8.5.14" @@ -10230,6 +10216,20 @@ __metadata: languageName: node linkType: hard +"@graphql-tools/batch-execute@npm:^8.5.18": + version: 8.5.18 + resolution: "@graphql-tools/batch-execute@npm:8.5.18" + dependencies: + "@graphql-tools/utils": 9.2.1 + dataloader: 2.2.2 + tslib: ^2.4.0 + value-or-promise: 1.0.12 + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + checksum: 4a5b5dec502a91bd657a4ddad74965d050d3994c89f036225fac58657b5a275bb374224b20484e3ba773525e75a5552c4a5af7b6d52859ce3a3b32aec2412b6e + languageName: node + linkType: hard + "@graphql-tools/code-file-loader@npm:^7.3.17": version: 7.3.21 resolution: "@graphql-tools/code-file-loader@npm:7.3.21" @@ -10245,22 +10245,6 @@ __metadata: languageName: node linkType: hard -"@graphql-tools/delegate@npm:8.8.1": - version: 8.8.1 - resolution: "@graphql-tools/delegate@npm:8.8.1" - dependencies: - "@graphql-tools/batch-execute": 8.5.1 - "@graphql-tools/schema": 8.5.1 - "@graphql-tools/utils": 8.9.0 - dataloader: 2.1.0 - tslib: ~2.4.0 - value-or-promise: 1.0.11 - peerDependencies: - graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 - checksum: 5246c63fbb42a22f881a1857bc36fdc6092a4f8c4b0f82d4113eca75aeb676305c42319f65c564816b8c4f4eef2a7b93ee709ff548ff78e5fb3e6c0845ac6d7e - languageName: node - linkType: hard - "@graphql-tools/delegate@npm:9.0.21": version: 9.0.21 resolution: "@graphql-tools/delegate@npm:9.0.21" @@ -10278,6 +10262,23 @@ __metadata: languageName: node linkType: hard +"@graphql-tools/delegate@npm:9.0.28": + version: 9.0.28 + resolution: "@graphql-tools/delegate@npm:9.0.28" + dependencies: + "@graphql-tools/batch-execute": ^8.5.18 + "@graphql-tools/executor": ^0.0.15 + "@graphql-tools/schema": ^9.0.16 + "@graphql-tools/utils": ^9.2.1 + dataloader: ^2.2.2 + tslib: ^2.5.0 + value-or-promise: ^1.0.12 + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + checksum: e24c757ea15a2b654268194bbf76188fca6692486d1b019b0ad7d48c264f92b7b681a43c8a8355ace48a29f9dd566c20e8707b6cef281331a813f23ee1c94375 + languageName: node + linkType: hard + "@graphql-tools/executor-graphql-ws@npm:0.0.5": version: 0.0.5 resolution: "@graphql-tools/executor-graphql-ws@npm:0.0.5" @@ -10343,6 +10344,21 @@ __metadata: languageName: node linkType: hard +"@graphql-tools/executor@npm:^0.0.15": + version: 0.0.15 + resolution: "@graphql-tools/executor@npm:0.0.15" + dependencies: + "@graphql-tools/utils": 9.2.1 + "@graphql-typed-document-node/core": 3.1.2 + "@repeaterjs/repeater": 3.0.4 + tslib: ^2.4.0 + value-or-promise: 1.0.12 + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + checksum: 7a963d6fcd00bd9c2a42f35a33bc9178576a1eeac755ce69981aa1e2c61238953b7ab9c11ffcfc86e49fdcf4fc057698c6f7169d6be580298e286076276b1295 + languageName: node + linkType: hard + "@graphql-tools/git-loader@npm:^7.2.13": version: 7.2.13 resolution: "@graphql-tools/git-loader@npm:7.2.13" @@ -10462,18 +10478,6 @@ __metadata: languageName: node linkType: hard -"@graphql-tools/merge@npm:8.3.1": - version: 8.3.1 - resolution: "@graphql-tools/merge@npm:8.3.1" - dependencies: - "@graphql-tools/utils": 8.9.0 - tslib: ^2.4.0 - peerDependencies: - graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 - checksum: 16af6be2249f4f500a4c2f5d3db2e0efd56ad69b5e10499649c6fc979c257af12e131112304a16699654b54daab37a80737e0538478bc45a0053b9bc859a7ac1 - languageName: node - linkType: hard - "@graphql-tools/merge@npm:8.3.14": version: 8.3.14 resolution: "@graphql-tools/merge@npm:8.3.14" @@ -10563,20 +10567,6 @@ __metadata: languageName: node linkType: hard -"@graphql-tools/schema@npm:8.5.1, @graphql-tools/schema@npm:^8.3.1": - version: 8.5.1 - resolution: "@graphql-tools/schema@npm:8.5.1" - dependencies: - "@graphql-tools/merge": 8.3.1 - "@graphql-tools/utils": 8.9.0 - tslib: ^2.4.0 - value-or-promise: 1.0.11 - peerDependencies: - graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 - checksum: 91363cd4371e347af40ef66f7d903b5d4f5998bfaec9214768e6a795136ef6372f9f225e05e18daacd929e23695811f15e791c6cbe082bf5b5d03b16b1f874f8 - languageName: node - linkType: hard - "@graphql-tools/schema@npm:9.0.12": version: 9.0.12 resolution: "@graphql-tools/schema@npm:9.0.12" @@ -10605,7 +10595,7 @@ __metadata: languageName: node linkType: hard -"@graphql-tools/schema@npm:^9.0.0": +"@graphql-tools/schema@npm:9.0.17, @graphql-tools/schema@npm:^9.0.0, @graphql-tools/schema@npm:^9.0.16": version: 9.0.17 resolution: "@graphql-tools/schema@npm:9.0.17" dependencies: @@ -10697,7 +10687,7 @@ __metadata: languageName: node linkType: hard -"@graphql-tools/utils@npm:9.2.1, @graphql-tools/utils@npm:^9.0.0, @graphql-tools/utils@npm:^9.1.1": +"@graphql-tools/utils@npm:9.2.1, @graphql-tools/utils@npm:^9.0.0, @graphql-tools/utils@npm:^9.1.1, @graphql-tools/utils@npm:^9.2.1": version: 9.2.1 resolution: "@graphql-tools/utils@npm:9.2.1" dependencies: @@ -10724,22 +10714,22 @@ __metadata: languageName: node linkType: hard -"@graphql-tools/wrap@npm:^8.3.1": - version: 8.5.1 - resolution: "@graphql-tools/wrap@npm:8.5.1" +"@graphql-tools/wrap@npm:^9.0.0": + version: 9.3.8 + resolution: "@graphql-tools/wrap@npm:9.3.8" dependencies: - "@graphql-tools/delegate": 8.8.1 - "@graphql-tools/schema": 8.5.1 - "@graphql-tools/utils": 8.9.0 + "@graphql-tools/delegate": 9.0.28 + "@graphql-tools/schema": 9.0.17 + "@graphql-tools/utils": 9.2.1 tslib: ^2.4.0 - value-or-promise: 1.0.11 + value-or-promise: 1.0.12 peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 - checksum: bc9350015adde545208709584cf1a3c5b4bc3bbfd82062b93b4da253481e366d9f9caad49d7f2f0aaa7fe070167d15b99da7ee76e431c0c6bee815923aafdb29 + checksum: 1f280b939f1c8c33be8fbd92c0584e9125e30c59ce6f75f20657235d24e5a2c01eb3214eda9ae74d431d9da072cdfa6cedeafdc5b352dd33de439ba42402efcb languageName: node linkType: hard -"@graphql-typed-document-node/core@npm:3.1.1, @graphql-typed-document-node/core@npm:^3.1.0, @graphql-typed-document-node/core@npm:^3.1.1": +"@graphql-typed-document-node/core@npm:3.1.1": version: 3.1.1 resolution: "@graphql-typed-document-node/core@npm:3.1.1" peerDependencies: @@ -10748,6 +10738,15 @@ __metadata: languageName: node linkType: hard +"@graphql-typed-document-node/core@npm:3.1.2, @graphql-typed-document-node/core@npm:^3.1.0, @graphql-typed-document-node/core@npm:^3.1.1": + version: 3.1.2 + resolution: "@graphql-typed-document-node/core@npm:3.1.2" + peerDependencies: + graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + checksum: a61afa025acdabd7833e4f654a5802fc1a526171f81e0c435c8e651050a5a0682499a2c7a51304ceb61fde36cd69fc7975ce5e1b16b9ba7ea474c649f33eea8b + languageName: node + linkType: hard + "@grpc/grpc-js@npm:~1.8.0": version: 1.8.9 resolution: "@grpc/grpc-js@npm:1.8.9" @@ -20362,7 +20361,7 @@ __metadata: languageName: node linkType: hard -"dataloader@npm:^2.0.0": +"dataloader@npm:2.2.2, dataloader@npm:^2.0.0, dataloader@npm:^2.2.2": version: 2.2.2 resolution: "dataloader@npm:2.2.2" checksum: 4dabd247089c29f194e94d5434d504f99156c5c214a03463c20f3f17f40398d7e179edee69a27c16e315519ac8739042a810090087ae26449a0e685156a02c65 @@ -24257,16 +24256,16 @@ __metadata: linkType: hard "graphql-modules@npm:^2.0.0": - version: 2.1.0 - resolution: "graphql-modules@npm:2.1.0" + version: 2.1.1 + resolution: "graphql-modules@npm:2.1.1" dependencies: - "@graphql-tools/schema": ^8.3.1 - "@graphql-tools/wrap": ^8.3.1 + "@graphql-tools/schema": ^9.0.0 + "@graphql-tools/wrap": ^9.0.0 "@graphql-typed-document-node/core": ^3.1.0 ramda: ^0.28.0 peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 - checksum: a57b63007815a8958ec49ecc14a640d559f8fd164968c123ffc3efdbcf35778d1c99f3570660a1dac4a523c986eeaf0c8834dfe0ed721de5111cedbce0ed6790 + checksum: 1e916eb85a4bc0ff25040adf35a95caa25001b23e43d5608eb304186041e145893e995f82815e9b4e71322a60bd7f7968583ceb22a5e566ed15b3876c6224448 languageName: node linkType: hard @@ -37359,7 +37358,7 @@ __metadata: languageName: node linkType: hard -"tslib@npm:^2.0.0, tslib@npm:^2.0.1, tslib@npm:^2.0.3, tslib@npm:^2.1.0, tslib@npm:^2.2.0, tslib@npm:^2.3.0, tslib@npm:^2.3.1, tslib@npm:^2.4.0, tslib@npm:^2.4.1, tslib@npm:~2.5.0": +"tslib@npm:^2.0.0, tslib@npm:^2.0.1, tslib@npm:^2.0.3, tslib@npm:^2.1.0, tslib@npm:^2.2.0, tslib@npm:^2.3.0, tslib@npm:^2.3.1, tslib@npm:^2.4.0, tslib@npm:^2.4.1, tslib@npm:^2.5.0, tslib@npm:~2.5.0": version: 2.5.0 resolution: "tslib@npm:2.5.0" checksum: ae3ed5f9ce29932d049908ebfdf21b3a003a85653a9a140d614da6b767a93ef94f460e52c3d787f0e4f383546981713f165037dc2274df212ea9f8a4541004e1 @@ -38227,7 +38226,7 @@ __metadata: languageName: node linkType: hard -"value-or-promise@npm:1.0.12, value-or-promise@npm:^1.0.11": +"value-or-promise@npm:1.0.12, value-or-promise@npm:^1.0.11, value-or-promise@npm:^1.0.12": version: 1.0.12 resolution: "value-or-promise@npm:1.0.12" checksum: f53a66c75b7447c90bbaf946a757ca09c094629cb80ba742f59c980ec3a69be0a385a0e75505dedb4e757862f1a994ca4beaf083a831f24d3ffb3d4bb18cd1e1 From f6c92d54e7e7ade4d2a7a932846eae0212c447c9 Mon Sep 17 00:00:00 2001 From: Morgan Bentell Date: Thu, 16 Feb 2023 10:00:09 +0100 Subject: [PATCH 146/177] wait with fetching techdocs metadata until the shadow root exists Signed-off-by: Morgan Bentell --- plugins/techdocs-react/src/context.tsx | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/plugins/techdocs-react/src/context.tsx b/plugins/techdocs-react/src/context.tsx index 4f427e0031..04a46bffb3 100644 --- a/plugins/techdocs-react/src/context.tsx +++ b/plugins/techdocs-react/src/context.tsx @@ -117,10 +117,6 @@ export const TechDocsReaderPageProvider = memo( const techdocsApi = useApi(techdocsApiRef); const config = useApi(configApiRef); - const metadata = useAsync(async () => { - return techdocsApi.getTechDocsMetadata(entityRef); - }, [entityRef]); - const entityMetadata = useAsync(async () => { return techdocsApi.getEntityMetadata(entityRef); }, [entityRef]); @@ -133,6 +129,14 @@ export const TechDocsReaderPageProvider = memo( defaultTechDocsReaderPageValue.shadowRoot, ); + const metadata = useAsync( + () => + shadowRoot + ? techdocsApi.getTechDocsMetadata(entityRef) + : new Promise(() => {}), + [entityRef, shadowRoot], + ); + const value = { metadata, entityRef: toLowercaseEntityRefMaybe(entityRef, config), From 7e0c7b09a47cefe0839b61c11af8e899fa1335a9 Mon Sep 17 00:00:00 2001 From: Morgan Bentell Date: Thu, 16 Feb 2023 10:04:43 +0100 Subject: [PATCH 147/177] add changeset Signed-off-by: Morgan Bentell --- .changeset/rare-seals-decide.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/rare-seals-decide.md diff --git a/.changeset/rare-seals-decide.md b/.changeset/rare-seals-decide.md new file mode 100644 index 0000000000..e3cbadee69 --- /dev/null +++ b/.changeset/rare-seals-decide.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-techdocs-react': patch +--- + +Fix a bug that caused the header to not render when generating a document for the first time From 68c7082188ab4a505f2d93128036ee5431719204 Mon Sep 17 00:00:00 2001 From: Morgan Bentell Date: Wed, 22 Feb 2023 11:00:21 +0100 Subject: [PATCH 148/177] assume metadata is available and only refetch it if we don't have it when the shadowroot is mounted Signed-off-by: Morgan Bentell --- plugins/techdocs-react/src/context.tsx | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/plugins/techdocs-react/src/context.tsx b/plugins/techdocs-react/src/context.tsx index 04a46bffb3..f373acca73 100644 --- a/plugins/techdocs-react/src/context.tsx +++ b/plugins/techdocs-react/src/context.tsx @@ -21,8 +21,10 @@ import React, { useState, memo, ReactNode, + useEffect, } from 'react'; import useAsync, { AsyncState } from 'react-use/lib/useAsync'; +import { useAsyncRetry } from 'react-use'; import { CompoundEntityRef, @@ -121,6 +123,10 @@ export const TechDocsReaderPageProvider = memo( return techdocsApi.getEntityMetadata(entityRef); }, [entityRef]); + const metadata = useAsyncRetry(() => { + return techdocsApi.getTechDocsMetadata(entityRef); + }, [entityRef]); + const [title, setTitle] = useState(defaultTechDocsReaderPageValue.title); const [subtitle, setSubtitle] = useState( defaultTechDocsReaderPageValue.subtitle, @@ -129,13 +135,11 @@ export const TechDocsReaderPageProvider = memo( defaultTechDocsReaderPageValue.shadowRoot, ); - const metadata = useAsync( - () => - shadowRoot - ? techdocsApi.getTechDocsMetadata(entityRef) - : new Promise(() => {}), - [entityRef, shadowRoot], - ); + useEffect(() => { + if (shadowRoot && !metadata.loading && !metadata.value) { + metadata.retry(); + } + }, [metadata, shadowRoot]); const value = { metadata, From 3cadc86c03915f2d26694acc5291664fbc3f1f33 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 16 Mar 2023 16:55:32 +0000 Subject: [PATCH 149/177] fix(deps): update dependency style-loader to v3.3.2 Signed-off-by: Renovate Bot --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 50f067a32e..6ed91c40a8 100644 --- a/yarn.lock +++ b/yarn.lock @@ -36364,11 +36364,11 @@ __metadata: linkType: hard "style-loader@npm:^3.3.1": - version: 3.3.1 - resolution: "style-loader@npm:3.3.1" + version: 3.3.2 + resolution: "style-loader@npm:3.3.2" peerDependencies: webpack: ^5.0.0 - checksum: 470feef680f59e2fce4d6601b5c55b88c01ad8d1dd693c528ffd591ff5fd7c01a4eff3bdbe62f26f847d6bd2430c9ab594be23307cfe7a3446ab236683f0d066 + checksum: 5ee5ce2dc885369eccb55d429376e83d02570d473ac5edeb69fd65ee894847f1e51429cf078351f617bd04516ece8a1dd967f9f40464bd8fa76d903c6b2a6f08 languageName: node linkType: hard From 9de5ec0f260ea62ef1f66f94a775a69cd5bc17a1 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 16 Mar 2023 16:55:58 +0000 Subject: [PATCH 150/177] fix(deps): update dependency webpack to v5.76.2 Signed-off-by: Renovate Bot --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 50f067a32e..adc5385db7 100644 --- a/yarn.lock +++ b/yarn.lock @@ -38613,8 +38613,8 @@ __metadata: linkType: hard "webpack@npm:^5, webpack@npm:^5.70.0": - version: 5.76.1 - resolution: "webpack@npm:5.76.1" + version: 5.76.2 + resolution: "webpack@npm:5.76.2" dependencies: "@types/eslint-scope": ^3.7.3 "@types/estree": ^0.0.51 @@ -38645,7 +38645,7 @@ __metadata: optional: true bin: webpack: bin/webpack.js - checksum: b01fe0bc2dbca0e10d290ddb0bf81e807a031de48028176e2b21afd696b4d3f25ab9accdad888ef4a1f7c7f4d41f13d5bf2395b7653fdf3e5e3dafa54e56dab2 + checksum: 86db98299a175c371031449c26077e87b33acd8f45de7f7945ed4b9b37c8ca11bc5169af9c44743efccd4d55e08042a3aa3a3bc42aff831309a0821ffbcd395e languageName: node linkType: hard From 3fd48dc9ddd32618b4483b66bc957ef6f119ff38 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 16 Mar 2023 17:40:05 +0000 Subject: [PATCH 151/177] chore(deps): update dependency @types/sanitize-html to v2.9.0 Signed-off-by: Renovate Bot --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index c0e7407ca4..eddf922161 100644 --- a/yarn.lock +++ b/yarn.lock @@ -15551,11 +15551,11 @@ __metadata: linkType: hard "@types/sanitize-html@npm:^2.6.2": - version: 2.8.1 - resolution: "@types/sanitize-html@npm:2.8.1" + version: 2.9.0 + resolution: "@types/sanitize-html@npm:2.9.0" dependencies: htmlparser2: ^8.0.0 - checksum: 9c07d3a9d925e291472f74b097fb179b32659ea01834f728887811e5fc75cf2b17d844e32e97c0e583eba993af86a3f8250c82c8fa3152abf9ff2a8582972906 + checksum: b60f42b740bbfb1b1434ce8b43925a38ecc608b60aa654fd009d2e22e33f324b61d370768c55bd2fd98e03de08518ffa8911d61606c483526fb931bb8b59d1b0 languageName: node linkType: hard From 9b71959b51fdcc0665045529f485ee4795871dca Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 16 Mar 2023 17:40:35 +0000 Subject: [PATCH 152/177] fix(deps): update aws-sdk-js-v3 monorepo to v3.292.0 Signed-off-by: Renovate Bot --- yarn.lock | 1504 ++++++++++++++++++++++++++--------------------------- 1 file changed, 729 insertions(+), 775 deletions(-) diff --git a/yarn.lock b/yarn.lock index c0e7407ca4..743b223443 100644 --- a/yarn.lock +++ b/yarn.lock @@ -489,595 +489,582 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/abort-controller@npm:3.272.0, @aws-sdk/abort-controller@npm:^3.208.0": - version: 3.272.0 - resolution: "@aws-sdk/abort-controller@npm:3.272.0" +"@aws-sdk/abort-controller@npm:3.292.0, @aws-sdk/abort-controller@npm:^3.208.0": + version: 3.292.0 + resolution: "@aws-sdk/abort-controller@npm:3.292.0" dependencies: - "@aws-sdk/types": 3.272.0 + "@aws-sdk/types": 3.292.0 tslib: ^2.3.1 - checksum: 298974b97641732c74272dd645b55c15aaefd891b5a868c279ae2abe3c3e0753e7e6f218e8c3712196ca2d4f19796623cb48f9e9816b5bbbc4eb38247d07d0fe + checksum: dc290c1191de6026a5a0b5a4c5b57b7e2b9373d5d47934e32ea458c48dc513fa1a06c5a796ee65ca42fcc9d12e168b7fbbde82979b58ce8e224bba19797de5d4 languageName: node linkType: hard -"@aws-sdk/chunked-blob-reader-native@npm:3.208.0": - version: 3.208.0 - resolution: "@aws-sdk/chunked-blob-reader-native@npm:3.208.0" +"@aws-sdk/chunked-blob-reader-native@npm:3.292.0": + version: 3.292.0 + resolution: "@aws-sdk/chunked-blob-reader-native@npm:3.292.0" dependencies: - "@aws-sdk/util-base64": 3.208.0 + "@aws-sdk/util-base64": 3.292.0 tslib: ^2.3.1 - checksum: 6df294c66d6acaa3de2c5f3444a62577d0effa451a65b6a1606df538cfc865d257f01c74e711b36741a2c59f43385bd393c07c8562fe5101d6069b8c2646da53 + checksum: ffafa1f23a848fbdf95740557c99462556f5996be0ef05a1d7dd652661fce686d6789d6cd7781d8c2e41903702e5ff75359c5255c97ce9982c4a6dd1e9a30902 languageName: node linkType: hard -"@aws-sdk/chunked-blob-reader@npm:3.188.0": - version: 3.188.0 - resolution: "@aws-sdk/chunked-blob-reader@npm:3.188.0" +"@aws-sdk/chunked-blob-reader@npm:3.292.0": + version: 3.292.0 + resolution: "@aws-sdk/chunked-blob-reader@npm:3.292.0" dependencies: tslib: ^2.3.1 - checksum: d6becebc6d77a63dd84601806c5f04bc9d0e418368fb2d593d786738119091e4d2e40721751be66260063fe7bb1c7ee2a5e075fa731eb8307722b90f6ce809dc + checksum: d35547620814071dd5f89448b8d54b17c97e743ca441423fcba20ad794ab830d023a0c921d43e3b02f7b114444e6ea795afd24f6c51d411be68b808b3c422812 languageName: node linkType: hard -"@aws-sdk/client-cognito-identity@npm:3.282.0": - version: 3.282.0 - resolution: "@aws-sdk/client-cognito-identity@npm:3.282.0" +"@aws-sdk/client-cognito-identity@npm:3.292.0": + version: 3.292.0 + resolution: "@aws-sdk/client-cognito-identity@npm:3.292.0" dependencies: "@aws-crypto/sha256-browser": 3.0.0 "@aws-crypto/sha256-js": 3.0.0 - "@aws-sdk/client-sts": 3.282.0 - "@aws-sdk/config-resolver": 3.282.0 - "@aws-sdk/credential-provider-node": 3.282.0 - "@aws-sdk/fetch-http-handler": 3.282.0 - "@aws-sdk/hash-node": 3.272.0 - "@aws-sdk/invalid-dependency": 3.272.0 - "@aws-sdk/middleware-content-length": 3.282.0 - "@aws-sdk/middleware-endpoint": 3.282.0 - "@aws-sdk/middleware-host-header": 3.282.0 - "@aws-sdk/middleware-logger": 3.272.0 - "@aws-sdk/middleware-recursion-detection": 3.282.0 - "@aws-sdk/middleware-retry": 3.282.0 - "@aws-sdk/middleware-serde": 3.272.0 - "@aws-sdk/middleware-signing": 3.282.0 - "@aws-sdk/middleware-stack": 3.272.0 - "@aws-sdk/middleware-user-agent": 3.282.0 - "@aws-sdk/node-config-provider": 3.272.0 - "@aws-sdk/node-http-handler": 3.282.0 - "@aws-sdk/protocol-http": 3.282.0 - "@aws-sdk/smithy-client": 3.279.0 - "@aws-sdk/types": 3.272.0 - "@aws-sdk/url-parser": 3.272.0 - "@aws-sdk/util-base64": 3.208.0 - "@aws-sdk/util-body-length-browser": 3.188.0 - "@aws-sdk/util-body-length-node": 3.208.0 - "@aws-sdk/util-defaults-mode-browser": 3.279.0 - "@aws-sdk/util-defaults-mode-node": 3.282.0 - "@aws-sdk/util-endpoints": 3.272.0 - "@aws-sdk/util-retry": 3.272.0 - "@aws-sdk/util-user-agent-browser": 3.282.0 - "@aws-sdk/util-user-agent-node": 3.282.0 - "@aws-sdk/util-utf8": 3.254.0 + "@aws-sdk/client-sts": 3.292.0 + "@aws-sdk/config-resolver": 3.292.0 + "@aws-sdk/credential-provider-node": 3.292.0 + "@aws-sdk/fetch-http-handler": 3.292.0 + "@aws-sdk/hash-node": 3.292.0 + "@aws-sdk/invalid-dependency": 3.292.0 + "@aws-sdk/middleware-content-length": 3.292.0 + "@aws-sdk/middleware-endpoint": 3.292.0 + "@aws-sdk/middleware-host-header": 3.292.0 + "@aws-sdk/middleware-logger": 3.292.0 + "@aws-sdk/middleware-recursion-detection": 3.292.0 + "@aws-sdk/middleware-retry": 3.292.0 + "@aws-sdk/middleware-serde": 3.292.0 + "@aws-sdk/middleware-signing": 3.292.0 + "@aws-sdk/middleware-stack": 3.292.0 + "@aws-sdk/middleware-user-agent": 3.292.0 + "@aws-sdk/node-config-provider": 3.292.0 + "@aws-sdk/node-http-handler": 3.292.0 + "@aws-sdk/protocol-http": 3.292.0 + "@aws-sdk/smithy-client": 3.292.0 + "@aws-sdk/types": 3.292.0 + "@aws-sdk/url-parser": 3.292.0 + "@aws-sdk/util-base64": 3.292.0 + "@aws-sdk/util-body-length-browser": 3.292.0 + "@aws-sdk/util-body-length-node": 3.292.0 + "@aws-sdk/util-defaults-mode-browser": 3.292.0 + "@aws-sdk/util-defaults-mode-node": 3.292.0 + "@aws-sdk/util-endpoints": 3.292.0 + "@aws-sdk/util-retry": 3.292.0 + "@aws-sdk/util-user-agent-browser": 3.292.0 + "@aws-sdk/util-user-agent-node": 3.292.0 + "@aws-sdk/util-utf8": 3.292.0 tslib: ^2.3.1 - checksum: 9f7790e26dd3d7b0316105dd40092736526f1f6a11b814fcc95736ade3fe40058fb93f1dc2558f1b54b7871908247852e314cb1a892109e6294958eeff1d4439 + checksum: 7524dac2fe377609b142792fe10ab25235632c2f25cf82c99d431cd4d884b44ac7f04c8a67705b95e0f1e76182c0e96fecdb6e7c433365e60504f8b931312d16 languageName: node linkType: hard "@aws-sdk/client-s3@npm:^3.208.0": - version: 3.282.0 - resolution: "@aws-sdk/client-s3@npm:3.282.0" + version: 3.292.0 + resolution: "@aws-sdk/client-s3@npm:3.292.0" dependencies: "@aws-crypto/sha1-browser": 3.0.0 "@aws-crypto/sha256-browser": 3.0.0 "@aws-crypto/sha256-js": 3.0.0 - "@aws-sdk/client-sts": 3.282.0 - "@aws-sdk/config-resolver": 3.282.0 - "@aws-sdk/credential-provider-node": 3.282.0 - "@aws-sdk/eventstream-serde-browser": 3.272.0 - "@aws-sdk/eventstream-serde-config-resolver": 3.272.0 - "@aws-sdk/eventstream-serde-node": 3.272.0 - "@aws-sdk/fetch-http-handler": 3.282.0 - "@aws-sdk/hash-blob-browser": 3.272.0 - "@aws-sdk/hash-node": 3.272.0 - "@aws-sdk/hash-stream-node": 3.272.0 - "@aws-sdk/invalid-dependency": 3.272.0 - "@aws-sdk/md5-js": 3.272.0 - "@aws-sdk/middleware-bucket-endpoint": 3.282.0 - "@aws-sdk/middleware-content-length": 3.282.0 - "@aws-sdk/middleware-endpoint": 3.282.0 - "@aws-sdk/middleware-expect-continue": 3.282.0 - "@aws-sdk/middleware-flexible-checksums": 3.282.0 - "@aws-sdk/middleware-host-header": 3.282.0 - "@aws-sdk/middleware-location-constraint": 3.272.0 - "@aws-sdk/middleware-logger": 3.272.0 - "@aws-sdk/middleware-recursion-detection": 3.282.0 - "@aws-sdk/middleware-retry": 3.282.0 - "@aws-sdk/middleware-sdk-s3": 3.282.0 - "@aws-sdk/middleware-serde": 3.272.0 - "@aws-sdk/middleware-signing": 3.282.0 - "@aws-sdk/middleware-ssec": 3.272.0 - "@aws-sdk/middleware-stack": 3.272.0 - "@aws-sdk/middleware-user-agent": 3.282.0 - "@aws-sdk/node-config-provider": 3.272.0 - "@aws-sdk/node-http-handler": 3.282.0 - "@aws-sdk/protocol-http": 3.282.0 - "@aws-sdk/signature-v4-multi-region": 3.282.0 - "@aws-sdk/smithy-client": 3.279.0 - "@aws-sdk/types": 3.272.0 - "@aws-sdk/url-parser": 3.272.0 - "@aws-sdk/util-base64": 3.208.0 - "@aws-sdk/util-body-length-browser": 3.188.0 - "@aws-sdk/util-body-length-node": 3.208.0 - "@aws-sdk/util-defaults-mode-browser": 3.279.0 - "@aws-sdk/util-defaults-mode-node": 3.282.0 - "@aws-sdk/util-endpoints": 3.272.0 - "@aws-sdk/util-retry": 3.272.0 - "@aws-sdk/util-stream-browser": 3.282.0 - "@aws-sdk/util-stream-node": 3.282.0 - "@aws-sdk/util-user-agent-browser": 3.282.0 - "@aws-sdk/util-user-agent-node": 3.282.0 - "@aws-sdk/util-utf8": 3.254.0 - "@aws-sdk/util-waiter": 3.272.0 - "@aws-sdk/xml-builder": 3.201.0 + "@aws-sdk/client-sts": 3.292.0 + "@aws-sdk/config-resolver": 3.292.0 + "@aws-sdk/credential-provider-node": 3.292.0 + "@aws-sdk/eventstream-serde-browser": 3.292.0 + "@aws-sdk/eventstream-serde-config-resolver": 3.292.0 + "@aws-sdk/eventstream-serde-node": 3.292.0 + "@aws-sdk/fetch-http-handler": 3.292.0 + "@aws-sdk/hash-blob-browser": 3.292.0 + "@aws-sdk/hash-node": 3.292.0 + "@aws-sdk/hash-stream-node": 3.292.0 + "@aws-sdk/invalid-dependency": 3.292.0 + "@aws-sdk/md5-js": 3.292.0 + "@aws-sdk/middleware-bucket-endpoint": 3.292.0 + "@aws-sdk/middleware-content-length": 3.292.0 + "@aws-sdk/middleware-endpoint": 3.292.0 + "@aws-sdk/middleware-expect-continue": 3.292.0 + "@aws-sdk/middleware-flexible-checksums": 3.292.0 + "@aws-sdk/middleware-host-header": 3.292.0 + "@aws-sdk/middleware-location-constraint": 3.292.0 + "@aws-sdk/middleware-logger": 3.292.0 + "@aws-sdk/middleware-recursion-detection": 3.292.0 + "@aws-sdk/middleware-retry": 3.292.0 + "@aws-sdk/middleware-sdk-s3": 3.292.0 + "@aws-sdk/middleware-serde": 3.292.0 + "@aws-sdk/middleware-signing": 3.292.0 + "@aws-sdk/middleware-ssec": 3.292.0 + "@aws-sdk/middleware-stack": 3.292.0 + "@aws-sdk/middleware-user-agent": 3.292.0 + "@aws-sdk/node-config-provider": 3.292.0 + "@aws-sdk/node-http-handler": 3.292.0 + "@aws-sdk/protocol-http": 3.292.0 + "@aws-sdk/signature-v4-multi-region": 3.292.0 + "@aws-sdk/smithy-client": 3.292.0 + "@aws-sdk/types": 3.292.0 + "@aws-sdk/url-parser": 3.292.0 + "@aws-sdk/util-base64": 3.292.0 + "@aws-sdk/util-body-length-browser": 3.292.0 + "@aws-sdk/util-body-length-node": 3.292.0 + "@aws-sdk/util-defaults-mode-browser": 3.292.0 + "@aws-sdk/util-defaults-mode-node": 3.292.0 + "@aws-sdk/util-endpoints": 3.292.0 + "@aws-sdk/util-retry": 3.292.0 + "@aws-sdk/util-stream-browser": 3.292.0 + "@aws-sdk/util-stream-node": 3.292.0 + "@aws-sdk/util-user-agent-browser": 3.292.0 + "@aws-sdk/util-user-agent-node": 3.292.0 + "@aws-sdk/util-utf8": 3.292.0 + "@aws-sdk/util-waiter": 3.292.0 + "@aws-sdk/xml-builder": 3.292.0 fast-xml-parser: 4.1.2 tslib: ^2.3.1 - checksum: 4f0a1d9ddad89eb71da6f39c210c451461d570d11bc394c6b3d7af139e3ea077bed88fee56fae8318182e7a26464d31119620f191f0d552b51125b9f6ddffe0b + checksum: 8de830f1698856dc61c2497f754b9ea76bbff6517deb7091af554670e7ad026f1775cb7943328bab0d7e90a5a8ccb80e5f1bdc60b177da8f15eeddee410b38c2 languageName: node linkType: hard "@aws-sdk/client-sqs@npm:^3.208.0": - version: 3.282.0 - resolution: "@aws-sdk/client-sqs@npm:3.282.0" + version: 3.292.0 + resolution: "@aws-sdk/client-sqs@npm:3.292.0" dependencies: "@aws-crypto/sha256-browser": 3.0.0 "@aws-crypto/sha256-js": 3.0.0 - "@aws-sdk/client-sts": 3.282.0 - "@aws-sdk/config-resolver": 3.282.0 - "@aws-sdk/credential-provider-node": 3.282.0 - "@aws-sdk/fetch-http-handler": 3.282.0 - "@aws-sdk/hash-node": 3.272.0 - "@aws-sdk/invalid-dependency": 3.272.0 - "@aws-sdk/md5-js": 3.272.0 - "@aws-sdk/middleware-content-length": 3.282.0 - "@aws-sdk/middleware-endpoint": 3.282.0 - "@aws-sdk/middleware-host-header": 3.282.0 - "@aws-sdk/middleware-logger": 3.272.0 - "@aws-sdk/middleware-recursion-detection": 3.282.0 - "@aws-sdk/middleware-retry": 3.282.0 - "@aws-sdk/middleware-sdk-sqs": 3.272.0 - "@aws-sdk/middleware-serde": 3.272.0 - "@aws-sdk/middleware-signing": 3.282.0 - "@aws-sdk/middleware-stack": 3.272.0 - "@aws-sdk/middleware-user-agent": 3.282.0 - "@aws-sdk/node-config-provider": 3.272.0 - "@aws-sdk/node-http-handler": 3.282.0 - "@aws-sdk/protocol-http": 3.282.0 - "@aws-sdk/smithy-client": 3.279.0 - "@aws-sdk/types": 3.272.0 - "@aws-sdk/url-parser": 3.272.0 - "@aws-sdk/util-base64": 3.208.0 - "@aws-sdk/util-body-length-browser": 3.188.0 - "@aws-sdk/util-body-length-node": 3.208.0 - "@aws-sdk/util-defaults-mode-browser": 3.279.0 - "@aws-sdk/util-defaults-mode-node": 3.282.0 - "@aws-sdk/util-endpoints": 3.272.0 - "@aws-sdk/util-retry": 3.272.0 - "@aws-sdk/util-user-agent-browser": 3.282.0 - "@aws-sdk/util-user-agent-node": 3.282.0 - "@aws-sdk/util-utf8": 3.254.0 + "@aws-sdk/client-sts": 3.292.0 + "@aws-sdk/config-resolver": 3.292.0 + "@aws-sdk/credential-provider-node": 3.292.0 + "@aws-sdk/fetch-http-handler": 3.292.0 + "@aws-sdk/hash-node": 3.292.0 + "@aws-sdk/invalid-dependency": 3.292.0 + "@aws-sdk/md5-js": 3.292.0 + "@aws-sdk/middleware-content-length": 3.292.0 + "@aws-sdk/middleware-endpoint": 3.292.0 + "@aws-sdk/middleware-host-header": 3.292.0 + "@aws-sdk/middleware-logger": 3.292.0 + "@aws-sdk/middleware-recursion-detection": 3.292.0 + "@aws-sdk/middleware-retry": 3.292.0 + "@aws-sdk/middleware-sdk-sqs": 3.292.0 + "@aws-sdk/middleware-serde": 3.292.0 + "@aws-sdk/middleware-signing": 3.292.0 + "@aws-sdk/middleware-stack": 3.292.0 + "@aws-sdk/middleware-user-agent": 3.292.0 + "@aws-sdk/node-config-provider": 3.292.0 + "@aws-sdk/node-http-handler": 3.292.0 + "@aws-sdk/protocol-http": 3.292.0 + "@aws-sdk/smithy-client": 3.292.0 + "@aws-sdk/types": 3.292.0 + "@aws-sdk/url-parser": 3.292.0 + "@aws-sdk/util-base64": 3.292.0 + "@aws-sdk/util-body-length-browser": 3.292.0 + "@aws-sdk/util-body-length-node": 3.292.0 + "@aws-sdk/util-defaults-mode-browser": 3.292.0 + "@aws-sdk/util-defaults-mode-node": 3.292.0 + "@aws-sdk/util-endpoints": 3.292.0 + "@aws-sdk/util-retry": 3.292.0 + "@aws-sdk/util-user-agent-browser": 3.292.0 + "@aws-sdk/util-user-agent-node": 3.292.0 + "@aws-sdk/util-utf8": 3.292.0 fast-xml-parser: 4.1.2 tslib: ^2.3.1 - checksum: d3a2a2abb27313666aa8c9842c91a098b2570878a9853d59bf07d480669723d77b74ad2ca8e5297dc593d8e76578c78c2634f81e4eed84b84b020b06af04c423 + checksum: ef734101eede788fa2e2a7d0c5032c440d9a8604d854444c8efe73de52bd765c7d8d7f5f0126fed85f4418678a861c3fb8bf6e482da4790d7d56187f2c1e4e62 languageName: node linkType: hard -"@aws-sdk/client-sso-oidc@npm:3.282.0": - version: 3.282.0 - resolution: "@aws-sdk/client-sso-oidc@npm:3.282.0" +"@aws-sdk/client-sso-oidc@npm:3.292.0": + version: 3.292.0 + resolution: "@aws-sdk/client-sso-oidc@npm:3.292.0" dependencies: "@aws-crypto/sha256-browser": 3.0.0 "@aws-crypto/sha256-js": 3.0.0 - "@aws-sdk/config-resolver": 3.282.0 - "@aws-sdk/fetch-http-handler": 3.282.0 - "@aws-sdk/hash-node": 3.272.0 - "@aws-sdk/invalid-dependency": 3.272.0 - "@aws-sdk/middleware-content-length": 3.282.0 - "@aws-sdk/middleware-endpoint": 3.282.0 - "@aws-sdk/middleware-host-header": 3.282.0 - "@aws-sdk/middleware-logger": 3.272.0 - "@aws-sdk/middleware-recursion-detection": 3.282.0 - "@aws-sdk/middleware-retry": 3.282.0 - "@aws-sdk/middleware-serde": 3.272.0 - "@aws-sdk/middleware-stack": 3.272.0 - "@aws-sdk/middleware-user-agent": 3.282.0 - "@aws-sdk/node-config-provider": 3.272.0 - "@aws-sdk/node-http-handler": 3.282.0 - "@aws-sdk/protocol-http": 3.282.0 - "@aws-sdk/smithy-client": 3.279.0 - "@aws-sdk/types": 3.272.0 - "@aws-sdk/url-parser": 3.272.0 - "@aws-sdk/util-base64": 3.208.0 - "@aws-sdk/util-body-length-browser": 3.188.0 - "@aws-sdk/util-body-length-node": 3.208.0 - "@aws-sdk/util-defaults-mode-browser": 3.279.0 - "@aws-sdk/util-defaults-mode-node": 3.282.0 - "@aws-sdk/util-endpoints": 3.272.0 - "@aws-sdk/util-retry": 3.272.0 - "@aws-sdk/util-user-agent-browser": 3.282.0 - "@aws-sdk/util-user-agent-node": 3.282.0 - "@aws-sdk/util-utf8": 3.254.0 + "@aws-sdk/config-resolver": 3.292.0 + "@aws-sdk/fetch-http-handler": 3.292.0 + "@aws-sdk/hash-node": 3.292.0 + "@aws-sdk/invalid-dependency": 3.292.0 + "@aws-sdk/middleware-content-length": 3.292.0 + "@aws-sdk/middleware-endpoint": 3.292.0 + "@aws-sdk/middleware-host-header": 3.292.0 + "@aws-sdk/middleware-logger": 3.292.0 + "@aws-sdk/middleware-recursion-detection": 3.292.0 + "@aws-sdk/middleware-retry": 3.292.0 + "@aws-sdk/middleware-serde": 3.292.0 + "@aws-sdk/middleware-stack": 3.292.0 + "@aws-sdk/middleware-user-agent": 3.292.0 + "@aws-sdk/node-config-provider": 3.292.0 + "@aws-sdk/node-http-handler": 3.292.0 + "@aws-sdk/protocol-http": 3.292.0 + "@aws-sdk/smithy-client": 3.292.0 + "@aws-sdk/types": 3.292.0 + "@aws-sdk/url-parser": 3.292.0 + "@aws-sdk/util-base64": 3.292.0 + "@aws-sdk/util-body-length-browser": 3.292.0 + "@aws-sdk/util-body-length-node": 3.292.0 + "@aws-sdk/util-defaults-mode-browser": 3.292.0 + "@aws-sdk/util-defaults-mode-node": 3.292.0 + "@aws-sdk/util-endpoints": 3.292.0 + "@aws-sdk/util-retry": 3.292.0 + "@aws-sdk/util-user-agent-browser": 3.292.0 + "@aws-sdk/util-user-agent-node": 3.292.0 + "@aws-sdk/util-utf8": 3.292.0 tslib: ^2.3.1 - checksum: 4b7d40614d5379e30ce800acd60d6c04751f2a1e347474925d74fc4b9bdf9529132fd2e40933ae2fba5ef65569d55387ea80ca5312d810a868826276296b18a4 + checksum: 66eb1db43d5c81ebe8a7905517209bdd7a04e45a87aa6b2c31ca25825d9f11d82e42835f2425fd39cc0dc815603363824cf3da9526475af400ccba86ea68d621 languageName: node linkType: hard -"@aws-sdk/client-sso@npm:3.282.0": - version: 3.282.0 - resolution: "@aws-sdk/client-sso@npm:3.282.0" +"@aws-sdk/client-sso@npm:3.292.0": + version: 3.292.0 + resolution: "@aws-sdk/client-sso@npm:3.292.0" dependencies: "@aws-crypto/sha256-browser": 3.0.0 "@aws-crypto/sha256-js": 3.0.0 - "@aws-sdk/config-resolver": 3.282.0 - "@aws-sdk/fetch-http-handler": 3.282.0 - "@aws-sdk/hash-node": 3.272.0 - "@aws-sdk/invalid-dependency": 3.272.0 - "@aws-sdk/middleware-content-length": 3.282.0 - "@aws-sdk/middleware-endpoint": 3.282.0 - "@aws-sdk/middleware-host-header": 3.282.0 - "@aws-sdk/middleware-logger": 3.272.0 - "@aws-sdk/middleware-recursion-detection": 3.282.0 - "@aws-sdk/middleware-retry": 3.282.0 - "@aws-sdk/middleware-serde": 3.272.0 - "@aws-sdk/middleware-stack": 3.272.0 - "@aws-sdk/middleware-user-agent": 3.282.0 - "@aws-sdk/node-config-provider": 3.272.0 - "@aws-sdk/node-http-handler": 3.282.0 - "@aws-sdk/protocol-http": 3.282.0 - "@aws-sdk/smithy-client": 3.279.0 - "@aws-sdk/types": 3.272.0 - "@aws-sdk/url-parser": 3.272.0 - "@aws-sdk/util-base64": 3.208.0 - "@aws-sdk/util-body-length-browser": 3.188.0 - "@aws-sdk/util-body-length-node": 3.208.0 - "@aws-sdk/util-defaults-mode-browser": 3.279.0 - "@aws-sdk/util-defaults-mode-node": 3.282.0 - "@aws-sdk/util-endpoints": 3.272.0 - "@aws-sdk/util-retry": 3.272.0 - "@aws-sdk/util-user-agent-browser": 3.282.0 - "@aws-sdk/util-user-agent-node": 3.282.0 - "@aws-sdk/util-utf8": 3.254.0 + "@aws-sdk/config-resolver": 3.292.0 + "@aws-sdk/fetch-http-handler": 3.292.0 + "@aws-sdk/hash-node": 3.292.0 + "@aws-sdk/invalid-dependency": 3.292.0 + "@aws-sdk/middleware-content-length": 3.292.0 + "@aws-sdk/middleware-endpoint": 3.292.0 + "@aws-sdk/middleware-host-header": 3.292.0 + "@aws-sdk/middleware-logger": 3.292.0 + "@aws-sdk/middleware-recursion-detection": 3.292.0 + "@aws-sdk/middleware-retry": 3.292.0 + "@aws-sdk/middleware-serde": 3.292.0 + "@aws-sdk/middleware-stack": 3.292.0 + "@aws-sdk/middleware-user-agent": 3.292.0 + "@aws-sdk/node-config-provider": 3.292.0 + "@aws-sdk/node-http-handler": 3.292.0 + "@aws-sdk/protocol-http": 3.292.0 + "@aws-sdk/smithy-client": 3.292.0 + "@aws-sdk/types": 3.292.0 + "@aws-sdk/url-parser": 3.292.0 + "@aws-sdk/util-base64": 3.292.0 + "@aws-sdk/util-body-length-browser": 3.292.0 + "@aws-sdk/util-body-length-node": 3.292.0 + "@aws-sdk/util-defaults-mode-browser": 3.292.0 + "@aws-sdk/util-defaults-mode-node": 3.292.0 + "@aws-sdk/util-endpoints": 3.292.0 + "@aws-sdk/util-retry": 3.292.0 + "@aws-sdk/util-user-agent-browser": 3.292.0 + "@aws-sdk/util-user-agent-node": 3.292.0 + "@aws-sdk/util-utf8": 3.292.0 tslib: ^2.3.1 - checksum: e227d6c3dfcb4c0ec8c2a42ba281bca82dc6134ec69e6af6901892567d729be7f4b361cd0b70e18d85117e29f52aa75affc8e91fef1eb8c024f577897480085f + checksum: 6d8523cc18cfd3ba3be6ee3f80cfb1466f6814a57deeaf933f5096d19c505a25c3a94daf348d92d91acb76cd6ccbaa6db14663842a50fe2040e8f4b410125256 languageName: node linkType: hard -"@aws-sdk/client-sts@npm:3.282.0, @aws-sdk/client-sts@npm:^3.208.0": - version: 3.282.0 - resolution: "@aws-sdk/client-sts@npm:3.282.0" +"@aws-sdk/client-sts@npm:3.292.0, @aws-sdk/client-sts@npm:^3.208.0": + version: 3.292.0 + resolution: "@aws-sdk/client-sts@npm:3.292.0" dependencies: "@aws-crypto/sha256-browser": 3.0.0 "@aws-crypto/sha256-js": 3.0.0 - "@aws-sdk/config-resolver": 3.282.0 - "@aws-sdk/credential-provider-node": 3.282.0 - "@aws-sdk/fetch-http-handler": 3.282.0 - "@aws-sdk/hash-node": 3.272.0 - "@aws-sdk/invalid-dependency": 3.272.0 - "@aws-sdk/middleware-content-length": 3.282.0 - "@aws-sdk/middleware-endpoint": 3.282.0 - "@aws-sdk/middleware-host-header": 3.282.0 - "@aws-sdk/middleware-logger": 3.272.0 - "@aws-sdk/middleware-recursion-detection": 3.282.0 - "@aws-sdk/middleware-retry": 3.282.0 - "@aws-sdk/middleware-sdk-sts": 3.282.0 - "@aws-sdk/middleware-serde": 3.272.0 - "@aws-sdk/middleware-signing": 3.282.0 - "@aws-sdk/middleware-stack": 3.272.0 - "@aws-sdk/middleware-user-agent": 3.282.0 - "@aws-sdk/node-config-provider": 3.272.0 - "@aws-sdk/node-http-handler": 3.282.0 - "@aws-sdk/protocol-http": 3.282.0 - "@aws-sdk/smithy-client": 3.279.0 - "@aws-sdk/types": 3.272.0 - "@aws-sdk/url-parser": 3.272.0 - "@aws-sdk/util-base64": 3.208.0 - "@aws-sdk/util-body-length-browser": 3.188.0 - "@aws-sdk/util-body-length-node": 3.208.0 - "@aws-sdk/util-defaults-mode-browser": 3.279.0 - "@aws-sdk/util-defaults-mode-node": 3.282.0 - "@aws-sdk/util-endpoints": 3.272.0 - "@aws-sdk/util-retry": 3.272.0 - "@aws-sdk/util-user-agent-browser": 3.282.0 - "@aws-sdk/util-user-agent-node": 3.282.0 - "@aws-sdk/util-utf8": 3.254.0 + "@aws-sdk/config-resolver": 3.292.0 + "@aws-sdk/credential-provider-node": 3.292.0 + "@aws-sdk/fetch-http-handler": 3.292.0 + "@aws-sdk/hash-node": 3.292.0 + "@aws-sdk/invalid-dependency": 3.292.0 + "@aws-sdk/middleware-content-length": 3.292.0 + "@aws-sdk/middleware-endpoint": 3.292.0 + "@aws-sdk/middleware-host-header": 3.292.0 + "@aws-sdk/middleware-logger": 3.292.0 + "@aws-sdk/middleware-recursion-detection": 3.292.0 + "@aws-sdk/middleware-retry": 3.292.0 + "@aws-sdk/middleware-sdk-sts": 3.292.0 + "@aws-sdk/middleware-serde": 3.292.0 + "@aws-sdk/middleware-signing": 3.292.0 + "@aws-sdk/middleware-stack": 3.292.0 + "@aws-sdk/middleware-user-agent": 3.292.0 + "@aws-sdk/node-config-provider": 3.292.0 + "@aws-sdk/node-http-handler": 3.292.0 + "@aws-sdk/protocol-http": 3.292.0 + "@aws-sdk/smithy-client": 3.292.0 + "@aws-sdk/types": 3.292.0 + "@aws-sdk/url-parser": 3.292.0 + "@aws-sdk/util-base64": 3.292.0 + "@aws-sdk/util-body-length-browser": 3.292.0 + "@aws-sdk/util-body-length-node": 3.292.0 + "@aws-sdk/util-defaults-mode-browser": 3.292.0 + "@aws-sdk/util-defaults-mode-node": 3.292.0 + "@aws-sdk/util-endpoints": 3.292.0 + "@aws-sdk/util-retry": 3.292.0 + "@aws-sdk/util-user-agent-browser": 3.292.0 + "@aws-sdk/util-user-agent-node": 3.292.0 + "@aws-sdk/util-utf8": 3.292.0 fast-xml-parser: 4.1.2 tslib: ^2.3.1 - checksum: 5af24417f7ef2dbebe6b0c0aa545eeb809e92136bce2b1e7dd07de1159f2308c2d673c3b136440e4137ce7524cbdabe50e80d7ca6f8635a3d9dcd2983532a9e7 + checksum: 00fc2f435430d43816c527dc681c462dc3cc25c427f128570db3e33f7a03963a848f000b9678526277f5b636236ac3456984e6c19e4e0ed75609ba9b15b50e0c languageName: node linkType: hard -"@aws-sdk/config-resolver@npm:3.282.0": - version: 3.282.0 - resolution: "@aws-sdk/config-resolver@npm:3.282.0" +"@aws-sdk/config-resolver@npm:3.292.0": + version: 3.292.0 + resolution: "@aws-sdk/config-resolver@npm:3.292.0" dependencies: - "@aws-sdk/signature-v4": 3.282.0 - "@aws-sdk/types": 3.272.0 - "@aws-sdk/util-config-provider": 3.208.0 - "@aws-sdk/util-middleware": 3.272.0 + "@aws-sdk/signature-v4": 3.292.0 + "@aws-sdk/types": 3.292.0 + "@aws-sdk/util-config-provider": 3.292.0 + "@aws-sdk/util-middleware": 3.292.0 tslib: ^2.3.1 - checksum: 47628c4c66d93f2fb109039a55f206f1d9360fd3440ba2354489b5ddf05aab5322791a7e688cb02012342b3ecc7c5a61030838e6b94be76461f7f86d10a3c120 + checksum: 990aa47171b9ab7ee5eaf0d5367b7ad5487dc4ecafb776eb120aa98d0c5081e5ef685263fb3a316267d86be4a737ee26e306f1be68b29bcf86179a5b4fefbd9c languageName: node linkType: hard -"@aws-sdk/credential-provider-cognito-identity@npm:3.282.0": - version: 3.282.0 - resolution: "@aws-sdk/credential-provider-cognito-identity@npm:3.282.0" +"@aws-sdk/credential-provider-cognito-identity@npm:3.292.0": + version: 3.292.0 + resolution: "@aws-sdk/credential-provider-cognito-identity@npm:3.292.0" dependencies: - "@aws-sdk/client-cognito-identity": 3.282.0 - "@aws-sdk/property-provider": 3.272.0 - "@aws-sdk/types": 3.272.0 + "@aws-sdk/client-cognito-identity": 3.292.0 + "@aws-sdk/property-provider": 3.292.0 + "@aws-sdk/types": 3.292.0 tslib: ^2.3.1 - checksum: c78e08a43e5611d6fbf15871720b38d76168ffbf75e24394ad10550b636d454c97bc6caaf70b0a3b960406b85874c7e45406167e6d38ae18acadfcaac16b2d73 + checksum: 19f690b03876dfbfe7f1c2f0bb28445980d1178794683ec0487e0c178300ba754f98b420a6c8ad37a5af5abafc1d4da76e33e3528b03347c96879e56b3ec0de0 languageName: node linkType: hard -"@aws-sdk/credential-provider-env@npm:3.272.0": - version: 3.272.0 - resolution: "@aws-sdk/credential-provider-env@npm:3.272.0" +"@aws-sdk/credential-provider-env@npm:3.292.0": + version: 3.292.0 + resolution: "@aws-sdk/credential-provider-env@npm:3.292.0" dependencies: - "@aws-sdk/property-provider": 3.272.0 - "@aws-sdk/types": 3.272.0 + "@aws-sdk/property-provider": 3.292.0 + "@aws-sdk/types": 3.292.0 tslib: ^2.3.1 - checksum: 74195ecb608e3e6dedfc40e052bd7d0ef3a9e531ecf404f40d05869e23328bd156e458e9770d30458137438de92efd3dcb9fc3ff5f1319c49b55e057323f3ea6 + checksum: 86f28ecc0834848bbf60b32a939d090d66f1996d8db4f3128d56c308cb624c4b1dd1b720c1a111e2f6d863b710f533f4b1e6e863dad402cd02d9cfb732f7767c languageName: node linkType: hard -"@aws-sdk/credential-provider-imds@npm:3.272.0": - version: 3.272.0 - resolution: "@aws-sdk/credential-provider-imds@npm:3.272.0" +"@aws-sdk/credential-provider-imds@npm:3.292.0": + version: 3.292.0 + resolution: "@aws-sdk/credential-provider-imds@npm:3.292.0" dependencies: - "@aws-sdk/node-config-provider": 3.272.0 - "@aws-sdk/property-provider": 3.272.0 - "@aws-sdk/types": 3.272.0 - "@aws-sdk/url-parser": 3.272.0 + "@aws-sdk/node-config-provider": 3.292.0 + "@aws-sdk/property-provider": 3.292.0 + "@aws-sdk/types": 3.292.0 + "@aws-sdk/url-parser": 3.292.0 tslib: ^2.3.1 - checksum: c6adfcaa8dada3f99bbbd241aee3e568474c93df97e9b3f5e4feb9b000a91e5b3f0491556f712ebbd4d67de9c77c1072e6d444ac63ad9c6be31cf26acb2bc72c + checksum: 421c72fe36e6f7c9dc7ff53d226fe5a8986ba99033ac79bdc4699c5c5bfed7d45096a3f5f3088d39dd68ff4895bfc914a14eb8909728111e0c411302102a3c48 languageName: node linkType: hard -"@aws-sdk/credential-provider-ini@npm:3.282.0": - version: 3.282.0 - resolution: "@aws-sdk/credential-provider-ini@npm:3.282.0" +"@aws-sdk/credential-provider-ini@npm:3.292.0": + version: 3.292.0 + resolution: "@aws-sdk/credential-provider-ini@npm:3.292.0" dependencies: - "@aws-sdk/credential-provider-env": 3.272.0 - "@aws-sdk/credential-provider-imds": 3.272.0 - "@aws-sdk/credential-provider-process": 3.272.0 - "@aws-sdk/credential-provider-sso": 3.282.0 - "@aws-sdk/credential-provider-web-identity": 3.272.0 - "@aws-sdk/property-provider": 3.272.0 - "@aws-sdk/shared-ini-file-loader": 3.272.0 - "@aws-sdk/types": 3.272.0 + "@aws-sdk/credential-provider-env": 3.292.0 + "@aws-sdk/credential-provider-imds": 3.292.0 + "@aws-sdk/credential-provider-process": 3.292.0 + "@aws-sdk/credential-provider-sso": 3.292.0 + "@aws-sdk/credential-provider-web-identity": 3.292.0 + "@aws-sdk/property-provider": 3.292.0 + "@aws-sdk/shared-ini-file-loader": 3.292.0 + "@aws-sdk/types": 3.292.0 tslib: ^2.3.1 - checksum: e5281422c8e060dbfca271ccb2f80f23fac11d513d2f97954a7070ca3fdfa0293aed55d8bb0e65cc50dbb60c624755436892a9dd41a659dd3ab8f91d1d9ba74e + checksum: cc46fac892e508ffc3a8ef9f2a04657fd4f9e9e79c09ec3feeab7300d8d1a4d9742a8ad086eea403a5ecad468ed89dbe72b6f804796c11a1634562292e03517f languageName: node linkType: hard -"@aws-sdk/credential-provider-node@npm:3.282.0, @aws-sdk/credential-provider-node@npm:^3.208.0": - version: 3.282.0 - resolution: "@aws-sdk/credential-provider-node@npm:3.282.0" +"@aws-sdk/credential-provider-node@npm:3.292.0, @aws-sdk/credential-provider-node@npm:^3.208.0": + version: 3.292.0 + resolution: "@aws-sdk/credential-provider-node@npm:3.292.0" dependencies: - "@aws-sdk/credential-provider-env": 3.272.0 - "@aws-sdk/credential-provider-imds": 3.272.0 - "@aws-sdk/credential-provider-ini": 3.282.0 - "@aws-sdk/credential-provider-process": 3.272.0 - "@aws-sdk/credential-provider-sso": 3.282.0 - "@aws-sdk/credential-provider-web-identity": 3.272.0 - "@aws-sdk/property-provider": 3.272.0 - "@aws-sdk/shared-ini-file-loader": 3.272.0 - "@aws-sdk/types": 3.272.0 + "@aws-sdk/credential-provider-env": 3.292.0 + "@aws-sdk/credential-provider-imds": 3.292.0 + "@aws-sdk/credential-provider-ini": 3.292.0 + "@aws-sdk/credential-provider-process": 3.292.0 + "@aws-sdk/credential-provider-sso": 3.292.0 + "@aws-sdk/credential-provider-web-identity": 3.292.0 + "@aws-sdk/property-provider": 3.292.0 + "@aws-sdk/shared-ini-file-loader": 3.292.0 + "@aws-sdk/types": 3.292.0 tslib: ^2.3.1 - checksum: dc76e67a635bb8807e2e80f4095beaa9d19a07cb5ed7e86080dd9ccff9fc23d6a84af88b74994233742032766efaebc2fd621cd3f8462d8ff041fdf5604a0ee4 + checksum: c298775fde4f85a0db5465b6782caf6242eacc93737d457f17ce76742553c51d1c16907a326a0e860e35893f575a6c6f7f922a9cd91a32425ffa01d56d97e686 languageName: node linkType: hard -"@aws-sdk/credential-provider-process@npm:3.272.0": - version: 3.272.0 - resolution: "@aws-sdk/credential-provider-process@npm:3.272.0" +"@aws-sdk/credential-provider-process@npm:3.292.0": + version: 3.292.0 + resolution: "@aws-sdk/credential-provider-process@npm:3.292.0" dependencies: - "@aws-sdk/property-provider": 3.272.0 - "@aws-sdk/shared-ini-file-loader": 3.272.0 - "@aws-sdk/types": 3.272.0 + "@aws-sdk/property-provider": 3.292.0 + "@aws-sdk/shared-ini-file-loader": 3.292.0 + "@aws-sdk/types": 3.292.0 tslib: ^2.3.1 - checksum: fda290aea2417137f333c8ad0a94d7789054b464bdf5f9a7eef06341f88d4bd0c96ca02b84b58e0af2a9c490cee4febf6ee84254dfbff192bfccccbb0c8c1876 + checksum: 2cad4d73e2f07ad5cd613f053e5fb7c146c33020dd13a8cc664d6705a9f33f257a4d3e2fbbfe7c34fc8582593eaa1b0ded67dcf2022842d421a465de760420b0 languageName: node linkType: hard -"@aws-sdk/credential-provider-sso@npm:3.282.0": - version: 3.282.0 - resolution: "@aws-sdk/credential-provider-sso@npm:3.282.0" +"@aws-sdk/credential-provider-sso@npm:3.292.0": + version: 3.292.0 + resolution: "@aws-sdk/credential-provider-sso@npm:3.292.0" dependencies: - "@aws-sdk/client-sso": 3.282.0 - "@aws-sdk/property-provider": 3.272.0 - "@aws-sdk/shared-ini-file-loader": 3.272.0 - "@aws-sdk/token-providers": 3.282.0 - "@aws-sdk/types": 3.272.0 + "@aws-sdk/client-sso": 3.292.0 + "@aws-sdk/property-provider": 3.292.0 + "@aws-sdk/shared-ini-file-loader": 3.292.0 + "@aws-sdk/token-providers": 3.292.0 + "@aws-sdk/types": 3.292.0 tslib: ^2.3.1 - checksum: 7888c5fbb0be701a8b6ad0a853959f5de0549e0c54dd475767395cfd9337e429056c948ee332da3b447751899635886955a8cc30e0ffbb1b86b6d887712ac0e4 + checksum: 925511e0393d1a011dc123b34b0d9b8e6a18f8ead6695d5b7d0ad3b681024f39878feb258f48003adbea2e6eceb2b4191127e9aebfe73d3ee40d894c48433248 languageName: node linkType: hard -"@aws-sdk/credential-provider-web-identity@npm:3.272.0": - version: 3.272.0 - resolution: "@aws-sdk/credential-provider-web-identity@npm:3.272.0" +"@aws-sdk/credential-provider-web-identity@npm:3.292.0": + version: 3.292.0 + resolution: "@aws-sdk/credential-provider-web-identity@npm:3.292.0" dependencies: - "@aws-sdk/property-provider": 3.272.0 - "@aws-sdk/types": 3.272.0 + "@aws-sdk/property-provider": 3.292.0 + "@aws-sdk/types": 3.292.0 tslib: ^2.3.1 - checksum: aad84e2bfd90495ed4eb76b83940729bd2fb652398f7e477cfd8053f9c986132b4ff8682854a91e3f23c7daaab66e1c31320188561104fea710cd87be1221e9d + checksum: 02e0e30df966c6b623d68517ae360bc4efa7a04fcfba17baf48e4398e899e225c507d5280d682e222ba9f48a484e912de3946b9dde8512baefc5493d28f7b486 languageName: node linkType: hard "@aws-sdk/credential-providers@npm:^3.208.0": - version: 3.282.0 - resolution: "@aws-sdk/credential-providers@npm:3.282.0" + version: 3.292.0 + resolution: "@aws-sdk/credential-providers@npm:3.292.0" dependencies: - "@aws-sdk/client-cognito-identity": 3.282.0 - "@aws-sdk/client-sso": 3.282.0 - "@aws-sdk/client-sts": 3.282.0 - "@aws-sdk/credential-provider-cognito-identity": 3.282.0 - "@aws-sdk/credential-provider-env": 3.272.0 - "@aws-sdk/credential-provider-imds": 3.272.0 - "@aws-sdk/credential-provider-ini": 3.282.0 - "@aws-sdk/credential-provider-node": 3.282.0 - "@aws-sdk/credential-provider-process": 3.272.0 - "@aws-sdk/credential-provider-sso": 3.282.0 - "@aws-sdk/credential-provider-web-identity": 3.272.0 - "@aws-sdk/property-provider": 3.272.0 - "@aws-sdk/shared-ini-file-loader": 3.272.0 - "@aws-sdk/types": 3.272.0 + "@aws-sdk/client-cognito-identity": 3.292.0 + "@aws-sdk/client-sso": 3.292.0 + "@aws-sdk/client-sts": 3.292.0 + "@aws-sdk/credential-provider-cognito-identity": 3.292.0 + "@aws-sdk/credential-provider-env": 3.292.0 + "@aws-sdk/credential-provider-imds": 3.292.0 + "@aws-sdk/credential-provider-ini": 3.292.0 + "@aws-sdk/credential-provider-node": 3.292.0 + "@aws-sdk/credential-provider-process": 3.292.0 + "@aws-sdk/credential-provider-sso": 3.292.0 + "@aws-sdk/credential-provider-web-identity": 3.292.0 + "@aws-sdk/property-provider": 3.292.0 + "@aws-sdk/shared-ini-file-loader": 3.292.0 + "@aws-sdk/types": 3.292.0 tslib: ^2.3.1 - checksum: ec707176eba558fc5bfc45b2917d624a83995c75bfc38a121d3a3fe6c0be541c25815d4892fc33fd0f1de5f892232014724b0d5c62c19a2d6d3f839258b25840 + checksum: 1f504ff89a0112382db0c2d190efbf872ffd69a7ca136ee108df352ec49d76951d84146faa188195e90cd922e967bb68fb72fe5b443d93caab0f4254bc109aaa languageName: node linkType: hard -"@aws-sdk/eventstream-codec@npm:3.272.0": - version: 3.272.0 - resolution: "@aws-sdk/eventstream-codec@npm:3.272.0" +"@aws-sdk/eventstream-codec@npm:3.292.0": + version: 3.292.0 + resolution: "@aws-sdk/eventstream-codec@npm:3.292.0" dependencies: "@aws-crypto/crc32": 3.0.0 - "@aws-sdk/types": 3.272.0 - "@aws-sdk/util-hex-encoding": 3.201.0 + "@aws-sdk/types": 3.292.0 + "@aws-sdk/util-hex-encoding": 3.292.0 tslib: ^2.3.1 - checksum: bea8599a72657d698de169643950031624e0b61179240c8d8eb3c17f01bfc4579c507a861be6c703f318fcdff4217a4cb4279223cad93fb21e69f4b5d10d6102 + checksum: 6a246d7944074d4a5332ccc7b848f9e3f4b928161c0c31f9ef6306a989c012d92bae606910179f6f44be26cb530308ca0f1d4cd3656a9247a6c9f6ed2446a952 languageName: node linkType: hard -"@aws-sdk/eventstream-serde-browser@npm:3.272.0": - version: 3.272.0 - resolution: "@aws-sdk/eventstream-serde-browser@npm:3.272.0" +"@aws-sdk/eventstream-serde-browser@npm:3.292.0": + version: 3.292.0 + resolution: "@aws-sdk/eventstream-serde-browser@npm:3.292.0" dependencies: - "@aws-sdk/eventstream-serde-universal": 3.272.0 - "@aws-sdk/types": 3.272.0 + "@aws-sdk/eventstream-serde-universal": 3.292.0 + "@aws-sdk/types": 3.292.0 tslib: ^2.3.1 - checksum: a4fa42e1a8658eca191f567046741192e6e04f5c58744655ec0112a1d46b57d5ce04432e2fec0e6fe16d486c30abdc58b734ed67879c10e0fcc4820530eaff35 + checksum: 53ae27259d1c117b0acb84e07f6258b76970cfc221f5c531b17c4c04ef262bd799e6157831c480a6a0861847b5500d389af83cee7021abbbc4f5c983c69a3948 languageName: node linkType: hard -"@aws-sdk/eventstream-serde-config-resolver@npm:3.272.0": - version: 3.272.0 - resolution: "@aws-sdk/eventstream-serde-config-resolver@npm:3.272.0" +"@aws-sdk/eventstream-serde-config-resolver@npm:3.292.0": + version: 3.292.0 + resolution: "@aws-sdk/eventstream-serde-config-resolver@npm:3.292.0" dependencies: - "@aws-sdk/types": 3.272.0 + "@aws-sdk/types": 3.292.0 tslib: ^2.3.1 - checksum: feee058288bbf5a97d78dfee5084c2dc224d771499848dcaedbfd671c8889f52329f96ce87c291d29e66b46c8e25923bd55f64d8ed744089fc40723296eb003c + checksum: 6f7d25386ddf86dd90fc7a5b83fe0bab3789a2ddad8017c8bb07a74cd2d7fb0fa9ea2216e66237a492cc25a8525df2b09485fbfa9f3ec9029981a830a89f0c81 languageName: node linkType: hard -"@aws-sdk/eventstream-serde-node@npm:3.272.0": - version: 3.272.0 - resolution: "@aws-sdk/eventstream-serde-node@npm:3.272.0" +"@aws-sdk/eventstream-serde-node@npm:3.292.0": + version: 3.292.0 + resolution: "@aws-sdk/eventstream-serde-node@npm:3.292.0" dependencies: - "@aws-sdk/eventstream-serde-universal": 3.272.0 - "@aws-sdk/types": 3.272.0 + "@aws-sdk/eventstream-serde-universal": 3.292.0 + "@aws-sdk/types": 3.292.0 tslib: ^2.3.1 - checksum: 02fa0c5f992df253713bbe19515bf898e332e3bc51da28da28bdf2cde584df90689bb9b54afa57354798c8b01e4b592d63fb575d7652fd5df2c00bf1e45e689a + checksum: 981f007ab42bd2cfc781e26ee3d2b9f1ac81656a519bc9fbceefd68c31b5a1d6c55594b7001de68a354cdcf29e92820fe063ac6877c84035b320ccfeaafdc038 languageName: node linkType: hard -"@aws-sdk/eventstream-serde-universal@npm:3.272.0": - version: 3.272.0 - resolution: "@aws-sdk/eventstream-serde-universal@npm:3.272.0" +"@aws-sdk/eventstream-serde-universal@npm:3.292.0": + version: 3.292.0 + resolution: "@aws-sdk/eventstream-serde-universal@npm:3.292.0" dependencies: - "@aws-sdk/eventstream-codec": 3.272.0 - "@aws-sdk/types": 3.272.0 + "@aws-sdk/eventstream-codec": 3.292.0 + "@aws-sdk/types": 3.292.0 tslib: ^2.3.1 - checksum: 3d8031e84af1a0cdf5f22f98aee868cd62b6fa87e432231bbe32a400874dc44b030cffdf9dce3194281bf04a1669b23bf8ce16759123ba10980676fe9388e63b + checksum: 9c2c8ea67a81ef95753af8c16e14134df7f642b61fc83ec58a147d417718c64a750a2c5410efec09e37af847e290660395e1e261fe5e931e06d06c52110983cb languageName: node linkType: hard -"@aws-sdk/fetch-http-handler@npm:3.208.0": - version: 3.208.0 - resolution: "@aws-sdk/fetch-http-handler@npm:3.208.0" +"@aws-sdk/fetch-http-handler@npm:3.292.0": + version: 3.292.0 + resolution: "@aws-sdk/fetch-http-handler@npm:3.292.0" dependencies: - "@aws-sdk/protocol-http": 3.208.0 - "@aws-sdk/querystring-builder": 3.208.0 - "@aws-sdk/types": 3.208.0 - "@aws-sdk/util-base64": 3.208.0 + "@aws-sdk/protocol-http": 3.292.0 + "@aws-sdk/querystring-builder": 3.292.0 + "@aws-sdk/types": 3.292.0 + "@aws-sdk/util-base64": 3.292.0 tslib: ^2.3.1 - checksum: a0016ec854d247e28ba7a86e72d6915854b33d489e88e5d26c8e3843704a3978129b4b52619c9810acd19c47dbf9b4359be17ad939e0be676b4af9cb21952abf + checksum: d779d52bd0d3d2ad5ab5232f5e08c1f9489f83c50a5d8df899c1ad25ae14f97fdf8c28c4465e0fb6f2b7554db89f78afa65fddb24cbbe7983bbd7efdd455934e languageName: node linkType: hard -"@aws-sdk/fetch-http-handler@npm:3.282.0": - version: 3.282.0 - resolution: "@aws-sdk/fetch-http-handler@npm:3.282.0" +"@aws-sdk/hash-blob-browser@npm:3.292.0": + version: 3.292.0 + resolution: "@aws-sdk/hash-blob-browser@npm:3.292.0" dependencies: - "@aws-sdk/protocol-http": 3.282.0 - "@aws-sdk/querystring-builder": 3.272.0 - "@aws-sdk/types": 3.272.0 - "@aws-sdk/util-base64": 3.208.0 + "@aws-sdk/chunked-blob-reader": 3.292.0 + "@aws-sdk/chunked-blob-reader-native": 3.292.0 + "@aws-sdk/types": 3.292.0 tslib: ^2.3.1 - checksum: 20823143bfed12dd25dc77abb8f869b4f013506f5a028477add87213ec184649dd799f4c6db5d25699a050763ef4a24c6363c06ff096e3a9b7413e2e865a10f6 + checksum: d560e6de563019d55fe4ef8b385dec52da9b7a76ffa3d5ab4e5d87986c675a7cc2e468088408316ee13aa78f43d1d5393cf19000bb037c385341dddb35c7765c languageName: node linkType: hard -"@aws-sdk/hash-blob-browser@npm:3.272.0": - version: 3.272.0 - resolution: "@aws-sdk/hash-blob-browser@npm:3.272.0" +"@aws-sdk/hash-node@npm:3.292.0": + version: 3.292.0 + resolution: "@aws-sdk/hash-node@npm:3.292.0" dependencies: - "@aws-sdk/chunked-blob-reader": 3.188.0 - "@aws-sdk/chunked-blob-reader-native": 3.208.0 - "@aws-sdk/types": 3.272.0 + "@aws-sdk/types": 3.292.0 + "@aws-sdk/util-buffer-from": 3.292.0 + "@aws-sdk/util-utf8": 3.292.0 tslib: ^2.3.1 - checksum: ab0564672606760b934973ef33a8a8d567d52d3fa4be2a7a8919daa1b9ac1c3afaaee975ae7ad20940f51e1057e3321c39f5dcd2246ca85aad03e1f7aed68669 + checksum: 4b7e77be7331951fd4a894a629f52d5ffc0ed19565f9e5a64934fd1b3741a0a30aed90cded058e6d4981cf51e3e8bc9849cd7b0bff8f80d7e5269665abd25713 languageName: node linkType: hard -"@aws-sdk/hash-node@npm:3.272.0": - version: 3.272.0 - resolution: "@aws-sdk/hash-node@npm:3.272.0" +"@aws-sdk/hash-stream-node@npm:3.292.0": + version: 3.292.0 + resolution: "@aws-sdk/hash-stream-node@npm:3.292.0" dependencies: - "@aws-sdk/types": 3.272.0 - "@aws-sdk/util-buffer-from": 3.208.0 - "@aws-sdk/util-utf8": 3.254.0 + "@aws-sdk/types": 3.292.0 + "@aws-sdk/util-utf8": 3.292.0 tslib: ^2.3.1 - checksum: 1b3d5b288133af9294df36cec2377589f45c82f61cb824b14ac38955541357826cf5a8f95d7906cbf284ed9ffbd928a37b2f94581f7281715879aa4c0e7c7b24 + checksum: af7cbdddc17801cd50bca24aa80d3ee837b1eda505290725c853847682451497249b018411e723acfee0004723b10a54517c314a8d69cfd6e67fa901fe530184 languageName: node linkType: hard -"@aws-sdk/hash-stream-node@npm:3.272.0": - version: 3.272.0 - resolution: "@aws-sdk/hash-stream-node@npm:3.272.0" +"@aws-sdk/invalid-dependency@npm:3.292.0": + version: 3.292.0 + resolution: "@aws-sdk/invalid-dependency@npm:3.292.0" dependencies: - "@aws-sdk/types": 3.272.0 - "@aws-sdk/util-utf8": 3.254.0 + "@aws-sdk/types": 3.292.0 tslib: ^2.3.1 - checksum: 4cb90a9ae442e0722d651d7e7558a8b0abcbc1b45670e194d51d0a9b2ea6cad6e3a02433d506a8d96ac94a26cd8e5746514c09f05f0da2acb2dc06c60218d3c5 + checksum: 90b78b9b2a0458b3c473f5d9921dd697aa6923a934a1bd40f4a3bc600366923302d8202827509436ba5f9baddac88ef851344a22bbe7de972a746226823abe82 languageName: node linkType: hard -"@aws-sdk/invalid-dependency@npm:3.272.0": - version: 3.272.0 - resolution: "@aws-sdk/invalid-dependency@npm:3.272.0" - dependencies: - "@aws-sdk/types": 3.272.0 - tslib: ^2.3.1 - checksum: 4ef63ed9a9275e20bdcec551ee92a9d60a6a688c120f968fd51af235d357d39ec522752592075dad752be9a8439d93b4d1848e12fa9a88cda595920d78b008d2 - languageName: node - linkType: hard - -"@aws-sdk/is-array-buffer@npm:3.201.0": - version: 3.201.0 - resolution: "@aws-sdk/is-array-buffer@npm:3.201.0" +"@aws-sdk/is-array-buffer@npm:3.292.0": + version: 3.292.0 + resolution: "@aws-sdk/is-array-buffer@npm:3.292.0" dependencies: tslib: ^2.3.1 - checksum: 295450b417a9ab0b734050afff6c53aaed8a33dccd3ede60bf67fdec21f675d14ab8edc24f4e1d12aa4e99f9ccaf794aaaaff270c296c1ee38f73ea7ba7f59ce + checksum: 31d425754071a50f90a8011a76776d2bee76ddc75d41378b539ccf7982245999a3711d444d0247021a5174064069d6e543c39bc95bd14fd37da4b26a62440cac languageName: node linkType: hard "@aws-sdk/lib-storage@npm:^3.208.0": - version: 3.282.0 - resolution: "@aws-sdk/lib-storage@npm:3.282.0" + version: 3.292.0 + resolution: "@aws-sdk/lib-storage@npm:3.292.0" dependencies: - "@aws-sdk/middleware-endpoint": 3.282.0 - "@aws-sdk/smithy-client": 3.279.0 + "@aws-sdk/middleware-endpoint": 3.292.0 + "@aws-sdk/smithy-client": 3.292.0 buffer: 5.6.0 events: 3.3.0 stream-browserify: 3.0.0 @@ -1085,522 +1072,494 @@ __metadata: peerDependencies: "@aws-sdk/abort-controller": ^3.0.0 "@aws-sdk/client-s3": ^3.0.0 - checksum: 14f1f21a653d239721ca488b6d7951511576a2e2652d240f3561ac0255cd4af321bc41531c15c3c6fae4095da062f5e841c6c9b58afd80be9bf105b63a256f72 + checksum: e3edcca24e740598b2ec9e6ece20b36efa323287d25360e4ad8e001ba985bdc775f322065d943fcd9177374826b4d22c6df7b219a2d24fa2f4f64b64e2f6d67c languageName: node linkType: hard -"@aws-sdk/md5-js@npm:3.272.0": - version: 3.272.0 - resolution: "@aws-sdk/md5-js@npm:3.272.0" +"@aws-sdk/md5-js@npm:3.292.0": + version: 3.292.0 + resolution: "@aws-sdk/md5-js@npm:3.292.0" dependencies: - "@aws-sdk/types": 3.272.0 - "@aws-sdk/util-utf8": 3.254.0 + "@aws-sdk/types": 3.292.0 + "@aws-sdk/util-utf8": 3.292.0 tslib: ^2.3.1 - checksum: d59010c1b48ba1992298ed23b605e7395a4aa964430d41012492faac24c7fa50856b565a523b0262b2c8b667904fdc57748d98475ba8c2e24b4550e17211e5ab + checksum: 130f1f3cf4f4bb1365f2beafbd760d9c651af2cf4eecf8829cf9c68fb0909f9722c01e0e1fcd016b36c060662090257955e3c16a7fe7139cfa824179142635eb languageName: node linkType: hard -"@aws-sdk/middleware-bucket-endpoint@npm:3.282.0": - version: 3.282.0 - resolution: "@aws-sdk/middleware-bucket-endpoint@npm:3.282.0" +"@aws-sdk/middleware-bucket-endpoint@npm:3.292.0": + version: 3.292.0 + resolution: "@aws-sdk/middleware-bucket-endpoint@npm:3.292.0" dependencies: - "@aws-sdk/protocol-http": 3.282.0 - "@aws-sdk/types": 3.272.0 - "@aws-sdk/util-arn-parser": 3.208.0 - "@aws-sdk/util-config-provider": 3.208.0 + "@aws-sdk/protocol-http": 3.292.0 + "@aws-sdk/types": 3.292.0 + "@aws-sdk/util-arn-parser": 3.292.0 + "@aws-sdk/util-config-provider": 3.292.0 tslib: ^2.3.1 - checksum: 1b2f2dfcbf808b8f6e24173f05bdec21c8c6d5ea4eda6b01b3d3812e51e69fd39fe4880922f0f8f6ecbf35bf8410622458882b754d24a67eae59871c1273a2d4 + checksum: b57e3674a826d503fa28e7eac0813b54f6c2ad246f7b14746394aa7bf79808c61dd058e8ebb8657edef05d4d6d2ff8accc96a44e8d06afc86ba8005c1147419d languageName: node linkType: hard -"@aws-sdk/middleware-content-length@npm:3.282.0": - version: 3.282.0 - resolution: "@aws-sdk/middleware-content-length@npm:3.282.0" +"@aws-sdk/middleware-content-length@npm:3.292.0": + version: 3.292.0 + resolution: "@aws-sdk/middleware-content-length@npm:3.292.0" dependencies: - "@aws-sdk/protocol-http": 3.282.0 - "@aws-sdk/types": 3.272.0 + "@aws-sdk/protocol-http": 3.292.0 + "@aws-sdk/types": 3.292.0 tslib: ^2.3.1 - checksum: ebe0f4f55c30cd8ea3711a412e8f0c216c863b7b313ebd12de35b2c8e857cc38b5638c8acdfeca62307911b1092a516d5eaac60493dbeb76806012cda96f46d5 + checksum: 83f8a92ebcd680bc05d859fd40b68278f32f89d6af2617dbc08857afd0e42853bbea00b97bb9b834dcf431742ccbb0b1ce441977c702f4fa81ea48f36923081c languageName: node linkType: hard -"@aws-sdk/middleware-endpoint@npm:3.282.0": - version: 3.282.0 - resolution: "@aws-sdk/middleware-endpoint@npm:3.282.0" +"@aws-sdk/middleware-endpoint@npm:3.292.0": + version: 3.292.0 + resolution: "@aws-sdk/middleware-endpoint@npm:3.292.0" dependencies: - "@aws-sdk/middleware-serde": 3.272.0 - "@aws-sdk/protocol-http": 3.282.0 - "@aws-sdk/signature-v4": 3.282.0 - "@aws-sdk/types": 3.272.0 - "@aws-sdk/url-parser": 3.272.0 - "@aws-sdk/util-config-provider": 3.208.0 - "@aws-sdk/util-middleware": 3.272.0 + "@aws-sdk/middleware-serde": 3.292.0 + "@aws-sdk/protocol-http": 3.292.0 + "@aws-sdk/signature-v4": 3.292.0 + "@aws-sdk/types": 3.292.0 + "@aws-sdk/url-parser": 3.292.0 + "@aws-sdk/util-config-provider": 3.292.0 + "@aws-sdk/util-middleware": 3.292.0 tslib: ^2.3.1 - checksum: 84a9f3d6d5f904e9728c20444f3e2fc369b8a57e9dbc01cf3c3f5a6b6062b2ba470774bddd60a095845bba62ce153590c69a10211f61609d4eebf173338299e7 + checksum: f2ac4d63acceb34f377176f3aa98f18f572c064adbf6a0652c7d5a7b1fd85e249723bab2aae0c19d702aaee0d5f56300c256c93f1b8775aee4ab727cd461ab62 languageName: node linkType: hard -"@aws-sdk/middleware-expect-continue@npm:3.282.0": - version: 3.282.0 - resolution: "@aws-sdk/middleware-expect-continue@npm:3.282.0" +"@aws-sdk/middleware-expect-continue@npm:3.292.0": + version: 3.292.0 + resolution: "@aws-sdk/middleware-expect-continue@npm:3.292.0" dependencies: - "@aws-sdk/protocol-http": 3.282.0 - "@aws-sdk/types": 3.272.0 + "@aws-sdk/protocol-http": 3.292.0 + "@aws-sdk/types": 3.292.0 tslib: ^2.3.1 - checksum: 9b940175d545140608f17d7d5aefd798ea36640acfca95923320eab087bdd2edd25986a68f950a1ecfdf3c922bf91c0cae5b1bc4ce32d51c2f3e1915acc3939a + checksum: 950f154018f2e9e165538edc732f133e89df17e95df0300ddd725e79c3b031834c58bf9891aa89ce988a800e847e23e6a4f8010941b0e338850c606ab8f68191 languageName: node linkType: hard -"@aws-sdk/middleware-flexible-checksums@npm:3.282.0": - version: 3.282.0 - resolution: "@aws-sdk/middleware-flexible-checksums@npm:3.282.0" +"@aws-sdk/middleware-flexible-checksums@npm:3.292.0": + version: 3.292.0 + resolution: "@aws-sdk/middleware-flexible-checksums@npm:3.292.0" dependencies: "@aws-crypto/crc32": 3.0.0 "@aws-crypto/crc32c": 3.0.0 - "@aws-sdk/is-array-buffer": 3.201.0 - "@aws-sdk/protocol-http": 3.282.0 - "@aws-sdk/types": 3.272.0 - "@aws-sdk/util-utf8": 3.254.0 + "@aws-sdk/is-array-buffer": 3.292.0 + "@aws-sdk/protocol-http": 3.292.0 + "@aws-sdk/types": 3.292.0 + "@aws-sdk/util-utf8": 3.292.0 tslib: ^2.3.1 - checksum: 7575ebdf82e62b0a03813acc18dab4c070c019b0e723ffb7be41d36955d29d87603689351ecb612a44ff9b70fd83fe6977c5a36f1d7c9cb80b104e28f19ddf23 + checksum: 33b29ada23851e227a1af6e70f22b548f2e137fdd1c9cd5d356b01343f95afb319023f491bf51330f6e2640b243cb6fbb5ac71b319a033fe6ec1ad61293d4889 languageName: node linkType: hard -"@aws-sdk/middleware-host-header@npm:3.282.0": - version: 3.282.0 - resolution: "@aws-sdk/middleware-host-header@npm:3.282.0" +"@aws-sdk/middleware-host-header@npm:3.292.0": + version: 3.292.0 + resolution: "@aws-sdk/middleware-host-header@npm:3.292.0" dependencies: - "@aws-sdk/protocol-http": 3.282.0 - "@aws-sdk/types": 3.272.0 + "@aws-sdk/protocol-http": 3.292.0 + "@aws-sdk/types": 3.292.0 tslib: ^2.3.1 - checksum: 19b5c9284ec5df8732301d5853007613d62ec43657d8793be14bd1dc4b64700748b37d09dbae835750be440faae0105be6d14caaa55f1309842873a701007b72 + checksum: 3f760a3641c07432f3247a07b86ae82d9e4f29ba3b266685e8adac64dc1a5ef510eff467329a514a5ed7a673173869acb88ef7b467ea8b91573841a4028afafa languageName: node linkType: hard -"@aws-sdk/middleware-location-constraint@npm:3.272.0": - version: 3.272.0 - resolution: "@aws-sdk/middleware-location-constraint@npm:3.272.0" +"@aws-sdk/middleware-location-constraint@npm:3.292.0": + version: 3.292.0 + resolution: "@aws-sdk/middleware-location-constraint@npm:3.292.0" dependencies: - "@aws-sdk/types": 3.272.0 + "@aws-sdk/types": 3.292.0 tslib: ^2.3.1 - checksum: 42cb878c4a2b4e1c0884277a9cacc4611111e1d6de649c4fb41f770e60ddceef27de433667c4e4d29882f6c9ad746859e53e0724fbfc5aff23720496a4007a0b + checksum: 1322eb31b0e49093a19c8e62ec324cde79a74a71cf0de9f59856c2dc87b40a1e26f91ea06cd9e2d817bad2dac36a5098aaeacca3cbe3692489413bb7d153c8c1 languageName: node linkType: hard -"@aws-sdk/middleware-logger@npm:3.272.0": - version: 3.272.0 - resolution: "@aws-sdk/middleware-logger@npm:3.272.0" +"@aws-sdk/middleware-logger@npm:3.292.0": + version: 3.292.0 + resolution: "@aws-sdk/middleware-logger@npm:3.292.0" dependencies: - "@aws-sdk/types": 3.272.0 + "@aws-sdk/types": 3.292.0 tslib: ^2.3.1 - checksum: 128163d39522017ffb0099334f283ba82806b0c5b82965b47fff8b3b8648ae2b542b1733c69934bbca65fded9d26b8b93fa587547eeb8db2a3f5249841848f96 + checksum: ad60ad1efefb4c47dc1a3a488cfc959ec1f0a5cf4bb5a4da00fff006e796a8b57a02eca64304048624c4a4757e86834ddc9d2ad25e3539391a694d970b565fb9 languageName: node linkType: hard -"@aws-sdk/middleware-recursion-detection@npm:3.282.0": - version: 3.282.0 - resolution: "@aws-sdk/middleware-recursion-detection@npm:3.282.0" +"@aws-sdk/middleware-recursion-detection@npm:3.292.0": + version: 3.292.0 + resolution: "@aws-sdk/middleware-recursion-detection@npm:3.292.0" dependencies: - "@aws-sdk/protocol-http": 3.282.0 - "@aws-sdk/types": 3.272.0 + "@aws-sdk/protocol-http": 3.292.0 + "@aws-sdk/types": 3.292.0 tslib: ^2.3.1 - checksum: 3e2b43e4e3f8ebb4f02a5bf33b15d95b559e5a35a872a94ca254497fdc896508baa8c316f3bec660d6fad2154041d81a5295be8ed245943dcdb3abc2dd75ef27 + checksum: abbe68e6ef40b4a7541f2398dceeaa4604566f70215ba2884ed1a652cf49991b286270f9983255003d26ca3e62ef8c353c250feccdd796cc45abec2fc3b70bc3 languageName: node linkType: hard -"@aws-sdk/middleware-retry@npm:3.282.0": - version: 3.282.0 - resolution: "@aws-sdk/middleware-retry@npm:3.282.0" +"@aws-sdk/middleware-retry@npm:3.292.0": + version: 3.292.0 + resolution: "@aws-sdk/middleware-retry@npm:3.292.0" dependencies: - "@aws-sdk/protocol-http": 3.282.0 - "@aws-sdk/service-error-classification": 3.272.0 - "@aws-sdk/types": 3.272.0 - "@aws-sdk/util-middleware": 3.272.0 - "@aws-sdk/util-retry": 3.272.0 + "@aws-sdk/protocol-http": 3.292.0 + "@aws-sdk/service-error-classification": 3.292.0 + "@aws-sdk/types": 3.292.0 + "@aws-sdk/util-middleware": 3.292.0 + "@aws-sdk/util-retry": 3.292.0 tslib: ^2.3.1 uuid: ^8.3.2 - checksum: fca7a6c8bac2f52df9987a66f7be5891e85fda0f6eff678ed78bc545ee45e159026d30cc8a136293e731ca69f9e5edc4f9f4895fea73bf28634426d9db0021f6 + checksum: ab96717b699a52122eec940d699f79d5136f022b927a425927a00e42cb02e4353978e623246b3107a9e12f63c8c44aae16a0102ffe6c25f79a906b1698a87bb7 languageName: node linkType: hard -"@aws-sdk/middleware-sdk-s3@npm:3.282.0": - version: 3.282.0 - resolution: "@aws-sdk/middleware-sdk-s3@npm:3.282.0" +"@aws-sdk/middleware-sdk-s3@npm:3.292.0": + version: 3.292.0 + resolution: "@aws-sdk/middleware-sdk-s3@npm:3.292.0" dependencies: - "@aws-sdk/protocol-http": 3.282.0 - "@aws-sdk/types": 3.272.0 - "@aws-sdk/util-arn-parser": 3.208.0 + "@aws-sdk/protocol-http": 3.292.0 + "@aws-sdk/types": 3.292.0 + "@aws-sdk/util-arn-parser": 3.292.0 tslib: ^2.3.1 - checksum: c373dcb455450897075adb943e454da84eae66e6b223a30a80599e2d8a33b61cf1a5e46ec8f7595adfd9059132ce444316f9e376eff6ca121f05b1bb67e99b2b + checksum: 22a118e51c8c0fda76d85794c5b017bc8c8a5a156b72614f05151d9e2b2e2b730fdb35b72a08b227474218fdf5c6b2c9019304baba2dc4761498dd95a3de9ea5 languageName: node linkType: hard -"@aws-sdk/middleware-sdk-sqs@npm:3.272.0": - version: 3.272.0 - resolution: "@aws-sdk/middleware-sdk-sqs@npm:3.272.0" +"@aws-sdk/middleware-sdk-sqs@npm:3.292.0": + version: 3.292.0 + resolution: "@aws-sdk/middleware-sdk-sqs@npm:3.292.0" dependencies: - "@aws-sdk/types": 3.272.0 - "@aws-sdk/util-hex-encoding": 3.201.0 - "@aws-sdk/util-utf8": 3.254.0 + "@aws-sdk/types": 3.292.0 + "@aws-sdk/util-hex-encoding": 3.292.0 + "@aws-sdk/util-utf8": 3.292.0 tslib: ^2.3.1 - checksum: 2338c5865fb797f5e9f0963cf0045e991a9aa816c4fefb86943e129be68ff3b94a662741692999c2a212e4491db299241453d9b432c3eee63781850f22772a29 + checksum: c05ec7552e9f72062208566f1fd9383e7b40caff07a543091ea82b74bb099945c28776957d030e7f7d317cfd3a6fff255d5932c14149971f335008bd1915d994 languageName: node linkType: hard -"@aws-sdk/middleware-sdk-sts@npm:3.282.0": - version: 3.282.0 - resolution: "@aws-sdk/middleware-sdk-sts@npm:3.282.0" +"@aws-sdk/middleware-sdk-sts@npm:3.292.0": + version: 3.292.0 + resolution: "@aws-sdk/middleware-sdk-sts@npm:3.292.0" dependencies: - "@aws-sdk/middleware-signing": 3.282.0 - "@aws-sdk/property-provider": 3.272.0 - "@aws-sdk/protocol-http": 3.282.0 - "@aws-sdk/signature-v4": 3.282.0 - "@aws-sdk/types": 3.272.0 + "@aws-sdk/middleware-signing": 3.292.0 + "@aws-sdk/property-provider": 3.292.0 + "@aws-sdk/protocol-http": 3.292.0 + "@aws-sdk/signature-v4": 3.292.0 + "@aws-sdk/types": 3.292.0 tslib: ^2.3.1 - checksum: bcd2ee00d30191262da5caf5fda4d6c12a9a4aa1ae76693b5e49dc562c89294b4bd133e7036b3811d69806d3d6277848731a3ff8eb919644c33d58909f6ce42e + checksum: bcd719d306befe814111cc4e4a89e08c81c5a28dce18e8b856838f8bd19d336ecfaa3a5a733066fc375ab630421a2156a804df0b1255fb470ea07c2eb5360ace languageName: node linkType: hard -"@aws-sdk/middleware-serde@npm:3.272.0": - version: 3.272.0 - resolution: "@aws-sdk/middleware-serde@npm:3.272.0" +"@aws-sdk/middleware-serde@npm:3.292.0": + version: 3.292.0 + resolution: "@aws-sdk/middleware-serde@npm:3.292.0" dependencies: - "@aws-sdk/types": 3.272.0 + "@aws-sdk/types": 3.292.0 tslib: ^2.3.1 - checksum: d33c07ff8c7fb9682115220ae035de5414124fd81319d7490ed3f2c235b3c0b536634a5939b311dbd735050deca4702503ee26d9e17b97ba8a1ff9e46093573e + checksum: f8d4e246c4fbd86c8071fb69a55721c8641709d0696fc9e4bbaac4de546f402f641f331a16bb5c3b7b28b57ffc84be3cd1e203c7d378438b9cde31104dc7e453 languageName: node linkType: hard -"@aws-sdk/middleware-signing@npm:3.282.0": - version: 3.282.0 - resolution: "@aws-sdk/middleware-signing@npm:3.282.0" +"@aws-sdk/middleware-signing@npm:3.292.0": + version: 3.292.0 + resolution: "@aws-sdk/middleware-signing@npm:3.292.0" dependencies: - "@aws-sdk/property-provider": 3.272.0 - "@aws-sdk/protocol-http": 3.282.0 - "@aws-sdk/signature-v4": 3.282.0 - "@aws-sdk/types": 3.272.0 - "@aws-sdk/util-middleware": 3.272.0 + "@aws-sdk/property-provider": 3.292.0 + "@aws-sdk/protocol-http": 3.292.0 + "@aws-sdk/signature-v4": 3.292.0 + "@aws-sdk/types": 3.292.0 + "@aws-sdk/util-middleware": 3.292.0 tslib: ^2.3.1 - checksum: bf3040f3939430d2d32ccc893103f34a7ffd3d979021a124d6f03e6dbbe3b1537fe8736143ddee20f13170a46e545ed5774dd08bdc0be2d8d9b610dd90949246 + checksum: deb453f7e5d99270780fa3ee5285b5956fd90b9a5b4b37e221d97620df9bb2e30bd84e47f8168cb24849577ec30cf6991d9e57a9ae1b21ffb75d9fd3a4f196e8 languageName: node linkType: hard -"@aws-sdk/middleware-ssec@npm:3.272.0": - version: 3.272.0 - resolution: "@aws-sdk/middleware-ssec@npm:3.272.0" +"@aws-sdk/middleware-ssec@npm:3.292.0": + version: 3.292.0 + resolution: "@aws-sdk/middleware-ssec@npm:3.292.0" dependencies: - "@aws-sdk/types": 3.272.0 + "@aws-sdk/types": 3.292.0 tslib: ^2.3.1 - checksum: 81836fd3235f455d79d7cdc0bc193b321024dab2f6443f16e013c5eb4b3e06c3ca283152cb560f7f2bd2e2accf81f773f95278e8c9094806c1ddb54b5af0db8f + checksum: 4f8cdec2dc55d395575e7265ec1f20d82427298eb887936f8dea3d9d704ba761619a518ae9d130b3e861d7d1f558122b38c5b218ee433dcc9fea17ce2057af8f languageName: node linkType: hard -"@aws-sdk/middleware-stack@npm:3.272.0": - version: 3.272.0 - resolution: "@aws-sdk/middleware-stack@npm:3.272.0" +"@aws-sdk/middleware-stack@npm:3.292.0": + version: 3.292.0 + resolution: "@aws-sdk/middleware-stack@npm:3.292.0" dependencies: tslib: ^2.3.1 - checksum: 7006c4168c2e5c7b15edd4e87001a6e4edbd2f549908ac0e68bb61f12c232048ac1d351b0714e7a79115aeaf251838877b2ef9ac829a6b1ab04913015a3c87a3 + checksum: 8be745177d96cc2f72b02f0b3c9374f0ee08b5c261715a9e86feeaf4bb6bdeacfa9b7dbd7e054145ca3dde9001d38096a311eca2ca02e8432b8266482e6645f2 languageName: node linkType: hard -"@aws-sdk/middleware-user-agent@npm:3.282.0": - version: 3.282.0 - resolution: "@aws-sdk/middleware-user-agent@npm:3.282.0" +"@aws-sdk/middleware-user-agent@npm:3.292.0": + version: 3.292.0 + resolution: "@aws-sdk/middleware-user-agent@npm:3.292.0" dependencies: - "@aws-sdk/protocol-http": 3.282.0 - "@aws-sdk/types": 3.272.0 + "@aws-sdk/protocol-http": 3.292.0 + "@aws-sdk/types": 3.292.0 tslib: ^2.3.1 - checksum: 6ad66ec8517deccb6dbbc1c3241d2afc2fa73d9a3bbaf56f3c1e8adbfd0791391f43058f79f2e2ace40090be481b5bbe8db8a42c0f444fc7cc56666c5ca07c72 + checksum: 66487209f5bba32a35ecde7c4c2e550dbf4da662ce3147160dbc3f095b6b5e87cb8c5f8650b580779606f18de2b9aabafb5bab54072eb2f124b0d076cd758a13 languageName: node linkType: hard -"@aws-sdk/node-config-provider@npm:3.272.0": - version: 3.272.0 - resolution: "@aws-sdk/node-config-provider@npm:3.272.0" +"@aws-sdk/node-config-provider@npm:3.292.0": + version: 3.292.0 + resolution: "@aws-sdk/node-config-provider@npm:3.292.0" dependencies: - "@aws-sdk/property-provider": 3.272.0 - "@aws-sdk/shared-ini-file-loader": 3.272.0 - "@aws-sdk/types": 3.272.0 + "@aws-sdk/property-provider": 3.292.0 + "@aws-sdk/shared-ini-file-loader": 3.292.0 + "@aws-sdk/types": 3.292.0 tslib: ^2.3.1 - checksum: 57f1f107ae4e213ffedf648d46fe0e026af83b13eeb8c13bd8f812cbbb226a0b2c2793afec0e29165ee64cc948182499ad44fe62f63ac58b06d0dd2cab7f1461 + checksum: 3af6a0f0566acdd834aa5f3125bb0837a4fee54930f15621970ea66d1643b75d222ef17a0e8f12a2d191b355f3b10430dfa0bc773a3c59b8a23ad463316d503e languageName: node linkType: hard -"@aws-sdk/node-http-handler@npm:3.282.0, @aws-sdk/node-http-handler@npm:^3.208.0": - version: 3.282.0 - resolution: "@aws-sdk/node-http-handler@npm:3.282.0" +"@aws-sdk/node-http-handler@npm:3.292.0, @aws-sdk/node-http-handler@npm:^3.208.0": + version: 3.292.0 + resolution: "@aws-sdk/node-http-handler@npm:3.292.0" dependencies: - "@aws-sdk/abort-controller": 3.272.0 - "@aws-sdk/protocol-http": 3.282.0 - "@aws-sdk/querystring-builder": 3.272.0 - "@aws-sdk/types": 3.272.0 + "@aws-sdk/abort-controller": 3.292.0 + "@aws-sdk/protocol-http": 3.292.0 + "@aws-sdk/querystring-builder": 3.292.0 + "@aws-sdk/types": 3.292.0 tslib: ^2.3.1 - checksum: 22bbb8cae68c3405f3695de2a4be4d08ade5ffaad5367badcc40dc06ef08ec634fb95953deed58641775265d852f7afb095675d353cd7c82b7cb21881f5cc549 + checksum: b842943bb517b4c9cfb5aa13636463ea3415f0ad87960f0c7e3d6a8165ee722f40aa73d8d1806c5b462a0b26e2003a83f4e00e62e4c266cdbc909b4fa726a603 languageName: node linkType: hard -"@aws-sdk/property-provider@npm:3.272.0": - version: 3.272.0 - resolution: "@aws-sdk/property-provider@npm:3.272.0" +"@aws-sdk/property-provider@npm:3.292.0": + version: 3.292.0 + resolution: "@aws-sdk/property-provider@npm:3.292.0" dependencies: - "@aws-sdk/types": 3.272.0 + "@aws-sdk/types": 3.292.0 tslib: ^2.3.1 - checksum: 7f01794e93276e13339034dac816b2b5da2370fbc1ff304d451e2d0344957e94ba53f5c54de44eca4cb53e2847c7be820db25d6164ca9e489a4a39787fb6c8b3 + checksum: 1c15501edb5eda72a99bcebf8f5c2a7c9d9c60b3708d1b42faefc2a931c08a6c8010733ae88587266eebb70949ab2cb13e5c7f8335af6290c5f33ef288921828 languageName: node linkType: hard -"@aws-sdk/protocol-http@npm:3.208.0": - version: 3.208.0 - resolution: "@aws-sdk/protocol-http@npm:3.208.0" +"@aws-sdk/protocol-http@npm:3.292.0": + version: 3.292.0 + resolution: "@aws-sdk/protocol-http@npm:3.292.0" dependencies: - "@aws-sdk/types": 3.208.0 + "@aws-sdk/types": 3.292.0 tslib: ^2.3.1 - checksum: 6cf57f264a4ef393fbe5fac71f22eaba47bc421646063dac004919ec7185979ed91a3e03c71373749150249f6be4ae41294a4c068d7c22a5990dcd2f5cf8347c + checksum: 4983aa6ae1bdf5dccab71331ae001009c84b5c1d99d05b0f5e5f1c65f56c1295411fd73be4ec88adc1d5f494dce67516c92932e86290879c4a3ca8f0c6f66256 languageName: node linkType: hard -"@aws-sdk/protocol-http@npm:3.282.0": - version: 3.282.0 - resolution: "@aws-sdk/protocol-http@npm:3.282.0" +"@aws-sdk/querystring-builder@npm:3.292.0": + version: 3.292.0 + resolution: "@aws-sdk/querystring-builder@npm:3.292.0" dependencies: - "@aws-sdk/types": 3.272.0 + "@aws-sdk/types": 3.292.0 + "@aws-sdk/util-uri-escape": 3.292.0 tslib: ^2.3.1 - checksum: 5f9d927a69cc1d51767df86d5bfa76f280866e3ef7bcfb8b7b8dab7fc11638ca92d20e3a8a2708a251748c15c0582ad032dfd89aada8ce6068c58605b193e555 + checksum: 134810b9c8a248a13faad270592e75ff5afc6ce0df2598a5f319774b29a5a0cc7a05334e62eb04eda9ce0dc921a4407223e96ed6b6345c0c487814d31d1fdcac languageName: node linkType: hard -"@aws-sdk/querystring-builder@npm:3.208.0": - version: 3.208.0 - resolution: "@aws-sdk/querystring-builder@npm:3.208.0" +"@aws-sdk/querystring-parser@npm:3.292.0": + version: 3.292.0 + resolution: "@aws-sdk/querystring-parser@npm:3.292.0" dependencies: - "@aws-sdk/types": 3.208.0 - "@aws-sdk/util-uri-escape": 3.201.0 + "@aws-sdk/types": 3.292.0 tslib: ^2.3.1 - checksum: 69ff07e2a05ae0979da4e5b12ffb223f0eb037fab079f1f4c245101fdb2d9244454a543dcc829120b882a99a63ecfc950f209ba5a1aaacf94432a35a214c2521 + checksum: 921b15ecc46751b9b0b59b2093f2159ac3fcaecf31a22c34ecb77c8157667cc89528ad0ca3f2298839cff65642f2ec1829510652d334c87f86d9205394256093 languageName: node linkType: hard -"@aws-sdk/querystring-builder@npm:3.272.0": - version: 3.272.0 - resolution: "@aws-sdk/querystring-builder@npm:3.272.0" +"@aws-sdk/service-error-classification@npm:3.292.0": + version: 3.292.0 + resolution: "@aws-sdk/service-error-classification@npm:3.292.0" + checksum: 38b154832b32c9e84a68f77ea7d0da1fc23331cb6f83a774ca9c9ecd577ede506f6245b0e0844f7556d14879219f16dbd8f141d948cc8d19f375008f1800d22b + languageName: node + linkType: hard + +"@aws-sdk/shared-ini-file-loader@npm:3.292.0": + version: 3.292.0 + resolution: "@aws-sdk/shared-ini-file-loader@npm:3.292.0" dependencies: - "@aws-sdk/types": 3.272.0 - "@aws-sdk/util-uri-escape": 3.201.0 + "@aws-sdk/types": 3.292.0 tslib: ^2.3.1 - checksum: 8164bb5547c556a2b3933b0a93d55d9f205ebe096f2dbcea6d3be4aa23bb0b4e7996ba24363b9ac3f80b4026903b267b759efdf9f72379f1eea9250c182238b9 + checksum: da14f79fcdabde68d2c103d61e477f7f90f43d6f41e3cfba7ae1a30b2d06c64121f70e0046f1797a5b8a785ccb8ca1969188a4f8e330a1fb9dac93794e5336f0 languageName: node linkType: hard -"@aws-sdk/querystring-parser@npm:3.272.0": - version: 3.272.0 - resolution: "@aws-sdk/querystring-parser@npm:3.272.0" +"@aws-sdk/signature-v4-multi-region@npm:3.292.0": + version: 3.292.0 + resolution: "@aws-sdk/signature-v4-multi-region@npm:3.292.0" dependencies: - "@aws-sdk/types": 3.272.0 - tslib: ^2.3.1 - checksum: fe5a29a265f48ad02b3161e888a66e4ac08fe07d52a67e811ac1da1734bfa9ac87ead637b595efcbc163f64f2280c8b56c867a8399f4c816b3683b6308837f93 - languageName: node - linkType: hard - -"@aws-sdk/service-error-classification@npm:3.272.0": - version: 3.272.0 - resolution: "@aws-sdk/service-error-classification@npm:3.272.0" - checksum: 9507f74c909a968aa9bf835a05a9cfc93a0892e7c685de37da485e74a61b4fff271621d7c841aa0c9aedbcc57b19f171e6bc74925a82007be6c6750b3c7d0198 - languageName: node - linkType: hard - -"@aws-sdk/shared-ini-file-loader@npm:3.272.0": - version: 3.272.0 - resolution: "@aws-sdk/shared-ini-file-loader@npm:3.272.0" - dependencies: - "@aws-sdk/types": 3.272.0 - tslib: ^2.3.1 - checksum: 1245658ad6efbeda0181aca64b00259749abc76d6200ac8fb481fe627eb88932a5cf2e9c366583ccba9fa540706a08b611552fff5233d66835c0e525c51f97c4 - languageName: node - linkType: hard - -"@aws-sdk/signature-v4-multi-region@npm:3.282.0": - version: 3.282.0 - resolution: "@aws-sdk/signature-v4-multi-region@npm:3.282.0" - dependencies: - "@aws-sdk/protocol-http": 3.282.0 - "@aws-sdk/signature-v4": 3.282.0 - "@aws-sdk/types": 3.272.0 - "@aws-sdk/util-arn-parser": 3.208.0 + "@aws-sdk/protocol-http": 3.292.0 + "@aws-sdk/signature-v4": 3.292.0 + "@aws-sdk/types": 3.292.0 + "@aws-sdk/util-arn-parser": 3.292.0 tslib: ^2.3.1 peerDependencies: "@aws-sdk/signature-v4-crt": ^3.118.0 peerDependenciesMeta: "@aws-sdk/signature-v4-crt": optional: true - checksum: 3f25ba04145d9e274f5bea5ac34de77021c2a06d68085e29cd9bae3b0803aef53a0ab8b184034c67019b7b730730374a9e5a216859ee8f01c11032417ca84f7c + checksum: 27e5a1ddaaffc0fafcb19e75976206c53912c3605924c254abda8d566f43d62f1f7d42d3180d94f1288c32a0dd065aa983ae065e4c5860394073c88b23fc33ca languageName: node linkType: hard -"@aws-sdk/signature-v4@npm:3.282.0": - version: 3.282.0 - resolution: "@aws-sdk/signature-v4@npm:3.282.0" +"@aws-sdk/signature-v4@npm:3.292.0": + version: 3.292.0 + resolution: "@aws-sdk/signature-v4@npm:3.292.0" dependencies: - "@aws-sdk/is-array-buffer": 3.201.0 - "@aws-sdk/types": 3.272.0 - "@aws-sdk/util-hex-encoding": 3.201.0 - "@aws-sdk/util-middleware": 3.272.0 - "@aws-sdk/util-uri-escape": 3.201.0 - "@aws-sdk/util-utf8": 3.254.0 + "@aws-sdk/is-array-buffer": 3.292.0 + "@aws-sdk/types": 3.292.0 + "@aws-sdk/util-hex-encoding": 3.292.0 + "@aws-sdk/util-middleware": 3.292.0 + "@aws-sdk/util-uri-escape": 3.292.0 + "@aws-sdk/util-utf8": 3.292.0 tslib: ^2.3.1 - checksum: ef5a5f32c7671979c173cded5ca4749f3d4d156c67b7de11eac881a0141b2f43cc6ac5f29facd3e6af2a3883775de64d0c2789b2f7ccb1c6d14f0da5e22a58f0 + checksum: b45d1a69f2b5ffa266dd0e7abf08740bb08ac10435e558cc3786a5a5b174ceae8868b9892ccaf7039b84c6c0346ac4cf531ddeba1f5dfa97e5c69ad79f4779fd languageName: node linkType: hard -"@aws-sdk/smithy-client@npm:3.279.0": - version: 3.279.0 - resolution: "@aws-sdk/smithy-client@npm:3.279.0" +"@aws-sdk/smithy-client@npm:3.292.0": + version: 3.292.0 + resolution: "@aws-sdk/smithy-client@npm:3.292.0" dependencies: - "@aws-sdk/middleware-stack": 3.272.0 - "@aws-sdk/types": 3.272.0 + "@aws-sdk/middleware-stack": 3.292.0 + "@aws-sdk/types": 3.292.0 tslib: ^2.3.1 - checksum: 43d933b714ba7249d7f9f007e6e107d88d34e76db2cf934c43f38b6039699da450227f25bf559a3a6f12f9f62c4dec6dd5c4dda2205e6889e7d530521b879d61 + checksum: ffee8a9d3b569fa44bf48440df3abce7fd73204004262728af83a8a74764331205b42927f62ac13e68c6d3c23085ffa93ea62a948af2c8936e19b52d225109d1 languageName: node linkType: hard -"@aws-sdk/token-providers@npm:3.282.0": - version: 3.282.0 - resolution: "@aws-sdk/token-providers@npm:3.282.0" +"@aws-sdk/token-providers@npm:3.292.0": + version: 3.292.0 + resolution: "@aws-sdk/token-providers@npm:3.292.0" dependencies: - "@aws-sdk/client-sso-oidc": 3.282.0 - "@aws-sdk/property-provider": 3.272.0 - "@aws-sdk/shared-ini-file-loader": 3.272.0 - "@aws-sdk/types": 3.272.0 + "@aws-sdk/client-sso-oidc": 3.292.0 + "@aws-sdk/property-provider": 3.292.0 + "@aws-sdk/shared-ini-file-loader": 3.292.0 + "@aws-sdk/types": 3.292.0 tslib: ^2.3.1 - checksum: 064425ec0373269ccc7c4eeb583dd31e79b02af5e4c4ade25258cec59986dd3f8d4d80770d4802b26882dba9a61f66ca9d49d9ade70002417f73bdd46c64bace + checksum: f902dc11def7425e28e3b063ce1feebd399568a4ba90b40622ff5c735860125306f6e9eb1a69179299f4a696fa5755712aad06028a713d832f52abbedb341db7 languageName: node linkType: hard -"@aws-sdk/types@npm:3.208.0": - version: 3.208.0 - resolution: "@aws-sdk/types@npm:3.208.0" - checksum: 3d4eb51720bd20b6811dece5e096ba3b59da842d1c8b2a8e2785e9931d916f41197651da689aa415083e1259e03507b7703ecbbac001b4cdbe68dde2ed94b5cf - languageName: node - linkType: hard - -"@aws-sdk/types@npm:3.272.0, @aws-sdk/types@npm:^3.208.0, @aws-sdk/types@npm:^3.222.0": - version: 3.272.0 - resolution: "@aws-sdk/types@npm:3.272.0" +"@aws-sdk/types@npm:3.292.0, @aws-sdk/types@npm:^3.208.0, @aws-sdk/types@npm:^3.222.0": + version: 3.292.0 + resolution: "@aws-sdk/types@npm:3.292.0" dependencies: tslib: ^2.3.1 - checksum: c4e4f09dd2672eab4fc15b08006c730c1d07d4b54ae35e03167d99f6110751e36b5332165e03c71c28724037f623f8da87a45a018eb631a1ce86d406f9d08da6 + checksum: 0c3c62092f3b400da57cd817d73c7e54bf193f649a508fed550bd927e0307b4f2b873036f8df9977e9f7bf2bcfc4a1233c6f662dcaeea4e049586bea93003cb7 languageName: node linkType: hard -"@aws-sdk/url-parser@npm:3.272.0": - version: 3.272.0 - resolution: "@aws-sdk/url-parser@npm:3.272.0" +"@aws-sdk/url-parser@npm:3.292.0": + version: 3.292.0 + resolution: "@aws-sdk/url-parser@npm:3.292.0" dependencies: - "@aws-sdk/querystring-parser": 3.272.0 - "@aws-sdk/types": 3.272.0 + "@aws-sdk/querystring-parser": 3.292.0 + "@aws-sdk/types": 3.292.0 tslib: ^2.3.1 - checksum: 4a66e733b336b0e28eceef89271f255dcd7079cfa8ba1c854e6c147ced211242e00016e3f22752e5ea3e49b35457568c5ae8df574f729d6e60cd1f5054f5a57d + checksum: 16ce1861c6afe5fe3085f8a9a85fe0b83f870af30b8f75e69a6eccac7f66978461d4753e1ebdc6b3ce34d84bb2df10c4775843a9817d86af521ac350c19f6a30 languageName: node linkType: hard -"@aws-sdk/util-arn-parser@npm:3.208.0, @aws-sdk/util-arn-parser@npm:^3.208.0": - version: 3.208.0 - resolution: "@aws-sdk/util-arn-parser@npm:3.208.0" +"@aws-sdk/util-arn-parser@npm:3.292.0, @aws-sdk/util-arn-parser@npm:^3.208.0": + version: 3.292.0 + resolution: "@aws-sdk/util-arn-parser@npm:3.292.0" dependencies: tslib: ^2.3.1 - checksum: 1e1793adc0c53801b9fd7ccb7e94169dcd984047533c28897aea2af4c4fa02cbc2cd1b5d9b6f34eaf6b9aaa0aba27f927c8e2a58a6b4bb06888cfa68d66b6b2d + checksum: 50bd76e561b035ae1af22a396a665cf9db82c46177e23a8d023a197560365a1e33763782401f454c3de58f0ae9dfc2b88599389f20084da8c046993b7171e2a9 languageName: node linkType: hard -"@aws-sdk/util-base64@npm:3.208.0": - version: 3.208.0 - resolution: "@aws-sdk/util-base64@npm:3.208.0" +"@aws-sdk/util-base64@npm:3.292.0": + version: 3.292.0 + resolution: "@aws-sdk/util-base64@npm:3.292.0" dependencies: - "@aws-sdk/util-buffer-from": 3.208.0 + "@aws-sdk/util-buffer-from": 3.292.0 tslib: ^2.3.1 - checksum: 2ccab3453a3a3636f3f1397441574b3adb984e1ba3865030393108327ed7304cf80c9b31d69691e6aba85cfe6a611a881bbb724e544324240763bb4e96630ed9 + checksum: 4ee530ff15b667963e00fd59202b210a3427f91ab7d88b700bd378b6fa9c9738f4cc106aae9bcf7bf2e9447c84946c73e6ae06d0f42d7bea094954b8c45f3c84 languageName: node linkType: hard -"@aws-sdk/util-body-length-browser@npm:3.188.0": - version: 3.188.0 - resolution: "@aws-sdk/util-body-length-browser@npm:3.188.0" +"@aws-sdk/util-body-length-browser@npm:3.292.0": + version: 3.292.0 + resolution: "@aws-sdk/util-body-length-browser@npm:3.292.0" dependencies: tslib: ^2.3.1 - checksum: 1b08bd1e63ec843ee336f51d894c49bf3c4c2f96e50d1711a12f7d0c5b6f7a15b490e366fec55b63e77036002994bac12927b29de2eb9ac91e4f152b1af78e58 + checksum: 769f8782b0de412a070f13c45885af83b4ee9c1a43051ae26bef236ffb7295ea1aed47fe5494fb820ea603198bf009c7c3b6029d37a4a946b17d248d415811f3 languageName: node linkType: hard -"@aws-sdk/util-body-length-node@npm:3.208.0": - version: 3.208.0 - resolution: "@aws-sdk/util-body-length-node@npm:3.208.0" +"@aws-sdk/util-body-length-node@npm:3.292.0": + version: 3.292.0 + resolution: "@aws-sdk/util-body-length-node@npm:3.292.0" dependencies: tslib: ^2.3.1 - checksum: 986b42b358656dec4e75c231213331c4f01785f9ab17c8b87b6e268b6880818a96117f1785cef9786e6c0f7e2c1332c80e8388a43bfd83e8c7224ad059a72733 + checksum: c0066444c0734b1207e344b95ff71b9859f1ef3f70749fc813d9d1a1da06a46bdfa364809aebbad69fdb5371f038f06b11e9ec54d534870714869dae88facf4a languageName: node linkType: hard -"@aws-sdk/util-buffer-from@npm:3.208.0": - version: 3.208.0 - resolution: "@aws-sdk/util-buffer-from@npm:3.208.0" +"@aws-sdk/util-buffer-from@npm:3.292.0": + version: 3.292.0 + resolution: "@aws-sdk/util-buffer-from@npm:3.292.0" dependencies: - "@aws-sdk/is-array-buffer": 3.201.0 + "@aws-sdk/is-array-buffer": 3.292.0 tslib: ^2.3.1 - checksum: 00bfa4d4494d3a1eb128e19104994d1aca8b3802e9aa218cecafb1ed3ff2ecf5c946485e06aa97ae312458842b0f31a6484dc945232f7cb0e357ba341cb2e53e + checksum: 08e59c3e88bf76ae0149f63101a7a65bed7998f62db4851dfb4cb39b060937c46d6d9a281c4504ce6b816dba33ef64c459e8ffe351388dae3298a661632cf8ea languageName: node linkType: hard -"@aws-sdk/util-config-provider@npm:3.208.0": - version: 3.208.0 - resolution: "@aws-sdk/util-config-provider@npm:3.208.0" +"@aws-sdk/util-config-provider@npm:3.292.0": + version: 3.292.0 + resolution: "@aws-sdk/util-config-provider@npm:3.292.0" dependencies: tslib: ^2.3.1 - checksum: 97b0414b120b4eb53001f3ab2135ee94937e47bd7bd0d0de7c6a7e00a282eaa78cd84be2bfd3e389340f0c0b2f7ba60da9a403f084721970ee55b779ecf7a451 + checksum: d554881b8690ae2a5b594f276528ede52d02719e2d6bcf13fa9f2eba91d7c711e1fc0822db32f0069b4435c8488cb2d3b009385ca932fcb5f9bebc41a6c40c7e languageName: node linkType: hard -"@aws-sdk/util-defaults-mode-browser@npm:3.279.0": - version: 3.279.0 - resolution: "@aws-sdk/util-defaults-mode-browser@npm:3.279.0" +"@aws-sdk/util-defaults-mode-browser@npm:3.292.0": + version: 3.292.0 + resolution: "@aws-sdk/util-defaults-mode-browser@npm:3.292.0" dependencies: - "@aws-sdk/property-provider": 3.272.0 - "@aws-sdk/types": 3.272.0 + "@aws-sdk/property-provider": 3.292.0 + "@aws-sdk/types": 3.292.0 bowser: ^2.11.0 tslib: ^2.3.1 - checksum: 727700ae9c741a24cb8d30991344d778ca5e9ec3ad30364a63f22af8889f03a5fedecad87c76b7022118ab2c6a3dfc48abd530502b7e1f0926bf467081189645 + checksum: 0f372e3425d81cabafe2dde0e51b4373b05da91f2015108779f50206eb7b758f95aaf6f8fcee64090d3940fbd9d4e8c09c83e040ab1618551069dd3e433a122e languageName: node linkType: hard -"@aws-sdk/util-defaults-mode-node@npm:3.282.0": - version: 3.282.0 - resolution: "@aws-sdk/util-defaults-mode-node@npm:3.282.0" +"@aws-sdk/util-defaults-mode-node@npm:3.292.0": + version: 3.292.0 + resolution: "@aws-sdk/util-defaults-mode-node@npm:3.292.0" dependencies: - "@aws-sdk/config-resolver": 3.282.0 - "@aws-sdk/credential-provider-imds": 3.272.0 - "@aws-sdk/node-config-provider": 3.272.0 - "@aws-sdk/property-provider": 3.272.0 - "@aws-sdk/types": 3.272.0 + "@aws-sdk/config-resolver": 3.292.0 + "@aws-sdk/credential-provider-imds": 3.292.0 + "@aws-sdk/node-config-provider": 3.292.0 + "@aws-sdk/property-provider": 3.292.0 + "@aws-sdk/types": 3.292.0 tslib: ^2.3.1 - checksum: 56086b64a65f9999923bbba56c87ecdb886cc729d32683107ae3dd8c9077b6aceecdf2acfc934220522883282f03dd6e37690d242a2d63fee3ec7f3db39cecb7 + checksum: c808df5777e0c0ae2e6941ef63bc3b54bba4ff70c58a6b0f2438f668c3b6e15be0576cdb9f63a093e781ab42232b151eb4ea5375025aa841d34315680b11c0df languageName: node linkType: hard -"@aws-sdk/util-endpoints@npm:3.272.0": - version: 3.272.0 - resolution: "@aws-sdk/util-endpoints@npm:3.272.0" +"@aws-sdk/util-endpoints@npm:3.292.0": + version: 3.292.0 + resolution: "@aws-sdk/util-endpoints@npm:3.292.0" dependencies: - "@aws-sdk/types": 3.272.0 + "@aws-sdk/types": 3.292.0 tslib: ^2.3.1 - checksum: d701e0245930df2000974f9d7c8398fde65924fe5aaa72f2c314fa40a8842e1868a6e285aa78479f741e40b8be54060a4607c9b5b3ac0386839a45df8df238f2 + checksum: 146244ebf0ea2784af1601f469e1a7f60a238e0f2f97cf5c4af6a01f44e51f9a17e7f15f01ee4cc3fcaa8b25edd83e44a1adb41869ad244b036f76316c9c5e72 languageName: node linkType: hard -"@aws-sdk/util-hex-encoding@npm:3.201.0": - version: 3.201.0 - resolution: "@aws-sdk/util-hex-encoding@npm:3.201.0" +"@aws-sdk/util-hex-encoding@npm:3.292.0": + version: 3.292.0 + resolution: "@aws-sdk/util-hex-encoding@npm:3.292.0" dependencies: tslib: ^2.3.1 - checksum: a27f3365dfb1e6ece79ea34fd6e2c4540eb0084536d7300ff0ff42a7334ddf07f21958c6cfd0bbeb71361ee408e16deae2c82b7c7378b048b8e81a52c75f190a + checksum: 5940aa80509395957c08dc59da57727af09bec93f609a7083da4f2469353bc67a52823f9c13d5f9affd4eac59a38e3d24c1d79893fb46db4b9d7c3008e2a9f76 languageName: node linkType: hard @@ -1613,93 +1572,88 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/util-middleware@npm:3.272.0": - version: 3.272.0 - resolution: "@aws-sdk/util-middleware@npm:3.272.0" +"@aws-sdk/util-middleware@npm:3.292.0": + version: 3.292.0 + resolution: "@aws-sdk/util-middleware@npm:3.292.0" dependencies: tslib: ^2.3.1 - checksum: e9a0b55317c474d3eecd65765443eff68f5130ac6f982a41450e0cb949169ff2cf13273282337f2067dfdb5cc7d25137b3bd2fa5f5228cfe541003cf387a6101 + checksum: b49ee36c77d0996f3a7636bdec6685033eebf6385b546d867bd2503747334a67e7d9adc59842f492c269ab8838c38812d0d7d5b7ececc19988c268f33a3bd072 languageName: node linkType: hard -"@aws-sdk/util-retry@npm:3.272.0": - version: 3.272.0 - resolution: "@aws-sdk/util-retry@npm:3.272.0" +"@aws-sdk/util-retry@npm:3.292.0": + version: 3.292.0 + resolution: "@aws-sdk/util-retry@npm:3.292.0" dependencies: - "@aws-sdk/service-error-classification": 3.272.0 + "@aws-sdk/service-error-classification": 3.292.0 tslib: ^2.3.1 - checksum: 7449d9b5daef1244a1601c9892bdd57abeb71ee87357e9dac71d53a77b80648b8cd0db1e99749a76e241ab01fce71a753360d0c8e130f6ae6e71a94b462242f0 + checksum: 6f5d0df53eab52ac9ec8d661ae7c38c7e9b4d57ddaca79524726d6ee98b4e739bd6d0b810c0d3d8aa77ac60ca775d4f803cb5b15d6a262204c18f26ec2924b3c languageName: node linkType: hard -"@aws-sdk/util-stream-browser@npm:3.282.0": - version: 3.282.0 - resolution: "@aws-sdk/util-stream-browser@npm:3.282.0" +"@aws-sdk/util-stream-browser@npm:3.292.0": + version: 3.292.0 + resolution: "@aws-sdk/util-stream-browser@npm:3.292.0" dependencies: - "@aws-sdk/fetch-http-handler": 3.282.0 - "@aws-sdk/types": 3.272.0 - "@aws-sdk/util-base64": 3.208.0 - "@aws-sdk/util-hex-encoding": 3.201.0 - "@aws-sdk/util-utf8": 3.254.0 + "@aws-sdk/fetch-http-handler": 3.292.0 + "@aws-sdk/types": 3.292.0 + "@aws-sdk/util-base64": 3.292.0 + "@aws-sdk/util-hex-encoding": 3.292.0 + "@aws-sdk/util-utf8": 3.292.0 tslib: ^2.3.1 - checksum: 30dda128249c30052cc7d92fbc08c423d03938c202bd95ffcbeb0b72804da19defe742ca702062fd96803381bb508cedc27b4b4bf4d418175f905849352fdf71 + checksum: 8525867445ccd5bfc7da0c8728c13ee902184d675a9a85f46d57bec3d26cceced7576b137db4b0ce164133d64c42867092f8961e4ce52ef1ac47b915b019e0ba languageName: node linkType: hard -"@aws-sdk/util-stream-node@npm:3.282.0, @aws-sdk/util-stream-node@npm:^3.208.0": - version: 3.282.0 - resolution: "@aws-sdk/util-stream-node@npm:3.282.0" +"@aws-sdk/util-stream-node@npm:3.292.0, @aws-sdk/util-stream-node@npm:^3.208.0": + version: 3.292.0 + resolution: "@aws-sdk/util-stream-node@npm:3.292.0" dependencies: - "@aws-sdk/node-http-handler": 3.282.0 - "@aws-sdk/types": 3.272.0 - "@aws-sdk/util-buffer-from": 3.208.0 + "@aws-sdk/node-http-handler": 3.292.0 + "@aws-sdk/types": 3.292.0 + "@aws-sdk/util-buffer-from": 3.292.0 tslib: ^2.3.1 - checksum: 0b19609d0c2608c120e317b6127a49016c90f746e38c300893ee16e276951c294fd4fef8dbee42978e655f34c2c56676e8def637fdb5a3f9284c475c73a67f62 + checksum: d185622ec8a804235ec3f9c25ad275d0c38077427fa1b36cc9702b777d7da71b54b12235cbcdfd014e2d1f6cbb315370ac32480a9ed8dc1efcd6ee27ed577def languageName: node linkType: hard -"@aws-sdk/util-uri-escape@npm:3.201.0": - version: 3.201.0 - resolution: "@aws-sdk/util-uri-escape@npm:3.201.0" +"@aws-sdk/util-uri-escape@npm:3.292.0": + version: 3.292.0 + resolution: "@aws-sdk/util-uri-escape@npm:3.292.0" dependencies: - "@aws-sdk/fetch-http-handler": 3.208.0 - "@aws-sdk/types": 3.208.0 - "@aws-sdk/util-base64": 3.208.0 - "@aws-sdk/util-hex-encoding": 3.201.0 - "@aws-sdk/util-utf8-browser": 3.188.0 tslib: ^2.3.1 - checksum: 8bd751459eaab75a9b61801f3484cfa5c4e0133381ace6ec901cb9b92b1fee99beb4ef9c0f87ade59425a882ed3a280255d9b2fd8da6a6286e49efb9af8f0d55 + checksum: 34cbe5ba5cc2678cfa9d88adb1adab2810f1a7879a105c4a2827a95af8903505190a8fc4d73cfeb3548ae024caf50420e7377120e59bb62018b0c783a9e4fb71 languageName: node linkType: hard -"@aws-sdk/util-user-agent-browser@npm:3.282.0": - version: 3.282.0 - resolution: "@aws-sdk/util-user-agent-browser@npm:3.282.0" +"@aws-sdk/util-user-agent-browser@npm:3.292.0": + version: 3.292.0 + resolution: "@aws-sdk/util-user-agent-browser@npm:3.292.0" dependencies: - "@aws-sdk/types": 3.272.0 + "@aws-sdk/types": 3.292.0 bowser: ^2.11.0 tslib: ^2.3.1 - checksum: cf751b285e57c4d7a00584ac4eab4c27c5fc6d73dc9d6ed8082d297885b262a27bc0a51b882e57779eb807149c27b4d083e07596b99ae145c9acb46f64edf587 + checksum: ececf366f8d40101ea0a72d2791ba0ac6cf4c820263567eb074f4dc7aafc03c8e2152bc05ccf9b0a7c10a50578366d8ec2c42987f9b565f0fb14b33d7dd792a9 languageName: node linkType: hard -"@aws-sdk/util-user-agent-node@npm:3.282.0": - version: 3.282.0 - resolution: "@aws-sdk/util-user-agent-node@npm:3.282.0" +"@aws-sdk/util-user-agent-node@npm:3.292.0": + version: 3.292.0 + resolution: "@aws-sdk/util-user-agent-node@npm:3.292.0" dependencies: - "@aws-sdk/node-config-provider": 3.272.0 - "@aws-sdk/types": 3.272.0 + "@aws-sdk/node-config-provider": 3.292.0 + "@aws-sdk/types": 3.292.0 tslib: ^2.3.1 peerDependencies: aws-crt: ">=1.0.0" peerDependenciesMeta: aws-crt: optional: true - checksum: b13d7e114610c15d0d4d6137e6b6e2ce2d9b696aec1f3ba60515228b9c59068260fb976a0af2d9166705e00c99408c603abf4ebc65384bcd76abfa9003a4afa4 + checksum: 7aa660de99967d33527dec9fc11fa5b311ca0121450627b5f96e6be0bc6db1501694f5fbc036773fecd9b107228f615a239628213b9ab9cde3dc28f49ed92b8a languageName: node linkType: hard -"@aws-sdk/util-utf8-browser@npm:3.188.0, @aws-sdk/util-utf8-browser@npm:^3.0.0": +"@aws-sdk/util-utf8-browser@npm:^3.0.0": version: 3.188.0 resolution: "@aws-sdk/util-utf8-browser@npm:3.188.0" dependencies: @@ -1708,33 +1662,33 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/util-utf8@npm:3.254.0": - version: 3.254.0 - resolution: "@aws-sdk/util-utf8@npm:3.254.0" +"@aws-sdk/util-utf8@npm:3.292.0": + version: 3.292.0 + resolution: "@aws-sdk/util-utf8@npm:3.292.0" dependencies: - "@aws-sdk/util-buffer-from": 3.208.0 + "@aws-sdk/util-buffer-from": 3.292.0 tslib: ^2.3.1 - checksum: e5dfe7565f2de32245a544d1d715d803025bc5522538c0206fa61377f747804d95fc2e5e25976144bb63a6857e360b4286d101e730ab5d39866c60383a47e7d5 + checksum: 7b0177e9e49bf52f95049ea7bc50e3b3552a1785d5511941ce29239fb35c54fcface18d0f1e859c98275e174efb3ad8d00d151224ebfdd39170dc1ace32236a8 languageName: node linkType: hard -"@aws-sdk/util-waiter@npm:3.272.0": - version: 3.272.0 - resolution: "@aws-sdk/util-waiter@npm:3.272.0" +"@aws-sdk/util-waiter@npm:3.292.0": + version: 3.292.0 + resolution: "@aws-sdk/util-waiter@npm:3.292.0" dependencies: - "@aws-sdk/abort-controller": 3.272.0 - "@aws-sdk/types": 3.272.0 + "@aws-sdk/abort-controller": 3.292.0 + "@aws-sdk/types": 3.292.0 tslib: ^2.3.1 - checksum: e931a9359dc582db9e5dcd62539572aecff5320ce424e5462c2f8d4a2d83acde07f87fe9ffc83850aaf70eaf17b06b6ffd4554350bab0f0f3a4427d1b7e776c6 + checksum: eb863d7ceb88830fafc8c76b698912174526a0de42ee3f1b12d5a619a0df9bb00fd7e8d5dfdcc78a6b1deb546d56dc7ca198a9af11e4ad3997c67c622ccde852 languageName: node linkType: hard -"@aws-sdk/xml-builder@npm:3.201.0": - version: 3.201.0 - resolution: "@aws-sdk/xml-builder@npm:3.201.0" +"@aws-sdk/xml-builder@npm:3.292.0": + version: 3.292.0 + resolution: "@aws-sdk/xml-builder@npm:3.292.0" dependencies: tslib: ^2.3.1 - checksum: fd250c2edcf062e79af576fa39d555f624c155540f7bb27da05a400540f3c2ceb89f33841157eda5f4558a0b6c58d2686a105d26f79eeab5790e6b6bfbe18d4a + checksum: b3f9a07b7f33eab08b1a1a3c5df5c9c294903171e721ffbbd524580846991ee3a8de0e7b205ef3b2b17696984eb50e0abb576119c125a762a1d86f43f55e383e languageName: node linkType: hard From a792fc7b14dad1bd4c57555ee11b5ae5a0b7e6b6 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 16 Mar 2023 20:41:53 +0000 Subject: [PATCH 153/177] fix(deps): update aws-sdk-js-v3 monorepo to v3.293.0 Signed-off-by: Renovate Bot --- yarn.lock | 199 +++++++++++++++++++++++++++--------------------------- 1 file changed, 100 insertions(+), 99 deletions(-) diff --git a/yarn.lock b/yarn.lock index b779e006ce..fe223b47ed 100644 --- a/yarn.lock +++ b/yarn.lock @@ -518,15 +518,15 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/client-cognito-identity@npm:3.292.0": - version: 3.292.0 - resolution: "@aws-sdk/client-cognito-identity@npm:3.292.0" +"@aws-sdk/client-cognito-identity@npm:3.293.0": + version: 3.293.0 + resolution: "@aws-sdk/client-cognito-identity@npm:3.293.0" dependencies: "@aws-crypto/sha256-browser": 3.0.0 "@aws-crypto/sha256-js": 3.0.0 - "@aws-sdk/client-sts": 3.292.0 + "@aws-sdk/client-sts": 3.293.0 "@aws-sdk/config-resolver": 3.292.0 - "@aws-sdk/credential-provider-node": 3.292.0 + "@aws-sdk/credential-provider-node": 3.293.0 "@aws-sdk/fetch-http-handler": 3.292.0 "@aws-sdk/hash-node": 3.292.0 "@aws-sdk/invalid-dependency": 3.292.0 @@ -535,11 +535,11 @@ __metadata: "@aws-sdk/middleware-host-header": 3.292.0 "@aws-sdk/middleware-logger": 3.292.0 "@aws-sdk/middleware-recursion-detection": 3.292.0 - "@aws-sdk/middleware-retry": 3.292.0 + "@aws-sdk/middleware-retry": 3.293.0 "@aws-sdk/middleware-serde": 3.292.0 "@aws-sdk/middleware-signing": 3.292.0 "@aws-sdk/middleware-stack": 3.292.0 - "@aws-sdk/middleware-user-agent": 3.292.0 + "@aws-sdk/middleware-user-agent": 3.293.0 "@aws-sdk/node-config-provider": 3.292.0 "@aws-sdk/node-http-handler": 3.292.0 "@aws-sdk/protocol-http": 3.292.0 @@ -551,26 +551,26 @@ __metadata: "@aws-sdk/util-body-length-node": 3.292.0 "@aws-sdk/util-defaults-mode-browser": 3.292.0 "@aws-sdk/util-defaults-mode-node": 3.292.0 - "@aws-sdk/util-endpoints": 3.292.0 + "@aws-sdk/util-endpoints": 3.293.0 "@aws-sdk/util-retry": 3.292.0 "@aws-sdk/util-user-agent-browser": 3.292.0 "@aws-sdk/util-user-agent-node": 3.292.0 "@aws-sdk/util-utf8": 3.292.0 tslib: ^2.3.1 - checksum: 7524dac2fe377609b142792fe10ab25235632c2f25cf82c99d431cd4d884b44ac7f04c8a67705b95e0f1e76182c0e96fecdb6e7c433365e60504f8b931312d16 + checksum: 1902b344dec5807817583bf76df60d13eb62b663b73a3587aad513046f775222644859c5e146ddfc443486436d9912881aa8e00715f8ff26d5e497cf75aea22b languageName: node linkType: hard "@aws-sdk/client-s3@npm:^3.208.0": - version: 3.292.0 - resolution: "@aws-sdk/client-s3@npm:3.292.0" + version: 3.293.0 + resolution: "@aws-sdk/client-s3@npm:3.293.0" dependencies: "@aws-crypto/sha1-browser": 3.0.0 "@aws-crypto/sha256-browser": 3.0.0 "@aws-crypto/sha256-js": 3.0.0 - "@aws-sdk/client-sts": 3.292.0 + "@aws-sdk/client-sts": 3.293.0 "@aws-sdk/config-resolver": 3.292.0 - "@aws-sdk/credential-provider-node": 3.292.0 + "@aws-sdk/credential-provider-node": 3.293.0 "@aws-sdk/eventstream-serde-browser": 3.292.0 "@aws-sdk/eventstream-serde-config-resolver": 3.292.0 "@aws-sdk/eventstream-serde-node": 3.292.0 @@ -589,13 +589,13 @@ __metadata: "@aws-sdk/middleware-location-constraint": 3.292.0 "@aws-sdk/middleware-logger": 3.292.0 "@aws-sdk/middleware-recursion-detection": 3.292.0 - "@aws-sdk/middleware-retry": 3.292.0 + "@aws-sdk/middleware-retry": 3.293.0 "@aws-sdk/middleware-sdk-s3": 3.292.0 "@aws-sdk/middleware-serde": 3.292.0 "@aws-sdk/middleware-signing": 3.292.0 "@aws-sdk/middleware-ssec": 3.292.0 "@aws-sdk/middleware-stack": 3.292.0 - "@aws-sdk/middleware-user-agent": 3.292.0 + "@aws-sdk/middleware-user-agent": 3.293.0 "@aws-sdk/node-config-provider": 3.292.0 "@aws-sdk/node-http-handler": 3.292.0 "@aws-sdk/protocol-http": 3.292.0 @@ -608,7 +608,7 @@ __metadata: "@aws-sdk/util-body-length-node": 3.292.0 "@aws-sdk/util-defaults-mode-browser": 3.292.0 "@aws-sdk/util-defaults-mode-node": 3.292.0 - "@aws-sdk/util-endpoints": 3.292.0 + "@aws-sdk/util-endpoints": 3.293.0 "@aws-sdk/util-retry": 3.292.0 "@aws-sdk/util-stream-browser": 3.292.0 "@aws-sdk/util-stream-node": 3.292.0 @@ -619,19 +619,19 @@ __metadata: "@aws-sdk/xml-builder": 3.292.0 fast-xml-parser: 4.1.2 tslib: ^2.3.1 - checksum: 8de830f1698856dc61c2497f754b9ea76bbff6517deb7091af554670e7ad026f1775cb7943328bab0d7e90a5a8ccb80e5f1bdc60b177da8f15eeddee410b38c2 + checksum: c049bbd40964ebfc189f8a72aed2e5dafcfbc949b4c06a2e811eb0fb58ab34ac681aa039fe7f3473310a9efe226feed889268ff0f44c9eb71805aea3018b5bc7 languageName: node linkType: hard "@aws-sdk/client-sqs@npm:^3.208.0": - version: 3.292.0 - resolution: "@aws-sdk/client-sqs@npm:3.292.0" + version: 3.293.0 + resolution: "@aws-sdk/client-sqs@npm:3.293.0" dependencies: "@aws-crypto/sha256-browser": 3.0.0 "@aws-crypto/sha256-js": 3.0.0 - "@aws-sdk/client-sts": 3.292.0 + "@aws-sdk/client-sts": 3.293.0 "@aws-sdk/config-resolver": 3.292.0 - "@aws-sdk/credential-provider-node": 3.292.0 + "@aws-sdk/credential-provider-node": 3.293.0 "@aws-sdk/fetch-http-handler": 3.292.0 "@aws-sdk/hash-node": 3.292.0 "@aws-sdk/invalid-dependency": 3.292.0 @@ -641,12 +641,12 @@ __metadata: "@aws-sdk/middleware-host-header": 3.292.0 "@aws-sdk/middleware-logger": 3.292.0 "@aws-sdk/middleware-recursion-detection": 3.292.0 - "@aws-sdk/middleware-retry": 3.292.0 + "@aws-sdk/middleware-retry": 3.293.0 "@aws-sdk/middleware-sdk-sqs": 3.292.0 "@aws-sdk/middleware-serde": 3.292.0 "@aws-sdk/middleware-signing": 3.292.0 "@aws-sdk/middleware-stack": 3.292.0 - "@aws-sdk/middleware-user-agent": 3.292.0 + "@aws-sdk/middleware-user-agent": 3.293.0 "@aws-sdk/node-config-provider": 3.292.0 "@aws-sdk/node-http-handler": 3.292.0 "@aws-sdk/protocol-http": 3.292.0 @@ -658,20 +658,20 @@ __metadata: "@aws-sdk/util-body-length-node": 3.292.0 "@aws-sdk/util-defaults-mode-browser": 3.292.0 "@aws-sdk/util-defaults-mode-node": 3.292.0 - "@aws-sdk/util-endpoints": 3.292.0 + "@aws-sdk/util-endpoints": 3.293.0 "@aws-sdk/util-retry": 3.292.0 "@aws-sdk/util-user-agent-browser": 3.292.0 "@aws-sdk/util-user-agent-node": 3.292.0 "@aws-sdk/util-utf8": 3.292.0 fast-xml-parser: 4.1.2 tslib: ^2.3.1 - checksum: ef734101eede788fa2e2a7d0c5032c440d9a8604d854444c8efe73de52bd765c7d8d7f5f0126fed85f4418678a861c3fb8bf6e482da4790d7d56187f2c1e4e62 + checksum: d07b9729ac138e71c789851d146a7632fdf1a50cb8d23a85af14b957bc23d18dbd42d291e04ee1df52844f75168e71818a3d2d962dc47a530350d760fefd8300 languageName: node linkType: hard -"@aws-sdk/client-sso-oidc@npm:3.292.0": - version: 3.292.0 - resolution: "@aws-sdk/client-sso-oidc@npm:3.292.0" +"@aws-sdk/client-sso-oidc@npm:3.293.0": + version: 3.293.0 + resolution: "@aws-sdk/client-sso-oidc@npm:3.293.0" dependencies: "@aws-crypto/sha256-browser": 3.0.0 "@aws-crypto/sha256-js": 3.0.0 @@ -684,10 +684,10 @@ __metadata: "@aws-sdk/middleware-host-header": 3.292.0 "@aws-sdk/middleware-logger": 3.292.0 "@aws-sdk/middleware-recursion-detection": 3.292.0 - "@aws-sdk/middleware-retry": 3.292.0 + "@aws-sdk/middleware-retry": 3.293.0 "@aws-sdk/middleware-serde": 3.292.0 "@aws-sdk/middleware-stack": 3.292.0 - "@aws-sdk/middleware-user-agent": 3.292.0 + "@aws-sdk/middleware-user-agent": 3.293.0 "@aws-sdk/node-config-provider": 3.292.0 "@aws-sdk/node-http-handler": 3.292.0 "@aws-sdk/protocol-http": 3.292.0 @@ -699,19 +699,19 @@ __metadata: "@aws-sdk/util-body-length-node": 3.292.0 "@aws-sdk/util-defaults-mode-browser": 3.292.0 "@aws-sdk/util-defaults-mode-node": 3.292.0 - "@aws-sdk/util-endpoints": 3.292.0 + "@aws-sdk/util-endpoints": 3.293.0 "@aws-sdk/util-retry": 3.292.0 "@aws-sdk/util-user-agent-browser": 3.292.0 "@aws-sdk/util-user-agent-node": 3.292.0 "@aws-sdk/util-utf8": 3.292.0 tslib: ^2.3.1 - checksum: 66eb1db43d5c81ebe8a7905517209bdd7a04e45a87aa6b2c31ca25825d9f11d82e42835f2425fd39cc0dc815603363824cf3da9526475af400ccba86ea68d621 + checksum: 4137f631355f75f7eea083b3e172dcbd67b1e7701cfe02fb21c922a39aa0d4f80171458473833d72150341f2320fc21fef74bb5cffdd15b4723f719c8caa4bce languageName: node linkType: hard -"@aws-sdk/client-sso@npm:3.292.0": - version: 3.292.0 - resolution: "@aws-sdk/client-sso@npm:3.292.0" +"@aws-sdk/client-sso@npm:3.293.0": + version: 3.293.0 + resolution: "@aws-sdk/client-sso@npm:3.293.0" dependencies: "@aws-crypto/sha256-browser": 3.0.0 "@aws-crypto/sha256-js": 3.0.0 @@ -724,10 +724,10 @@ __metadata: "@aws-sdk/middleware-host-header": 3.292.0 "@aws-sdk/middleware-logger": 3.292.0 "@aws-sdk/middleware-recursion-detection": 3.292.0 - "@aws-sdk/middleware-retry": 3.292.0 + "@aws-sdk/middleware-retry": 3.293.0 "@aws-sdk/middleware-serde": 3.292.0 "@aws-sdk/middleware-stack": 3.292.0 - "@aws-sdk/middleware-user-agent": 3.292.0 + "@aws-sdk/middleware-user-agent": 3.293.0 "@aws-sdk/node-config-provider": 3.292.0 "@aws-sdk/node-http-handler": 3.292.0 "@aws-sdk/protocol-http": 3.292.0 @@ -739,24 +739,24 @@ __metadata: "@aws-sdk/util-body-length-node": 3.292.0 "@aws-sdk/util-defaults-mode-browser": 3.292.0 "@aws-sdk/util-defaults-mode-node": 3.292.0 - "@aws-sdk/util-endpoints": 3.292.0 + "@aws-sdk/util-endpoints": 3.293.0 "@aws-sdk/util-retry": 3.292.0 "@aws-sdk/util-user-agent-browser": 3.292.0 "@aws-sdk/util-user-agent-node": 3.292.0 "@aws-sdk/util-utf8": 3.292.0 tslib: ^2.3.1 - checksum: 6d8523cc18cfd3ba3be6ee3f80cfb1466f6814a57deeaf933f5096d19c505a25c3a94daf348d92d91acb76cd6ccbaa6db14663842a50fe2040e8f4b410125256 + checksum: a502dddebf8905b765f1bf126435d7948ac32e857f0127ac68e3fb1328cacaa660eed026d264853c7a6da39126cbcfedd5b022a1073525ea8ee66c409157b9a4 languageName: node linkType: hard -"@aws-sdk/client-sts@npm:3.292.0, @aws-sdk/client-sts@npm:^3.208.0": - version: 3.292.0 - resolution: "@aws-sdk/client-sts@npm:3.292.0" +"@aws-sdk/client-sts@npm:3.293.0, @aws-sdk/client-sts@npm:^3.208.0": + version: 3.293.0 + resolution: "@aws-sdk/client-sts@npm:3.293.0" dependencies: "@aws-crypto/sha256-browser": 3.0.0 "@aws-crypto/sha256-js": 3.0.0 "@aws-sdk/config-resolver": 3.292.0 - "@aws-sdk/credential-provider-node": 3.292.0 + "@aws-sdk/credential-provider-node": 3.293.0 "@aws-sdk/fetch-http-handler": 3.292.0 "@aws-sdk/hash-node": 3.292.0 "@aws-sdk/invalid-dependency": 3.292.0 @@ -765,12 +765,12 @@ __metadata: "@aws-sdk/middleware-host-header": 3.292.0 "@aws-sdk/middleware-logger": 3.292.0 "@aws-sdk/middleware-recursion-detection": 3.292.0 - "@aws-sdk/middleware-retry": 3.292.0 + "@aws-sdk/middleware-retry": 3.293.0 "@aws-sdk/middleware-sdk-sts": 3.292.0 "@aws-sdk/middleware-serde": 3.292.0 "@aws-sdk/middleware-signing": 3.292.0 "@aws-sdk/middleware-stack": 3.292.0 - "@aws-sdk/middleware-user-agent": 3.292.0 + "@aws-sdk/middleware-user-agent": 3.293.0 "@aws-sdk/node-config-provider": 3.292.0 "@aws-sdk/node-http-handler": 3.292.0 "@aws-sdk/protocol-http": 3.292.0 @@ -782,14 +782,14 @@ __metadata: "@aws-sdk/util-body-length-node": 3.292.0 "@aws-sdk/util-defaults-mode-browser": 3.292.0 "@aws-sdk/util-defaults-mode-node": 3.292.0 - "@aws-sdk/util-endpoints": 3.292.0 + "@aws-sdk/util-endpoints": 3.293.0 "@aws-sdk/util-retry": 3.292.0 "@aws-sdk/util-user-agent-browser": 3.292.0 "@aws-sdk/util-user-agent-node": 3.292.0 "@aws-sdk/util-utf8": 3.292.0 fast-xml-parser: 4.1.2 tslib: ^2.3.1 - checksum: 00fc2f435430d43816c527dc681c462dc3cc25c427f128570db3e33f7a03963a848f000b9678526277f5b636236ac3456984e6c19e4e0ed75609ba9b15b50e0c + checksum: c99efc08e494098436fef2ba1321fa8362008d9190fcafff0694490f09f7bed76cc16c24b0d938c0d143255149efa6bffd8a568ecca5eab5fb103eba57f61966 languageName: node linkType: hard @@ -806,15 +806,15 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/credential-provider-cognito-identity@npm:3.292.0": - version: 3.292.0 - resolution: "@aws-sdk/credential-provider-cognito-identity@npm:3.292.0" +"@aws-sdk/credential-provider-cognito-identity@npm:3.293.0": + version: 3.293.0 + resolution: "@aws-sdk/credential-provider-cognito-identity@npm:3.293.0" dependencies: - "@aws-sdk/client-cognito-identity": 3.292.0 + "@aws-sdk/client-cognito-identity": 3.293.0 "@aws-sdk/property-provider": 3.292.0 "@aws-sdk/types": 3.292.0 tslib: ^2.3.1 - checksum: 19f690b03876dfbfe7f1c2f0bb28445980d1178794683ec0487e0c178300ba754f98b420a6c8ad37a5af5abafc1d4da76e33e3528b03347c96879e56b3ec0de0 + checksum: e23bcc010cf8002e4264b3074af6734f9fb81a8d556d453f19196765174ff313173749e2c17a76f9e7c4a485b82cb5f91a7d55e7742f5262fde5c7b93e279b9d languageName: node linkType: hard @@ -842,38 +842,38 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/credential-provider-ini@npm:3.292.0": - version: 3.292.0 - resolution: "@aws-sdk/credential-provider-ini@npm:3.292.0" +"@aws-sdk/credential-provider-ini@npm:3.293.0": + version: 3.293.0 + resolution: "@aws-sdk/credential-provider-ini@npm:3.293.0" dependencies: "@aws-sdk/credential-provider-env": 3.292.0 "@aws-sdk/credential-provider-imds": 3.292.0 "@aws-sdk/credential-provider-process": 3.292.0 - "@aws-sdk/credential-provider-sso": 3.292.0 + "@aws-sdk/credential-provider-sso": 3.293.0 "@aws-sdk/credential-provider-web-identity": 3.292.0 "@aws-sdk/property-provider": 3.292.0 "@aws-sdk/shared-ini-file-loader": 3.292.0 "@aws-sdk/types": 3.292.0 tslib: ^2.3.1 - checksum: cc46fac892e508ffc3a8ef9f2a04657fd4f9e9e79c09ec3feeab7300d8d1a4d9742a8ad086eea403a5ecad468ed89dbe72b6f804796c11a1634562292e03517f + checksum: 7fafb9ada9e0eec303b46bb02f392c0ff63861214df9345f6e4678d158d573cc2d5f941e25e8bad1491fc67f6913053e72cf6327ac4432fe4f7e70b68cdaeef3 languageName: node linkType: hard -"@aws-sdk/credential-provider-node@npm:3.292.0, @aws-sdk/credential-provider-node@npm:^3.208.0": - version: 3.292.0 - resolution: "@aws-sdk/credential-provider-node@npm:3.292.0" +"@aws-sdk/credential-provider-node@npm:3.293.0, @aws-sdk/credential-provider-node@npm:^3.208.0": + version: 3.293.0 + resolution: "@aws-sdk/credential-provider-node@npm:3.293.0" dependencies: "@aws-sdk/credential-provider-env": 3.292.0 "@aws-sdk/credential-provider-imds": 3.292.0 - "@aws-sdk/credential-provider-ini": 3.292.0 + "@aws-sdk/credential-provider-ini": 3.293.0 "@aws-sdk/credential-provider-process": 3.292.0 - "@aws-sdk/credential-provider-sso": 3.292.0 + "@aws-sdk/credential-provider-sso": 3.293.0 "@aws-sdk/credential-provider-web-identity": 3.292.0 "@aws-sdk/property-provider": 3.292.0 "@aws-sdk/shared-ini-file-loader": 3.292.0 "@aws-sdk/types": 3.292.0 tslib: ^2.3.1 - checksum: c298775fde4f85a0db5465b6782caf6242eacc93737d457f17ce76742553c51d1c16907a326a0e860e35893f575a6c6f7f922a9cd91a32425ffa01d56d97e686 + checksum: c0ff0ef0f4983ed6b56d73e910fb2a1f9ad43faf9cd9067fb6f276dd384e23ef7035016ff339273c9a2dfba1e4d0a27887f22acc86fb0d65018c85c5e1f6b1ab languageName: node linkType: hard @@ -889,17 +889,17 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/credential-provider-sso@npm:3.292.0": - version: 3.292.0 - resolution: "@aws-sdk/credential-provider-sso@npm:3.292.0" +"@aws-sdk/credential-provider-sso@npm:3.293.0": + version: 3.293.0 + resolution: "@aws-sdk/credential-provider-sso@npm:3.293.0" dependencies: - "@aws-sdk/client-sso": 3.292.0 + "@aws-sdk/client-sso": 3.293.0 "@aws-sdk/property-provider": 3.292.0 "@aws-sdk/shared-ini-file-loader": 3.292.0 - "@aws-sdk/token-providers": 3.292.0 + "@aws-sdk/token-providers": 3.293.0 "@aws-sdk/types": 3.292.0 tslib: ^2.3.1 - checksum: 925511e0393d1a011dc123b34b0d9b8e6a18f8ead6695d5b7d0ad3b681024f39878feb258f48003adbea2e6eceb2b4191127e9aebfe73d3ee40d894c48433248 + checksum: 75fa91c622d526ebfee18d83e1eeeeac12f2069abae5d7921a1df21b85dd241da2d67b9976522f2efdfc319d53334e89b3715df4c4a857bf3978d38a3326dd00 languageName: node linkType: hard @@ -915,25 +915,25 @@ __metadata: linkType: hard "@aws-sdk/credential-providers@npm:^3.208.0": - version: 3.292.0 - resolution: "@aws-sdk/credential-providers@npm:3.292.0" + version: 3.293.0 + resolution: "@aws-sdk/credential-providers@npm:3.293.0" dependencies: - "@aws-sdk/client-cognito-identity": 3.292.0 - "@aws-sdk/client-sso": 3.292.0 - "@aws-sdk/client-sts": 3.292.0 - "@aws-sdk/credential-provider-cognito-identity": 3.292.0 + "@aws-sdk/client-cognito-identity": 3.293.0 + "@aws-sdk/client-sso": 3.293.0 + "@aws-sdk/client-sts": 3.293.0 + "@aws-sdk/credential-provider-cognito-identity": 3.293.0 "@aws-sdk/credential-provider-env": 3.292.0 "@aws-sdk/credential-provider-imds": 3.292.0 - "@aws-sdk/credential-provider-ini": 3.292.0 - "@aws-sdk/credential-provider-node": 3.292.0 + "@aws-sdk/credential-provider-ini": 3.293.0 + "@aws-sdk/credential-provider-node": 3.293.0 "@aws-sdk/credential-provider-process": 3.292.0 - "@aws-sdk/credential-provider-sso": 3.292.0 + "@aws-sdk/credential-provider-sso": 3.293.0 "@aws-sdk/credential-provider-web-identity": 3.292.0 "@aws-sdk/property-provider": 3.292.0 "@aws-sdk/shared-ini-file-loader": 3.292.0 "@aws-sdk/types": 3.292.0 tslib: ^2.3.1 - checksum: 1f504ff89a0112382db0c2d190efbf872ffd69a7ca136ee108df352ec49d76951d84146faa188195e90cd922e967bb68fb72fe5b443d93caab0f4254bc109aaa + checksum: cca87d8518e353612c610e8c81944452d4461733d317f68fa29b819eac4741fe7438bc90261c67bd4284721158ce710c1ca7130e5e09eb3ad4f6174f2c14d34b languageName: node linkType: hard @@ -1060,8 +1060,8 @@ __metadata: linkType: hard "@aws-sdk/lib-storage@npm:^3.208.0": - version: 3.292.0 - resolution: "@aws-sdk/lib-storage@npm:3.292.0" + version: 3.293.0 + resolution: "@aws-sdk/lib-storage@npm:3.293.0" dependencies: "@aws-sdk/middleware-endpoint": 3.292.0 "@aws-sdk/smithy-client": 3.292.0 @@ -1072,7 +1072,7 @@ __metadata: peerDependencies: "@aws-sdk/abort-controller": ^3.0.0 "@aws-sdk/client-s3": ^3.0.0 - checksum: e3edcca24e740598b2ec9e6ece20b36efa323287d25360e4ad8e001ba985bdc775f322065d943fcd9177374826b4d22c6df7b219a2d24fa2f4f64b64e2f6d67c + checksum: 99742e84bc4c4c18e0d9863cfd5d84dfcad2c57d83b1766973f5440840b0185264a069e172b504e212f5d8c9d0e38cd11ed2d5a06ecfcb93edb11ea44cc2cf92 languageName: node linkType: hard @@ -1195,9 +1195,9 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/middleware-retry@npm:3.292.0": - version: 3.292.0 - resolution: "@aws-sdk/middleware-retry@npm:3.292.0" +"@aws-sdk/middleware-retry@npm:3.293.0": + version: 3.293.0 + resolution: "@aws-sdk/middleware-retry@npm:3.293.0" dependencies: "@aws-sdk/protocol-http": 3.292.0 "@aws-sdk/service-error-classification": 3.292.0 @@ -1206,7 +1206,7 @@ __metadata: "@aws-sdk/util-retry": 3.292.0 tslib: ^2.3.1 uuid: ^8.3.2 - checksum: ab96717b699a52122eec940d699f79d5136f022b927a425927a00e42cb02e4353978e623246b3107a9e12f63c8c44aae16a0102ffe6c25f79a906b1698a87bb7 + checksum: 249094515c4353142846b8dbdf9365f6cccdad69cad8f8028fd03ffeb533fade46be1a781feb60089a9321eda720959ef2f1f25329defa1affc40a889a8ed5d3 languageName: node linkType: hard @@ -1291,14 +1291,15 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/middleware-user-agent@npm:3.292.0": - version: 3.292.0 - resolution: "@aws-sdk/middleware-user-agent@npm:3.292.0" +"@aws-sdk/middleware-user-agent@npm:3.293.0": + version: 3.293.0 + resolution: "@aws-sdk/middleware-user-agent@npm:3.293.0" dependencies: "@aws-sdk/protocol-http": 3.292.0 "@aws-sdk/types": 3.292.0 + "@aws-sdk/util-endpoints": 3.293.0 tslib: ^2.3.1 - checksum: 66487209f5bba32a35ecde7c4c2e550dbf4da662ce3147160dbc3f095b6b5e87cb8c5f8650b580779606f18de2b9aabafb5bab54072eb2f124b0d076cd758a13 + checksum: 315c11feb58e99625380a4f1274bcdd54a275dc323bab789a809911d66e86cde15d2a9fc536e31cef6621325aed80fb0cb7cb524dd707bcb5fb8b1a1284e87e3 languageName: node linkType: hard @@ -1429,16 +1430,16 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/token-providers@npm:3.292.0": - version: 3.292.0 - resolution: "@aws-sdk/token-providers@npm:3.292.0" +"@aws-sdk/token-providers@npm:3.293.0": + version: 3.293.0 + resolution: "@aws-sdk/token-providers@npm:3.293.0" dependencies: - "@aws-sdk/client-sso-oidc": 3.292.0 + "@aws-sdk/client-sso-oidc": 3.293.0 "@aws-sdk/property-provider": 3.292.0 "@aws-sdk/shared-ini-file-loader": 3.292.0 "@aws-sdk/types": 3.292.0 tslib: ^2.3.1 - checksum: f902dc11def7425e28e3b063ce1feebd399568a4ba90b40622ff5c735860125306f6e9eb1a69179299f4a696fa5755712aad06028a713d832f52abbedb341db7 + checksum: 3a12f7f190e34e7341bff58d273706176538662bc1435637f866444233035ac142aabdb9fb7529d75b4d224fd3c739878ebd6a19f5fefb0ee054f63627cc3d2f languageName: node linkType: hard @@ -1544,13 +1545,13 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/util-endpoints@npm:3.292.0": - version: 3.292.0 - resolution: "@aws-sdk/util-endpoints@npm:3.292.0" +"@aws-sdk/util-endpoints@npm:3.293.0": + version: 3.293.0 + resolution: "@aws-sdk/util-endpoints@npm:3.293.0" dependencies: "@aws-sdk/types": 3.292.0 tslib: ^2.3.1 - checksum: 146244ebf0ea2784af1601f469e1a7f60a238e0f2f97cf5c4af6a01f44e51f9a17e7f15f01ee4cc3fcaa8b25edd83e44a1adb41869ad244b036f76316c9c5e72 + checksum: 801602e9b4317cb1250e626167525dfe354a790bf243a63de3325f255c5d53a759bd6bd5aa1c35837be2a1960025d02070038747dac7a6909579c33c0bd1cb1f languageName: node linkType: hard From f2ccb790a3e7118e9681159a6eeb53d33ef90df1 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 16 Mar 2023 20:42:19 +0000 Subject: [PATCH 154/177] fix(deps): update dependency @tanstack/react-query to v4.26.1 Signed-off-by: Renovate Bot --- yarn.lock | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/yarn.lock b/yarn.lock index b779e006ce..be7cfedbb9 100644 --- a/yarn.lock +++ b/yarn.lock @@ -13765,18 +13765,18 @@ __metadata: languageName: node linkType: hard -"@tanstack/query-core@npm:4.24.10": - version: 4.24.10 - resolution: "@tanstack/query-core@npm:4.24.10" - checksum: 8268b9dca4a2ed39f8575976d8a3e2f839bb6f4fb821dc00ba8e2aeffffe2f73e23344bcc24b9cb6dae9dbfe3ba2b14c76a1e0a38b4064c83beb9aa607fd94bc +"@tanstack/query-core@npm:4.26.1": + version: 4.26.1 + resolution: "@tanstack/query-core@npm:4.26.1" + checksum: c7bc751d7d08ce27dd7262aa75a263808b128902b8f3a5dd1ff9b1dfda6511af965388bcdb7d8130bdf10756c1d583f527ead274b1d3e4f4db29c83260b416b0 languageName: node linkType: hard "@tanstack/react-query@npm:^4.1.3": - version: 4.24.10 - resolution: "@tanstack/react-query@npm:4.24.10" + version: 4.26.1 + resolution: "@tanstack/react-query@npm:4.26.1" dependencies: - "@tanstack/query-core": 4.24.10 + "@tanstack/query-core": 4.26.1 use-sync-external-store: ^1.2.0 peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 @@ -13787,7 +13787,7 @@ __metadata: optional: true react-native: optional: true - checksum: 576a2c73e98cf6a3c9584283989383d5ac63b01efe546cc7580ec7b1edf0c0cb8958a3071778cb0af908f5269d45c7516fa388e5f856e37f5b2d3c6110974cbe + checksum: 3b43a5acc84841364c08ed7c7d0f495008214f1f39b7fb073a95a53528ce40b4841dbc407070b4c0082d73990277bbcf9bc88df40217e70c226be4931efaa081 languageName: node linkType: hard From 2942b04f0c945758a5ba6ad704e43f10d3fa8a9b Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 16 Mar 2023 21:21:26 +0000 Subject: [PATCH 155/177] fix(deps): update dependency core-js to v3.29.1 Signed-off-by: Renovate Bot --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index be7cfedbb9..ff280b0585 100644 --- a/yarn.lock +++ b/yarn.lock @@ -19480,9 +19480,9 @@ __metadata: linkType: hard "core-js@npm:^3.6.5": - version: 3.28.0 - resolution: "core-js@npm:3.28.0" - checksum: 3155fd0ec16d0089106b145e9595280a4ea4bde0d7ff26aa14364cd4f1c203baf6620c3025acd284f363d08b9f21104101692766ca9a36ffeee7307bdf3e1881 + version: 3.29.1 + resolution: "core-js@npm:3.29.1" + checksum: b38446dbfcfd3887b3d4922990da487e2c95044cb4c5717aaf95e786a4c6b218f05c056c7ed6c699169b9794a49fec890e402659d54661fc56965a0eb717e7bd languageName: node linkType: hard From 0b5febcd753f5bc62924ef60de20032ce7d90923 Mon Sep 17 00:00:00 2001 From: Aramis Sennyey Date: Thu, 16 Mar 2023 17:36:39 -0400 Subject: [PATCH 156/177] Make callbackUrl optional. Signed-off-by: Aramis Sennyey --- plugins/auth-backend/config.d.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/auth-backend/config.d.ts b/plugins/auth-backend/config.d.ts index cdd3fe1bf0..8d76ca8bf5 100644 --- a/plugins/auth-backend/config.d.ts +++ b/plugins/auth-backend/config.d.ts @@ -68,7 +68,7 @@ export interface Config { * @visibility secret */ clientSecret: string; - callbackUrl: string; + callbackUrl?: string; }; }; github?: { From a0aed0b80fb15ab81b11cfef62c87c5c61312937 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 16 Mar 2023 22:11:55 +0000 Subject: [PATCH 157/177] fix(deps): update dependency cron to v2.3.0 Signed-off-by: Renovate Bot --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index e340256fda..0959e52bd9 100644 --- a/yarn.lock +++ b/yarn.lock @@ -19626,11 +19626,11 @@ __metadata: linkType: hard "cron@npm:^2.0.0": - version: 2.2.0 - resolution: "cron@npm:2.2.0" + version: 2.3.0 + resolution: "cron@npm:2.3.0" dependencies: luxon: ^3.2.1 - checksum: 53905d0f55e052742cf4fed34598a4ebfc311f4f9143c90384225bb4376fa639cd12f485cbf5d3dca00db377bf5117f27a1cae405f15e4745d1f69808e4fb9ac + checksum: 70b220f3fc4b6bcd594f7f2c690bbf7a3a03b0e081eb0119f8e3ca21635f2da07d89e038d561d4c0742c8b0dd04977f25e307d0608455ef9f527a556b2da92fc languageName: node linkType: hard From f0ffebb67afc1b5cf7bfbe32c90f58503245f300 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 16 Mar 2023 22:12:20 +0000 Subject: [PATCH 158/177] fix(deps): update dependency elastic-builder to v2.18.1 Signed-off-by: Renovate Bot --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index e340256fda..9038d82b8c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -21139,8 +21139,8 @@ __metadata: linkType: hard "elastic-builder@npm:^2.16.0": - version: 2.17.3 - resolution: "elastic-builder@npm:2.17.3" + version: 2.18.1 + resolution: "elastic-builder@npm:2.18.1" dependencies: lodash.has: ^4.5.2 lodash.hasin: ^4.5.2 @@ -21150,7 +21150,7 @@ __metadata: lodash.isobject: ^3.0.2 lodash.isstring: ^4.0.1 lodash.omit: ^4.5.0 - checksum: b1e47ad4d36e9974a1075e9e4f455e2d120eebc16d9e5c7e7219e89fcb64bcacd3015afddeae479a79f6b4cd92c4528f3e8535c9c9ca8d644286b9bb49635cdc + checksum: 54093daadc1fc3666ac8eef0a268267761e92a3fbb524e51936cf944ceeaeb231a269fc8ae9fb902ca41c976c76c0c037da692a34577d705da301ed727bd8e07 languageName: node linkType: hard From 519c95171dc561737a1d827cbdffaedba202f0d1 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 17 Mar 2023 00:25:34 +0000 Subject: [PATCH 159/177] fix(deps): update dependency eslint-config-prettier to v8.7.0 Signed-off-by: Renovate Bot --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 80d2be3125..9d53979c85 100644 --- a/yarn.lock +++ b/yarn.lock @@ -21886,13 +21886,13 @@ __metadata: linkType: hard "eslint-config-prettier@npm:^8.3.0": - version: 8.6.0 - resolution: "eslint-config-prettier@npm:8.6.0" + version: 8.7.0 + resolution: "eslint-config-prettier@npm:8.7.0" peerDependencies: eslint: ">=7.0.0" bin: eslint-config-prettier: bin/cli.js - checksum: ff0d0dfc839a556355422293428637e8d35693de58dabf8638bf0b6529131a109d0b2ade77521aa6e54573bb842d7d9d322e465dd73dd61c7590fa3834c3fa81 + checksum: b05bc7f2296ce3e0925c14147849706544870e0382d38af2352d709a6cf8521bdaff2bd8e5021f1780e570775a8ffa1d2bac28b8065d90d43a3f1f98fd26ce52 languageName: node linkType: hard From 9c276fd3fc9cbac8fd69564d45e85b21c64633b1 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 17 Mar 2023 00:25:59 +0000 Subject: [PATCH 160/177] fix(deps): update dependency graphql-ws to v5.12.0 Signed-off-by: Renovate Bot --- yarn.lock | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/yarn.lock b/yarn.lock index 80d2be3125..c24819938f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -24280,7 +24280,7 @@ __metadata: languageName: node linkType: hard -"graphql-ws@npm:5.11.2, graphql-ws@npm:^5.4.1, graphql-ws@npm:^5.9.0": +"graphql-ws@npm:5.11.2": version: 5.11.2 resolution: "graphql-ws@npm:5.11.2" peerDependencies: @@ -24289,6 +24289,15 @@ __metadata: languageName: node linkType: hard +"graphql-ws@npm:^5.4.1, graphql-ws@npm:^5.9.0": + version: 5.12.0 + resolution: "graphql-ws@npm:5.12.0" + peerDependencies: + graphql: ">=0.11 <=16" + checksum: 5c683e2d5bdadfcfec0639eda69b8a66ef275e68e64f662bd75da6779a87b34395cbce8e37cb66830a9febca1871f7dc2575e6814f6f6e899904fe72e245f216 + languageName: node + linkType: hard + "graphql@npm:^15.0.0 || ^16.0.0, graphql@npm:^16.0.0": version: 16.6.0 resolution: "graphql@npm:16.6.0" From 2cd6b19883b950e06fcb29c06508ad8bbb2e400e Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 17 Mar 2023 01:29:04 +0000 Subject: [PATCH 161/177] fix(deps): update dependency isomorphic-git to v1.22.0 Signed-off-by: Renovate Bot --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 9d53979c85..bd3f6ec265 100644 --- a/yarn.lock +++ b/yarn.lock @@ -26130,8 +26130,8 @@ __metadata: linkType: hard "isomorphic-git@npm:^1.8.0": - version: 1.21.0 - resolution: "isomorphic-git@npm:1.21.0" + version: 1.22.0 + resolution: "isomorphic-git@npm:1.22.0" dependencies: async-lock: ^1.1.0 clean-git-ref: ^2.0.1 @@ -26146,7 +26146,7 @@ __metadata: simple-get: ^4.0.1 bin: isogit: cli.cjs - checksum: afbdf98000c586fdcb96f84c054d6ada392b0d2422a7b7baad89e5f5881a79426f8555bdadeebe25202be18bb8eaee3881f8c04b6a289d04b916790bdd5dd5df + checksum: 59f1bf6a6f3e3fad2d43ffa992c20fea41c41e041e11422caea2da252e6cb712e6c18bb2878ed5c7e6b37336d4dc967fb54f7335d28a365c062b7c23e4ba07a9 languageName: node linkType: hard From db7515369ad0db9a98338fbb02dc86af7c2c22f9 Mon Sep 17 00:00:00 2001 From: Abhay Soni Date: Fri, 17 Mar 2023 10:36:28 +0530 Subject: [PATCH 162/177] Update microsite/data/plugins/statusneo-github-plugin.yaml Co-authored-by: Johan Haals Signed-off-by: Abhay Soni --- microsite/data/plugins/statusneo-github-plugin.yaml | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/microsite/data/plugins/statusneo-github-plugin.yaml b/microsite/data/plugins/statusneo-github-plugin.yaml index 94b182cdb0..3b5a901164 100644 --- a/microsite/data/plugins/statusneo-github-plugin.yaml +++ b/microsite/data/plugins/statusneo-github-plugin.yaml @@ -2,9 +2,7 @@ title: Statusneo Github Plugin author: Statusneo authorUrl: https://statusneo.com/ category: GitHub -description: | - This plugin integrates with github and brings the logged in user data. - It contains actions table and pull request table. +description: Provides status cards GitHub pull requests and GitHub actions. documentation: https://statusneo.com/23468-2/ iconUrl: /img/github-statusneo.png npmPackageName: '@statusneo/backstage-plugin-github' From ecc95244f9d04cab824f8df236fce311295ecbfc Mon Sep 17 00:00:00 2001 From: Abhay Soni Date: Fri, 17 Mar 2023 10:36:38 +0530 Subject: [PATCH 163/177] Update microsite/data/plugins/statusneo-github-plugin.yaml Co-authored-by: Johan Haals Signed-off-by: Abhay Soni --- microsite/data/plugins/statusneo-github-plugin.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/microsite/data/plugins/statusneo-github-plugin.yaml b/microsite/data/plugins/statusneo-github-plugin.yaml index 3b5a901164..eea4b84e06 100644 --- a/microsite/data/plugins/statusneo-github-plugin.yaml +++ b/microsite/data/plugins/statusneo-github-plugin.yaml @@ -3,7 +3,7 @@ author: Statusneo authorUrl: https://statusneo.com/ category: GitHub description: Provides status cards GitHub pull requests and GitHub actions. -documentation: https://statusneo.com/23468-2/ +documentation: https://github.com/StatusNeo/backstage-plugin-github iconUrl: /img/github-statusneo.png npmPackageName: '@statusneo/backstage-plugin-github' tags: From b77785534f198b4a5e60be54ae259be3a4df5449 Mon Sep 17 00:00:00 2001 From: Abhay Soni Date: Fri, 17 Mar 2023 10:37:45 +0530 Subject: [PATCH 164/177] Update microsite/data/plugins/microsoft-calendar.yaml Co-authored-by: Johan Haals Signed-off-by: Abhay Soni --- microsite/data/plugins/microsoft-calendar.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/microsite/data/plugins/microsoft-calendar.yaml b/microsite/data/plugins/microsoft-calendar.yaml index c2c2552568..e441957cd4 100644 --- a/microsite/data/plugins/microsoft-calendar.yaml +++ b/microsite/data/plugins/microsoft-calendar.yaml @@ -5,7 +5,7 @@ category: Productivity description: | The plugin integrates with your Microsoft Calendar. It displays all your calendars and events in it. -documentation: https://statusneo.com/23392-2 +documentation: https://github.com/backstage/backstage/tree/master/plugins/microsoft-calendar iconUrl: /img/outlook-statusneo.png npmPackageName: '@backstage/plugin-microsoft-calendar' tags: From 9189e72cd5dbec16f2b22a1c7499bad123cd51c6 Mon Sep 17 00:00:00 2001 From: Abhay Soni Date: Fri, 17 Mar 2023 10:37:51 +0530 Subject: [PATCH 165/177] Update microsite/data/plugins/microsoft-calendar.yaml Co-authored-by: Johan Haals Signed-off-by: Abhay Soni --- microsite/data/plugins/microsoft-calendar.yaml | 1 - 1 file changed, 1 deletion(-) diff --git a/microsite/data/plugins/microsoft-calendar.yaml b/microsite/data/plugins/microsoft-calendar.yaml index e441957cd4..183c991761 100644 --- a/microsite/data/plugins/microsoft-calendar.yaml +++ b/microsite/data/plugins/microsoft-calendar.yaml @@ -11,6 +11,5 @@ npmPackageName: '@backstage/plugin-microsoft-calendar' tags: - Microsoft - calendar - - StatusNeo - Management addedDate: '2023-03-15' From f84fc7fd040c1efed462df8572d82a853c664f87 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 17 Mar 2023 06:36:12 +0000 Subject: [PATCH 166/177] fix(deps): update dependency @rjsf/validator-ajv8 to v5.3.0 Signed-off-by: Renovate Bot --- .changeset/renovate-a9116b7.md | 6 ++++++ plugins/scaffolder-react/package.json | 2 +- plugins/scaffolder/package.json | 2 +- yarn.lock | 12 ++++++------ 4 files changed, 14 insertions(+), 8 deletions(-) create mode 100644 .changeset/renovate-a9116b7.md diff --git a/.changeset/renovate-a9116b7.md b/.changeset/renovate-a9116b7.md new file mode 100644 index 0000000000..168230442e --- /dev/null +++ b/.changeset/renovate-a9116b7.md @@ -0,0 +1,6 @@ +--- +'@backstage/plugin-scaffolder-react': patch +'@backstage/plugin-scaffolder': patch +--- + +Updated dependency `@rjsf/validator-ajv8` to `5.3.0`. diff --git a/plugins/scaffolder-react/package.json b/plugins/scaffolder-react/package.json index 012baa6aa5..f744bb6423 100644 --- a/plugins/scaffolder-react/package.json +++ b/plugins/scaffolder-react/package.json @@ -64,7 +64,7 @@ "@rjsf/material-ui": "^3.2.1", "@rjsf/material-ui-v5": "npm:@rjsf/material-ui@5.1.0", "@rjsf/utils": "5.1.0", - "@rjsf/validator-ajv8": "5.1.0", + "@rjsf/validator-ajv8": "5.3.0", "@types/json-schema": "^7.0.9", "classnames": "^2.2.6", "humanize-duration": "^3.25.1", diff --git a/plugins/scaffolder/package.json b/plugins/scaffolder/package.json index dc75dd1d01..dac8713fed 100644 --- a/plugins/scaffolder/package.json +++ b/plugins/scaffolder/package.json @@ -70,7 +70,7 @@ "@rjsf/core": "^3.2.1", "@rjsf/material-ui": "^3.2.1", "@rjsf/utils": "5.1.0", - "@rjsf/validator-ajv8": "5.1.0", + "@rjsf/validator-ajv8": "5.3.0", "@uiw/react-codemirror": "^4.9.3", "classnames": "^2.2.6", "git-url-parse": "^13.0.0", diff --git a/yarn.lock b/yarn.lock index bd3f6ec265..10127b55da 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7673,7 +7673,7 @@ __metadata: "@rjsf/material-ui": ^3.2.1 "@rjsf/material-ui-v5": "npm:@rjsf/material-ui@5.1.0" "@rjsf/utils": 5.1.0 - "@rjsf/validator-ajv8": 5.1.0 + "@rjsf/validator-ajv8": 5.3.0 "@testing-library/jest-dom": ^5.10.1 "@testing-library/react": ^12.1.3 "@testing-library/react-hooks": ^8.0.0 @@ -7735,7 +7735,7 @@ __metadata: "@rjsf/core": ^3.2.1 "@rjsf/material-ui": ^3.2.1 "@rjsf/utils": 5.1.0 - "@rjsf/validator-ajv8": 5.1.0 + "@rjsf/validator-ajv8": 5.3.0 "@testing-library/jest-dom": ^5.10.1 "@testing-library/react": ^12.1.3 "@testing-library/react-hooks": ^8.0.0 @@ -12994,9 +12994,9 @@ __metadata: languageName: node linkType: hard -"@rjsf/validator-ajv8@npm:5.1.0": - version: 5.1.0 - resolution: "@rjsf/validator-ajv8@npm:5.1.0" +"@rjsf/validator-ajv8@npm:5.3.0": + version: 5.3.0 + resolution: "@rjsf/validator-ajv8@npm:5.3.0" dependencies: ajv: ^8.12.0 ajv-formats: ^2.1.1 @@ -13004,7 +13004,7 @@ __metadata: lodash-es: ^4.17.15 peerDependencies: "@rjsf/utils": ^5.0.0 - checksum: 3430a0aea8235deedd306b535ea3a62a9bcdd4dcf0bf1d022fe036041dceb5ca7c147b17ae50a0d25bb7c953729e987d96c68f5220f8fde4b56a89cf3f106a49 + checksum: 210c2d0066bfa40e523d453eb26dc4fad1f1d34a1efc632061c1c00e90b69697ee88a4ce5e130890dac79253ccf7e31e39c005f504acb3ee7e33962547b1db41 languageName: node linkType: hard From 5f473e606c2e327f05db5c064885de6291840416 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 17 Mar 2023 09:49:31 +0000 Subject: [PATCH 167/177] chore(deps): update dependency esbuild to v0.17.12 Signed-off-by: Renovate Bot --- yarn.lock | 182 +++++++++++++++++++++++++++--------------------------- 1 file changed, 91 insertions(+), 91 deletions(-) diff --git a/yarn.lock b/yarn.lock index 7caa7abb9a..05c1a2d52c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9408,9 +9408,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/android-arm64@npm:0.17.11": - version: 0.17.11 - resolution: "@esbuild/android-arm64@npm:0.17.11" +"@esbuild/android-arm64@npm:0.17.12": + version: 0.17.12 + resolution: "@esbuild/android-arm64@npm:0.17.12" conditions: os=android & cpu=arm64 languageName: node linkType: hard @@ -9429,9 +9429,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/android-arm@npm:0.17.11": - version: 0.17.11 - resolution: "@esbuild/android-arm@npm:0.17.11" +"@esbuild/android-arm@npm:0.17.12": + version: 0.17.12 + resolution: "@esbuild/android-arm@npm:0.17.12" conditions: os=android & cpu=arm languageName: node linkType: hard @@ -9443,9 +9443,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/android-x64@npm:0.17.11": - version: 0.17.11 - resolution: "@esbuild/android-x64@npm:0.17.11" +"@esbuild/android-x64@npm:0.17.12": + version: 0.17.12 + resolution: "@esbuild/android-x64@npm:0.17.12" conditions: os=android & cpu=x64 languageName: node linkType: hard @@ -9457,9 +9457,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/darwin-arm64@npm:0.17.11": - version: 0.17.11 - resolution: "@esbuild/darwin-arm64@npm:0.17.11" +"@esbuild/darwin-arm64@npm:0.17.12": + version: 0.17.12 + resolution: "@esbuild/darwin-arm64@npm:0.17.12" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard @@ -9471,9 +9471,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/darwin-x64@npm:0.17.11": - version: 0.17.11 - resolution: "@esbuild/darwin-x64@npm:0.17.11" +"@esbuild/darwin-x64@npm:0.17.12": + version: 0.17.12 + resolution: "@esbuild/darwin-x64@npm:0.17.12" conditions: os=darwin & cpu=x64 languageName: node linkType: hard @@ -9485,9 +9485,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/freebsd-arm64@npm:0.17.11": - version: 0.17.11 - resolution: "@esbuild/freebsd-arm64@npm:0.17.11" +"@esbuild/freebsd-arm64@npm:0.17.12": + version: 0.17.12 + resolution: "@esbuild/freebsd-arm64@npm:0.17.12" conditions: os=freebsd & cpu=arm64 languageName: node linkType: hard @@ -9499,9 +9499,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/freebsd-x64@npm:0.17.11": - version: 0.17.11 - resolution: "@esbuild/freebsd-x64@npm:0.17.11" +"@esbuild/freebsd-x64@npm:0.17.12": + version: 0.17.12 + resolution: "@esbuild/freebsd-x64@npm:0.17.12" conditions: os=freebsd & cpu=x64 languageName: node linkType: hard @@ -9513,9 +9513,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-arm64@npm:0.17.11": - version: 0.17.11 - resolution: "@esbuild/linux-arm64@npm:0.17.11" +"@esbuild/linux-arm64@npm:0.17.12": + version: 0.17.12 + resolution: "@esbuild/linux-arm64@npm:0.17.12" conditions: os=linux & cpu=arm64 languageName: node linkType: hard @@ -9527,9 +9527,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-arm@npm:0.17.11": - version: 0.17.11 - resolution: "@esbuild/linux-arm@npm:0.17.11" +"@esbuild/linux-arm@npm:0.17.12": + version: 0.17.12 + resolution: "@esbuild/linux-arm@npm:0.17.12" conditions: os=linux & cpu=arm languageName: node linkType: hard @@ -9541,9 +9541,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-ia32@npm:0.17.11": - version: 0.17.11 - resolution: "@esbuild/linux-ia32@npm:0.17.11" +"@esbuild/linux-ia32@npm:0.17.12": + version: 0.17.12 + resolution: "@esbuild/linux-ia32@npm:0.17.12" conditions: os=linux & cpu=ia32 languageName: node linkType: hard @@ -9562,9 +9562,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-loong64@npm:0.17.11": - version: 0.17.11 - resolution: "@esbuild/linux-loong64@npm:0.17.11" +"@esbuild/linux-loong64@npm:0.17.12": + version: 0.17.12 + resolution: "@esbuild/linux-loong64@npm:0.17.12" conditions: os=linux & cpu=loong64 languageName: node linkType: hard @@ -9576,9 +9576,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-mips64el@npm:0.17.11": - version: 0.17.11 - resolution: "@esbuild/linux-mips64el@npm:0.17.11" +"@esbuild/linux-mips64el@npm:0.17.12": + version: 0.17.12 + resolution: "@esbuild/linux-mips64el@npm:0.17.12" conditions: os=linux & cpu=mips64el languageName: node linkType: hard @@ -9590,9 +9590,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-ppc64@npm:0.17.11": - version: 0.17.11 - resolution: "@esbuild/linux-ppc64@npm:0.17.11" +"@esbuild/linux-ppc64@npm:0.17.12": + version: 0.17.12 + resolution: "@esbuild/linux-ppc64@npm:0.17.12" conditions: os=linux & cpu=ppc64 languageName: node linkType: hard @@ -9604,9 +9604,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-riscv64@npm:0.17.11": - version: 0.17.11 - resolution: "@esbuild/linux-riscv64@npm:0.17.11" +"@esbuild/linux-riscv64@npm:0.17.12": + version: 0.17.12 + resolution: "@esbuild/linux-riscv64@npm:0.17.12" conditions: os=linux & cpu=riscv64 languageName: node linkType: hard @@ -9618,9 +9618,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-s390x@npm:0.17.11": - version: 0.17.11 - resolution: "@esbuild/linux-s390x@npm:0.17.11" +"@esbuild/linux-s390x@npm:0.17.12": + version: 0.17.12 + resolution: "@esbuild/linux-s390x@npm:0.17.12" conditions: os=linux & cpu=s390x languageName: node linkType: hard @@ -9632,9 +9632,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-x64@npm:0.17.11": - version: 0.17.11 - resolution: "@esbuild/linux-x64@npm:0.17.11" +"@esbuild/linux-x64@npm:0.17.12": + version: 0.17.12 + resolution: "@esbuild/linux-x64@npm:0.17.12" conditions: os=linux & cpu=x64 languageName: node linkType: hard @@ -9646,9 +9646,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/netbsd-x64@npm:0.17.11": - version: 0.17.11 - resolution: "@esbuild/netbsd-x64@npm:0.17.11" +"@esbuild/netbsd-x64@npm:0.17.12": + version: 0.17.12 + resolution: "@esbuild/netbsd-x64@npm:0.17.12" conditions: os=netbsd & cpu=x64 languageName: node linkType: hard @@ -9660,9 +9660,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/openbsd-x64@npm:0.17.11": - version: 0.17.11 - resolution: "@esbuild/openbsd-x64@npm:0.17.11" +"@esbuild/openbsd-x64@npm:0.17.12": + version: 0.17.12 + resolution: "@esbuild/openbsd-x64@npm:0.17.12" conditions: os=openbsd & cpu=x64 languageName: node linkType: hard @@ -9674,9 +9674,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/sunos-x64@npm:0.17.11": - version: 0.17.11 - resolution: "@esbuild/sunos-x64@npm:0.17.11" +"@esbuild/sunos-x64@npm:0.17.12": + version: 0.17.12 + resolution: "@esbuild/sunos-x64@npm:0.17.12" conditions: os=sunos & cpu=x64 languageName: node linkType: hard @@ -9688,9 +9688,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/win32-arm64@npm:0.17.11": - version: 0.17.11 - resolution: "@esbuild/win32-arm64@npm:0.17.11" +"@esbuild/win32-arm64@npm:0.17.12": + version: 0.17.12 + resolution: "@esbuild/win32-arm64@npm:0.17.12" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard @@ -9702,9 +9702,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/win32-ia32@npm:0.17.11": - version: 0.17.11 - resolution: "@esbuild/win32-ia32@npm:0.17.11" +"@esbuild/win32-ia32@npm:0.17.12": + version: 0.17.12 + resolution: "@esbuild/win32-ia32@npm:0.17.12" conditions: os=win32 & cpu=ia32 languageName: node linkType: hard @@ -9716,9 +9716,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/win32-x64@npm:0.17.11": - version: 0.17.11 - resolution: "@esbuild/win32-x64@npm:0.17.11" +"@esbuild/win32-x64@npm:0.17.12": + version: 0.17.12 + resolution: "@esbuild/win32-x64@npm:0.17.12" conditions: os=win32 & cpu=x64 languageName: node linkType: hard @@ -21652,31 +21652,31 @@ __metadata: linkType: hard "esbuild@npm:^0.17.0": - version: 0.17.11 - resolution: "esbuild@npm:0.17.11" + version: 0.17.12 + resolution: "esbuild@npm:0.17.12" dependencies: - "@esbuild/android-arm": 0.17.11 - "@esbuild/android-arm64": 0.17.11 - "@esbuild/android-x64": 0.17.11 - "@esbuild/darwin-arm64": 0.17.11 - "@esbuild/darwin-x64": 0.17.11 - "@esbuild/freebsd-arm64": 0.17.11 - "@esbuild/freebsd-x64": 0.17.11 - "@esbuild/linux-arm": 0.17.11 - "@esbuild/linux-arm64": 0.17.11 - "@esbuild/linux-ia32": 0.17.11 - "@esbuild/linux-loong64": 0.17.11 - "@esbuild/linux-mips64el": 0.17.11 - "@esbuild/linux-ppc64": 0.17.11 - "@esbuild/linux-riscv64": 0.17.11 - "@esbuild/linux-s390x": 0.17.11 - "@esbuild/linux-x64": 0.17.11 - "@esbuild/netbsd-x64": 0.17.11 - "@esbuild/openbsd-x64": 0.17.11 - "@esbuild/sunos-x64": 0.17.11 - "@esbuild/win32-arm64": 0.17.11 - "@esbuild/win32-ia32": 0.17.11 - "@esbuild/win32-x64": 0.17.11 + "@esbuild/android-arm": 0.17.12 + "@esbuild/android-arm64": 0.17.12 + "@esbuild/android-x64": 0.17.12 + "@esbuild/darwin-arm64": 0.17.12 + "@esbuild/darwin-x64": 0.17.12 + "@esbuild/freebsd-arm64": 0.17.12 + "@esbuild/freebsd-x64": 0.17.12 + "@esbuild/linux-arm": 0.17.12 + "@esbuild/linux-arm64": 0.17.12 + "@esbuild/linux-ia32": 0.17.12 + "@esbuild/linux-loong64": 0.17.12 + "@esbuild/linux-mips64el": 0.17.12 + "@esbuild/linux-ppc64": 0.17.12 + "@esbuild/linux-riscv64": 0.17.12 + "@esbuild/linux-s390x": 0.17.12 + "@esbuild/linux-x64": 0.17.12 + "@esbuild/netbsd-x64": 0.17.12 + "@esbuild/openbsd-x64": 0.17.12 + "@esbuild/sunos-x64": 0.17.12 + "@esbuild/win32-arm64": 0.17.12 + "@esbuild/win32-ia32": 0.17.12 + "@esbuild/win32-x64": 0.17.12 dependenciesMeta: "@esbuild/android-arm": optional: true @@ -21724,7 +21724,7 @@ __metadata: optional: true bin: esbuild: bin/esbuild - checksum: febf218155513bb9c9c970508c03ec58e0aacfdc23394f425836a09f1da0dae0afa12949274adfd382782eef097f86b2d6b3032293062291f2f471de204f77ec + checksum: ea6d33eb1bc6c9e00dcee5e253c7e935251b4801d376661fd9f19a9dcffc27f970078a6f7116d6c78ee825ceff9b974594b0b616bd560ce4d875a951aa92977b languageName: node linkType: hard From fe8d9d60ecf6246deee5d57a50d01ac29ff3d1e7 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 17 Mar 2023 10:34:02 +0000 Subject: [PATCH 168/177] fix(deps): update dependency @swc/core to v1.3.41 Signed-off-by: Renovate Bot --- microsite/yarn.lock | 86 ++++++++++++++++++++++----------------------- storybook/yarn.lock | 86 ++++++++++++++++++++++----------------------- yarn.lock | 86 ++++++++++++++++++++++----------------------- 3 files changed, 129 insertions(+), 129 deletions(-) diff --git a/microsite/yarn.lock b/microsite/yarn.lock index 874d696626..20a704960f 100644 --- a/microsite/yarn.lock +++ b/microsite/yarn.lock @@ -2623,90 +2623,90 @@ __metadata: languageName: node linkType: hard -"@swc/core-darwin-arm64@npm:1.3.39": - version: 1.3.39 - resolution: "@swc/core-darwin-arm64@npm:1.3.39" +"@swc/core-darwin-arm64@npm:1.3.41": + version: 1.3.41 + resolution: "@swc/core-darwin-arm64@npm:1.3.41" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@swc/core-darwin-x64@npm:1.3.39": - version: 1.3.39 - resolution: "@swc/core-darwin-x64@npm:1.3.39" +"@swc/core-darwin-x64@npm:1.3.41": + version: 1.3.41 + resolution: "@swc/core-darwin-x64@npm:1.3.41" conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"@swc/core-linux-arm-gnueabihf@npm:1.3.39": - version: 1.3.39 - resolution: "@swc/core-linux-arm-gnueabihf@npm:1.3.39" +"@swc/core-linux-arm-gnueabihf@npm:1.3.41": + version: 1.3.41 + resolution: "@swc/core-linux-arm-gnueabihf@npm:1.3.41" conditions: os=linux & cpu=arm languageName: node linkType: hard -"@swc/core-linux-arm64-gnu@npm:1.3.39": - version: 1.3.39 - resolution: "@swc/core-linux-arm64-gnu@npm:1.3.39" +"@swc/core-linux-arm64-gnu@npm:1.3.41": + version: 1.3.41 + resolution: "@swc/core-linux-arm64-gnu@npm:1.3.41" conditions: os=linux & cpu=arm64 & libc=glibc languageName: node linkType: hard -"@swc/core-linux-arm64-musl@npm:1.3.39": - version: 1.3.39 - resolution: "@swc/core-linux-arm64-musl@npm:1.3.39" +"@swc/core-linux-arm64-musl@npm:1.3.41": + version: 1.3.41 + resolution: "@swc/core-linux-arm64-musl@npm:1.3.41" conditions: os=linux & cpu=arm64 & libc=musl languageName: node linkType: hard -"@swc/core-linux-x64-gnu@npm:1.3.39": - version: 1.3.39 - resolution: "@swc/core-linux-x64-gnu@npm:1.3.39" +"@swc/core-linux-x64-gnu@npm:1.3.41": + version: 1.3.41 + resolution: "@swc/core-linux-x64-gnu@npm:1.3.41" conditions: os=linux & cpu=x64 & libc=glibc languageName: node linkType: hard -"@swc/core-linux-x64-musl@npm:1.3.39": - version: 1.3.39 - resolution: "@swc/core-linux-x64-musl@npm:1.3.39" +"@swc/core-linux-x64-musl@npm:1.3.41": + version: 1.3.41 + resolution: "@swc/core-linux-x64-musl@npm:1.3.41" conditions: os=linux & cpu=x64 & libc=musl languageName: node linkType: hard -"@swc/core-win32-arm64-msvc@npm:1.3.39": - version: 1.3.39 - resolution: "@swc/core-win32-arm64-msvc@npm:1.3.39" +"@swc/core-win32-arm64-msvc@npm:1.3.41": + version: 1.3.41 + resolution: "@swc/core-win32-arm64-msvc@npm:1.3.41" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"@swc/core-win32-ia32-msvc@npm:1.3.39": - version: 1.3.39 - resolution: "@swc/core-win32-ia32-msvc@npm:1.3.39" +"@swc/core-win32-ia32-msvc@npm:1.3.41": + version: 1.3.41 + resolution: "@swc/core-win32-ia32-msvc@npm:1.3.41" conditions: os=win32 & cpu=ia32 languageName: node linkType: hard -"@swc/core-win32-x64-msvc@npm:1.3.39": - version: 1.3.39 - resolution: "@swc/core-win32-x64-msvc@npm:1.3.39" +"@swc/core-win32-x64-msvc@npm:1.3.41": + version: 1.3.41 + resolution: "@swc/core-win32-x64-msvc@npm:1.3.41" conditions: os=win32 & cpu=x64 languageName: node linkType: hard "@swc/core@npm:^1.3.36": - version: 1.3.39 - resolution: "@swc/core@npm:1.3.39" + version: 1.3.41 + resolution: "@swc/core@npm:1.3.41" dependencies: - "@swc/core-darwin-arm64": 1.3.39 - "@swc/core-darwin-x64": 1.3.39 - "@swc/core-linux-arm-gnueabihf": 1.3.39 - "@swc/core-linux-arm64-gnu": 1.3.39 - "@swc/core-linux-arm64-musl": 1.3.39 - "@swc/core-linux-x64-gnu": 1.3.39 - "@swc/core-linux-x64-musl": 1.3.39 - "@swc/core-win32-arm64-msvc": 1.3.39 - "@swc/core-win32-ia32-msvc": 1.3.39 - "@swc/core-win32-x64-msvc": 1.3.39 + "@swc/core-darwin-arm64": 1.3.41 + "@swc/core-darwin-x64": 1.3.41 + "@swc/core-linux-arm-gnueabihf": 1.3.41 + "@swc/core-linux-arm64-gnu": 1.3.41 + "@swc/core-linux-arm64-musl": 1.3.41 + "@swc/core-linux-x64-gnu": 1.3.41 + "@swc/core-linux-x64-musl": 1.3.41 + "@swc/core-win32-arm64-msvc": 1.3.41 + "@swc/core-win32-ia32-msvc": 1.3.41 + "@swc/core-win32-x64-msvc": 1.3.41 dependenciesMeta: "@swc/core-darwin-arm64": optional: true @@ -2728,7 +2728,7 @@ __metadata: optional: true "@swc/core-win32-x64-msvc": optional: true - checksum: 2c5376627587302d9146a13670ab88d49d236361f226058625a287e275952a282e46c6f8620ec756917406c2ab801093c28668d95837646e39742d65e193965d + checksum: e2d2bd2d1821608bfafab66f7b94d31b4ae3f486ad6d18aa30abca961299431a26ab2dfc04a7e614f8b8f6680d9790f0596f43e18d0b794e2802136c1d5e3376 languageName: node linkType: hard diff --git a/storybook/yarn.lock b/storybook/yarn.lock index eb70dadd2f..359707312e 100644 --- a/storybook/yarn.lock +++ b/storybook/yarn.lock @@ -2966,90 +2966,90 @@ __metadata: languageName: node linkType: hard -"@swc/core-darwin-arm64@npm:1.3.39": - version: 1.3.39 - resolution: "@swc/core-darwin-arm64@npm:1.3.39" +"@swc/core-darwin-arm64@npm:1.3.41": + version: 1.3.41 + resolution: "@swc/core-darwin-arm64@npm:1.3.41" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@swc/core-darwin-x64@npm:1.3.39": - version: 1.3.39 - resolution: "@swc/core-darwin-x64@npm:1.3.39" +"@swc/core-darwin-x64@npm:1.3.41": + version: 1.3.41 + resolution: "@swc/core-darwin-x64@npm:1.3.41" conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"@swc/core-linux-arm-gnueabihf@npm:1.3.39": - version: 1.3.39 - resolution: "@swc/core-linux-arm-gnueabihf@npm:1.3.39" +"@swc/core-linux-arm-gnueabihf@npm:1.3.41": + version: 1.3.41 + resolution: "@swc/core-linux-arm-gnueabihf@npm:1.3.41" conditions: os=linux & cpu=arm languageName: node linkType: hard -"@swc/core-linux-arm64-gnu@npm:1.3.39": - version: 1.3.39 - resolution: "@swc/core-linux-arm64-gnu@npm:1.3.39" +"@swc/core-linux-arm64-gnu@npm:1.3.41": + version: 1.3.41 + resolution: "@swc/core-linux-arm64-gnu@npm:1.3.41" conditions: os=linux & cpu=arm64 & libc=glibc languageName: node linkType: hard -"@swc/core-linux-arm64-musl@npm:1.3.39": - version: 1.3.39 - resolution: "@swc/core-linux-arm64-musl@npm:1.3.39" +"@swc/core-linux-arm64-musl@npm:1.3.41": + version: 1.3.41 + resolution: "@swc/core-linux-arm64-musl@npm:1.3.41" conditions: os=linux & cpu=arm64 & libc=musl languageName: node linkType: hard -"@swc/core-linux-x64-gnu@npm:1.3.39": - version: 1.3.39 - resolution: "@swc/core-linux-x64-gnu@npm:1.3.39" +"@swc/core-linux-x64-gnu@npm:1.3.41": + version: 1.3.41 + resolution: "@swc/core-linux-x64-gnu@npm:1.3.41" conditions: os=linux & cpu=x64 & libc=glibc languageName: node linkType: hard -"@swc/core-linux-x64-musl@npm:1.3.39": - version: 1.3.39 - resolution: "@swc/core-linux-x64-musl@npm:1.3.39" +"@swc/core-linux-x64-musl@npm:1.3.41": + version: 1.3.41 + resolution: "@swc/core-linux-x64-musl@npm:1.3.41" conditions: os=linux & cpu=x64 & libc=musl languageName: node linkType: hard -"@swc/core-win32-arm64-msvc@npm:1.3.39": - version: 1.3.39 - resolution: "@swc/core-win32-arm64-msvc@npm:1.3.39" +"@swc/core-win32-arm64-msvc@npm:1.3.41": + version: 1.3.41 + resolution: "@swc/core-win32-arm64-msvc@npm:1.3.41" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"@swc/core-win32-ia32-msvc@npm:1.3.39": - version: 1.3.39 - resolution: "@swc/core-win32-ia32-msvc@npm:1.3.39" +"@swc/core-win32-ia32-msvc@npm:1.3.41": + version: 1.3.41 + resolution: "@swc/core-win32-ia32-msvc@npm:1.3.41" conditions: os=win32 & cpu=ia32 languageName: node linkType: hard -"@swc/core-win32-x64-msvc@npm:1.3.39": - version: 1.3.39 - resolution: "@swc/core-win32-x64-msvc@npm:1.3.39" +"@swc/core-win32-x64-msvc@npm:1.3.41": + version: 1.3.41 + resolution: "@swc/core-win32-x64-msvc@npm:1.3.41" conditions: os=win32 & cpu=x64 languageName: node linkType: hard "@swc/core@npm:^1.3.9": - version: 1.3.39 - resolution: "@swc/core@npm:1.3.39" + version: 1.3.41 + resolution: "@swc/core@npm:1.3.41" dependencies: - "@swc/core-darwin-arm64": 1.3.39 - "@swc/core-darwin-x64": 1.3.39 - "@swc/core-linux-arm-gnueabihf": 1.3.39 - "@swc/core-linux-arm64-gnu": 1.3.39 - "@swc/core-linux-arm64-musl": 1.3.39 - "@swc/core-linux-x64-gnu": 1.3.39 - "@swc/core-linux-x64-musl": 1.3.39 - "@swc/core-win32-arm64-msvc": 1.3.39 - "@swc/core-win32-ia32-msvc": 1.3.39 - "@swc/core-win32-x64-msvc": 1.3.39 + "@swc/core-darwin-arm64": 1.3.41 + "@swc/core-darwin-x64": 1.3.41 + "@swc/core-linux-arm-gnueabihf": 1.3.41 + "@swc/core-linux-arm64-gnu": 1.3.41 + "@swc/core-linux-arm64-musl": 1.3.41 + "@swc/core-linux-x64-gnu": 1.3.41 + "@swc/core-linux-x64-musl": 1.3.41 + "@swc/core-win32-arm64-msvc": 1.3.41 + "@swc/core-win32-ia32-msvc": 1.3.41 + "@swc/core-win32-x64-msvc": 1.3.41 dependenciesMeta: "@swc/core-darwin-arm64": optional: true @@ -3071,7 +3071,7 @@ __metadata: optional: true "@swc/core-win32-x64-msvc": optional: true - checksum: 2c5376627587302d9146a13670ab88d49d236361f226058625a287e275952a282e46c6f8620ec756917406c2ab801093c28668d95837646e39742d65e193965d + checksum: e2d2bd2d1821608bfafab66f7b94d31b4ae3f486ad6d18aa30abca961299431a26ab2dfc04a7e614f8b8f6680d9790f0596f43e18d0b794e2802136c1d5e3376 languageName: node linkType: hard diff --git a/yarn.lock b/yarn.lock index 05c1a2d52c..5b063c6a8a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -13627,90 +13627,90 @@ __metadata: languageName: node linkType: hard -"@swc/core-darwin-arm64@npm:1.3.39": - version: 1.3.39 - resolution: "@swc/core-darwin-arm64@npm:1.3.39" +"@swc/core-darwin-arm64@npm:1.3.41": + version: 1.3.41 + resolution: "@swc/core-darwin-arm64@npm:1.3.41" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@swc/core-darwin-x64@npm:1.3.39": - version: 1.3.39 - resolution: "@swc/core-darwin-x64@npm:1.3.39" +"@swc/core-darwin-x64@npm:1.3.41": + version: 1.3.41 + resolution: "@swc/core-darwin-x64@npm:1.3.41" conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"@swc/core-linux-arm-gnueabihf@npm:1.3.39": - version: 1.3.39 - resolution: "@swc/core-linux-arm-gnueabihf@npm:1.3.39" +"@swc/core-linux-arm-gnueabihf@npm:1.3.41": + version: 1.3.41 + resolution: "@swc/core-linux-arm-gnueabihf@npm:1.3.41" conditions: os=linux & cpu=arm languageName: node linkType: hard -"@swc/core-linux-arm64-gnu@npm:1.3.39": - version: 1.3.39 - resolution: "@swc/core-linux-arm64-gnu@npm:1.3.39" +"@swc/core-linux-arm64-gnu@npm:1.3.41": + version: 1.3.41 + resolution: "@swc/core-linux-arm64-gnu@npm:1.3.41" conditions: os=linux & cpu=arm64 & libc=glibc languageName: node linkType: hard -"@swc/core-linux-arm64-musl@npm:1.3.39": - version: 1.3.39 - resolution: "@swc/core-linux-arm64-musl@npm:1.3.39" +"@swc/core-linux-arm64-musl@npm:1.3.41": + version: 1.3.41 + resolution: "@swc/core-linux-arm64-musl@npm:1.3.41" conditions: os=linux & cpu=arm64 & libc=musl languageName: node linkType: hard -"@swc/core-linux-x64-gnu@npm:1.3.39": - version: 1.3.39 - resolution: "@swc/core-linux-x64-gnu@npm:1.3.39" +"@swc/core-linux-x64-gnu@npm:1.3.41": + version: 1.3.41 + resolution: "@swc/core-linux-x64-gnu@npm:1.3.41" conditions: os=linux & cpu=x64 & libc=glibc languageName: node linkType: hard -"@swc/core-linux-x64-musl@npm:1.3.39": - version: 1.3.39 - resolution: "@swc/core-linux-x64-musl@npm:1.3.39" +"@swc/core-linux-x64-musl@npm:1.3.41": + version: 1.3.41 + resolution: "@swc/core-linux-x64-musl@npm:1.3.41" conditions: os=linux & cpu=x64 & libc=musl languageName: node linkType: hard -"@swc/core-win32-arm64-msvc@npm:1.3.39": - version: 1.3.39 - resolution: "@swc/core-win32-arm64-msvc@npm:1.3.39" +"@swc/core-win32-arm64-msvc@npm:1.3.41": + version: 1.3.41 + resolution: "@swc/core-win32-arm64-msvc@npm:1.3.41" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"@swc/core-win32-ia32-msvc@npm:1.3.39": - version: 1.3.39 - resolution: "@swc/core-win32-ia32-msvc@npm:1.3.39" +"@swc/core-win32-ia32-msvc@npm:1.3.41": + version: 1.3.41 + resolution: "@swc/core-win32-ia32-msvc@npm:1.3.41" conditions: os=win32 & cpu=ia32 languageName: node linkType: hard -"@swc/core-win32-x64-msvc@npm:1.3.39": - version: 1.3.39 - resolution: "@swc/core-win32-x64-msvc@npm:1.3.39" +"@swc/core-win32-x64-msvc@npm:1.3.41": + version: 1.3.41 + resolution: "@swc/core-win32-x64-msvc@npm:1.3.41" conditions: os=win32 & cpu=x64 languageName: node linkType: hard "@swc/core@npm:^1.3.9": - version: 1.3.39 - resolution: "@swc/core@npm:1.3.39" + version: 1.3.41 + resolution: "@swc/core@npm:1.3.41" dependencies: - "@swc/core-darwin-arm64": 1.3.39 - "@swc/core-darwin-x64": 1.3.39 - "@swc/core-linux-arm-gnueabihf": 1.3.39 - "@swc/core-linux-arm64-gnu": 1.3.39 - "@swc/core-linux-arm64-musl": 1.3.39 - "@swc/core-linux-x64-gnu": 1.3.39 - "@swc/core-linux-x64-musl": 1.3.39 - "@swc/core-win32-arm64-msvc": 1.3.39 - "@swc/core-win32-ia32-msvc": 1.3.39 - "@swc/core-win32-x64-msvc": 1.3.39 + "@swc/core-darwin-arm64": 1.3.41 + "@swc/core-darwin-x64": 1.3.41 + "@swc/core-linux-arm-gnueabihf": 1.3.41 + "@swc/core-linux-arm64-gnu": 1.3.41 + "@swc/core-linux-arm64-musl": 1.3.41 + "@swc/core-linux-x64-gnu": 1.3.41 + "@swc/core-linux-x64-musl": 1.3.41 + "@swc/core-win32-arm64-msvc": 1.3.41 + "@swc/core-win32-ia32-msvc": 1.3.41 + "@swc/core-win32-x64-msvc": 1.3.41 dependenciesMeta: "@swc/core-darwin-arm64": optional: true @@ -13732,7 +13732,7 @@ __metadata: optional: true "@swc/core-win32-x64-msvc": optional: true - checksum: 2c5376627587302d9146a13670ab88d49d236361f226058625a287e275952a282e46c6f8620ec756917406c2ab801093c28668d95837646e39742d65e193965d + checksum: e2d2bd2d1821608bfafab66f7b94d31b4ae3f486ad6d18aa30abca961299431a26ab2dfc04a7e614f8b8f6680d9790f0596f43e18d0b794e2802136c1d5e3376 languageName: node linkType: hard From fc1665944be6b5c3930ad70813b29b6bae85dc63 Mon Sep 17 00:00:00 2001 From: Morgan Bentell Date: Thu, 16 Mar 2023 18:46:39 +0100 Subject: [PATCH 169/177] could it be? Signed-off-by: Morgan Bentell --- plugins/techdocs-react/src/context.tsx | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/plugins/techdocs-react/src/context.tsx b/plugins/techdocs-react/src/context.tsx index f373acca73..3874a648c8 100644 --- a/plugins/techdocs-react/src/context.tsx +++ b/plugins/techdocs-react/src/context.tsx @@ -123,7 +123,7 @@ export const TechDocsReaderPageProvider = memo( return techdocsApi.getEntityMetadata(entityRef); }, [entityRef]); - const metadata = useAsyncRetry(() => { + const metadata = useAsyncRetry(async () => { return techdocsApi.getTechDocsMetadata(entityRef); }, [entityRef]); @@ -136,12 +136,18 @@ export const TechDocsReaderPageProvider = memo( ); useEffect(() => { - if (shadowRoot && !metadata.loading && !metadata.value) { + if (shadowRoot && !metadata.value && !metadata.loading) { metadata.retry(); } - }, [metadata, shadowRoot]); + }, [ + metadata.value, + metadata.loading, + shadowRoot, + metadata.retry, + metadata, + ]); - const value = { + const value: TechDocsReaderPageValue = { metadata, entityRef: toLowercaseEntityRefMaybe(entityRef, config), entityMetadata, From 6eaa03d9deab0a3a5c6fee1ee260e614e199b5b9 Mon Sep 17 00:00:00 2001 From: Morgan Bentell Date: Thu, 16 Mar 2023 18:57:43 +0100 Subject: [PATCH 170/177] workaround useAsync typescript error Signed-off-by: Morgan Bentell --- plugins/techdocs-react/src/context.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/techdocs-react/src/context.tsx b/plugins/techdocs-react/src/context.tsx index 3874a648c8..608dbc59b3 100644 --- a/plugins/techdocs-react/src/context.tsx +++ b/plugins/techdocs-react/src/context.tsx @@ -24,7 +24,7 @@ import React, { useEffect, } from 'react'; import useAsync, { AsyncState } from 'react-use/lib/useAsync'; -import { useAsyncRetry } from 'react-use'; +import useAsyncRetry from 'react-use/lib/useAsyncRetry'; import { CompoundEntityRef, From 51c2d89a2f8d6bfdf97663df1ab014bf2a19adfc Mon Sep 17 00:00:00 2001 From: blam Date: Fri, 17 Mar 2023 13:55:20 +0100 Subject: [PATCH 171/177] chore: remove the nextRouteRefs in favour of the original ones instead Signed-off-by: blam --- plugins/scaffolder/src/alpha.ts | 3 - .../src/next/OngoingTask/OngoingTask.test.tsx | 4 +- .../src/next/OngoingTask/OngoingTask.tsx | 4 +- plugins/scaffolder/src/next/Router/Router.tsx | 22 +++---- .../src/next/TemplateListPage/ContextMenu.tsx | 14 ++--- .../TemplateListPage/TemplateGroups.test.tsx | 14 ++--- .../next/TemplateListPage/TemplateGroups.tsx | 5 +- .../TemplateListPage.test.tsx | 8 +-- .../TemplateWizardPage.test.tsx | 4 +- .../TemplateWizardPage/TemplateWizardPage.tsx | 15 ++--- plugins/scaffolder/src/next/index.ts | 1 - plugins/scaffolder/src/next/routes.ts | 57 ------------------- plugins/scaffolder/src/plugin.tsx | 9 ++- 13 files changed, 51 insertions(+), 109 deletions(-) delete mode 100644 plugins/scaffolder/src/next/routes.ts diff --git a/plugins/scaffolder/src/alpha.ts b/plugins/scaffolder/src/alpha.ts index a460b0d7cc..72eb073fba 100644 --- a/plugins/scaffolder/src/alpha.ts +++ b/plugins/scaffolder/src/alpha.ts @@ -16,9 +16,6 @@ export { NextScaffolderPage } from './plugin'; export { - nextRouteRef, - nextScaffolderTaskRouteRef, - nextSelectedTemplateRouteRef, type TemplateGroupFilter, type NextRouterProps, type FormProps, diff --git a/plugins/scaffolder/src/next/OngoingTask/OngoingTask.test.tsx b/plugins/scaffolder/src/next/OngoingTask/OngoingTask.test.tsx index 9e9212b9e8..c31322a9eb 100644 --- a/plugins/scaffolder/src/next/OngoingTask/OngoingTask.test.tsx +++ b/plugins/scaffolder/src/next/OngoingTask/OngoingTask.test.tsx @@ -19,7 +19,7 @@ import React from 'react'; import { renderInTestApp, TestApiProvider } from '@backstage/test-utils'; import { scaffolderApiRef } from '@backstage/plugin-scaffolder-react'; import { act, fireEvent, waitFor } from '@testing-library/react'; -import { nextRouteRef } from '../routes'; +import { rootRouteRef } from '../../routes'; jest.mock('react-router-dom', () => ({ ...jest.requireActual('react-router-dom'), @@ -59,7 +59,7 @@ describe('OngoingTask', () => { , - { mountedRoutes: { '/': nextRouteRef } }, + { mountedRoutes: { '/': rootRouteRef } }, ); const { getByText, getByTestId } = rendered; diff --git a/plugins/scaffolder/src/next/OngoingTask/OngoingTask.tsx b/plugins/scaffolder/src/next/OngoingTask/OngoingTask.tsx index 9c64e2179b..f8026cf073 100644 --- a/plugins/scaffolder/src/next/OngoingTask/OngoingTask.tsx +++ b/plugins/scaffolder/src/next/OngoingTask/OngoingTask.tsx @@ -21,7 +21,7 @@ import { ScaffolderTaskOutput, useTaskEventStream, } from '@backstage/plugin-scaffolder-react'; -import { nextSelectedTemplateRouteRef } from '../routes'; +import { selectedTemplateRouteRef } from '../../routes'; import { useRouteRef } from '@backstage/core-plugin-api'; import qs from 'qs'; import { ContextMenu } from './ContextMenu'; @@ -45,7 +45,7 @@ export const OngoingTask = (props: { }) => { // todo(blam): check that task Id actually exists, and that it's valid. otherwise redirect to something more useful. const { taskId } = useParams(); - const templateRouteRef = useRouteRef(nextSelectedTemplateRouteRef); + const templateRouteRef = useRouteRef(selectedTemplateRouteRef); const navigate = useNavigate(); const taskStream = useTaskEventStream(taskId!); const classes = useStyles(); diff --git a/plugins/scaffolder/src/next/Router/Router.tsx b/plugins/scaffolder/src/next/Router/Router.tsx index 5e199cae9b..5066e96d6c 100644 --- a/plugins/scaffolder/src/next/Router/Router.tsx +++ b/plugins/scaffolder/src/next/Router/Router.tsx @@ -33,12 +33,12 @@ import { TemplateGroupFilter } from '../TemplateListPage/TemplateGroups'; import { DEFAULT_SCAFFOLDER_FIELD_EXTENSIONS } from '../../extensions/default'; import { - nextActionsRouteRef, - nextEditRouteRef, - nextScaffolderListTaskRouteRef, - nextScaffolderTaskRouteRef, - nextSelectedTemplateRouteRef, -} from '../routes'; + actionsRouteRef, + editRouteRef, + scaffolderListTaskRouteRef, + scaffolderTaskRouteRef, + selectedTemplateRouteRef, +} from '../../routes'; import { ErrorPage } from '@backstage/core-components'; import { OngoingTask } from '../OngoingTask'; import { ActionsPage } from '../../components/ActionsPage'; @@ -115,7 +115,7 @@ export const Router = (props: PropsWithChildren) => { } /> ) => { } /> ) => { } /> ) => { } /> - } /> + } /> } /> ({ button: { @@ -50,9 +50,9 @@ export type ScaffolderPageContextMenuProps = { export function ContextMenu(props: ScaffolderPageContextMenuProps) { const classes = useStyles(); const [anchorEl, setAnchorEl] = useState(); - const editLink = useRouteRef(nextEditRouteRef); - const actionsLink = useRouteRef(nextActionsRouteRef); - const tasksLink = useRouteRef(nextScaffolderListTaskRouteRef); + const editLink = useRouteRef(editRouteRef); + const actionsLink = useRouteRef(actionsRouteRef); + const tasksLink = useRouteRef(scaffolderListTaskRouteRef); const navigate = useNavigate(); diff --git a/plugins/scaffolder/src/next/TemplateListPage/TemplateGroups.test.tsx b/plugins/scaffolder/src/next/TemplateListPage/TemplateGroups.test.tsx index 6fe2d6beb9..2b66f294fa 100644 --- a/plugins/scaffolder/src/next/TemplateListPage/TemplateGroups.test.tsx +++ b/plugins/scaffolder/src/next/TemplateListPage/TemplateGroups.test.tsx @@ -28,7 +28,7 @@ import { TemplateGroups } from './TemplateGroups'; import { renderInTestApp, TestApiProvider } from '@backstage/test-utils'; import { errorApiRef } from '@backstage/core-plugin-api'; import { TemplateGroup } from '@backstage/plugin-scaffolder-react/alpha'; -import { nextRouteRef } from '../routes'; +import { rootRouteRef } from '../../routes'; describe('TemplateGroups', () => { beforeEach(() => jest.clearAllMocks()); @@ -42,7 +42,7 @@ describe('TemplateGroups', () => { , { mountedRoutes: { - '/next': nextRouteRef, + '/create': rootRouteRef, }, }, ); @@ -64,7 +64,7 @@ describe('TemplateGroups', () => { , { mountedRoutes: { - '/next': nextRouteRef, + '/create': rootRouteRef, }, }, ); @@ -85,7 +85,7 @@ describe('TemplateGroups', () => { , { mountedRoutes: { - '/next': nextRouteRef, + '/create': rootRouteRef, }, }, ); @@ -106,7 +106,7 @@ describe('TemplateGroups', () => { , { mountedRoutes: { - '/next': nextRouteRef, + '/create': rootRouteRef, }, }, ); @@ -146,7 +146,7 @@ describe('TemplateGroups', () => { , { mountedRoutes: { - '/next': nextRouteRef, + '/create': rootRouteRef, }, }, ); @@ -195,7 +195,7 @@ describe('TemplateGroups', () => { , { mountedRoutes: { - '/next': nextRouteRef, + '/create': rootRouteRef, }, }, ); diff --git a/plugins/scaffolder/src/next/TemplateListPage/TemplateGroups.tsx b/plugins/scaffolder/src/next/TemplateListPage/TemplateGroups.tsx index 590ef802bd..6f32bf38e5 100644 --- a/plugins/scaffolder/src/next/TemplateListPage/TemplateGroups.tsx +++ b/plugins/scaffolder/src/next/TemplateListPage/TemplateGroups.tsx @@ -31,8 +31,7 @@ import { useRouteRef, } from '@backstage/core-plugin-api'; import { TemplateGroup } from '@backstage/plugin-scaffolder-react/alpha'; -import { viewTechDocRouteRef } from '../../routes'; -import { nextSelectedTemplateRouteRef } from '../routes'; +import { viewTechDocRouteRef, selectedTemplateRouteRef } from '../../routes'; import { useNavigate } from 'react-router-dom'; /** @@ -56,7 +55,7 @@ export const TemplateGroups = (props: TemplateGroupsProps) => { const errorApi = useApi(errorApiRef); const app = useApp(); const viewTechDocsLink = useRouteRef(viewTechDocRouteRef); - const templateRoute = useRouteRef(nextSelectedTemplateRouteRef); + const templateRoute = useRouteRef(selectedTemplateRouteRef); const navigate = useNavigate(); const onSelected = useCallback( (template: TemplateEntityV1beta3) => { diff --git a/plugins/scaffolder/src/next/TemplateListPage/TemplateListPage.test.tsx b/plugins/scaffolder/src/next/TemplateListPage/TemplateListPage.test.tsx index 41e7897819..d5a76d2a47 100644 --- a/plugins/scaffolder/src/next/TemplateListPage/TemplateListPage.test.tsx +++ b/plugins/scaffolder/src/next/TemplateListPage/TemplateListPage.test.tsx @@ -25,7 +25,7 @@ import { TestApiProvider, } from '@backstage/test-utils'; import React from 'react'; -import { nextRouteRef } from '../routes'; +import { rootRouteRef } from '../../routes'; import { TemplateListPage } from './TemplateListPage'; describe('TemplateListPage', () => { @@ -63,7 +63,7 @@ describe('TemplateListPage', () => { > , - { mountedRoutes: { '/': nextRouteRef } }, + { mountedRoutes: { '/': rootRouteRef } }, ); expect(getByPlaceholderText('Search')).toBeInTheDocument(); @@ -85,7 +85,7 @@ describe('TemplateListPage', () => { > , - { mountedRoutes: { '/': nextRouteRef } }, + { mountedRoutes: { '/': rootRouteRef } }, ); expect(getByRole('menuitem', { name: /All/ })).toBeInTheDocument(); @@ -108,7 +108,7 @@ describe('TemplateListPage', () => { > , - { mountedRoutes: { '/': nextRouteRef } }, + { mountedRoutes: { '/': rootRouteRef } }, ); expect(getByText('Categories')).toBeInTheDocument(); diff --git a/plugins/scaffolder/src/next/TemplateWizardPage/TemplateWizardPage.test.tsx b/plugins/scaffolder/src/next/TemplateWizardPage/TemplateWizardPage.test.tsx index da4112979c..26a9dd946c 100644 --- a/plugins/scaffolder/src/next/TemplateWizardPage/TemplateWizardPage.test.tsx +++ b/plugins/scaffolder/src/next/TemplateWizardPage/TemplateWizardPage.test.tsx @@ -29,7 +29,6 @@ import { } from '@backstage/plugin-scaffolder-react'; import { TemplateWizardPage } from './TemplateWizardPage'; import { rootRouteRef } from '../../routes'; -import { nextRouteRef } from '../routes'; jest.mock('react-router-dom', () => { return { @@ -84,8 +83,7 @@ describe('TemplateWizardPage', () => { , { mountedRoutes: { - '/create': nextRouteRef, - '/create-legacy': rootRouteRef, + '/create': rootRouteRef, }, }, ); diff --git a/plugins/scaffolder/src/next/TemplateWizardPage/TemplateWizardPage.tsx b/plugins/scaffolder/src/next/TemplateWizardPage/TemplateWizardPage.tsx index 4825715fcb..99f4a3b52d 100644 --- a/plugins/scaffolder/src/next/TemplateWizardPage/TemplateWizardPage.tsx +++ b/plugins/scaffolder/src/next/TemplateWizardPage/TemplateWizardPage.tsx @@ -34,11 +34,12 @@ import { } from '@backstage/plugin-scaffolder-react/alpha'; import { JsonValue } from '@backstage/types'; import { Header, Page } from '@backstage/core-components'; + import { - nextRouteRef, - nextScaffolderTaskRouteRef, - nextSelectedTemplateRouteRef, -} from '../routes'; + rootRouteRef, + scaffolderTaskRouteRef, + selectedTemplateRouteRef, +} from '../../routes'; export type TemplateWizardPageProps = { customFieldExtensions: NextFieldExtensionOptions[]; @@ -47,13 +48,13 @@ export type TemplateWizardPageProps = { }; export const TemplateWizardPage = (props: TemplateWizardPageProps) => { - const rootRef = useRouteRef(nextRouteRef); - const taskRoute = useRouteRef(nextScaffolderTaskRouteRef); + const rootRef = useRouteRef(rootRouteRef); + const taskRoute = useRouteRef(scaffolderTaskRouteRef); const { secrets } = useTemplateSecrets(); const scaffolderApi = useApi(scaffolderApiRef); const navigate = useNavigate(); const { templateName, namespace } = useRouteRefParams( - nextSelectedTemplateRouteRef, + selectedTemplateRouteRef, ); const templateRef = stringifyEntityRef({ diff --git a/plugins/scaffolder/src/next/index.ts b/plugins/scaffolder/src/next/index.ts index 1ca9096459..6cef3eaa03 100644 --- a/plugins/scaffolder/src/next/index.ts +++ b/plugins/scaffolder/src/next/index.ts @@ -17,4 +17,3 @@ export * from './Router'; export * from './TemplateListPage'; export * from './TemplateWizardPage'; export * from './types'; -export * from './routes'; diff --git a/plugins/scaffolder/src/next/routes.ts b/plugins/scaffolder/src/next/routes.ts deleted file mode 100644 index 12fad4210a..0000000000 --- a/plugins/scaffolder/src/next/routes.ts +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Copyright 2022 The Backstage Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { createRouteRef, createSubRouteRef } from '@backstage/core-plugin-api'; - -/** @alpha */ -export const nextRouteRef = createRouteRef({ - id: 'scaffolder/next', -}); - -/** @alpha */ -export const nextSelectedTemplateRouteRef = createSubRouteRef({ - id: 'scaffolder/next/selected-template', - parent: nextRouteRef, - path: '/templates/:namespace/:templateName', -}); - -/** @alpha */ -export const nextScaffolderTaskRouteRef = createSubRouteRef({ - id: 'scaffolder/next/task', - parent: nextRouteRef, - path: '/tasks/:taskId', -}); - -/** @alpha */ -export const nextScaffolderListTaskRouteRef = createSubRouteRef({ - id: 'scaffolder/next/list-tasks', - parent: nextRouteRef, - path: '/tasks', -}); - -/** @alpha */ -export const nextActionsRouteRef = createSubRouteRef({ - id: 'scaffolder/next/actions', - parent: nextRouteRef, - path: '/actions', -}); - -/** @alpha */ -export const nextEditRouteRef = createSubRouteRef({ - id: 'scaffolder/next/edit', - parent: nextRouteRef, - path: '/edit', -}); diff --git a/plugins/scaffolder/src/plugin.tsx b/plugins/scaffolder/src/plugin.tsx index f6801c6371..dfe87a3780 100644 --- a/plugins/scaffolder/src/plugin.tsx +++ b/plugins/scaffolder/src/plugin.tsx @@ -60,8 +60,10 @@ import { viewTechDocRouteRef, selectedTemplateRouteRef, scaffolderTaskRouteRef, + scaffolderListTaskRouteRef, + actionsRouteRef, + editRouteRef, } from './routes'; -import { nextRouteRef } from './next'; /** * The main plugin export for the scaffolder. @@ -91,6 +93,9 @@ export const scaffolderPlugin = createPlugin({ root: rootRouteRef, selectedTemplate: selectedTemplateRouteRef, ongoingTask: scaffolderTaskRouteRef, + actions: actionsRouteRef, + listTasks: scaffolderListTaskRouteRef, + edit: editRouteRef, }, externalRoutes: { registerComponent: registerComponentRouteRef, @@ -199,6 +204,6 @@ export const NextScaffolderPage = scaffolderPlugin.provide( createRoutableExtension({ name: 'NextScaffolderPage', component: () => import('./next/Router').then(m => m.Router), - mountPoint: nextRouteRef, + mountPoint: rootRouteRef, }), ); From f426dad11f143ab17c979381301f66f7e93e4c87 Mon Sep 17 00:00:00 2001 From: blam Date: Fri, 17 Mar 2023 13:56:17 +0100 Subject: [PATCH 172/177] chore: remove the exports Signed-off-by: blam --- plugins/scaffolder/alpha-api-report.md | 16 ---------------- plugins/scaffolder/api-report.md | 11 +++++++---- 2 files changed, 7 insertions(+), 20 deletions(-) diff --git a/plugins/scaffolder/alpha-api-report.md b/plugins/scaffolder/alpha-api-report.md index bf37acafc3..1fc77322bd 100644 --- a/plugins/scaffolder/alpha-api-report.md +++ b/plugins/scaffolder/alpha-api-report.md @@ -8,12 +8,9 @@ import { Entity } from '@backstage/catalog-model'; import { FormProps as FormProps_2 } from '@backstage/plugin-scaffolder-react/alpha'; import type { FormProps as FormProps_3 } from '@rjsf/core-v5'; -import { PathParams } from '@backstage/core-plugin-api'; import { PropsWithChildren } from 'react'; import { default as React_2 } from 'react'; -import { RouteRef } from '@backstage/core-plugin-api'; import { ScaffolderTaskOutput } from '@backstage/plugin-scaffolder-react'; -import { SubRouteRef } from '@backstage/core-plugin-api'; import { TemplateEntityV1beta3 } from '@backstage/plugin-scaffolder-common'; // @alpha @deprecated @@ -22,9 +19,6 @@ export type FormProps = Pick< 'transformErrors' | 'noHtml5Validate' >; -// @alpha (undocumented) -export const nextRouteRef: RouteRef; - // @alpha export type NextRouterProps = { components?: { @@ -50,16 +44,6 @@ export const NextScaffolderPage: ( props: PropsWithChildren, ) => JSX.Element; -// @alpha (undocumented) -export const nextScaffolderTaskRouteRef: SubRouteRef< - PathParams<'/tasks/:taskId'> ->; - -// @alpha (undocumented) -export const nextSelectedTemplateRouteRef: SubRouteRef< - PathParams<'/templates/:namespace/:templateName'> ->; - // @alpha (undocumented) export type TemplateGroupFilter = { title?: React_2.ReactNode; diff --git a/plugins/scaffolder/api-report.md b/plugins/scaffolder/api-report.md index 45d0b2675c..0ca5a8d1c3 100644 --- a/plugins/scaffolder/api-report.md +++ b/plugins/scaffolder/api-report.md @@ -110,8 +110,8 @@ export const EntityTagsPickerFieldExtension: FieldExtensionComponent_2< string[], { showCounts?: boolean | undefined; - kinds?: string[] | undefined; helperText?: string | undefined; + kinds?: string[] | undefined; } >; @@ -120,8 +120,8 @@ export const EntityTagsPickerFieldSchema: FieldSchema< string[], { showCounts?: boolean | undefined; - kinds?: string[] | undefined; helperText?: string | undefined; + kinds?: string[] | undefined; } >; @@ -259,8 +259,8 @@ export const RepoUrlPickerFieldExtension: FieldExtensionComponent_2< | { azure?: string[] | undefined; github?: string[] | undefined; - gitlab?: string[] | undefined; bitbucket?: string[] | undefined; + gitlab?: string[] | undefined; gerrit?: string[] | undefined; } | undefined; @@ -285,8 +285,8 @@ export const RepoUrlPickerFieldSchema: FieldSchema< | { azure?: string[] | undefined; github?: string[] | undefined; - gitlab?: string[] | undefined; bitbucket?: string[] | undefined; + gitlab?: string[] | undefined; gerrit?: string[] | undefined; } | undefined; @@ -425,6 +425,9 @@ export const scaffolderPlugin: BackstagePlugin< PathParams<'/templates/:namespace/:templateName'> >; ongoingTask: SubRouteRef>; + actions: SubRouteRef; + listTasks: SubRouteRef; + edit: SubRouteRef; }, { registerComponent: ExternalRouteRef; From 7b2be1827f5723e26586763684e632e942f77884 Mon Sep 17 00:00:00 2001 From: blam Date: Fri, 17 Mar 2023 13:58:28 +0100 Subject: [PATCH 173/177] chore: fix order Signed-off-by: blam --- plugins/scaffolder/api-report.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/plugins/scaffolder/api-report.md b/plugins/scaffolder/api-report.md index 0ca5a8d1c3..9b39d14db4 100644 --- a/plugins/scaffolder/api-report.md +++ b/plugins/scaffolder/api-report.md @@ -110,8 +110,8 @@ export const EntityTagsPickerFieldExtension: FieldExtensionComponent_2< string[], { showCounts?: boolean | undefined; - helperText?: string | undefined; kinds?: string[] | undefined; + helperText?: string | undefined; } >; @@ -120,8 +120,8 @@ export const EntityTagsPickerFieldSchema: FieldSchema< string[], { showCounts?: boolean | undefined; - helperText?: string | undefined; kinds?: string[] | undefined; + helperText?: string | undefined; } >; @@ -259,8 +259,8 @@ export const RepoUrlPickerFieldExtension: FieldExtensionComponent_2< | { azure?: string[] | undefined; github?: string[] | undefined; - bitbucket?: string[] | undefined; gitlab?: string[] | undefined; + bitbucket?: string[] | undefined; gerrit?: string[] | undefined; } | undefined; @@ -285,8 +285,8 @@ export const RepoUrlPickerFieldSchema: FieldSchema< | { azure?: string[] | undefined; github?: string[] | undefined; - bitbucket?: string[] | undefined; gitlab?: string[] | undefined; + bitbucket?: string[] | undefined; gerrit?: string[] | undefined; } | undefined; From cdab34fd9a233fe515a80e287ce4a1fdd2b9750e Mon Sep 17 00:00:00 2001 From: blam Date: Fri, 17 Mar 2023 13:59:57 +0100 Subject: [PATCH 174/177] chore: changeset Signed-off-by: blam --- .changeset/neat-donkeys-work.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/neat-donkeys-work.md diff --git a/.changeset/neat-donkeys-work.md b/.changeset/neat-donkeys-work.md new file mode 100644 index 0000000000..dfa3236d43 --- /dev/null +++ b/.changeset/neat-donkeys-work.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-scaffolder': minor +--- + +scaffolder/next: removing the `routeRefs` and exporting the originals on `scaffolderPlugin.routes.x` instead From ce2b0a63ed9c5e88f9840e53c94d9323bf19e9c3 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 17 Mar 2023 13:05:45 +0000 Subject: [PATCH 175/177] fix(deps): update dependency passport-oauth2 to v1.7.0 Signed-off-by: Renovate Bot --- yarn.lock | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/yarn.lock b/yarn.lock index 0c85e989c8..3a0c6349b3 100644 --- a/yarn.lock +++ b/yarn.lock @@ -31383,7 +31383,7 @@ __metadata: languageName: node linkType: hard -"passport-oauth2@npm:1.6.1, passport-oauth2@npm:1.x.x, passport-oauth2@npm:^1.1.2, passport-oauth2@npm:^1.4.0, passport-oauth2@npm:^1.6.0, passport-oauth2@npm:^1.6.1": +"passport-oauth2@npm:1.6.1": version: 1.6.1 resolution: "passport-oauth2@npm:1.6.1" dependencies: @@ -31396,6 +31396,19 @@ __metadata: languageName: node linkType: hard +"passport-oauth2@npm:1.x.x, passport-oauth2@npm:^1.1.2, passport-oauth2@npm:^1.4.0, passport-oauth2@npm:^1.6.0, passport-oauth2@npm:^1.6.1": + version: 1.7.0 + resolution: "passport-oauth2@npm:1.7.0" + dependencies: + base64url: 3.x.x + oauth: 0.9.x + passport-strategy: 1.x.x + uid2: 0.0.x + utils-merge: 1.x.x + checksum: 9e93f1f47ad5c22ef119932e03f383b503f692012352f27d2a416cc45ca5448c5a97f726da51753fff9a2ec2b6255ac27f1e68c4b44538530d2a8de682f17d42 + languageName: node + linkType: hard + "passport-oauth@npm:1.0.0, passport-oauth@npm:^1.0.0": version: 1.0.0 resolution: "passport-oauth@npm:1.0.0" From 79c5434082ee95c3e9764467eff1a241eb722f9d Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 17 Mar 2023 13:45:53 +0000 Subject: [PATCH 176/177] fix(deps): update dependency pg to v8.10.0 Signed-off-by: Renovate Bot --- yarn.lock | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/yarn.lock b/yarn.lock index 3a0c6349b3..a729538f7f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -31718,12 +31718,12 @@ __metadata: languageName: node linkType: hard -"pg-pool@npm:^3.5.2": - version: 3.5.2 - resolution: "pg-pool@npm:3.5.2" +"pg-pool@npm:^3.6.0": + version: 3.6.0 + resolution: "pg-pool@npm:3.6.0" peerDependencies: pg: ">=8.0" - checksum: a5d029200257671f0c17ca54b9ab6213e2060e64e5cc792b78edd50ab471a26cd364890d05d546d9296949e079e943821cf2ceb4d488f4e6a6789fb781a628bf + checksum: f3fe050fbfe27406369340c4c26efcbe21a388ace085a876453de0ea496a315c38b2dc739ac97d4767a359e911da2ec4810467f72601eeec8ad540e58b27987c languageName: node linkType: hard @@ -31748,13 +31748,13 @@ __metadata: linkType: hard "pg@npm:^8.3.0, pg@npm:^8.4.0": - version: 8.9.0 - resolution: "pg@npm:8.9.0" + version: 8.10.0 + resolution: "pg@npm:8.10.0" dependencies: buffer-writer: 2.0.0 packet-reader: 1.0.0 pg-connection-string: ^2.5.0 - pg-pool: ^3.5.2 + pg-pool: ^3.6.0 pg-protocol: ^1.6.0 pg-types: ^2.1.0 pgpass: 1.x @@ -31763,7 +31763,7 @@ __metadata: peerDependenciesMeta: pg-native: optional: true - checksum: dfd158955318f9ffb9428eaada29f3ee98b9eb07e87ed4b56589a19984d109f23bb8f88db78b7d7f870553e5b75ca0d58d0ed55755a8c6aed5df44e038c1d529 + checksum: c6be78f2e823f2ae3c618c8e54a6622592dd71b556fb665d7eaedcbcc2fa5d210a8bcf519401e72526a65b9d797f19b772f48f29b9d9f31e98dd526fd27d61e0 languageName: node linkType: hard From f2f1a7b76c4ee5d7971372be2fc14b3b9af2ad6c Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 17 Mar 2023 14:25:39 +0000 Subject: [PATCH 177/177] fix(deps): update dependency prom-client to v14.2.0 Signed-off-by: Renovate Bot --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 38c279e6d1..3cf7b49696 100644 --- a/yarn.lock +++ b/yarn.lock @@ -32596,11 +32596,11 @@ __metadata: linkType: hard "prom-client@npm:^14.0.1": - version: 14.1.1 - resolution: "prom-client@npm:14.1.1" + version: 14.2.0 + resolution: "prom-client@npm:14.2.0" dependencies: tdigest: ^0.1.1 - checksum: 7ff3e85636b1f0ca590b38ad7c7c5f9998b985c06a1c572ffffc69f052d5b4baf84c9124923e3824c63f78b5e8400081c6472173d04382ca296ebdf36d774a88 + checksum: d4c04e57616c72643dd02862d0d4bde09cf8869a19d0aef5e7b785e6e27d02439b66cdc165e3492f62d579fa91579183820870cc757a09b99399d2d02f46b9f1 languageName: node linkType: hard