From 36df08128049ee46f928223aee7e040b74cf485d Mon Sep 17 00:00:00 2001 From: Cortex Date: Mon, 14 Aug 2023 19:37:05 +0000 Subject: [PATCH 01/38] Initial Commit --- plugins/gitlab-issues-plugin/.eslintignore | 2 + plugins/gitlab-issues-plugin/.eslintrc.js | 30 ++++++++ plugins/gitlab-issues-plugin/.gitignore | 12 ++++ plugins/gitlab-issues-plugin/.prettierignore | 2 + plugins/gitlab-issues-plugin/README.md | 28 ++++++++ .../__mocks__/fileMock.js | 1 + .../__mocks__/styleMock.js | 1 + plugins/gitlab-issues-plugin/babel.config.js | 8 +++ plugins/gitlab-issues-plugin/cortex.yaml | 12 ++++ plugins/gitlab-issues-plugin/jest.config.js | 18 +++++ plugins/gitlab-issues-plugin/package.json | 61 ++++++++++++++++ plugins/gitlab-issues-plugin/setupTests.ts | 57 +++++++++++++++ .../gitlab-issues-plugin/src/api/Cortex.ts | 7 ++ .../gitlab-issues-plugin/src/assets/logo.svg | 3 + .../gitlab-issues-plugin/src/baseStyles.css | 3 + .../src/components/App.test.tsx | 10 +++ .../src/components/App.tsx | 26 +++++++ .../src/components/ErrorBoundary.tsx | 39 +++++++++++ .../src/components/PluginContext.tsx | 15 ++++ plugins/gitlab-issues-plugin/src/index.html | 3 + plugins/gitlab-issues-plugin/src/index.tsx | 9 +++ plugins/gitlab-issues-plugin/src/typings.d.ts | 4 ++ plugins/gitlab-issues-plugin/tsconfig.json | 16 +++++ .../gitlab-issues-plugin/webpack.config.js | 69 +++++++++++++++++++ 24 files changed, 436 insertions(+) create mode 100644 plugins/gitlab-issues-plugin/.eslintignore create mode 100644 plugins/gitlab-issues-plugin/.eslintrc.js create mode 100644 plugins/gitlab-issues-plugin/.gitignore create mode 100644 plugins/gitlab-issues-plugin/.prettierignore create mode 100644 plugins/gitlab-issues-plugin/README.md create mode 100644 plugins/gitlab-issues-plugin/__mocks__/fileMock.js create mode 100644 plugins/gitlab-issues-plugin/__mocks__/styleMock.js create mode 100644 plugins/gitlab-issues-plugin/babel.config.js create mode 100644 plugins/gitlab-issues-plugin/cortex.yaml create mode 100644 plugins/gitlab-issues-plugin/jest.config.js create mode 100644 plugins/gitlab-issues-plugin/package.json create mode 100644 plugins/gitlab-issues-plugin/setupTests.ts create mode 100644 plugins/gitlab-issues-plugin/src/api/Cortex.ts create mode 100644 plugins/gitlab-issues-plugin/src/assets/logo.svg create mode 100644 plugins/gitlab-issues-plugin/src/baseStyles.css create mode 100644 plugins/gitlab-issues-plugin/src/components/App.test.tsx create mode 100644 plugins/gitlab-issues-plugin/src/components/App.tsx create mode 100644 plugins/gitlab-issues-plugin/src/components/ErrorBoundary.tsx create mode 100644 plugins/gitlab-issues-plugin/src/components/PluginContext.tsx create mode 100644 plugins/gitlab-issues-plugin/src/index.html create mode 100644 plugins/gitlab-issues-plugin/src/index.tsx create mode 100644 plugins/gitlab-issues-plugin/src/typings.d.ts create mode 100644 plugins/gitlab-issues-plugin/tsconfig.json create mode 100644 plugins/gitlab-issues-plugin/webpack.config.js diff --git a/plugins/gitlab-issues-plugin/.eslintignore b/plugins/gitlab-issues-plugin/.eslintignore new file mode 100644 index 0000000..b947077 --- /dev/null +++ b/plugins/gitlab-issues-plugin/.eslintignore @@ -0,0 +1,2 @@ +node_modules/ +dist/ diff --git a/plugins/gitlab-issues-plugin/.eslintrc.js b/plugins/gitlab-issues-plugin/.eslintrc.js new file mode 100644 index 0000000..3a1250c --- /dev/null +++ b/plugins/gitlab-issues-plugin/.eslintrc.js @@ -0,0 +1,30 @@ +module.exports = { + env: { + browser: true, + es2021: true, + }, + extends: [ + "plugin:react/jsx-runtime", + "plugin:react-hooks/recommended", + "standard-with-typescript", + "prettier", + ], + overrides: [], + parserOptions: { + ecmaVersion: "latest", + project: "tsconfig.json", + sourceType: "module", + tsconfigRootDir: __dirname, + }, + plugins: ["react"], + rules: { + // conflicts with no-extra-boolean-cast + "@typescript-eslint/strict-boolean-expressions": "off", + "no-console": ["error", { allow: ["warn", "error"] }], + }, + settings: { + react: { + version: "detect", + }, + }, +}; diff --git a/plugins/gitlab-issues-plugin/.gitignore b/plugins/gitlab-issues-plugin/.gitignore new file mode 100644 index 0000000..4c577a9 --- /dev/null +++ b/plugins/gitlab-issues-plugin/.gitignore @@ -0,0 +1,12 @@ +# OSX +*.DS_Store + +# IDEs +.idea +*.iml +.vscode + +# This project +node_modules/ +dist/ +yarn-error.log diff --git a/plugins/gitlab-issues-plugin/.prettierignore b/plugins/gitlab-issues-plugin/.prettierignore new file mode 100644 index 0000000..b947077 --- /dev/null +++ b/plugins/gitlab-issues-plugin/.prettierignore @@ -0,0 +1,2 @@ +node_modules/ +dist/ diff --git a/plugins/gitlab-issues-plugin/README.md b/plugins/gitlab-issues-plugin/README.md new file mode 100644 index 0000000..d00a9ad --- /dev/null +++ b/plugins/gitlab-issues-plugin/README.md @@ -0,0 +1,28 @@ +# GitLab Issues Plugin + +GitLab Issues Plugin is a [Cortex](https://www.cortex.io/) plugin. To see how to run the plugin inside of Cortex, see [our docs](https://docs.cortex.io/docs/plugins). + +### Prerequisites + +Developing and building this plugin requires either [yarn](https://classic.yarnpkg.com/lang/en/docs/install/) or [npm](https://docs.npmjs.com/downloading-and-installing-node-js-and-npm). + +## Getting started + +1. Run `yarn` or `npm install` to download all dependencies +2. Run `yarn build` or `npm run build` to compile the plugin code into `./dist/ui.html` +3. Upload `ui.html` into Cortex on a create or edit plugin page +4. Add or update the code and repeat steps 2-3 as necessary + +### Notable scripts + +The following commands come pre-configured in this repository. You can see all available commands in the `scripts` section of [package.json](./package.json). They can be run with npm via `npm run {script_name}` or with yarn via `yarn {script_name}`, depending on your package manager preference. For instance, the `build` command can be run with `npm run build` or `yarn build`. + +- `build` - compiles the plugin. The compiled code root is `./src/index.tsx` (or as defined by [webpack.config.js](webpack.config.js)) and the output is generated into `dist/ui.html`. +- `test` - runs all tests defined in the repository using [jest](https://jestjs.io/) +- `lint` - runs lint and format checking on the repository using [prettier](https://prettier.io/) and [eslint](https://eslint.org/) +- `lintfix` - runs eslint in fix mode to fix any linting errors that can be fixed automatically +- `formatfix` - runs Prettier in fix mode to fix any formatting errors that can be fixed automatically + +### Available React components + +See available UI components via our [Storybook](https://cortexapps.github.io/plugin-core/). diff --git a/plugins/gitlab-issues-plugin/__mocks__/fileMock.js b/plugins/gitlab-issues-plugin/__mocks__/fileMock.js new file mode 100644 index 0000000..0a445d0 --- /dev/null +++ b/plugins/gitlab-issues-plugin/__mocks__/fileMock.js @@ -0,0 +1 @@ +module.exports = "test-file-stub"; diff --git a/plugins/gitlab-issues-plugin/__mocks__/styleMock.js b/plugins/gitlab-issues-plugin/__mocks__/styleMock.js new file mode 100644 index 0000000..f053ebf --- /dev/null +++ b/plugins/gitlab-issues-plugin/__mocks__/styleMock.js @@ -0,0 +1 @@ +module.exports = {}; diff --git a/plugins/gitlab-issues-plugin/babel.config.js b/plugins/gitlab-issues-plugin/babel.config.js new file mode 100644 index 0000000..1442fdf --- /dev/null +++ b/plugins/gitlab-issues-plugin/babel.config.js @@ -0,0 +1,8 @@ +module.exports = { + plugins: ["@babel/plugin-syntax-jsx"], + presets: [ + ["@babel/preset-env", { targets: { node: "current" } }], + "@babel/preset-typescript", + ["@babel/preset-react", { runtime: "automatic" }], + ], +}; diff --git a/plugins/gitlab-issues-plugin/cortex.yaml b/plugins/gitlab-issues-plugin/cortex.yaml new file mode 100644 index 0000000..6171570 --- /dev/null +++ b/plugins/gitlab-issues-plugin/cortex.yaml @@ -0,0 +1,12 @@ +openapi: 3.0.1 +info: + title: Gitlab Issues Plugin + description: "" + x-cortex-tag: gitlab-issues-plugin + x-cortex-git: + github: + repository: cortexapps/cortex-plugins + basepath: plugins/gitlab-issues-plugin + x-cortex-custom-metadata: + cortex-template-version: 0.1.0 + cortex-generated-timestamp: 2023-08-14T19:37:03.645550612 diff --git a/plugins/gitlab-issues-plugin/jest.config.js b/plugins/gitlab-issues-plugin/jest.config.js new file mode 100644 index 0000000..e7fb0cf --- /dev/null +++ b/plugins/gitlab-issues-plugin/jest.config.js @@ -0,0 +1,18 @@ +module.exports = { + moduleNameMapper: { + // map static asset imports to a stub file under the assumption they are not important to our tests + "\\.(jpg|jpeg|png|gif|eot|otf|webp|svg|ttf|woff|woff2|mp4|webm|wav|mp3|m4a|aac|oga)$": + "/__mocks__/fileMock.js", + // map style asset imports to a stub file under the assumption they are not important to our tests + "\\.(css|less)$": "/__mocks__/styleMock.js", + "@cortexapps/plugin-core/components": + "/node_modules/@cortexapps/plugin-core/dist/components.cjs.js", + "@cortexapps/plugin-core": + "/node_modules/@cortexapps/plugin-core/dist/index.cjs.js", + }, + setupFilesAfterEnv: ["/setupTests.ts"], + testEnvironment: "jsdom", + transform: { + "^.+\\.tsx?$": "babel-jest", + }, +}; diff --git a/plugins/gitlab-issues-plugin/package.json b/plugins/gitlab-issues-plugin/package.json new file mode 100644 index 0000000..66e8b78 --- /dev/null +++ b/plugins/gitlab-issues-plugin/package.json @@ -0,0 +1,61 @@ +{ + "name": "GitLab Issues Plugin", + "version": "0.1.0", + "license": "MIT", + "dependencies": { + "@cortexapps/plugin-core": "^2.0.0", + "react": "^18.2.0", + "react-dom": "^18.2.0" + }, + "devDependencies": { + "@babel/core": "^7.21.3", + "@babel/plugin-syntax-jsx": "^7.18.6", + "@babel/preset-env": "^7.20.2", + "@babel/preset-react": "^7.18.6", + "@babel/preset-typescript": "^7.21.0", + "@popperjs/core": "^2.11.8", + "@testing-library/jest-dom": "^5.16.5", + "@testing-library/react": "^14.0.0", + "@types/react": "^18.0.28", + "@types/react-dom": "^18.0.11", + "@typescript-eslint/eslint-plugin": "^5.0.0", + "@typescript-eslint/parser": "^5.55.0", + "babel-jest": "^29.5.0", + "css-loader": "^6.7.3", + "eslint": "^8.0.1", + "eslint-config-prettier": "^8.7.0", + "eslint-config-standard-with-typescript": "^34.0.0", + "eslint-plugin-import": "^2.25.2", + "eslint-plugin-n": "^15.6.1", + "eslint-plugin-promise": "^6.0.0", + "eslint-plugin-react": "^7.32.2", + "eslint-plugin-react-hooks": "^4.6.0", + "html-webpack-plugin": "^5.5.0", + "jest": "^29.5.0", + "jest-environment-jsdom": "^29.5.0", + "npm-run-all": "^4.1.5", + "prettier": "^2.8.4", + "prop-types": "^15.8.1", + "react-dev-utils": "^12.0.1", + "style-loader": "^3.3.1", + "terser-webpack-plugin": "^5.3.7", + "ts-loader": "^9.4.2", + "typescript": "^4.9.5", + "url-loader": "^4.1.1", + "webpack": "^5.76.1", + "webpack-cli": "^5.0.1", + "webpack-dev-server": "^4.15.0" + }, + "scripts": { + "build": "webpack --mode=production", + "clean": "rm -r ./dist", + "dev": "webpack serve --mode=development", + "fix": "run-p formatfix lintfix", + "formatfix": "yarn prettier . --write", + "formatcheck": "yarn prettier . --check", + "lint": "run-p formatcheck lintcheck", + "lintcheck": "yarn eslint src", + "lintfix": "yarn lintcheck --fix", + "test": "jest" + } +} diff --git a/plugins/gitlab-issues-plugin/setupTests.ts b/plugins/gitlab-issues-plugin/setupTests.ts new file mode 100644 index 0000000..95cd99a --- /dev/null +++ b/plugins/gitlab-issues-plugin/setupTests.ts @@ -0,0 +1,57 @@ +import "@testing-library/jest-dom/extend-expect"; + +const mockContext = { + apiBaseUrl: "https://api.cortex.dev", + entity: { + definition: null, + description: null, + groups: null, + name: "Inventory planner", + ownership: { + emails: [ + { + description: null, + email: "nikhil@cortex.io", + inheritance: null, + id: 1, + }, + ], + }, + tag: "inventory-planner", + type: "service", + }, + location: "ENTITY", + user: { + email: "ganesh@cortex.io", + name: "Ganesh Datta", + role: "ADMIN", + }, +}; + +jest.mock("@cortexapps/plugin-core/components", () => { + const originalModule = jest.requireActual( + "@cortexapps/plugin-core/components" + ); + return { + ...originalModule, + usePluginContext: () => { + return mockContext; + }, + PluginProvider: ({ children }) => { + return children; + }, + }; +}); + +jest.mock("@cortexapps/plugin-core", () => { + const originalModule = jest.requireActual("@cortexapps/plugin-core"); + return { + ...originalModule, + CortexApi: { + ...originalModule.CortexApi, + getContext: () => { + return mockContext; + }, + }, + }; +}); diff --git a/plugins/gitlab-issues-plugin/src/api/Cortex.ts b/plugins/gitlab-issues-plugin/src/api/Cortex.ts new file mode 100644 index 0000000..aac391c --- /dev/null +++ b/plugins/gitlab-issues-plugin/src/api/Cortex.ts @@ -0,0 +1,7 @@ +import { CortexApi, type CortexContextResponse } from "@cortexapps/plugin-core"; + +export const getCortexContext = async (): Promise => { + const context = await CortexApi.getContext(); + + return context; +}; diff --git a/plugins/gitlab-issues-plugin/src/assets/logo.svg b/plugins/gitlab-issues-plugin/src/assets/logo.svg new file mode 100644 index 0000000..2abafcd --- /dev/null +++ b/plugins/gitlab-issues-plugin/src/assets/logo.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/plugins/gitlab-issues-plugin/src/baseStyles.css b/plugins/gitlab-issues-plugin/src/baseStyles.css new file mode 100644 index 0000000..e9c5e5f --- /dev/null +++ b/plugins/gitlab-issues-plugin/src/baseStyles.css @@ -0,0 +1,3 @@ +body { + font: 14px sans-serif; +} diff --git a/plugins/gitlab-issues-plugin/src/components/App.test.tsx b/plugins/gitlab-issues-plugin/src/components/App.test.tsx new file mode 100644 index 0000000..625761e --- /dev/null +++ b/plugins/gitlab-issues-plugin/src/components/App.test.tsx @@ -0,0 +1,10 @@ +import { render, screen } from "@testing-library/react"; +import App from "./App"; + +describe("App", () => { + it("indicates that it's an awesome plugin", () => { + render(); + + expect(screen.queryByText(/My Awesome Cortex Plugin/)).toBeInTheDocument(); + }); +}); diff --git a/plugins/gitlab-issues-plugin/src/components/App.tsx b/plugins/gitlab-issues-plugin/src/components/App.tsx new file mode 100644 index 0000000..cc54cbb --- /dev/null +++ b/plugins/gitlab-issues-plugin/src/components/App.tsx @@ -0,0 +1,26 @@ +import type React from "react"; +import { + Logo, + PluginProvider, + Stack, + Title, +} from "@cortexapps/plugin-core/components"; +import "../baseStyles.css"; +import ErrorBoundary from "./ErrorBoundary"; +import PluginContext from "./PluginContext"; + +const App: React.FC = () => { + return ( + + + + + My Awesome Cortex Plugin + + + + + ); +}; + +export default App; diff --git a/plugins/gitlab-issues-plugin/src/components/ErrorBoundary.tsx b/plugins/gitlab-issues-plugin/src/components/ErrorBoundary.tsx new file mode 100644 index 0000000..f862bd3 --- /dev/null +++ b/plugins/gitlab-issues-plugin/src/components/ErrorBoundary.tsx @@ -0,0 +1,39 @@ +import React from "react"; + +interface ErrorBoundaryProps extends React.PropsWithChildren {} + +interface ErrorBoundaryState { + hasError: boolean; +} + +class ErrorBoundary extends React.Component< + ErrorBoundaryProps, + ErrorBoundaryState +> { + public state: ErrorBoundaryState = { + hasError: false, + }; + + public static getDerivedStateFromError(_: Error): ErrorBoundaryState { + // Update state so the next render will show the fallback UI. + return { hasError: true }; + } + + public componentDidCatch(error: Error, errorInfo: React.ErrorInfo): void { + console.error("Uncaught error:", error, errorInfo); + } + + public render(): React.ReactNode { + if (this.state.hasError) { + return ( +

+ Oops! There was a runtime error. See the console for more details. +

+ ); + } + + return this.props.children; + } +} + +export default ErrorBoundary; diff --git a/plugins/gitlab-issues-plugin/src/components/PluginContext.tsx b/plugins/gitlab-issues-plugin/src/components/PluginContext.tsx new file mode 100644 index 0000000..13ee6d4 --- /dev/null +++ b/plugins/gitlab-issues-plugin/src/components/PluginContext.tsx @@ -0,0 +1,15 @@ +import { Title, usePluginContext } from "@cortexapps/plugin-core/components"; +import type React from "react"; + +const PluginContext: React.FC = () => { + const context = usePluginContext(); + + return ( + <> + Plugin context +
{JSON.stringify(context, null, 2)}
+ + ); +}; + +export default PluginContext; diff --git a/plugins/gitlab-issues-plugin/src/index.html b/plugins/gitlab-issues-plugin/src/index.html new file mode 100644 index 0000000..c238cbf --- /dev/null +++ b/plugins/gitlab-issues-plugin/src/index.html @@ -0,0 +1,3 @@ + +
+ diff --git a/plugins/gitlab-issues-plugin/src/index.tsx b/plugins/gitlab-issues-plugin/src/index.tsx new file mode 100644 index 0000000..2a10097 --- /dev/null +++ b/plugins/gitlab-issues-plugin/src/index.tsx @@ -0,0 +1,9 @@ +import { createRoot } from "react-dom/client"; +import App from "./components/App"; + +document.addEventListener("DOMContentLoaded", function () { + const container = document.getElementById("cortex-plugin-root"); + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + const root = createRoot(container!); + root.render(); +}); diff --git a/plugins/gitlab-issues-plugin/src/typings.d.ts b/plugins/gitlab-issues-plugin/src/typings.d.ts new file mode 100644 index 0000000..1a3dd3c --- /dev/null +++ b/plugins/gitlab-issues-plugin/src/typings.d.ts @@ -0,0 +1,4 @@ +declare module "*.svg" { + const content: any; + export default content; +} diff --git a/plugins/gitlab-issues-plugin/tsconfig.json b/plugins/gitlab-issues-plugin/tsconfig.json new file mode 100644 index 0000000..da7c975 --- /dev/null +++ b/plugins/gitlab-issues-plugin/tsconfig.json @@ -0,0 +1,16 @@ +{ + "compilerOptions": { + "allowSyntheticDefaultImports": true, + "experimentalDecorators": true, + "jsx": "react-jsx", + "moduleResolution": "node", + "noImplicitAny": false, + "noUnusedLocals": true, + "noUnusedParameters": true, + "outDir": "dist", + "removeComments": true, + "strictNullChecks": true, + "target": "es6", + "typeRoots": ["./node_modules/@types"] + } +} diff --git a/plugins/gitlab-issues-plugin/webpack.config.js b/plugins/gitlab-issues-plugin/webpack.config.js new file mode 100644 index 0000000..851c75f --- /dev/null +++ b/plugins/gitlab-issues-plugin/webpack.config.js @@ -0,0 +1,69 @@ +const HtmlWebpackPlugin = require("html-webpack-plugin"); +const InlineChunkHtmlPlugin = require("react-dev-utils/InlineChunkHtmlPlugin"); +const TerserPlugin = require("terser-webpack-plugin"); +const path = require("path"); + +module.exports = (env, argv) => ({ + mode: argv.mode === "production" ? "production" : "development", + + entry: { + ui: "./src/index.tsx", // The entry point for your UI plugin + }, + + module: { + rules: [ + // Converts TypeScript code to JavaScript + { test: /\.tsx?$/, use: "ts-loader", exclude: /node_modules/ }, + + // Enables including CSS by doing "import './file.css'" in your TypeScript code + { test: /\.css$/, use: ["style-loader", { loader: "css-loader" }] }, + + // Allows you to use "<%= require('./file.svg') %>" in your HTML code to get a data URI + { test: /\.(png|jpg|gif|webp|svg)$/, loader: "url-loader" }, + ], + }, + + // minify the code + optimization: { + minimize: true, + minimizer: [ + new TerserPlugin({ + terserOptions: { + output: { + // make sure emojis don't get mangled 🙂 + ascii_only: true, + }, + }, + }), + ], + usedExports: true, + }, + + // Webpack tries these extensions for you if you omit the extension, like "import './file'" + resolve: { extensions: [".tsx", ".ts", ".jsx", ".js"] }, + + output: { + filename: "[name].js", + path: path.resolve(__dirname, "dist"), // Compile into a folder named "dist" + publicPath: "", + }, + + // Tells Webpack to generate "ui.html" and to inline "ui.ts" into it + plugins: [ + new HtmlWebpackPlugin({ + template: "./src/index.html", + filename: "ui.html", + chunks: ["ui"], + cache: false, + }), + new InlineChunkHtmlPlugin(HtmlWebpackPlugin, [/ui/]), + ], + + devServer: { + compress: true, + port: 9000, + static: { + directory: path.join(__dirname, "dist"), + }, + }, +}); From 3621babb3cb587a7040aca9d8fb4f00f279bcc5c Mon Sep 17 00:00:00 2001 From: Fernando Cremer Date: Mon, 14 Aug 2023 15:51:37 -0400 Subject: [PATCH 02/38] First commit of plugin, still needs work --- plugins/gitlab-issues-plugin/jest.config.js | 4 +- plugins/gitlab-issues-plugin/package.json | 2 +- .../src/components/App.tsx | 15 +- .../src/components/Issues.tsx | 102 ++++ plugins/gitlab-issues-plugin/tsconfig.json | 2 +- yarn.lock | 554 +++++++++++++++++- 6 files changed, 662 insertions(+), 17 deletions(-) create mode 100644 plugins/gitlab-issues-plugin/src/components/Issues.tsx diff --git a/plugins/gitlab-issues-plugin/jest.config.js b/plugins/gitlab-issues-plugin/jest.config.js index e7fb0cf..e7cc6d7 100644 --- a/plugins/gitlab-issues-plugin/jest.config.js +++ b/plugins/gitlab-issues-plugin/jest.config.js @@ -6,9 +6,9 @@ module.exports = { // map style asset imports to a stub file under the assumption they are not important to our tests "\\.(css|less)$": "/__mocks__/styleMock.js", "@cortexapps/plugin-core/components": - "/node_modules/@cortexapps/plugin-core/dist/components.cjs.js", + "/../../node_modules/@cortexapps/plugin-core/dist/components.cjs.js", "@cortexapps/plugin-core": - "/node_modules/@cortexapps/plugin-core/dist/index.cjs.js", + "/../../node_modules/@cortexapps/plugin-core/dist/index.cjs.js", }, setupFilesAfterEnv: ["/setupTests.ts"], testEnvironment: "jsdom", diff --git a/plugins/gitlab-issues-plugin/package.json b/plugins/gitlab-issues-plugin/package.json index 66e8b78..e6a7d8c 100644 --- a/plugins/gitlab-issues-plugin/package.json +++ b/plugins/gitlab-issues-plugin/package.json @@ -1,5 +1,5 @@ { - "name": "GitLab Issues Plugin", + "name": "GitLabIssuesPlugin", "version": "0.1.0", "license": "MIT", "dependencies": { diff --git a/plugins/gitlab-issues-plugin/src/components/App.tsx b/plugins/gitlab-issues-plugin/src/components/App.tsx index cc54cbb..c82875d 100644 --- a/plugins/gitlab-issues-plugin/src/components/App.tsx +++ b/plugins/gitlab-issues-plugin/src/components/App.tsx @@ -1,23 +1,14 @@ import type React from "react"; -import { - Logo, - PluginProvider, - Stack, - Title, -} from "@cortexapps/plugin-core/components"; +import { PluginProvider } from "@cortexapps/plugin-core/components"; import "../baseStyles.css"; import ErrorBoundary from "./ErrorBoundary"; -import PluginContext from "./PluginContext"; +import Issues from "./Issues"; const App: React.FC = () => { return ( - - - My Awesome Cortex Plugin - - + ); diff --git a/plugins/gitlab-issues-plugin/src/components/Issues.tsx b/plugins/gitlab-issues-plugin/src/components/Issues.tsx new file mode 100644 index 0000000..f00b103 --- /dev/null +++ b/plugins/gitlab-issues-plugin/src/components/Issues.tsx @@ -0,0 +1,102 @@ +import React from "react"; +import { CortexApi } from "@cortexapps/plugin-core"; +import { + SimpleTable, + Box, + Text, + usePluginContext, +} from "@cortexapps/plugin-core/components"; +import "../baseStyles.css"; + +// Set your Gitlab url. Cloud is https://gitlab.com +const glURL = `https://gitlab.com/`; +let hasGitLab: boolean = false; +// function to get Cortex API Basepath +const Issues: React.FC = () => { + const context = usePluginContext(); + const [posts, setPosts] = React.useState([]); + React.useEffect(() => { + const fetchData = async (): Promise => { + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + const cortexTag = context.entity!.tag; + const cortexURL = context.apiBaseUrl; + const result = await fetch(`${cortexURL}/catalog/${cortexTag}/openapi`); + const resultJson = await result.json(); + if (resultJson.info?.["x-cortex-git"].gitlab.repository !== undefined) { + hasGitLab = true; + // If we have a GitHub tag, we assume there is a repo defined, let's get the value + const glRepo: string = + resultJson.info["x-cortex-git"].gitlab.repository; + // const encodedRepo = encodeURI(glRepo); + const encodedRepo = glRepo.replace("/", "%2F"); + // Let's check if we have a basepath defined, to check for mono repo + if (resultJson.info["x-cortex-git"].gitlab.basepath !== undefined) { + // we are going to assume that each service is being tracked via labels + const url: string = `${glURL}api/v4/projects/${encodedRepo}/issues?labels=${cortexTag}`; + const iResult = await fetch(url); + const jResult = await iResult.json(); + setPosts(jResult); + } else { + const apiURL = `${glURL}api/v4/projects/${encodedRepo}/issues`; + const iResult = await CortexApi.proxyFetch(apiURL); + const jResult = await iResult.json(); + setPosts(jResult); + } + } + }; + void fetchData(); + }, []); + + const config = { + columns: [ + { + Cell: (number: string) => ( + + {number} + + ), + accessor: "iid", + id: "iid", + title: "Number", + width: "10%", + }, + { + Cell: (title: string) => ( + + {title} + + ), + accessor: "title", + id: "title", + title: "Short Description", + width: "65%", + }, + { + Cell: (state: string) => ( + + {state} + + ), + accessor: "state", + id: "state", + title: "State", + }, + ], + }; + + if (hasGitLab) { + return ; + } else { + return ( + + + This service does not have a GitLab Repo defined in the Service YAML + or the GitLab Access Token does not have access to the repository + specified. + + + ); + } +}; + +export default Issues; diff --git a/plugins/gitlab-issues-plugin/tsconfig.json b/plugins/gitlab-issues-plugin/tsconfig.json index da7c975..0e2d2cf 100644 --- a/plugins/gitlab-issues-plugin/tsconfig.json +++ b/plugins/gitlab-issues-plugin/tsconfig.json @@ -11,6 +11,6 @@ "removeComments": true, "strictNullChecks": true, "target": "es6", - "typeRoots": ["./node_modules/@types"] + "typeRoots": ["../../node_modules/@types", "./node_modules/@types"], } } diff --git a/yarn.lock b/yarn.lock index d80fe7f..0e30b43 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1045,6 +1045,22 @@ resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== +"@cortexapps/plugin-core@^2.0.0": + version "2.1.2" + resolved "https://registry.yarnpkg.com/@cortexapps/plugin-core/-/plugin-core-2.1.2.tgz#9e53f7caa9f946cafd7bd526aacdd1f8f079eeb2" + integrity sha512-agcD4NfGsKe4lb2+posZOtadNhKN/qaRbtkOukqDponitOfEuunjMVVqNc2Kyfcnf5XghS2CnVzv+TI3cYugNA== + dependencies: + "@phosphor-icons/react" "2.0.9" + bootstrap "^5.2.3" + classnames "^2.3.2" + lodash "^4.17.21" + react-keyed-flatten-children "^1.3.0" + react-modal-image "^2.6.0" + react-select "^5.7.3" + react-syntax-highlighter "^15.5.0" + react-toggle "^4.1.3" + reactstrap "^9.2.0" + "@cortexapps/plugin-core@^2.1.0": version "2.1.1" resolved "https://registry.yarnpkg.com/@cortexapps/plugin-core/-/plugin-core-2.1.1.tgz#d51fe6270a30a9e59a0c0f9aa851d8f113a3adc9" @@ -1245,6 +1261,18 @@ jest-util "^29.6.1" slash "^3.0.0" +"@jest/console@^29.6.2": + version "29.6.2" + resolved "https://registry.yarnpkg.com/@jest/console/-/console-29.6.2.tgz#bf1d4101347c23e07c029a1b1ae07d550f5cc541" + integrity sha512-0N0yZof5hi44HAR2pPS+ikJ3nzKNoZdVu8FffRf3wy47I7Dm7etk/3KetMdRUqzVd16V4O2m2ISpNTbnIuqy1w== + dependencies: + "@jest/types" "^29.6.1" + "@types/node" "*" + chalk "^4.0.0" + jest-message-util "^29.6.2" + jest-util "^29.6.2" + slash "^3.0.0" + "@jest/core@^29.6.1": version "29.6.1" resolved "https://registry.yarnpkg.com/@jest/core/-/core-29.6.1.tgz#fac0d9ddf320490c93356ba201451825231e95f6" @@ -1279,6 +1307,40 @@ slash "^3.0.0" strip-ansi "^6.0.0" +"@jest/core@^29.6.2": + version "29.6.2" + resolved "https://registry.yarnpkg.com/@jest/core/-/core-29.6.2.tgz#6f2d1dbe8aa0265fcd4fb8082ae1952f148209c8" + integrity sha512-Oj+5B+sDMiMWLhPFF+4/DvHOf+U10rgvCLGPHP8Xlsy/7QxS51aU/eBngudHlJXnaWD5EohAgJ4js+T6pa+zOg== + dependencies: + "@jest/console" "^29.6.2" + "@jest/reporters" "^29.6.2" + "@jest/test-result" "^29.6.2" + "@jest/transform" "^29.6.2" + "@jest/types" "^29.6.1" + "@types/node" "*" + ansi-escapes "^4.2.1" + chalk "^4.0.0" + ci-info "^3.2.0" + exit "^0.1.2" + graceful-fs "^4.2.9" + jest-changed-files "^29.5.0" + jest-config "^29.6.2" + jest-haste-map "^29.6.2" + jest-message-util "^29.6.2" + jest-regex-util "^29.4.3" + jest-resolve "^29.6.2" + jest-resolve-dependencies "^29.6.2" + jest-runner "^29.6.2" + jest-runtime "^29.6.2" + jest-snapshot "^29.6.2" + jest-util "^29.6.2" + jest-validate "^29.6.2" + jest-watcher "^29.6.2" + micromatch "^4.0.4" + pretty-format "^29.6.2" + slash "^3.0.0" + strip-ansi "^6.0.0" + "@jest/environment@^29.6.1": version "29.6.1" resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-29.6.1.tgz#ee358fff2f68168394b4a50f18c68278a21fe82f" @@ -1289,6 +1351,16 @@ "@types/node" "*" jest-mock "^29.6.1" +"@jest/environment@^29.6.2": + version "29.6.2" + resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-29.6.2.tgz#794c0f769d85e7553439d107d3f43186dc6874a9" + integrity sha512-AEcW43C7huGd/vogTddNNTDRpO6vQ2zaQNrttvWV18ArBx9Z56h7BIsXkNFJVOO4/kblWEQz30ckw0+L3izc+Q== + dependencies: + "@jest/fake-timers" "^29.6.2" + "@jest/types" "^29.6.1" + "@types/node" "*" + jest-mock "^29.6.2" + "@jest/expect-utils@^29.6.1": version "29.6.1" resolved "https://registry.yarnpkg.com/@jest/expect-utils/-/expect-utils-29.6.1.tgz#ab83b27a15cdd203fe5f68230ea22767d5c3acc5" @@ -1296,6 +1368,13 @@ dependencies: jest-get-type "^29.4.3" +"@jest/expect-utils@^29.6.2": + version "29.6.2" + resolved "https://registry.yarnpkg.com/@jest/expect-utils/-/expect-utils-29.6.2.tgz#1b97f290d0185d264dd9fdec7567a14a38a90534" + integrity sha512-6zIhM8go3RV2IG4aIZaZbxwpOzz3ZiM23oxAlkquOIole+G6TrbeXnykxWYlqF7kz2HlBjdKtca20x9atkEQYg== + dependencies: + jest-get-type "^29.4.3" + "@jest/expect@^29.6.1": version "29.6.1" resolved "https://registry.yarnpkg.com/@jest/expect/-/expect-29.6.1.tgz#fef18265188f6a97601f1ea0a2912d81a85b4657" @@ -1304,6 +1383,14 @@ expect "^29.6.1" jest-snapshot "^29.6.1" +"@jest/expect@^29.6.2": + version "29.6.2" + resolved "https://registry.yarnpkg.com/@jest/expect/-/expect-29.6.2.tgz#5a2ad58bb345165d9ce0a1845bbf873c480a4b28" + integrity sha512-m6DrEJxVKjkELTVAztTLyS/7C92Y2b0VYqmDROYKLLALHn8T/04yPs70NADUYPrV3ruI+H3J0iUIuhkjp7vkfg== + dependencies: + expect "^29.6.2" + jest-snapshot "^29.6.2" + "@jest/fake-timers@^29.6.1": version "29.6.1" resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-29.6.1.tgz#c773efddbc61e1d2efcccac008139f621de57c69" @@ -1316,6 +1403,18 @@ jest-mock "^29.6.1" jest-util "^29.6.1" +"@jest/fake-timers@^29.6.2": + version "29.6.2" + resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-29.6.2.tgz#fe9d43c5e4b1b901168fe6f46f861b3e652a2df4" + integrity sha512-euZDmIlWjm1Z0lJ1D0f7a0/y5Kh/koLFMUBE5SUYWrmy8oNhJpbTBDAP6CxKnadcMLDoDf4waRYCe35cH6G6PA== + dependencies: + "@jest/types" "^29.6.1" + "@sinonjs/fake-timers" "^10.0.2" + "@types/node" "*" + jest-message-util "^29.6.2" + jest-mock "^29.6.2" + jest-util "^29.6.2" + "@jest/globals@^29.6.1": version "29.6.1" resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-29.6.1.tgz#c8a8923e05efd757308082cc22893d82b8aa138f" @@ -1326,6 +1425,16 @@ "@jest/types" "^29.6.1" jest-mock "^29.6.1" +"@jest/globals@^29.6.2": + version "29.6.2" + resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-29.6.2.tgz#74af81b9249122cc46f1eb25793617eec69bf21a" + integrity sha512-cjuJmNDjs6aMijCmSa1g2TNG4Lby/AeU7/02VtpW+SLcZXzOLK2GpN2nLqcFjmhy3B3AoPeQVx7BnyOf681bAw== + dependencies: + "@jest/environment" "^29.6.2" + "@jest/expect" "^29.6.2" + "@jest/types" "^29.6.1" + jest-mock "^29.6.2" + "@jest/reporters@^29.6.1": version "29.6.1" resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-29.6.1.tgz#3325a89c9ead3cf97ad93df3a427549d16179863" @@ -1356,6 +1465,36 @@ strip-ansi "^6.0.0" v8-to-istanbul "^9.0.1" +"@jest/reporters@^29.6.2": + version "29.6.2" + resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-29.6.2.tgz#524afe1d76da33d31309c2c4a2c8062d0c48780a" + integrity sha512-sWtijrvIav8LgfJZlrGCdN0nP2EWbakglJY49J1Y5QihcQLfy7ovyxxjJBRXMNltgt4uPtEcFmIMbVshEDfFWw== + dependencies: + "@bcoe/v8-coverage" "^0.2.3" + "@jest/console" "^29.6.2" + "@jest/test-result" "^29.6.2" + "@jest/transform" "^29.6.2" + "@jest/types" "^29.6.1" + "@jridgewell/trace-mapping" "^0.3.18" + "@types/node" "*" + chalk "^4.0.0" + collect-v8-coverage "^1.0.0" + exit "^0.1.2" + glob "^7.1.3" + graceful-fs "^4.2.9" + istanbul-lib-coverage "^3.0.0" + istanbul-lib-instrument "^5.1.0" + istanbul-lib-report "^3.0.0" + istanbul-lib-source-maps "^4.0.0" + istanbul-reports "^3.1.3" + jest-message-util "^29.6.2" + jest-util "^29.6.2" + jest-worker "^29.6.2" + slash "^3.0.0" + string-length "^4.0.1" + strip-ansi "^6.0.0" + v8-to-istanbul "^9.0.1" + "@jest/schemas@^29.6.0": version "29.6.0" resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-29.6.0.tgz#0f4cb2c8e3dca80c135507ba5635a4fd755b0040" @@ -1382,6 +1521,16 @@ "@types/istanbul-lib-coverage" "^2.0.0" collect-v8-coverage "^1.0.0" +"@jest/test-result@^29.6.2": + version "29.6.2" + resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-29.6.2.tgz#fdd11583cd1608e4db3114e8f0cce277bf7a32ed" + integrity sha512-3VKFXzcV42EYhMCsJQURptSqnyjqCGbtLuX5Xxb6Pm6gUf1wIRIl+mandIRGJyWKgNKYF9cnstti6Ls5ekduqw== + dependencies: + "@jest/console" "^29.6.2" + "@jest/types" "^29.6.1" + "@types/istanbul-lib-coverage" "^2.0.0" + collect-v8-coverage "^1.0.0" + "@jest/test-sequencer@^29.6.1": version "29.6.1" resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-29.6.1.tgz#e3e582ee074dd24ea9687d7d1aaf05ee3a9b068e" @@ -1392,6 +1541,16 @@ jest-haste-map "^29.6.1" slash "^3.0.0" +"@jest/test-sequencer@^29.6.2": + version "29.6.2" + resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-29.6.2.tgz#585eff07a68dd75225a7eacf319780cb9f6b9bf4" + integrity sha512-GVYi6PfPwVejO7slw6IDO0qKVum5jtrJ3KoLGbgBWyr2qr4GaxFV6su+ZAjdTX75Sr1DkMFRk09r2ZVa+wtCGw== + dependencies: + "@jest/test-result" "^29.6.2" + graceful-fs "^4.2.9" + jest-haste-map "^29.6.2" + slash "^3.0.0" + "@jest/transform@^29.6.1": version "29.6.1" resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-29.6.1.tgz#acb5606019a197cb99beda3c05404b851f441c92" @@ -1413,6 +1572,27 @@ slash "^3.0.0" write-file-atomic "^4.0.2" +"@jest/transform@^29.6.2": + version "29.6.2" + resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-29.6.2.tgz#522901ebbb211af08835bc3bcdf765ab778094e3" + integrity sha512-ZqCqEISr58Ce3U+buNFJYUktLJZOggfyvR+bZMaiV1e8B1SIvJbwZMrYz3gx/KAPn9EXmOmN+uB08yLCjWkQQg== + dependencies: + "@babel/core" "^7.11.6" + "@jest/types" "^29.6.1" + "@jridgewell/trace-mapping" "^0.3.18" + babel-plugin-istanbul "^6.1.1" + chalk "^4.0.0" + convert-source-map "^2.0.0" + fast-json-stable-stringify "^2.1.0" + graceful-fs "^4.2.9" + jest-haste-map "^29.6.2" + jest-regex-util "^29.4.3" + jest-util "^29.6.2" + micromatch "^4.0.4" + pirates "^4.0.4" + slash "^3.0.0" + write-file-atomic "^4.0.2" + "@jest/types@^29.6.1": version "29.6.1" resolved "https://registry.yarnpkg.com/@jest/types/-/types-29.6.1.tgz#ae79080278acff0a6af5eb49d063385aaa897bf2" @@ -1496,6 +1676,11 @@ "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" +"@phosphor-icons/react@2.0.9": + version "2.0.9" + resolved "https://registry.yarnpkg.com/@phosphor-icons/react/-/react-2.0.9.tgz#9b720dfe35ed9cb75fa0c59921bbc98acf483b45" + integrity sha512-/dtQ0M9MXAr35wy8zPlwF684EvYRvGWZPAv+Bd0BR4vzIhjzfLBdHSovFxSP1rj3UOHvVR08qgRL04Kv90oqHA== + "@phosphor-icons/react@^2.0.9": version "2.0.10" resolved "https://registry.yarnpkg.com/@phosphor-icons/react/-/react-2.0.10.tgz#dcf2f6dabd42bf9156be38caf59d4c818af2b817" @@ -2401,6 +2586,19 @@ babel-jest@^29.5.0, babel-jest@^29.6.1: graceful-fs "^4.2.9" slash "^3.0.0" +babel-jest@^29.6.2: + version "29.6.2" + resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-29.6.2.tgz#cada0a59e07f5acaeb11cbae7e3ba92aec9c1126" + integrity sha512-BYCzImLos6J3BH/+HvUCHG1dTf2MzmAB4jaVxHV+29RZLjR29XuYTmsf2sdDwkrb+FczkGo3kOhE7ga6sI0P4A== + dependencies: + "@jest/transform" "^29.6.2" + "@types/babel__core" "^7.1.14" + babel-plugin-istanbul "^6.1.1" + babel-preset-jest "^29.5.0" + chalk "^4.0.0" + graceful-fs "^4.2.9" + slash "^3.0.0" + babel-plugin-istanbul@^6.1.1: version "6.1.1" resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz#fa88ec59232fd9b4e36dbbc540a8ec9a9b47da73" @@ -3018,6 +3216,11 @@ dedent@^0.7.0: resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c" integrity sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA== +dedent@^1.0.0: + version "1.5.1" + resolved "https://registry.yarnpkg.com/dedent/-/dedent-1.5.1.tgz#4f3fc94c8b711e9bb2800d185cd6ad20f2a90aff" + integrity sha512-+LxW+KLWxu3HW3M2w2ympwtqPrqYRzU8fqi6Fhd18fBALe15blJPI/I4+UHveMVG6lJqB4JNd4UG0S5cnVHwIg== + deep-equal@^2.0.5: version "2.2.2" resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-2.2.2.tgz#9b2635da569a13ba8e1cc159c2f744071b115daa" @@ -3695,6 +3898,18 @@ expect@^29.0.0, expect@^29.6.1: jest-message-util "^29.6.1" jest-util "^29.6.1" +expect@^29.6.2: + version "29.6.2" + resolved "https://registry.yarnpkg.com/expect/-/expect-29.6.2.tgz#7b08e83eba18ddc4a2cf62b5f2d1918f5cd84521" + integrity sha512-iAErsLxJ8C+S02QbLAwgSGSezLQK+XXRDt8IuFXFpwCNw2ECmzZSmjKcCaFVp5VRMk+WAvz6h6jokzEzBFZEuA== + dependencies: + "@jest/expect-utils" "^29.6.2" + "@types/node" "*" + jest-get-type "^29.4.3" + jest-matcher-utils "^29.6.2" + jest-message-util "^29.6.2" + jest-util "^29.6.2" + express@^4.17.3: version "4.18.2" resolved "https://registry.yarnpkg.com/express/-/express-4.18.2.tgz#3fabe08296e930c796c19e3c516979386ba9fd59" @@ -4760,6 +4975,32 @@ jest-circus@^29.6.1: slash "^3.0.0" stack-utils "^2.0.3" +jest-circus@^29.6.2: + version "29.6.2" + resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-29.6.2.tgz#1e6ffca60151ac66cad63fce34f443f6b5bb4258" + integrity sha512-G9mN+KOYIUe2sB9kpJkO9Bk18J4dTDArNFPwoZ7WKHKel55eKIS/u2bLthxgojwlf9NLCVQfgzM/WsOVvoC6Fw== + dependencies: + "@jest/environment" "^29.6.2" + "@jest/expect" "^29.6.2" + "@jest/test-result" "^29.6.2" + "@jest/types" "^29.6.1" + "@types/node" "*" + chalk "^4.0.0" + co "^4.6.0" + dedent "^1.0.0" + is-generator-fn "^2.0.0" + jest-each "^29.6.2" + jest-matcher-utils "^29.6.2" + jest-message-util "^29.6.2" + jest-runtime "^29.6.2" + jest-snapshot "^29.6.2" + jest-util "^29.6.2" + p-limit "^3.1.0" + pretty-format "^29.6.2" + pure-rand "^6.0.0" + slash "^3.0.0" + stack-utils "^2.0.3" + jest-cli@^29.6.1: version "29.6.1" resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-29.6.1.tgz#99d9afa7449538221c71f358f0fdd3e9c6e89f72" @@ -4778,6 +5019,24 @@ jest-cli@^29.6.1: prompts "^2.0.1" yargs "^17.3.1" +jest-cli@^29.6.2: + version "29.6.2" + resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-29.6.2.tgz#edb381763398d1a292cd1b636a98bfa5644b8fda" + integrity sha512-TT6O247v6dCEX2UGHGyflMpxhnrL0DNqP2fRTKYm3nJJpCTfXX3GCMQPGFjXDoj0i5/Blp3jriKXFgdfmbYB6Q== + dependencies: + "@jest/core" "^29.6.2" + "@jest/test-result" "^29.6.2" + "@jest/types" "^29.6.1" + chalk "^4.0.0" + exit "^0.1.2" + graceful-fs "^4.2.9" + import-local "^3.0.2" + jest-config "^29.6.2" + jest-util "^29.6.2" + jest-validate "^29.6.2" + prompts "^2.0.1" + yargs "^17.3.1" + jest-config@^29.6.1: version "29.6.1" resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-29.6.1.tgz#d785344509065d53a238224c6cdc0ed8e2f2f0dd" @@ -4806,6 +5065,34 @@ jest-config@^29.6.1: slash "^3.0.0" strip-json-comments "^3.1.1" +jest-config@^29.6.2: + version "29.6.2" + resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-29.6.2.tgz#c68723f06b31ca5e63030686e604727d406cd7c3" + integrity sha512-VxwFOC8gkiJbuodG9CPtMRjBUNZEHxwfQXmIudSTzFWxaci3Qub1ddTRbFNQlD/zUeaifLndh/eDccFX4wCMQw== + dependencies: + "@babel/core" "^7.11.6" + "@jest/test-sequencer" "^29.6.2" + "@jest/types" "^29.6.1" + babel-jest "^29.6.2" + chalk "^4.0.0" + ci-info "^3.2.0" + deepmerge "^4.2.2" + glob "^7.1.3" + graceful-fs "^4.2.9" + jest-circus "^29.6.2" + jest-environment-node "^29.6.2" + jest-get-type "^29.4.3" + jest-regex-util "^29.4.3" + jest-resolve "^29.6.2" + jest-runner "^29.6.2" + jest-util "^29.6.2" + jest-validate "^29.6.2" + micromatch "^4.0.4" + parse-json "^5.2.0" + pretty-format "^29.6.2" + slash "^3.0.0" + strip-json-comments "^3.1.1" + jest-diff@^29.6.1: version "29.6.1" resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-29.6.1.tgz#13df6db0a89ee6ad93c747c75c85c70ba941e545" @@ -4816,6 +5103,16 @@ jest-diff@^29.6.1: jest-get-type "^29.4.3" pretty-format "^29.6.1" +jest-diff@^29.6.2: + version "29.6.2" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-29.6.2.tgz#c36001e5543e82a0805051d3ceac32e6825c1c46" + integrity sha512-t+ST7CB9GX5F2xKwhwCf0TAR17uNDiaPTZnVymP9lw0lssa9vG+AFyDZoeIHStU3WowFFwT+ky+er0WVl2yGhA== + dependencies: + chalk "^4.0.0" + diff-sequences "^29.4.3" + jest-get-type "^29.4.3" + pretty-format "^29.6.2" + jest-docblock@^29.4.3: version "29.4.3" resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-29.4.3.tgz#90505aa89514a1c7dceeac1123df79e414636ea8" @@ -4834,6 +5131,17 @@ jest-each@^29.6.1: jest-util "^29.6.1" pretty-format "^29.6.1" +jest-each@^29.6.2: + version "29.6.2" + resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-29.6.2.tgz#c9e4b340bcbe838c73adf46b76817b15712d02ce" + integrity sha512-MsrsqA0Ia99cIpABBc3izS1ZYoYfhIy0NNWqPSE0YXbQjwchyt6B1HD2khzyPe1WiJA7hbxXy77ZoUQxn8UlSw== + dependencies: + "@jest/types" "^29.6.1" + chalk "^4.0.0" + jest-get-type "^29.4.3" + jest-util "^29.6.2" + pretty-format "^29.6.2" + jest-environment-jsdom@^29.5.0: version "29.6.1" resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-29.6.1.tgz#480bce658aa31589309c82ca510351fd7c683bbb" @@ -4860,6 +5168,18 @@ jest-environment-node@^29.6.1: jest-mock "^29.6.1" jest-util "^29.6.1" +jest-environment-node@^29.6.2: + version "29.6.2" + resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-29.6.2.tgz#a9ea2cabff39b08eca14ccb32c8ceb924c8bb1ad" + integrity sha512-YGdFeZ3T9a+/612c5mTQIllvWkddPbYcN2v95ZH24oWMbGA4GGS2XdIF92QMhUhvrjjuQWYgUGW2zawOyH63MQ== + dependencies: + "@jest/environment" "^29.6.2" + "@jest/fake-timers" "^29.6.2" + "@jest/types" "^29.6.1" + "@types/node" "*" + jest-mock "^29.6.2" + jest-util "^29.6.2" + jest-get-type@^29.4.3: version "29.4.3" resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-29.4.3.tgz#1ab7a5207c995161100b5187159ca82dd48b3dd5" @@ -4884,6 +5204,25 @@ jest-haste-map@^29.6.1: optionalDependencies: fsevents "^2.3.2" +jest-haste-map@^29.6.2: + version "29.6.2" + resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-29.6.2.tgz#298c25ea5255cfad8b723179d4295cf3a50a70d1" + integrity sha512-+51XleTDAAysvU8rT6AnS1ZJ+WHVNqhj1k6nTvN2PYP+HjU3kqlaKQ1Lnw3NYW3bm2r8vq82X0Z1nDDHZMzHVA== + dependencies: + "@jest/types" "^29.6.1" + "@types/graceful-fs" "^4.1.3" + "@types/node" "*" + anymatch "^3.0.3" + fb-watchman "^2.0.0" + graceful-fs "^4.2.9" + jest-regex-util "^29.4.3" + jest-util "^29.6.2" + jest-worker "^29.6.2" + micromatch "^4.0.4" + walker "^1.0.8" + optionalDependencies: + fsevents "^2.3.2" + jest-leak-detector@^29.6.1: version "29.6.1" resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-29.6.1.tgz#66a902c81318e66e694df7d096a95466cb962f8e" @@ -4892,6 +5231,14 @@ jest-leak-detector@^29.6.1: jest-get-type "^29.4.3" pretty-format "^29.6.1" +jest-leak-detector@^29.6.2: + version "29.6.2" + resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-29.6.2.tgz#e2b307fee78cab091c37858a98c7e1d73cdf5b38" + integrity sha512-aNqYhfp5uYEO3tdWMb2bfWv6f0b4I0LOxVRpnRLAeque2uqOVVMLh6khnTcE2qJ5wAKop0HcreM1btoysD6bPQ== + dependencies: + jest-get-type "^29.4.3" + pretty-format "^29.6.2" + jest-matcher-utils@^29.6.1: version "29.6.1" resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-29.6.1.tgz#6c60075d84655d6300c5d5128f46531848160b53" @@ -4902,6 +5249,16 @@ jest-matcher-utils@^29.6.1: jest-get-type "^29.4.3" pretty-format "^29.6.1" +jest-matcher-utils@^29.6.2: + version "29.6.2" + resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-29.6.2.tgz#39de0be2baca7a64eacb27291f0bd834fea3a535" + integrity sha512-4LiAk3hSSobtomeIAzFTe+N8kL6z0JtF3n6I4fg29iIW7tt99R7ZcIFW34QkX+DuVrf+CUe6wuVOpm7ZKFJzZQ== + dependencies: + chalk "^4.0.0" + jest-diff "^29.6.2" + jest-get-type "^29.4.3" + pretty-format "^29.6.2" + jest-message-util@^29.6.1: version "29.6.1" resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-29.6.1.tgz#d0b21d87f117e1b9e165e24f245befd2ff34ff8d" @@ -4917,6 +5274,21 @@ jest-message-util@^29.6.1: slash "^3.0.0" stack-utils "^2.0.3" +jest-message-util@^29.6.2: + version "29.6.2" + resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-29.6.2.tgz#af7adc2209c552f3f5ae31e77cf0a261f23dc2bb" + integrity sha512-vnIGYEjoPSuRqV8W9t+Wow95SDp6KPX2Uf7EoeG9G99J2OVh7OSwpS4B6J0NfpEIpfkBNHlBZpA2rblEuEFhZQ== + dependencies: + "@babel/code-frame" "^7.12.13" + "@jest/types" "^29.6.1" + "@types/stack-utils" "^2.0.0" + chalk "^4.0.0" + graceful-fs "^4.2.9" + micromatch "^4.0.4" + pretty-format "^29.6.2" + slash "^3.0.0" + stack-utils "^2.0.3" + jest-mock@^29.6.1: version "29.6.1" resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-29.6.1.tgz#049ee26aea8cbf54c764af649070910607316517" @@ -4926,6 +5298,15 @@ jest-mock@^29.6.1: "@types/node" "*" jest-util "^29.6.1" +jest-mock@^29.6.2: + version "29.6.2" + resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-29.6.2.tgz#ef9c9b4d38c34a2ad61010a021866dad41ce5e00" + integrity sha512-hoSv3lb3byzdKfwqCuT6uTscan471GUECqgNYykg6ob0yiAw3zYc7OrPnI9Qv8Wwoa4lC7AZ9hyS4AiIx5U2zg== + dependencies: + "@jest/types" "^29.6.1" + "@types/node" "*" + jest-util "^29.6.2" + jest-pnp-resolver@^1.2.2: version "1.2.3" resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz#930b1546164d4ad5937d5540e711d4d38d4cad2e" @@ -4944,6 +5325,14 @@ jest-resolve-dependencies@^29.6.1: jest-regex-util "^29.4.3" jest-snapshot "^29.6.1" +jest-resolve-dependencies@^29.6.2: + version "29.6.2" + resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-29.6.2.tgz#36435269b6672c256bcc85fb384872c134cc4cf2" + integrity sha512-LGqjDWxg2fuQQm7ypDxduLu/m4+4Lb4gczc13v51VMZbVP5tSBILqVx8qfWcsdP8f0G7aIqByIALDB0R93yL+w== + dependencies: + jest-regex-util "^29.4.3" + jest-snapshot "^29.6.2" + jest-resolve@^29.6.1: version "29.6.1" resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-29.6.1.tgz#4c3324b993a85e300add2f8609f51b80ddea39ee" @@ -4959,6 +5348,21 @@ jest-resolve@^29.6.1: resolve.exports "^2.0.0" slash "^3.0.0" +jest-resolve@^29.6.2: + version "29.6.2" + resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-29.6.2.tgz#f18405fe4b50159b7b6d85e81f6a524d22afb838" + integrity sha512-G/iQUvZWI5e3SMFssc4ug4dH0aZiZpsDq9o1PtXTV1210Ztyb2+w+ZgQkB3iOiC5SmAEzJBOHWz6Hvrd+QnNPw== + dependencies: + chalk "^4.0.0" + graceful-fs "^4.2.9" + jest-haste-map "^29.6.2" + jest-pnp-resolver "^1.2.2" + jest-util "^29.6.2" + jest-validate "^29.6.2" + resolve "^1.20.0" + resolve.exports "^2.0.0" + slash "^3.0.0" + jest-runner@^29.6.1: version "29.6.1" resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-29.6.1.tgz#54557087e7972d345540d622ab5bfc3d8f34688c" @@ -4986,6 +5390,33 @@ jest-runner@^29.6.1: p-limit "^3.1.0" source-map-support "0.5.13" +jest-runner@^29.6.2: + version "29.6.2" + resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-29.6.2.tgz#89e8e32a8fef24781a7c4c49cd1cb6358ac7fc01" + integrity sha512-wXOT/a0EspYgfMiYHxwGLPCZfC0c38MivAlb2lMEAlwHINKemrttu1uSbcGbfDV31sFaPWnWJPmb2qXM8pqZ4w== + dependencies: + "@jest/console" "^29.6.2" + "@jest/environment" "^29.6.2" + "@jest/test-result" "^29.6.2" + "@jest/transform" "^29.6.2" + "@jest/types" "^29.6.1" + "@types/node" "*" + chalk "^4.0.0" + emittery "^0.13.1" + graceful-fs "^4.2.9" + jest-docblock "^29.4.3" + jest-environment-node "^29.6.2" + jest-haste-map "^29.6.2" + jest-leak-detector "^29.6.2" + jest-message-util "^29.6.2" + jest-resolve "^29.6.2" + jest-runtime "^29.6.2" + jest-util "^29.6.2" + jest-watcher "^29.6.2" + jest-worker "^29.6.2" + p-limit "^3.1.0" + source-map-support "0.5.13" + jest-runtime@^29.6.1: version "29.6.1" resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-29.6.1.tgz#8a0fc9274ef277f3d70ba19d238e64334958a0dc" @@ -5014,6 +5445,34 @@ jest-runtime@^29.6.1: slash "^3.0.0" strip-bom "^4.0.0" +jest-runtime@^29.6.2: + version "29.6.2" + resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-29.6.2.tgz#692f25e387f982e89ab83270e684a9786248e545" + integrity sha512-2X9dqK768KufGJyIeLmIzToDmsN0m7Iek8QNxRSI/2+iPFYHF0jTwlO3ftn7gdKd98G/VQw9XJCk77rbTGZnJg== + dependencies: + "@jest/environment" "^29.6.2" + "@jest/fake-timers" "^29.6.2" + "@jest/globals" "^29.6.2" + "@jest/source-map" "^29.6.0" + "@jest/test-result" "^29.6.2" + "@jest/transform" "^29.6.2" + "@jest/types" "^29.6.1" + "@types/node" "*" + chalk "^4.0.0" + cjs-module-lexer "^1.0.0" + collect-v8-coverage "^1.0.0" + glob "^7.1.3" + graceful-fs "^4.2.9" + jest-haste-map "^29.6.2" + jest-message-util "^29.6.2" + jest-mock "^29.6.2" + jest-regex-util "^29.4.3" + jest-resolve "^29.6.2" + jest-snapshot "^29.6.2" + jest-util "^29.6.2" + slash "^3.0.0" + strip-bom "^4.0.0" + jest-snapshot@^29.6.1: version "29.6.1" resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-29.6.1.tgz#0d083cb7de716d5d5cdbe80d598ed2fbafac0239" @@ -5041,6 +5500,32 @@ jest-snapshot@^29.6.1: pretty-format "^29.6.1" semver "^7.5.3" +jest-snapshot@^29.6.2: + version "29.6.2" + resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-29.6.2.tgz#9b431b561a83f2bdfe041e1cab8a6becdb01af9c" + integrity sha512-1OdjqvqmRdGNvWXr/YZHuyhh5DeaLp1p/F8Tht/MrMw4Kr1Uu/j4lRG+iKl1DAqUJDWxtQBMk41Lnf/JETYBRA== + dependencies: + "@babel/core" "^7.11.6" + "@babel/generator" "^7.7.2" + "@babel/plugin-syntax-jsx" "^7.7.2" + "@babel/plugin-syntax-typescript" "^7.7.2" + "@babel/types" "^7.3.3" + "@jest/expect-utils" "^29.6.2" + "@jest/transform" "^29.6.2" + "@jest/types" "^29.6.1" + babel-preset-current-node-syntax "^1.0.0" + chalk "^4.0.0" + expect "^29.6.2" + graceful-fs "^4.2.9" + jest-diff "^29.6.2" + jest-get-type "^29.4.3" + jest-matcher-utils "^29.6.2" + jest-message-util "^29.6.2" + jest-util "^29.6.2" + natural-compare "^1.4.0" + pretty-format "^29.6.2" + semver "^7.5.3" + jest-util@^29.6.1: version "29.6.1" resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-29.6.1.tgz#c9e29a87a6edbf1e39e6dee2b4689b8a146679cb" @@ -5053,6 +5538,18 @@ jest-util@^29.6.1: graceful-fs "^4.2.9" picomatch "^2.2.3" +jest-util@^29.6.2: + version "29.6.2" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-29.6.2.tgz#8a052df8fff2eebe446769fd88814521a517664d" + integrity sha512-3eX1qb6L88lJNCFlEADKOkjpXJQyZRiavX1INZ4tRnrBVr2COd3RgcTLyUiEXMNBlDU/cgYq6taUS0fExrWW4w== + dependencies: + "@jest/types" "^29.6.1" + "@types/node" "*" + chalk "^4.0.0" + ci-info "^3.2.0" + graceful-fs "^4.2.9" + picomatch "^2.2.3" + jest-validate@^29.6.1: version "29.6.1" resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-29.6.1.tgz#765e684af6e2c86dce950aebefbbcd4546d69f7b" @@ -5065,6 +5562,18 @@ jest-validate@^29.6.1: leven "^3.1.0" pretty-format "^29.6.1" +jest-validate@^29.6.2: + version "29.6.2" + resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-29.6.2.tgz#25d972af35b2415b83b1373baf1a47bb266c1082" + integrity sha512-vGz0yMN5fUFRRbpJDPwxMpgSXW1LDKROHfBopAvDcmD6s+B/s8WJrwi+4bfH4SdInBA5C3P3BI19dBtKzx1Arg== + dependencies: + "@jest/types" "^29.6.1" + camelcase "^6.2.0" + chalk "^4.0.0" + jest-get-type "^29.4.3" + leven "^3.1.0" + pretty-format "^29.6.2" + jest-watcher@^29.6.1: version "29.6.1" resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-29.6.1.tgz#7c0c43ddd52418af134c551c92c9ea31e5ec942e" @@ -5079,6 +5588,20 @@ jest-watcher@^29.6.1: jest-util "^29.6.1" string-length "^4.0.1" +jest-watcher@^29.6.2: + version "29.6.2" + resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-29.6.2.tgz#77c224674f0620d9f6643c4cfca186d8893ca088" + integrity sha512-GZitlqkMkhkefjfN/p3SJjrDaxPflqxEAv3/ik10OirZqJGYH5rPiIsgVcfof0Tdqg3shQGdEIxDBx+B4tuLzA== + dependencies: + "@jest/test-result" "^29.6.2" + "@jest/types" "^29.6.1" + "@types/node" "*" + ansi-escapes "^4.2.1" + chalk "^4.0.0" + emittery "^0.13.1" + jest-util "^29.6.2" + string-length "^4.0.1" + jest-worker@^27.4.5: version "27.5.1" resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-27.5.1.tgz#8d146f0900e8973b106b6f73cc1e9a8cb86f8db0" @@ -5098,6 +5621,26 @@ jest-worker@^29.6.1: merge-stream "^2.0.0" supports-color "^8.0.0" +jest-worker@^29.6.2: + version "29.6.2" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-29.6.2.tgz#682fbc4b6856ad0aa122a5403c6d048b83f3fb44" + integrity sha512-l3ccBOabTdkng8I/ORCkADz4eSMKejTYv1vB/Z83UiubqhC1oQ5Li6dWCyqOIvSifGjUBxuvxvlm6KGK2DtuAQ== + dependencies: + "@types/node" "*" + jest-util "^29.6.2" + merge-stream "^2.0.0" + supports-color "^8.0.0" + +jest@^29.5.0: + version "29.6.2" + resolved "https://registry.yarnpkg.com/jest/-/jest-29.6.2.tgz#3bd55b9fd46a161b2edbdf5f1d1bd0d1eab76c42" + integrity sha512-8eQg2mqFbaP7CwfsTpCxQ+sHzw1WuNWL5UUvjnWP4hx2riGz9fPSzYOaU5q8/GqWn1TfgZIVTqYJygbGbWAANg== + dependencies: + "@jest/core" "^29.6.2" + "@jest/types" "^29.6.1" + import-local "^3.0.2" + jest-cli "^29.6.2" + jest@^29.6.1: version "29.6.1" resolved "https://registry.yarnpkg.com/jest/-/jest-29.6.1.tgz#74be1cb719c3abe439f2d94aeb18e6540a5b02ad" @@ -6007,6 +6550,15 @@ pretty-format@^29.0.0, pretty-format@^29.6.1: ansi-styles "^5.0.0" react-is "^18.0.0" +pretty-format@^29.6.2: + version "29.6.2" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.6.2.tgz#3d5829261a8a4d89d8b9769064b29c50ed486a47" + integrity sha512-1q0oC8eRveTg5nnBEWMXAU2qpv65Gnuf2eCQzSjxpWFkPaPARwqZZDGuNE0zPAZfTCHzIk3A8dIjwlQKKLphyg== + dependencies: + "@jest/schemas" "^29.6.0" + ansi-styles "^5.0.0" + react-is "^18.0.0" + prismjs@^1.27.0: version "1.29.0" resolved "https://registry.yarnpkg.com/prismjs/-/prismjs-1.29.0.tgz#f113555a8fa9b57c35e637bba27509dcf802dd12" @@ -6253,7 +6805,7 @@ reactstrap@9.1.9: react-popper "^2.2.4" react-transition-group "^4.4.2" -reactstrap@^9.1.9: +reactstrap@^9.1.9, reactstrap@^9.2.0: version "9.2.0" resolved "https://registry.yarnpkg.com/reactstrap/-/reactstrap-9.2.0.tgz#3bde2b2e39e91962676167ac60edea89f8584382" integrity sha512-WWLTEG00qYav0E55PorWHReYTkz5IqkVmQNy0h6U81yqjSp9fOLFGV5pYSVeAUz+yRhU/RTE0oAWy22zr6sOIw== From 6e7256dad96b0e334ebe4fe8aadbd519203f3c36 Mon Sep 17 00:00:00 2001 From: Fernando Cremer Date: Tue, 15 Aug 2023 11:14:42 -0400 Subject: [PATCH 03/38] Added Readme, issues now show in ascending order --- plugins/gitlab-issues-plugin/README.md | 39 +++++++++++++++++- .../img/gl-issues-cortex.png | Bin 0 -> 49196 bytes .../img/gl-no-repo-defined.png | Bin 0 -> 13718 bytes plugins/gitlab-issues-plugin/img/gl-proxy.png | Bin 0 -> 12774 bytes .../src/components/Issues.tsx | 2 +- 5 files changed, 39 insertions(+), 2 deletions(-) create mode 100644 plugins/gitlab-issues-plugin/img/gl-issues-cortex.png create mode 100644 plugins/gitlab-issues-plugin/img/gl-no-repo-defined.png create mode 100644 plugins/gitlab-issues-plugin/img/gl-proxy.png diff --git a/plugins/gitlab-issues-plugin/README.md b/plugins/gitlab-issues-plugin/README.md index d00a9ad..9dcc78b 100644 --- a/plugins/gitlab-issues-plugin/README.md +++ b/plugins/gitlab-issues-plugin/README.md @@ -1,4 +1,41 @@ -# GitLab Issues Plugin +# GitLab Issues Cortex Plugin + +View GitLab Issues associated to your services! + +
+ +The GitLab Issues shows the open GitLab issues associated to the GitLab repository specified in the entity's `cortex.yaml`. If the `cortex.yaml` has a `basepath` defined in its `x-cortex-git` configuration, it will query for issues filtering by a label that matches the tag of the entity. + +## Setup + +This plugin requires a proxy to GitLab. The API that the plugin uses is documented [here](https://docs.gitlab.com/ee/api/issues.html), which details the type of headers you need defined. + +- Define a secret that contains your GitLab Access Token. To determine which type of token to use, check the [docs](https://docs.gitlab.com/ee/api/rest/index.html#authentication). +- Define a proxy that is pointed to your GitHub instance with the headers mentioned in the docs. Here is a screenshot of how your proxy may look like: +
+ +- Register the plugin. + - This plan will not work on the Global context. + - Select the entity that will have the GitHub repo in its `cortex.yaml` + +## Troubleshooting + +### Getting a message that "This service does not have a GitLab Repo defined" + +If you get the following message: + +
+ +This means that the plugin did not find a GitHub repository defined as described [here](https://docs.cortex.io/docs/reference/integrations/github#catalog-descriptor). + +### Getting a generic error message + +If you are getting a generic "Oops! There was a runtime error" message, you may want to look the browser's console and track where the plugin is breaking down based on which `console.log` output is displayed in the console. + +Make sure that you use an Access Token created for the project, not the user. + +# Setting up your dev environment + GitLab Issues Plugin is a [Cortex](https://www.cortex.io/) plugin. To see how to run the plugin inside of Cortex, see [our docs](https://docs.cortex.io/docs/plugins). diff --git a/plugins/gitlab-issues-plugin/img/gl-issues-cortex.png b/plugins/gitlab-issues-plugin/img/gl-issues-cortex.png new file mode 100644 index 0000000000000000000000000000000000000000..b77efefc46de3e62df24cbe5b293aa31bcaf0b4f GIT binary patch literal 49196 zcmbTe1yo$wwl$0f4HDel-Q5WUcXue<-6d!e++7mfN#PD5!6mp9PH=aJztY|B-Fv&a z?;GQ1j2d;Qeb$z>*S0z5IUki3rC%fBBSJtxyq0+=;W9x_@AW|-W!m^z_Eqc z?fGzVO)<|B%uM_w^bem&(Z&Cww2H4%_g0N*{0$1;;^?$26Tb+`anI0DY!4EVqQ>mG zVxBT*^xR;Auh7@EBfl?^0WGI&l{QpDn9)*{-x?c~E>R*Xd4%t)_vh9RC3wA>;#Box zGci&F&+R7@Wm7rFQRnFtc;ubr5v7NU9L{r2;>e^CNanMwPd<(eyfT{NI87thM<@OX zw2{3roXfO3XinJ~N;t$N1R6gNQ%Hs2WNPIn0izu*jU=~LqfsMgK z=InM>5Y~e^p4QE9V5!M%?D^2zTGS|n44Jwl6NwX1OXyXVky8v|2IpirqapEVJ*DEF z(g5}JDwf9hWC^%zXj1Ts1#76RnQ@3eMJQ~0Q)#;a@Gcv0ZUy$Trn$C^g@OVEJ@^_P z0y4rH0tS2q3I5=NKM)Ym3E>cM;O{r!k7ORy|D?kBHDuQB8^zQlWMshKYGy9x z<_@k_j&4rYW#!tZYHE&_I3`g z{9Z!jf84uzZ&%)yA>B;QL!R+W_$->6R$H&6T&ce>l1ipjG)!V_%#EZ$nmEzA#{wE(v zb5}DLYbQ5rM+eg1`I?wIy1NOHlm9O0fB*ihr@5E)ze;j&{i|8v2D1E4VPRutW%=K{ z!KQ-0f8|%U_A587$tJ&ln6GWnNv6BkTHW3R~x?MpdB!1B69 z9{;mMu(?wtywlDMlMA^w?tfI~ubjIEGaXJ9UZ^Yttix-_@*k$nTrr{2VlQRw(j3IY z?t^{)BVKJ#eOW+ZbZ9BFjUn6L3}tl37}Y}&&hLZ}k`(Z;^Nln%WtHL|9YT7I@Nj99 zgr5;c!7@Fi=kt`V6;1ffsWRj7pQNEh%ki9d0jG{ z$8p*Hy3zOgh}~`H=l+bV7A)3|*v4qE&=xY$eKspx*zo1>&|%}6?LR^u97Rm;t8GHd zyuBP8H<_|K5HZVR-!>@5sC4Ht*9QL@T$7v^5mCH*AYvqei}*kpiCKC?1?{ofx=Y4v z&_e0hewlKx)XLLyuUl`Ufyd`kfJv`T+XHGUGnJJ>4Yx=S5$a#vz0|7NlU6E=k|#E( zF+|-SL=YqPNA}6RbUulPih=R)j~M7qD3lTjlrC?M`ZJ{B%->_NNDuVJntg9NEtQM> zK|bM>*15>VyzR%arwYL>^+&v0!=MoHQ|`}Jr=D+*$#n!V9LBIRz#>h4OjSi{VqhR4 zUnrq$QfN8FaC`Ka5A0y^oe{gk=^l<$6)!SBdx{L;0Z8^}z+s>;Qs2+<^Hg7DATcHH$md*uyF+d?#cDdO{!>ou7ujh)*|c1*-ulVN{zW8l+=_u zD32_LEl+5)7;*;jJ3|eQf#I#E zLx5XTO06)^3^(=K-rb%gfK@scWslT2e|vS@^_nyUuF#Evgs+)in5ros_0|3%jf<23 zBWAx0RAz5q|C7;1!KD?*_u6szt+_rDr(gGDx)A*LD10v2r>Fa4Odz#FMu|DLpNpq* z46zV>zI1HLtf4Q{CTdoQ4gIG!_kGRFh`I5*tTsk6Y8{Jul+EWzyDcn8!`B!-5OfBFvDA}(Oc}y`zyniLCaRNKWJ8c73z=q zrD+ou?N>KWJFX3Y89soNHDnW4)h!=(Ua(TPKH-8mKSTy!cs0 zId`6|U`U{=se=tlsDEd`P7HhOV7_*dw;PwjS2s^9Pf7Co4{4te- zokq#$(fI!UxN{{RgHvx`I9+;414*DLgdcuxrz>XJ1aP<`lji;^)-XakyE&i6iQDoz zZQtOS4;Xq9qRyN>YQDVXv#+8x+npa!nUglNJL}V)|KuicgP4WCh zNHelBnBP&~M?xXE;>ZXBRJeMI72t~HNE3TY7Aa&>qY7Qb$<{xBV?nJY=Htis(9o%% zSLEk6&;;1n7JdR*K9I!dCYg(j<`Qs9HTJ5idtq@^Z}9QU7Q}tGxK9NI1@*OBt%+x& zqEw!Z7q1QSkQWn`Yy`Jx1Uh0A(w9gCKCMcUOKr?!!DuCn%&L;M4SsMuau?gP&hXLF z%2OOpR`)b`&M@DtD{quJx0;$=aVpTs8Da6M9%P8EL`q3Ho`?E;*b7%O+aC4tO1bK^ zt)=s$b9mzEYegT}-lnehdBjoZU_siOdo&VrPeNWTsoq#-6`X`$2PrTgyLr@m1EUSk zQb#$UFKsS&`sr@>s=wrm;xD(xq!e3oMzT!YKdRg(`B;6qR(XukH;7q*y!X-0Rh^w< zxnChU=RdgO0$HAFAMhY`EYZh0BBU4&oy+cSEuW30;Ue&5T{#+N_SCa2FAd(%S!81AW6w%9Gs z?`0>)(|P;X#k!!Yz6N~%fDZINw@AjHZ+5lB<8{hw zyIGGcJE|QMW`KT$9M@nED(k=6oh+W7o7&FtRXl3m&f#o*IPL^*psG8{f+e)stbUU2 z&es;>x84tPjFm_i7~S37m6dP=D}oo`)as5qSymKoUS91-vU0l78w)VssUV7}~vTfEQ0D?r`ahk3U^0f=QpG)2|_hT{+_km^KRV zrxZtFj?$9&*?W4tq&oqX@=m5iv)L$Zod?MR zL}jva1RX&U_ZnCU%Le#F&HS_eTcVFHcHV93Z7W)Qd_F7PaEHe0-!RJGOfgB3+zM6W zAJx}*h8|>M6yMS6_Q?@H87(uu=5r}ZUp^jd5+qZtOs#ffAB79n?-ax&gZA7`I5zPi2>xB&zKFY9LId<3v1k$@-CtGWXPZP4k2d}krw5z0{BO@j3 z`A4w@F*Dv|Pao?%JW7?_bcabzo!WGtbX#jkXjmvENBEl$B*p`MEwb7O4Md%MwX-Ay zb)y^G8#~`3s@IgQ^sU@U4YseqlzrB!5_Du0?GD)RzrHE*Ten4Ki|k0ERI(eQ>C+@F zvw#_m0!?WK^lL4B{&m(ZnT+S@<=lpE=ymz?=FbyOvo?h5nK5(Dg>1;H*MN}>u8BJ9 z$%`^`AA_%&&Tl+eFJ1RhJqrV5qP)Hp2vn5>s>Q2RL_VEKc6KaNK(XLfxr6K*5sKQ< z*v!Ha4~$zKJ8q@IQAw(1KBMe`Pmk@hw(LunO<^tm-R^Iy;#sfJgJld_+*DGG{7%Dw zeeMhEKO!|m6&xcy(1Om?zZ&S^w(oW!2NTfV)uRNH)`XBS&SK!3!Q*@yeHyQJUzM&L zUVV02cVDqW?Z&Fh2XVtW)gbS?iNG)Kh$c0^uITI7^O?iCKXfyey^i4LXDw))tabs>(nwg~f;& z)L@^;v+O0o@4iRb`E*wiTY2@XndBdhhkSxgVbG?#-`;m~GF6({csQ1#dlr5zjcimW^OnoyOZ{oY+&{Nu=Ywo7*IbZHgpN)w;7wBy5;pkEK!b7RQjyCIpl z{jujg6w>($?>&Dczb8EYml9VH2pdfmDe9Tebz&bQs^}|GR)c&@a{kb|`50=i@&qdM z6d=6c>yvw&SW)BHpqWpnNX)|I$B?aS*F&1e>HGU8^bcM4B-=zf)cv7#&yQkd9-jvd zfsb-}Cyv)qyqEWSw_>x>SF25Tl~y`e@=3#iKT|e81Sv`lzA~%gemGis^bR6TeASuB z?+XXY%x&Fk%U;SNl}_zN0v0$S=`My*IwF)~mTocKc1FN zSjDJh)RJQ>Z#w?=btL;zsD+5MG1 zoX+sRiqRNO0W^33h{o~ZhFo1-wb<*&eNF>O1hxp-=WzsI07gs3Tx=02@r>f{@YM2G z#Yc3y`KQ<%)V3=IUo%Os!cx)G51I(zDn**;eLy}2H7ZSali&=m#{^3k(3x`Id<#QD zf)Y;i7iJq5WFEkM<$DXfqX_L%j>Kky(cxQaamOgYtJ3}|zBg5xZA* zof+(k4T<5K>hOhC?&zkpw%T^3K|;Arf%{L@Y_GDqrspG_(v=I5 z24U@ob3K5mHAo+qL0Ym{f9~*+OjA6Ts??E!Uy%);W0|{YZp=}hF^WvjTMpk7-AiDh z|JS=F3)%#S>uRn1Uoovwk3Qp9s07SgDsix(jOh|mtn};hK=qvi3al1GUy}@jnV3scVmif}xReY~Y27MDzc_HZ6A)w`6W zFI4IZ9yYVJQ^%IbwvxR=iWEq&u5)=)#5*)AjmTb^9vHh-w3kA2-k!jWu&#aIyaZL9?;iy&+Iv@ehchSq{Q; z_FHPxE>;DLa@XZK+^eK_N&Lr>gDE`h+^ED`Q&UE|1&y6s?r9d}fdQb!xTmKl)e3F4 zWQ}t$dQeWsjCLU=_Iuo{AKW3k7LccfeAeq{{^rDo$>@4v-dgM7;P#wl@954c9Z^+L zYwgw$WmrYx?nK4#o@gmNU}|2JA1yz1UwSF^(TB)u9JGIj=PwBXFGl#7e?K0}%Y7Im zegDL{l|11V}bJC4od)!QQ)Kd?aK2LjZwgDq2JwZ zvFaB|1TN3mT7RFlFq|n?h5}oD#NIha%bZ_$62Rd=IDte%)G(R8{*tvm>q6=;$qi6IzBO{+!h?4dBC|!OZ*Pf? z5JQ75?#8V-jNO(FYG(Y4udR-)t0Ixq?}J4bLy*qP@<3ljHq1RhPVTAn_dZPu)WQ5W z+%VS7{QVm-Aj`duM)?NwV`Ho7;Vl#T{t$P);<=Q4A1}#pX^Zu)n5>I?MFmBxx{sgp z`wzrL(J-{l5-ee|^mVGP@AGTRowiwB**bHXq}XLH`~1wG+q~vaH7XD_w>l?1fJBc^ z#$LpOj{X!=tOYG09M=jt-XaseF?n><-2qRgkh|;*?-aTYN;;k_(C6Q^bP@OPxXZ94 z4r*+_K0j=8Y7QDC?4evPUx`YwaJ(6sj5v?%{3=2d-RUkPrF@v27JPQR$V)NQNAIt> ztuZgfZ&h)f8v6$z9Onz`L=@C&Td3ufn9>_fP^?8Yv_B|_Ng<3{jS;D}*O`A64L;>e zroLCT4Lam_|9E#{xRLQgI4;bZ!Ku+yUgk5>UfxkOwxy?70J!g`-BG|U`$lLasac_| zVl!P6Vn{Skn3xc7-&vYd?I+e!jSvl7DzG zyZ^*mtgML`(>>n6-xTuXMsn4ck^Iy&GQv`0Z&P>rx}9m>{(cJA`nJQDS$z1-jnH>i zCjG9Cvq1)zSp(0~HC^1HkK6t0-6Zt#E=4q!Qf0=Aeg1yjPmz&o=O@NjKJqQ#nUFSZ5^jif2D6*^fJ7BD8*A9Dnx$ju z67|CoL67B@XX8lyBtVjwPIrjGeEk4OQm5U!=SO}Q03;n<&7#RKMlzT4$qNqd;Okw(CIPMh2qZS@C?o5kA%pbs~P zIBpE#cSkO9*yBNHTNtt8AZ;Oa2axSUxZbUTyoa@dTVd;;NJU3DF4Q7m_?r0-h0{T2 z1@+BF=dOTI-t)E#$Ap6iZp~&KuC42N0RhF=8XRzb0f*>hP3?l=GoLH#kLSbtuqyoz zl`)A9x{qOd4fe0oy#w_x341JAE8w>gJ+&t`am)hQ?2emjA?ZP{T+ztTK2%`IPerwo zeR$YRa;A&pDIsGhE5<%9?5GjgLocA0ne<6z2VdTMM(j4JaY$5YfkGNP zDF{i+j#a*nuu+>WBz8L=yvO}7&;tA=1@{yCwRaz`X4-5){O$hJ5*=>OSNEyYPt8js z3_(c8_>Xq;xN@(geC(u2{4Z24BTQy0bZjQfVLXU^57;iHaeH!?{mvD*IFSOspY#!= z3oo^LYLy0yJl*8uUxkSxKXn}}Hmm72*wNX}R%!IK4?`LN9*x;8{9E6`IH6H~Gw5Jl zL<+>rAq|xgc*;mv^hFh!*xaB{|M0;4C1!y60G$(W$E9~z@%+5{h1Z>J$w`}-PM?Wu zC$!lIn;;NJu`*VxrvYsz{aQ3MgA}iEzxP+CSKy-=%p0?4M%>zD4jSosp}BMR!#4AC z$;jdMG46Pi<{06EQZsr4w&(u@Qx_x@D&3ZaAVr3dXY>es+mL27( z9PTYjDh38dMcZ69!usstHwunb1tTnGw#Q4)bdcD?xWA!ls?&I#{{4xQb?Xzj&LZ*K5;q@+ky zG#rWD8!f0ykUNvxUeyR?-yV4P!3$~u)aqHCk&0m?wK25mqA@rS_c8ldqLOg@l~h-$ z!%~aRA^C{MO)!3=QXeNKE_+z;ni_3Wm00)Fs`jb*Wi+;5^9M5y9KU%RX55sp)+{nx zIHQ!z5YZOmg;M}q5#d*=OwbB85hS({0^3%pSP(3%jtKn8928Z9fab2Z1KR5N`*`#L zSPp-}Eyuc_)OX^YJ0x$9QFHdYA_J<9k;D15EpzhW+%HbonwO34&9|bc?W$v?XBz{f z8?;?IAeeu#r6PrIK z;Yi&~PfJvv^ugkEc~x$2c4yaKkl-1NEoLcNPKlAq1Hwgy!IaLM;pdPw-KI$#Y8;7f zW%gl=U%Pb@=fcI;ggE@TKA$60()LZ~5U7oM!z!Csxo2^|y#GwIi)9Jg5Jx(oiGN=bjIHuUDpCN?=dj11cAdMKMl;rc8fC3pPdu`ViJ9 zueGz$?;T!pZ~2R#AiSp}auX-IzZ``Un!^T}_?~me+)ch`l(yepjT1I(&-EK_hN97= zDO=-H!HFuj&0p19DyjwnX=kE8ac}K@WkTfyV&J2qva&N*VPN%t#)LmJ*2bpR?CqHRtsz;NkTD{@<06nJW&i1zPShF~FaQJvyAm{AsA6;<}&d&jp4Cv59;xge94+V0rv-k?kAAdtyM- zD)YB0W_U1h!zptaJ&r<4qnM>kLE#jF|7c#%aF@;N{AD zyX-gF5BF*fCa?LuK8N77h`~r*2y%PH1brNBV4EG+;q>u!6@5E9w3AN^+^l%IoDl$x z&bw$eZdZ^nck;nHc@pK8Pdcq?HaA7048Gmy>6o1+fT6J6Tm5x?lXl)}@!QgLH!+Mi zKE9`AtF8W>gm86dM8%(CfM&5Sjh;r}5TY0*;M({OAqh-kmNF8b>kCya@W8|#L^zoj z*e?>{LDDJV49%3X4RjJK=(H}h>obQAj$brk*6YE|=1 z7tBZ+1^hV%k${K%(jzWU#cw)(^+-33q(2dZMF6OQCuF-EEz_)*!bj0JU&9FFKAcFt zZ(@Xe#Y?`${s%DfH(|gk9^??WSxgR9FQE`^Ot9dV`Bf`m6w0)w&oH9;kHGqmdSm7V zS;AJ_9p!9+;eFnw+7$2f{3RQ(CP4#k|KfyMelaQ!^^>Xh&W{iQL(YH zr8la0WU>&v(8?evVvKj`QS)X(K#G?tEDG5Oue~%uPw>Z-@eeu3NmCFP9o@i2Hc;Ya z>schHos@lrdGeQP*N+Wp>jLaJ)@-;KQ+%oQ5U~1`#`W5a%r>7!URKTkiXk|BfNHt^ z;9>nwoeK^kYkpr?n%$=t(h$L>j@3EYcL$j-r8X%Cy(h*o1=79LuDEO{|>v*ZXK}fK;JI-X(nO|P&&3QUw1zFj_(WiNym%N!56bZvPAmyy0 zXBYlbi2mt~cge`Jlveuc!>7mu3~nYeaB7`uflFzvP0GG>8ZX@BeNJ4yN`FyX==5 z4=xo?h&bOu`X%pmwL=Z>I9Idi6~EN2#2Cg>v3(`;=r2{tsTv%lM}|fXf8s`e%UzKA zcSM|NTONFPsZz>a{!n09T2r-mgZxXbq+O+hL|HmZ;=KR-QpFswSAR0`K-YS|*h~Kp z(;Amg#5_p<#g^>1!t7L8>)_=;?aKb`uVQAx~8Vm`ntAHi?KivOHixglY^i34s- zPOrA8ydAuhC@CrXv-n&Ev3J&fRxX}Yt+T2AZAR)+pz0zWQ*h^BY~jceo<+WBx^x3N zzvx>&NN};1BRT&p7Q7T_@VEjjn(s>=lzHK zy11awKgXASJ}Hk)x8`CaQ$ac4r$sVp)Kv7;kX>Lv%0UrKmB=90F zD~l03l1dKL;zDr%C+l%2=jGM(Yb0|vIpTZ6->cm9v1{{O3$PZo>9YPaaQ%3jV%!QCYEsaAY7o=R%1Zu-4K&0OE3|BFFAo;9qGEL<#uGZ%XfC%+tl;r+AEG%TCW{8m zq<9t!1@_pRTS7Yw?9A8OrgBD$*nFOlrn!D3*tBJ z`H$&9v5$=c7}bYKF8(iJM8?!^=Q&+bnT<0 zQ?X|)PJ!r}aeBQ+n_r_#77WboP^6I5M?MZ(MoRHF7?Y!GnMnXS_75LFDOeK^Sp-~_ zyLs1D`f)!qd0Q#d;9VZd(e1~l1vMxu<5ZvKgVsRW#}WVj#6aK zhGOVc%bl@qZ7!4&&~o$23;38Br|#cx@ANz@v^^cN30WE2)Q1k0#0&hV8EKvN8X&ySwdBEh`R zkJq_VrE1bS-dlL}{A6TeV7}5ZixfoQJ(eTH?t5jYq2w5Nb7Jx_#v|Y?hD4;QyhxCk z&qdPI)Kp!-OATBezq@SvDTgYKyRpyFB477u`}MM~%ldbOdb$(?u)B+f^F}P-rdYvk|K^)o%6!~BP@GXtmcOp#auS@w{%s8NAgpH43k-cZeonHty&Bx0 z@aeCLejc1?W|%hXTtgk2;qp~4Qu4XK9%>w#+KV^p$Yb}yuPdX=w`?O<>YUeO>N_d+ zWe_4$K=eq>SSB(*s{3Jc3(S2^!8arVq@kmg;mp1D;q;SwJ-)Ycg@vWB%j??QHep*g z{A^L$Ch|QcsK)+~*jncReR@XXGQ8xl^Kr*g%%H9?ghz-#grQpG>FZvxYck~7yL`*d zs)=^<;YhX3pE(;7g$ttAS)G{|)=ys^YW*_Hil1??Oj@PJGFg=AXWG=LAMRrOYWy`MZmahTR65|Mz8VK! z*$L;RJo5!smaVYf1b8=ZN6-(+9)m{C(%A7hf(1Tkc068zCR*J02^K^EXN-nz+GrOg zU~wlRua~#?z+$s&A(-Et$d^XNP6%UOq=q2TfE|Y_(7VZX?lLcKcDxjJFD1@!6KoeDJl;75G*rzn-Xq9rZzA;s|9NaRwgiK3wUaF^q=W`H4UrKsg)9b zyimIZYa{{RLJ@#=^Xv$(Uu!&pwK>Z7AI(}_Hb1FX>FXS|UmLm$!iUd0#-7ht>hWxb zn|*8kEo{O^xn8iX9uT@-q!`KMNsSf0dq>1>xZ=6u?*bk^a$t~ss#!b;(P5|9=W_3C zBUYrWC1&*VD55Wz6@cA_*k1M%w2^p<{m%_bP$taN-9Ae>3eUlTqd?WpO8;<x!*in*bdPUSjycY9c!EADO3== zJ%~P5-}?C-_W0fA!sb*9fa3m#iVXJ>B%wWzt&tM{l@-;7v>(MS670~mt*}bZh=IiWd~T6_NJ}i<*1C2cqz^P)6Z@;Vj1*cO3}1~jlk!CWDY^&xq4eItSCGo zpE^X*-K)U+LmsXRq;4u0H?X|1NV6LTM5Y^k4s8VEdU4hN>+6aV@`m_NJFrTZKCKR{ zC&S}$$U-Fitb&XK0-8s%&-S!EJU(imAxJs(c)PoypkMUxi8>)}mx3kY)>qObs3dSKQnz6m2Pd z==7LakBj^a+zTYw{JPyLqek)b>|4a61_uLng_8Br4>srmy=UJkw9-d`n0G($J6@$HST)Kazjfj|45mPG{sy9@F=zt zXt%s#Gx`PpHAAVn4_~kdOEdxP&hbXBVWPDZsoi5PNL?A;mDvAoq0!}P>g}!l3}UJx zd^Qk+=j1y9#@${N9y0W|SpQO^&JMeUx`BYNle1|OTVO6(O9Y;gG$=$AGJJo>+cbmQ zo<5b?K-J!DZ%W1~^ZE^yY>6>cxXnl!n}oU3j$+(x@S0Fb$k{g}mXbB8m<2|?hKjO~ ziUjb)R0#NN?2C-iv(fb)TEoaI=CkJ3`r#o{uK!i~uYp8q1?uQqr(xK89@Fpe^(9~# zAAL>8+Pi*LF);}0eAudf{y}-M8RRd6xHIAMRG2VPHDmo{-IQ}+*wi=fJ*UTkwgzmv zH0|$aAkL3h`C`DLgka?2dfVADM(TFLp4ysc_?@+fHMnll?1c|}p~_Ce7s6y9gk!#8 z&rn9%EG_A6G`zR)5T8jIK7{>kCMt%xz**fvoi&_Ko(_@EPMhPU(`<>GvNu!+crcAe zJX=Mtj!dPe9Pf>e_!b?N(smm{c(yZ~p-}EoHjt=dy#!>kf!d77ZQ~i?j&ZmN8HiDN zfPR>mst-g*1C)Dis;22;p{MXOMOH=1<0XCgS+`HG&XS+9|6Jcu9Y5u$BSH0w5?7)e zaXH1PI^l;%RZ@7RtxWZ2gQ>C5MvMNWYm0&TNgQ<|OHjsr(pyZB4MjzkW%2l$L@=go0_g*q>E0&mawfp66~M?Fx}eXR||uou^H^hfQP@ zu)%OA_F9GHQfB~ziRK9H&rkRCCBYTsgbZJ5`&q>V=HM37kzn!YaR)=!WWh4E+psCw zjX-#LvPl?N9f^KFu~*0oJr831a#9-awgdaaPft%}T(fr7m2@;pl*#I&QO=CNnGer~ z9N-bw=J>)ns^61hho^QUV<`2Yb(35EXcLOTOIJvng@@JA1&jAEU?Ag1KZv4i?RNXZ zVsKg3t+w&=N8m1pk&+E2(Wy@+3f+}Y1-jix9Jm3V+U4lG6!)^Tw5i;l<~;(0KxhsICoB%L=3hW>692RD|v zNu}DVx=SEs3qO7%*g)0`1S$s4nn8>m79wJY(qLv1K>?kdy^9tbq-O@b<~ko?vj@NY zYNM&R;-usv8u*;Lqebn8>J^4=*x;!w0TSWsu=rKuNIXIjFWr&I$;N59;O2;@w8q|> zTfLEKwPuTXw?;1a{2bGr`HALo`<{j>i<=#Oh2yGnV2ZHMtz7btkdNi}4FNLd*Q6(5 z%^$#v45?gH-sB=n>W9m{r`^NadzIHqHcKt_E!xuDsKI3YR&37z3z|qwx-Y@-{&yED zo{Qgp(#ZE#)cUa=z;}}Xl2>E&X}3gCnNQf>vp@-7!S;Bw62kX%$2kWxVggY3Y%oCN z5U$rtp5;F9w50Trq^MV~`#yOG#JLBr$)v%(nx~p;^f+876_6#1gzZKeW(qmLGC(8k zu3m58yO0 z%q~?cF58*lLM)ukWPR&vfNeleu+^qlu+RQs|`m3l|K0($O~?eaC%E-=-F9i)%? zFAS!VJkbWSESEqjVQ<_`sdyhf2GDO52ZFTBuYSE{w;RTw!xL&Md{82wc{i>awi*3I zGIWmGL1SLN$ZTf$8i&P^MaEI@zT@a`b(H9Q8F*%vFAoE(B_mLAP5;l*O0_qX+@}Y1gnrXl`AZs+Je4=pyhgpGi4hjfnwJly^MhnL?sSG39C7 ztj5W?@Yoz^V%H36Ek-6Zs=cRNCrRI_HaV@?&RCj5vVV;uD^Q}l!h>WRRsa|c-#c`U zJ}iu1^)DkJ%4TB2Gh7sh@N99j-z|>w)fsJB1+p&)@Ba;C|e0K;kkk60CJV8Ci= zU2WLTzIZ^jfxR1P@lZ-_amBOstJ|px6rCrXD(orq`3o%jqN2Q8MT^7vdFK^AdZQ#N zGRnJwoB^kNEe2E5jVi7j&S0hF%~BqpfrMPmfnT1Tsa!Z)B_@g`*hF{~@Pg(A#=Q9K z8H5IrX1?-KQMN|XeJ<_x91|jYd5mzf!2m*>P@ zN35b4ww9$qGi-4?Quc><5ZWJGr5|B*!`=I{!BM)wyotTzYnX;4Im`!5#)6+Fob8X9 zZ*^`cV@5dIIPJT+DHn$=*DE;R=4TjB5njk_1iD{H3KTit|(~RJE{EbHW>$%l_6{wiv z=24Z1uI!iTiJ%}X&verl!A;EmTc}=zqO_^Rb0vz{zd?0>qM^8WLXs~O+*J#OfPj#5 z7}su|8B{!0&lB#zR!##NRN{#YM)n#1|q!T(Pb5qzjh8{eST=9YUYb3vxA zC}O3^+CLS$e{0w(HRQ74l0uDL%75;T{`7>GE|?7YKTKcwEW!*~{B8gJ2l5|O3}!S= z>v->9Bz5*Du1&W4|f3+U0}jm*S>L0nCax$4v5riJB; zo$U`r*s>|C_cDR<|1#B79N!Su|1Y+5zj>^jgINFn(gc~`z6&;gF}}MdfBWvg4=X3o z;j{z_)!-@C=^KoMgCYYZd+sy+givB7S%a>Z8VZnsn4P21qIu_+V>eZ!g|MTiph}~F|hrks(+Dr?M%h^!vhEP z*1{)dU7)vk6r(pg`%vXbJBxlpKz#iph?Q9?MacF${RG`yr@fl#WGPt!Cd-+|h%#TJ zkjkjNLXzWNXrbN;21C2S(tr|C&kxWFdCxbb4~}tf6)P3ubSirajJ;V(xw=@Ej@Bs> zf6#QL5iWE;{PgP4X(M!8ey9{oz)j^&z{H8Kxbtj-O?_dA8)MJ0^GS^!zmspy5jpd1 zV?4khtABMTlM~#4-<3K;{B*eQN=!gAe+S?BEGzeD@0SaAQ zO!8c8gm|VzJM`wseGEX@@8 zgpxw@bFncUs9QQmKuZ+XJIkO^K+l2t8yD{z(Ks^B-fQ5)fj&bYg^CddyLykA9WdEq6Jt!~s7$4tXKbnE?dFWj|8`ix? z45OUEF>OqZ1)%QWhFY^B5HItMlJ>Jn9seuBzQxfsx=N*v^G~6K@&W)kdo5DQUILN+ zn~#F~878K5*+u8y3*YCQ3t)V=`30YBm%y!3Vyb1tbyPL85#VB~AwG!9pEvD2VU(SA zGAVPmcndXg9&4<_%_-adHSR|UkIu5HCSDUw?i4qBu!oI91 zES9%2^H;)WssPB+%g|g#Vq7Zoh1+*_R=}*4blM1W=jnyLUDjIGgJBo4C$3Zmt`H$JB3s(z>h`?(={QV`9Hh51?E61{NHqdc4CiMSwSc zy^yIChk)tATF)Wv3=>6IHoc-`LohGT5{{{iq8DwV|H%Dn=o|+T9+<88Y?j(>ws2b* zLQ%K@7JyO}gcNDK0LDlL47vMvUmVM;WhrFF-qTBl)=`@utCRUJ{mMv>{aTK;6#ELm3)WoWYm{iL(u@)(MI$|3y7*=_)0O0V2F|8j7@p{X6vSk)?Pc!H@-BhxaP&2^LiuK&H!#&6*yqSkpr5P6P5 z{>1%|^gpJWt`TxH@Jlz8NCsHIFW%^nr#c0Cn^xF?b&7Z{?41WWc-to}OY>*={%R2d zYd0BSO(s;NPT`qE2R-x2v7p|Y-pd&O>tXFuf$v84AuYIUq2A7f$rg@V@oiL(oD1FyMu-|;f8fzCA5$Pm5r3@Z70>vX5gi9<=fgNqE=5XY1b*KEu~rPF z%s_9N&R6%oN4+lGT4e9=yDUQ}-d z&v&IlVKQyC`r=$KylrBYCd60b$r1MHTqA~K6t_bi!%OMmql@&MumNtbp(JX@hpv z5H(K{)-T(qm8Nq#_N3&}e0%5J@4?T&pj2;HuW@W@X`=yx9Q;lNgBhZ>+ zA#YAlt#<;72k-;B8x-3f;>$zurkH#vRv8nh*a74YV>~k&%_xv|j^ga+6!7Nx;tw+#c5r+Sj+i#&g|s z4kX*RMrGVEdVDV>?t?O|p{wpj%}h~nXMaoSpa%mR)SIk~S( zby$zJS_;USev-S&26p>y?6t8g3`dm0mNe9NhBLI*u6@(|Rnn0N_gbxQ`p#w&jgA4~ z13m2*f;ov(4Q22_#p6pNhUo3O%vp(=duIh}3k5uC9d5aInCH4X^9^3TPxDmaeW>~@ zB8%4H{>%OrA#M3zAuR~S2TE182K3grCWBdt&DdaX@%NdOca^ zeyj7s96pDzKlvorX@4X*Q#W2Vj!^6$Y&^a+jji@I(>P42RZ$INlO0ZT;Wnzbk%at_4CilieFAn$dnAIY2{t<6PONlr#F<^%rx&weuBSK|3POPIW3BWc*;eRmLz zm#pjbbKN;jO7Rws&hje1y8G5;rGYU5MaYd6Yn;P6cPTj4KW3;8hJd0dmV1bhnTe4E z9=&Ah7`=9AmzdA}Xkl2I>y~G;fZ|Ut4@+q|IXUMQVUcabhkwgfMHL7|jf1mr6ZIZ<pDOc`h`^Gg z9lHqQE})5*4th*yIN#>WIK!qOG>cGiX%05wr2*A#Dlx|=VcdP!xa8)Q7q_*2Y~Yo2M$mpT&@mZ! zb>jZ}^v{8Td4^a&fBkyky@|6S*sD^ZSBm}`92}jW{}P>Re}U4dGL{CMhm5A{>^R*I zO^HA2)>>*LF8MtRn`>#i16s`-6gM@^?-?BuBW|A7CLKhd?63nW`T|^XUb+31UWTR4 zaA+@-J+HtRqHx&r_3QmWxacIi1LPRFTiUoCl_4HjXskrAQxP8@&)xaeDx%#VmqVBx zU?l^#K}_-y3?R@|;t8}~#Dlzf&htN1XquDz{OIB@gVAeb|;~WKsTycAZ`G_8@_U8Z`9P=~4PKoh` zI6yjg(?FhfMp&8Oe{XABeq$-1lfU$-NvF}-e$MNp!0LE=hPi9B4GcK*ki-Jq1Ko>@ z3(Ss&T!oZEw&Tc(SB6~=8UM5vki4XI2WV7g0C~xAYl^2Iv~oy#>J!0dqwDm9-x^c& z@#Dwu@hyP9usvYFM7&uCn22N>bcXre>ivvOxD3!@3UvX}#0p@PL;7Svn21GP3Clvs z1<;r?xjF(&9Jiw}HRY)qh#yNT(01$ws6Pxzd^W1>3?@iS-*jNE2-ES8TTE;|7yRRAuYe{H$aYna$eww(HMf-3APq^YWMc{qqb)nWtV=1ZV^ELOZD!e z!x#WrlyGzQZ-E&WxHfEBFLOac3l2YV*qhS*#Ey@Wz25ZDWedwan2y1i-F~nykt`i` z+GWV7G|N14&s$$D6G&@_Z6J5kIYT?~w3(CuZpzp!-<)UGl^qwK^}u$!J*LIs4k6p7 z$Kl#D*qnD`6VSZ#Yx_P~VSwdJsU3q7B?y>r0w^$142o2-(te`9ItakUez)t|Y)11V zi#2OxS}yiwZyeY*sJzlyFZ?}`Eg6ug(j8tM~AJoIq`EL{vy<0XFSQi1rC zDm3`LkLuc+KwXXn>J^ziUF~kJ^S<{+BN)`zGc-6_bbTFGdSX`qrAZ-^pJmtpHmB9Y zQStPv><(-gJ#Xw z5*L$$<2Jj@<@u3KHw{5p3GgMRbl+Q~ED<%8)-!^|?{k1zyz%G&PV?1Y|DEl3=O+Q* ziiuH)%5}E-#HPcYi-ArNrRX+M z-K+^~iQgc&OKG;kAn@XFM3E`_o}Ts;^bkY~pI8CR0NWfe0K%j|EA6}2_;la&K*2Yv z)ThnMX{%osv!Z_XPCQq&K`b7;QR>Wm47vERLHiftArGhTeo`O#Fq)-BY{K}I#-fX% zP2C#C#P;3pGUmY?BI*W!@>`QwiC~fHH+$3M)PqC$|H4)Jnc(V0& zx`{702E0-2kkktJ9T?ZUaU>=7Y~L*Mp}-ZCRd%s86q|EBjG42=r=rRBYx0GVlQ%&# zwP&`dF;-6;YZ0e4hja>C*KnIv#iLEJ&F#8cTc>7;~Ib4GImy=-Az30zT6SeYB%bi_k7Nuht&J--3;)(%mTF6L0i;Eyidjh z>)mZVUv^ElbE5qWB*zJVO=s!hdWg@l{I>>e)1_%1)Lb2ujz>RC3lenME)IxX;tIH8 zF)xMAn!G@_oB=X~-DFX7bHCtoId1EKDhu~w$7{N>7}GVnBHeHjOg$Oy!?+o)#pU7F zAi$~!6x)7aRHNkf$peHfl$x#UlAL&4+nwLIUiDF_tTGJDL^0_xo`ql7-l@_-^ zdbwmkY7cvFz?<%=lTXWGyr4>Z*Xn8bfRvyYWqxJQ6(WKrN2~6FLnr&Ev3=C7tBek; zX0~`0vgqAU-x0tZ%(++!JX#HTpffi_TdBqoND$zlUuksc>(}l0io|`k$!&vY6+HwO zF>hx*1@{Sj7RAP3iJ!Ym&9=L6+hHzSjl*mopw5iBiHhKQeV-P*KR%gu57$7m$~d&A zu6_FLvC;YAy7?ne8%^EGVlaEI-1n``x;7>RI^BfeC)-HBW#VNcn^t1VJ8{H0UF$vV&+Wc&{{Py*?r82<;5dV(>5 zE;hPK{ya#0%EArscaF#=giSK*sX&SX=nx4 zQL~WH>Y3{Ayk(qi(*jHcRmk{b8___;ZzW!TxLf#BQDO>1WW*9s&Y^IpQxuQ;!lIQe z7IRK|KGxjpI@bW8JYlaFt?2^>D8C#-LYo`M&^X+0F-Ufj2rFfS&^E>Fn4L}Lm7Sx= zjqr1_jvt(Mw~A$a8QZFBKDD#&HyIZ~ypm zSv4oM$@eX*HX`)1!H9TG@=^PLSq011zK0+SI7GqzSm0L+l|%~gotL)aZnEM4E@T}gQyPD(q6|N@ z<&cRy;r);u03|ApcXuJ3mM=1ffN9$R(EqxJ8NK?W8vv;{!nB;yj-d#1H|do?Pb23> z4zevTjQ|GiOZvID!(ztx8-PP)ZWw_R3T)8euV(%{Tyw|hhtCGy9<)A%_66fJjT->4 zw=aa?vWw|C>|a|{eEvQ^<0qa8G%wuRp6sr(T{_gc;-ny%iAoeQHQiPA-H+ z=RB~Zl+SYVrBoP&Q{8~KJ|GHU(LPMN`~+({Hq^5gxW)Uw=Ib=e?oKOuWxie9dizVi zGT<6vyQaD=gcM%HeIOwr(NzxBi`^$K>^eIj<*XwvGWzgwtKq2U>FjD63F{PKGn=u$ zJR(lPdpVMvX4F6Bgg*gi7q(l>_B`Bk6`Svx`5En1k5-@jpGUTBU|SguNl#iYv@y%9 zR@zq^XvwE)d!4)O4q#?xX6B4|>Ci!1E(Qv1>w~cp`7D?^!zh%%tciTl?DUFCgA-+1 zDY<#Se=A9I8)<}+qcaZIXSi|{UcdHB56c45N+XRuOpYLzv3b5Vl5~&qH0nzQHLlwbx;u5X-#-jmm?DyEU6};iY2A?Gpt7c8?)0&O$ zZ>_3@JnZ-$l6OS})SvR0J^N5N7WK*i%xROGnuPwo%UL~g*-o`#hb)~b49mLw*$|c@ zm{$#3KFQ%UT&vnRN)_?QF+$b$+zLk%P`oYZ{2%%~?~c*vyrXc&@~%vbP@{hM_{&ss z{Xw=`nN-f!3}v=kFYj=!m4|@aevCPOd!kf`Q)p7HN?PC{hpXj57j1LSha_inx7MpW z?^|v;94D**73#);S`|r2PJLues5_A1_@Dp;X~|u=))nVICKi@7YMiyKyQK~bpH+(b zb(s{P+Mv{0u8{KRh3a{wtg1&~aqV9c7`C&6aVmYN>RO8^z}~|0ln%W8eqVyKwc(YO z?kn~h)gM~`h=*5Rr-|QvIo|WUn;%|fk<`SuZ*{g=h0W;n_%Wej2iU@}f1`Cdm~lj9 zT(L)HDX6}TJy#(b8qiDwVb!Bg^W=VWBTlGvE`_z44o(mF_$qdPT`0@HbaP&N=(c^P zzsh#@KY#XY=HEMez8hTFAcS1%X#x$uzZ=#&Uh63q-_X6#3`N#H{qg4jHjR`e}JI{7UD~)jKcV-nf_$ju^>Iodk zZ}daS0svU{6kYCsv|b{wdfAQ{aB55P&d9S4UhW-QtX(6MtC+?}NUsn#N6IdvTw~M9 zkZn4YIb5K84^ZtzSmoNJc*>*aP25v+eT&!waJ^-wX2;&BmRxB8K3x6VW)N7@)s(GW zb*tnzqR7d~$r$6srKK^46u5Gkt`6~w@88{>P=y3CjIlrs_n$H0e^fV1da-(TKbmeU z*-t)16aeqWKJi=_4tpXUMZk=NZ9vK2^YQwzMbg z)jjoH*rS76M_cH889jVFyy(TB-vj{fb>jGrdoJhh_P=krng13YgH~O#x+ARogq$e_ z>{ak~&X))fDKBN>SPIU=0dM}sscO|hJ{x!@XVfq%33W9$>(wUpu9|=XvTa}RLbUDf zY2p31vAWs*!xHZpzxll+u}uHC1M#?1;YZvXT$Y)coC{(CJVK$q-rdf>);j=1#)_A@UI)SJ{1rN=<{15;(XOp5s#HTT zX%hw2OVuy48&8xo=}*q3@ey6d5+2}Nj@9>oe@3riBeW8O<2@R#h96+YLm1m zJ2km-gC!^5S-awD8{~2J;Hc!S+n5i5iz;N@y>J-pA|@=2vM6m73*%n|J1eA`(_3f+ z;}0g98-crG2!~&FH9QYdriUP#nYF`dz1L+Wr9VIDiC? zoTmo8Gg{#f_wU^f)VojfP~bLHx`a6uN?KoQh7Fu?5{V(m=%8y|`lGWGYBsmNzRnv# z$o4T)Jnt}xl|fV`_l>y9FvR?5@h!tSKFh*+5t*o&nW?O{btvJLb z3&pT64fkov8-1h#8DcuAaS#y3h`xSM!33O^?HW4NxZ?$8mDbsbO-{KwRsH^qt-v`S zG8=w5O6eSY3*!;dZ|o=$Bi#KpYyUg!?K(rEviTonZJUR6QD5Zpy}qDqqoQ3Fh z?%K2mFX)Hp&fuW+6IUKHhoEcfFp>51X&lb%v3T_Y7j1afFC#NOH0-KZc<)F33%(f> zG~CAAkHSNt+l!^_Dkf)eRP4_)|8e@iUStSurQDatEf{j8E%Bh*(WxwId33$q?DReN zpvGNsAFy(ce%{r=U~s*@%o3JH7oAGz&3f)l;0$SsmA(}l>No#BJ|ZuqOJ;(0@zP}# zSjfP1JDJASI4Hf|=2aMZiur&g<2=ikMQ=TjWD^Xjj5sdl@WyVAR`# zL3ZTi6jZvJrc!j)^(3eu^+k}=%)Z=6%J5kLzrgXdI#+Qob2wFlc&UPX?Y-k3Y_m!; zjg~qQwskkfri;TjrFi>&AQ7D~0oFGG0}3&NrQI=-(N$KLf|SCXp4L%6sF$PGb>7o4 zj4^1bp=sH4Y=WS%BMuUQrj+9Yw6tKwsQB#P(Vq44l}Z-TJk|TH0{drp3B$X~Pxk|{ zIhsYD>r~dBWjjZ|Y`jbo9}Ye;=}HRPU!8Y6v$8JTa)2Qgw<==}|H0&7~Lx>g$|) z$V+P|(|`xK3qUzBamdb|E^=>-zcgS%W|(RvVt%QM-40-&8z!c-0IZ|yCb@zTf!5y zF0kn4i_i5+DQ3rLuh+LDv)!%NIY0x(3;dxLstWcUFU{OiA*m^Be4Wz$=hg!Ir>4=2 zD(91h$&{d^gsd&RloUfhe%&*@K^1t@^Eu4mZv@mMf>H!u<8)8xyU?UYU5!~>n|8>} z$>!AYoIiu}9})ULFX-1anXn|m>d@|;T3HLfzLdT>4Xh3=kb znCZ1sONvS277=B@IBM3_4D{Ub4s&YnBTCg=7h>`&vG@8y!vC_cj-jFwHYOh$?P9q3 zUria;;X=UO_|2NGkT{lvDB2RXkXUieH{F9(_Bq|5RTo~NW{S<@HozxhKMKNs_MajB^BJfj;=9_Pv=i&9jAj*gRnO9PvgPK2lRWn{W%r;zZlo|$0#*;>#|(hzm;r9#bp^RM>BJ+ zph+E;{Z@Fgw{qbL|EH7hj^Z-*Y@vXZ-&pxZ;oA=?Thv~n>m_?Pz;UGQfo&s(t>Ck zJMGGF!_ga%>Yk5c)PD;*Oszh>)4I)oqb04QoFJx5mHlFrOL(PW-e(PK&QFVdCGb1` zyzc1z{3lR;@fyePOHCoa5mNc6TC$lkt_#_~r1cjgnttf4=+{z7eblVJN1GVle;c=( zIf_?C%{!d2ne+Jj*(f!2XCxrhD6}NnQnC6e&>*-vLMBEO^|Nl606ISjM zeOyybzx!{&REDMPcZrPW{+i%F&-n1AXgY(EKk~2S=KoxZC>;sSZ{;9GDjli6g)QJC z23CBCz|Ge%vDXY&EG9~#i;IiXd7471eFl-y7k+*bU^pDUzYs_*<%XGhDpmUq$2{T-`ZZ3F> z99&Os2|Sv^^}=N_643KKatr(8dEVwrvpb>)?gg~m0uS+H4J1CMJ*bn1=Ls2_+*cvF zec90{o>yu=duEVrcA&by-^;}$JHc!OZq+SUddh3wfKWWyZZ_%+OR?X}F`)IcOl`a;MurLvZ=)|a!mtG_?C zn?U6Gxq7P6`tZvBW;N0oAt@;cd79s}a}_jP=;T2rxG9GQc{@)XWcJp?IJY34fcPSWyZ1s+ zP!q(pQyEWTHRi^q-ZH>bGnM2djlRGC{mhq91&wyR_j*|m4 zcSc7pvC3R@@12am-%zJP79SVLO#N$HR(!_TESc*ZV|}_N z5BCZGTkrET=*+QQH=V)CQh0DnT%7AR6wjlop)X2f>9*~Q73a@LtXXB|5`aRlt7K;>)eA;K~D#u0s+0|>6 z+*vOSr3bMpcPec-7bLUdTuwnNhno$9%;zPln#N1C*nN?TTxP#?Kw^T4EC7M& zWVOWxWkDkWS!0FU>B_k=v_fW5dGA2NkDf z1LfTkgf|#;hO*;MuD#ObJ$|t6X5M^@B3X!>5Z#y^9G2ty;^-Xhkv>oyL(v8o z6p#tg>|=x=zBMtjsy^~14BKG^RJ6yYfCbUJbp$M&0$?nBSYBg7>WA<<)D>%2NDPqi zRNB5AY(9~XG44<7DcphfY-*JChVsoY0sB5MJNq!V>M`Pwcp3z}@nW0vY81s6SpEnH zTr2b`FW;;`KM35PStU3cV}=IZJ>&kpNYsCq4DwU`%=^q`xJ5_E%|OkzOQS6OyhQaQ z_C=h`9V$gI&)Biue9#?BXZ4RWQK``CoxWl@u57DhV6P2L>!yW<^8Og-i-7<^?adMm zu9eO)=H)a9FEPFax!3HI`qd5Ql72#EDjuQUf2u5c+!t#nmO zM@B1xt4Qq=AHf{gIoBP&?^W*Yw625+?L-RDYbgxQq(>{>l!h7QcrXMV_;R;d+j;%x zmtO8RM>M5NcTw4uVi>5wd%+$l9Zb@1No|8}O|r_3WJ}xIu%ItL&J)Sane(F6f>}Ei zl6o|uXVKaE{&$ZlEJ)^X*cD(7{AM{(1HPpbACm^ye`mTmcxkAI36(}4ZhTmN-+J|~ z7BVRBp-G}YKJl^F)fS&#chlK{yv&8k7sLVP&C_?j zjpY7GLMhWishUi~_ydAZSZn!xS5@|E_=Ku?!{^^=>!xFwm>@ms*dNL8P>AAg859Rfz@cXTCN zIf~Vok7es1Y9A958(}=1*}Ag)$$2&0_Ul#X(;#CdeDIPZu(P1|0`*xA&m-$OGO`3` zws=6v-}6B&jJ<*kss5d^wW@*&)?n(RoOW%=3FWn%{CLNNA&vXDDhk+3VYCbq(`|kZ zhqEka;kTk!lO&C)GD4%`<6mB)k6!tv{p3B(Y7Zx7Zh;QaKO9bP9~xf?83~*^7lcKS z;C=o1^Cxj_Nwl4X&w3DJcz2`}#k)G;UFkWH*JkhbOhb^uc7B3fZ(KX0_nd5t5~T_J zbNKZM_`2(4^ya^kb~m%MSnm2XLh7Z6!`PO)+MB|I{5U^w23 zn2e5Yx~1Tc8G|W(cwV}i9HJ=9I9v3%fI7EN*5zn0eLoep+ILDwilEastH+eej+R41 z-b>AwA*M48v6pcQftp8K4u1V{2`2POx`$h^{Zj*i-k#W^Z(E2E{>q2D2SM?@84E(Iyf38Cu9fxYWSFaImxMi&RobJ`Ec?4I;sb|-}S8b7^D6^rX zr>+`CVcpo1Yxb1KImiOQa^(E|C+B7xk<`qqb$b_;clISzka-V@z)$rU)`{~M;B-X2 z+_bYbcXO8IfcK>V#urt510JpZD-r++NWTST@XgAPh}=?UhH(i-0Qq}Tju%~QD! zTj^;!nuj>pNQd6D?{d(4-m@DP4>0aa==y}Db|npeB7Stb-|ObA3x!^v=n0H^BDUo| zYf9pm^-u&Dn_A8^$h*fEe|5G(OjaAD4Qg$ka?37~ab4u3k$Jn!HM_vUeNJl;%G|+{ zRdQ^64)tr(Y>B$XbAnsa1zNCDGWvs9ue7yOmrMFy#;2RVU#$ryTl@-{*lbD0q0Spf z1&x>L$fkPR7Yg&Qd)K#ROQB$n3o>S%)Yd{erJXtLIF#?RC6SBpCbwX0OYX=uo!h}m z4)|tDSz0i*{axB{1a2{qKzC~!6cIk10B^iBgYT?~@Je!X?GPJ)kAm`ETW9T1H&>-zL9SqKHa8)7 zxTP7a{@C6>{fkM0{ue=CG&OyPOmD*xs=rCX;2YlUYG#?U9Puj07HX$qn#dMCL8ncn z9#zRA9*ehk;wa_jj^eASwfqA(Nyb*mZc30g-xo^5CJln08+93bYgE$>n%$2!Ys7Qw z#lG(~d%%%`EE-%ELP_ja$%BX*)Oa^gJ3Ogl1WFs4*BElYD4xAdEO5tA({X4P$zMVr zvNx^36eeZiU<^S|dX@UKT$E%W`?^Gppct?pUnYey2BB}xyN-a$zCNwYXnvI8fM7^I z5HM@M9c+y+g@Y{FL7?kJSu*am7fBfl)sGAUe#fW|fIL1^F6Ld4M&AnM(}OFR|C$$@Me-EquAjEwHg> zuzB%Xa4y0aWX6HKIFL$`PEf4vq?%SOOBJyye~nZce)i@FMNKDo5*wElCOkY4#BD!n zD$t-$cs7h{k|gYwsYALAH69Q?S|$?0-kUxFmyabMkXn;p-rc)_*m*3xs~nEjw8eeN zI0u~1LBsROsjZ;PyFEWibxi%~8d|Cy(wz<|aLMcwlZ8#oQ%>tm%0QfbxMYZtn8OhT zk)N2q8W2IPPOn$|@de+qJ$3Ni&K&&|i!Ir+>HWWxuW#s{h4>o^d<@$IU8J zX)|h(K8khDpcoPvegez_C43CQXQcyXkJ)G?Tr}RNH15TFUbQX=qi927Ns7-aQFy2unJx@+RDQL1*lD)^c! z`>5*WsRK`kA^Ju9iigLRlHH4SYz$&$9|3o!RksW^05=ZAFgo+E%@zbUBIDKIo0vM& z<|a2;ymPW`7a`S1@nm^u;=HpZm&pR2CPp;_k?t%*$uej72{*_~x7Q3$jUHXs>d|dw znMLOUUOyu_W)6_MP<)f&M*APy`)TYL{*HBc19jsQYnmnha;yb$x~!jk#?sttr1bZ*GJJCU@4-+*O61M%a<) zMxJq(=^38}@4YC}&ToGq=fFR?VQJI%Pm?CgoY>%-pa`%QM^I*5qm{oRt%IbeS`FA7 zM!ceqp=#!QaJ0=Ef063`6pLni+u*JmvL*su+W&(q{0EF@nh!FJkaD@wE=pNEuImf` zdRHQf{7p9_yIOPuW$>JWv!YM~?1+!03ko;M?)@P2+{I!Oj70XL?u;zInM>`TsepC1 zIsXf8p@BJVR8XDgqyXW2SE?WzSEL-h@|B9pt-zu%`&!4b(ZHtVt(d}^s>4X%+scRj z-TR!c*(X%F(}}eAtGwPvkT;E9yDK7wap@ZSOIO1-w<0T079uuPV36q(oXa{CV=x8->v4bHK-0W}xH?wIS%h;C`dV`Trc z^)D%|0EC`El=hs^0M>hfsCoe1k=IJoOJh9os6|}1PBV|)&F5uhj>rp#n;~Y7mBsYI zxi!;_sMfBkUOw+6cIEKtX9NsM-qbPA6R{-z1)J%1!l{Hc5@> z>s?6_a1^V7>R3eY_;`e#90&3Q*!wIQl(>?Wz)4sOScvv6F8j-JS&`4RM$np(H*tD9 zR3;zUIgwNJDC`AI7{b@4g*sMW^tj0u_Oe$wNZ#Q{iX-jnSr@Qh4V30|*6II5#^W)i z+LMTJX8ftv3e^*1*gd%%y)tNwM$$|cEubcB$9A^N1mSoA z?qvWsB{FaQ`UUq#9YgjW>-5u!Y=499Q1!-bwGwp|LhWymb%%jtlg+hhaO=RH33?Q@ z`Kmp`w9yK{tO=L9pKo3T*t?H3fAj8K}cgc5D<8Q+tgQwL8^3?siT=(vIDF zdT0K;g2J081P9B%d8ynSY#X|d_k!*Qa^D(rbPd6lF?t(^EyE+ss5zy#0DgmD^#1U~ zcdSTFExzUVqyHZc^etrm-Q;%QWpA6hkH5c`EClh4VVK$Z3hPKU=Lw4{g8?*LQeTxg`)0rX%8nU zQ`K(ydL4l^vG`RQ{Yzp6;`R>|33k2^mI`on+G{{}!?$AHIZ! zq-uy?b`*0j<$BMVk{vr|QtqoXO2?!?kgfC|Gjjm%ooXsV3*`9FGYvtL!3h@=xK^5@r{t^K@Hm|XMZWS+HrMB z)H!OCR=d?|x3k~}?LUL7QWyrBE{kDw@3hbKrP`3^uZ+TS+?(V7?FXh~`aU3BW6TII ze*L$<++pr1LOciT>XxnZ2axb)V z_rL(CEzEt6x^(syM{7FGa`-s_)^(y=l+kA4fUG4_GPq?%(Zd85NpuQGQ|M@EX$_;# z&dzRd@2J>VVtWysKbsHv8yMir!>WsORAQlbJOwodTD#4v2Q2 zg%>*Q1pwQ{X<0YxJdmUDdk@0UV^@C(bkAqD@;pvvD-Ajo>Q9F&R;rdnOpjKeCS3r_ zqT-&`rq0-hBDLO_0>$l_Un_NEErM5XDZXEv=>=VFmhJC#ro9c@g(woEd~M2&38iS?G`Oq6cgS%B#+ z4vzUe_!|H|R^UPBJJn=oZ@#o-=i-t*%*)P9psug4e^!*8mxr*-n~$9$)gjgPL$@N% zb-d){ecWd1j@L4kUVT?KnPY20oK0OpcJ zTyRLdY0sBf2rQ+b>u%#$0h-jF3N?cY)G2*jc_K5j8b}tj_X-o4!=8~ns-Lf?hgjC| zsK@C2bw2G%6AoKcQ7%P$DoyBCE1Cvu-Xh|6%Yic4|n@ z;X0S-l*{IGU?1@+yfD)@U+_zYGQ~*xU!Eh=Aj@Y+y%<$1!7d-dd)@OHCa2dNt?Q~9 zdzUix7vGqzYD0BLr=8I$yoe$z^wM%^<4)Dq#W7-MxaZL3N0&pkR`@LE+UPS*pn}Zy z7+lKH2v*(is~Uv6`?gj?)O4Ln`Y%jJN~8M{k5m`Tn;#A@p+@T)t@t=bkfD6W8aO(9 z8_5R`0`Gs>fav?L290z&ywRgcX*{k@umE3P1eZLvhVWrgLOyzAcsgC;uwSWd*YEg# zFLar83cnaMloUWue0)2x-Ms0BKCBwFYMwA@F{{*m(~a$QPrY@P;V>F7tnMwvnc&N7 z*3U~bt290DDk^JcQv@A_$U)YP1a_Kma87oFhYq;5_pyg7l-1S&fZfez8}0m|&Ova! zJ#aaQA+6Twrcy+M?EE|!2n6NhSoOBKt*GZbY)Z9luiS=VHq=AKa6t3eo#HZ04=D3g z0Z`vWTK?ePg!yQ`HHzAO?b-fW9<@wwTqlV|AnBihNJ8@?&=TWaQYp*hHnP5u_xvV|45JGt# z-4@R;RyzormMFIaWYXx;;HEW?spEk>U)Q&lIq8@)@oT`!w)#ld&8x1SZ7E&%OEp+YH8myb27_-N6sB_llel)iG6W-X^G~8>urShy82Nt%X_y!d`P-k+uo{KZEB2~J%;f0E-9y$7j>kJlSt`HsZaN zFP5*$szqYq4X<1oreB-;wzg)v4sf8n*wlIV#{#k51 zH1i!ohDKVHwhVjU1-)8%H#8sOO>cpHa;7z0Gfr(W(XCZw+!J1;7LS6;?~egnDQJ;~ z)k^@7zhGk;^RLj@J;Ku3-kK7?h$SF&*_<3Nr>%zGV{1G4NyDF0)kgdEr4712#=^vn@u41UB`@{QbYT2PVWtr zYjsPks&haPC5H&RIzKPM;`BV_2;#gPzBQH}eJ?RM(`dgL4%3ZqzUk!x3)o6E=q_&0 z6a-JT+5$0Ni>NYju}~krdLTr!D9u0j@Ix@`uxL^oAnW^@SfX)|ZeAhB!?WhSo=@Z!PH3^8)W{Y8Y6)@k=Tzh zN$@cG(EG~d9H*0pyVEY$FMu{}{V*K!BYpfc<<^VyqRTtFRjSo;d>S;ttvZ&KjxABo z!~=V?!sTj7!M;}X9~7g)D5qp^VB1gE-sE>x8Qrb@gz1QZW)bKhP1)1fJF)HY6RzER z54FD>d?(s!4I1V2m1Z?sZ{?zRhm!KhJjy8l4Ae+H4;8kY!&Jc6mt zbQOAc=`NmNfo<&FAQE=n=M%bKvHh4meSI7|BLT-!Raj1IGxw;yUo1V<)vUw&tHk`8 z?Q0QvveA3zv$WW>#>3N zBicD`*5?40a_DdS{lmoMCV|L<%e$WdxB5&6GbN_DHnKc|=n^fMbU4+Fe1HsjlJh24 z0->)__i)aB2pQ+tU|)hgfHeo*72r**cjHFi^i+BPini2wXq0iirJ{5s!lqUBX%fxc z(S#0dC-q#fA?m_BsR*F)6l=B4f`EPC%M23{pIkWLR1G#dEj*@O@g?d3dRFqSdR|t! zYd^XK#ddq?J^C1@YG=1(xD*^g87^}kdfXinfsf1~M+lC7{*ja7fe*^>uTyws-Em>y z8T#GRJBa&8kI9U{o(UY1$+HMYZ%PxYTP6s;z6hR6++iV=b<8e2a^CVH5c&c~$XJiT zELp!YhCBWfSN(T&{w*v}VLxE~FK#@JIgaD0J1np@Qv{v9Zu1{Ts9Stw9>*j%Nfe0U z)?%(p=3Fxr`k}yJJ8_WfK)$wHWe{feB9xrkAmDQ;)ccM?Eujah)*aZIsaiTraKCFl z*ERGHoJRBq=EislvlG5hu`Qb@Wf)LBlN|gsCTtA1O=~r(AAhiEC~}bVb(>*Cdt{C0 z8|d1)`*BccXbl`T;1r544v5tW?(nS$04V0$HXThvzSrmsGEAnFHd+D^QwGN|Em{|D z!rEF6GTOWpcbOcau)<;e%MOu0plGXy3JjBD*fG&jk5@Px#2x_}2}{!e-jZ@cQq;2l zO|MMc_~L+defL?)h)LJ{$R>SFRJ1(J%W?di_350zdb(p(t{)a(b@E6BVbku7WK2g9 zUhIzC4y9`^emB_MRIUQmKjP2SU&q>B&u+9Js;#Zid4!nMUXEUN3D3+m4^O!-HBK^M z8!e}qI99gO{uqMoWp@h>MFh_lq$C0pVn?srKwnS>b(ib4zMa&Qs{DFFFM6{bV5V?Y z1p%wCqeW^kTP~5bgH%s32*`|!AI*(z-1pg>W|vPN7U_s@bxs;{$bU~ za(-5Lh2HD6WY@9Bk2l$5&o9Q-*;DM_K)xLFP-C)=Xvh9?(4qKLb7*5N~22FY{vq+(i1o$*`!q+ zi1%_c7Zr*jzjBw2`Nx9U* zo*44l+|HFz;z5x!r)o~oZO*({VYFKnuez12vO*QqS>v==aW-{>2&;gjib1(lz(Zhvx|5+e0pM%Wl z;_iPrU2o#0VX(M^W3C!vX`TE2pM6pB{Vizgb2&w@d#nl8=NGo7bWniXEi2!Y>Cg0C zO560FWwsT`q63XWGwtP_U>Aqtpp`}2uARyeuOVVqhZ&p9j|7p`=ZLv$2ev#E$ha@s z8}_a=c{)E^c@E7v^}BS*(`C%z|3>3wVyCdfC%_2b9u80QKrto@asA; zj#RX(iubp}`2u%F!4Kuah`4^Er(gn^oRd-sMwjjfPxFB<7k7&Tk%Key=ScU~z1GYl zZsdY}Ro6lEA>&%vc-tKgOX%S3fTl^(sGhPtH=B@igt2W2&%cGAi|TWI*xT`a75Oq7>u#LvP0doCH z$ZK^&@HoxoQCiT~`*=1a^e&n=h8J`k!M_eiE9#X>U0itkPR(i5I>c!^z(R+YtA)tR zFA>g3e5p3Ohg>AE;S+3dYl8ajZ#L;hN#^G_}@d-M4Ey1*B!DJ6YN?x3UT|o z=_{9PQHsAV89?0>h^t%|pJXYzg#wr>&B@}i`1K}HHx#7bwogZ;3ab&UlV%G$J*HRNN4j=mam&3BFQ;QwB21>>7{IY9T4fyKtTK2Je7MulXJ zRbu)~Oy$!ws;A2Izb37wFsnPwre9}g;csPr75sIWI3?^l`bVhv=QxW4`f`<$d}P;L zc+#k03x>LlPeC(w@Xs$o!|He`U%1v{L}B^McoI zp|H2iFXsaIXS*^0J68Af-ou^h2m6bcw^yO|yDxs;g0pGANjevp>Xe!N6!+~LO_5M8 zjvyvi$$y%}53H0;_zcM8LVUIS9rvNM(bU=AtkzDHu;O-mE^w0y;1_$g^>X8xYUJ5e zO&r{U@k})ynCfP9wmxp3MmI_C(QVx)GIz(jq4(&V|8=`w)mzus4}@96e6*#ly^=W24+iheG|?qQ+gO?DQu~OQko<+zlDE9g%s2?5)Il zpPcb^SxO@7vpDEn=yoPD!Z1@wtbB!YDkJ4}Z-+P0w0#j1?CjPGMbvfV#lH~Fe+bfJ zLdKNv>biv`M^KpFE=U<%0QJdAfMLHd#o0!@eWvFhoM|lLin~GQ2-DB!;e5sI#zU54VK-*EI|Eo$Ky<<=%cH=iS(xGf!(&uvJ!T&_E>; z`nj(e)C=L|`3qn8={j&wZisp*muaeyxgDC$`MYPYB)r-x_1S!k z&;Z+^Bh%=$_Rb%30R_fVOy_TV@|ezHGIoHv?O-ydZW;+_^DCgjoXJ^X}C1_8?2 z+S!;6rLy#RTz*_uV4;#GtOAbj;4+}w(R8iFqOYk@8ICdc)xHDIeC+9+iSPgysQX;j z&h^EI|BG~A*j4=U1>-n!E5aDmd^IgI2gu0@$)Ae@5`M}T9xm)v@8=}4+`G!^rB$>r zw)Um~!#q{LA}t<5&x1S5w}gzvL!5T*ra(cp_xIaIpIi+G;$;#E>QugsE!3;u3u(o( z6k?w8MpyO#VVy+Ips7c1VCK!OGJ@)+LGXo~Z*44u_=2pIY*)`LjZCga-#C9NGjpDt z#+X@u-8hd(0J^FNd5zQY*i)#)lWGk_0Wxvbv?GzY-@_uDVQsFw6Hja;Ai%K6%&yqr zjhA|$<|d!-bc7RF!{*`|lRh44vzr-^|MqQ@7Nd^j(MH1XUx33u&z6HUiAG|0>iNx8 zhwgv={-49q#CW-iv#qsIQiLfFkNCXwE?{hq14-6)iG>36AIIw_d7!~Uz~{x$H=!62l_$76K0GfBVA;Y;B<#M9}UTY#8j zMt>l|mGiku0EJ5LUx#yuZ&5}72dNYrCeb!}z50finayT9%Jp?MjSpa^Vw2-}pigLC z^6)9gNq69RTSiltJ@mM>WcRiYcHo;BnGq`JXJ(x-A0S=Mf=)~vJf7;0NP50!j{GWj z;Dma%e43ZetX_6z@lnMrMjzXxG10Ha{g%cI#;~ZJ=IIOlYD@u2a~B~k3n=>+9pxtO z?TgI=*(%bL^bj==jK@BL7`%XFP%AmG%lfow8C?qwL73+3XWbfN9iZS! zloAu}WaS0d3TM%YUvDMmUb&Bq(NcL7bK9OpVdggPbSE`jQbHelC}zk#rRp5{Ozqq5 zZ+4#O5}MgV?`t&F<1+Yy!`?iUJ?T(U@e`Q}KJ13nlha6O(Xe(Ok*B~pzD!7>L_)%y zNc!YEi8??b{!c!hx4dfW#yK@vzS_o{Ls#Ei+=J0D_Ba=Iu6P5f4|hj4Cq3!h4uI@V z)8*IVre{=-oECd+CvMr~55_&&Lpz2Zv1p zXQmidCz0nLN@7e%@EkrNcIP%aVz#@`tHpCR;Uh1Q=and7;2zvje@_Oh6K8*Pa6&2? z4J4?}2(uz}ZfYSu=Ljf*&NCROGcP$H!gcgzbPa#!(+Birw&Zm7hXzJ`p?peFA^!m!eiAIQ51TRpKZj#D z^K;P)ltMXNz#3|_;J&)7{sW+k(4rdA@^)}}0 zyUyrjjkJ_V^T7`;qPd=LI?+Ai_RRFtajt0#Bfj*`y5XH-R#tqz3LKzqHs7h56M!AH zi4tAv?I1h34rKcZRe$U_lEI^`?%byA2~WL$h503tsd(}GA1RIUK`i=8^D0}fc{AKw z4}o-I@wO7!WO)PI;3Ry7hkup5N`U@%+frw}UJr|M+2+F`tGI}m_kBm$3-BIcWybd@ z#_L6b=p`#E8dg5QcjGfRt?_ZNe37zczJCO6P8<~VkoQY9T`P~hZ8(LwLdf9y(B)~j z9H+3Pr2L@oYgWfLZc7)1@|4RpZQar5CA}_{Q0>)oKF#?C<}EcZ}3Rq#B>dwC9_ReXmv z`ZJz~m$$z&;`te96PU{3bVrm7*FFo7zOs(9+W-s^dYN+Z{r~GQz&`Fgc`ftp9v*|| zJhW+!f3ArIy@=~b1?JrbvTE`i8AVBOXDAJF}%e(W%GsvfTnsUp>bCZMy?nSqELAa59D=WaOPPi!MB+}Tg6R&i@+ zwd+_F&!C~)=$<6IYQ3UQei1i>RRo4J&6)xTo+FW)Oy)UKkE1stPfHH{$DNwLCISvw zPXID0sLu?;>N&mp(gon5wLlao$v@ONTGbRBjo+NJbbU}j=2Mwyv(I9P9lEOtXquA1 zjFl~`HuE7^d&Z@*X6gm1LibNH#8fnQGjwFH8}&NLLL!q7p1QV;uElCaKw@mAXdVGd zD0$Z^gMNTj_e`JyR7~qV=*sU1GI*@%a(4SX&Be+IKpKPXEW~WuftnVkJDk-l_vT{0 z${5e~Yf)iJhGUQMaJ@JZ0$2gK*w=daL;9-ihnz{^Sil^@8H!>74k0;_yke4~@tM(B zkeF&6#7%pm`k6>E)wV%hHzFdoB5e-bZhz5fXn?GxjYoJvLfqXE_WM14X6xTa&{0HQXB=Jtif#QH z>AYv_B^McnM*?Wb62w5uynBoyVOxuoMUrjHJsl}$4*7yuae*hRR)asUmceQiN9Mei zaF=t|NtMX^iT*S$XETM;FHAMFDbD<78TXIN8pf~!BJ8?P>fhYul20^>WCv;lu<(Mp z;qKOPomBu;_VifvKN(oHuxB@ z+k2n-Bp053&KGq%RcQpOZs=}yc7F(h%8n?#UDEH%+CWf7KKsxTa}ft>Di4M_Dv+Tdb;n14o$OehXe1#Cqq2~ zFrVG4^O!_VP_Tt%6e!HjFyHYFV3u0tS?`4F5syz=x}#cM0Axn`%*_VS=i%E> z)C<7~lHqinMVri(l*(}yJC_ZJpzW0ZPf#lXgZuT_-*AOo?m5CWbUGB6r>K`ej5(y# zb6eX5n+y~aG3%`L%!uK(*EX^%X;3~d#mKM3DIcfQS^4?hW52C-03}$h6XB9?ZY|9z zwY}C2)H#_O67}qzw(%E&yp0?jtGi>Ep>zlJ6q9L+#prCdw7e_QX*grDn!gBG@{!_k zQ;4;{iK;}3O;MT$M~j{iC;N<8)&eY8olV(Fy8H7q6Q^Be$IcfE|Aul~(eRMU!xtCj zVid&3w*Ffa=O3=P#??S$I>}R(*33)&ElLpubiB?e721>p(QlLp7hXD%PSDrkTOEfIMI7(z7D+hvQ&{&JYuJ3d&=L4ZY&;KR=D2A{-P-dQ5d+eV z42fN|;ubI2;$+PlnG@rIj47HhSH4iZU-yUl{c66x3qeZt7vjlfEq7Inh#>i-CT7`m z9J?By87d9Mt|~>Qe*?4J6J&0gO|0c*!@+B8eNz)L;mOLLco?=Ee+D2| zb`GBf+iSi|?IFfF-arKTm>doz#Ny>&wGZ&$n^H-t zI=c%cCte)lZLDg9XiMNUy17J!r?E8M8PGt)l=r{E{_Z38K|ne*_S+vl_-MRjgk%#O z=czRDsFn6x=-mUK*z~k*Jl8||?NtH!Lu$d7GQ_|4%!i9H*|SU7no6Sz-uoOD)(=!+OOE4@xBEvslx0T86# z{i*7rCNWx@WpY;ZV5(@7Pk10eN&vQ&?mFKyW_y$>5HVE2RTg>W=8}8 z6_Yy+s4cE_srhD@jX^Fxj?(H6C-R#QSK`sTHzy@N8;@|pthj^BTeJ4B!hf&Tf9DR4 z1yLxJAZdXFl=YPOr)evjmR#d&}SlZ-SE)Z+{FMECF2P9 zA&L7n8VlPSaM5&Of5Th(hN#!C(^%W)Zdfa*Sg8?3qL^koShC;}I#6GyjV{5gy)PHw z?uv1Xr95`6(T6M_T+Rw#`8|HduuStoD;3X?)6{LU4Hd8%RwW|)-6%**k-gvmzoSdXV;OA~?|( zu->#1DI#A3RjX!!R3W!1Oz}(7T1iek7dDUOzjmNe1nj$o5va^#7m)bUl561z=j}It zX48qN^i=zlGXdUd2bY{lU9a$;jXT~puBY@8YP@pJ8|Bp^PbjReF*o{0v8E}tzQHtJ zd$fK;ojmcsGHZWJmCG8I1PCI}cPdPa7P zU<=bVv!g%rkxsaG`y4@|^z-(`Z&`SR|K-*CfLg*=-5=M9MP z;(+S+qIjgA^jnV0Rh^iD{7;S!WdAr2e~sQmzyko(myV(5&f!comjh5Yc^u}^GyhcU zKa8)y^9F#L`u}OxgxNaS6@U1^FR(zTUIn|q)Mf13hU$3j+GxjC+2L8@IU@ufsp<37 zSvIj!s96+ZrYYRoJM3iEe2T}PSABXBh%s6>x~;XCS!dawIGf5YZ1C01%=I>Yw9q-3 z;HiYd2tY2&3#sE3MjJg^KaYW3 zE^#xLb?a>X3ia8nue7b37p1N;A}Vu`VoWJ4K~Vk2#^UQq4dfOcsoNqpRpCqSnG7s( zv9GyIAl04RD~`i(zLkS3wqrGo5SXuR+WL4Z49M&djB=i6J<8Vq#O~x2Lpqmo>T9)f zym@j{$QwL1h!vqzdd@IMjBDe3pd~!o*a2bH191nq1JhQl$tD5Q(X5QedD>S zpz5|i#DIGX>!}%Gp{ixzcU<_%^&`aY#@2^%KC^;9l;F&^wG~lP{zuSqOyQ|byuDjT z+|m{cvWwFX0hgR4v~ML#i<~@eN0Da16(TzulcGw$?=1?qSth<0gBOrSr#~&)F^Dlv%jP}utYc;p$d6P3g$+gCYm`xH7wj@q=2l2;v zk*%^xDod4z*BuMIcmDG6@lm&_Xz5dZo#QzLPjp_6+2>JZCu~K|m>51VVfV>fw#^a* z*Kru;Fl|zXLaHVL5XGU3<3j!?ScFo8oo?&3OcRMx6KLY>+&pbj7pgtBoMGv?RJEul zY=7u6ouJgK+`12>X3A# zN|l7~WROr;jw0si?%=Z6?J|lI5>#oAO=8`+ge8Ob<8K#`VndydZ8D_(sr)jHU#IwW z*XmXsMcb78d@SmNm~Qi`z$EtqEg@MtV=tUAFOOvRDquUhF;AVX9to4*udwhBhqE2{ zENPg0xSC+Yz_6VCx!S-VRz$Dm{6UX*mZJLTAYb`t!|5;~5SFo+W~-lq0EO)~u16I; zUWrQVt)09~*NxU&5-zA+^pOebTIY$s(jX)DM5+^Yut#`$r4TE_sGhA_bPo6fmQ#@}dT8|Q{{X~6I?n(A literal 0 HcmV?d00001 diff --git a/plugins/gitlab-issues-plugin/img/gl-no-repo-defined.png b/plugins/gitlab-issues-plugin/img/gl-no-repo-defined.png new file mode 100644 index 0000000000000000000000000000000000000000..448a862443738fdb5c972a11c8b3ea2ef37d2f60 GIT binary patch literal 13718 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 Ir0@5C0NC@ql>h($ literal 0 HcmV?d00001 diff --git a/plugins/gitlab-issues-plugin/img/gl-proxy.png b/plugins/gitlab-issues-plugin/img/gl-proxy.png new file mode 100644 index 0000000000000000000000000000000000000000..d380572630b6d20fbd926289ed62d871e4e393e3 GIT binary patch literal 12774 zcmeHthgVZk_az{rs1(Hph(rVtDN(8f0hJEYK{}}P5_*SFL_tKl^xl!)TL_4#bdVZ4 zNQWf!P!b69_&x>K%s((Q>&IG29{1gL&b{y4z4v*6N(xdG7w9e!5fM?yNQl6Y04}epV~)e0&33Ncy3^U$59{I$`ul-oV`~lX~(+qXuclU z)kbD8z_Ss{q*?I4n3 zsQiM^6525AuGn=Nfjf4No0;#MulB|^v7=32^1pI9fWxz^g)b4uOvnV?2q?ehS`?q0 zLu7c)R)0uc?9hBb*(th;gg_R``f7cmY*PPqCK>ozM_w&Q2P9hf{o=ghVwI6}lF^nK z;N_RbnldKx@+?j!0p>)cz!fp@p#wfdL}w!WiOvDPSAdUrD#_owBn_!&{$3Lm zA6I;)DkdWX{Hhw-8yj0YnAte;AQroTu7=FjG#xeNUqB3Ppj@wwY~C1ixk7D^n-D#5 zg#edOW5?GZSE!Y>1H@IB=|43f!1Zx4mrL#~HRA{Rg) z&=Y$j6Nrkq=j*hkvFxbV#h0BG9%f{Xm{76tx5d4rE%+1XS)Zlb*vvz## z%4zLz_rIO|?MK|$!O-5^*3sO?8g$(6>o+z|j>1e##{-@G{dbmm50Z=mUu<5Gx{xvR02mbf_-a1Sts$Rh#1C;zGcf8048@t>BOr!55@a{t@% zpF971OLYfhdodd*Fr=f%>B{_R{O`>_4WEFIE&s<8|8?_!N&!EMTzCRLSu>FftooABr|`PC86>(GgJ9F;Q@$&jN$lz{B>XNgIv zpA!A&%h$X1X@&RxzMcDdkPi{bf4?+|--3^*|5hO;CD4$NP91$WUSPibrx`Kn`Gy1f zlYgl96wgz89?`_aMT-BoU!e03mv1$VlrI`B7U@L@>+s8@h$LAen*%~yOJ`fMY|~=q z`{q0B*Qf6wtKN}cktQ7MGdrV)i=6V21yMD2Gt#~361pfR%im3Y=gMF$lp}~S#XR*w zjxnz>F0e@t*K%K0Z~@m7yTrRvA?>|}Et#O}e44MIul&g{T)fA}aB zrT^dY4`R-~W!Rvg=rq+62~U@}&{6BKXuPu9KOew&U5?AZz0#L^A%+^sE9Ffvm%Zj+5~JCZr2Ck^DRjC! zNoaHaYjLJoX@qk^$h{OHm+mTIw{|tQeGA(C3ONn8<@t0KgrvL{cGjZS<)}d|SM$ee zxmUB~7cF?v!9LP}+x8c-?C2{oTtDa4=X@m@Zlm^loH{VG&@UPN+LFPy4aX3!%Mmb9 zmq|}N;a6I-39iK&{$we?N#zLfb5jesYQMjEZ5iiArNQ_!IN=ovCSa1-nbP=+D~8jc zH@SZZI%XwWq+4r&>`7?+I!GnFrU&00#&+959C4bmF>E$H-gCKYX#PWNzamN;k8)k! zS32FYBsb1iPkXeHe&;dm9$n9SttgikbCJwz;OUUX{X*SJf2+}ha<$@@64tT3+7va7 z)*}yKIIla+jSOtySX;d`PeJ(K3)pph)y5pH|@4ivtIMIq-`2J`uOEy7^=3eaA226v7mc)@&G9J~NCiEuzR9O2hc zJBNj1)w-BV_ywI_a~he*dyjrsCzzc_x_y6S`15lz0{^l5efMX!j7){3_A2Ft%DxDG zD4iY7bB!RZRpuC10Y&y!jieIbGu19BYWalhME-tIB4H)hX_VJ|u6qK$DRBhGER}XQ zTK_5u)UC07CW2dsp$1F)S$FEuO?&T8_RO>*XgnKYwqy^crS4c0UAOY}fYM|+FfeY57$ zEb)QKM=+N<9-?V#kER=7#ajVMGiZmEf!Ty+`}v*91Rj&tR|Zb*;49R_CyN}Alt zC#K&j@R983_M8Lv3`r+?dzhyuI+AlVHe4skVgvI*xoSa==Q+N@es1YeTkIphjt42U zl|%NM18n%b#?ARI!3C zJlp%KMx;o-ow~? zvG`Rq)c;~zunnJuTI7UKb=zFvESka-!o5l`s|8WDll?VjTJ%0OTJ0Qz@E|MGQrGL^ zs6tSdT;qd_*AHGLhuG>(5*n+~W~NWed+IznIy4G+L#a@lS+dce=h{-L;Y%4kjzvWt z<|Adb4CaGQ5cy|0{Eq0oQeHD9#VYFwlQYio17EW2vp$x&wy7+?S?JA{PS*YTiNPl4 z=~a%sh@^hhq=|G)&<%DA7tDd(jW~WNjt291D-!$24C3N?AgX$W#Byq1$#!a7DMw&Q zK5@@X)?b87AqT?ju_~y8K{YjJde(9i;&b)j*}~5K*_@qML+$UO6-&mjiN*Tx1sj81 z0bE*Yj+?mdtRw|y>oay(JAzqerh&fW^wd2%PfG9Ul+t8C#Y>!DymWrG)R4xC4?&)< z+Op#;sLjiWUpa8^epjC?TqlF4OtN~2HyM6~m!jk45E4KL;v4X*V@1;moR%+zre6Bx zPJWHz(BfVmPD@hDRZ_TcgUcxYMG_7H>x$~oAfrI9#hawEJJtEZg0G`NI~lO=Ekj8g zhgajcF&_KCIKLFTmFS#-VL*jLd;&lf`4 z$=(DvATR!ZVm9KP@>clnnKYAPe!) ziK5=m$f#&dY|#B%xB1@GB=y(-c;^kD5^b^TRz@P!bE4h2Hbmk?46~Eg3LH`!X(5^_ z*)LwB)-RsGmamOIp|pjbya7!|IM&JK*`}h{;zR7uGP679V-$I*KVG{5)~~o5LmZmX z&$u1>l=(&M!>fg78&C&lFJ{S)QSxUZ^Y*hjbQ*L=E7zE@lQ1cFEP5f&arUSD)@T2l zJ2DhSQO`JX!{cb)e8Xh)(BMS;YxiFSg|tpKz*4k6#NH5f!0%K&fBdYR=17UImubnYmM<4X!d{&e_rBtz^Mtn&0k~tXX$VI z9$Bpq%H?Jhoa+p>$9GaVv8iTNI2dDT>#zQOLWq35Q@(mb_6T?`R?~MUVVwH&*Zwuq zi+T4@r`U{oor(Bu@eMtWx{s&zoQdDs3}bQwPfDgGNJtI9b()UXPW%c&13<52Oqu4S zwzpO)w|KV8SB2T5q0TJw$T={g0Rf$y}WUfO3GC2=FDi0K5f zzS9Fq+NvKO9K0Rt%m60|KC=kzSFdOu)k%G+g_FyiINH!tF~$E1aMb_odIP5 z&ti8{)L`1RZlaZZBn+p$kv*FmkY;gh8Rt)tJ2ORqERbX9L! zANngM&L0DQ{j%eXlV*7yE}H3oyVlRO1=hsZfIdTZAyBgZf#Uv ztaJ0%>t;Rppm%ZjQeA4hB5J6^(wMy!z|Vf8@3E(=(i8Ud9jU?Y7Tj(&8-!?rhE0Dup`@^3U8p5W(S0~{1TMM&0iP&yb9FM7S|3XTZB-Uc4 zpBrkZe zOLS$==&sLvdlY**2J++ZAgN)6Uyrf~mLpPpI>l!f#WmN3J$4cqCc5I-ix~zHCf~;B z`B1~jYK1%5+e;%lxE++ulxh2BI$G3Lscv_PrFQdbSaz3ApiPnIrh8VNGsJgwp#Rg{ z0=ts5{oX>y~HK7TsT^mo-YC-ZItz z3+PPb)2Z{C)N8=Ge<;v{E4(byWvSh2n6v27y2;~QKi8(Aw5=P@3;hlLzOy>kQv}w` zjV;hDZU6GdpjaPa(W8e?}PB56~RRWW zofQN=1SV>^up1$w2Z0x0xs5wP&5g878e9h9RTxNXbm5rMcnx_Uwp`J8;gh-j(Il)F zgs|GbpjGesr7)*)p%ZXyl$Uz4T>L=gEg@&C{dyg$FMIB1X$71szJH?aUp<=sJzHCA zGx&wmZEG(2E%;g(TjWppX#acF9EA>~UqJi0wd%0TQ!$ig zek3vfy6{oG+m>bmmYzSp_9yFn{wHpOT zKF=b!pme=hh-tNFZ5cmrW0(k{GexLl@D4%-nnRBCYrJiiqx86ge#oW*?}+}Tz-`=q zzt=N;(>EU2wR!)Vz!7a*E7(5p^$^Zj|5gLQ562am4u_MndiGd!Bwn{`38`y}iBI z@Gi}?HFY04@+-_?ZVsmH0gM&g4lX^z%V)g2JXq{zzVAr67?c^s6{-Uyi4YxmPyP)O z<*CgXQ>az^QctE3NCj*x`DAAe{7fZ zp#Gmz zf9K^j%lMhz|BH0&A(#{PW$HRcQyVQ<_~H)=$D z`UoDJWn$hVyY<7dE{W6fI=vA#yJDHgMCMBb3+Cz>M4VhoZmNXX%Epx9aB9Nv3&uTM zzVD`r@4@E55rNfds)!X(40J38-TM{X_MAGdk62|B-Fob*M9Bc*P|sJ}sV=}Qe-2c> z8vtz6xOtbYo0T~1?Jo8ZMsS08(9Yg=zDE9omJo*O40yH8)KFfPTA{Yq$E$1{d|kX` zNmKbP$-*8*?6+7IK5Nnmm|KTaV2Zwv29OC?3w zXpTEcoobZAk_fV3bTAa=v0I_a^48t~_l^AokN^QPFW?f* z;mBgODxhY}Y7Z&vGL#l-*2X*TZyVA;48na)jCN|=lGoek33ae_egfeI3&0k!D&kW&l!}>887r$1NUprV^#m3YohjwXh&)3rq{O6l@9+(Dbu=kIav? z^=QF5l25GaZwFHORuctQTS-T|P``sYFc>kPL2TbT6#_^k#n&oc8 zGbe+il6N6BlHxZ9l(myY6Yndhr&9K~pMogxb=T1kHt&SHIXFyK9ju#GL~9^)+2n{O z@=}VwyKK+pqIjEHfVTjf=_!s{=eR)anerq5dCI9U^G(lZntnBt_rnR=`oEz zNJ_5*G$|#^pwVk)ad8n+%dSx*eMC5%2jsRQr+)&!YrxkmxtO^iaD(d`TZfS{V{RZ& zfE1r^O#!6ZZ~S%~J@C*%SRb1AG50E-dlm(ES!?$@N0mHWkns(-+{Cup(G7u7SRn8s z9CuHkmn&D;J$X8rXpT6m$@-DOSQCDjLAp3OTw%(CyOp+ggv&pF@ppX~mmXwnW_!6m zOF2W5psn$_)Uc&}65+w(zP+T9_WUfHPF2AYD;Wdl(3dN8AGa2Jz}40h5itCYOuBer zrg?vMI%b9Uh-= z?3yL11=^Le(O?5>p2Xtf;x6c_6rem7b-7|!2FvpSBdvLKfk)FAS)|A9wrQjzVA`Fi zlK+y^ZMAlBJU^hr{$23i1IcE83S&SrE%Vs5_D-5;^lqdm1g01DGnl?3f<;bzk;oD> z^l+@qSPt%m-@!N|zGX^>KYv-Q4;|AgdF5-=ldMN}=_W|xFR< z&QabfIX7Bkmoe8C*%Gq3Vh?x5WGbeJIRDz*+n7~!{CSw*r8k7m5e48w)M%yUnAMHD zl9x0VJkp7&G{lEL6z|AI)`k3B`5Z7*r~|Kyzbi!ve*#cHLHoH6NvpP73-WL-ARt7r zsosO%;?(A4)2pih4%hD?1dH{-@K+SwfRCf>W`B;f^+9aJ&y=r9Jv&v^Z~D4!%mgmf z$S3dzn(#A>TlJ>D2MDfGynqcCJ-<~+##cHEuxT z(n4_lE`h(M^OHD%Fk>}Qr=I;HZe|6pU>Yl6ldP7fCIg^Z(|$zxBY@9#rzeqJ2H+H4 zzrRuS>QWkPS@QePGwtrwy?5H z7|2)ci^>lLyePn2TGXbE_@b?ze`K>>VOgn7pKIE5rnJ>LZ7vN}HEmHvx-2p8!0 z_9Ti?my*P{e7w$SL8Vfl`3Rp!#r&&2XGDQV@AtR&5;i6d;Qh_{@_rRyCq1}$gRA1T z##kR?SD?c}XQ{(G@BR53U$iUpJO*ubb{^4u^g9T;g1e=UU?++} zrh*{9lYdY9($R3rFMhLAM_A>A)(sw9FEL{tRG#@-b#`1JcUQ5aD3rCEZ16d0k<0Vq z+e{n|f-^0ljJ}8r^HbmbI{%J&?CdowClF6AG;LYT7BAVZ7BCI@`Y(lM5(6SOZTqb= ze`EbqP&=RiD0`7FomlVl)Cfob-4%;7JcYL6wM0z69=@jk* z5`g4BOX`_Zlfv%+T>Fx7$Uljkd6LU?p4j4224VLX*5fs_*))f!Vjg=SXgnNrda%5K zE&kxDvR(Y)mXOzYa)TPz_ZW*+E z(*3ZAEW_+h&B0d1Cucy&_kg`c;a2!8=X*qt95Gkc5td?)xx~%ZCo1+$-3qPF((>Wp z)J|@@$->9TzX&FZ8kK)ppgHf(IQrgWcWrEzQP7^ZLOtuq$G6O8%1g&)cU4#gSGk#H z?RVjijnoY!Fg!LUZ*c1KPx%D7AMJygnj0$oM*eHc&nHI#CA=;F-d!vHIH?Zc>B)MP z_J-SG$ZBiR#pZo|n(esi85EweB3h^ViBN+FfgCC+F1NEk>={#j`sDUw1_ z+|!|hn&-}IF%n!LtyNumTsofqZmV%yN zrpijoc;LhD2qp>p92tCG3wZ%1)jq@|F7;c!wZq5NS&>Z`aI9+88-1x+%fOR4Tjfv) zANh<;Y$+KInnfLyo1Q{p&ZHC6?U0r+%y65M%gH%Bq0YVixys4ZS>^V)r8 zK$s{)U0rV;g3kX)bVFAW&XCnUtt_NW5{d524)GejuTtv*vsMVTMb;UgN*0P~9FVJv`X?XtR2-xg&&y z>frLA%6}jd=nZMQM9>0QcV!^p!Qf=c5fw6jN(sn}np1gh%t+w9>j?(MM~gOii~zjB zeCuUj*+)n=f*OhbQJ%?7SvA(sR*;Hy?E^oKNR#?yqt_UR<^P)W0U(*W_Eg4b3QdkY1(W~iHo7-%Kc{PjJ z5J+?cTqa}C`3n*I7q7Py4$oz}2gmOWyA$A@0wb#uVr4_hj9nV>k&d!~k>1-izQ(*c z!Cy>#w&uV6VDShU@7tf{>bB@j9LzMo*andGxpvj3$Elss1&&NWiYM@A%qfuXO=>af z7XxYmknP}jug`UVq|77=hn9&ac`DIL#ijwUR2 zr^Ha8hNO3`Q{v324Mr|c8h6BW1WqZoF36*dMj{x|NOF(eRfo!>mSs_+<(c;pY=)A^ zx+A#~gfPmQ^-j2Ri?YSTyj4K+)kqT1ub&{AN_(Y>V`i2x6|O zxg~|f4^p+7VPK<{w_SHo=H{o1aF&ne^msDWGI;s=pLP6t*LN+ahngY-r|upU&Dh$K zBs99yKr8b6IL%9m9^)L$SC5*6;YP4qi{Q_mZdIqfJHoXOp z+{$=%nDG0q@o`ed;)lv{26ulR$(iow4f!bSG32;0hS2LyAgXQs#37`0_dWS&M+{d) zR!4LP?G|Rc8>3^i-D;Bsg@w#rK+}K7D@keE;wQ5xDN~`CViF~HU zT0>pCL0cS8z%7AY<)kNW?L}03lT+Ql*YACMyEb6nKW|Lq=`_HnQIzQ1su$^P%M#y{ zu?ir_8fScCosGPaD{1C6R>CYgN zpKca8)um#*gx-8klAg%$(0~^jOzH2a%Cqy_kUS~{hVC;+^09d< z{Cw+)>%&)0lYcO^PXNi;3v&WTQ$ykRg6ZQum3qDM^9^=Utyv)|UYq6`TKIklzOZQ0 z^=0ET;f=01RfrP-$dD$08WWm$a(Hu(imnQzJVfZaPdzxg z1LUttP$uzg$v}oRT$^vo5i`p%@URKDwJK~ho!X>QA^p17oRnRoFhZQ1rX9$jL+=j| zSE%QERZM-<09f>e2DPWWI-dm2_}L8PuJW=#Se};mMzD0uEdZsSndgM6DiWSD&)QpZAH<%;SVM7j?R>5J1D6 zcjXg!x%Zi>lH&KZViXf6(3YXrdKd~@ohs`{h|^TKn}bO_HSQPX0N=ykNYU&Ny2$@ z@Gkd4Ca8H{zNmHFw@(!)t92<>`GLfg)OCyYUY?f-ijm#lG@fvAd$XVGhHeXBtc(J* z9eB1f@Ge2G7dQG>L$Fa>#E2K9-W?lXNZ+D+;IP;&YUlgS9?c4AzVHXwoiF$4_8U}w zo}~TIwEKxrU!1T9KX4F5C)I@k5>&5w6a&P$D$Q;JN747|QhgN1#>Y6*y0-CRhuJ{- zMj*soGdi4x#DD+fn#||+olWKn>t)zLjE5irzh*K}8-7gS99OdZoiM8JH|NpSU8P;6 z2E2!iJkE($6J=dR$jfT5cHc>zfm}NtZ&k^ps(iIC%n6)xU|TZ`>AT| zlCuflWLIavC5lS-;vqhsiGDWVt%vf(hjueYcurWIqj{424z{lLx=e~kcO}=f2h!hG z`~2>7{t>llS28=mLAH^AeeA6O={8>M)^mpVP!^)Z7h!nDuCBomiv6wmNVv=3%4 zC~%QLx4$Sa!4t~wwz-&P+pCf3`M%v`uQ7gZ6H8&GfrKQvr=`qI7Vaja7OL>OYcd_z zyD)~*j)-o*-dZ-g?0k)43!8|3`tfl&%@B-!it(T2S%2}A5tb*QGT(JnR`9U@tpBCk z%ywNcNTD`gb<<0mJ_{^Cs;?9#gr~4+p~TFU7foR9DmZyrJ=uyPe2OdoaY(O=QC7m9 zSzVm;U?88|8FSVM8|qzvF8p-cWo6D(j8WK(^@!d6$=xNg`+{Jm)R+v==k9J8456a# zAp)og*D1>BD4igF-LHq}o3GrHHCyC>Git;b6e~4_5Lw=Spq%$=%!8(361}s`nuIw=YTAt{N%OvwbFw;w)Ykd!!t$W zOWO;NVOOo>c=C#dv>oGrj#i@3f|rh*Gf8iqMWzi$1vI zndo(h^H*oL&_ARjnS6<{vCl1QRh2YRDs1IwqdTL61b?I#dQ0;#)jd<7W*PR}`*1(z zFj{Afkn1GWyG(U)u_qjmooe$&TO#9#pPSO5m zwdL3!$j7FNyR&*T}W&Ew?(JFjoewsU; z(sMt);f_4Ybqhyv=S?Ht@UO+Om>+WRjpo7TE|{&8%M zFIP70cL%cmTv}r*F94XD5vrjW4ceps&_A+=G<}hSfXeXr12C>|1NUM0QJE@ z78objN`A^F--!b(^a{()sS>j84kWpe2G12vl!&JwW*~7JcE6PBL<#mm0(ocz;fno9 z2@%Pi%RtsyJP>v&O4jQG31w_d7|khFJs$|LS7urCiAA7kERZiRZhV*c*G7=fQ)wVO zenq>xGcR+*x zWX=IDk77Uu>YwI3T<-(ErVd*<_5LKlzp)`GaqwxoCszTh&PzL;TD3+El(aad$DFpi z4XC}sq?wSDY5KSTq5xtR(kpk`jtY00K=)-~a#s literal 0 HcmV?d00001 diff --git a/plugins/gitlab-issues-plugin/src/components/Issues.tsx b/plugins/gitlab-issues-plugin/src/components/Issues.tsx index f00b103..425d315 100644 --- a/plugins/gitlab-issues-plugin/src/components/Issues.tsx +++ b/plugins/gitlab-issues-plugin/src/components/Issues.tsx @@ -37,7 +37,7 @@ const Issues: React.FC = () => { const jResult = await iResult.json(); setPosts(jResult); } else { - const apiURL = `${glURL}api/v4/projects/${encodedRepo}/issues`; + const apiURL = `${glURL}api/v4/projects/${encodedRepo}/issues?sort=asc`; const iResult = await CortexApi.proxyFetch(apiURL); const jResult = await iResult.json(); setPosts(jResult); From 57db19611683d940e03c6629df596d158ee031cd Mon Sep 17 00:00:00 2001 From: Fernando Cremer Date: Tue, 15 Aug 2023 11:16:09 -0400 Subject: [PATCH 04/38] Increased size of images in readme --- plugins/gitlab-issues-plugin/README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/plugins/gitlab-issues-plugin/README.md b/plugins/gitlab-issues-plugin/README.md index 9dcc78b..fa6bbb8 100644 --- a/plugins/gitlab-issues-plugin/README.md +++ b/plugins/gitlab-issues-plugin/README.md @@ -2,7 +2,7 @@ View GitLab Issues associated to your services! -
+
The GitLab Issues shows the open GitLab issues associated to the GitLab repository specified in the entity's `cortex.yaml`. If the `cortex.yaml` has a `basepath` defined in its `x-cortex-git` configuration, it will query for issues filtering by a label that matches the tag of the entity. @@ -12,7 +12,7 @@ This plugin requires a proxy to GitLab. The API that the plugin uses is document - Define a secret that contains your GitLab Access Token. To determine which type of token to use, check the [docs](https://docs.gitlab.com/ee/api/rest/index.html#authentication). - Define a proxy that is pointed to your GitHub instance with the headers mentioned in the docs. Here is a screenshot of how your proxy may look like: -
+
- Register the plugin. - This plan will not work on the Global context. @@ -24,7 +24,7 @@ This plugin requires a proxy to GitLab. The API that the plugin uses is document If you get the following message: -
+
This means that the plugin did not find a GitHub repository defined as described [here](https://docs.cortex.io/docs/reference/integrations/github#catalog-descriptor). From 219177b3372eab7c5741600ff9553b2b4529b264 Mon Sep 17 00:00:00 2001 From: Fernando Cremer Date: Fri, 18 Aug 2023 10:33:14 -0400 Subject: [PATCH 05/38] Added Loader logic & logic to show user if no issues found --- plugins/gitlab-issues-plugin/README.md | 1 - .../src/components/Issues.tsx | 89 +++++++++++++------ 2 files changed, 62 insertions(+), 28 deletions(-) diff --git a/plugins/gitlab-issues-plugin/README.md b/plugins/gitlab-issues-plugin/README.md index fa6bbb8..f17cd74 100644 --- a/plugins/gitlab-issues-plugin/README.md +++ b/plugins/gitlab-issues-plugin/README.md @@ -32,7 +32,6 @@ This means that the plugin did not find a GitHub repository defined as described If you are getting a generic "Oops! There was a runtime error" message, you may want to look the browser's console and track where the plugin is breaking down based on which `console.log` output is displayed in the console. -Make sure that you use an Access Token created for the project, not the user. # Setting up your dev environment diff --git a/plugins/gitlab-issues-plugin/src/components/Issues.tsx b/plugins/gitlab-issues-plugin/src/components/Issues.tsx index 425d315..c71185e 100644 --- a/plugins/gitlab-issues-plugin/src/components/Issues.tsx +++ b/plugins/gitlab-issues-plugin/src/components/Issues.tsx @@ -1,9 +1,10 @@ import React from "react"; -import { CortexApi } from "@cortexapps/plugin-core"; +import { PluginContextLocation } from "@cortexapps/plugin-core"; import { SimpleTable, Box, Text, + Loader, usePluginContext, } from "@cortexapps/plugin-core/components"; import "../baseStyles.css"; @@ -11,38 +12,57 @@ import "../baseStyles.css"; // Set your Gitlab url. Cloud is https://gitlab.com const glURL = `https://gitlab.com/`; let hasGitLab: boolean = false; -// function to get Cortex API Basepath +// eslint-disable-next-line @typescript-eslint/no-unused-vars +let hasIssues: boolean = false; const Issues: React.FC = () => { const context = usePluginContext(); const [posts, setPosts] = React.useState([]); + const [isLoading, setIsLoading] = React.useState( + context.location === PluginContextLocation.Entity + ); React.useEffect(() => { const fetchData = async (): Promise => { // eslint-disable-next-line @typescript-eslint/no-non-null-assertion const cortexTag = context.entity!.tag; const cortexURL = context.apiBaseUrl; - const result = await fetch(`${cortexURL}/catalog/${cortexTag}/openapi`); - const resultJson = await result.json(); - if (resultJson.info?.["x-cortex-git"].gitlab.repository !== undefined) { - hasGitLab = true; - // If we have a GitHub tag, we assume there is a repo defined, let's get the value - const glRepo: string = - resultJson.info["x-cortex-git"].gitlab.repository; - // const encodedRepo = encodeURI(glRepo); - const encodedRepo = glRepo.replace("/", "%2F"); - // Let's check if we have a basepath defined, to check for mono repo - if (resultJson.info["x-cortex-git"].gitlab.basepath !== undefined) { - // we are going to assume that each service is being tracked via labels - const url: string = `${glURL}api/v4/projects/${encodedRepo}/issues?labels=${cortexTag}`; - const iResult = await fetch(url); - const jResult = await iResult.json(); - setPosts(jResult); - } else { - const apiURL = `${glURL}api/v4/projects/${encodedRepo}/issues?sort=asc`; - const iResult = await CortexApi.proxyFetch(apiURL); - const jResult = await iResult.json(); - setPosts(jResult); + const serviceResult = await fetch(`${cortexURL}/catalog/${cortexTag}/openapi`); + const serviceJson = await serviceResult.json(); + try{ + if (serviceJson.info?.["x-cortex-git"].gitlab.repository !== undefined) { + hasGitLab = true; + // If we have a GitHub tag, we assume there is a repo defined, let's get the value + const glRepo: string = + serviceJson.info["x-cortex-git"].gitlab.repository; + // Gitlab API requires us to take the owner/project format + // and change it to owner%2Fproject format + const encodedRepo = glRepo.replace("/", "%2F"); + // Let's check if we have a basepath defined, to check for mono repo + let issuesUrl:string = ""; + if (serviceJson.info["x-cortex-git"].gitlab.basepath !== undefined) { + // we are going to assume that each service is being tracked via labels + issuesUrl = `${glURL}api/v4/projects/${encodedRepo}/issues?labels=${cortexTag}`; + } + else { + issuesUrl = `${glURL}api/v4/projects/${encodedRepo}/issues?sort=asc`; + } + const issuesResult = await fetch(issuesUrl); + const issuesJson = await issuesResult.json(); + if (issuesJson.length > 0) + { + hasIssues = true; + setPosts(issuesJson); + } + + + + } } - } + catch(Error){ + + + } + setIsLoading(false); + }; void fetchData(); }, []); @@ -85,9 +105,24 @@ const Issues: React.FC = () => { }; if (hasGitLab) { - return ; - } else { - return ( + return isLoading ? ( + + ) : ( ); + }else if (hasGitLab && !hasIssues) { + return isLoading ? ( + + ) : ( + + + We could not find any Issues associated to this Service + + + ); + } + else { + return isLoading ? ( + + ) : ( This service does not have a GitLab Repo defined in the Service YAML From 1ce84a233f6abab14126559979ba0fb827f8a9fd Mon Sep 17 00:00:00 2001 From: Fernando Cremer Date: Tue, 5 Sep 2023 10:15:30 -0400 Subject: [PATCH 06/38] Added basic tests --- plugins/gitlab-issues-plugin/README.md | 2 - plugins/gitlab-issues-plugin/package.json | 1 + plugins/gitlab-issues-plugin/setupTests.ts | 5 +- .../src/components/App.test.tsx | 12 +- .../src/components/Issues.test.tsx | 137 ++++++++++++++++++ .../src/components/Issues.tsx | 51 +++---- plugins/gitlab-issues-plugin/tsconfig.json | 2 +- yarn.lock | 45 ++++++ 8 files changed, 220 insertions(+), 35 deletions(-) create mode 100644 plugins/gitlab-issues-plugin/src/components/Issues.test.tsx diff --git a/plugins/gitlab-issues-plugin/README.md b/plugins/gitlab-issues-plugin/README.md index f17cd74..b08189c 100644 --- a/plugins/gitlab-issues-plugin/README.md +++ b/plugins/gitlab-issues-plugin/README.md @@ -32,10 +32,8 @@ This means that the plugin did not find a GitHub repository defined as described If you are getting a generic "Oops! There was a runtime error" message, you may want to look the browser's console and track where the plugin is breaking down based on which `console.log` output is displayed in the console. - # Setting up your dev environment - GitLab Issues Plugin is a [Cortex](https://www.cortex.io/) plugin. To see how to run the plugin inside of Cortex, see [our docs](https://docs.cortex.io/docs/plugins). ### Prerequisites diff --git a/plugins/gitlab-issues-plugin/package.json b/plugins/gitlab-issues-plugin/package.json index e6a7d8c..e301a6f 100644 --- a/plugins/gitlab-issues-plugin/package.json +++ b/plugins/gitlab-issues-plugin/package.json @@ -33,6 +33,7 @@ "html-webpack-plugin": "^5.5.0", "jest": "^29.5.0", "jest-environment-jsdom": "^29.5.0", + "jest-fetch-mock": "^3.0.3", "npm-run-all": "^4.1.5", "prettier": "^2.8.4", "prop-types": "^15.8.1", diff --git a/plugins/gitlab-issues-plugin/setupTests.ts b/plugins/gitlab-issues-plugin/setupTests.ts index 95cd99a..fa0a10d 100644 --- a/plugins/gitlab-issues-plugin/setupTests.ts +++ b/plugins/gitlab-issues-plugin/setupTests.ts @@ -1,7 +1,10 @@ import "@testing-library/jest-dom/extend-expect"; +import fetchMock from "jest-fetch-mock"; + +fetchMock.enableMocks(); const mockContext = { - apiBaseUrl: "https://api.cortex.dev", + apiBaseUrl: "https://api.getcortexapp.com", entity: { definition: null, description: null, diff --git a/plugins/gitlab-issues-plugin/src/components/App.test.tsx b/plugins/gitlab-issues-plugin/src/components/App.test.tsx index 625761e..4966706 100644 --- a/plugins/gitlab-issues-plugin/src/components/App.test.tsx +++ b/plugins/gitlab-issues-plugin/src/components/App.test.tsx @@ -1,10 +1,18 @@ -import { render, screen } from "@testing-library/react"; +import { render } from "@testing-library/react"; import App from "./App"; +fetchMock.mockResponse( + JSON.stringify({ + value: + "https://docs.google.com/forms/d/e/1FAIpQLSd068wYDvfxbhB75fTx-KM7aWb9gNiLLcnjA6SQ4ulT9SLgqA/viewform?embedded=true", + }) +); describe("App", () => { it("indicates that it's an awesome plugin", () => { render(); - expect(screen.queryByText(/My Awesome Cortex Plugin/)).toBeInTheDocument(); + expect(fetch).toHaveBeenCalledWith( + "https://api.getcortexapp.com/catalog/inventory-planner/openapi" + ); }); }); diff --git a/plugins/gitlab-issues-plugin/src/components/Issues.test.tsx b/plugins/gitlab-issues-plugin/src/components/Issues.test.tsx new file mode 100644 index 0000000..ab79d78 --- /dev/null +++ b/plugins/gitlab-issues-plugin/src/components/Issues.test.tsx @@ -0,0 +1,137 @@ +import { render } from "@testing-library/react"; +import Issues from "./Issues"; + +const gitJSON = [ + { + project_id: 4, + milestone: { + due_date: null, + project_id: 4, + state: "closed", + description: + "Rerum est voluptatem provident consequuntur molestias similique ipsum dolor.", + iid: 3, + id: 11, + title: "v3.0", + created_at: "2016-01-04T15:31:39.788Z", + updated_at: "2016-01-04T15:31:39.788Z", + }, + author: { + state: "active", + web_url: "https://gitlab.example.com/root", + avatar_url: null, + username: "root", + id: 1, + name: "Administrator", + }, + description: "Omnis vero earum sunt corporis dolor et placeat.", + state: "closed", + iid: 1, + assignees: [ + { + avatar_url: null, + web_url: "https://gitlab.example.com/lennie", + state: "active", + username: "lennie", + id: 9, + name: "Dr. Luella Kovacek", + }, + ], + assignee: { + avatar_url: null, + web_url: "https://gitlab.example.com/lennie", + state: "active", + username: "lennie", + id: 9, + name: "Dr. Luella Kovacek", + }, + type: "ISSUE", + labels: ["foo", "bar"], + upvotes: 4, + downvotes: 0, + merge_requests_count: 0, + id: 41, + title: "Ut commodi ullam eos dolores perferendis nihil sunt.", + updated_at: "2016-01-04T15:31:46.176Z", + created_at: "2016-01-04T15:31:46.176Z", + closed_at: null, + closed_by: null, + user_notes_count: 1, + due_date: null, + web_url: "http://gitlab.example.com/my-group/my-project/issues/1", + references: { + short: "#1", + relative: "my-project#1", + full: "my-group/my-project#1", + }, + time_stats: { + time_estimate: 0, + total_time_spent: 0, + human_time_estimate: null, + human_total_time_spent: null, + }, + has_tasks: true, + task_status: "10 of 15 tasks completed", + confidential: false, + discussion_locked: false, + issue_type: "issue", + severity: "UNKNOWN", + _links: { + self: "http://gitlab.example.com/api/v4/projects/4/issues/41", + notes: "http://gitlab.example.com/api/v4/projects/4/issues/41/notes", + award_emoji: + "http://gitlab.example.com/api/v4/projects/4/issues/41/award_emoji", + project: "http://gitlab.example.com/api/v4/projects/4", + closed_as_duplicate_of: + "http://gitlab.example.com/api/v4/projects/1/issues/75", + }, + task_completion_status: { + count: 0, + completed_count: 0, + }, + }, +]; + +const serviceYaml = ` +openapi: 3.0.1 +info: + title: PatientConnect + x-cortex-git: + gitlab: + alias: main + repository: cremerfc/patientconnect + x-cortex-tag: patientconnect + x-cortex-type: service + x-cortex-groups: + - plugin + `; + +describe("Issues", () => { + beforeEach(() => { + // if you have an existing `beforeEach` just add the following lines to it + // fetchMock.mockIf(/^https?:\/\/api.getcortexapp.com*$/, req => { + // console.log("in block") + // return { + // body: JSON.stringify({}), + // headers: { + // 'X-Some-Response-Header': 'Some header value' + // } + // } + + // }) + + fetchMock.mockResponse(async (req) => { + const targetUrl = req.url; + if (targetUrl.startsWith("https://api.getcortexapp.com")) { + return await Promise.resolve(JSON.stringify(serviceYaml)); + } else if (targetUrl.startsWith("https://gitlab.com/")) { + return await Promise.resolve(JSON.stringify(gitJSON)); + } + throw new Error("Unexpected path"); + }); + }); + + it("has Issues", async () => { + render(); + }); +}); diff --git a/plugins/gitlab-issues-plugin/src/components/Issues.tsx b/plugins/gitlab-issues-plugin/src/components/Issues.tsx index c71185e..de3e81c 100644 --- a/plugins/gitlab-issues-plugin/src/components/Issues.tsx +++ b/plugins/gitlab-issues-plugin/src/components/Issues.tsx @@ -25,10 +25,14 @@ const Issues: React.FC = () => { // eslint-disable-next-line @typescript-eslint/no-non-null-assertion const cortexTag = context.entity!.tag; const cortexURL = context.apiBaseUrl; - const serviceResult = await fetch(`${cortexURL}/catalog/${cortexTag}/openapi`); + const serviceResult = await fetch( + `${cortexURL}/catalog/${cortexTag}/openapi` + ); const serviceJson = await serviceResult.json(); - try{ - if (serviceJson.info?.["x-cortex-git"].gitlab.repository !== undefined) { + try { + if ( + serviceJson.info?.["x-cortex-git"].gitlab.repository !== undefined + ) { hasGitLab = true; // If we have a GitHub tag, we assume there is a repo defined, let's get the value const glRepo: string = @@ -37,32 +41,22 @@ const Issues: React.FC = () => { // and change it to owner%2Fproject format const encodedRepo = glRepo.replace("/", "%2F"); // Let's check if we have a basepath defined, to check for mono repo - let issuesUrl:string = ""; + let issuesUrl: string = ""; if (serviceJson.info["x-cortex-git"].gitlab.basepath !== undefined) { // we are going to assume that each service is being tracked via labels issuesUrl = `${glURL}api/v4/projects/${encodedRepo}/issues?labels=${cortexTag}`; - } - else { + } else { issuesUrl = `${glURL}api/v4/projects/${encodedRepo}/issues?sort=asc`; } - const issuesResult = await fetch(issuesUrl); - const issuesJson = await issuesResult.json(); - if (issuesJson.length > 0) - { - hasIssues = true; - setPosts(issuesJson); - } - - - + const issuesResult = await fetch(issuesUrl); + const issuesJson = await issuesResult.json(); + if (issuesJson.length > 0) { + hasIssues = true; + setPosts(issuesJson); } } - catch(Error){ - - - } - setIsLoading(false); - + } catch (Error) {} + setIsLoading(false); }; void fetchData(); }, []); @@ -107,19 +101,18 @@ const Issues: React.FC = () => { if (hasGitLab) { return isLoading ? ( - ) : ( ); - }else if (hasGitLab && !hasIssues) { + ) : ( + + ); + } else if (hasGitLab && !hasIssues) { return isLoading ? ( ) : ( - - We could not find any Issues associated to this Service - + We could not find any Issues associated to this Service ); - } - else { + } else { return isLoading ? ( ) : ( diff --git a/plugins/gitlab-issues-plugin/tsconfig.json b/plugins/gitlab-issues-plugin/tsconfig.json index 0e2d2cf..2ebb4a8 100644 --- a/plugins/gitlab-issues-plugin/tsconfig.json +++ b/plugins/gitlab-issues-plugin/tsconfig.json @@ -11,6 +11,6 @@ "removeComments": true, "strictNullChecks": true, "target": "es6", - "typeRoots": ["../../node_modules/@types", "./node_modules/@types"], + "typeRoots": ["../../node_modules/@types", "./node_modules/@types"] } } diff --git a/yarn.lock b/yarn.lock index 0e30b43..9318afd 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3094,6 +3094,13 @@ cosmiconfig@^7.0.0: path-type "^4.0.0" yaml "^1.10.0" +cross-fetch@^3.0.4: + version "3.1.8" + resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-3.1.8.tgz#0327eba65fd68a7d119f8fb2bf9334a1a7956f82" + integrity sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg== + dependencies: + node-fetch "^2.6.12" + cross-spawn@^6.0.5: version "6.0.5" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" @@ -5180,6 +5187,14 @@ jest-environment-node@^29.6.2: jest-mock "^29.6.2" jest-util "^29.6.2" +jest-fetch-mock@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/jest-fetch-mock/-/jest-fetch-mock-3.0.3.tgz#31749c456ae27b8919d69824f1c2bd85fe0a1f3b" + integrity sha512-Ux1nWprtLrdrH4XwE7O7InRY6psIi3GOsqNESJgMJ+M5cv4A8Lh7SN9d2V2kKRZ8ebAfcd1LNyZguAOb6JiDqw== + dependencies: + cross-fetch "^3.0.4" + promise-polyfill "^8.1.3" + jest-get-type@^29.4.3: version "29.4.3" resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-29.4.3.tgz#1ab7a5207c995161100b5187159ca82dd48b3dd5" @@ -6081,6 +6096,13 @@ no-case@^3.0.4: lower-case "^2.0.2" tslib "^2.0.3" +node-fetch@^2.6.12: + 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" + node-forge@^1: version "1.3.1" resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-1.3.1.tgz#be8da2af243b2417d5f646a770663a92b7e9ded3" @@ -6574,6 +6596,11 @@ process-nextick-args@~2.0.0: resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== +promise-polyfill@^8.1.3: + version "8.3.0" + resolved "https://registry.yarnpkg.com/promise-polyfill/-/promise-polyfill-8.3.0.tgz#9284810268138d103807b11f4e23d5e945a4db63" + integrity sha512-H5oELycFml5yto/atYqmjyigJoAo3+OXwolYiH7OfQuYlAqhxNvTfiNMbV9hsC6Yp83yE5r2KTVmtrG6R9i6Pg== + prompts@^2.0.1, prompts@^2.4.2: version "2.4.2" resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.2.tgz#7b57e73b3a48029ad10ebd44f74b01722a4cb069" @@ -7630,6 +7657,11 @@ tr46@^3.0.0: dependencies: punycode "^2.1.1" +tr46@~0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" + integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== + ts-loader@^9.4.2: version "9.4.4" resolved "https://registry.yarnpkg.com/ts-loader/-/ts-loader-9.4.4.tgz#6ceaf4d58dcc6979f84125335904920884b7cee4" @@ -7946,6 +7978,11 @@ wbuf@^1.1.0, wbuf@^1.7.3: dependencies: minimalistic-assert "^1.0.0" +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== + webidl-conversions@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-7.0.0.tgz#256b4e1882be7debbf01d05f0aa2039778ea080a" @@ -8094,6 +8131,14 @@ whatwg-url@^11.0.0: tr46 "^3.0.0" webidl-conversions "^7.0.0" +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" + which-boxed-primitive@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" From 561af9765bac5080bf5f06647dced899c2d80c07 Mon Sep 17 00:00:00 2001 From: Fernando Cremer Date: Sat, 14 Oct 2023 22:08:46 -0400 Subject: [PATCH 07/38] added tests --- plugins/gitlab-issues-plugin/package.json | 1 + .../gitlab-issues-plugin/src/api/Cortex.ts | 8 + .../src/components/App.tsx | 14 +- .../src/components/EntityInfo.test.tsx | 25 + .../src/components/EntityInfo.tsx | 56 + .../src/components/Issues.test.tsx | 77 +- .../src/components/Issues.tsx | 87 +- .../src/lib/parseEntity.ts | 32 + yarn.lock | 1240 +++++++++++------ 9 files changed, 1024 insertions(+), 516 deletions(-) create mode 100644 plugins/gitlab-issues-plugin/src/components/EntityInfo.test.tsx create mode 100644 plugins/gitlab-issues-plugin/src/components/EntityInfo.tsx create mode 100644 plugins/gitlab-issues-plugin/src/lib/parseEntity.ts diff --git a/plugins/gitlab-issues-plugin/package.json b/plugins/gitlab-issues-plugin/package.json index e301a6f..dd6e7a3 100644 --- a/plugins/gitlab-issues-plugin/package.json +++ b/plugins/gitlab-issues-plugin/package.json @@ -4,6 +4,7 @@ "license": "MIT", "dependencies": { "@cortexapps/plugin-core": "^2.0.0", + "jest": "^29.7.0", "react": "^18.2.0", "react-dom": "^18.2.0" }, diff --git a/plugins/gitlab-issues-plugin/src/api/Cortex.ts b/plugins/gitlab-issues-plugin/src/api/Cortex.ts index aac391c..ce39520 100644 --- a/plugins/gitlab-issues-plugin/src/api/Cortex.ts +++ b/plugins/gitlab-issues-plugin/src/api/Cortex.ts @@ -5,3 +5,11 @@ export const getCortexContext = async (): Promise => { return context; }; +export const getEntityYaml = async ( + baseUrl: string, + entityTag: string +): Promise => { + const res = await fetch(`${baseUrl}/catalog/${entityTag}/openapi`); + + return await res.json(); +}; \ No newline at end of file diff --git a/plugins/gitlab-issues-plugin/src/components/App.tsx b/plugins/gitlab-issues-plugin/src/components/App.tsx index c82875d..dd73e24 100644 --- a/plugins/gitlab-issues-plugin/src/components/App.tsx +++ b/plugins/gitlab-issues-plugin/src/components/App.tsx @@ -1,14 +1,22 @@ import type React from "react"; -import { PluginProvider } from "@cortexapps/plugin-core/components"; +import { Box, Title, PluginProvider } from "@cortexapps/plugin-core/components"; import "../baseStyles.css"; import ErrorBoundary from "./ErrorBoundary"; -import Issues from "./Issues"; +import CortexEntity from "./EntityInfo" const App: React.FC = () => { return ( - + + + GitLab Issues + + ); diff --git a/plugins/gitlab-issues-plugin/src/components/EntityInfo.test.tsx b/plugins/gitlab-issues-plugin/src/components/EntityInfo.test.tsx new file mode 100644 index 0000000..cc2bd2d --- /dev/null +++ b/plugins/gitlab-issues-plugin/src/components/EntityInfo.test.tsx @@ -0,0 +1,25 @@ +import { render, screen, waitFor } from "@testing-library/react"; +import EntityInfo from "./EntityInfo"; + + +describe("EntityInfo", () => { + it("Shows message when no GitLab info found", async () => { + fetchMock.mockIf( + /^https:\/\/api\.getcortexapp\.com\/catalog\/.*/, + async (_req: Request) => { + return await Promise.resolve( + JSON.stringify({ + info: {}, + }) + ); + } + ); + render(); + + await waitFor(() => { + expect( + screen.queryByText("No GitHub details were found for this entity") + ).toBeInTheDocument(); + }); + }); +}); diff --git a/plugins/gitlab-issues-plugin/src/components/EntityInfo.tsx b/plugins/gitlab-issues-plugin/src/components/EntityInfo.tsx new file mode 100644 index 0000000..d1fcd86 --- /dev/null +++ b/plugins/gitlab-issues-plugin/src/components/EntityInfo.tsx @@ -0,0 +1,56 @@ +import { isEmpty, isNil } from "lodash"; +import { useCallback, useEffect, useState } from "react"; +import type React from "react"; +import { getEntityYaml } from "../api/Cortex"; +import { + Box, + Stack, + Text, + usePluginContext, +} from "@cortexapps/plugin-core/components"; +import { getGitLabDetailsFromEntity } from "../lib/parseEntity"; +import Issues from "./Issues"; + +const CortexEntity: React.FC = () => { + const context = usePluginContext(); + const [entityYaml, setEntityYaml] = useState< + Record | undefined + >(); + + const fetchEntityYaml = useCallback(async () => { + const entityTag = context.entity?.tag; + + if (!isNil(entityTag)) { + const yaml = await getEntityYaml(context.apiBaseUrl, entityTag); + setEntityYaml(yaml); + } + }, [context.apiBaseUrl, context.entity?.tag]); + + useEffect(() => { + void fetchEntityYaml(); + }, [fetchEntityYaml]); + + const gitlabDetails = isEmpty(entityYaml) + ? undefined + : getGitLabDetailsFromEntity(entityYaml); + + return ( +
+ {!isEmpty(entityYaml) && ( + + + {isEmpty(gitlabDetails) ? ( + + No GitHub details were found for this entity + + ) : ( + + )} + + + )} +
+ ); +}; + +export default CortexEntity; diff --git a/plugins/gitlab-issues-plugin/src/components/Issues.test.tsx b/plugins/gitlab-issues-plugin/src/components/Issues.test.tsx index ab79d78..2b029d1 100644 --- a/plugins/gitlab-issues-plugin/src/components/Issues.test.tsx +++ b/plugins/gitlab-issues-plugin/src/components/Issues.test.tsx @@ -1,7 +1,7 @@ -import { render } from "@testing-library/react"; +import { render, screen, waitFor } from "@testing-library/react"; import Issues from "./Issues"; -const gitJSON = [ +const mockIssue = [ { project_id: 4, milestone: { @@ -92,46 +92,47 @@ const gitJSON = [ }, ]; -const serviceYaml = ` -openapi: 3.0.1 -info: - title: PatientConnect - x-cortex-git: - gitlab: - alias: main - repository: cremerfc/patientconnect - x-cortex-tag: patientconnect - x-cortex-type: service - x-cortex-groups: - - plugin - `; +const serviceYaml = { + info: { + "x-cortex-git": { + gitlab: { + repository: "cortexapps/plugin-core", + }, + }, + }, +}; describe("Issues", () => { - beforeEach(() => { - // if you have an existing `beforeEach` just add the following lines to it - // fetchMock.mockIf(/^https?:\/\/api.getcortexapp.com*$/, req => { - // console.log("in block") - // return { - // body: JSON.stringify({}), - // headers: { - // 'X-Some-Response-Header': 'Some header value' - // } - // } - - // }) - - fetchMock.mockResponse(async (req) => { - const targetUrl = req.url; - if (targetUrl.startsWith("https://api.getcortexapp.com")) { - return await Promise.resolve(JSON.stringify(serviceYaml)); - } else if (targetUrl.startsWith("https://gitlab.com/")) { - return await Promise.resolve(JSON.stringify(gitJSON)); + it("has Issues", async () => { + fetchMock.mockIf( + /^https:\/gitlab\.com\/api/, + async (_req: Request) => { + return await Promise.resolve(JSON.stringify([mockIssue])); } - throw new Error("Unexpected path"); + ); + + render(); + expect(screen.queryByText("Loading")).toBeInTheDocument(); + expect(screen.queryByText("loading")).not.toBeInTheDocument(); + await waitFor(() => { + expect(screen.queryByText("Loading")).not.toBeInTheDocument(); }); + expect(screen.queryByText("GitHub Issues")).not.toBeInTheDocument(); + // expect(screen.queryByText("Number")).toBeInTheDocument(); }); - it("has Issues", async () => { - render(); + it("has no Issues", async () => { + render(); + expect(screen.queryByText("Loading")).toBeInTheDocument(); + // expect(screen.queryByText("Number")).not.toBeInTheDocument(); + + await waitFor(() => { + expect(screen.queryByText("Loading")).not.toBeInTheDocument(); + }); + expect( + screen.queryByText( + "We could not find any Issues associated to this Service" + ) + ).toBeInTheDocument(); }); -}); +}); \ No newline at end of file diff --git a/plugins/gitlab-issues-plugin/src/components/Issues.tsx b/plugins/gitlab-issues-plugin/src/components/Issues.tsx index de3e81c..9393837 100644 --- a/plugins/gitlab-issues-plugin/src/components/Issues.tsx +++ b/plugins/gitlab-issues-plugin/src/components/Issues.tsx @@ -1,4 +1,4 @@ -import React from "react"; +import React, {useState } from "react"; import { PluginContextLocation } from "@cortexapps/plugin-core"; import { SimpleTable, @@ -8,53 +8,47 @@ import { usePluginContext, } from "@cortexapps/plugin-core/components"; import "../baseStyles.css"; +import { getGitLabDetailsFromEntity } from "../lib/parseEntity"; + +interface GitIssuesProps { + entityYaml: Record; +} // Set your Gitlab url. Cloud is https://gitlab.com const glURL = `https://gitlab.com/`; -let hasGitLab: boolean = false; -// eslint-disable-next-line @typescript-eslint/no-unused-vars -let hasIssues: boolean = false; -const Issues: React.FC = () => { + +const Issues: React.FC = ({ entityYaml }) => { + const [hasIssues, setHasIssues] = useState(false); const context = usePluginContext(); const [posts, setPosts] = React.useState([]); const [isLoading, setIsLoading] = React.useState( context.location === PluginContextLocation.Entity ); + const { owner, repo, basepath } = getGitLabDetailsFromEntity(entityYaml) as { + owner: string; + repo: string; + basepath: string; + }; + React.useEffect(() => { const fetchData = async (): Promise => { // eslint-disable-next-line @typescript-eslint/no-non-null-assertion const cortexTag = context.entity!.tag; - const cortexURL = context.apiBaseUrl; - const serviceResult = await fetch( - `${cortexURL}/catalog/${cortexTag}/openapi` - ); - const serviceJson = await serviceResult.json(); try { - if ( - serviceJson.info?.["x-cortex-git"].gitlab.repository !== undefined - ) { - hasGitLab = true; - // If we have a GitHub tag, we assume there is a repo defined, let's get the value - const glRepo: string = - serviceJson.info["x-cortex-git"].gitlab.repository; - // Gitlab API requires us to take the owner/project format - // and change it to owner%2Fproject format - const encodedRepo = glRepo.replace("/", "%2F"); - // Let's check if we have a basepath defined, to check for mono repo - let issuesUrl: string = ""; - if (serviceJson.info["x-cortex-git"].gitlab.basepath !== undefined) { - // we are going to assume that each service is being tracked via labels - issuesUrl = `${glURL}api/v4/projects/${encodedRepo}/issues?labels=${cortexTag}`; + let issueUrl: string = ""; + if ( basepath !== undefined ) { + + issueUrl = `${glURL}api/v4/projects/${owner}%2F${repo}/issues?labels=${cortexTag}`; } else { - issuesUrl = `${glURL}api/v4/projects/${encodedRepo}/issues?sort=asc`; + issueUrl = `${glURL}api/v4/projects/${owner}%2F${repo}/issues?sort=asc`; } - const issuesResult = await fetch(issuesUrl); + const issuesResult = await fetch(issueUrl); const issuesJson = await issuesResult.json(); if (issuesJson.length > 0) { - hasIssues = true; + setHasIssues(true); setPosts(issuesJson); } - } + } catch (Error) {} setIsLoading(false); }; @@ -98,33 +92,16 @@ const Issues: React.FC = () => { ], }; - if (hasGitLab) { - return isLoading ? ( - - ) : ( + + return isLoading ? ( + + ) : hasIssues ? ( - ); - } else if (hasGitLab && !hasIssues) { - return isLoading ? ( - - ) : ( - - We could not find any Issues associated to this Service - - ); - } else { - return isLoading ? ( - - ) : ( - - - This service does not have a GitLab Repo defined in the Service YAML - or the GitLab Access Token does not have access to the repository - specified. - - - ); - } + ) :( + We could not find any Issues associated to this Service + ); + + }; export default Issues; diff --git a/plugins/gitlab-issues-plugin/src/lib/parseEntity.ts b/plugins/gitlab-issues-plugin/src/lib/parseEntity.ts new file mode 100644 index 0000000..9ab8601 --- /dev/null +++ b/plugins/gitlab-issues-plugin/src/lib/parseEntity.ts @@ -0,0 +1,32 @@ +export const getGitLabDetailsFromEntity = ( + entity: Record + ): { owner: string; repo: string; basepath: string } | undefined => { + let owner = ""; + let repo = ""; + let basepath = ""; + + try { + const gitlabDetails = entity.info["x-cortex-git"]?.gitlab; + // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions + if (!gitlabDetails) { + owner = ""; + repo = ""; + basepath = ""; + + return undefined; + } else { + [owner, repo] = gitlabDetails?.repository?.split("/"); + basepath = gitlabDetails?.repository?.basepath; + } + if (!owner || !repo) { + owner = ""; + repo = ""; + basepath = ""; + } + } catch { + + } + + // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions + return { owner, repo, basepath }; +}; \ No newline at end of file diff --git a/yarn.lock b/yarn.lock index 35d09de..5b4f844 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1170,6 +1170,22 @@ version "2.1.1" resolved "https://registry.yarnpkg.com/@cortexapps/plugin-core/-/plugin-core-2.1.1.tgz#d51fe6270a30a9e59a0c0f9aa851d8f113a3adc9" integrity sha512-d1+jbOztfEpBS3Z3JactaF7KZwCEJOMN9kK/lYl4mNcxvsOpxDicMcAoaarVbhOC6gyhXpidLcYAoNimG3uSGw== + dependencies: + "@phosphor-icons/react" "^2.0.9" + bootstrap "^5.2.3" + classnames "^2.3.2" + lodash "^4.17.21" + react-keyed-flatten-children "^1.3.0" + react-modal-image "^2.6.0" + react-select "^5.7.3" + react-syntax-highlighter "^15.5.0" + react-toggle "^4.1.3" + reactstrap "^9.1.9" + +"@cortexapps/plugin-core@^2.1.3": + version "2.1.3" + resolved "https://registry.yarnpkg.com/@cortexapps/plugin-core/-/plugin-core-2.1.3.tgz#c2e9f48adcbf37d58b82e04d17d1f0dd50cb81ee" + integrity sha512-LPRhxshdNtbcw0uTWtKxv6uLqEScXPpjInM51zB0GsRoAc9z7e4UsbltI0WAiQqDR3PNsFhQzXqb+7JteHfE4g== dependencies: "@phosphor-icons/react" "2.0.9" bootstrap "^5.2.3" @@ -1417,18 +1433,6 @@ resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98" integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== -"@jest/console@^29.6.3": - version "29.6.3" - resolved "https://registry.yarnpkg.com/@jest/console/-/console-29.6.3.tgz#55ad945087c27e380d6d9fcbb85181ed802543f3" - integrity sha512-ukZbHAdDH4ktZIOKvWs1juAXhiVAdvCyM8zv4S/7Ii3vJSDvMW5k+wOVGMQmHLHUFw3Ko63ZQNy7NI6PSlsD5w== - dependencies: - "@jest/types" "^29.6.3" - "@types/node" "*" - chalk "^4.0.0" - jest-message-util "^29.6.3" - jest-util "^29.6.3" - slash "^3.0.0" - "@jest/console@^29.6.2": version "29.6.2" resolved "https://registry.yarnpkg.com/@jest/console/-/console-29.6.2.tgz#bf1d4101347c23e07c029a1b1ae07d550f5cc541" @@ -1441,15 +1445,27 @@ jest-util "^29.6.2" slash "^3.0.0" -"@jest/core@^29.6.1": - version "29.6.1" - resolved "https://registry.yarnpkg.com/@jest/core/-/core-29.6.1.tgz#fac0d9ddf320490c93356ba201451825231e95f6" - integrity sha512-CcowHypRSm5oYQ1obz1wfvkjZZ2qoQlrKKvlfPwh5jUXVU12TWr2qMeH8chLMuTFzHh5a1g2yaqlqDICbr+ukQ== +"@jest/console@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/console/-/console-29.7.0.tgz#cd4822dbdb84529265c5a2bdb529a3c9cc950ffc" + integrity sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg== dependencies: - "@jest/console" "^29.6.3" - "@jest/reporters" "^29.6.3" - "@jest/test-result" "^29.6.3" - "@jest/transform" "^29.6.3" + "@jest/types" "^29.6.3" + "@types/node" "*" + chalk "^4.0.0" + jest-message-util "^29.7.0" + jest-util "^29.7.0" + slash "^3.0.0" + +"@jest/core@^29.6.1", "@jest/core@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/core/-/core-29.7.0.tgz#b6cccc239f30ff36609658c5a5e2291757ce448f" + integrity sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg== + dependencies: + "@jest/console" "^29.7.0" + "@jest/reporters" "^29.7.0" + "@jest/test-result" "^29.7.0" + "@jest/transform" "^29.7.0" "@jest/types" "^29.6.3" "@types/node" "*" ansi-escapes "^4.2.1" @@ -1457,21 +1473,21 @@ ci-info "^3.2.0" exit "^0.1.2" graceful-fs "^4.2.9" - jest-changed-files "^29.6.3" - jest-config "^29.6.3" - jest-haste-map "^29.6.3" - jest-message-util "^29.6.3" + jest-changed-files "^29.7.0" + jest-config "^29.7.0" + jest-haste-map "^29.7.0" + jest-message-util "^29.7.0" jest-regex-util "^29.6.3" - jest-resolve "^29.6.3" - jest-resolve-dependencies "^29.6.3" - jest-runner "^29.6.3" - jest-runtime "^29.6.3" - jest-snapshot "^29.6.3" - jest-util "^29.6.3" - jest-validate "^29.6.3" - jest-watcher "^29.6.3" + jest-resolve "^29.7.0" + jest-resolve-dependencies "^29.7.0" + jest-runner "^29.7.0" + jest-runtime "^29.7.0" + jest-snapshot "^29.7.0" + jest-util "^29.7.0" + jest-validate "^29.7.0" + jest-watcher "^29.7.0" micromatch "^4.0.4" - pretty-format "^29.6.3" + pretty-format "^29.7.0" slash "^3.0.0" strip-ansi "^6.0.0" @@ -1509,14 +1525,14 @@ slash "^3.0.0" strip-ansi "^6.0.0" -"@jest/environment@^29.6.1": - version "29.6.1" - resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-29.6.1.tgz#ee358fff2f68168394b4a50f18c68278a21fe82f" - integrity sha512-RMMXx4ws+Gbvw3DfLSuo2cfQlK7IwGbpuEWXCqyYDcqYTI+9Ju3a5hDnXaxjNsa6uKh9PQF2v+qg+RLe63tz5A== +"@jest/create-cache-key-function@^27.4.2": + version "27.5.1" + resolved "https://registry.yarnpkg.com/@jest/create-cache-key-function/-/create-cache-key-function-27.5.1.tgz#7448fae15602ea95c828f5eceed35c202a820b31" + integrity sha512-dmH1yW+makpTSURTy8VzdUwFnfQh1G8R+DxO2Ho2FFmBbKFEVm+3jWdvFhE2VqB/LATCTokkP0dotjyQyw5/AQ== dependencies: "@jest/types" "^27.5.1" -"@jest/environment@^29.6.1", "@jest/environment@^29.6.3": +"@jest/environment@^29.6.1": version "29.6.3" resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-29.6.3.tgz#bb02535c729393a0345b8d2c5eef94d34f7b35a3" integrity sha512-u/u3cCztYCfgBiGHsamqP5x+XvucftOGPbf5RJQxfpeC1y4AL8pCjKvPDA3oCmdhZYPgk5AE0VOD/flweR69WA== @@ -1536,12 +1552,15 @@ "@types/node" "*" jest-mock "^29.6.2" -"@jest/expect-utils@^29.6.1": - version "29.6.1" - resolved "https://registry.yarnpkg.com/@jest/expect-utils/-/expect-utils-29.6.1.tgz#ab83b27a15cdd203fe5f68230ea22767d5c3acc5" - integrity sha512-o319vIf5pEMx0LmzSxxkYYxo4wrRLKHq9dP1yJU7FoPTB0LfAKSz8SWD6D/6U3v/O52t9cF5t+MeJiRsfk7zMw== +"@jest/environment@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-29.7.0.tgz#24d61f54ff1f786f3cd4073b4b94416383baf2a7" + integrity sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw== dependencies: - jest-get-type "^29.6.3" + "@jest/fake-timers" "^29.7.0" + "@jest/types" "^29.6.3" + "@types/node" "*" + jest-mock "^29.7.0" "@jest/expect-utils@^29.6.2": version "29.6.2" @@ -1550,13 +1569,12 @@ dependencies: jest-get-type "^29.4.3" -"@jest/expect@^29.6.1": - version "29.6.1" - resolved "https://registry.yarnpkg.com/@jest/expect/-/expect-29.6.1.tgz#fef18265188f6a97601f1ea0a2912d81a85b4657" - integrity sha512-N5xlPrAYaRNyFgVf2s9Uyyvr795jnB6rObuPx4QFvNJz8aAjpZUDfO4bh5G/xuplMID8PrnuF1+SfSyDxhsgYg== +"@jest/expect-utils@^29.6.3", "@jest/expect-utils@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/expect-utils/-/expect-utils-29.7.0.tgz#023efe5d26a8a70f21677d0a1afc0f0a44e3a1c6" + integrity sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA== dependencies: - expect "^29.6.3" - jest-snapshot "^29.6.3" + jest-get-type "^29.6.3" "@jest/expect@^29.6.2": version "29.6.2" @@ -1566,17 +1584,25 @@ expect "^29.6.2" jest-snapshot "^29.6.2" +"@jest/expect@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/expect/-/expect-29.7.0.tgz#76a3edb0cb753b70dfbfe23283510d3d45432bf2" + integrity sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ== + dependencies: + expect "^29.7.0" + jest-snapshot "^29.7.0" + "@jest/fake-timers@^29.6.1": version "29.6.1" resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-29.6.1.tgz#c773efddbc61e1d2efcccac008139f621de57c69" integrity sha512-RdgHgbXyosCDMVYmj7lLpUwXA4c69vcNzhrt69dJJdf8azUrpRh3ckFCaTPNjsEeRi27Cig0oKDGxy5j7hOgHg== dependencies: - "@jest/types" "^29.6.3" + "@jest/types" "^29.6.1" "@sinonjs/fake-timers" "^10.0.2" "@types/node" "*" - jest-message-util "^29.6.3" - jest-mock "^29.6.3" - jest-util "^29.6.3" + jest-message-util "^29.6.1" + jest-mock "^29.6.1" + jest-util "^29.6.1" "@jest/fake-timers@^29.6.2": version "29.6.2" @@ -1590,15 +1616,17 @@ jest-mock "^29.6.2" jest-util "^29.6.2" -"@jest/globals@^29.6.1": - version "29.6.1" - resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-29.6.1.tgz#c8a8923e05efd757308082cc22893d82b8aa138f" - integrity sha512-2VjpaGy78JY9n9370H8zGRCFbYVWwjY6RdDMhoJHa1sYfwe6XM/azGN0SjY8kk7BOZApIejQ1BFPyH7FPG0w3A== +"@jest/fake-timers@^29.6.3", "@jest/fake-timers@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-29.7.0.tgz#fd91bf1fffb16d7d0d24a426ab1a47a49881a565" + integrity sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ== dependencies: - "@jest/environment" "^29.6.3" - "@jest/expect" "^29.6.3" "@jest/types" "^29.6.3" - jest-mock "^29.6.3" + "@sinonjs/fake-timers" "^10.0.2" + "@types/node" "*" + jest-message-util "^29.7.0" + jest-mock "^29.7.0" + jest-util "^29.7.0" "@jest/globals@^29.6.2": version "29.6.2" @@ -1610,16 +1638,26 @@ "@jest/types" "^29.6.1" jest-mock "^29.6.2" -"@jest/reporters@^29.6.1": - version "29.6.1" - resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-29.6.1.tgz#3325a89c9ead3cf97ad93df3a427549d16179863" - integrity sha512-9zuaI9QKr9JnoZtFQlw4GREQbxgmNYXU6QuWtmuODvk5nvPUeBYapVR/VYMyi2WSx3jXTLJTJji8rN6+Cm4+FA== +"@jest/globals@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-29.7.0.tgz#8d9290f9ec47ff772607fa864ca1d5a2efae1d4d" + integrity sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ== dependencies: - "@bcoe/v8-coverage" "^0.2.3" - "@jest/console" "^29.6.3" - "@jest/test-result" "^29.6.3" - "@jest/transform" "^29.6.3" + "@jest/environment" "^29.7.0" + "@jest/expect" "^29.7.0" "@jest/types" "^29.6.3" + jest-mock "^29.7.0" + +"@jest/reporters@^29.6.2": + version "29.6.2" + resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-29.6.2.tgz#524afe1d76da33d31309c2c4a2c8062d0c48780a" + integrity sha512-sWtijrvIav8LgfJZlrGCdN0nP2EWbakglJY49J1Y5QihcQLfy7ovyxxjJBRXMNltgt4uPtEcFmIMbVshEDfFWw== + dependencies: + "@bcoe/v8-coverage" "^0.2.3" + "@jest/console" "^29.6.2" + "@jest/test-result" "^29.6.2" + "@jest/transform" "^29.6.2" + "@jest/types" "^29.6.1" "@jridgewell/trace-mapping" "^0.3.18" "@types/node" "*" chalk "^4.0.0" @@ -1628,28 +1666,28 @@ glob "^7.1.3" graceful-fs "^4.2.9" istanbul-lib-coverage "^3.0.0" - istanbul-lib-instrument "^6.0.0" + istanbul-lib-instrument "^5.1.0" istanbul-lib-report "^3.0.0" istanbul-lib-source-maps "^4.0.0" istanbul-reports "^3.1.3" - jest-message-util "^29.6.3" - jest-util "^29.6.3" - jest-worker "^29.6.3" + jest-message-util "^29.6.2" + jest-util "^29.6.2" + jest-worker "^29.6.2" slash "^3.0.0" string-length "^4.0.1" strip-ansi "^6.0.0" v8-to-istanbul "^9.0.1" -"@jest/reporters@^29.6.2": - version "29.6.2" - resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-29.6.2.tgz#524afe1d76da33d31309c2c4a2c8062d0c48780a" - integrity sha512-sWtijrvIav8LgfJZlrGCdN0nP2EWbakglJY49J1Y5QihcQLfy7ovyxxjJBRXMNltgt4uPtEcFmIMbVshEDfFWw== +"@jest/reporters@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-29.7.0.tgz#04b262ecb3b8faa83b0b3d321623972393e8f4c7" + integrity sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg== dependencies: "@bcoe/v8-coverage" "^0.2.3" - "@jest/console" "^29.6.2" - "@jest/test-result" "^29.6.2" - "@jest/transform" "^29.6.2" - "@jest/types" "^29.6.1" + "@jest/console" "^29.7.0" + "@jest/test-result" "^29.7.0" + "@jest/transform" "^29.7.0" + "@jest/types" "^29.6.3" "@jridgewell/trace-mapping" "^0.3.18" "@types/node" "*" chalk "^4.0.0" @@ -1658,13 +1696,13 @@ glob "^7.1.3" graceful-fs "^4.2.9" istanbul-lib-coverage "^3.0.0" - istanbul-lib-instrument "^5.1.0" + istanbul-lib-instrument "^6.0.0" istanbul-lib-report "^3.0.0" istanbul-lib-source-maps "^4.0.0" istanbul-reports "^3.1.3" - jest-message-util "^29.6.2" - jest-util "^29.6.2" - jest-worker "^29.6.2" + jest-message-util "^29.7.0" + jest-util "^29.7.0" + jest-worker "^29.7.0" slash "^3.0.0" string-length "^4.0.1" strip-ansi "^6.0.0" @@ -1677,7 +1715,14 @@ dependencies: "@sinclair/typebox" "^0.27.8" -"@jest/source-map@^29.6.3": +"@jest/schemas@^29.6.3": + version "29.6.3" + resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-29.6.3.tgz#430b5ce8a4e0044a7e3819663305a7b3091c8e03" + integrity sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA== + dependencies: + "@sinclair/typebox" "^0.27.8" + +"@jest/source-map@^29.6.0", "@jest/source-map@^29.6.3": version "29.6.3" resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-29.6.3.tgz#d90ba772095cf37a34a5eb9413f1b562a08554c4" integrity sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw== @@ -1686,16 +1731,6 @@ callsites "^3.0.0" graceful-fs "^4.2.9" -"@jest/test-result@^29.6.3": - version "29.6.3" - resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-29.6.3.tgz#1da4c6749c16a71c108644624d9cd0d17206aa2b" - integrity sha512-k7ZZaNvOSMBHPZYiy0kuiaFoyansR5QnTwDux1EjK3kD5iWpRVyJIJ0RAIV39SThafchuW59vra7F8mdy5Hfgw== - dependencies: - "@jest/console" "^29.6.3" - "@jest/types" "^29.6.3" - "@types/istanbul-lib-coverage" "^2.0.0" - collect-v8-coverage "^1.0.0" - "@jest/test-result@^29.6.2": version "29.6.2" resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-29.6.2.tgz#fdd11583cd1608e4db3114e8f0cce277bf7a32ed" @@ -1706,15 +1741,15 @@ "@types/istanbul-lib-coverage" "^2.0.0" collect-v8-coverage "^1.0.0" -"@jest/test-sequencer@^29.6.1": - version "29.6.1" - resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-29.6.1.tgz#e3e582ee074dd24ea9687d7d1aaf05ee3a9b068e" - integrity sha512-oBkC36PCDf/wb6dWeQIhaviU0l5u6VCsXa119yqdUosYAt7/FbQU2M2UoziO3igj/HBDEgp57ONQ3fm0v9uyyg== +"@jest/test-result@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-29.7.0.tgz#8db9a80aa1a097bb2262572686734baed9b1657c" + integrity sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA== dependencies: - "@jest/test-result" "^29.6.3" - graceful-fs "^4.2.9" - jest-haste-map "^29.6.3" - slash "^3.0.0" + "@jest/console" "^29.7.0" + "@jest/types" "^29.6.3" + "@types/istanbul-lib-coverage" "^2.0.0" + collect-v8-coverage "^1.0.0" "@jest/test-sequencer@^29.6.2": version "29.6.2" @@ -1726,52 +1761,62 @@ jest-haste-map "^29.6.2" slash "^3.0.0" -"@jest/transform@^29.6.1": - version "29.6.1" - resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-29.6.1.tgz#acb5606019a197cb99beda3c05404b851f441c92" - integrity sha512-URnTneIU3ZjRSaf906cvf6Hpox3hIeJXRnz3VDSw5/X93gR8ycdfSIEy19FlVx8NFmpN7fe3Gb1xF+NjXaQLWg== +"@jest/test-sequencer@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz#6cef977ce1d39834a3aea887a1726628a6f072ce" + integrity sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw== + dependencies: + "@jest/test-result" "^29.7.0" + graceful-fs "^4.2.9" + jest-haste-map "^29.7.0" + slash "^3.0.0" + +"@jest/transform@^29.6.2": + version "29.6.2" + resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-29.6.2.tgz#522901ebbb211af08835bc3bcdf765ab778094e3" + integrity sha512-ZqCqEISr58Ce3U+buNFJYUktLJZOggfyvR+bZMaiV1e8B1SIvJbwZMrYz3gx/KAPn9EXmOmN+uB08yLCjWkQQg== dependencies: "@babel/core" "^7.11.6" - "@jest/types" "^29.6.3" + "@jest/types" "^29.6.1" "@jridgewell/trace-mapping" "^0.3.18" babel-plugin-istanbul "^6.1.1" chalk "^4.0.0" convert-source-map "^2.0.0" fast-json-stable-stringify "^2.1.0" graceful-fs "^4.2.9" - jest-haste-map "^29.6.3" - jest-regex-util "^29.6.3" - jest-util "^29.6.3" + jest-haste-map "^29.6.2" + jest-regex-util "^29.4.3" + jest-util "^29.6.2" micromatch "^4.0.4" pirates "^4.0.4" slash "^3.0.0" write-file-atomic "^4.0.2" -"@jest/transform@^29.6.2": - version "29.6.2" - resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-29.6.2.tgz#522901ebbb211af08835bc3bcdf765ab778094e3" - integrity sha512-ZqCqEISr58Ce3U+buNFJYUktLJZOggfyvR+bZMaiV1e8B1SIvJbwZMrYz3gx/KAPn9EXmOmN+uB08yLCjWkQQg== +"@jest/transform@^29.6.3", "@jest/transform@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-29.7.0.tgz#df2dd9c346c7d7768b8a06639994640c642e284c" + integrity sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw== dependencies: "@babel/core" "^7.11.6" - "@jest/types" "^29.6.1" + "@jest/types" "^29.6.3" "@jridgewell/trace-mapping" "^0.3.18" babel-plugin-istanbul "^6.1.1" chalk "^4.0.0" convert-source-map "^2.0.0" fast-json-stable-stringify "^2.1.0" graceful-fs "^4.2.9" - jest-haste-map "^29.6.2" - jest-regex-util "^29.4.3" - jest-util "^29.6.2" + jest-haste-map "^29.7.0" + jest-regex-util "^29.6.3" + jest-util "^29.7.0" micromatch "^4.0.4" pirates "^4.0.4" slash "^3.0.0" write-file-atomic "^4.0.2" -"@jest/types@^29.6.1": - version "29.6.1" - resolved "https://registry.yarnpkg.com/@jest/types/-/types-29.6.1.tgz#ae79080278acff0a6af5eb49d063385aaa897bf2" - integrity sha512-tPKQNMPuXgvdOn2/Lg9HNfUvjYVGolt04Hp03f5hAk878uwOLikN+JzeLY0HcVgKgFl9Hs3EIqpu3WX27XNhnw== +"@jest/types@^27.5.1": + version "27.5.1" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-27.5.1.tgz#3c79ec4a8ba61c170bf937bcf9e98a9df175ec80" + integrity sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw== dependencies: "@types/istanbul-lib-coverage" "^2.0.0" "@types/istanbul-reports" "^3.0.0" @@ -2061,15 +2106,281 @@ "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" +"@octokit/app@^14.0.0": + version "14.0.1" + resolved "https://registry.yarnpkg.com/@octokit/app/-/app-14.0.1.tgz#86e4501bc2cf8335a4767079dda41273975cdd88" + integrity sha512-4opdXcWBVhzd6FOxlaxDKXXqi9Vz2hsDSWQGNo49HbYFAX11UqMpksMjEdfvHy0x19Pse8Nvn+R6inNb/V398w== + dependencies: + "@octokit/auth-app" "^6.0.0" + "@octokit/auth-unauthenticated" "^5.0.0" + "@octokit/core" "^5.0.0" + "@octokit/oauth-app" "^6.0.0" + "@octokit/plugin-paginate-rest" "^9.0.0" + "@octokit/types" "^12.0.0" + "@octokit/webhooks" "^12.0.1" + +"@octokit/auth-app@^6.0.0": + version "6.0.1" + resolved "https://registry.yarnpkg.com/@octokit/auth-app/-/auth-app-6.0.1.tgz#7137b1af124189a979de6053da5d4c8cdb1fa4e9" + integrity sha512-tjCD4nzQNZgmLH62+PSnTF6eGerisFgV4v6euhqJik6yWV96e1ZiiGj+NXIqbgnpjLmtnBqVUrNyGKu3DoGEGA== + dependencies: + "@octokit/auth-oauth-app" "^7.0.0" + "@octokit/auth-oauth-user" "^4.0.0" + "@octokit/request" "^8.0.2" + "@octokit/request-error" "^5.0.0" + "@octokit/types" "^12.0.0" + deprecation "^2.3.1" + lru-cache "^10.0.0" + universal-github-app-jwt "^1.1.1" + universal-user-agent "^6.0.0" + +"@octokit/auth-oauth-app@^7.0.0": + version "7.0.1" + resolved "https://registry.yarnpkg.com/@octokit/auth-oauth-app/-/auth-oauth-app-7.0.1.tgz#30fd8fcb4608ca52c29c265a3fc7032897796c8e" + integrity sha512-RE0KK0DCjCHXHlQBoubwlLijXEKfhMhKm9gO56xYvFmP1QTMb+vvwRPmQLLx0V+5AvV9N9I3lr1WyTzwL3rMDg== + dependencies: + "@octokit/auth-oauth-device" "^6.0.0" + "@octokit/auth-oauth-user" "^4.0.0" + "@octokit/request" "^8.0.2" + "@octokit/types" "^12.0.0" + "@types/btoa-lite" "^1.0.0" + btoa-lite "^1.0.0" + universal-user-agent "^6.0.0" + +"@octokit/auth-oauth-device@^6.0.0": + version "6.0.1" + resolved "https://registry.yarnpkg.com/@octokit/auth-oauth-device/-/auth-oauth-device-6.0.1.tgz#38e5f7f8997c5e8b774f283463ecf4a7e42d7cee" + integrity sha512-yxU0rkL65QkjbqQedgVx3gmW7YM5fF+r5uaSj9tM/cQGVqloXcqP2xK90eTyYvl29arFVCW8Vz4H/t47mL0ELw== + dependencies: + "@octokit/oauth-methods" "^4.0.0" + "@octokit/request" "^8.0.0" + "@octokit/types" "^12.0.0" + universal-user-agent "^6.0.0" + +"@octokit/auth-oauth-user@^4.0.0": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@octokit/auth-oauth-user/-/auth-oauth-user-4.0.1.tgz#c8267883935c83f78318c726ff91d7e98de05517" + integrity sha512-N94wWW09d0hleCnrO5wt5MxekatqEJ4zf+1vSe8MKMrhZ7gAXKFOKrDEZW2INltvBWJCyDUELgGRv8gfErH1Iw== + dependencies: + "@octokit/auth-oauth-device" "^6.0.0" + "@octokit/oauth-methods" "^4.0.0" + "@octokit/request" "^8.0.2" + "@octokit/types" "^12.0.0" + btoa-lite "^1.0.0" + universal-user-agent "^6.0.0" + +"@octokit/auth-token@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@octokit/auth-token/-/auth-token-4.0.0.tgz#40d203ea827b9f17f42a29c6afb93b7745ef80c7" + integrity sha512-tY/msAuJo6ARbK6SPIxZrPBms3xPbfwBrulZe0Wtr/DIY9lje2HeV1uoebShn6mx7SjCHif6EjMvoREj+gZ+SA== + +"@octokit/auth-unauthenticated@^5.0.0": + version "5.0.1" + resolved "https://registry.yarnpkg.com/@octokit/auth-unauthenticated/-/auth-unauthenticated-5.0.1.tgz#d8032211728333068b2e07b53997c29e59a03507" + integrity sha512-oxeWzmBFxWd+XolxKTc4zr+h3mt+yofn4r7OfoIkR/Cj/o70eEGmPsFbueyJE2iBAGpjgTnEOKM3pnuEGVmiqg== + dependencies: + "@octokit/request-error" "^5.0.0" + "@octokit/types" "^12.0.0" + +"@octokit/core@^5.0.0": + version "5.0.1" + resolved "https://registry.yarnpkg.com/@octokit/core/-/core-5.0.1.tgz#865da2b30d54354cccb6e30861ddfa0e24494780" + integrity sha512-lyeeeZyESFo+ffI801SaBKmCfsvarO+dgV8/0gD8u1d87clbEdWsP5yC+dSj3zLhb2eIf5SJrn6vDz9AheETHw== + dependencies: + "@octokit/auth-token" "^4.0.0" + "@octokit/graphql" "^7.0.0" + "@octokit/request" "^8.0.2" + "@octokit/request-error" "^5.0.0" + "@octokit/types" "^12.0.0" + before-after-hook "^2.2.0" + universal-user-agent "^6.0.0" + +"@octokit/endpoint@^9.0.0": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@octokit/endpoint/-/endpoint-9.0.1.tgz#c3f69d27accddcb04a3199fcef541804288149d2" + integrity sha512-hRlOKAovtINHQPYHZlfyFwaM8OyetxeoC81lAkBy34uLb8exrZB50SQdeW3EROqiY9G9yxQTpp5OHTV54QD+vA== + dependencies: + "@octokit/types" "^12.0.0" + is-plain-object "^5.0.0" + universal-user-agent "^6.0.0" + +"@octokit/graphql@^7.0.0": + version "7.0.2" + resolved "https://registry.yarnpkg.com/@octokit/graphql/-/graphql-7.0.2.tgz#3df14b9968192f9060d94ed9e3aa9780a76e7f99" + integrity sha512-OJ2iGMtj5Tg3s6RaXH22cJcxXRi7Y3EBqbHTBRq+PQAqfaS8f/236fUrWhfSn8P4jovyzqucxme7/vWSSZBX2Q== + dependencies: + "@octokit/request" "^8.0.1" + "@octokit/types" "^12.0.0" + universal-user-agent "^6.0.0" + +"@octokit/oauth-app@^6.0.0": + version "6.0.0" + resolved "https://registry.yarnpkg.com/@octokit/oauth-app/-/oauth-app-6.0.0.tgz#a5c3b7794df4280c6aadbadd843119059d70a2c4" + integrity sha512-bNMkS+vJ6oz2hCyraT9ZfTpAQ8dZNqJJQVNaKjPLx4ue5RZiFdU1YWXguOPR8AaSHS+lKe+lR3abn2siGd+zow== + dependencies: + "@octokit/auth-oauth-app" "^7.0.0" + "@octokit/auth-oauth-user" "^4.0.0" + "@octokit/auth-unauthenticated" "^5.0.0" + "@octokit/core" "^5.0.0" + "@octokit/oauth-authorization-url" "^6.0.2" + "@octokit/oauth-methods" "^4.0.0" + "@types/aws-lambda" "^8.10.83" + universal-user-agent "^6.0.0" + +"@octokit/oauth-authorization-url@^6.0.2": + version "6.0.2" + resolved "https://registry.yarnpkg.com/@octokit/oauth-authorization-url/-/oauth-authorization-url-6.0.2.tgz#cc82ca29cc5e339c9921672f39f2b3f5c8eb6ef2" + integrity sha512-CdoJukjXXxqLNK4y/VOiVzQVjibqoj/xHgInekviUJV73y/BSIcwvJ/4aNHPBPKcPWFnd4/lO9uqRV65jXhcLA== + +"@octokit/oauth-methods@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@octokit/oauth-methods/-/oauth-methods-4.0.0.tgz#6e0c190e8ee95afe770a4a9a4321eb159a58c794" + integrity sha512-dqy7BZLfLbi3/8X8xPKUKZclMEK9vN3fK5WF3ortRvtplQTszFvdAGbTo71gGLO+4ZxspNiLjnqdd64Chklf7w== + dependencies: + "@octokit/oauth-authorization-url" "^6.0.2" + "@octokit/request" "^8.0.2" + "@octokit/request-error" "^5.0.0" + "@octokit/types" "^11.0.0" + btoa-lite "^1.0.0" + +"@octokit/openapi-types@^18.0.0": + version "18.1.1" + resolved "https://registry.yarnpkg.com/@octokit/openapi-types/-/openapi-types-18.1.1.tgz#09bdfdabfd8e16d16324326da5148010d765f009" + integrity sha512-VRaeH8nCDtF5aXWnjPuEMIYf1itK/s3JYyJcWFJT8X9pSNnBtriDf7wlEWsGuhPLl4QIH4xM8fqTXDwJ3Mu6sw== + +"@octokit/openapi-types@^19.0.0": + version "19.0.0" + resolved "https://registry.yarnpkg.com/@octokit/openapi-types/-/openapi-types-19.0.0.tgz#0101bf62ab14c1946149a0f8385440963e1253c4" + integrity sha512-PclQ6JGMTE9iUStpzMkwLCISFn/wDeRjkZFIKALpvJQNBGwDoYYi2fFvuHwssoQ1rXI5mfh6jgTgWuddeUzfWw== + +"@octokit/plugin-paginate-graphql@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@octokit/plugin-paginate-graphql/-/plugin-paginate-graphql-4.0.0.tgz#b26024fa454039c18b948f13bf754ff86b89e8b9" + integrity sha512-7HcYW5tP7/Z6AETAPU14gp5H5KmCPT3hmJrS/5tO7HIgbwenYmgw4OY9Ma54FDySuxMwD+wsJlxtuGWwuZuItA== + +"@octokit/plugin-paginate-rest@^8.0.0": + version "8.0.0" + resolved "https://registry.yarnpkg.com/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-8.0.0.tgz#417b5367da2ba3c2d255a59b87c1cc608228ec38" + integrity sha512-2xZ+baZWUg+qudVXnnvXz7qfrTmDeYPCzangBVq/1gXxii/OiS//4shJp9dnCCvj1x+JAm9ji1Egwm1BA47lPQ== + dependencies: + "@octokit/types" "^11.0.0" + +"@octokit/plugin-paginate-rest@^9.0.0": + version "9.0.0" + resolved "https://registry.yarnpkg.com/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-9.0.0.tgz#21fd12816c2dc158a775ed20be5abcbc61052a46" + integrity sha512-oIJzCpttmBTlEhBmRvb+b9rlnGpmFgDtZ0bB6nq39qIod6A5DP+7RkVLMOixIgRCYSHDTeayWqmiJ2SZ6xgfdw== + dependencies: + "@octokit/types" "^12.0.0" + +"@octokit/plugin-request-log@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@octokit/plugin-request-log/-/plugin-request-log-4.0.0.tgz#260fa6970aa97bbcbd91f99f3cd812e2b285c9f1" + integrity sha512-2uJI1COtYCq8Z4yNSnM231TgH50bRkheQ9+aH8TnZanB6QilOnx8RMD2qsnamSOXtDj0ilxvevf5fGsBhBBzKA== + +"@octokit/plugin-rest-endpoint-methods@^10.0.0": + version "10.0.1" + resolved "https://registry.yarnpkg.com/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-10.0.1.tgz#0587a8ae2391287fdfc7961a41cec7bfd1ef4968" + integrity sha512-fgS6HPkPvJiz8CCliewLyym9qAx0RZ/LKh3sATaPfM41y/O2wQ4Z9MrdYeGPVh04wYmHFmWiGlKPC7jWVtZXQA== + dependencies: + "@octokit/types" "^12.0.0" + +"@octokit/plugin-rest-endpoint-methods@^9.0.0": + version "9.0.0" + resolved "https://registry.yarnpkg.com/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-9.0.0.tgz#e15d54540893202da107305ded2bfd21ce6f769d" + integrity sha512-KquMF/VB1IkKNiVnzJKspY5mFgGyLd7HzdJfVEGTJFzqu9BRFNWt+nwTCMuUiWc72gLQhRWYubTwOkQj+w/1PA== + dependencies: + "@octokit/types" "^11.0.0" + +"@octokit/plugin-retry@^6.0.0": + version "6.0.1" + resolved "https://registry.yarnpkg.com/@octokit/plugin-retry/-/plugin-retry-6.0.1.tgz#3257404f7cc418e1c1f13a7f2012c1db848b7693" + integrity sha512-SKs+Tz9oj0g4p28qkZwl/topGcb0k0qPNX/i7vBKmDsjoeqnVfFUquqrE/O9oJY7+oLzdCtkiWSXLpLjvl6uog== + dependencies: + "@octokit/request-error" "^5.0.0" + "@octokit/types" "^12.0.0" + bottleneck "^2.15.3" + +"@octokit/plugin-throttling@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@octokit/plugin-throttling/-/plugin-throttling-7.0.0.tgz#89f2580b43cfd5ec17f19e3939d8af549f573b0b" + integrity sha512-KL2k/d0uANc8XqP5S64YcNFCudR3F5AaKO39XWdUtlJIjT9Ni79ekWJ6Kj5xvAw87udkOMEPcVf9xEge2+ahew== + dependencies: + "@octokit/types" "^11.0.0" + bottleneck "^2.15.3" + +"@octokit/request-error@^5.0.0": + version "5.0.1" + resolved "https://registry.yarnpkg.com/@octokit/request-error/-/request-error-5.0.1.tgz#277e3ce3b540b41525e07ba24c5ef5e868a72db9" + integrity sha512-X7pnyTMV7MgtGmiXBwmO6M5kIPrntOXdyKZLigNfQWSEQzVxR4a4vo49vJjTWX70mPndj8KhfT4Dx+2Ng3vnBQ== + dependencies: + "@octokit/types" "^12.0.0" + deprecation "^2.0.0" + once "^1.4.0" + +"@octokit/request@^8.0.0", "@octokit/request@^8.0.1", "@octokit/request@^8.0.2": + version "8.1.4" + resolved "https://registry.yarnpkg.com/@octokit/request/-/request-8.1.4.tgz#12dfaebdb2ea375eaabb41d39d45182531ac2857" + integrity sha512-M0aaFfpGPEKrg7XoA/gwgRvc9MSXHRO2Ioki1qrPDbl1e9YhjIwVoHE7HIKmv/m3idzldj//xBujcFNqGX6ENA== + dependencies: + "@octokit/endpoint" "^9.0.0" + "@octokit/request-error" "^5.0.0" + "@octokit/types" "^12.0.0" + is-plain-object "^5.0.0" + universal-user-agent "^6.0.0" + +"@octokit/rest@^20.0.1": + version "20.0.2" + resolved "https://registry.yarnpkg.com/@octokit/rest/-/rest-20.0.2.tgz#5cc8871ba01b14604439049e5f06c74b45c99594" + integrity sha512-Ux8NDgEraQ/DMAU1PlAohyfBBXDwhnX2j33Z1nJNziqAfHi70PuxkFYIcIt8aIAxtRE7KVuKp8lSR8pA0J5iOQ== + dependencies: + "@octokit/core" "^5.0.0" + "@octokit/plugin-paginate-rest" "^9.0.0" + "@octokit/plugin-request-log" "^4.0.0" + "@octokit/plugin-rest-endpoint-methods" "^10.0.0" + +"@octokit/types@^11.0.0", "@octokit/types@^11.1.0": + version "11.1.0" + resolved "https://registry.yarnpkg.com/@octokit/types/-/types-11.1.0.tgz#9e5db741d582b05718a4d91bac8cc987def235ea" + integrity sha512-Fz0+7GyLm/bHt8fwEqgvRBWwIV1S6wRRyq+V6exRKLVWaKGsuy6H9QFYeBVDV7rK6fO3XwHgQOPxv+cLj2zpXQ== + dependencies: + "@octokit/openapi-types" "^18.0.0" + +"@octokit/types@^12.0.0": + version "12.0.0" + resolved "https://registry.yarnpkg.com/@octokit/types/-/types-12.0.0.tgz#6b34309288b6f5ac9761d2589e3165cde1b95fee" + integrity sha512-EzD434aHTFifGudYAygnFlS1Tl6KhbTynEWELQXIbTY8Msvb5nEqTZIm7sbPEt4mQYLZwu3zPKVdeIrw0g7ovg== + dependencies: + "@octokit/openapi-types" "^19.0.0" + +"@octokit/webhooks-methods@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@octokit/webhooks-methods/-/webhooks-methods-4.0.0.tgz#d1697930ba3d8e6b6d0f8a2c996bb440d2e1df1b" + integrity sha512-M8mwmTXp+VeolOS/kfRvsDdW+IO0qJ8kYodM/sAysk093q6ApgmBXwK1ZlUvAwXVrp/YVHp6aArj4auAxUAOFw== + +"@octokit/webhooks-types@7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@octokit/webhooks-types/-/webhooks-types-7.1.0.tgz#d533dea253416e02dd6c2bfab25e533295bd5d3f" + integrity sha512-y92CpG4kFFtBBjni8LHoV12IegJ+KFxLgKRengrVjKmGE5XMeCuGvlfRe75lTRrgXaG6XIWJlFpIDTlkoJsU8w== + +"@octokit/webhooks@^12.0.1": + version "12.0.3" + resolved "https://registry.yarnpkg.com/@octokit/webhooks/-/webhooks-12.0.3.tgz#91f5df322e83b3b7d8bb9af5e692ffea16d6c8bb" + integrity sha512-8iG+/yza7hwz1RrQ7i7uGpK2/tuItZxZq1aTmeg2TNp2xTUB8F8lZF/FcZvyyAxT8tpDMF74TjFGCDACkf1kAQ== + dependencies: + "@octokit/request-error" "^5.0.0" + "@octokit/webhooks-methods" "^4.0.0" + "@octokit/webhooks-types" "7.1.0" + aggregate-error "^3.1.0" + "@phosphor-icons/react@2.0.9": version "2.0.9" resolved "https://registry.yarnpkg.com/@phosphor-icons/react/-/react-2.0.9.tgz#9b720dfe35ed9cb75fa0c59921bbc98acf483b45" integrity sha512-/dtQ0M9MXAr35wy8zPlwF684EvYRvGWZPAv+Bd0BR4vzIhjzfLBdHSovFxSP1rj3UOHvVR08qgRL04Kv90oqHA== "@phosphor-icons/react@^2.0.9": - version "2.0.10" - resolved "https://registry.yarnpkg.com/@phosphor-icons/react/-/react-2.0.10.tgz#dcf2f6dabd42bf9156be38caf59d4c818af2b817" - integrity sha512-q5ITPNFhmEiYZLZOvEhjo2phlfxoOmit7vE1tBYMxcMqnZX2vdbMw3deDE7wCegpBKM/q/p39BJmhhoPcjZyCg== + version "2.0.13" + resolved "https://registry.yarnpkg.com/@phosphor-icons/react/-/react-2.0.13.tgz#4944b08859d16a6efdbd1e073b5e0ef7e8f55cb9" + integrity sha512-lRjFfCv4pU8vDnPgZ8/QFzYmAJS08Vx+J2/+Ldh217pXaxvaayBZMC/3EinuMwmMylc97+XYCMPdH+y10I+f0g== "@popperjs/core@^2.11.8", "@popperjs/core@^2.6.0": version "2.11.8" @@ -3182,15 +3493,15 @@ available-typed-arrays@^1.0.5: resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz#92f95616501069d07d10edb2fc37d3e1c65123b7" integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw== -babel-jest@^29.5.0, babel-jest@^29.6.3: +babel-jest@^29.5.0: version "29.6.3" resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-29.6.3.tgz#e62f6c38f3ec8c147244168ee18ef0b919f10348" integrity sha512-1Ne93zZZEy5XmTa4Q+W5+zxBrDpExX8E3iy+xJJ+24ewlfo/T3qHfQJCzi/MMVFmBQDNxtRR/Gfd2dwb/0yrQw== dependencies: - "@jest/transform" "^29.6.1" + "@jest/transform" "^29.6.3" "@types/babel__core" "^7.1.14" babel-plugin-istanbul "^6.1.1" - babel-preset-jest "^29.5.0" + babel-preset-jest "^29.6.3" chalk "^4.0.0" graceful-fs "^4.2.9" slash "^3.0.0" @@ -3208,6 +3519,19 @@ babel-jest@^29.6.2: graceful-fs "^4.2.9" slash "^3.0.0" +babel-jest@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-29.7.0.tgz#f4369919225b684c56085998ac63dbd05be020d5" + integrity sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg== + dependencies: + "@jest/transform" "^29.7.0" + "@types/babel__core" "^7.1.14" + babel-plugin-istanbul "^6.1.1" + babel-preset-jest "^29.6.3" + chalk "^4.0.0" + graceful-fs "^4.2.9" + slash "^3.0.0" + babel-plugin-istanbul@^6.1.1: version "6.1.1" resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz#fa88ec59232fd9b4e36dbbc540a8ec9a9b47da73" @@ -3280,7 +3604,7 @@ babel-preset-current-node-syntax@^1.0.0: "@babel/plugin-syntax-optional-chaining" "^7.8.3" "@babel/plugin-syntax-top-level-await" "^7.8.3" -babel-preset-jest@^29.6.3: +babel-preset-jest@^29.5.0, babel-preset-jest@^29.6.3: version "29.6.3" resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz#fa05fa510e7d493896d7b0dd2033601c840f171c" integrity sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA== @@ -3765,7 +4089,20 @@ cosmiconfig@^7.0.0: path-type "^4.0.0" yaml "^1.10.0" -cross-fetch@^3.0.4: +create-jest@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/create-jest/-/create-jest-29.7.0.tgz#a355c5b3cb1e1af02ba177fe7afd7feee49a5320" + integrity sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q== + dependencies: + "@jest/types" "^29.6.3" + chalk "^4.0.0" + exit "^0.1.2" + graceful-fs "^4.2.9" + jest-config "^29.7.0" + jest-util "^29.7.0" + prompts "^2.0.1" + +cross-fetch@^3.0.4, cross-fetch@^3.1.5: version "3.1.8" resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-3.1.8.tgz#0327eba65fd68a7d119f8fb2bf9334a1a7956f82" integrity sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg== @@ -4018,10 +4355,12 @@ decimal.js@^10.4.2: resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.4.3.tgz#1044092884d245d1b7f65725fa4ad4c6f781cc23" integrity sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA== -dedent@^0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c" - integrity sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA== +decode-named-character-reference@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/decode-named-character-reference/-/decode-named-character-reference-1.0.2.tgz#daabac9690874c394c81e4162a0304b35d824f0e" + integrity sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg== + dependencies: + character-entities "^2.0.0" dedent@^1.0.0: version "1.5.1" @@ -4130,7 +4469,7 @@ detect-port-alt@^1.1.6: address "^1.0.1" debug "^2.6.0" -diff-sequences@^29.6.3: +diff-sequences@^29.4.3, diff-sequences@^29.6.3: version "29.6.3" resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-29.6.3.tgz#4deaf894d11407c51efc8418012f9e70b84ea921" integrity sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q== @@ -4722,17 +5061,16 @@ exit@^0.1.2: resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" integrity sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ== -expect@^29.0.0, expect@^29.6.3: +expect@^29.0.0: version "29.6.3" resolved "https://registry.yarnpkg.com/expect/-/expect-29.6.3.tgz#e74b57c35a81fd93ece6b570e371309c53dc4f54" integrity sha512-x1vY4LlEMWUYVZQrFi4ZANXFwqYbJ/JNQspLVvzhW2BNY28aNcXMQH6imBbt+RBf5sVRTodYHXtSP/TLEU0Dxw== dependencies: - "@jest/expect-utils" "^29.6.1" - "@types/node" "*" - jest-get-type "^29.4.3" - jest-matcher-utils "^29.6.1" - jest-message-util "^29.6.1" - jest-util "^29.6.1" + "@jest/expect-utils" "^29.6.3" + jest-get-type "^29.6.3" + jest-matcher-utils "^29.6.3" + jest-message-util "^29.6.3" + jest-util "^29.6.3" expect@^29.6.2: version "29.6.2" @@ -4746,6 +5084,17 @@ expect@^29.6.2: jest-message-util "^29.6.2" jest-util "^29.6.2" +expect@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/expect/-/expect-29.7.0.tgz#578874590dcb3214514084c08115d8aee61e11bc" + integrity sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw== + dependencies: + "@jest/expect-utils" "^29.7.0" + jest-get-type "^29.6.3" + jest-matcher-utils "^29.7.0" + jest-message-util "^29.7.0" + jest-util "^29.7.0" + express@^4.17.3: version "4.18.2" resolved "https://registry.yarnpkg.com/express/-/express-4.18.2.tgz#3fabe08296e930c796c19e3c516979386ba9fd59" @@ -5817,7 +6166,7 @@ istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0: resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz#189e7909d0a39fa5a3dfad5b03f71947770191d3" integrity sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw== -istanbul-lib-instrument@^5.0.4: +istanbul-lib-instrument@^5.0.4, istanbul-lib-instrument@^5.1.0: version "5.2.1" resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz#d10c8885c2125574e1c231cacadf955675e1ce3d" integrity sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg== @@ -5865,41 +6214,15 @@ istanbul-reports@^3.1.3: html-escaper "^2.0.0" istanbul-lib-report "^3.0.0" -jest-changed-files@^29.6.3: - version "29.6.3" - resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-29.6.3.tgz#97cfdc93f74fb8af2a1acb0b78f836f1fb40c449" - integrity sha512-G5wDnElqLa4/c66ma5PG9eRjE342lIbF6SUnTJi26C3J28Fv2TVY2rOyKB9YGbSA5ogwevgmxc4j4aVjrEK6Yg== +jest-changed-files@^29.5.0, jest-changed-files@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-29.7.0.tgz#1c06d07e77c78e1585d020424dedc10d6e17ac3a" + integrity sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w== dependencies: execa "^5.0.0" - jest-util "^29.6.3" + jest-util "^29.7.0" p-limit "^3.1.0" -jest-circus@^29.6.3: - version "29.6.3" - resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-29.6.3.tgz#c5ac37758bb9e78fd78ebd655ed1d28b220d6fd3" - integrity sha512-p0R5YqZEMnOpHqHLWRSjm2z/0p6RNsrNE/GRRT3eli8QGOAozj6Ys/3Tv+Ej+IfltJoSPwcQ6/hOCRkNlxLLCw== - dependencies: - "@jest/environment" "^29.6.3" - "@jest/expect" "^29.6.3" - "@jest/test-result" "^29.6.3" - "@jest/types" "^29.6.3" - "@types/node" "*" - chalk "^4.0.0" - co "^4.6.0" - dedent "^1.0.0" - is-generator-fn "^2.0.0" - jest-each "^29.6.3" - jest-matcher-utils "^29.6.3" - jest-message-util "^29.6.3" - jest-runtime "^29.6.3" - jest-snapshot "^29.6.3" - jest-util "^29.6.3" - p-limit "^3.1.0" - pretty-format "^29.6.3" - pure-rand "^6.0.0" - slash "^3.0.0" - stack-utils "^2.0.3" - jest-circus@^29.6.2: version "29.6.2" resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-29.6.2.tgz#1e6ffca60151ac66cad63fce34f443f6b5bb4258" @@ -5926,22 +6249,47 @@ jest-circus@^29.6.2: slash "^3.0.0" stack-utils "^2.0.3" -jest-cli@^29.6.1: - version "29.6.1" - resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-29.6.1.tgz#99d9afa7449538221c71f358f0fdd3e9c6e89f72" - integrity sha512-607dSgTA4ODIN6go9w6xY3EYkyPFGicx51a69H7yfvt7lN53xNswEVLovq+E77VsTRi5fWprLH0yl4DJgE8Ing== +jest-circus@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-29.7.0.tgz#b6817a45fcc835d8b16d5962d0c026473ee3668a" + integrity sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw== dependencies: - "@jest/core" "^29.6.3" - "@jest/test-result" "^29.6.3" + "@jest/environment" "^29.7.0" + "@jest/expect" "^29.7.0" + "@jest/test-result" "^29.7.0" "@jest/types" "^29.6.3" + "@types/node" "*" chalk "^4.0.0" + co "^4.6.0" + dedent "^1.0.0" + is-generator-fn "^2.0.0" + jest-each "^29.7.0" + jest-matcher-utils "^29.7.0" + jest-message-util "^29.7.0" + jest-runtime "^29.7.0" + jest-snapshot "^29.7.0" + jest-util "^29.7.0" + p-limit "^3.1.0" + pretty-format "^29.7.0" + pure-rand "^6.0.0" + slash "^3.0.0" + stack-utils "^2.0.3" + +jest-cli@^29.6.1, jest-cli@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-29.7.0.tgz#5592c940798e0cae677eec169264f2d839a37995" + integrity sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg== + dependencies: + "@jest/core" "^29.7.0" + "@jest/test-result" "^29.7.0" + "@jest/types" "^29.6.3" + chalk "^4.0.0" + create-jest "^29.7.0" exit "^0.1.2" - graceful-fs "^4.2.9" import-local "^3.0.2" - jest-config "^29.6.3" - jest-util "^29.6.3" - jest-validate "^29.6.3" - prompts "^2.0.1" + jest-config "^29.7.0" + jest-util "^29.7.0" + jest-validate "^29.7.0" yargs "^17.3.1" jest-cli@^29.6.2: @@ -5962,34 +6310,6 @@ jest-cli@^29.6.2: prompts "^2.0.1" yargs "^17.3.1" -jest-config@^29.6.1: - version "29.6.1" - resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-29.6.1.tgz#d785344509065d53a238224c6cdc0ed8e2f2f0dd" - integrity sha512-XdjYV2fy2xYixUiV2Wc54t3Z4oxYPAELUzWnV6+mcbq0rh742X2p52pii5A3oeRzYjLnQxCsZmp0qpI6klE2cQ== - dependencies: - "@babel/core" "^7.11.6" - "@jest/test-sequencer" "^29.6.3" - "@jest/types" "^29.6.3" - babel-jest "^29.6.3" - chalk "^4.0.0" - ci-info "^3.2.0" - deepmerge "^4.2.2" - glob "^7.1.3" - graceful-fs "^4.2.9" - jest-circus "^29.6.3" - jest-environment-node "^29.6.3" - jest-get-type "^29.6.3" - jest-regex-util "^29.6.3" - jest-resolve "^29.6.3" - jest-runner "^29.6.3" - jest-util "^29.6.3" - jest-validate "^29.6.3" - micromatch "^4.0.4" - parse-json "^5.2.0" - pretty-format "^29.6.3" - slash "^3.0.0" - strip-json-comments "^3.1.1" - jest-config@^29.6.2: version "29.6.2" resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-29.6.2.tgz#c68723f06b31ca5e63030686e604727d406cd7c3" @@ -6018,15 +6338,33 @@ jest-config@^29.6.2: slash "^3.0.0" strip-json-comments "^3.1.1" -jest-diff@^29.6.1: - version "29.6.1" - resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-29.6.1.tgz#13df6db0a89ee6ad93c747c75c85c70ba941e545" - integrity sha512-FsNCvinvl8oVxpNLttNQX7FAq7vR+gMDGj90tiP7siWw1UdakWUGqrylpsYrpvj908IYckm5Y0Q7azNAozU1Kg== +jest-config@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-29.7.0.tgz#bcbda8806dbcc01b1e316a46bb74085a84b0245f" + integrity sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ== dependencies: + "@babel/core" "^7.11.6" + "@jest/test-sequencer" "^29.7.0" + "@jest/types" "^29.6.3" + babel-jest "^29.7.0" chalk "^4.0.0" - diff-sequences "^29.6.3" + ci-info "^3.2.0" + deepmerge "^4.2.2" + glob "^7.1.3" + graceful-fs "^4.2.9" + jest-circus "^29.7.0" + jest-environment-node "^29.7.0" jest-get-type "^29.6.3" - pretty-format "^29.6.3" + jest-regex-util "^29.6.3" + jest-resolve "^29.7.0" + jest-runner "^29.7.0" + jest-util "^29.7.0" + jest-validate "^29.7.0" + micromatch "^4.0.4" + parse-json "^5.2.0" + pretty-format "^29.7.0" + slash "^3.0.0" + strip-json-comments "^3.1.1" jest-diff@^29.6.2: version "29.6.2" @@ -6038,6 +6376,16 @@ jest-diff@^29.6.2: jest-get-type "^29.4.3" pretty-format "^29.6.2" +jest-diff@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-29.7.0.tgz#017934a66ebb7ecf6f205e84699be10afd70458a" + integrity sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw== + dependencies: + chalk "^4.0.0" + diff-sequences "^29.6.3" + jest-get-type "^29.6.3" + pretty-format "^29.7.0" + jest-docblock@^29.4.3: version "29.4.3" resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-29.4.3.tgz#90505aa89514a1c7dceeac1123df79e414636ea8" @@ -6045,16 +6393,12 @@ jest-docblock@^29.4.3: dependencies: detect-newline "^3.0.0" -jest-each@^29.6.1: - version "29.6.1" - resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-29.6.1.tgz#975058e5b8f55c6780beab8b6ab214921815c89c" - integrity sha512-n5eoj5eiTHpKQCAVcNTT7DRqeUmJ01hsAL0Q1SMiBHcBcvTKDELixQOGMCpqhbIuTcfC4kMfSnpmDqRgRJcLNQ== +jest-docblock@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-29.7.0.tgz#8fddb6adc3cdc955c93e2a87f61cfd350d5d119a" + integrity sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g== dependencies: - "@jest/types" "^29.6.1" - chalk "^4.0.0" - jest-get-type "^29.4.3" - jest-util "^29.6.1" - pretty-format "^29.6.1" + detect-newline "^3.0.0" jest-each@^29.6.2: version "29.6.2" @@ -6067,6 +6411,17 @@ jest-each@^29.6.2: jest-util "^29.6.2" pretty-format "^29.6.2" +jest-each@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-29.7.0.tgz#162a9b3f2328bdd991beaabffbb74745e56577d1" + integrity sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ== + dependencies: + "@jest/types" "^29.6.3" + chalk "^4.0.0" + jest-get-type "^29.6.3" + jest-util "^29.7.0" + pretty-format "^29.7.0" + jest-environment-jsdom@^29.5.0: version "29.6.1" resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-29.6.1.tgz#480bce658aa31589309c82ca510351fd7c683bbb" @@ -6081,18 +6436,6 @@ jest-environment-jsdom@^29.5.0: jest-util "^29.6.1" jsdom "^20.0.0" -jest-environment-node@^29.6.3: - version "29.6.3" - resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-29.6.3.tgz#72217a00db2c26755406241c70ad73c334917e28" - integrity sha512-PKl7upfPJXMYbWpD+60o4HP86KvFO2c9dZ+Zr6wUzsG5xcPx/65o3ArNgHW5M0RFvLYdW4/aieR4JSooD0a2ew== - dependencies: - "@jest/environment" "^29.6.3" - "@jest/fake-timers" "^29.6.3" - "@jest/types" "^29.6.3" - "@types/node" "*" - jest-mock "^29.6.3" - jest-util "^29.6.3" - jest-environment-node@^29.6.2: version "29.6.2" resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-29.6.2.tgz#a9ea2cabff39b08eca14ccb32c8ceb924c8bb1ad" @@ -6105,6 +6448,18 @@ jest-environment-node@^29.6.2: jest-mock "^29.6.2" jest-util "^29.6.2" +jest-environment-node@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-29.7.0.tgz#0b93e111dda8ec120bc8300e6d1fb9576e164376" + integrity sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw== + dependencies: + "@jest/environment" "^29.7.0" + "@jest/fake-timers" "^29.7.0" + "@jest/types" "^29.6.3" + "@types/node" "*" + jest-mock "^29.7.0" + jest-util "^29.7.0" + jest-fetch-mock@^3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/jest-fetch-mock/-/jest-fetch-mock-3.0.3.tgz#31749c456ae27b8919d69824f1c2bd85fe0a1f3b" @@ -6123,52 +6478,44 @@ jest-get-type@^29.6.3: resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-29.6.3.tgz#36f499fdcea197c1045a127319c0481723908fd1" integrity sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw== -jest-haste-map@^29.6.3: - version "29.6.3" - resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-29.6.3.tgz#a53ac35a137fd32d932039aab29d02a9dab30689" - integrity sha512-GecR5YavfjkhOytEFHAeI6aWWG3f/cOKNB1YJvj/B76xAmeVjy4zJUYobGF030cRmKaO1FBw3V8CZZ6KVh9ZSw== +jest-haste-map@^29.6.2: + version "29.6.2" + resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-29.6.2.tgz#298c25ea5255cfad8b723179d4295cf3a50a70d1" + integrity sha512-+51XleTDAAysvU8rT6AnS1ZJ+WHVNqhj1k6nTvN2PYP+HjU3kqlaKQ1Lnw3NYW3bm2r8vq82X0Z1nDDHZMzHVA== dependencies: - "@jest/types" "^29.6.3" + "@jest/types" "^29.6.1" "@types/graceful-fs" "^4.1.3" "@types/node" "*" anymatch "^3.0.3" fb-watchman "^2.0.0" graceful-fs "^4.2.9" - jest-regex-util "^29.6.3" - jest-util "^29.6.3" - jest-worker "^29.6.3" + jest-regex-util "^29.4.3" + jest-util "^29.6.2" + jest-worker "^29.6.2" micromatch "^4.0.4" walker "^1.0.8" optionalDependencies: fsevents "^2.3.2" -jest-haste-map@^29.6.2: - version "29.6.2" - resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-29.6.2.tgz#298c25ea5255cfad8b723179d4295cf3a50a70d1" - integrity sha512-+51XleTDAAysvU8rT6AnS1ZJ+WHVNqhj1k6nTvN2PYP+HjU3kqlaKQ1Lnw3NYW3bm2r8vq82X0Z1nDDHZMzHVA== +jest-haste-map@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-29.7.0.tgz#3c2396524482f5a0506376e6c858c3bbcc17b104" + integrity sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA== dependencies: - "@jest/types" "^29.6.1" + "@jest/types" "^29.6.3" "@types/graceful-fs" "^4.1.3" "@types/node" "*" anymatch "^3.0.3" fb-watchman "^2.0.0" graceful-fs "^4.2.9" - jest-regex-util "^29.4.3" - jest-util "^29.6.2" - jest-worker "^29.6.2" + jest-regex-util "^29.6.3" + jest-util "^29.7.0" + jest-worker "^29.7.0" micromatch "^4.0.4" walker "^1.0.8" optionalDependencies: fsevents "^2.3.2" -jest-leak-detector@^29.6.1: - version "29.6.1" - resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-29.6.1.tgz#66a902c81318e66e694df7d096a95466cb962f8e" - integrity sha512-OrxMNyZirpOEwkF3UHnIkAiZbtkBWiye+hhBweCHkVbCgyEy71Mwbb5zgeTNYWJBi1qgDVfPC1IwO9dVEeTLwQ== - dependencies: - jest-get-type "^29.6.3" - pretty-format "^29.6.3" - jest-leak-detector@^29.6.2: version "29.6.2" resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-29.6.2.tgz#e2b307fee78cab091c37858a98c7e1d73cdf5b38" @@ -6177,15 +6524,13 @@ jest-leak-detector@^29.6.2: jest-get-type "^29.4.3" pretty-format "^29.6.2" -jest-matcher-utils@^29.6.1: - version "29.6.1" - resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-29.6.1.tgz#6c60075d84655d6300c5d5128f46531848160b53" - integrity sha512-SLaztw9d2mfQQKHmJXKM0HCbl2PPVld/t9Xa6P9sgiExijviSp7TnZZpw2Fpt+OI3nwUO/slJbOfzfUMKKC5QA== +jest-leak-detector@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz#5b7ec0dadfdfec0ca383dc9aa016d36b5ea4c728" + integrity sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw== dependencies: - chalk "^4.0.0" - jest-diff "^29.6.3" jest-get-type "^29.6.3" - pretty-format "^29.6.3" + pretty-format "^29.7.0" jest-matcher-utils@^29.6.2: version "29.6.2" @@ -6197,18 +6542,28 @@ jest-matcher-utils@^29.6.2: jest-get-type "^29.4.3" pretty-format "^29.6.2" +jest-matcher-utils@^29.6.3, jest-matcher-utils@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz#ae8fec79ff249fd592ce80e3ee474e83a6c44f12" + integrity sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g== + dependencies: + chalk "^4.0.0" + jest-diff "^29.7.0" + jest-get-type "^29.6.3" + pretty-format "^29.7.0" + jest-message-util@^29.6.1: version "29.6.1" resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-29.6.1.tgz#d0b21d87f117e1b9e165e24f245befd2ff34ff8d" integrity sha512-KoAW2zAmNSd3Gk88uJ56qXUWbFk787QKmjjJVOjtGFmmGSZgDBrlIL4AfQw1xyMYPNVD7dNInfIbur9B2rd/wQ== dependencies: "@babel/code-frame" "^7.12.13" - "@jest/types" "^29.6.3" + "@jest/types" "^29.6.1" "@types/stack-utils" "^2.0.0" chalk "^4.0.0" graceful-fs "^4.2.9" micromatch "^4.0.4" - pretty-format "^29.6.3" + pretty-format "^29.6.1" slash "^3.0.0" stack-utils "^2.0.3" @@ -6227,6 +6582,21 @@ jest-message-util@^29.6.2: slash "^3.0.0" stack-utils "^2.0.3" +jest-message-util@^29.6.3, jest-message-util@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-29.7.0.tgz#8bc392e204e95dfe7564abbe72a404e28e51f7f3" + integrity sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w== + dependencies: + "@babel/code-frame" "^7.12.13" + "@jest/types" "^29.6.3" + "@types/stack-utils" "^2.0.0" + chalk "^4.0.0" + graceful-fs "^4.2.9" + micromatch "^4.0.4" + pretty-format "^29.7.0" + slash "^3.0.0" + stack-utils "^2.0.3" + jest-mock@^29.6.1: version "29.6.1" resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-29.6.1.tgz#049ee26aea8cbf54c764af649070910607316517" @@ -6245,24 +6615,25 @@ jest-mock@^29.6.2: "@types/node" "*" jest-util "^29.6.2" +jest-mock@^29.6.3, jest-mock@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-29.7.0.tgz#4e836cf60e99c6fcfabe9f99d017f3fdd50a6347" + integrity sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw== + dependencies: + "@jest/types" "^29.6.3" + "@types/node" "*" + jest-util "^29.7.0" + jest-pnp-resolver@^1.2.2: version "1.2.3" resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz#930b1546164d4ad5937d5540e711d4d38d4cad2e" integrity sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w== -jest-regex-util@^29.6.3: +jest-regex-util@^29.4.3, jest-regex-util@^29.6.3: version "29.6.3" resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-29.6.3.tgz#4a556d9c776af68e1c5f48194f4d0327d24e8a52" integrity sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg== -jest-resolve-dependencies@^29.6.3: - version "29.6.3" - resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-29.6.3.tgz#fc58ac08f9ed992b10d5cfb0bbb1d89b98508ff3" - integrity sha512-iah5nhSPTwtUV7yzpTc9xGg8gP3Ch2VNsuFMsKoCkNCrQSbFtx5KRPemmPJ32AUhTSDqJXB6djPN6zAaUGV53g== - dependencies: - jest-regex-util "^29.6.3" - jest-snapshot "^29.6.3" - jest-resolve-dependencies@^29.6.2: version "29.6.2" resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-29.6.2.tgz#36435269b6672c256bcc85fb384872c134cc4cf2" @@ -6271,20 +6642,13 @@ jest-resolve-dependencies@^29.6.2: jest-regex-util "^29.4.3" jest-snapshot "^29.6.2" -jest-resolve@^29.6.1: - version "29.6.1" - resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-29.6.1.tgz#4c3324b993a85e300add2f8609f51b80ddea39ee" - integrity sha512-AeRkyS8g37UyJiP9w3mmI/VXU/q8l/IH52vj/cDAyScDcemRbSBhfX/NMYIGilQgSVwsjxrCHf3XJu4f+lxCMg== +jest-resolve-dependencies@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz#1b04f2c095f37fc776ff40803dc92921b1e88428" + integrity sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA== dependencies: - chalk "^4.0.0" - graceful-fs "^4.2.9" - jest-haste-map "^29.6.3" - jest-pnp-resolver "^1.2.2" - jest-util "^29.6.3" - jest-validate "^29.6.3" - resolve "^1.20.0" - resolve.exports "^2.0.0" - slash "^3.0.0" + jest-regex-util "^29.6.3" + jest-snapshot "^29.7.0" jest-resolve@^29.6.2: version "29.6.2" @@ -6301,32 +6665,20 @@ jest-resolve@^29.6.2: resolve.exports "^2.0.0" slash "^3.0.0" -jest-runner@^29.6.1: - version "29.6.1" - resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-29.6.1.tgz#54557087e7972d345540d622ab5bfc3d8f34688c" - integrity sha512-tw0wb2Q9yhjAQ2w8rHRDxteryyIck7gIzQE4Reu3JuOBpGp96xWgF0nY8MDdejzrLCZKDcp8JlZrBN/EtkQvPQ== +jest-resolve@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-29.7.0.tgz#64d6a8992dd26f635ab0c01e5eef4399c6bcbc30" + integrity sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA== dependencies: - "@jest/console" "^29.6.3" - "@jest/environment" "^29.6.3" - "@jest/test-result" "^29.6.3" - "@jest/transform" "^29.6.3" - "@jest/types" "^29.6.3" - "@types/node" "*" chalk "^4.0.0" - emittery "^0.13.1" graceful-fs "^4.2.9" - jest-docblock "^29.6.3" - jest-environment-node "^29.6.3" - jest-haste-map "^29.6.3" - jest-leak-detector "^29.6.3" - jest-message-util "^29.6.3" - jest-resolve "^29.6.3" - jest-runtime "^29.6.3" - jest-util "^29.6.3" - jest-watcher "^29.6.3" - jest-worker "^29.6.3" - p-limit "^3.1.0" - source-map-support "0.5.13" + jest-haste-map "^29.7.0" + jest-pnp-resolver "^1.2.2" + jest-util "^29.7.0" + jest-validate "^29.7.0" + resolve "^1.20.0" + resolve.exports "^2.0.0" + slash "^3.0.0" jest-runner@^29.6.2: version "29.6.2" @@ -6355,33 +6707,32 @@ jest-runner@^29.6.2: p-limit "^3.1.0" source-map-support "0.5.13" -jest-runtime@^29.6.1: - version "29.6.1" - resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-29.6.1.tgz#8a0fc9274ef277f3d70ba19d238e64334958a0dc" - integrity sha512-D6/AYOA+Lhs5e5il8+5pSLemjtJezUr+8zx+Sn8xlmOux3XOqx4d8l/2udBea8CRPqqrzhsKUsN/gBDE/IcaPQ== +jest-runner@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-29.7.0.tgz#809af072d408a53dcfd2e849a4c976d3132f718e" + integrity sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ== dependencies: - "@jest/environment" "^29.6.3" - "@jest/fake-timers" "^29.6.3" - "@jest/globals" "^29.6.3" - "@jest/source-map" "^29.6.3" - "@jest/test-result" "^29.6.3" - "@jest/transform" "^29.6.3" + "@jest/console" "^29.7.0" + "@jest/environment" "^29.7.0" + "@jest/test-result" "^29.7.0" + "@jest/transform" "^29.7.0" "@jest/types" "^29.6.3" "@types/node" "*" chalk "^4.0.0" - cjs-module-lexer "^1.0.0" - collect-v8-coverage "^1.0.0" - glob "^7.1.3" + emittery "^0.13.1" graceful-fs "^4.2.9" - jest-haste-map "^29.6.3" - jest-message-util "^29.6.3" - jest-mock "^29.6.3" - jest-regex-util "^29.6.3" - jest-resolve "^29.6.3" - jest-snapshot "^29.6.3" - jest-util "^29.6.3" - slash "^3.0.0" - strip-bom "^4.0.0" + jest-docblock "^29.7.0" + jest-environment-node "^29.7.0" + jest-haste-map "^29.7.0" + jest-leak-detector "^29.7.0" + jest-message-util "^29.7.0" + jest-resolve "^29.7.0" + jest-runtime "^29.7.0" + jest-util "^29.7.0" + jest-watcher "^29.7.0" + jest-worker "^29.7.0" + p-limit "^3.1.0" + source-map-support "0.5.13" jest-runtime@^29.6.2: version "29.6.2" @@ -6411,31 +6762,33 @@ jest-runtime@^29.6.2: slash "^3.0.0" strip-bom "^4.0.0" -jest-snapshot@^29.6.1: - version "29.6.1" - resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-29.6.1.tgz#0d083cb7de716d5d5cdbe80d598ed2fbafac0239" - integrity sha512-G4UQE1QQ6OaCgfY+A0uR1W2AY0tGXUPQpoUClhWHq1Xdnx1H6JOrC2nH5lqnOEqaDgbHFgIwZ7bNq24HpB180A== +jest-runtime@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-29.7.0.tgz#efecb3141cf7d3767a3a0cc8f7c9990587d3d817" + integrity sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ== dependencies: - "@babel/core" "^7.11.6" - "@babel/generator" "^7.7.2" - "@babel/plugin-syntax-jsx" "^7.7.2" - "@babel/plugin-syntax-typescript" "^7.7.2" - "@babel/types" "^7.3.3" - "@jest/expect-utils" "^29.6.3" - "@jest/transform" "^29.6.3" + "@jest/environment" "^29.7.0" + "@jest/fake-timers" "^29.7.0" + "@jest/globals" "^29.7.0" + "@jest/source-map" "^29.6.3" + "@jest/test-result" "^29.7.0" + "@jest/transform" "^29.7.0" "@jest/types" "^29.6.3" - babel-preset-current-node-syntax "^1.0.0" + "@types/node" "*" chalk "^4.0.0" - expect "^29.6.3" + cjs-module-lexer "^1.0.0" + collect-v8-coverage "^1.0.0" + glob "^7.1.3" graceful-fs "^4.2.9" - jest-diff "^29.6.3" - jest-get-type "^29.6.3" - jest-matcher-utils "^29.6.3" - jest-message-util "^29.6.3" - jest-util "^29.6.3" - natural-compare "^1.4.0" - pretty-format "^29.6.3" - semver "^7.5.3" + jest-haste-map "^29.7.0" + jest-message-util "^29.7.0" + jest-mock "^29.7.0" + jest-regex-util "^29.6.3" + jest-resolve "^29.7.0" + jest-snapshot "^29.7.0" + jest-util "^29.7.0" + slash "^3.0.0" + strip-bom "^4.0.0" jest-snapshot@^29.6.2: version "29.6.2" @@ -6463,12 +6816,38 @@ jest-snapshot@^29.6.2: pretty-format "^29.6.2" semver "^7.5.3" +jest-snapshot@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-29.7.0.tgz#c2c574c3f51865da1bb329036778a69bf88a6be5" + integrity sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw== + dependencies: + "@babel/core" "^7.11.6" + "@babel/generator" "^7.7.2" + "@babel/plugin-syntax-jsx" "^7.7.2" + "@babel/plugin-syntax-typescript" "^7.7.2" + "@babel/types" "^7.3.3" + "@jest/expect-utils" "^29.7.0" + "@jest/transform" "^29.7.0" + "@jest/types" "^29.6.3" + babel-preset-current-node-syntax "^1.0.0" + chalk "^4.0.0" + expect "^29.7.0" + graceful-fs "^4.2.9" + jest-diff "^29.7.0" + jest-get-type "^29.6.3" + jest-matcher-utils "^29.7.0" + jest-message-util "^29.7.0" + jest-util "^29.7.0" + natural-compare "^1.4.0" + pretty-format "^29.7.0" + semver "^7.5.3" + jest-util@^29.6.1: version "29.6.1" resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-29.6.1.tgz#c9e29a87a6edbf1e39e6dee2b4689b8a146679cb" integrity sha512-NRFCcjc+/uO3ijUVyNOQJluf8PtGCe/W6cix36+M3cTFgiYqFOOW5MgN4JOOcvbUhcKTYVd1CvHz/LWi8d16Mg== dependencies: - "@jest/types" "^29.6.3" + "@jest/types" "^29.6.1" "@types/node" "*" chalk "^4.0.0" ci-info "^3.2.0" @@ -6487,17 +6866,17 @@ jest-util@^29.6.2: graceful-fs "^4.2.9" picomatch "^2.2.3" -jest-validate@^29.6.1: - version "29.6.1" - resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-29.6.1.tgz#765e684af6e2c86dce950aebefbbcd4546d69f7b" - integrity sha512-r3Ds69/0KCN4vx4sYAbGL1EVpZ7MSS0vLmd3gV78O+NAx3PDQQukRU5hNHPXlyqCgFY8XUk7EuTMLugh0KzahA== +jest-util@^29.6.3, jest-util@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-29.7.0.tgz#23c2b62bfb22be82b44de98055802ff3710fc0bc" + integrity sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA== dependencies: "@jest/types" "^29.6.3" - camelcase "^6.2.0" + "@types/node" "*" chalk "^4.0.0" - jest-get-type "^29.6.3" - leven "^3.1.0" - pretty-format "^29.6.3" + ci-info "^3.2.0" + graceful-fs "^4.2.9" + picomatch "^2.2.3" jest-validate@^29.6.2: version "29.6.2" @@ -6511,19 +6890,17 @@ jest-validate@^29.6.2: leven "^3.1.0" pretty-format "^29.6.2" -jest-watcher@^29.6.1: - version "29.6.1" - resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-29.6.1.tgz#7c0c43ddd52418af134c551c92c9ea31e5ec942e" - integrity sha512-d4wpjWTS7HEZPaaj8m36QiaP856JthRZkrgcIY/7ISoUWPIillrXM23WPboZVLbiwZBt4/qn2Jke84Sla6JhFA== +jest-validate@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-29.7.0.tgz#7bf705511c64da591d46b15fce41400d52147d9c" + integrity sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw== dependencies: - "@jest/test-result" "^29.6.1" - "@jest/types" "^29.6.1" - "@types/node" "*" - ansi-escapes "^4.2.1" + "@jest/types" "^29.6.3" + camelcase "^6.2.0" chalk "^4.0.0" - emittery "^0.13.1" - jest-util "^29.6.1" - string-length "^4.0.1" + jest-get-type "^29.6.3" + leven "^3.1.0" + pretty-format "^29.7.0" jest-watcher@^29.6.2: version "29.6.2" @@ -6539,6 +6916,20 @@ jest-watcher@^29.6.2: jest-util "^29.6.2" string-length "^4.0.1" +jest-watcher@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-29.7.0.tgz#7810d30d619c3a62093223ce6bb359ca1b28a2f2" + integrity sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g== + dependencies: + "@jest/test-result" "^29.7.0" + "@jest/types" "^29.6.3" + "@types/node" "*" + ansi-escapes "^4.2.1" + chalk "^4.0.0" + emittery "^0.13.1" + jest-util "^29.7.0" + string-length "^4.0.1" + jest-worker@^27.4.5: version "27.5.1" resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-27.5.1.tgz#8d146f0900e8973b106b6f73cc1e9a8cb86f8db0" @@ -6548,16 +6939,6 @@ jest-worker@^27.4.5: merge-stream "^2.0.0" supports-color "^8.0.0" -jest-worker@^29.6.3: - version "29.6.3" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-29.6.3.tgz#7b1a47bbb6559f3c0882d16595938590e63915d5" - integrity sha512-wacANXecZ/GbQakpf2CClrqrlwsYYDSXFd4fIGdL+dXpM2GWoJ+6bhQ7vR3TKi3+gkSfBkjy1/khH/WrYS4Q6g== - dependencies: - "@types/node" "*" - jest-util "^29.6.3" - merge-stream "^2.0.0" - supports-color "^8.0.0" - jest-worker@^29.6.2: version "29.6.2" resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-29.6.2.tgz#682fbc4b6856ad0aa122a5403c6d048b83f3fb44" @@ -6568,6 +6949,16 @@ jest-worker@^29.6.2: merge-stream "^2.0.0" supports-color "^8.0.0" +jest-worker@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-29.7.0.tgz#acad073acbbaeb7262bd5389e1bcf43e10058d4a" + integrity sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw== + dependencies: + "@types/node" "*" + jest-util "^29.7.0" + merge-stream "^2.0.0" + supports-color "^8.0.0" + jest@^29.5.0: version "29.6.2" resolved "https://registry.yarnpkg.com/jest/-/jest-29.6.2.tgz#3bd55b9fd46a161b2edbdf5f1d1bd0d1eab76c42" @@ -6583,10 +6974,20 @@ jest@^29.6.1: resolved "https://registry.yarnpkg.com/jest/-/jest-29.6.1.tgz#74be1cb719c3abe439f2d94aeb18e6540a5b02ad" integrity sha512-Nirw5B4nn69rVUZtemCQhwxOBhm0nsp3hmtF4rzCeWD7BkjAXRIji7xWQfnTNbz9g0aVsBX6aZK3n+23LM6uDw== dependencies: - "@jest/core" "^29.6.3" + "@jest/core" "^29.6.1" + "@jest/types" "^29.6.1" + import-local "^3.0.2" + jest-cli "^29.6.1" + +jest@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest/-/jest-29.7.0.tgz#994676fc24177f088f1c5e3737f5697204ff2613" + integrity sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw== + dependencies: + "@jest/core" "^29.7.0" "@jest/types" "^29.6.3" import-local "^3.0.2" - jest-cli "^29.6.3" + jest-cli "^29.7.0" js-cookie@^2.2.1: version "2.2.1" @@ -7607,13 +8008,6 @@ node-fetch@^2.6.12: dependencies: whatwg-url "^5.0.0" -node-fetch@^2.6.12: - 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" - node-forge@^1: version "1.3.1" resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-1.3.1.tgz#be8da2af243b2417d5f646a770663a92b7e9ded3" @@ -8100,7 +8494,7 @@ pretty-format@^27.0.2: ansi-styles "^5.0.0" react-is "^17.0.1" -pretty-format@^29.0.0, pretty-format@^29.6.1: +pretty-format@^29.0.0: version "29.6.1" resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.6.1.tgz#ec838c288850b7c4f9090b867c2d4f4edbfb0f3e" integrity sha512-7jRj+yXO0W7e4/tSJKoR7HRIHLPPjtNaUGG2xxKQnGvPNRkgWcQ0AZX6P4KBRJN4FcTBWb3sa7DVUJmocYuoog== @@ -8109,6 +8503,15 @@ pretty-format@^29.0.0, pretty-format@^29.6.1: ansi-styles "^5.0.0" react-is "^18.0.0" +pretty-format@^29.6.1, pretty-format@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.7.0.tgz#ca42c758310f365bfa71a0bda0a807160b776812" + integrity sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ== + dependencies: + "@jest/schemas" "^29.6.3" + ansi-styles "^5.0.0" + react-is "^18.0.0" + pretty-format@^29.6.2: version "29.6.2" resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.6.2.tgz#3d5829261a8a4d89d8b9769064b29c50ed486a47" @@ -8138,11 +8541,6 @@ promise-polyfill@^8.1.3: resolved "https://registry.yarnpkg.com/promise-polyfill/-/promise-polyfill-8.3.0.tgz#9284810268138d103807b11f4e23d5e945a4db63" integrity sha512-H5oELycFml5yto/atYqmjyigJoAo3+OXwolYiH7OfQuYlAqhxNvTfiNMbV9hsC6Yp83yE5r2KTVmtrG6R9i6Pg== -promise-polyfill@^8.1.3: - version "8.3.0" - resolved "https://registry.yarnpkg.com/promise-polyfill/-/promise-polyfill-8.3.0.tgz#9284810268138d103807b11f4e23d5e945a4db63" - integrity sha512-H5oELycFml5yto/atYqmjyigJoAo3+OXwolYiH7OfQuYlAqhxNvTfiNMbV9hsC6Yp83yE5r2KTVmtrG6R9i6Pg== - prompts@^2.0.1, prompts@^2.4.2: version "2.4.2" resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.2.tgz#7b57e73b3a48029ad10ebd44f74b01722a4cb069" @@ -9536,6 +9934,21 @@ tr46@~0.0.3: resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== +trim-lines@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/trim-lines/-/trim-lines-3.0.1.tgz#d802e332a07df861c48802c04321017b1bd87338" + integrity sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg== + +trough@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/trough/-/trough-2.1.0.tgz#0f7b511a4fde65a46f18477ab38849b22c554876" + integrity sha512-AqTiAOLcj85xS7vQ8QkAV41hPDIJ71XJB4RCUrzo/1GM2CQwhkJGaf9Hgr7BOugMRpgGUrqRg/DrBDl4H40+8g== + +ts-easing@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/ts-easing/-/ts-easing-0.2.0.tgz#c8a8a35025105566588d87dbda05dd7fbfa5a4ec" + integrity sha512-Z86EW+fFFh/IFB1fqQ3/+7Zpf9t2ebOAxNI/V6Wo7r5gqiqtxmgTlQ1qbqQcjLKYeSHPTsEmvlJUDg/EuL0uHQ== + ts-loader@^9.4.2: version "9.4.4" resolved "https://registry.yarnpkg.com/ts-loader/-/ts-loader-9.4.4.tgz#6ceaf4d58dcc6979f84125335904920884b7cee4" @@ -9969,11 +10382,6 @@ webidl-conversions@^3.0.0: resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== -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== - webidl-conversions@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-7.0.0.tgz#256b4e1882be7debbf01d05f0aa2039778ea080a" @@ -10130,14 +10538,6 @@ whatwg-url@^5.0.0: tr46 "~0.0.3" webidl-conversions "^3.0.0" -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" - which-boxed-primitive@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" From c403932cd7b4688a65cc2a8fe7801605f67752f1 Mon Sep 17 00:00:00 2001 From: Fernando Cremer Date: Mon, 23 Oct 2023 14:51:53 -0400 Subject: [PATCH 08/38] removed cortex.yaml --- plugins/gitlab-issues-plugin/cortex.yaml | 12 ------------ 1 file changed, 12 deletions(-) delete mode 100644 plugins/gitlab-issues-plugin/cortex.yaml diff --git a/plugins/gitlab-issues-plugin/cortex.yaml b/plugins/gitlab-issues-plugin/cortex.yaml deleted file mode 100644 index 6171570..0000000 --- a/plugins/gitlab-issues-plugin/cortex.yaml +++ /dev/null @@ -1,12 +0,0 @@ -openapi: 3.0.1 -info: - title: Gitlab Issues Plugin - description: "" - x-cortex-tag: gitlab-issues-plugin - x-cortex-git: - github: - repository: cortexapps/cortex-plugins - basepath: plugins/gitlab-issues-plugin - x-cortex-custom-metadata: - cortex-template-version: 0.1.0 - cortex-generated-timestamp: 2023-08-14T19:37:03.645550612 From 13782a28fce30b394b222e6871b7f504b723740f Mon Sep 17 00:00:00 2001 From: Fernando Cremer Date: Mon, 23 Oct 2023 14:52:56 -0400 Subject: [PATCH 09/38] removed logo.svg --- plugins/gitlab-issues-plugin/src/assets/logo.svg | 3 --- 1 file changed, 3 deletions(-) delete mode 100644 plugins/gitlab-issues-plugin/src/assets/logo.svg diff --git a/plugins/gitlab-issues-plugin/src/assets/logo.svg b/plugins/gitlab-issues-plugin/src/assets/logo.svg deleted file mode 100644 index 2abafcd..0000000 --- a/plugins/gitlab-issues-plugin/src/assets/logo.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file From 9f3e409be5d160675274d353b8354d46fb4e977a Mon Sep 17 00:00:00 2001 From: Fernando Cremer Date: Mon, 23 Oct 2023 15:59:36 -0400 Subject: [PATCH 10/38] removed unused function getCortexContext from cortex.ts file and ran 'yarn fix' --- .../gitlab-issues-plugin/src/api/Cortex.ts | 9 +-- .../src/components/App.test.tsx | 2 +- .../src/components/App.tsx | 4 +- .../src/components/EntityInfo.test.tsx | 1 - .../src/components/Issues.test.tsx | 13 ++--- .../src/components/Issues.tsx | 41 +++++++------- .../src/lib/parseEntity.ts | 56 +++++++++---------- 7 files changed, 55 insertions(+), 71 deletions(-) diff --git a/plugins/gitlab-issues-plugin/src/api/Cortex.ts b/plugins/gitlab-issues-plugin/src/api/Cortex.ts index ce39520..2f72486 100644 --- a/plugins/gitlab-issues-plugin/src/api/Cortex.ts +++ b/plugins/gitlab-issues-plugin/src/api/Cortex.ts @@ -1,10 +1,3 @@ -import { CortexApi, type CortexContextResponse } from "@cortexapps/plugin-core"; - -export const getCortexContext = async (): Promise => { - const context = await CortexApi.getContext(); - - return context; -}; export const getEntityYaml = async ( baseUrl: string, entityTag: string @@ -12,4 +5,4 @@ export const getEntityYaml = async ( const res = await fetch(`${baseUrl}/catalog/${entityTag}/openapi`); return await res.json(); -}; \ No newline at end of file +}; diff --git a/plugins/gitlab-issues-plugin/src/components/App.test.tsx b/plugins/gitlab-issues-plugin/src/components/App.test.tsx index 4966706..8d273d7 100644 --- a/plugins/gitlab-issues-plugin/src/components/App.test.tsx +++ b/plugins/gitlab-issues-plugin/src/components/App.test.tsx @@ -8,7 +8,7 @@ fetchMock.mockResponse( }) ); describe("App", () => { - it("indicates that it's an awesome plugin", () => { + it("Verifies that the plugin works", () => { render(); expect(fetch).toHaveBeenCalledWith( diff --git a/plugins/gitlab-issues-plugin/src/components/App.tsx b/plugins/gitlab-issues-plugin/src/components/App.tsx index dd73e24..11c4527 100644 --- a/plugins/gitlab-issues-plugin/src/components/App.tsx +++ b/plugins/gitlab-issues-plugin/src/components/App.tsx @@ -2,13 +2,13 @@ import type React from "react"; import { Box, Title, PluginProvider } from "@cortexapps/plugin-core/components"; import "../baseStyles.css"; import ErrorBoundary from "./ErrorBoundary"; -import CortexEntity from "./EntityInfo" +import CortexEntity from "./EntityInfo"; const App: React.FC = () => { return ( - + { it("Shows message when no GitLab info found", async () => { fetchMock.mockIf( diff --git a/plugins/gitlab-issues-plugin/src/components/Issues.test.tsx b/plugins/gitlab-issues-plugin/src/components/Issues.test.tsx index 2b029d1..9b07196 100644 --- a/plugins/gitlab-issues-plugin/src/components/Issues.test.tsx +++ b/plugins/gitlab-issues-plugin/src/components/Issues.test.tsx @@ -104,12 +104,9 @@ const serviceYaml = { describe("Issues", () => { it("has Issues", async () => { - fetchMock.mockIf( - /^https:\/gitlab\.com\/api/, - async (_req: Request) => { - return await Promise.resolve(JSON.stringify([mockIssue])); - } - ); + fetchMock.mockIf(/^https:\/gitlab\.com\/api/, async (_req: Request) => { + return await Promise.resolve(JSON.stringify([mockIssue])); + }); render(); expect(screen.queryByText("Loading")).toBeInTheDocument(); @@ -117,7 +114,7 @@ describe("Issues", () => { await waitFor(() => { expect(screen.queryByText("Loading")).not.toBeInTheDocument(); }); - expect(screen.queryByText("GitHub Issues")).not.toBeInTheDocument(); + expect(screen.queryByText("GitHub Issues")).not.toBeInTheDocument(); // expect(screen.queryByText("Number")).toBeInTheDocument(); }); @@ -135,4 +132,4 @@ describe("Issues", () => { ) ).toBeInTheDocument(); }); -}); \ No newline at end of file +}); diff --git a/plugins/gitlab-issues-plugin/src/components/Issues.tsx b/plugins/gitlab-issues-plugin/src/components/Issues.tsx index 9393837..613a2fc 100644 --- a/plugins/gitlab-issues-plugin/src/components/Issues.tsx +++ b/plugins/gitlab-issues-plugin/src/components/Issues.tsx @@ -1,4 +1,4 @@ -import React, {useState } from "react"; +import React, { useState } from "react"; import { PluginContextLocation } from "@cortexapps/plugin-core"; import { SimpleTable, @@ -36,19 +36,17 @@ const Issues: React.FC = ({ entityYaml }) => { const cortexTag = context.entity!.tag; try { let issueUrl: string = ""; - if ( basepath !== undefined ) { - - issueUrl = `${glURL}api/v4/projects/${owner}%2F${repo}/issues?labels=${cortexTag}`; - } else { - issueUrl = `${glURL}api/v4/projects/${owner}%2F${repo}/issues?sort=asc`; - } - const issuesResult = await fetch(issueUrl); - const issuesJson = await issuesResult.json(); - if (issuesJson.length > 0) { - setHasIssues(true); - setPosts(issuesJson); - } - + if (basepath !== undefined) { + issueUrl = `${glURL}api/v4/projects/${owner}%2F${repo}/issues?labels=${cortexTag}`; + } else { + issueUrl = `${glURL}api/v4/projects/${owner}%2F${repo}/issues?sort=asc`; + } + const issuesResult = await fetch(issueUrl); + const issuesJson = await issuesResult.json(); + if (issuesJson.length > 0) { + setHasIssues(true); + setPosts(issuesJson); + } } catch (Error) {} setIsLoading(false); }; @@ -92,16 +90,15 @@ const Issues: React.FC = ({ entityYaml }) => { ], }; - return isLoading ? ( - ) : hasIssues ? ( - - ) :( - We could not find any Issues associated to this Service - ); - - + ) : hasIssues ? ( + + ) : ( + + We could not find any Issues associated to this Service + + ); }; export default Issues; diff --git a/plugins/gitlab-issues-plugin/src/lib/parseEntity.ts b/plugins/gitlab-issues-plugin/src/lib/parseEntity.ts index 9ab8601..679623b 100644 --- a/plugins/gitlab-issues-plugin/src/lib/parseEntity.ts +++ b/plugins/gitlab-issues-plugin/src/lib/parseEntity.ts @@ -1,32 +1,30 @@ export const getGitLabDetailsFromEntity = ( - entity: Record - ): { owner: string; repo: string; basepath: string } | undefined => { - let owner = ""; - let repo = ""; - let basepath = ""; - - try { - const gitlabDetails = entity.info["x-cortex-git"]?.gitlab; - // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions - if (!gitlabDetails) { - owner = ""; - repo = ""; - basepath = ""; - - return undefined; - } else { - [owner, repo] = gitlabDetails?.repository?.split("/"); - basepath = gitlabDetails?.repository?.basepath; - } - if (!owner || !repo) { - owner = ""; - repo = ""; - basepath = ""; - } - } catch { - - } + entity: Record +): { owner: string; repo: string; basepath: string } | undefined => { + let owner = ""; + let repo = ""; + let basepath = ""; + try { + const gitlabDetails = entity.info["x-cortex-git"]?.gitlab; // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions - return { owner, repo, basepath }; -}; \ No newline at end of file + if (!gitlabDetails) { + owner = ""; + repo = ""; + basepath = ""; + + return undefined; + } else { + [owner, repo] = gitlabDetails?.repository?.split("/"); + basepath = gitlabDetails?.repository?.basepath; + } + if (!owner || !repo) { + owner = ""; + repo = ""; + basepath = ""; + } + } catch {} + + // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions + return { owner, repo, basepath }; +}; From 4b24f247be23cbc5b009f173d4d0fd0efaadef36 Mon Sep 17 00:00:00 2001 From: Fernando Cremer Date: Tue, 24 Oct 2023 12:56:45 -0400 Subject: [PATCH 11/38] updates from PR Review --- plugins/gitlab-issues-plugin/src/components/App.test.tsx | 2 +- .../gitlab-issues-plugin/src/components/EntityInfo.test.tsx | 2 +- plugins/gitlab-issues-plugin/src/components/EntityInfo.tsx | 2 +- plugins/gitlab-issues-plugin/src/components/Issues.test.tsx | 4 +--- 4 files changed, 4 insertions(+), 6 deletions(-) diff --git a/plugins/gitlab-issues-plugin/src/components/App.test.tsx b/plugins/gitlab-issues-plugin/src/components/App.test.tsx index 8d273d7..09a324b 100644 --- a/plugins/gitlab-issues-plugin/src/components/App.test.tsx +++ b/plugins/gitlab-issues-plugin/src/components/App.test.tsx @@ -8,7 +8,7 @@ fetchMock.mockResponse( }) ); describe("App", () => { - it("Verifies that the plugin works", () => { + it("verifies that the plugin works", () => { render(); expect(fetch).toHaveBeenCalledWith( diff --git a/plugins/gitlab-issues-plugin/src/components/EntityInfo.test.tsx b/plugins/gitlab-issues-plugin/src/components/EntityInfo.test.tsx index 7badbf0..c25f4dd 100644 --- a/plugins/gitlab-issues-plugin/src/components/EntityInfo.test.tsx +++ b/plugins/gitlab-issues-plugin/src/components/EntityInfo.test.tsx @@ -17,7 +17,7 @@ describe("EntityInfo", () => { await waitFor(() => { expect( - screen.queryByText("No GitHub details were found for this entity") + screen.queryByText("No GitLab details were found for this entity") ).toBeInTheDocument(); }); }); diff --git a/plugins/gitlab-issues-plugin/src/components/EntityInfo.tsx b/plugins/gitlab-issues-plugin/src/components/EntityInfo.tsx index d1fcd86..fc0a6b8 100644 --- a/plugins/gitlab-issues-plugin/src/components/EntityInfo.tsx +++ b/plugins/gitlab-issues-plugin/src/components/EntityInfo.tsx @@ -41,7 +41,7 @@ const CortexEntity: React.FC = () => { {isEmpty(gitlabDetails) ? ( - No GitHub details were found for this entity + No GitLab details were found for this entity ) : ( diff --git a/plugins/gitlab-issues-plugin/src/components/Issues.test.tsx b/plugins/gitlab-issues-plugin/src/components/Issues.test.tsx index 9b07196..c78238c 100644 --- a/plugins/gitlab-issues-plugin/src/components/Issues.test.tsx +++ b/plugins/gitlab-issues-plugin/src/components/Issues.test.tsx @@ -96,7 +96,7 @@ const serviceYaml = { info: { "x-cortex-git": { gitlab: { - repository: "cortexapps/plugin-core", + repository: "cremerfc/patientconnect", }, }, }, @@ -110,11 +110,9 @@ describe("Issues", () => { render(); expect(screen.queryByText("Loading")).toBeInTheDocument(); - expect(screen.queryByText("loading")).not.toBeInTheDocument(); await waitFor(() => { expect(screen.queryByText("Loading")).not.toBeInTheDocument(); }); - expect(screen.queryByText("GitHub Issues")).not.toBeInTheDocument(); // expect(screen.queryByText("Number")).toBeInTheDocument(); }); From 7cad0fa7962653c66427fea5a545d964c451a364 Mon Sep 17 00:00:00 2001 From: cremerfc Date: Tue, 24 Oct 2023 12:59:46 -0400 Subject: [PATCH 12/38] Update plugins/gitlab-issues-plugin/src/components/Issues.tsx Co-authored-by: David Barnes --- plugins/gitlab-issues-plugin/src/components/Issues.tsx | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/plugins/gitlab-issues-plugin/src/components/Issues.tsx b/plugins/gitlab-issues-plugin/src/components/Issues.tsx index 613a2fc..02030f3 100644 --- a/plugins/gitlab-issues-plugin/src/components/Issues.tsx +++ b/plugins/gitlab-issues-plugin/src/components/Issues.tsx @@ -35,12 +35,10 @@ const Issues: React.FC = ({ entityYaml }) => { // eslint-disable-next-line @typescript-eslint/no-non-null-assertion const cortexTag = context.entity!.tag; try { - let issueUrl: string = ""; - if (basepath !== undefined) { - issueUrl = `${glURL}api/v4/projects/${owner}%2F${repo}/issues?labels=${cortexTag}`; - } else { - issueUrl = `${glURL}api/v4/projects/${owner}%2F${repo}/issues?sort=asc`; - } + const issueUrl = basepath ? + `${glURL}api/v4/projects/${owner}%2F${repo}/issues?labels=${cortexTag}` : + `${glURL}api/v4/projects/${owner}%2F${repo}/issues?sort=asc`; + const issuesResult = await fetch(issueUrl); const issuesJson = await issuesResult.json(); if (issuesJson.length > 0) { From e5a3456973fb939d336016966416e8d8194da067 Mon Sep 17 00:00:00 2001 From: cremerfc Date: Tue, 24 Oct 2023 13:01:08 -0400 Subject: [PATCH 13/38] Update plugins/gitlab-issues-plugin/src/components/Issues.tsx Co-authored-by: David Barnes --- plugins/gitlab-issues-plugin/src/components/Issues.tsx | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/plugins/gitlab-issues-plugin/src/components/Issues.tsx b/plugins/gitlab-issues-plugin/src/components/Issues.tsx index 02030f3..a37a5c8 100644 --- a/plugins/gitlab-issues-plugin/src/components/Issues.tsx +++ b/plugins/gitlab-issues-plugin/src/components/Issues.tsx @@ -45,7 +45,9 @@ const Issues: React.FC = ({ entityYaml }) => { setHasIssues(true); setPosts(issuesJson); } - } catch (Error) {} + } catch (err) { + console.error(`Error fetching issues:`, err); + } setIsLoading(false); }; void fetchData(); From 6ae3e1c44c50cd9bfabc8be23aaf7760e168d4e6 Mon Sep 17 00:00:00 2001 From: cremerfc Date: Tue, 24 Oct 2023 13:01:22 -0400 Subject: [PATCH 14/38] Update plugins/gitlab-issues-plugin/src/components/Issues.tsx Co-authored-by: David Barnes --- plugins/gitlab-issues-plugin/src/components/Issues.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/gitlab-issues-plugin/src/components/Issues.tsx b/plugins/gitlab-issues-plugin/src/components/Issues.tsx index a37a5c8..cb4c88a 100644 --- a/plugins/gitlab-issues-plugin/src/components/Issues.tsx +++ b/plugins/gitlab-issues-plugin/src/components/Issues.tsx @@ -96,7 +96,7 @@ const Issues: React.FC = ({ entityYaml }) => { ) : ( - We could not find any Issues associated to this Service + We could not find any Issues associated with this service ); }; From d27b2042e564715a2496265e2312d824016af647 Mon Sep 17 00:00:00 2001 From: cremerfc Date: Tue, 24 Oct 2023 13:01:41 -0400 Subject: [PATCH 15/38] Update plugins/gitlab-issues-plugin/src/components/Issues.test.tsx Co-authored-by: David Barnes --- plugins/gitlab-issues-plugin/src/components/Issues.test.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/gitlab-issues-plugin/src/components/Issues.test.tsx b/plugins/gitlab-issues-plugin/src/components/Issues.test.tsx index c78238c..e28b702 100644 --- a/plugins/gitlab-issues-plugin/src/components/Issues.test.tsx +++ b/plugins/gitlab-issues-plugin/src/components/Issues.test.tsx @@ -104,7 +104,7 @@ const serviceYaml = { describe("Issues", () => { it("has Issues", async () => { - fetchMock.mockIf(/^https:\/gitlab\.com\/api/, async (_req: Request) => { + fetchMock.mockIf(/^https:\/\/gitlab\.com\/api/, async (_req: Request) => { return await Promise.resolve(JSON.stringify([mockIssue])); }); From 545aaf18cd1f330f3de64002624cd2e416055d70 Mon Sep 17 00:00:00 2001 From: Fernando Cremer Date: Tue, 24 Oct 2023 13:00:05 -0400 Subject: [PATCH 16/38] more changes from PR --- plugins/gitlab-issues-plugin/src/components/Issues.test.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/plugins/gitlab-issues-plugin/src/components/Issues.test.tsx b/plugins/gitlab-issues-plugin/src/components/Issues.test.tsx index e28b702..c866320 100644 --- a/plugins/gitlab-issues-plugin/src/components/Issues.test.tsx +++ b/plugins/gitlab-issues-plugin/src/components/Issues.test.tsx @@ -113,6 +113,7 @@ describe("Issues", () => { await waitFor(() => { expect(screen.queryByText("Loading")).not.toBeInTheDocument(); }); + expect(screen.queryByText("GitLab Issues")).not.toBeInTheDocument(); // expect(screen.queryByText("Number")).toBeInTheDocument(); }); From 1f6b82419b1f0ebf22004b3a0e0c9cd6cda11fae Mon Sep 17 00:00:00 2001 From: Fernando Cremer Date: Tue, 24 Oct 2023 13:13:11 -0400 Subject: [PATCH 17/38] adding more tests --- .../src/components/Issues.test.tsx | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/plugins/gitlab-issues-plugin/src/components/Issues.test.tsx b/plugins/gitlab-issues-plugin/src/components/Issues.test.tsx index c866320..6d5136e 100644 --- a/plugins/gitlab-issues-plugin/src/components/Issues.test.tsx +++ b/plugins/gitlab-issues-plugin/src/components/Issues.test.tsx @@ -1,6 +1,7 @@ import { render, screen, waitFor } from "@testing-library/react"; import Issues from "./Issues"; +const mockNoIssue = [] const mockIssue = [ { project_id: 4, @@ -102,6 +103,8 @@ const serviceYaml = { }, }; + + describe("Issues", () => { it("has Issues", async () => { fetchMock.mockIf(/^https:\/\/gitlab\.com\/api/, async (_req: Request) => { @@ -114,20 +117,24 @@ describe("Issues", () => { expect(screen.queryByText("Loading")).not.toBeInTheDocument(); }); expect(screen.queryByText("GitLab Issues")).not.toBeInTheDocument(); - // expect(screen.queryByText("Number")).toBeInTheDocument(); + expect(screen.queryByText("Number")).toBeInTheDocument(); }); it("has no Issues", async () => { + + fetchMock.mockIf(/^https:\/\/gitlab\.com\/api/, async (_req: Request) => { + return await Promise.resolve(JSON.stringify([mockNoIssue])); + }); render(); expect(screen.queryByText("Loading")).toBeInTheDocument(); - // expect(screen.queryByText("Number")).not.toBeInTheDocument(); await waitFor(() => { expect(screen.queryByText("Loading")).not.toBeInTheDocument(); }); + screen.debug(); expect( screen.queryByText( - "We could not find any Issues associated to this Service" + "We could not find any Issues associated with this service" ) ).toBeInTheDocument(); }); From 5c5af14733131243f85f01152397778849a99dde Mon Sep 17 00:00:00 2001 From: foodproduct Date: Tue, 24 Oct 2023 15:01:24 -0400 Subject: [PATCH 18/38] fix tests --- .../src/components/App.test.tsx | 8 ++++++-- .../src/components/Issues.test.tsx | 16 ++++++---------- .../src/components/Issues.tsx | 7 ++++--- 3 files changed, 16 insertions(+), 15 deletions(-) diff --git a/plugins/gitlab-issues-plugin/src/components/App.test.tsx b/plugins/gitlab-issues-plugin/src/components/App.test.tsx index 09a324b..299e9bc 100644 --- a/plugins/gitlab-issues-plugin/src/components/App.test.tsx +++ b/plugins/gitlab-issues-plugin/src/components/App.test.tsx @@ -1,4 +1,4 @@ -import { render } from "@testing-library/react"; +import { render, screen, waitFor } from "@testing-library/react"; import App from "./App"; fetchMock.mockResponse( @@ -8,11 +8,15 @@ fetchMock.mockResponse( }) ); describe("App", () => { - it("verifies that the plugin works", () => { + it("verifies that the plugin works", async () => { render(); expect(fetch).toHaveBeenCalledWith( "https://api.getcortexapp.com/catalog/inventory-planner/openapi" ); + + await waitFor(() => { + expect(screen.queryByText("Loading")).not.toBeInTheDocument(); + }); }); }); diff --git a/plugins/gitlab-issues-plugin/src/components/Issues.test.tsx b/plugins/gitlab-issues-plugin/src/components/Issues.test.tsx index 6d5136e..62f0245 100644 --- a/plugins/gitlab-issues-plugin/src/components/Issues.test.tsx +++ b/plugins/gitlab-issues-plugin/src/components/Issues.test.tsx @@ -1,8 +1,7 @@ import { render, screen, waitFor } from "@testing-library/react"; import Issues from "./Issues"; -const mockNoIssue = [] -const mockIssue = [ +const mockIssues = [ { project_id: 4, milestone: { @@ -103,12 +102,10 @@ const serviceYaml = { }, }; - - describe("Issues", () => { it("has Issues", async () => { fetchMock.mockIf(/^https:\/\/gitlab\.com\/api/, async (_req: Request) => { - return await Promise.resolve(JSON.stringify([mockIssue])); + return await Promise.resolve(JSON.stringify(mockIssues)); }); render(); @@ -121,17 +118,16 @@ describe("Issues", () => { }); it("has no Issues", async () => { - - fetchMock.mockIf(/^https:\/\/gitlab\.com\/api/, async (_req: Request) => { - return await Promise.resolve(JSON.stringify([mockNoIssue])); - }); + fetchMock.mockIf(/^https:\/\/gitlab\.com\/api/, async (_req: Request) => { + return await Promise.resolve(JSON.stringify([])); + }); render(); expect(screen.queryByText("Loading")).toBeInTheDocument(); await waitFor(() => { expect(screen.queryByText("Loading")).not.toBeInTheDocument(); }); - screen.debug(); + expect( screen.queryByText( "We could not find any Issues associated with this service" diff --git a/plugins/gitlab-issues-plugin/src/components/Issues.tsx b/plugins/gitlab-issues-plugin/src/components/Issues.tsx index cb4c88a..f83e6fb 100644 --- a/plugins/gitlab-issues-plugin/src/components/Issues.tsx +++ b/plugins/gitlab-issues-plugin/src/components/Issues.tsx @@ -35,12 +35,13 @@ const Issues: React.FC = ({ entityYaml }) => { // eslint-disable-next-line @typescript-eslint/no-non-null-assertion const cortexTag = context.entity!.tag; try { - const issueUrl = basepath ? - `${glURL}api/v4/projects/${owner}%2F${repo}/issues?labels=${cortexTag}` : - `${glURL}api/v4/projects/${owner}%2F${repo}/issues?sort=asc`; + const issueUrl = basepath + ? `${glURL}api/v4/projects/${owner}%2F${repo}/issues?labels=${cortexTag}` + : `${glURL}api/v4/projects/${owner}%2F${repo}/issues?sort=asc`; const issuesResult = await fetch(issueUrl); const issuesJson = await issuesResult.json(); + if (issuesJson.length > 0) { setHasIssues(true); setPosts(issuesJson); From d75dbfbe21f036821c61838f78183c0dfeeea055 Mon Sep 17 00:00:00 2001 From: Fernando Cremer Date: Tue, 24 Oct 2023 15:44:25 -0400 Subject: [PATCH 19/38] renamed plugin folder --- .../.eslintignore | 0 .../.eslintrc.js | 0 .../.gitignore | 0 .../.prettierignore | 0 .../README.md | 0 .../__mocks__/fileMock.js | 0 .../__mocks__/styleMock.js | 0 .../babel.config.js | 0 .../img/gl-issues-cortex.png | Bin .../img/gl-no-repo-defined.png | Bin .../img/gl-proxy.png | Bin .../jest.config.js | 0 .../package.json | 0 .../setupTests.ts | 0 .../src/api/Cortex.ts | 0 .../src/baseStyles.css | 0 .../src/components/App.test.tsx | 0 .../src/components/App.tsx | 0 .../src/components/EntityInfo.test.tsx | 0 .../src/components/EntityInfo.tsx | 0 .../src/components/ErrorBoundary.tsx | 0 .../src/components/Issues.test.tsx | 0 .../src/components/Issues.tsx | 0 .../src/components/PluginContext.tsx | 0 .../src/index.html | 0 .../src/index.tsx | 0 .../src/lib/parseEntity.ts | 0 .../src/typings.d.ts | 0 .../tsconfig.json | 0 .../webpack.config.js | 0 30 files changed, 0 insertions(+), 0 deletions(-) rename plugins/{gitlab-issues-plugin => gitlab-issues}/.eslintignore (100%) rename plugins/{gitlab-issues-plugin => gitlab-issues}/.eslintrc.js (100%) rename plugins/{gitlab-issues-plugin => gitlab-issues}/.gitignore (100%) rename plugins/{gitlab-issues-plugin => gitlab-issues}/.prettierignore (100%) rename plugins/{gitlab-issues-plugin => gitlab-issues}/README.md (100%) rename plugins/{gitlab-issues-plugin => gitlab-issues}/__mocks__/fileMock.js (100%) rename plugins/{gitlab-issues-plugin => gitlab-issues}/__mocks__/styleMock.js (100%) rename plugins/{gitlab-issues-plugin => gitlab-issues}/babel.config.js (100%) rename plugins/{gitlab-issues-plugin => gitlab-issues}/img/gl-issues-cortex.png (100%) rename plugins/{gitlab-issues-plugin => gitlab-issues}/img/gl-no-repo-defined.png (100%) rename plugins/{gitlab-issues-plugin => gitlab-issues}/img/gl-proxy.png (100%) rename plugins/{gitlab-issues-plugin => gitlab-issues}/jest.config.js (100%) rename plugins/{gitlab-issues-plugin => gitlab-issues}/package.json (100%) rename plugins/{gitlab-issues-plugin => gitlab-issues}/setupTests.ts (100%) rename plugins/{gitlab-issues-plugin => gitlab-issues}/src/api/Cortex.ts (100%) rename plugins/{gitlab-issues-plugin => gitlab-issues}/src/baseStyles.css (100%) rename plugins/{gitlab-issues-plugin => gitlab-issues}/src/components/App.test.tsx (100%) rename plugins/{gitlab-issues-plugin => gitlab-issues}/src/components/App.tsx (100%) rename plugins/{gitlab-issues-plugin => gitlab-issues}/src/components/EntityInfo.test.tsx (100%) rename plugins/{gitlab-issues-plugin => gitlab-issues}/src/components/EntityInfo.tsx (100%) rename plugins/{gitlab-issues-plugin => gitlab-issues}/src/components/ErrorBoundary.tsx (100%) rename plugins/{gitlab-issues-plugin => gitlab-issues}/src/components/Issues.test.tsx (100%) rename plugins/{gitlab-issues-plugin => gitlab-issues}/src/components/Issues.tsx (100%) rename plugins/{gitlab-issues-plugin => gitlab-issues}/src/components/PluginContext.tsx (100%) rename plugins/{gitlab-issues-plugin => gitlab-issues}/src/index.html (100%) rename plugins/{gitlab-issues-plugin => gitlab-issues}/src/index.tsx (100%) rename plugins/{gitlab-issues-plugin => gitlab-issues}/src/lib/parseEntity.ts (100%) rename plugins/{gitlab-issues-plugin => gitlab-issues}/src/typings.d.ts (100%) rename plugins/{gitlab-issues-plugin => gitlab-issues}/tsconfig.json (100%) rename plugins/{gitlab-issues-plugin => gitlab-issues}/webpack.config.js (100%) diff --git a/plugins/gitlab-issues-plugin/.eslintignore b/plugins/gitlab-issues/.eslintignore similarity index 100% rename from plugins/gitlab-issues-plugin/.eslintignore rename to plugins/gitlab-issues/.eslintignore diff --git a/plugins/gitlab-issues-plugin/.eslintrc.js b/plugins/gitlab-issues/.eslintrc.js similarity index 100% rename from plugins/gitlab-issues-plugin/.eslintrc.js rename to plugins/gitlab-issues/.eslintrc.js diff --git a/plugins/gitlab-issues-plugin/.gitignore b/plugins/gitlab-issues/.gitignore similarity index 100% rename from plugins/gitlab-issues-plugin/.gitignore rename to plugins/gitlab-issues/.gitignore diff --git a/plugins/gitlab-issues-plugin/.prettierignore b/plugins/gitlab-issues/.prettierignore similarity index 100% rename from plugins/gitlab-issues-plugin/.prettierignore rename to plugins/gitlab-issues/.prettierignore diff --git a/plugins/gitlab-issues-plugin/README.md b/plugins/gitlab-issues/README.md similarity index 100% rename from plugins/gitlab-issues-plugin/README.md rename to plugins/gitlab-issues/README.md diff --git a/plugins/gitlab-issues-plugin/__mocks__/fileMock.js b/plugins/gitlab-issues/__mocks__/fileMock.js similarity index 100% rename from plugins/gitlab-issues-plugin/__mocks__/fileMock.js rename to plugins/gitlab-issues/__mocks__/fileMock.js diff --git a/plugins/gitlab-issues-plugin/__mocks__/styleMock.js b/plugins/gitlab-issues/__mocks__/styleMock.js similarity index 100% rename from plugins/gitlab-issues-plugin/__mocks__/styleMock.js rename to plugins/gitlab-issues/__mocks__/styleMock.js diff --git a/plugins/gitlab-issues-plugin/babel.config.js b/plugins/gitlab-issues/babel.config.js similarity index 100% rename from plugins/gitlab-issues-plugin/babel.config.js rename to plugins/gitlab-issues/babel.config.js diff --git a/plugins/gitlab-issues-plugin/img/gl-issues-cortex.png b/plugins/gitlab-issues/img/gl-issues-cortex.png similarity index 100% rename from plugins/gitlab-issues-plugin/img/gl-issues-cortex.png rename to plugins/gitlab-issues/img/gl-issues-cortex.png diff --git a/plugins/gitlab-issues-plugin/img/gl-no-repo-defined.png b/plugins/gitlab-issues/img/gl-no-repo-defined.png similarity index 100% rename from plugins/gitlab-issues-plugin/img/gl-no-repo-defined.png rename to plugins/gitlab-issues/img/gl-no-repo-defined.png diff --git a/plugins/gitlab-issues-plugin/img/gl-proxy.png b/plugins/gitlab-issues/img/gl-proxy.png similarity index 100% rename from plugins/gitlab-issues-plugin/img/gl-proxy.png rename to plugins/gitlab-issues/img/gl-proxy.png diff --git a/plugins/gitlab-issues-plugin/jest.config.js b/plugins/gitlab-issues/jest.config.js similarity index 100% rename from plugins/gitlab-issues-plugin/jest.config.js rename to plugins/gitlab-issues/jest.config.js diff --git a/plugins/gitlab-issues-plugin/package.json b/plugins/gitlab-issues/package.json similarity index 100% rename from plugins/gitlab-issues-plugin/package.json rename to plugins/gitlab-issues/package.json diff --git a/plugins/gitlab-issues-plugin/setupTests.ts b/plugins/gitlab-issues/setupTests.ts similarity index 100% rename from plugins/gitlab-issues-plugin/setupTests.ts rename to plugins/gitlab-issues/setupTests.ts diff --git a/plugins/gitlab-issues-plugin/src/api/Cortex.ts b/plugins/gitlab-issues/src/api/Cortex.ts similarity index 100% rename from plugins/gitlab-issues-plugin/src/api/Cortex.ts rename to plugins/gitlab-issues/src/api/Cortex.ts diff --git a/plugins/gitlab-issues-plugin/src/baseStyles.css b/plugins/gitlab-issues/src/baseStyles.css similarity index 100% rename from plugins/gitlab-issues-plugin/src/baseStyles.css rename to plugins/gitlab-issues/src/baseStyles.css diff --git a/plugins/gitlab-issues-plugin/src/components/App.test.tsx b/plugins/gitlab-issues/src/components/App.test.tsx similarity index 100% rename from plugins/gitlab-issues-plugin/src/components/App.test.tsx rename to plugins/gitlab-issues/src/components/App.test.tsx diff --git a/plugins/gitlab-issues-plugin/src/components/App.tsx b/plugins/gitlab-issues/src/components/App.tsx similarity index 100% rename from plugins/gitlab-issues-plugin/src/components/App.tsx rename to plugins/gitlab-issues/src/components/App.tsx diff --git a/plugins/gitlab-issues-plugin/src/components/EntityInfo.test.tsx b/plugins/gitlab-issues/src/components/EntityInfo.test.tsx similarity index 100% rename from plugins/gitlab-issues-plugin/src/components/EntityInfo.test.tsx rename to plugins/gitlab-issues/src/components/EntityInfo.test.tsx diff --git a/plugins/gitlab-issues-plugin/src/components/EntityInfo.tsx b/plugins/gitlab-issues/src/components/EntityInfo.tsx similarity index 100% rename from plugins/gitlab-issues-plugin/src/components/EntityInfo.tsx rename to plugins/gitlab-issues/src/components/EntityInfo.tsx diff --git a/plugins/gitlab-issues-plugin/src/components/ErrorBoundary.tsx b/plugins/gitlab-issues/src/components/ErrorBoundary.tsx similarity index 100% rename from plugins/gitlab-issues-plugin/src/components/ErrorBoundary.tsx rename to plugins/gitlab-issues/src/components/ErrorBoundary.tsx diff --git a/plugins/gitlab-issues-plugin/src/components/Issues.test.tsx b/plugins/gitlab-issues/src/components/Issues.test.tsx similarity index 100% rename from plugins/gitlab-issues-plugin/src/components/Issues.test.tsx rename to plugins/gitlab-issues/src/components/Issues.test.tsx diff --git a/plugins/gitlab-issues-plugin/src/components/Issues.tsx b/plugins/gitlab-issues/src/components/Issues.tsx similarity index 100% rename from plugins/gitlab-issues-plugin/src/components/Issues.tsx rename to plugins/gitlab-issues/src/components/Issues.tsx diff --git a/plugins/gitlab-issues-plugin/src/components/PluginContext.tsx b/plugins/gitlab-issues/src/components/PluginContext.tsx similarity index 100% rename from plugins/gitlab-issues-plugin/src/components/PluginContext.tsx rename to plugins/gitlab-issues/src/components/PluginContext.tsx diff --git a/plugins/gitlab-issues-plugin/src/index.html b/plugins/gitlab-issues/src/index.html similarity index 100% rename from plugins/gitlab-issues-plugin/src/index.html rename to plugins/gitlab-issues/src/index.html diff --git a/plugins/gitlab-issues-plugin/src/index.tsx b/plugins/gitlab-issues/src/index.tsx similarity index 100% rename from plugins/gitlab-issues-plugin/src/index.tsx rename to plugins/gitlab-issues/src/index.tsx diff --git a/plugins/gitlab-issues-plugin/src/lib/parseEntity.ts b/plugins/gitlab-issues/src/lib/parseEntity.ts similarity index 100% rename from plugins/gitlab-issues-plugin/src/lib/parseEntity.ts rename to plugins/gitlab-issues/src/lib/parseEntity.ts diff --git a/plugins/gitlab-issues-plugin/src/typings.d.ts b/plugins/gitlab-issues/src/typings.d.ts similarity index 100% rename from plugins/gitlab-issues-plugin/src/typings.d.ts rename to plugins/gitlab-issues/src/typings.d.ts diff --git a/plugins/gitlab-issues-plugin/tsconfig.json b/plugins/gitlab-issues/tsconfig.json similarity index 100% rename from plugins/gitlab-issues-plugin/tsconfig.json rename to plugins/gitlab-issues/tsconfig.json diff --git a/plugins/gitlab-issues-plugin/webpack.config.js b/plugins/gitlab-issues/webpack.config.js similarity index 100% rename from plugins/gitlab-issues-plugin/webpack.config.js rename to plugins/gitlab-issues/webpack.config.js From be4813d1f07dbf7e13014451e0f91e02de022946 Mon Sep 17 00:00:00 2001 From: Fernando Cremer Date: Wed, 25 Oct 2023 10:53:00 -0400 Subject: [PATCH 20/38] removed PluginContext and updated ReadMe --- plugins/gitlab-issues/README.md | 12 +++++------- .../src/components/PluginContext.tsx | 15 --------------- 2 files changed, 5 insertions(+), 22 deletions(-) delete mode 100644 plugins/gitlab-issues/src/components/PluginContext.tsx diff --git a/plugins/gitlab-issues/README.md b/plugins/gitlab-issues/README.md index b08189c..0b1f08b 100644 --- a/plugins/gitlab-issues/README.md +++ b/plugins/gitlab-issues/README.md @@ -1,22 +1,22 @@ # GitLab Issues Cortex Plugin -View GitLab Issues associated to your services! +View GitLab issues associated with your services!
-The GitLab Issues shows the open GitLab issues associated to the GitLab repository specified in the entity's `cortex.yaml`. If the `cortex.yaml` has a `basepath` defined in its `x-cortex-git` configuration, it will query for issues filtering by a label that matches the tag of the entity. +The GitLab Issues plugin shows open GitLab issues associated to the GitLab repository specified in the entity's `cortex.yaml`. If the `cortex.yaml` has a `basepath` defined in its `x-cortex-git` configuration, it will query for issues filtering by a label that matches the tag of the entity. ## Setup This plugin requires a proxy to GitLab. The API that the plugin uses is documented [here](https://docs.gitlab.com/ee/api/issues.html), which details the type of headers you need defined. - Define a secret that contains your GitLab Access Token. To determine which type of token to use, check the [docs](https://docs.gitlab.com/ee/api/rest/index.html#authentication). -- Define a proxy that is pointed to your GitHub instance with the headers mentioned in the docs. Here is a screenshot of how your proxy may look like: +- Define a proxy that is pointed to your GitLab instance with the headers mentioned in the docs. Here is a screenshot of how your proxy may look like:
- Register the plugin. - This plan will not work on the Global context. - - Select the entity that will have the GitHub repo in its `cortex.yaml` + - Select the entity that will have the GitLab repo in its `cortex.yaml` ## Troubleshooting @@ -26,11 +26,9 @@ If you get the following message:
-This means that the plugin did not find a GitHub repository defined as described [here](https://docs.cortex.io/docs/reference/integrations/github#catalog-descriptor). +This means that the plugin did not find a GitLab repository defined as described [here](https://docs.cortex.io/docs/reference/integrations/gitlab#catalog-descriptor). -### Getting a generic error message -If you are getting a generic "Oops! There was a runtime error" message, you may want to look the browser's console and track where the plugin is breaking down based on which `console.log` output is displayed in the console. # Setting up your dev environment diff --git a/plugins/gitlab-issues/src/components/PluginContext.tsx b/plugins/gitlab-issues/src/components/PluginContext.tsx deleted file mode 100644 index 13ee6d4..0000000 --- a/plugins/gitlab-issues/src/components/PluginContext.tsx +++ /dev/null @@ -1,15 +0,0 @@ -import { Title, usePluginContext } from "@cortexapps/plugin-core/components"; -import type React from "react"; - -const PluginContext: React.FC = () => { - const context = usePluginContext(); - - return ( - <> - Plugin context -
{JSON.stringify(context, null, 2)}
- - ); -}; - -export default PluginContext; From 907e530a4e0769de25bb04f6f84c32e0f793156c Mon Sep 17 00:00:00 2001 From: Fernando Cremer Date: Wed, 25 Oct 2023 10:55:49 -0400 Subject: [PATCH 21/38] removed jest dependency in run time --- plugins/gitlab-issues/package.json | 1 - 1 file changed, 1 deletion(-) diff --git a/plugins/gitlab-issues/package.json b/plugins/gitlab-issues/package.json index dd6e7a3..e301a6f 100644 --- a/plugins/gitlab-issues/package.json +++ b/plugins/gitlab-issues/package.json @@ -4,7 +4,6 @@ "license": "MIT", "dependencies": { "@cortexapps/plugin-core": "^2.0.0", - "jest": "^29.7.0", "react": "^18.2.0", "react-dom": "^18.2.0" }, From e2feb86c8b92c9932794c50d60291e9153c14084 Mon Sep 17 00:00:00 2001 From: Fernando Cremer Date: Wed, 25 Oct 2023 11:11:40 -0400 Subject: [PATCH 22/38] ran yarn fix --- plugins/gitlab-issues/README.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/plugins/gitlab-issues/README.md b/plugins/gitlab-issues/README.md index 0b1f08b..2fafc0e 100644 --- a/plugins/gitlab-issues/README.md +++ b/plugins/gitlab-issues/README.md @@ -28,8 +28,6 @@ If you get the following message: This means that the plugin did not find a GitLab repository defined as described [here](https://docs.cortex.io/docs/reference/integrations/gitlab#catalog-descriptor). - - # Setting up your dev environment GitLab Issues Plugin is a [Cortex](https://www.cortex.io/) plugin. To see how to run the plugin inside of Cortex, see [our docs](https://docs.cortex.io/docs/plugins). From d17569d8dc1d775c3ab29d72160ed60648ee9507 Mon Sep 17 00:00:00 2001 From: cremerfc Date: Wed, 25 Oct 2023 12:56:58 -0400 Subject: [PATCH 23/38] Update plugins/gitlab-issues/src/components/EntityInfo.test.tsx Co-authored-by: David Barnes --- plugins/gitlab-issues/src/components/EntityInfo.test.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/gitlab-issues/src/components/EntityInfo.test.tsx b/plugins/gitlab-issues/src/components/EntityInfo.test.tsx index c25f4dd..95c06e3 100644 --- a/plugins/gitlab-issues/src/components/EntityInfo.test.tsx +++ b/plugins/gitlab-issues/src/components/EntityInfo.test.tsx @@ -2,7 +2,7 @@ import { render, screen, waitFor } from "@testing-library/react"; import EntityInfo from "./EntityInfo"; describe("EntityInfo", () => { - it("Shows message when no GitLab info found", async () => { + it("shows message when no GitLab info found", async () => { fetchMock.mockIf( /^https:\/\/api\.getcortexapp\.com\/catalog\/.*/, async (_req: Request) => { From f1cf7ff357905a6f12f807c6aa87d3e7a50453af Mon Sep 17 00:00:00 2001 From: cremerfc Date: Wed, 25 Oct 2023 12:57:17 -0400 Subject: [PATCH 24/38] Update plugins/gitlab-issues/src/api/Cortex.ts Co-authored-by: David Barnes --- plugins/gitlab-issues/src/api/Cortex.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/gitlab-issues/src/api/Cortex.ts b/plugins/gitlab-issues/src/api/Cortex.ts index 2f72486..01a0d12 100644 --- a/plugins/gitlab-issues/src/api/Cortex.ts +++ b/plugins/gitlab-issues/src/api/Cortex.ts @@ -1,7 +1,7 @@ export const getEntityYaml = async ( baseUrl: string, entityTag: string -): Promise => { +): Promise> => { const res = await fetch(`${baseUrl}/catalog/${entityTag}/openapi`); return await res.json(); From e6ed92ae878c59e32f5ceb887357ada1363a5c73 Mon Sep 17 00:00:00 2001 From: cremerfc Date: Wed, 25 Oct 2023 12:59:26 -0400 Subject: [PATCH 25/38] Update plugins/gitlab-issues/src/components/Issues.tsx Co-authored-by: David Barnes --- plugins/gitlab-issues/src/components/Issues.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/gitlab-issues/src/components/Issues.tsx b/plugins/gitlab-issues/src/components/Issues.tsx index f83e6fb..166beeb 100644 --- a/plugins/gitlab-issues/src/components/Issues.tsx +++ b/plugins/gitlab-issues/src/components/Issues.tsx @@ -97,7 +97,7 @@ const Issues: React.FC = ({ entityYaml }) => { ) : ( - We could not find any Issues associated with this service + We could not find any issues associated with this entity ); }; From e56531802a3fad93a55ff530ff038ba6fbfcb135 Mon Sep 17 00:00:00 2001 From: cremerfc Date: Wed, 25 Oct 2023 12:59:43 -0400 Subject: [PATCH 26/38] Update plugins/gitlab-issues/src/lib/parseEntity.ts Co-authored-by: David Barnes --- plugins/gitlab-issues/src/lib/parseEntity.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/gitlab-issues/src/lib/parseEntity.ts b/plugins/gitlab-issues/src/lib/parseEntity.ts index 679623b..78e457c 100644 --- a/plugins/gitlab-issues/src/lib/parseEntity.ts +++ b/plugins/gitlab-issues/src/lib/parseEntity.ts @@ -1,4 +1,4 @@ -export const getGitLabDetailsFromEntity = ( +export const getGitlabDetailsFromEntity = ( entity: Record ): { owner: string; repo: string; basepath: string } | undefined => { let owner = ""; From 8d5c91fd0e5e13d945cec1ac0105a0c9a5707ef3 Mon Sep 17 00:00:00 2001 From: cremerfc Date: Wed, 25 Oct 2023 12:59:59 -0400 Subject: [PATCH 27/38] Update plugins/gitlab-issues/src/lib/parseEntity.ts Co-authored-by: David Barnes --- plugins/gitlab-issues/src/lib/parseEntity.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/plugins/gitlab-issues/src/lib/parseEntity.ts b/plugins/gitlab-issues/src/lib/parseEntity.ts index 78e457c..038db41 100644 --- a/plugins/gitlab-issues/src/lib/parseEntity.ts +++ b/plugins/gitlab-issues/src/lib/parseEntity.ts @@ -23,7 +23,9 @@ export const getGitlabDetailsFromEntity = ( repo = ""; basepath = ""; } - } catch {} + } catch (err: any) { + console.log(`Error parsing GitLab details from entity descriptor:`, err); + } // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions return { owner, repo, basepath }; From b5d5c6167cc7007f74c171a11a28a8806ef7d7c6 Mon Sep 17 00:00:00 2001 From: Fernando Cremer Date: Wed, 25 Oct 2023 13:17:46 -0400 Subject: [PATCH 28/38] resolved issues with tests introduced by committing changes from review. Mainly updating tests to look for the updated messages --- plugins/gitlab-issues/src/components/EntityInfo.tsx | 4 ++-- plugins/gitlab-issues/src/components/Issues.test.tsx | 2 +- plugins/gitlab-issues/src/components/Issues.tsx | 4 ++-- plugins/gitlab-issues/src/lib/parseEntity.ts | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/plugins/gitlab-issues/src/components/EntityInfo.tsx b/plugins/gitlab-issues/src/components/EntityInfo.tsx index fc0a6b8..8da999d 100644 --- a/plugins/gitlab-issues/src/components/EntityInfo.tsx +++ b/plugins/gitlab-issues/src/components/EntityInfo.tsx @@ -8,7 +8,7 @@ import { Text, usePluginContext, } from "@cortexapps/plugin-core/components"; -import { getGitLabDetailsFromEntity } from "../lib/parseEntity"; +import { getGitlabDetailsFromEntity } from "../lib/parseEntity"; import Issues from "./Issues"; const CortexEntity: React.FC = () => { @@ -32,7 +32,7 @@ const CortexEntity: React.FC = () => { const gitlabDetails = isEmpty(entityYaml) ? undefined - : getGitLabDetailsFromEntity(entityYaml); + : getGitlabDetailsFromEntity(entityYaml); return (
diff --git a/plugins/gitlab-issues/src/components/Issues.test.tsx b/plugins/gitlab-issues/src/components/Issues.test.tsx index 62f0245..f02e64d 100644 --- a/plugins/gitlab-issues/src/components/Issues.test.tsx +++ b/plugins/gitlab-issues/src/components/Issues.test.tsx @@ -130,7 +130,7 @@ describe("Issues", () => { expect( screen.queryByText( - "We could not find any Issues associated with this service" + "We could not find any issues associated with this entity" ) ).toBeInTheDocument(); }); diff --git a/plugins/gitlab-issues/src/components/Issues.tsx b/plugins/gitlab-issues/src/components/Issues.tsx index 166beeb..d6a66b5 100644 --- a/plugins/gitlab-issues/src/components/Issues.tsx +++ b/plugins/gitlab-issues/src/components/Issues.tsx @@ -8,7 +8,7 @@ import { usePluginContext, } from "@cortexapps/plugin-core/components"; import "../baseStyles.css"; -import { getGitLabDetailsFromEntity } from "../lib/parseEntity"; +import { getGitlabDetailsFromEntity } from "../lib/parseEntity"; interface GitIssuesProps { entityYaml: Record; @@ -24,7 +24,7 @@ const Issues: React.FC = ({ entityYaml }) => { const [isLoading, setIsLoading] = React.useState( context.location === PluginContextLocation.Entity ); - const { owner, repo, basepath } = getGitLabDetailsFromEntity(entityYaml) as { + const { owner, repo, basepath } = getGitlabDetailsFromEntity(entityYaml) as { owner: string; repo: string; basepath: string; diff --git a/plugins/gitlab-issues/src/lib/parseEntity.ts b/plugins/gitlab-issues/src/lib/parseEntity.ts index 038db41..90b2db1 100644 --- a/plugins/gitlab-issues/src/lib/parseEntity.ts +++ b/plugins/gitlab-issues/src/lib/parseEntity.ts @@ -24,7 +24,7 @@ export const getGitlabDetailsFromEntity = ( basepath = ""; } } catch (err: any) { - console.log(`Error parsing GitLab details from entity descriptor:`, err); + // console.log(`Error parsing GitLab details from entity descriptor:`, err); } // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions From f941fbd3384166e799b207d1ee0186e4b424da75 Mon Sep 17 00:00:00 2001 From: Fernando Cremer Date: Wed, 25 Oct 2023 13:26:44 -0400 Subject: [PATCH 29/38] ran yarn fix --- plugins/gitlab-issues/src/lib/parseEntity.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/gitlab-issues/src/lib/parseEntity.ts b/plugins/gitlab-issues/src/lib/parseEntity.ts index 90b2db1..c119d97 100644 --- a/plugins/gitlab-issues/src/lib/parseEntity.ts +++ b/plugins/gitlab-issues/src/lib/parseEntity.ts @@ -24,7 +24,7 @@ export const getGitlabDetailsFromEntity = ( basepath = ""; } } catch (err: any) { - // console.log(`Error parsing GitLab details from entity descriptor:`, err); + // console.log(`Error parsing GitLab details from entity descriptor:`, err); } // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions From 31dc53b65cf20ce6626a31c46b9c0cdcff3b0ce0 Mon Sep 17 00:00:00 2001 From: foodproduct Date: Wed, 25 Oct 2023 17:27:36 -0400 Subject: [PATCH 30/38] simplify parseEntity --- plugins/gitlab-issues/src/lib/parseEntity.ts | 32 ++++++++------------ 1 file changed, 13 insertions(+), 19 deletions(-) diff --git a/plugins/gitlab-issues/src/lib/parseEntity.ts b/plugins/gitlab-issues/src/lib/parseEntity.ts index c119d97..3154d56 100644 --- a/plugins/gitlab-issues/src/lib/parseEntity.ts +++ b/plugins/gitlab-issues/src/lib/parseEntity.ts @@ -1,32 +1,26 @@ export const getGitlabDetailsFromEntity = ( entity: Record ): { owner: string; repo: string; basepath: string } | undefined => { - let owner = ""; - let repo = ""; - let basepath = ""; - try { const gitlabDetails = entity.info["x-cortex-git"]?.gitlab; - // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions - if (!gitlabDetails) { - owner = ""; - repo = ""; - basepath = ""; + if (!gitlabDetails) { return undefined; - } else { - [owner, repo] = gitlabDetails?.repository?.split("/"); - basepath = gitlabDetails?.repository?.basepath; } + + const [owner, repo] = gitlabDetails?.repository?.split("/"); + const basepath = gitlabDetails?.repository?.basepath; + if (!owner || !repo) { - owner = ""; - repo = ""; - basepath = ""; + return undefined; } + + return { + basepath, + owner, + repo, + }; } catch (err: any) { - // console.log(`Error parsing GitLab details from entity descriptor:`, err); + console.error(`Error parsing GitLab details from entity descriptor:`, err); } - - // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions - return { owner, repo, basepath }; }; From c7ae42dce0c5da6fc243837772caff889724a3cd Mon Sep 17 00:00:00 2001 From: Fernando Cremer Date: Thu, 26 Oct 2023 16:40:56 -0400 Subject: [PATCH 31/38] Added instructions for self hosted GitLab to ReadMe --- plugins/gitlab-issues/README.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/plugins/gitlab-issues/README.md b/plugins/gitlab-issues/README.md index 2fafc0e..b760df4 100644 --- a/plugins/gitlab-issues/README.md +++ b/plugins/gitlab-issues/README.md @@ -18,6 +18,16 @@ This plugin requires a proxy to GitLab. The API that the plugin uses is document - This plan will not work on the Global context. - Select the entity that will have the GitLab repo in its `cortex.yaml` +## Connecting to an self hosted instance + +This plugin will connect to Gitlab's cloud instance out of the box . If you are self hosting Gitlab and need to direct the plugin to a different api endpoint, update the following section of the [Issues.tsx](src/components/Issues.tsx)file: + +```Typescript +// Set your Gitlab url. Cloud is https://gitlab.com +const glURL = `https://gitlab.com/`; + +``` + ## Troubleshooting ### Getting a message that "This service does not have a GitLab Repo defined" From 7a44bf82deedbcfc751e95239bc3ac35bf1249e8 Mon Sep 17 00:00:00 2001 From: cremerfc Date: Fri, 27 Oct 2023 11:27:07 -0400 Subject: [PATCH 32/38] Update plugins/gitlab-issues/README.md Co-authored-by: David Barnes --- plugins/gitlab-issues/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/gitlab-issues/README.md b/plugins/gitlab-issues/README.md index b760df4..fab04fd 100644 --- a/plugins/gitlab-issues/README.md +++ b/plugins/gitlab-issues/README.md @@ -20,7 +20,7 @@ This plugin requires a proxy to GitLab. The API that the plugin uses is document ## Connecting to an self hosted instance -This plugin will connect to Gitlab's cloud instance out of the box . If you are self hosting Gitlab and need to direct the plugin to a different api endpoint, update the following section of the [Issues.tsx](src/components/Issues.tsx)file: +This plugin will connect to GitLab's cloud instance out of the box. If you are self-hosting GitLab and need to direct the plugin to a different API endpoint, update the following section of the [Issues.tsx](src/components/Issues.tsx)file: ```Typescript // Set your Gitlab url. Cloud is https://gitlab.com From 319b5ab2b38d363085bce9ae656b64b200b561bd Mon Sep 17 00:00:00 2001 From: cremerfc Date: Fri, 27 Oct 2023 11:27:17 -0400 Subject: [PATCH 33/38] Update plugins/gitlab-issues/README.md Co-authored-by: David Barnes --- plugins/gitlab-issues/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/gitlab-issues/README.md b/plugins/gitlab-issues/README.md index fab04fd..3b90f8f 100644 --- a/plugins/gitlab-issues/README.md +++ b/plugins/gitlab-issues/README.md @@ -22,8 +22,8 @@ This plugin requires a proxy to GitLab. The API that the plugin uses is document This plugin will connect to GitLab's cloud instance out of the box. If you are self-hosting GitLab and need to direct the plugin to a different API endpoint, update the following section of the [Issues.tsx](src/components/Issues.tsx)file: -```Typescript -// Set your Gitlab url. Cloud is https://gitlab.com +```ts +// Set your GitLab url. Cloud is https://gitlab.com const glURL = `https://gitlab.com/`; ``` From 9bb9ed77b65d5d2dcfdf4c260c12f00e6bfad85d Mon Sep 17 00:00:00 2001 From: cremerfc Date: Fri, 27 Oct 2023 11:27:57 -0400 Subject: [PATCH 34/38] Update plugins/gitlab-issues/src/components/Issues.tsx Co-authored-by: David Barnes --- plugins/gitlab-issues/src/components/Issues.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/gitlab-issues/src/components/Issues.tsx b/plugins/gitlab-issues/src/components/Issues.tsx index d6a66b5..f5aa260 100644 --- a/plugins/gitlab-issues/src/components/Issues.tsx +++ b/plugins/gitlab-issues/src/components/Issues.tsx @@ -14,7 +14,7 @@ interface GitIssuesProps { entityYaml: Record; } -// Set your Gitlab url. Cloud is https://gitlab.com +// Set your GitLab url. Cloud is https://gitlab.com const glURL = `https://gitlab.com/`; const Issues: React.FC = ({ entityYaml }) => { From 074bd412219fef6ad39d548ae2a2fb2c9516cc22 Mon Sep 17 00:00:00 2001 From: cremerfc Date: Fri, 27 Oct 2023 11:28:07 -0400 Subject: [PATCH 35/38] Update plugins/gitlab-issues/README.md Co-authored-by: David Barnes --- plugins/gitlab-issues/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/gitlab-issues/README.md b/plugins/gitlab-issues/README.md index 3b90f8f..0724157 100644 --- a/plugins/gitlab-issues/README.md +++ b/plugins/gitlab-issues/README.md @@ -18,7 +18,7 @@ This plugin requires a proxy to GitLab. The API that the plugin uses is document - This plan will not work on the Global context. - Select the entity that will have the GitLab repo in its `cortex.yaml` -## Connecting to an self hosted instance +## Connecting to a self-hosted instance This plugin will connect to GitLab's cloud instance out of the box. If you are self-hosting GitLab and need to direct the plugin to a different API endpoint, update the following section of the [Issues.tsx](src/components/Issues.tsx)file: From 7848d54dd5965bbdc86634e0a678d19a26e06418 Mon Sep 17 00:00:00 2001 From: Fernando Cremer Date: Fri, 27 Oct 2023 14:29:04 -0400 Subject: [PATCH 36/38] ran yarn fix after PR commits --- plugins/gitlab-issues/README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/plugins/gitlab-issues/README.md b/plugins/gitlab-issues/README.md index 0724157..53d21dd 100644 --- a/plugins/gitlab-issues/README.md +++ b/plugins/gitlab-issues/README.md @@ -25,7 +25,6 @@ This plugin will connect to GitLab's cloud instance out of the box. If you are s ```ts // Set your GitLab url. Cloud is https://gitlab.com const glURL = `https://gitlab.com/`; - ``` ## Troubleshooting From 62c30805a34d8e565e88eab37cb703b0bfd969e1 Mon Sep 17 00:00:00 2001 From: Fernando Cremer Date: Fri, 27 Oct 2023 22:21:05 -0400 Subject: [PATCH 37/38] small grammar correction --- plugins/gitlab-issues/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/gitlab-issues/README.md b/plugins/gitlab-issues/README.md index 53d21dd..6a8b92b 100644 --- a/plugins/gitlab-issues/README.md +++ b/plugins/gitlab-issues/README.md @@ -4,7 +4,7 @@ View GitLab issues associated with your services!
-The GitLab Issues plugin shows open GitLab issues associated to the GitLab repository specified in the entity's `cortex.yaml`. If the `cortex.yaml` has a `basepath` defined in its `x-cortex-git` configuration, it will query for issues filtering by a label that matches the tag of the entity. +The GitLab Issues plugin shows open GitLab issues associated with the GitLab repository specified in the entity's `cortex.yaml`. If the `cortex.yaml` has a `basepath` defined in its `x-cortex-git` configuration, it will query for issues filtering by a label that matches the tag of the entity. ## Setup From 590c3a286b88e4818bb026e124bb804f32540def Mon Sep 17 00:00:00 2001 From: David Barnes Date: Sat, 28 Oct 2023 13:12:44 -0400 Subject: [PATCH 38/38] copy cleanup --- plugins/gitlab-issues/README.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/plugins/gitlab-issues/README.md b/plugins/gitlab-issues/README.md index 6a8b92b..a0ef1d1 100644 --- a/plugins/gitlab-issues/README.md +++ b/plugins/gitlab-issues/README.md @@ -11,16 +11,16 @@ The GitLab Issues plugin shows open GitLab issues associated with the GitLab rep This plugin requires a proxy to GitLab. The API that the plugin uses is documented [here](https://docs.gitlab.com/ee/api/issues.html), which details the type of headers you need defined. - Define a secret that contains your GitLab Access Token. To determine which type of token to use, check the [docs](https://docs.gitlab.com/ee/api/rest/index.html#authentication). -- Define a proxy that is pointed to your GitLab instance with the headers mentioned in the docs. Here is a screenshot of how your proxy may look like: +- Define a proxy that is pointed to your GitLab instance with the headers mentioned in the docs. Here is a screenshot of what your proxy may look like:
- Register the plugin. - - This plan will not work on the Global context. - - Select the entity that will have the GitLab repo in its `cortex.yaml` + - This plugin will not work on the Global context. + - Select an entity context (and, optionally, filter) that will have the GitLab repo in its `cortex.yaml` ## Connecting to a self-hosted instance -This plugin will connect to GitLab's cloud instance out of the box. If you are self-hosting GitLab and need to direct the plugin to a different API endpoint, update the following section of the [Issues.tsx](src/components/Issues.tsx)file: +This plugin will connect to GitLab's cloud instance out of the box. If you are self-hosting GitLab and need to direct the plugin to a different API endpoint, update the following section of the [Issues.tsx](src/components/Issues.tsx) file: ```ts // Set your GitLab url. Cloud is https://gitlab.com @@ -37,7 +37,7 @@ If you get the following message: This means that the plugin did not find a GitLab repository defined as described [here](https://docs.cortex.io/docs/reference/integrations/gitlab#catalog-descriptor). -# Setting up your dev environment +# Developing this plugin GitLab Issues Plugin is a [Cortex](https://www.cortex.io/) plugin. To see how to run the plugin inside of Cortex, see [our docs](https://docs.cortex.io/docs/plugins).