diff --git a/.npmignore b/.npmignore index 9bb73e6b4f43..848069d39993 100644 --- a/.npmignore +++ b/.npmignore @@ -17,6 +17,7 @@ server/node_modules/ /content/files/en-us/ /deployer +/traits kumascript/tests testing/ import/ diff --git a/build/index.js b/build/index.js index 9835ff3c8bac..22585cf0325a 100644 --- a/build/index.js +++ b/build/index.js @@ -12,6 +12,7 @@ const { execGit, } = require("../content"); const kumascript = require("../kumascript"); +const { normalizeMacroName } = require("../kumascript/src/render.js"); const { FLAW_LEVELS } = require("./constants"); const { @@ -668,10 +669,129 @@ function renderContributorsTxt(wikiContributorNames = null, githubURL = null) { return txt; } +function* fastKSParser(s, includeArgs = false) { + for (const match of s.matchAll( + /\{\{\s*(\w+[\w-.]*\w+)\s*(\((.*?)\)|)\s*\}\}/gms + )) { + const { index } = match; + if (s.charAt(index - 1) === "\\") { + continue; + } + + const split = (match[3] || "").trim().split(","); + const found = { name: match[1] }; + if (includeArgs) { + found.args = split + .map((s) => s.trim()) + .map((s) => { + if (s.startsWith('"') && s.endsWith('"')) { + return s.slice(1, -1); + } + if (s.startsWith("'") && s.endsWith("'")) { + return s.slice(1, -1); + } + return s; + }) + .filter((s, i) => { + if (!s) { + // Only return false if it's NOT first + if (i === 0) { + return Boolean(s); + } + } + return true; + }); + } + yield found; + } +} + +async function analyzeDocument(document) { + const { metadata } = document; + + const doc = { + ...metadata, + contributors: metadata.contributors ? metadata.contributors.length : 0, + isArchive: !!document.isArchive, + isTranslated: !!document.isTranslated, + }; + + doc.normalizedMacrosCount = {}; + for (const token of fastKSParser(document.rawBody)) { + const normalizedMacroName = normalizeMacroName(token.name); + if (!(normalizedMacroName in doc.normalizedMacrosCount)) { + doc.normalizedMacrosCount[normalizedMacroName] = 0; + } + doc.normalizedMacrosCount[normalizedMacroName]++; + } + doc.tags = document.metadata.tags || []; + + doc.fileSize = fs.statSync(document.fileInfo.path).size; + doc.wordCount = document.rawBody + .replace(/(<([^>]+)>)/g, "") + .split(/\s+/).length; + const $ = cheerio.load(document.rawBody); + const imageCounts = countImages($); + doc.images = imageCounts.total; + doc.externalImages = imageCounts.external; + doc.internalImages = imageCounts.internal; + doc.h2s = $("h2").length; + doc.h3s = $("h3").length; + doc.pres = $("pre").length; + doc.title = metadata.title; + doc.mdn_url = document.url; + doc.depth = document.url.split("/").length - 3; + + // If the document has a `.popularity` make sure don't bother with too + // many significant figures on it. + doc.popularity = metadata.popularity + ? Number(metadata.popularity.toFixed(4)) + : 0.0; + + doc.modified = metadata.modified || null; + + const otherTranslations = document.translations || []; + if (!otherTranslations.length && metadata.translation_of) { + // If built just-in-time, we won't have a record of all the other translations + // available. But if the current document has a translation_of, we can + // at least use that. + otherTranslations.push({ locale: "en-US", slug: metadata.translation_of }); + } + + if (otherTranslations.length) { + doc.other_translations = otherTranslations; + } + + return doc; +} + +function countImages($) { + const counts = { + external: 0, + internal: 0, + total: 0, + }; + $("img[src]").each((i, img) => { + const src = $(img).attr("src"); + if ( + src.includes("://") || + src.startsWith("/@api/") || + src.startsWith("/files") + ) { + counts.external++; + } else { + counts.internal++; + } + }); + counts.total = counts.external + counts.internal; + return counts; +} + module.exports = { FLAW_LEVELS, buildDocument, + analyzeDocument, buildLiveSamplePageFromURL, renderContributorsTxt, diff --git a/client/pwa/src/unpack-cache.ts b/client/pwa/src/unpack-cache.ts index fde87fd0a89e..f69ac378e65c 100644 --- a/client/pwa/src/unpack-cache.ts +++ b/client/pwa/src/unpack-cache.ts @@ -1,7 +1,6 @@ /* eslint no-restricted-globals: ["off", "self"] */ import * as zip from "@zip.js/zip.js"; import { openContentCache } from "./caches"; -import { INTERACTIVE_EXAMPLES_URL } from "./service-worker"; zip.configure({ useWebWorkers: false, diff --git a/client/src/app.tsx b/client/src/app.tsx index fc8cced09934..676ed54f3533 100644 --- a/client/src/app.tsx +++ b/client/src/app.tsx @@ -25,6 +25,7 @@ import { ContributorSpotlight } from "./contributor-spotlight"; import { Banner, hasActiveBanners } from "./banners"; const AllFlaws = React.lazy(() => import("./flaws")); +const AllTraits = React.lazy(() => import("./traits")); const Translations = React.lazy(() => import("./translations")); const DocumentEdit = React.lazy(() => import("./document/forms/edit")); const DocumentCreate = React.lazy(() => import("./document/forms/create")); @@ -167,6 +168,14 @@ export function App(appProps) { } /> + + + + } + /> ( + null + ); + const [endLoadingTime, setEndLoadingTime] = React.useState(null); + React.useEffect(() => { + document.title = "All Documents Traits"; + }, []); + + const { data, error, isValidating } = useSWR( + "/_traits", + async (url) => { + let response; + try { + response = await fetch(url); + } catch (ex) { + throw ex; + } + if (!response.ok) { + throw new Error(`${response.status} on ${url}`); + } + if (!response.headers.get("content-type").includes("application/json")) { + throw new Error( + `Response is not JSON (${response.headers.get("content-type")})` + ); + } + // Always return a promise! + return response.json(); + }, + { + revalidateOnFocus: false, + } + ); + + React.useEffect(() => { + if (!data && !error) { + setStartLoadingTime(new Date()); + } else { + setEndLoadingTime(new Date()); + } + }, [data, error]); + + return ( + +
+

All Documents Traits

+ {data && ( +

+ {data.metadata.count.toLocaleString()} documents loaded.{" "} + {startLoadingTime && endLoadingTime && ( + + )}{" "} + +

+ )} + {data && } + {error && ( +

+ Error loading data: {error.toString()} +

+ )} + + {!data && !error && startLoadingTime ? ( + + ) : null} +
+
+ ); +} + +function Took({ milliseconds }: { milliseconds: number }) { + const seconds = milliseconds / 1000; + return Took {seconds.toFixed(1)} seconds to load.; +} + +function Loading({ startLoadingTime }: { startLoadingTime: Date }) { + const [estimateEndTime, setEstimateEndTime] = React.useState( + // 15 seconds + new Date(startLoadingTime.getTime() + 1000 * 15) + ); + React.useEffect(() => { + if (localStorage.getItem(LOCALSTORAGE_KEY)) { + setEstimateEndTime( + new Date( + new Date().getTime() + + parseInt(localStorage.getItem(LOCALSTORAGE_KEY) as string) + ) + ); + } + + return () => { + // Store this for the next time for better estimates + const aliveTime = new Date().getTime() - startLoadingTime.getTime(); + // If the time it took was tiny it was because it was cached. + if (aliveTime > 1000) { + localStorage.setItem(LOCALSTORAGE_KEY, `${aliveTime}`); + } + }; + }, [startLoadingTime]); + + const INTERVAL_INCREMENT = 700; + const LOCALSTORAGE_KEY = "alltraits-loading-took"; + const [elapsed, setElapsed] = React.useState(0); + React.useEffect(() => { + const interval = setInterval(() => { + setElapsed((state) => state + INTERVAL_INCREMENT); + }, INTERVAL_INCREMENT); + return () => clearInterval(interval); + }, []); + + const distance = estimateEndTime.getTime() - startLoadingTime.getTime(); + const percent = (100 * elapsed) / distance; + return ( +
+ + {percent}% + +
+ + Estimated time to finish: {((distance - elapsed) / 1000).toFixed(0)}s{" "} + {elapsed > distance ? 🙃 : null} + +
+ ); +} + +function DisplayData({ data }: { data: Data }) { + return ( +
+ + } + /> + } /> + +
+ ); +} + +function SubNav() { + return ( +
+ + Searchable Database + +
+ ); +} diff --git a/client/src/traits/sql-table.scss b/client/src/traits/sql-table.scss new file mode 100644 index 000000000000..215775aaace4 --- /dev/null +++ b/client/src/traits/sql-table.scss @@ -0,0 +1,80 @@ +.sql-table { + padding-bottom: 50px; + + div.help { + pre { + margin-bottom: 4px; + } + div button { + margin-bottom: 25px; + } + } + + form.query { + .query-buttons { + margin-top: 10px; + } + textarea { + font-family: monospace; + background-color: green; + width: 99%; + border: 1px solid black; + } + textarea.has-sql-error { + border: 1px solid rgb(255, 148, 148); + } + .sql-error { + background-color: rgb(255, 148, 148); + border-radius: 2px; + margin-bottom: 10px; + } + } + + .query-statement-warnings { + background-color: rgb(255, 226, 226); + p { + margin-bottom: 0; + } + ul { + margin: 2px; + } + } + .share-url { + a { + font-size: 80%; + font-family: monospace; + line-height: 1.5; + } + } + .query-error { + background-color: rgb(255, 148, 148); + } + .too-many-to-display { + background-color: rgb(232, 147, 116); + padding: 10px 20px; + p { + margin: 0; + text-align: center; + font-weight: bold; + } + } + + .no-results { + margin: 40px; + } + .results { + margin-top: 10px; + margin-bottom: 40px; + + .results-count { + font-size: 120%; + } + } + + table { + thead th { + font-weight: bold; + padding-right: 5px; + } + } +} diff --git a/client/src/traits/sql-table.tsx b/client/src/traits/sql-table.tsx new file mode 100644 index 000000000000..55f34951c37a --- /dev/null +++ b/client/src/traits/sql-table.tsx @@ -0,0 +1,559 @@ +import React, { useEffect, useState } from "react"; +import { Link, useSearchParams } from "react-router-dom"; +import { useDebounce } from "use-debounce"; +import Editor from "react-simple-code-editor"; +import { highlight, languages } from "prismjs/components/prism-core"; +import "prismjs/components/prism-sql"; + +// Necessary hack due to https://github.com/agershun/alasql/issues/930 +// import alasql from "alasql"; +import alasql from "../../../node_modules/alasql/dist/alasql.min.js"; + +import { Document, PastQuery } from "./types"; +import "./sql-table.scss"; + +// These are temporary things because you can't currently import types from +// alasql. See above hack and link to issue +type FauxAlaSQLStatementColumn = { + columnid: string; + as?: string; +}; +type FauxAlaSQLStatementFrom = { + tableid: string; + as?: string; +}; +type FauxAlaSQLStatement = { + columns: FauxAlaSQLStatementColumn[]; + from: FauxAlaSQLStatementFrom[]; + order?: any[]; + limit?: any[]; +}; + +const DEFAULT_QUERY = "SELECT title FROM ? ORDER BY popularity DESC LIMIT 10"; +const ADVANCED_QUERIES: string[] = []; +ADVANCED_QUERIES.push(`SELECT mdn_url, normalizedMacrosCount -> jsxref, popularity +FROM ? +WHERE normalizedMacrosCount -> jsxref > 5 +ORDER BY popularity desc +LIMIT 25`); +ADVANCED_QUERIES.push(`SELECT title->length AS len, title, mdn_url +FROM ? +ORDER BY len DESC +LIMIT 100`); +ADVANCED_QUERIES.push(`SELECT mdn_url, title, wordCount, fileSize +FROM ? +WHERE mdn_url like '%/Web/http%' +ORDER BY fileSize desc +LIMIT 25`); +ADVANCED_QUERIES.push(`SELECT mdn_url, tags +FROM ? +WHERE "Experimental" in tags +ORDER BY popularity DESC LIMIT 10`); +ADVANCED_QUERIES.push(`SELECT mdn_url, tags +FROM ? +WHERE "Experimental" in tags +ORDER BY popularity DESC LIMIT 10`); + +function storageDump(key: string, value: any, session = false) { + const storage = session ? window.sessionStorage : window.localStorage; + storage.setItem(key, JSON.stringify(value)); +} + +function storageLoad(key: string, fallback: T, session = false): T { + const storage = session ? window.sessionStorage : window.localStorage; + const past = storage.getItem(key); + if (past) { + return JSON.parse(past) as T; + } + return fallback; +} + +export function SQLTable({ documents }: { documents: Document[] }) { + const [query, setQuery] = useState(""); + const [searchParams, setSearchParams] = useSearchParams(); + const [queryDraft, setQueryDraft] = useState( + searchParams.get("query") || storageLoad("query", DEFAULT_QUERY, true) + ); + const [pastQueries, setPastQueries] = useState( + storageLoad("past-queries", []) + ); + const [result, setResult] = useState(null); + const [queryError, setQueryError] = useState(null); + const [showHelp, setShowHelp] = useState(false); + const [showPastQueries, setShowPastQueries] = useState(false); + const [showSQLParserError, setShowSQLParserError] = useState(false); + + const [sqlParserError, setSQLParserError] = useState(null); + + const [queryDraftDebounced] = useDebounce(queryDraft, 1000); + + useEffect(() => { + setShowHelp(false); + setShowSQLParserError(false); + setShowPastQueries(false); + }, [query]); + + useEffect(() => { + storageDump("past-queries", pastQueries); + }, [pastQueries]); + useEffect(() => { + storageDump("query", queryDraftDebounced, true); + }, [queryDraftDebounced]); + + useEffect(() => { + if (searchParams.get("query")) { + // If it's been edited since, it doesn't make sense to keep it there + if (queryDraftDebounced !== searchParams.get("query")) { + setSearchParams({}); + } + } + }, [queryDraftDebounced, searchParams, setSearchParams]); + + useEffect(() => { + if (query) { + try { + const res = alasql(query, [documents]); + setResult(res); + setPastQueries((state: PastQuery[]) => + [ + { query, results: res.length }, + ...state.filter((q) => q.query !== query), + ].slice(0, 50) + ); + setQueryError(null); + } catch (error: any) { + setQueryError(error); + } + } else { + setResult(null); + } + }, [query, documents]); + + const [parsedStatement, setParsedStatement] = + useState(null); + + useEffect(() => { + if (queryDraftDebounced) { + try { + const parsed = alasql.parse(queryDraftDebounced); + setParsedStatement(parsed.statements[0]); + setSQLParserError(null); + } catch (err: any) { + setSQLParserError(err); + } + } + }, [queryDraftDebounced]); + + const [statementWarnings, setStatementWarnings] = useState([]); + useEffect(() => { + const newWarnings: string[] = []; + if (parsedStatement !== null) { + const document = documents[0]; + const knownKeysLC = Object.keys(document).map((x) => x.toLowerCase()); + for (const column of parsedStatement.columns) { + if ( + column.columnid && + !knownKeysLC.includes(column.columnid.toLowerCase()) + ) { + newWarnings.push( + `Column '${column.columnid}' is probably not in any document.` + ); + } + } + if (!parsedStatement.from) { + newWarnings.push(`Missing the 'FROM ?' part of the query.`); + } else { + if ( + !parsedStatement.from.find( + (table) => table.as && table.as === "default" + ) + ) { + newWarnings.push(`Probably the 'FROM ?' part of the query.`); + } + } + } + setStatementWarnings(newWarnings); + }, [parsedStatement, documents]); + + return ( +
+
{ + event.preventDefault(); + setQuery(queryDraft.trim()); + }} + > + {/* */} + setQueryDraft(code)} + highlight={(code) => highlight(code, languages.sql)} + textareaClassName={sqlParserError ? "has-sql-error" : ""} + padding={10} + style={{ + fontFamily: '"Fira code", "Fira Mono", monospace', + backgroundColor: "#efefef", + }} + /> + {!sqlParserError && !!statementWarnings.length && ( +
+

Warnings

+
    + {statementWarnings.map((warning) => { + return ( +
  • + {warning} +
  • + ); + })} +
+
+ )} +
+ {showSQLParserError && sqlParserError && ( +
+
{sqlParserError.toString()}
+
+ )} + {queryError && ( +
+

Query error

+ {queryError.toString()} +
+ )} + + + + +
+ + + {showHelp && ( + { + setQueryDraft(q); + const formElement = document.querySelector("form.query"); + if (formElement) { + formElement.scrollIntoView({ behavior: "smooth" }); + } + setShowHelp(false); + }} + /> + )} + {showPastQueries && ( + { + setQueryDraft(q); + const formElement = document.querySelector("form.query"); + if (formElement) { + formElement.scrollIntoView({ behavior: "smooth" }); + } + setShowPastQueries(false); + }} + resetPastQueries={() => { + setPastQueries([]); + setShowPastQueries(false); + }} + /> + )} + + {result && } +
+ ); +} + +function ShowHelp({ + document, + loadQuery, +}: { + document: Document; + loadQuery: (s: string) => void; +}) { + console.log(document); + + return ( +
+

List of keys you can select from

+
    + {Object.keys(document).map((key) => ( +
  • + {key} +
  • + ))} +
+

Sample queries

+
+
+          
+        
+ +
+ {ADVANCED_QUERIES.map((query) => { + return ( +
+
+              
+            
+ +
+ ); + })} + +

+ Whatever alasql does +

+

+ The SQL parser is based on{" "} + + AlaSQL + + . See its documentation for how to make queries. For example{" "} + + Data manipulation Q&A + {" "} + and{" "} + + Search in JSON arrays and objects + +

+
+ ); +} + +function ShowPastQueries({ + queries, + loadQuery, + resetPastQueries, +}: { + queries: any[]; + loadQuery: (s: string) => void; + resetPastQueries: () => void; +}) { + return ( +
+

Past queries

+ + + + + + + + + + + {queries.map((query) => ( + + + + + + + ))} + +
ResultsQuery
{query.results.toLocaleString()} +
+                  
+                
+
+ +
+
+ ); +} + +const Results = React.memo(({ rows }: { rows: any[] }) => { + function triggerJSONDownload() { + const blob = new Blob([JSON.stringify(rows, undefined, 2)], { + type: "application/json", + }); + // create hidden link, just force a click on it and then remove it from the DOM. + const element = document.createElement("a"); + document.body.appendChild(element); + element.setAttribute("href", window.URL.createObjectURL(blob)); + element.setAttribute("download", "results.json"); + element.style.display = "none"; + element.click(); + document.body.removeChild(element); + } + + if (!rows.length) { + return ( +

+ Nothing found. +

+ ); + } + + const keys = Object.keys(rows[0]); + + const MAX_ROWS = 1000; + + return ( +
+

+ + {rows.length.toLocaleString()} results. + {" "} + +

+ + + + + {keys.map((key) => ( + + ))} + + + + {rows.slice(0, MAX_ROWS).map((row, i) => { + const key = row.mdn_url || `${row[keys[0]]}:${i}`; + return ( + + + {keys.map((key) => { + const value = row[key]; + + return ( + + ); + })} + + ); + })} + +
#{key}
{i + 1} + {key === "mdn_url" && value ? ( + + {value} + + ) : typeof value === "object" ? ( + JSON.stringify(value) + ) : typeof value === "number" ? ( + value.toLocaleString() + ) : ( + value + )} +
+ {rows.length > MAX_ROWS && ( +
+

+ Only displaying the first {MAX_ROWS.toLocaleString()} rows in the + table. +

+
+ )} +
+ ); +}); diff --git a/client/src/traits/types.tsx b/client/src/traits/types.tsx new file mode 100644 index 000000000000..d7965baece79 --- /dev/null +++ b/client/src/traits/types.tsx @@ -0,0 +1,34 @@ +export interface Document { + mdn_url: string; + modified: string; + title: string; + popularity: number; + flaws: { + [key: string]: string[]; + }; + normalizedMacrosCount: { + [key: string]: number; + }; +} + +export interface MacroInfo { + sourceName: string; + normalizedName: string; + totalCount: number; +} + +type Metadata = { + tookSeconds: number; + count: number; +}; + +export interface Data { + documents: Document[]; + metadata: Metadata; + allMacros: MacroInfo[]; +} + +export interface PastQuery { + query: string; + results: number; +} diff --git a/client/src/writers-homepage/index.tsx b/client/src/writers-homepage/index.tsx index 1e0bb1a19b3e..19ccd2fc5c79 100644 --- a/client/src/writers-homepage/index.tsx +++ b/client/src/writers-homepage/index.tsx @@ -103,6 +103,9 @@ export default function WritersHomepage() {
  • Flaws Dashboard
  • +
  • + All Documents Traits +
  • diff --git a/package.json b/package.json index 6fa80773dbf0..2e58c00eaa30 100644 --- a/package.json +++ b/package.json @@ -35,7 +35,7 @@ "test:prepare": "yarn prepare-build && yarn build && yarn start:static-server", "test:testing": "jest --rootDir testing", "tool": "node tool/cli.js", - "watch:ssr": "cd ssr && webpack --mode=production --watch" + "traits:build": "cd traits && node cli.js" }, "jest": { "globals": { @@ -137,6 +137,7 @@ "@types/react": "^17.0.43", "@types/react-dom": "^17.0.14", "@types/react-modal": "^3.13.1", + "alasql": "1.7.3", "benchmark": "2.1.4", "braces": "^3.0.2", "cross-env": "^7.0.3", @@ -168,6 +169,7 @@ "react-router": "6.2.2", "react-router-dom": "6.0.0-beta.2", "react-scripts": "4.0.3", + "react-simple-code-editor": "0.11.0", "rehype-minify-whitespace": "^4.0.5", "remark-prettier": "^1.3.0", "rough-notation": "0.5.1", diff --git a/server/index.js b/server/index.js index 8610870f7b67..d591a6e1e1f7 100644 --- a/server/index.js +++ b/server/index.js @@ -33,6 +33,7 @@ const { OFFLINE_CONTENT, } = require("./constants"); const documentRouter = require("./document"); +const documentTraitsRouter = require("./traits"); const fakeV1APIRouter = require("./fake-v1-api"); const { searchIndexRoute } = require("./search-index"); const flawsRoute = require("./flaws"); @@ -126,6 +127,8 @@ app.post( app.use("/_document", documentRouter); +app.use("/_traits", documentTraitsRouter); + app.get("/_open", (req, res) => { const { line, column, filepath, url } = req.query; // Sometimes that 'filepath' query string parameter is a full absolute diff --git a/server/traits.js b/server/traits.js new file mode 100644 index 000000000000..bd9ae2e2b848 --- /dev/null +++ b/server/traits.js @@ -0,0 +1,61 @@ +const fs = require("fs"); +const path = require("path"); + +const express = require("express"); + +const { Document } = require("../content"); +const { analyzeDocument } = require("../build"); + +const MACROS_ROOT = path.join(__dirname, "..", "kumascript", "macros"); +console.assert(fs.existsSync(MACROS_ROOT), `${MACROS_ROOT} does not exist`); + +const router = express(); + +let _cachedAnalyzedDocuments = null; + +router.get("/", async (req, res) => { + const metadata = {}; + const t0 = new Date(); + try { + console.time("analyzeDocuments"); + const documents = _cachedAnalyzedDocuments + ? _cachedAnalyzedDocuments + : await analyzeDocuments(); + console.timeEnd("analyzeDocuments"); + _cachedAnalyzedDocuments = documents; + const t1 = new Date(); + metadata.tookSeconds = (t1 - t0) / 1000; + metadata.count = documents.length; + res.json({ + documents, + metadata, + fromCache: !!_cachedAnalyzedDocuments, + }); + } catch (error) { + console.error(error); + res.status(500).send(error.toString()); + } +}); + +async function analyzeDocuments() { + const documents = Document.findAll(); + if (!documents.count) { + throw new Error("No documents to build found"); + } + + const docs = []; + for (const document of documents.iter()) { + document.noIndexing = + (document.isArchive && !document.isTranslated) || + document.metadata.slug === "MDN/Kitchensink"; + if (document.noIndexing) { + continue; + } + + docs.push(await analyzeDocument(document)); + } + + return docs; +} + +module.exports = router; diff --git a/yarn.lock b/yarn.lock index 4702ee7dc5f7..678f3b4eb18c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2904,6 +2904,14 @@ adjust-sourcemap-loader@3.0.0: loader-utils "^2.0.0" regex-parser "^2.2.11" +adler-32@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/adler-32/-/adler-32-1.2.0.tgz#6a3e6bf0a63900ba15652808cb15c6813d1a5f25" + integrity sha1-aj5r8KY5ALoVZSgIyxXGgT0aXyU= + dependencies: + exit-on-epipe "~1.0.1" + printj "~1.1.0" + agent-base@6, agent-base@^6.0.2: version "6.0.2" resolved "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz" @@ -2943,7 +2951,7 @@ ajv-keywords@^5.0.0: dependencies: fast-deep-equal "^3.1.3" -ajv@^6.1.0, ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.4, ajv@^6.12.5: +ajv@^6.1.0, ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.3, ajv@^6.12.4, ajv@^6.12.5: version "6.12.6" resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz" integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== @@ -2963,6 +2971,18 @@ ajv@^8.0.0, ajv@^8.0.1, ajv@^8.8.0: require-from-string "^2.0.2" uri-js "^4.2.2" +alasql@1.7.3: + version "1.7.3" + resolved "https://registry.yarnpkg.com/alasql/-/alasql-1.7.3.tgz#ef9909e345b4ac8d5f00e7e6b772c7e419b41db4" + integrity sha512-YaMgHfoR4f7n05NXFVgD+WgmlNKlP4BGZpXSkJCYtniioK7DMJUoN6ZZmUpM0LAavPLXxHM+V+4gM+M/82sIoQ== + dependencies: + dom-storage "^2.1.0" + es6-promise "^4.2.6" + lodash "4.17.21" + request "2.88.2" + xlsx "0.17.0" + yargs "16.2.0" + alphanum-sort@^1.0.0: version "1.0.2" resolved "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz" @@ -3227,6 +3247,18 @@ asn1.js@^4.0.0: inherits "^2.0.1" minimalistic-assert "^1.0.0" +asn1@~0.2.3: + version "0.2.4" + resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.4.tgz#8d2475dfab553bb33e77b54e59e880bb8ce23136" + integrity sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg== + dependencies: + safer-buffer "~2.1.0" + +assert-plus@1.0.0, assert-plus@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" + integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU= + assert@^1.1.1: version "1.5.0" resolved "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz" @@ -3305,6 +3337,16 @@ autoprefixer@^9.6.1, autoprefixer@^9.8.6: postcss "^7.0.32" postcss-value-parser "^4.1.0" +aws-sign2@~0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" + integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg= + +aws4@^1.8.0: + version "1.11.0" + resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.11.0.tgz#d61f46d83b2519250e2784daf5b09479a8b41c59" + integrity sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA== + axe-core@^4.0.2: version "4.1.3" resolved "https://registry.npmjs.org/axe-core/-/axe-core-4.1.3.tgz" @@ -3529,6 +3571,13 @@ batch@0.6.1: resolved "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz" integrity sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY= +bcrypt-pbkdf@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" + integrity sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4= + dependencies: + tweetnacl "^0.14.3" + benchmark@2.1.4: version "2.1.4" resolved "https://registry.npmjs.org/benchmark/-/benchmark-2.1.4.tgz" @@ -4111,6 +4160,11 @@ case-sensitive-paths-webpack-plugin@2.3.0: resolved "https://registry.npmjs.org/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.3.0.tgz" integrity sha512-/4YgnZS8y1UXXmC02xD5rRrBEu6T5ub+mQHLNRj0fzTRbgdBYhsNo2V5EqwgqrExjxsjtF/OpAKAMkKsxbD5XQ== +caseless@~0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" + integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= + caw@^2.0.0, caw@^2.0.1: version "2.0.1" resolved "https://registry.npmjs.org/caw/-/caw-2.0.1.tgz" @@ -4126,6 +4180,15 @@ ccount@^1.0.0: resolved "https://registry.npmjs.org/ccount/-/ccount-1.0.5.tgz" integrity sha512-MOli1W+nfbPLlKEhInaxhRdp7KVLFxLN5ykwzHgLsLI3H3gs5jjFAK4Eoj3OzzcxCtumDaI8onoVDeQyWaNTkw== +cfb@^1.1.4: + version "1.2.0" + resolved "https://registry.yarnpkg.com/cfb/-/cfb-1.2.0.tgz#6a4d0872b525ed60349e1ef51fb4b0bf73eca9a8" + integrity sha512-sXMvHsKCICVR3Naq+J556K+ExBo9n50iKl6LGarlnvuA2035uMlGA/qVrc0wQtow5P1vJEw9UyrKLCbtIKz+TQ== + dependencies: + adler-32 "~1.2.0" + crc-32 "~1.2.0" + printj "~1.1.2" + chalk@2.4.2, chalk@^2.0.0, chalk@^2.4.1, chalk@^2.4.2: version "2.4.2" resolved "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz" @@ -4467,6 +4530,14 @@ coa@^2.0.2: chalk "^2.4.1" q "^1.1.2" +codepage@~1.14.0: + version "1.14.0" + resolved "https://registry.yarnpkg.com/codepage/-/codepage-1.14.0.tgz#8cbe25481323559d7d307571b0fff91e7a1d2f99" + integrity sha1-jL4lSBMjVZ19MHVxsP/5HnodL5k= + dependencies: + commander "~2.14.1" + exit-on-epipe "~1.0.1" + collect-v8-coverage@^1.0.0: version "1.0.1" resolved "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz" @@ -4556,7 +4627,7 @@ colorspace@1.1.x: color "3.0.x" text-hex "1.0.x" -combined-stream@^1.0.8: +combined-stream@^1.0.6, combined-stream@^1.0.8, combined-stream@~1.0.6: version "1.0.8" resolved "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz" integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== @@ -4593,6 +4664,16 @@ commander@^7.0.0, commander@^7.1.0: resolved "https://registry.npmjs.org/commander/-/commander-7.1.0.tgz" integrity sha512-pRxBna3MJe6HKnBGsDyMv8ETbptw3axEdYHoqNh7gu5oDcew8fs0xnivZGm06Ogk8zGAJ9VX+OPEr2GXEQK4dg== +commander@~2.14.1: + version "2.14.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.14.1.tgz#2235123e37af8ca3c65df45b026dbd357b01b9aa" + integrity sha512-+YR16o3rK53SmWHU3rEM3tPAh2rwb1yPcQX5irVn7mb0gXbwuCCrnkbV5+PBfETdfg1vui07nM6PCG1zndcjQw== + +commander@~2.17.1: + version "2.17.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.17.1.tgz#bd77ab7de6de94205ceacc72f1716d29f20a77bf" + integrity sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg== + common-tags@^1.8.0: version "1.8.0" resolved "https://registry.npmjs.org/common-tags/-/common-tags-1.8.0.tgz" @@ -4797,7 +4878,7 @@ core-js@^3.6.5: resolved "https://registry.npmjs.org/core-js/-/core-js-3.9.1.tgz" integrity sha512-gSjRvzkxQc1zjM/5paAmL4idJBFzuJoo+jDjF1tStYFMV2ERfD02HhahhCGXUyHxQRG4yFKVSdO6g62eoRMcDg== -core-util-is@~1.0.0: +core-util-is@1.0.2, core-util-is@~1.0.0: version "1.0.2" resolved "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz" integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= @@ -4834,6 +4915,14 @@ cosmiconfig@^7.0.0: path-type "^4.0.0" yaml "^1.10.0" +crc-32@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/crc-32/-/crc-32-1.2.0.tgz#cb2db6e29b88508e32d9dd0ec1693e7b41a18208" + integrity sha512-1uBwHxF+Y/4yF5G48fwnKq6QsIXheor3ZLPT80yGBV1oEUwpPojlEhQbWKVw1VwcTQyMGHK1/XMmTjmlsmTTGA== + dependencies: + exit-on-epipe "~1.0.1" + printj "~1.1.0" + create-ecdh@^4.0.0: version "4.0.4" resolved "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz" @@ -5249,6 +5338,13 @@ damerau-levenshtein@^1.0.6: resolved "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.6.tgz" integrity sha512-JVrozIeElnj3QzfUIt8tB8YMluBJom4Vw9qTPpjGYQ9fYlB3D/rb6OordUxf3xeFB35LKWs0xqcO5U6ySvBtug== +dashdash@^1.12.0: + version "1.14.1" + resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" + integrity sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA= + dependencies: + assert-plus "^1.0.0" + data-urls@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz" @@ -5684,6 +5780,11 @@ dom-serializer@^1.3.2: domhandler "^4.2.0" entities "^2.0.0" +dom-storage@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/dom-storage/-/dom-storage-2.1.0.tgz#00fb868bc9201357ea243c7bcfd3304c1e34ea39" + integrity sha512-g6RpyWXzl0RR6OTElHKBl7nwnK87GUyZMYC7JWsB/IA73vpqK2K6LT39x4VepLxlSsWBFrPVLnsSR5Jyty0+2Q== + domain-browser@^1.1.1: version "1.2.0" resolved "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz" @@ -5896,6 +5997,14 @@ eastasianwidth@^0.2.0: resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== +ecc-jsbn@~0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" + integrity sha1-OoOpBOVDUyh4dMVkt1SThoSamMk= + dependencies: + jsbn "~0.1.0" + safer-buffer "^2.1.0" + ee-first@1.1.1: version "1.1.1" resolved "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz" @@ -6114,6 +6223,11 @@ es6-iterator@2.0.3, es6-iterator@~2.0.3: es5-ext "^0.10.35" es6-symbol "^3.1.1" +es6-promise@^4.2.6: + version "4.2.8" + resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.8.tgz#4eb21594c972bc40553d276e510539143db53e0a" + integrity sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w== + es6-promisify@^6.0.0: version "6.1.1" resolved "https://registry.npmjs.org/es6-promisify/-/es6-promisify-6.1.1.tgz" @@ -6604,6 +6718,11 @@ exenv@^1.2.0: resolved "https://registry.npmjs.org/exenv/-/exenv-1.2.2.tgz" integrity sha1-KueOhdmJQVhnCwPUe+wfA72Ru50= +exit-on-epipe@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/exit-on-epipe/-/exit-on-epipe-1.0.1.tgz#0bdd92e87d5285d267daa8171d0eb06159689692" + integrity sha512-h2z5mrROTxce56S+pnvAV890uu7ls7f1kEvVGJbw1OlFH3/mlJ5bkXu0KRyW94v37zzHPiUd55iLn3DA7TjWpw== + exit@^0.1.2: version "0.1.2" resolved "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz" @@ -6731,7 +6850,7 @@ extend-shallow@^3.0.0, extend-shallow@^3.0.2: assign-symbols "^1.0.0" is-extendable "^1.0.1" -extend@^3.0.0, extend@^3.0.2: +extend@^3.0.0, extend@^3.0.2, extend@~3.0.2: version "3.0.2" resolved "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz" integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== @@ -6770,6 +6889,16 @@ extract-zip@2.0.1: optionalDependencies: "@types/yauzl" "^2.9.1" +extsprintf@1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" + integrity sha1-lpGEQOMEGnpBT4xS48V06zw+HgU= + +extsprintf@^1.2.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" + integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8= + fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: version "3.1.3" resolved "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz" @@ -6857,6 +6986,11 @@ fecha@^4.2.0: resolved "https://registry.npmjs.org/fecha/-/fecha-4.2.0.tgz" integrity sha512-aN3pcx/DSmtyoovUudctc8+6Hl4T+hI9GBBHLjA76jdZl7+b1sgh5g4k+u/GL3dTy1/pnYzKp69FpJ0OicE3Wg== +fflate@^0.3.8: + version "0.3.11" + resolved "https://registry.yarnpkg.com/fflate/-/fflate-0.3.11.tgz#2c440d7180fdeb819e64898d8858af327b042a5d" + integrity sha512-Rr5QlUeGN1mbOHlaqcSYMKVpPbgLy0AWT/W0EHxA6NGI12yO1jpoui2zBBvU2G824ltM6Ut8BFgfHSBGfkmS0A== + figgy-pudding@^3.5.1: version "3.5.2" resolved "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz" @@ -7148,6 +7282,11 @@ foreman@3.0.1: mustache "^2.2.1" shell-quote "^1.6.1" +forever-agent@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" + integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= + fork-ts-checker-webpack-plugin@4.1.6: version "4.1.6" resolved "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-4.1.6.tgz" @@ -7179,11 +7318,25 @@ form-data@^4.0.0: combined-stream "^1.0.8" mime-types "^2.1.12" +form-data@~2.3.2: + version "2.3.3" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" + integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.6" + mime-types "^2.1.12" + forwarded@0.2.0: version "0.2.0" resolved "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz" integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== +frac@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/frac/-/frac-1.1.2.tgz#3d74f7f6478c88a1b5020306d747dc6313c74d0b" + integrity sha512-w/XBfkibaTl3YDqASwfDUqkna4Z2p9cFSr1aHDt0WoMTECnRfBOv2WArlZILlqgWlmdIlALXGpM2AOhEk5W3IA== + fragment-cache@^0.2.1: version "0.2.1" resolved "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz" @@ -7415,6 +7568,13 @@ get-value@^2.0.3, get-value@^2.0.6: resolved "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz" integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg= +getpass@^0.1.1: + version "0.1.7" + resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" + integrity sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo= + dependencies: + assert-plus "^1.0.0" + gifsicle@^5.0.0: version "5.1.0" resolved "https://registry.npmjs.org/gifsicle/-/gifsicle-5.1.0.tgz" @@ -7668,6 +7828,19 @@ handle-thing@^2.0.0: resolved "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz" integrity sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg== +har-schema@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" + integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI= + +har-validator@~5.1.3: + version "5.1.5" + resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.5.tgz#1f0803b9f8cb20c0fa13822df1ecddb36bde1efd" + integrity sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w== + dependencies: + ajv "^6.12.3" + har-schema "^2.0.0" + hard-rejection@^2.1.0: version "2.1.0" resolved "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz" @@ -8236,6 +8409,15 @@ http-proxy@^1.17.0, http-proxy@^1.18.1: follow-redirects "^1.0.0" requires-port "^1.0.0" +http-signature@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" + integrity sha1-muzZJRFHcvPZW2WmCruPfBj7rOE= + dependencies: + assert-plus "^1.0.0" + jsprim "^1.2.2" + sshpk "^1.7.0" + http2-wrapper@^1.0.0-beta.5.2: version "1.0.0-beta.5.2" resolved "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.0-beta.5.2.tgz" @@ -9043,7 +9225,7 @@ is-symbol@^1.0.2: dependencies: has-symbols "^1.0.1" -is-typedarray@^1.0.0: +is-typedarray@^1.0.0, is-typedarray@~1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz" integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= @@ -9102,6 +9284,11 @@ isobject@^3.0.0, isobject@^3.0.1: resolved "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz" integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= +isstream@~0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" + integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= + istanbul-lib-coverage@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz" @@ -9778,6 +9965,11 @@ js-yaml@^3.13.1: argparse "^1.0.7" esprima "^4.0.0" +jsbn@~0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" + integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= + jsdom@^16.4.0: version "16.7.0" resolved "https://registry.npmjs.org/jsdom/-/jsdom-16.7.0.tgz" @@ -9879,11 +10071,21 @@ json-schema-traverse@^1.0.0: resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz" integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== +json-schema@0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" + integrity sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM= + json-stable-stringify-without-jsonify@^1.0.1: version "1.0.1" resolved "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz" integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= +json-stringify-safe@~5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" + integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= + json3@^3.3.3: version "3.3.3" resolved "https://registry.npmjs.org/json3/-/json3-3.3.3.tgz" @@ -9922,6 +10124,16 @@ jsonfile@^6.0.1: optionalDependencies: graceful-fs "^4.1.6" +jsprim@^1.2.2: + version "1.4.1" + resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" + integrity sha1-MT5mvB5cwG5Di8G3SZwuXFastqI= + dependencies: + assert-plus "1.0.0" + extsprintf "1.3.0" + json-schema "0.2.3" + verror "1.10.0" + "jsx-ast-utils@^2.4.1 || ^3.0.0", jsx-ast-utils@^3.1.0: version "3.1.0" resolved "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.1.0.tgz" @@ -10272,7 +10484,7 @@ lodash.uniq@^4.5.0: resolved "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz" integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M= -lodash@4.17.15, "lodash@>=3.5 <5", lodash@>=4.17.15, lodash@^4.17.11, lodash@^4.17.12, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.7.0: +lodash@4.17.15, lodash@4.17.21, "lodash@>=3.5 <5", lodash@>=4.17.15, lodash@^4.17.11, lodash@^4.17.12, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.7.0: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== @@ -10860,6 +11072,11 @@ mime-db@1.44.0, "mime-db@>= 1.43.0 < 2", mime-db@^1.28.0: resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz" integrity sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg== +mime-db@1.47.0: + version "1.47.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.47.0.tgz#8cb313e59965d3c05cfbf898915a267af46a335c" + integrity sha512-QBmA/G2y+IfeS4oktet3qRZ+P5kPhCKRXxXnQEudYqUaEioAU1/Lq2us3D/t1Jfo4hE9REQPrbB7K5sOczJVIw== + mime-db@1.51.0: version "1.51.0" resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.51.0.tgz#d9ff62451859b18342d960850dc3cfb77e63fb0c" @@ -10884,6 +11101,13 @@ mime-types@^2.1.31: dependencies: mime-db "1.52.0" +mime-types@~2.1.19: + version "2.1.30" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.30.tgz#6e7be8b4c479825f85ed6326695db73f9305d62d" + integrity sha512-crmjA4bLtR8m9qLpHvgxSChT+XoSlZi8J4n/aIdn3z92e/U47Z0V/yl+Wh9W046GgFVAmoNR/fmdbZYcSSIUeg== + dependencies: + mime-db "1.47.0" + mime-types@~2.1.34: version "2.1.34" resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.34.tgz#5a712f9ec1503511a945803640fafe09d3793c24" @@ -11387,6 +11611,11 @@ nwsapi@^2.2.0: resolved "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz" integrity sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ== +oauth-sign@~0.9.0: + version "0.9.0" + resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" + integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== + object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: version "4.1.1" resolved "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" @@ -13023,6 +13252,11 @@ pretty-format@^27.4.6: ansi-styles "^5.0.0" react-is "^17.0.1" +printj@~1.1.0, printj@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/printj/-/printj-1.1.2.tgz#d90deb2975a8b9f600fb3a1c94e3f4c53c78a222" + integrity sha512-zA2SmoLaxZyArQTOPj5LXecR+RagfPSU5Kw1qP+jkWeNlrq+eJZyY2oS68SU1Z/7/myXM4lo9716laOFAVStCQ== + prismjs@1.26.0: version "1.26.0" resolved "https://registry.npmjs.org/prismjs/-/prismjs-1.26.0.tgz" @@ -13124,7 +13358,7 @@ pseudomap@^1.0.2: resolved "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz" integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM= -psl@^1.1.33: +psl@^1.1.28, psl@^1.1.33: version "1.8.0" resolved "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz" integrity sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ== @@ -13191,6 +13425,11 @@ qs@6.9.7: resolved "https://registry.yarnpkg.com/qs/-/qs-6.9.7.tgz#4610846871485e1e048f44ae3b94033f0e675afe" integrity sha512-IhMFgUmuNpyRfxA90umL7ByLlgRXu6tIfKPpF5TmcfRLlLCckfP/g3IQmju6jjpu+Hh8rA+2p6A27ZSPOOHdKw== +qs@~6.5.2: + version "6.5.2" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" + integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA== + query-string@^4.1.0: version "4.3.4" resolved "https://registry.npmjs.org/query-string/-/query-string-4.3.4.tgz" @@ -13463,6 +13702,11 @@ react-scripts@4.0.3: optionalDependencies: fsevents "^2.1.3" +react-simple-code-editor@0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/react-simple-code-editor/-/react-simple-code-editor-0.11.0.tgz#bb57c7c29b570f2ab229872599eac184f5bc673c" + integrity sha512-xGfX7wAzspl113ocfKQAR8lWPhavGWHL3xSzNLeseDRHysT+jzRBi/ExdUqevSMos+7ZtdfeuBOXtgk9HTwsrw== + react@17.0.2: version "17.0.2" resolved "https://registry.npmjs.org/react/-/react-17.0.2.tgz" @@ -13866,6 +14110,32 @@ replace-ext@^1.0.0: resolved "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.1.tgz" integrity sha512-yD5BHCe7quCgBph4rMQ+0KkIRKwWCrHDOX1p1Gp6HwjPM5kVoCdKGNhN7ydqqsX6lJEnQDKZ/tFMiEdQ1dvPEw== +request@2.88.2: + version "2.88.2" + resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3" + integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw== + dependencies: + aws-sign2 "~0.7.0" + aws4 "^1.8.0" + caseless "~0.12.0" + combined-stream "~1.0.6" + extend "~3.0.2" + forever-agent "~0.6.1" + form-data "~2.3.2" + har-validator "~5.1.3" + http-signature "~1.2.0" + is-typedarray "~1.0.0" + isstream "~0.1.2" + json-stringify-safe "~5.0.1" + mime-types "~2.1.19" + oauth-sign "~0.9.0" + performance-now "^2.1.0" + qs "~6.5.2" + safe-buffer "^5.1.2" + tough-cookie "~2.5.0" + tunnel-agent "^0.6.0" + uuid "^3.3.2" + require-directory@^2.1.1: version "2.1.1" resolved "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz" @@ -14160,7 +14430,7 @@ safe-regex@^1.1.0: dependencies: ret "~0.1.10" -"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0": +"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: version "2.1.2" resolved "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== @@ -14838,6 +15108,28 @@ squeak@^1.0.0: console-stream "^0.1.1" lpad-align "^1.0.1" +ssf@~0.11.2: + version "0.11.2" + resolved "https://registry.yarnpkg.com/ssf/-/ssf-0.11.2.tgz#0b99698b237548d088fc43cdf2b70c1a7512c06c" + integrity sha512-+idbmIXoYET47hH+d7dfm2epdOMUDjqcB4648sTZ+t2JwoyBFL/insLfB/racrDmsKB3diwsDA696pZMieAC5g== + dependencies: + frac "~1.1.2" + +sshpk@^1.7.0: + version "1.16.1" + resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.16.1.tgz#fb661c0bef29b39db40769ee39fa70093d6f6877" + integrity sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg== + dependencies: + asn1 "~0.2.3" + assert-plus "^1.0.0" + bcrypt-pbkdf "^1.0.0" + dashdash "^1.12.0" + ecc-jsbn "~0.1.1" + getpass "^0.1.1" + jsbn "~0.1.0" + safer-buffer "^2.0.2" + tweetnacl "~0.14.0" + ssri@^6.0.1: version "6.0.1" resolved "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz" @@ -15721,6 +16013,14 @@ tough-cookie@^4.0.0: punycode "^2.1.1" universalify "^0.1.2" +tough-cookie@~2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" + integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g== + dependencies: + psl "^1.1.28" + punycode "^2.1.1" + tr46@^2.0.2: version "2.0.2" resolved "https://registry.npmjs.org/tr46/-/tr46-2.0.2.tgz" @@ -15863,6 +16163,11 @@ tunnel-agent@^0.6.0: dependencies: safe-buffer "^5.0.1" +tweetnacl@^0.14.3, tweetnacl@~0.14.0: + version "0.14.5" + resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" + integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= + type-check@^0.4.0, type-check@~0.4.0: version "0.4.0" resolved "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz" @@ -16340,6 +16645,15 @@ vendors@^1.0.0: resolved "https://registry.npmjs.org/vendors/-/vendors-1.0.4.tgz" integrity sha512-/juG65kTL4Cy2su4P8HjtkTxk6VmJDiOPBufWniqQ6wknac6jNiXS9vU+hO3wgusiyqWlzTbVHi0dyJqRONg3w== +verror@1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" + integrity sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA= + dependencies: + assert-plus "^1.0.0" + core-util-is "1.0.2" + extsprintf "^1.2.0" + vfile-location@^3.0.0, vfile-location@^3.2.0: version "3.2.0" resolved "https://registry.npmjs.org/vfile-location/-/vfile-location-3.2.0.tgz" @@ -16740,11 +17054,21 @@ with-open-file@^0.1.6: p-try "^2.1.0" pify "^4.0.1" +wmf@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wmf/-/wmf-1.0.2.tgz#7d19d621071a08c2bdc6b7e688a9c435298cc2da" + integrity sha512-/p9K7bEh0Dj6WbXg4JG0xvLQmIadrner1bi45VMJTfnbVHsc7yIajZyoSoK60/dtVBs12Fm6WkUI5/3WAVsNMw== + word-wrap@^1.2.3, word-wrap@~1.2.3: version "1.2.3" resolved "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz" integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== +word@~0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/word/-/word-0.3.0.tgz#8542157e4f8e849f4a363a288992d47612db9961" + integrity sha512-OELeY0Q61OXpdUfTp+oweA/vtLVg5VDOXh+3he3PNzLGG/y0oylSOC1xRVj0+l4vQ3tj/bB1HVHv1ocXkQceFA== + workbox-background-sync@^5.1.4: version "5.1.4" resolved "https://registry.npmjs.org/workbox-background-sync/-/workbox-background-sync-5.1.4.tgz" @@ -16976,6 +17300,22 @@ ws@^8.2.3: resolved "https://registry.npmjs.org/ws/-/ws-8.2.3.tgz" integrity sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA== +xlsx@0.17.0: + version "0.17.0" + resolved "https://registry.yarnpkg.com/xlsx/-/xlsx-0.17.0.tgz#028176a0140967dcee1817d221678461e47481c8" + integrity sha512-bZ36FSACiAyjoldey1+7it50PMlDp1pcAJrZKcVZHzKd8BC/z6TQ/QAN8onuqcepifqSznR6uKnjPhaGt6ig9A== + dependencies: + adler-32 "~1.2.0" + cfb "^1.1.4" + codepage "~1.14.0" + commander "~2.17.1" + crc-32 "~1.2.0" + exit-on-epipe "~1.0.1" + fflate "^0.3.8" + ssf "~0.11.2" + wmf "~1.0.1" + word "~0.3.0" + xml-name-validator@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz" @@ -17069,6 +17409,19 @@ yargs-parser@^20.2.3: resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz" integrity sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA== +yargs@16.2.0, yargs@^16.2.0: + version "16.2.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" + integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== + dependencies: + cliui "^7.0.2" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.0" + y18n "^5.0.5" + yargs-parser "^20.2.2" + yargs@^13.3.2: version "13.3.2" resolved "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz" @@ -17102,19 +17455,6 @@ yargs@^15.4.1: y18n "^4.0.0" yargs-parser "^18.1.2" -yargs@^16.2.0: - version "16.2.0" - resolved "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz" - integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== - dependencies: - cliui "^7.0.2" - escalade "^3.1.1" - get-caller-file "^2.0.5" - require-directory "^2.1.1" - string-width "^4.2.0" - y18n "^5.0.5" - yargs-parser "^20.2.2" - yauzl@2.10.0, yauzl@^2.10.0, yauzl@^2.4.2: version "2.10.0" resolved "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz"