diff --git a/.gitignore b/.gitignore index 737d872..a9ae364 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,5 @@ +.env + # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. # dependencies diff --git a/components/home/Home.tsx b/components/home/Home.tsx index 3a0879d..1b89492 100644 --- a/components/home/Home.tsx +++ b/components/home/Home.tsx @@ -15,6 +15,7 @@ export const Home: FC = () => { groups, addGroup, doNotSuggest, + baseFactories, ignoredFactories, setIgnoredFactories, store, @@ -40,6 +41,15 @@ export const Home: FC = () => { + { const stream = evt.currentTarget.files?.[0].stream() as globalThis.ReadableStream|undefined if (stream) { diff --git a/next.config.js b/next.config.js index e674786..5198568 100644 --- a/next.config.js +++ b/next.config.js @@ -1,7 +1,16 @@ +const envVar = require('env-var') + /** @type {import('next').NextConfig} */ const nextConfig = { reactStrictMode: true, - swcMinify: true + swcMinify: true, + /** @type {import('next/config').ServerRuntimeConfig} */ + serverRuntimeConfig: { + MONGO_URL: envVar.get('MONGO_URL').required().asUrlString(), + MONGO_DB: envVar.get('MONGO_DB').required().asString(), + MONGO_USER: envVar.get('MONGO_USER').required().asString(), + MONGO_PASS: envVar.get('MONGO_PASS').required().asString() + } } module.exports = nextConfig diff --git a/package.json b/package.json index b9d7fa1..d8dbb11 100644 --- a/package.json +++ b/package.json @@ -11,6 +11,8 @@ "dependencies": { "classnames": "^2.3.1", "deepcopy": "^2.1.0", + "env-var": "^7.1.1", + "mongodb": "^4.8.1", "next": "12.2.4", "pako": "^2.0.4", "react": "18.2.0", diff --git a/pages/api/submit.ts b/pages/api/submit.ts new file mode 100644 index 0000000..c20affa --- /dev/null +++ b/pages/api/submit.ts @@ -0,0 +1,13 @@ +import {NextApiHandler} from "next"; +import {Dict, Group} from "../../src/types"; +import {setGroups} from "../../src/database/groups"; + +const handler: NextApiHandler = async (req, res) => { + if (req.method !== 'POST') throw new Error('Invalid method') + const {groups, ignored, base} = req.body as {groups: Dict, ignored: string[], base: string[]} + const uuid = await setGroups(groups, ignored, base) + console.log(uuid) + res.json({ uuid }) +} + +export default handler diff --git a/src/database/groups.ts b/src/database/groups.ts new file mode 100644 index 0000000..58ba0cd --- /dev/null +++ b/src/database/groups.ts @@ -0,0 +1,19 @@ +import {database} from "./start"; +import {Dict, Group} from "../types"; +import crypto from "crypto" + +export async function setGroups(groups: Dict, ignored: string[], base: string[]) { + const collection = (await database.resolve())?.collection('setups') + if (!collection) return + await collection.deleteMany({}).catch(e => { + if (e.message !== 'ns not found') throw e + }) + const result = await collection.insertOne({ + groups, + ignored, + base, + createdOn: new Date(), + modifiedOn: new Date() + }) + return result.insertedId.toString() +} diff --git a/src/database/start.ts b/src/database/start.ts new file mode 100644 index 0000000..5f3efb6 --- /dev/null +++ b/src/database/start.ts @@ -0,0 +1,20 @@ +import {Db, MongoClient} from 'mongodb' +import getConfig from 'next/config' +import {Resolvable} from "../utils/Resolvable"; + +const { serverRuntimeConfig: { + MONGO_URL, + MONGO_USER, + MONGO_PASS, + MONGO_DB +} } = getConfig() + +async function getDatabase(): Promise { + const url = `mongodb://${MONGO_USER ? `${MONGO_USER}:${MONGO_PASS ?? ''}@` : ''}${MONGO_URL}`; + const client = new MongoClient(url); + await client.connect(); + console.log('Connected successfully to server') + return client.db(MONGO_DB) +} + +export const database = new Resolvable(getDatabase) diff --git a/src/next-types.d.ts b/src/next-types.d.ts new file mode 100644 index 0000000..a654342 --- /dev/null +++ b/src/next-types.d.ts @@ -0,0 +1,22 @@ + + + + +declare module 'next/config' { + export interface ServerRuntimeConfig { + MONGO_URL: string + MONGO_DB: string + MONGO_USER?: string + MONGO_PASS?: string + } + + export interface PublicRuntimeConfig { + } + + const getConfig: () => { + serverRuntimeConfig: ServerRuntimeConfig, + publicRuntimeConfig: PublicRuntimeConfig + } + //export const serConfig = () => + export default getConfig +} diff --git a/src/utils/Resolvable.ts b/src/utils/Resolvable.ts new file mode 100644 index 0000000..1dd26c1 --- /dev/null +++ b/src/utils/Resolvable.ts @@ -0,0 +1,97 @@ +// eslint-disable-next-line no-shadow +enum ResolvableState { + WAITING, + PENDING, + ERROR, + DONE +} + +class FetchOnce { + protected data: T | undefined + protected error: unknown | undefined + protected state: ResolvableState = ResolvableState.WAITING + protected pendingList: [(res: Promise | T) => void, (reason: unknown) => void][] = [] + + constructor(protected fetchMethod?: () => Promise) {} + + public reset(): void { + this.data = undefined + this.error = undefined + this.state = ResolvableState.WAITING + } + + public resolve(): Promise { + return new Promise((resolve, reject) => { + switch (this.state) { + case ResolvableState.WAITING: + this.state = ResolvableState.PENDING + this.pendingList.push([resolve, reject]) + if (this.fetchMethod) this.parsePromise(this.fetchMethod()) + break + case ResolvableState.PENDING: + this.pendingList.push([resolve, reject]) + break + case ResolvableState.DONE: + resolve(this.data!) + break + case ResolvableState.ERROR: + reject(this.error) + break + } + }) + } + + protected isFinished(): boolean { + return this.state === ResolvableState.DONE || this.state === ResolvableState.ERROR + } + + protected parsePromise(promise: Promise): void { + promise + .then(data => { + this.data = data + this.state = ResolvableState.DONE + this.pendingList.forEach(pending => pending[0](data)) + }) + .catch(err => { + this.error = err + this.state = ResolvableState.ERROR + this.pendingList.forEach(pending => pending[1](err)) + }) + } +} + +export class Resolvable> extends FetchOnce { + // eslint-disable-next-line @typescript-eslint/no-useless-constructor + constructor(fetchMethod: (...args: U) => Promise) { + super(fetchMethod) + } +} + +export class WaitForSync extends FetchOnce { + protected state: ResolvableState = ResolvableState.PENDING + + constructor() { + super(undefined) + } + + public setData(data: T): void { + if (!this.isFinished()) { + this.parsePromise((async () => data)()) + } + } + + public setError(error: unknown): void { + if (!this.isFinished()) { + this.parsePromise( + (async () => { + throw error + })() + ) + } + } + + public reset(): void { + super.reset() + this.state = ResolvableState.PENDING + } +} diff --git a/yarn.lock b/yarn.lock index e0304f4..cb766da 100644 --- a/yarn.lock +++ b/yarn.lock @@ -303,6 +303,11 @@ resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== +"@types/node@*": + version "18.7.6" + resolved "https://registry.yarnpkg.com/@types/node/-/node-18.7.6.tgz#31743bc5772b6ac223845e18c3fc26f042713c83" + integrity sha512-EdxgKRXgYsNITy5mjjXjVE/CS8YENSdhiagGrLqjG0pvA2owgJ6i4l7wy/PFZGC0B1/H20lWKN7ONVDNYDZm7A== + "@types/node@18.6.4": version "18.6.4" resolved "https://registry.yarnpkg.com/@types/node/-/node-18.6.4.tgz#fd26723a8a3f8f46729812a7f9b4fc2d1608ed39" @@ -356,6 +361,19 @@ resolved "https://registry.yarnpkg.com/@types/seedrandom/-/seedrandom-3.0.2.tgz#7f30db28221067a90b02e73ffd46b6685b18df1a" integrity sha512-YPLqEOo0/X8JU3rdiq+RgUKtQhQtrppE766y7vMTu8dGML7TVtZNiiiaC/hhU9Zqw9UYopXxhuWWENclMVBwKQ== +"@types/webidl-conversions@*": + version "6.1.1" + resolved "https://registry.yarnpkg.com/@types/webidl-conversions/-/webidl-conversions-6.1.1.tgz#e33bc8ea812a01f63f90481c666334844b12a09e" + integrity sha512-XAahCdThVuCFDQLT7R7Pk/vqeObFNL3YqRyFZg+AqAP/W1/w3xHaIxuW7WszQqTbIBOPRcItYJIou3i/mppu3Q== + +"@types/whatwg-url@^8.2.1": + version "8.2.2" + resolved "https://registry.yarnpkg.com/@types/whatwg-url/-/whatwg-url-8.2.2.tgz#749d5b3873e845897ada99be4448041d4cc39e63" + integrity sha512-FtQu10RWgn3D9U4aazdwIE2yzphmTJREDqNdODHrbrZmmMqI0vMheC/6NE/J1Yveaj8H+ela+YwWTjq5PGmuhA== + dependencies: + "@types/node" "*" + "@types/webidl-conversions" "*" + "@typescript-eslint/parser@^5.21.0": version "5.33.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.33.0.tgz#26ec3235b74f0667414613727cb98f9b69dc5383" @@ -517,6 +535,11 @@ balanced-match@^1.0.0: resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== +base64-js@^1.3.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" + integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== + brace-expansion@^1.1.7: version "1.1.11" resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" @@ -532,6 +555,21 @@ braces@^3.0.2: dependencies: fill-range "^7.0.1" +bson@^4.6.5: + version "4.6.5" + resolved "https://registry.yarnpkg.com/bson/-/bson-4.6.5.tgz#1a410148c20eef4e40d484878a037a7036e840fb" + integrity sha512-uqrgcjyOaZsHfz7ea8zLRCLe1u+QGUSzMZmvXqO24CDW7DWoW1qiN9folSwa7hSneTSgM2ykDIzF5kcQQ8cwNw== + dependencies: + buffer "^5.6.0" + +buffer@^5.6.0: + version "5.7.1" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" + integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.1.13" + call-bind@^1.0.0, call-bind@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" @@ -689,6 +727,11 @@ define-properties@^1.1.3, define-properties@^1.1.4: has-property-descriptors "^1.0.0" object-keys "^1.1.1" +denque@^2.0.1: + version "2.1.0" + resolved "https://registry.yarnpkg.com/denque/-/denque-2.1.0.tgz#e93e1a6569fb5e66f16a3c2a2964617d349d6ab1" + integrity sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw== + dir-glob@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" @@ -728,6 +771,11 @@ emoji-regex@^9.2.2: resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== +env-var@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/env-var/-/env-var-7.1.1.tgz#c1697f8dfded0b54418dc9bbd78a82119910e57c" + integrity sha512-4+vvlq+wwGQNwY/nI3/+Ojc1MKHCmITRJ6VWkQzDtMD6fAEb60ACRUCnlIAonMKW9YzqYmYxbyVu9vTb++yNRg== + error-ex@^1.3.1: version "1.3.2" resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" @@ -1235,6 +1283,11 @@ hoist-non-react-statics@^3.3.1: dependencies: react-is "^16.7.0" +ieee754@^1.1.13: + version "1.2.1" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" + integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== + ignore@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.0.tgz#6d3bac8fa7fe0d45d9f9be7bac2fc279577e345a" @@ -1275,6 +1328,11 @@ internal-slot@^1.0.3: has "^1.0.3" side-channel "^1.0.4" +ip@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ip/-/ip-2.0.0.tgz#4cf4ab182fee2314c75ede1276f8c80b479936da" + integrity sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ== + is-arrayish@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" @@ -1490,6 +1548,11 @@ memoize-one@^5.0.0: resolved "https://registry.yarnpkg.com/memoize-one/-/memoize-one-5.2.1.tgz#8337aa3c4335581839ec01c3d594090cebe8f00e" integrity sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q== +memory-pager@^1.0.2: + version "1.5.0" + resolved "https://registry.yarnpkg.com/memory-pager/-/memory-pager-1.5.0.tgz#d8751655d22d384682741c972f2c3d6dfa3e66b5" + integrity sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg== + merge2@^1.3.0, merge2@^1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" @@ -1515,6 +1578,26 @@ minimist@^1.2.0, minimist@^1.2.6: resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.6.tgz#8637a5b759ea0d6e98702cfb3a9283323c93af44" integrity sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q== +mongodb-connection-string-url@^2.5.2: + version "2.5.3" + resolved "https://registry.yarnpkg.com/mongodb-connection-string-url/-/mongodb-connection-string-url-2.5.3.tgz#c0c572b71570e58be2bd52b33dffd1330cfb6990" + integrity sha512-f+/WsED+xF4B74l3k9V/XkTVj5/fxFH2o5ToKXd8Iyi5UhM+sO9u0Ape17Mvl/GkZaFtM0HQnzAG5OTmhKw+tQ== + dependencies: + "@types/whatwg-url" "^8.2.1" + whatwg-url "^11.0.0" + +mongodb@^4.8.1: + version "4.8.1" + resolved "https://registry.yarnpkg.com/mongodb/-/mongodb-4.8.1.tgz#596de88ff4519128266d9254dbe5b781c4005796" + integrity sha512-/NyiM3Ox9AwP5zrfT9TXjRKDJbXlLaUDQ9Rg//2lbg8D2A8GXV0VidYYnA/gfdK6uwbnL4FnAflH7FbGw3TS7w== + dependencies: + bson "^4.6.5" + denque "^2.0.1" + mongodb-connection-string-url "^2.5.2" + socks "^2.6.2" + optionalDependencies: + saslprep "^1.0.3" + ms@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" @@ -1763,7 +1846,7 @@ prop-types@^15.6.0, prop-types@^15.6.2, prop-types@^15.7.2, prop-types@^15.8.1: object-assign "^4.1.1" react-is "^16.13.1" -punycode@^2.1.0: +punycode@^2.1.0, punycode@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== @@ -1899,6 +1982,13 @@ safe-buffer@~5.1.1: resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== +saslprep@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/saslprep/-/saslprep-1.0.3.tgz#4c02f946b56cf54297e347ba1093e7acac4cf226" + integrity sha512-/MY/PEMbk2SuY5sScONwhUDsV2p77Znkb/q3nSVstq/yQzYJOH/Azh29p9oJLsl3LnQwSvZDKagDGBsBwSooag== + dependencies: + sparse-bitfield "^3.0.3" + scheduler@^0.23.0: version "0.23.0" resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.23.0.tgz#ba8041afc3d30eb206a487b6b384002e4e61fdfe" @@ -1949,6 +2039,19 @@ slash@^3.0.0: resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== +smart-buffer@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-4.2.0.tgz#6e1d71fa4f18c05f7d0ff216dd16a481d0e8d9ae" + integrity sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg== + +socks@^2.6.2: + version "2.7.0" + resolved "https://registry.yarnpkg.com/socks/-/socks-2.7.0.tgz#f9225acdb841e874dca25f870e9130990f3913d0" + integrity sha512-scnOe9y4VuiNUULJN72GrM26BNOjVsfPXI+j+98PkyEfsIXroa5ofyjT+FzGvn/xHs73U2JtoBYAVx9Hl4quSA== + dependencies: + ip "^2.0.0" + smart-buffer "^4.2.0" + 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" @@ -1959,6 +2062,13 @@ source-map@^0.5.7: resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" integrity sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ== +sparse-bitfield@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz#ff4ae6e68656056ba4b3e792ab3334d38273ca11" + integrity sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ== + dependencies: + memory-pager "^1.0.2" + string.prototype.matchall@^4.0.7: version "4.0.7" resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.7.tgz#8e6ecb0d8a1fb1fda470d81acecb2dba057a481d" @@ -2054,6 +2164,13 @@ to-regex-range@^5.0.1: dependencies: is-number "^7.0.0" +tr46@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-3.0.0.tgz#555c4e297a950617e8eeddef633c87d4d9d6cbf9" + integrity sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA== + dependencies: + punycode "^2.1.1" + tsconfig-paths@^3.14.1: version "3.14.1" resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz#ba0734599e8ea36c862798e920bcf163277b137a" @@ -2135,6 +2252,19 @@ v8-compile-cache@^2.0.3: resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee" integrity sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA== +webidl-conversions@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-7.0.0.tgz#256b4e1882be7debbf01d05f0aa2039778ea080a" + integrity sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g== + +whatwg-url@^11.0.0: + version "11.0.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-11.0.0.tgz#0a849eebb5faf2119b901bb76fd795c2848d4018" + integrity sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ== + dependencies: + tr46 "^3.0.0" + webidl-conversions "^7.0.0" + which-boxed-primitive@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6"