diff --git a/README.md b/README.md index f9923d4..b372653 100644 --- a/README.md +++ b/README.md @@ -67,6 +67,10 @@ npm install #### Development ```sh +firebase login +# get envars locally +firebase functions:config:get > .runtimeconfig.json +# start functions emulator npm run serve ``` diff --git a/account/package-lock.json b/account/package-lock.json index 82eefb8..70429af 100644 --- a/account/package-lock.json +++ b/account/package-lock.json @@ -9,7 +9,7 @@ "version": "1.0.0", "license": "ISC", "dependencies": { - "@lingdocs/inflect": "5.10.1", + "@lingdocs/inflect": "6.0.0", "base64url": "^3.0.1", "bcryptjs": "^2.4.3", "connect-redis": "^6.0.0", @@ -124,9 +124,9 @@ } }, "node_modules/@lingdocs/inflect": { - "version": "5.10.1", - "resolved": "https://npm.lingdocs.com/@lingdocs%2finflect/-/inflect-5.10.1.tgz", - "integrity": "sha512-8MPsfQzeerlyT02dz7D7L+AYFrjGOrQB7nMBUXutnLw3/RKhvW99dLImFZKSnCr8DZsEONEp0IVeqxeIUczxog==", + "version": "6.0.0", + "resolved": "https://npm.lingdocs.com/@lingdocs%2finflect/-/inflect-6.0.0.tgz", + "integrity": "sha512-aPvjqOkeKhu60Inbk7uuLooR/9hvUS4rDHyqR5JJPziZMLJ05U5fBTUvehit7stHSRGivskR00uU3liWbXce6g==", "license": "MIT", "dependencies": { "fp-ts": "^2.16.0", @@ -2747,9 +2747,9 @@ } }, "@lingdocs/inflect": { - "version": "5.10.1", - "resolved": "https://npm.lingdocs.com/@lingdocs%2finflect/-/inflect-5.10.1.tgz", - "integrity": "sha512-8MPsfQzeerlyT02dz7D7L+AYFrjGOrQB7nMBUXutnLw3/RKhvW99dLImFZKSnCr8DZsEONEp0IVeqxeIUczxog==", + "version": "6.0.0", + "resolved": "https://npm.lingdocs.com/@lingdocs%2finflect/-/inflect-6.0.0.tgz", + "integrity": "sha512-aPvjqOkeKhu60Inbk7uuLooR/9hvUS4rDHyqR5JJPziZMLJ05U5fBTUvehit7stHSRGivskR00uU3liWbXce6g==", "requires": { "fp-ts": "^2.16.0", "pbf": "^3.2.1", diff --git a/account/package.json b/account/package.json index 0153b33..ca1f72f 100644 --- a/account/package.json +++ b/account/package.json @@ -11,7 +11,7 @@ "author": "", "license": "ISC", "dependencies": { - "@lingdocs/inflect": "5.10.1", + "@lingdocs/inflect": "6.0.0", "base64url": "^3.0.1", "bcryptjs": "^2.4.3", "connect-redis": "^6.0.0", @@ -22,6 +22,7 @@ "express-session": "^1.17.2", "lokijs": "^1.5.12", "nano": "^9.0.3", + "next": "^13.4.12", "node-fetch": "^2.6.7", "nodemailer": "^6.6.3", "passport": "^0.4.1", @@ -42,6 +43,7 @@ "@types/cron": "^2.0.0", "@types/express": "^4.17.13", "@types/express-session": "^1.17.4", + "@types/lokijs": "^1.5.8", "@types/node": "^16.6.0", "@types/node-fetch": "^2.5.12", "@types/nodemailer": "^6.4.4", diff --git a/account/src/lib/dictionary.ts b/account/src/lib/dictionary.ts index eeab9dc..675aa11 100644 --- a/account/src/lib/dictionary.ts +++ b/account/src/lib/dictionary.ts @@ -4,22 +4,22 @@ import { CronJob } from "cron"; const collectionName = "ps-dictionary"; const allWordsCollectionName = "all-words"; import { - readDictionary, - readDictionaryInfo, - Types as T, - typePredicates as tp, - entryOfFull, - standardizePashto, -} from "@lingdocs/inflect" + readDictionary, + readDictionaryInfo, + Types as T, + typePredicates as tp, + entryOfFull, + standardizePashto, +} from "@lingdocs/inflect"; export let collection: Collection | undefined = undefined; export let allWordsCollection: Collection | undefined = undefined; const adapter = new LokiMemoryAdapter(); const lokidb = new loki("", { - adapter, - autoload: false, - autosave: false, - env: "NODEJS", + adapter, + autoload: false, + autosave: false, + env: "NODEJS", }); const updateJob = new CronJob("* * * * *", updateDictionary, null, false); @@ -27,117 +27,126 @@ const updateJob = new CronJob("* * * * *", updateDictionary, null, false); let version: number = 0; async function fetchDictionary(): Promise { - const res = await fetch(process.env.LINGDOCS_DICTIONARY_URL || ""); - const buffer = await res.arrayBuffer(); - return readDictionary(buffer as Uint8Array); + const res = await fetch(process.env.LINGDOCS_DICTIONARY_URL || ""); + const buffer = await res.arrayBuffer(); + return readDictionary(buffer as Uint8Array); } async function fetchAllWords(): Promise { - // TODO: this is really ugly - const res = await fetch(process.env.LINGDOCS_DICTIONARY_URL?.slice(0, -4) + "all-words.json"); - return await res.json(); + // TODO: this is really ugly + const res = await fetch( + process.env.LINGDOCS_DICTIONARY_URL?.slice(0, -10) + + "all-words-dictionary.json" + ); + return await res.json(); } async function fetchDictionaryInfo(): Promise { - const res = await fetch(process.env.LINGDOCS_DICTIONARY_URL + "-info" || ""); - const buffer = await res.arrayBuffer(); - return readDictionaryInfo(buffer as Uint8Array); + const res = await fetch(process.env.LINGDOCS_DICTIONARY_URL + "-info" || ""); + const buffer = await res.arrayBuffer(); + return readDictionaryInfo(buffer as Uint8Array); } export async function updateDictionary(): Promise<"no update" | "updated"> { - const info = await fetchDictionaryInfo(); - if (info.release === version) { - return "no update"; - } - const dictionary = await fetchDictionary(); - version = dictionary.info.release; - collection?.clear(); - lokidb.removeCollection(collectionName); - collection?.insert(dictionary.entries); - const allWords = await fetchAllWords(); - allWordsCollection?.clear(); - lokidb.removeCollection(allWordsCollectionName); - allWordsCollection?.insert(allWords.words); - return "updated"; + const info = await fetchDictionaryInfo(); + if (info.release === version) { + return "no update"; + } + const dictionary = await fetchDictionary(); + version = dictionary.info.release; + collection?.clear(); + lokidb.removeCollection(collectionName); + collection?.insert(dictionary.entries); + const allWords = await fetchAllWords(); + allWordsCollection?.clear(); + lokidb.removeCollection(allWordsCollectionName); + allWordsCollection?.insert(allWords.words); + return "updated"; } function getOneByTs(ts: number): T.DictionaryEntry { - if (!collection) { - throw new Error("dictionary not initialized"); - } - const r = collection.by("ts", ts); - // @ts-ignore - const { $loki, meta, ...entry } = r; - return entry; + if (!collection) { + throw new Error("dictionary not initialized"); + } + const r = collection.by("ts", ts); + // @ts-ignore + const { $loki, meta, ...entry } = r; + return entry; } export function findInAllWords(p: string | RegExp): T.PsWord[] | undefined { - if (!allWordsCollection) { - throw new Error("allWords not initialized"); - } - return allWordsCollection.find({ - p: typeof p === "string" - ? p - : { $regex: p }, - }); + if (!allWordsCollection) { + throw new Error("allWords not initialized"); + } + return allWordsCollection.find({ + p: typeof p === "string" ? p : { $regex: p }, + }); } export async function getEntries(ids: (number | string)[]): Promise<{ - results: (T.DictionaryEntry | T.VerbEntry)[], - notFound: (number | string)[], + results: (T.DictionaryEntry | T.VerbEntry)[]; + notFound: (number | string)[]; }> { - if (!collection) { - throw new Error("dictionary not initialized"); - } - const idsP = ids.map(x => typeof x === "number" ? x : standardizePashto(x)) - const results: (T.DictionaryEntry | T.VerbEntry)[] = collection.find({ - "$or": [ - { "ts": { "$in": idsP }}, - { "p": { "$in": idsP }}, - ], - }).map(x => { - const { $loki, meta, ...entry } = x; - return entry; - }).map((entry): T.DictionaryEntry | T.VerbEntry => { - if (tp.isVerbDictionaryEntry(entry)) { - if (entry.c?.includes("comp.") && entry.l) { - const complement = getOneByTs(entry.l); - if (!complement) throw new Error("Error getting complement "+entry.l); - return { - entry, - complement, - }; - } - return { entry }; - } else { - return entry; + if (!collection) { + throw new Error("dictionary not initialized"); + } + const idsP = ids.map((x) => + typeof x === "number" ? x : standardizePashto(x) + ); + const results: (T.DictionaryEntry | T.VerbEntry)[] = collection + .find({ + $or: [{ ts: { $in: idsP } }, { p: { $in: idsP } }], + }) + .map((x) => { + const { $loki, meta, ...entry } = x; + return entry; + }) + .map((entry): T.DictionaryEntry | T.VerbEntry => { + if (tp.isVerbDictionaryEntry(entry)) { + if (entry.c?.includes("comp.") && entry.l) { + const complement = getOneByTs(entry.l); + if (!complement) + throw new Error("Error getting complement " + entry.l); + return { + entry, + complement, + }; } + return { entry }; + } else { + return entry; + } }); - return { - results, - notFound: ids.filter(id => !results.find(x => { - const entry = entryOfFull(x); - return entry.p === id || entry.ts === id; - })), - }; + return { + results, + notFound: ids.filter( + (id) => + !results.find((x) => { + const entry = entryOfFull(x); + return entry.p === id || entry.ts === id; + }) + ), + }; } lokidb.loadDatabase({}, (err: Error) => { - lokidb.removeCollection(collectionName); - lokidb.removeCollection(allWordsCollectionName); - fetchDictionary().then((dictionary) => { - collection = lokidb.addCollection(collectionName, { - indices: ["i", "p"], - unique: ["ts"], - }); - version = dictionary.info.release; - collection?.insert(dictionary.entries); - updateJob.start(); - }).catch(console.error); - fetchAllWords().then((allWords) => { - allWordsCollection = lokidb.addCollection(allWordsCollectionName, { - indices: ["p"], - }); - allWordsCollection?.insert(allWords.words); + lokidb.removeCollection(collectionName); + lokidb.removeCollection(allWordsCollectionName); + fetchDictionary() + .then((dictionary) => { + collection = lokidb.addCollection(collectionName, { + indices: ["i", "p"], + unique: ["ts"], + }); + version = dictionary.info.release; + collection?.insert(dictionary.entries); + updateJob.start(); + }) + .catch(console.error); + fetchAllWords().then((allWords) => { + allWordsCollection = lokidb.addCollection(allWordsCollectionName, { + indices: ["p"], }); + allWordsCollection?.insert(allWords.words); + }); }); diff --git a/account/src/routers/dictionary-router.ts b/account/src/routers/dictionary-router.ts index f561ef9..a5a015e 100644 --- a/account/src/routers/dictionary-router.ts +++ b/account/src/routers/dictionary-router.ts @@ -1,55 +1,54 @@ import express from "express"; import { - allWordsCollection, - collection, - findInAllWords, - getEntries, - updateDictionary, + allWordsCollection, + collection, + getEntries, + updateDictionary, } from "../lib/dictionary"; import { scriptToPhonetics } from "../lib/scriptToPhonetics"; const dictionaryRouter = express.Router(); dictionaryRouter.post("/update", async (req, res, next) => { - const result = await updateDictionary(); - res.send({ ok: true, result }); + const result = await updateDictionary(); + res.send({ ok: true, result }); }); dictionaryRouter.post("/script-to-phonetics", async (req, res, next) => { - if (!allWordsCollection) { - return res.send({ ok: false, message: "allWords not ready" }); - } - const text = req.body.text as unknown; - const accents = req.body.accents as unknown; - if (!text || typeof text !== "string" || typeof accents !== "boolean") { - return res.status(400).send({ ok: false, error: "invalid query" }); - } - const results = await scriptToPhonetics(text, accents); - res.send({ ok: true, results }); -}) + if (!allWordsCollection) { + return res.send({ ok: false, message: "allWords not ready" }); + } + const text = req.body.text as unknown; + const accents = req.body.accents as unknown; + if (!text || typeof text !== "string" || typeof accents !== "boolean") { + return res.status(400).send({ ok: false, error: "invalid query" }); + } + const results = await scriptToPhonetics(text, accents); + res.send({ ok: true, results }); +}); dictionaryRouter.post("/entries", async (req, res, next) => { - if (!collection) { - return res.send({ ok: false, message: "dictionary not ready" }); - } - const ids = req.body.ids as (number | string)[]; - if (!Array.isArray(ids)) { - return res.status(400).send({ ok: false, error: "invalid query" }); - } - const results = await getEntries(ids); - return res.send(results); + if (!collection) { + return res.send({ ok: false, message: "dictionary not ready" }); + } + const ids = req.body.ids as (number | string)[]; + if (!Array.isArray(ids)) { + return res.status(400).send({ ok: false, error: "invalid query" }); + } + const results = await getEntries(ids); + return res.send(results); }); dictionaryRouter.get("/entries/:id", async (req, res, next) => { - if (!collection) { - return res.send({ ok: false, message: "dictionary not ready" }); - } - const ids = req.params.id.split(",").map(x => { - const n = parseInt(x); - return Number.isNaN(n) ? x : n; - }); - const results = await getEntries(ids); - return res.send(results); + if (!collection) { + return res.send({ ok: false, message: "dictionary not ready" }); + } + const ids = req.params.id.split(",").map((x) => { + const n = parseInt(x); + return Number.isNaN(n) ? x : n; + }); + const results = await getEntries(ids); + return res.send(results); }); -export default dictionaryRouter; \ No newline at end of file +export default dictionaryRouter; diff --git a/account/yarn.lock b/account/yarn.lock index b102934..e76ee56 100644 --- a/account/yarn.lock +++ b/account/yarn.lock @@ -3,1809 +3,1976 @@ "@babel/helper-validator-identifier@^7.14.9": - "integrity" "sha512-pQYxPY0UP6IHISRitNe8bsijHex4TWZXi2HwKVsjPiltzlhse2znVcm9Ace510VT1kxIHjGJCZZQBX2gJDbo0g==" - "resolved" "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.9.tgz" - "version" "7.14.9" + version "7.14.9" + resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.9.tgz" + integrity sha512-pQYxPY0UP6IHISRitNe8bsijHex4TWZXi2HwKVsjPiltzlhse2znVcm9Ace510VT1kxIHjGJCZZQBX2gJDbo0g== "@babel/parser@^7.6.0", "@babel/parser@^7.9.6": - "integrity" "sha512-O0L6v/HvqbdJawj0iBEfVQMc3/6WP+AeOsovsIgBFyJaG+W2w7eqvZB7puddATmWuARlm1SX7DwxJ/JJUnDpEA==" - "resolved" "https://registry.npmjs.org/@babel/parser/-/parser-7.15.3.tgz" - "version" "7.15.3" + version "7.15.3" + resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.15.3.tgz" + integrity sha512-O0L6v/HvqbdJawj0iBEfVQMc3/6WP+AeOsovsIgBFyJaG+W2w7eqvZB7puddATmWuARlm1SX7DwxJ/JJUnDpEA== "@babel/types@^7.6.1", "@babel/types@^7.9.6": - "integrity" "sha512-OBvfqnllOIdX4ojTHpwZbpvz4j3EWyjkZEdmjH0/cgsd6QOdSgU8rLSk6ard/pcW7rlmjdVSX/AWOaORR1uNOQ==" - "resolved" "https://registry.npmjs.org/@babel/types/-/types-7.15.0.tgz" - "version" "7.15.0" + version "7.15.0" + resolved "https://registry.npmjs.org/@babel/types/-/types-7.15.0.tgz" + integrity sha512-OBvfqnllOIdX4ojTHpwZbpvz4j3EWyjkZEdmjH0/cgsd6QOdSgU8rLSk6ard/pcW7rlmjdVSX/AWOaORR1uNOQ== dependencies: "@babel/helper-validator-identifier" "^7.14.9" - "to-fast-properties" "^2.0.0" + to-fast-properties "^2.0.0" "@cspotcode/source-map-support@^0.8.0": - "integrity" "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==" - "resolved" "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz" - "version" "0.8.1" + version "0.8.1" + resolved "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz" + integrity sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw== dependencies: "@jridgewell/trace-mapping" "0.3.9" "@jridgewell/resolve-uri@^3.0.3": - "integrity" "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==" - "resolved" "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz" - "version" "3.1.0" + version "3.1.0" + resolved "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz" + integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== "@jridgewell/sourcemap-codec@^1.4.10": - "integrity" "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==" - "resolved" "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz" - "version" "1.4.14" + version "1.4.14" + resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz" + integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== "@jridgewell/trace-mapping@0.3.9": - "integrity" "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==" - "resolved" "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz" - "version" "0.3.9" + version "0.3.9" + resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz" + integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== dependencies: "@jridgewell/resolve-uri" "^3.0.3" "@jridgewell/sourcemap-codec" "^1.4.10" -"@lingdocs/inflect@5.10.1": - "integrity" "sha512-8MPsfQzeerlyT02dz7D7L+AYFrjGOrQB7nMBUXutnLw3/RKhvW99dLImFZKSnCr8DZsEONEp0IVeqxeIUczxog==" - "resolved" "https://npm.lingdocs.com/@lingdocs%2finflect/-/inflect-5.10.1.tgz" - "version" "5.10.1" +"@lingdocs/inflect@6.0.0": + version "6.0.0" + resolved "https://npm.lingdocs.com/@lingdocs%2finflect/-/inflect-6.0.0.tgz" + integrity sha512-aPvjqOkeKhu60Inbk7uuLooR/9hvUS4rDHyqR5JJPziZMLJ05U5fBTUvehit7stHSRGivskR00uU3liWbXce6g== dependencies: - "fp-ts" "^2.16.0" - "pbf" "^3.2.1" - "rambda" "^7.3.0" + fp-ts "^2.16.0" + pbf "^3.2.1" + rambda "^7.3.0" + +"@next/env@13.4.12": + version "13.4.12" + resolved "https://registry.yarnpkg.com/@next/env/-/env-13.4.12.tgz#0b88115ab817f178bf9dc0c5e7b367277595b58d" + integrity sha512-RmHanbV21saP/6OEPBJ7yJMuys68cIf8OBBWd7+uj40LdpmswVAwe1uzeuFyUsd6SfeITWT3XnQfn6wULeKwDQ== + +"@next/swc-darwin-arm64@13.4.12": + version "13.4.12" + resolved "https://registry.yarnpkg.com/@next/swc-darwin-arm64/-/swc-darwin-arm64-13.4.12.tgz#326c830b111de8a1a51ac0cbc3bcb157c4c4f92c" + integrity sha512-deUrbCXTMZ6ZhbOoloqecnUeNpUOupi8SE2tx4jPfNS9uyUR9zK4iXBvH65opVcA/9F5I/p8vDXSYbUlbmBjZg== + +"@next/swc-darwin-x64@13.4.12": + version "13.4.12" + resolved "https://registry.yarnpkg.com/@next/swc-darwin-x64/-/swc-darwin-x64-13.4.12.tgz#dd5c49fc092a8ffe4f30b7aa9bf6c5d2e40bbfa1" + integrity sha512-WRvH7RxgRHlC1yb5oG0ZLx8F7uci9AivM5/HGGv9ZyG2Als8Ij64GC3d+mQ5sJhWjusyU6T6V1WKTUoTmOB0zQ== + +"@next/swc-linux-arm64-gnu@13.4.12": + version "13.4.12" + resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-13.4.12.tgz#816cbe9d26ce4670ea99d95b66041e483ed122d6" + integrity sha512-YEKracAWuxp54tKiAvvq73PUs9lok57cc8meYRibTWe/VdPB2vLgkTVWFcw31YDuRXdEhdX0fWS6Q+ESBhnEig== + +"@next/swc-linux-arm64-musl@13.4.12": + version "13.4.12" + resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-13.4.12.tgz#670c8aee221628f65e5b299ee84db746e6c778b0" + integrity sha512-LhJR7/RAjdHJ2Isl2pgc/JaoxNk0KtBgkVpiDJPVExVWA1c6gzY57+3zWuxuyWzTG+fhLZo2Y80pLXgIJv7g3g== + +"@next/swc-linux-x64-gnu@13.4.12": + version "13.4.12" + resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-13.4.12.tgz#54c64e689f007ae463698dddc1c6637491c99cb4" + integrity sha512-1DWLL/B9nBNiQRng+1aqs3OaZcxC16Nf+mOnpcrZZSdyKHek3WQh6j/fkbukObgNGwmCoVevLUa/p3UFTTqgqg== + +"@next/swc-linux-x64-musl@13.4.12": + version "13.4.12" + resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-13.4.12.tgz#9cbddf4e542ef3d32284e0c36ce102facc015f8b" + integrity sha512-kEAJmgYFhp0VL+eRWmUkVxLVunn7oL9Mdue/FS8yzRBVj7Z0AnIrHpTIeIUl1bbdQq1VaoOztnKicAjfkLTRCQ== + +"@next/swc-win32-arm64-msvc@13.4.12": + version "13.4.12" + resolved "https://registry.yarnpkg.com/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-13.4.12.tgz#3467a4b25429ccf49fd416388c9d19c80a4f6465" + integrity sha512-GMLuL/loR6yIIRTnPRY6UGbLL9MBdw2anxkOnANxvLvsml4F0HNIgvnU3Ej4BjbqMTNjD4hcPFdlEow4XHPdZA== + +"@next/swc-win32-ia32-msvc@13.4.12": + version "13.4.12" + resolved "https://registry.yarnpkg.com/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-13.4.12.tgz#73494cd167191946833c680b28d6a42435d383a8" + integrity sha512-PhgNqN2Vnkm7XaMdRmmX0ZSwZXQAtamBVSa9A/V1dfKQCV1rjIZeiy/dbBnVYGdj63ANfsOR/30XpxP71W0eww== + +"@next/swc-win32-x64-msvc@13.4.12": + version "13.4.12" + resolved "https://registry.yarnpkg.com/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-13.4.12.tgz#4a497edc4e8c5ee3c3eb27cf0eb39dfadff70874" + integrity sha512-Z+56e/Ljt0bUs+T+jPjhFyxYBcdY2RIq9ELFU+qAMQMteHo7ymbV7CKmlcX59RI9C4YzN8PgMgLyAoi916b5HA== + +"@swc/helpers@0.5.1": + version "0.5.1" + resolved "https://registry.yarnpkg.com/@swc/helpers/-/helpers-0.5.1.tgz#e9031491aa3f26bfcc974a67f48bd456c8a5357a" + integrity sha512-sJ902EfIzn1Fa+qYmjdQqh8tPsoxyBz+8yBKC2HKUxyezKJFwPGOn7pv4WY6QuQW//ySQi5lJjA/ZT9sNWWNTg== + dependencies: + tslib "^2.4.0" "@tsconfig/node10@^1.0.7": - "integrity" "sha512-6XFfSQmMgq0CFLY1MslA/CPUfhIL919M1rMsa5lP2P097N2Wd1sSX0tx1u4olM16fLNhtHZpRhedZJphNJqmZg==" - "resolved" "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.8.tgz" - "version" "1.0.8" + version "1.0.8" + resolved "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.8.tgz" + integrity sha512-6XFfSQmMgq0CFLY1MslA/CPUfhIL919M1rMsa5lP2P097N2Wd1sSX0tx1u4olM16fLNhtHZpRhedZJphNJqmZg== "@tsconfig/node12@^1.0.7": - "integrity" "sha512-/yBMcem+fbvhSREH+s14YJi18sp7J9jpuhYByADT2rypfajMZZN4WQ6zBGgBKp53NKmqI36wFYDb3yaMPurITw==" - "resolved" "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.9.tgz" - "version" "1.0.9" + version "1.0.9" + resolved "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.9.tgz" + integrity sha512-/yBMcem+fbvhSREH+s14YJi18sp7J9jpuhYByADT2rypfajMZZN4WQ6zBGgBKp53NKmqI36wFYDb3yaMPurITw== "@tsconfig/node14@^1.0.0": - "integrity" "sha512-509r2+yARFfHHE7T6Puu2jjkoycftovhXRqW328PDXTVGKihlb1P8Z9mMZH04ebyajfRY7dedfGynlrFHJUQCg==" - "resolved" "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.1.tgz" - "version" "1.0.1" + version "1.0.1" + resolved "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.1.tgz" + integrity sha512-509r2+yARFfHHE7T6Puu2jjkoycftovhXRqW328PDXTVGKihlb1P8Z9mMZH04ebyajfRY7dedfGynlrFHJUQCg== "@tsconfig/node16@^1.0.2": - "integrity" "sha512-eZxlbI8GZscaGS7kkc/trHTT5xgrjH3/1n2JDwusC9iahPKWMRvRjJSAN5mCXviuTGQ/lHnhvv8Q1YTpnfz9gA==" - "resolved" "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.2.tgz" - "version" "1.0.2" + version "1.0.2" + resolved "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.2.tgz" + integrity sha512-eZxlbI8GZscaGS7kkc/trHTT5xgrjH3/1n2JDwusC9iahPKWMRvRjJSAN5mCXviuTGQ/lHnhvv8Q1YTpnfz9gA== "@types/base64url@^2.0.0": - "integrity" "sha512-r+d5HWla1etMB9MdDr/wfzhiWdT6GTlO6Xp96FnSsnsxeOi3ZCz1EJyv7OE7Coc2cw5tGblqahMYNL/KwdP8kQ==" - "resolved" "https://registry.npmjs.org/@types/base64url/-/base64url-2.0.0.tgz" - "version" "2.0.0" + version "2.0.0" + resolved "https://registry.npmjs.org/@types/base64url/-/base64url-2.0.0.tgz" + integrity sha512-r+d5HWla1etMB9MdDr/wfzhiWdT6GTlO6Xp96FnSsnsxeOi3ZCz1EJyv7OE7Coc2cw5tGblqahMYNL/KwdP8kQ== dependencies: - "base64url" "*" + base64url "*" "@types/bcryptjs@^2.4.2": - "integrity" "sha512-LiMQ6EOPob/4yUL66SZzu6Yh77cbzJFYll+ZfaPiPPFswtIlA/Fs1MzdKYA7JApHU49zQTbJGX3PDmCpIdDBRQ==" - "resolved" "https://registry.npmjs.org/@types/bcryptjs/-/bcryptjs-2.4.2.tgz" - "version" "2.4.2" + version "2.4.2" + resolved "https://registry.npmjs.org/@types/bcryptjs/-/bcryptjs-2.4.2.tgz" + integrity sha512-LiMQ6EOPob/4yUL66SZzu6Yh77cbzJFYll+ZfaPiPPFswtIlA/Fs1MzdKYA7JApHU49zQTbJGX3PDmCpIdDBRQ== "@types/body-parser@*": - "integrity" "sha512-a6bTJ21vFOGIkwM0kzh9Yr89ziVxq4vYH2fQ6N8AeipEzai/cFK6aGMArIkUeIdRIgpwQa+2bXiLuUJCpSf2Cg==" - "resolved" "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.1.tgz" - "version" "1.19.1" + version "1.19.1" + resolved "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.1.tgz" + integrity sha512-a6bTJ21vFOGIkwM0kzh9Yr89ziVxq4vYH2fQ6N8AeipEzai/cFK6aGMArIkUeIdRIgpwQa+2bXiLuUJCpSf2Cg== dependencies: "@types/connect" "*" "@types/node" "*" "@types/connect@*": - "integrity" "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==" - "resolved" "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz" - "version" "3.4.35" + version "3.4.35" + resolved "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz" + integrity sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ== dependencies: "@types/node" "*" "@types/cors@^2.8.12": - "integrity" "sha512-vt+kDhq/M2ayberEtJcIN/hxXy1Pk+59g2FV/ZQceeaTyCtCucjL2Q7FXlFjtWn4n15KCr1NE2lNNFhp0lEThw==" - "resolved" "https://registry.npmjs.org/@types/cors/-/cors-2.8.12.tgz" - "version" "2.8.12" + version "2.8.12" + resolved "https://registry.npmjs.org/@types/cors/-/cors-2.8.12.tgz" + integrity sha512-vt+kDhq/M2ayberEtJcIN/hxXy1Pk+59g2FV/ZQceeaTyCtCucjL2Q7FXlFjtWn4n15KCr1NE2lNNFhp0lEThw== "@types/cron@^2.0.0": - "integrity" "sha512-xZM08fqvwIXgghtPVkSPKNgC+JoMQ2OHazEvyTKnNf7aWu1aB6/4lBbQFrb03Td2cUGG7ITzMv3mFYnMu6xRaQ==" - "resolved" "https://registry.npmjs.org/@types/cron/-/cron-2.0.0.tgz" - "version" "2.0.0" + version "2.0.0" + resolved "https://registry.npmjs.org/@types/cron/-/cron-2.0.0.tgz" + integrity sha512-xZM08fqvwIXgghtPVkSPKNgC+JoMQ2OHazEvyTKnNf7aWu1aB6/4lBbQFrb03Td2cUGG7ITzMv3mFYnMu6xRaQ== dependencies: "@types/luxon" "*" "@types/node" "*" "@types/express-serve-static-core@^4.17.18": - "integrity" "sha512-3UJuW+Qxhzwjq3xhwXm2onQcFHn76frIYVbTu+kn24LFxI+dEhdfISDFovPB8VpEgW8oQCTpRuCe+0zJxB7NEA==" - "resolved" "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.24.tgz" - "version" "4.17.24" + version "4.17.24" + resolved "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.24.tgz" + integrity sha512-3UJuW+Qxhzwjq3xhwXm2onQcFHn76frIYVbTu+kn24LFxI+dEhdfISDFovPB8VpEgW8oQCTpRuCe+0zJxB7NEA== dependencies: "@types/node" "*" "@types/qs" "*" "@types/range-parser" "*" "@types/express-session@^1.17.4": - "integrity" "sha512-7cNlSI8+oOBUHTfPXMwDxF/Lchx5aJ3ho7+p9jJZYVg9dVDJFh3qdMXmJtRsysnvS+C6x46k9DRYmrmCkE+MVg==" - "resolved" "https://registry.npmjs.org/@types/express-session/-/express-session-1.17.4.tgz" - "version" "1.17.4" + version "1.17.4" + resolved "https://registry.npmjs.org/@types/express-session/-/express-session-1.17.4.tgz" + integrity sha512-7cNlSI8+oOBUHTfPXMwDxF/Lchx5aJ3ho7+p9jJZYVg9dVDJFh3qdMXmJtRsysnvS+C6x46k9DRYmrmCkE+MVg== dependencies: "@types/express" "*" "@types/express@*", "@types/express@^4.17.13": - "integrity" "sha512-6bSZTPaTIACxn48l50SR+axgrqm6qXFIxrdAKaG6PaJk3+zuUr35hBlgT7vOmJcum+OEaIBLtHV/qloEAFITeA==" - "resolved" "https://registry.npmjs.org/@types/express/-/express-4.17.13.tgz" - "version" "4.17.13" + version "4.17.13" + resolved "https://registry.npmjs.org/@types/express/-/express-4.17.13.tgz" + integrity sha512-6bSZTPaTIACxn48l50SR+axgrqm6qXFIxrdAKaG6PaJk3+zuUr35hBlgT7vOmJcum+OEaIBLtHV/qloEAFITeA== dependencies: "@types/body-parser" "*" "@types/express-serve-static-core" "^4.17.18" "@types/qs" "*" "@types/serve-static" "*" +"@types/lokijs@^1.5.8": + version "1.5.8" + resolved "https://registry.yarnpkg.com/@types/lokijs/-/lokijs-1.5.8.tgz#0c365744f6e473ac6e9a6d8b174649b6ef85f47d" + integrity sha512-HN4vmoYHqF0mx91Cci6xaH1uN1JAMbakqNFXggpbd2L/RTUMrvx//dJTJehEtEF+a/qXfLbVSeO6p3Oegx/hDg== + "@types/luxon@*": - "integrity" "sha512-HM2OVWckUMmXbWYZufmWT2XMURGDZ6XbyNyQ+Lx+gCFGFqbZaIjsz7b+AGeGP/AuVYHBiuGY+wXfweP1RremnA==" - "resolved" "https://registry.npmjs.org/@types/luxon/-/luxon-3.0.2.tgz" - "version" "3.0.2" + version "3.0.2" + resolved "https://registry.npmjs.org/@types/luxon/-/luxon-3.0.2.tgz" + integrity sha512-HM2OVWckUMmXbWYZufmWT2XMURGDZ6XbyNyQ+Lx+gCFGFqbZaIjsz7b+AGeGP/AuVYHBiuGY+wXfweP1RremnA== "@types/mime@^1": - "integrity" "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==" - "resolved" "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz" - "version" "1.3.2" + version "1.3.2" + resolved "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz" + integrity sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw== "@types/node-fetch@^2.5.12": - "integrity" "sha512-MKgC4dlq4kKNa/mYrwpKfzQMB5X3ee5U6fSprkKpToBqBmX4nFZL9cW5jl6sWn+xpRJ7ypWh2yyqqr8UUCstSw==" - "resolved" "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.5.12.tgz" - "version" "2.5.12" + version "2.5.12" + resolved "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.5.12.tgz" + integrity sha512-MKgC4dlq4kKNa/mYrwpKfzQMB5X3ee5U6fSprkKpToBqBmX4nFZL9cW5jl6sWn+xpRJ7ypWh2yyqqr8UUCstSw== dependencies: "@types/node" "*" - "form-data" "^3.0.0" + form-data "^3.0.0" -"@types/node@*", "@types/node@^16.6.0", "@types/node@>=8.1.0": - "integrity" "sha512-OyiZPohMMjZEYqcVo/UJ04GyAxXOJEZO/FpzyXxcH4r/ArrVoXHf4MbUrkLp0Tz7/p1mMKpo5zJ6ZHl8XBNthQ==" - "resolved" "https://registry.npmjs.org/@types/node/-/node-16.6.0.tgz" - "version" "16.6.0" +"@types/node@*", "@types/node@>=8.1.0", "@types/node@^16.6.0": + version "16.6.0" + resolved "https://registry.npmjs.org/@types/node/-/node-16.6.0.tgz" + integrity sha512-OyiZPohMMjZEYqcVo/UJ04GyAxXOJEZO/FpzyXxcH4r/ArrVoXHf4MbUrkLp0Tz7/p1mMKpo5zJ6ZHl8XBNthQ== "@types/nodemailer@^6.4.4": - "integrity" "sha512-Ksw4t7iliXeYGvIQcSIgWQ5BLuC/mljIEbjf615svhZL10PE9t+ei8O9gDaD3FPCasUJn9KTLwz2JFJyiiyuqw==" - "resolved" "https://registry.npmjs.org/@types/nodemailer/-/nodemailer-6.4.4.tgz" - "version" "6.4.4" + version "6.4.4" + resolved "https://registry.npmjs.org/@types/nodemailer/-/nodemailer-6.4.4.tgz" + integrity sha512-Ksw4t7iliXeYGvIQcSIgWQ5BLuC/mljIEbjf615svhZL10PE9t+ei8O9gDaD3FPCasUJn9KTLwz2JFJyiiyuqw== dependencies: "@types/node" "*" "@types/oauth@*": - "integrity" "sha512-a1iY62/a3yhZ7qH7cNUsxoI3U/0Fe9+RnuFrpTKr+0WVOzbKlSLojShCKe20aOD1Sppv+i8Zlq0pLDuTJnwS4A==" - "resolved" "https://registry.npmjs.org/@types/oauth/-/oauth-0.9.1.tgz" - "version" "0.9.1" + version "0.9.1" + resolved "https://registry.npmjs.org/@types/oauth/-/oauth-0.9.1.tgz" + integrity sha512-a1iY62/a3yhZ7qH7cNUsxoI3U/0Fe9+RnuFrpTKr+0WVOzbKlSLojShCKe20aOD1Sppv+i8Zlq0pLDuTJnwS4A== dependencies: "@types/node" "*" "@types/passport-github2@^1.2.5": - "integrity" "sha512-+WLyrd8JPsCxroK34EjegR0j3FMxp6wqB9cw/sRCFkWT9qic1dymAn021gr336EpyjzdhjUd2KKrqyxvdFSvOA==" - "resolved" "https://registry.npmjs.org/@types/passport-github2/-/passport-github2-1.2.5.tgz" - "version" "1.2.5" + version "1.2.5" + resolved "https://registry.npmjs.org/@types/passport-github2/-/passport-github2-1.2.5.tgz" + integrity sha512-+WLyrd8JPsCxroK34EjegR0j3FMxp6wqB9cw/sRCFkWT9qic1dymAn021gr336EpyjzdhjUd2KKrqyxvdFSvOA== dependencies: "@types/express" "*" "@types/passport" "*" "@types/passport-oauth2" "*" "@types/passport-google-oauth@^1.0.42": - "integrity" "sha512-0M9Wezbbkgn4VZtHdtEbQru5Kl3qeb2CHoKYvAD2svJDAg8nK1bLG4uBQPudOUuux56igXkFfNGR3gBlsSlTCg==" - "resolved" "https://registry.npmjs.org/@types/passport-google-oauth/-/passport-google-oauth-1.0.42.tgz" - "version" "1.0.42" + version "1.0.42" + resolved "https://registry.npmjs.org/@types/passport-google-oauth/-/passport-google-oauth-1.0.42.tgz" + integrity sha512-0M9Wezbbkgn4VZtHdtEbQru5Kl3qeb2CHoKYvAD2svJDAg8nK1bLG4uBQPudOUuux56igXkFfNGR3gBlsSlTCg== dependencies: "@types/express" "*" "@types/passport" "*" "@types/passport-local@^1.0.34": - "integrity" "sha512-PSc07UdYx+jhadySxxIYWuv6sAnY5e+gesn/5lkPKfBeGuIYn9OPR+AAEDq73VRUh6NBTpvE/iPE62rzZUslog==" - "resolved" "https://registry.npmjs.org/@types/passport-local/-/passport-local-1.0.34.tgz" - "version" "1.0.34" + version "1.0.34" + resolved "https://registry.npmjs.org/@types/passport-local/-/passport-local-1.0.34.tgz" + integrity sha512-PSc07UdYx+jhadySxxIYWuv6sAnY5e+gesn/5lkPKfBeGuIYn9OPR+AAEDq73VRUh6NBTpvE/iPE62rzZUslog== dependencies: "@types/express" "*" "@types/passport" "*" "@types/passport-strategy" "*" "@types/passport-oauth2@*": - "integrity" "sha512-KUNwmGhe/3xPbjkzkPwwcPmyFwfyiSgtV1qOrPBLaU4i4q9GSCdAOyCbkFG0gUxAyEmYwqo9OAF/rjPjJ6ImdA==" - "resolved" "https://registry.npmjs.org/@types/passport-oauth2/-/passport-oauth2-1.4.11.tgz" - "version" "1.4.11" + version "1.4.11" + resolved "https://registry.npmjs.org/@types/passport-oauth2/-/passport-oauth2-1.4.11.tgz" + integrity sha512-KUNwmGhe/3xPbjkzkPwwcPmyFwfyiSgtV1qOrPBLaU4i4q9GSCdAOyCbkFG0gUxAyEmYwqo9OAF/rjPjJ6ImdA== dependencies: "@types/express" "*" "@types/oauth" "*" "@types/passport" "*" "@types/passport-strategy@*": - "integrity" "sha512-o5D19Jy2XPFoX2rKApykY15et3Apgax00RRLf0RUotPDUsYrQa7x4howLYr9El2mlUApHmCMv5CZ1IXqKFQ2+g==" - "resolved" "https://registry.npmjs.org/@types/passport-strategy/-/passport-strategy-0.2.35.tgz" - "version" "0.2.35" + version "0.2.35" + resolved "https://registry.npmjs.org/@types/passport-strategy/-/passport-strategy-0.2.35.tgz" + integrity sha512-o5D19Jy2XPFoX2rKApykY15et3Apgax00RRLf0RUotPDUsYrQa7x4howLYr9El2mlUApHmCMv5CZ1IXqKFQ2+g== dependencies: "@types/express" "*" "@types/passport" "*" "@types/passport-twitter@^1.0.37": - "integrity" "sha512-/FHODUP6ExYpRFdhVOtbHwVZRmni0kFyOFhOwqg61SoSwcED4c5tkhYu5cJElyhD5jbevRTmgInLFFI5s2hBag==" - "resolved" "https://registry.npmjs.org/@types/passport-twitter/-/passport-twitter-1.0.37.tgz" - "version" "1.0.37" + version "1.0.37" + resolved "https://registry.npmjs.org/@types/passport-twitter/-/passport-twitter-1.0.37.tgz" + integrity sha512-/FHODUP6ExYpRFdhVOtbHwVZRmni0kFyOFhOwqg61SoSwcED4c5tkhYu5cJElyhD5jbevRTmgInLFFI5s2hBag== dependencies: "@types/express" "*" "@types/passport" "*" "@types/passport@*": - "integrity" "sha512-JtswU8N3kxBYgo+n9of7C97YQBT+AYPP2aBfNGTzABqPAZnK/WOAaKfh3XesUYMZRrXFuoPc2Hv0/G/nQFveHw==" - "resolved" "https://registry.npmjs.org/@types/passport/-/passport-1.0.7.tgz" - "version" "1.0.7" + version "1.0.7" + resolved "https://registry.npmjs.org/@types/passport/-/passport-1.0.7.tgz" + integrity sha512-JtswU8N3kxBYgo+n9of7C97YQBT+AYPP2aBfNGTzABqPAZnK/WOAaKfh3XesUYMZRrXFuoPc2Hv0/G/nQFveHw== dependencies: "@types/express" "*" "@types/qs@*": - "integrity" "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==" - "resolved" "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz" - "version" "6.9.7" + version "6.9.7" + resolved "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz" + integrity sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw== "@types/range-parser@*": - "integrity" "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==" - "resolved" "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz" - "version" "1.2.4" + version "1.2.4" + resolved "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz" + integrity sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw== "@types/redis@^2.8.31": - "integrity" "sha512-daWrrTDYaa5iSDFbgzZ9gOOzyp2AJmYK59OlG/2KGBgYWF3lfs8GDKm1c//tik5Uc93hDD36O+qLPvzDolChbA==" - "resolved" "https://registry.npmjs.org/@types/redis/-/redis-2.8.31.tgz" - "version" "2.8.31" + version "2.8.31" + resolved "https://registry.npmjs.org/@types/redis/-/redis-2.8.31.tgz" + integrity sha512-daWrrTDYaa5iSDFbgzZ9gOOzyp2AJmYK59OlG/2KGBgYWF3lfs8GDKm1c//tik5Uc93hDD36O+qLPvzDolChbA== dependencies: "@types/node" "*" "@types/serve-static@*": - "integrity" "sha512-nCkHGI4w7ZgAdNkrEu0bv+4xNV/XDqW+DydknebMOQwkpDGx8G+HTlj7R7ABI8i8nKxVw0wtKPi1D+lPOkh4YQ==" - "resolved" "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.10.tgz" - "version" "1.13.10" + version "1.13.10" + resolved "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.10.tgz" + integrity sha512-nCkHGI4w7ZgAdNkrEu0bv+4xNV/XDqW+DydknebMOQwkpDGx8G+HTlj7R7ABI8i8nKxVw0wtKPi1D+lPOkh4YQ== dependencies: "@types/mime" "^1" "@types/node" "*" "@types/strip-bom@^3.0.0": - "integrity" "sha512-xevGOReSYGM7g/kUBZzPqCrR/KYAo+F0yiPc85WFTJa0MSLtyFTVTU6cJu/aV4mid7IffDIWqo69THF2o4JiEQ==" - "resolved" "https://registry.npmjs.org/@types/strip-bom/-/strip-bom-3.0.0.tgz" - "version" "3.0.0" + version "3.0.0" + resolved "https://registry.npmjs.org/@types/strip-bom/-/strip-bom-3.0.0.tgz" + integrity sha512-xevGOReSYGM7g/kUBZzPqCrR/KYAo+F0yiPc85WFTJa0MSLtyFTVTU6cJu/aV4mid7IffDIWqo69THF2o4JiEQ== "@types/strip-json-comments@0.0.30": - "integrity" "sha512-7NQmHra/JILCd1QqpSzl8+mJRc8ZHz3uDm8YV1Ks9IhK0epEiTw8aIErbvH9PI+6XbqhyIQy3462nEsn7UVzjQ==" - "resolved" "https://registry.npmjs.org/@types/strip-json-comments/-/strip-json-comments-0.0.30.tgz" - "version" "0.0.30" + version "0.0.30" + resolved "https://registry.npmjs.org/@types/strip-json-comments/-/strip-json-comments-0.0.30.tgz" + integrity sha512-7NQmHra/JILCd1QqpSzl8+mJRc8ZHz3uDm8YV1Ks9IhK0epEiTw8aIErbvH9PI+6XbqhyIQy3462nEsn7UVzjQ== -"@types/tough-cookie@^4.0.0", "@types/tough-cookie@>=2.3.3": - "integrity" "sha512-Y0K95ThC3esLEYD6ZuqNek29lNX2EM1qxV8y2FTLUB0ff5wWrk7az+mLrnNFUnaXcgKye22+sFBRXOgpPILZNg==" - "resolved" "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.1.tgz" - "version" "4.0.1" +"@types/tough-cookie@^4.0.0": + version "4.0.1" + resolved "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.1.tgz" + integrity sha512-Y0K95ThC3esLEYD6ZuqNek29lNX2EM1qxV8y2FTLUB0ff5wWrk7az+mLrnNFUnaXcgKye22+sFBRXOgpPILZNg== "@types/uuid@^8.3.1": - "integrity" "sha512-Y2mHTRAbqfFkpjldbkHGY8JIzRN6XqYRliG8/24FcHm2D2PwW24fl5xMRTVGdrb7iMrwCaIEbLWerGIkXuFWVg==" - "resolved" "https://registry.npmjs.org/@types/uuid/-/uuid-8.3.1.tgz" - "version" "8.3.1" + version "8.3.1" + resolved "https://registry.npmjs.org/@types/uuid/-/uuid-8.3.1.tgz" + integrity sha512-Y2mHTRAbqfFkpjldbkHGY8JIzRN6XqYRliG8/24FcHm2D2PwW24fl5xMRTVGdrb7iMrwCaIEbLWerGIkXuFWVg== -"accepts@~1.3.7": - "integrity" "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==" - "resolved" "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz" - "version" "1.3.7" +accepts@~1.3.7: + version "1.3.7" + resolved "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz" + integrity sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA== dependencies: - "mime-types" "~2.1.24" - "negotiator" "0.6.2" + mime-types "~2.1.24" + negotiator "0.6.2" -"acorn-walk@^8.1.1": - "integrity" "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==" - "resolved" "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz" - "version" "8.2.0" +acorn-walk@^8.1.1: + version "8.2.0" + resolved "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz" + integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== -"acorn@^7.1.1": - "integrity" "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==" - "resolved" "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz" - "version" "7.4.1" +acorn@^7.1.1: + version "7.4.1" + resolved "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz" + integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== -"acorn@^8.4.1": - "integrity" "sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==" - "resolved" "https://registry.npmjs.org/acorn/-/acorn-8.8.0.tgz" - "version" "8.8.0" +acorn@^8.4.1: + version "8.8.0" + resolved "https://registry.npmjs.org/acorn/-/acorn-8.8.0.tgz" + integrity sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w== -"ansi-styles@^3.2.1": - "integrity" "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==" - "resolved" "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz" - "version" "3.2.1" +ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== dependencies: - "color-convert" "^1.9.0" + color-convert "^1.9.0" -"anymatch@~3.1.1": - "integrity" "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==" - "resolved" "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz" - "version" "3.1.2" +anymatch@~3.1.1: + version "3.1.2" + resolved "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz" + integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg== dependencies: - "normalize-path" "^3.0.0" - "picomatch" "^2.0.4" + normalize-path "^3.0.0" + picomatch "^2.0.4" -"arg@^4.1.0": - "integrity" "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==" - "resolved" "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz" - "version" "4.1.3" +arg@^4.1.0: + version "4.1.3" + resolved "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz" + integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== -"array-flatten@1.1.1": - "integrity" "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI= sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" - "resolved" "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz" - "version" "1.1.1" +array-flatten@1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz" + integrity "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI= sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" -"asap@~2.0.3": - "integrity" "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY= sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" - "resolved" "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz" - "version" "2.0.6" +asap@~2.0.3: + version "2.0.6" + resolved "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz" + integrity "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY= sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" -"asn1.js@^5.4.1": - "integrity" "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==" - "resolved" "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz" - "version" "5.4.1" +asn1.js@^5.4.1: + version "5.4.1" + resolved "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz" + integrity sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA== dependencies: - "bn.js" "^4.0.0" - "inherits" "^2.0.1" - "minimalistic-assert" "^1.0.0" - "safer-buffer" "^2.1.0" + bn.js "^4.0.0" + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + safer-buffer "^2.1.0" -"assert-never@^1.2.1": - "integrity" "sha512-TaTivMB6pYI1kXwrFlEhLeGfOqoDNdTxjCdwRfFFkEA30Eu+k48W34nlok2EYWJfFFzqaEmichdNM7th6M5HNw==" - "resolved" "https://registry.npmjs.org/assert-never/-/assert-never-1.2.1.tgz" - "version" "1.2.1" +assert-never@^1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/assert-never/-/assert-never-1.2.1.tgz" + integrity sha512-TaTivMB6pYI1kXwrFlEhLeGfOqoDNdTxjCdwRfFFkEA30Eu+k48W34nlok2EYWJfFFzqaEmichdNM7th6M5HNw== -"async@0.9.x": - "integrity" "sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0= sha512-l6ToIJIotphWahxxHyzK9bnLR6kM4jJIIgLShZeqLY7iboHoGkdgFl7W2/Ivi4SkMJYGKqW8vSuk0uKUj6qsSw==" - "resolved" "https://registry.npmjs.org/async/-/async-0.9.2.tgz" - "version" "0.9.2" +async@0.9.x: + version "0.9.2" + resolved "https://registry.npmjs.org/async/-/async-0.9.2.tgz" + integrity "sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0= sha512-l6ToIJIotphWahxxHyzK9bnLR6kM4jJIIgLShZeqLY7iboHoGkdgFl7W2/Ivi4SkMJYGKqW8vSuk0uKUj6qsSw==" -"asynckit@^0.4.0": - "integrity" "sha1-x57Zf380y48robyXkLzDZkdLS3k= sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" - "resolved" "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz" - "version" "0.4.0" +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz" + integrity "sha1-x57Zf380y48robyXkLzDZkdLS3k= sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" -"axios-cookiejar-support@^1.0.1": - "integrity" "sha512-IZJxnAJ99XxiLqNeMOqrPbfR7fRyIfaoSLdPUf4AMQEGkH8URs0ghJK/xtqBsD+KsSr3pKl4DEQjCn834pHMig==" - "resolved" "https://registry.npmjs.org/axios-cookiejar-support/-/axios-cookiejar-support-1.0.1.tgz" - "version" "1.0.1" +axios-cookiejar-support@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/axios-cookiejar-support/-/axios-cookiejar-support-1.0.1.tgz" + integrity sha512-IZJxnAJ99XxiLqNeMOqrPbfR7fRyIfaoSLdPUf4AMQEGkH8URs0ghJK/xtqBsD+KsSr3pKl4DEQjCn834pHMig== dependencies: - "is-redirect" "^1.0.0" - "pify" "^5.0.0" + is-redirect "^1.0.0" + pify "^5.0.0" -"axios@^0.21.1", "axios@>=0.16.2": - "integrity" "sha512-dKQiRHxGD9PPRIUNIWvZhPTPpl1rf/OxTYKsqKUDjBwYylTvV7SjSHJb9ratfyzM6wCdLCOYLzs73qpg5c4iGA==" - "resolved" "https://registry.npmjs.org/axios/-/axios-0.21.1.tgz" - "version" "0.21.1" +axios@^0.21.1: + version "0.21.1" + resolved "https://registry.npmjs.org/axios/-/axios-0.21.1.tgz" + integrity sha512-dKQiRHxGD9PPRIUNIWvZhPTPpl1rf/OxTYKsqKUDjBwYylTvV7SjSHJb9ratfyzM6wCdLCOYLzs73qpg5c4iGA== dependencies: - "follow-redirects" "^1.10.0" + follow-redirects "^1.10.0" -"babel-walk@3.0.0-canary-5": - "integrity" "sha512-GAwkz0AihzY5bkwIY5QDR+LvsRQgB/B+1foMPvi0FZPMl5fjD7ICiznUiBdLYMH1QYe6vqu4gWYytZOccLouFw==" - "resolved" "https://registry.npmjs.org/babel-walk/-/babel-walk-3.0.0-canary-5.tgz" - "version" "3.0.0-canary-5" +babel-walk@3.0.0-canary-5: + version "3.0.0-canary-5" + resolved "https://registry.npmjs.org/babel-walk/-/babel-walk-3.0.0-canary-5.tgz" + integrity sha512-GAwkz0AihzY5bkwIY5QDR+LvsRQgB/B+1foMPvi0FZPMl5fjD7ICiznUiBdLYMH1QYe6vqu4gWYytZOccLouFw== dependencies: "@babel/types" "^7.9.6" -"bagpipe@^0.3.5": - "integrity" "sha1-40HRZPyyTN8E6n4Ft2XsEMiupqE= sha512-42sAlmPDKes1nLm/aly+0VdaopSU9br+jkRELedhQxI5uXHgtk47I83Mpmf4zoNTRMASdLFtUkimlu/Z9zQ8+g==" - "resolved" "https://registry.npmjs.org/bagpipe/-/bagpipe-0.3.5.tgz" - "version" "0.3.5" +bagpipe@^0.3.5: + version "0.3.5" + resolved "https://registry.npmjs.org/bagpipe/-/bagpipe-0.3.5.tgz" + integrity "sha1-40HRZPyyTN8E6n4Ft2XsEMiupqE= sha512-42sAlmPDKes1nLm/aly+0VdaopSU9br+jkRELedhQxI5uXHgtk47I83Mpmf4zoNTRMASdLFtUkimlu/Z9zQ8+g==" -"balanced-match@^1.0.0": - "integrity" "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" - "resolved" "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz" - "version" "1.0.2" +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== -"base64url@*", "base64url@^3.0.1", "base64url@3.x.x": - "integrity" "sha512-ir1UPr3dkwexU7FdV8qBBbNDRUhMmIekYMFZfi+C/sLNnRESKPl23nB9b2pltqfOQNnGzsDdId90AEtG5tCx4A==" - "resolved" "https://registry.npmjs.org/base64url/-/base64url-3.0.1.tgz" - "version" "3.0.1" +base64url@*, base64url@3.x.x, base64url@^3.0.1: + version "3.0.1" + resolved "https://registry.npmjs.org/base64url/-/base64url-3.0.1.tgz" + integrity sha512-ir1UPr3dkwexU7FdV8qBBbNDRUhMmIekYMFZfi+C/sLNnRESKPl23nB9b2pltqfOQNnGzsDdId90AEtG5tCx4A== -"bcryptjs@^2.4.3": - "integrity" "sha1-mrVie5PmBiH/fNrF2pczAn3x0Ms= sha512-V/Hy/X9Vt7f3BbPJEi8BdVFMByHi+jNXrYkW3huaybV/kQ0KJg0Y6PkEMbn+zeT+i+SiKZ/HMqJGIIt4LZDqNQ==" - "resolved" "https://registry.npmjs.org/bcryptjs/-/bcryptjs-2.4.3.tgz" - "version" "2.4.3" +bcryptjs@^2.4.3: + version "2.4.3" + resolved "https://registry.npmjs.org/bcryptjs/-/bcryptjs-2.4.3.tgz" + integrity "sha1-mrVie5PmBiH/fNrF2pczAn3x0Ms= sha512-V/Hy/X9Vt7f3BbPJEi8BdVFMByHi+jNXrYkW3huaybV/kQ0KJg0Y6PkEMbn+zeT+i+SiKZ/HMqJGIIt4LZDqNQ==" -"binary-extensions@^2.0.0": - "integrity" "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==" - "resolved" "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz" - "version" "2.2.0" +binary-extensions@^2.0.0: + version "2.2.0" + resolved "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz" + integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== -"bn.js@^4.0.0": - "integrity" "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" - "resolved" "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz" - "version" "4.12.0" +bn.js@^4.0.0: + version "4.12.0" + resolved "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz" + integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== -"body-parser@1.19.1": - "integrity" "sha512-8ljfQi5eBk8EJfECMrgqNGWPEY5jWP+1IzkzkGdFFEwFQZZyaZ21UqdaHktgiMlH0xLHqIFtE/u2OYE5dOtViA==" - "resolved" "https://registry.npmjs.org/body-parser/-/body-parser-1.19.1.tgz" - "version" "1.19.1" +body-parser@1.19.1: + version "1.19.1" + resolved "https://registry.npmjs.org/body-parser/-/body-parser-1.19.1.tgz" + integrity sha512-8ljfQi5eBk8EJfECMrgqNGWPEY5jWP+1IzkzkGdFFEwFQZZyaZ21UqdaHktgiMlH0xLHqIFtE/u2OYE5dOtViA== dependencies: - "bytes" "3.1.1" - "content-type" "~1.0.4" - "debug" "2.6.9" - "depd" "~1.1.2" - "http-errors" "1.8.1" - "iconv-lite" "0.4.24" - "on-finished" "~2.3.0" - "qs" "6.9.6" - "raw-body" "2.4.2" - "type-is" "~1.6.18" + bytes "3.1.1" + content-type "~1.0.4" + debug "2.6.9" + depd "~1.1.2" + http-errors "1.8.1" + iconv-lite "0.4.24" + on-finished "~2.3.0" + qs "6.9.6" + raw-body "2.4.2" + type-is "~1.6.18" -"brace-expansion@^1.1.7": - "integrity" "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==" - "resolved" "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz" - "version" "1.1.11" +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== dependencies: - "balanced-match" "^1.0.0" - "concat-map" "0.0.1" + balanced-match "^1.0.0" + concat-map "0.0.1" -"braces@~3.0.2": - "integrity" "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==" - "resolved" "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz" - "version" "3.0.2" +braces@~3.0.2: + version "3.0.2" + resolved "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== dependencies: - "fill-range" "^7.0.1" + fill-range "^7.0.1" -"buffer-from@^1.0.0": - "integrity" "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" - "resolved" "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz" - "version" "1.1.2" +buffer-from@^1.0.0: + version "1.1.2" + resolved "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz" + integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== -"bytes@3.1.1": - "integrity" "sha512-dWe4nWO/ruEOY7HkUJ5gFt1DCFV9zPRoJr8pV0/ASQermOZjtq8jMjOprC0Kd10GLN+l7xaUPvxzJFWtxGu8Fg==" - "resolved" "https://registry.npmjs.org/bytes/-/bytes-3.1.1.tgz" - "version" "3.1.1" - -"call-bind@^1.0.0", "call-bind@^1.0.2": - "integrity" "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==" - "resolved" "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz" - "version" "1.0.2" +busboy@1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/busboy/-/busboy-1.6.0.tgz#966ea36a9502e43cdb9146962523b92f531f6893" + integrity sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA== dependencies: - "function-bind" "^1.1.1" - "get-intrinsic" "^1.0.2" + streamsearch "^1.1.0" -"chalk@^2.4.2": - "integrity" "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==" - "resolved" "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz" - "version" "2.4.2" - dependencies: - "ansi-styles" "^3.2.1" - "escape-string-regexp" "^1.0.5" - "supports-color" "^5.3.0" +bytes@3.1.1: + version "3.1.1" + resolved "https://registry.npmjs.org/bytes/-/bytes-3.1.1.tgz" + integrity sha512-dWe4nWO/ruEOY7HkUJ5gFt1DCFV9zPRoJr8pV0/ASQermOZjtq8jMjOprC0Kd10GLN+l7xaUPvxzJFWtxGu8Fg== -"character-parser@^2.2.0": - "integrity" "sha1-x84o821LzZdE5f/CxfzeHHMmH8A= sha512-+UqJQjFEFaTAs3bNsF2j2kEN1baG/zghZbdqoYEDxGZtJo9LBzl1A+m0D4n3qKx8N2FNv8/Xp6yV9mQmBuptaw==" - "resolved" "https://registry.npmjs.org/character-parser/-/character-parser-2.2.0.tgz" - "version" "2.2.0" +call-bind@^1.0.0, call-bind@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz" + integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== dependencies: - "is-regex" "^1.0.3" + function-bind "^1.1.1" + get-intrinsic "^1.0.2" -"chokidar@^3.5.1": - "integrity" "sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==" - "resolved" "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz" - "version" "3.5.1" +caniuse-lite@^1.0.30001406: + version "1.0.30001517" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001517.tgz#90fabae294215c3495807eb24fc809e11dc2f0a8" + integrity sha512-Vdhm5S11DaFVLlyiKu4hiUTkpZu+y1KA/rZZqVQfOD5YdDT/eQKlkt7NaE0WGOFgX32diqt9MiP9CAiFeRklaA== + +chalk@^2.4.2: + version "2.4.2" + resolved "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== dependencies: - "anymatch" "~3.1.1" - "braces" "~3.0.2" - "glob-parent" "~5.1.0" - "is-binary-path" "~2.1.0" - "is-glob" "~4.0.1" - "normalize-path" "~3.0.0" - "readdirp" "~3.5.0" + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +character-parser@^2.2.0: + version "2.2.0" + resolved "https://registry.npmjs.org/character-parser/-/character-parser-2.2.0.tgz" + integrity "sha1-x84o821LzZdE5f/CxfzeHHMmH8A= sha512-+UqJQjFEFaTAs3bNsF2j2kEN1baG/zghZbdqoYEDxGZtJo9LBzl1A+m0D4n3qKx8N2FNv8/Xp6yV9mQmBuptaw==" + dependencies: + is-regex "^1.0.3" + +chokidar@^3.5.1: + version "3.5.1" + resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz" + integrity sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw== + dependencies: + anymatch "~3.1.1" + braces "~3.0.2" + glob-parent "~5.1.0" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.5.0" optionalDependencies: - "fsevents" "~2.3.1" + fsevents "~2.3.1" -"color-convert@^1.9.0": - "integrity" "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==" - "resolved" "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz" - "version" "1.9.3" +client-only@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/client-only/-/client-only-0.0.1.tgz#38bba5d403c41ab150bff64a95c85013cf73bca1" + integrity sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA== + +color-convert@^1.9.0: + version "1.9.3" + resolved "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== dependencies: - "color-name" "1.1.3" + color-name "1.1.3" -"color-name@1.1.3": - "integrity" "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" - "resolved" "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz" - "version" "1.1.3" +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz" + integrity "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" -"combined-stream@^1.0.8": - "integrity" "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==" - "resolved" "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz" - "version" "1.0.8" +combined-stream@^1.0.8: + version "1.0.8" + resolved "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz" + integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== dependencies: - "delayed-stream" "~1.0.0" + delayed-stream "~1.0.0" -"concat-map@0.0.1": - "integrity" "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" - "resolved" "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" - "version" "0.0.1" +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" + integrity "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" -"connect-redis@^6.0.0": - "integrity" "sha512-6eGEAAPHYvcfbRNCMmPzBIjrqRWLw7at9lCUH4G6NQ8gwWDJelaUmFNOqPIhehbw941euVmIuqWsaWiKXfb+5g==" - "resolved" "https://registry.npmjs.org/connect-redis/-/connect-redis-6.0.0.tgz" - "version" "6.0.0" +connect-redis@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/connect-redis/-/connect-redis-6.0.0.tgz" + integrity sha512-6eGEAAPHYvcfbRNCMmPzBIjrqRWLw7at9lCUH4G6NQ8gwWDJelaUmFNOqPIhehbw941euVmIuqWsaWiKXfb+5g== -"constantinople@^4.0.1": - "integrity" "sha512-vCrqcSIq4//Gx74TXXCGnHpulY1dskqLTFGDmhrGxzeXL8lF8kvXv6mpNWlJj1uD4DW23D4ljAqbY4RRaaUZIw==" - "resolved" "https://registry.npmjs.org/constantinople/-/constantinople-4.0.1.tgz" - "version" "4.0.1" +constantinople@^4.0.1: + version "4.0.1" + resolved "https://registry.npmjs.org/constantinople/-/constantinople-4.0.1.tgz" + integrity sha512-vCrqcSIq4//Gx74TXXCGnHpulY1dskqLTFGDmhrGxzeXL8lF8kvXv6mpNWlJj1uD4DW23D4ljAqbY4RRaaUZIw== dependencies: "@babel/parser" "^7.6.0" "@babel/types" "^7.6.1" -"content-disposition@0.5.4": - "integrity" "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==" - "resolved" "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz" - "version" "0.5.4" +content-disposition@0.5.4: + version "0.5.4" + resolved "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz" + integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ== dependencies: - "safe-buffer" "5.2.1" + safe-buffer "5.2.1" -"content-type@~1.0.4": - "integrity" "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" - "resolved" "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz" - "version" "1.0.4" +content-type@~1.0.4: + version "1.0.4" + resolved "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz" + integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== -"cookie-signature@1.0.6": - "integrity" "sha1-4wOogrNCzD7oylE6eZmXNNqzriw= sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" - "resolved" "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz" - "version" "1.0.6" +cookie-signature@1.0.6: + version "1.0.6" + resolved "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz" + integrity "sha1-4wOogrNCzD7oylE6eZmXNNqzriw= sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" -"cookie@0.4.1": - "integrity" "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==" - "resolved" "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz" - "version" "0.4.1" +cookie@0.4.1: + version "0.4.1" + resolved "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz" + integrity sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA== -"cors@^2.8.5": - "integrity" "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==" - "resolved" "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz" - "version" "2.8.5" +cors@^2.8.5: + version "2.8.5" + resolved "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz" + integrity sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g== dependencies: - "object-assign" "^4" - "vary" "^1" + object-assign "^4" + vary "^1" -"create-require@^1.1.0": - "integrity" "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==" - "resolved" "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz" - "version" "1.1.1" +create-require@^1.1.0: + version "1.1.1" + resolved "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz" + integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== -"cron@^2.1.0": - "integrity" "sha512-Hq7u3P8y7UWYvsZbSKHHJDVG0VO9O7tp2qljxzTScelcTODBfCme8AIhnZsFwmQ9NchZ3hr2uNr+s3DSms7q6w==" - "resolved" "https://registry.npmjs.org/cron/-/cron-2.1.0.tgz" - "version" "2.1.0" +cron@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/cron/-/cron-2.1.0.tgz" + integrity sha512-Hq7u3P8y7UWYvsZbSKHHJDVG0VO9O7tp2qljxzTScelcTODBfCme8AIhnZsFwmQ9NchZ3hr2uNr+s3DSms7q6w== dependencies: - "luxon" "^1.23.x" + luxon "^1.23.x" -"crypto@^1.0.1": - "integrity" "sha512-VxBKmeNcqQdiUQUW2Tzq0t377b54N2bMtXO/qiLa+6eRRmmC4qT3D4OnTGoT/U6O9aklQ/jTwbOtRMTTY8G0Ig==" - "resolved" "https://registry.npmjs.org/crypto/-/crypto-1.0.1.tgz" - "version" "1.0.1" +crypto@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/crypto/-/crypto-1.0.1.tgz" + integrity sha512-VxBKmeNcqQdiUQUW2Tzq0t377b54N2bMtXO/qiLa+6eRRmmC4qT3D4OnTGoT/U6O9aklQ/jTwbOtRMTTY8G0Ig== -"debug@2.6.9": - "integrity" "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==" - "resolved" "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz" - "version" "2.6.9" +debug@2.6.9: + version "2.6.9" + resolved "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== dependencies: - "ms" "2.0.0" + ms "2.0.0" -"delayed-stream@~1.0.0": - "integrity" "sha1-3zrhmayt+31ECqrgsp4icrJOxhk= sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" - "resolved" "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz" - "version" "1.0.0" +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz" + integrity "sha1-3zrhmayt+31ECqrgsp4icrJOxhk= sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" -"denque@^1.5.0": - "integrity" "sha512-CYiCSgIF1p6EUByQPlGkKnP1M9g0ZV3qMIrqMqZqdwazygIA/YP2vrbcyl1h/WppKJTdl1F85cXIle+394iDAQ==" - "resolved" "https://registry.npmjs.org/denque/-/denque-1.5.0.tgz" - "version" "1.5.0" +denque@^1.5.0: + version "1.5.0" + resolved "https://registry.npmjs.org/denque/-/denque-1.5.0.tgz" + integrity sha512-CYiCSgIF1p6EUByQPlGkKnP1M9g0ZV3qMIrqMqZqdwazygIA/YP2vrbcyl1h/WppKJTdl1F85cXIle+394iDAQ== -"depd@~1.1.2": - "integrity" "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==" - "resolved" "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz" - "version" "1.1.2" +depd@~1.1.2: + version "1.1.2" + resolved "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz" + integrity "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==" -"depd@~2.0.0": - "integrity" "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" - "resolved" "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz" - "version" "2.0.0" +depd@~2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz" + integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== -"destroy@~1.0.4": - "integrity" "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= sha512-3NdhDuEXnfun/z7x9GOElY49LoqVHoGScmOKwmxhsS8N5Y+Z8KyPPDnaSzqWgYt/ji4mqwfTS34Htrk0zPIXVg==" - "resolved" "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz" - "version" "1.0.4" +destroy@~1.0.4: + version "1.0.4" + resolved "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz" + integrity "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= sha512-3NdhDuEXnfun/z7x9GOElY49LoqVHoGScmOKwmxhsS8N5Y+Z8KyPPDnaSzqWgYt/ji4mqwfTS34Htrk0zPIXVg==" -"diff@^4.0.1": - "integrity" "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==" - "resolved" "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz" - "version" "4.0.2" +diff@^4.0.1: + version "4.0.2" + resolved "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz" + integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== -"doctypes@^1.1.0": - "integrity" "sha1-6oCxBqh1OHdOijpKWv4pPeSJ4Kk= sha512-LLBi6pEqS6Do3EKQ3J0NqHWV5hhb78Pi8vvESYwyOy2c31ZEZVdtitdzsQsKb7878PEERhzUk0ftqGhG6Mz+pQ==" - "resolved" "https://registry.npmjs.org/doctypes/-/doctypes-1.1.0.tgz" - "version" "1.1.0" +doctypes@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/doctypes/-/doctypes-1.1.0.tgz" + integrity "sha1-6oCxBqh1OHdOijpKWv4pPeSJ4Kk= sha512-LLBi6pEqS6Do3EKQ3J0NqHWV5hhb78Pi8vvESYwyOy2c31ZEZVdtitdzsQsKb7878PEERhzUk0ftqGhG6Mz+pQ==" -"dynamic-dedupe@^0.3.0": - "integrity" "sha512-ssuANeD+z97meYOqd50e04Ze5qp4bPqo8cCkI4TRjZkzAUgIDTrXV1R8QCdINpiI+hw14+rYazvTRdQrz0/rFQ==" - "resolved" "https://registry.npmjs.org/dynamic-dedupe/-/dynamic-dedupe-0.3.0.tgz" - "version" "0.3.0" +dynamic-dedupe@^0.3.0: + version "0.3.0" + resolved "https://registry.npmjs.org/dynamic-dedupe/-/dynamic-dedupe-0.3.0.tgz" + integrity sha512-ssuANeD+z97meYOqd50e04Ze5qp4bPqo8cCkI4TRjZkzAUgIDTrXV1R8QCdINpiI+hw14+rYazvTRdQrz0/rFQ== dependencies: - "xtend" "^4.0.0" + xtend "^4.0.0" -"ee-first@1.1.1": - "integrity" "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" - "resolved" "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz" - "version" "1.1.1" +ee-first@1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz" + integrity "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" -"ejs@^3.1.6": - "integrity" "sha512-9lt9Zse4hPucPkoP7FHDF0LQAlGyF9JVpnClFLFH3aSSbxmyoqINRpp/9wePWJTUl4KOQwRL72Iw3InHPDkoGw==" - "resolved" "https://registry.npmjs.org/ejs/-/ejs-3.1.6.tgz" - "version" "3.1.6" +ejs@^3.1.6: + version "3.1.6" + resolved "https://registry.npmjs.org/ejs/-/ejs-3.1.6.tgz" + integrity sha512-9lt9Zse4hPucPkoP7FHDF0LQAlGyF9JVpnClFLFH3aSSbxmyoqINRpp/9wePWJTUl4KOQwRL72Iw3InHPDkoGw== dependencies: - "jake" "^10.6.1" + jake "^10.6.1" -"encodeurl@~1.0.2": - "integrity" "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==" - "resolved" "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz" - "version" "1.0.2" +encodeurl@~1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz" + integrity "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==" -"escape-html@~1.0.3": - "integrity" "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" - "resolved" "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz" - "version" "1.0.3" +escape-html@~1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz" + integrity "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" -"escape-string-regexp@^1.0.5": - "integrity" "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==" - "resolved" "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" - "version" "1.0.5" +escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" + integrity "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==" -"etag@~1.8.1": - "integrity" "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==" - "resolved" "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz" - "version" "1.8.1" +etag@~1.8.1: + version "1.8.1" + resolved "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz" + integrity "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==" -"express-session@^1.17.2": - "integrity" "sha512-mPcYcLA0lvh7D4Oqr5aNJFMtBMKPLl++OKKxkHzZ0U0oDq1rpKBnkR5f5vCHR26VeArlTOEF9td4x5IjICksRQ==" - "resolved" "https://registry.npmjs.org/express-session/-/express-session-1.17.2.tgz" - "version" "1.17.2" +express-session@^1.17.2: + version "1.17.2" + resolved "https://registry.npmjs.org/express-session/-/express-session-1.17.2.tgz" + integrity sha512-mPcYcLA0lvh7D4Oqr5aNJFMtBMKPLl++OKKxkHzZ0U0oDq1rpKBnkR5f5vCHR26VeArlTOEF9td4x5IjICksRQ== dependencies: - "cookie" "0.4.1" - "cookie-signature" "1.0.6" - "debug" "2.6.9" - "depd" "~2.0.0" - "on-headers" "~1.0.2" - "parseurl" "~1.3.3" - "safe-buffer" "5.2.1" - "uid-safe" "~2.1.5" + cookie "0.4.1" + cookie-signature "1.0.6" + debug "2.6.9" + depd "~2.0.0" + on-headers "~1.0.2" + parseurl "~1.3.3" + safe-buffer "5.2.1" + uid-safe "~2.1.5" -"express@^4.17.2": - "integrity" "sha512-oxlxJxcQlYwqPWKVJJtvQiwHgosH/LrLSPA+H4UxpyvSS6jC5aH+5MoHFM+KABgTOt0APue4w66Ha8jCUo9QGg==" - "resolved" "https://registry.npmjs.org/express/-/express-4.17.2.tgz" - "version" "4.17.2" +express@^4.17.2: + version "4.17.2" + resolved "https://registry.npmjs.org/express/-/express-4.17.2.tgz" + integrity sha512-oxlxJxcQlYwqPWKVJJtvQiwHgosH/LrLSPA+H4UxpyvSS6jC5aH+5MoHFM+KABgTOt0APue4w66Ha8jCUo9QGg== dependencies: - "accepts" "~1.3.7" - "array-flatten" "1.1.1" - "body-parser" "1.19.1" - "content-disposition" "0.5.4" - "content-type" "~1.0.4" - "cookie" "0.4.1" - "cookie-signature" "1.0.6" - "debug" "2.6.9" - "depd" "~1.1.2" - "encodeurl" "~1.0.2" - "escape-html" "~1.0.3" - "etag" "~1.8.1" - "finalhandler" "~1.1.2" - "fresh" "0.5.2" - "merge-descriptors" "1.0.1" - "methods" "~1.1.2" - "on-finished" "~2.3.0" - "parseurl" "~1.3.3" - "path-to-regexp" "0.1.7" - "proxy-addr" "~2.0.7" - "qs" "6.9.6" - "range-parser" "~1.2.1" - "safe-buffer" "5.2.1" - "send" "0.17.2" - "serve-static" "1.14.2" - "setprototypeof" "1.2.0" - "statuses" "~1.5.0" - "type-is" "~1.6.18" - "utils-merge" "1.0.1" - "vary" "~1.1.2" + accepts "~1.3.7" + array-flatten "1.1.1" + body-parser "1.19.1" + content-disposition "0.5.4" + content-type "~1.0.4" + cookie "0.4.1" + cookie-signature "1.0.6" + debug "2.6.9" + depd "~1.1.2" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + finalhandler "~1.1.2" + fresh "0.5.2" + merge-descriptors "1.0.1" + methods "~1.1.2" + on-finished "~2.3.0" + parseurl "~1.3.3" + path-to-regexp "0.1.7" + proxy-addr "~2.0.7" + qs "6.9.6" + range-parser "~1.2.1" + safe-buffer "5.2.1" + send "0.17.2" + serve-static "1.14.2" + setprototypeof "1.2.0" + statuses "~1.5.0" + type-is "~1.6.18" + utils-merge "1.0.1" + vary "~1.1.2" -"filelist@^1.0.1": - "integrity" "sha512-z7O0IS8Plc39rTCq6i6iHxk43duYOn8uFJiWSewIq0Bww1RNybVHSCjahmcC87ZqAm4OTvFzlzeGu3XAzG1ctQ==" - "resolved" "https://registry.npmjs.org/filelist/-/filelist-1.0.2.tgz" - "version" "1.0.2" +filelist@^1.0.1: + version "1.0.2" + resolved "https://registry.npmjs.org/filelist/-/filelist-1.0.2.tgz" + integrity sha512-z7O0IS8Plc39rTCq6i6iHxk43duYOn8uFJiWSewIq0Bww1RNybVHSCjahmcC87ZqAm4OTvFzlzeGu3XAzG1ctQ== dependencies: - "minimatch" "^3.0.4" + minimatch "^3.0.4" -"fill-range@^7.0.1": - "integrity" "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==" - "resolved" "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz" - "version" "7.0.1" +fill-range@^7.0.1: + version "7.0.1" + resolved "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz" + integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== dependencies: - "to-regex-range" "^5.0.1" + to-regex-range "^5.0.1" -"finalhandler@~1.1.2": - "integrity" "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==" - "resolved" "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz" - "version" "1.1.2" +finalhandler@~1.1.2: + version "1.1.2" + resolved "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz" + integrity sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA== dependencies: - "debug" "2.6.9" - "encodeurl" "~1.0.2" - "escape-html" "~1.0.3" - "on-finished" "~2.3.0" - "parseurl" "~1.3.3" - "statuses" "~1.5.0" - "unpipe" "~1.0.0" + debug "2.6.9" + encodeurl "~1.0.2" + escape-html "~1.0.3" + on-finished "~2.3.0" + parseurl "~1.3.3" + statuses "~1.5.0" + unpipe "~1.0.0" -"follow-redirects@^1.10.0": - "integrity" "sha512-HWqDgT7ZEkqRzBvc2s64vSZ/hfOceEol3ac/7tKwzuvEyWx3/4UegXh5oBOIotkGsObyk3xznnSRVADBgWSQVg==" - "resolved" "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.1.tgz" - "version" "1.14.1" +follow-redirects@^1.10.0: + version "1.14.1" + resolved "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.1.tgz" + integrity sha512-HWqDgT7ZEkqRzBvc2s64vSZ/hfOceEol3ac/7tKwzuvEyWx3/4UegXh5oBOIotkGsObyk3xznnSRVADBgWSQVg== -"form-data@^3.0.0": - "integrity" "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==" - "resolved" "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz" - "version" "3.0.1" +form-data@^3.0.0: + version "3.0.1" + resolved "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz" + integrity sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg== dependencies: - "asynckit" "^0.4.0" - "combined-stream" "^1.0.8" - "mime-types" "^2.1.12" + asynckit "^0.4.0" + combined-stream "^1.0.8" + mime-types "^2.1.12" -"forwarded@0.2.0": - "integrity" "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==" - "resolved" "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz" - "version" "0.2.0" +forwarded@0.2.0: + version "0.2.0" + resolved "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz" + integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== -"fp-ts@^2.16.0": - "integrity" "sha512-bLq+KgbiXdTEoT1zcARrWEpa5z6A/8b7PcDW7Gef3NSisQ+VS7ll2Xbf1E+xsgik0rWub/8u0qP/iTTjj+PhxQ==" - "resolved" "https://registry.npmjs.org/fp-ts/-/fp-ts-2.16.0.tgz" - "version" "2.16.0" +fp-ts@^2.16.0: + version "2.16.0" + resolved "https://registry.npmjs.org/fp-ts/-/fp-ts-2.16.0.tgz" + integrity sha512-bLq+KgbiXdTEoT1zcARrWEpa5z6A/8b7PcDW7Gef3NSisQ+VS7ll2Xbf1E+xsgik0rWub/8u0qP/iTTjj+PhxQ== -"fresh@0.5.2": - "integrity" "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==" - "resolved" "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz" - "version" "0.5.2" +fresh@0.5.2: + version "0.5.2" + resolved "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz" + integrity "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==" -"fs-extra@^8.0.1": - "integrity" "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==" - "resolved" "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz" - "version" "8.1.0" +fs-extra@^8.0.1: + version "8.1.0" + resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz" + integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g== dependencies: - "graceful-fs" "^4.2.0" - "jsonfile" "^4.0.0" - "universalify" "^0.1.0" + graceful-fs "^4.2.0" + jsonfile "^4.0.0" + universalify "^0.1.0" -"fs.realpath@^1.0.0": - "integrity" "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" - "resolved" "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" - "version" "1.0.0" +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" + integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== -"fsevents@~2.3.1": - "integrity" "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==" - "resolved" "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz" - "version" "2.3.2" +fsevents@~2.3.1: + version "2.3.2" + resolved "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz" + integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== -"function-bind@^1.1.1": - "integrity" "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" - "resolved" "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz" - "version" "1.1.1" +function-bind@^1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz" + integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== -"get-intrinsic@^1.0.2": - "integrity" "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==" - "resolved" "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz" - "version" "1.1.1" +get-intrinsic@^1.0.2: + version "1.1.1" + resolved "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz" + integrity sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q== dependencies: - "function-bind" "^1.1.1" - "has" "^1.0.3" - "has-symbols" "^1.0.1" + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.1" -"glob-parent@~5.1.0": - "integrity" "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==" - "resolved" "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" - "version" "5.1.2" +glob-parent@~5.1.0: + version "5.1.2" + resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== dependencies: - "is-glob" "^4.0.1" + is-glob "^4.0.1" -"glob@^7.1.3": - "integrity" "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==" - "resolved" "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz" - "version" "7.2.3" +glob-to-regexp@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e" + integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== + +glob@^7.1.3: + version "7.2.3" + resolved "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz" + integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== dependencies: - "fs.realpath" "^1.0.0" - "inflight" "^1.0.4" - "inherits" "2" - "minimatch" "^3.1.1" - "once" "^1.3.0" - "path-is-absolute" "^1.0.0" + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.1.1" + once "^1.3.0" + path-is-absolute "^1.0.0" -"graceful-fs@^4.1.6", "graceful-fs@^4.2.0": - "integrity" "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==" - "resolved" "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz" - "version" "4.2.8" +graceful-fs@^4.1.2: + version "4.2.11" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" + integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== -"has-flag@^3.0.0": - "integrity" "sha1-tdRU3CGZriJWmfNGfloH87lVuv0= sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==" - "resolved" "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz" - "version" "3.0.0" +graceful-fs@^4.1.6, graceful-fs@^4.2.0: + version "4.2.8" + resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz" + integrity sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg== -"has-symbols@^1.0.1", "has-symbols@^1.0.2": - "integrity" "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==" - "resolved" "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz" - "version" "1.0.2" +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz" + integrity "sha1-tdRU3CGZriJWmfNGfloH87lVuv0= sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==" -"has-tostringtag@^1.0.0": - "integrity" "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==" - "resolved" "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz" - "version" "1.0.0" +has-symbols@^1.0.1, has-symbols@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz" + integrity sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw== + +has-tostringtag@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz" + integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ== dependencies: - "has-symbols" "^1.0.2" + has-symbols "^1.0.2" -"has@^1.0.3": - "integrity" "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==" - "resolved" "https://registry.npmjs.org/has/-/has-1.0.3.tgz" - "version" "1.0.3" +has@^1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/has/-/has-1.0.3.tgz" + integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== dependencies: - "function-bind" "^1.1.1" + function-bind "^1.1.1" -"http-errors@1.8.1": - "integrity" "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==" - "resolved" "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz" - "version" "1.8.1" +http-errors@1.8.1: + version "1.8.1" + resolved "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz" + integrity sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g== dependencies: - "depd" "~1.1.2" - "inherits" "2.0.4" - "setprototypeof" "1.2.0" - "statuses" ">= 1.5.0 < 2" - "toidentifier" "1.0.1" + depd "~1.1.2" + inherits "2.0.4" + setprototypeof "1.2.0" + statuses ">= 1.5.0 < 2" + toidentifier "1.0.1" -"iconv-lite@0.4.24": - "integrity" "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==" - "resolved" "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz" - "version" "0.4.24" +iconv-lite@0.4.24: + version "0.4.24" + resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== dependencies: - "safer-buffer" ">= 2.1.2 < 3" + safer-buffer ">= 2.1.2 < 3" -"ieee754@^1.1.12": - "integrity" "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" - "resolved" "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz" - "version" "1.2.1" +ieee754@^1.1.12: + version "1.2.1" + resolved "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz" + integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== -"imurmurhash@^0.1.4": - "integrity" "sha1-khi5srkoojixPcT7a21XbyMUU+o= sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==" - "resolved" "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz" - "version" "0.1.4" +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz" + integrity "sha1-khi5srkoojixPcT7a21XbyMUU+o= sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==" -"inflight@^1.0.4": - "integrity" "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==" - "resolved" "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz" - "version" "1.0.6" +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz" + integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== dependencies: - "once" "^1.3.0" - "wrappy" "1" + once "^1.3.0" + wrappy "1" -"inherits@^2.0.1", "inherits@2", "inherits@2.0.4": - "integrity" "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - "resolved" "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" - "version" "2.0.4" +inherits@2, inherits@2.0.4, inherits@^2.0.1: + version "2.0.4" + resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== -"ipaddr.js@1.9.1": - "integrity" "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" - "resolved" "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz" - "version" "1.9.1" +ipaddr.js@1.9.1: + version "1.9.1" + resolved "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz" + integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== -"is-binary-path@~2.1.0": - "integrity" "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==" - "resolved" "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz" - "version" "2.1.0" +is-binary-path@~2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz" + integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== dependencies: - "binary-extensions" "^2.0.0" + binary-extensions "^2.0.0" -"is-core-module@^2.2.0": - "integrity" "sha512-TXCMSDsEHMEEZ6eCA8rwRDbLu55MRGmrctljsBX/2v1d9/GzqHOxW5c5oPSgrUt2vBFXebu9rGqckXGPWOlYpg==" - "resolved" "https://registry.npmjs.org/is-core-module/-/is-core-module-2.5.0.tgz" - "version" "2.5.0" +is-core-module@^2.2.0: + version "2.5.0" + resolved "https://registry.npmjs.org/is-core-module/-/is-core-module-2.5.0.tgz" + integrity sha512-TXCMSDsEHMEEZ6eCA8rwRDbLu55MRGmrctljsBX/2v1d9/GzqHOxW5c5oPSgrUt2vBFXebu9rGqckXGPWOlYpg== dependencies: - "has" "^1.0.3" + has "^1.0.3" -"is-expression@^4.0.0": - "integrity" "sha512-zMIXX63sxzG3XrkHkrAPvm/OVZVSCPNkwMHU8oTX7/U3AL78I0QXCEICXUM13BIa8TYGZ68PiTKfQz3yaTNr4A==" - "resolved" "https://registry.npmjs.org/is-expression/-/is-expression-4.0.0.tgz" - "version" "4.0.0" +is-expression@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/is-expression/-/is-expression-4.0.0.tgz" + integrity sha512-zMIXX63sxzG3XrkHkrAPvm/OVZVSCPNkwMHU8oTX7/U3AL78I0QXCEICXUM13BIa8TYGZ68PiTKfQz3yaTNr4A== dependencies: - "acorn" "^7.1.1" - "object-assign" "^4.1.1" + acorn "^7.1.1" + object-assign "^4.1.1" -"is-extglob@^2.1.1": - "integrity" "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==" - "resolved" "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz" - "version" "2.1.1" +is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz" + integrity "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==" -"is-glob@^4.0.1", "is-glob@~4.0.1": - "integrity" "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==" - "resolved" "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz" - "version" "4.0.3" +is-glob@^4.0.1, is-glob@~4.0.1: + version "4.0.3" + resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== dependencies: - "is-extglob" "^2.1.1" + is-extglob "^2.1.1" -"is-number@^7.0.0": - "integrity" "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" - "resolved" "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz" - "version" "7.0.0" +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== -"is-promise@^2.0.0": - "integrity" "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==" - "resolved" "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz" - "version" "2.2.2" +is-promise@^2.0.0: + version "2.2.2" + resolved "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz" + integrity sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ== -"is-redirect@^1.0.0": - "integrity" "sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ= sha512-cr/SlUEe5zOGmzvj9bUyC4LVvkNVAXu4GytXLNMr1pny+a65MpQ9IJzFHD5vi7FyJgb4qt27+eS3TuQnqB+RQw==" - "resolved" "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz" - "version" "1.0.0" +is-redirect@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz" + integrity "sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ= sha512-cr/SlUEe5zOGmzvj9bUyC4LVvkNVAXu4GytXLNMr1pny+a65MpQ9IJzFHD5vi7FyJgb4qt27+eS3TuQnqB+RQw==" -"is-regex@^1.0.3": - "integrity" "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==" - "resolved" "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz" - "version" "1.1.4" +is-regex@^1.0.3: + version "1.1.4" + resolved "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz" + integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== dependencies: - "call-bind" "^1.0.2" - "has-tostringtag" "^1.0.0" + call-bind "^1.0.2" + has-tostringtag "^1.0.0" -"is-typedarray@^1.0.0": - "integrity" "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==" - "resolved" "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz" - "version" "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= sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==" -"jake@^10.6.1": - "integrity" "sha512-eLpKyrfG3mzvGE2Du8VoPbeSkRry093+tyNjdYaBbJS9v17knImYGNXQCUV0gLxQtF82m3E8iRb/wdSQZLoq7A==" - "resolved" "https://registry.npmjs.org/jake/-/jake-10.8.2.tgz" - "version" "10.8.2" +jake@^10.6.1: + version "10.8.2" + resolved "https://registry.npmjs.org/jake/-/jake-10.8.2.tgz" + integrity sha512-eLpKyrfG3mzvGE2Du8VoPbeSkRry093+tyNjdYaBbJS9v17knImYGNXQCUV0gLxQtF82m3E8iRb/wdSQZLoq7A== dependencies: - "async" "0.9.x" - "chalk" "^2.4.2" - "filelist" "^1.0.1" - "minimatch" "^3.0.4" + async "0.9.x" + chalk "^2.4.2" + filelist "^1.0.1" + minimatch "^3.0.4" -"js-stringify@^1.0.2": - "integrity" "sha1-Fzb939lyTyijaCrcYjCufk6Weds= sha512-rtS5ATOo2Q5k1G+DADISilDA6lv79zIiwFd6CcjuIxGKLFm5C+RLImRscVap9k55i+MOZwgliw+NejvkLuGD5g==" - "resolved" "https://registry.npmjs.org/js-stringify/-/js-stringify-1.0.2.tgz" - "version" "1.0.2" +js-stringify@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/js-stringify/-/js-stringify-1.0.2.tgz" + integrity "sha1-Fzb939lyTyijaCrcYjCufk6Weds= sha512-rtS5ATOo2Q5k1G+DADISilDA6lv79zIiwFd6CcjuIxGKLFm5C+RLImRscVap9k55i+MOZwgliw+NejvkLuGD5g==" -"jsonfile@^4.0.0": - "integrity" "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss= sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==" - "resolved" "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz" - "version" "4.0.0" +jsonfile@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz" + integrity "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss= sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==" optionalDependencies: - "graceful-fs" "^4.1.6" + graceful-fs "^4.1.6" -"jstransformer@1.0.0": - "integrity" "sha1-7Yvwkh4vPx7U1cGkT2hwntJHIsM= sha512-C9YK3Rf8q6VAPDCCU9fnqo3mAfOH6vUGnMcP4AQAYIEpWtfGLpwOTmZ+igtdK5y+VvI2n3CyYSzy4Qh34eq24A==" - "resolved" "https://registry.npmjs.org/jstransformer/-/jstransformer-1.0.0.tgz" - "version" "1.0.0" +jstransformer@1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/jstransformer/-/jstransformer-1.0.0.tgz" + integrity "sha1-7Yvwkh4vPx7U1cGkT2hwntJHIsM= sha512-C9YK3Rf8q6VAPDCCU9fnqo3mAfOH6vUGnMcP4AQAYIEpWtfGLpwOTmZ+igtdK5y+VvI2n3CyYSzy4Qh34eq24A==" dependencies: - "is-promise" "^2.0.0" - "promise" "^7.0.1" + is-promise "^2.0.0" + promise "^7.0.1" -"kruptein@^2.0.4": - "integrity" "sha512-BTwprBPTzkFT9oTugxKd3WnWrX630MqUDsnmBuoa98eQs12oD4n4TeI0GbpdGcYn/73Xueg2rfnw+oK4dovnJg==" - "resolved" "https://registry.npmjs.org/kruptein/-/kruptein-2.2.3.tgz" - "version" "2.2.3" +kruptein@^2.0.4: + version "2.2.3" + resolved "https://registry.npmjs.org/kruptein/-/kruptein-2.2.3.tgz" + integrity sha512-BTwprBPTzkFT9oTugxKd3WnWrX630MqUDsnmBuoa98eQs12oD4n4TeI0GbpdGcYn/73Xueg2rfnw+oK4dovnJg== dependencies: - "asn1.js" "^5.4.1" + asn1.js "^5.4.1" -"lokijs@^1.5.12": - "integrity" "sha512-Q5ALD6JiS6xAUWCwX3taQmgwxyveCtIIuL08+ml0nHwT3k0S/GIFJN+Hd38b1qYIMaE5X++iqsqWVksz7SYW+Q==" - "resolved" "https://registry.npmjs.org/lokijs/-/lokijs-1.5.12.tgz" - "version" "1.5.12" +lokijs@^1.5.12: + version "1.5.12" + resolved "https://registry.npmjs.org/lokijs/-/lokijs-1.5.12.tgz" + integrity sha512-Q5ALD6JiS6xAUWCwX3taQmgwxyveCtIIuL08+ml0nHwT3k0S/GIFJN+Hd38b1qYIMaE5X++iqsqWVksz7SYW+Q== -"luxon@^1.23.x": - "integrity" "sha512-TfTiyvZhwBYM/7QdAVDh+7dBTBA29v4ik0Ce9zda3Mnf8on1S5KJI8P2jKFZ8+5C0jhmr0KwJEO/Wdpm0VeWJQ==" - "resolved" "https://registry.npmjs.org/luxon/-/luxon-1.28.0.tgz" - "version" "1.28.0" +luxon@^1.23.x: + version "1.28.0" + resolved "https://registry.npmjs.org/luxon/-/luxon-1.28.0.tgz" + integrity sha512-TfTiyvZhwBYM/7QdAVDh+7dBTBA29v4ik0Ce9zda3Mnf8on1S5KJI8P2jKFZ8+5C0jhmr0KwJEO/Wdpm0VeWJQ== -"make-error@^1.1.1": - "integrity" "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==" - "resolved" "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz" - "version" "1.3.6" +make-error@^1.1.1: + version "1.3.6" + resolved "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz" + integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== -"media-typer@0.3.0": - "integrity" "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==" - "resolved" "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz" - "version" "0.3.0" +media-typer@0.3.0: + version "0.3.0" + resolved "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz" + integrity "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==" -"merge-descriptors@1.0.1": - "integrity" "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E= sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" - "resolved" "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz" - "version" "1.0.1" +merge-descriptors@1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz" + integrity "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E= sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" -"methods@~1.1.2": - "integrity" "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==" - "resolved" "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz" - "version" "1.1.2" +methods@~1.1.2: + version "1.1.2" + resolved "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz" + integrity "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==" -"mime-db@1.49.0": - "integrity" "sha512-CIc8j9URtOVApSFCQIF+VBkX1RwXp/oMMOrqdyXSBXq5RWNEsRfyj1kiRnQgmNXmHxPoFIxOroKA3zcU9P+nAA==" - "resolved" "https://registry.npmjs.org/mime-db/-/mime-db-1.49.0.tgz" - "version" "1.49.0" +mime-db@1.49.0: + version "1.49.0" + resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.49.0.tgz" + integrity sha512-CIc8j9URtOVApSFCQIF+VBkX1RwXp/oMMOrqdyXSBXq5RWNEsRfyj1kiRnQgmNXmHxPoFIxOroKA3zcU9P+nAA== -"mime-types@^2.1.12", "mime-types@~2.1.24": - "integrity" "sha512-hJGaVS4G4c9TSMYh2n6SQAGrC4RnfU+daP8G7cSCmaqNjiOoUY0VHCMS42pxnQmVF1GWwFhbHWn3RIxCqTmZ9A==" - "resolved" "https://registry.npmjs.org/mime-types/-/mime-types-2.1.32.tgz" - "version" "2.1.32" +mime-types@^2.1.12, mime-types@~2.1.24: + version "2.1.32" + resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.32.tgz" + integrity sha512-hJGaVS4G4c9TSMYh2n6SQAGrC4RnfU+daP8G7cSCmaqNjiOoUY0VHCMS42pxnQmVF1GWwFhbHWn3RIxCqTmZ9A== dependencies: - "mime-db" "1.49.0" + mime-db "1.49.0" -"mime@1.6.0": - "integrity" "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" - "resolved" "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz" - "version" "1.6.0" +mime@1.6.0: + version "1.6.0" + resolved "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz" + integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== -"minimalistic-assert@^1.0.0": - "integrity" "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" - "resolved" "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz" - "version" "1.0.1" +minimalistic-assert@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz" + integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== -"minimatch@^3.0.4", "minimatch@^3.1.1": - "integrity" "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==" - "resolved" "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz" - "version" "3.1.2" +minimatch@^3.0.4, minimatch@^3.1.1: + version "3.1.2" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== dependencies: - "brace-expansion" "^1.1.7" + brace-expansion "^1.1.7" -"minimist@^1.2.6": - "integrity" "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==" - "resolved" "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz" - "version" "1.2.7" +minimist@^1.2.6: + version "1.2.7" + resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz" + integrity sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g== -"mkdirp@^1.0.4": - "integrity" "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" - "resolved" "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz" - "version" "1.0.4" +mkdirp@^1.0.4: + version "1.0.4" + resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz" + integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== -"ms@2.0.0": - "integrity" "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - "resolved" "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz" - "version" "2.0.0" +ms@2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz" + integrity "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" -"ms@2.1.3": - "integrity" "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - "resolved" "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz" - "version" "2.1.3" +ms@2.1.3: + version "2.1.3" + resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== -"nano@^9.0.3": - "integrity" "sha512-NFI8+6q5ihnozH6qK+BJ+ilnPfZzBhlUswaFgqUvSp2EN5eJ2BMxbzkYiBsN+waa+N95FculCdbneDmzLWfXaQ==" - "resolved" "https://registry.npmjs.org/nano/-/nano-9.0.3.tgz" - "version" "9.0.3" +nano@^9.0.3: + version "9.0.3" + resolved "https://registry.npmjs.org/nano/-/nano-9.0.3.tgz" + integrity sha512-NFI8+6q5ihnozH6qK+BJ+ilnPfZzBhlUswaFgqUvSp2EN5eJ2BMxbzkYiBsN+waa+N95FculCdbneDmzLWfXaQ== dependencies: "@types/tough-cookie" "^4.0.0" - "axios" "^0.21.1" - "axios-cookiejar-support" "^1.0.1" - "qs" "^6.9.4" - "tough-cookie" "^4.0.0" + axios "^0.21.1" + axios-cookiejar-support "^1.0.1" + qs "^6.9.4" + tough-cookie "^4.0.0" -"negotiator@0.6.2": - "integrity" "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" - "resolved" "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz" - "version" "0.6.2" +nanoid@^3.3.4: + version "3.3.6" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.6.tgz#443380c856d6e9f9824267d960b4236ad583ea4c" + integrity sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA== -"node-fetch@^2.6.7": - "integrity" "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==" - "resolved" "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz" - "version" "2.6.7" +negotiator@0.6.2: + version "0.6.2" + resolved "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz" + integrity sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw== + +next@^13.4.12: + version "13.4.12" + resolved "https://registry.yarnpkg.com/next/-/next-13.4.12.tgz#809b21ea0aabbe88ced53252c88c4a5bd5af95df" + integrity sha512-eHfnru9x6NRmTMcjQp6Nz0J4XH9OubmzOa7CkWL+AUrUxpibub3vWwttjduu9No16dug1kq04hiUUpo7J3m3Xw== dependencies: - "whatwg-url" "^5.0.0" + "@next/env" "13.4.12" + "@swc/helpers" "0.5.1" + busboy "1.6.0" + caniuse-lite "^1.0.30001406" + postcss "8.4.14" + styled-jsx "5.1.1" + watchpack "2.4.0" + zod "3.21.4" + optionalDependencies: + "@next/swc-darwin-arm64" "13.4.12" + "@next/swc-darwin-x64" "13.4.12" + "@next/swc-linux-arm64-gnu" "13.4.12" + "@next/swc-linux-arm64-musl" "13.4.12" + "@next/swc-linux-x64-gnu" "13.4.12" + "@next/swc-linux-x64-musl" "13.4.12" + "@next/swc-win32-arm64-msvc" "13.4.12" + "@next/swc-win32-ia32-msvc" "13.4.12" + "@next/swc-win32-x64-msvc" "13.4.12" -"nodemailer@^6.6.3": - "integrity" "sha512-faZFufgTMrphYoDjvyVpbpJcYzwyFnbAMmQtj1lVBYAUSm3SOy2fIdd9+Mr4UxPosBa0JRw9bJoIwQn+nswiew==" - "resolved" "https://registry.npmjs.org/nodemailer/-/nodemailer-6.6.3.tgz" - "version" "6.6.3" - -"normalize-path@^3.0.0", "normalize-path@~3.0.0": - "integrity" "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" - "resolved" "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz" - "version" "3.0.0" - -"oauth@0.9.x": - "integrity" "sha1-vR/vr2hslrdUda7VGWQS/2DPucE= sha512-a5ERWK1kh38ExDEfoO6qUHJb32rd7aYmPHuyCu3Fta/cnICvYmgd2uhuKXvPD+PXB+gCEYYEaQdIRAjCOwAKNA==" - "resolved" "https://registry.npmjs.org/oauth/-/oauth-0.9.15.tgz" - "version" "0.9.15" - -"object-assign@^4", "object-assign@^4.1.1": - "integrity" "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==" - "resolved" "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" - "version" "4.1.1" - -"object-inspect@^1.9.0": - "integrity" "sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg==" - "resolved" "https://registry.npmjs.org/object-inspect/-/object-inspect-1.11.0.tgz" - "version" "1.11.0" - -"on-finished@~2.3.0": - "integrity" "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc= sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==" - "resolved" "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz" - "version" "2.3.0" +node-fetch@^2.6.7: + version "2.6.7" + resolved "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz" + integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ== dependencies: - "ee-first" "1.1.1" + whatwg-url "^5.0.0" -"on-headers@~1.0.2": - "integrity" "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==" - "resolved" "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz" - "version" "1.0.2" +nodemailer@^6.6.3: + version "6.6.3" + resolved "https://registry.npmjs.org/nodemailer/-/nodemailer-6.6.3.tgz" + integrity sha512-faZFufgTMrphYoDjvyVpbpJcYzwyFnbAMmQtj1lVBYAUSm3SOy2fIdd9+Mr4UxPosBa0JRw9bJoIwQn+nswiew== -"once@^1.3.0": - "integrity" "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==" - "resolved" "https://registry.npmjs.org/once/-/once-1.4.0.tgz" - "version" "1.4.0" +normalize-path@^3.0.0, normalize-path@~3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +oauth@0.9.x: + version "0.9.15" + resolved "https://registry.npmjs.org/oauth/-/oauth-0.9.15.tgz" + integrity "sha1-vR/vr2hslrdUda7VGWQS/2DPucE= sha512-a5ERWK1kh38ExDEfoO6qUHJb32rd7aYmPHuyCu3Fta/cnICvYmgd2uhuKXvPD+PXB+gCEYYEaQdIRAjCOwAKNA==" + +object-assign@^4, object-assign@^4.1.1: + version "4.1.1" + resolved "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" + integrity "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==" + +object-inspect@^1.9.0: + version "1.11.0" + resolved "https://registry.npmjs.org/object-inspect/-/object-inspect-1.11.0.tgz" + integrity sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg== + +on-finished@~2.3.0: + version "2.3.0" + resolved "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz" + integrity "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc= sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==" dependencies: - "wrappy" "1" + ee-first "1.1.1" -"parseurl@~1.3.3": - "integrity" "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" - "resolved" "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz" - "version" "1.3.3" +on-headers@~1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz" + integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA== -"passport-github2@^0.1.12": - "integrity" "sha512-3nPUCc7ttF/3HSP/k9sAXjz3SkGv5Nki84I05kSQPo01Jqq1NzJACgMblCK0fGcv9pKCG/KXU3AJRDGLqHLoIw==" - "resolved" "https://registry.npmjs.org/passport-github2/-/passport-github2-0.1.12.tgz" - "version" "0.1.12" +once@^1.3.0: + version "1.4.0" + resolved "https://registry.npmjs.org/once/-/once-1.4.0.tgz" + integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== dependencies: - "passport-oauth2" "1.x.x" + wrappy "1" -"passport-google-oauth@^2.0.0": - "integrity" "sha512-JKxZpBx6wBQXX1/a1s7VmdBgwOugohH+IxCy84aPTZNq/iIPX6u7Mqov1zY7MKRz3niFPol0KJz8zPLBoHKtYA==" - "resolved" "https://registry.npmjs.org/passport-google-oauth/-/passport-google-oauth-2.0.0.tgz" - "version" "2.0.0" +parseurl@~1.3.3: + version "1.3.3" + resolved "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz" + integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== + +passport-github2@^0.1.12: + version "0.1.12" + resolved "https://registry.npmjs.org/passport-github2/-/passport-github2-0.1.12.tgz" + integrity sha512-3nPUCc7ttF/3HSP/k9sAXjz3SkGv5Nki84I05kSQPo01Jqq1NzJACgMblCK0fGcv9pKCG/KXU3AJRDGLqHLoIw== dependencies: - "passport-google-oauth1" "1.x.x" - "passport-google-oauth20" "2.x.x" + passport-oauth2 "1.x.x" -"passport-google-oauth1@1.x.x": - "integrity" "sha1-r3SoA99R7GRvZqRNgigr5vEI4Mw= sha512-qpCEhuflJgYrdg5zZIpAq/K3gTqa1CtHjbubsEsidIdpBPLkEVq6tB1I8kBNcH89RdSiYbnKpCBXAZXX/dtx1Q==" - "resolved" "https://registry.npmjs.org/passport-google-oauth1/-/passport-google-oauth1-1.0.0.tgz" - "version" "1.0.0" +passport-google-oauth1@1.x.x: + version "1.0.0" + resolved "https://registry.npmjs.org/passport-google-oauth1/-/passport-google-oauth1-1.0.0.tgz" + integrity "sha1-r3SoA99R7GRvZqRNgigr5vEI4Mw= sha512-qpCEhuflJgYrdg5zZIpAq/K3gTqa1CtHjbubsEsidIdpBPLkEVq6tB1I8kBNcH89RdSiYbnKpCBXAZXX/dtx1Q==" dependencies: - "passport-oauth1" "1.x.x" + passport-oauth1 "1.x.x" -"passport-google-oauth20@2.x.x": - "integrity" "sha512-KSk6IJ15RoxuGq7D1UKK/8qKhNfzbLeLrG3gkLZ7p4A6DBCcv7xpyQwuXtWdpyR0+E0mwkpjY1VfPOhxQrKzdQ==" - "resolved" "https://registry.npmjs.org/passport-google-oauth20/-/passport-google-oauth20-2.0.0.tgz" - "version" "2.0.0" +passport-google-oauth20@2.x.x: + version "2.0.0" + resolved "https://registry.npmjs.org/passport-google-oauth20/-/passport-google-oauth20-2.0.0.tgz" + integrity sha512-KSk6IJ15RoxuGq7D1UKK/8qKhNfzbLeLrG3gkLZ7p4A6DBCcv7xpyQwuXtWdpyR0+E0mwkpjY1VfPOhxQrKzdQ== dependencies: - "passport-oauth2" "1.x.x" + passport-oauth2 "1.x.x" -"passport-local@^1.0.0": - "integrity" "sha1-H+YyaMkudWBmJkN+O5BmYsFbpu4= sha512-9wCE6qKznvf9mQYYbgJ3sVOHmCWoUNMVFoZzNoznmISbhnNNPhN9xfY3sLmScHMetEJeoY7CXwfhCe7argfQow==" - "resolved" "https://registry.npmjs.org/passport-local/-/passport-local-1.0.0.tgz" - "version" "1.0.0" +passport-google-oauth@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/passport-google-oauth/-/passport-google-oauth-2.0.0.tgz" + integrity sha512-JKxZpBx6wBQXX1/a1s7VmdBgwOugohH+IxCy84aPTZNq/iIPX6u7Mqov1zY7MKRz3niFPol0KJz8zPLBoHKtYA== dependencies: - "passport-strategy" "1.x.x" + passport-google-oauth1 "1.x.x" + passport-google-oauth20 "2.x.x" -"passport-oauth1@1.x.x": - "integrity" "sha512-Sv2YWodC6jN12M/OXwmR4BIXeeIHjjbwYTQw4kS6tHK4zYzSEpxBgSJJnknBjICA5cj0ju3FSnG1XmHgIhYnLg==" - "resolved" "https://registry.npmjs.org/passport-oauth1/-/passport-oauth1-1.2.0.tgz" - "version" "1.2.0" +passport-local@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/passport-local/-/passport-local-1.0.0.tgz" + integrity "sha1-H+YyaMkudWBmJkN+O5BmYsFbpu4= sha512-9wCE6qKznvf9mQYYbgJ3sVOHmCWoUNMVFoZzNoznmISbhnNNPhN9xfY3sLmScHMetEJeoY7CXwfhCe7argfQow==" dependencies: - "oauth" "0.9.x" - "passport-strategy" "1.x.x" - "utils-merge" "1.x.x" + passport-strategy "1.x.x" -"passport-oauth2@1.x.x": - "integrity" "sha512-emXPLqLcVEcLFR/QvQXZcwLmfK8e9CqvMgmOFJxcNT3okSFMtUbRRKpY20x5euD+01uHsjjCa07DYboEeLXYiw==" - "resolved" "https://registry.npmjs.org/passport-oauth2/-/passport-oauth2-1.6.0.tgz" - "version" "1.6.0" +passport-oauth1@1.x.x: + version "1.2.0" + resolved "https://registry.npmjs.org/passport-oauth1/-/passport-oauth1-1.2.0.tgz" + integrity sha512-Sv2YWodC6jN12M/OXwmR4BIXeeIHjjbwYTQw4kS6tHK4zYzSEpxBgSJJnknBjICA5cj0ju3FSnG1XmHgIhYnLg== dependencies: - "base64url" "3.x.x" - "oauth" "0.9.x" - "passport-strategy" "1.x.x" - "uid2" "0.0.x" - "utils-merge" "1.x.x" + oauth "0.9.x" + passport-strategy "1.x.x" + utils-merge "1.x.x" -"passport-strategy@1.x.x": - "integrity" "sha1-tVOaqPwiWj0a0XlHbd8ja0QPUuQ= sha512-CB97UUvDKJde2V0KDWWB3lyf6PC3FaZP7YxZ2G8OAtn9p4HI9j9JLP9qjOGZFvyl8uwNT8qM+hGnz/n16NI7oA==" - "resolved" "https://registry.npmjs.org/passport-strategy/-/passport-strategy-1.0.0.tgz" - "version" "1.0.0" - -"passport-twitter@^1.0.4": - "integrity" "sha1-AaeZ4fdgvy3knyul+6MigvGJMtc= sha512-qvdauqCqCJJci82mJ9hZZQ6nAv7aSHV31svL8+9H7mRlDdXCdfU6AARQrmmJu3DRmv9fvIebM7zzxR7mVufN3A==" - "resolved" "https://registry.npmjs.org/passport-twitter/-/passport-twitter-1.0.4.tgz" - "version" "1.0.4" +passport-oauth2@1.x.x: + version "1.6.0" + resolved "https://registry.npmjs.org/passport-oauth2/-/passport-oauth2-1.6.0.tgz" + integrity sha512-emXPLqLcVEcLFR/QvQXZcwLmfK8e9CqvMgmOFJxcNT3okSFMtUbRRKpY20x5euD+01uHsjjCa07DYboEeLXYiw== dependencies: - "passport-oauth1" "1.x.x" - "xtraverse" "0.1.x" + base64url "3.x.x" + oauth "0.9.x" + passport-strategy "1.x.x" + uid2 "0.0.x" + utils-merge "1.x.x" -"passport@^0.4.1": - "integrity" "sha512-IxXgZZs8d7uFSt3eqNjM9NQ3g3uQCW5avD8mRNoXV99Yig50vjuaez6dQK2qC0kVWPRTujxY0dWgGfT09adjYg==" - "resolved" "https://registry.npmjs.org/passport/-/passport-0.4.1.tgz" - "version" "0.4.1" +passport-strategy@1.x.x: + version "1.0.0" + resolved "https://registry.npmjs.org/passport-strategy/-/passport-strategy-1.0.0.tgz" + integrity "sha1-tVOaqPwiWj0a0XlHbd8ja0QPUuQ= sha512-CB97UUvDKJde2V0KDWWB3lyf6PC3FaZP7YxZ2G8OAtn9p4HI9j9JLP9qjOGZFvyl8uwNT8qM+hGnz/n16NI7oA==" + +passport-twitter@^1.0.4: + version "1.0.4" + resolved "https://registry.npmjs.org/passport-twitter/-/passport-twitter-1.0.4.tgz" + integrity "sha1-AaeZ4fdgvy3knyul+6MigvGJMtc= sha512-qvdauqCqCJJci82mJ9hZZQ6nAv7aSHV31svL8+9H7mRlDdXCdfU6AARQrmmJu3DRmv9fvIebM7zzxR7mVufN3A==" dependencies: - "passport-strategy" "1.x.x" - "pause" "0.0.1" + passport-oauth1 "1.x.x" + xtraverse "0.1.x" -"path-is-absolute@^1.0.0": - "integrity" "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==" - "resolved" "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" - "version" "1.0.1" - -"path-parse@^1.0.6": - "integrity" "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" - "resolved" "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz" - "version" "1.0.7" - -"path-to-regexp@0.1.7": - "integrity" "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w= sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" - "resolved" "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz" - "version" "0.1.7" - -"pause@0.0.1": - "integrity" "sha1-HUCLP9t2kjuVQ9lvtMnf1TXZy10= sha512-KG8UEiEVkR3wGEb4m5yZkVCzigAD+cVEJck2CzYZO37ZGJfctvVptVO192MwrtPhzONn6go8ylnOdMhKqi4nfg==" - "resolved" "https://registry.npmjs.org/pause/-/pause-0.0.1.tgz" - "version" "0.0.1" - -"pbf@^3.2.1": - "integrity" "sha512-ClrV7pNOn7rtmoQVF4TS1vyU0WhYRnP92fzbfF75jAIwpnzdJXf8iTd4CMEqO4yUenH6NDqLiwjqlh6QgZzgLQ==" - "resolved" "https://registry.npmjs.org/pbf/-/pbf-3.2.1.tgz" - "version" "3.2.1" +passport@^0.4.1: + version "0.4.1" + resolved "https://registry.npmjs.org/passport/-/passport-0.4.1.tgz" + integrity sha512-IxXgZZs8d7uFSt3eqNjM9NQ3g3uQCW5avD8mRNoXV99Yig50vjuaez6dQK2qC0kVWPRTujxY0dWgGfT09adjYg== dependencies: - "ieee754" "^1.1.12" - "resolve-protobuf-schema" "^2.1.0" + passport-strategy "1.x.x" + pause "0.0.1" -"picomatch@^2.0.4", "picomatch@^2.2.1": - "integrity" "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" - "resolved" "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz" - "version" "2.3.1" +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" + integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== -"pify@^5.0.0": - "integrity" "sha512-eW/gHNMlxdSP6dmG6uJip6FXN0EQBwm2clYYd8Wul42Cwu/DK8HEftzsapcNdYe2MfLiIwZqsDk2RDEsTE79hA==" - "resolved" "https://registry.npmjs.org/pify/-/pify-5.0.0.tgz" - "version" "5.0.0" +path-parse@^1.0.6: + version "1.0.7" + resolved "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== -"promise@^7.0.1": - "integrity" "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==" - "resolved" "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz" - "version" "7.3.1" +path-to-regexp@0.1.7: + version "0.1.7" + resolved "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz" + integrity "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w= sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" + +pause@0.0.1: + version "0.0.1" + resolved "https://registry.npmjs.org/pause/-/pause-0.0.1.tgz" + integrity "sha1-HUCLP9t2kjuVQ9lvtMnf1TXZy10= sha512-KG8UEiEVkR3wGEb4m5yZkVCzigAD+cVEJck2CzYZO37ZGJfctvVptVO192MwrtPhzONn6go8ylnOdMhKqi4nfg==" + +pbf@^3.2.1: + version "3.2.1" + resolved "https://registry.npmjs.org/pbf/-/pbf-3.2.1.tgz" + integrity sha512-ClrV7pNOn7rtmoQVF4TS1vyU0WhYRnP92fzbfF75jAIwpnzdJXf8iTd4CMEqO4yUenH6NDqLiwjqlh6QgZzgLQ== dependencies: - "asap" "~2.0.3" + ieee754 "^1.1.12" + resolve-protobuf-schema "^2.1.0" -"protocol-buffers-schema@^3.3.1": - "integrity" "sha512-TdDRD+/QNdrCGCE7v8340QyuXd4kIWIgapsE2+n/SaGiSSbomYl4TjHlvIoCWRpE7wFt02EpB35VVA2ImcBVqw==" - "resolved" "https://registry.npmjs.org/protocol-buffers-schema/-/protocol-buffers-schema-3.6.0.tgz" - "version" "3.6.0" +picocolors@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" + integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== -"proxy-addr@~2.0.7": - "integrity" "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==" - "resolved" "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz" - "version" "2.0.7" +picomatch@^2.0.4, picomatch@^2.2.1: + version "2.3.1" + resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== + +pify@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/pify/-/pify-5.0.0.tgz" + integrity sha512-eW/gHNMlxdSP6dmG6uJip6FXN0EQBwm2clYYd8Wul42Cwu/DK8HEftzsapcNdYe2MfLiIwZqsDk2RDEsTE79hA== + +postcss@8.4.14: + version "8.4.14" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.14.tgz#ee9274d5622b4858c1007a74d76e42e56fd21caf" + integrity sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig== dependencies: - "forwarded" "0.2.0" - "ipaddr.js" "1.9.1" + nanoid "^3.3.4" + picocolors "^1.0.0" + source-map-js "^1.0.2" -"psl@^1.1.33": - "integrity" "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==" - "resolved" "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz" - "version" "1.8.0" - -"pug-attrs@^3.0.0": - "integrity" "sha512-azINV9dUtzPMFQktvTXciNAfAuVh/L/JCl0vtPCwvOA21uZrC08K/UnmrL+SXGEVc1FwzjW62+xw5S/uaLj6cA==" - "resolved" "https://registry.npmjs.org/pug-attrs/-/pug-attrs-3.0.0.tgz" - "version" "3.0.0" +promise@^7.0.1: + version "7.3.1" + resolved "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz" + integrity sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg== dependencies: - "constantinople" "^4.0.1" - "js-stringify" "^1.0.2" - "pug-runtime" "^3.0.0" + asap "~2.0.3" -"pug-code-gen@^3.0.2": - "integrity" "sha512-nJMhW16MbiGRiyR4miDTQMRWDgKplnHyeLvioEJYbk1RsPI3FuA3saEP8uwnTb2nTJEKBU90NFVWJBk4OU5qyg==" - "resolved" "https://registry.npmjs.org/pug-code-gen/-/pug-code-gen-3.0.2.tgz" - "version" "3.0.2" +protocol-buffers-schema@^3.3.1: + version "3.6.0" + resolved "https://registry.npmjs.org/protocol-buffers-schema/-/protocol-buffers-schema-3.6.0.tgz" + integrity sha512-TdDRD+/QNdrCGCE7v8340QyuXd4kIWIgapsE2+n/SaGiSSbomYl4TjHlvIoCWRpE7wFt02EpB35VVA2ImcBVqw== + +proxy-addr@~2.0.7: + version "2.0.7" + resolved "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz" + integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== dependencies: - "constantinople" "^4.0.1" - "doctypes" "^1.1.0" - "js-stringify" "^1.0.2" - "pug-attrs" "^3.0.0" - "pug-error" "^2.0.0" - "pug-runtime" "^3.0.0" - "void-elements" "^3.1.0" - "with" "^7.0.0" + forwarded "0.2.0" + ipaddr.js "1.9.1" -"pug-error@^2.0.0": - "integrity" "sha512-sjiUsi9M4RAGHktC1drQfCr5C5eriu24Lfbt4s+7SykztEOwVZtbFk1RRq0tzLxcMxMYTBR+zMQaG07J/btayQ==" - "resolved" "https://registry.npmjs.org/pug-error/-/pug-error-2.0.0.tgz" - "version" "2.0.0" +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== -"pug-filters@^4.0.0": - "integrity" "sha512-yeNFtq5Yxmfz0f9z2rMXGw/8/4i1cCFecw/Q7+D0V2DdtII5UvqE12VaZ2AY7ri6o5RNXiweGH79OCq+2RQU4A==" - "resolved" "https://registry.npmjs.org/pug-filters/-/pug-filters-4.0.0.tgz" - "version" "4.0.0" +pug-attrs@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/pug-attrs/-/pug-attrs-3.0.0.tgz" + integrity sha512-azINV9dUtzPMFQktvTXciNAfAuVh/L/JCl0vtPCwvOA21uZrC08K/UnmrL+SXGEVc1FwzjW62+xw5S/uaLj6cA== dependencies: - "constantinople" "^4.0.1" - "jstransformer" "1.0.0" - "pug-error" "^2.0.0" - "pug-walk" "^2.0.0" - "resolve" "^1.15.1" + constantinople "^4.0.1" + js-stringify "^1.0.2" + pug-runtime "^3.0.0" -"pug-lexer@^5.0.1": - "integrity" "sha512-0I6C62+keXlZPZkOJeVam9aBLVP2EnbeDw3An+k0/QlqdwH6rv8284nko14Na7c0TtqtogfWXcRoFE4O4Ff20w==" - "resolved" "https://registry.npmjs.org/pug-lexer/-/pug-lexer-5.0.1.tgz" - "version" "5.0.1" +pug-code-gen@^3.0.2: + version "3.0.2" + resolved "https://registry.npmjs.org/pug-code-gen/-/pug-code-gen-3.0.2.tgz" + integrity sha512-nJMhW16MbiGRiyR4miDTQMRWDgKplnHyeLvioEJYbk1RsPI3FuA3saEP8uwnTb2nTJEKBU90NFVWJBk4OU5qyg== dependencies: - "character-parser" "^2.2.0" - "is-expression" "^4.0.0" - "pug-error" "^2.0.0" + constantinople "^4.0.1" + doctypes "^1.1.0" + js-stringify "^1.0.2" + pug-attrs "^3.0.0" + pug-error "^2.0.0" + pug-runtime "^3.0.0" + void-elements "^3.1.0" + with "^7.0.0" -"pug-linker@^4.0.0": - "integrity" "sha512-gjD1yzp0yxbQqnzBAdlhbgoJL5qIFJw78juN1NpTLt/mfPJ5VgC4BvkoD3G23qKzJtIIXBbcCt6FioLSFLOHdw==" - "resolved" "https://registry.npmjs.org/pug-linker/-/pug-linker-4.0.0.tgz" - "version" "4.0.0" +pug-error@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/pug-error/-/pug-error-2.0.0.tgz" + integrity sha512-sjiUsi9M4RAGHktC1drQfCr5C5eriu24Lfbt4s+7SykztEOwVZtbFk1RRq0tzLxcMxMYTBR+zMQaG07J/btayQ== + +pug-filters@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/pug-filters/-/pug-filters-4.0.0.tgz" + integrity sha512-yeNFtq5Yxmfz0f9z2rMXGw/8/4i1cCFecw/Q7+D0V2DdtII5UvqE12VaZ2AY7ri6o5RNXiweGH79OCq+2RQU4A== dependencies: - "pug-error" "^2.0.0" - "pug-walk" "^2.0.0" + constantinople "^4.0.1" + jstransformer "1.0.0" + pug-error "^2.0.0" + pug-walk "^2.0.0" + resolve "^1.15.1" -"pug-load@^3.0.0": - "integrity" "sha512-OCjTEnhLWZBvS4zni/WUMjH2YSUosnsmjGBB1An7CsKQarYSWQ0GCVyd4eQPMFJqZ8w9xgs01QdiZXKVjk92EQ==" - "resolved" "https://registry.npmjs.org/pug-load/-/pug-load-3.0.0.tgz" - "version" "3.0.0" +pug-lexer@^5.0.1: + version "5.0.1" + resolved "https://registry.npmjs.org/pug-lexer/-/pug-lexer-5.0.1.tgz" + integrity sha512-0I6C62+keXlZPZkOJeVam9aBLVP2EnbeDw3An+k0/QlqdwH6rv8284nko14Na7c0TtqtogfWXcRoFE4O4Ff20w== dependencies: - "object-assign" "^4.1.1" - "pug-walk" "^2.0.0" + character-parser "^2.2.0" + is-expression "^4.0.0" + pug-error "^2.0.0" -"pug-parser@^6.0.0": - "integrity" "sha512-ukiYM/9cH6Cml+AOl5kETtM9NR3WulyVP2y4HOU45DyMim1IeP/OOiyEWRr6qk5I5klpsBnbuHpwKmTx6WURnw==" - "resolved" "https://registry.npmjs.org/pug-parser/-/pug-parser-6.0.0.tgz" - "version" "6.0.0" +pug-linker@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/pug-linker/-/pug-linker-4.0.0.tgz" + integrity sha512-gjD1yzp0yxbQqnzBAdlhbgoJL5qIFJw78juN1NpTLt/mfPJ5VgC4BvkoD3G23qKzJtIIXBbcCt6FioLSFLOHdw== dependencies: - "pug-error" "^2.0.0" - "token-stream" "1.0.0" + pug-error "^2.0.0" + pug-walk "^2.0.0" -"pug-runtime@^3.0.0", "pug-runtime@^3.0.1": - "integrity" "sha512-L50zbvrQ35TkpHwv0G6aLSuueDRwc/97XdY8kL3tOT0FmhgG7UypU3VztfV/LATAvmUfYi4wNxSajhSAeNN+Kg==" - "resolved" "https://registry.npmjs.org/pug-runtime/-/pug-runtime-3.0.1.tgz" - "version" "3.0.1" - -"pug-strip-comments@^2.0.0": - "integrity" "sha512-zo8DsDpH7eTkPHCXFeAk1xZXJbyoTfdPlNR0bK7rpOMuhBYb0f5qUVCO1xlsitYd3w5FQTK7zpNVKb3rZoUrrQ==" - "resolved" "https://registry.npmjs.org/pug-strip-comments/-/pug-strip-comments-2.0.0.tgz" - "version" "2.0.0" +pug-load@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/pug-load/-/pug-load-3.0.0.tgz" + integrity sha512-OCjTEnhLWZBvS4zni/WUMjH2YSUosnsmjGBB1An7CsKQarYSWQ0GCVyd4eQPMFJqZ8w9xgs01QdiZXKVjk92EQ== dependencies: - "pug-error" "^2.0.0" + object-assign "^4.1.1" + pug-walk "^2.0.0" -"pug-walk@^2.0.0": - "integrity" "sha512-yYELe9Q5q9IQhuvqsZNwA5hfPkMJ8u92bQLIMcsMxf/VADjNtEYptU+inlufAFYcWdHlwNfZOEnOOQrZrcyJCQ==" - "resolved" "https://registry.npmjs.org/pug-walk/-/pug-walk-2.0.0.tgz" - "version" "2.0.0" - -"pug@^3.0.2": - "integrity" "sha512-bp0I/hiK1D1vChHh6EfDxtndHji55XP/ZJKwsRqrz6lRia6ZC2OZbdAymlxdVFwd1L70ebrVJw4/eZ79skrIaw==" - "resolved" "https://registry.npmjs.org/pug/-/pug-3.0.2.tgz" - "version" "3.0.2" +pug-parser@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/pug-parser/-/pug-parser-6.0.0.tgz" + integrity sha512-ukiYM/9cH6Cml+AOl5kETtM9NR3WulyVP2y4HOU45DyMim1IeP/OOiyEWRr6qk5I5klpsBnbuHpwKmTx6WURnw== dependencies: - "pug-code-gen" "^3.0.2" - "pug-filters" "^4.0.0" - "pug-lexer" "^5.0.1" - "pug-linker" "^4.0.0" - "pug-load" "^3.0.0" - "pug-parser" "^6.0.0" - "pug-runtime" "^3.0.1" - "pug-strip-comments" "^2.0.0" + pug-error "^2.0.0" + token-stream "1.0.0" -"punycode@^2.1.1": - "integrity" "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" - "resolved" "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz" - "version" "2.1.1" +pug-runtime@^3.0.0, pug-runtime@^3.0.1: + version "3.0.1" + resolved "https://registry.npmjs.org/pug-runtime/-/pug-runtime-3.0.1.tgz" + integrity sha512-L50zbvrQ35TkpHwv0G6aLSuueDRwc/97XdY8kL3tOT0FmhgG7UypU3VztfV/LATAvmUfYi4wNxSajhSAeNN+Kg== -"qs@^6.11.0": - "integrity" "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==" - "resolved" "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz" - "version" "6.11.0" +pug-strip-comments@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/pug-strip-comments/-/pug-strip-comments-2.0.0.tgz" + integrity sha512-zo8DsDpH7eTkPHCXFeAk1xZXJbyoTfdPlNR0bK7rpOMuhBYb0f5qUVCO1xlsitYd3w5FQTK7zpNVKb3rZoUrrQ== dependencies: - "side-channel" "^1.0.4" + pug-error "^2.0.0" -"qs@^6.9.4", "qs@6.9.6": - "integrity" "sha512-TIRk4aqYLNoJUbd+g2lEdz5kLWIuTMRagAXxl78Q0RiVjAOugHmeKNGdd3cwo/ktpf9aL9epCfFqWDEKysUlLQ==" - "resolved" "https://registry.npmjs.org/qs/-/qs-6.9.6.tgz" - "version" "6.9.6" +pug-walk@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/pug-walk/-/pug-walk-2.0.0.tgz" + integrity sha512-yYELe9Q5q9IQhuvqsZNwA5hfPkMJ8u92bQLIMcsMxf/VADjNtEYptU+inlufAFYcWdHlwNfZOEnOOQrZrcyJCQ== -"rambda@^7.3.0": - "integrity" "sha512-RFVofZYaG2TaVcxjnM0ejdVWf/59rFq1f57OGnjP3GT/bthzFw0GVr5rkP9PKbVlEuF/Y7bOVPLfiiYfxq/EWQ==" - "resolved" "https://registry.npmjs.org/rambda/-/rambda-7.3.0.tgz" - "version" "7.3.0" - -"random-bytes@~1.0.0": - "integrity" "sha1-T2ih3Arli9P7lYSMMDJNt11kNgs= sha512-iv7LhNVO047HzYR3InF6pUcUsPQiHTM1Qal51DcGSuZFBil1aBBWG5eHPNek7bvILMaYJ/8RU1e8w1AMdHmLQQ==" - "resolved" "https://registry.npmjs.org/random-bytes/-/random-bytes-1.0.0.tgz" - "version" "1.0.0" - -"range-parser@~1.2.1": - "integrity" "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" - "resolved" "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz" - "version" "1.2.1" - -"raw-body@2.4.2": - "integrity" "sha512-RPMAFUJP19WIet/99ngh6Iv8fzAbqum4Li7AD6DtGaW2RpMB/11xDoalPiJMTbu6I3hkbMVkATvZrqb9EEqeeQ==" - "resolved" "https://registry.npmjs.org/raw-body/-/raw-body-2.4.2.tgz" - "version" "2.4.2" +pug@^3.0.2: + version "3.0.2" + resolved "https://registry.npmjs.org/pug/-/pug-3.0.2.tgz" + integrity sha512-bp0I/hiK1D1vChHh6EfDxtndHji55XP/ZJKwsRqrz6lRia6ZC2OZbdAymlxdVFwd1L70ebrVJw4/eZ79skrIaw== dependencies: - "bytes" "3.1.1" - "http-errors" "1.8.1" - "iconv-lite" "0.4.24" - "unpipe" "1.0.0" + pug-code-gen "^3.0.2" + pug-filters "^4.0.0" + pug-lexer "^5.0.1" + pug-linker "^4.0.0" + pug-load "^3.0.0" + pug-parser "^6.0.0" + pug-runtime "^3.0.1" + pug-strip-comments "^2.0.0" -"readdirp@~3.5.0": - "integrity" "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==" - "resolved" "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz" - "version" "3.5.0" +punycode@^2.1.1: + version "2.1.1" + resolved "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz" + integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== + +qs@6.9.6, qs@^6.9.4: + version "6.9.6" + resolved "https://registry.npmjs.org/qs/-/qs-6.9.6.tgz" + integrity sha512-TIRk4aqYLNoJUbd+g2lEdz5kLWIuTMRagAXxl78Q0RiVjAOugHmeKNGdd3cwo/ktpf9aL9epCfFqWDEKysUlLQ== + +qs@^6.11.0: + version "6.11.0" + resolved "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz" + integrity sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q== dependencies: - "picomatch" "^2.2.1" + side-channel "^1.0.4" -"redis-commands@^1.7.0": - "integrity" "sha512-nJWqw3bTFy21hX/CPKHth6sfhZbdiHP6bTawSgQBlKOVRG7EZkfHbbHwQJnrE4vsQf0CMNE+3gJ4Fmm16vdVlQ==" - "resolved" "https://registry.npmjs.org/redis-commands/-/redis-commands-1.7.0.tgz" - "version" "1.7.0" +rambda@^7.3.0: + version "7.3.0" + resolved "https://registry.npmjs.org/rambda/-/rambda-7.3.0.tgz" + integrity sha512-RFVofZYaG2TaVcxjnM0ejdVWf/59rFq1f57OGnjP3GT/bthzFw0GVr5rkP9PKbVlEuF/Y7bOVPLfiiYfxq/EWQ== -"redis-errors@^1.0.0", "redis-errors@^1.2.0": - "integrity" "sha1-62LSrbFeTq9GEMBK/hUpOEJQq60= sha512-1qny3OExCf0UvUV/5wpYKf2YwPcOqXzkwKKSmKHiE6ZMQs5heeE/c8eXK+PNllPvmjgAbfnsbpkGZWy8cBpn9w==" - "resolved" "https://registry.npmjs.org/redis-errors/-/redis-errors-1.2.0.tgz" - "version" "1.2.0" +random-bytes@~1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/random-bytes/-/random-bytes-1.0.0.tgz" + integrity "sha1-T2ih3Arli9P7lYSMMDJNt11kNgs= sha512-iv7LhNVO047HzYR3InF6pUcUsPQiHTM1Qal51DcGSuZFBil1aBBWG5eHPNek7bvILMaYJ/8RU1e8w1AMdHmLQQ==" -"redis-parser@^3.0.0": - "integrity" "sha1-tm2CjNyv5rS4pCin3vTGvKwxyLQ= sha512-DJnGAeenTdpMEH6uAJRK/uiyEIH9WVsUmoLwzudwGJUwZPp80PDBWPHXSAGNPwNvIXAbe7MSUB1zQFugFml66A==" - "resolved" "https://registry.npmjs.org/redis-parser/-/redis-parser-3.0.0.tgz" - "version" "3.0.0" +range-parser@~1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz" + integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== + +raw-body@2.4.2: + version "2.4.2" + resolved "https://registry.npmjs.org/raw-body/-/raw-body-2.4.2.tgz" + integrity sha512-RPMAFUJP19WIet/99ngh6Iv8fzAbqum4Li7AD6DtGaW2RpMB/11xDoalPiJMTbu6I3hkbMVkATvZrqb9EEqeeQ== dependencies: - "redis-errors" "^1.0.0" + bytes "3.1.1" + http-errors "1.8.1" + iconv-lite "0.4.24" + unpipe "1.0.0" -"redis@^3.1.2": - "integrity" "sha512-grn5KoZLr/qrRQVwoSkmzdbw6pwF+/rwODtrOr6vuBRiR/f3rjSTGupbF90Zpqm2oenix8Do6RV7pYEkGwlKkw==" - "resolved" "https://registry.npmjs.org/redis/-/redis-3.1.2.tgz" - "version" "3.1.2" +readdirp@~3.5.0: + version "3.5.0" + resolved "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz" + integrity sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ== dependencies: - "denque" "^1.5.0" - "redis-commands" "^1.7.0" - "redis-errors" "^1.2.0" - "redis-parser" "^3.0.0" + picomatch "^2.2.1" -"resolve-protobuf-schema@^2.1.0": - "integrity" "sha512-kI5ffTiZWmJaS/huM8wZfEMer1eRd7oJQhDuxeCLe3t7N7mX3z94CN0xPxBQxFYQTSNz9T0i+v6inKqSdK8xrQ==" - "resolved" "https://registry.npmjs.org/resolve-protobuf-schema/-/resolve-protobuf-schema-2.1.0.tgz" - "version" "2.1.0" +redis-commands@^1.7.0: + version "1.7.0" + resolved "https://registry.npmjs.org/redis-commands/-/redis-commands-1.7.0.tgz" + integrity sha512-nJWqw3bTFy21hX/CPKHth6sfhZbdiHP6bTawSgQBlKOVRG7EZkfHbbHwQJnrE4vsQf0CMNE+3gJ4Fmm16vdVlQ== + +redis-errors@^1.0.0, redis-errors@^1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/redis-errors/-/redis-errors-1.2.0.tgz" + integrity "sha1-62LSrbFeTq9GEMBK/hUpOEJQq60= sha512-1qny3OExCf0UvUV/5wpYKf2YwPcOqXzkwKKSmKHiE6ZMQs5heeE/c8eXK+PNllPvmjgAbfnsbpkGZWy8cBpn9w==" + +redis-parser@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/redis-parser/-/redis-parser-3.0.0.tgz" + integrity "sha1-tm2CjNyv5rS4pCin3vTGvKwxyLQ= sha512-DJnGAeenTdpMEH6uAJRK/uiyEIH9WVsUmoLwzudwGJUwZPp80PDBWPHXSAGNPwNvIXAbe7MSUB1zQFugFml66A==" dependencies: - "protocol-buffers-schema" "^3.3.1" + redis-errors "^1.0.0" -"resolve@^1.0.0", "resolve@^1.15.1": - "integrity" "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==" - "resolved" "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz" - "version" "1.20.0" +redis@^3.1.2: + version "3.1.2" + resolved "https://registry.npmjs.org/redis/-/redis-3.1.2.tgz" + integrity sha512-grn5KoZLr/qrRQVwoSkmzdbw6pwF+/rwODtrOr6vuBRiR/f3rjSTGupbF90Zpqm2oenix8Do6RV7pYEkGwlKkw== dependencies: - "is-core-module" "^2.2.0" - "path-parse" "^1.0.6" + denque "^1.5.0" + redis-commands "^1.7.0" + redis-errors "^1.2.0" + redis-parser "^3.0.0" -"retry@^0.12.0": - "integrity" "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs= sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==" - "resolved" "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz" - "version" "0.12.0" - -"rimraf@^2.6.1": - "integrity" "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==" - "resolved" "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz" - "version" "2.7.1" +resolve-protobuf-schema@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/resolve-protobuf-schema/-/resolve-protobuf-schema-2.1.0.tgz" + integrity sha512-kI5ffTiZWmJaS/huM8wZfEMer1eRd7oJQhDuxeCLe3t7N7mX3z94CN0xPxBQxFYQTSNz9T0i+v6inKqSdK8xrQ== dependencies: - "glob" "^7.1.3" + protocol-buffers-schema "^3.3.1" -"safe-buffer@5.2.1": - "integrity" "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" - "resolved" "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" - "version" "5.2.1" - -"safer-buffer@^2.1.0", "safer-buffer@>= 2.1.2 < 3": - "integrity" "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - "resolved" "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz" - "version" "2.1.2" - -"send@0.17.2": - "integrity" "sha512-UJYB6wFSJE3G00nEivR5rgWp8c2xXvJ3OPWPhmuteU0IKj8nKbG3DrjiOmLwpnHGYWAVwA69zmTm++YG0Hmwww==" - "resolved" "https://registry.npmjs.org/send/-/send-0.17.2.tgz" - "version" "0.17.2" +resolve@^1.0.0, resolve@^1.15.1: + version "1.20.0" + resolved "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz" + integrity sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A== dependencies: - "debug" "2.6.9" - "depd" "~1.1.2" - "destroy" "~1.0.4" - "encodeurl" "~1.0.2" - "escape-html" "~1.0.3" - "etag" "~1.8.1" - "fresh" "0.5.2" - "http-errors" "1.8.1" - "mime" "1.6.0" - "ms" "2.1.3" - "on-finished" "~2.3.0" - "range-parser" "~1.2.1" - "statuses" "~1.5.0" + is-core-module "^2.2.0" + path-parse "^1.0.6" -"serve-static@1.14.2": - "integrity" "sha512-+TMNA9AFxUEGuC0z2mevogSnn9MXKb4fa7ngeRMJaaGv8vTwnIEkKi+QGvPt33HSnf8pRS+WGM0EbMtCJLKMBQ==" - "resolved" "https://registry.npmjs.org/serve-static/-/serve-static-1.14.2.tgz" - "version" "1.14.2" +retry@^0.12.0: + version "0.12.0" + resolved "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz" + integrity "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs= sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==" + +rimraf@^2.6.1: + version "2.7.1" + resolved "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz" + integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== dependencies: - "encodeurl" "~1.0.2" - "escape-html" "~1.0.3" - "parseurl" "~1.3.3" - "send" "0.17.2" + glob "^7.1.3" -"session-file-store@^1.5.0": - "integrity" "sha512-60IZaJNzyu2tIeHutkYE8RiXVx3KRvacOxfLr2Mj92SIsRIroDsH0IlUUR6fJAjoTW4RQISbaOApa2IZpIwFdQ==" - "resolved" "https://registry.npmjs.org/session-file-store/-/session-file-store-1.5.0.tgz" - "version" "1.5.0" +safe-buffer@5.2.1: + version "5.2.1" + resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +"safer-buffer@>= 2.1.2 < 3", 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== + +send@0.17.2: + version "0.17.2" + resolved "https://registry.npmjs.org/send/-/send-0.17.2.tgz" + integrity sha512-UJYB6wFSJE3G00nEivR5rgWp8c2xXvJ3OPWPhmuteU0IKj8nKbG3DrjiOmLwpnHGYWAVwA69zmTm++YG0Hmwww== dependencies: - "bagpipe" "^0.3.5" - "fs-extra" "^8.0.1" - "kruptein" "^2.0.4" - "object-assign" "^4.1.1" - "retry" "^0.12.0" - "write-file-atomic" "3.0.3" + debug "2.6.9" + depd "~1.1.2" + destroy "~1.0.4" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + fresh "0.5.2" + http-errors "1.8.1" + mime "1.6.0" + ms "2.1.3" + on-finished "~2.3.0" + range-parser "~1.2.1" + statuses "~1.5.0" -"setprototypeof@1.2.0": - "integrity" "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" - "resolved" "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz" - "version" "1.2.0" - -"side-channel@^1.0.4": - "integrity" "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==" - "resolved" "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz" - "version" "1.0.4" +serve-static@1.14.2: + version "1.14.2" + resolved "https://registry.npmjs.org/serve-static/-/serve-static-1.14.2.tgz" + integrity sha512-+TMNA9AFxUEGuC0z2mevogSnn9MXKb4fa7ngeRMJaaGv8vTwnIEkKi+QGvPt33HSnf8pRS+WGM0EbMtCJLKMBQ== dependencies: - "call-bind" "^1.0.0" - "get-intrinsic" "^1.0.2" - "object-inspect" "^1.9.0" + encodeurl "~1.0.2" + escape-html "~1.0.3" + parseurl "~1.3.3" + send "0.17.2" -"signal-exit@^3.0.2": - "integrity" "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==" - "resolved" "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz" - "version" "3.0.3" - -"source-map-support@^0.5.12": - "integrity" "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==" - "resolved" "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz" - "version" "0.5.19" +session-file-store@^1.5.0: + version "1.5.0" + resolved "https://registry.npmjs.org/session-file-store/-/session-file-store-1.5.0.tgz" + integrity sha512-60IZaJNzyu2tIeHutkYE8RiXVx3KRvacOxfLr2Mj92SIsRIroDsH0IlUUR6fJAjoTW4RQISbaOApa2IZpIwFdQ== dependencies: - "buffer-from" "^1.0.0" - "source-map" "^0.6.0" + bagpipe "^0.3.5" + fs-extra "^8.0.1" + kruptein "^2.0.4" + object-assign "^4.1.1" + retry "^0.12.0" + write-file-atomic "3.0.3" -"source-map@^0.6.0": - "integrity" "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - "resolved" "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" - "version" "0.6.1" +setprototypeof@1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz" + integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== -"statuses@>= 1.5.0 < 2", "statuses@~1.5.0": - "integrity" "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==" - "resolved" "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz" - "version" "1.5.0" +side-channel@^1.0.4: + version "1.0.4" + resolved "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz" + integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== + dependencies: + call-bind "^1.0.0" + get-intrinsic "^1.0.2" + object-inspect "^1.9.0" -"strip-bom@^3.0.0": - "integrity" "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==" - "resolved" "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz" - "version" "3.0.0" +signal-exit@^3.0.2: + version "3.0.3" + resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz" + integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA== -"strip-json-comments@^2.0.0": - "integrity" "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==" - "resolved" "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz" - "version" "2.0.1" +source-map-js@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" + integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== -"stripe@^10.13.0": - "integrity" "sha512-cXqUdZvrU20KElhLjzw/kW5t2SLLUENqeEftaiQXLogkUdNHyz/L12S4WHmQ8h0KHHFhxO39I7Q9GkJO1MMzzw==" - "resolved" "https://registry.npmjs.org/stripe/-/stripe-10.14.0.tgz" - "version" "10.14.0" +source-map-support@^0.5.12: + version "0.5.19" + resolved "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz" + integrity sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map@^0.6.0: + version "0.6.1" + resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +"statuses@>= 1.5.0 < 2", statuses@~1.5.0: + version "1.5.0" + resolved "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz" + integrity "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==" + +streamsearch@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/streamsearch/-/streamsearch-1.1.0.tgz#404dd1e2247ca94af554e841a8ef0eaa238da764" + integrity sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg== + +strip-bom@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz" + integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== + +strip-json-comments@^2.0.0: + version "2.0.1" + resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz" + integrity sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ== + +stripe@^10.13.0: + version "10.14.0" + resolved "https://registry.npmjs.org/stripe/-/stripe-10.14.0.tgz" + integrity sha512-cXqUdZvrU20KElhLjzw/kW5t2SLLUENqeEftaiQXLogkUdNHyz/L12S4WHmQ8h0KHHFhxO39I7Q9GkJO1MMzzw== dependencies: "@types/node" ">=8.1.0" - "qs" "^6.11.0" + qs "^6.11.0" -"supports-color@^5.3.0": - "integrity" "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==" - "resolved" "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz" - "version" "5.5.0" +styled-jsx@5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/styled-jsx/-/styled-jsx-5.1.1.tgz#839a1c3aaacc4e735fed0781b8619ea5d0009d1f" + integrity sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw== dependencies: - "has-flag" "^3.0.0" + client-only "0.0.1" -"to-fast-properties@^2.0.0": - "integrity" "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4= sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==" - "resolved" "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz" - "version" "2.0.0" - -"to-regex-range@^5.0.1": - "integrity" "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==" - "resolved" "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz" - "version" "5.0.1" +supports-color@^5.3.0: + version "5.5.0" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== dependencies: - "is-number" "^7.0.0" + has-flag "^3.0.0" -"toidentifier@1.0.1": - "integrity" "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==" - "resolved" "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz" - "version" "1.0.1" +to-fast-properties@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz" + integrity "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4= sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==" -"token-stream@1.0.0": - "integrity" "sha1-zCAOqyYT9BZtJ/+a/HylbUnfbrQ= sha512-VSsyNPPW74RpHwR8Fc21uubwHY7wMDeJLys2IX5zJNih+OnAnaifKHo+1LHT7DAdloQ7apeaaWg8l7qnf/TnEg==" - "resolved" "https://registry.npmjs.org/token-stream/-/token-stream-1.0.0.tgz" - "version" "1.0.0" - -"tough-cookie@^4.0.0", "tough-cookie@>=2.3.3": - "integrity" "sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg==" - "resolved" "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.0.0.tgz" - "version" "4.0.0" +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== dependencies: - "psl" "^1.1.33" - "punycode" "^2.1.1" - "universalify" "^0.1.2" + is-number "^7.0.0" -"tr46@~0.0.3": - "integrity" "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" - "resolved" "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz" - "version" "0.0.3" +toidentifier@1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz" + integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== -"tree-kill@^1.2.2": - "integrity" "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==" - "resolved" "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz" - "version" "1.2.2" +token-stream@1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/token-stream/-/token-stream-1.0.0.tgz" + integrity "sha1-zCAOqyYT9BZtJ/+a/HylbUnfbrQ= sha512-VSsyNPPW74RpHwR8Fc21uubwHY7wMDeJLys2IX5zJNih+OnAnaifKHo+1LHT7DAdloQ7apeaaWg8l7qnf/TnEg==" -"ts-node-dev@^2.0.0": - "integrity" "sha512-ywMrhCfH6M75yftYvrvNarLEY+SUXtUvU8/0Z6llrHQVBx12GiFk5sStF8UdfE/yfzk9IAq7O5EEbTQsxlBI8w==" - "resolved" "https://registry.npmjs.org/ts-node-dev/-/ts-node-dev-2.0.0.tgz" - "version" "2.0.0" +tough-cookie@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.0.0.tgz" + integrity sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg== dependencies: - "chokidar" "^3.5.1" - "dynamic-dedupe" "^0.3.0" - "minimist" "^1.2.6" - "mkdirp" "^1.0.4" - "resolve" "^1.0.0" - "rimraf" "^2.6.1" - "source-map-support" "^0.5.12" - "tree-kill" "^1.2.2" - "ts-node" "^10.4.0" - "tsconfig" "^7.0.0" + psl "^1.1.33" + punycode "^2.1.1" + universalify "^0.1.2" -"ts-node@^10.1.0", "ts-node@^10.4.0": - "integrity" "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==" - "resolved" "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz" - "version" "10.9.1" +tr46@~0.0.3: + version "0.0.3" + resolved "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz" + integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== + +tree-kill@^1.2.2: + version "1.2.2" + resolved "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz" + integrity sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A== + +ts-node-dev@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/ts-node-dev/-/ts-node-dev-2.0.0.tgz" + integrity sha512-ywMrhCfH6M75yftYvrvNarLEY+SUXtUvU8/0Z6llrHQVBx12GiFk5sStF8UdfE/yfzk9IAq7O5EEbTQsxlBI8w== + dependencies: + chokidar "^3.5.1" + dynamic-dedupe "^0.3.0" + minimist "^1.2.6" + mkdirp "^1.0.4" + resolve "^1.0.0" + rimraf "^2.6.1" + source-map-support "^0.5.12" + tree-kill "^1.2.2" + ts-node "^10.4.0" + tsconfig "^7.0.0" + +ts-node@^10.1.0, ts-node@^10.4.0: + version "10.9.1" + resolved "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz" + integrity sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw== dependencies: "@cspotcode/source-map-support" "^0.8.0" "@tsconfig/node10" "^1.0.7" "@tsconfig/node12" "^1.0.7" "@tsconfig/node14" "^1.0.0" "@tsconfig/node16" "^1.0.2" - "acorn" "^8.4.1" - "acorn-walk" "^8.1.1" - "arg" "^4.1.0" - "create-require" "^1.1.0" - "diff" "^4.0.1" - "make-error" "^1.1.1" - "v8-compile-cache-lib" "^3.0.1" - "yn" "3.1.1" + acorn "^8.4.1" + acorn-walk "^8.1.1" + arg "^4.1.0" + create-require "^1.1.0" + diff "^4.0.1" + make-error "^1.1.1" + v8-compile-cache-lib "^3.0.1" + yn "3.1.1" -"tsconfig@^7.0.0": - "integrity" "sha512-vZXmzPrL+EmC4T/4rVlT2jNVMWCi/O4DIiSj3UHg1OE5kCKbk4mfrXc6dZksLgRM/TZlKnousKH9bbTazUWRRw==" - "resolved" "https://registry.npmjs.org/tsconfig/-/tsconfig-7.0.0.tgz" - "version" "7.0.0" +tsconfig@^7.0.0: + version "7.0.0" + resolved "https://registry.npmjs.org/tsconfig/-/tsconfig-7.0.0.tgz" + integrity sha512-vZXmzPrL+EmC4T/4rVlT2jNVMWCi/O4DIiSj3UHg1OE5kCKbk4mfrXc6dZksLgRM/TZlKnousKH9bbTazUWRRw== dependencies: "@types/strip-bom" "^3.0.0" "@types/strip-json-comments" "0.0.30" - "strip-bom" "^3.0.0" - "strip-json-comments" "^2.0.0" + strip-bom "^3.0.0" + strip-json-comments "^2.0.0" -"type-is@~1.6.18": - "integrity" "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==" - "resolved" "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz" - "version" "1.6.18" +tslib@^2.4.0: + version "2.6.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.1.tgz#fd8c9a0ff42590b25703c0acb3de3d3f4ede0410" + integrity sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig== + +type-is@~1.6.18: + version "1.6.18" + resolved "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz" + integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== dependencies: - "media-typer" "0.3.0" - "mime-types" "~2.1.24" + media-typer "0.3.0" + mime-types "~2.1.24" -"typedarray-to-buffer@^3.1.5": - "integrity" "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==" - "resolved" "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz" - "version" "3.1.5" +typedarray-to-buffer@^3.1.5: + version "3.1.5" + resolved "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz" + integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q== dependencies: - "is-typedarray" "^1.0.0" + is-typedarray "^1.0.0" -"typescript@*", "typescript@^4.3.5", "typescript@>=2.7": - "integrity" "sha512-DqQgihaQ9cUrskJo9kIyW/+g0Vxsk8cDtZ52a3NGh0YNTfpUSArXSohyUGnvbPazEPLu398C0UxmKSOrPumUzA==" - "resolved" "https://registry.npmjs.org/typescript/-/typescript-4.3.5.tgz" - "version" "4.3.5" +typescript@^4.3.5: + version "4.3.5" + resolved "https://registry.npmjs.org/typescript/-/typescript-4.3.5.tgz" + integrity sha512-DqQgihaQ9cUrskJo9kIyW/+g0Vxsk8cDtZ52a3NGh0YNTfpUSArXSohyUGnvbPazEPLu398C0UxmKSOrPumUzA== -"uid-safe@~2.1.5": - "integrity" "sha512-KPHm4VL5dDXKz01UuEd88Df+KzynaohSL9fBh096KWAxSKZQDI2uBrVqtvRM4rwrIrRRKsdLNML/lnaaVSRioA==" - "resolved" "https://registry.npmjs.org/uid-safe/-/uid-safe-2.1.5.tgz" - "version" "2.1.5" +uid-safe@~2.1.5: + version "2.1.5" + resolved "https://registry.npmjs.org/uid-safe/-/uid-safe-2.1.5.tgz" + integrity sha512-KPHm4VL5dDXKz01UuEd88Df+KzynaohSL9fBh096KWAxSKZQDI2uBrVqtvRM4rwrIrRRKsdLNML/lnaaVSRioA== dependencies: - "random-bytes" "~1.0.0" + random-bytes "~1.0.0" -"uid2@0.0.x": - "integrity" "sha1-SDEm4Rd03y9xuLY53NeZw3YWK4I= sha512-5gSP1liv10Gjp8cMEnFd6shzkL/D6W1uhXSFNCxDC+YI8+L8wkCYCbJ7n77Ezb4wE/xzMogecE+DtamEe9PZjg==" - "resolved" "https://registry.npmjs.org/uid2/-/uid2-0.0.3.tgz" - "version" "0.0.3" +uid2@0.0.x: + version "0.0.3" + resolved "https://registry.npmjs.org/uid2/-/uid2-0.0.3.tgz" + integrity "sha1-SDEm4Rd03y9xuLY53NeZw3YWK4I= sha512-5gSP1liv10Gjp8cMEnFd6shzkL/D6W1uhXSFNCxDC+YI8+L8wkCYCbJ7n77Ezb4wE/xzMogecE+DtamEe9PZjg==" -"universalify@^0.1.0", "universalify@^0.1.2": - "integrity" "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" - "resolved" "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz" - "version" "0.1.2" +universalify@^0.1.0, universalify@^0.1.2: + version "0.1.2" + resolved "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz" + integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== -"unpipe@~1.0.0", "unpipe@1.0.0": - "integrity" "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==" - "resolved" "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz" - "version" "1.0.0" +unpipe@1.0.0, unpipe@~1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz" + integrity "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==" -"utils-merge@1.0.1", "utils-merge@1.x.x": - "integrity" "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==" - "resolved" "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz" - "version" "1.0.1" +utils-merge@1.0.1, utils-merge@1.x.x: + version "1.0.1" + resolved "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz" + integrity "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==" -"uuid@^8.3.2": - "integrity" "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" - "resolved" "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz" - "version" "8.3.2" +uuid@^8.3.2: + version "8.3.2" + resolved "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz" + integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== -"v8-compile-cache-lib@^3.0.1": - "integrity" "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==" - "resolved" "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz" - "version" "3.0.1" +v8-compile-cache-lib@^3.0.1: + version "3.0.1" + resolved "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz" + integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg== -"vary@^1", "vary@~1.1.2": - "integrity" "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==" - "resolved" "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz" - "version" "1.1.2" +vary@^1, vary@~1.1.2: + version "1.1.2" + resolved "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz" + integrity "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==" -"void-elements@^3.1.0": - "integrity" "sha1-YU9/v42AHwu18GYfWy9XhXUOTwk= sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w==" - "resolved" "https://registry.npmjs.org/void-elements/-/void-elements-3.1.0.tgz" - "version" "3.1.0" +void-elements@^3.1.0: + version "3.1.0" + resolved "https://registry.npmjs.org/void-elements/-/void-elements-3.1.0.tgz" + integrity "sha1-YU9/v42AHwu18GYfWy9XhXUOTwk= sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w==" -"webidl-conversions@^3.0.0": - "integrity" "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" - "resolved" "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz" - "version" "3.0.1" - -"whatwg-url@^5.0.0": - "integrity" "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==" - "resolved" "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz" - "version" "5.0.0" +watchpack@2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.4.0.tgz#fa33032374962c78113f93c7f2fb4c54c9862a5d" + integrity sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg== dependencies: - "tr46" "~0.0.3" - "webidl-conversions" "^3.0.0" + glob-to-regexp "^0.4.1" + graceful-fs "^4.1.2" -"with@^7.0.0": - "integrity" "sha512-RNGKj82nUPg3g5ygxkQl0R937xLyho1J24ItRCBTr/m1YnZkzJy1hUiHUJrc/VlsDQzsCnInEGSg3bci0Lmd4w==" - "resolved" "https://registry.npmjs.org/with/-/with-7.0.2.tgz" - "version" "7.0.2" +webidl-conversions@^3.0.0: + version "3.0.1" + resolved "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz" + integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== + +whatwg-url@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz" + integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== + dependencies: + tr46 "~0.0.3" + webidl-conversions "^3.0.0" + +with@^7.0.0: + version "7.0.2" + resolved "https://registry.npmjs.org/with/-/with-7.0.2.tgz" + integrity sha512-RNGKj82nUPg3g5ygxkQl0R937xLyho1J24ItRCBTr/m1YnZkzJy1hUiHUJrc/VlsDQzsCnInEGSg3bci0Lmd4w== dependencies: "@babel/parser" "^7.9.6" "@babel/types" "^7.9.6" - "assert-never" "^1.2.1" - "babel-walk" "3.0.0-canary-5" + assert-never "^1.2.1" + babel-walk "3.0.0-canary-5" -"wrappy@1": - "integrity" "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" - "resolved" "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" - "version" "1.0.2" +wrappy@1: + version "1.0.2" + resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" + integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== -"write-file-atomic@3.0.3": - "integrity" "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==" - "resolved" "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz" - "version" "3.0.3" +write-file-atomic@3.0.3: + version "3.0.3" + resolved "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz" + integrity sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q== dependencies: - "imurmurhash" "^0.1.4" - "is-typedarray" "^1.0.0" - "signal-exit" "^3.0.2" - "typedarray-to-buffer" "^3.1.5" + imurmurhash "^0.1.4" + is-typedarray "^1.0.0" + signal-exit "^3.0.2" + typedarray-to-buffer "^3.1.5" -"xmldom@0.1.x": - "integrity" "sha512-yS2uJflVQs6n+CyjHoaBmVSqIDevTAWrzMmjG1Gc7h1qQ7uVozNhEPJAwZXWyGQ/Gafo3fCwrcaokezLPupVyQ==" - "resolved" "https://registry.npmjs.org/xmldom/-/xmldom-0.1.31.tgz" - "version" "0.1.31" +xmldom@0.1.x: + version "0.1.31" + resolved "https://registry.npmjs.org/xmldom/-/xmldom-0.1.31.tgz" + integrity sha512-yS2uJflVQs6n+CyjHoaBmVSqIDevTAWrzMmjG1Gc7h1qQ7uVozNhEPJAwZXWyGQ/Gafo3fCwrcaokezLPupVyQ== -"xtend@^4.0.0": - "integrity" "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" - "resolved" "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz" - "version" "4.0.2" +xtend@^4.0.0: + version "4.0.2" + resolved "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz" + integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== -"xtraverse@0.1.x": - "integrity" "sha1-t0G60BjveNip0ug63gB7P3lZxzI= sha512-MANQdlG2hl1nQobxz1Rv8hsS1RuBS0C1N6qTOupv+9vmfrReePdxhmB2ecYjvsp4stJ80HD7erjkoF1Hd/FK9A==" - "resolved" "https://registry.npmjs.org/xtraverse/-/xtraverse-0.1.0.tgz" - "version" "0.1.0" +xtraverse@0.1.x: + version "0.1.0" + resolved "https://registry.npmjs.org/xtraverse/-/xtraverse-0.1.0.tgz" + integrity "sha1-t0G60BjveNip0ug63gB7P3lZxzI= sha512-MANQdlG2hl1nQobxz1Rv8hsS1RuBS0C1N6qTOupv+9vmfrReePdxhmB2ecYjvsp4stJ80HD7erjkoF1Hd/FK9A==" dependencies: - "xmldom" "0.1.x" + xmldom "0.1.x" -"yn@3.1.1": - "integrity" "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==" - "resolved" "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz" - "version" "3.1.1" +yn@3.1.1: + version "3.1.1" + resolved "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz" + integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== + +zod@3.21.4: + version "3.21.4" + resolved "https://registry.yarnpkg.com/zod/-/zod-3.21.4.tgz#10882231d992519f0a10b5dd58a38c9dabbb64db" + integrity sha512-m46AKbrzKVzOzs/DZgVnG5H55N1sv1M8qZU3A8RIKbs3mrACDNeIOeilDymVb2HdmP8uwshOCF4uJ8uM9rCqJw== diff --git a/functions/package-lock.json b/functions/package-lock.json index 51439a1..0bc6fba 100644 --- a/functions/package-lock.json +++ b/functions/package-lock.json @@ -7,7 +7,7 @@ "name": "functions", "dependencies": { "@google-cloud/storage": "^5.8.1", - "@lingdocs/inflect": "5.10.1", + "@lingdocs/inflect": "6.0.0", "@types/cors": "^2.8.10", "@types/google-spreadsheet": "^3.0.2", "@types/react": "^18.0.21", @@ -1468,9 +1468,9 @@ } }, "node_modules/@lingdocs/inflect": { - "version": "5.10.1", - "resolved": "https://npm.lingdocs.com/@lingdocs%2finflect/-/inflect-5.10.1.tgz", - "integrity": "sha512-8MPsfQzeerlyT02dz7D7L+AYFrjGOrQB7nMBUXutnLw3/RKhvW99dLImFZKSnCr8DZsEONEp0IVeqxeIUczxog==", + "version": "6.0.0", + "resolved": "https://npm.lingdocs.com/@lingdocs%2finflect/-/inflect-6.0.0.tgz", + "integrity": "sha512-aPvjqOkeKhu60Inbk7uuLooR/9hvUS4rDHyqR5JJPziZMLJ05U5fBTUvehit7stHSRGivskR00uU3liWbXce6g==", "license": "MIT", "dependencies": { "fp-ts": "^2.16.0", @@ -8056,9 +8056,9 @@ } }, "@lingdocs/inflect": { - "version": "5.10.1", - "resolved": "https://npm.lingdocs.com/@lingdocs%2finflect/-/inflect-5.10.1.tgz", - "integrity": "sha512-8MPsfQzeerlyT02dz7D7L+AYFrjGOrQB7nMBUXutnLw3/RKhvW99dLImFZKSnCr8DZsEONEp0IVeqxeIUczxog==", + "version": "6.0.0", + "resolved": "https://npm.lingdocs.com/@lingdocs%2finflect/-/inflect-6.0.0.tgz", + "integrity": "sha512-aPvjqOkeKhu60Inbk7uuLooR/9hvUS4rDHyqR5JJPziZMLJ05U5fBTUvehit7stHSRGivskR00uU3liWbXce6g==", "requires": { "fp-ts": "^2.16.0", "pbf": "^3.2.1", diff --git a/functions/package.json b/functions/package.json index 5ee9888..5afd17d 100644 --- a/functions/package.json +++ b/functions/package.json @@ -15,7 +15,7 @@ "main": "lib/functions/src/index.js", "dependencies": { "@google-cloud/storage": "^5.8.1", - "@lingdocs/inflect": "5.10.1", + "@lingdocs/inflect": "6.0.0", "@types/cors": "^2.8.10", "@types/google-spreadsheet": "^3.0.2", "@types/react": "^18.0.21", diff --git a/functions/src/index.ts b/functions/src/index.ts index d05ead7..1cd0e67 100644 --- a/functions/src/index.ts +++ b/functions/src/index.ts @@ -4,47 +4,59 @@ import { receiveSubmissions } from "./submissions"; import lingdocsAuth from "./middleware/lingdocs-auth"; import publish from "./publish"; -export const publishDictionary = functions.runWith({ +export const publishDictionary = functions + .runWith({ timeoutSeconds: 525, - memory: "2GB" -}).https.onRequest( + memory: "2GB", + }) + .https.onRequest( lingdocsAuth( - async (req, res: functions.Response) => { - if (req.user.level !== "editor") { - res.status(403).send({ ok: false, error: "403 forbidden" }); - return; - } - try { - const response = await publish(); - res.send(response); - } catch (e) { - // @ts-ignore - res.status(500).send({ ok: false, error: e.message }); - } + async ( + req, + res: functions.Response + ) => { + if (req.user.level !== "editor") { + res.status(403).send({ ok: false, error: "403 forbidden" }); + return; } + try { + const response = await publish(); + res.send(response); + } catch (e) { + // @ts-ignore + res.status(500).send({ ok: false, error: e.message }); + } + } ) -); - -export const submissions = functions.runWith({ + ); + +export const submissions = functions + .runWith({ timeoutSeconds: 60, memory: "1GB", -}).https.onRequest(lingdocsAuth( - async (req, res: functions.Response) => { + }) + .https.onRequest( + lingdocsAuth( + async ( + req, + res: functions.Response + ) => { if (!Array.isArray(req.body)) { - res.status(400).send({ - ok: false, - error: "invalid submission", - }); - return; + res.status(400).send({ + ok: false, + error: "invalid submission", + }); + return; } const suggestions = req.body as FT.SubmissionsRequest; try { - const response = await receiveSubmissions(suggestions, true);// req.user.level === "editor"); - // TODO: WARN IF ANY OF THE EDITS DIDN'T HAPPEN - res.send(response); + const response = await receiveSubmissions(suggestions, true); // req.user.level === "editor"); + // TODO: WARN IF ANY OF THE EDITS DIDN'T HAPPEN + res.send(response); } catch (e) { - // @ts-ignore - res.status(500).send({ ok: false, error: e.message }); - }; - }) -); + // @ts-ignore + res.status(500).send({ ok: false, error: e.message }); + } + } + ) + ); diff --git a/functions/src/publish.ts b/functions/src/publish.ts index 6518a91..b0c6eca 100644 --- a/functions/src/publish.ts +++ b/functions/src/publish.ts @@ -1,36 +1,33 @@ import { GoogleSpreadsheet } from "google-spreadsheet"; import * as functions from "firebase-functions"; import { - Types as T, - dictionaryEntryBooleanFields, - dictionaryEntryNumberFields, - dictionaryEntryTextFields, - validateEntry, - writeDictionary, - writeDictionaryInfo, - simplifyPhonetics, - standardizeEntry, + Types as T, + dictionaryEntryBooleanFields, + dictionaryEntryNumberFields, + dictionaryEntryTextFields, + validateEntry, + writeDictionary, + writeDictionaryInfo, + simplifyPhonetics, + standardizeEntry, } from "@lingdocs/inflect"; -import { - getWordList, -} from "./word-list-maker"; -import { - PublishDictionaryResponse, -} from "../../website/src/types/functions-types"; +import { getWordList } from "./word-list-maker"; +import { PublishDictionaryResponse } from "../../website/src/types/functions-types"; import { Storage } from "@google-cloud/storage"; const storage = new Storage({ - projectId: "lingdocs", + projectId: "lingdocs", }); -const title = "LingDocs Pashto Dictionary" -const license = "Copyright © 2021 lingdocs.com All Rights Reserved - Licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License - https://creativecommons.org/licenses/by-nc-sa/4.0/"; +const title = "LingDocs Pashto Dictionary"; +const license = + "Copyright © 2021 lingdocs.com All Rights Reserved - Licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License - https://creativecommons.org/licenses/by-nc-sa/4.0/"; const bucketName = "lingdocs"; const baseUrl = `https://storage.googleapis.com/${bucketName}/`; -const dictionaryFilename = "dict"; -const dictionaryInfoFilename = "dict-info"; +const dictionaryFilename = "dictionary"; +const dictionaryInfoFilename = "dictionary-info"; // const hunspellAffFileFilename = "ps_AFF.aff"; // const hunspellDicFileFilename = "ps_AFF.dic"; -const allWordsJsonFilename = "all-words.json"; +const allWordsJsonFilename = "all-words-dictionary.json"; const url = `${baseUrl}${dictionaryFilename}`; const infoUrl = `${baseUrl}${dictionaryInfoFilename}`; @@ -38,159 +35,173 @@ const infoUrl = `${baseUrl}${dictionaryInfoFilename}`; // to keep the publish function time down export default async function publish(): Promise { - const entries = await getRawEntries(); - const errors = checkForErrors(entries); - if (errors.length) { - return({ ok: false, errors }); - } - // const duplicates = findDuplicates(entries); - // duplicates.forEach((duplicate) => { - // const index = entries.findIndex(e => e.ts === duplicate.ts); - // if (index > -1) entries.splice(index, 1); - // }) - const dictionary: T.Dictionary = { - info: { - title, - license, - url, - infoUrl, - release: new Date().getTime(), - numberOfEntries: entries.length, - }, - entries, - } - uploadDictionaryToStorage(dictionary).catch(console.error); - // TODO: make this async and run after publish response - doHunspellEtc(dictionary.info, entries).catch(console.error); - return { - ok: true, - info: dictionary.info - }; + const entries = await getRawEntries(); + const errors = checkForErrors(entries); + if (errors.length) { + return { ok: false, errors }; + } + // const duplicates = findDuplicates(entries); + // duplicates.forEach((duplicate) => { + // const index = entries.findIndex(e => e.ts === duplicate.ts); + // if (index > -1) entries.splice(index, 1); + // }) + const dictionary: T.Dictionary = { + info: { + title, + license, + url, + infoUrl, + release: new Date().getTime(), + numberOfEntries: entries.length, + }, + entries, + }; + uploadDictionaryToStorage(dictionary).catch(console.error); + // TODO: make this async and run after publish response + doHunspellEtc(dictionary.info, entries).catch(console.error); + return { + ok: true, + info: dictionary.info, + }; } -async function doHunspellEtc(info: T.DictionaryInfo, entries: T.DictionaryEntry[]) { - const wordlistResponse = getWordList(entries); - if (!wordlistResponse.ok) { - throw new Error(JSON.stringify(wordlistResponse.errors)); - } - // const hunspell = makeHunspell(wordlistResponse.wordlist); - // await uploadHunspellToStorage(hunspell); - await uploadAllWordsToStoarage(info, wordlistResponse.wordlist) +async function doHunspellEtc( + info: T.DictionaryInfo, + entries: T.DictionaryEntry[] +) { + const wordlistResponse = getWordList(entries); + if (!wordlistResponse.ok) { + throw new Error(JSON.stringify(wordlistResponse.errors)); + } + // const hunspell = makeHunspell(wordlistResponse.wordlist); + // await uploadHunspellToStorage(hunspell); + await uploadAllWordsToStoarage(info, wordlistResponse.wordlist); } /** * Gets the entries from the spreadsheet, and also deletes duplicate * entries that are sometimes annoyingly created by the GoogleSheets API * when adding entries programmatically - * - * @returns - * + * + * @returns + * */ async function getRows() { - const doc = new GoogleSpreadsheet( - functions.config().sheet.id, - ); - await doc.useServiceAccountAuth({ - client_email: functions.config().serviceacct.email, - private_key: functions.config().serviceacct.key, - }); - await doc.loadInfo(); - const sheet = doc.sheetsByIndex[0]; - const rows = await sheet.getRows(); - rows.sort((a, b) => a.ts > b.ts ? -1 : a.ts < b.ts ? 1 : 0); - return rows; + const doc = new GoogleSpreadsheet(functions.config().sheet.id); + await doc.useServiceAccountAuth({ + client_email: functions.config().serviceacct.email, + private_key: functions.config().serviceacct.key, + }); + await doc.loadInfo(); + const sheet = doc.sheetsByIndex[0]; + const rows = await sheet.getRows(); + rows.sort((a, b) => (a.ts > b.ts ? -1 : a.ts < b.ts ? 1 : 0)); + return rows; } async function getRawEntries(): Promise { - const rows = await getRows(); - async function deleteRow(i: number) { - console.log("WILL DELETE ROW", rows[i].p, rows[i].ts, rows[i].f); - await rows[i].delete(); + const rows = await getRows(); + async function deleteRow(i: number) { + console.log("WILL DELETE ROW", rows[i].p, rows[i].ts, rows[i].f); + await rows[i].delete(); + } + const entries: T.DictionaryEntry[] = []; + let sheetIndex = 0; + // get the rows in order of ts for easy detection of duplicate entries + for (let i = 0; i < rows.length; i++) { + function sameEntry(a: any, b: any): boolean { + return a.p === b.p && a.f === b.f && a.e === b.e; } - const entries: T.DictionaryEntry[] = []; - let sheetIndex = 0; - // get the rows in order of ts for easy detection of duplicate entries - for (let i = 0; i < rows.length; i++) { - function sameEntry(a: any, b: any): boolean { - return a.p === b.p && a.f === b.f && a.e === b.e; - } - sheetIndex++; - const row = rows[i]; - const nextRow = rows[i+1] || undefined; - if (row.ts === nextRow?.ts) { - if (sameEntry(row, nextRow)) { - // this looks like a duplicate entry made by the sheets api - // delete it and keep going - await deleteRow(sheetIndex); - sheetIndex--; - continue; - } else { - throw new Error(`ts ${row.ts} is a duplicate ts of a different entry`); - } - } - const e: T.DictionaryEntry = { - i: 1, - ts: parseInt(row.ts), - p: row.p, - f: row.f, - g: simplifyPhonetics(row.f), - e: row.e, - }; - dictionaryEntryNumberFields.forEach((field: T.DictionaryEntryNumberField) => { - if (row[field]) e[field] = parseInt(row[field]); - }); - dictionaryEntryTextFields.forEach((field: T.DictionaryEntryTextField) => { - if (row[field]) e[field] = row[field].trim(); - }); - dictionaryEntryBooleanFields.forEach((field: T.DictionaryEntryBooleanField) => { - if (row[field]) e[field] = true; - }); - entries.push(standardizeEntry(e)); + sheetIndex++; + const row = rows[i]; + const nextRow = rows[i + 1] || undefined; + if (row.ts === nextRow?.ts) { + if (sameEntry(row, nextRow)) { + // this looks like a duplicate entry made by the sheets api + // delete it and keep going + await deleteRow(sheetIndex); + sheetIndex--; + continue; + } else { + throw new Error(`ts ${row.ts} is a duplicate ts of a different entry`); + } } - // add alphabetical index - entries.sort((a, b) => a.p.localeCompare(b.p, "ps")); - const entriesLength = entries.length; - // add index - for (let i = 0; i < entriesLength; i++) { - entries[i].i = i; - } - return entries; + const e: T.DictionaryEntry = { + i: 1, + ts: parseInt(row.ts), + p: row.p, + f: row.f, + g: simplifyPhonetics(row.f), + e: row.e, + }; + dictionaryEntryNumberFields.forEach( + (field: T.DictionaryEntryNumberField) => { + if (row[field]) e[field] = parseInt(row[field]); + } + ); + dictionaryEntryTextFields.forEach((field: T.DictionaryEntryTextField) => { + if (row[field]) e[field] = row[field].trim(); + }); + dictionaryEntryBooleanFields.forEach( + (field: T.DictionaryEntryBooleanField) => { + if (row[field]) e[field] = true; + } + ); + entries.push(standardizeEntry(e)); + } + // add alphabetical index + entries.sort((a, b) => a.p.localeCompare(b.p, "ps")); + const entriesLength = entries.length; + // add index + for (let i = 0; i < entriesLength; i++) { + entries[i].i = i; + } + return entries; } -function checkForErrors(entries: T.DictionaryEntry[]): T.DictionaryEntryError[] { - return entries.reduce((errors: T.DictionaryEntryError[], entry: T.DictionaryEntry) => { - const response = validateEntry(entry); - if ("errors" in response && response.errors.length) { - return [...errors, response]; +function checkForErrors( + entries: T.DictionaryEntry[] +): T.DictionaryEntryError[] { + return entries.reduce( + (errors: T.DictionaryEntryError[], entry: T.DictionaryEntry) => { + const response = validateEntry(entry); + if ("errors" in response && response.errors.length) { + return [...errors, response]; + } + if ("checkComplement" in response) { + const complement = entries.find((e) => e.ts === entry.l); + if (!complement) { + const error: T.DictionaryEntryError = { + errors: ["complement link not found in dictonary"], + ts: entry.ts, + p: entry.p, + f: entry.f, + e: entry.e, + erroneousFields: ["l"], + }; + return [...errors, error]; } - if ("checkComplement" in response) { - const complement = entries.find((e) => e.ts === entry.l); - if (!complement) { - const error: T.DictionaryEntryError = { - errors: ["complement link not found in dictonary"], - ts: entry.ts, - p: entry.p, - f: entry.f, - e: entry.e, - erroneousFields: ["l"], - }; - return [...errors, error]; - } - if (!complement.c?.includes("n.") && !complement.c?.includes("adj.") && !complement.c?.includes("adv.")) { - const error: T.DictionaryEntryError = { - errors: ["complement link to invalid complement"], - ts: entry.ts, - p: entry.p, - f: entry.f, - e: entry.e, - erroneousFields: ["l"], - }; - return [...errors, error]; - } + if ( + !complement.c?.includes("n.") && + !complement.c?.includes("adj.") && + !complement.c?.includes("adv.") + ) { + const error: T.DictionaryEntryError = { + errors: ["complement link to invalid complement"], + ts: entry.ts, + p: entry.p, + f: entry.f, + e: entry.e, + erroneousFields: ["l"], + }; + return [...errors, error]; } - return errors; - }, []); + } + return errors; + }, + [] + ); } // function findDuplicates(entries: T.DictionaryEntry[]): T.DictionaryEntry[] { @@ -208,20 +219,20 @@ function checkForErrors(entries: T.DictionaryEntry[]): T.DictionaryEntryError[] // } async function upload(content: Buffer | string, filename: string) { - const isBuffer = typeof content !== "string"; - const file = storage.bucket(bucketName).file(filename); - await file.save(content, { - gzip: isBuffer ? false : true, - predefinedAcl: "publicRead", - metadata: { - contentType: isBuffer - ? "application/octet-stream" - : filename.slice(-5) === ".json" - ? "application/json" - : "text/plain; charset=UTF-8", - cacheControl: "no-cache", - }, - }); + const isBuffer = typeof content !== "string"; + const file = storage.bucket(bucketName).file(filename); + await file.save(content, { + gzip: isBuffer ? false : true, + predefinedAcl: "publicRead", + metadata: { + contentType: isBuffer + ? "application/octet-stream" + : filename.slice(-5) === ".json" + ? "application/json" + : "text/plain; charset=UTF-8", + cacheControl: "no-cache", + }, + }); } // async function uploadHunspellToStorage(wordlist: { @@ -234,19 +245,25 @@ async function upload(content: Buffer | string, filename: string) { // ]); // } -async function uploadAllWordsToStoarage(info: T.DictionaryInfo, words: T.PsString[]) { - await upload(JSON.stringify({ info, words } as T.AllWordsWithInflections), allWordsJsonFilename); +async function uploadAllWordsToStoarage( + info: T.DictionaryInfo, + words: T.PsString[] +) { + await upload( + JSON.stringify({ info, words } as T.AllWordsWithInflections), + allWordsJsonFilename + ); } async function uploadDictionaryToStorage(dictionary: T.Dictionary) { - const dictionaryBuffer = writeDictionary(dictionary); - const dictionaryInfoBuffer = writeDictionaryInfo(dictionary.info); - await Promise.all([ - upload(JSON.stringify(dictionary), `${dictionaryFilename}.json`), - upload(JSON.stringify(dictionary.info), `${dictionaryInfoFilename}.json`), - upload(dictionaryBuffer as Buffer, dictionaryFilename), - upload(dictionaryInfoBuffer as Buffer, dictionaryInfoFilename), - ]); + const dictionaryBuffer = writeDictionary(dictionary); + const dictionaryInfoBuffer = writeDictionaryInfo(dictionary.info); + await Promise.all([ + upload(JSON.stringify(dictionary), `${dictionaryFilename}.json`), + upload(JSON.stringify(dictionary.info), `${dictionaryInfoFilename}.json`), + upload(dictionaryBuffer as Buffer, dictionaryFilename), + upload(dictionaryInfoBuffer as Buffer, dictionaryInfoFilename), + ]); } // function makeHunspell(wordlist: string[]) { diff --git a/website/package.json b/website/package.json index 7c7a4b4..8fd9c52 100644 --- a/website/package.json +++ b/website/package.json @@ -7,7 +7,7 @@ "private": true, "dependencies": { "@fortawesome/fontawesome-free": "^5.15.2", - "@lingdocs/ps-react": "5.10.1", + "@lingdocs/ps-react": "6.0.0", "@testing-library/jest-dom": "^5.11.4", "@testing-library/react": "^11.1.0", "@testing-library/user-event": "^12.1.10", diff --git a/website/src/App.css b/website/src/App.css index e9594f8..fbf988a 100644 --- a/website/src/App.css +++ b/website/src/App.css @@ -9,7 +9,7 @@ * { font-family: -apple-system, BlinkMacSystemFont, Segoe UI, Roboto, Oxygen, - Ubuntu, Cantarell, Fira Sans, Droid Sans, Helvetica Neue, sans-serif; + Ubuntu, Cantarell, Fira Sans, Droid Sans, Helvetica Neue, sans-serif; } :root { @@ -36,7 +36,7 @@ --farther: #bbb; --farthest: #999; --high-contrast: #cfcfcf; - + --input-bg: #ccc; } @@ -99,13 +99,23 @@ hr { background-color: var(--closer) !important; color: var(--high-contrast); } + .bg-white { background-color: var(--theme-shade) !important; } /* TODO: better handling of modals across light and dark modes */ -.modal-body, .modal-title { - color:#1d1f25; +.modal-body, +.modal-title { + color: var(--high-contrast); +} + +.modal-content { + background-color: var(--theme-shade); +} + +.modal-content .table { + color: var(--high-contrast); } .table { @@ -310,6 +320,7 @@ input { .entry-suggestion-button { right: 15px; } + .conjugation-search-button { right: 15px; } @@ -339,6 +350,7 @@ input { text-decoration: none; color: var(--farther); } + .clickable:hover { color: var(--farther); } @@ -356,13 +368,13 @@ input { .btn.bg-white:active, .btn.bg-white:hover { - color: #555 !important; + color: #555 !important; } .btn-group.full-width { display: flex; } - + .full-width .btn { flex: 1; } @@ -376,43 +388,49 @@ input { /* Loding animation from https://projects.lukehaas.me/css-loaders/ */ .loader, .loader:after { - border-radius: 50%; - width: 10em; - height: 10em; + border-radius: 50%; + width: 10em; + height: 10em; } + .loader { - margin: 60px auto; - font-size: 10px; - position: relative; - text-indent: -9999em; - border-top: 1.1em solid var(--closer); - border-right: 1.1em solid var(--closer); - border-bottom: 1.1em solid var(--closer); - border-left: 1.1em solid var(--farthest); - -webkit-transform: translateZ(0); - -ms-transform: translateZ(0); - transform: translateZ(0); - -webkit-animation: load8 1.1s infinite linear; - animation: load8 1.1s infinite linear; + margin: 60px auto; + font-size: 10px; + position: relative; + text-indent: -9999em; + border-top: 1.1em solid var(--closer); + border-right: 1.1em solid var(--closer); + border-bottom: 1.1em solid var(--closer); + border-left: 1.1em solid var(--farthest); + -webkit-transform: translateZ(0); + -ms-transform: translateZ(0); + transform: translateZ(0); + -webkit-animation: load8 1.1s infinite linear; + animation: load8 1.1s infinite linear; } + @-webkit-keyframes load8 { - 0% { - -webkit-transform: rotate(0deg); - transform: rotate(0deg); - } - 100% { - -webkit-transform: rotate(360deg); - transform: rotate(360deg); - } + 0% { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); + } + + 100% { + -webkit-transform: rotate(360deg); + transform: rotate(360deg); + } } + @keyframes load8 { - 0% { - -webkit-transform: rotate(0deg); - transform: rotate(0deg); - } - 100% { - -webkit-transform: rotate(360deg); - transform: rotate(360deg); - } + 0% { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); + } + + 100% { + -webkit-transform: rotate(360deg); + transform: rotate(360deg); + } } -/* End of loading animation from https://projects.lukehaas.me/css-loaders/ */ + +/* End of loading animation from https://projects.lukehaas.me/css-loaders/ */ \ No newline at end of file diff --git a/website/src/App.tsx b/website/src/App.tsx index 9805b65..bd332b5 100644 --- a/website/src/App.tsx +++ b/website/src/App.tsx @@ -72,6 +72,7 @@ import PhraseBuilder from "./screens/PhraseBuilder"; import { searchAllInflections } from "./lib/search-all-inflections"; import { addToWordlist } from "./lib/wordlist-database"; import ScriptToPhonetics from "./screens/ScriptToPhonetics"; +import { Modal, Button } from "react-bootstrap"; // to allow Moustrap key combos even when input fields are in focus Mousetrap.prototype.stopCallback = function () { @@ -107,6 +108,7 @@ class App extends Component { this.state = { dictionaryStatus: "loading", dictionaryInfo: undefined, + showModal: false, // TODO: Choose between the saved options and the options in the saved user options: savedOptions ? savedOptions @@ -146,6 +148,8 @@ class App extends Component { this.handleRefreshReviewTasks = this.handleRefreshReviewTasks.bind(this); this.handleDictionaryUpdate = this.handleDictionaryUpdate.bind(this); this.handleInflectionSearch = this.handleInflectionSearch.bind(this); + this.handleShowModal = this.handleShowModal.bind(this); + this.handleCloseModal = this.handleCloseModal.bind(this); } public componentDidMount() { @@ -583,6 +587,14 @@ class App extends Component { }); } + private handleCloseModal() { + this.setState({ showModal: false }); + } + + private handleShowModal() { + this.setState({ showModal: true }); + } + render() { return (
{ >
New words this month
-
+
{ Grammar
+
@@ -816,6 +834,87 @@ class App extends Component { /> )} + + + Phonetics Update! 📰 + + +

+ The phonetics for{" "} + + two of the five ی's have been updated + {" "} + to something much more logical and helpful for pronunciation. +

+
Pure Vowels (mouth stays still)
+ + + + + + + + + + + + + + + + + + + + +
LetterPhoneticsSound
يeelong "ee" like "bee"
ېe +
+ like "ee" but with a slightly more open mouth +
+
+ This is a special vowel not found in English +
+
+
Dipthongs (pure vowel + y)
+ + + + + + + + + + + + + + + + + + + + + + + + + +
LetterPhoneticsSound
یayshort 'a' + y
ۍuy'u' shwa (ə) + y
ئey +
'e' (ې) + y
+
+
+ + + +
); } diff --git a/website/src/lib/dictionary.ts b/website/src/lib/dictionary.ts index aa7aae7..d72050c 100644 --- a/website/src/lib/dictionary.ts +++ b/website/src/lib/dictionary.ts @@ -10,10 +10,10 @@ import { DictionaryDb } from "./dictionary-core"; import sanitizePashto from "./sanitize-pashto"; import fillerWords from "./filler-words"; import { - Types as T, - simplifyPhonetics, - typePredicates as tp, - revertSpelling, + Types as T, + simplifyPhonetics, + typePredicates as tp, + revertSpelling, } from "@lingdocs/ps-react"; import { isPashtoScript } from "./is-pashto"; import { fuzzifyPashto } from "./fuzzify-pashto/fuzzify-pashto"; @@ -21,14 +21,11 @@ import { fuzzifyPashto } from "./fuzzify-pashto/fuzzify-pashto"; import relevancy from "relevancy"; import { makeAWeeBitFuzzy } from "./wee-bit-fuzzy"; import { getTextOptions } from "./get-text-options"; -import { - DictionaryAPI, - State, -} from "../types/dictionary-types"; +import { DictionaryAPI, State } from "../types/dictionary-types"; // const dictionaryBaseUrl = "https://storage.googleapis.com/lingdocs/"; -const dictionaryUrl = `https://storage.googleapis.com/lingdocs/dict`; -const dictionaryInfoUrl = `https://storage.googleapis.com/lingdocs/dict-info`; +const dictionaryUrl = `https://storage.googleapis.com/lingdocs/dictionary`; +const dictionaryInfoUrl = `https://storage.googleapis.com/lingdocs/dictionary-info`; const dictionaryInfoLocalStorageKey = "dictionaryInfo5"; const dictionaryCollectionName = "dictionary3"; @@ -37,17 +34,19 @@ export const pageSize = 35; const relevancySorter = new relevancy.Sorter(); -const db = indexedDB.open('inPrivate'); +const db = indexedDB.open("inPrivate"); db.onerror = (e) => { - console.error(e); - alert("Your browser does not have IndexedDB enabled. This might be because you are using private mode. Please use regular mode or enable IndexedDB to use this dictionary"); -} + console.error(e); + alert( + "Your browser does not have IndexedDB enabled. This might be because you are using private mode. Please use regular mode or enable IndexedDB to use this dictionary" + ); +}; const dictDb = new DictionaryDb({ - url: dictionaryUrl, - infoUrl: dictionaryInfoUrl, - collectionName: dictionaryCollectionName, - infoLocalStorageKey: dictionaryInfoLocalStorageKey, + url: dictionaryUrl, + infoUrl: dictionaryInfoUrl, + collectionName: dictionaryCollectionName, + infoLocalStorageKey: dictionaryInfoLocalStorageKey, }); function makeSearchStringSafe(searchString: string): string { @@ -57,9 +56,10 @@ function makeSearchStringSafe(searchString: string): string { function fuzzifyEnglish(input: string): string { const safeInput = input.trim().replace(/[#-.]|[[-^]|[?|{}]/g, ""); // TODO: Could do: cover british/american things like offense / offence - return safeInput.replace("to ", "") - .replace(/our/g, "ou?r") - .replace(/or/g, "ou?r"); + return safeInput + .replace("to ", "") + .replace(/our/g, "ou?r") + .replace(/or/g, "ou?r"); } function chunkOutArray(arr: T[], chunkSize: number): T[][] { @@ -73,415 +73,465 @@ function chunkOutArray(arr: T[], chunkSize: number): T[][] { function getExpForInflections(input: string, index: "p" | "f"): RegExp { let base = input; if (index === "f") { - if (["e", "é", "a", "á", "ó", "o"].includes(input.slice(-1))) { - base = input.slice(0, -1); - } - return new RegExp(`\\b${base}`); + if (["e", "é", "a", "á", "ó", "o"].includes(input.slice(-1))) { + base = input.slice(0, -1); + } + return new RegExp(`\\b${base}`); } if (["ه", "ې", "و"].includes(input.slice(-1))) { - base = input.slice(0, -1); + base = input.slice(0, -1); } return new RegExp(`^${base}[و|ې|ه]?`); } function tsOneMonthBack(): number { - // https://stackoverflow.com/a/24049314/8620945 - const d = new Date(); - const m = d.getMonth(); - d.setMonth(d.getMonth() - 1); - - // If still in same month, set date to last day of - // previous month - if (d.getMonth() === m) d.setDate(0); - d.setHours(0, 0, 0); - d.setMilliseconds(0); - - // Get the time value in milliseconds and convert to seconds - return d.getTime(); + // https://stackoverflow.com/a/24049314/8620945 + const d = new Date(); + const m = d.getMonth(); + d.setMonth(d.getMonth() - 1); + + // If still in same month, set date to last day of + // previous month + if (d.getMonth() === m) d.setDate(0); + d.setHours(0, 0, 0); + d.setMilliseconds(0); + + // Get the time value in milliseconds and convert to seconds + return d.getTime(); } -function alphabeticalLookup({ searchString, page }: { - searchString: string, - page: number, +function alphabeticalLookup({ + searchString, + page, +}: { + searchString: string; + page: number; }): T.DictionaryEntry[] { - const r = new RegExp("^" + sanitizePashto(makeSearchStringSafe(searchString))); - const regexResults: T.DictionaryEntry[] = dictDb.collection.find({ - $or: [ - {p: { $regex: r }}, - {g: { $regex: r }}, - ], - }); - const indexNumbers = regexResults.map((mpd: any) => mpd.i); - // Find the first matching word occuring first in the Pashto Index - let firstIndexNumber = null; - if (indexNumbers.length) { - firstIndexNumber = Math.min(...indexNumbers); - } - // $gt query from that first occurance - if (firstIndexNumber !== null) { - return dictDb.collection.chain() - .find({ i: { $gt: firstIndexNumber - 1 }}) - .simplesort("i") - .limit(page * pageSize) - .data(); - } - return []; + const r = new RegExp( + "^" + sanitizePashto(makeSearchStringSafe(searchString)) + ); + const regexResults: T.DictionaryEntry[] = dictDb.collection.find({ + $or: [{ p: { $regex: r } }, { g: { $regex: r } }], + }); + const indexNumbers = regexResults.map((mpd: any) => mpd.i); + // Find the first matching word occuring first in the Pashto Index + let firstIndexNumber = null; + if (indexNumbers.length) { + firstIndexNumber = Math.min(...indexNumbers); + } + // $gt query from that first occurance + if (firstIndexNumber !== null) { + return dictDb.collection + .chain() + .find({ i: { $gt: firstIndexNumber - 1 } }) + .simplesort("i") + .limit(page * pageSize) + .data(); + } + return []; } -function fuzzyLookup({ searchString, language, page, tpFilter }: { - searchString: string, - language: "Pashto" | "English" | "Both", - page: number, - tpFilter?: (e: T.DictionaryEntry) => e is S, +function fuzzyLookup({ + searchString, + language, + page, + tpFilter, +}: { + searchString: string; + language: "Pashto" | "English" | "Both"; + page: number; + tpFilter?: (e: T.DictionaryEntry) => e is S; }): S[] { - // TODO: Implement working with both - if (Number(searchString)) { - const entry = dictionary.findOneByTs(Number(searchString)); - // @ts-ignore; - return entry ? [entry] : [] as S[]; - } - return language === "Pashto" - ? pashtoFuzzyLookup({ searchString, page, tpFilter }) - : englishLookup({ searchString, page, tpFilter }) - + // TODO: Implement working with both + if (Number(searchString)) { + const entry = dictionary.findOneByTs(Number(searchString)); + // @ts-ignore; + return entry ? [entry] : ([] as S[]); + } + return language === "Pashto" + ? pashtoFuzzyLookup({ searchString, page, tpFilter }) + : englishLookup({ searchString, page, tpFilter }); } -function englishLookup({ searchString, page, tpFilter }: { - searchString: string, - page: number, - tpFilter?: (e: T.DictionaryEntry) => e is S, +function englishLookup({ + searchString, + page, + tpFilter, +}: { + searchString: string; + page: number; + tpFilter?: (e: T.DictionaryEntry) => e is S; }): S[] { - function sortByR(a: T.DictionaryEntry, b: T.DictionaryEntry) { - return (b.r || 3) - (a.r || 3); - }; - let resultsGiven: number[] = []; - // get exact results - const exactQuery = { - e: { - $regex: new RegExp(`^${fuzzifyEnglish(searchString)}$`, "i"), - }, - }; - const exactResultsLimit = pageSize < 10 ? Math.floor(pageSize / 2) : 10; - const exactResults = dictDb.collection.chain() - .find(exactQuery) - .limit(exactResultsLimit) - .simplesort("i") - .data(); - exactResults.sort(sortByR); - resultsGiven = exactResults.map((mpd: any) => mpd.$loki); - // get results with full word match at beginning of string - const startingQuery = { - e: { - $regex: new RegExp(`^${fuzzifyEnglish(searchString)}\\b`, "i"), - }, - $loki: { $nin: resultsGiven }, - }; - const startingResultsLimit = (pageSize * page) - resultsGiven.length; - const startingResults = dictDb.collection.chain() - .find(startingQuery) - .limit(startingResultsLimit) - .simplesort("i") - .data(); - startingResults.sort(sortByR); - resultsGiven = [...resultsGiven, ...startingResults.map((mpd: any) => mpd.$loki)]; - // get results with full word match anywhere - const fullWordQuery = { - e: { - $regex: new RegExp(`\\b${fuzzifyEnglish(searchString)}\\b`, "i"), - }, - $loki: { $nin: resultsGiven }, - }; - const fullWordResultsLimit = (pageSize * page) - resultsGiven.length; - const fullWordResults = dictDb.collection.chain() - .find(fullWordQuery) - .limit(fullWordResultsLimit) - .simplesort("i") - .data(); - fullWordResults.sort(sortByR); - resultsGiven = [...resultsGiven, ...fullWordResults.map((mpd: any) => mpd.$loki)] - // get results with partial match anywhere - const partialMatchQuery = { - e: { - $regex: new RegExp(`${fuzzifyEnglish(searchString)}`, "i"), - }, - $loki: { $nin: resultsGiven }, - }; - const partialMatchLimit = (pageSize * page) - resultsGiven.length; - const partialMatchResults = dictDb.collection.chain() - .where(tpFilter ? tpFilter : () => true) - .find(partialMatchQuery) - .limit(partialMatchLimit) - .simplesort("i") - .data(); - partialMatchResults.sort(sortByR); - const results = [ - ...exactResults, - ...startingResults, - ...fullWordResults, - ...partialMatchResults, - ]; - if (tpFilter) { - return results.filter(tpFilter); - } - return results; + function sortByR(a: T.DictionaryEntry, b: T.DictionaryEntry) { + return (b.r || 3) - (a.r || 3); + } + let resultsGiven: number[] = []; + // get exact results + const exactQuery = { + e: { + $regex: new RegExp(`^${fuzzifyEnglish(searchString)}$`, "i"), + }, + }; + const exactResultsLimit = pageSize < 10 ? Math.floor(pageSize / 2) : 10; + const exactResults = dictDb.collection + .chain() + .find(exactQuery) + .limit(exactResultsLimit) + .simplesort("i") + .data(); + exactResults.sort(sortByR); + resultsGiven = exactResults.map((mpd: any) => mpd.$loki); + // get results with full word match at beginning of string + const startingQuery = { + e: { + $regex: new RegExp(`^${fuzzifyEnglish(searchString)}\\b`, "i"), + }, + $loki: { $nin: resultsGiven }, + }; + const startingResultsLimit = pageSize * page - resultsGiven.length; + const startingResults = dictDb.collection + .chain() + .find(startingQuery) + .limit(startingResultsLimit) + .simplesort("i") + .data(); + startingResults.sort(sortByR); + resultsGiven = [ + ...resultsGiven, + ...startingResults.map((mpd: any) => mpd.$loki), + ]; + // get results with full word match anywhere + const fullWordQuery = { + e: { + $regex: new RegExp(`\\b${fuzzifyEnglish(searchString)}\\b`, "i"), + }, + $loki: { $nin: resultsGiven }, + }; + const fullWordResultsLimit = pageSize * page - resultsGiven.length; + const fullWordResults = dictDb.collection + .chain() + .find(fullWordQuery) + .limit(fullWordResultsLimit) + .simplesort("i") + .data(); + fullWordResults.sort(sortByR); + resultsGiven = [ + ...resultsGiven, + ...fullWordResults.map((mpd: any) => mpd.$loki), + ]; + // get results with partial match anywhere + const partialMatchQuery = { + e: { + $regex: new RegExp(`${fuzzifyEnglish(searchString)}`, "i"), + }, + $loki: { $nin: resultsGiven }, + }; + const partialMatchLimit = pageSize * page - resultsGiven.length; + const partialMatchResults = dictDb.collection + .chain() + .where(tpFilter ? tpFilter : () => true) + .find(partialMatchQuery) + .limit(partialMatchLimit) + .simplesort("i") + .data(); + partialMatchResults.sort(sortByR); + const results = [ + ...exactResults, + ...startingResults, + ...fullWordResults, + ...partialMatchResults, + ]; + if (tpFilter) { + return results.filter(tpFilter); + } + return results; } function pashtoExactLookup(searchString: string): T.DictionaryEntry[] { - const index = isPashtoScript(searchString) ? "p" : "g"; - const search = index === "g" ? simplifyPhonetics(searchString) : searchString; - return dictDb.collection.find({ - [index]: search, - }); + const index = isPashtoScript(searchString) ? "p" : "g"; + const search = index === "g" ? simplifyPhonetics(searchString) : searchString; + return dictDb.collection.find({ + [index]: search, + }); } -function pashtoFuzzyLookup({ searchString, page, tpFilter }: { - searchString: string, - page: number, - tpFilter?: (e: T.DictionaryEntry) => e is S, +function pashtoFuzzyLookup({ + searchString, + page, + tpFilter, +}: { + searchString: string; + page: number; + tpFilter?: (e: T.DictionaryEntry) => e is S; }): S[] { - let resultsGiven: number[] = []; - // Check if it's in Pashto or Latin script - const searchStringToUse = sanitizePashto(makeSearchStringSafe(searchString)); - const index = isPashtoScript(searchStringToUse) ? "p" : "g"; - const search = index === "g" ? simplifyPhonetics(searchStringToUse) : searchStringToUse; - const infIndex = index === "p" ? "p" : "f"; - // Get exact matches - const exactExpression = new RegExp("^" + search); - const weeBitFuzzy = new RegExp("^" + makeAWeeBitFuzzy(search, infIndex)); - // prepare exact expression for special matching - // TODO: This is all a bit messy and could be done without regex - const expressionForInflections = getExpForInflections(search, infIndex); - const arabicPluralIndex = `ap${infIndex}`; - const pashtoPluralIndex = `pp${infIndex}`; - const presentStemIndex = `ps${infIndex}`; - const firstInfIndex = `infa${infIndex}`; - const secondInfIndex = `infb${infIndex}`; - const pashtoExactResultFields = [ - { - [index]: { $regex: exactExpression }, - }, { - [arabicPluralIndex]: { $regex: weeBitFuzzy }, - }, { - [pashtoPluralIndex]: { $regex: weeBitFuzzy }, - }, { - [presentStemIndex]: { $regex: weeBitFuzzy }, - }, - { - [firstInfIndex]: { $regex: expressionForInflections }, - }, - { - [secondInfIndex]: { $regex: expressionForInflections }, - }, - ]; - const exactQuery = { $or: [...pashtoExactResultFields] }; - // just special incase using really small limits - // multiple times scrolling / chunking / sorting might get a bit messed up if using a limit of less than 10 - const exactResultsLimit = pageSize < 10 ? Math.floor(pageSize / 2) : 10; - const exactResults = dictDb.collection.chain() - .find(exactQuery) - .limit(exactResultsLimit) - .simplesort("i") - .data(); - resultsGiven = exactResults.map((mpd: any) => mpd.$loki); - // Get slightly fuzzy matches - const slightlyFuzzy = new RegExp(makeAWeeBitFuzzy(search, infIndex), "i"); - const slightlyFuzzyQuery = { - [index]: { $regex: slightlyFuzzy }, - $loki: { $nin: resultsGiven }, - }; - const slightlyFuzzyResultsLimit = (pageSize * page) - resultsGiven.length; - const slightlyFuzzyResults = dictDb.collection.chain() - .find(slightlyFuzzyQuery) - .limit(slightlyFuzzyResultsLimit) - .data(); - resultsGiven.push(...slightlyFuzzyResults.map((mpd: any) => mpd.$loki)); - // Get fuzzy matches - const pashtoRegExLogic = fuzzifyPashto(search, { - script: index === "p" ? "Pashto" : "Latin", - simplifiedLatin: index === "g", - allowSpacesInWords: true, - matchStart: "word", - }); - const fuzzyPashtoExperssion = new RegExp(pashtoRegExLogic); - const pashtoFuzzyQuery = [ - { - [index]: { $regex: fuzzyPashtoExperssion }, - }, { // TODO: Issue, this fuzzy doesn't line up well because it's not the simplified phonetics - still has 's etc - [arabicPluralIndex]: { $regex: fuzzyPashtoExperssion }, - }, { - [presentStemIndex]: { $regex: fuzzyPashtoExperssion }, - } - ]; - // fuzzy results should be allowed to take up the rest of the limit (not used up by exact results) - const fuzzyResultsLimit = (pageSize * page) - resultsGiven.length; - // don't get these fuzzy results if searching in only English - const fuzzyQuery = { - $or: pashtoFuzzyQuery, - $loki: { $nin: resultsGiven }, - }; - const fuzzyResults = dictDb.collection.chain() - .find(fuzzyQuery) - .limit(fuzzyResultsLimit) - .data(); - const results = tpFilter - ? [...exactResults, ...slightlyFuzzyResults, ...fuzzyResults].filter(tpFilter) - : [...exactResults, ...slightlyFuzzyResults, ...fuzzyResults]; - // sort out each chunk (based on limit used multiple times by infinite scroll) - // so that when infinite scrolling, it doesn't re-sort the previous chunks given - const closeResultsLength = exactResults.length + slightlyFuzzyResults.length; - const chunksToSort = chunkOutArray(results, pageSize); - return chunksToSort - .reduce((acc, cur, i) => ((i === 0) - ? [ - ...sortByRelevancy(cur.slice(0, closeResultsLength), search, index), - ...sortByRelevancy(cur.slice(closeResultsLength), search, index), - ] - : [ - ...acc, - ...sortByRelevancy(cur, search, index), - ]), []); + let resultsGiven: number[] = []; + // Check if it's in Pashto or Latin script + const searchStringToUse = sanitizePashto(makeSearchStringSafe(searchString)); + const index = isPashtoScript(searchStringToUse) ? "p" : "g"; + const search = + index === "g" ? simplifyPhonetics(searchStringToUse) : searchStringToUse; + const infIndex = index === "p" ? "p" : "f"; + // Get exact matches + const exactExpression = new RegExp("^" + search); + const weeBitFuzzy = new RegExp("^" + makeAWeeBitFuzzy(search, infIndex)); + // prepare exact expression for special matching + // TODO: This is all a bit messy and could be done without regex + const expressionForInflections = getExpForInflections(search, infIndex); + const arabicPluralIndex = `ap${infIndex}`; + const pashtoPluralIndex = `pp${infIndex}`; + const presentStemIndex = `ps${infIndex}`; + const firstInfIndex = `infa${infIndex}`; + const secondInfIndex = `infb${infIndex}`; + const pashtoExactResultFields = [ + { + [index]: { $regex: exactExpression }, + }, + { + [arabicPluralIndex]: { $regex: weeBitFuzzy }, + }, + { + [pashtoPluralIndex]: { $regex: weeBitFuzzy }, + }, + { + [presentStemIndex]: { $regex: weeBitFuzzy }, + }, + { + [firstInfIndex]: { $regex: expressionForInflections }, + }, + { + [secondInfIndex]: { $regex: expressionForInflections }, + }, + ]; + const exactQuery = { $or: [...pashtoExactResultFields] }; + // just special incase using really small limits + // multiple times scrolling / chunking / sorting might get a bit messed up if using a limit of less than 10 + const exactResultsLimit = pageSize < 10 ? Math.floor(pageSize / 2) : 10; + const exactResults = dictDb.collection + .chain() + .find(exactQuery) + .limit(exactResultsLimit) + .simplesort("i") + .data(); + resultsGiven = exactResults.map((mpd: any) => mpd.$loki); + // Get slightly fuzzy matches + const slightlyFuzzy = new RegExp(makeAWeeBitFuzzy(search, infIndex), "i"); + const slightlyFuzzyQuery = { + [index]: { $regex: slightlyFuzzy }, + $loki: { $nin: resultsGiven }, + }; + const slightlyFuzzyResultsLimit = pageSize * page - resultsGiven.length; + const slightlyFuzzyResults = dictDb.collection + .chain() + .find(slightlyFuzzyQuery) + .limit(slightlyFuzzyResultsLimit) + .data(); + resultsGiven.push(...slightlyFuzzyResults.map((mpd: any) => mpd.$loki)); + // Get fuzzy matches + const pashtoRegExLogic = fuzzifyPashto(search, { + script: index === "p" ? "Pashto" : "Latin", + simplifiedLatin: index === "g", + allowSpacesInWords: true, + matchStart: "word", + }); + const fuzzyPashtoExperssion = new RegExp(pashtoRegExLogic); + const pashtoFuzzyQuery = [ + { + [index]: { $regex: fuzzyPashtoExperssion }, + }, + { + // TODO: Issue, this fuzzy doesn't line up well because it's not the simplified phonetics - still has 's etc + [arabicPluralIndex]: { $regex: fuzzyPashtoExperssion }, + }, + { + [presentStemIndex]: { $regex: fuzzyPashtoExperssion }, + }, + ]; + // fuzzy results should be allowed to take up the rest of the limit (not used up by exact results) + const fuzzyResultsLimit = pageSize * page - resultsGiven.length; + // don't get these fuzzy results if searching in only English + const fuzzyQuery = { + $or: pashtoFuzzyQuery, + $loki: { $nin: resultsGiven }, + }; + const fuzzyResults = dictDb.collection + .chain() + .find(fuzzyQuery) + .limit(fuzzyResultsLimit) + .data(); + const results = tpFilter + ? [...exactResults, ...slightlyFuzzyResults, ...fuzzyResults].filter( + tpFilter + ) + : [...exactResults, ...slightlyFuzzyResults, ...fuzzyResults]; + // sort out each chunk (based on limit used multiple times by infinite scroll) + // so that when infinite scrolling, it doesn't re-sort the previous chunks given + const closeResultsLength = exactResults.length + slightlyFuzzyResults.length; + const chunksToSort = chunkOutArray(results, pageSize); + return chunksToSort.reduce( + (acc, cur, i) => + i === 0 + ? [ + ...sortByRelevancy(cur.slice(0, closeResultsLength), search, index), + ...sortByRelevancy(cur.slice(closeResultsLength), search, index), + ] + : [...acc, ...sortByRelevancy(cur, search, index)], + [] + ); } function sortByRelevancy(arr: T[], searchI: string, index: string): T[] { - return relevancySorter.sort(arr, searchI, (obj: any, calc: any) => calc(obj[index])); + return relevancySorter.sort(arr, searchI, (obj: any, calc: any) => + calc(obj[index]) + ); } function relatedWordsLookup(word: T.DictionaryEntry): T.DictionaryEntry[] { - const wordArray = word.e.trim() - .replace(/\?/g, "") - .replace(/( |,|\.|!|;|\(|\))/g, " ") - .split(/ +/) - .filter((w: string) => !fillerWords.includes(w)); - let results: T.DictionaryEntry[] = []; - wordArray.forEach((w: string) => { - let r: RegExp; - try { - r = new RegExp(`\\b${w}\\b`, "i"); - const relatedToWord = dictDb.collection.chain() - .find({ - // don't include the original word - ts: { $ne: word.ts }, - e: { $regex: r }, - }) - .limit(5) - .data(); - results = [...results, ...relatedToWord]; - // In case there's some weird regex fail - } catch (error) { - /* istanbul ignore next */ - console.error(error); - } - }); - // Remove duplicate items - https://stackoverflow.com/questions/40811451/remove-duplicates-from-a-array-of-objects - results = results.filter(function(a) { - // @ts-ignore - return !this[a.$loki] && (this[a.$loki] = true); - }, Object.create(null)); - return(results); + const wordArray = word.e + .trim() + .replace(/\?/g, "") + .replace(/( |,|\.|!|;|\(|\))/g, " ") + .split(/ +/) + .filter((w: string) => !fillerWords.includes(w)); + let results: T.DictionaryEntry[] = []; + wordArray.forEach((w: string) => { + let r: RegExp; + try { + r = new RegExp(`\\b${w}\\b`, "i"); + const relatedToWord = dictDb.collection + .chain() + .find({ + // don't include the original word + ts: { $ne: word.ts }, + e: { $regex: r }, + }) + .limit(5) + .data(); + results = [...results, ...relatedToWord]; + // In case there's some weird regex fail + } catch (error) { + /* istanbul ignore next */ + console.error(error); + } + }); + // Remove duplicate items - https://stackoverflow.com/questions/40811451/remove-duplicates-from-a-array-of-objects + results = results.filter(function (a) { + // @ts-ignore + return !this[a.$loki] && (this[a.$loki] = true); + }, Object.create(null)); + return results; } export function allEntries() { - return dictDb.collection.find(); + return dictDb.collection.find(); } -function makeLookupPortal(tpFilter: (x: T.DictionaryEntry) => x is X): T.EntryLookupPortal { - return { - search: (s: string) => fuzzyLookup({ - searchString: s, - language: "Pashto", - page: 1, - tpFilter, - }), - getByTs: (ts: number) => { - const res = dictDb.findOneByTs(ts); - if (!res) return undefined; - return tpFilter(res) ? res : undefined; - }, - } +function makeLookupPortal( + tpFilter: (x: T.DictionaryEntry) => x is X +): T.EntryLookupPortal { + return { + search: (s: string) => + fuzzyLookup({ + searchString: s, + language: "Pashto", + page: 1, + tpFilter, + }), + getByTs: (ts: number) => { + const res = dictDb.findOneByTs(ts); + if (!res) return undefined; + return tpFilter(res) ? res : undefined; + }, + }; } function makeVerbLookupPortal(): T.EntryLookupPortal { - return { - search: (s: string) => { - const vEntries = fuzzyLookup({ - searchString: s, - language: "Pashto", - page: 1, - tpFilter: tp.isVerbDictionaryEntry, - }); - return vEntries.map((entry): T.VerbEntry => ({ - entry, - complement: (entry.c?.includes("comp.") && entry.l) - ? dictionary.findOneByTs(entry.l) - : undefined, - })); - }, - getByTs: (ts: number): T.VerbEntry | undefined => { - const entry = dictDb.findOneByTs(ts); - if (!entry) return undefined; - if (!tp.isVerbDictionaryEntry(entry)) { - console.error("not valid verb entry"); - return undefined; - } - const complement = (() => { - if (entry.c?.includes("comp") && entry.l) { - const comp = dictDb.findOneByTs(entry.l); - if (!comp) { - console.error("complement not found for", entry); - } - return comp; - } else { - return undefined; - } - })(); - return { entry, complement }; - }, - } + return { + search: (s: string) => { + const vEntries = fuzzyLookup({ + searchString: s, + language: "Pashto", + page: 1, + tpFilter: tp.isVerbDictionaryEntry, + }); + return vEntries.map( + (entry): T.VerbEntry => ({ + entry, + complement: + entry.c?.includes("comp.") && entry.l + ? dictionary.findOneByTs(entry.l) + : undefined, + }) + ); + }, + getByTs: (ts: number): T.VerbEntry | undefined => { + const entry = dictDb.findOneByTs(ts); + if (!entry) return undefined; + if (!tp.isVerbDictionaryEntry(entry)) { + console.error("not valid verb entry"); + return undefined; + } + const complement = (() => { + if (entry.c?.includes("comp") && entry.l) { + const comp = dictDb.findOneByTs(entry.l); + if (!comp) { + console.error("complement not found for", entry); + } + return comp; + } else { + return undefined; + } + })(); + return { entry, complement }; + }, + }; } export const entryFeeder: T.EntryFeeder = { - nouns: makeLookupPortal(tp.isNounEntry), - verbs: makeVerbLookupPortal(), - adjectives: makeLookupPortal(tp.isAdjectiveEntry), - locativeAdverbs: makeLookupPortal(tp.isLocativeAdverbEntry), - adverbs: makeLookupPortal(tp.isAdverbEntry), -} + nouns: makeLookupPortal(tp.isNounEntry), + verbs: makeVerbLookupPortal(), + adjectives: makeLookupPortal(tp.isAdjectiveEntry), + locativeAdverbs: makeLookupPortal(tp.isLocativeAdverbEntry), + adverbs: makeLookupPortal(tp.isAdverbEntry), +}; export const dictionary: DictionaryAPI = { - // NOTE: For some reason that I do not understand you have to pass the functions from the - // dictionary core class in like this... ie. initialize: dictDb.initialize will mess up the this usage - // in the dictionary core class - initialize: async () => await dictDb.initialize(), - update: async (notifyUpdateComing: () => void) => await dictDb.updateDictionary(notifyUpdateComing), - search: function(state: State): T.DictionaryEntry[] { - const searchString = revertSpelling( - state.searchValue, - getTextOptions(state).spelling, - ); - if (state.searchValue === "") { - return []; - } - return (state.options.searchType === "alphabetical" && state.options.language === "Pashto") - ? alphabeticalLookup({ - searchString, - page: state.page - }) - : fuzzyLookup({ - searchString, - language: state.options.language, - page: state.page, - }); - }, - exactPashtoSearch: pashtoExactLookup, - getNewWordsThisMonth: function(): T.DictionaryEntry[] { - return dictDb.collection.chain() - .find({ ts: { $gt: tsOneMonthBack() }}) - .simplesort("ts") - .data() - .reverse(); - }, - findOneByTs: (ts: number) => dictDb.findOneByTs(ts), - findRelatedEntries: function(entry: T.DictionaryEntry): T.DictionaryEntry[] { - return relatedWordsLookup(entry); - }, -} + // NOTE: For some reason that I do not understand you have to pass the functions from the + // dictionary core class in like this... ie. initialize: dictDb.initialize will mess up the this usage + // in the dictionary core class + initialize: async () => await dictDb.initialize(), + update: async (notifyUpdateComing: () => void) => + await dictDb.updateDictionary(notifyUpdateComing), + search: function (state: State): T.DictionaryEntry[] { + const searchString = revertSpelling( + state.searchValue, + getTextOptions(state).spelling + ); + if (state.searchValue === "") { + return []; + } + return state.options.searchType === "alphabetical" && + state.options.language === "Pashto" + ? alphabeticalLookup({ + searchString, + page: state.page, + }) + : fuzzyLookup({ + searchString, + language: state.options.language, + page: state.page, + }); + }, + exactPashtoSearch: pashtoExactLookup, + getNewWordsThisMonth: function (): T.DictionaryEntry[] { + return dictDb.collection + .chain() + .find({ ts: { $gt: tsOneMonthBack() } }) + .simplesort("ts") + .data() + .reverse(); + }, + findOneByTs: (ts: number) => dictDb.findOneByTs(ts), + findRelatedEntries: function (entry: T.DictionaryEntry): T.DictionaryEntry[] { + return relatedWordsLookup(entry); + }, +}; diff --git a/website/src/lib/fuzzify-pashto/fuzzify-pashto.test.ts b/website/src/lib/fuzzify-pashto/fuzzify-pashto.test.ts index 01f1c28..e419556 100644 --- a/website/src/lib/fuzzify-pashto/fuzzify-pashto.test.ts +++ b/website/src/lib/fuzzify-pashto/fuzzify-pashto.test.ts @@ -10,186 +10,186 @@ import { fuzzifyPashto } from "./fuzzify-pashto"; type match = [string, string]; interface IDefaultInfoBlock { - matches: match[]; - nonMatches: match[]; + matches: match[]; + nonMatches: match[]; } const defaultInfo: IDefaultInfoBlock = { - matches: [ - ["اوسېدل", "وسېدل"], - ["انبیه", "امبیه"], - ["سرک", "صړق"], - ["انطذاړ", "انتظار"], - ["مالوم", "معلوم"], - ["معلوم", "مالوم"], - ["قېصا", "کيسه"], - ["کور", "قوړ"], - ["گرزيدل", "ګرځېدل"], - ["سنگہ", "څنګه"], - ["کار", "قهر"], - ["زبا", "ژبه"], - ["سڑے", "سړی"], - ["استمال", "استعمال"], - ["اعمل", "عمل"], - ["جنگل", "ځنګل"], - ["ځال", "جال"], - ["زنگل", "ځنګل"], - ["جرل", "ژړل"], - ["فرمائيل", "فرمايل"], - ["مرمنه", "مېرمنه"], - // using هٔ as two characters - ["وارېدهٔ", "وارېده"], - // using as one character - ["واريدۀ", "وارېده"], - ["زوی", "زوئے"], - ["ئے", "يې"], - // optional ا s in middle - ["توقف", "تواقف"], - // option ي s in middle - ["مناظره", "مناظيره"], - ["بلکل", "بالکل"], - ["مهرب", "محراب"], - ["مسول", "مسوول"], - ["ډارونکي", "ډاروونکي"], - ["ډانګره", "ډانګوره"], - ["هنداره", "هینداره"], - ["متأصفانه", "متاسفانه"], - ["وازف", "واظیف"], - ["شوریٰ", "شورا"], - ["ځنبېدل", "ځمبېدل"], - // consonant swap // TODO: more?? - ["مچلوغزه", "مچلوزغه"], - ["رکشه", "رشکه"], - ["پښه", "ښپه"], - ], - nonMatches: [ - ["سرک", "ترک"], - ["کار", "بېکاري"], - // ا should not be optional in the beginning or end - ["اړتیا", "اړتی"], - ["ړتیا", "اړتیا"], - // و should not be optional in the begenning or end - ["ورور", "رور"], - ], + matches: [ + ["اوسېدل", "وسېدل"], + ["انبیه", "امبیه"], + ["سرک", "صړق"], + ["انطذاړ", "انتظار"], + ["مالوم", "معلوم"], + ["معلوم", "مالوم"], + ["قېصا", "کيسه"], + ["کور", "قوړ"], + ["گرزيدل", "ګرځېدل"], + ["سنگہ", "څنګه"], + ["کار", "قهر"], + ["زبا", "ژبه"], + ["سڑے", "سړی"], + ["استمال", "استعمال"], + ["اعمل", "عمل"], + ["جنگل", "ځنګل"], + ["ځال", "جال"], + ["زنگل", "ځنګل"], + ["جرل", "ژړل"], + ["فرمائيل", "فرمايل"], + ["مرمنه", "مېرمنه"], + // using هٔ as two characters + ["وارېدهٔ", "وارېده"], + // using as one character + ["واريدۀ", "وارېده"], + ["زوی", "زوئے"], + ["ئے", "يې"], + // optional ا s in middle + ["توقف", "تواقف"], + // option ي s in middle + ["مناظره", "مناظيره"], + ["بلکل", "بالکل"], + ["مهرب", "محراب"], + ["مسول", "مسوول"], + ["ډارونکي", "ډاروونکي"], + ["ډانګره", "ډانګوره"], + ["هنداره", "هینداره"], + ["متأصفانه", "متاسفانه"], + ["وازف", "واظیف"], + ["شوریٰ", "شورا"], + ["ځنبېدل", "ځمبېدل"], + // consonant swap // TODO: more?? + ["مچلوغزه", "مچلوزغه"], + ["رکشه", "رشکه"], + ["پښه", "ښپه"], + ], + nonMatches: [ + ["سرک", "ترک"], + ["کار", "بېکاري"], + // ا should not be optional in the beginning or end + ["اړتیا", "اړتی"], + ["ړتیا", "اړتیا"], + // و should not be optional in the begenning or end + ["ورور", "رور"], + ], }; const defaultLatinInfo: IDefaultInfoBlock = { - matches: [ - // TODO: - ["anbiya", "ambiya"], - ["lootfun", "lUtfan"], - ["sarey", "saRey"], - ["senga", "tsanga"], - ["daktur", "DakTar"], - ["iteebar", "itibaar"], - ["dzaal", "jaal"], - ["bekaar", "bekáar"], - ["bekár", "bekaar"], - ["chaai", "cháai"], - ["day", "daai"], - ["dai", "dey"], - ["daktar", "Daktár"], - ["sarái", "saRey"], - ["beter", "bahtár"], - ["doosti", "dostee"], - ["dắraghlum", "deraghlum"], // using the ă along with a combining ́ - ["dar", "dăr"], - ["der", "dăr"], - ["dur", "dăr"], - ["chee", "che"], - ["dzooy", "zooy"], - ["delta", "dalta"], - ["koorbaani", "qUrbaanee"], - ["jamaat", "jamaa'at"], - ["taaroof", "ta'aarÚf"], - ["xudza", "xúdza"], - ["ishaak", "is`haaq"], - ["lUtfun", "lootfan"], - ["miraab", "mihraab"], - ["taamul", "tahamul"], - ["otsedul", "osedul"], - ["ghaara", "ghaaRa"], - ["maafiat", "maafiyat"], - ["tasalUt", "tassalUt"], - ], - nonMatches: [ - ["kor", "por"], - ["intizaar", "intizaam"], - ["ishaat", "shaat"], // i should not be optional at the beginning - ], + matches: [ + // TODO: + ["anbiya", "ambiya"], + ["lootfun", "lUtfan"], + ["saray", "saRay"], + ["senga", "tsanga"], + ["daktur", "DakTar"], + ["iteebar", "itibaar"], + ["dzaal", "jaal"], + ["bekaar", "bekáar"], + ["bekár", "bekaar"], + ["chaai", "cháai"], + ["day", "daai"], + ["dai", "day"], + ["daktar", "Daktár"], + ["sarái", "saRay"], + ["beter", "bahtár"], + ["doosti", "dostee"], + ["dắraghlum", "deraghlum"], // using the ă along with a combining ́ + ["dar", "dăr"], + ["der", "dăr"], + ["dur", "dăr"], + ["chee", "che"], + ["dzooy", "zooy"], + ["delta", "dalta"], + ["koorbaani", "qUrbaanee"], + ["jamaat", "jamaa'at"], + ["taaroof", "ta'aarÚf"], + ["xudza", "xúdza"], + ["ishaak", "is`haaq"], + ["lUtfun", "lootfan"], + ["miraab", "mihraab"], + ["taamul", "tahamul"], + ["otsedul", "osedul"], + ["ghaara", "ghaaRa"], + ["maafiat", "maafiyat"], + ["tasalUt", "tassalUt"], + ], + nonMatches: [ + ["kor", "por"], + ["intizaar", "intizaam"], + ["ishaat", "shaat"], // i should not be optional at the beginning + ], }; const withDiacritics: match[] = [ - ["تتتت", "تِتّتّت"], - ["بببب", "بّبّبَب"], + ["تتتت", "تِتّتّت"], + ["بببب", "بّبّبَب"], ]; const matchesWithAn: match[] = [ - ["حتمن", "حتماً"], - ["لتفن", "لطفاً"], - ["کاملا", "کاملاً"], + ["حتمن", "حتماً"], + ["لتفن", "لطفاً"], + ["کاملا", "کاملاً"], ]; const matchesWithSpaces: match[] = [ - ["دپاره", "د پاره"], - ["بېکار", "بې کار"], - ["د پاره", "دپاره"], - ["بې کار", "بېکار"], - ["کار مند", "کارمند"], - ["همنشین", "هم نشین"], - ["بغل کشي", "بغلکشي"], + ["دپاره", "د پاره"], + ["بېکار", "بې کار"], + ["د پاره", "دپاره"], + ["بې کار", "بېکار"], + ["کار مند", "کارمند"], + ["همنشین", "هم نشین"], + ["بغل کشي", "بغلکشي"], ]; const matchesWithSpacesLatin: match[] = [ - ["dupaara", "du paara"], - ["bekaara", "be kaara"], - ["du paara", "dupaara"], - ["be kaara", "bekaara"], - ["oreckbgqjxmroe", "or ec kb gq jxmr oe"], - ["cc cc c", "ccccc"], + ["dupaara", "du paara"], + ["bekaara", "be kaara"], + ["du paara", "dupaara"], + ["be kaara", "bekaara"], + ["oreckbgqjxmroe", "or ec kb gq jxmr oe"], + ["cc cc c", "ccccc"], ]; const defaultSimpleLatinInfo: IDefaultInfoBlock = { - matches: [ - // TODO: - ["anbiya", "ambiya"], - ["lootfun", "lUtfan"], - ["sarey", "saRey"], - ["senga", "tsanga"], - ["daktur", "DakTar"], - ["iteebar", "itibaar"], - ["dzaal", "jaal"], - ["bekaar", "bekaar"], - ["bekar", "bekaar"], - ["chaai", "chaai"], - ["day", "daai"], - ["dai", "dey"], - ["daktar", "Daktar"], - ["sarai", "saRey"], - ["beter", "bahtar"], - ["doosti", "dostee"], - ["daraghlum", "deraghlum"], // using the ă along with a combining ́ - ["dar", "dar"], - ["der", "dar"], - ["dur", "dar"], - ["chee", "che"], - ["dzooy", "zooy"], - ["delta", "dalta"], - ["koorbaani", "qUrbaanee"], - ["taaroof", "taaarUf"], - ["xudza", "xudza"], - ["ishaak", "ishaaq"], - ["lUtfun", "lootfan"], - ["miraab", "mihraab"], - ["taamul", "tahamul"], - ["otsedul", "osedul"], - ["ghaara", "ghaaRa"], - ], - nonMatches: [ - ["kor", "por"], - ["intizaar", "intizaam"], - ["ishaat", "shaat"], // i should not be optional at the beginning - ], + matches: [ + // TODO: + ["anbiya", "ambiya"], + ["lootfun", "lUtfan"], + ["saray", "saRay"], + ["senga", "tsanga"], + ["daktur", "DakTar"], + ["iteebar", "itibaar"], + ["dzaal", "jaal"], + ["bekaar", "bekaar"], + ["bekar", "bekaar"], + ["chaai", "chaai"], + ["day", "daai"], + ["dai", "day"], + ["daktar", "Daktar"], + ["sarai", "saRay"], + ["beter", "bahtar"], + ["doosti", "dostee"], + ["daraghlum", "deraghlum"], // using the ă along with a combining ́ + ["dar", "dar"], + ["der", "dar"], + ["dur", "dar"], + ["chee", "che"], + ["dzooy", "zooy"], + ["delta", "dalta"], + ["koorbaani", "qUrbaanee"], + ["taaroof", "taaarUf"], + ["xudza", "xudza"], + ["ishaak", "ishaaq"], + ["lUtfun", "lootfan"], + ["miraab", "mihraab"], + ["taamul", "tahamul"], + ["otsedul", "osedul"], + ["ghaara", "ghaaRa"], + ], + nonMatches: [ + ["kor", "por"], + ["intizaar", "intizaam"], + ["ishaat", "shaat"], // i should not be optional at the beginning + ], }; interface ITestOptions { @@ -200,267 +200,301 @@ interface ITestOptions { } const optionsPossibilities: ITestOptions[] = [ - { - options: {}, // default - ...defaultInfo, - viceVersaMatches: true, - }, - { - options: { script: "Latin" }, - ...defaultLatinInfo, - viceVersaMatches: true, - }, - { - options: {matchStart: "word"}, // same as default - ...defaultInfo, - viceVersaMatches: true, - }, - { - options: { script: "Latin", simplifiedLatin: true }, - ...defaultSimpleLatinInfo, - viceVersaMatches: true, - }, - { - matches: [ - ...matchesWithSpaces, - ], - nonMatches: [], - options: {allowSpacesInWords: true}, - viceVersaMatches: true, - }, - { - matches: [ - ...matchesWithSpacesLatin, - ], - nonMatches: [], - options: {allowSpacesInWords: true, script: "Latin"}, - viceVersaMatches: true, - }, - { - matches: [], - nonMatches: matchesWithSpaces, - options: {allowSpacesInWords: false}, - }, - { - matches: [], - nonMatches: matchesWithSpacesLatin, - options: {allowSpacesInWords: false, script: "Latin"}, - }, - { - matches: [ - ["کار", "بېکاري"], - ], - nonMatches: [ - ["سرک", "بېترک"], - ], - options: {matchStart: "anywhere"}, - }, - { - matches: [ - ["کور", "کور"], - ["سری", "سړی"], - ], - nonMatches: [ - ["سړي", "سړيتوب"], - ["کور", "کورونه"], - ], - options: {matchWholeWordOnly: true}, - viceVersaMatches: true, - }, - { - matches: [ - ["کور", "کور ته ځم"], - ["سری", "سړی دی"], - ], - nonMatches: [ - ["سړي", " سړيتوب"], - ["کور", "خټين کورونه"], - ], - options: {matchStart: "string"}, - }, - { - matches: [ - ["کور", "کور ته ځم"], - ["سری", "سړی دی"], - ], - nonMatches: [ - ["سړي", " سړيتوب"], - ["کور", "خټين کورونه"], - ], - options: {matchStart: "string"}, - }, + { + options: {}, // default + ...defaultInfo, + viceVersaMatches: true, + }, + { + options: { script: "Latin" }, + ...defaultLatinInfo, + viceVersaMatches: true, + }, + { + options: { matchStart: "word" }, // same as default + ...defaultInfo, + viceVersaMatches: true, + }, + { + options: { script: "Latin", simplifiedLatin: true }, + ...defaultSimpleLatinInfo, + viceVersaMatches: true, + }, + { + matches: [...matchesWithSpaces], + nonMatches: [], + options: { allowSpacesInWords: true }, + viceVersaMatches: true, + }, + { + matches: [...matchesWithSpacesLatin], + nonMatches: [], + options: { allowSpacesInWords: true, script: "Latin" }, + viceVersaMatches: true, + }, + { + matches: [], + nonMatches: matchesWithSpaces, + options: { allowSpacesInWords: false }, + }, + { + matches: [], + nonMatches: matchesWithSpacesLatin, + options: { allowSpacesInWords: false, script: "Latin" }, + }, + { + matches: [["کار", "بېکاري"]], + nonMatches: [["سرک", "بېترک"]], + options: { matchStart: "anywhere" }, + }, + { + matches: [ + ["کور", "کور"], + ["سری", "سړی"], + ], + nonMatches: [ + ["سړي", "سړيتوب"], + ["کور", "کورونه"], + ], + options: { matchWholeWordOnly: true }, + viceVersaMatches: true, + }, + { + matches: [ + ["کور", "کور ته ځم"], + ["سری", "سړی دی"], + ], + nonMatches: [ + ["سړي", " سړيتوب"], + ["کور", "خټين کورونه"], + ], + options: { matchStart: "string" }, + }, + { + matches: [ + ["کور", "کور ته ځم"], + ["سری", "سړی دی"], + ], + nonMatches: [ + ["سړي", " سړيتوب"], + ["کور", "خټين کورونه"], + ], + options: { matchStart: "string" }, + }, ]; const punctuationToExclude = [ - "،", "؟", "؛", "۔", "۲", "۹", "۰", "»", "«", "٫", "!", ".", "؋", "٪", "٬", "×", ")", "(", " ", "\t", + "،", + "؟", + "؛", + "۔", + "۲", + "۹", + "۰", + "»", + "«", + "٫", + "!", + ".", + "؋", + "٪", + "٬", + "×", + ")", + "(", + " ", + "\t", ]; optionsPossibilities.forEach((o) => { + o.matches.forEach((m: any) => { + test(`${m[0]} should match ${m[1]}`, () => { + const re = fuzzifyPashto(m[0], o.options); + // eslint-disable-next-line + const result = m[1].match(new RegExp(re)); + expect(result).toBeTruthy(); + }); + }); + if (o.viceVersaMatches === true) { o.matches.forEach((m: any) => { - test(`${m[0]} should match ${m[1]}`, () => { - const re = fuzzifyPashto(m[0], o.options); - // eslint-disable-next-line - const result = m[1].match(new RegExp(re)); - expect(result).toBeTruthy(); - }); + test(`${m[1]} should match ${m[0]}`, () => { + const re = fuzzifyPashto(m[1], o.options); + // eslint-disable-next-line + const result = m[0].match(new RegExp(re)); + expect(result).toBeTruthy(); + }); }); - if (o.viceVersaMatches === true) { - o.matches.forEach((m: any) => { - test(`${m[1]} should match ${m[0]}`, () => { - const re = fuzzifyPashto(m[1], o.options); - // eslint-disable-next-line - const result = m[0].match(new RegExp(re)); - expect(result).toBeTruthy(); - }); - }); - } - o.nonMatches.forEach((m: any) => { - test(`${m[0]} should not match ${m[1]}`, () => { - const re = fuzzifyPashto(m[0], o.options); - // eslint-disable-next-line - const result = m[1].match(new RegExp(re)); - expect(result).toBeNull(); - }); + } + o.nonMatches.forEach((m: any) => { + test(`${m[0]} should not match ${m[1]}`, () => { + const re = fuzzifyPashto(m[0], o.options); + // eslint-disable-next-line + const result = m[1].match(new RegExp(re)); + expect(result).toBeNull(); }); + }); }); matchesWithAn.forEach((m: any) => { - test(`matching ${m[0]} should work with ${m[1]}`, () => { - const re = fuzzifyPashto(m[0], { matchWholeWordOnly: true }); - // eslint-disable-next-line - const result = m[1].match(new RegExp(re)); - expect(result).toBeTruthy(); - }); - test(`matching ${m[1]} should work with ${m[0]}`, () => { - const re = fuzzifyPashto(m[1], { matchWholeWordOnly: true }); - // eslint-disable-next-line - const result = m[0].match(new RegExp(re)); - expect(result).toBeTruthy(); - }); + test(`matching ${m[0]} should work with ${m[1]}`, () => { + const re = fuzzifyPashto(m[0], { matchWholeWordOnly: true }); + // eslint-disable-next-line + const result = m[1].match(new RegExp(re)); + expect(result).toBeTruthy(); + }); + test(`matching ${m[1]} should work with ${m[0]}`, () => { + const re = fuzzifyPashto(m[1], { matchWholeWordOnly: true }); + // eslint-disable-next-line + const result = m[0].match(new RegExp(re)); + expect(result).toBeTruthy(); + }); }); withDiacritics.forEach((m: any) => { - test(`matich ${m[0]} should ignore the diactritics in ${m[1]}`, () => { - const re = fuzzifyPashto(m[0], { ignoreDiacritics: true }); - // eslint-disable-next-line - const result = m[1].match(new RegExp(re)); - expect(result).toBeTruthy(); - }); - test(`the diacritics should in ${m[0]} should be ignored when matching with ${m[1]}`, () => { - const re = fuzzifyPashto(m[1], { ignoreDiacritics: true }); - // eslint-disable-next-line - const result = m[0].match(new RegExp(re)); - expect(result).toBeTruthy(); - }); + test(`matich ${m[0]} should ignore the diactritics in ${m[1]}`, () => { + const re = fuzzifyPashto(m[0], { ignoreDiacritics: true }); + // eslint-disable-next-line + const result = m[1].match(new RegExp(re)); + expect(result).toBeTruthy(); + }); + test(`the diacritics should in ${m[0]} should be ignored when matching with ${m[1]}`, () => { + const re = fuzzifyPashto(m[1], { ignoreDiacritics: true }); + // eslint-disable-next-line + const result = m[0].match(new RegExp(re)); + expect(result).toBeTruthy(); + }); }); test(`وs should be optional if entered in search string`, () => { - const re = fuzzifyPashto("لوتفن"); - // eslint-disable-next-line - const result = "لطفاً".match(new RegExp(re)); - expect(result).toBeTruthy(); + const re = fuzzifyPashto("لوتفن"); + // eslint-disable-next-line + const result = "لطفاً".match(new RegExp(re)); + expect(result).toBeTruthy(); }); test(`matchWholeWordOnly should override matchStart = "anywhere"`, () => { - const re = fuzzifyPashto("کار", { matchWholeWordOnly: true, matchStart: "anywhere" }); - // eslint-disable-next-line - const result = "کار کوه، بېکاره مه ګرځه".match(new RegExp(re)); - expect(result).toHaveLength(1); - expect(result).toEqual(expect.not.arrayContaining(["بېکاره"])); + const re = fuzzifyPashto("کار", { + matchWholeWordOnly: true, + matchStart: "anywhere", + }); + // eslint-disable-next-line + const result = "کار کوه، بېکاره مه ګرځه".match(new RegExp(re)); + expect(result).toHaveLength(1); + expect(result).toEqual(expect.not.arrayContaining(["بېکاره"])); }); test(`returnWholeWord should return the whole word`, () => { - // With Pashto Script - const re = fuzzifyPashto("کار", { returnWholeWord: true }); - // eslint-disable-next-line - const result = "کارونه کوه، بېکاره مه شه".match(new RegExp(re)); - expect(result).toHaveLength(1); - expect(result).toContain("کارونه"); - // With Latin Script - const reLatin = fuzzifyPashto("kaar", { - returnWholeWord: true, - script: "Latin", - }); - // eslint-disable-next-line - const resultLatin = "kaaroona kawa, bekaara ma gurdza.".match(new RegExp(reLatin)); - expect(resultLatin).toHaveLength(1); - expect(resultLatin).toContain("kaaroona"); + // With Pashto Script + const re = fuzzifyPashto("کار", { returnWholeWord: true }); + // eslint-disable-next-line + const result = "کارونه کوه، بېکاره مه شه".match(new RegExp(re)); + expect(result).toHaveLength(1); + expect(result).toContain("کارونه"); + // With Latin Script + const reLatin = fuzzifyPashto("kaar", { + returnWholeWord: true, + script: "Latin", + }); + // eslint-disable-next-line + const resultLatin = "kaaroona kawa, bekaara ma gurdza.".match( + new RegExp(reLatin) + ); + expect(resultLatin).toHaveLength(1); + expect(resultLatin).toContain("kaaroona"); }); test(`returnWholeWord should return the whole word even when starting the matching in the middle`, () => { - // With Pashto Script - const re = fuzzifyPashto("کار", { returnWholeWord: true, matchStart: "anywhere" }); - // eslint-disable-next-line - const result = "کارونه کوه، بېکاره مه شه".match(new RegExp(re, "g")); - expect(result).toHaveLength(2); - expect(result).toContain(" بېکاره"); + // With Pashto Script + const re = fuzzifyPashto("کار", { + returnWholeWord: true, + matchStart: "anywhere", + }); + // eslint-disable-next-line + const result = "کارونه کوه، بېکاره مه شه".match(new RegExp(re, "g")); + expect(result).toHaveLength(2); + expect(result).toContain(" بېکاره"); - // With Latin Script - const reLatin = fuzzifyPashto("kaar", { - matchStart: "anywhere", - returnWholeWord: true, - script: "Latin", - }); - // eslint-disable-next-line - const resultLatin = "kaaroona kawa bekaara ma gurdza".match(new RegExp(reLatin, "g")); - expect(resultLatin).toHaveLength(2); - expect(resultLatin).toContain("bekaara"); + // With Latin Script + const reLatin = fuzzifyPashto("kaar", { + matchStart: "anywhere", + returnWholeWord: true, + script: "Latin", + }); + // eslint-disable-next-line + const resultLatin = "kaaroona kawa bekaara ma gurdza".match( + new RegExp(reLatin, "g") + ); + expect(resultLatin).toHaveLength(2); + expect(resultLatin).toContain("bekaara"); }); test(`returnWholeWord should should not return partial matches if matchWholeWordOnly is true`, () => { - // With Pashto Script - const re = fuzzifyPashto("کار", { returnWholeWord: true, matchStart: "anywhere", matchWholeWordOnly: true }); - // eslint-disable-next-line - const result = "کارونه کوه، بېکاره مه ګرځه".match(new RegExp(re)); - expect(result).toBeNull(); + // With Pashto Script + const re = fuzzifyPashto("کار", { + returnWholeWord: true, + matchStart: "anywhere", + matchWholeWordOnly: true, + }); + // eslint-disable-next-line + const result = "کارونه کوه، بېکاره مه ګرځه".match(new RegExp(re)); + expect(result).toBeNull(); - // With Latin Script - const reLatin = fuzzifyPashto("kaar", { - matchStart: "anywhere", - matchWholeWordOnly: true, + // With Latin Script + const reLatin = fuzzifyPashto("kaar", { + matchStart: "anywhere", + matchWholeWordOnly: true, + returnWholeWord: true, + script: "Latin", + }); + // eslint-disable-next-line + const resultLatin = "kaaroona kawa bekaara ma gurdza".match( + new RegExp(reLatin) + ); + expect(resultLatin).toBeNull(); +}); + +punctuationToExclude.forEach((m) => { + test(`${m} should not be considered part of a Pashto word`, () => { + const re = fuzzifyPashto("کور", { + returnWholeWord: true, + matchStart: "word", + }); + // ISSUE: This should also work when the word is PRECEDED by the punctuation + // Need to work with a lookbehind equivalent + // eslint-disable-next-line + const result = `زمونږ کورونه${m} دي`.match(new RegExp(re)); + expect(result).toHaveLength(1); + expect(result).toContain(" کورونه"); + // Matches will unfortunately have a space on the front of the word, issue with missing es2018 lookbehinds + }); +}); + +punctuationToExclude.forEach((m) => { + // tslint:disable-next-line + test(`${m} should not be considered part of a Pashto word (front or back with es2018) - or should fail if using a non es2018 environment`, () => { + let result: any; + let failed = false; + // if environment is not es2018 with lookbehind support (like node 6, 8) this will fail + try { + const re = fuzzifyPashto("کور", { returnWholeWord: true, - script: "Latin", - }); - // eslint-disable-next-line - const resultLatin = "kaaroona kawa bekaara ma gurdza".match(new RegExp(reLatin)); - expect(resultLatin).toBeNull(); -}); - -punctuationToExclude.forEach((m) => { - test(`${m} should not be considered part of a Pashto word`, () => { - const re = fuzzifyPashto("کور", { returnWholeWord: true, matchStart: "word" }); - // ISSUE: This should also work when the word is PRECEDED by the punctuation - // Need to work with a lookbehind equivalent - // eslint-disable-next-line - const result = `زمونږ کورونه${m} دي`.match(new RegExp(re)); - expect(result).toHaveLength(1); - expect(result).toContain(" کورونه"); - // Matches will unfortunately have a space on the front of the word, issue with missing es2018 lookbehinds - }); -}); - -punctuationToExclude.forEach((m) => { - // tslint:disable-next-line - test(`${m} should not be considered part of a Pashto word (front or back with es2018) - or should fail if using a non es2018 environment`, () => { - let result: any; - let failed = false; - // if environment is not es2018 with lookbehind support (like node 6, 8) this will fail - try { - const re = fuzzifyPashto("کور", { returnWholeWord: true, matchStart: "word", es2018: true }); - // eslint-disable-next-line - result = `زمونږ ${m}کورونه${m} دي`.match(new RegExp(re)); - } catch (error) { - failed = true; - } - const worked = failed || (result.length === 1 && result.includes("کورونه")); - expect(worked).toBe(true); - }); + matchStart: "word", + es2018: true, + }); + // eslint-disable-next-line + result = `زمونږ ${m}کورونه${m} دي`.match(new RegExp(re)); + } catch (error) { + failed = true; + } + const worked = failed || (result.length === 1 && result.includes("کورونه")); + expect(worked).toBe(true); + }); }); test(`Arabic punctuation or numbers should not be considered part of a Pashto word`, () => { - const re = fuzzifyPashto("کار", { returnWholeWord: true }); - // eslint-disable-next-line - const result = "کارونه کوه، بېکاره مه ګرځه".match(new RegExp(re)); - expect(result).toHaveLength(1); - expect(result).toContain("کارونه"); + const re = fuzzifyPashto("کار", { returnWholeWord: true }); + // eslint-disable-next-line + const result = "کارونه کوه، بېکاره مه ګرځه".match(new RegExp(re)); + expect(result).toHaveLength(1); + expect(result).toContain("کارونه"); }); diff --git a/website/src/lib/fuzzify-pashto/replacer.ts b/website/src/lib/fuzzify-pashto/replacer.ts index ba36cf1..cc6d759 100644 --- a/website/src/lib/fuzzify-pashto/replacer.ts +++ b/website/src/lib/fuzzify-pashto/replacer.ts @@ -14,7 +14,7 @@ const velarPlosives = "ګغږکقگك"; const rLikeSounds = "رړڑڼ"; const labialPlosivesAndFricatives = "فپب"; // Includes Arabic ى \u0649 -const theFiveYeys = "ېۍیيئےى"; +const theFiveYays = "ېۍیيئےى"; const guttural = "ښخشخهحغګ"; interface IReplacerInfoItem { @@ -38,7 +38,6 @@ const ghzCombo = ["غز", "زغ"]; const pxCombo = ["پښ", "ښپ"]; const kshCombo = ["کش", "شک", "کښ", "کش"]; - export const pashtoReplacerInfo: IPashtoReplacerInfoItem[] = [ { char: "اً", range: "ان" }, { @@ -54,15 +53,25 @@ export const pashtoReplacerInfo: IPashtoReplacerInfoItem[] = [ { char: "ٳ", range: "اآهأ" }, { char: "یٰ", range: "ای", plus: ["یٰ"] }, - { char: "ی", range: theFiveYeys, plus: ["ئی", "ئي", "یٰ"], ignorableIfInMiddle: true }, - { char: "ي", range: theFiveYeys, plus: ["ئی", "ئي", "یٰ"], ignorableIfInMiddle: true }, - { char: "ې", range: theFiveYeys, ignorableIfInMiddle: true }, - { char: "ۍ", range: theFiveYeys }, - { char: "ئي", range: theFiveYeys, plus: ["ئی", "ئي"] }, - { char: "ئی", range: theFiveYeys, plus: ["ئی", "ئي"] }, - { char: "ئے", range: theFiveYeys, plus: ["ئی", "ئي", "يې"]}, - { char: "ئ", range: theFiveYeys, ignorableIfInMiddle: true }, - { char: "ے", range: theFiveYeys }, + { + char: "ی", + range: theFiveYays, + plus: ["ئی", "ئي", "یٰ"], + ignorableIfInMiddle: true, + }, + { + char: "ي", + range: theFiveYays, + plus: ["ئی", "ئي", "یٰ"], + ignorableIfInMiddle: true, + }, + { char: "ې", range: theFiveYays, ignorableIfInMiddle: true }, + { char: "ۍ", range: theFiveYays }, + { char: "ئي", range: theFiveYays, plus: ["ئی", "ئي"] }, + { char: "ئی", range: theFiveYays, plus: ["ئی", "ئي"] }, + { char: "ئے", range: theFiveYays, plus: ["ئی", "ئي", "يې"] }, + { char: "ئ", range: theFiveYays, ignorableIfInMiddle: true }, + { char: "ے", range: theFiveYays }, { char: "س", range: sSounds }, { char: "ص", range: sSounds }, @@ -79,7 +88,7 @@ export const pashtoReplacerInfo: IPashtoReplacerInfoItem[] = [ { char: "ع", range: "اوع", ignorable: true }, { char: "و", range: "وع", plus: ["وو"], ignorableIfInMiddle: true }, - { char: "ؤ", range: "وع"}, + { char: "ؤ", range: "وع" }, { char: "ښ", range: guttural }, { char: "غ", range: guttural }, @@ -91,7 +100,7 @@ export const pashtoReplacerInfo: IPashtoReplacerInfoItem[] = [ { char: "ز", range: zSounds }, { char: "ض", range: zSounds }, { char: "ذ", range: zSounds }, - { char: "ځ", range: zSounds + "جڅ"}, + { char: "ځ", range: zSounds + "جڅ" }, { char: "ظ", range: zSounds }, { char: "ژ", range: "زضظژذځږج" }, @@ -133,11 +142,12 @@ export const pashtoReplacerInfo: IPashtoReplacerInfoItem[] = [ ]; // tslint:disable-next-line -export const pashtoReplacerRegex = /اً|أ|ا|آ|ٱ|ٲ|ٳ|ئی|ئي|ئے|یٰ|ی|ي|ې|ۍ|ئ|ے|س|ص|ث|څ|ج|چ|هٔ|ه|ۀ|غز|زغ|کش|شک|ښک|ښک|پښ|ښپ|ہ|ع|و|ؤ|ښ|غ|خ|ح|ش|ز|ض|ذ|ځ|ظ|ژ|ر|ړ|ڑ|ت|ټ|ٹ|ط|د|ډ|ڈ|مب|م|نب|ن|ڼ|ک|ګ|گ|ل|ق|ږ|ب|پ|ف/g; +export const pashtoReplacerRegex = + /اً|أ|ا|آ|ٱ|ٲ|ٳ|ئی|ئي|ئے|یٰ|ی|ي|ې|ۍ|ئ|ے|س|ص|ث|څ|ج|چ|هٔ|ه|ۀ|غز|زغ|کش|شک|ښک|ښک|پښ|ښپ|ہ|ع|و|ؤ|ښ|غ|خ|ح|ش|ز|ض|ذ|ځ|ظ|ژ|ر|ړ|ڑ|ت|ټ|ٹ|ط|د|ډ|ڈ|مب|م|نب|ن|ڼ|ک|ګ|گ|ل|ق|ږ|ب|پ|ف/g; // TODO: I removed the h? 's at the beginning and ends. was that a good idea? const aaySoundLatin = "(?:[aá]a?i|[eé]y|[aá]a?y|[aá]h?i)"; -const aaySoundSimpleLatin = "(?:aa?i|ey|aa?y|ah?i)"; +const aaySoundSimpleLatin = "(?:aa?i|ay|aa?y|ah?i)"; const longASoundLatin = "(?:[aá]{1,2}'?h?a{0,2}?)h?"; const longASoundSimpleLatin = "(?:a{1,2}'?h?a{0,2}?)h?"; const shortASoundLatin = "(?:[aáă][a|́]?|au|áu|[uú]|[UÚ]|[ií]|[eé])?h?"; @@ -146,8 +156,8 @@ const shwaSoundLatin = "(?:[uú]|[oó]o?|w[uú]|[aáă]|[ií]|[UÚ])?"; const shwaSoundSimpleLatin = "(?:u|oo?|wu|a|i|U)?"; const ooSoundLatin = "(?:[oó]o?|[áa]u|w[uú]|[aá]w|[uú]|[UÚ])(?:h|w)?"; const ooSoundSimpleLatin = "(?:oo?|au|wu|aw|u|U)(?:h|w)?"; -const eySoundLatin = "(?:[eé]y|[eé]e?|[uú]y|[aá]y|[ií])"; -const eySoundSimpleLatin = "(?:ey|ee?|uy|ay|i)"; +const aySoundLatin = "(?:[eé]y|[eé]e?|[uú]y|[aá]y|[ií])"; +const aySoundSimpleLatin = "(?:ay|ee?|uy|ay|i)"; const middleESoundLatin = "(?:[eé]e?|[ií]|[aáă]|[eé])[h|y|́]?"; const middleESoundSimpleLatin = "(?:ee?|i|a|e)[h|y]?"; const iSoundLatin = "-?(?:[uú]|[aáă]|[ií]|[eé]e?)?h?-?"; @@ -180,67 +190,67 @@ export const latinReplacerInfo: IPhoneticsReplacerInfoItem[] = [ { char: "óo", repl: ooSoundLatin }, { char: "i", repl: iSoundLatin, replWhenBeginning: iSoundLatinBeginning }, { char: "í", repl: iSoundLatin, replWhenBeginning: iSoundLatinBeginning }, - { char: "ey", repl: eySoundLatin }, - { char: "éy", repl: eySoundLatin }, - { char: "ee", repl: eySoundLatin }, - { char: "ée", repl: eySoundLatin }, - { char: "uy", repl: eySoundLatin }, - { char: "úy", repl: eySoundLatin }, + { char: "ay", repl: aySoundLatin }, + { char: "áy", repl: aySoundLatin }, + { char: "ee", repl: aySoundLatin }, + { char: "ée", repl: aySoundLatin }, + { char: "uy", repl: aySoundLatin }, + { char: "úy", repl: aySoundLatin }, { char: "e", repl: middleESoundLatin }, { char: "é", repl: middleESoundLatin }, - { char: "w", repl: "(?:w{1,2}?[UÚ]?|b)"}, - { char: "y", repl: "[ií]?y?"}, + { char: "w", repl: "(?:w{1,2}?[UÚ]?|b)" }, + { char: "y", repl: "[ií]?y?" }, - { char: "ts", repl: "(?:s{1,2}|z{1,2|ts|c)"}, - { char: "s", repl: "(?:s{1,2}|z{1,2|ts|c)"}, - { char: "ss", repl: "(?:s{1,2}|z{1,2|ts|c)"}, - { char: "c", repl: "(?:s{1,2}|z{1,2|ts|c)"}, - { char: "dz", repl: "(?:dz|z{1,2}|j)"}, - { char: "z", repl: "(?:s{1,2}|dz|z{1,2}|ts)"}, - { char: "t", repl: "(?:t{1,2}|T|d{1,2}|D)"}, - { char: "tt", repl: "(?:t{1,2}|T|d{1,2}|D)"}, - { char: "T", repl: "(?:t{1,2}|T|d{1,2}|D)"}, - { char: "d", repl: "(?:t{1,2}|T|d{1,2}|D)"}, - { char: "dd", repl: "(?:t{1,2}|T|d{1,2}|D)"}, - { char: "D", repl: "(?:t{1,2}|T|d{1,2}|D)"}, - { char: "r", repl: "(?:R|r{1,2}|N)"}, - { char: "rr", repl: "(?:R|r{1,2}|N)"}, - { char: "R", repl: "(?:R|r{1,2}|N)"}, - { char: "nb", repl: "(?:nb|mb)"}, - { char: "mb", repl: "(?:nb|mb)"}, - { char: "n", repl: "(?:n{1,2}|N)"}, - { char: "N", repl: "(?:R|r{1,2}|N)"}, - { char: "f", repl: "(?:f{1,2}|p{1,2})"}, - { char: "ff", repl: "(?:f{1,2}|p{1,2})"}, - { char: "b", repl: "(?:b{1,2}|p{1,2})"}, - { char: "bb", repl: "(?:b{1,2}|p{1,2})"}, - { char: "p", repl: "(?:b{1,2}|p{1,2}|f{1,2})"}, - { char: "pp", repl: "(?:b{1,2}|p{1,2}|f{1,2})"}, + { char: "ts", repl: "(?:s{1,2}|z{1,2|ts|c)" }, + { char: "s", repl: "(?:s{1,2}|z{1,2|ts|c)" }, + { char: "ss", repl: "(?:s{1,2}|z{1,2|ts|c)" }, + { char: "c", repl: "(?:s{1,2}|z{1,2|ts|c)" }, + { char: "dz", repl: "(?:dz|z{1,2}|j)" }, + { char: "z", repl: "(?:s{1,2}|dz|z{1,2}|ts)" }, + { char: "t", repl: "(?:t{1,2}|T|d{1,2}|D)" }, + { char: "tt", repl: "(?:t{1,2}|T|d{1,2}|D)" }, + { char: "T", repl: "(?:t{1,2}|T|d{1,2}|D)" }, + { char: "d", repl: "(?:t{1,2}|T|d{1,2}|D)" }, + { char: "dd", repl: "(?:t{1,2}|T|d{1,2}|D)" }, + { char: "D", repl: "(?:t{1,2}|T|d{1,2}|D)" }, + { char: "r", repl: "(?:R|r{1,2}|N)" }, + { char: "rr", repl: "(?:R|r{1,2}|N)" }, + { char: "R", repl: "(?:R|r{1,2}|N)" }, + { char: "nb", repl: "(?:nb|mb)" }, + { char: "mb", repl: "(?:nb|mb)" }, + { char: "n", repl: "(?:n{1,2}|N)" }, + { char: "N", repl: "(?:R|r{1,2}|N)" }, + { char: "f", repl: "(?:f{1,2}|p{1,2})" }, + { char: "ff", repl: "(?:f{1,2}|p{1,2})" }, + { char: "b", repl: "(?:b{1,2}|p{1,2})" }, + { char: "bb", repl: "(?:b{1,2}|p{1,2})" }, + { char: "p", repl: "(?:b{1,2}|p{1,2}|f{1,2})" }, + { char: "pp", repl: "(?:b{1,2}|p{1,2}|f{1,2})" }, - { char: "sh", repl: "(?:x|sh|s`h)"}, - { char: "x", repl: "(?:kh|gh|x|h){1,2}"}, - { char: "kh", repl: "(?:kh|gh|x|h){1,2}"}, + { char: "sh", repl: "(?:x|sh|s`h)" }, + { char: "x", repl: "(?:kh|gh|x|h){1,2}" }, + { char: "kh", repl: "(?:kh|gh|x|h){1,2}" }, - { char: "k", repl: "(?:k{1,2}|q{1,2})"}, - { char: "q", repl: "(?:k{1,2}|q{1,2})"}, + { char: "k", repl: "(?:k{1,2}|q{1,2})" }, + { char: "q", repl: "(?:k{1,2}|q{1,2})" }, - { char: "jz", repl: "(?:G|jz)"}, - { char: "G", repl: "(?:jz|G|g)"}, + { char: "jz", repl: "(?:G|jz)" }, + { char: "G", repl: "(?:jz|G|g)" }, - { char: "g", repl: "(?:gh?|k{1,2}|G)"}, - { char: "gh", repl: "(?:g|gh|kh|G)"}, + { char: "g", repl: "(?:gh?|k{1,2}|G)" }, + { char: "gh", repl: "(?:g|gh|kh|G)" }, - { char: "j", repl: "(?:j{1,2}|ch|dz)"}, - { char: "ch", repl: "(?:j{1,2}|ch)"}, + { char: "j", repl: "(?:j{1,2}|ch|dz)" }, + { char: "ch", repl: "(?:j{1,2}|ch)" }, - { char: "l", repl: "l{1,2}"}, - { char: "ll", repl: "l{1,2}"}, - { char: "m", repl: "m{1,2}"}, - { char: "mm", repl: "m{1,2}"}, - { char: "h", repl: "k?h?"}, - { char: "'", repl: "['|’|`]?"}, - { char: "’", repl: "['|’|`]?"}, - { char: "`", repl: "['|’|`]?"}, + { char: "l", repl: "l{1,2}" }, + { char: "ll", repl: "l{1,2}" }, + { char: "m", repl: "m{1,2}" }, + { char: "mm", repl: "m{1,2}" }, + { char: "h", repl: "k?h?" }, + { char: "'", repl: "['|’|`]?" }, + { char: "’", repl: "['|’|`]?" }, + { char: "`", repl: "['|’|`]?" }, ]; export const simpleLatinReplacerInfo: IPhoneticsReplacerInfoItem[] = [ @@ -254,65 +264,71 @@ export const simpleLatinReplacerInfo: IPhoneticsReplacerInfoItem[] = [ { char: "U", repl: ooSoundSimpleLatin }, { char: "o", repl: ooSoundSimpleLatin }, { char: "oo", repl: ooSoundSimpleLatin }, - { char: "i", repl: iSoundSimpleLatin, replWhenBeginning: iSoundSimpleLatinBeginning }, - { char: "ey", repl: eySoundSimpleLatin }, - { char: "ee", repl: eySoundSimpleLatin }, - { char: "uy", repl: eySoundSimpleLatin }, + { + char: "i", + repl: iSoundSimpleLatin, + replWhenBeginning: iSoundSimpleLatinBeginning, + }, + { char: "ay", repl: aySoundSimpleLatin }, + { char: "ee", repl: aySoundSimpleLatin }, + { char: "uy", repl: aySoundSimpleLatin }, { char: "e", repl: middleESoundSimpleLatin }, - { char: "w", repl: "(?:w{1,2}?[UÚ]?|b)"}, - { char: "y", repl: "[ií]?y?"}, + { char: "w", repl: "(?:w{1,2}?[UÚ]?|b)" }, + { char: "y", repl: "[ií]?y?" }, - { char: "ts", repl: "(?:s{1,2}|z{1,2|ts|c)"}, - { char: "s", repl: "(?:s{1,2}|z{1,2|ts|c)"}, - { char: "c", repl: "(?:s{1,2}|z{1,2|ts|c)"}, - { char: "dz", repl: "(?:dz|z{1,2}|j)"}, - { char: "z", repl: "(?:s{1,2}|dz|z{1,2}|ts)"}, - { char: "t", repl: "(?:t{1,2}|T|d{1,2}|D)"}, - { char: "tt", repl: "(?:t{1,2}|T|d{1,2}|D)"}, - { char: "T", repl: "(?:t{1,2}|T|d{1,2}|D)"}, - { char: "d", repl: "(?:t{1,2}|T|d{1,2}|D)"}, - { char: "dd", repl: "(?:t{1,2}|T|d{1,2}|D)"}, - { char: "D", repl: "(?:t{1,2}|T|d{1,2}|D)"}, - { char: "r", repl: "(?:R|r{1,2}|N)"}, - { char: "rr", repl: "(?:R|r{1,2}|N)"}, - { char: "R", repl: "(?:R|r{1,2}|N)"}, - { char: "nb", repl: "(?:nb|mb|nw)"}, - { char: "mb", repl: "(?:nb|mb)"}, - { char: "n", repl: "(?:n{1,2}|N)"}, - { char: "N", repl: "(?:R|r{1,2}|N)"}, - { char: "f", repl: "(?:f{1,2}|p{1,2})"}, - { char: "ff", repl: "(?:f{1,2}|p{1,2})"}, - { char: "b", repl: "(?:b{1,2}|p{1,2}|w)"}, - { char: "bb", repl: "(?:b{1,2}|p{1,2})"}, - { char: "p", repl: "(?:b{1,2}|p{1,2}|f{1,2})"}, - { char: "pp", repl: "(?:b{1,2}|p{1,2}|f{1,2})"}, + { char: "ts", repl: "(?:s{1,2}|z{1,2|ts|c)" }, + { char: "s", repl: "(?:s{1,2}|z{1,2|ts|c)" }, + { char: "c", repl: "(?:s{1,2}|z{1,2|ts|c)" }, + { char: "dz", repl: "(?:dz|z{1,2}|j)" }, + { char: "z", repl: "(?:s{1,2}|dz|z{1,2}|ts)" }, + { char: "t", repl: "(?:t{1,2}|T|d{1,2}|D)" }, + { char: "tt", repl: "(?:t{1,2}|T|d{1,2}|D)" }, + { char: "T", repl: "(?:t{1,2}|T|d{1,2}|D)" }, + { char: "d", repl: "(?:t{1,2}|T|d{1,2}|D)" }, + { char: "dd", repl: "(?:t{1,2}|T|d{1,2}|D)" }, + { char: "D", repl: "(?:t{1,2}|T|d{1,2}|D)" }, + { char: "r", repl: "(?:R|r{1,2}|N)" }, + { char: "rr", repl: "(?:R|r{1,2}|N)" }, + { char: "R", repl: "(?:R|r{1,2}|N)" }, + { char: "nb", repl: "(?:nb|mb|nw)" }, + { char: "mb", repl: "(?:nb|mb)" }, + { char: "n", repl: "(?:n{1,2}|N)" }, + { char: "N", repl: "(?:R|r{1,2}|N)" }, + { char: "f", repl: "(?:f{1,2}|p{1,2})" }, + { char: "ff", repl: "(?:f{1,2}|p{1,2})" }, + { char: "b", repl: "(?:b{1,2}|p{1,2}|w)" }, + { char: "bb", repl: "(?:b{1,2}|p{1,2})" }, + { char: "p", repl: "(?:b{1,2}|p{1,2}|f{1,2})" }, + { char: "pp", repl: "(?:b{1,2}|p{1,2}|f{1,2})" }, - { char: "sh", repl: "(?:x|sh|s`h)"}, - { char: "x", repl: "(?:kh|gh|x|h){1,2}"}, - { char: "kh", repl: "(?:kh|gh|x|h){1,2}"}, + { char: "sh", repl: "(?:x|sh|s`h)" }, + { char: "x", repl: "(?:kh|gh|x|h){1,2}" }, + { char: "kh", repl: "(?:kh|gh|x|h){1,2}" }, - { char: "k", repl: "(?:k{1,2}|q{1,2})"}, - { char: "kk", repl: "(?:k{1,2}|q{1,2})"}, - { char: "q", repl: "(?:k{1,2}|q{1,2})"}, - { char: "qq", repl: "(?:k{1,2}|q{1,2})"}, + { char: "k", repl: "(?:k{1,2}|q{1,2})" }, + { char: "kk", repl: "(?:k{1,2}|q{1,2})" }, + { char: "q", repl: "(?:k{1,2}|q{1,2})" }, + { char: "qq", repl: "(?:k{1,2}|q{1,2})" }, - { char: "jz", repl: "(?:G|jz)"}, - { char: "G", repl: "(?:jz|G|g)"}, + { char: "jz", repl: "(?:G|jz)" }, + { char: "G", repl: "(?:jz|G|g)" }, - { char: "g", repl: "(?:gh?|k{1,2}|G)"}, - { char: "gh", repl: "(?:g|gh|kh|G)"}, + { char: "g", repl: "(?:gh?|k{1,2}|G)" }, + { char: "gh", repl: "(?:g|gh|kh|G)" }, - { char: "j", repl: "(?:j{1,2}|ch|dz)"}, - { char: "ch", repl: "(?:j{1,2}|ch)"}, + { char: "j", repl: "(?:j{1,2}|ch|dz)" }, + { char: "ch", repl: "(?:j{1,2}|ch)" }, - { char: "l", repl: "l{1,2}"}, - { char: "ll", repl: "l{1,2}"}, - { char: "m", repl: "m{1,2}"}, - { char: "mm", repl: "m{1,2}"}, - { char: "h", repl: "k?h?"}, + { char: "l", repl: "l{1,2}" }, + { char: "ll", repl: "l{1,2}" }, + { char: "m", repl: "m{1,2}" }, + { char: "mm", repl: "m{1,2}" }, + { char: "h", repl: "k?h?" }, ]; // tslint:disable-next-line -export const latinReplacerRegex = /yee|a{1,2}[i|y]|á{1,2}[i|y]|aa|áa|a|ắ|ă|á|U|Ú|u|ú|oo|óo|o|ó|e{1,2}|ée|é|ey|éy|uy|úy|i|í|w|y|q|q|ts|sh|ss|s|dz|z|tt|t|T|dd|d|D|r{1,2}|R|nb|mb|n{1,2}|N|f{1,2}|b{1,2}|p{1,2}|x|kh|q|kk|k|gh|g|G|j|ch|c|ll|l|m{1,2}|h|’|'|`/g; +export const latinReplacerRegex = + /yee|a{1,2}[i|y]|á{1,2}[i|y]|aa|áa|a|ắ|ă|á|U|Ú|u|ú|oo|óo|o|ó|e{1,2}|ée|é|ay|áy|uy|úy|i|í|w|y|q|q|ts|sh|ss|s|dz|z|tt|t|T|dd|d|D|r{1,2}|R|nb|mb|n{1,2}|N|f{1,2}|b{1,2}|p{1,2}|x|kh|q|kk|k|gh|g|G|j|ch|c|ll|l|m{1,2}|h|’|'|`/g; -export const simpleLatinReplacerRegex = /yee|a{1,2}[i|y]|aa|a|U|u|oo|o|e{1,2}|ey|uy|i|w|y|q|ts|sh|s|dz|z|tt|t|T|dd|d|D|r{1,2}|R|nb|mb|n{1,2}|N|f{1,2}|b{1,2}|p{1,2}|x|kh|q|k|gh|g|G|j|ch|c|ll|l|m{1,2}|h/g; +export const simpleLatinReplacerRegex = + /yee|a{1,2}[i|y]|aa|a|U|u|oo|o|e{1,2}|ay|uy|i|w|y|q|ts|sh|s|dz|z|tt|t|T|dd|d|D|r{1,2}|R|nb|mb|n{1,2}|N|f{1,2}|b{1,2}|p{1,2}|x|kh|q|k|gh|g|G|j|ch|c|ll|l|m{1,2}|h/g; diff --git a/website/src/lib/local-storage.ts b/website/src/lib/local-storage.ts index a99be9e..a05f771 100644 --- a/website/src/lib/local-storage.ts +++ b/website/src/lib/local-storage.ts @@ -14,7 +14,7 @@ export const userLocalStorageName = "user1"; export function saveOptions(options: Options): void { localStorage.setItem(optionsLocalStorageName, JSON.stringify(options)); -}; +} export const readOptions = (): undefined | Options => { const optionsRaw = localStorage.getItem(optionsLocalStorageName); @@ -23,10 +23,6 @@ export const readOptions = (): undefined | Options => { } try { const options = JSON.parse(optionsRaw) as Options; - if (!("searchBarStickyFocus" in options)) { - // compatibility with legacy options - options.searchBarStickyFocus = false; - } return options; } catch (e) { console.error("error parsing saved state JSON", e); @@ -40,18 +36,18 @@ export function saveUser(user: AT.LingdocsUser | undefined): void { } else { localStorage.removeItem(userLocalStorageName); } -}; +} export const readUser = (): AT.LingdocsUser | undefined => { - const userRaw = localStorage.getItem(userLocalStorageName); - if (!userRaw) { - return undefined; - } - try { - const user = JSON.parse(userRaw) as AT.LingdocsUser; - return user; - } catch (e) { - console.error("error parsing saved user JSON", e); - return undefined; - } -}; \ No newline at end of file + const userRaw = localStorage.getItem(userLocalStorageName); + if (!userRaw) { + return undefined; + } + try { + const user = JSON.parse(userRaw) as AT.LingdocsUser; + return user; + } catch (e) { + console.error("error parsing saved user JSON", e); + return undefined; + } +}; diff --git a/website/src/lib/wee-bit-fuzzy.test.ts b/website/src/lib/wee-bit-fuzzy.test.ts index 393cc7b..d834042 100644 --- a/website/src/lib/wee-bit-fuzzy.test.ts +++ b/website/src/lib/wee-bit-fuzzy.test.ts @@ -1,40 +1,40 @@ import { makeAWeeBitFuzzy } from "./wee-bit-fuzzy"; const pMatches = [ - ["پیټی", "پېټی"], - ["دوستی", "دوستي"], - ["پته", "پټه"], - ["تخلیه", "تحلیه"], + ["پیټی", "پېټی"], + ["دوستی", "دوستي"], + ["پته", "پټه"], + ["تخلیه", "تحلیه"], ]; const fMatches = [ - ["tahliya", "takhliya"], - ["sareyy", "saRey"], - ["peyTey", "peTey"], + ["tahliya", "takhliya"], + ["sarey", "saRay"], + ["peyTey", "peTey"], ]; pMatches.forEach((pair) => { - test(`${pair[0]} should match ${pair[1]}`, () => { - const re = makeAWeeBitFuzzy(pair[0], "p"); - const result = pair[1].match(new RegExp(re, "i")); - expect(result).toBeTruthy(); - }); - test(`${pair[1]} should match ${pair[0]}`, () => { - const re = makeAWeeBitFuzzy(pair[1], "p"); - const result = pair[0].match(new RegExp(re, "i")); - expect(result).toBeTruthy(); - }); + test(`${pair[0]} should match ${pair[1]}`, () => { + const re = makeAWeeBitFuzzy(pair[0], "p"); + const result = pair[1].match(new RegExp(re, "i")); + expect(result).toBeTruthy(); + }); + test(`${pair[1]} should match ${pair[0]}`, () => { + const re = makeAWeeBitFuzzy(pair[1], "p"); + const result = pair[0].match(new RegExp(re, "i")); + expect(result).toBeTruthy(); + }); }); fMatches.forEach((pair) => { - test(`${pair[0]} should match ${pair[1]} both ways`, () => { - const re = makeAWeeBitFuzzy(pair[0], "f"); - const result = pair[1].match(new RegExp(re, "i")); - expect(result).toBeTruthy(); - }); - test(`${pair[1]} should match ${pair[0]} both ways`, () => { - const re = makeAWeeBitFuzzy(pair[1], "f"); - const result = pair[0].match(new RegExp(re, "i")); - expect(result).toBeTruthy(); - }); -}); \ No newline at end of file + test(`${pair[0]} should match ${pair[1]} both ways`, () => { + const re = makeAWeeBitFuzzy(pair[0], "f"); + const result = pair[1].match(new RegExp(re, "i")); + expect(result).toBeTruthy(); + }); + test(`${pair[1]} should match ${pair[0]} both ways`, () => { + const re = makeAWeeBitFuzzy(pair[1], "f"); + const result = pair[0].match(new RegExp(re, "i")); + expect(result).toBeTruthy(); + }); +}); diff --git a/website/src/lib/wee-bit-fuzzy.ts b/website/src/lib/wee-bit-fuzzy.ts index a3c07a7..3db81fd 100644 --- a/website/src/lib/wee-bit-fuzzy.ts +++ b/website/src/lib/wee-bit-fuzzy.ts @@ -28,7 +28,7 @@ // R: "[r|R]", // }; -const fiveYeys = "[ئ|ۍ|ي|ې|ی]"; +const fiveYays = "[ئ|ۍ|ي|ې|ی]"; const sSounds = "[س|ص|ث|څ]"; const zSounds = "[ز|ژ|ض|ظ|ذ|ځ]"; const tSounds = "[ت|ط|ټ]"; @@ -39,106 +39,115 @@ const hKhSounds = "[خ|ح|ښ|ه]"; const alef = "[آ|ا]"; const pReplacer = { - "ی": fiveYeys, - "ي": fiveYeys, - "ۍ": fiveYeys, - "ئ": fiveYeys, - "ې": fiveYeys, + ی: fiveYays, + ي: fiveYays, + ۍ: fiveYays, + ئ: fiveYays, + ې: fiveYays, - "س": sSounds, - "ص": sSounds, - "ث": sSounds, - "څ": sSounds, + س: sSounds, + ص: sSounds, + ث: sSounds, + څ: sSounds, - "ز": zSounds, - "ظ": zSounds, - "ذ": zSounds, - "ض": zSounds, - "ژ": zSounds, - "ځ": zSounds, + ز: zSounds, + ظ: zSounds, + ذ: zSounds, + ض: zSounds, + ژ: zSounds, + ځ: zSounds, - "ت": tSounds, - "ط": tSounds, - "ټ": tSounds, + ت: tSounds, + ط: tSounds, + ټ: tSounds, - "د": dSounds, - "ډ": dSounds, + د: dSounds, + ډ: dSounds, - "ر": rSounds, - "ړ": rSounds, + ر: rSounds, + ړ: rSounds, - "ن": nSounds, - "ڼ": nSounds, + ن: nSounds, + ڼ: nSounds, - "خ": hKhSounds, - "ح": hKhSounds, - "ښ": hKhSounds, - "ه": hKhSounds, + خ: hKhSounds, + ح: hKhSounds, + ښ: hKhSounds, + ه: hKhSounds, - "ا": alef, - "آ": alef, + ا: alef, + آ: alef, }; -const fiveYeysF = "(?:eyy|ey|ee|é|e|uy)"; +const fiveYaysF = "(?:ey|ay|ee|é|e|uy)"; const hKhF = "(?:kh|h|x)"; const zSoundsF = "(?:z|dz)"; const sSoundsF = "(?:ts|s)"; const fReplacer = { - "eyy": fiveYeysF, - "ey": fiveYeysF, - "uy": fiveYeysF, - "ee": fiveYeysF, - "e": fiveYeysF, + ey: fiveYaysF, + ay: fiveYaysF, + uy: fiveYaysF, + ee: fiveYaysF, + e: fiveYaysF, - "z": zSoundsF, - "dz": zSoundsF, - "x": hKhF, - "h": hKhF, - "kh": hKhF, - "ts": sSoundsF, - "s": sSoundsF, - // only used if ignoring accents - "a": "[a|á]", - "á": "[a|á|u|ú]", - "u": "[u|ú|a|á]", - "ú": "[u|ú]", - "o": "[o|ó]", - "ó": "[o|ó]", - "i": "[i|í]", - "í": "[i|í]", - "U": "[U|Ú]", - "Ú": "[U|Ú]", - "éy": fiveYeysF, - "éyy": fiveYeysF, - "úy": fiveYeysF, - "ée": fiveYeysF, - "é": fiveYeysF, + z: zSoundsF, + dz: zSoundsF, + x: hKhF, + h: hKhF, + kh: hKhF, + ts: sSoundsF, + s: sSoundsF, + // only used if ignoring accents + a: "[a|á]", + á: "[a|á|u|ú]", + u: "[u|ú|a|á]", + ú: "[u|ú]", + o: "[o|ó]", + ó: "[o|ó]", + i: "[i|í]", + í: "[i|í]", + U: "[U|Ú]", + Ú: "[U|Ú]", + áy: fiveYaysF, + éy: fiveYaysF, + úy: fiveYaysF, + ée: fiveYaysF, + é: fiveYaysF, }; const pRepRegex = new RegExp(Object.keys(pReplacer).join("|"), "g"); -const fRepRegex = /eyy|ey|uy|ee|e|z|dz|x|kh|h|ts|s/g; +const fRepRegex = /ey|ay|uy|ee|e|z|dz|x|kh|h|ts|s/g; -const fRepRegexWAccents = /eyy|éyy|ey|éy|uy|úy|ee|ée|e|é|z|dz|x|ts|s|kh|h|a|á|i|í|o|ó|u|ú|U|Ú/g; +const fRepRegexWAccents = + /ey|éy|ay|áy|uy|úy|ee|ée|e|é|z|dz|x|ts|s|kh|h|a|á|i|í|o|ó|u|ú|U|Ú/g; function makePAWeeBitFuzzy(s: string): string { - // + s.replace(/ /g, "").split("").join(" *"); - return "^" + s.replace(pRepRegex, mtch => { - // @ts-ignore - return `${pReplacer[mtch]}`; - }); + // + s.replace(/ /g, "").split("").join(" *"); + return ( + "^" + + s.replace(pRepRegex, (mtch) => { + // @ts-ignore + return `${pReplacer[mtch]}`; + }) + ); } function makeFAWeeBitFuzzy(s: string, ignoreAccent?: boolean): string { - return "^" + s.replace((ignoreAccent ? fRepRegexWAccents : fRepRegex), mtch => { - // @ts-ignore - return fReplacer[mtch]; - }); + return ( + "^" + + s.replace(ignoreAccent ? fRepRegexWAccents : fRepRegex, (mtch) => { + // @ts-ignore + return fReplacer[mtch]; + }) + ); } -export function makeAWeeBitFuzzy(s: string, i: "f" | "p", ignoreAccent?: boolean): string { - return i === "p" - ? makePAWeeBitFuzzy(s) - : makeFAWeeBitFuzzy(s, ignoreAccent); -} \ No newline at end of file +export function makeAWeeBitFuzzy( + s: string, + i: "f" | "p", + ignoreAccent?: boolean +): string { + return i === "p" ? makePAWeeBitFuzzy(s) : makeFAWeeBitFuzzy(s, ignoreAccent); +} diff --git a/website/src/types/dictionary-types.ts b/website/src/types/dictionary-types.ts index 81ffcbc..9fecda6 100644 --- a/website/src/types/dictionary-types.ts +++ b/website/src/types/dictionary-types.ts @@ -1,71 +1,88 @@ -export type DictionaryStatus = "loading" | "ready" | "updating" | "error loading"; +export type DictionaryStatus = + | "loading" + | "ready" + | "updating" + | "error loading"; export type State = { - dictionaryStatus: DictionaryStatus, - searchValue: string, - options: Options, - page: number, - isolatedEntry: import("@lingdocs/ps-react").Types.DictionaryEntry | undefined, - results: import("@lingdocs/ps-react").Types.DictionaryEntry[], - wordlist: WordlistWord[], - reviewTasks: import("./functions-types").ReviewTask[], - dictionaryInfo: import("@lingdocs/ps-react").Types.DictionaryInfo | undefined, - user: undefined | import("./account-types").LingdocsUser, - inflectionSearchResults: undefined | "searching" | { - exact: InflectionSearchResult[], - fuzzy: InflectionSearchResult[], - }, -} + dictionaryStatus: DictionaryStatus; + showModal: boolean; + searchValue: string; + options: Options; + page: number; + isolatedEntry: import("@lingdocs/ps-react").Types.DictionaryEntry | undefined; + results: import("@lingdocs/ps-react").Types.DictionaryEntry[]; + wordlist: WordlistWord[]; + reviewTasks: import("./functions-types").ReviewTask[]; + dictionaryInfo: import("@lingdocs/ps-react").Types.DictionaryInfo | undefined; + user: undefined | import("./account-types").LingdocsUser; + inflectionSearchResults: + | undefined + | "searching" + | { + exact: InflectionSearchResult[]; + fuzzy: InflectionSearchResult[]; + }; +}; export type DictionaryAPI = { - initialize: () => Promise<{ - response: "loaded first time" | "loaded from saved", - dictionaryInfo: import("@lingdocs/ps-react").Types.DictionaryInfo, - }>, - update: (updateComing: () => void) => Promise<{ - response: "no need for update" | "updated" | "unable to check", - dictionaryInfo: import("@lingdocs/ps-react").Types.DictionaryInfo, - }>, - search: (state: State) => import("@lingdocs/ps-react").Types.DictionaryEntry[], - exactPashtoSearch: (search: string) => import("@lingdocs/ps-react").Types.DictionaryEntry[], - getNewWordsThisMonth: () => import("@lingdocs/ps-react").Types.DictionaryEntry[], - findOneByTs: (ts: number) => import("@lingdocs/ps-react").Types.DictionaryEntry | undefined, - findRelatedEntries: (entry: import("@lingdocs/ps-react").Types.DictionaryEntry) => import("@lingdocs/ps-react").Types.DictionaryEntry[], -} + initialize: () => Promise<{ + response: "loaded first time" | "loaded from saved"; + dictionaryInfo: import("@lingdocs/ps-react").Types.DictionaryInfo; + }>; + update: (updateComing: () => void) => Promise<{ + response: "no need for update" | "updated" | "unable to check"; + dictionaryInfo: import("@lingdocs/ps-react").Types.DictionaryInfo; + }>; + search: ( + state: State + ) => import("@lingdocs/ps-react").Types.DictionaryEntry[]; + exactPashtoSearch: ( + search: string + ) => import("@lingdocs/ps-react").Types.DictionaryEntry[]; + getNewWordsThisMonth: () => import("@lingdocs/ps-react").Types.DictionaryEntry[]; + findOneByTs: ( + ts: number + ) => import("@lingdocs/ps-react").Types.DictionaryEntry | undefined; + findRelatedEntries: ( + entry: import("@lingdocs/ps-react").Types.DictionaryEntry + ) => import("@lingdocs/ps-react").Types.DictionaryEntry[]; +}; export type WordlistWordBase = { - _id: string, - /* a backup copy of the full dictionary entry in case it gets deleted from the dictionary */ - entry: import("@lingdocs/ps-react").Types.DictionaryEntry, - /* the notes/context provided by the user for the word in their wordlist */ - notes: string, - supermemo: import("supermemo").SuperMemoItem, - /* rep/stage of warmup stage before moving into supermemo mode */ - warmup: number | "done", - /* date due for review - ISO string */ - dueDate: number, -} + _id: string; + /* a backup copy of the full dictionary entry in case it gets deleted from the dictionary */ + entry: import("@lingdocs/ps-react").Types.DictionaryEntry; + /* the notes/context provided by the user for the word in their wordlist */ + notes: string; + supermemo: import("supermemo").SuperMemoItem; + /* rep/stage of warmup stage before moving into supermemo mode */ + warmup: number | "done"; + /* date due for review - ISO string */ + dueDate: number; +}; export type WordlistAttachmentInfo = { - imgSize?: { height: number, width: number }, - _attachments: Attachments, -} + imgSize?: { height: number; width: number }; + _attachments: Attachments; +}; -export type WordlistWordWAttachments = WordlistWordBase & WordlistAttachmentInfo; +export type WordlistWordWAttachments = WordlistWordBase & + WordlistAttachmentInfo; export type WordlistWord = WordlistWordBase | WordlistWordWAttachments; export type Options = { - language: Language, - searchType: SearchType, - theme: Theme, - textOptionsRecord: TextOptionsRecord, - wordlistMode: WordlistMode, - wordlistReviewLanguage: Language, - wordlistReviewBadge: boolean, - searchBarPosition: SearchBarPosition, - searchBarStickyFocus: boolean, -} + language: Language; + searchType: SearchType; + theme: Theme; + textOptionsRecord: TextOptionsRecord; + wordlistMode: WordlistMode; + wordlistReviewLanguage: Language; + wordlistReviewBadge: boolean; + searchBarPosition: SearchBarPosition; + searchBarStickyFocus: boolean; +}; export type Language = "Pashto" | "English"; export type SearchType = "alphabetical" | "fuzzy"; @@ -78,84 +95,102 @@ export type SearchBarPosition = "top" | "bottom"; export type WordlistMode = "browse" | "review"; export type TextOptionsRecord = { - lastModified: import("./account-types").TimeStamp, - textOptions: import("@lingdocs/ps-react").Types.TextOptions, + lastModified: import("./account-types").TimeStamp; + textOptions: import("@lingdocs/ps-react").Types.TextOptions; }; export type UserLevel = "basic" | "student" | "editor"; -export type OptionsAction = { - type: "toggleSearchType", -} | { - type: "toggleLanguage", -} | { - type: "changeTheme", - payload: Theme, -} | { - type: "changeSearchBarPosition", - payload: SearchBarPosition, -} | { - type: "changeWordlistMode", - payload: WordlistMode, -} | { - type: "changeWordlistReviewLanguage", - payload: Language, -} | { - type: "changeWordlistReviewBadge", - payload: boolean, -} | { - type: "updateTextOptionsRecord", - payload: TextOptionsRecord, -} | { - type: "changeSearchBarStickyFocus", - payload: boolean, -} | { - type: "setShowPlayStoreButton", - payload: boolean, -}; +export type OptionsAction = + | { + type: "toggleSearchType"; + } + | { + type: "toggleLanguage"; + } + | { + type: "changeTheme"; + payload: Theme; + } + | { + type: "changeSearchBarPosition"; + payload: SearchBarPosition; + } + | { + type: "changeWordlistMode"; + payload: WordlistMode; + } + | { + type: "changeWordlistReviewLanguage"; + payload: Language; + } + | { + type: "changeWordlistReviewBadge"; + payload: boolean; + } + | { + type: "updateTextOptionsRecord"; + payload: TextOptionsRecord; + } + | { + type: "changeSearchBarStickyFocus"; + payload: boolean; + } + | { + type: "setShowPlayStoreButton"; + payload: boolean; + }; -export type TextOptionsAction = { - type: "changePTextSize", - payload: PTextSize, -} | { - type: "changeSpelling", - payload: import("@lingdocs/ps-react").Types.Spelling, -} | { - type: "changePhonetics", - payload: "lingdocs" | "ipa" | "alalc" | "none", -} | { - type: "changeDialect", - payload: "standard" | "peshawer" | "southern", -} | { - type: "changeDiacritics", - payload: boolean, -}; +export type TextOptionsAction = + | { + type: "changePTextSize"; + payload: PTextSize; + } + | { + type: "changeSpelling"; + payload: import("@lingdocs/ps-react").Types.Spelling; + } + | { + type: "changePhonetics"; + payload: "lingdocs" | "ipa" | "alalc" | "none"; + } + | { + type: "changeDialect"; + payload: "standard" | "peshawer" | "southern"; + } + | { + type: "changeDiacritics"; + payload: boolean; + }; export type AttachmentToPut = { - content_type: string, - data: string | Blob, -} - -export type AttachmentWithData = { - content_type: string, - digest: string, - data: string | Blob, -} - -export type AttachmentWOutData = { - content_type: string, - digest: string, - stub: true; -} - -export type Attachment = AttachmentToPut | AttachmentWithData | AttachmentWOutData -export type AttachmentType = "image" | "audio"; -export type Attachments = { - /* only allows one image and one audio attachment - max 2 values */ - [filename: string]: Attachment, + content_type: string; + data: string | Blob; }; -export type WordlistWordDoc = WordlistWord & { _rev: string, _id: string }; +export type AttachmentWithData = { + content_type: string; + digest: string; + data: string | Blob; +}; + +export type AttachmentWOutData = { + content_type: string; + digest: string; + stub: true; +}; + +export type Attachment = + | AttachmentToPut + | AttachmentWithData + | AttachmentWOutData; +export type AttachmentType = "image" | "audio"; +export type Attachments = { + /* only allows one image and one audio attachment - max 2 values */ + [filename: string]: Attachment; +}; + +export type WordlistWordDoc = WordlistWord & { _rev: string; _id: string }; export type InflectionName = "plain" | "1st" | "2nd"; @@ -167,15 +202,14 @@ export type PluralInflectionName = "plural" | "2nd"; // the possible matches, and their person/inflection number export type InflectionSearchResult = { - entry: import("@lingdocs/ps-react").Types.DictionaryEntry, - forms: InflectionFormMatch[], -} - -export type InflectionFormMatch = { - path: string[], - matches: { - ps: import("@lingdocs/ps-react").Types.PsString, - pos: InflectionName[] | import("@lingdocs/ps-react").Types.Person[] | null, - }[], + entry: import("@lingdocs/ps-react").Types.DictionaryEntry; + forms: InflectionFormMatch[]; }; +export type InflectionFormMatch = { + path: string[]; + matches: { + ps: import("@lingdocs/ps-react").Types.PsString; + pos: InflectionName[] | import("@lingdocs/ps-react").Types.Person[] | null; + }[]; +}; diff --git a/website/yarn.lock b/website/yarn.lock index 4d5d3e9..aef2785 100644 --- a/website/yarn.lock +++ b/website/yarn.lock @@ -2349,10 +2349,10 @@ "@jridgewell/resolve-uri" "^3.0.3" "@jridgewell/sourcemap-codec" "^1.4.10" -"@lingdocs/ps-react@5.10.1": - version "5.10.1" - resolved "https://npm.lingdocs.com/@lingdocs%2fps-react/-/ps-react-5.10.1.tgz#949850aaa3c9de54d4beed1daa9b546bb0a84df9" - integrity sha512-Ro/6Fq9mEdF4/2wJf8USkIlYe+9vWmez/RhoUF0mTjOhmyTGV6cpajK0Qpo1WyCaL5d/6BTI3qVuk5h8pWRQjA== +"@lingdocs/ps-react@6.0.0": + version "6.0.0" + resolved "https://npm.lingdocs.com/@lingdocs%2fps-react/-/ps-react-6.0.0.tgz#dbdfd1a5afd19253679169eacbf1da5562db5dc3" + integrity sha512-+j6F65FtmPbeEjjHtE3JqKHtCcUM+cMAN2RMTd8yyacJ4sTJW/oWC+6rAQGQqc1da3lP7tuxt6p+esmFYI9fgQ== dependencies: "@formkit/auto-animate" "^1.0.0-beta.3" classnames "^2.2.6"