[] = [
+ {
+ title: 'Path',
+ type: 'string',
+ field: 'path',
+ render: (row: CoverageTableRow) => {
+ if (row.files?.length) {
+ return (
+ {
+ setCurPath(`${curPath}/${row.path}`);
+ moveDownIntoPath(row.path);
+ }}
+ onClick={() => {
+ setCurPath(`${curPath}/${row.path}`);
+ moveDownIntoPath(row.path);
+ }}
+ >
+ {row.path}
+
+ );
+ }
+
+ return (
+
+ {row.path}
+
+ {
+ setCurFile(`${curPath.slice(1)}/${row.path}`);
+ setModalOpen(true);
+ }}
+ />
+
+
+ );
+ },
+ },
+ {
+ title: 'Coverage',
+ type: 'numeric',
+ field: 'coverage',
+ render: (row: CoverageTableRow) => `${row.coverage}%`,
+ },
+ {
+ title: 'Missing lines',
+ type: 'numeric',
+ field: 'missing',
+ },
+ {
+ title: 'Tracked lines',
+ type: 'numeric',
+ field: 'tracked',
+ },
+ ];
+
+ const pathArray = curPath.split('/');
+ const lastPathElementIndex = pathArray.length - 1;
+ const fileCoverage = value.files.find((f: FileCoverage) =>
+ f.filename.endsWith(curFile),
+ );
+
+ return (
+
+
+
+
+ Explore Files
+
+
+ {pathArray.map((pathElement, idx) => (
+
+ moveUpIntoPath(pathElement)}
+ onClick={() => moveUpIntoPath(pathElement)}
+ >
+ {pathElement || 'root'}
+
+ {'\u00A0/\u00A0'}
+
+ ))}
+
+ No files found>}
+ data={tableData || []}
+ columns={columns}
+ />
+ event.stopPropagation()}
+ onClose={() => setModalOpen(false)}
+ style={{ overflow: 'scroll' }}
+ >
+
+
+
+
+
+ );
+};
diff --git a/plugins/code-coverage/src/components/FileExplorer/Highlighter.ts b/plugins/code-coverage/src/components/FileExplorer/Highlighter.ts
new file mode 100644
index 0000000000..fda1a11f11
--- /dev/null
+++ b/plugins/code-coverage/src/components/FileExplorer/Highlighter.ts
@@ -0,0 +1,54 @@
+/*
+ * Copyright 2021 Spotify AB
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+import 'highlight.js/styles/atom-one-dark.css';
+import highlight from 'highlight.js';
+
+/*
+ * Given a file extension, repo name, and array of code lines, return a Promise resolving
+ * to an array of formatted lines with html/css formatting.
+ *
+ * @param {String} fileExtension The extension of the source file
+ * @param {String} repo The name of the code repository
+ * @param {Array} lines The source code lines
+ *
+ * @returns {Promise>} Promise of formatted lines
+ *
+ * @see http://highlightjs.readthedocs.io/en/latest/api.html#highlight-name-value-ignore-illegals-continuation
+ */
+export const highlightLines = (fileExtension: string, lines: Array) => {
+ const formattedLines: Array = [];
+ let state: CompiledMode | Language | undefined;
+ let fileformat = fileExtension;
+ if (fileExtension === 'm') {
+ fileformat = 'objectivec';
+ }
+ if (fileExtension === 'tsx') {
+ fileformat = 'typescript';
+ }
+ if (fileExtension === 'jsx') {
+ fileformat = 'javascript';
+ }
+ if (fileExtension === 'kt') {
+ fileformat = 'kotlin';
+ }
+
+ lines.forEach(line => {
+ const result = highlight.highlight(fileformat, line, true, state);
+ state = result.top;
+ formattedLines.push(result.value);
+ });
+ return formattedLines;
+};
diff --git a/plugins/code-coverage/src/components/FileExplorer/index.ts b/plugins/code-coverage/src/components/FileExplorer/index.ts
new file mode 100644
index 0000000000..88da4059bd
--- /dev/null
+++ b/plugins/code-coverage/src/components/FileExplorer/index.ts
@@ -0,0 +1,17 @@
+/*
+ * Copyright 2020 Spotify AB
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+export { FileExplorer } from './FileExplorer';
diff --git a/plugins/code-coverage/src/components/Router.tsx b/plugins/code-coverage/src/components/Router.tsx
new file mode 100644
index 0000000000..12be6ef5a8
--- /dev/null
+++ b/plugins/code-coverage/src/components/Router.tsx
@@ -0,0 +1,34 @@
+/*
+ * Copyright 2020 Spotify AB
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+import React from 'react';
+import { Entity } from '@backstage/catalog-model';
+import { useEntity } from '@backstage/plugin-catalog-react';
+import { MissingAnnotationEmptyState } from '@backstage/core';
+import { CodeCoveragePage } from './CodeCoveragePage';
+
+export const isCodeCoverageAvailable = (entity: Entity) =>
+ Boolean(entity.metadata.annotations?.['backstage.io/code-coverage']);
+
+export const Router = () => {
+ const { entity } = useEntity();
+
+ if (!isCodeCoverageAvailable(entity)) {
+ return (
+
+ );
+ }
+ return ;
+};
diff --git a/plugins/code-coverage/src/dev/index.tsx b/plugins/code-coverage/src/dev/index.tsx
new file mode 100644
index 0000000000..5c944b097a
--- /dev/null
+++ b/plugins/code-coverage/src/dev/index.tsx
@@ -0,0 +1,28 @@
+/*
+ * Copyright 2020 Spotify AB
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import { createDevApp } from '@backstage/dev-utils';
+import { codeCoveragePlugin } from '../plugin';
+import { codeCoverageApiRef, CodeCoverageRestApi } from '../api';
+
+createDevApp()
+ .registerPlugin(codeCoveragePlugin)
+ .registerApi({
+ api: codeCoverageApiRef,
+ deps: {},
+ factory: () => new CodeCoverageRestApi('http://localhost:3000'),
+ })
+ .render();
diff --git a/plugins/code-coverage/src/index.ts b/plugins/code-coverage/src/index.ts
new file mode 100644
index 0000000000..84010e64ac
--- /dev/null
+++ b/plugins/code-coverage/src/index.ts
@@ -0,0 +1,23 @@
+/*
+ * Copyright 2021 Spotify AB
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+export { codeCoveragePlugin, EntityCodeCoverageContent } from './plugin';
+export {
+ Router,
+ isCodeCoverageAvailable,
+ isCodeCoverageAvailable as isPluginApplicableToEntity,
+} from './components/Router';
+
+// export { createBackendRouter } from './backend/router';
diff --git a/plugins/code-coverage/src/plugin.test.ts b/plugins/code-coverage/src/plugin.test.ts
new file mode 100644
index 0000000000..9a34c66965
--- /dev/null
+++ b/plugins/code-coverage/src/plugin.test.ts
@@ -0,0 +1,22 @@
+/*
+ * Copyright 2021 Spotify AB
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+import { codeCoveragePlugin } from './plugin';
+
+describe('code-coverage', () => {
+ it('should export plugin', () => {
+ expect(codeCoveragePlugin).toBeDefined();
+ });
+});
diff --git a/plugins/code-coverage/src/plugin.ts b/plugins/code-coverage/src/plugin.ts
new file mode 100644
index 0000000000..fa5f31d9cc
--- /dev/null
+++ b/plugins/code-coverage/src/plugin.ts
@@ -0,0 +1,45 @@
+/*
+ * Copyright 2021 Spotify AB
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+import {
+ configApiRef,
+ createApiFactory,
+ createPlugin,
+ createRoutableExtension,
+} from '@backstage/core';
+import { codeCoverageApiRef, CodeCoverageRestApi } from './api';
+
+import { rootRouteRef } from './routes';
+
+export const codeCoveragePlugin = createPlugin({
+ id: 'code-coverage',
+ routes: {
+ root: rootRouteRef,
+ },
+ apis: [
+ createApiFactory({
+ api: codeCoverageApiRef,
+ deps: { configApi: configApiRef },
+ factory: ({ configApi }) => CodeCoverageRestApi.fromConfig(configApi),
+ }),
+ ],
+});
+
+export const EntityCodeCoverageContent = codeCoveragePlugin.provide(
+ createRoutableExtension({
+ component: () => import('./components/Router').then(m => m.Router),
+ mountPoint: rootRouteRef,
+ }),
+);
diff --git a/plugins/code-coverage/src/routes.ts b/plugins/code-coverage/src/routes.ts
new file mode 100644
index 0000000000..9eaf7859f5
--- /dev/null
+++ b/plugins/code-coverage/src/routes.ts
@@ -0,0 +1,20 @@
+/*
+ * Copyright 2021 Spotify AB
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+import { createRouteRef } from '@backstage/core';
+
+export const rootRouteRef = createRouteRef({
+ title: 'code-coverage',
+});
diff --git a/plugins/code-coverage/src/setupTests.ts b/plugins/code-coverage/src/setupTests.ts
new file mode 100644
index 0000000000..0cec5b395d
--- /dev/null
+++ b/plugins/code-coverage/src/setupTests.ts
@@ -0,0 +1,17 @@
+/*
+ * Copyright 2021 Spotify AB
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+import '@testing-library/jest-dom';
+import 'cross-fetch/polyfill';
diff --git a/yarn.lock b/yarn.lock
index a9b95da3ec..baf771b351 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -1623,6 +1623,13 @@
dependencies:
regenerator-runtime "^0.13.4"
+"@babel/runtime@^7.10.3":
+ version "7.13.10"
+ resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.13.10.tgz#47d42a57b6095f4468da440388fdbad8bebf0d7d"
+ integrity sha512-4QPkjJq6Ns3V/RgpEahRk+AGfL0eO6RHHtTWoNNr5mO49G6B5+X6d6THgWEAvTrznU5xYpbAlVKRYcsCgh/Akw==
+ dependencies:
+ regenerator-runtime "^0.13.4"
+
"@babel/template@^7.10.4", "@babel/template@^7.12.13", "@babel/template@^7.3.3":
version "7.12.13"
resolved "https://registry.npmjs.org/@babel/template/-/template-7.12.13.tgz#530265be8a2589dbb37523844c5bcb55947fb327"
@@ -1679,6 +1686,138 @@
lodash "^4.17.19"
to-fast-properties "^2.0.0"
+"@backstage/backend-common@^0.5.4":
+ version "0.5.6"
+ resolved "https://registry.npmjs.org/@backstage/backend-common/-/backend-common-0.5.6.tgz#e49840eaa6738f6697319ccdfff04ce40cc54b72"
+ integrity sha512-BzKlcTZLAVDpH87fi2TCWIFO9DfVdaPIIZ8gZSorCuLLErG4X7CS/zQiujJZ/zD5HGtO2QB57fuRkwjBMhJhhw==
+ dependencies:
+ "@backstage/cli-common" "^0.1.1"
+ "@backstage/config" "^0.1.2"
+ "@backstage/config-loader" "^0.5.1"
+ "@backstage/integration" "^0.5.1"
+ "@octokit/rest" "^18.0.12"
+ "@types/cors" "^2.8.6"
+ "@types/dockerode" "^3.2.1"
+ "@types/express" "^4.17.6"
+ archiver "^5.0.2"
+ compression "^1.7.4"
+ concat-stream "^2.0.0"
+ cors "^2.8.5"
+ cross-fetch "^3.0.6"
+ dockerode "^3.2.1"
+ express "^4.17.1"
+ express-promise-router "^3.0.3"
+ fs-extra "^9.0.1"
+ git-url-parse "^11.4.4"
+ helmet "^4.0.0"
+ isomorphic-git "^1.8.0"
+ knex "^0.95.1"
+ lodash "^4.17.15"
+ logform "^2.1.1"
+ minimatch "^3.0.4"
+ minimist "^1.2.5"
+ morgan "^1.10.0"
+ selfsigned "^1.10.7"
+ stoppable "^1.1.0"
+ tar "^6.0.5"
+ unzipper "^0.10.11"
+ winston "^3.2.1"
+
+"@backstage/config-loader@^0.5.1":
+ version "0.5.1"
+ resolved "https://registry.npmjs.org/@backstage/config-loader/-/config-loader-0.5.1.tgz#a80f2047e209d2f41b17ad715c632ab142385b39"
+ integrity sha512-PmwXERs5BIf77sUIg3Fhp/elkR6ELj0czmpUgP4cuEdtazi0WcmdjCUC2DjgsKJWvYggsL1o372QKHh/M5AMTQ==
+ dependencies:
+ "@backstage/cli-common" "^0.1.1"
+ "@backstage/config" "^0.1.1"
+ ajv "^7.0.3"
+ fs-extra "^9.0.0"
+ json-schema "^0.2.5"
+ json-schema-merge-allof "^0.7.0"
+ typescript-json-schema "^0.47.0"
+ yaml "^1.9.2"
+ yup "^0.29.3"
+
+"@backstage/core@^0.6.2":
+ version "0.6.3"
+ resolved "https://registry.npmjs.org/@backstage/core/-/core-0.6.3.tgz#574ca46ab59e18af07fcf3a248c4428d4dfcc302"
+ integrity sha512-OSpnvotyCkb6fL02T1Z5TLcogRlOzVIH8YBfNlKeo/Xo/JnlVp1uSpQxCWjAW/lzGK5gp6oh3ezFRjm69mTwSA==
+ dependencies:
+ "@backstage/config" "^0.1.3"
+ "@backstage/core-api" "^0.2.11"
+ "@backstage/theme" "^0.2.3"
+ "@material-ui/core" "^4.11.0"
+ "@material-ui/icons" "^4.9.1"
+ "@material-ui/lab" "4.0.0-alpha.45"
+ "@testing-library/react-hooks" "^3.4.2"
+ "@types/dagre" "^0.7.44"
+ "@types/prop-types" "^15.7.3"
+ "@types/react" "^16.9"
+ "@types/react-sparklines" "^1.7.0"
+ "@types/react-text-truncate" "^0.14.0"
+ classnames "^2.2.6"
+ clsx "^1.1.0"
+ d3-selection "^2.0.0"
+ d3-shape "^2.0.0"
+ d3-zoom "^2.0.0"
+ dagre "^0.8.5"
+ immer "^8.0.1"
+ lodash "^4.17.15"
+ material-table "^1.69.1"
+ prop-types "^15.7.2"
+ qs "^6.9.4"
+ rc-progress "^3.0.0"
+ react "^16.12.0"
+ react-dom "^16.12.0"
+ react-helmet "6.1.0"
+ react-hook-form "^6.6.0"
+ react-markdown "^5.0.2"
+ react-router "6.0.0-beta.0"
+ react-router-dom "6.0.0-beta.0"
+ react-sparklines "^1.7.0"
+ react-syntax-highlighter "^13.5.1"
+ react-text-truncate "^0.16.0"
+ react-use "^15.3.3"
+ remark-gfm "^1.0.0"
+ zen-observable "^0.8.15"
+
+"@backstage/plugin-catalog-backend@^0.6.5":
+ version "0.6.7"
+ resolved "https://registry.npmjs.org/@backstage/plugin-catalog-backend/-/plugin-catalog-backend-0.6.7.tgz#97d0ed6db6aeb04e09ed0fee05e76bacf66cc179"
+ integrity sha512-Ey9PXyUjmi8IxQNSXBhF6Sl2SmZ/iXCFHXnffH8XCdBFTZS8HDRE2tSOlIIU4XQKd6lJVuAGTekas2DkaS9/lA==
+ dependencies:
+ "@azure/msal-node" "^1.0.0-beta.3"
+ "@backstage/backend-common" "^0.6.0"
+ "@backstage/catalog-model" "^0.7.4"
+ "@backstage/config" "^0.1.4"
+ "@backstage/errors" "^0.1.1"
+ "@backstage/integration" "^0.5.1"
+ "@backstage/plugin-search-backend-node" "^0.1.2"
+ "@backstage/search-common" "^0.1.1"
+ "@octokit/graphql" "^4.5.8"
+ "@types/express" "^4.17.6"
+ "@types/ldapjs" "^1.0.9"
+ aws-sdk "^2.840.0"
+ codeowners-utils "^1.0.2"
+ core-js "^3.6.5"
+ cross-fetch "^3.0.6"
+ express "^4.17.1"
+ express-promise-router "^4.1.0"
+ fs-extra "^9.0.0"
+ git-url-parse "^11.4.4"
+ glob "^7.1.6"
+ knex "^0.95.1"
+ ldapjs "^2.2.0"
+ lodash "^4.17.15"
+ morgan "^1.10.0"
+ p-limit "^3.0.2"
+ qs "^6.9.4"
+ uuid "^8.0.0"
+ winston "^3.2.1"
+ yaml "^1.9.2"
+ yn "^4.0.0"
+ yup "^0.29.3"
+
"@bcoe/v8-coverage@^0.2.3":
version "0.2.3"
resolved "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39"
@@ -5520,6 +5659,20 @@
lz-string "^1.4.4"
pretty-format "^26.6.2"
+"@testing-library/dom@^7.22.3":
+ version "7.30.3"
+ resolved "https://registry.npmjs.org/@testing-library/dom/-/dom-7.30.3.tgz#779ea9bbb92d63302461800a388a5a890ac22519"
+ integrity sha512-7JhIg2MW6WPwyikH2iL3o7z+FTVgSOd2jqCwTAHqK7Qal2gRRYiUQyURAxtbK9VXm/UTyG9bRihv8C5Tznr2zw==
+ dependencies:
+ "@babel/code-frame" "^7.10.4"
+ "@babel/runtime" "^7.12.5"
+ "@types/aria-query" "^4.2.0"
+ aria-query "^4.2.2"
+ chalk "^4.1.0"
+ dom-accessibility-api "^0.5.4"
+ lz-string "^1.4.4"
+ pretty-format "^26.6.2"
+
"@testing-library/jest-dom@^5.10.1":
version "5.11.9"
resolved "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-5.11.9.tgz#e6b3cd687021f89f261bd53cbe367041fbd3e975"
@@ -5550,6 +5703,14 @@
"@babel/runtime" "^7.5.4"
"@types/testing-library__react-hooks" "^3.4.0"
+"@testing-library/react@^10.4.1":
+ version "10.4.9"
+ resolved "https://registry.npmjs.org/@testing-library/react/-/react-10.4.9.tgz#9faa29c6a1a217bf8bbb96a28bd29d7a847ca150"
+ integrity sha512-pHZKkqUy0tmiD81afs8xfiuseXfU/N7rAX3iKjeZYje86t9VaB0LrxYVa+OOsvkrveX5jCK3IjajVn2MbePvqA==
+ dependencies:
+ "@babel/runtime" "^7.10.3"
+ "@testing-library/dom" "^7.22.3"
+
"@testing-library/react@^11.2.5":
version "11.2.6"
resolved "https://registry.npmjs.org/@testing-library/react/-/react-11.2.6.tgz#586a23adc63615985d85be0c903f374dab19200b"
@@ -5902,6 +6063,14 @@
dependencies:
"@types/express" "*"
+"@types/express-xml-bodyparser@^0.3.2":
+ version "0.3.2"
+ resolved "https://registry.npmjs.org/@types/express-xml-bodyparser/-/express-xml-bodyparser-0.3.2.tgz#8566883271d4a28fc57b471d06e6c08047496acb"
+ integrity sha512-qX01S9eZI/XY48OLI7+5GnofaFG3VyBEn0oIrY5rxkq/T0U2EBpiUfM0scILUluIR6UGBHMM5C2b8Pmir3Xrtw==
+ dependencies:
+ "@types/express" "*"
+ "@types/xml2js" "*"
+
"@types/express@*", "@types/express@4.17.7", "@types/express@^4.17.6", "@types/express@^4.17.7":
version "4.17.7"
resolved "https://registry.npmjs.org/@types/express/-/express-4.17.7.tgz#42045be6475636d9801369cd4418ef65cdb0dd59"
@@ -5968,6 +6137,13 @@
dependencies:
"@types/unist" "*"
+"@types/highlightjs@^10.1.0":
+ version "10.1.0"
+ resolved "https://registry.npmjs.org/@types/highlightjs/-/highlightjs-10.1.0.tgz#bf16135e3c736db053f026a1fa8ff3aa247ef5c1"
+ integrity sha512-xCmqJdhDi4EqrfNDU5ZfZV2ejhszpWBkJS/jYCoAHZhQBBUGnE26l0AzHsZHoe37z4ZETFoZn8HKTIFDjRrfwA==
+ dependencies:
+ highlight.js "^10.1.0"
+
"@types/history@*":
version "4.7.5"
resolved "https://registry.npmjs.org/@types/history/-/history-4.7.5.tgz#527d20ef68571a4af02ed74350164e7a67544860"
@@ -6313,6 +6489,11 @@
resolved "https://registry.npmjs.org/@types/node/-/node-10.17.35.tgz#58058f29b870e6ae57b20e4f6e928f02b7129f56"
integrity sha512-gXx7jAWpMddu0f7a+L+txMplp3FnHl53OhQIF9puXKq3hDGY/GjH+MF04oWnV/adPSCrbtHumDCFwzq2VhltWA==
+"@types/node@^12.0.0":
+ version "12.20.10"
+ resolved "https://registry.npmjs.org/@types/node/-/node-12.20.10.tgz#4dcb8a85a8f1211acafb88d72fafc7e3d2685583"
+ integrity sha512-TxCmnSSppKBBOzYzPR2BR25YlX5Oay8z2XGwFBInuA/Co0V9xJhLlW4kjbxKtgeNo3NOMbQP1A5Rc03y+XecPw==
+
"@types/node@^12.7.1":
version "12.12.58"
resolved "https://registry.npmjs.org/@types/node/-/node-12.12.58.tgz#46dae9b2b9ee5992818c8f7cee01ff4ce03ab44c"
@@ -6901,7 +7082,7 @@
dependencies:
"@types/node" "*"
-"@types/xml2js@^0.4.7":
+"@types/xml2js@*", "@types/xml2js@^0.4.7":
version "0.4.8"
resolved "https://registry.npmjs.org/@types/xml2js/-/xml2js-0.4.8.tgz#84c120c864a5976d0b5cf2f930a75d850fc2b03a"
integrity sha512-EyvT83ezOdec7BhDaEcsklWy7RSIdi6CNe95tmOAK0yx/Lm30C9K75snT3fYayK59ApC2oyW+rcHErdG05FHJA==
@@ -9990,7 +10171,7 @@ compare-versions@^3.6.0:
resolved "https://registry.npmjs.org/compare-versions/-/compare-versions-3.6.0.tgz#1a5689913685e5a87637b8d3ffca75514ec41d62"
integrity sha512-W6Af2Iw1z4CB7q4uU4hv646dW9GQuBM+YpC0UvUCWSD8w90SJjp+ujJuXaEMtAXBtSqGfMPuFOVn4/+FlaqfBA==
-component-emitter@^1.2.1, component-emitter@^1.3.0:
+component-emitter@^1.2.0, component-emitter@^1.2.1, component-emitter@^1.3.0:
version "1.3.0"
resolved "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0"
integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==
@@ -10294,7 +10475,7 @@ cookie@^0.4.1, cookie@~0.4.1:
resolved "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz#afd713fe26ebd21ba95ceb61f9a8116e50a537d1"
integrity sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==
-cookiejar@^2.1.2:
+cookiejar@^2.1.0, cookiejar@^2.1.2:
version "2.1.2"
resolved "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.2.tgz#dd8a235530752f988f9a0844f3fc589e3111125c"
integrity sha512-Mw+adcfzPxcPeI+0WlvRrr/3lGVO0bD75SxX6811cxSh1Wbxx7xZBGK1eVtDf6si8rg2lhnUjsVLMFMfbRIuwA==
@@ -12844,6 +13025,15 @@ expect@^26.6.2:
jest-message-util "^26.6.2"
jest-regex-util "^26.0.0"
+express-promise-router@^3.0.3:
+ version "3.0.3"
+ resolved "https://registry.npmjs.org/express-promise-router/-/express-promise-router-3.0.3.tgz#5e6d22a5a3f013d71833172fe8d7ab780c3f6b70"
+ integrity sha1-Xm0ipaPwE9cYMxcv6NereAw/a3A=
+ dependencies:
+ is-promise "^2.1.0"
+ lodash.flattendeep "^4.0.0"
+ methods "^1.0.0"
+
express-promise-router@^4.1.0:
version "4.1.0"
resolved "https://registry.npmjs.org/express-promise-router/-/express-promise-router-4.1.0.tgz#79160e145c27610ba411bceb0552a36f11dbab4f"
@@ -12867,6 +13057,13 @@ express-session@^1.17.1:
safe-buffer "5.2.0"
uid-safe "~2.1.5"
+express-xml-bodyparser@^0.3.0:
+ version "0.3.0"
+ resolved "https://registry.npmjs.org/express-xml-bodyparser/-/express-xml-bodyparser-0.3.0.tgz#b1f5a98adf6c6e412c4ccba634234b82945c62be"
+ integrity sha1-sfWpit9sbkEsTMumNCNLgpRcYr4=
+ dependencies:
+ xml2js "^0.4.11"
+
express@^4.0.0, express@^4.17.0, express@^4.17.1:
version "4.17.1"
resolved "https://registry.npmjs.org/express/-/express-4.17.1.tgz#4491fc38605cf51f8629d39c2b5d026f98a4c134"
@@ -13434,7 +13631,7 @@ fork-ts-checker-webpack-plugin@4.1.6, fork-ts-checker-webpack-plugin@^4.0.5, for
tapable "^1.0.0"
worker-rpc "^0.1.0"
-form-data@^2.3.2, form-data@^2.5.0:
+form-data@^2.3.1, form-data@^2.3.2, form-data@^2.5.0:
version "2.5.1"
resolved "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz#f2cbec57b5e59e23716e128fe44d4e5dd23895f4"
integrity sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==
@@ -13475,7 +13672,7 @@ format@^0.2.0:
resolved "https://registry.npmjs.org/format/-/format-0.2.2.tgz#d6170107e9efdc4ed30c9dc39016df942b5cb58b"
integrity sha1-1hcBB+nv3E7TDJ3DkBbflCtctYs=
-formidable@^1.2.2:
+formidable@^1.2.0, formidable@^1.2.2:
version "1.2.2"
resolved "https://registry.npmjs.org/formidable/-/formidable-1.2.2.tgz#bf69aea2972982675f00865342b982986f6b8dd9"
integrity sha512-V8gLm+41I/8kguQ4/o1D3RIHRmhYFG4pnNyonvua+40rqcEmT4+V71yaZ3B457xbbgCsCfjSPi65u/W6vK1U5Q==
@@ -14672,6 +14869,11 @@ hex-color-regex@^1.1.0:
resolved "https://registry.npmjs.org/hex-color-regex/-/hex-color-regex-1.1.0.tgz#4c06fccb4602fe2602b3c93df82d7e7dbf1a8a8e"
integrity sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ==
+highlight.js@^10.1.0, highlight.js@^10.6.0:
+ version "10.7.2"
+ resolved "https://registry.npmjs.org/highlight.js/-/highlight.js-10.7.2.tgz#89319b861edc66c48854ed1e6da21ea89f847360"
+ integrity sha512-oFLl873u4usRM9K63j4ME9u3etNF0PLiJhSQ8rdfuL51Wn3zkD6drf9ZW0dOzjnZI22YYG24z30JcmfCZjMgYg==
+
highlight.js@^10.1.1, highlight.js@^10.4.1, highlight.js@~10.4.0:
version "10.4.1"
resolved "https://registry.npmjs.org/highlight.js/-/highlight.js-10.4.1.tgz#d48fbcf4a9971c4361b3f95f302747afe19dbad0"
@@ -15120,6 +15322,11 @@ immer@8.0.1:
resolved "https://registry.npmjs.org/immer/-/immer-8.0.1.tgz#9c73db683e2b3975c424fb0572af5889877ae656"
integrity sha512-aqXhGP7//Gui2+UrEtvxZxSquQVXTpZ7KDxfCcKAF3Vysvw0CViVaW9RZ1j1xlIYqaaaipBoqdqeibkc18PNvA==
+immer@^8.0.1:
+ version "8.0.4"
+ resolved "https://registry.npmjs.org/immer/-/immer-8.0.4.tgz#3a21605a4e2dded852fb2afd208ad50969737b7a"
+ integrity sha512-jMfL18P+/6P6epANRvRk6q8t+3gGhqsJ9EuJ25AXE+9bNTYtssvzeYbEd0mXRYWCmmXSIbnlpz6vd6iJlmGGGQ==
+
immer@^9.0.1:
version "9.0.1"
resolved "https://registry.npmjs.org/immer/-/immer-9.0.1.tgz#1116368e051f9a0fd188c5136b6efb74ed69c57f"
@@ -18336,7 +18543,7 @@ meros@^1.1.2:
resolved "https://registry.npmjs.org/meros/-/meros-1.1.4.tgz#c17994d3133db8b23807f62bec7f0cb276cfd948"
integrity sha512-E9ZXfK9iQfG9s73ars9qvvvbSIkJZF5yOo9j4tcwM5tN8mUKfj/EKN5PzOr3ZH0y5wL7dLAHw3RVEfpQV9Q7VQ==
-methods@^1.0.0, methods@^1.1.2, methods@~1.1.2:
+methods@^1.0.0, methods@^1.1.1, methods@^1.1.2, methods@~1.1.2:
version "1.1.2"
resolved "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee"
integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=
@@ -18449,7 +18656,7 @@ mime-types@^2.0.8, mime-types@^2.1.12, mime-types@^2.1.27, mime-types@~2.1.17, m
dependencies:
mime-db "1.46.0"
-mime@1.6.0, mime@^1.4.0:
+mime@1.6.0, mime@^1.4.0, mime@^1.4.1:
version "1.6.0"
resolved "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1"
integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==
@@ -21585,6 +21792,13 @@ qs@6.7.0:
resolved "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz#41dc1a015e3d581f1621776be31afb2876a9b1bc"
integrity sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==
+qs@^6.5.1:
+ version "6.10.1"
+ resolved "https://registry.npmjs.org/qs/-/qs-6.10.1.tgz#4931482fa8d647a5aab799c5271d2133b981fb6a"
+ integrity sha512-M528Hph6wsSVOBiYUnGf+K/7w0hNshs/duGsNXPUCLH5XAqjEtiPGwNONLV0tBH8NoGb0mvD5JubnUTrujKDTg==
+ dependencies:
+ side-channel "^1.0.4"
+
qs@^6.5.2, qs@^6.6.0, qs@^6.7.0, qs@^6.9.1, qs@^6.9.4, qs@^6.9.6:
version "6.9.6"
resolved "https://registry.npmjs.org/qs/-/qs-6.9.6.tgz#26ed3c8243a431b2924aca84cc90471f35d5a0ee"
@@ -22160,7 +22374,7 @@ react-string-replace@^0.4.1:
dependencies:
lodash "^4.17.4"
-react-syntax-highlighter@^13.5.0:
+react-syntax-highlighter@^13.5.0, react-syntax-highlighter@^13.5.1:
version "13.5.3"
resolved "https://registry.npmjs.org/react-syntax-highlighter/-/react-syntax-highlighter-13.5.3.tgz#9712850f883a3e19eb858cf93fad7bb357eea9c6"
integrity sha512-crPaF+QGPeHNIblxxCdf2Lg936NAHKhNhuMzRL3F9ct6aYXL3NcZtCL0Rms9+qVo6Y1EQLdXGypBNSbPL/r+qg==
@@ -22454,7 +22668,7 @@ read@1, read@~1.0.1:
dependencies:
mute-stream "~0.0.4"
-"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.5, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@^2.3.6, readable-stream@~2.3.6:
+"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.5, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@^2.3.5, readable-stream@^2.3.6, readable-stream@~2.3.6:
version "2.3.7"
resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57"
integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==
@@ -23634,6 +23848,15 @@ side-channel@^1.0.2:
es-abstract "^1.17.0-next.1"
object-inspect "^1.7.0"
+side-channel@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf"
+ integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==
+ dependencies:
+ call-bind "^1.0.0"
+ get-intrinsic "^1.0.2"
+ object-inspect "^1.9.0"
+
sigmund@~1.0.0:
version "1.0.1"
resolved "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz#3ff21f198cad2175f9f3b781853fd94d0d19b590"
@@ -24588,6 +24811,22 @@ sucrase@^3.17.1:
pirates "^4.0.1"
ts-interface-checker "^0.1.9"
+superagent@^3.8.3:
+ version "3.8.3"
+ resolved "https://registry.npmjs.org/superagent/-/superagent-3.8.3.tgz#460ea0dbdb7d5b11bc4f78deba565f86a178e128"
+ integrity sha512-GLQtLMCoEIK4eDv6OGtkOoSMt3D+oq0y3dsxMuYuDvaNUvuT8eFBuLmfR0iYYzHC1e8hpzC6ZsxbuP6DIalMFA==
+ dependencies:
+ component-emitter "^1.2.0"
+ cookiejar "^2.1.0"
+ debug "^3.1.0"
+ extend "^3.0.0"
+ form-data "^2.3.1"
+ formidable "^1.2.0"
+ methods "^1.1.1"
+ mime "^1.4.1"
+ qs "^6.5.1"
+ readable-stream "^2.3.5"
+
superagent@^6.1.0:
version "6.1.0"
resolved "https://registry.npmjs.org/superagent/-/superagent-6.1.0.tgz#09f08807bc41108ef164cfb4be293cebd480f4a6"
@@ -24605,6 +24844,14 @@ superagent@^6.1.0:
readable-stream "^3.6.0"
semver "^7.3.2"
+supertest@^4.0.2:
+ version "4.0.2"
+ resolved "https://registry.npmjs.org/supertest/-/supertest-4.0.2.tgz#c2234dbdd6dc79b6f15b99c8d6577b90e4ce3f36"
+ integrity sha512-1BAbvrOZsGA3YTCWqbmh14L0YEq0EGICX/nBnfkfVJn7SrxQV1I3pMYjSzG9y/7ZU2V9dWqyqk2POwxlb09duQ==
+ dependencies:
+ methods "^1.1.2"
+ superagent "^3.8.3"
+
supertest@^6.1.3:
version "6.1.3"
resolved "https://registry.npmjs.org/supertest/-/supertest-6.1.3.tgz#3f49ea964514c206c334073e8dc4e70519c7403f"
@@ -25586,6 +25833,17 @@ typedarray@^0.0.6:
resolved "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777"
integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=
+typescript-json-schema@^0.47.0:
+ version "0.47.0"
+ resolved "https://registry.npmjs.org/typescript-json-schema/-/typescript-json-schema-0.47.0.tgz#84dde5460b127c6774da81bf70b23c7e04857b13"
+ integrity sha512-A6NVwSOTSsNDHfaqDcDeKwwyXEeKqBHoAr20jcetnYj4e8C6zVFofAVhAuwsBXCRYiWEE/lyHrcxpsSpbIk0Mg==
+ dependencies:
+ "@types/json-schema" "^7.0.6"
+ glob "^7.1.6"
+ json-stable-stringify "^1.0.1"
+ typescript "^4.1.3"
+ yargs "^16.2.0"
+
typescript-json-schema@^0.49.0:
version "0.49.0"
resolved "https://registry.npmjs.org/typescript-json-schema/-/typescript-json-schema-0.49.0.tgz#442f6347ca85fb0d9811f217fb0d6537b68734b3"
@@ -26095,7 +26353,7 @@ uuid@^7.0.3:
resolved "https://registry.npmjs.org/uuid/-/uuid-7.0.3.tgz#c5c9f2c8cf25dc0a372c4df1441c41f5bd0c680b"
integrity sha512-DPSke0pXhTZgoF/d+WSt2QaKMCFSfx7QegxEWT+JOuHF5aWrKEn0G+ztjuJg/gG8/ItK+rbPCD/yNv8yyih6Cg==
-uuid@^8.0.0, uuid@^8.2.0, uuid@^8.3.0:
+uuid@^8.0.0, uuid@^8.2.0, uuid@^8.3.0, uuid@^8.3.2:
version "8.3.2"
resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2"
integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==
@@ -26833,7 +27091,7 @@ xml2js@0.4.19:
sax ">=0.6.0"
xmlbuilder "~9.0.1"
-xml2js@^0.4.19, xml2js@^0.4.23:
+xml2js@^0.4.11, xml2js@^0.4.19, xml2js@^0.4.23:
version "0.4.23"
resolved "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz#a0c69516752421eb2ac758ee4d4ccf58843eac66"
integrity sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==