diff --git a/plugins/3scale-backend/package.json b/plugins/3scale-backend/package.json index d2d0e4f5de..1e5c40cb92 100644 --- a/plugins/3scale-backend/package.json +++ b/plugins/3scale-backend/package.json @@ -52,7 +52,7 @@ }, "devDependencies": { "@backstage/cli": "0.26.11", - "@janus-idp/cli": "1.13.1", + "@janus-idp/cli": "1.13.2", "@types/supertest": "2.0.16", "msw": "1.3.3", "supertest": "6.3.4" diff --git a/plugins/argocd/package.json b/plugins/argocd/package.json index b73024de41..8c54d7bd2b 100644 --- a/plugins/argocd/package.json +++ b/plugins/argocd/package.json @@ -64,7 +64,7 @@ "@backstage/core-app-api": "1.14.1", "@backstage/dev-utils": "1.0.36", "@backstage/test-utils": "1.5.9", - "@janus-idp/cli": "1.13.1", + "@janus-idp/cli": "1.13.2", "@playwright/test": "1.45.3", "@redhat-developer/red-hat-developer-hub-theme": "0.2.0", "@testing-library/jest-dom": "6.4.8", diff --git a/plugins/catalog-backend-module-scaffolder-relation-processor/.eslintrc.js b/plugins/catalog-backend-module-scaffolder-relation-processor/.eslintrc.js deleted file mode 100644 index e2a53a6ad2..0000000000 --- a/plugins/catalog-backend-module-scaffolder-relation-processor/.eslintrc.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = require('@backstage/cli/config/eslint-factory')(__dirname); diff --git a/plugins/catalog-backend-module-scaffolder-relation-processor/CHANGELOG.md b/plugins/catalog-backend-module-scaffolder-relation-processor/CHANGELOG.md deleted file mode 100644 index edbf9bcb1f..0000000000 --- a/plugins/catalog-backend-module-scaffolder-relation-processor/CHANGELOG.md +++ /dev/null @@ -1,74 +0,0 @@ -### Dependencies - -* **@janus-idp/cli:** upgraded to 1.13.1 - -## @janus-idp/backstage-plugin-catalog-backend-module-scaffolder-relation-processor [1.3.1](https://github.com/janus-idp/backstage-plugins/compare/@janus-idp/backstage-plugin-catalog-backend-module-scaffolder-relation-processor@1.3.0...@janus-idp/backstage-plugin-catalog-backend-module-scaffolder-relation-processor@1.3.1) (2024-07-26) - -## @janus-idp/backstage-plugin-catalog-backend-module-scaffolder-relation-processor [1.3.0](https://github.com/janus-idp/backstage-plugins/compare/@janus-idp/backstage-plugin-catalog-backend-module-scaffolder-relation-processor@1.2.1...@janus-idp/backstage-plugin-catalog-backend-module-scaffolder-relation-processor@1.3.0) (2024-07-25) - - -### Features - -* **deps:** update to backstage 1.29 ([#1900](https://github.com/janus-idp/backstage-plugins/issues/1900)) ([f53677f](https://github.com/janus-idp/backstage-plugins/commit/f53677fb02d6df43a9de98c43a9f101a6db76802)) - - - -### Dependencies - -* **@janus-idp/cli:** upgraded to 1.13.0 - -## @janus-idp/backstage-plugin-catalog-backend-module-scaffolder-relation-processor [1.2.1](https://github.com/janus-idp/backstage-plugins/compare/@janus-idp/backstage-plugin-catalog-backend-module-scaffolder-relation-processor@1.2.0...@janus-idp/backstage-plugin-catalog-backend-module-scaffolder-relation-processor@1.2.1) (2024-07-25) - - - -### Dependencies - -* **@janus-idp/cli:** upgraded to 1.12.1 - -## @janus-idp/backstage-plugin-catalog-backend-module-scaffolder-relation-processor [1.2.0](https://github.com/janus-idp/backstage-plugins/compare/@janus-idp/backstage-plugin-catalog-backend-module-scaffolder-relation-processor@1.1.1...@janus-idp/backstage-plugin-catalog-backend-module-scaffolder-relation-processor@1.2.0) (2024-07-23) - - -### Features - -* **deps:** update to backstage 1.28 ([#1891](https://github.com/janus-idp/backstage-plugins/issues/1891)) ([1ba1108](https://github.com/janus-idp/backstage-plugins/commit/1ba11088e0de60e90d138944267b83600dc446e5)) - -## @janus-idp/backstage-plugin-catalog-backend-module-scaffolder-relation-processor [1.1.1](https://github.com/janus-idp/backstage-plugins/compare/@janus-idp/backstage-plugin-catalog-backend-module-scaffolder-relation-processor@1.1.0...@janus-idp/backstage-plugin-catalog-backend-module-scaffolder-relation-processor@1.1.1) (2024-06-19) - - - -### Dependencies - -* **@janus-idp/cli:** upgraded to 1.11.1 - -## @janus-idp/backstage-plugin-catalog-backend-module-scaffolder-relation-processor [1.1.0](https://github.com/janus-idp/backstage-plugins/compare/@janus-idp/backstage-plugin-catalog-backend-module-scaffolder-relation-processor@1.0.4...@janus-idp/backstage-plugin-catalog-backend-module-scaffolder-relation-processor@1.1.0) (2024-06-13) - - -### Features - -* **deps:** update to backstage 1.27 ([#1683](https://github.com/janus-idp/backstage-plugins/issues/1683)) ([a14869c](https://github.com/janus-idp/backstage-plugins/commit/a14869c3f4177049cb8d6552b36c3ffd17e7997d)) - - - -### Dependencies - -* **@janus-idp/cli:** upgraded to 1.11.0 - -## @janus-idp/backstage-plugin-catalog-backend-module-scaffolder-relation-processor [1.0.4](https://github.com/janus-idp/backstage-plugins/compare/@janus-idp/backstage-plugin-catalog-backend-module-scaffolder-relation-processor@1.0.3...@janus-idp/backstage-plugin-catalog-backend-module-scaffolder-relation-processor@1.0.4) (2024-06-13) - - - -### Dependencies - -* **@janus-idp/cli:** upgraded to 1.10.1 - -## @janus-idp/backstage-plugin-catalog-backend-module-scaffolder-relation-processor [1.0.3](https://github.com/janus-idp/backstage-plugins/compare/@janus-idp/backstage-plugin-catalog-backend-module-scaffolder-relation-processor@1.0.2...@janus-idp/backstage-plugin-catalog-backend-module-scaffolder-relation-processor@1.0.3) (2024-06-05) - - - -### Dependencies - -* **@janus-idp/cli:** upgraded to 1.10.0 - -## @janus-idp/backstage-plugin-catalog-backend-module-scaffolder-relation-processor [1.0.2](https://github.com/janus-idp/backstage-plugins/compare/@janus-idp/backstage-plugin-catalog-backend-module-scaffolder-relation-processor@1.0.1...@janus-idp/backstage-plugin-catalog-backend-module-scaffolder-relation-processor@1.0.2) (2024-06-04) - -## @janus-idp/backstage-plugin-catalog-backend-module-scaffolder-relation-processor [1.0.1](https://github.com/janus-idp/backstage-plugins/compare/@janus-idp/backstage-plugin-catalog-backend-module-scaffolder-relation-processor@1.0.0...@janus-idp/backstage-plugin-catalog-backend-module-scaffolder-relation-processor@1.0.1) (2024-06-03) diff --git a/plugins/catalog-backend-module-scaffolder-relation-processor/README.md b/plugins/catalog-backend-module-scaffolder-relation-processor/README.md index 25c9df0f60..d049f1f906 100644 --- a/plugins/catalog-backend-module-scaffolder-relation-processor/README.md +++ b/plugins/catalog-backend-module-scaffolder-relation-processor/README.md @@ -7,74 +7,3 @@ Please use the **[@backstage-community/plugin-catalog-backend-module-scaffolder- # Catalog Backend Module for Scaffolder Relation Catalog Processor This is an extension module to the catalog-backend plugin, providing an additional catalog entity processor that adds a new relation that depends on the `spec.scaffoldedFrom` field to link scaffolder templates and the catalog entities they generated. - -## Getting Started - -1. Install the scaffolder relation catalog processor module using the following command: - - ```console - yarn workspace backend add @janus-idp/backstage-plugin-catalog-backend-module-scaffolder-relation-processor - ``` - -### Installing on the new backend system - -To install this module into the [new backend system](https://backstage.io/docs/backend-system/), add the following into the `packages/backend/src/index.ts` file: - -```ts title="packages/backend/src/index.ts -const backend = createBackend(); - -// highlight-add-start -backend.add( - import( - '@janus-idp/backstage-plugin-catalog-backend-module-scaffolder-relation-processor/alpha' - ), -); -// highlight-add-end - -backend.start(); -``` - -### Installing on the legacy backend system - -To install this module into the legacy backend system, add the following to the `packages/backend/src/plugins/catalog.ts` file: - -```ts title=packages/backend/src/plugins/catalog.ts -// highlight-add-start -import { ScaffolderRelationEntityProcessor } from '@janus-idp/backstage-plugin-catalog-backend-module-scaffolder-relation-processor'; - -// highlight-add-end - -export default async function createPlugin( - env: PluginEnvironment, -): Promise { - const builder = await CatalogBuilder.create(env); - - /* ... other processors and/or providers ... */ - // highlight-add-start - builder.addProcessor(new ScaffolderRelationEntityProcessor()); - // highlight-add-end - - const { processingEngine, router } = await builder.build(); - await processingEngine.start(); - - return router; -} -``` - -### Usage - -Catalog entities containing the `spec.scaffoldedFrom` field will have a relation link be formed between it and the `template` corresponding to the entity ref in the `spec.scaffoldedFrom` field. - -This link can be viewed in the `relations` field of the Raw YAML view of a catalog entity when inspecting an entity. In the entity with the `spec.scaffoldedFrom` field, the relation type is `scaffoldedFrom` with a target pointing to the value of the `spec.scaffoldedFrom` field. Conversely, for the target template, it will have a relation type of `ScaffolderOf` with a target pointing to the entity with the `spec.scaffoldedFrom` field. - -These relations should also appear on the `EntityCatalogGraphView` component from the `@backstage/plugin-catalog-graph` package (only if the entity corresponding to the entity ref exists in the catalog). - -#### Example graph view - -![scaffoldedFrom Relation Graph View](./docs/example-images/scaffoldedFromGraphView.png) -![scaffolderOf Relation Graph View](./docs/example-images/scaffolderOfGraphView.png) - -#### Example Raw YAML view - -![scaffoldedFrom Relation YAML View](./docs/example-images/scaffoldedFromYAMLView.png) -![scaffoldedOf Relation YAML View](./docs/example-images/scaffolderOfYAMLView.png) diff --git a/plugins/catalog-backend-module-scaffolder-relation-processor/app-config.janus-idp.yaml b/plugins/catalog-backend-module-scaffolder-relation-processor/app-config.janus-idp.yaml deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/plugins/catalog-backend-module-scaffolder-relation-processor/catalog-info.yaml b/plugins/catalog-backend-module-scaffolder-relation-processor/catalog-info.yaml deleted file mode 100644 index 49becb32e8..0000000000 --- a/plugins/catalog-backend-module-scaffolder-relation-processor/catalog-info.yaml +++ /dev/null @@ -1,55 +0,0 @@ -# https://backstage.io/docs/features/software-catalog/descriptor-format#kind-component -apiVersion: backstage.io/v1alpha1 -kind: Component -metadata: - name: janus-idp-catalog-scaffolder-relation-processor - title: Catalog relation scaffolder processor - description: Catalog Backend Module for Scaffolder Relation Catalog Processor - annotations: - backstage.io/source-location: url:https://github.com/janus-idp/backstage-plugins/tree/main/plugins/catalog-backend-module-scaffolder-relation-processor - backstage.io/view-url: https://github.com/janus-idp/backstage-plugins/blob/main/plugins/catalog-backend-module-scaffolder-relation-processor/catalog-info.yaml - backstage.io/edit-url: https://github.com/janus-idp/backstage-plugins/edit/main/plugins/catalog-backend-module-scaffolder-relation-processor/catalog-info.yaml - github.com/project-slug: janus-idp/backstage-plugins - github.com/team-slug: janus-idp/maintainers-plugins - sonarqube.org/project-key: janus-idp_backstage-plugins - tags: - - scaffolder - links: - - url: https://github.com/janus-idp/backstage-plugins/tree/main/plugins/catalog-backend-module-scaffolder-relation-processor - title: GitHub Source - icon: source - type: source -spec: - type: backstage-plugin - lifecycle: production - owner: rhdh-team - system: rhdh - subcomponentOf: janus-idp-backstage-plugins ---- -# https://backstage.io/docs/features/software-catalog/descriptor-format#kind-component -apiVersion: backstage.io/v1alpha1 -kind: Component -metadata: - name: janus-idp-catalog-backend-module-scaffolder-relation-processor - title: '@janus-idp/backstage-plugin-catalog-backend-module-scaffolder-relation-processor' - description: Catalog Backend Module for Scaffolder Relation Catalog Processor - annotations: - backstage.io/source-location: url:https://github.com/janus-idp/backstage-plugins/tree/main/plugins/catalog-backend-module-scaffolder-relation-processor - backstage.io/view-url: https://github.com/janus-idp/backstage-plugins/blob/main/plugins/catalog-backend-module-scaffolder-relation-processor/catalog-info.yaml - backstage.io/edit-url: https://github.com/janus-idp/backstage-plugins/edit/main/plugins/catalog-backend-module-scaffolder-relation-processor/catalog-info.yaml - github.com/project-slug: janus-idp/backstage-plugins - github.com/team-slug: janus-idp/maintainers-plugins - sonarqube.org/project-key: janus-idp_backstage-plugins - tags: - - scaffolder - links: - - url: https://github.com/janus-idp/backstage-plugins/tree/main/plugins/catalog-backend-module-scaffolder-relation-processor - title: GitHub Source - icon: source - type: source -spec: - type: backstage-backend-plugin-module - lifecycle: production - owner: rhdh-team - system: rhdh - subcomponentOf: janus-idp-catalog-scaffolder-relation-processor diff --git a/plugins/catalog-backend-module-scaffolder-relation-processor/config.d.ts b/plugins/catalog-backend-module-scaffolder-relation-processor/config.d.ts deleted file mode 100644 index 5728ccd9e1..0000000000 --- a/plugins/catalog-backend-module-scaffolder-relation-processor/config.d.ts +++ /dev/null @@ -1 +0,0 @@ -export interface Config {} diff --git a/plugins/catalog-backend-module-scaffolder-relation-processor/dist-dynamic/package.json b/plugins/catalog-backend-module-scaffolder-relation-processor/dist-dynamic/package.json deleted file mode 100644 index 36dcb9b067..0000000000 --- a/plugins/catalog-backend-module-scaffolder-relation-processor/dist-dynamic/package.json +++ /dev/null @@ -1,72 +0,0 @@ -{ - "name": "@janus-idp/backstage-plugin-catalog-backend-module-scaffolder-relation-processor-dynamic", - "description": "The scaffolder-relation-processor backend module for the catalog plugin.", - "version": "1.3.2", - "main": "./dist/index.cjs.js", - "types": "src/index.ts", - "license": "Apache-2.0", - "publishConfig": { - "access": "public" - }, - "backstage": { - "role": "backend-plugin-module", - "supported-versions": "1.28.4", - "pluginId": "catalog", - "pluginPackage": "@backstage/plugin-catalog-backend" - }, - "exports": { - ".": { - "require": "./dist/index.cjs.js", - "default": "./dist/index.cjs.js" - }, - "./alpha": { - "require": "./dist/alpha.cjs.js", - "default": "./dist/alpha.cjs.js" - }, - "./package.json": "./package.json" - }, - "scripts": {}, - "dependencies": {}, - "devDependencies": {}, - "files": [ - "dist", - "config.d.ts", - "app-config.janus-idp.yaml", - "alpha" - ], - "configSchema": "config.d.ts", - "repository": { - "type": "git", - "url": "https://github.com/janus-idp/backstage-plugins", - "directory": "plugins/catalog-backend-module-scaffolder-relation-processor" - }, - "keywords": [ - "support:tech-preview", - "lifecycle:active", - "backstage", - "plugin" - ], - "homepage": "https://red.ht/rhdh", - "bugs": "https://github.com/janus-idp/backstage-plugins/issues", - "maintainers": [ - "@janus-idp/maintainers-plugins" - ], - "author": "Red Hat", - "bundleDependencies": true, - "peerDependencies": { - "@backstage/backend-common": "^0.23.3", - "@backstage/backend-dynamic-feature-service": "^0.2.15", - "@backstage/backend-plugin-api": "^0.7.0", - "@backstage/catalog-model": "^1.5.0", - "@backstage/plugin-catalog-common": "^1.0.25", - "@backstage/plugin-catalog-node": "^1.12.4" - }, - "overrides": { - "@aws-sdk/util-utf8-browser": { - "@smithy/util-utf8": "^2.0.0" - } - }, - "resolutions": { - "@aws-sdk/util-utf8-browser": "npm:@smithy/util-utf8@~2" - } -} diff --git a/plugins/catalog-backend-module-scaffolder-relation-processor/dist-dynamic/yarn.lock b/plugins/catalog-backend-module-scaffolder-relation-processor/dist-dynamic/yarn.lock deleted file mode 100644 index 3ec78ad6cb..0000000000 --- a/plugins/catalog-backend-module-scaffolder-relation-processor/dist-dynamic/yarn.lock +++ /dev/null @@ -1,31 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"@aws-sdk/util-utf8-browser@npm:@smithy/util-utf8@~2": - version "2.3.0" - resolved "https://registry.yarnpkg.com/@smithy/util-utf8/-/util-utf8-2.3.0.tgz#dd96d7640363259924a214313c3cf16e7dd329c5" - integrity sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A== - dependencies: - "@smithy/util-buffer-from" "^2.2.0" - tslib "^2.6.2" - -"@smithy/is-array-buffer@^2.2.0": - version "2.2.0" - resolved "https://registry.yarnpkg.com/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz#f84f0d9f9a36601a9ca9381688bd1b726fd39111" - integrity sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA== - dependencies: - tslib "^2.6.2" - -"@smithy/util-buffer-from@^2.2.0": - version "2.2.0" - resolved "https://registry.yarnpkg.com/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz#6fc88585165ec73f8681d426d96de5d402021e4b" - integrity sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA== - dependencies: - "@smithy/is-array-buffer" "^2.2.0" - tslib "^2.6.2" - -tslib@^2.6.2: - version "2.6.3" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.3.tgz#0438f810ad7a9edcde7a241c3d80db693c8cbfe0" - integrity sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ== diff --git a/plugins/catalog-backend-module-scaffolder-relation-processor/docs/example-images/scaffoldedFromGraphView.png b/plugins/catalog-backend-module-scaffolder-relation-processor/docs/example-images/scaffoldedFromGraphView.png deleted file mode 100644 index c2505a2c45..0000000000 Binary files a/plugins/catalog-backend-module-scaffolder-relation-processor/docs/example-images/scaffoldedFromGraphView.png and /dev/null differ diff --git a/plugins/catalog-backend-module-scaffolder-relation-processor/docs/example-images/scaffoldedFromYAMLView.png b/plugins/catalog-backend-module-scaffolder-relation-processor/docs/example-images/scaffoldedFromYAMLView.png deleted file mode 100644 index a34b563b56..0000000000 Binary files a/plugins/catalog-backend-module-scaffolder-relation-processor/docs/example-images/scaffoldedFromYAMLView.png and /dev/null differ diff --git a/plugins/catalog-backend-module-scaffolder-relation-processor/docs/example-images/scaffolderOfGraphView.png b/plugins/catalog-backend-module-scaffolder-relation-processor/docs/example-images/scaffolderOfGraphView.png deleted file mode 100644 index 07cd9bb746..0000000000 Binary files a/plugins/catalog-backend-module-scaffolder-relation-processor/docs/example-images/scaffolderOfGraphView.png and /dev/null differ diff --git a/plugins/catalog-backend-module-scaffolder-relation-processor/docs/example-images/scaffolderOfYAMLView.png b/plugins/catalog-backend-module-scaffolder-relation-processor/docs/example-images/scaffolderOfYAMLView.png deleted file mode 100644 index 4abf7076a6..0000000000 Binary files a/plugins/catalog-backend-module-scaffolder-relation-processor/docs/example-images/scaffolderOfYAMLView.png and /dev/null differ diff --git a/plugins/catalog-backend-module-scaffolder-relation-processor/package.json b/plugins/catalog-backend-module-scaffolder-relation-processor/package.json deleted file mode 100644 index 4ddbdfd94b..0000000000 --- a/plugins/catalog-backend-module-scaffolder-relation-processor/package.json +++ /dev/null @@ -1,84 +0,0 @@ -{ - "name": "@janus-idp/backstage-plugin-catalog-backend-module-scaffolder-relation-processor", - "description": "The scaffolder-relation-processor backend module for the catalog plugin.", - "version": "1.3.2", - "private": true, - "main": "src/index.ts", - "types": "src/index.ts", - "license": "Apache-2.0", - "publishConfig": { - "access": "public" - }, - "backstage": { - "role": "backend-plugin-module", - "supported-versions": "1.28.4", - "pluginId": "catalog", - "pluginPackage": "@backstage/plugin-catalog-backend" - }, - "exports": { - ".": "./src/index.ts", - "./alpha": "./src/alpha.ts", - "./package.json": "./package.json" - }, - "typesVersions": { - "*": { - "alpha": [ - "src/alpha.ts" - ], - "package.json": [ - "package.json" - ] - } - }, - "scripts": { - "build": "backstage-cli package build", - "clean": "backstage-cli package clean", - "export-dynamic": "janus-cli package export-dynamic-plugin --no-embed-as-dependencies", - "lint": "backstage-cli package lint", - "postpack": "backstage-cli package postpack", - "postversion": "yarn run export-dynamic", - "prepack": "backstage-cli package prepack", - "start": "backstage-cli package start", - "test": "backstage-cli package test --passWithNoTests --coverage", - "tsc": "tsc" - }, - "dependencies": { - "@backstage/backend-common": "^0.23.3", - "@backstage/backend-dynamic-feature-service": "^0.2.15", - "@backstage/backend-plugin-api": "^0.7.0", - "@backstage/catalog-model": "^1.5.0", - "@backstage/plugin-catalog-common": "^1.0.25", - "@backstage/plugin-catalog-node": "^1.12.4" - }, - "devDependencies": { - "@backstage/backend-test-utils": "0.4.4", - "@backstage/cli": "0.26.11", - "@janus-idp/cli": "1.13.1" - }, - "files": [ - "dist", - "config.d.ts", - "dist-dynamic/*.*", - "dist-dynamic/dist/**", - "dist-dynamic/alpha/*", - "app-config.janus-idp.yaml" - ], - "configSchema": "config.d.ts", - "repository": { - "type": "git", - "url": "https://github.com/janus-idp/backstage-plugins", - "directory": "plugins/catalog-backend-module-scaffolder-relation-processor" - }, - "keywords": [ - "support:tech-preview", - "lifecycle:active", - "backstage", - "plugin" - ], - "homepage": "https://red.ht/rhdh", - "bugs": "https://github.com/janus-idp/backstage-plugins/issues", - "maintainers": [ - "@janus-idp/maintainers-plugins" - ], - "author": "Red Hat" -} diff --git a/plugins/catalog-backend-module-scaffolder-relation-processor/src/ScaffolderRelationEntityProcessor.test.ts b/plugins/catalog-backend-module-scaffolder-relation-processor/src/ScaffolderRelationEntityProcessor.test.ts deleted file mode 100644 index 6083103d18..0000000000 --- a/plugins/catalog-backend-module-scaffolder-relation-processor/src/ScaffolderRelationEntityProcessor.test.ts +++ /dev/null @@ -1,82 +0,0 @@ -import { Entity } from '@backstage/catalog-model'; - -import { ScaffolderRelationEntityProcessor } from './ScaffolderRelationEntityProcessor'; - -describe('ScaffolderRelationEntityProcessor', () => { - describe('postProcessEntity', () => { - const processor = new ScaffolderRelationEntityProcessor(); - const location = { type: 'url', target: 'test-url' }; - const emit = jest.fn(); - - afterEach(() => jest.resetAllMocks()); - - it('generates relations for any arbitrary entity', async () => { - const entity: Entity = { - apiVersion: 'backstage.io/v1alpha1', - kind: 'Component', - metadata: { name: 'test-entity' }, - spec: { - scaffoldedFrom: 'test-template', - }, - }; - - await processor.postProcessEntity(entity, location, emit); - expect(emit).toHaveBeenCalledTimes(2); - expect(emit).toHaveBeenCalledWith({ - type: 'relation', - relation: { - source: { - kind: 'Template', - namespace: 'default', - name: 'test-template', - }, - type: 'scaffolderOf', - target: { - kind: 'Component', - namespace: 'default', - name: 'test-entity', - }, - }, - }); - expect(emit).toHaveBeenCalledWith({ - type: 'relation', - relation: { - source: { - kind: 'Component', - namespace: 'default', - name: 'test-entity', - }, - type: 'scaffoldedFrom', - target: { - kind: 'Template', - namespace: 'default', - name: 'test-template', - }, - }, - }); - }); - it('generates no relations if the `spec.scaffoldedFrom` field is empty or does not exist', async () => { - const entity: Entity = { - apiVersion: 'backstage.io/v1alpha1', - kind: 'Component', - metadata: { name: 'n' }, - spec: { - type: 'service', - }, - }; - await processor.postProcessEntity(entity, location, emit); - expect(emit).toHaveBeenCalledTimes(0); - - const entity2: Entity = { - apiVersion: 'backstage.io/v1alpha1', - kind: 'Component', - metadata: { name: 'n' }, - spec: { - scaffoldedFrom: '', - }, - }; - await processor.postProcessEntity(entity2, location, emit); - expect(emit).toHaveBeenCalledTimes(0); - }); - }); -}); diff --git a/plugins/catalog-backend-module-scaffolder-relation-processor/src/ScaffolderRelationEntityProcessor.ts b/plugins/catalog-backend-module-scaffolder-relation-processor/src/ScaffolderRelationEntityProcessor.ts deleted file mode 100644 index b906ad2cd8..0000000000 --- a/plugins/catalog-backend-module-scaffolder-relation-processor/src/ScaffolderRelationEntityProcessor.ts +++ /dev/null @@ -1,80 +0,0 @@ -import { - Entity, - getCompoundEntityRef, - parseEntityRef, -} from '@backstage/catalog-model'; -import { LocationSpec } from '@backstage/plugin-catalog-common'; -import { - CatalogProcessor, - CatalogProcessorEmit, - processingResult, -} from '@backstage/plugin-catalog-node'; - -import { RELATION_SCAFFOLDED_FROM, RELATION_SCAFFOLDER_OF } from './relations'; -import { ScaffoldedFromSpec } from './types'; - -/** @public */ -export class ScaffolderRelationEntityProcessor implements CatalogProcessor { - getProcessorName(): string { - return 'ScaffolderRelationEntityProcessor'; - } - - async postProcessEntity( - entity: Entity, - _location: LocationSpec, - emit: CatalogProcessorEmit, - ): Promise { - const selfRef = getCompoundEntityRef(entity); - - /** - * Utilities - */ - function doEmit( - targets: string | string[] | undefined, - context: { defaultKind?: string; defaultNamespace: string }, - outgoingRelation: string, - incomingRelation: string, - ): void { - if (!targets) { - return; - } - for (const target of [targets].flat()) { - const targetRef = parseEntityRef(target, context); - emit( - processingResult.relation({ - source: selfRef, - type: outgoingRelation, - target: { - kind: targetRef.kind, - namespace: targetRef.namespace, - name: targetRef.name, - }, - }), - ); - emit( - processingResult.relation({ - source: { - kind: targetRef.kind, - namespace: targetRef.namespace, - name: targetRef.name, - }, - type: incomingRelation, - target: selfRef, - }), - ); - } - } - - /** - * Emit relations for entities generated by templates (can be any entity type) - */ - const arbitraryEntity = entity as Entity & Partial; - doEmit( - arbitraryEntity.spec?.scaffoldedFrom, - { defaultKind: 'Template', defaultNamespace: selfRef.namespace }, - RELATION_SCAFFOLDED_FROM, - RELATION_SCAFFOLDER_OF, - ); - return entity; - } -} diff --git a/plugins/catalog-backend-module-scaffolder-relation-processor/src/alpha.ts b/plugins/catalog-backend-module-scaffolder-relation-processor/src/alpha.ts deleted file mode 100644 index 99b12e6c00..0000000000 --- a/plugins/catalog-backend-module-scaffolder-relation-processor/src/alpha.ts +++ /dev/null @@ -1,8 +0,0 @@ -/***/ -/** - * The scaffolder-relation-processor backend module for the catalog-backend plugin. - * - * @packageDocumentation - */ - -export { catalogModuleScaffolderRelationProcessor as default } from './module'; diff --git a/plugins/catalog-backend-module-scaffolder-relation-processor/src/dynamic/index.ts b/plugins/catalog-backend-module-scaffolder-relation-processor/src/dynamic/index.ts deleted file mode 100644 index 2f8d2c4ae8..0000000000 --- a/plugins/catalog-backend-module-scaffolder-relation-processor/src/dynamic/index.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { BackendDynamicPluginInstaller } from '@backstage/backend-dynamic-feature-service'; - -import { ScaffolderRelationEntityProcessor } from '../ScaffolderRelationEntityProcessor'; - -export const dynamicPluginInstaller: BackendDynamicPluginInstaller = { - kind: 'legacy', - async catalog(builder) { - builder.addProcessor(new ScaffolderRelationEntityProcessor()); - }, -}; diff --git a/plugins/catalog-backend-module-scaffolder-relation-processor/src/index.ts b/plugins/catalog-backend-module-scaffolder-relation-processor/src/index.ts deleted file mode 100644 index a37b906d27..0000000000 --- a/plugins/catalog-backend-module-scaffolder-relation-processor/src/index.ts +++ /dev/null @@ -1,4 +0,0 @@ -export * from './relations'; -export * from './types'; -export * from './dynamic/index'; -export * from './ScaffolderRelationEntityProcessor'; diff --git a/plugins/catalog-backend-module-scaffolder-relation-processor/src/module.ts b/plugins/catalog-backend-module-scaffolder-relation-processor/src/module.ts deleted file mode 100644 index 99b62cb5f7..0000000000 --- a/plugins/catalog-backend-module-scaffolder-relation-processor/src/module.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { - coreServices, - createBackendModule, -} from '@backstage/backend-plugin-api'; -import { catalogProcessingExtensionPoint } from '@backstage/plugin-catalog-node/alpha'; - -import { ScaffolderRelationEntityProcessor } from './ScaffolderRelationEntityProcessor'; - -export const catalogModuleScaffolderRelationProcessor = createBackendModule({ - pluginId: 'catalog', - moduleId: 'scaffolder-relation-processor', - register(env) { - env.registerInit({ - deps: { - catalog: catalogProcessingExtensionPoint, - logger: coreServices.logger, - }, - async init({ catalog, logger }) { - logger.debug( - 'Registering the scaffolder-relation-processor catalog module', - ); - catalog.addProcessor(new ScaffolderRelationEntityProcessor()); - }, - }); - }, -}); diff --git a/plugins/catalog-backend-module-scaffolder-relation-processor/src/relations.ts b/plugins/catalog-backend-module-scaffolder-relation-processor/src/relations.ts deleted file mode 100644 index 950e28cfcc..0000000000 --- a/plugins/catalog-backend-module-scaffolder-relation-processor/src/relations.ts +++ /dev/null @@ -1,15 +0,0 @@ -/** - * A relation from a scaffolder template entity to the entity it generated. - * Reverse direction of {@link RELATION_SCAFFOLDED_FROM} - * - * @public - */ -export const RELATION_SCAFFOLDER_OF = 'scaffolderOf'; - -/** - * A relation of an entity generated from a scaffolder template entity - * Reverse direction of {@link RELATION_SCAFFOLDER_OF} - * - * @public - */ -export const RELATION_SCAFFOLDED_FROM = 'scaffoldedFrom'; diff --git a/plugins/catalog-backend-module-scaffolder-relation-processor/src/types.ts b/plugins/catalog-backend-module-scaffolder-relation-processor/src/types.ts deleted file mode 100644 index 7ba6eee8b5..0000000000 --- a/plugins/catalog-backend-module-scaffolder-relation-processor/src/types.ts +++ /dev/null @@ -1,11 +0,0 @@ -/** - * Extension of the `spec` field of the entity model - * Used to form relations between entities and the scaffolder templates that generated them - * - * @public - */ -export type ScaffoldedFromSpec = { - spec: { - scaffoldedFrom: string; - }; -}; diff --git a/plugins/catalog-backend-module-scaffolder-relation-processor/tsconfig.json b/plugins/catalog-backend-module-scaffolder-relation-processor/tsconfig.json deleted file mode 100644 index 36a7cf7031..0000000000 --- a/plugins/catalog-backend-module-scaffolder-relation-processor/tsconfig.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "extends": "@backstage/cli/config/tsconfig.json", - "include": ["src"], - "exclude": ["node_modules"], - "compilerOptions": { - "outDir": "../../dist-types/plugins/catalog-backend-module-scaffolder-relation-processor", - "rootDir": "." - } -} diff --git a/plugins/catalog-backend-module-scaffolder-relation-processor/turbo.json b/plugins/catalog-backend-module-scaffolder-relation-processor/turbo.json deleted file mode 100644 index 529ed8057a..0000000000 --- a/plugins/catalog-backend-module-scaffolder-relation-processor/turbo.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "extends": ["//"], - "pipeline": { - "tsc": { - "outputs": [ - "../../dist-types/plugins/catalog-backend-module-scaffolder-relation-processor/**" - ], - "dependsOn": ["^tsc"] - } - } -} diff --git a/plugins/feedback-backend/.eslintrc.js b/plugins/feedback-backend/.eslintrc.js deleted file mode 100644 index e2a53a6ad2..0000000000 --- a/plugins/feedback-backend/.eslintrc.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = require('@backstage/cli/config/eslint-factory')(__dirname); diff --git a/plugins/feedback-backend/.versionhistory.md b/plugins/feedback-backend/.versionhistory.md deleted file mode 100644 index af6f3c681b..0000000000 --- a/plugins/feedback-backend/.versionhistory.md +++ /dev/null @@ -1 +0,0 @@ -- Bumped to 1.2.0 in main branch for next release 1.2.0 diff --git a/plugins/feedback-backend/CHANGELOG.md b/plugins/feedback-backend/CHANGELOG.md deleted file mode 100644 index ea6a3613af..0000000000 --- a/plugins/feedback-backend/CHANGELOG.md +++ /dev/null @@ -1,208 +0,0 @@ -### Dependencies - -* **@janus-idp/cli:** upgraded to 1.13.1 - -## @janus-idp/backstage-plugin-feedback-backend [1.7.0](https://github.com/janus-idp/backstage-plugins/compare/@janus-idp/backstage-plugin-feedback-backend@1.6.0...@janus-idp/backstage-plugin-feedback-backend@1.7.0) (2024-07-26) - - -### Features - -* **deps:** update to backstage 1.29 ([#1900](https://github.com/janus-idp/backstage-plugins/issues/1900)) ([f53677f](https://github.com/janus-idp/backstage-plugins/commit/f53677fb02d6df43a9de98c43a9f101a6db76802)) - -## @janus-idp/backstage-plugin-feedback-backend [1.6.0](https://github.com/janus-idp/backstage-plugins/compare/@janus-idp/backstage-plugin-feedback-backend@1.5.1...@janus-idp/backstage-plugin-feedback-backend@1.6.0) (2024-07-24) - - -### Features - -* **deps:** update to backstage 1.28 ([#1891](https://github.com/janus-idp/backstage-plugins/issues/1891)) ([1ba1108](https://github.com/janus-idp/backstage-plugins/commit/1ba11088e0de60e90d138944267b83600dc446e5)) - -## @janus-idp/backstage-plugin-feedback-backend [1.5.1](https://github.com/janus-idp/backstage-plugins/compare/@janus-idp/backstage-plugin-feedback-backend@1.5.0...@janus-idp/backstage-plugin-feedback-backend@1.5.1) (2024-06-19) - - - -### Dependencies - -* **@janus-idp/cli:** upgraded to 1.11.1 - -## @janus-idp/backstage-plugin-feedback-backend [1.5.0](https://github.com/janus-idp/backstage-plugins/compare/@janus-idp/backstage-plugin-feedback-backend@1.4.0...@janus-idp/backstage-plugin-feedback-backend@1.5.0) (2024-06-13) - - -### Features - -* **deps:** update to backstage 1.27 ([#1683](https://github.com/janus-idp/backstage-plugins/issues/1683)) ([a14869c](https://github.com/janus-idp/backstage-plugins/commit/a14869c3f4177049cb8d6552b36c3ffd17e7997d)) - - - -### Dependencies - -* **@janus-idp/cli:** upgraded to 1.11.0 - -## @janus-idp/backstage-plugin-feedback-backend [1.4.0](https://github.com/janus-idp/backstage-plugins/compare/@janus-idp/backstage-plugin-feedback-backend@1.3.10...@janus-idp/backstage-plugin-feedback-backend@1.4.0) (2024-06-13) - - -### Features - -* **feedback:** add support for jira component ([#1813](https://github.com/janus-idp/backstage-plugins/issues/1813)) ([4afbc17](https://github.com/janus-idp/backstage-plugins/commit/4afbc171801c1351cb4a89b1884861abe531b2dc)) - -## @janus-idp/backstage-plugin-feedback-backend [1.3.10](https://github.com/janus-idp/backstage-plugins/compare/@janus-idp/backstage-plugin-feedback-backend@1.3.9...@janus-idp/backstage-plugin-feedback-backend@1.3.10) (2024-06-13) - - -### Bug Fixes - -* missing postversion script is several plugins and missing turbo dependency ([#1811](https://github.com/janus-idp/backstage-plugins/issues/1811)) ([4dfe4f5](https://github.com/janus-idp/backstage-plugins/commit/4dfe4f533e21e79c928c66bfd68684243912be2c)) - - - -### Dependencies - -* **@janus-idp/cli:** upgraded to 1.10.1 - -## @janus-idp/backstage-plugin-feedback-backend [1.3.9](https://github.com/janus-idp/backstage-plugins/compare/@janus-idp/backstage-plugin-feedback-backend@1.3.8...@janus-idp/backstage-plugin-feedback-backend@1.3.9) (2024-06-12) - - -### Bug Fixes - -* **feedback:** fixed feedback backend plugin crashing ([#1809](https://github.com/janus-idp/backstage-plugins/issues/1809)) ([e4a571e](https://github.com/janus-idp/backstage-plugins/commit/e4a571e737b7697a5ad96a4a43aacf29b2a2179e)) - -## @janus-idp/backstage-plugin-feedback-backend [1.3.8](https://github.com/janus-idp/backstage-plugins/compare/@janus-idp/backstage-plugin-feedback-backend@1.3.7...@janus-idp/backstage-plugin-feedback-backend@1.3.8) (2024-06-05) - - - -### Dependencies - -* **@janus-idp/cli:** upgraded to 1.10.0 - -## @janus-idp/backstage-plugin-feedback-backend [1.3.7](https://github.com/janus-idp/backstage-plugins/compare/@janus-idp/backstage-plugin-feedback-backend@1.3.6...@janus-idp/backstage-plugin-feedback-backend@1.3.7) (2024-06-04) - -## @janus-idp/backstage-plugin-feedback-backend [1.3.6](https://github.com/janus-idp/backstage-plugins/compare/@janus-idp/backstage-plugin-feedback-backend@1.3.5...@janus-idp/backstage-plugin-feedback-backend@1.3.6) (2024-06-04) - -## @janus-idp/backstage-plugin-feedback-backend [1.3.5](https://github.com/janus-idp/backstage-plugins/compare/@janus-idp/backstage-plugin-feedback-backend@1.3.4...@janus-idp/backstage-plugin-feedback-backend@1.3.5) (2024-06-03) - - - -### Dependencies - -* **@janus-idp/cli:** upgraded to 1.9.0 - -## @janus-idp/backstage-plugin-feedback-backend [1.3.4](https://github.com/janus-idp/backstage-plugins/compare/@janus-idp/backstage-plugin-feedback-backend@1.3.3...@janus-idp/backstage-plugin-feedback-backend@1.3.4) (2024-05-29) - - - -### Dependencies - -* **@janus-idp/cli:** upgraded to 1.8.10 - -## @janus-idp/backstage-plugin-feedback-backend [1.3.3](https://github.com/janus-idp/backstage-plugins/compare/@janus-idp/backstage-plugin-feedback-backend@1.3.2...@janus-idp/backstage-plugin-feedback-backend@1.3.3) (2024-05-29) - - - -### Dependencies - -* **@janus-idp/cli:** upgraded to 1.8.9 - -## @janus-idp/backstage-plugin-feedback-backend [1.3.2](https://github.com/janus-idp/backstage-plugins/compare/@janus-idp/backstage-plugin-feedback-backend@1.3.1...@janus-idp/backstage-plugin-feedback-backend@1.3.2) (2024-05-23) - - -### Bug Fixes - -* **deps:** upgrade devex plugins to mui v5 ([#1696](https://github.com/janus-idp/backstage-plugins/issues/1696)) ([06d9cf0](https://github.com/janus-idp/backstage-plugins/commit/06d9cf0d8c134212329eb691ac21eb78ae155c09)) - -## @janus-idp/backstage-plugin-feedback-backend [1.3.1](https://github.com/janus-idp/backstage-plugins/compare/@janus-idp/backstage-plugin-feedback-backend@1.3.0...@janus-idp/backstage-plugin-feedback-backend@1.3.1) (2024-05-16) - - - -### Dependencies - -* **@janus-idp/cli:** upgraded to 1.8.7 - -## @janus-idp/backstage-plugin-feedback-backend [1.3.0](https://github.com/janus-idp/backstage-plugins/compare/@janus-idp/backstage-plugin-feedback-backend@1.2.6...@janus-idp/backstage-plugin-feedback-backend@1.3.0) (2024-05-14) - - -### Features - -* **feedback:** use backstage auth service in backend plugin ([#1646](https://github.com/janus-idp/backstage-plugins/issues/1646)) ([7d9ee11](https://github.com/janus-idp/backstage-plugins/commit/7d9ee11d1ed0dbc1ff026de3b1e50f2888c3f542)), closes [#1626](https://github.com/janus-idp/backstage-plugins/issues/1626) - -## @janus-idp/backstage-plugin-feedback-backend [1.2.6](https://github.com/janus-idp/backstage-plugins/compare/@janus-idp/backstage-plugin-feedback-backend@1.2.5...@janus-idp/backstage-plugin-feedback-backend@1.2.6) (2024-05-09) - - - -### Dependencies - -* **@janus-idp/cli:** upgraded to 1.8.6 - -## @janus-idp/backstage-plugin-feedback-backend [1.2.5](https://github.com/janus-idp/backstage-plugins/compare/@janus-idp/backstage-plugin-feedback-backend@1.2.4...@janus-idp/backstage-plugin-feedback-backend@1.2.5) (2024-05-02) - - - -### Dependencies - -* **@janus-idp/cli:** upgraded to 1.8.5 - -## @janus-idp/backstage-plugin-feedback-backend [1.2.4](https://github.com/janus-idp/backstage-plugins/compare/@janus-idp/backstage-plugin-feedback-backend@1.2.3...@janus-idp/backstage-plugin-feedback-backend@1.2.4) (2024-05-02) - - - -### Dependencies - -* **@janus-idp/cli:** upgraded to 1.8.4 - -## @janus-idp/backstage-plugin-feedback-backend [1.2.3](https://github.com/janus-idp/backstage-plugins/compare/@janus-idp/backstage-plugin-feedback-backend@1.2.2...@janus-idp/backstage-plugin-feedback-backend@1.2.3) (2024-04-30) - - - -### Dependencies - -* **@janus-idp/cli:** upgraded to 1.8.3 - -## @janus-idp/backstage-plugin-feedback-backend [1.2.2](https://github.com/janus-idp/backstage-plugins/compare/@janus-idp/backstage-plugin-feedback-backend@1.2.1...@janus-idp/backstage-plugin-feedback-backend@1.2.2) (2024-04-30) - - - -### Dependencies - -* **@janus-idp/cli:** upgraded to 1.8.2 - -## @janus-idp/backstage-plugin-feedback-backend [1.2.1](https://github.com/janus-idp/backstage-plugins/compare/@janus-idp/backstage-plugin-feedback-backend@1.2.0...@janus-idp/backstage-plugin-feedback-backend@1.2.1) (2024-04-30) - - -### Bug Fixes - -* **feedback:** add support for jira cloud instance ([#1582](https://github.com/janus-idp/backstage-plugins/issues/1582)) ([5425e54](https://github.com/janus-idp/backstage-plugins/commit/5425e5494c9b8301e6732f534d5ede889996342c)), closes [#1543](https://github.com/janus-idp/backstage-plugins/issues/1543) - -## @janus-idp/backstage-plugin-feedback-backend [1.2.0](https://github.com/janus-idp/backstage-plugins/compare/@janus-idp/backstage-plugin-feedback-backend@1.1.6...@janus-idp/backstage-plugin-feedback-backend@1.2.0) (2024-04-15) - - -### Features - -* checkPluginVersion.sh bump plugins for 1.2.0 release ([#1511](https://github.com/janus-idp/backstage-plugins/issues/1511)) ([73c6588](https://github.com/janus-idp/backstage-plugins/commit/73c6588adb7e8c20907b06f2a8ef248cfd4332e4)) - -## @janus-idp/backstage-plugin-feedback-backend [1.1.6](https://github.com/janus-idp/backstage-plugins/compare/@janus-idp/backstage-plugin-feedback-backend@1.1.5...@janus-idp/backstage-plugin-feedback-backend@1.1.6) (2024-04-05) - -## @janus-idp/backstage-plugin-feedback-backend [1.1.5](https://github.com/janus-idp/backstage-plugins/compare/@janus-idp/backstage-plugin-feedback-backend@1.1.4...@janus-idp/backstage-plugin-feedback-backend@1.1.5) (2024-04-03) - - -### Bug Fixes - -* **feedback-backend:** fix the feedback url for mail and jira ([#1435](https://github.com/janus-idp/backstage-plugins/issues/1435)) ([f3564c1](https://github.com/janus-idp/backstage-plugins/commit/f3564c1b274dba8b3b5d1df8b534e7b566ff60e4)) - -## @janus-idp/backstage-plugin-feedback-backend [1.1.4](https://github.com/janus-idp/backstage-plugins/compare/@janus-idp/backstage-plugin-feedback-backend@1.1.3...@janus-idp/backstage-plugin-feedback-backend@1.1.4) (2024-03-29) - -## @janus-idp/backstage-plugin-feedback-backend [1.1.3](https://github.com/janus-idp/backstage-plugins/compare/@janus-idp/backstage-plugin-feedback-backend@1.1.2...@janus-idp/backstage-plugin-feedback-backend@1.1.3) (2024-03-04) - -## @janus-idp/backstage-plugin-feedback-backend [1.1.2](https://github.com/janus-idp/backstage-plugins/compare/@janus-idp/backstage-plugin-feedback-backend@1.1.1...@janus-idp/backstage-plugin-feedback-backend@1.1.2) (2024-02-27) - -## @janus-idp/backstage-plugin-feedback-backend [1.1.1](https://github.com/janus-idp/backstage-plugins/compare/@janus-idp/backstage-plugin-feedback-backend@1.1.0...@janus-idp/backstage-plugin-feedback-backend@1.1.1) (2024-02-21) - -## @janus-idp/backstage-plugin-feedback-backend [1.1.0](https://github.com/janus-idp/backstage-plugins/compare/@janus-idp/backstage-plugin-feedback-backend@1.0.0...@janus-idp/backstage-plugin-feedback-backend@1.1.0) (2024-01-30) - - -### Features - -* add new backend system support for existing backend plugins that have not been migrated over yet ([#1132](https://github.com/janus-idp/backstage-plugins/issues/1132)) ([06e16fd](https://github.com/janus-idp/backstage-plugins/commit/06e16fdcf64257dd08297cb727445d9a8a23c522)) - -## @janus-idp/backstage-plugin-feedback-backend 1.0.0 (2024-01-18) - - -### Features - -* **#1019:** implemented feedback plugin ([#1045](https://github.com/janus-idp/backstage-plugins/issues/1045)) ([34c312e](https://github.com/janus-idp/backstage-plugins/commit/34c312e3c8522e81d04621abdcb174c0ecb25733)), closes [#1019](https://github.com/janus-idp/backstage-plugins/issues/1019) diff --git a/plugins/feedback-backend/README.md b/plugins/feedback-backend/README.md index 630707d810..ecfd0b68dd 100644 --- a/plugins/feedback-backend/README.md +++ b/plugins/feedback-backend/README.md @@ -9,111 +9,3 @@ Please use the **[@backstage-community/backstage-plugin-feedback-backend](https: This is feedback-backend plugin which provides Rest API to create feedbacks. It is also responsible for creating JIRA tickets, - -## Getting started - -### Installation - -Install the NPM Package - -```bash -# From your backstage root directory -yarn workspace backend add @janus-idp/backstage-plugin-feedback-backend -``` - -#### Adding the plugin to the new backend - -Add the following to your `packages/backend/src/index.ts` file: - -```ts title="packages/backend/src/index.ts" -const backend = createBackend(); - -// Add the following line -backend.add(import('@janus-idp/backstage-plugin-feedback-backend')); - -backend.start(); -``` - -#### Adding the plugin to the legacy backend (`@janus-idp/backstage-plugin-feedback-backend@1.2.6` and lower) - -1. Create a new file `packages/backend/src/plugins/feedback.ts` and add the following: - - ```ts title="packages/backend/src/plugins/feedback.ts" - import { Router } from 'express'; - - import { createRouter } from '@janus-idp/backstage-plugin-feedback-backend'; - - import { PluginEnvironment } from '../types'; - - export default async function createPlugin( - env: PluginEnvironment, - ): Promise { - return await createRouter({ - logger: env.logger, - config: env.config, - discovery: env.discovery, - }); - } - ``` - -2. Next we wire this into overall backend router by editing the `packages/backend/src/index.ts` file: - - ```ts title="packages/backend/src/index.ts" - import feedback from './plugins/feedback'; - - // ... - async function main() { - // ... - const feedbackEnv = useHotMemoize(module, () => createEnv('feedback')); - apiRouter.use('/feedback', await feedback(feedbackEnv)); - } - ``` - -### Configurations - -Add the following config in your `app-config.yaml` file. - -```yaml -feedback: - integrations: - jira: - # Under this object you can define multiple jira hosts - - host: ${JIRA_HOST_URL} - # Add your jira token along with Basic or Bearer type eg: Basic/Bearer - token: ${JIRA_TOKEN} - # (optional) Due to GDPR limitations on jira cloud instances - # set hostType: CLOUD to make api work - # default value is SERVER - hostType: CLOUD - - email: - ## Email integration uses nodemailer to send emails - host: ${EMAIL_HOST} - port: ${EMAIL_PORT} # defaults to 587, if not found - - ## Email address of sender - from: ${EMAIL_FROM} - - ## [optional] Authorization using user and password - auth: - user: ${EMAIL_USER} - pass: ${EMAIL_PASS} - - # boolean - secure: false - - # Path to ca certificate if required by mail server - caCert: ${NODE_EXTRA_CA_CERTS} -``` - -### Set up frontend plugin - -Follow instructions provided [feedback-plugin](../feedback/README.md) - -### API reference - -The API specifications file can be found at [docs/openapi3_0](./docs/openapi3_0.yaml) - -### Running the plugin - -Run `yarn workspace @janus-idp/backstage-plugin-feedback-backend start`. diff --git a/plugins/feedback-backend/app-config.janus-idp.yaml b/plugins/feedback-backend/app-config.janus-idp.yaml deleted file mode 100644 index 872049c0e1..0000000000 --- a/plugins/feedback-backend/app-config.janus-idp.yaml +++ /dev/null @@ -1,31 +0,0 @@ -feedback: - integrations: - jira: - # Under this object you can define multiple jira hosts - - host: ${JIRA_HOST_URL} - # Add your jira token along with Basic or Bearer type eg: Basic/Bearer - token: ${JIRA_TOKEN} - - # (optional) Due to GDPR limitations on jira cloud instances - # set hostType: CLOUD to make Jira Cloud to work - # default value is SERVER - hostType: CLOUD - - email: - ## Email integration uses nodemailer to send emails - host: ${EMAIL_HOST} - port: ${EMAIL_PORT} # defaults to 587, if not found - - # Email address of sender - from: ${EMAIL_FROM} - - ## Authorization using user and password - auth: - user: ${EMAIL_USER} - pass: ${EMAIL_PASS} - - # boolean - secure: false - - # Path to ca certificate if required by mail server - caCert: ${NODE_EXTRA_CA_CERTS} diff --git a/plugins/feedback-backend/catalog-info.yaml b/plugins/feedback-backend/catalog-info.yaml deleted file mode 100644 index f45267a5f5..0000000000 --- a/plugins/feedback-backend/catalog-info.yaml +++ /dev/null @@ -1,25 +0,0 @@ -# https://backstage.io/docs/features/software-catalog/descriptor-format#kind-component -apiVersion: backstage.io/v1alpha1 -kind: Component -metadata: - name: janus-idp-feedback-backend - title: '@janus-idp/backstage-plugin-feedback-backend' - description: Feedback Backend - annotations: - backstage.io/source-location: url:https://github.com/janus-idp/backstage-plugins/tree/main/plugins/feedback-backend - backstage.io/view-url: https://github.com/janus-idp/backstage-plugins/blob/main/plugins/feedback-backend/catalog-info.yaml - backstage.io/edit-url: https://github.com/janus-idp/backstage-plugins/edit/main/plugins/feedback-backend/catalog-info.yaml - github.com/project-slug: janus-idp/backstage-plugins - github.com/team-slug: janus-idp/maintainers-plugins - sonarqube.org/project-key: janus-idp_backstage-plugins - links: - - url: https://github.com/janus-idp/backstage-plugins/tree/main/plugins/feedback-backend - title: GitHub Source - icon: source - type: source -spec: - type: backstage-backend-plugin - lifecycle: production - owner: rhdh-team - system: rhdh - subcomponentOf: janus-idp-feedback diff --git a/plugins/feedback-backend/config.d.ts b/plugins/feedback-backend/config.d.ts deleted file mode 100644 index a65aa64bda..0000000000 --- a/plugins/feedback-backend/config.d.ts +++ /dev/null @@ -1,80 +0,0 @@ -/** - * Configuration options for the application. - */ -export interface Config { - /** - * @visibility frontend - */ - feedback?: { - integrations: { - /** - * Configuration options for JIRA integration. - * It is an array, which can be used to set up multiple jira servers at the same time. - * @visibility frontend - */ - jira?: Array<{ - /** - * The hostname or URL of the JIRA organization. - * @visibility frontend - */ - host?: string; - /** - * The access token for authenticating with JIRA. - * @visibility secret - */ - token?: string; - /** - * what type of jira instance are you using, CLOUD/SERVER - */ - hostType?: string; - }>; - - /** - * Configuration options for email integration. - */ - email?: { - /** - * The SMTP server's hostname or IP address. - */ - host?: string; - - /** - * The port number to use for the SMTP server. - */ - port?: number; - - /** - * Optional authentication settings for the SMTP server. - */ - auth?: { - /** - * The username to use for SMTP server authentication. - */ - user?: string; - - /** - * The password to use for SMTP server authentication. - * @visibility secret - */ - password?: string; - }; - - /** - * Set to `true` if you want to use SSL/TLS for the SMTP connection. - * Default is `false`. - */ - secure?: boolean; - - /** - * The email address from which emails will be sent. - */ - from?: string; - - /** - * Path to a custom CA certificate file. - */ - caCert?: string; - }; - }; - }; -} diff --git a/plugins/feedback-backend/dist-dynamic/package.json b/plugins/feedback-backend/dist-dynamic/package.json deleted file mode 100644 index ad005d23f8..0000000000 --- a/plugins/feedback-backend/dist-dynamic/package.json +++ /dev/null @@ -1,87 +0,0 @@ -{ - "name": "@janus-idp/backstage-plugin-feedback-backend-dynamic", - "version": "1.7.2", - "main": "./dist/index.cjs.js", - "types": "src/index.ts", - "license": "Apache-2.0", - "publishConfig": { - "access": "public" - }, - "backstage": { - "role": "backend-plugin", - "supported-versions": "1.28.4", - "pluginId": "feedback", - "pluginPackages": [ - "@janus-idp/backstage-plugin-feedback", - "@janus-idp/backstage-plugin-feedback-backend" - ] - }, - "exports": { - ".": { - "require": "./dist/index.cjs.js", - "default": "./dist/index.cjs.js" - }, - "./alpha": { - "require": "./dist/alpha.cjs.js", - "default": "./dist/alpha.cjs.js" - }, - "./package.json": "./package.json" - }, - "scripts": {}, - "dependencies": { - "@types/express": "*", - "axios": "^1.7.4", - "express": "^4.17.1", - "express-promise-router": "^4.1.0", - "knex": "^3.1.0", - "node-fetch": "^2.6.7", - "nodemailer": "^6.9.8", - "short-uuid": "^4.2.2", - "yn": "^4.0.0" - }, - "devDependencies": {}, - "files": [ - "dist", - "config.d.ts", - "app-config.janus-idp.yaml", - "migrations/**/*.{js,d.ts}", - "alpha" - ], - "configSchema": "config.d.ts", - "repository": { - "type": "git", - "url": "https://github.com/janus-idp/backstage-plugins", - "directory": "plugins/feedback-backend" - }, - "keywords": [ - "support:tech-preview", - "lifecycle:active", - "backstage", - "plugin" - ], - "homepage": "https://red.ht/rhdh", - "bugs": "https://github.com/janus-idp/backstage-plugins/issues", - "maintainers": [ - "@janus-idp/maintainers-plugins", - "@janus-idp/devex-uxe" - ], - "author": "The Backstage Community", - "bundleDependencies": true, - "peerDependencies": { - "@backstage/backend-common": "^0.23.3", - "@backstage/backend-dynamic-feature-service": "^0.2.15", - "@backstage/backend-plugin-api": "^0.7.0", - "@backstage/backend-test-utils": "^0.4.4", - "@backstage/catalog-client": "^1.6.5", - "@backstage/catalog-model": "^1.5.0", - "@backstage/config": "^1.2.0" - }, - "overrides": { - "@aws-sdk/util-utf8-browser": { - "@smithy/util-utf8": "^2.0.0" - } - }, - "resolutions": { - "@aws-sdk/util-utf8-browser": "npm:@smithy/util-utf8@~2" - } -} diff --git a/plugins/feedback-backend/dist-dynamic/yarn.lock b/plugins/feedback-backend/dist-dynamic/yarn.lock deleted file mode 100644 index 5023432b53..0000000000 --- a/plugins/feedback-backend/dist-dynamic/yarn.lock +++ /dev/null @@ -1,822 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"@aws-sdk/util-utf8-browser@npm:@smithy/util-utf8@~2": - version "2.3.0" - resolved "https://registry.yarnpkg.com/@smithy/util-utf8/-/util-utf8-2.3.0.tgz#dd96d7640363259924a214313c3cf16e7dd329c5" - integrity sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A== - dependencies: - "@smithy/util-buffer-from" "^2.2.0" - tslib "^2.6.2" - -"@smithy/is-array-buffer@^2.2.0": - version "2.2.0" - resolved "https://registry.yarnpkg.com/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz#f84f0d9f9a36601a9ca9381688bd1b726fd39111" - integrity sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA== - dependencies: - tslib "^2.6.2" - -"@smithy/util-buffer-from@^2.2.0": - version "2.2.0" - resolved "https://registry.yarnpkg.com/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz#6fc88585165ec73f8681d426d96de5d402021e4b" - integrity sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA== - dependencies: - "@smithy/is-array-buffer" "^2.2.0" - tslib "^2.6.2" - -"@types/body-parser@*": - version "1.19.5" - resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.5.tgz#04ce9a3b677dc8bd681a17da1ab9835dc9d3ede4" - integrity sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg== - dependencies: - "@types/connect" "*" - "@types/node" "*" - -"@types/connect@*": - version "3.4.38" - resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.38.tgz#5ba7f3bc4fbbdeaff8dded952e5ff2cc53f8d858" - integrity sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug== - dependencies: - "@types/node" "*" - -"@types/express-serve-static-core@^4.17.33": - version "4.19.5" - resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.19.5.tgz#218064e321126fcf9048d1ca25dd2465da55d9c6" - integrity sha512-y6W03tvrACO72aijJ5uF02FRq5cgDR9lUxddQ8vyF+GvmjJQqbzDcJngEjURc+ZsG31VI3hODNZJ2URj86pzmg== - dependencies: - "@types/node" "*" - "@types/qs" "*" - "@types/range-parser" "*" - "@types/send" "*" - -"@types/express@*": - version "4.17.21" - resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.21.tgz#c26d4a151e60efe0084b23dc3369ebc631ed192d" - integrity sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ== - dependencies: - "@types/body-parser" "*" - "@types/express-serve-static-core" "^4.17.33" - "@types/qs" "*" - "@types/serve-static" "*" - -"@types/http-errors@*": - version "2.0.4" - resolved "https://registry.yarnpkg.com/@types/http-errors/-/http-errors-2.0.4.tgz#7eb47726c391b7345a6ec35ad7f4de469cf5ba4f" - integrity sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA== - -"@types/mime@^1": - version "1.3.5" - resolved "https://registry.yarnpkg.com/@types/mime/-/mime-1.3.5.tgz#1ef302e01cf7d2b5a0fa526790c9123bf1d06690" - integrity sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w== - -"@types/node@*": - version "20.14.12" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.14.12.tgz#129d7c3a822cb49fc7ff661235f19cfefd422b49" - integrity sha512-r7wNXakLeSsGT0H1AU863vS2wa5wBOK4bWMjZz2wj+8nBx+m5PeIn0k8AloSLpRuiwdRQZwarZqHE4FNArPuJQ== - dependencies: - undici-types "~5.26.4" - -"@types/qs@*": - version "6.9.15" - resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.15.tgz#adde8a060ec9c305a82de1babc1056e73bd64dce" - integrity sha512-uXHQKES6DQKKCLh441Xv/dwxOq1TVS3JPUMlEqoEglvlhR6Mxnlew/Xq/LRVHpLyk7iK3zODe1qYHIMltO7XGg== - -"@types/range-parser@*": - version "1.2.7" - resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.7.tgz#50ae4353eaaddc04044279812f52c8c65857dbcb" - integrity sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ== - -"@types/send@*": - version "0.17.4" - resolved "https://registry.yarnpkg.com/@types/send/-/send-0.17.4.tgz#6619cd24e7270793702e4e6a4b958a9010cfc57a" - integrity sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA== - dependencies: - "@types/mime" "^1" - "@types/node" "*" - -"@types/serve-static@*": - version "1.15.7" - resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.15.7.tgz#22174bbd74fb97fe303109738e9b5c2f3064f714" - integrity sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw== - dependencies: - "@types/http-errors" "*" - "@types/node" "*" - "@types/send" "*" - -accepts@~1.3.8: - version "1.3.8" - resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" - integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== - dependencies: - mime-types "~2.1.34" - negotiator "0.6.3" - -any-base@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/any-base/-/any-base-1.1.0.tgz#ae101a62bc08a597b4c9ab5b7089d456630549fe" - integrity sha512-uMgjozySS8adZZYePpaWs8cxB9/kdzmpX6SgJZ+wbz1K5eYk5QMYDVJaZKhxyIHUdnnJkfR7SVgStgH7LkGUyg== - -array-flatten@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" - integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== - -asynckit@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" - integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== - -axios@^1.7.4: - version "1.7.4" - resolved "https://registry.yarnpkg.com/axios/-/axios-1.7.4.tgz#4c8ded1b43683c8dd362973c393f3ede24052aa2" - integrity sha512-DukmaFRnY6AzAALSH4J2M3k6PkaC+MfaAGdEERRWcC9q3/TWQwLpHR8ZRLKTdQ3aBDL64EdluRDjJqKw+BPZEw== - dependencies: - follow-redirects "^1.15.6" - form-data "^4.0.0" - proxy-from-env "^1.1.0" - -body-parser@1.20.3: - version "1.20.3" - resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.3.tgz#1953431221c6fb5cd63c4b36d53fab0928e548c6" - integrity sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g== - 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.13.0" - raw-body "2.5.2" - type-is "~1.6.18" - unpipe "1.0.0" - -bytes@3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" - integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== - -call-bind@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.7.tgz#06016599c40c56498c18769d2730be242b6fa3b9" - integrity sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w== - dependencies: - es-define-property "^1.0.0" - es-errors "^1.3.0" - function-bind "^1.1.2" - get-intrinsic "^1.2.4" - set-function-length "^1.2.1" - -colorette@2.0.19: - version "2.0.19" - resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.19.tgz#cdf044f47ad41a0f4b56b3a0d5b4e6e1a2d5a798" - integrity sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ== - -combined-stream@^1.0.8: - version "1.0.8" - resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" - integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== - dependencies: - delayed-stream "~1.0.0" - -commander@^10.0.0: - version "10.0.1" - resolved "https://registry.yarnpkg.com/commander/-/commander-10.0.1.tgz#881ee46b4f77d1c1dccc5823433aa39b022cbe06" - integrity sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug== - -content-disposition@0.5.4: - version "0.5.4" - resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe" - integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ== - dependencies: - safe-buffer "5.2.1" - -content-type@~1.0.4, content-type@~1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.5.tgz#8b773162656d1d1086784c8f23a54ce6d73d7918" - integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA== - -cookie-signature@1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" - integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ== - -cookie@0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.6.0.tgz#2798b04b071b0ecbff0dbb62a505a8efa4e19051" - integrity sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw== - -debug@2.6.9: - version "2.6.9" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" - integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== - dependencies: - ms "2.0.0" - -debug@4.3.4: - version "4.3.4" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" - integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== - dependencies: - ms "2.1.2" - -define-data-property@^1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.4.tgz#894dc141bb7d3060ae4366f6a0107e68fbe48c5e" - integrity sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A== - dependencies: - es-define-property "^1.0.0" - es-errors "^1.3.0" - gopd "^1.0.1" - -delayed-stream@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" - integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== - -depd@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" - integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== - -destroy@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" - integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== - -ee-first@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" - integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== - -encodeurl@~1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" - integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== - -encodeurl@~2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-2.0.0.tgz#7b8ea898077d7e409d3ac45474ea38eaf0857a58" - integrity sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg== - -es-define-property@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.0.tgz#c7faefbdff8b2696cf5f46921edfb77cc4ba3845" - integrity sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ== - dependencies: - get-intrinsic "^1.2.4" - -es-errors@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" - integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== - -escalade@^3.1.1: - version "3.1.2" - resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.2.tgz#54076e9ab29ea5bf3d8f1ed62acffbb88272df27" - integrity sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA== - -escape-html@~1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" - integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== - -esm@^3.2.25: - version "3.2.25" - resolved "https://registry.yarnpkg.com/esm/-/esm-3.2.25.tgz#342c18c29d56157688ba5ce31f8431fbb795cc10" - integrity sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA== - -etag@~1.8.1: - version "1.8.1" - resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" - integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== - -express-promise-router@^4.1.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/express-promise-router/-/express-promise-router-4.1.1.tgz#8fac102060b9bcc868f84d34fbb12fd8fa494291" - integrity sha512-Lkvcy/ZGrBhzkl3y7uYBHLMtLI4D6XQ2kiFg9dq7fbktBch5gjqJ0+KovX0cvCAvTJw92raWunRLM/OM+5l4fA== - dependencies: - is-promise "^4.0.0" - lodash.flattendeep "^4.0.0" - methods "^1.0.0" - -express@^4.17.1: - version "4.21.0" - resolved "https://registry.yarnpkg.com/express/-/express-4.21.0.tgz#d57cb706d49623d4ac27833f1cbc466b668eb915" - integrity sha512-VqcNGcj/Id5ZT1LZ/cfihi3ttTn+NJmkli2eZADigjq29qTlWi/hAQ43t/VLPq8+UX06FCEx3ByOYet6ZFblng== - dependencies: - accepts "~1.3.8" - array-flatten "1.1.1" - body-parser "1.20.3" - content-disposition "0.5.4" - content-type "~1.0.4" - cookie "0.6.0" - cookie-signature "1.0.6" - debug "2.6.9" - depd "2.0.0" - encodeurl "~2.0.0" - escape-html "~1.0.3" - etag "~1.8.1" - finalhandler "1.3.1" - fresh "0.5.2" - http-errors "2.0.0" - merge-descriptors "1.0.3" - methods "~1.1.2" - on-finished "2.4.1" - parseurl "~1.3.3" - path-to-regexp "0.1.10" - proxy-addr "~2.0.7" - qs "6.13.0" - range-parser "~1.2.1" - safe-buffer "5.2.1" - send "0.19.0" - serve-static "1.16.2" - setprototypeof "1.2.0" - statuses "2.0.1" - type-is "~1.6.18" - utils-merge "1.0.1" - vary "~1.1.2" - -finalhandler@1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.3.1.tgz#0c575f1d1d324ddd1da35ad7ece3df7d19088019" - integrity sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ== - dependencies: - debug "2.6.9" - encodeurl "~2.0.0" - escape-html "~1.0.3" - on-finished "2.4.1" - parseurl "~1.3.3" - statuses "2.0.1" - unpipe "~1.0.0" - -follow-redirects@^1.15.6: - version "1.15.6" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.6.tgz#7f815c0cda4249c74ff09e95ef97c23b5fd0399b" - integrity sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA== - -form-data@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" - integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== - dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.8" - mime-types "^2.1.12" - -forwarded@0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" - integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== - -fresh@0.5.2: - version "0.5.2" - resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" - integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== - -function-bind@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" - integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== - -get-intrinsic@^1.1.3, get-intrinsic@^1.2.4: - version "1.2.4" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.4.tgz#e385f5a4b5227d449c3eabbad05494ef0abbeadd" - integrity sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ== - dependencies: - es-errors "^1.3.0" - function-bind "^1.1.2" - has-proto "^1.0.1" - has-symbols "^1.0.3" - hasown "^2.0.0" - -get-package-type@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" - integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== - -getopts@2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/getopts/-/getopts-2.3.0.tgz#71e5593284807e03e2427449d4f6712a268666f4" - integrity sha512-5eDf9fuSXwxBL6q5HX+dhDj+dslFGWzU5thZ9kNKUkcPtaPdatmUFKwHFrLb/uf/WpA4BHET+AX3Scl56cAjpA== - -gopd@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" - integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== - dependencies: - get-intrinsic "^1.1.3" - -has-property-descriptors@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz#963ed7d071dc7bf5f084c5bfbe0d1b6222586854" - integrity sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg== - dependencies: - es-define-property "^1.0.0" - -has-proto@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.3.tgz#b31ddfe9b0e6e9914536a6ab286426d0214f77fd" - integrity sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q== - -has-symbols@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" - integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== - -hasown@^2.0.0, hasown@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" - integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== - dependencies: - function-bind "^1.1.2" - -http-errors@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3" - integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== - dependencies: - depd "2.0.0" - inherits "2.0.4" - setprototypeof "1.2.0" - statuses "2.0.1" - toidentifier "1.0.1" - -iconv-lite@0.4.24: - version "0.4.24" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" - integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== - dependencies: - safer-buffer ">= 2.1.2 < 3" - -inherits@2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" - integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== - -interpret@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/interpret/-/interpret-2.2.0.tgz#1a78a0b5965c40a5416d007ad6f50ad27c417df9" - integrity sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw== - -ipaddr.js@1.9.1: - version "1.9.1" - resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" - integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== - -is-core-module@^2.13.0: - version "2.15.0" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.15.0.tgz#71c72ec5442ace7e76b306e9d48db361f22699ea" - integrity sha512-Dd+Lb2/zvk9SKy1TGCt1wFJFo/MWBPMX5x7KcvLajWTGuomczdQX61PvY5yK6SVACwpoexWo81IfFyoKY2QnTA== - dependencies: - hasown "^2.0.2" - -is-promise@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-4.0.0.tgz#42ff9f84206c1991d26debf520dd5c01042dd2f3" - integrity sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ== - -knex@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/knex/-/knex-3.1.0.tgz#b6ddd5b5ad26a6315234a5b09ec38dc4a370bd8c" - integrity sha512-GLoII6hR0c4ti243gMs5/1Rb3B+AjwMOfjYm97pu0FOQa7JH56hgBxYf5WK2525ceSbBY1cjeZ9yk99GPMB6Kw== - dependencies: - colorette "2.0.19" - commander "^10.0.0" - debug "4.3.4" - escalade "^3.1.1" - esm "^3.2.25" - get-package-type "^0.1.0" - getopts "2.3.0" - interpret "^2.2.0" - lodash "^4.17.21" - pg-connection-string "2.6.2" - rechoir "^0.8.0" - resolve-from "^5.0.0" - tarn "^3.0.2" - tildify "2.0.0" - -lodash.flattendeep@^4.0.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz#fb030917f86a3134e5bc9bec0d69e0013ddfedb2" - integrity sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ== - -lodash@^4.17.21: - version "4.17.21" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" - integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== - -media-typer@0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" - integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== - -merge-descriptors@1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.3.tgz#d80319a65f3c7935351e5cfdac8f9318504dbed5" - integrity sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ== - -methods@^1.0.0, methods@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" - integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== - -mime-db@1.52.0: - version "1.52.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" - integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== - -mime-types@^2.1.12, mime-types@~2.1.24, mime-types@~2.1.34: - version "2.1.35" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" - integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== - dependencies: - mime-db "1.52.0" - -mime@1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" - integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== - -ms@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" - integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== - -ms@2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" - integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== - -ms@2.1.3: - version "2.1.3" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" - integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== - -negotiator@0.6.3: - version "0.6.3" - resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" - integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== - -node-fetch@^2.6.7: - version "2.7.0" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d" - integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A== - dependencies: - whatwg-url "^5.0.0" - -nodemailer@^6.9.8: - version "6.9.14" - resolved "https://registry.yarnpkg.com/nodemailer/-/nodemailer-6.9.14.tgz#845fda981f9fd5ac264f4446af908a7c78027f75" - integrity sha512-Dobp/ebDKBvz91sbtRKhcznLThrKxKt97GI2FAlAyy+fk19j73Uz3sBXolVtmcXjaorivqsbbbjDY+Jkt4/bQA== - -object-inspect@^1.13.1: - version "1.13.2" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.2.tgz#dea0088467fb991e67af4058147a24824a3043ff" - integrity sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g== - -on-finished@2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" - integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== - dependencies: - ee-first "1.1.1" - -parseurl@~1.3.3: - version "1.3.3" - resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" - integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== - -path-parse@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" - integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== - -path-to-regexp@0.1.10: - version "0.1.10" - resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.10.tgz#67e9108c5c0551b9e5326064387de4763c4d5f8b" - integrity sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w== - -pg-connection-string@2.6.2: - version "2.6.2" - resolved "https://registry.yarnpkg.com/pg-connection-string/-/pg-connection-string-2.6.2.tgz#713d82053de4e2bd166fab70cd4f26ad36aab475" - integrity sha512-ch6OwaeaPYcova4kKZ15sbJ2hKb/VP48ZD2gE7i1J+L4MspCtBMAx8nMgz7bksc7IojCIIWuEhHibSMFH8m8oA== - -proxy-addr@~2.0.7: - version "2.0.7" - resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" - integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== - dependencies: - forwarded "0.2.0" - ipaddr.js "1.9.1" - -proxy-from-env@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" - integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== - -qs@6.13.0: - version "6.13.0" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.13.0.tgz#6ca3bd58439f7e245655798997787b0d88a51906" - integrity sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg== - dependencies: - side-channel "^1.0.6" - -range-parser@~1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" - integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== - -raw-body@2.5.2: - version "2.5.2" - resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.2.tgz#99febd83b90e08975087e8f1f9419a149366b68a" - integrity sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA== - dependencies: - bytes "3.1.2" - http-errors "2.0.0" - iconv-lite "0.4.24" - unpipe "1.0.0" - -rechoir@^0.8.0: - version "0.8.0" - resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.8.0.tgz#49f866e0d32146142da3ad8f0eff352b3215ff22" - integrity sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ== - dependencies: - resolve "^1.20.0" - -resolve-from@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" - integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== - -resolve@^1.20.0: - version "1.22.8" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d" - integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw== - dependencies: - is-core-module "^2.13.0" - path-parse "^1.0.7" - supports-preserve-symlinks-flag "^1.0.0" - -safe-buffer@5.2.1: - version "5.2.1" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" - integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== - -"safer-buffer@>= 2.1.2 < 3": - version "2.1.2" - resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" - integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== - -send@0.19.0: - version "0.19.0" - resolved "https://registry.yarnpkg.com/send/-/send-0.19.0.tgz#bbc5a388c8ea6c048967049dbeac0e4a3f09d7f8" - integrity sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw== - dependencies: - debug "2.6.9" - depd "2.0.0" - destroy "1.2.0" - encodeurl "~1.0.2" - escape-html "~1.0.3" - etag "~1.8.1" - fresh "0.5.2" - http-errors "2.0.0" - mime "1.6.0" - ms "2.1.3" - on-finished "2.4.1" - range-parser "~1.2.1" - statuses "2.0.1" - -serve-static@1.16.2: - version "1.16.2" - resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.16.2.tgz#b6a5343da47f6bdd2673848bf45754941e803296" - integrity sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw== - dependencies: - encodeurl "~2.0.0" - escape-html "~1.0.3" - parseurl "~1.3.3" - send "0.19.0" - -set-function-length@^1.2.1: - version "1.2.2" - resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.2.tgz#aac72314198eaed975cf77b2c3b6b880695e5449" - integrity sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg== - dependencies: - define-data-property "^1.1.4" - es-errors "^1.3.0" - function-bind "^1.1.2" - get-intrinsic "^1.2.4" - gopd "^1.0.1" - has-property-descriptors "^1.0.2" - -setprototypeof@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" - integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== - -short-uuid@^4.2.2: - version "4.2.2" - resolved "https://registry.yarnpkg.com/short-uuid/-/short-uuid-4.2.2.tgz#4bb3d926da04a4a5f34420d17b5551fd6d9d535c" - integrity sha512-IE7hDSGV2U/VZoCsjctKX6l5t5ak2jE0+aeGJi3KtvjIUNuZVmHVYUjNBhmo369FIWGDtaieRaO8A83Lvwfpqw== - dependencies: - any-base "^1.1.0" - uuid "^8.3.2" - -side-channel@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.6.tgz#abd25fb7cd24baf45466406b1096b7831c9215f2" - integrity sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA== - dependencies: - call-bind "^1.0.7" - es-errors "^1.3.0" - get-intrinsic "^1.2.4" - object-inspect "^1.13.1" - -statuses@2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" - integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== - -supports-preserve-symlinks-flag@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" - integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== - -tarn@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/tarn/-/tarn-3.0.2.tgz#73b6140fbb881b71559c4f8bfde3d9a4b3d27693" - integrity sha512-51LAVKUSZSVfI05vjPESNc5vwqqZpbXCsU+/+wxlOrUjk2SnFTt97v9ZgQrD4YmxYW1Px6w2KjaDitCfkvgxMQ== - -tildify@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/tildify/-/tildify-2.0.0.tgz#f205f3674d677ce698b7067a99e949ce03b4754a" - integrity sha512-Cc+OraorugtXNfs50hU9KS369rFXCfgGLpfCfvlc+Ud5u6VWmUQsOAa9HbTvheQdYnrdJqqv1e5oIqXppMYnSw== - -toidentifier@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" - integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== - -tr46@~0.0.3: - version "0.0.3" - resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" - integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== - -tslib@^2.6.2: - version "2.6.3" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.3.tgz#0438f810ad7a9edcde7a241c3d80db693c8cbfe0" - integrity sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ== - -type-is@~1.6.18: - version "1.6.18" - resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" - integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== - dependencies: - media-typer "0.3.0" - mime-types "~2.1.24" - -undici-types@~5.26.4: - version "5.26.5" - resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" - integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== - -unpipe@1.0.0, unpipe@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" - integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== - -utils-merge@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" - integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== - -uuid@^8.3.2: - version "8.3.2" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" - integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== - -vary@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" - integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== - -webidl-conversions@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" - integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== - -whatwg-url@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" - integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== - dependencies: - tr46 "~0.0.3" - webidl-conversions "^3.0.0" - -yn@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/yn/-/yn-4.0.0.tgz#611480051ea43b510da1dfdbe177ed159f00a979" - integrity sha512-huWiiCS4TxKc4SfgmTwW1K7JmXPPAmuXWYy4j9qjQo4+27Kni8mGhAAi1cloRWmBe2EqcLgt3IGqQoRL/MtPgg== diff --git a/plugins/feedback-backend/docs/openapi3_0.yaml b/plugins/feedback-backend/docs/openapi3_0.yaml deleted file mode 100644 index 6c0d52c9e2..0000000000 --- a/plugins/feedback-backend/docs/openapi3_0.yaml +++ /dev/null @@ -1,351 +0,0 @@ -openapi: 3.0.3 -info: - title: Feedback Backend Plugin REST API - description: This is a sample description about this spec. - license: - name: Apache 2.0 - url: http://www.apache.org/licenses/LICENSE-2.0.html - version: '3' -servers: - - url: https://backedn-url/api/feedback -tags: &ref_2 [] -paths: - /: - get: - summary: Get all feedbacks - description: 'Returns all feedbacks from database ' - operationId: getAllFeedbacks - tags: *ref_2 - parameters: - - in: query - name: query - description: Search text - schema: &ref_0 - type: string - - in: query - name: projectId - description: Fetch feedbacks for specific component - schema: *ref_0 - required: false - - in: query - name: limit - description: Number of feedbacks to fetch - schema: &ref_1 - type: number - required: true - - in: query - name: offset - description: Value of last feedback of current page - schema: *ref_1 - required: true - requestBody: &ref_3 {} - responses: - '200': - content: - application/json: - schema: - type: object - properties: - data: - type: array - items: - $ref: '#/components/schemas/Feedback Model' - description: Array of all feedbacks - count: - type: number - description: Total feedbacks in database - currentPage: - type: number - description: Feedbacks fetched in current request - pageSize: - type: number - description: Last feedback fetched from database - required: - - data - - count - - currentPage - - pageSize - description: Get Array of all feedbacks - post: - summary: Create new feedback - description: Creates feedback and creates ticket on Jira, Github, etc - operationId: createNewFeedback - tags: *ref_2 - parameters: &ref_5 [] - requestBody: - content: - application/json: - schema: - $ref: '#/components/schemas/Feedback Model' - responses: - '201': - description: Feedback created successfully - content: - application/json: - schema: - type: object - properties: - message: - type: string - description: Feedback created successfully - data: - type: object - properties: - feedbackId: - type: string - description: Unique id of newly created feedback - projectId: - type: string - description: Entity ref of component - required: - - feedbackId - - projectId - required: - - message - - data - '500': - description: Error occured - content: - application/json: - schema: - $ref: '#/components/schemas/Error' - /{feedbackId}: - get: - summary: Get individual feedback - description: '' - operationId: getFeedbackById - tags: *ref_2 - parameters: [] - requestBody: *ref_3 - responses: - '200': - content: - application/json: - schema: - type: object - properties: - data: - $ref: '#/components/schemas/Feedback Model' - description: Feedback details - message: - type: string - description: Feedback fetched successfully - required: - - data - - message - description: Feedback fetched successfully - '404': - content: - application/json: - schema: - $ref: '#/components/schemas/Error' - description: Feedback id is invalid - description: Feedback id is invalid - patch: - summary: Update the feedback in database - description: '' - operationId: updateFeedbackById - tags: *ref_2 - parameters: *ref_5 - requestBody: - content: - application/json: - schema: - $ref: '#/components/schemas/Feedback Model' - description: Modal data that need to be updated - responses: - '200': - content: - application/json: - schema: - type: object - properties: - data: - $ref: '#/components/schemas/Feedback Model' - description: Object of updated data - message: - type: string - description: Feedback updated successfully - required: - - data - - message - description: Feedback updated successfully - '404': - content: - application/json: - schema: - $ref: '#/components/schemas/Error' - description: Feedback id is invalid - description: Feedback id is invalid - '500': - content: - application/json: - schema: - $ref: '#/components/schemas/Error' - description: Failed to update data - description: Failed to update data - delete: - summary: Delete the feedback from database - description: '' - operationId: deleteFeedbackById - tags: *ref_2 - parameters: *ref_5 - requestBody: *ref_3 - responses: - '200': - content: - application/json: - schema: - type: object - properties: - Message: - type: string - description: Deleted successfully - required: - - Message - description: Feedback Deleted successfully - '500': - content: - application/json: - schema: - $ref: '#/components/schemas/Error' - description: Feedback id is invalid - description: Feedback id is invalid - /{feedbackId}/ticket: - get: - summary: Get details like progress and assignee of a ticket - description: '' - operationId: getTicketDetails - tags: *ref_2 - parameters: - - in: query - name: ticketId - description: Ticket id of the feedback - schema: *ref_0 - required: true - - in: query - name: projectId - description: Entity ref of component - schema: *ref_0 - required: true - requestBody: *ref_3 - responses: - '200': - content: - application/json: - schema: - type: object - properties: - status: - type: string - description: Status of the ticket - assignee: - type: string - description: To whom the ticket is assigned - avatarUrls: - type: object - properties: {} - description: Object of avatars of assignee - message: - type: string - description: Fetched successfully - required: - - status - - assignee - - avatarUrls - - message - description: Ticket details fetched successfully - '404': - content: - application/json: - schema: - $ref: '#/components/schemas/Error' - description: Failed to fetch ticket details - description: Failed to fetch ticket details -components: - schemas: - Feedback Model: - type: object - properties: - feedbackId: - type: string - description: Id of feedback - summary: - type: string - description: Summary of feedback - projectId: - type: string - description: EntityRef of component - description: - type: string - description: Description of feedback - url: - type: string - description: Url from which feedback was submitted - userAgent: - type: string - description: User-Agent of origin - tag: - anyOf: - - $ref: '#/components/schemas/Tags' - description: Tags - ticketUrl: - type: string - description: Url to view ticket - createdBy: - type: string - description: EntityRef of user who created the feedback - createdAt: - type: string - description: ISO timestamp when feedback is created - format: date-time - updatedBy: - type: string - description: EntityRef of user who updated the feedback - updatedAt: - type: string - description: ISO timestamp when feedback is updated - format: date-time - feedbackType: - oneOf: - - $ref: '#/components/schemas/Feedback Type' - description: Type of feedback - required: - - url - - createdAt - - ticketUrl - - tag - - userAgent - - updatedAt - - feedbackType - - description - - projectId - - summary - description: Feedback Model - Tags: - type: string - description: All Tags - enum: - - Good - - Excellent - - Needs Improvement - - Slow Loading - - Navigation - - Not Responsive - - UI Issues - - Other - enumDesc: Accepted tags - pattern: '' - Feedback Type: - type: string - description: Type of feedback - enum: - - FEEDBACK - - BUG - Error: - type: object - properties: - error: - type: string - required: - - error diff --git a/plugins/feedback-backend/migrations/20231204093742_init_createTable.js b/plugins/feedback-backend/migrations/20231204093742_init_createTable.js deleted file mode 100644 index 911bda5341..0000000000 --- a/plugins/feedback-backend/migrations/20231204093742_init_createTable.js +++ /dev/null @@ -1,34 +0,0 @@ -/** - * @param { import("knex").Knex } knex - * @returns { Promise } - */ - -exports.up = async function up(knex) { - return await knex.schema.createTable('feedback', table => { - table.string('feedbackId').notNullable(); - table.string('summary').notNullable(); - table.text('description'); - table.string('tag'); - table.string('projectId').notNullable(); - table.string('ticketUrl'); - table.enum('feedbackType', ['BUG', 'FEEDBACK']); - table.string('createdBy').notNullable(); - table.dateTime('createdAt').notNullable().defaultTo(knex.fn.now()); - table.string('updatedBy').notNullable(); - table.dateTime('updatedAt').notNullable().defaultTo(knex.fn.now()); - table.string('url').notNullable(); - table.string('userAgent').notNullable(); - table.index(['feedbackId', 'projectId'], 'feedbackId_projectId_index'); - }); -}; - -/** - * @param { import("knex").Knex } knex - * @returns { Promise } - */ -exports.down = async function down(knex) { - await knex.schema.alterTable('feedback', table => { - table.dropIndex(['feedbackId', 'projectId'], 'feedbackId_projectId_index'); - }); - return await knex.schema.dropTable('feedback'); -}; diff --git a/plugins/feedback-backend/package.json b/plugins/feedback-backend/package.json deleted file mode 100644 index e7e976dbc5..0000000000 --- a/plugins/feedback-backend/package.json +++ /dev/null @@ -1,101 +0,0 @@ -{ - "name": "@janus-idp/backstage-plugin-feedback-backend", - "version": "1.7.2", - "private": true, - "main": "src/index.ts", - "types": "src/index.ts", - "license": "Apache-2.0", - "publishConfig": { - "access": "public" - }, - "backstage": { - "role": "backend-plugin", - "supported-versions": "1.28.4", - "pluginId": "feedback", - "pluginPackages": [ - "@janus-idp/backstage-plugin-feedback", - "@janus-idp/backstage-plugin-feedback-backend" - ] - }, - "exports": { - ".": "./src/index.ts", - "./alpha": "./src/alpha.ts", - "./package.json": "./package.json" - }, - "typesVersions": { - "*": { - "alpha": [ - "src/alpha.ts" - ], - "package.json": [ - "package.json" - ] - } - }, - "scripts": { - "start": "backstage-cli package start", - "build": "backstage-cli package build", - "lint": "backstage-cli package lint", - "test": "backstage-cli package test --passWithNoTests --coverage", - "clean": "backstage-cli package clean", - "prepack": "backstage-cli package prepack", - "postpack": "backstage-cli package postpack", - "postversion": "yarn run export-dynamic", - "tsc": "tsc", - "export-dynamic": "janus-cli package export-dynamic-plugin --no-embed-as-dependencies" - }, - "dependencies": { - "@backstage/backend-common": "^0.23.3", - "@backstage/backend-dynamic-feature-service": "^0.2.15", - "@backstage/backend-plugin-api": "^0.7.0", - "@backstage/backend-test-utils": "^0.4.4", - "@backstage/catalog-client": "^1.6.5", - "@backstage/catalog-model": "^1.5.0", - "@backstage/config": "^1.2.0", - "@types/express": "*", - "axios": "^1.7.4", - "express": "^4.17.1", - "express-promise-router": "^4.1.0", - "knex": "^3.1.0", - "node-fetch": "^2.6.7", - "nodemailer": "^6.9.8", - "short-uuid": "^4.2.2", - "yn": "^4.0.0" - }, - "devDependencies": { - "@backstage/cli": "0.26.11", - "@janus-idp/cli": "1.13.1", - "@types/nodemailer": "6.4.15", - "@types/supertest": "2.0.16", - "msw": "1.3.3", - "supertest": "6.3.4" - }, - "files": [ - "dist", - "config.d.ts", - "app-config.janus-idp.yaml", - "migrations/**/*.{js,d.ts}", - "dist-dynamic/*.*", - "dist-dynamic/dist/**", - "dist-dynamic/alpha/*" - ], - "configSchema": "config.d.ts", - "repository": { - "type": "git", - "url": "https://github.com/janus-idp/backstage-plugins", - "directory": "plugins/feedback-backend" - }, - "keywords": [ - "support:tech-preview", - "lifecycle:active", - "backstage", - "plugin" - ], - "homepage": "https://red.ht/rhdh", - "bugs": "https://github.com/janus-idp/backstage-plugins/issues", - "maintainers": [ - "@janus-idp/maintainers-plugins", - "@janus-idp/devex-uxe" - ], - "author": "The Backstage Community" -} diff --git a/plugins/feedback-backend/src/alpha.ts b/plugins/feedback-backend/src/alpha.ts deleted file mode 100644 index ac97b53bee..0000000000 --- a/plugins/feedback-backend/src/alpha.ts +++ /dev/null @@ -1 +0,0 @@ -export { feedbackPlugin as default } from './plugin'; diff --git a/plugins/feedback-backend/src/api/index.ts b/plugins/feedback-backend/src/api/index.ts deleted file mode 100644 index 7a935ec5eb..0000000000 --- a/plugins/feedback-backend/src/api/index.ts +++ /dev/null @@ -1 +0,0 @@ -export { JiraApiService } from './jiraApiService'; diff --git a/plugins/feedback-backend/src/api/jiraApiService.test.ts b/plugins/feedback-backend/src/api/jiraApiService.test.ts deleted file mode 100644 index fc03b214f0..0000000000 --- a/plugins/feedback-backend/src/api/jiraApiService.test.ts +++ /dev/null @@ -1,68 +0,0 @@ -import { getRootLogger } from '@backstage/backend-common'; -import { LoggerService } from '@backstage/backend-plugin-api'; - -import { rest } from 'msw'; -import { setupServer } from 'msw/node'; - -import { - mockConfig, - mockCreateJiraTicketResp, - mockFeedback, - mockJiraTicketDetailsResp, - mockJiraUsernameResp, -} from '../mocks'; -import { JiraApiService } from './jiraApiService'; - -const handlers = [ - rest.post( - 'https://jira.host/rest/api/latest/issue', - async (req, res, ctx) => { - const reqData = await req.json(); - const key = reqData.fields.project.key; - return res(ctx.json(mockCreateJiraTicketResp(key))); - }, - ), - rest.get('https://jira.host/rest/api/latest/user/search', (_, res, ctx) => - res(ctx.json(mockJiraUsernameResp)), - ), - rest.get('https://jira.host/rest/api/latest/issue/ticket-id', (_, res, ctx) => - res(ctx.json(mockJiraTicketDetailsResp)), - ), -]; -const logger: LoggerService = getRootLogger().child({ - service: 'feedback-backend', -}); - -describe('JIRA issue', () => { - const mswMockServer = setupServer(); - handlers.forEach(handler => mswMockServer.use(handler)); - mswMockServer.listen({ onUnhandledRequest: 'warn' }); - const jiraHost = mockConfig.feedback.integrations.jira[0].host; - const jiraToken = mockConfig.feedback.integrations.jira[0].token; - const jiraService = new JiraApiService(jiraHost, jiraToken, logger); - - it('createJiraTicket', async () => { - const data = await jiraService.createJiraTicket({ - projectKey: 'proj-key', - summary: mockFeedback.summary!, - description: 'Submitted from Test App', - tag: mockFeedback.tag!, - feedbackType: mockFeedback.feedbackType!, - reporter: 'John Doe', - }); - expect(data.key).toEqual('proj-key-01'); - }); - - it('getJiraUsernameByEmail', async () => { - const data = await jiraService.getJiraUsernameByEmail( - 'john.doe@example.com', - ); - expect(data).toEqual('John Doe'); - }); - - it('getTicketDetails', async () => { - const data = await jiraService.getTicketDetails('ticket-id'); - expect(data?.status).toEqual('Backlog'); - expect(data?.assignee).toEqual('John Doe'); - }); -}); diff --git a/plugins/feedback-backend/src/api/jiraApiService.ts b/plugins/feedback-backend/src/api/jiraApiService.ts deleted file mode 100644 index a581535e46..0000000000 --- a/plugins/feedback-backend/src/api/jiraApiService.ts +++ /dev/null @@ -1,125 +0,0 @@ -import { LoggerService } from '@backstage/backend-plugin-api'; - -import axios from 'axios'; - -/** - * @param host - * @param authToken - * @param logger - * @param hostType - */ -export class JiraApiService { - constructor( - private host: string, - private authToken: string, - private logger: LoggerService, - private hostType: string = 'SERVER', - ) {} - - createJiraTicket = async (options: { - projectKey: string; - summary: string; - description: string; - tag: string; - feedbackType: string; - reporter?: string; - jiraComponent?: string; - }): Promise => { - const { - projectKey, - summary, - description, - tag, - feedbackType, - reporter, - jiraComponent, - } = options; - const requestBody = { - fields: { - ...(reporter && { - reporter: { - name: reporter, - }, - }), - project: { - key: projectKey, - }, - summary: summary, - description: description, - labels: [ - 'reported-by-backstage', - tag.toLowerCase().split(' ').join('-'), - ], - issuetype: { - name: feedbackType === 'BUG' ? 'Bug' : 'Task', - }, - ...(jiraComponent && { - components: [ - { - name: jiraComponent, - }, - ], - }), - }, - }; - try { - const resp = await axios.post( - `${this.host}/rest/api/latest/issue`, - requestBody, - { - headers: { - Authorization: this.authToken, - 'Content-Type': 'application/json', - }, - }, - ); - return resp.data; - } catch (err: any) { - this.logger.error('Error:', err); - return {}; - } - }; - - getJiraUsernameByEmail = async ( - reporterEmail: string, - ): Promise => { - const resp = await axios.get( - `${this.host}/rest/api/latest/user/search?${ - this.hostType === 'SERVER' ? 'username' : 'query' - }=${reporterEmail}`, - { - headers: { - Authorization: this.authToken, - 'Content-Type': 'application/json', - }, - }, - ); - const data = resp.data; - if (data.length === 0) return undefined; - return data[0].name; - }; - - getTicketDetails = async ( - ticketId: string, - ): Promise< - { status: string; assignee: string; avatarUrls: {} } | undefined - > => { - const resp = await axios.get( - `${this.host}/rest/api/latest/issue/${ticketId}`, - { - headers: { - Authorization: this.authToken, - }, - }, - ); - return { - status: resp.data.fields.status.name, - assignee: resp.data.fields.assignee - ? resp.data.fields.assignee.displayName - : null, - avatarUrls: resp.data.fields.assignee - ? resp.data.fields.assignee.avatarUrls - : null, - }; - }; -} diff --git a/plugins/feedback-backend/src/database/feedbackStore.ts b/plugins/feedback-backend/src/database/feedbackStore.ts deleted file mode 100644 index e0b399973c..0000000000 --- a/plugins/feedback-backend/src/database/feedbackStore.ts +++ /dev/null @@ -1,232 +0,0 @@ -import { - PluginDatabaseManager, - resolvePackagePath, -} from '@backstage/backend-common'; -import { LoggerService } from '@backstage/backend-plugin-api'; - -import { Knex } from 'knex'; -import short from 'short-uuid'; - -import { FeedbackModel } from '../model/feedback.model'; - -export interface FeedbackStore { - getFeedbackByUuid(uuid: string): Promise; - - storeFeedbackGetUuid( - data: FeedbackModel, - ): Promise<{ feedbackId: string; projectId: string } | 0>; - - getAllFeedbacks( - projectId: string, - page: number, - pageSize: number, - searchKey: string, - ): Promise<{ data: FeedbackModel[]; count: number }>; - - checkFeedbackId(feedbackId: string): Promise; - updateFeedback(data: FeedbackModel): Promise; - deleteFeedbackById(id: string): Promise; -} - -const migrationsDir = resolvePackagePath( - '@janus-idp/backstage-plugin-feedback-backend', // Package name - 'migrations', // Migrations directory -); - -export class DatabaseFeedbackStore implements FeedbackStore { - private constructor( - private readonly db: Knex, - private readonly logger: LoggerService, - ) {} - - static async create({ - database, - skipMigrations, - logger, - }: { - database: PluginDatabaseManager; - skipMigrations: boolean; - logger: LoggerService; - }): Promise { - const client = await database.getClient(); - - if (!database.migrations?.skip && !skipMigrations) { - await client.migrate.latest({ - directory: migrationsDir, - }); - } - return new DatabaseFeedbackStore(client, logger); - } - - async getFeedbackByUuid(feedbackId: string): Promise { - const result: FeedbackModel = await this.db('feedback') - .select('*') - .where({ feedbackId: feedbackId }) - .first(); - return result; - } - - async getAllFeedbacks( - projectId: string, - offset: number, - limit: number, - searchKey: string, - ): Promise<{ data: FeedbackModel[]; count: number }> { - const operator = this.db.client.config.client === 'pg' ? 'ilike' : 'like'; - const countKey = - this.db.client.config.client === 'pg' ? 'count' : 'count(`feedbackId`)'; - - const result: FeedbackModel[] = []; - - if (projectId !== 'all') { - const model = - searchKey.length > 0 - ? this.db('feedback') - .where('projectId', projectId) - .andWhere(builder => { - builder.orWhere('summary', operator, `%${searchKey}%`); - builder.orWhere('ticketUrl', operator, `%${searchKey}%`); - builder.orWhere('tag', operator, `%${searchKey}%`); - builder.orWhere('feedbackType', operator, `%${searchKey}%`); - builder.orWhere('projectId', operator, `%${searchKey}%`); - }) - : this.db('feedback').where('projectId', projectId); - try { - const tempFeedbacksArr = await model - .clone() - .count('feedbackId') - .groupBy('projectId'); - - const totalFeedbacks = tempFeedbacksArr[0]?.[countKey] ?? 0; - await model - .clone() - .orderBy('updatedAt', 'desc') - .offset(offset) - .limit(limit) - .then(res => { - res.forEach(data => result.push(data)); - }); - return { - data: result, - count: parseInt(totalFeedbacks as string, 10), - }; - } catch (error: any) { - this.logger.error(error.message); - } - return { data: result, count: 0 }; - } - try { - const model = - searchKey.length > 0 - ? this.db('feedback').where(builder => { - builder.orWhere('summary', operator, `%${searchKey}%`); - builder.orWhere('ticketUrl', operator, `%${searchKey}%`); - builder.orWhere('projectId', operator, `%${searchKey}%`); - builder.orWhere('tag', operator, `%${searchKey}%`); - builder.orWhere('feedbackType', operator, `%${searchKey}%`); - }) - : this.db('feedback'); - - const totalFeedbacks = - (await model.clone().count('feedbackId'))[0]?.[countKey] ?? 0; - await model - .clone() - .orderBy('updatedAt', 'desc') - .limit(limit) - .offset(offset) - .then(res => { - res.forEach(data => result.push(data)); - }); - return { - data: result, - count: parseInt(totalFeedbacks as string, 10), - }; - } catch (error: any) { - this.logger.error(error.message); - } - return { - data: result, - count: 0, - }; - } - - async storeFeedbackGetUuid( - data: FeedbackModel, - ): Promise<{ projectId: string; feedbackId: string } | 0> { - try { - const id = short().generate(); - if (await this.checkFeedbackId(id)) - return await this.storeFeedbackGetUuid(data); - await this.db('feedback').insert({ - feedbackId: id, - summary: data.summary, - projectId: data.projectId, - description: data.description, - tag: data.tag, - ticketUrl: data.ticketUrl, - feedbackType: data.feedbackType, - createdAt: data.createdAt, - createdBy: data.createdBy, - updatedAt: data.updatedAt, - updatedBy: data.updatedBy, - url: data.url, - userAgent: data.userAgent, - }); - - return { - feedbackId: id, - projectId: data.projectId as string, - }; - } catch (error: any) { - this.logger.error(error.message); - return 0; - } - } - - async checkFeedbackId(feedbackId: string): Promise { - const result: string = await this.db('feedback') - .select('feedbackId') - .where({ feedbackId: feedbackId }) - .first(); - - if (result === undefined) { - return false; - } - return true; - } - - async updateFeedback( - data: FeedbackModel, - ): Promise { - const model = this.db('feedback').where('feedbackId', data.feedbackId); - - if (data.projectId) model.update('projectId', data.projectId); - if (data.summary) model.update('summary', data.summary); - if (data.description) model.update('description', data.description); - if (data.tag) model.update('tag', data.tag); - if (data.ticketUrl) model.update('ticketUrl', data.ticketUrl); - if (data.feedbackType) model.update('feedbackType', data.feedbackType); - if (data.createdAt) model.update('createdAt', data.createdAt); - if (data.createdBy) model.update('createdBy', data.createdBy); - if (data.updatedAt) model.update('updatedAt', data.updatedAt); - if (data.updatedBy) model.update('updatedBy', data.updatedBy); - if (data.userAgent) model.update('userAgent', data.userAgent); - if (data.url) model.update('url', data.url); - - try { - await model.clone(); - const result: FeedbackModel = await this.db('feedback') - .select('*') - .where({ feedbackId: data.feedbackId }) - .first(); - return result; - } catch (error: any) { - this.logger.error(`Failed to update feedback: ${error.message}`); - return undefined; - } - } - - async deleteFeedbackById(id: string): Promise { - return await this.db('feedback').where('feedbackId', id).del(); - } -} diff --git a/plugins/feedback-backend/src/dynamic/index.ts b/plugins/feedback-backend/src/dynamic/index.ts deleted file mode 100644 index 786b16a65f..0000000000 --- a/plugins/feedback-backend/src/dynamic/index.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { BackendDynamicPluginInstaller } from '@backstage/backend-dynamic-feature-service'; - -import { feedbackPlugin } from '../plugin'; - -export const dynamicPluginInstaller: BackendDynamicPluginInstaller = { - kind: 'new', - install: () => feedbackPlugin(), -}; diff --git a/plugins/feedback-backend/src/index.ts b/plugins/feedback-backend/src/index.ts deleted file mode 100644 index e5aa17d7e5..0000000000 --- a/plugins/feedback-backend/src/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export { createRouter } from './service/router'; -export { feedbackPlugin as default } from './plugin'; diff --git a/plugins/feedback-backend/src/mocks/config.ts b/plugins/feedback-backend/src/mocks/config.ts deleted file mode 100644 index f411e53615..0000000000 --- a/plugins/feedback-backend/src/mocks/config.ts +++ /dev/null @@ -1,31 +0,0 @@ -export const mockConfig = { - app: { - title: 'Backstage Test App', - baseUrl: 'http://localhost:3000', - }, - backend: { - baseUrl: 'http://localhost:7007', - database: { - client: 'better-sqlite3', - connection: ':memory:', - }, - }, - feedback: { - integrations: { - email: { - host: 'smtp-host', - port: 587, - auth: {}, - secure: false, - from: '"Example" ', - caCert: process.env.NODE_EXTRA_CA_CERTS, - }, - jira: [ - { - host: 'https://jira.host', - token: '###', - }, - ], - }, - }, -}; diff --git a/plugins/feedback-backend/src/mocks/entity.ts b/plugins/feedback-backend/src/mocks/entity.ts deleted file mode 100644 index 282b224ad2..0000000000 --- a/plugins/feedback-backend/src/mocks/entity.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { Entity } from '@backstage/catalog-model'; - -export const mockEntity: Entity = { - apiVersion: 'backstage.io/v1alpha1', - kind: 'Component', - metadata: { - name: 'example-website', - title: 'Example App', - namespace: 'default', - annotations: { - 'feedback/type': 'MAIL', - 'feedback/email-to': 'john.doe@example.com', - }, - spec: { - owner: 'guest', - type: 'service', - lifecycle: 'production', - }, - }, -}; diff --git a/plugins/feedback-backend/src/mocks/feedback.ts b/plugins/feedback-backend/src/mocks/feedback.ts deleted file mode 100644 index 9494b45912..0000000000 --- a/plugins/feedback-backend/src/mocks/feedback.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { FeedbackCategory, FeedbackModel } from '../model/feedback.model'; - -export const mockFeedback: FeedbackModel = { - feedbackId: 'bubuPsc93VRYAwByZe8ZQ9', - summary: 'Unit Test Issue', - description: 'This is mock description', - tag: 'UI Issues', - projectId: 'component:default/example-website', - ticketUrl: 'https://demo-ticket-url/ticket-id', - feedbackType: FeedbackCategory.BUG, - createdBy: 'user:default/guest', - url: 'http://localhost:3000/catalog/default/component/example-website/feedback', - userAgent: - 'Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/119.0', -}; diff --git a/plugins/feedback-backend/src/mocks/index.ts b/plugins/feedback-backend/src/mocks/index.ts deleted file mode 100644 index c1dd9a729c..0000000000 --- a/plugins/feedback-backend/src/mocks/index.ts +++ /dev/null @@ -1,5 +0,0 @@ -export * from './feedback'; -export * from './entity'; -export * from './user'; -export * from './config'; -export * from './jira'; diff --git a/plugins/feedback-backend/src/mocks/jira.ts b/plugins/feedback-backend/src/mocks/jira.ts deleted file mode 100644 index da9c7304a1..0000000000 --- a/plugins/feedback-backend/src/mocks/jira.ts +++ /dev/null @@ -1,19 +0,0 @@ -export const mockJiraTicketDetailsResp = { - fields: { - status: { - name: 'Backlog', - }, - assignee: { - displayName: 'John Doe', - avatarUrls: { - '10x10': [], - }, - }, - }, -}; - -export const mockJiraUsernameResp = [{ name: 'John Doe' }]; - -export const mockCreateJiraTicketResp = (key: any) => { - return { id: '3490987634', key: `${key}-01` }; -}; diff --git a/plugins/feedback-backend/src/mocks/user.ts b/plugins/feedback-backend/src/mocks/user.ts deleted file mode 100644 index 689d8ef30e..0000000000 --- a/plugins/feedback-backend/src/mocks/user.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { UserEntity } from '@backstage/catalog-model'; - -export const mockUser: UserEntity = { - apiVersion: 'backstage.io/v1alpha1', - kind: 'User', - metadata: { - namespace: 'default', - name: 'John Doe', - }, - relations: [], - spec: { - memberOf: ['guests'], - profile: { - displayName: 'John Doe', - email: 'john.doe@example.com', - }, - }, -}; diff --git a/plugins/feedback-backend/src/model/feedback.model.ts b/plugins/feedback-backend/src/model/feedback.model.ts deleted file mode 100644 index e1d1d41475..0000000000 --- a/plugins/feedback-backend/src/model/feedback.model.ts +++ /dev/null @@ -1,20 +0,0 @@ -export enum FeedbackCategory { - BUG = 'BUG', - FEEDBACK = 'FEEDBACK', -} - -export type FeedbackModel = { - feedbackId?: string; - summary?: string; - projectId?: string; - description?: string; - url?: string; - userAgent?: string; - tag?: string; - ticketUrl?: string; - feedbackType?: FeedbackCategory; - createdBy?: string; - updatedBy?: string; - createdAt?: string; - updatedAt?: string; -}; diff --git a/plugins/feedback-backend/src/plugin.ts b/plugins/feedback-backend/src/plugin.ts deleted file mode 100644 index c451ce4244..0000000000 --- a/plugins/feedback-backend/src/plugin.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { - coreServices, - createBackendPlugin, -} from '@backstage/backend-plugin-api'; - -import { createRouter } from './service/router'; - -export const feedbackPlugin = createBackendPlugin({ - pluginId: 'feedback', - register(env) { - env.registerInit({ - deps: { - logger: coreServices.logger, - httpRouter: coreServices.httpRouter, - config: coreServices.rootConfig, - discovery: coreServices.discovery, - auth: coreServices.auth, - }, - async init({ logger, httpRouter, config, discovery, auth }) { - httpRouter.use( - await createRouter({ - logger: logger, - config: config, - discovery: discovery, - auth: auth, - }), - ); - }, - }); - }, -}); diff --git a/plugins/feedback-backend/src/run.ts b/plugins/feedback-backend/src/run.ts deleted file mode 100644 index 594839f2e1..0000000000 --- a/plugins/feedback-backend/src/run.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { getRootLogger } from '@backstage/backend-common'; - -import yn from 'yn'; - -import { startStandaloneServer } from './service/standaloneServer'; - -const port = process.env.PLUGIN_PORT ? Number(process.env.PLUGIN_PORT) : 7007; -const enableCors = yn(process.env.PLUGIN_CORS, { default: false }); -const logger = getRootLogger(); - -startStandaloneServer({ port, enableCors, logger }).catch(err => { - logger.error(err); - process.exit(1); -}); - -process.on('SIGINT', () => { - logger.info('CTRL+C pressed; exiting.'); - process.exit(0); -}); diff --git a/plugins/feedback-backend/src/service/emails.ts b/plugins/feedback-backend/src/service/emails.ts deleted file mode 100644 index 0c9a83d752..0000000000 --- a/plugins/feedback-backend/src/service/emails.ts +++ /dev/null @@ -1,64 +0,0 @@ -import { LoggerService } from '@backstage/backend-plugin-api'; -import { Config } from '@backstage/config'; - -import { createTransport, Transporter } from 'nodemailer'; - -import { readFileSync } from 'fs'; - -export class NodeMailer { - private readonly transportConfig: Transporter; - private readonly from: string | undefined; - - constructor( - config: Config, - private logger: LoggerService, - ) { - const useSecure = config.getOptionalBoolean( - 'feedback.integrations.email.secure', - ); - const caCertPath = config.getOptionalString( - 'feedback.integrations.email.caCert', - ); - const customCACert = caCertPath ? readFileSync(caCertPath) : undefined; - - this.from = config.getOptionalString('feedback.integrations.email.from'); - this.transportConfig = createTransport({ - host: config.getOptionalString('feedback.integrations.email.host'), - port: config.getOptionalNumber('feedback.integrations.email.port') ?? 587, - auth: { - user: config.getOptionalString('feedback.integrations.email.auth.user'), - pass: config.getOptionalString( - 'feedback.integrations.email.auth.password', - ), - }, - secure: useSecure, - tls: { - ca: customCACert, - }, - }); - } - - async sendMail(options: { - to: string; - replyTo: string; - subject: string; - body: string; - }): Promise<{}> { - try { - const { to, replyTo, subject, body } = options; - this.logger.info(`Sending mail to ${to}`); - const resp = await this.transportConfig.sendMail({ - to: to, - replyTo: replyTo, - cc: replyTo, - from: this.from, - subject: subject, - html: body, - }); - return resp; - } catch (error: any) { - this.logger.error(`Failed to send mail: ${error.message}`); - return {}; - } - } -} diff --git a/plugins/feedback-backend/src/service/router.test.ts b/plugins/feedback-backend/src/service/router.test.ts deleted file mode 100644 index e5edaf935f..0000000000 --- a/plugins/feedback-backend/src/service/router.test.ts +++ /dev/null @@ -1,192 +0,0 @@ -import { getRootLogger, HostDiscovery } from '@backstage/backend-common'; -import { - AuthService, - DiscoveryService, - LoggerService, -} from '@backstage/backend-plugin-api'; -import { mockServices } from '@backstage/backend-test-utils'; -import { Config, ConfigReader } from '@backstage/config'; - -import express from 'express'; -import { rest } from 'msw'; -import { setupServer } from 'msw/node'; -import request from 'supertest'; - -import { - mockConfig, - mockEntity, - mockFeedback, - mockJiraTicketDetailsResp, - mockUser, -} from '../mocks'; -import { createRouter } from './router'; - -const handlers = [ - rest.get( - 'http://localhost:7007/api/catalog/entities/by-name/component/default/example-website', - (_, res, ctx) => res(ctx.json(mockEntity)), - ), - rest.get( - 'http://localhost:7007/api/catalog/entities/by-name/user/default/guest', - (_, res, ctx) => res(ctx.json(mockUser)), - ), - rest.get('https://jira.host/rest/api/latest/issue/ticket-id', (_, res, ctx) => - res(ctx.json(mockJiraTicketDetailsResp)), - ), -]; - -jest.mock('nodemailer', () => ({ - createTransport: jest.fn().mockReturnValue({ - sendMail: jest.fn(), - }), -})); - -jest.mock('../database/feedbackStore', () => ({ - DatabaseFeedbackStore: { - create: jest.fn().mockImplementation(() => { - return { - getFeedbackByUuid: () => Promise.resolve(mockFeedback), - checkFeedbackId: (feedbackId: string) => - feedbackId === mockFeedback.feedbackId, - getAllFeedbacks: () => - Promise.resolve({ - data: [mockFeedback], - count: 1, - }), - storeFeedbackGetUuid: () => - Promise.resolve({ - feedbackId: mockFeedback.feedbackId, - projectId: mockFeedback.projectId, - }), - updateFeedback: (data: any) => Promise.resolve(data), - deleteFeedbackById: () => Promise.resolve(), - }; - }), - }, -})); - -describe('Router', () => { - const mswMockServer = setupServer(); - handlers.forEach(handler => mswMockServer.use(handler)); - mswMockServer.listen({ onUnhandledRequest: 'bypass' }); - const config: Config = new ConfigReader(mockConfig); - const discovery: DiscoveryService = HostDiscovery.fromConfig(config); - const logger: LoggerService = getRootLogger().child({ - service: 'feedback-backend', - }); - const auth: AuthService = mockServices.auth(); - let app: express.Express; - - beforeAll(async () => { - const router = await createRouter({ - logger, - config: config, - discovery: discovery, - auth: auth, - }); - app = express().use(router); - }); - - beforeEach(() => { - jest.resetAllMocks(); - }); - - describe('GET', () => { - it('/\t\t\tshould return all feedbacks', async () => { - const response = await request(app).get('/'); - expect(response.statusCode).toEqual(200); - expect(response.body.data[0]).toEqual(mockFeedback); - expect(response.body.count).toEqual(1); - }); - it('/:feedbackId\t\tshould return single feedback', async () => { - const response = await request(app).get(`/${mockFeedback.feedbackId}`); - expect(response.statusCode).toEqual(200); - expect(response.body.data).toEqual(mockFeedback); - }); - it('/:feedbackId\t\tshould give error', async () => { - const response = await request(app).get(`/1234567890`); - expect(response.statusCode).toEqual(404); - expect(response.body.error).toEqual( - 'No feedback found for id 1234567890', - ); - }); - it('/:feedbackId/ticket\tshould give error', async () => { - const response = await request(app) - .get(`/${mockFeedback.feedbackId}/ticket`) - .query({ - ticketId: mockFeedback.ticketUrl?.split('/').pop(), - projectId: mockFeedback.projectId, - }); - expect(response.statusCode).toEqual(404); - expect(response.body.error).toEqual( - `Unable to fetch jira ticket ${mockFeedback.ticketUrl - ?.split('/') - .pop()}`, - ); - }); - it('/:feedbackId/ticket\tshould return single feedback', async () => { - mockEntity.metadata.annotations!['feedback/type'] = 'jira'; - const response = await request(app) - .get(`/${mockFeedback.feedbackId}/ticket`) - .query({ - ticketId: mockFeedback.ticketUrl?.split('/').pop(), - projectId: mockFeedback.projectId, - }); - expect(response.statusCode).toEqual(200); - expect(response.body.message).toEqual('fetched successfully'); - expect(response.body.data.status).toEqual('Backlog'); - expect(response.body.data.assignee).toEqual('John Doe'); - mockEntity.metadata.annotations!['feedback/type'] = 'mail'; - }); - }); - - describe('POST', () => { - it('/\tshould give error', async () => { - const response = await request(app) - .post('/') - .send({ description: mockFeedback.description }); - expect(response.body.error).toEqual('Summary field empty'); - expect(response.statusCode).toEqual(500); - }); - it('/\tshould create feedback', async () => { - const response = await request(app).post('/').send(mockFeedback); - expect(response.body.message).toEqual('Issue created successfully'); - expect(response.body.data.feedbackId).toEqual(mockFeedback.feedbackId); - expect(response.statusCode).toEqual(201); - }); - }); - - describe('PATCH', () => { - it('/:feedbackId\tshould return updated feedback', async () => { - const response = await request(app) - .patch(`/${mockFeedback.feedbackId}`) - .send({ ...mockFeedback, summary: 'This is updated summmary' }); - expect(response.body.summary).not.toEqual(mockFeedback.summary); - expect(response.statusCode).toEqual(200); - }); - it('/:feedbackId\tshould give error', async () => { - const response = await request(app) - .patch(`/1234567890`) - .send({ ...mockFeedback, summary: 'This is updated summmary' }); - expect(response.body.error).toEqual( - 'No feedback found for id 1234567890', - ); - expect(response.statusCode).toEqual(404); - }); - }); - - describe('DELETE', () => { - it('/:feedbackId\tshould delete feedback', async () => { - const response = await request(app).delete(`/${mockFeedback.feedbackId}`); - expect(response.statusCode).toEqual(200); - expect(response.body.message).toEqual('Deleted successfully'); - }); - it('/:feedbackId\tshould give error', async () => { - const response = await request(app).delete(`/1234567890`); - expect(response.statusCode).toEqual(404); - expect(response.body.error).toEqual( - 'No feedback found for id 1234567890', - ); - }); - }); -}); diff --git a/plugins/feedback-backend/src/service/router.ts b/plugins/feedback-backend/src/service/router.ts deleted file mode 100644 index b734980d47..0000000000 --- a/plugins/feedback-backend/src/service/router.ts +++ /dev/null @@ -1,360 +0,0 @@ -import { - DatabaseManager, - errorHandler, - PluginEndpointDiscovery, -} from '@backstage/backend-common'; -import { AuthService, LoggerService } from '@backstage/backend-plugin-api'; -import { CatalogClient } from '@backstage/catalog-client'; -import { Entity, UserEntityV1alpha1 } from '@backstage/catalog-model'; -import { Config } from '@backstage/config'; - -import express from 'express'; -import Router from 'express-promise-router'; - -import { JiraApiService } from '../api'; -import { DatabaseFeedbackStore } from '../database/feedbackStore'; -import { FeedbackCategory, FeedbackModel } from '../model/feedback.model'; -import { NodeMailer } from './emails'; - -export interface RouterOptions { - logger: LoggerService; - config: Config; - discovery: PluginEndpointDiscovery; - auth: AuthService; -} - -export async function createRouter( - options: RouterOptions, -): Promise { - const { logger, config, discovery, auth } = options; - const router = Router(); - const feedbackDB = await DatabaseFeedbackStore.create({ - database: DatabaseManager.fromConfig(config).forPlugin('feedback'), - skipMigrations: false, - logger, - }); - - const mailer = new NodeMailer(config, logger); - const catalogClient = new CatalogClient({ discoveryApi: discovery }); - - router.use(express.json()); - logger.info('Feedback backend plugin is running'); - - router.post('/', (req, res) => { - (async () => { - const reqData: FeedbackModel = req.body; - if (!reqData.summary || reqData.summary?.trim().length < 1) { - return res.status(500).json({ error: 'Summary field empty' }); - } - reqData.createdAt = new Date().toISOString(); - reqData.updatedBy = reqData.createdBy; - reqData.updatedAt = reqData.createdAt; - - if (reqData.feedbackType?.toUpperCase() === 'FEEDBACK') - reqData.feedbackType = FeedbackCategory.FEEDBACK; - else if (reqData.feedbackType?.toUpperCase() === 'BUG') - reqData.feedbackType = FeedbackCategory.BUG; - else - return res.status(400).json({ - error: `The value of feedbackType should be either 'FEEDBACK'/'BUG'`, - }); - - const { token } = await auth.getPluginRequestToken({ - onBehalfOf: await auth.getOwnServiceCredentials(), - targetPluginId: 'catalog', - }); - const entityRef: Entity | undefined = await catalogClient.getEntityByRef( - reqData.projectId!, - { - token, - }, - ); - if (!entityRef) { - return res - .status(404) - .json({ error: `Entity not found: ${reqData.projectId}` }); - } - - const entityRoute = `${config.getString('app.baseUrl')}/catalog/${ - entityRef.metadata.namespace - }/${entityRef.kind}/${entityRef.metadata.name}/feedback`; - - const feedbackType = - reqData.feedbackType === 'FEEDBACK' ? 'Feedback' : 'Issue'; - - if (reqData.summary?.length > 255) { - reqData.description = reqData.summary - ?.concat('\n\n') - .concat(reqData.description ?? ''); - reqData.summary = `${feedbackType} reported by ${ - reqData.createdBy?.split('/')[1] - } for ${entityRef.metadata.title ?? entityRef.metadata.name}`; - } - - const respObj = await feedbackDB.storeFeedbackGetUuid(reqData); - if (respObj === 0) { - return res.status(500).json({ - error: `Failed to create ${feedbackType}`, - }); - } - - reqData.feedbackId = respObj.feedbackId; - res.status(201).json({ - message: `${feedbackType} created successfully`, - data: respObj, - }); - - if (entityRef.metadata.annotations) { - const annotations = entityRef.metadata.annotations; - const type = annotations['feedback/type']; - const replyTo = annotations['feedback/email-to']; - const reporterEmail = ( - (await catalogClient.getEntityByRef(reqData.createdBy!, { - token, - })) as UserEntityV1alpha1 - ).spec.profile?.email; - const appTitle = config.getString('app.title'); - - if ( - type.toUpperCase() === 'JIRA' && - !reqData.tag?.match(/(Excellent|Good)/g) - ) { - let host = annotations['feedback/host']; - let serviceConfig: Config; - // if host is undefined then - // use the first host from config - try { - serviceConfig = - config - .getConfigArray('feedback.integrations.jira') - .find(hostConfig => host === hostConfig.getString('host')) ?? - config.getConfigArray('feedback.integrations.jira')[0]; - } catch { - return logger.error('Jira integeration not found'); - } - host = serviceConfig.getString('host'); - const authToken = serviceConfig.getString('token'); - const hostType = serviceConfig.getOptionalString('hostType'); - - const projectKey = entityRef.metadata.annotations['jira/project-key']; - const jiraService = new JiraApiService( - host, - authToken, - logger, - hostType, - ); - const jiraUsername = reporterEmail - ? await jiraService.getJiraUsernameByEmail(reporterEmail) - : undefined; - - // if jira id is not there for reporter, add reporter email in description - const jiraDescription = reqData.description!.concat( - `\n\n${ - jiraUsername === undefined - ? `Reported by: ${reporterEmail}` - : '\r' - }\n*Submitted from ${appTitle}*\n[${feedbackType} link|${entityRoute}?id=${ - reqData.feedbackId - }]`, - ); - - const resp = await jiraService.createJiraTicket({ - projectKey: projectKey, - summary: reqData.summary, - description: jiraDescription, - tag: reqData.tag!.toLowerCase().split(' ').join('-'), - feedbackType: reqData.feedbackType, - reporter: jiraUsername, - jiraComponent: entityRef.metadata.annotations['jira/component'], - }); - if (resp.key) { - reqData.ticketUrl = `${host}/browse/${resp.key}`; - await feedbackDB.updateFeedback(reqData); - } - } - - if (type.toUpperCase() === 'MAIL' || replyTo) { - mailer.sendMail({ - to: reporterEmail ?? replyTo, - replyTo: replyTo, - subject: `${reqData.tag} - ${feedbackType} reported for ${ - reqData.projectId?.split('/')[1] - }`, - body: ` -
- Hi ${reqData.createdBy?.split('/')[1]}, -
-
- We have received your feedback for - - ${reqData.projectId?.split('/')[1]} - , - and here are the details: -
-
- Summary: ${reqData.summary} -
-
- ${ - reqData.description?.length! > 0 - ? `Description: ${reqData.description} -
-
` - : '\r' - } - Submitted from: ${reqData.url} -
- Submitted at: ${new Date(reqData.createdAt).toUTCString()} -
-
- - View on ${appTitle} - -
`, - }); - } - } - return 1; - })(); - }); - - router.get('/', (req, res) => { - (async () => { - const projectId = req.query.projectId - ? (req.query.projectId as string) - : 'all'; - const offset = req.query.offset - ? parseInt(req.query.offset as string, 10) - : 0; - const limit = req.query.limit - ? parseInt(req.query.limit as string, 10) - : 10; - const searchKey = req.query.query?.toString() ?? ''; - - const feedbackData = await feedbackDB.getAllFeedbacks( - projectId, - offset, - limit, - searchKey, - ); - const page = offset / limit + 1; - return res - .status(200) - .json({ ...feedbackData, currentPage: page, pageSize: limit }); - })(); - }); - - router.get('/:id', (req, res) => { - (async () => { - const feedbackId = req.params.id; - - if (await feedbackDB.checkFeedbackId(feedbackId)) { - const feedback: FeedbackModel = - await feedbackDB.getFeedbackByUuid(feedbackId); - return res.status(200).json({ - data: feedback, - message: 'Feedback fetched successfully', - }); - } - return res - .status(404) - .json({ error: `No feedback found for id ${feedbackId}` }); - })(); - }); - - router.get('/:id/ticket', (req, res) => { - (async () => { - const ticketId = req.query.ticketId - ? (req.query.ticketId as string) - : null; - const projectId = req.query.projectId - ? (req.query.projectId as string) - : null; - - if (ticketId && projectId) { - const { token } = await auth.getPluginRequestToken({ - onBehalfOf: await auth.getOwnServiceCredentials(), - targetPluginId: 'catalog', - }); - const entityRef: Entity | undefined = - await catalogClient.getEntityByRef(projectId, { token }); - if (!entityRef) { - return res - .status(404) - .json({ error: `Entity not found: ${projectId}` }); - } - const feedbackType = entityRef.metadata.annotations?.['feedback/type']; - if (feedbackType?.toLowerCase() === 'jira') { - let host = entityRef.metadata.annotations?.['feedback/host']; - - // if host is undefined then - // use the first host from config - const serviceConfig = - config - .getConfigArray('feedback.integrations.jira') - .find(hostConfig => host === hostConfig.getString('host')) ?? - config.getConfigArray('feedback.integrations.jira')[0]; - host = serviceConfig.getString('host'); - const authToken = serviceConfig.getString('token'); - - const resp = await new JiraApiService( - host, - authToken, - logger, - ).getTicketDetails(ticketId); - return res.status(200).json({ - data: { ...resp }, - message: 'fetched successfully', - }); - } - } - - return res - .status(404) - .json({ error: `Unable to fetch jira ticket ${ticketId}` }); - })(); - }); - - // patch and delete apis - router.patch('/:id', (req, res) => { - (async () => { - const feedbackId = req.params.id; - const data: FeedbackModel = req.body; - - if (await feedbackDB.checkFeedbackId(feedbackId)) { - data.feedbackId = feedbackId; - data.updatedAt = new Date().toISOString(); - const updatedData = await feedbackDB.updateFeedback(data); - if (updatedData) { - return res.status(200).json({ - data: updatedData, - message: 'Feedback updated successfully', - }); - } - return res.status(500).json({ error: 'Failed to edit the feedback' }); - } - - return res - .status(404) - .json({ error: `No feedback found for id ${feedbackId}` }); - })(); - }); - - router.delete('/:id', (req, res) => { - (async () => { - const feedbackId = req.params.id; - if (await feedbackDB.checkFeedbackId(feedbackId)) { - await feedbackDB.deleteFeedbackById(feedbackId); - return res.status(200).json({ message: 'Deleted successfully' }); - } - - logger.error(`No feedback found for id ${feedbackId}`); - return res - .status(404) - .json({ error: `No feedback found for id ${feedbackId}` }); - })(); - }); - - router.use(errorHandler()); - return router; -} diff --git a/plugins/feedback-backend/src/service/standaloneServer.ts b/plugins/feedback-backend/src/service/standaloneServer.ts deleted file mode 100644 index b840ffb4fd..0000000000 --- a/plugins/feedback-backend/src/service/standaloneServer.ts +++ /dev/null @@ -1,50 +0,0 @@ -import { createServiceBuilder, HostDiscovery } from '@backstage/backend-common'; -import { - AuthService, - DiscoveryService, - LoggerService, -} from '@backstage/backend-plugin-api'; -import { mockServices } from '@backstage/backend-test-utils'; -import { Config, ConfigReader } from '@backstage/config'; - -import { Server } from 'http'; - -import { createRouter } from './router'; - -export interface ServerOptions { - port: number; - enableCors: boolean; - logger: LoggerService; -} - -export async function startStandaloneServer( - options: ServerOptions, -): Promise { - const config: Config = new ConfigReader({}); - const discovery: DiscoveryService = HostDiscovery.fromConfig(config); - const auth: AuthService = mockServices.auth({ pluginId: 'feedback' }); - const logger: LoggerService = options.logger.child({ - service: 'feedback-backend', - }); - logger.debug('Starting application server...'); - const router = await createRouter({ - logger, - config: config, - discovery: discovery, - auth: auth, - }); - - let service = createServiceBuilder(module) - .setPort(options.port) - .addRouter('/feedback', router); - if (options.enableCors) { - service = service.enableCors({ origin: 'http://localhost:3000' }); - } - - return await service.start().catch(err => { - logger.error(err); - process.exit(1); - }); -} - -module.hot?.accept(); diff --git a/plugins/feedback-backend/src/setupTests.ts b/plugins/feedback-backend/src/setupTests.ts deleted file mode 100644 index cb0ff5c3b5..0000000000 --- a/plugins/feedback-backend/src/setupTests.ts +++ /dev/null @@ -1 +0,0 @@ -export {}; diff --git a/plugins/feedback-backend/tsconfig.json b/plugins/feedback-backend/tsconfig.json deleted file mode 100644 index df5f234d11..0000000000 --- a/plugins/feedback-backend/tsconfig.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "extends": "@backstage/cli/config/tsconfig.json", - "include": ["src", "dev", "migrations"], - "exclude": ["node_modules"], - "compilerOptions": { - "outDir": "../../dist-types/plugins/feedback-backend", - "rootDir": "." - } -} diff --git a/plugins/feedback-backend/turbo.json b/plugins/feedback-backend/turbo.json deleted file mode 100644 index e88834b1eb..0000000000 --- a/plugins/feedback-backend/turbo.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "extends": ["//"], - "pipeline": { - "tsc": { - "outputs": ["../../dist-types/plugins/feedback-backend/**"], - "dependsOn": ["^tsc"] - } - } -} diff --git a/plugins/feedback/.eslintrc.js b/plugins/feedback/.eslintrc.js deleted file mode 100644 index e2a53a6ad2..0000000000 --- a/plugins/feedback/.eslintrc.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = require('@backstage/cli/config/eslint-factory')(__dirname); diff --git a/plugins/feedback/CHANGELOG.md b/plugins/feedback/CHANGELOG.md deleted file mode 100644 index 8e4810428d..0000000000 --- a/plugins/feedback/CHANGELOG.md +++ /dev/null @@ -1,211 +0,0 @@ -### Dependencies - -* **@janus-idp/cli:** upgraded to 1.13.1 - -## @janus-idp/backstage-plugin-feedback [1.6.0](https://github.com/janus-idp/backstage-plugins/compare/@janus-idp/backstage-plugin-feedback@1.5.0...@janus-idp/backstage-plugin-feedback@1.6.0) (2024-07-26) - - -### Features - -* **deps:** update to backstage 1.29 ([#1900](https://github.com/janus-idp/backstage-plugins/issues/1900)) ([f53677f](https://github.com/janus-idp/backstage-plugins/commit/f53677fb02d6df43a9de98c43a9f101a6db76802)) - -## @janus-idp/backstage-plugin-feedback [1.5.0](https://github.com/janus-idp/backstage-plugins/compare/@janus-idp/backstage-plugin-feedback@1.4.2...@janus-idp/backstage-plugin-feedback@1.5.0) (2024-07-24) - - -### Features - -* **deps:** update to backstage 1.28 ([#1891](https://github.com/janus-idp/backstage-plugins/issues/1891)) ([1ba1108](https://github.com/janus-idp/backstage-plugins/commit/1ba11088e0de60e90d138944267b83600dc446e5)) - -## @janus-idp/backstage-plugin-feedback [1.4.2](https://github.com/janus-idp/backstage-plugins/compare/@janus-idp/backstage-plugin-feedback@1.4.1...@janus-idp/backstage-plugin-feedback@1.4.2) (2024-07-05) - - -### Bug Fixes - -* **feedback:** fixed feedback creation ([#1863](https://github.com/janus-idp/backstage-plugins/issues/1863)) ([eb2f3ac](https://github.com/janus-idp/backstage-plugins/commit/eb2f3ac372e92e2537a46aab71c4ced6480d71ec)) - -## @janus-idp/backstage-plugin-feedback [1.4.1](https://github.com/janus-idp/backstage-plugins/compare/@janus-idp/backstage-plugin-feedback@1.4.0...@janus-idp/backstage-plugin-feedback@1.4.1) (2024-06-19) - - - -### Dependencies - -* **@janus-idp/cli:** upgraded to 1.11.1 - -## @janus-idp/backstage-plugin-feedback [1.4.0](https://github.com/janus-idp/backstage-plugins/compare/@janus-idp/backstage-plugin-feedback@1.3.13...@janus-idp/backstage-plugin-feedback@1.4.0) (2024-06-13) - - -### Features - -* **deps:** update to backstage 1.27 ([#1683](https://github.com/janus-idp/backstage-plugins/issues/1683)) ([a14869c](https://github.com/janus-idp/backstage-plugins/commit/a14869c3f4177049cb8d6552b36c3ffd17e7997d)) - - - -### Dependencies - -* **@janus-idp/cli:** upgraded to 1.11.0 - -## @janus-idp/backstage-plugin-feedback [1.3.13](https://github.com/janus-idp/backstage-plugins/compare/@janus-idp/backstage-plugin-feedback@1.3.12...@janus-idp/backstage-plugin-feedback@1.3.13) (2024-06-13) - - - -### Dependencies - -* **@janus-idp/cli:** upgraded to 1.10.1 - -## @janus-idp/backstage-plugin-feedback [1.3.12](https://github.com/janus-idp/backstage-plugins/compare/@janus-idp/backstage-plugin-feedback@1.3.11...@janus-idp/backstage-plugin-feedback@1.3.12) (2024-06-07) - - -### Bug Fixes - -* **feedback:** update EntityPage component ([#1798](https://github.com/janus-idp/backstage-plugins/issues/1798)) ([f5b04b5](https://github.com/janus-idp/backstage-plugins/commit/f5b04b5f5431cb6c710613b699ee81c9fec6d10d)) - -## @janus-idp/backstage-plugin-feedback [1.3.11](https://github.com/janus-idp/backstage-plugins/compare/@janus-idp/backstage-plugin-feedback@1.3.10...@janus-idp/backstage-plugin-feedback@1.3.11) (2024-06-05) - - - -### Dependencies - -* **@janus-idp/cli:** upgraded to 1.10.0 - -## @janus-idp/backstage-plugin-feedback [1.3.10](https://github.com/janus-idp/backstage-plugins/compare/@janus-idp/backstage-plugin-feedback@1.3.9...@janus-idp/backstage-plugin-feedback@1.3.10) (2024-06-04) - -## @janus-idp/backstage-plugin-feedback [1.3.9](https://github.com/janus-idp/backstage-plugins/compare/@janus-idp/backstage-plugin-feedback@1.3.8...@janus-idp/backstage-plugin-feedback@1.3.9) (2024-06-04) - -## @janus-idp/backstage-plugin-feedback [1.3.8](https://github.com/janus-idp/backstage-plugins/compare/@janus-idp/backstage-plugin-feedback@1.3.7...@janus-idp/backstage-plugin-feedback@1.3.8) (2024-06-03) - - - -### Dependencies - -* **@janus-idp/cli:** upgraded to 1.9.0 - -## @janus-idp/backstage-plugin-feedback [1.3.7](https://github.com/janus-idp/backstage-plugins/compare/@janus-idp/backstage-plugin-feedback@1.3.6...@janus-idp/backstage-plugin-feedback@1.3.7) (2024-05-31) - -## @janus-idp/backstage-plugin-feedback [1.3.6](https://github.com/janus-idp/backstage-plugins/compare/@janus-idp/backstage-plugin-feedback@1.3.5...@janus-idp/backstage-plugin-feedback@1.3.6) (2024-05-29) - - - -### Dependencies - -* **@janus-idp/cli:** upgraded to 1.8.10 - -## @janus-idp/backstage-plugin-feedback [1.3.5](https://github.com/janus-idp/backstage-plugins/compare/@janus-idp/backstage-plugin-feedback@1.3.4...@janus-idp/backstage-plugin-feedback@1.3.5) (2024-05-29) - - - -### Dependencies - -* **@janus-idp/cli:** upgraded to 1.8.9 - -## @janus-idp/backstage-plugin-feedback [1.3.4](https://github.com/janus-idp/backstage-plugins/compare/@janus-idp/backstage-plugin-feedback@1.3.3...@janus-idp/backstage-plugin-feedback@1.3.4) (2024-05-28) - - - -### Dependencies - -* **@janus-idp/cli:** upgraded to 1.8.8 - -## @janus-idp/backstage-plugin-feedback [1.3.3](https://github.com/janus-idp/backstage-plugins/compare/@janus-idp/backstage-plugin-feedback@1.3.2...@janus-idp/backstage-plugin-feedback@1.3.3) (2024-05-23) - - -### Bug Fixes - -* **deps:** upgrade devex plugins to mui v5 ([#1696](https://github.com/janus-idp/backstage-plugins/issues/1696)) ([06d9cf0](https://github.com/janus-idp/backstage-plugins/commit/06d9cf0d8c134212329eb691ac21eb78ae155c09)) - -## @janus-idp/backstage-plugin-feedback [1.3.2](https://github.com/janus-idp/backstage-plugins/compare/@janus-idp/backstage-plugin-feedback@1.3.1...@janus-idp/backstage-plugin-feedback@1.3.2) (2024-05-16) - -## @janus-idp/backstage-plugin-feedback [1.3.1](https://github.com/janus-idp/backstage-plugins/compare/@janus-idp/backstage-plugin-feedback@1.3.0...@janus-idp/backstage-plugin-feedback@1.3.1) (2024-05-16) - - - -### Dependencies - -* **@janus-idp/cli:** upgraded to 1.8.7 - -## @janus-idp/backstage-plugin-feedback [1.3.0](https://github.com/janus-idp/backstage-plugins/compare/@janus-idp/backstage-plugin-feedback@1.2.0...@janus-idp/backstage-plugin-feedback@1.3.0) (2024-05-14) - - -### Features - -* **deps:** use RHDH themes in the backstage app and dev pages ([#1480](https://github.com/janus-idp/backstage-plugins/issues/1480)) ([8263bf0](https://github.com/janus-idp/backstage-plugins/commit/8263bf099736cbb0d0f2316082d338ba81fa6927)) - -## @janus-idp/backstage-plugin-feedback [1.2.0](https://github.com/janus-idp/backstage-plugins/compare/@janus-idp/backstage-plugin-feedback@1.1.7...@janus-idp/backstage-plugin-feedback@1.2.0) (2024-05-14) - - -### Features - -* **feedback:** use backstage auth service in backend plugin ([#1646](https://github.com/janus-idp/backstage-plugins/issues/1646)) ([7d9ee11](https://github.com/janus-idp/backstage-plugins/commit/7d9ee11d1ed0dbc1ff026de3b1e50f2888c3f542)), closes [#1626](https://github.com/janus-idp/backstage-plugins/issues/1626) - -## @janus-idp/backstage-plugin-feedback [1.1.7](https://github.com/janus-idp/backstage-plugins/compare/@janus-idp/backstage-plugin-feedback@1.1.6...@janus-idp/backstage-plugin-feedback@1.1.7) (2024-05-09) - - - -### Dependencies - -* **@janus-idp/cli:** upgraded to 1.8.6 - -## @janus-idp/backstage-plugin-feedback [1.1.6](https://github.com/janus-idp/backstage-plugins/compare/@janus-idp/backstage-plugin-feedback@1.1.5...@janus-idp/backstage-plugin-feedback@1.1.6) (2024-05-02) - - - -### Dependencies - -* **@janus-idp/cli:** upgraded to 1.8.5 - -## @janus-idp/backstage-plugin-feedback [1.1.5](https://github.com/janus-idp/backstage-plugins/compare/@janus-idp/backstage-plugin-feedback@1.1.4...@janus-idp/backstage-plugin-feedback@1.1.5) (2024-05-02) - - - -### Dependencies - -* **@janus-idp/cli:** upgraded to 1.8.4 - -## @janus-idp/backstage-plugin-feedback [1.1.4](https://github.com/janus-idp/backstage-plugins/compare/@janus-idp/backstage-plugin-feedback@1.1.3...@janus-idp/backstage-plugin-feedback@1.1.4) (2024-04-30) - - - -### Dependencies - -* **@janus-idp/cli:** upgraded to 1.8.3 - -## @janus-idp/backstage-plugin-feedback [1.1.3](https://github.com/janus-idp/backstage-plugins/compare/@janus-idp/backstage-plugin-feedback@1.1.2...@janus-idp/backstage-plugin-feedback@1.1.3) (2024-04-30) - - - -### Dependencies - -* **@janus-idp/cli:** upgraded to 1.8.2 - -## @janus-idp/backstage-plugin-feedback [1.1.2](https://github.com/janus-idp/backstage-plugins/compare/@janus-idp/backstage-plugin-feedback@1.1.1...@janus-idp/backstage-plugin-feedback@1.1.2) (2024-04-30) - - -### Bug Fixes - -* **feedback:** add support for jira cloud instance ([#1582](https://github.com/janus-idp/backstage-plugins/issues/1582)) ([5425e54](https://github.com/janus-idp/backstage-plugins/commit/5425e5494c9b8301e6732f534d5ede889996342c)), closes [#1543](https://github.com/janus-idp/backstage-plugins/issues/1543) - -## @janus-idp/backstage-plugin-feedback [1.1.1](https://github.com/janus-idp/backstage-plugins/compare/@janus-idp/backstage-plugin-feedback@1.1.0...@janus-idp/backstage-plugin-feedback@1.1.1) (2024-04-15) - - -### Bug Fixes - -* **feedback-docs:** move out collapsed screenshots ([#1496](https://github.com/janus-idp/backstage-plugins/issues/1496)) ([562364d](https://github.com/janus-idp/backstage-plugins/commit/562364d80633178302fc2f9e759465cea482ce8a)), closes [#discussion_r1560988756](https://github.com/janus-idp/backstage-plugins/issues/discussion_r1560988756) - -## @janus-idp/backstage-plugin-feedback [1.1.0](https://github.com/janus-idp/backstage-plugins/compare/@janus-idp/backstage-plugin-feedback@1.0.3...@janus-idp/backstage-plugin-feedback@1.1.0) (2024-04-09) - - -### Features - -* **feedback:** add capture events in feedback plugin ([#1472](https://github.com/janus-idp/backstage-plugins/issues/1472)) ([36a12e3](https://github.com/janus-idp/backstage-plugins/commit/36a12e332cb9d75bd367004948116697af9ff885)) - -## @janus-idp/backstage-plugin-feedback [1.0.3](https://github.com/janus-idp/backstage-plugins/compare/@janus-idp/backstage-plugin-feedback@1.0.2...@janus-idp/backstage-plugin-feedback@1.0.3) (2024-04-05) - -## @janus-idp/backstage-plugin-feedback [1.0.2](https://github.com/janus-idp/backstage-plugins/compare/@janus-idp/backstage-plugin-feedback@1.0.1...@janus-idp/backstage-plugin-feedback@1.0.2) (2024-03-29) - -## @janus-idp/backstage-plugin-feedback [1.0.1](https://github.com/janus-idp/backstage-plugins/compare/@janus-idp/backstage-plugin-feedback@1.0.0...@janus-idp/backstage-plugin-feedback@1.0.1) (2024-02-21) - -## @janus-idp/backstage-plugin-feedback 1.0.0 (2024-01-18) - - -### Features - -* **#1019:** implemented feedback plugin ([#1045](https://github.com/janus-idp/backstage-plugins/issues/1045)) ([34c312e](https://github.com/janus-idp/backstage-plugins/commit/34c312e3c8522e81d04621abdcb174c0ecb25733)), closes [#1019](https://github.com/janus-idp/backstage-plugins/issues/1019) diff --git a/plugins/feedback/README.md b/plugins/feedback/README.md index add6ce5649..7c9bf174d3 100644 --- a/plugins/feedback/README.md +++ b/plugins/feedback/README.md @@ -6,171 +6,6 @@ Please use the **[@backstage-community/backstage-plugin-feedback](https://github # Feedback Plugin -## Introduction - Feedback plugin is a valuable addition to backstage which allows project managers to get feedbacks for entites in Backstage Catalog. It is dedicated to simplifying the process of gathering and managing user feedback for service catalog entities. This plugin seamlessly integrates with the [feedback-backend-plugin](../feedback-backend) and extends its capabilities by allowing users to create Jira tickets associated with their feedback. - -### Screenshots - -| Global Page | Entity Page | -| -------------------------------------------- | -------------------------------------------- | -| ![globalPage](./docs/images/global-page.png) | ![entityPage](./docs/images/entity-page.png) | - -| Feedback Details Modal | Create Feedback Modal | -| -------------------------------------------------- | --------------------------------------------- | -| ![feedbacDetails](./docs/images/details-modal.png) | ![entityPage](./docs/images/create-modal.png) | - -| Opc Feedback Component | | | | -| -------------------------------------------------- | ---------------------------------------------- | ---------------------------------------------------- | ---------------------------------------------- | -| ![initialDialog](./docs/images/initial-dialog.png) | ![issueDialog](./docs/images/issue-dialog.png) | ![feedbackDialog](./docs/images/feedback-dialog.png) | ![finalDialog](./docs/images/final-dialog.png) | - -### Key Features - -- List all the feedbacks and bugs for the componnets on global page. -- List all the feedbacks and bugs for each component on entity page. -- Create Bugs, Feedbacks directly on JIRA and also sends a mail to reporter. -- Unique feedback links for each feedback. -- Works with all knex supported databases. - -### Requirements - -- Make sure that [feedback-backend-plugin](../feedback-backend) is configured prior to this. - -### Plugin Setup - -1. Install the plugin in your environment - - ```bash - yarn workspace app add @janus-idp/backstage-plugin-feedback - ``` - -2. Add configuration to app-config.yml - - ```yaml - feedback: - # A ref to base entity under which global feedbacks gets stored - # in format: kind:namespace/name - baseEntityRef: 'component:default/example-website' - - # Limit the number of characters for summary field - # should be between 1-255 - summaryLimit: 240 - ``` - -3. Add `GlobalFeedbackPage`, `OpcFeedbackComponent` component to the `src/App.tsx`. - - ```jsx - import { - feedbackPlugin, - GlobalFeedbackPage, - OpcFeedbackComponent, - } from '@janus-idp/backstage-plugin-feedback'; - - // ... - const app = createApp({ - apis, - bindRoutes({ bind }) { - // ... - // Bind techdocs root route to feedback plugin externalRoute.viewDocs to add "View Docs" link in opc-feedback component - bind(feedbackPlugin.externalRoutes, { - viewDocs: techdocsPlugin.routes.root, - }); - }, - featureFlags: [ - // ... - ], - }); - const routes = ( - - // Insert this line to add feedback route - } /> - - ); - - export default app.createRoot( - <> - // ... - - // ... - - - , - ); - ``` - -4. Then add the feedback route to sidebar to easily access `/feedback`, in `src/components/Root/Root.tsx`. - - ```ts - import TextsmsOutlined from '@material-ui/icons/TextsmsOutlined'; - //... - export const Root = ({ children }: PropsWithChildren<{}>) => ( - - - // ... - }> - // ... - // Insert these lines in SidebarGroup - - - - // ... - // ... - - ) - ``` - -5. Add `EntityFeedbackPage` component to the **Component page, Api page** in `src/components/catalog/EntityPage.tsx`. - - ```ts - - - - ``` - -### Annotations - -To configure only mail: - -- Add these annotations to your `catalog-info.yaml` file. - -```yaml -metadata: - annotations: - # Set to MAIL, if you want to recevie mail - # on every feedback. - feedback/type: 'MAIL' - - # Type in your mail here, it will be kept in cc, - # while sending mail on feedback generation. - feedback/email-to: 'example@example.com' -``` - -To configure Jira + mail: - -- Add these annotations to your `catalog-info.yaml` file. - -```yaml -metadata: - annotations: - # Set to JIRA to create ticket when - # creating feedbacks. - feedback/type: 'JIRA' - - # Enter your jira project key, - jira/project-key: '' - - # (optional) Enter the url of you jira server. - # If not set then it will use first host from app-config - feedback/host: '' - - # (optional) Type in your mail here, - # it will be kept in cc, - # while sending mail on feedback generation. - feedback/email-to: 'example@example.com'; -``` - -### Credits - -- @1-Platform for [opc-feedback](https://github.com/1-platform/op-components) component. diff --git a/plugins/feedback/app-config.janus-idp.yaml b/plugins/feedback/app-config.janus-idp.yaml deleted file mode 100644 index 2e22b59e73..0000000000 --- a/plugins/feedback/app-config.janus-idp.yaml +++ /dev/null @@ -1,42 +0,0 @@ -feedback: - # A ref to base entity under which global feedbacks gets stored - # in format: 'kind:namespace/name', eg: 'component:default/example-website' - baseEntityRef: ${FEEDBACK_PLUGIN_BASE_ENTITY} - - # Limit the number of characters for summary field - # should be between 1-255 - summaryLimit: ${FEEDBACK_PLUGIN_SUMMARY_LIMIT} - -# Add dynamic plugin configuration (copy this to dynamic-plugins.yaml file) -dynamicPlugins: - frontend: - janus-idp.backstage-plugin-feedback: - appIcons: - - name: feedbackIcon - importName: FeedbackIcon - dynamicRoutes: - - path: /feedback - importName: GlobalFeedbackPage - menuItem: - icon: feedbackIcon - text: Feedback - routeBindings: - targets: - - importName: feedbackPlugin - bindings: - - bindTarget: feedbackPlugin.externalRoutes - bindMap: - viewDocs: techdocsPlugin.routes.root - entityTabs: - - path: '/feedback' - title: Feedback - mountPoint: entity.page.feedback - mountPoints: - - mountPoint: entity.page.feedback/cards - importName: EntityFeedbackPage - config: - layout: - gridColumn: '1 / -1' - if: - anyOf: - - hasAnnotation: feedback/type diff --git a/plugins/feedback/catalog-info.yaml b/plugins/feedback/catalog-info.yaml deleted file mode 100644 index 157c2f2cd2..0000000000 --- a/plugins/feedback/catalog-info.yaml +++ /dev/null @@ -1,51 +0,0 @@ -# https://backstage.io/docs/features/software-catalog/descriptor-format#kind-component -apiVersion: backstage.io/v1alpha1 -kind: Component -metadata: - name: janus-idp-feedback - title: Feedback plugin - description: '' - annotations: - backstage.io/source-location: url:https://github.com/janus-idp/backstage-plugins/tree/main/plugins/feedback - backstage.io/view-url: https://github.com/janus-idp/backstage-plugins/blob/main/plugins/feedback/catalog-info.yaml - backstage.io/edit-url: https://github.com/janus-idp/backstage-plugins/edit/main/plugins/feedback/catalog-info.yaml - github.com/project-slug: janus-idp/backstage-plugins - github.com/team-slug: janus-idp/maintainers-plugins - sonarqube.org/project-key: janus-idp_backstage-plugins - links: - - url: https://github.com/janus-idp/backstage-plugins/tree/main/plugins/feedback - title: GitHub Source - icon: source - type: source -spec: - type: backstage-plugin - lifecycle: production - owner: rhdh-team - system: rhdh - subcomponentOf: janus-idp-backstage-plugins ---- -# https://backstage.io/docs/features/software-catalog/descriptor-format#kind-component -apiVersion: backstage.io/v1alpha1 -kind: Component -metadata: - name: janus-idp-feedback-frontend - title: '@janus-idp/backstage-plugin-feedback' - description: Feedback Plugin - annotations: - backstage.io/source-location: url:https://github.com/janus-idp/backstage-plugins/tree/main/plugins/feedback - backstage.io/view-url: https://github.com/janus-idp/backstage-plugins/blob/main/plugins/feedback/catalog-info.yaml - backstage.io/edit-url: https://github.com/janus-idp/backstage-plugins/edit/main/plugins/feedback/catalog-info.yaml - github.com/project-slug: janus-idp/backstage-plugins - github.com/team-slug: janus-idp/maintainers-plugins - sonarqube.org/project-key: janus-idp_backstage-plugins - links: - - url: https://github.com/janus-idp/backstage-plugins/tree/main/plugins/feedback - title: GitHub Source - icon: source - type: source -spec: - type: backstage-frontend-plugin - lifecycle: production - owner: rhdh-team - system: rhdh - subcomponentOf: janus-idp-feedback diff --git a/plugins/feedback/config.d.ts b/plugins/feedback/config.d.ts deleted file mode 100644 index ee2462ba38..0000000000 --- a/plugins/feedback/config.d.ts +++ /dev/null @@ -1,34 +0,0 @@ -/** - * Configuration options for the application. - */ -export interface Config { - /** - * @visibility frontend - */ - feedback?: { - /** - * @visibility frontend - */ - summaryLimit?: number; - /** - * @visibility frontend - */ - baseEntityRef: string; - /** - * @visibility frontend - * */ - integrations: { - /** - * Configuration options for JIRA integration. - * It is an array, which can be used to set up multiple jira servers at the same time. - */ - jira?: Array<{ - /** - * The hostname or URL of the JIRA organization. - * @visibility frontend - */ - host: string; - }>; - }; - }; -} diff --git a/plugins/feedback/dev/index.tsx b/plugins/feedback/dev/index.tsx deleted file mode 100644 index 4b2b5542c0..0000000000 --- a/plugins/feedback/dev/index.tsx +++ /dev/null @@ -1,40 +0,0 @@ -import React from 'react'; - -import { createDevApp } from '@backstage/dev-utils'; -import { EntityProvider } from '@backstage/plugin-catalog-react'; - -import { getAllThemes } from '@redhat-developer/red-hat-developer-hub-theme'; - -import { mockEntity } from '../src/mocks'; -import { - EntityFeedbackPage, - feedbackPlugin, - GlobalFeedbackPage, - OpcFeedbackComponent, -} from '../src/plugin'; - -createDevApp() - .registerPlugin(feedbackPlugin) - .addThemes(getAllThemes()) - .addPage({ - element: ( - <> - - - ), - title: 'Root Page', - path: '/feedback', - }) - .addPage({ - element: ( -
- - - - -
- ), - title: 'Entity Page', - path: '/catalog/default/component/example-website-for-feedback-plugin', - }) - .render(); diff --git a/plugins/feedback/docs/images/create-modal.png b/plugins/feedback/docs/images/create-modal.png deleted file mode 100644 index 04620b1504..0000000000 Binary files a/plugins/feedback/docs/images/create-modal.png and /dev/null differ diff --git a/plugins/feedback/docs/images/details-modal.png b/plugins/feedback/docs/images/details-modal.png deleted file mode 100644 index b1d7221d1b..0000000000 Binary files a/plugins/feedback/docs/images/details-modal.png and /dev/null differ diff --git a/plugins/feedback/docs/images/entity-page.png b/plugins/feedback/docs/images/entity-page.png deleted file mode 100644 index 6805d7f7d6..0000000000 Binary files a/plugins/feedback/docs/images/entity-page.png and /dev/null differ diff --git a/plugins/feedback/docs/images/feedback-dialog.png b/plugins/feedback/docs/images/feedback-dialog.png deleted file mode 100644 index b37c40d872..0000000000 Binary files a/plugins/feedback/docs/images/feedback-dialog.png and /dev/null differ diff --git a/plugins/feedback/docs/images/final-dialog.png b/plugins/feedback/docs/images/final-dialog.png deleted file mode 100644 index a3aa20a78a..0000000000 Binary files a/plugins/feedback/docs/images/final-dialog.png and /dev/null differ diff --git a/plugins/feedback/docs/images/global-page.png b/plugins/feedback/docs/images/global-page.png deleted file mode 100644 index 0a38032343..0000000000 Binary files a/plugins/feedback/docs/images/global-page.png and /dev/null differ diff --git a/plugins/feedback/docs/images/initial-dialog.png b/plugins/feedback/docs/images/initial-dialog.png deleted file mode 100644 index ecd5f13a42..0000000000 Binary files a/plugins/feedback/docs/images/initial-dialog.png and /dev/null differ diff --git a/plugins/feedback/docs/images/issue-dialog.png b/plugins/feedback/docs/images/issue-dialog.png deleted file mode 100644 index 888c26f135..0000000000 Binary files a/plugins/feedback/docs/images/issue-dialog.png and /dev/null differ diff --git a/plugins/feedback/package.json b/plugins/feedback/package.json deleted file mode 100644 index 1ba25a316c..0000000000 --- a/plugins/feedback/package.json +++ /dev/null @@ -1,93 +0,0 @@ -{ - "name": "@janus-idp/backstage-plugin-feedback", - "version": "1.6.3", - "private": true, - "main": "src/index.ts", - "types": "src/index.ts", - "license": "Apache-2.0", - "publishConfig": { - "access": "public", - "main": "dist/index.esm.js", - "types": "dist/index.d.ts" - }, - "backstage": { - "role": "frontend-plugin", - "supported-versions": "1.28.4", - "pluginId": "feedback", - "pluginPackages": [ - "@janus-idp/backstage-plugin-feedback", - "@janus-idp/backstage-plugin-feedback-backend" - ] - }, - "sideEffects": false, - "scripts": { - "start": "backstage-cli package start", - "build": "backstage-cli package build", - "lint": "backstage-cli package lint", - "test": "backstage-cli package test --passWithNoTests --coverage", - "clean": "backstage-cli package clean", - "prepack": "backstage-cli package prepack", - "postpack": "backstage-cli package postpack", - "tsc": "tsc", - "export-dynamic": "janus-cli package export-dynamic-plugin --in-place" - }, - "dependencies": { - "@backstage/catalog-model": "^1.5.0", - "@backstage/config": "^1.2.0", - "@backstage/core-components": "^0.14.9", - "@backstage/core-plugin-api": "^1.9.3", - "@backstage/plugin-catalog-react": "^1.12.2", - "@backstage/theme": "^0.5.6", - "@mui/icons-material": "^5.15.18", - "@mui/material": "^5.15.18", - "@one-platform/opc-feedback": "0.1.1-alpha", - "axios": "^1.7.4", - "react-use": "^17.2.4" - }, - "peerDependencies": { - "react": "^16.13.1 || ^17.0.0 || ^18.0.0" - }, - "devDependencies": { - "@backstage/cli": "0.26.11", - "@backstage/core-app-api": "1.14.1", - "@backstage/dev-utils": "1.0.36", - "@backstage/test-utils": "1.5.9", - "@janus-idp/cli": "1.13.1", - "@redhat-developer/red-hat-developer-hub-theme": "0.2.0", - "@testing-library/jest-dom": "6.4.8", - "@testing-library/react": "14.3.1", - "@testing-library/user-event": "14.5.2", - "msw": "1.3.3" - }, - "files": [ - "app-config.janus-idp.yaml", - "dist", - "config.d.ts", - "dist-scalprum" - ], - "configSchema": "config.d.ts", - "repository": { - "type": "git", - "url": "https://github.com/janus-idp/backstage-plugins", - "directory": "plugins/feedback" - }, - "keywords": [ - "support:tech-preview", - "lifecycle:active", - "backstage", - "plugin" - ], - "scalprum": { - "name": "janus-idp.backstage-plugin-feedback", - "exposedModules": { - "PluginRoot": "./src/index.ts" - } - }, - "homepage": "https://red.ht/rhdh", - "bugs": "https://github.com/janus-idp/backstage-plugins/issues", - "maintainers": [ - "@janus-idp/maintainers-plugins", - "@janus-idp/devex-uxe" - ], - "author": "The Backstage Community" -} diff --git a/plugins/feedback/src/api/index.ts b/plugins/feedback/src/api/index.ts deleted file mode 100644 index 442c5fcb30..0000000000 --- a/plugins/feedback/src/api/index.ts +++ /dev/null @@ -1,109 +0,0 @@ -import { - ConfigApi, - createApiRef, - DiscoveryApi, - FetchApi, - IdentityApi, -} from '@backstage/core-plugin-api'; - -import { FeedbackType } from '../models/feedback.model'; - -export const feedbackApiRef = createApiRef({ - id: 'plugin.feedback.service', -}); - -type Options = { - discoveryApi: DiscoveryApi; - configApi: ConfigApi; - identityApi: IdentityApi; - fetchApi: FetchApi; -}; - -type feedbackResp = { - data?: FeedbackType; - message?: string; - error?: string; -}; - -type feedbacksResp = { - data: FeedbackType[]; - count: number; - currentPage: number; - pageSize: number; -}; - -export class FeedbackAPI { - private readonly discoveryApi: DiscoveryApi; - private readonly fetchApi: FetchApi; - - constructor(options: Options) { - this.discoveryApi = options.discoveryApi; - this.fetchApi = options.fetchApi; - } - - async getAllFeedbacks( - page: number, - pageSize: number, - projectId: string, - searchText: string, - ) { - const baseUrl = await this.discoveryApi.getBaseUrl('feedback'); - const offset = (page - 1) * pageSize; - try { - const resp = await this.fetchApi.fetch( - `${baseUrl}?query=${searchText}&offset=${offset}&limit=${pageSize}&projectId=${projectId}`, - ); - const respData: feedbacksResp = await resp.json(); - return respData; - } catch (error) { - return { data: [], count: 0, currentPage: page, pageSize: pageSize }; - } - } - - async getFeedbackById(feedbackId: string): Promise { - const baseUrl = await this.discoveryApi.getBaseUrl('feedback'); - const resp = await this.fetchApi.fetch(`${baseUrl}/${feedbackId}`); - const respData: feedbackResp = await resp.json(); - return respData; - } - - async createFeedback( - data: Partial, - ): Promise<{ data?: {}; message?: string; error?: string }> { - try { - const baseUrl = await this.discoveryApi.getBaseUrl('feedback'); - const resp = await this.fetchApi.fetch(`${baseUrl}`, { - method: 'POST', - body: JSON.stringify(data), - headers: { - 'Content-Type': 'application/json', - }, - }); - const respData = await resp.json(); - return respData; - } catch (error: any) { - return { error: error.message }; - } - } - - async getTicketDetails( - feedbackId: string, - ticketUrl: string, - projectId: string, - ): Promise<{ status: string; assignee: string; avatarUrls: any }> { - const baseUrl = await this.discoveryApi.getBaseUrl('feedback'); - const ticketId = ticketUrl.split('/').at(-1); - const resp = await this.fetchApi.fetch( - `${baseUrl}/${feedbackId}/ticket?ticketId=${ticketId}&projectId=${projectId}`, - { - method: 'GET', - }, - ); - const data = (await resp.json()).data; - return { - status: data.status, - assignee: data.assignee, - avatarUrls: data.avatarUrls, - }; - } -} diff --git a/plugins/feedback/src/components/CreateFeedbackModal/CreateFeedbackModal.test.tsx b/plugins/feedback/src/components/CreateFeedbackModal/CreateFeedbackModal.test.tsx deleted file mode 100644 index a271049b75..0000000000 --- a/plugins/feedback/src/components/CreateFeedbackModal/CreateFeedbackModal.test.tsx +++ /dev/null @@ -1,145 +0,0 @@ -import React from 'react'; - -import { renderInTestApp, TestApiProvider } from '@backstage/test-utils'; - -import { fireEvent } from '@testing-library/react'; - -import { FeedbackAPI, feedbackApiRef } from '../../api'; -import { mockEntity } from '../../mocks'; -import { CreateFeedbackModal } from './CreateFeedbackModal'; - -describe('Create Feedback Modal', () => { - const feedbackApi: Partial = { - createFeedback: jest.fn(), - }; - - const PROJECT_ID = 'component:default/example-website'; - const USER_ID = 'user:default/guest'; - - const handleModalClose = jest.fn().mockReturnValue(true); - - const render = async () => - await renderInTestApp( - - - , - ); - - it('should render', async () => { - const rendered = await render(); - expect(rendered).toBeDefined(); - }); - - it('should render the modal title', async () => { - const rendered = await render(); - expect( - rendered.getByText(`Feedback for ${PROJECT_ID.split('/').pop()}`), - ).toBeInTheDocument(); - }); - - test('BUG should be selected', async () => { - const rendered = await render(); - const tags = rendered.getAllByRole('radio') as any; - expect(tags[0].checked).toBeTruthy(); - expect(tags[1].checked).not.toBeTruthy(); - }); - - it('should render all tags for bug', async () => { - const rendered = await render(); - expect( - rendered.getByRole('heading', { - name: 'Select Bug: Slow Loading Not Responsive Navigation UI Issues Other', - }), - ).toBeInTheDocument(); - expect( - rendered.getByRole('button', { name: 'Slow Loading' }), - ).toBeInTheDocument(); - expect( - rendered.getByRole('button', { name: 'Not Responsive' }), - ).toBeInTheDocument(); - expect( - rendered.getByRole('button', { name: 'Navigation' }), - ).toBeInTheDocument(); - expect( - rendered.getByRole('button', { name: 'UI Issues' }), - ).toBeInTheDocument(); - expect(rendered.getByRole('button', { name: 'Other' })).toBeInTheDocument(); - }); - - it('should have correct labels', async () => { - const rendered = await render(); - - expect( - rendered.getByRole('textbox', { name: 'Summary' }), - ).toBeInTheDocument(); - - expect( - rendered.getByRole('textbox', { name: 'Description' }), - ).toBeInTheDocument(); - }); - - it('should render submit buttons', async () => { - const rendered = await render(); - expect( - rendered.getByRole('button', { name: 'Cancel' }), - ).toBeInTheDocument(); - expect( - rendered.getByRole('button', { name: 'Report Bug' }), - ).toBeInTheDocument(); - }); - - // Select type to feedback - it('should select type to feedback', async () => { - const rendered = await render(); - fireEvent.click(rendered.getByRole('radio', { name: 'Feedback' })); - - expect( - rendered.getByRole('button', { name: 'Cancel' }), - ).toBeInTheDocument(); - }); - - it('should render the modal title for feedback', async () => { - const rendered = await render(); - fireEvent.click(rendered.getByRole('radio', { name: 'Feedback' })); - - expect( - rendered.getByText(`Feedback for ${PROJECT_ID.split('/').pop()}`), - ).toBeInTheDocument(); - }); - - it('should render all tags for feedback', async () => { - const rendered = await render(); - fireEvent.click(rendered.getByRole('radio', { name: 'Feedback' })); - - expect( - rendered.getByRole('heading', { - name: 'Select Feedback: Excellent Good Needs Improvement Other', - }), - ).toBeInTheDocument(); - expect( - rendered.getByRole('button', { name: 'Excellent' }), - ).toBeInTheDocument(); - expect(rendered.getByRole('button', { name: 'Good' })).toBeInTheDocument(); - expect( - rendered.getByRole('button', { name: 'Needs Improvement' }), - ).toBeInTheDocument(); - expect(rendered.getByRole('button', { name: 'Other' })).toBeInTheDocument(); - }); - - it('should render submit buttons for feedback', async () => { - const rendered = await render(); - fireEvent.click(rendered.getByRole('radio', { name: 'Feedback' })); - - expect( - rendered.getByRole('button', { name: 'Cancel' }), - ).toBeInTheDocument(); - expect( - rendered.getByRole('button', { name: 'Send Feedback' }), - ).toBeInTheDocument(); - }); -}); diff --git a/plugins/feedback/src/components/CreateFeedbackModal/CreateFeedbackModal.tsx b/plugins/feedback/src/components/CreateFeedbackModal/CreateFeedbackModal.tsx deleted file mode 100644 index eeeaefe5dd..0000000000 --- a/plugins/feedback/src/components/CreateFeedbackModal/CreateFeedbackModal.tsx +++ /dev/null @@ -1,335 +0,0 @@ -import React, { useState } from 'react'; - -import { configApiRef, useAnalytics, useApi } from '@backstage/core-plugin-api'; - -import BugReportOutlined from '@mui/icons-material/BugReportOutlined'; -import BugReportTwoToneIcon from '@mui/icons-material/BugReportTwoTone'; -import CloseRounded from '@mui/icons-material/CloseRounded'; -import SmsOutlined from '@mui/icons-material/SmsOutlined'; -import SmsTwoTone from '@mui/icons-material/SmsTwoTone'; -import Alert from '@mui/material/Alert'; -import Button from '@mui/material/Button'; -import Chip from '@mui/material/Chip'; -import DialogActions from '@mui/material/DialogActions'; -import DialogContent from '@mui/material/DialogContent'; -import DialogTitle from '@mui/material/DialogTitle'; -import FormControlLabel from '@mui/material/FormControlLabel'; -import Grid from '@mui/material/Grid'; -import IconButton from '@mui/material/IconButton'; -import Paper from '@mui/material/Paper'; -import Radio from '@mui/material/Radio'; -import RadioGroup from '@mui/material/RadioGroup'; -import { styled, Theme } from '@mui/material/styles'; -import TextField from '@mui/material/TextField'; -import Typography from '@mui/material/Typography'; - -import { feedbackApiRef } from '../../api'; -import { FeedbackCategory } from '../../models/feedback.model'; - -const PREFIX = 'CreateFeedbackModal'; - -const classes = { - root: `${PREFIX}-root`, - actions: `${PREFIX}-actions`, - container: `${PREFIX}-container`, - dialogTitle: `${PREFIX}-dialogTitle`, - closeButton: `${PREFIX}-closeButton`, - radioGroup: `${PREFIX}-radioGroup`, -}; - -const StyledPaper = styled(Paper)(({ theme }: { theme: Theme }) => ({ - [`& .${classes.root}`]: { - '& > * > *': { - margin: theme.spacing(1), - width: '100%', - }, - padding: '0.5rem', - }, - - [`& .${classes.actions}`]: { - '& > *': { - margin: theme.spacing(1), - }, - paddingRight: '1rem', - }, - - [`& .${classes.container}`]: { - padding: '1rem', - }, - - [`& .${classes.dialogTitle}`]: {}, - - [`& .${classes.closeButton}`]: { - position: 'absolute', - right: theme.spacing(1), - top: theme.spacing(1), - color: theme.palette.grey[500], - }, - - [`& .${classes.radioGroup}`]: { - gap: theme.spacing(3), - }, -})); - -const issueTags = [ - 'Slow Loading', - 'Not Responsive', - 'Navigation', - 'UI Issues', - 'Other', -]; -const feedbackTags = ['Excellent', 'Good', 'Needs Improvement', 'Other']; - -export const CreateFeedbackModal = (props: { - projectEntity: string; - userEntity: string; - serverType: string; - handleModalCloseFn: (respObj?: any) => void; -}) => { - const api = useApi(feedbackApiRef); - const analytics = useAnalytics(); - const [feedbackType, setFeedbackType] = useState('BUG'); - const [submitClicked, setSubmitClicked] = useState(false); - const [selectedTag, setSelectedTag] = useState(issueTags[0]); - const app = useApi(configApiRef); - const summaryLimit = app.getOptionalNumber('feedback.summaryLimit') ?? 240; - - const [summary, setSummary] = useState({ - value: '', - error: false, - errorMessage: 'Enter some summary', - }); - const [description, setDescription] = useState({ - value: '', - error: false, - errorMessage: 'Enter some description', - }); - - const projectEntity = props.projectEntity; - const userEntity = props.userEntity; - - function handleCategoryClick(event: any) { - setFeedbackType(event.target.value); - setSelectedTag( - event.target.value === 'FEEDBACK' ? feedbackTags[0] : issueTags[0], - ); - } - - function handleChipSlection(tag: string) { - if (tag === selectedTag) { - return; - } - setSelectedTag(tag); - } - - async function handleSubmitClick() { - setSubmitClicked(true); - const resp = await api.createFeedback({ - summary: summary.value, - description: description.value, - projectId: projectEntity, - url: window.location.href, - userAgent: navigator.userAgent, - createdBy: userEntity, - feedbackType: - feedbackType === 'BUG' - ? FeedbackCategory.BUG - : FeedbackCategory.FEEDBACK, - tag: selectedTag, - }); - props.handleModalCloseFn(resp); - analytics.captureEvent('click', `submit - ${summary.value}`); - } - - function handleInputChange( - event: React.FocusEvent, - ) { - if (event.target.id === 'summary') { - const _summary = event.target.value; - if (_summary.trim().length === 0) { - return setSummary({ - ...summary, - value: '', - errorMessage: 'Provide summary', - error: true, - }); - } else if (_summary.length > summaryLimit) { - return setSummary({ - ...summary, - value: _summary, - error: true, - errorMessage: `Summary should be less than ${summaryLimit} characters.`, - }); - } - return setSummary({ ...summary, value: _summary, error: false }); - } - if (event.target.id === 'description') { - return setDescription({ - ...description, - value: event.target.value, - error: false, - }); - } - return 0; - } - - function handleValidation( - event: React.FocusEvent, - ) { - if (event.target.id === 'summary') { - if (event.target.value.length === 0) { - return setSummary({ ...summary, error: true }); - } - return setSummary({ - ...summary, - value: event.target.value.trim(), - error: event.target.value.trim().length > summaryLimit, - }); - } - if (event.target.id === 'description' && event.target.value.length > 0) { - setDescription({ ...description, value: description.value.trim() }); - } - return 0; - } - - return ( - - - {`Feedback for ${projectEntity.split('/').pop()}`} - {props.handleModalCloseFn ? ( - - - - ) : null} - - - - {props.serverType.toLowerCase() !== 'mail' && - !selectedTag.match(/(Excellent|Good)/g) ? ( - - - Note: By submitting  - {feedbackType === 'FEEDBACK' ? 'feedback' : 'bug'} with this - tag, it will create an issue in {props.serverType.toLowerCase()} - - - ) : null} - - Select type - - } - checkedIcon={} - color="error" - /> - } - /> - } - checkedIcon={} - color="primary" - /> - } - /> - - - - - Select {feedbackType === 'FEEDBACK' ? 'Feedback' : 'Bug'} - :  - {feedbackType === 'BUG' - ? issueTags.map(issueTitle => ( - handleChipSlection(issueTitle)} - label={issueTitle} - /> - )) - : feedbackTags.map(feedbackTitle => ( - handleChipSlection(feedbackTitle)} - label={feedbackTitle} - /> - ))} - - - - - - - - - - - - - - - - - ); -}; diff --git a/plugins/feedback/src/components/CreateFeedbackModal/index.ts b/plugins/feedback/src/components/CreateFeedbackModal/index.ts deleted file mode 100644 index a5aab37ca2..0000000000 --- a/plugins/feedback/src/components/CreateFeedbackModal/index.ts +++ /dev/null @@ -1 +0,0 @@ -export { CreateFeedbackModal } from './CreateFeedbackModal'; diff --git a/plugins/feedback/src/components/EntityFeedbackPage/CustomEmptyState/CustomEmptyState.tsx b/plugins/feedback/src/components/EntityFeedbackPage/CustomEmptyState/CustomEmptyState.tsx deleted file mode 100644 index 26a122e5bd..0000000000 --- a/plugins/feedback/src/components/EntityFeedbackPage/CustomEmptyState/CustomEmptyState.tsx +++ /dev/null @@ -1,175 +0,0 @@ -import React from 'react'; - -import { CodeSnippet, EmptyState } from '@backstage/core-components'; - -import ExpandMoreRounded from '@mui/icons-material/ExpandMoreRounded'; -import Accordion from '@mui/material/Accordion'; -import AccordionDetails from '@mui/material/AccordionDetails'; -import AccordionSummary from '@mui/material/AccordionSummary'; -import { styled, Theme } from '@mui/material/styles'; -import Typography from '@mui/material/Typography'; - -const PREFIX = 'CustomEmptyState'; - -const classes = { - code: `${PREFIX}-code`, - accordionGroup: `${PREFIX}-accordionGroup`, - heading: `${PREFIX}-heading`, - subHeading: `${PREFIX}-subHeading`, - embeddedVideo: `${PREFIX}-embeddedVideo`, -}; - -// TODO jss-to-styled codemod: The Fragment root was replaced by div. Change the tag if needed. -const Root = styled('div')(({ theme }: { theme: Theme }) => ({ - [`& .${classes.code}`]: { - width: '100%', - borderRadius: 6, - margin: theme.spacing(0, 0), - background: theme.palette.background.paper, - }, - - [`& .${classes.accordionGroup}`]: { - '& > *': { - marginTop: theme.spacing(2), - marginBottom: theme.spacing(1), - background: theme.palette.mode === 'dark' ? '#333' : '#eee', - }, - }, - - [`& .${classes.heading}`]: { - width: '50%', - fontSize: '1.2rem', - fontWeight: 600, - }, - - [`& .${classes.subHeading}`]: { - color: '#9e9e9e', - }, - - [`& .${classes.embeddedVideo}`]: { - top: '50%', - left: '50%', - zIndex: 2, - position: 'relative', - transform: 'translate(-50%, 15%)', - '& > iframe': { - [theme.breakpoints.up('sm')]: { - width: '100%', - height: '280px', - }, - [theme.breakpoints.up('xl')]: { - width: '768px', - height: '482px', - }, - - border: '0', - borderRadius: theme.spacing(1), - }, - }, -})); - -const EMAIL_YAML = `metadata: - annotations: - # Set to MAIL, if you want to recevie mail - # on every feedback. - feedback/type: 'MAIL' - - # Type in your mail here, it will be kept in cc, - # while sending mail on feedback generation. - feedback/email-to: 'example@example.com'`; -const JIRA_YAML = `metadata: - annotations: - # Set to JIRA to create ticket on - # creating feedbacks. - feedback/type: 'JIRA' - - # Enter your jira project key, - jira/project-key: '' - - # Enter the url of you jira server. - feedback/host: '' - - # (optional) Type in your mail here, - # it will be kept in cc, - # while sending mail on feedback generation. - feedback/email-to: 'example@example.com';`; - -export const CustomEmptyState = (props: { [key: string]: string }) => { - const [expanded, setExpanded] = React.useState('jira'); - - const handleChange = - (panel: string) => (event: React.ChangeEvent<{}>, isExpanded: boolean) => { - event.preventDefault(); - setExpanded(isExpanded ? panel : false); - }; - - return ( - - Some annotations out of {Object.keys(props).join(', ')}{' '} - are missing. You need to add proper annotations to your component if - you want to enable this tool. - - } - action={ - - - Add the annotation to your component YAML as shown in the - highlighted example below: - -
- - }> - For JIRA - - (An email will be sent if 'feedback/email-to' is set) - - - -
- -
-
-
- - }> - For E-Mail - - -
- -
-
-
-
-
- } - missing="field" - /> - ); -}; diff --git a/plugins/feedback/src/components/EntityFeedbackPage/CustomEmptyState/index.ts b/plugins/feedback/src/components/EntityFeedbackPage/CustomEmptyState/index.ts deleted file mode 100644 index 8c293855d3..0000000000 --- a/plugins/feedback/src/components/EntityFeedbackPage/CustomEmptyState/index.ts +++ /dev/null @@ -1 +0,0 @@ -export { CustomEmptyState } from './CustomEmptyState'; diff --git a/plugins/feedback/src/components/EntityFeedbackPage/EntityFeedbackPage.test.tsx b/plugins/feedback/src/components/EntityFeedbackPage/EntityFeedbackPage.test.tsx deleted file mode 100644 index ab8c05e61a..0000000000 --- a/plugins/feedback/src/components/EntityFeedbackPage/EntityFeedbackPage.test.tsx +++ /dev/null @@ -1,90 +0,0 @@ -import React from 'react'; - -import { - BackstageUserIdentity, - configApiRef, - IdentityApi, - identityApiRef, -} from '@backstage/core-plugin-api'; -import { - EntityProvider, - entityRouteRef, -} from '@backstage/plugin-catalog-react'; -import { - MockConfigApi, - renderInTestApp, - TestApiProvider, -} from '@backstage/test-utils'; - -import { FeedbackAPI, feedbackApiRef } from '../../api'; -import { mockEntity, mockFeedback } from '../../mocks'; -import { EntityFeedbackPage } from './EntityFeedbackPage'; - -describe('Entity Feedback Page', () => { - const feedbackApi: Partial = { - getAllFeedbacks: jest.fn().mockImplementation(() => { - return Promise.resolve({ - data: [mockFeedback], - count: 1, - currentPage: 1, - pageSize: 5, - }); - }), - }; - - const mockIdentityApi: Partial = { - getBackstageIdentity: jest - .fn() - .mockImplementation((): BackstageUserIdentity => { - return { - userEntityRef: 'user:default/guest', - type: 'user', - ownershipEntityRefs: [], - }; - }), - }; - - const mockConfigApi = new MockConfigApi({ - feedback: { integrations: { jira: [{ host: 'https://jira-server-url' }] } }, - }); - - const render = async () => - await renderInTestApp( - - - - - , - { - mountedRoutes: { - '/catalog/:namespace/:kind/:name/': entityRouteRef, - }, - }, - ); - - it('Should render', async () => { - const rendered = await render(); - expect(rendered).toBeDefined(); - }); - - it('Should have buttons', async () => { - const rendered = await render(); - expect( - rendered.getByRole('button', { - name: 'Give a feedback / Report a issue', - }), - ).toBeInTheDocument(); - expect( - rendered.getByRole('button', { name: 'Refresh' }), - ).toBeInTheDocument(); - expect( - rendered.getByRole('link', { name: 'Go to Jira Project' }), - ).toBeInTheDocument(); - }); -}); diff --git a/plugins/feedback/src/components/EntityFeedbackPage/EntityFeedbackPage.tsx b/plugins/feedback/src/components/EntityFeedbackPage/EntityFeedbackPage.tsx deleted file mode 100644 index cf8b404f04..0000000000 --- a/plugins/feedback/src/components/EntityFeedbackPage/EntityFeedbackPage.tsx +++ /dev/null @@ -1,182 +0,0 @@ -import React, { useEffect, useState } from 'react'; - -import { Progress } from '@backstage/core-components'; -import { - alertApiRef, - configApiRef, - identityApiRef, - useAnalytics, - useApi, -} from '@backstage/core-plugin-api'; -import { useEntity } from '@backstage/plugin-catalog-react'; - -import Add from '@mui/icons-material/Add'; -import ArrowForwardRounded from '@mui/icons-material/ArrowForwardRounded'; -import Sync from '@mui/icons-material/Sync'; -import Button from '@mui/material/Button'; -import ButtonGroup from '@mui/material/ButtonGroup'; -import CircularProgress from '@mui/material/CircularProgress'; -import Dialog from '@mui/material/Dialog'; -import Grid from '@mui/material/Grid'; -import { styled, Theme } from '@mui/material/styles'; -import Tooltip from '@mui/material/Tooltip'; -import Zoom from '@mui/material/Zoom'; - -import { CreateFeedbackModal } from '../CreateFeedbackModal/CreateFeedbackModal'; -import { FeedbackDetailsModal } from '../FeedbackDetailsModal'; -import { FeedbackTable } from '../FeedbackTable'; -import { CustomEmptyState } from './CustomEmptyState'; - -const PREFIX = 'EntityFeedbackPage'; - -const classes = { - buttonGroup: `${PREFIX}-buttonGroup`, -}; - -const StyledGrid = styled(Grid)(({ theme }: { theme: Theme }) => ({ - [`& .${classes.buttonGroup}`]: { - textAlign: 'center', - whiteSpace: 'nowrap', - marginTop: theme.spacing(1), - }, -})); - -export const EntityFeedbackPage = () => { - const config = useApi(configApiRef); - const alertApi = useApi(alertApiRef); - - const { entity } = useEntity(); - const user = useApi(identityApiRef); - const analytics = useAnalytics(); - - const [modalProps, setModalProps] = useState<{ - projectEntity: string; - userEntity: string; - serverType: string; - }>(); - - const [modalOpen, setModalOpen] = useState(false); - - const [reload, setReload] = useState(false); - useEffect(() => { - setReload(false); - }, [reload]); - - const projectEntity = - `${entity.kind}:${entity.metadata.namespace}/${entity.metadata.name}`.toLowerCase(); - - const pluginConfig = { - feedbackType: entity.metadata.annotations!['feedback/type'], - feedbackHost: - entity.metadata.annotations!['feedback/host'] ?? - config - .getConfigArray('feedback.integrations.jira')[0] - .getOptionalString('host'), - feedbackEmailTo: entity.metadata.annotations!['feedback/email-to'], - jiraProjectKey: entity.metadata.annotations!['jira/project-key'], - }; - - async function handleModalOpen() { - const userEntity = (await user.getBackstageIdentity()).userEntityRef; - analytics.captureEvent('click', 'open - create feedback modal'); - setModalProps({ - projectEntity: projectEntity, - userEntity: userEntity, - serverType: pluginConfig.feedbackType, - }); - - return setModalOpen(true); - } - - const handleModalClose = (respObj: { [key: string]: string } | false) => { - setModalOpen(false); - analytics.captureEvent('click', 'close - feedback modal'); - if (respObj) { - setReload(true); - if (respObj.error) { - alertApi.post({ - message: respObj.error, - severity: 'error', - display: 'transient', - }); - } else if (respObj.message) { - alertApi.post({ - message: respObj.message, - severity: 'success', - display: 'transient', - }); - } - } - }; - - const handleResyncClick = () => { - analytics.captureEvent('click', 'refresh'); - setReload(true); - }; - - return pluginConfig.feedbackType === undefined ? ( - - ) : ( - - - - - - - - {pluginConfig.feedbackType === 'JIRA' ? ( - - - - ) : null} - - - - - - handleModalClose(false)} - aria-labelledby="simple-modal-title" - aria-describedby="simple-modal-description" - fullWidth - maxWidth="md" - > - - - - {reload ? : } - - - ); -}; diff --git a/plugins/feedback/src/components/EntityFeedbackPage/index.tsx b/plugins/feedback/src/components/EntityFeedbackPage/index.tsx deleted file mode 100644 index 3bf6e315b0..0000000000 --- a/plugins/feedback/src/components/EntityFeedbackPage/index.tsx +++ /dev/null @@ -1 +0,0 @@ -export { EntityFeedbackPage } from './EntityFeedbackPage'; diff --git a/plugins/feedback/src/components/FeedbackDetailsModal/FeedbackDetailsModal.test.tsx b/plugins/feedback/src/components/FeedbackDetailsModal/FeedbackDetailsModal.test.tsx deleted file mode 100644 index 11511ac330..0000000000 --- a/plugins/feedback/src/components/FeedbackDetailsModal/FeedbackDetailsModal.test.tsx +++ /dev/null @@ -1,126 +0,0 @@ -import React from 'react'; - -import { - BackstageUserIdentity, - IdentityApi, - identityApiRef, -} from '@backstage/core-plugin-api'; -import { renderInTestApp, TestApiProvider } from '@backstage/test-utils'; - -import { FeedbackAPI, feedbackApiRef } from '../../api'; -import { mockFeedback, mockJiraDetails } from '../../mocks'; -import { rootRouteRef } from '../../routes'; -import { FeedbackDetailsModal } from './FeedbackDetailsModal'; - -jest.mock('@backstage/plugin-catalog-react', () => ({ - EntityRefLink: (props: { entityRef: string }) => ( - {props.entityRef} - ), -})); - -jest.mock('@backstage/core-components', () => ({ - useQueryParamState: () => [mockFeedback.feedbackId, jest.fn()], - Progress: () => <>, -})); - -describe('Feedback details modal', () => { - const mockFeedbackApi: Partial = { - getFeedbackById: jest.fn().mockImplementation(() => { - return Promise.resolve({ - data: mockFeedback, - message: 'Feedback fetched successfully', - }); - }), - getTicketDetails: jest.fn().mockImplementation(() => { - return Promise.resolve(mockJiraDetails.data); - }), - }; - - const mockIdentityApi: Partial = { - getBackstageIdentity: jest - .fn() - .mockImplementation((): BackstageUserIdentity => { - return { - userEntityRef: 'user:default/guest', - type: 'user', - ownershipEntityRefs: [], - }; - }), - }; - - const render = async () => - await renderInTestApp( - - - , - { - mountedRoutes: { - '/': rootRouteRef, - }, - }, - ); - - beforeEach(() => jest.clearAllMocks()); - - it('should render', async () => { - const rendered = await render(); - expect(mockFeedbackApi.getFeedbackById).toHaveBeenCalledTimes(1); - expect(mockFeedbackApi.getTicketDetails).toHaveBeenCalledTimes(1); - expect(rendered).toBeDefined(); - }); - - it('should have correct summary', async () => { - const rendered = await render(); - expect( - rendered.getByRole('heading', { name: mockFeedback.summary }), - ).toBeInTheDocument(); - }); - - it('should have correct description', async () => { - const rendered = await render(); - expect(rendered.getByText(mockFeedback.description)).toBeInTheDocument(); - }); - - it('should have correct user id', async () => { - const rendered = await render(); - expect(rendered.getByText(mockFeedback.createdBy)).toBeInTheDocument(); - }); - - it('should have correct project id', async () => { - const rendered = await render(); - expect(rendered.getByText(mockFeedback.projectId)).toBeInTheDocument(); - }); - - it('should have correct tag', async () => { - const rendered = await render(); - expect(rendered.getByText('Tag')).toBeInTheDocument(); - expect(rendered.getByText(mockFeedback.tag)).toBeInTheDocument(); - }); - - it('should have ticket url', async () => { - const rendered = await render(); - expect(rendered.getByText('Ticket Id')).toBeInTheDocument(); - expect( - rendered.getByText(mockFeedback.ticketUrl.split('/').pop()!), - ).toBeInTheDocument(); - }); - - it('should have correct status field for jira ticket', async () => { - const rendered = await render(); - expect(rendered.getByText('Status')).toBeInTheDocument(); - expect(rendered.getByText(mockJiraDetails.data.status)).toBeInTheDocument(); - }); - - it('should have assignee for jira ticket', async () => { - const rendered = await render(); - expect(rendered.getByText('Assignee')).toBeInTheDocument(); - expect( - rendered.getByText(mockJiraDetails.data.assignee), - ).toBeInTheDocument(); - }); -}); diff --git a/plugins/feedback/src/components/FeedbackDetailsModal/FeedbackDetailsModal.tsx b/plugins/feedback/src/components/FeedbackDetailsModal/FeedbackDetailsModal.tsx deleted file mode 100644 index fa0103f3fa..0000000000 --- a/plugins/feedback/src/components/FeedbackDetailsModal/FeedbackDetailsModal.tsx +++ /dev/null @@ -1,340 +0,0 @@ -import React, { useEffect, useState } from 'react'; - -import { parseEntityRef } from '@backstage/catalog-model'; -import { Progress, useQueryParamState } from '@backstage/core-components'; -import { alertApiRef, useApi } from '@backstage/core-plugin-api'; -import { EntityRefLink } from '@backstage/plugin-catalog-react'; - -import ArrowForwardRounded from '@mui/icons-material/ArrowForwardRounded'; -import BugReportOutlined from '@mui/icons-material/BugReportOutlined'; -import CloseRounded from '@mui/icons-material/CloseRounded'; -import ExpandLessRounded from '@mui/icons-material/ExpandLessRounded'; -import ExpandMoreRounded from '@mui/icons-material/ExpandMoreRounded'; -import SmsOutlined from '@mui/icons-material/SmsOutlined'; -import Avatar from '@mui/material/Avatar'; -import Button from '@mui/material/Button'; -import Chip from '@mui/material/Chip'; -import Dialog from '@mui/material/Dialog'; -import DialogActions from '@mui/material/DialogActions'; -import DialogContent from '@mui/material/DialogContent'; -import DialogTitle from '@mui/material/DialogTitle'; -import Grid from '@mui/material/Grid'; -import IconButton from '@mui/material/IconButton'; -import Link from '@mui/material/Link'; -import List from '@mui/material/List'; -import ListItem from '@mui/material/ListItem'; -import ListItemSecondaryAction from '@mui/material/ListItemSecondaryAction'; -import ListItemText from '@mui/material/ListItemText'; -import { styled, Theme } from '@mui/material/styles'; -import Tooltip from '@mui/material/Tooltip'; -import Typography from '@mui/material/Typography'; -import Zoom from '@mui/material/Zoom'; - -import { feedbackApiRef } from '../../api'; -import { FeedbackType } from '../../models/feedback.model'; - -const PREFIX = 'FeedbackDetailsModal'; - -const classes = { - closeButton: `${PREFIX}-closeButton`, - dialogAction: `${PREFIX}-dialogAction`, - dialogTitle: `${PREFIX}-dialogTitle`, - submittedBy: `${PREFIX}-submittedBy`, - readMoreLink: `${PREFIX}-readMoreLink`, -}; - -const StyledDialog = styled(Dialog)(({ theme }: { theme: Theme }) => ({ - [`& .${classes.dialogAction}`]: { - justifyContent: 'flex-start', - paddingLeft: theme.spacing(3), - paddingBottom: theme.spacing(2), - }, - - [`& .${classes.submittedBy}`]: { - color: '#9e9e9e', - fontWeight: 500, - }, - - [`& .${classes.readMoreLink}`]: { - display: 'flex', - alignItems: 'center', - cursor: 'pointer', - }, -})); - -const StyledDialogTitle = styled(DialogTitle)( - ({ theme }: { theme: Theme }) => ({ - display: 'flex', - paddingBottom: theme.spacing(0), - marginRight: theme.spacing(2), - '& > svg': { - marginTop: theme.spacing(0.5), - marginRight: theme.spacing(1), - }, - [`& .${classes.closeButton}`]: { - position: 'absolute', - right: theme.spacing(1), - top: theme.spacing(1), - color: theme.palette.grey[500], - }, - }), -); - -export const FeedbackDetailsModal = () => { - const api = useApi(feedbackApiRef); - const alertApi = useApi(alertApiRef); - const [queryState, setQueryState] = useQueryParamState( - 'id', - ); - const [modalData, setModalData] = useState(); - - const [ticketDetails, setTicketDetails] = useState<{ - status: string | null; - assignee: string | null; - avatarUrls: {} | null; - element: React.JSX.Element | null; - }>({ status: null, assignee: null, avatarUrls: null, element: null }); - - const [isLoading, setIsLoading] = useState(true); - const [expandDescription, setExpandDescription] = useState(false); - - useEffect(() => { - if (modalData?.ticketUrl) { - api - .getTicketDetails( - modalData.feedbackId, - modalData.ticketUrl, - modalData.projectId, - ) - .then(data => { - setTicketDetails({ - status: data.status, - assignee: data.assignee, - avatarUrls: data.avatarUrls, - element: ( - <> - - - - } /> - - - - - - - } - label={data.assignee ? data.assignee : 'Unassigned'} - /> - } - /> - - - - ), - }); - setIsLoading(false); - }); - } else { - setIsLoading(false); - } - if (!modalData && queryState) { - api.getFeedbackById(queryState).then(resp => { - if (resp?.error !== undefined) { - alertApi.post({ - message: resp.error, - display: 'transient', - severity: 'error', - }); - } else { - const respData: FeedbackType = resp?.data!; - setModalData(respData); - } - }); - } - }, [modalData, api, queryState, alertApi]); - - const handleClose = () => { - setModalData(undefined); - setTicketDetails({ - status: null, - assignee: null, - avatarUrls: null, - element: null, - }); - setIsLoading(true); - setExpandDescription(false); - setQueryState(undefined); - }; - - const getDescription = (str: string) => { - if (!expandDescription) { - if (str.length > 400) { - if (str.split(' ').length > 1) - return `${str.substring(0, str.lastIndexOf(' ', 400))}...`; - return `${str.slice(0, 400)}...`; - } - } - return str; - }; - - return ( - - {modalData ? ( - <> - - - {modalData.feedbackType === 'FEEDBACK' ? ( - - ) : ( - - )} - - {modalData.summary} - - - - - - - - - Submitted by  - - {parseEntityRef(modalData.createdBy).name} - {' '} - on {new Date(modalData.createdAt).toLocaleString()} - - - - - {modalData.description - ? getDescription(modalData.description) - : 'No description provided'} - - {modalData.description.length > 400 ? ( - setExpandDescription(!expandDescription)} - > - {!expandDescription ? ( - - ) : ( - - )} - {!expandDescription ? 'Read More' : 'Read Less'} - - ) : null} - - - - - - - - - - } - /> - - - - - - - } - /> - - - {modalData.ticketUrl ? ( - - - - - - - } - /> - - - ) : null} - {isLoading ? : ticketDetails.element} - - - - - {modalData.ticketUrl ? ( - - - - ) : null} - - ) : null} - - ); -}; diff --git a/plugins/feedback/src/components/FeedbackDetailsModal/index.ts b/plugins/feedback/src/components/FeedbackDetailsModal/index.ts deleted file mode 100644 index ac3a2e027a..0000000000 --- a/plugins/feedback/src/components/FeedbackDetailsModal/index.ts +++ /dev/null @@ -1 +0,0 @@ -export { FeedbackDetailsModal } from './FeedbackDetailsModal'; diff --git a/plugins/feedback/src/components/FeedbackTable/FeedbackTable.test.tsx b/plugins/feedback/src/components/FeedbackTable/FeedbackTable.test.tsx deleted file mode 100644 index b13fd79c11..0000000000 --- a/plugins/feedback/src/components/FeedbackTable/FeedbackTable.test.tsx +++ /dev/null @@ -1,101 +0,0 @@ -import React from 'react'; - -import { renderInTestApp, TestApiProvider } from '@backstage/test-utils'; - -import { waitFor } from '@testing-library/react'; - -import { FeedbackAPI, feedbackApiRef } from '../../api'; -import { mockFeedback } from '../../mocks'; -import { rootRouteRef } from '../../routes'; -import { FeedbackTable } from './FeedbackTable'; - -jest.mock('@backstage/plugin-catalog-react', () => ({ - EntityRefLink: (props: { entityRef: string }) => ( - {props.entityRef} - ), - EntityPeekAheadPopover: (props: { children?: React.ReactNode }) => ( - <>{props.children} - ), -})); - -describe('Feedback Table Component', () => { - const mockFeedbackApi: Partial = { - getAllFeedbacks: jest.fn().mockImplementation(() => { - return Promise.resolve({ - data: [mockFeedback], - count: 1, - currentPage: 1, - pageSize: 5, - }); - }), - }; - - const render = async () => - await renderInTestApp( - - - , - { - mountedRoutes: { - '/': rootRouteRef, - }, - }, - ); - - beforeEach(() => { - jest.clearAllMocks(); - }); - - it('should render', async () => { - const rendered = await render(); - await waitFor(() => { - expect(rendered).toBeDefined(); - expect(mockFeedbackApi.getAllFeedbacks).toHaveBeenCalledTimes(1); - }); - }); - - it('should render all columns in table table', async () => { - const rendered = await render(); - expect(rendered.getByText('Summary')).toBeInTheDocument(); - expect(rendered.getByText('Type')).toBeInTheDocument(); - expect(rendered.getByText('Project')).toBeInTheDocument(); - expect(rendered.getByText('Ticket')).toBeInTheDocument(); - expect(rendered.getByText('Tag')).toBeInTheDocument(); - }); - - it('should render data in table', async () => { - const rendered = await render(); - await waitFor(() => { - expect(rendered.getByText(mockFeedback.summary)).toBeInTheDocument(); - expect(rendered.getByText(mockFeedback.projectId)).toBeInTheDocument(); - expect( - rendered.getByText(mockFeedback.ticketUrl.split('/').pop()!), - ).toBeInTheDocument(); - expect(rendered.getByText(mockFeedback.tag)).toBeInTheDocument(); - }); - }); - - it('should have pagination buttons', async () => { - const rendered = await render(); - expect( - await waitFor( - () => rendered.getByRole('button', { name: 'First Page' }), - { timeout: 10000 }, - ), - ).toBeInTheDocument(); - - expect( - await waitFor(() => - rendered.getByRole('button', { name: 'Previous Page' }), - ), - ).toBeInTheDocument(); - - expect( - await waitFor(() => rendered.getByRole('button', { name: 'Next Page' })), - ).toBeInTheDocument(); - - expect( - await waitFor(() => rendered.getByRole('button', { name: 'Last Page' })), - ).toBeInTheDocument(); - }); -}); diff --git a/plugins/feedback/src/components/FeedbackTable/FeedbackTable.tsx b/plugins/feedback/src/components/FeedbackTable/FeedbackTable.tsx deleted file mode 100644 index 2ed54cf0b1..0000000000 --- a/plugins/feedback/src/components/FeedbackTable/FeedbackTable.tsx +++ /dev/null @@ -1,298 +0,0 @@ -import React, { useState } from 'react'; -import { useDebounce } from 'react-use'; - -import { parseEntityRef } from '@backstage/catalog-model'; -import { - SubvalueCell, - Table, - TableColumn, - useQueryParamState, -} from '@backstage/core-components'; -import { useAnalytics, useApi } from '@backstage/core-plugin-api'; -import { - EntityPeekAheadPopover, - EntityRefLink, -} from '@backstage/plugin-catalog-react'; - -import BugReportOutlined from '@mui/icons-material/BugReportOutlined'; -import Clear from '@mui/icons-material/Clear'; -import Search from '@mui/icons-material/Search'; -import TextsmsOutlined from '@mui/icons-material/TextsmsOutlined'; -import Box from '@mui/material/Box'; -import Chip from '@mui/material/Chip'; -import IconButton from '@mui/material/IconButton'; -import Link from '@mui/material/Link'; -import Paper from '@mui/material/Paper'; -import { styled, Theme } from '@mui/material/styles'; -import TableContainer from '@mui/material/TableContainer'; -import TextField from '@mui/material/TextField'; -import Tooltip from '@mui/material/Tooltip'; -import Typography from '@mui/material/Typography'; - -import { feedbackApiRef } from '../../api'; -import { FeedbackType } from '../../models/feedback.model'; - -const PREFIX = 'FeedbackTable'; - -const classes = { - textField: `${PREFIX}-textField`, -}; - -const StyledPaper = styled(Paper)(({ theme }: { theme: Theme }) => ({ - [`& .${classes.textField}`]: { - padding: 0, - margin: theme.spacing(2), - width: '70%', - [theme.breakpoints.up('lg')]: { - width: '30%', - }, - }, -})); - -export const FeedbackTable = (props: { projectId?: string }) => { - const projectId = props.projectId ? props.projectId : 'all'; - const api = useApi(feedbackApiRef); - const analytics = useAnalytics(); - const [feedbackData, setFeedbackData] = useState([]); - const [tableConfig, setTableConfig] = useState({ - totalFeedbacks: 100, - page: 1, - pageSize: 5, - }); - const [queryState, setQueryState] = useQueryParamState('id'); - const [loading, setLoading] = useState(true); - const [searchText, setSearchText] = useState(''); - - const columns: TableColumn[] = [ - { - width: '1%', - field: 'feedbackType', - title: 'Type', - render: (row: any) => { - const data: FeedbackType = row; - return data.feedbackType === 'BUG' ? ( - - ) : ( - - ); - }, - }, - { - field: 'summary', - title: 'Summary', - render: (row: any) => { - const data: FeedbackType = row; - const getSummary = () => { - if (data.summary.length > 100) { - if (data.summary.split(' ').length > 1) - return `${data.summary.substring( - 0, - data.summary.lastIndexOf(' ', 100), - )}...`; - return `${data.summary.slice(0, 100)}...`; - } - return data.summary; - }; - return ( - {getSummary()}} - subvalue={ -
e.stopPropagation()} - onKeyDown={e => e.stopPropagation()} - tabIndex={0} - role="tab" - > - - Submitted by  - - {parseEntityRef(data.createdBy).name} - - -
- } - /> - ); - }, - }, - { - field: 'projectId', - title: 'Project', - render: (row: any) => { - const data: FeedbackType = row; - return ( - - {parseEntityRef(data.projectId).name} - - ); - }, - align: 'center', - width: '40%', - }, - { - align: 'left', - field: 'ticketUrl', - title: 'Ticket', - disableClick: true, - width: '10%', - render: (row: any) => { - const data: FeedbackType = row; - return data.ticketUrl ? ( - - {data.ticketUrl.split('/').pop()} - - ) : ( - 'N/A' - ); - }, - }, - { - title: 'Tag', - customSort: (data1: any, data2: any) => { - const currentRow: FeedbackType = data1; - const nextRow: FeedbackType = data2; - return currentRow.tag - .toLowerCase() - .localeCompare(nextRow.tag.toLowerCase()); - }, - render: (row: any) => { - const data: FeedbackType = row; - return ( - - ); - }, - }, - ]; - - useDebounce( - () => { - if (searchText.length > 0) analytics.captureEvent('search', searchText); - api - .getAllFeedbacks(1, tableConfig.pageSize, projectId, searchText) - .then(data => { - setFeedbackData(data.data); - setTableConfig({ - totalFeedbacks: data.count, - page: data.currentPage, - pageSize: data.pageSize, - }); - setLoading(false); - }) - .finally(() => { - setLoading(false); - }); - }, - 400, - [projectId, api, tableConfig.pageSize, searchText], - ); - - async function handlePageChange(newPage: number, pageSize: number) { - analytics.captureEvent( - 'paginate', - `page: ${newPage + 1}, size: ${pageSize}`, - ); - if (newPage > tableConfig.page) { - setTableConfig({ - totalFeedbacks: tableConfig.totalFeedbacks, - pageSize: pageSize, - page: newPage - 1, - }); - } - setTableConfig({ - totalFeedbacks: tableConfig.totalFeedbacks, - pageSize: pageSize, - page: newPage + 1, - }); - const newData = await api.getAllFeedbacks( - newPage + 1, - pageSize, - projectId, - searchText, - ); - return setFeedbackData(newData.data); - } - - async function handleRowsPerPageChange(pageSize: number) { - setTableConfig({ - ...tableConfig, - pageSize: pageSize, - }); - const newData = await api.getAllFeedbacks( - tableConfig.page, - pageSize, - projectId, - searchText, - ); - return setFeedbackData(newData.data); - } - - function handleRowClick( - event?: React.MouseEvent | undefined, - rowData?: any, - ) { - event?.preventDefault(); - const data: FeedbackType = rowData; - if (!queryState) setQueryState(data.feedbackId); - } - - function handleSearch( - event: React.ChangeEvent, - ) { - const _searchText = event.target.value; - if (_searchText.trim().length !== 0) return setSearchText(_searchText); - return setSearchText(''); - } - - return ( - - - - - ), - endAdornment: ( - - setSearchText('')} size="medium"> - - - - ), - }} - /> - - 0, - pageSizeOptions: [5, 10, 25], - pageSize: tableConfig.pageSize, - paginationPosition: 'bottom', - padding: 'dense', - toolbar: false, - search: false, - sorting: false, - emptyRowsWhenPaging: false, - }} - isLoading={loading} - onRowClick={handleRowClick} - onPageChange={handlePageChange} - onRowsPerPageChange={handleRowsPerPageChange} - data={feedbackData} - columns={columns} - totalCount={tableConfig.totalFeedbacks} - page={tableConfig.page - 1} - /> - - - ); -}; diff --git a/plugins/feedback/src/components/FeedbackTable/index.tsx b/plugins/feedback/src/components/FeedbackTable/index.tsx deleted file mode 100644 index 09eaeab295..0000000000 --- a/plugins/feedback/src/components/FeedbackTable/index.tsx +++ /dev/null @@ -1 +0,0 @@ -export { FeedbackTable } from './FeedbackTable'; diff --git a/plugins/feedback/src/components/GlobalFeedbackPage/GlobalFeedbackPage.tsx b/plugins/feedback/src/components/GlobalFeedbackPage/GlobalFeedbackPage.tsx deleted file mode 100644 index dbf0bce3f7..0000000000 --- a/plugins/feedback/src/components/GlobalFeedbackPage/GlobalFeedbackPage.tsx +++ /dev/null @@ -1,27 +0,0 @@ -import React from 'react'; - -import { Content, Header, Page } from '@backstage/core-components'; -import { configApiRef, useApi } from '@backstage/core-plugin-api'; - -import Grid from '@mui/material/Grid'; - -import { FeedbackDetailsModal } from '../FeedbackDetailsModal'; -import { FeedbackTable } from '../FeedbackTable'; - -export const GlobalFeedbackPage = (props: { themeId?: string }) => { - const app = useApi(configApiRef); - const appTitle = app.getString('app.title'); - return ( - -
- - - - - - - - - - ); -}; diff --git a/plugins/feedback/src/components/GlobalFeedbackPage/index.ts b/plugins/feedback/src/components/GlobalFeedbackPage/index.ts deleted file mode 100644 index 6cb37a91e9..0000000000 --- a/plugins/feedback/src/components/GlobalFeedbackPage/index.ts +++ /dev/null @@ -1 +0,0 @@ -export { GlobalFeedbackPage } from './GlobalFeedbackPage'; diff --git a/plugins/feedback/src/components/OpcFeedbackComponent/OpcFeedbackComponent.tsx b/plugins/feedback/src/components/OpcFeedbackComponent/OpcFeedbackComponent.tsx deleted file mode 100644 index 43c0f0de36..0000000000 --- a/plugins/feedback/src/components/OpcFeedbackComponent/OpcFeedbackComponent.tsx +++ /dev/null @@ -1,92 +0,0 @@ -import React, { useEffect } from 'react'; - -import '@one-platform/opc-feedback'; - -import { - alertApiRef, - configApiRef, - identityApiRef, - useAnalytics, - useApi, - useRouteRef, -} from '@backstage/core-plugin-api'; - -import { feedbackApiRef } from '../../api'; -import { FeedbackCategory } from '../../models/feedback.model'; -import { rootRouteRef, viewDocsRouteRef } from '../../routes'; - -export const OpcFeedbackComponent = () => { - const appConfig = useApi(configApiRef); - const feedbackApi = useApi(feedbackApiRef); - const identityApi = useApi(identityApiRef); - const alertApi = useApi(alertApiRef); - const analytics = useAnalytics(); - - const footer = JSON.stringify({ - name: appConfig.getString('app.title'), - url: appConfig.getString('app.baseUrl'), - }); - const projectId = appConfig.getString('feedback.baseEntityRef'); - const summaryLimit = - appConfig.getOptionalNumber('feedback.summaryLimit') ?? 240; - const docsSpa = useRouteRef(viewDocsRouteRef); - const feedbackSpa = useRouteRef(rootRouteRef); - - useEffect(() => { - const onSubmit = async (event: any) => { - if (event.detail.data.summary.trim().length < 1) { - alertApi.post({ - message: 'Summary cannot be empty', - severity: 'error', - display: 'transient', - }); - throw Error('Summary cannot be empty'); - } - analytics.captureEvent('click', `submit - ${event.detail.data.summary}`); - const userEntity = (await identityApi.getBackstageIdentity()) - .userEntityRef; - const resp = await feedbackApi.createFeedback({ - summary: event.detail.data.summary, - description: '', - projectId: projectId, - url: window.location.href, - userAgent: navigator.userAgent, - createdBy: userEntity, - tag: - event.detail.data.category === 'BUG' - ? event.detail.data.error - : event.detail.data.experience, - feedbackType: - event.detail.data.category === 'BUG' - ? FeedbackCategory.BUG - : FeedbackCategory.FEEDBACK, - }); - if (resp.error) { - alertApi.post({ - message: resp.error, - severity: 'error', - display: 'transient', - }); - throw new Error(resp.error); - } else { - alertApi.post({ - message: resp.message as string, - severity: 'success', - display: 'transient', - }); - } - }; - const elem: any = document.querySelector('opc-feedback'); - elem.onSubmit = onSubmit; - }, [feedbackApi, projectId, identityApi, analytics, alertApi]); - - return ( - - ); -}; diff --git a/plugins/feedback/src/components/OpcFeedbackComponent/declaration.d.ts b/plugins/feedback/src/components/OpcFeedbackComponent/declaration.d.ts deleted file mode 100644 index 0f7d91f282..0000000000 --- a/plugins/feedback/src/components/OpcFeedbackComponent/declaration.d.ts +++ /dev/null @@ -1,12 +0,0 @@ -declare module '@one-platform/opc-feedback'; -declare namespace JSX { - interface IntrinsicElements { - 'opc-feedback': { - spa: string; - docs: string; - summaryLimit: number; - theme: string; - app: string; - }; - } -} diff --git a/plugins/feedback/src/components/OpcFeedbackComponent/index.ts b/plugins/feedback/src/components/OpcFeedbackComponent/index.ts deleted file mode 100644 index 7a553d5d9c..0000000000 --- a/plugins/feedback/src/components/OpcFeedbackComponent/index.ts +++ /dev/null @@ -1 +0,0 @@ -export { OpcFeedbackComponent } from './OpcFeedbackComponent'; diff --git a/plugins/feedback/src/index.ts b/plugins/feedback/src/index.ts deleted file mode 100644 index 86525d58d8..0000000000 --- a/plugins/feedback/src/index.ts +++ /dev/null @@ -1,7 +0,0 @@ -export { default as FeedbackIcon } from '@mui/icons-material/TextsmsOutlined'; -export { - feedbackPlugin, - GlobalFeedbackPage, - EntityFeedbackPage, - OpcFeedbackComponent, -} from './plugin'; diff --git a/plugins/feedback/src/mocks/entity.ts b/plugins/feedback/src/mocks/entity.ts deleted file mode 100644 index 9c70802e86..0000000000 --- a/plugins/feedback/src/mocks/entity.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { Entity } from '@backstage/catalog-model'; - -export const mockEntity: Entity = { - apiVersion: 'backstage.io/v1alpha1', - kind: 'Component', - metadata: { - name: 'example-website-for-feedback-plugin', - title: 'Example App', - namespace: 'default', - annotations: { - 'feedback/type': 'JIRA', - 'feedback/host': 'https://jira-host-url', - 'feedback/email-to': 'example@email.com', - 'jira/project-key': 'XYZ', - }, - spec: { - owner: 'guest', - type: 'service', - lifecycle: 'production', - }, - }, -}; diff --git a/plugins/feedback/src/mocks/feedback.ts b/plugins/feedback/src/mocks/feedback.ts deleted file mode 100644 index d626840c62..0000000000 --- a/plugins/feedback/src/mocks/feedback.ts +++ /dev/null @@ -1,16 +0,0 @@ -export const mockFeedback = { - feedbackId: 'bubuPsc93VRYAwByZe8ZQ9', - summary: 'Test Issue', - description: 'This is mock description', - tag: 'UI Issues', - projectId: 'component:default/example-website-for-feedback-plugin', - ticketUrl: 'https://demo-ticket-url/ticket-id', - feedbackType: 'BUG', - createdBy: 'user:default/guest', - createdAt: '2023-11-21T05:41:56.100Z', - updatedBy: 'user:default/guest', - updatedAt: '2023-11-21T05:41:56.100Z', - url: 'http://localhost:3000/catalog/default/component/example-website-for-feedback-plugin/feedback', - userAgent: - 'Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/119.0', -}; diff --git a/plugins/feedback/src/mocks/index.ts b/plugins/feedback/src/mocks/index.ts deleted file mode 100644 index 8844a279ec..0000000000 --- a/plugins/feedback/src/mocks/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -export * from './entity'; -export * from './feedback'; -export * from './jiraDetails'; diff --git a/plugins/feedback/src/mocks/jiraDetails.ts b/plugins/feedback/src/mocks/jiraDetails.ts deleted file mode 100644 index cc2e7c9a3d..0000000000 --- a/plugins/feedback/src/mocks/jiraDetails.ts +++ /dev/null @@ -1,17 +0,0 @@ -export const mockJiraDetails = { - data: { - status: 'Code Review', - assignee: 'John Doe', - avatarUrls: { - '48x48': - 'https://www.gravatar.com/avatar/d18762da9985fd2c38032dbe4568472f?d=mm&s=48', - '24x24': - 'https://www.gravatar.com/avatar/d18762da9985fd2c38032dbe4568472f?d=mm&s=24', - '16x16': - 'https://www.gravatar.com/avatar/d18762da9985fd2c38032dbe4568472f?d=mm&s=16', - '32x32': - 'https://www.gravatar.com/avatar/d18762da9985fd2c38032dbe4568472f?d=mm&s=32', - }, - }, - message: 'fetched successfully', -}; diff --git a/plugins/feedback/src/models/feedback.model.ts b/plugins/feedback/src/models/feedback.model.ts deleted file mode 100644 index b652fcb287..0000000000 --- a/plugins/feedback/src/models/feedback.model.ts +++ /dev/null @@ -1,20 +0,0 @@ -export enum FeedbackCategory { - BUG = 'BUG', - FEEDBACK = 'FEEDBACK', -} - -export type FeedbackType = { - feedbackId: string; - summary: string; - projectId: string; - description: string; - url: string; - userAgent: string; - tag: string; - ticketUrl: string; - feedbackType: FeedbackCategory; - createdAt: string; - createdBy: string; - updatedAt: string; - updatedBy: string; -}; diff --git a/plugins/feedback/src/plugin.test.ts b/plugins/feedback/src/plugin.test.ts deleted file mode 100644 index 31ca4c6c8e..0000000000 --- a/plugins/feedback/src/plugin.test.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { feedbackPlugin } from './plugin'; - -describe('feedback', () => { - it('should export plugin', () => { - expect(feedbackPlugin).toBeDefined(); - }); -}); diff --git a/plugins/feedback/src/plugin.ts b/plugins/feedback/src/plugin.ts deleted file mode 100644 index ca6fa5ef58..0000000000 --- a/plugins/feedback/src/plugin.ts +++ /dev/null @@ -1,73 +0,0 @@ -import { - configApiRef, - createApiFactory, - createComponentExtension, - createPlugin, - createRoutableExtension, - discoveryApiRef, - fetchApiRef, - identityApiRef, -} from '@backstage/core-plugin-api'; - -import { FeedbackAPI, feedbackApiRef } from './api'; -import { entityRootRouteRef, rootRouteRef, viewDocsRouteRef } from './routes'; - -export const feedbackPlugin = createPlugin({ - id: 'feedback', - routes: { - root: rootRouteRef, - entityRoot: entityRootRouteRef, - }, - externalRoutes: { - viewDocs: viewDocsRouteRef, - }, - apis: [ - createApiFactory({ - api: feedbackApiRef, - deps: { - discoveryApi: discoveryApiRef, - configApi: configApiRef, - identityApi: identityApiRef, - fetchApi: fetchApiRef, - }, - factory: ({ discoveryApi, configApi, identityApi, fetchApi }) => { - return new FeedbackAPI({ - discoveryApi, - configApi, - identityApi, - fetchApi, - }); - }, - }), - ], -}); - -export const GlobalFeedbackPage = feedbackPlugin.provide( - createRoutableExtension({ - name: 'GlobalFeedbackPage', - component: () => - import('./components/GlobalFeedbackPage').then(m => m.GlobalFeedbackPage), - mountPoint: rootRouteRef, - }), -); - -export const EntityFeedbackPage = feedbackPlugin.provide( - createRoutableExtension({ - name: 'EntityFeedbackPage', - component: () => - import('./components/EntityFeedbackPage').then(m => m.EntityFeedbackPage), - mountPoint: entityRootRouteRef, - }), -); - -export const OpcFeedbackComponent = feedbackPlugin.provide( - createComponentExtension({ - name: 'OpcFeedbackComponent', - component: { - lazy: () => - import('./components/OpcFeedbackComponent').then( - m => m.OpcFeedbackComponent, - ), - }, - }), -); diff --git a/plugins/feedback/src/routes.ts b/plugins/feedback/src/routes.ts deleted file mode 100644 index 652251f3a6..0000000000 --- a/plugins/feedback/src/routes.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { - createExternalRouteRef, - createRouteRef, -} from '@backstage/core-plugin-api'; - -export const rootRouteRef = createRouteRef({ - id: 'feedback:global-page', -}); - -export const viewDocsRouteRef = createExternalRouteRef({ - id: 'view-docs', -}); - -export const entityRootRouteRef = createRouteRef({ - id: 'feedback:entity-page', - params: ['namespace', 'kind', 'name'], -}); diff --git a/plugins/feedback/src/setupTests.ts b/plugins/feedback/src/setupTests.ts deleted file mode 100644 index 7b0828bfa8..0000000000 --- a/plugins/feedback/src/setupTests.ts +++ /dev/null @@ -1 +0,0 @@ -import '@testing-library/jest-dom'; diff --git a/plugins/feedback/tsconfig.json b/plugins/feedback/tsconfig.json deleted file mode 100644 index 3e73092409..0000000000 --- a/plugins/feedback/tsconfig.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "extends": "@backstage/cli/config/tsconfig.json", - "include": ["src", "dev"], - "exclude": ["node_modules"], - "compilerOptions": { - "outDir": "../../dist-types/plugins/feedback", - "rootDir": "." - } -} diff --git a/plugins/feedback/turbo.json b/plugins/feedback/turbo.json deleted file mode 100644 index 604151ad4c..0000000000 --- a/plugins/feedback/turbo.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "extends": ["//"], - "pipeline": { - "tsc": { - "outputs": ["../../dist-types/plugins/feedback/**"], - "dependsOn": ["^tsc"] - } - } -} diff --git a/yarn.lock b/yarn.lock index bdd5c9af07..b0c6f6d7e9 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2228,7 +2228,7 @@ core-js-pure "^3.30.2" regenerator-runtime "^0.14.0" -"@babel/runtime@^7.0.0", "@babel/runtime@^7.1.2", "@babel/runtime@^7.10.1", "@babel/runtime@^7.10.2", "@babel/runtime@^7.12.5", "@babel/runtime@^7.13.10", "@babel/runtime@^7.15.4", "@babel/runtime@^7.17.8", "@babel/runtime@^7.18.3", "@babel/runtime@^7.18.6", "@babel/runtime@^7.2.0", "@babel/runtime@^7.20.13", "@babel/runtime@^7.20.6", "@babel/runtime@^7.21.0", "@babel/runtime@^7.23.2", "@babel/runtime@^7.23.9", "@babel/runtime@^7.3.1", "@babel/runtime@^7.4.4", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.0", "@babel/runtime@^7.7.2", "@babel/runtime@^7.7.6", "@babel/runtime@^7.8.3", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2": +"@babel/runtime@^7.0.0", "@babel/runtime@^7.1.2", "@babel/runtime@^7.10.1", "@babel/runtime@^7.12.5", "@babel/runtime@^7.13.10", "@babel/runtime@^7.15.4", "@babel/runtime@^7.17.8", "@babel/runtime@^7.18.3", "@babel/runtime@^7.18.6", "@babel/runtime@^7.2.0", "@babel/runtime@^7.20.13", "@babel/runtime@^7.20.6", "@babel/runtime@^7.21.0", "@babel/runtime@^7.23.2", "@babel/runtime@^7.23.9", "@babel/runtime@^7.3.1", "@babel/runtime@^7.4.4", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.0", "@babel/runtime@^7.7.2", "@babel/runtime@^7.7.6", "@babel/runtime@^7.8.3", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2": version "7.24.4" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.24.4.tgz#de795accd698007a66ba44add6cc86542aff1edd" integrity sha512-dkxf7+hn8mFBwKjs9bvBlArzLVxVbS8usaPUDd5p2a9JCL9tB8OaOVN1isD4+Xyk4ns89/xeOmbQvgdK7IIVdA== @@ -8046,18 +8046,6 @@ dependencies: "@lezer/common" "^1.0.0" -"@lit-labs/ssr-dom-shim@^1.0.0", "@lit-labs/ssr-dom-shim@^1.1.0": - version "1.2.0" - resolved "https://registry.yarnpkg.com/@lit-labs/ssr-dom-shim/-/ssr-dom-shim-1.2.0.tgz#353ce4a76c83fadec272ea5674ede767650762fd" - integrity sha512-yWJKmpGE6lUURKAaIltoPIE/wrbY3TEkqQt+X0m+7fQNnAv0keydnYvbiJFP1PnMhizmIWRWOG5KLhYyc/xl+g== - -"@lit/reactive-element@^1.3.0", "@lit/reactive-element@^1.6.0": - version "1.6.3" - resolved "https://registry.yarnpkg.com/@lit/reactive-element/-/reactive-element-1.6.3.tgz#25b4eece2592132845d303e091bad9b04cdcfe03" - integrity sha512-QuTgnG52Poic7uM1AN5yJ09QMe0O28e10XzSvWDz02TJiiKee4stsiownEIadWm8nYzyDAyT+gKzUoZmiWQtsQ== - dependencies: - "@lit-labs/ssr-dom-shim" "^1.0.0" - "@lukeed/csprng@^1.0.0", "@lukeed/csprng@^1.1.0": version "1.1.0" resolved "https://registry.yarnpkg.com/@lukeed/csprng/-/csprng-1.1.0.tgz#1e3e4bd05c1cc7a0b2ddbd8a03f39f6e4b5e6cfe" @@ -8391,14 +8379,6 @@ hey-listen "^1.0.8" tslib "^2.3.1" -"@mrmlnc/readdir-enhanced@^2.2.1": - version "2.2.1" - resolved "https://registry.yarnpkg.com/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz#524af240d1a360527b730475ecfa1344aa540dde" - integrity sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g== - dependencies: - call-me-maybe "^1.0.1" - glob-to-regexp "^0.3.0" - "@mswjs/cookies@^0.2.2": version "0.2.2" resolved "https://registry.yarnpkg.com/@mswjs/cookies/-/cookies-0.2.2.tgz#b4e207bf6989e5d5427539c2443380a33ebb922b" @@ -8654,11 +8634,6 @@ resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== -"@nodelib/fs.stat@^1.1.2": - version "1.1.3" - resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz#2b5a3ab3f918cca48a8c754c08168e3f03eba61b" - integrity sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw== - "@nodelib/fs.walk@^1.2.3", "@nodelib/fs.walk@^1.2.6", "@nodelib/fs.walk@^1.2.8": version "1.2.8" resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" @@ -9361,16 +9336,6 @@ "@octokit/webhooks-types" "7.4.0" aggregate-error "^3.1.0" -"@one-platform/opc-feedback@0.1.1-alpha": - version "0.1.1-alpha" - resolved "https://registry.yarnpkg.com/@one-platform/opc-feedback/-/opc-feedback-0.1.1-alpha.tgz#f0481f5869a7e867ed3179197fae362c7cc16c4a" - integrity sha512-5H1TGy25YNPU6CDLOzsiKwgFGd9BMVXO2zDfLdmHLWSYP9cGtFIv3I87qCssBrsPh6ltZzIgDpbd8kyMpF6pbQ== - dependencies: - dialog-polyfill "^0.5.6" - lit "^2.0.0-rc.2" - lit-analyzer "^1.2.1" - lit-element "2.4.0" - "@open-draft/until@^1.0.3": version "1.0.3" resolved "https://registry.yarnpkg.com/@open-draft/until/-/until-1.0.3.tgz#db9cc719191a62e7d9200f6e7bab21c5b848adca" @@ -15100,13 +15065,6 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-16.18.97.tgz#d7926a8030f0d714d555b4550c0cc7731495cfe5" integrity sha512-4muilE1Lbfn57unR+/nT9AFjWk0MtWi5muwCEJqnOvfRQDbSfLCUdN7vCIg8TYuaANfhLOV85ve+FNpiUsbSRg== -"@types/nodemailer@6.4.15": - version "6.4.15" - resolved "https://registry.yarnpkg.com/@types/nodemailer/-/nodemailer-6.4.15.tgz#494be695e11c438f7f5df738fb4ab740312a6ed2" - integrity sha512-0EBJxawVNjPkng1zm2vopRctuWVCxk34JcIlRuXSf54habUWdz1FB7wHDqOqvDa8Mtpt0Q3LTXQkAs2LNyK5jQ== - dependencies: - "@types/node" "*" - "@types/normalize-package-data@^2.4.0": version "2.4.4" resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz#56e2cc26c397c038fab0e3a917a12d5c5909e901" @@ -15422,7 +15380,7 @@ resolved "https://registry.yarnpkg.com/@types/triple-beam/-/triple-beam-1.3.5.tgz#74fef9ffbaa198eb8b588be029f38b00299caa2c" integrity sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw== -"@types/trusted-types@*", "@types/trusted-types@^2.0.2": +"@types/trusted-types@*": version "2.0.7" resolved "https://registry.yarnpkg.com/@types/trusted-types/-/trusted-types-2.0.7.tgz#baccb07a970b91707df3a3e8ba6896c57ead2d11" integrity sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw== @@ -16203,11 +16161,6 @@ antlr4@^4.13.0: resolved "https://registry.yarnpkg.com/antlr4/-/antlr4-4.13.1.tgz#1e0a1830a08faeb86217cb2e6c34716004e4253d" integrity sha512-kiXTspaRYvnIArgE97z5YVVf/cDVQABr3abFRR6mE7yesLMkgu4ujuyV/sgxafQ8wgve0DJQUJ38Z8tkgA2izA== -any-base@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/any-base/-/any-base-1.1.0.tgz#ae101a62bc08a597b4c9ab5b7089d456630549fe" - integrity sha512-uMgjozySS8adZZYePpaWs8cxB9/kdzmpX6SgJZ+wbz1K5eYk5QMYDVJaZKhxyIHUdnnJkfR7SVgStgH7LkGUyg== - any-promise@^1.0.0, any-promise@^1.1.0: version "1.3.0" resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f" @@ -16390,21 +16343,6 @@ aria-query@^5.0.0, aria-query@^5.3.0: dependencies: dequal "^2.0.3" -arr-diff@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" - integrity sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA== - -arr-flatten@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" - integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== - -arr-union@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" - integrity sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q== - array-buffer-byte-length@^1.0.0, array-buffer-byte-length@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz#1e5583ec16763540a27ae52eed99ff899223568f" @@ -16452,11 +16390,6 @@ array-uniq@^1.0.1: resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" integrity sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q== -array-unique@^0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" - integrity sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ== - array.prototype.findlast@^1.2.4: version "1.2.5" resolved "https://registry.yarnpkg.com/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz#3e4fbcb30a15a7f5bf64cf2faae22d139c2e4904" @@ -16591,11 +16524,6 @@ assert@^2.1.0: object.assign "^4.1.4" util "^0.12.5" -assign-symbols@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" - integrity sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw== - ast-types-flow@^0.0.8: version "0.0.8" resolved "https://registry.yarnpkg.com/ast-types-flow/-/ast-types-flow-0.0.8.tgz#0a85e1c92695769ac13a428bb653e7538bea27d6" @@ -16667,11 +16595,6 @@ atlassian-openapi@^1.0.8: jsonpointer "^5.0.0" urijs "^1.19.10" -atob@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" - integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== - atomic-sleep@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/atomic-sleep/-/atomic-sleep-1.0.0.tgz#eb85b77a601fc932cfe432c5acd364a9e2c9075b" @@ -17007,19 +16930,6 @@ base64url@3.x.x: resolved "https://registry.yarnpkg.com/base64url/-/base64url-3.0.1.tgz#6399d572e2bc3f90a9a8b22d5dbb0a32d33f788d" integrity sha512-ir1UPr3dkwexU7FdV8qBBbNDRUhMmIekYMFZfi+C/sLNnRESKPl23nB9b2pltqfOQNnGzsDdId90AEtG5tCx4A== -base@^0.11.1: - version "0.11.2" - resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" - integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg== - dependencies: - cache-base "^1.0.1" - class-utils "^0.3.5" - component-emitter "^1.2.1" - define-property "^1.0.0" - isobject "^3.0.1" - mixin-deep "^1.2.0" - pascalcase "^0.1.1" - basic-auth@~2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/basic-auth/-/basic-auth-2.0.1.tgz#b998279bf47ce38344b4f3cf916d4679bbf51e3a" @@ -17224,22 +17134,6 @@ brace-expansion@^2.0.1: dependencies: balanced-match "^1.0.0" -braces@^2.3.1: - version "2.3.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" - integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== - dependencies: - arr-flatten "^1.1.0" - array-unique "^0.3.2" - extend-shallow "^2.0.1" - fill-range "^4.0.0" - isobject "^3.0.1" - repeat-element "^1.1.2" - snapdragon "^0.8.1" - snapdragon-node "^2.0.1" - split-string "^3.0.2" - to-regex "^3.0.1" - braces@^3.0.2, braces@~3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" @@ -17534,21 +17428,6 @@ cacache@^16.0.0, cacache@^16.1.0, cacache@^16.1.3: tar "^6.1.11" unique-filename "^2.0.0" -cache-base@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" - integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ== - dependencies: - collection-visit "^1.0.0" - component-emitter "^1.2.1" - get-value "^2.0.6" - has-value "^1.0.0" - isobject "^3.0.1" - set-value "^2.0.0" - to-object-path "^0.3.0" - union-value "^1.0.0" - unset-value "^1.0.0" - cache-content-type@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/cache-content-type/-/cache-content-type-1.0.1.tgz#035cde2b08ee2129f4a8315ea8f00a00dba1453c" @@ -17628,7 +17507,7 @@ camelcase@8.0.0: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-8.0.0.tgz#c0d36d418753fb6ad9c5e0437579745c1c14a534" integrity sha512-8WB3Jcas3swSvjIeA2yvCJ+Miyz5l1ZmB6HFb9R1317dt9LCQoswg/BGrmAmkWVEszSrrg4RwmO46qIm2OEnSA== -camelcase@^5.0.0, camelcase@^5.3.1: +camelcase@^5.3.1: version "5.3.1" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== @@ -17842,16 +17721,6 @@ cjs-module-lexer@^1.0.0: resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.3.1.tgz#c485341ae8fd999ca4ee5af2d7a1c9ae01e0099c" integrity sha512-a3KdPAANPbNE4ZUv9h6LckSl9zLsYOP4MBmhIPkRaeyybt+r4UghLvq+xw/YwUcC1gqylCkL4rdVs3Lwupjm4Q== -class-utils@^0.3.5: - version "0.3.6" - resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" - integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg== - dependencies: - arr-union "^3.1.0" - define-property "^0.2.5" - isobject "^3.0.0" - static-extend "^0.1.1" - classnames@2.x, classnames@^2.2.6, classnames@^2.3.1, classnames@^2.3.2, classnames@^2.5.1: version "2.5.1" resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.5.1.tgz#ba774c614be0f016da105c858e7159eae8e7687b" @@ -17954,15 +17823,6 @@ client-only@^0.0.1: resolved "https://registry.yarnpkg.com/client-only/-/client-only-0.0.1.tgz#38bba5d403c41ab150bff64a95c85013cf73bca1" integrity sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA== -cliui@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-6.0.0.tgz#511d702c0c4e41ca156d7d0e96021f23e13225b1" - integrity sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ== - dependencies: - string-width "^4.2.0" - strip-ansi "^6.0.0" - wrap-ansi "^6.2.0" - cliui@^7.0.2: version "7.0.4" resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" @@ -18107,14 +17967,6 @@ collect-v8-coverage@^1.0.0: resolved "https://registry.yarnpkg.com/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz#c0b29bcd33bcd0779a1344c2136051e6afd3d9e9" integrity sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q== -collection-visit@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" - integrity sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw== - dependencies: - map-visit "^1.0.0" - object-visit "^1.0.0" - color-convert@^1.9.0, color-convert@^1.9.3: version "1.9.3" resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" @@ -18296,7 +18148,7 @@ complex.js@^2.1.1: resolved "https://registry.yarnpkg.com/complex.js/-/complex.js-2.1.1.tgz#0675dac8e464ec431fb2ab7d30f41d889fb25c31" integrity sha512-8njCHOTtFFLtegk6zQo0kkVX1rngygb/KQI6z1qZxlFI3scluC+LVTCFbrkWjBv4vvLlbQ9t88IPMC6k95VTTg== -component-emitter@^1.2.1, component-emitter@^1.3.0: +component-emitter@^1.3.0: version "1.3.1" resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.1.tgz#ef1d5796f7d93f135ee6fb684340b26403c97d17" integrity sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ== @@ -18587,11 +18439,6 @@ cookies@~0.8.0: depd "~2.0.0" keygrip "~1.1.0" -copy-descriptor@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" - integrity sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw== - copy-to-clipboard@^3.2.0, copy-to-clipboard@^3.3.1: version "3.3.3" resolved "https://registry.yarnpkg.com/copy-to-clipboard/-/copy-to-clipboard-3.3.3.tgz#55ac43a1db8ae639a4bd99511c148cdd1b83a1b0" @@ -19451,7 +19298,7 @@ debounce@^1.2.0: resolved "https://registry.yarnpkg.com/debounce/-/debounce-1.2.1.tgz#38881d8f4166a5c5848020c11827b834bcb3e0a5" integrity sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug== -debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.0, debug@^2.6.9: +debug@2.6.9, debug@^2.6.0, debug@^2.6.9: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== @@ -19492,7 +19339,7 @@ decamelize-keys@^1.1.0: decamelize "^1.1.0" map-obj "^1.0.0" -decamelize@1.2.0, decamelize@^1.1.0, decamelize@^1.2.0: +decamelize@1.2.0, decamelize@^1.1.0: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" integrity sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA== @@ -19514,7 +19361,7 @@ decode-named-character-reference@^1.0.0: dependencies: character-entities "^2.0.0" -decode-uri-component@^0.2.0, decode-uri-component@^0.2.2: +decode-uri-component@^0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.2.tgz#e69dbe25d37941171dd540e024c444cd5188e1e9" integrity sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ== @@ -19658,28 +19505,6 @@ define-properties@^1.1.3, define-properties@^1.2.0, define-properties@^1.2.1: has-property-descriptors "^1.0.0" object-keys "^1.1.1" -define-property@^0.2.5: - version "0.2.5" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" - integrity sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA== - dependencies: - is-descriptor "^0.1.0" - -define-property@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" - integrity sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA== - dependencies: - is-descriptor "^1.0.0" - -define-property@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" - integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ== - dependencies: - is-descriptor "^1.0.2" - isobject "^3.0.1" - defu@^6.1.4: version "6.1.4" resolved "https://registry.yarnpkg.com/defu/-/defu-6.1.4.tgz#4e0c9cf9ff68fe5f3d7f2765cc1a012dfdcb0479" @@ -19862,20 +19687,6 @@ dezalgo@^1.0.0, dezalgo@^1.0.4: asap "^2.0.0" wrappy "1" -dialog-polyfill@^0.5.6: - version "0.5.6" - resolved "https://registry.yarnpkg.com/dialog-polyfill/-/dialog-polyfill-0.5.6.tgz#7507b4c745a82fcee0fa07ce64d835979719599a" - integrity sha512-ZbVDJI9uvxPAKze6z146rmfUZjBqNEwcnFTVamQzXH+svluiV7swmVIGr7miwADgfgt1G2JQIytypM9fbyhX4w== - -didyoumean2@4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/didyoumean2/-/didyoumean2-4.1.0.tgz#f813cb7c82c249443e599be077f76e88f24b85e4" - integrity sha512-qTBmfQoXvhKO75D/05C8m+fteQmn4U46FWYiLhXtZQInzitXLWY0EQ/2oKnpAz9g2lQWW8jYcLcT+hPJGT+kig== - dependencies: - "@babel/runtime" "^7.10.2" - leven "^3.1.0" - lodash.deburr "^4.1.0" - diff-match-patch@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/diff-match-patch/-/diff-match-patch-1.0.5.tgz#abb584d5f10cd1196dfc55aa03701592ae3f7b37" @@ -21174,19 +20985,6 @@ exit@^0.1.2: resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" integrity sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ== -expand-brackets@^2.1.4: - version "2.1.4" - resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" - integrity sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA== - dependencies: - debug "^2.3.3" - define-property "^0.2.5" - extend-shallow "^2.0.1" - posix-character-classes "^0.1.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - expand-template@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/expand-template/-/expand-template-2.0.3.tgz#6e14b3fcee0f3a6340ecb57d2e8918692052a47c" @@ -21345,21 +21143,6 @@ expression-eval@^5.0.0: dependencies: jsep "^0.3.0" -extend-shallow@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" - integrity sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug== - dependencies: - is-extendable "^0.1.0" - -extend-shallow@^3.0.0, extend-shallow@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" - integrity sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q== - dependencies: - assign-symbols "^1.0.0" - is-extendable "^1.0.1" - extend@3.0.2, extend@^3.0.0, extend@^3.0.2, extend@~3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" @@ -21374,20 +21157,6 @@ external-editor@^3.0.3: iconv-lite "^0.4.24" tmp "^0.0.33" -extglob@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" - integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw== - dependencies: - array-unique "^0.3.2" - define-property "^1.0.0" - expand-brackets "^2.1.4" - extend-shallow "^2.0.1" - fragment-cache "^0.2.1" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - extract-files@^11.0.0: version "11.0.0" resolved "https://registry.yarnpkg.com/extract-files/-/extract-files-11.0.0.tgz#b72d428712f787eef1f5193aff8ab5351ca8469a" @@ -21438,19 +21207,7 @@ fast-fifo@^1.1.0, fast-fifo@^1.2.0: resolved "https://registry.yarnpkg.com/fast-fifo/-/fast-fifo-1.3.2.tgz#286e31de96eb96d38a97899815740ba2a4f3640c" integrity sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ== -fast-glob@^2.2.6: - version "2.2.7" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-2.2.7.tgz#6953857c3afa475fff92ee6015d52da70a4cd39d" - integrity sha512-g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw== - dependencies: - "@mrmlnc/readdir-enhanced" "^2.2.1" - "@nodelib/fs.stat" "^1.1.2" - glob-parent "^3.1.0" - is-glob "^4.0.0" - merge2 "^1.2.3" - micromatch "^3.1.10" - -fast-glob@^3.1.1, fast-glob@^3.2.12, fast-glob@^3.2.2, fast-glob@^3.2.9, fast-glob@^3.3.2: +fast-glob@^3.1.1, fast-glob@^3.2.12, fast-glob@^3.2.9, fast-glob@^3.3.2: version "3.3.2" resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129" integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow== @@ -21715,16 +21472,6 @@ filesize@^8.0.6: resolved "https://registry.yarnpkg.com/filesize/-/filesize-8.0.7.tgz#695e70d80f4e47012c132d57a059e80c6b580bd8" integrity sha512-pjmC+bkIF8XI7fWaH8KxHcZL3DPybs1roSKP4rKDvy20tAWwIObE4+JIseG2byfGKhud5ZnM4YSGKBz7Sh0ndQ== -fill-range@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" - integrity sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ== - dependencies: - extend-shallow "^2.0.1" - is-number "^3.0.0" - repeat-string "^1.6.1" - to-regex-range "^2.1.0" - fill-range@^7.0.1: version "7.0.1" resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" @@ -21935,11 +21682,6 @@ for-each@^0.3.3: dependencies: is-callable "^1.1.3" -for-in@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" - integrity sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ== - foreach@^2.0.4: version "2.0.6" resolved "https://registry.yarnpkg.com/foreach/-/foreach-2.0.6.tgz#87bcc8a1a0e74000ff2bf9802110708cfb02eb6e" @@ -22134,13 +21876,6 @@ fraction.js@4.3.4: resolved "https://registry.yarnpkg.com/fraction.js/-/fraction.js-4.3.4.tgz#b2bac8249a610c3396106da97c5a71da75b94b1c" integrity sha512-pwiTgt0Q7t+GHZA4yaLjObx4vXmmdcS0iSJ19o8d/goUGgItX9UZWKWNnLHehxviD8wU2IWRsnR8cD5+yOJP2Q== -fragment-cache@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" - integrity sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA== - dependencies: - map-cache "^0.2.2" - framer-motion@^11.3.28: version "11.5.4" resolved "https://registry.yarnpkg.com/framer-motion/-/framer-motion-11.5.4.tgz#521b551bb6003918e7b24af3141626f6f443e2b3" @@ -22365,7 +22100,7 @@ gensync@^1.0.0-beta.2: resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== -get-caller-file@^2.0.1, get-caller-file@^2.0.5: +get-caller-file@^2.0.5: version "2.0.5" resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== @@ -22444,11 +22179,6 @@ get-tsconfig@^4.7.0, get-tsconfig@^4.7.2: dependencies: resolve-pkg-maps "^1.0.0" -get-value@^2.0.3, get-value@^2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" - integrity sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA== - getopts@2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/getopts/-/getopts-2.3.0.tgz#71e5593284807e03e2427449d4f6712a268666f4" @@ -22526,14 +22256,6 @@ github-slugger@^1.0.0: resolved "https://registry.yarnpkg.com/github-slugger/-/github-slugger-1.5.0.tgz#17891bbc73232051474d68bd867a34625c955f7d" integrity sha512-wIh+gKBI9Nshz2o46B0B3f5k/W+WI9ZAv6y5Dn5WJ5SK1t0TnDimB4WE5rmTD05ZAIn8HALCZVmCsvj0w0v0lw== -glob-parent@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" - integrity sha512-E8Ak/2+dZY6fnzlR7+ueWvhsH1SjHr4jjss4YS/h4py44jY9MhK/VFdaZJAWDz6BbL21KeteKxFSFpq8OS5gVA== - dependencies: - is-glob "^3.1.0" - path-dirname "^1.0.0" - glob-parent@^5.1.2, glob-parent@~5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" @@ -22548,11 +22270,6 @@ glob-parent@^6.0.2: dependencies: is-glob "^4.0.3" -glob-to-regexp@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz#8c5a1494d2066c570cc3bfe4496175acc4d502ab" - integrity sha512-Iozmtbqv0noj0uDDqoL0zNq0VBEfK2YFoMAZoxJe4cwphvLR+JskfF30QhXHOR4m3KrE6NLRYw+U9MRXvifyig== - glob-to-regexp@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e" @@ -22992,37 +22709,6 @@ has-unicode@^2.0.1: resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" integrity sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ== -has-value@^0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" - integrity sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q== - dependencies: - get-value "^2.0.3" - has-values "^0.1.4" - isobject "^2.0.0" - -has-value@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" - integrity sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw== - dependencies: - get-value "^2.0.6" - has-values "^1.0.0" - isobject "^3.0.0" - -has-values@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" - integrity sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ== - -has-values@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" - integrity sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ== - dependencies: - is-number "^3.0.0" - kind-of "^4.0.0" - hash-base@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.1.0.tgz#55c381d9e06e1d2997a883b4a3fddfe7f0d3af33" @@ -23791,13 +23477,6 @@ is-absolute-url@^3.0.0: resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-3.0.3.tgz#96c6a22b6a23929b11ea0afb1836c36ad4a5d698" integrity sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q== -is-accessor-descriptor@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.1.tgz#3223b10628354644b86260db29b3e693f5ceedd4" - integrity sha512-YBUanLI8Yoihw923YeFUS5fs0fF2f5TSFTNiYAAzhhDscDa3lEqYuz1pDOEP5KvX94I9ey3vsqjJcLVFVU+3QA== - dependencies: - hasown "^2.0.0" - is-alphabetical@^1.0.0: version "1.0.4" resolved "https://registry.yarnpkg.com/is-alphabetical/-/is-alphabetical-1.0.4.tgz#9e7d6b94916be22153745d184c298cbf986a686d" @@ -23879,11 +23558,6 @@ is-boolean-object@^1.1.0: call-bind "^1.0.2" has-tostringtag "^1.0.0" -is-buffer@^1.1.5: - version "1.1.6" - resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" - integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== - is-buffer@^2.0.0: version "2.0.5" resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.5.tgz#ebc252e400d22ff8d77fa09888821a24a658c191" @@ -23915,13 +23589,6 @@ is-core-module@^2.13.0, is-core-module@^2.13.1, is-core-module@^2.5.0, is-core-m dependencies: hasown "^2.0.0" -is-data-descriptor@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.1.tgz#2109164426166d32ea38c405c1e0945d9e6a4eeb" - integrity sha512-bc4NlCDiCr28U4aEsQ3Qs2491gVq4V8G7MQyws968ImqjKuYtTJXrl7Vq7jsN7Ly/C3xj5KWFrY7sHNeDkAzXw== - dependencies: - hasown "^2.0.0" - is-data-view@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/is-data-view/-/is-data-view-1.0.1.tgz#4b4d3a511b70f3dc26d42c03ca9ca515d847759f" @@ -23951,22 +23618,6 @@ is-deflate@^1.0.0: resolved "https://registry.yarnpkg.com/is-deflate/-/is-deflate-1.0.0.tgz#c862901c3c161fb09dac7cdc7e784f80e98f2f14" integrity sha512-YDoFpuZWu1VRXlsnlYMzKyVRITXj7Ej/V9gXQ2/pAe7X1J7M/RNOqaIYi6qUn+B7nGyB9pDXrv02dsB58d2ZAQ== -is-descriptor@^0.1.0: - version "0.1.7" - resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.7.tgz#2727eb61fd789dcd5bdf0ed4569f551d2fe3be33" - integrity sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg== - dependencies: - is-accessor-descriptor "^1.0.1" - is-data-descriptor "^1.0.1" - -is-descriptor@^1.0.0, is-descriptor@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.3.tgz#92d27cb3cd311c4977a4db47df457234a13cb306" - integrity sha512-JCNNGbwWZEVaSPtS45mdtrneRWJFp07LLmykxeFV5F6oBvNF8vHSfJuJgoT472pSfk+Mf8VnlrspaFBHWM8JAw== - dependencies: - is-accessor-descriptor "^1.0.1" - is-data-descriptor "^1.0.1" - is-directory@^0.3.1: version "0.3.1" resolved "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz#61339b6f2475fc772fd9c9d83f5c8575dc154ae1" @@ -23982,19 +23633,7 @@ is-docker@^3.0.0: resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-3.0.0.tgz#90093aa3106277d8a77a5910dbae71747e15a200" integrity sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ== -is-extendable@^0.1.0, is-extendable@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" - integrity sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw== - -is-extendable@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" - integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA== - dependencies: - is-plain-object "^2.0.4" - -is-extglob@^2.1.0, is-extglob@^2.1.1: +is-extglob@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== @@ -24035,13 +23674,6 @@ is-generator-function@^1.0.10, is-generator-function@^1.0.7: dependencies: has-tostringtag "^1.0.0" -is-glob@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" - integrity sha512-UFpDDrPgM6qpnFNI+rh/p3bUaq9hKLZN8bMUWzxmcnZVS3omf4IPK+BrewlnWjO1WmUsMYuSjKh4UJuV4+Lqmw== - dependencies: - is-extglob "^2.1.0" - is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: version "4.0.3" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" @@ -24131,13 +23763,6 @@ is-number-object@^1.0.4: dependencies: has-tostringtag "^1.0.0" -is-number@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" - integrity sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg== - dependencies: - kind-of "^3.0.2" - is-number@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" @@ -24192,7 +23817,7 @@ is-plain-object@5.0.0, is-plain-object@^5.0.0: resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-5.0.0.tgz#4427f50ab3429e9025ea7d52e9043a9ef4159344" integrity sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q== -is-plain-object@^2.0.3, is-plain-object@^2.0.4: +is-plain-object@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== @@ -24326,7 +23951,7 @@ is-weakset@^2.0.3: call-bind "^1.0.7" get-intrinsic "^1.2.4" -is-windows@^1.0.1, is-windows@^1.0.2: +is-windows@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== @@ -24345,7 +23970,7 @@ is-wsl@^3.1.0: dependencies: is-inside-container "^1.0.0" -isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: +isarray@^1.0.0, isarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== @@ -24365,14 +23990,7 @@ isexe@^2.0.0: resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== -isobject@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" - integrity sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA== - dependencies: - isarray "1.0.0" - -isobject@^3.0.0, isobject@^3.0.1: +isobject@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" integrity sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg== @@ -25618,20 +25236,6 @@ keyv@*, keyv@^4.0.0, keyv@^4.5.2, keyv@^4.5.3: dependencies: json-buffer "3.0.1" -kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: - version "3.2.2" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" - integrity sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ== - dependencies: - is-buffer "^1.1.5" - -kind-of@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" - integrity sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw== - dependencies: - is-buffer "^1.1.5" - kind-of@^6.0.2, kind-of@^6.0.3: version "6.0.3" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" @@ -25654,7 +25258,7 @@ knex-mock-client@2.0.1: dependencies: lodash.clonedeep "^4.5.0" -knex@3, knex@^3.0.0, knex@^3.1.0: +knex@3, knex@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/knex/-/knex-3.1.0.tgz#b6ddd5b5ad26a6315234a5b09ec38dc4a370bd8c" integrity sha512-GLoII6hR0c4ti243gMs5/1Rb3B+AjwMOfjYm97pu0FOQa7JH56hgBxYf5WK2525ceSbBY1cjeZ9yk99GPMB6Kw== @@ -26020,57 +25624,6 @@ listr2@~8.2.1: rfdc "^1.3.1" wrap-ansi "^9.0.0" -lit-analyzer@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/lit-analyzer/-/lit-analyzer-1.2.1.tgz#725331a4019ae870dd631d4dd709d39a237161ea" - integrity sha512-OEARBhDidyaQENavLbzpTKbEmu5rnAI+SdYsH4ia1BlGlLiqQXoym7uH1MaRPtwtUPbkhUfT4OBDZ+74VHc3Cg== - dependencies: - chalk "^2.4.2" - didyoumean2 "4.1.0" - fast-glob "^2.2.6" - parse5 "5.1.0" - ts-simple-type "~1.0.5" - vscode-css-languageservice "4.3.0" - vscode-html-languageservice "3.1.0" - web-component-analyzer "~1.1.1" - -lit-element@2.4.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/lit-element/-/lit-element-2.4.0.tgz#b22607a037a8fc08f5a80736dddf7f3f5d401452" - integrity sha512-pBGLglxyhq/Prk2H91nA0KByq/hx/wssJBQFiYqXhGDvEnY31PRGYf1RglVzyLeRysu0IHm2K0P196uLLWmwFg== - dependencies: - lit-html "^1.1.1" - -lit-element@^3.3.0: - version "3.3.3" - resolved "https://registry.yarnpkg.com/lit-element/-/lit-element-3.3.3.tgz#10bc19702b96ef5416cf7a70177255bfb17b3209" - integrity sha512-XbeRxmTHubXENkV4h8RIPyr8lXc+Ff28rkcQzw3G6up2xg5E8Zu1IgOWIwBLEQsu3cOVFqdYwiVi0hv0SlpqUA== - dependencies: - "@lit-labs/ssr-dom-shim" "^1.1.0" - "@lit/reactive-element" "^1.3.0" - lit-html "^2.8.0" - -lit-html@^1.1.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/lit-html/-/lit-html-1.4.1.tgz#0c6f3ee4ad4eb610a49831787f0478ad8e9ae5e0" - integrity sha512-B9btcSgPYb1q4oSOb/PrOT6Z/H+r6xuNzfH4lFli/AWhYwdtrgQkQWBbIc6mdnf6E2IL3gDXdkkqNktpU0OZQA== - -lit-html@^2.8.0: - version "2.8.0" - resolved "https://registry.yarnpkg.com/lit-html/-/lit-html-2.8.0.tgz#96456a4bb4ee717b9a7d2f94562a16509d39bffa" - integrity sha512-o9t+MQM3P4y7M7yNzqAyjp7z+mQGa4NS4CxiyLqFPyFWyc4O+nodLrkrxSaCTrla6M5YOLaT3RpbbqjszB5g3Q== - dependencies: - "@types/trusted-types" "^2.0.2" - -lit@^2.0.0-rc.2: - version "2.8.0" - resolved "https://registry.yarnpkg.com/lit/-/lit-2.8.0.tgz#4d838ae03059bf9cafa06e5c61d8acc0081e974e" - integrity sha512-4Sc3OFX9QHOJaHbmTMk28SYgVxLN3ePDjg7hofEft2zWlehFL3LiAuapWc4U/kYwMYJSh2hTCPZ6/LIC7ii0MA== - dependencies: - "@lit/reactive-element" "^1.6.0" - lit-element "^3.3.0" - lit-html "^2.8.0" - load-json-file@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-4.0.0.tgz#2f5f45ab91e33216234fd53adab668eb4ec0993b" @@ -26181,11 +25734,6 @@ lodash.debounce@^4, lodash.debounce@^4.0.8: resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" integrity sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow== -lodash.deburr@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/lodash.deburr/-/lodash.deburr-4.1.0.tgz#ddb1bbb3ef07458c0177ba07de14422cb033ff9b" - integrity sha512-m/M1U1f3ddMCs6Hq2tAsYThTBDaAKFDX3dwDo97GEYzamXi9SqUpjWi/Rrj/gf3X2n8ktwgZrlP1z6E3v/IExQ== - lodash.defaults@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/lodash.defaults/-/lodash.defaults-4.2.0.tgz#d09178716ffea4dde9e5fb7b37f6f0802274580c" @@ -26546,11 +26094,6 @@ map-age-cleaner@^0.2.0: dependencies: p-defer "^1.0.0" -map-cache@^0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" - integrity sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg== - map-obj@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" @@ -26566,13 +26109,6 @@ map-or-similar@^1.5.0: resolved "https://registry.yarnpkg.com/map-or-similar/-/map-or-similar-1.5.0.tgz#6de2653174adfb5d9edc33c69d3e92a1b76faf08" integrity sha512-0aF7ZmVon1igznGI4VS30yugpduQW3y3GkcgGJOp7d8x8QrizhigUxjI/m2UojsXXto+jLAH3KSz+xOJTiORjg== -map-visit@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" - integrity sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w== - dependencies: - object-visit "^1.0.0" - markdown-it@^12.2.0: version "12.3.2" resolved "https://registry.yarnpkg.com/markdown-it/-/markdown-it-12.3.2.tgz#bf92ac92283fe983fe4de8ff8abfb5ad72cd0c90" @@ -27073,7 +26609,7 @@ merge-stream@^2.0.0: resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== -merge2@^1.2.3, merge2@^1.3.0, merge2@^1.4.1: +merge2@^1.3.0, merge2@^1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== @@ -27639,25 +27175,6 @@ micromark@^4.0.0: micromark-util-symbol "^2.0.0" micromark-util-types "^2.0.0" -micromatch@^3.1.10: - version "3.1.10" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" - integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== - dependencies: - arr-diff "^4.0.0" - array-unique "^0.3.2" - braces "^2.3.1" - define-property "^2.0.2" - extend-shallow "^3.0.2" - extglob "^2.0.4" - fragment-cache "^0.2.1" - kind-of "^6.0.2" - nanomatch "^1.2.9" - object.pick "^1.3.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.2" - micromatch@^4.0.0, micromatch@^4.0.2, micromatch@^4.0.4, micromatch@^4.0.5: version "4.0.5" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" @@ -27907,14 +27424,6 @@ minizlib@^2.1.1, minizlib@^2.1.2: minipass "^3.0.0" yallist "^4.0.0" -mixin-deep@^1.2.0: - version "1.3.2" - resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566" - integrity sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA== - dependencies: - for-in "^1.0.2" - is-extendable "^1.0.1" - mkdirp-classic@^0.5.2, mkdirp-classic@^0.5.3: version "0.5.3" resolved "https://registry.yarnpkg.com/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz#fa10c9115cc6d8865be221ba47ee9bed78601113" @@ -28317,23 +27826,6 @@ nanoid@^3.3.7: resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.7.tgz#d0c301a691bc8d54efa0a2226ccf3fe2fd656bd8" integrity sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g== -nanomatch@^1.2.9: - version "1.2.13" - resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" - integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA== - dependencies: - arr-diff "^4.0.0" - array-unique "^0.3.2" - define-property "^2.0.2" - extend-shallow "^3.0.2" - fragment-cache "^0.2.1" - is-windows "^1.0.2" - kind-of "^6.0.2" - object.pick "^1.3.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - napi-build-utils@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/napi-build-utils/-/napi-build-utils-1.0.2.tgz#b1fddc0b2c46e380a0b7a76f984dd47c41a13806" @@ -28593,11 +28085,6 @@ node-schedule@2.1.1: long-timeout "0.1.1" sorted-array-functions "^1.3.0" -nodemailer@^6.9.8: - version "6.9.13" - resolved "https://registry.yarnpkg.com/nodemailer/-/nodemailer-6.9.13.tgz#5b292bf1e92645f4852ca872c56a6ba6c4a3d3d6" - integrity sha512-7o38Yogx6krdoBf3jCAqnIN4oSQFx+fMa0I7dK1D+me9kBxx12D+/33wSb+fhOCtIxvYJ+4x4IMEhmhCKfAiOA== - nodemon@3.1.3: version "3.1.3" resolved "https://registry.yarnpkg.com/nodemon/-/nodemon-3.1.3.tgz#dcce9ee0aa7d19cd4dcd576ae9a0456d9078b286" @@ -28934,15 +28421,6 @@ object-assign@^4, object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1 resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== -object-copy@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" - integrity sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ== - dependencies: - copy-descriptor "^0.1.0" - define-property "^0.2.5" - kind-of "^3.0.3" - object-hash@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-2.2.0.tgz#5ad518581eefc443bd763472b8ff2e9c2c0d54a5" @@ -28971,13 +28449,6 @@ object-keys@^1.1.1: resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== -object-visit@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" - integrity sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA== - dependencies: - isobject "^3.0.0" - object.assign@^4.1.4, object.assign@^4.1.5: version "4.1.5" resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.5.tgz#3a833f9ab7fdb80fc9e8d2300c803d216d8fdbb0" @@ -29025,13 +28496,6 @@ object.hasown@^1.1.3: es-abstract "^1.23.2" es-object-atoms "^1.0.0" -object.pick@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" - integrity sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ== - dependencies: - isobject "^3.0.1" - object.values@^1.1.6, object.values@^1.1.7: version "1.2.0" resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.2.0.tgz#65405a9d92cee68ac2d303002e0b8470a4d9ab1b" @@ -29645,11 +29109,6 @@ parse5-htmlparser2-tree-adapter@^6.0.0: dependencies: parse5 "^6.0.1" -parse5@5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/parse5/-/parse5-5.1.0.tgz#c59341c9723f414c452975564c7c00a68d58acd2" - integrity sha512-fxNG2sQjHvlVAYmzBZS9YlDp6PTSSDwa98vkD4QgVDDCAo84z5X1t5XyJQ62ImdLXx5NdIIfihey6xpum9/gRQ== - parse5@6.0.1, parse5@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b" @@ -29680,11 +29139,6 @@ pascal-case@^3.1.2: no-case "^3.0.4" tslib "^2.0.3" -pascalcase@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" - integrity sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw== - passport-atlassian-oauth2@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/passport-atlassian-oauth2/-/passport-atlassian-oauth2-2.1.0.tgz#8043ced378ca002055ac0ea0e4cb2198692acb07" @@ -29807,11 +29261,6 @@ path-browserify@^1.0.0, path-browserify@^1.0.1: resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-1.0.1.tgz#d98454a9c3753d5790860f16f68867b9e46be1fd" integrity sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g== -path-dirname@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" - integrity sha512-ALzNPpyNq9AqXMBjeymIjFDAkAFH06mHJH/cSBHAgU0s4vfpBn6b2nf8tiRLvagKD8RbTpq2FKTBg7cl9l3c7Q== - path-equal@^1.2.5: version "1.2.5" resolved "https://registry.yarnpkg.com/path-equal/-/path-equal-1.2.5.tgz#9fcbdd5e5daee448e96f43f3bac06c666b5e982a" @@ -30237,11 +29686,6 @@ portfinder@^1.0.32: debug "^3.2.7" mkdirp "^0.5.6" -posix-character-classes@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" - integrity sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg== - possible-typed-array-names@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz#89bb63c6fada2c3e90adc4a647beeeb39cc7bf8f" @@ -31946,14 +31390,6 @@ regenerator-transform@^0.15.2: dependencies: "@babel/runtime" "^7.8.4" -regex-not@^1.0.0, regex-not@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" - integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A== - dependencies: - extend-shallow "^3.0.2" - safe-regex "^1.1.0" - regexp.prototype.flags@^1.5.1, regexp.prototype.flags@^1.5.2: version "1.5.2" resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz#138f644a3350f981a858c44f6bb1a61ff59be334" @@ -32120,12 +31556,7 @@ renderkid@^3.0.0: lodash "^4.17.21" strip-ansi "^6.0.1" -repeat-element@^1.1.2: - version "1.1.4" - resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.4.tgz#be681520847ab58c7568ac75fbfad28ed42d39e9" - integrity sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ== - -repeat-string@^1.5.2, repeat-string@^1.6.1: +repeat-string@^1.5.2: version "1.6.1" resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" integrity sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w== @@ -32175,11 +31606,6 @@ require-from-string@^2.0.2: resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== -require-main-filename@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" - integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== - requireindex@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/requireindex/-/requireindex-1.2.0.tgz#3463cdb22ee151902635aa6c9535d4de9c2ef1ef" @@ -32235,11 +31661,6 @@ resolve-pkg-maps@^1.0.0: resolved "https://registry.yarnpkg.com/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz#616b3dc2c57056b5588c31cdf4b3d64db133720f" integrity sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw== -resolve-url@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" - integrity sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg== - resolve.exports@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-2.0.2.tgz#f8c934b8e6a13f539e38b7098e2e36134f01e800" @@ -32589,13 +32010,6 @@ safe-regex-test@^1.0.3: es-errors "^1.3.0" is-regex "^1.1.4" -safe-regex@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" - integrity sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg== - dependencies: - ret "~0.1.10" - safe-stable-stringify@^1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/safe-stable-stringify/-/safe-stable-stringify-1.1.1.tgz#c8a220ab525cd94e60ebf47ddc404d610dc5d84a" @@ -32918,16 +32332,6 @@ set-harmonic-interval@^1.0.1: resolved "https://registry.yarnpkg.com/set-harmonic-interval/-/set-harmonic-interval-1.0.1.tgz#e1773705539cdfb80ce1c3d99e7f298bb3995249" integrity sha512-AhICkFV84tBP1aWqPwLZqFvAwqEoVA9kxNMniGEUvzOlm4vLmOFLiTT3UZ6bziJTy4bOVpzWGTfSCbmaayGx8g== -set-value@^2.0.0, set-value@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b" - integrity sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw== - dependencies: - extend-shallow "^2.0.1" - is-extendable "^0.1.1" - is-plain-object "^2.0.3" - split-string "^3.0.1" - set-value@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/set-value/-/set-value-4.1.0.tgz#aa433662d87081b75ad88a4743bd450f044e7d09" @@ -32993,14 +32397,6 @@ short-unique-id@^5.0.2: resolved "https://registry.yarnpkg.com/short-unique-id/-/short-unique-id-5.2.0.tgz#a7e0668e0a8998d3151f27a36cf046055b1f270b" integrity sha512-cMGfwNyfDZ/nzJ2k2M+ClthBIh//GlZl1JEf47Uoa9XR11bz8Pa2T2wQO4bVrRdH48LrIDWJahQziKo3MjhsWg== -short-uuid@^4.2.2: - version "4.2.2" - resolved "https://registry.yarnpkg.com/short-uuid/-/short-uuid-4.2.2.tgz#4bb3d926da04a4a5f34420d17b5551fd6d9d535c" - integrity sha512-IE7hDSGV2U/VZoCsjctKX6l5t5ak2jE0+aeGJi3KtvjIUNuZVmHVYUjNBhmo369FIWGDtaieRaO8A83Lvwfpqw== - dependencies: - any-base "^1.1.0" - uuid "^8.3.2" - side-channel@^1.0.4, side-channel@^1.0.6: version "1.0.6" resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.6.tgz#abd25fb7cd24baf45466406b1096b7831c9215f2" @@ -33133,36 +32529,6 @@ snake-case@^3.0.4: dot-case "^3.0.4" tslib "^2.0.3" -snapdragon-node@^2.0.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" - integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw== - dependencies: - define-property "^1.0.0" - isobject "^3.0.0" - snapdragon-util "^3.0.1" - -snapdragon-util@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" - integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ== - dependencies: - kind-of "^3.2.0" - -snapdragon@^0.8.1: - version "0.8.2" - resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" - integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg== - dependencies: - base "^0.11.1" - debug "^2.2.0" - define-property "^0.2.5" - extend-shallow "^2.0.1" - map-cache "^0.2.2" - source-map "^0.5.6" - source-map-resolve "^0.5.0" - use "^3.1.0" - sockjs@^0.3.24: version "0.3.24" resolved "https://registry.yarnpkg.com/sockjs/-/sockjs-0.3.24.tgz#c9bc8995f33a111bea0395ec30aa3206bdb5ccce" @@ -33219,17 +32585,6 @@ source-list-map@^2.0.0: resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.0.tgz#16b809c162517b5b8c3e7dcd315a2a5c2612b2af" integrity sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg== -source-map-resolve@^0.5.0: - version "0.5.3" - resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz#190866bece7553e1f8f267a2ee82c606b5509a1a" - integrity sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw== - dependencies: - atob "^2.1.2" - decode-uri-component "^0.2.0" - resolve-url "^0.2.1" - source-map-url "^0.4.0" - urix "^0.1.0" - source-map-support@0.5.13: version "0.5.13" resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.13.tgz#31b24a9c2e73c2de85066c0feb7d44767ed52932" @@ -33246,17 +32601,12 @@ source-map-support@^0.5.16, source-map-support@~0.5.20: buffer-from "^1.0.0" source-map "^0.6.0" -source-map-url@^0.4.0: - version "0.4.1" - resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.1.tgz#0af66605a745a5a2f91cf1bbf8a7afbc283dec56" - integrity sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw== - source-map@0.5.6: version "0.5.6" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.6.tgz#75ce38f52bf0733c5a7f0c118d81334a2bb5f412" integrity sha512-MjZkVp0NHr5+TPihLcadqnlVoGIoWo4IBHptutGh9wI3ttUYvCG26HkSuDi+K6lsZ25syXJXcctwgyVCt//xqA== -source-map@^0.5.6, source-map@^0.5.7: +source-map@^0.5.7: version "0.5.7" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" integrity sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ== @@ -33355,13 +32705,6 @@ split-on-first@^1.0.0: resolved "https://registry.yarnpkg.com/split-on-first/-/split-on-first-1.1.0.tgz#f610afeee3b12bce1d0c30425e76398b78249a5f" integrity sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw== -split-string@^3.0.1, split-string@^3.0.2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" - integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw== - dependencies: - extend-shallow "^3.0.0" - split2@^3.0.0: version "3.2.2" resolved "https://registry.yarnpkg.com/split2/-/split2-3.2.2.tgz#bf2cf2a37d838312c249c89206fd7a17dd12365f" @@ -33512,14 +32855,6 @@ static-eval@2.0.2: dependencies: escodegen "^1.8.1" -static-extend@^0.1.1: - version "0.1.2" - resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" - integrity sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g== - dependencies: - define-property "^0.2.5" - object-copy "^0.1.0" - statuses@2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" @@ -33694,16 +33029,7 @@ string-length@^4.0.1: char-regex "^1.0.2" strip-ansi "^6.0.0" -"string-width-cjs@npm:string-width@^4.2.0": - version "4.2.3" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" - integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" - -"string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: +"string-width-cjs@npm:string-width@^4.2.0", "string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== @@ -33798,7 +33124,7 @@ stringify-entities@^4.0.0: character-entities-html4 "^2.0.0" character-entities-legacy "^3.0.0" -"strip-ansi-cjs@npm:strip-ansi@^6.0.1": +"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== @@ -33812,13 +33138,6 @@ strip-ansi@5.2.0: dependencies: ansi-regex "^4.1.0" -strip-ansi@^6.0.0, strip-ansi@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== - dependencies: - ansi-regex "^5.0.1" - strip-ansi@^7.0.1, strip-ansi@^7.1.0: version "7.1.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" @@ -34491,21 +33810,6 @@ to-fast-properties@^2.0.0: resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== -to-object-path@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" - integrity sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg== - dependencies: - kind-of "^3.0.2" - -to-regex-range@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" - integrity sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg== - dependencies: - is-number "^3.0.0" - repeat-string "^1.6.1" - to-regex-range@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" @@ -34513,16 +33817,6 @@ to-regex-range@^5.0.1: dependencies: is-number "^7.0.0" -to-regex@^3.0.1, to-regex@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" - integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw== - dependencies: - define-property "^2.0.2" - extend-shallow "^3.0.2" - regex-not "^1.0.2" - safe-regex "^1.1.0" - tocbot@^4.20.1: version "4.27.20" resolved "https://registry.yarnpkg.com/tocbot/-/tocbot-4.27.20.tgz#c7ba627585894fa306d65b08f53f624949becf19" @@ -34748,11 +34042,6 @@ ts-node@10.9.2, ts-node@^10.9.1: v8-compile-cache-lib "^3.0.1" yn "3.1.1" -ts-simple-type@~1.0.5: - version "1.0.7" - resolved "https://registry.yarnpkg.com/ts-simple-type/-/ts-simple-type-1.0.7.tgz#03930af557528dd40eaa121913c7035a0baaacf8" - integrity sha512-zKmsCQs4dZaeSKjEA7pLFDv7FHHqAFLPd0Mr//OIJvu8M+4p4bgSFJwZSEBEg3ec9W7RzRz1vi8giiX0+mheBQ== - ts-toolbelt@^9.6.0: version "9.6.0" resolved "https://registry.yarnpkg.com/ts-toolbelt/-/ts-toolbelt-9.6.0.tgz#50a25426cfed500d4a09bd1b3afb6f28879edfd5" @@ -35100,11 +34389,6 @@ typescript@5.4.5: resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.4.5.tgz#42ccef2c571fdbd0f6718b1d1f5e6e5ef006f611" integrity sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ== -typescript@^3.8.3: - version "3.9.10" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.9.10.tgz#70f3910ac7a51ed6bef79da7800690b19bf778b8" - integrity sha512-w6fIxVE/H1PkLKcCPsFqKE7Kv7QUwhU8qQY2MueZXWx5cPZdwFupLgKK3vntcK98BtNHZtAF4LA/yl2a7k8R6Q== - typescript@~5.1.0: version "5.1.6" resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.1.6.tgz#02f8ac202b6dad2c0dd5e0913745b47a37998274" @@ -35276,16 +34560,6 @@ unified@^11.0.0: trough "^2.0.0" vfile "^6.0.0" -union-value@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847" - integrity sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg== - dependencies: - arr-union "^3.1.0" - get-value "^2.0.6" - is-extendable "^0.1.1" - set-value "^2.0.1" - unique-filename@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-2.0.1.tgz#e785f8675a9a7589e0ac77e0b5c34d2eaeac6da2" @@ -35473,14 +34747,6 @@ unraw@^3.0.0: resolved "https://registry.yarnpkg.com/unraw/-/unraw-3.0.0.tgz#73443ed70d2ab09ccbac2b00525602d5991fbbe3" integrity sha512-08/DA66UF65OlpUDIQtbJyrqTR0jTAlJ+jsnkQ4jxR7+K5g5YG1APZKQSMCE1vqqmD+2pv6+IdEjmopFatacvg== -unset-value@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" - integrity sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ== - dependencies: - has-value "^0.3.1" - isobject "^3.0.0" - untildify@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/untildify/-/untildify-4.0.0.tgz#2bc947b953652487e4600949fb091e3ae8cd919b" @@ -35526,11 +34792,6 @@ urijs@^1.19.10, urijs@^1.19.11: resolved "https://registry.yarnpkg.com/urijs/-/urijs-1.19.11.tgz#204b0d6b605ae80bea54bea39280cdb7c9f923cc" integrity sha512-HXgFDgDommxn5/bIv0cnQZsPhHDA90NPHD6+c/v21U5+Sx5hoP8+dP9IZXBU1gIfvdRfhG8cel9QNPeionfcCQ== -urix@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" - integrity sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg== - url-join@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/url-join/-/url-join-4.0.1.tgz#b642e21a2646808ffa178c4c5fda39844e12cde7" @@ -35628,11 +34889,6 @@ use-sync-external-store@^1.0.0, use-sync-external-store@^1.2.0: resolved "https://registry.yarnpkg.com/use-sync-external-store/-/use-sync-external-store-1.2.2.tgz#c3b6390f3a30eba13200d2302dcdf1e7b57b2ef9" integrity sha512-PElTlVMwpblvbNqQ82d2n6RjStvdSoNe9FG28kNfz3WiXilJm4DdNkEzRhCZuIDwY8U08WVihhGR5iRqAwfDiw== -use@^3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" - integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== - util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" @@ -36044,26 +35300,6 @@ vm-browserify@^1.0.1, vm-browserify@^1.1.2: resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.2.tgz#78641c488b8e6ca91a75f511e7a3b32a86e5dda0" integrity sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ== -vscode-css-languageservice@4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/vscode-css-languageservice/-/vscode-css-languageservice-4.3.0.tgz#40c797d664ab6188cace33cfbb19b037580a9318" - integrity sha512-BkQAMz4oVHjr0oOAz5PdeE72txlLQK7NIwzmclfr+b6fj6I8POwB+VoXvrZLTbWt9hWRgfvgiQRkh5JwrjPJ5A== - dependencies: - vscode-languageserver-textdocument "^1.0.1" - vscode-languageserver-types "3.16.0-next.2" - vscode-nls "^4.1.2" - vscode-uri "^2.1.2" - -vscode-html-languageservice@3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/vscode-html-languageservice/-/vscode-html-languageservice-3.1.0.tgz#265b53bda595e6947b16b0fb8c604e1e58685393" - integrity sha512-QAyRHI98bbEIBCqTzZVA0VblGU40na0txggongw5ZgTj9UVsVk5XbLT16O9OTcbqBGSqn0oWmFDNjK/XGIDcqg== - dependencies: - vscode-languageserver-textdocument "^1.0.1" - vscode-languageserver-types "3.16.0-next.2" - vscode-nls "^4.1.2" - vscode-uri "^2.1.2" - vscode-json-languageservice@^4.2.1: version "4.2.1" resolved "https://registry.yarnpkg.com/vscode-json-languageservice/-/vscode-json-languageservice-4.2.1.tgz#94b6f471ece193bf4a1ef37f6ab5cce86d50a8b4" @@ -36101,12 +35337,12 @@ vscode-languageserver-protocol@^3.0.0: vscode-jsonrpc "8.2.0" vscode-languageserver-types "3.17.5" -vscode-languageserver-textdocument@^1.0.0, vscode-languageserver-textdocument@^1.0.1, vscode-languageserver-textdocument@^1.0.3, vscode-languageserver-textdocument@^1.0.4: +vscode-languageserver-textdocument@^1.0.0, vscode-languageserver-textdocument@^1.0.3, vscode-languageserver-textdocument@^1.0.4: version "1.0.11" resolved "https://registry.yarnpkg.com/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.11.tgz#0822a000e7d4dc083312580d7575fe9e3ba2e2bf" integrity sha512-X+8T3GoiwTVlJbicx/sIAF+yuJAqz8VvwJyoMVhwEMoEKE/fkDmrqUgDMyBECcM2A2frVZIUj5HI/ErRXCfOeA== -vscode-languageserver-types@3.16.0, vscode-languageserver-types@3.16.0-next.2, vscode-languageserver-types@3.17.5, vscode-languageserver-types@^3.0.0, vscode-languageserver-types@^3.16.0, vscode-languageserver-types@^3.17.1: +vscode-languageserver-types@3.16.0, vscode-languageserver-types@3.17.5, vscode-languageserver-types@^3.0.0, vscode-languageserver-types@^3.16.0, vscode-languageserver-types@^3.17.1: version "3.17.5" resolved "https://registry.yarnpkg.com/vscode-languageserver-types/-/vscode-languageserver-types-3.17.5.tgz#3273676f0cf2eab40b3f44d085acbb7f08a39d8a" integrity sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg== @@ -36118,21 +35354,11 @@ vscode-languageserver@^7.0.0: dependencies: vscode-languageserver-protocol "3.16.0" -vscode-nls@^4.1.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/vscode-nls/-/vscode-nls-4.1.2.tgz#ca8bf8bb82a0987b32801f9fddfdd2fb9fd3c167" - integrity sha512-7bOHxPsfyuCqmP+hZXscLhiHwe7CSuFE4hyhbs22xPIhQ4jv99FcR4eBzfYYVLP356HNFpdvz63FFb/xw6T4Iw== - vscode-nls@^5.0.0: version "5.2.0" resolved "https://registry.yarnpkg.com/vscode-nls/-/vscode-nls-5.2.0.tgz#3cb6893dd9bd695244d8a024bdf746eea665cc3f" integrity sha512-RAaHx7B14ZU04EU31pT+rKz2/zSl7xMsfIZuo8pd+KZO6PXtQmpevpq3vxvWNcrGbdmhM/rr5Uw5Mz+NBfhVng== -vscode-uri@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/vscode-uri/-/vscode-uri-2.1.2.tgz#c8d40de93eb57af31f3c715dd650e2ca2c096f1c" - integrity sha512-8TEXQxlldWAuIODdukIb+TR5s+9Ds40eSJrw+1iDDA9IFORPjMELarNQE3myz5XIkWWpdprmJjm1/SxMlWOC8A== - vscode-uri@^3.0.0, vscode-uri@^3.0.3: version "3.0.8" resolved "https://registry.yarnpkg.com/vscode-uri/-/vscode-uri-3.0.8.tgz#1770938d3e72588659a172d0fd4642780083ff9f" @@ -36205,16 +35431,6 @@ wcwidth@>=1.0.1, wcwidth@^1.0.0, wcwidth@^1.0.1: dependencies: defaults "^1.0.3" -web-component-analyzer@~1.1.1: - version "1.1.7" - resolved "https://registry.yarnpkg.com/web-component-analyzer/-/web-component-analyzer-1.1.7.tgz#dad7f5a91f3b095c5a54f0f48d2dccb810c96b89" - integrity sha512-SqCqN4nU9fU+j0CKXJQ8E4cslLsaezhagY6xoi+hoNPPd55GzR6MY1r5jkoJUVu+g4Wy4uB+JglTt7au4vQ1uA== - dependencies: - fast-glob "^3.2.2" - ts-simple-type "~1.0.5" - typescript "^3.8.3" - yargs "^15.3.1" - web-encoding@^1.1.5: version "1.1.5" resolved "https://registry.yarnpkg.com/web-encoding/-/web-encoding-1.1.5.tgz#fc810cf7667364a6335c939913f5051d3e0c4864" @@ -36572,11 +35788,6 @@ which-collection@^1.0.1: is-weakmap "^2.0.2" is-weakset "^2.0.3" -which-module@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.1.tgz#776b1fe35d90aebe99e8ac15eb24093389a4a409" - integrity sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ== - which-typed-array@^1.1.13, which-typed-array@^1.1.14, which-typed-array@^1.1.15, which-typed-array@^1.1.2, which-typed-array@^1.1.9: version "1.1.15" resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.15.tgz#264859e9b11a649b388bfaaf4f767df1f779b38d" @@ -36655,7 +35866,7 @@ wordwrap@^1.0.0: resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" integrity sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q== -"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== @@ -36664,7 +35875,7 @@ wordwrap@^1.0.0: string-width "^4.1.0" strip-ansi "^6.0.0" -wrap-ansi@^6.0.1, wrap-ansi@^6.2.0: +wrap-ansi@^6.0.1: version "6.2.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA== @@ -36673,15 +35884,6 @@ wrap-ansi@^6.0.1, wrap-ansi@^6.2.0: string-width "^4.1.0" strip-ansi "^6.0.0" -wrap-ansi@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" - integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - wrap-ansi@^8.1.0: version "8.1.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" @@ -36848,11 +36050,6 @@ xterm@^5.2.1, xterm@^5.3.0: resolved "https://registry.yarnpkg.com/xterm/-/xterm-5.3.0.tgz#867daf9cc826f3d45b5377320aabd996cb0fce46" integrity sha512-8QqjlekLUFTrU6x7xck1MsPzPA571K5zNqWm0M0oroYEWVOptZ0+ubQSkQ3uxIEhcIHRujJy6emDWX4A7qyFzg== -y18n@^4.0.0: - version "4.0.3" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.3.tgz#b5f259c82cd6e336921efd7bfd8bf560de9eeedf" - integrity sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ== - y18n@^5.0.5: version "5.0.8" resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" @@ -36883,14 +36080,6 @@ yaml@^2.0.0, yaml@^2.2.1, yaml@^2.2.2, yaml@^2.3.3, yaml@~2.4.2: resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.4.2.tgz#7a2b30f2243a5fc299e1f14ca58d475ed4bc5362" integrity sha512-B3VqDZ+JAg1nZpaEmWtTXUlBneoGx6CPM9b0TENK6aoSu5t73dItudwdgmi6tHlIZZId4dZ9skcAQ2UbcyAeVA== -yargs-parser@^18.1.2: - version "18.1.3" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.3.tgz#be68c4975c6b2abf469236b0c870362fab09a7b0" - integrity sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ== - dependencies: - camelcase "^5.0.0" - decamelize "^1.2.0" - yargs-parser@^20.2.2, yargs-parser@^20.2.3, yargs-parser@^20.2.9: version "20.2.9" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" @@ -36901,23 +36090,6 @@ yargs-parser@^21.1.1: resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== -yargs@^15.3.1: - version "15.4.1" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.4.1.tgz#0d87a16de01aee9d8bec2bfbf74f67851730f4f8" - integrity sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A== - dependencies: - cliui "^6.0.0" - decamelize "^1.2.0" - find-up "^4.1.0" - get-caller-file "^2.0.1" - require-directory "^2.1.1" - require-main-filename "^2.0.0" - set-blocking "^2.0.0" - string-width "^4.2.0" - which-module "^2.0.0" - y18n "^4.0.0" - yargs-parser "^18.1.2" - yargs@^16.0.0, yargs@^16.2.0: version "16.2.0" resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66"