├── .gitignore ├── .prettierrc ├── .env.example ├── Dockerfile ├── src ├── types.ts ├── index.ts ├── mapper.ts └── mapper.test.ts ├── package.json ├── README.md ├── tsconfig.json └── yarn.lock /.gitignore: -------------------------------------------------------------------------------- 1 | dist 2 | .idea 3 | node_modules 4 | .env -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "semi": true, 3 | "singleQuote": true, 4 | "printWidth": 80, 5 | "quoteProps": "consistent", 6 | "trailingComma": "all" 7 | } -------------------------------------------------------------------------------- /.env.example: -------------------------------------------------------------------------------- 1 | TRAEFIK_MAPPER_BASE_ENDPOINT=https://coolify.example.io/webhooks/traefik/main.json 2 | 3 | TRAEFIK_MAPPER_NEW_HTTP_ENTRYPOINT=http 4 | TRAEFIK_MAPPER_NEW_HTTPS_ENTRYPOINT=https 5 | TRAEFIK_MAPPER_NEW_CERT_RESOLVER=letsencrypt 6 | 7 | TRAEFIK_MAPPER_ADD_MIDDLEWARE_NAME=auth 8 | 9 | TRAEFIK_MAPPER_FILTER_COOLIFY=true 10 | TRAEFIK_MAPPER_FILTER_WWW_MIDDLEWARE=true 11 | TRAEFIK_MAPPER_FILTER_HTTP_ROUTERS=true 12 | TRAEFIK_MAPPER_FILTER_WWW_ROUTERS=true 13 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | # Build Stage 1 2 | # This build created a staging docker image 3 | # 4 | FROM node:16-alpine AS appbuild 5 | WORKDIR /usr/src/app 6 | COPY package.json yarn.lock ./ 7 | RUN yarn install --frozen-lockfile 8 | COPY ./src ./tsconfig.json ./ 9 | RUN npm run build 10 | # Build Stage 2 11 | # This build takes the production build from staging build 12 | # 13 | FROM node:16-alpine 14 | WORKDIR /usr/src/app 15 | COPY package.json yarn.lock ./ 16 | RUN yarn install --frozen-lockfile --prod 17 | COPY --from=appbuild /usr/src/app/dist ./dist 18 | 19 | 20 | EXPOSE 8080 21 | CMD npm start -------------------------------------------------------------------------------- /src/types.ts: -------------------------------------------------------------------------------- 1 | export type Entrypoints = 'web' | 'websecure' | string; 2 | export type Middlewares = 3 | | 'redirect-to-https' 4 | | 'redirect-to-non-www' 5 | | 'redirect-to-http' 6 | | 'redirect-to-www' 7 | | string; 8 | 9 | export interface Router { 10 | entrypoints: Entrypoints[]; 11 | rule: string; 12 | service: string; 13 | middlewares: Middlewares[]; 14 | tls?: { 15 | certresolver?: 'letsencrypt' | string; 16 | domains?: { 17 | main: string; 18 | }; 19 | }; 20 | } 21 | 22 | export interface Service { 23 | loadbalancer: { 24 | servers: { url: string }[]; 25 | }; 26 | } 27 | 28 | export interface TraefikDefinition { 29 | http: { 30 | routers: Record; 31 | services: Record; 32 | middlewares: Record; 33 | }; 34 | } 35 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "traefik-http-provider-mapper", 3 | "version": "1.0.0", 4 | "description": "A traefik http provider mapping server to edit an existing http provider", 5 | "main": "index.js", 6 | "license": "MIT", 7 | "homepage": "https://github.com/beaussan/traefik-http-provider-mapper#readme", 8 | "repository": { 9 | "type": "git", 10 | "url": "git+https://github.com/beaussan/traefik-http-provider-mapper.git" 11 | }, 12 | "bugs": { 13 | "url": "https://github.com/beaussan/traefik-http-provider-mapper/issues" 14 | }, 15 | "scripts": { 16 | "build": "tsc -p tsconfig.json", 17 | "start": "node dist/index.js", 18 | "start:dotenv": "node -r dotenv/config dist/index.js dotenv_config_path=.env", 19 | "test": "vitest", 20 | "format:write": "prettier --write \"**/*.{js,vue,json,ts,tsx,md,yml,html}\"", 21 | "format:check": "prettier --list-different \"**/*.{js,vue,json,ts,tsx,md,yml,html}\"" 22 | }, 23 | "dependencies": { 24 | "axios": "^0.27.2", 25 | "fastify": "^3.29.0" 26 | }, 27 | "devDependencies": { 28 | "@types/node": "^17.0.39", 29 | "dotenv": "^16.0.1", 30 | "husky": "8.0.1", 31 | "prettier": "2.6.2", 32 | "pretty-quick": "3.1.3", 33 | "typescript": "^4.7.3", 34 | "vitest": "^0.13.1" 35 | }, 36 | "husky": { 37 | "hooks": { 38 | "pre-commit": "pretty-quick --staged" 39 | } 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- 1 | import fastify from 'fastify'; 2 | import { mapper, MapperProps } from './mapper'; 3 | import * as process from 'process'; 4 | import axios from 'axios'; 5 | import { TraefikDefinition } from './types'; 6 | 7 | const server = fastify(); 8 | 9 | const getStringFromEnv = (name: string): string | undefined => { 10 | const fullName = `TRAEFIK_MAPPER_${name}`; 11 | return process.env[fullName] ?? undefined; 12 | }; 13 | 14 | const getStringArrayFromEnv = (name: string): string[] => { 15 | const stringValue = getStringFromEnv(name); 16 | if (!stringValue) { 17 | return []; 18 | } 19 | return stringValue.split(';'); 20 | }; 21 | const getBooleanFromEnv = (name: string): boolean => { 22 | return getStringFromEnv(name) === 'true'; 23 | }; 24 | 25 | const props: MapperProps = { 26 | newCertResolver: getStringFromEnv('NEW_CERT_RESOLVER'), 27 | newHttpEntrypointName: getStringFromEnv('NEW_HTTP_ENTRYPOINT'), 28 | newHttpsEntrypointName: getStringFromEnv('NEW_HTTPS_ENTRYPOINT'), 29 | addMiddleware: getStringFromEnv('ADD_MIDDLEWARE_NAME'), 30 | ignoreMiddlewareSites: getStringArrayFromEnv('IGNORE_MIDDLEWARE_SITES'), 31 | removeCoolify: getBooleanFromEnv('FILTER_COOLIFY'), 32 | removeWwwMiddlewares: getBooleanFromEnv('FILTER_WWW_MIDDLEWARE'), 33 | removeHttpRouters: getBooleanFromEnv('FILTER_HTTP_ROUTERS'), 34 | removeWwwRouters: getBooleanFromEnv('FILTER_WWW_ROUTERS'), 35 | }; 36 | 37 | const baseEndopint = getStringFromEnv('BASE_ENDPOINT'); 38 | 39 | if (!baseEndopint) { 40 | throw new Error('TRAEFIK_MAPPER_BASE_ENDPOINT is missing.'); 41 | } 42 | 43 | server.get('/', async (request, reply) => { 44 | const { data } = await axios.get(baseEndopint); 45 | 46 | return mapper(data, props); 47 | }); 48 | 49 | server.listen(8080, '0.0.0.0', (err, address) => { 50 | if (err) { 51 | console.error(err); 52 | process.exit(1); 53 | } 54 | console.log(`Server listening at ${address}`); 55 | }); 56 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |

Welcome to traefik-http-provider-mapper 👋

2 |

3 | Version 4 | 5 | Documentation 6 | 7 | 8 | Maintenance 9 | 10 | 11 | Twitter: beaussan 12 | 13 |

14 | 15 | > A traefik http provider mapping server to edit an existing http provider, currently focused on integrating Coolify into an existing traefik http provider. 16 | 17 | ### 🏠 [Homepage](https://github.com/beaussan/traefik-http-provider-mapper#readme) 18 | 19 | ### ✨ [Blog post](https://beaussan.io/blog/coolify-into-existing-traefik) 20 | 21 | ## Docker compose install 22 | 23 | ```yaml 24 | version: '3' 25 | 26 | services: 27 | traefik-http-provider-mapper: 28 | image: beaussan/traefik-http-provider-mapper 29 | restart: unless-stopped 30 | environment: 31 | # Required, the address of the coolify server 32 | - TRAEFIK_MAPPER_BASE_ENDPOINT=http://coolify:3000/webhooks/traefik/main.json 33 | 34 | # All the following are optional 35 | 36 | # Replace the web entrypoint with what is provided (eg http here) 37 | - TRAEFIK_MAPPER_NEW_HTTP_ENTRYPOINT=http 38 | # Replace the websecure entrypoint with what is provided (eg https here) 39 | - TRAEFIK_MAPPER_NEW_HTTPS_ENTRYPOINT=https 40 | # Replace the certificate store (letsencrypt) with what is provided (eg cert here) 41 | - TRAEFIK_MAPPER_NEW_CERT_RESOLVER=cert 42 | 43 | # Adds this middleware to all routes, ex middlewareName@file for a file base middleware, middlewareName@docker for a docker base middleware 44 | - TRAEFIK_MAPPER_ADD_MIDDLEWARE_NAME=middlewareName@source 45 | 46 | # Ignore routers for the middlewares. This can be usefull to filter out some domains 47 | - TRAEFIK_MAPPER_IGNORE_MIDDLEWARE_SITES=some.domain.io;some.other.domain.io 48 | 49 | # Remove coolify itself from the list of services 50 | - TRAEFIK_MAPPER_FILTER_COOLIFY=true 51 | # Remove www redirect middleware from the list of middlewares 52 | - TRAEFIK_MAPPER_FILTER_WWW_MIDDLEWARE=true 53 | # Remove all http routes from the list of routes 54 | - TRAEFIK_MAPPER_FILTER_HTTP_ROUTERS=true 55 | # Remove all www routes from the list of routes 56 | - TRAEFIK_MAPPER_FILTER_WWW_ROUTERS=true 57 | 58 | networks: 59 | # Hooks itself into the coolify network that your Traefik instance should be running on 60 | - coolify 61 | - coolify-infra 62 | networks: 63 | coolify: 64 | external: true 65 | coolify-infra: 66 | external: true 67 | ``` 68 | 69 | And then, in your Traefik config, add this url as a [http provider](https://doc.traefik.io/traefik/providers/http/#provider-configuration) 70 | 71 | > http://traefik-http-provider-mapper:8080/ 72 | 73 | And then, you should have every Coolify provided routes in your Traefik instance ! :tada: 74 | 75 | ## How to work on it locally 76 | 77 | ### Install 78 | 79 | ```sh 80 | yarn install 81 | ``` 82 | 83 | ### Usage 84 | 85 | ```sh 86 | yarn build && yarn start:dotenv 87 | ``` 88 | 89 | ## Run tests 90 | 91 | ```sh 92 | yarn run test 93 | ``` 94 | 95 | ## Author 96 | 97 | 👤 **Beaussan** 98 | 99 | - Website: https://beaussan.io 100 | - Twitter: [@beaussan](https://twitter.com/beaussan) 101 | - Github: [@beaussan](https://github.com/beaussan) 102 | 103 | ## 🤝 Contributing 104 | 105 | Contributions, issues and feature requests are welcome!
Feel free to check [issues page](https://github.com/beaussan/traefik-http-provider-mapper/issues). 106 | 107 | ## Show your support 108 | 109 | Give a ⭐️ if this project helped you! 110 | -------------------------------------------------------------------------------- /src/mapper.ts: -------------------------------------------------------------------------------- 1 | import { Router, Service, TraefikDefinition } from './types'; 2 | 3 | export interface MapperProps { 4 | newHttpEntrypointName?: string; 5 | newHttpsEntrypointName?: string; 6 | addMiddleware?: string; 7 | newCertResolver?: string; 8 | removeHttpRouters?: boolean; 9 | removeWwwRouters?: boolean; 10 | removeCoolify?: boolean; 11 | removeWwwMiddlewares?: boolean; 12 | ignoreMiddlewareSites?: string[] 13 | } 14 | 15 | type MapperFunction = (input: TraefikDefinition) => TraefikDefinition; 16 | 17 | const routerMapper = 18 | (mapperFn: (input: Router, name?: string) => Router): MapperFunction => 19 | (input) => { 20 | return { 21 | http: { 22 | ...input.http, 23 | routers: Object.fromEntries( 24 | Object.entries(input.http.routers).map(([key, value]) => [ 25 | key, 26 | mapperFn(value, key), 27 | ]), 28 | ), 29 | }, 30 | }; 31 | }; 32 | 33 | const renameEntrypoint = (oldName: string, newName: string): MapperFunction => 34 | routerMapper((router) => ({ 35 | ...router, 36 | entrypoints: router.entrypoints.map((it) => 37 | it === oldName ? newName : it, 38 | ), 39 | })); 40 | 41 | const addCustomMiddleware = (middleware: string, ignoreList?: string[]): MapperFunction => 42 | routerMapper((router) => { 43 | if (ignoreList && ignoreList.some(ignoreDomain => router.rule.includes(ignoreDomain))) { 44 | return router; 45 | } 46 | return { 47 | ...router, 48 | middlewares: [...router.middlewares, middleware], 49 | } 50 | }); 51 | 52 | const renameHttpEntpoint = (newName: string): MapperFunction => 53 | renameEntrypoint('web', newName); 54 | const renameHttpsEntpoint = (newName: string): MapperFunction => 55 | renameEntrypoint('websecure', newName); 56 | 57 | const renameTlsResolver = (newName: string): MapperFunction => 58 | routerMapper((router) => 59 | router?.tls?.certresolver 60 | ? { 61 | ...router, 62 | tls: { 63 | ...router.tls, 64 | certresolver: newName, 65 | }, 66 | } 67 | : router, 68 | ); 69 | 70 | const filterRouters = 71 | (filter: (router: Router, key: string) => boolean): MapperFunction => 72 | (input) => { 73 | return { 74 | http: { 75 | ...input.http, 76 | routers: Object.fromEntries( 77 | Object.entries(input.http.routers).filter(([key, value]) => 78 | filter(value, key), 79 | ), 80 | ), 81 | }, 82 | }; 83 | }; 84 | 85 | const filterServices = 86 | (filter: (router: Service, key: string) => boolean): MapperFunction => 87 | (input) => { 88 | return { 89 | http: { 90 | ...input.http, 91 | services: Object.fromEntries( 92 | Object.entries(input.http.services).filter(([key, value]) => 93 | filter(value, key), 94 | ), 95 | ), 96 | }, 97 | }; 98 | }; 99 | 100 | const filterHttpRouters = (): MapperFunction => 101 | filterRouters((router) => !router.entrypoints.includes('web')); 102 | 103 | const filterWwwRouters = (): MapperFunction => 104 | filterRouters((router) => !router.rule.includes('Host(`www.')); 105 | 106 | const filterCoolifyRouter = (): MapperFunction => 107 | filterRouters((router, key) => !key.startsWith('coolify')); 108 | 109 | const filterCoolifyService = (): MapperFunction => 110 | filterServices((router, key) => !key.startsWith('coolify')); 111 | 112 | const filterCoolify = (): MapperFunction => 113 | compose([filterCoolifyRouter(), filterCoolifyService()]); 114 | 115 | const filterMiddlewares = 116 | (filter: (middleware: any, key: string) => boolean): MapperFunction => 117 | (input) => { 118 | return { 119 | http: { 120 | ...input.http, 121 | middlewares: Object.fromEntries( 122 | Object.entries(input.http.middlewares).filter(([key, value]) => 123 | filter(value, key), 124 | ), 125 | ), 126 | }, 127 | }; 128 | }; 129 | 130 | const filterOutWwwMiddlewares = (): MapperFunction => (input) => { 131 | let newDefinition = filterMiddlewares( 132 | (val, key) => !['redirect-to-non-www', 'redirect-to-www'].includes(key), 133 | )(input); 134 | newDefinition = routerMapper((router, name) => { 135 | return { 136 | ...router, 137 | middlewares: router.middlewares.filter(middleware => !['redirect-to-non-www', 'redirect-to-www'].includes(middleware)) 138 | }; 139 | })(newDefinition); 140 | return newDefinition; 141 | } 142 | 143 | 144 | const compose = 145 | (funcs: MapperFunction[]): MapperFunction => 146 | (initialArg: TraefikDefinition) => 147 | funcs.reduce((acc, func) => func(acc), initialArg); 148 | 149 | export const mapper = ( 150 | inputDefinition: TraefikDefinition, 151 | { 152 | newHttpEntrypointName, 153 | newHttpsEntrypointName, 154 | addMiddleware, 155 | removeHttpRouters, 156 | removeWwwRouters, 157 | newCertResolver, 158 | removeCoolify, 159 | removeWwwMiddlewares, 160 | ignoreMiddlewareSites, 161 | }: MapperProps, 162 | ): TraefikDefinition => { 163 | let newDefinition = inputDefinition; 164 | 165 | const actions: MapperFunction[] = []; 166 | 167 | // filters 168 | if (removeHttpRouters) { 169 | actions.push(filterHttpRouters()); 170 | } 171 | 172 | if (removeWwwRouters) { 173 | actions.push(filterWwwRouters()); 174 | } 175 | 176 | // mappers 177 | if (newHttpEntrypointName) { 178 | actions.push(renameHttpEntpoint(newHttpEntrypointName)); 179 | } 180 | if (newHttpsEntrypointName) { 181 | actions.push(renameHttpsEntpoint(newHttpsEntrypointName)); 182 | } 183 | if (newCertResolver) { 184 | actions.push(renameTlsResolver(newCertResolver)); 185 | } 186 | if (removeCoolify) { 187 | actions.push(filterCoolify()); 188 | } 189 | if (removeWwwMiddlewares) { 190 | actions.push(filterOutWwwMiddlewares()); 191 | } 192 | 193 | // adders 194 | if (addMiddleware) { 195 | actions.push(addCustomMiddleware(addMiddleware, ignoreMiddlewareSites)); 196 | } 197 | return compose(actions)(newDefinition); 198 | }; 199 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | /* Visit https://aka.ms/tsconfig to read more about this file */ 4 | 5 | /* Projects */ 6 | // "incremental": true, /* Save .tsbuildinfo files to allow for incremental compilation of projects. */ 7 | // "composite": true, /* Enable constraints that allow a TypeScript project to be used with project references. */ 8 | // "tsBuildInfoFile": "./.tsbuildinfo", /* Specify the path to .tsbuildinfo incremental compilation file. */ 9 | // "disableSourceOfProjectReferenceRedirect": true, /* Disable preferring source files instead of declaration files when referencing composite projects. */ 10 | // "disableSolutionSearching": true, /* Opt a project out of multi-project reference checking when editing. */ 11 | // "disableReferencedProjectLoad": true, /* Reduce the number of projects loaded automatically by TypeScript. */ 12 | 13 | /* Language and Environment */ 14 | "target": "es2017" /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */, 15 | // "lib": [], /* Specify a set of bundled library declaration files that describe the target runtime environment. */ 16 | // "jsx": "preserve", /* Specify what JSX code is generated. */ 17 | // "experimentalDecorators": true, /* Enable experimental support for TC39 stage 2 draft decorators. */ 18 | // "emitDecoratorMetadata": true, /* Emit design-type metadata for decorated declarations in source files. */ 19 | // "jsxFactory": "", /* Specify the JSX factory function used when targeting React JSX emit, e.g. 'React.createElement' or 'h'. */ 20 | // "jsxFragmentFactory": "", /* Specify the JSX Fragment reference used for fragments when targeting React JSX emit e.g. 'React.Fragment' or 'Fragment'. */ 21 | // "jsxImportSource": "", /* Specify module specifier used to import the JSX factory functions when using 'jsx: react-jsx*'. */ 22 | // "reactNamespace": "", /* Specify the object invoked for 'createElement'. This only applies when targeting 'react' JSX emit. */ 23 | // "noLib": true, /* Disable including any library files, including the default lib.d.ts. */ 24 | // "useDefineForClassFields": true, /* Emit ECMAScript-standard-compliant class fields. */ 25 | // "moduleDetection": "auto", /* Control what method is used to detect module-format JS files. */ 26 | 27 | /* Modules */ 28 | "module": "commonjs" /* Specify what module code is generated. */, 29 | // "rootDir": "./", /* Specify the root folder within your source files. */ 30 | // "moduleResolution": "node", /* Specify how TypeScript looks up a file from a given module specifier. */ 31 | // "baseUrl": "./", /* Specify the base directory to resolve non-relative module names. */ 32 | // "paths": {}, /* Specify a set of entries that re-map imports to additional lookup locations. */ 33 | // "rootDirs": [], /* Allow multiple folders to be treated as one when resolving modules. */ 34 | // "typeRoots": [], /* Specify multiple folders that act like './node_modules/@types'. */ 35 | // "types": [], /* Specify type package names to be included without being referenced in a source file. */ 36 | // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */ 37 | // "moduleSuffixes": [], /* List of file name suffixes to search when resolving a module. */ 38 | // "resolveJsonModule": true, /* Enable importing .json files. */ 39 | // "noResolve": true, /* Disallow 'import's, 'require's or ''s from expanding the number of files TypeScript should add to a project. */ 40 | 41 | /* JavaScript Support */ 42 | // "allowJs": true, /* Allow JavaScript files to be a part of your program. Use the 'checkJS' option to get errors from these files. */ 43 | // "checkJs": true, /* Enable error reporting in type-checked JavaScript files. */ 44 | // "maxNodeModuleJsDepth": 1, /* Specify the maximum folder depth used for checking JavaScript files from 'node_modules'. Only applicable with 'allowJs'. */ 45 | 46 | /* Emit */ 47 | // "declaration": true, /* Generate .d.ts files from TypeScript and JavaScript files in your project. */ 48 | // "declarationMap": true, /* Create sourcemaps for d.ts files. */ 49 | // "emitDeclarationOnly": true, /* Only output d.ts files and not JavaScript files. */ 50 | // "sourceMap": true, /* Create source map files for emitted JavaScript files. */ 51 | // "outFile": "./", /* Specify a file that bundles all outputs into one JavaScript file. If 'declaration' is true, also designates a file that bundles all .d.ts output. */ 52 | "outDir": "./dist" /* Specify an output folder for all emitted files. */, 53 | // "removeComments": true, /* Disable emitting comments. */ 54 | // "noEmit": true, /* Disable emitting files from a compilation. */ 55 | // "importHelpers": true, /* Allow importing helper functions from tslib once per project, instead of including them per-file. */ 56 | // "importsNotUsedAsValues": "remove", /* Specify emit/checking behavior for imports that are only used for types. */ 57 | // "downlevelIteration": true, /* Emit more compliant, but verbose and less performant JavaScript for iteration. */ 58 | // "sourceRoot": "", /* Specify the root path for debuggers to find the reference source code. */ 59 | // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ 60 | // "inlineSourceMap": true, /* Include sourcemap files inside the emitted JavaScript. */ 61 | // "inlineSources": true, /* Include source code in the sourcemaps inside the emitted JavaScript. */ 62 | // "emitBOM": true, /* Emit a UTF-8 Byte Order Mark (BOM) in the beginning of output files. */ 63 | // "newLine": "crlf", /* Set the newline character for emitting files. */ 64 | // "stripInternal": true, /* Disable emitting declarations that have '@internal' in their JSDoc comments. */ 65 | // "noEmitHelpers": true, /* Disable generating custom helper functions like '__extends' in compiled output. */ 66 | // "noEmitOnError": true, /* Disable emitting files if any type checking errors are reported. */ 67 | // "preserveConstEnums": true, /* Disable erasing 'const enum' declarations in generated code. */ 68 | // "declarationDir": "./", /* Specify the output directory for generated declaration files. */ 69 | // "preserveValueImports": true, /* Preserve unused imported values in the JavaScript output that would otherwise be removed. */ 70 | 71 | /* Interop Constraints */ 72 | // "isolatedModules": true, /* Ensure that each file can be safely transpiled without relying on other imports. */ 73 | // "allowSyntheticDefaultImports": true, /* Allow 'import x from y' when a module doesn't have a default export. */ 74 | "esModuleInterop": true /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables 'allowSyntheticDefaultImports' for type compatibility. */, 75 | // "preserveSymlinks": true, /* Disable resolving symlinks to their realpath. This correlates to the same flag in node. */ 76 | "forceConsistentCasingInFileNames": true /* Ensure that casing is correct in imports. */, 77 | 78 | /* Type Checking */ 79 | "strict": true /* Enable all strict type-checking options. */, 80 | // "noImplicitAny": true, /* Enable error reporting for expressions and declarations with an implied 'any' type. */ 81 | // "strictNullChecks": true, /* When type checking, take into account 'null' and 'undefined'. */ 82 | // "strictFunctionTypes": true, /* When assigning functions, check to ensure parameters and the return values are subtype-compatible. */ 83 | // "strictBindCallApply": true, /* Check that the arguments for 'bind', 'call', and 'apply' methods match the original function. */ 84 | // "strictPropertyInitialization": true, /* Check for class properties that are declared but not set in the constructor. */ 85 | // "noImplicitThis": true, /* Enable error reporting when 'this' is given the type 'any'. */ 86 | // "useUnknownInCatchVariables": true, /* Default catch clause variables as 'unknown' instead of 'any'. */ 87 | // "alwaysStrict": true, /* Ensure 'use strict' is always emitted. */ 88 | // "noUnusedLocals": true, /* Enable error reporting when local variables aren't read. */ 89 | // "noUnusedParameters": true, /* Raise an error when a function parameter isn't read. */ 90 | // "exactOptionalPropertyTypes": true, /* Interpret optional property types as written, rather than adding 'undefined'. */ 91 | // "noImplicitReturns": true, /* Enable error reporting for codepaths that do not explicitly return in a function. */ 92 | // "noFallthroughCasesInSwitch": true, /* Enable error reporting for fallthrough cases in switch statements. */ 93 | // "noUncheckedIndexedAccess": true, /* Add 'undefined' to a type when accessed using an index. */ 94 | // "noImplicitOverride": true, /* Ensure overriding members in derived classes are marked with an override modifier. */ 95 | // "noPropertyAccessFromIndexSignature": true, /* Enforces using indexed accessors for keys declared using an indexed type. */ 96 | // "allowUnusedLabels": true, /* Disable error reporting for unused labels. */ 97 | // "allowUnreachableCode": true, /* Disable error reporting for unreachable code. */ 98 | 99 | /* Completeness */ 100 | // "skipDefaultLibCheck": true, /* Skip type checking .d.ts files that are included with TypeScript. */ 101 | "skipLibCheck": true /* Skip type checking all .d.ts files. */ 102 | }, 103 | "exclude": ["src/**.test.ts"] 104 | } 105 | -------------------------------------------------------------------------------- /src/mapper.test.ts: -------------------------------------------------------------------------------- 1 | import { describe, expect, it } from 'vitest'; 2 | import { mapper } from './mapper'; 3 | import { Router, TraefikDefinition } from './types'; 4 | 5 | const generateRouters = ( 6 | routers: Record, 7 | ): TraefikDefinition => { 8 | return { 9 | http: { 10 | routers, 11 | services: {}, 12 | middlewares: { 13 | 'redirect-to-http': {}, 14 | 'redirect-to-https': {}, 15 | 'redirect-to-non-www': {}, 16 | 'redirect-to-www': {}, 17 | }, 18 | }, 19 | }; 20 | }; 21 | 22 | describe('mapper', () => { 23 | it('should map http entrypoint, while leaving others', () => { 24 | const mock = generateRouters({ 25 | test1: { 26 | entrypoints: ['web', 'websecure'], 27 | middlewares: [], 28 | rule: '', 29 | service: '', 30 | }, 31 | test2: { 32 | entrypoints: ['websecure'], 33 | middlewares: [], 34 | rule: '', 35 | service: '', 36 | }, 37 | }); 38 | 39 | const result = mapper(mock, { newHttpEntrypointName: 'myHttp' }); 40 | 41 | expect(result.http.routers.test1.entrypoints).toEqual([ 42 | 'myHttp', 43 | 'websecure', 44 | ]); 45 | expect(result.http.routers.test2.entrypoints).toEqual(['websecure']); 46 | }); 47 | 48 | it('should map https entrypoint, while leaving others', () => { 49 | const mock = generateRouters({ 50 | test1: { 51 | entrypoints: ['web', 'websecure'], 52 | middlewares: [], 53 | rule: '', 54 | service: '', 55 | }, 56 | test2: { 57 | entrypoints: ['websecure'], 58 | middlewares: [], 59 | rule: '', 60 | service: '', 61 | }, 62 | }); 63 | 64 | const result = mapper(mock, { newHttpsEntrypointName: 'myHttps' }); 65 | 66 | expect(result.http.routers.test1.entrypoints).toEqual(['web', 'myHttps']); 67 | expect(result.http.routers.test2.entrypoints).toEqual(['myHttps']); 68 | }); 69 | 70 | it('should map the certresolver entrypoint, while leaving others', () => { 71 | const mock = generateRouters({ 72 | test1: { 73 | entrypoints: ['web', 'websecure'], 74 | middlewares: [], 75 | tls: { 76 | certresolver: 'letsencrypt', 77 | domains: { 78 | main: 'aaaa', 79 | }, 80 | }, 81 | rule: '', 82 | service: '', 83 | }, 84 | 85 | test2: { 86 | entrypoints: ['web', 'websecure'], 87 | middlewares: [], 88 | tls: { 89 | domains: { 90 | main: 'aaaa', 91 | }, 92 | }, 93 | rule: '', 94 | service: '', 95 | }, 96 | }); 97 | 98 | const result = mapper(mock, { newCertResolver: 'myLetsEncrypt' }); 99 | 100 | expect(result.http.routers.test1.tls?.certresolver).toEqual( 101 | 'myLetsEncrypt', 102 | ); 103 | expect(result.http.routers.test2.tls).toEqual(mock.http.routers.test2.tls); 104 | }); 105 | 106 | it('should filter out http routers if asked to', () => { 107 | const mock = generateRouters({ 108 | test1: { 109 | entrypoints: ['web'], 110 | middlewares: [], 111 | rule: '', 112 | service: '', 113 | }, 114 | test2: { 115 | entrypoints: ['websecure'], 116 | middlewares: [], 117 | rule: '', 118 | service: '', 119 | }, 120 | }); 121 | 122 | const result = mapper(mock, { removeHttpRouters: true }); 123 | 124 | expect(Object.values(result.http.routers)).toHaveLength(1); 125 | }); 126 | 127 | it('should filter out http routers if asked to even if there is name mapping', () => { 128 | const mock = generateRouters({ 129 | test1: { 130 | entrypoints: ['web'], 131 | middlewares: [], 132 | rule: '', 133 | service: '', 134 | }, 135 | test2: { 136 | entrypoints: ['websecure'], 137 | middlewares: [], 138 | rule: '', 139 | service: '', 140 | }, 141 | }); 142 | 143 | const result = mapper(mock, { 144 | removeHttpRouters: true, 145 | newHttpEntrypointName: 'myHttp', 146 | }); 147 | 148 | expect(Object.values(result.http.routers)).toHaveLength(1); 149 | }); 150 | 151 | it('should filter out www routers if asked to', () => { 152 | const mock = generateRouters({ 153 | test1: { 154 | entrypoints: ['web'], 155 | middlewares: [], 156 | rule: 'Host(`www.coolify.example.io`)', 157 | service: '', 158 | }, 159 | test2: { 160 | entrypoints: ['websecure'], 161 | middlewares: [], 162 | rule: 'Host(`coolify.example.io`)', 163 | service: '', 164 | }, 165 | }); 166 | 167 | const result = mapper(mock, { 168 | removeWwwRouters: true, 169 | }); 170 | 171 | expect(Object.values(result.http.routers)).toHaveLength(1); 172 | expect(Object.values(result.http.routers.test2)).toBeDefined(); 173 | }); 174 | 175 | it('show allow to add a middleware to all routers', () => { 176 | const mock = generateRouters({ 177 | test1: { 178 | entrypoints: ['web'], 179 | middlewares: [], 180 | rule: 'Host(`www.coolify.example.io`)', 181 | service: '', 182 | }, 183 | test2: { 184 | entrypoints: ['websecure'], 185 | middlewares: ['existing'], 186 | rule: 'Host(`coolify.example.io`)', 187 | service: '', 188 | }, 189 | }); 190 | 191 | const result = mapper(mock, { 192 | addMiddleware: 'auth', 193 | }); 194 | 195 | expect(result.http.routers.test1.middlewares).toEqual(['auth']); 196 | expect(result.http.routers.test2.middlewares).toEqual(['existing', 'auth']); 197 | }); 198 | 199 | 200 | it('show allow to add a middleware to all routers exept the ignore list', () => { 201 | const mock = generateRouters({ 202 | test1: { 203 | entrypoints: ['web'], 204 | middlewares: [], 205 | rule: 'Host(`www.coolify.example.io`)', 206 | service: '', 207 | }, 208 | test2: { 209 | entrypoints: ['websecure'], 210 | middlewares: ['existing'], 211 | rule: 'Host(`coolify.example.io`)', 212 | service: '', 213 | }, 214 | test3: { 215 | entrypoints: ['websecure'], 216 | middlewares: ['existing'], 217 | rule: 'Host(`toignore.example.io`)', 218 | service: '', 219 | }, 220 | }); 221 | 222 | const result = mapper(mock, { 223 | addMiddleware: 'auth', 224 | ignoreMiddlewareSites: ['toignore.example.io'] 225 | 226 | }); 227 | 228 | expect(result.http.routers.test1.middlewares).toEqual(['auth']); 229 | expect(result.http.routers.test2.middlewares).toEqual(['existing', 'auth']); 230 | expect(result.http.routers.test3.middlewares).toEqual(['existing']); 231 | }); 232 | 233 | it('should filter out the coolify router if asked to', () => { 234 | const mock = generateRouters({ 235 | 'test2': { 236 | entrypoints: ['websecure'], 237 | rule: 'Host(`dash-bis.example.io`)', 238 | service: 'cl40a7hrx5046cwnkfy4c867q', 239 | tls: { 240 | certresolver: 'letsencrypt', 241 | }, 242 | middlewares: [], 243 | }, 244 | 'coolify': { 245 | entrypoints: ['web'], 246 | rule: 'Host(`coolify.example.io`) || Host(`www.coolify.example.io`)', 247 | service: 'coolify', 248 | middlewares: ['redirect-to-https', 'redirect-to-non-www'], 249 | }, 250 | 'coolify-secure-www': { 251 | entrypoints: ['websecure'], 252 | rule: 'Host(`www.coolify.example.io`)', 253 | service: 'coolify', 254 | tls: { 255 | domains: { 256 | main: 'coolify.example.io', 257 | }, 258 | }, 259 | middlewares: ['redirect-to-non-www'], 260 | }, 261 | 'coolify-secure': { 262 | entrypoints: ['websecure'], 263 | rule: 'Host(`coolify.example.io`)', 264 | service: 'coolify', 265 | tls: { 266 | certresolver: 'letsencrypt', 267 | }, 268 | middlewares: [], 269 | }, 270 | }); 271 | 272 | const result = mapper(mock, { 273 | removeCoolify: true, 274 | }); 275 | 276 | expect(Object.values(result.http.routers)).toHaveLength(1); 277 | expect(Object.values(result.http.routers.test2)).toBeDefined(); 278 | }); 279 | 280 | it('should filter out the www middlewares if asked to', () => { 281 | const mock: TraefikDefinition = { 282 | http: { 283 | routers: { 284 | 'app': { 285 | entrypoints: ['web'], 286 | rule: 'Host(`dash-bis.example.io`) || Host(`www.dash-bis.example.io`)', 287 | service: 'cl40a7hrx5046cwnkfy4c867q', 288 | middlewares: ['redirect-to-http', 'redirect-to-https', 'redirect-to-non-www', 'redirect-to-www'], 289 | }, 290 | }, 291 | services: {}, 292 | middlewares: { 293 | 'redirect-to-http': {}, 294 | 'redirect-to-https': {}, 295 | 'redirect-to-non-www': {}, 296 | 'redirect-to-www': {}, 297 | }, 298 | }, 299 | }; 300 | 301 | const result = mapper(mock, { 302 | removeWwwMiddlewares: true, 303 | }); 304 | 305 | expect(Object.values(result.http.middlewares)).toHaveLength(2); 306 | expect(result.http.routers.app.middlewares).toHaveLength(2); 307 | expect(result.http.routers.app.middlewares).toMatchInlineSnapshot(` 308 | [ 309 | "redirect-to-http", 310 | "redirect-to-https", 311 | ] 312 | `); 313 | }); 314 | 315 | it('should work if all options are combined', () => { 316 | const example: TraefikDefinition = { 317 | http: { 318 | routers: { 319 | 'cl40a7hrx5046cwnkfy4c867q': { 320 | entrypoints: ['web'], 321 | rule: 'Host(`dash-bis.example.io`) || Host(`www.dash-bis.example.io`)', 322 | service: 'cl40a7hrx5046cwnkfy4c867q', 323 | middlewares: ['redirect-to-https', 'redirect-to-non-www'], 324 | }, 325 | 'cl40a7hrx5046cwnkfy4c867q-secure-www': { 326 | entrypoints: ['websecure'], 327 | rule: 'Host(`www.dash-bis.example.io`)', 328 | service: 'cl40a7hrx5046cwnkfy4c867q', 329 | tls: { 330 | domains: { 331 | main: 'dash-bis.example.io', 332 | }, 333 | }, 334 | middlewares: ['redirect-to-non-www'], 335 | }, 336 | 'cl40a7hrx5046cwnkfy4c867q-secure': { 337 | entrypoints: ['websecure'], 338 | rule: 'Host(`dash-bis.example.io`)', 339 | service: 'cl40a7hrx5046cwnkfy4c867q', 340 | tls: { 341 | certresolver: 'letsencrypt', 342 | }, 343 | middlewares: [], 344 | }, 345 | 'coolify': { 346 | entrypoints: ['web'], 347 | rule: 'Host(`coolify.example.io`) || Host(`www.coolify.example.io`)', 348 | service: 'coolify', 349 | middlewares: ['redirect-to-https', 'redirect-to-non-www'], 350 | }, 351 | 'coolify-secure-www': { 352 | entrypoints: ['websecure'], 353 | rule: 'Host(`www.coolify.example.io`)', 354 | service: 'coolify', 355 | tls: { 356 | domains: { 357 | main: 'coolify.example.io', 358 | }, 359 | }, 360 | middlewares: ['redirect-to-non-www'], 361 | }, 362 | 'coolify-secure': { 363 | entrypoints: ['websecure'], 364 | rule: 'Host(`coolify.example.io`)', 365 | service: 'coolify', 366 | tls: { 367 | certresolver: 'letsencrypt', 368 | }, 369 | middlewares: [], 370 | }, 371 | }, 372 | services: { 373 | cl40a7hrx5046cwnkfy4c867q: { 374 | loadbalancer: { 375 | servers: [ 376 | { 377 | url: 'http://cl40a7hrx5046cwnkfy4c867q:3000', 378 | }, 379 | ], 380 | }, 381 | }, 382 | coolify: { 383 | loadbalancer: { 384 | servers: [ 385 | { 386 | url: 'http://coolify:3000', 387 | }, 388 | ], 389 | }, 390 | }, 391 | }, 392 | middlewares: { 393 | 'redirect-to-https': { 394 | redirectscheme: { 395 | scheme: 'https', 396 | }, 397 | }, 398 | 'redirect-to-http': { 399 | redirectscheme: { 400 | scheme: 'http', 401 | }, 402 | }, 403 | 'redirect-to-non-www': { 404 | redirectregex: { 405 | regex: '^https?://www\\.(.+)', 406 | replacement: 'http://${1}', 407 | }, 408 | }, 409 | 'redirect-to-www': { 410 | redirectregex: { 411 | regex: '^https?://(?:www\\.)?(.+)', 412 | replacement: 'http://www.${1}', 413 | }, 414 | }, 415 | }, 416 | }, 417 | }; 418 | const result = mapper(example, { 419 | newHttpEntrypointName: 'http', 420 | newHttpsEntrypointName: 'https', 421 | removeHttpRouters: true, 422 | removeWwwRouters: true, 423 | removeCoolify: true, 424 | newCertResolver: 'myLetsEncrypt', 425 | removeWwwMiddlewares: true, 426 | addMiddleware: 'auth', 427 | }); 428 | 429 | expect(result.http).toMatchInlineSnapshot(` 430 | { 431 | "middlewares": { 432 | "redirect-to-http": { 433 | "redirectscheme": { 434 | "scheme": "http", 435 | }, 436 | }, 437 | "redirect-to-https": { 438 | "redirectscheme": { 439 | "scheme": "https", 440 | }, 441 | }, 442 | }, 443 | "routers": { 444 | "cl40a7hrx5046cwnkfy4c867q-secure": { 445 | "entrypoints": [ 446 | "https", 447 | ], 448 | "middlewares": [ 449 | "auth", 450 | ], 451 | "rule": "Host(\`dash-bis.example.io\`)", 452 | "service": "cl40a7hrx5046cwnkfy4c867q", 453 | "tls": { 454 | "certresolver": "myLetsEncrypt", 455 | }, 456 | }, 457 | }, 458 | "services": { 459 | "cl40a7hrx5046cwnkfy4c867q": { 460 | "loadbalancer": { 461 | "servers": [ 462 | { 463 | "url": "http://cl40a7hrx5046cwnkfy4c867q:3000", 464 | }, 465 | ], 466 | }, 467 | }, 468 | }, 469 | } 470 | `); 471 | }); 472 | }); 473 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@fastify/ajv-compiler@^1.0.0": 6 | version "1.1.0" 7 | resolved "https://registry.yarnpkg.com/@fastify/ajv-compiler/-/ajv-compiler-1.1.0.tgz#5ce80b1fc8bebffc8c5ba428d5e392d0f9ed10a1" 8 | integrity sha512-gvCOUNpXsWrIQ3A4aXCLIdblL0tDq42BG/2Xw7oxbil9h11uow10ztS2GuFazNBfjbrsZ5nl+nPl5jDSjj5TSg== 9 | dependencies: 10 | ajv "^6.12.6" 11 | 12 | "@fastify/error@^2.0.0": 13 | version "2.0.0" 14 | resolved "https://registry.yarnpkg.com/@fastify/error/-/error-2.0.0.tgz#a9f94af56eb934f0ab1ce4ef9f0ced6ebf2319dc" 15 | integrity sha512-wI3fpfDT0t7p8E6dA2eTECzzOd+bZsZCJ2Hcv+Onn2b7ZwK3RwD27uW2QDaMtQhAfWQQP+WNK7nKf0twLsBf9w== 16 | 17 | "@types/chai-subset@^1.3.3": 18 | version "1.3.3" 19 | resolved "https://registry.yarnpkg.com/@types/chai-subset/-/chai-subset-1.3.3.tgz#97893814e92abd2c534de422cb377e0e0bdaac94" 20 | integrity sha512-frBecisrNGz+F4T6bcc+NLeolfiojh5FxW2klu669+8BARtyQv2C/GkNW6FUodVe4BroGMP/wER/YDGc7rEllw== 21 | dependencies: 22 | "@types/chai" "*" 23 | 24 | "@types/chai@*", "@types/chai@^4.3.1": 25 | version "4.3.1" 26 | resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.3.1.tgz#e2c6e73e0bdeb2521d00756d099218e9f5d90a04" 27 | integrity sha512-/zPMqDkzSZ8t3VtxOa4KPq7uzzW978M9Tvh+j7GHKuo6k6GTLxPJ4J5gE5cjfJ26pnXst0N5Hax8Sr0T2Mi9zQ== 28 | 29 | "@types/minimatch@^3.0.3": 30 | version "3.0.5" 31 | resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.5.tgz#1001cc5e6a3704b83c236027e77f2f58ea010f40" 32 | integrity sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ== 33 | 34 | "@types/node@^17.0.39": 35 | version "17.0.39" 36 | resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.39.tgz#3652d82e2a16b4ea679d5ea3143b816c91b7e113" 37 | integrity sha512-JDU3YLlnPK3WDao6/DlXLOgSNpG13ct+CwIO17V8q0/9fWJyeMJJ/VyZ1lv8kDprihvZMydzVwf0tQOqGiY2Nw== 38 | 39 | abstract-logging@^2.0.0: 40 | version "2.0.1" 41 | resolved "https://registry.yarnpkg.com/abstract-logging/-/abstract-logging-2.0.1.tgz#6b0c371df212db7129b57d2e7fcf282b8bf1c839" 42 | integrity sha512-2BjRTZxTPvheOvGbBslFSYOUkr+SjPtOnrLP33f+VIWLzezQpZcqVg7ja3L4dBXmzzgwT+a029jRx5PCi3JuiA== 43 | 44 | ajv@^6.11.0, ajv@^6.12.6: 45 | version "6.12.6" 46 | resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" 47 | integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== 48 | dependencies: 49 | fast-deep-equal "^3.1.1" 50 | fast-json-stable-stringify "^2.0.0" 51 | json-schema-traverse "^0.4.1" 52 | uri-js "^4.2.2" 53 | 54 | ajv@^8.1.0: 55 | version "8.11.0" 56 | resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.11.0.tgz#977e91dd96ca669f54a11e23e378e33b884a565f" 57 | integrity sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg== 58 | dependencies: 59 | fast-deep-equal "^3.1.1" 60 | json-schema-traverse "^1.0.0" 61 | require-from-string "^2.0.2" 62 | uri-js "^4.2.2" 63 | 64 | ansi-styles@^4.1.0: 65 | version "4.3.0" 66 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" 67 | integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== 68 | dependencies: 69 | color-convert "^2.0.1" 70 | 71 | archy@^1.0.0: 72 | version "1.0.0" 73 | resolved "https://registry.yarnpkg.com/archy/-/archy-1.0.0.tgz#f9c8c13757cc1dd7bc379ac77b2c62a5c2868c40" 74 | integrity sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw== 75 | 76 | array-differ@^3.0.0: 77 | version "3.0.0" 78 | resolved "https://registry.yarnpkg.com/array-differ/-/array-differ-3.0.0.tgz#3cbb3d0f316810eafcc47624734237d6aee4ae6b" 79 | integrity sha512-THtfYS6KtME/yIAhKjZ2ul7XI96lQGHRputJQHO80LAWQnuGP4iCIN8vdMRboGbIEYBwU33q8Tch1os2+X0kMg== 80 | 81 | array-union@^2.1.0: 82 | version "2.1.0" 83 | resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" 84 | integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== 85 | 86 | arrify@^2.0.1: 87 | version "2.0.1" 88 | resolved "https://registry.yarnpkg.com/arrify/-/arrify-2.0.1.tgz#c9655e9331e0abcd588d2a7cad7e9956f66701fa" 89 | integrity sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug== 90 | 91 | assertion-error@^1.1.0: 92 | version "1.1.0" 93 | resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b" 94 | integrity sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw== 95 | 96 | asynckit@^0.4.0: 97 | version "0.4.0" 98 | resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" 99 | integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== 100 | 101 | atomic-sleep@^1.0.0: 102 | version "1.0.0" 103 | resolved "https://registry.yarnpkg.com/atomic-sleep/-/atomic-sleep-1.0.0.tgz#eb85b77a601fc932cfe432c5acd364a9e2c9075b" 104 | integrity sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ== 105 | 106 | avvio@^7.1.2: 107 | version "7.2.5" 108 | resolved "https://registry.yarnpkg.com/avvio/-/avvio-7.2.5.tgz#65ba255f10b0bea7ac6eded71a5344cd88f5de19" 109 | integrity sha512-AOhBxyLVdpOad3TujtC9kL/9r3HnTkxwQ5ggOsYrvvZP1cCFvzHWJd5XxZDFuTn+IN8vkKSG5SEJrd27vCSbeA== 110 | dependencies: 111 | archy "^1.0.0" 112 | debug "^4.0.0" 113 | fastq "^1.6.1" 114 | queue-microtask "^1.1.2" 115 | 116 | axios@^0.27.2: 117 | version "0.27.2" 118 | resolved "https://registry.yarnpkg.com/axios/-/axios-0.27.2.tgz#207658cc8621606e586c85db4b41a750e756d972" 119 | integrity sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ== 120 | dependencies: 121 | follow-redirects "^1.14.9" 122 | form-data "^4.0.0" 123 | 124 | balanced-match@^1.0.0: 125 | version "1.0.2" 126 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" 127 | integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== 128 | 129 | brace-expansion@^1.1.7: 130 | version "1.1.11" 131 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" 132 | integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== 133 | dependencies: 134 | balanced-match "^1.0.0" 135 | concat-map "0.0.1" 136 | 137 | chai@^4.3.6: 138 | version "4.3.6" 139 | resolved "https://registry.yarnpkg.com/chai/-/chai-4.3.6.tgz#ffe4ba2d9fa9d6680cc0b370adae709ec9011e9c" 140 | integrity sha512-bbcp3YfHCUzMOvKqsztczerVgBKSsEijCySNlHHbX3VG1nskvqjz5Rfso1gGwD6w6oOV3eI60pKuMOV5MV7p3Q== 141 | dependencies: 142 | assertion-error "^1.1.0" 143 | check-error "^1.0.2" 144 | deep-eql "^3.0.1" 145 | get-func-name "^2.0.0" 146 | loupe "^2.3.1" 147 | pathval "^1.1.1" 148 | type-detect "^4.0.5" 149 | 150 | chalk@^3.0.0: 151 | version "3.0.0" 152 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-3.0.0.tgz#3f73c2bf526591f574cc492c51e2456349f844e4" 153 | integrity sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg== 154 | dependencies: 155 | ansi-styles "^4.1.0" 156 | supports-color "^7.1.0" 157 | 158 | check-error@^1.0.2: 159 | version "1.0.2" 160 | resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.2.tgz#574d312edd88bb5dd8912e9286dd6c0aed4aac82" 161 | integrity sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA== 162 | 163 | color-convert@^2.0.1: 164 | version "2.0.1" 165 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" 166 | integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== 167 | dependencies: 168 | color-name "~1.1.4" 169 | 170 | color-name@~1.1.4: 171 | version "1.1.4" 172 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" 173 | integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== 174 | 175 | combined-stream@^1.0.8: 176 | version "1.0.8" 177 | resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" 178 | integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== 179 | dependencies: 180 | delayed-stream "~1.0.0" 181 | 182 | concat-map@0.0.1: 183 | version "0.0.1" 184 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 185 | integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== 186 | 187 | cookie@^0.5.0: 188 | version "0.5.0" 189 | resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.5.0.tgz#d1f5d71adec6558c58f389987c366aa47e994f8b" 190 | integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw== 191 | 192 | cross-spawn@^7.0.0: 193 | version "7.0.3" 194 | resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" 195 | integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== 196 | dependencies: 197 | path-key "^3.1.0" 198 | shebang-command "^2.0.0" 199 | which "^2.0.1" 200 | 201 | debug@^4.0.0, debug@^4.3.4: 202 | version "4.3.4" 203 | resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" 204 | integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== 205 | dependencies: 206 | ms "2.1.2" 207 | 208 | deep-eql@^3.0.1: 209 | version "3.0.1" 210 | resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-3.0.1.tgz#dfc9404400ad1c8fe023e7da1df1c147c4b444df" 211 | integrity sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw== 212 | dependencies: 213 | type-detect "^4.0.0" 214 | 215 | deepmerge@^4.2.2: 216 | version "4.2.2" 217 | resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.2.2.tgz#44d2ea3679b8f4d4ffba33f03d865fc1e7bf4955" 218 | integrity sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg== 219 | 220 | delayed-stream@~1.0.0: 221 | version "1.0.0" 222 | resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" 223 | integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== 224 | 225 | dotenv@^16.0.1: 226 | version "16.0.1" 227 | resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.0.1.tgz#8f8f9d94876c35dac989876a5d3a82a267fdce1d" 228 | integrity sha512-1K6hR6wtk2FviQ4kEiSjFiH5rpzEVi8WW0x96aztHVMhEspNpc4DVOUTEHtEva5VThQ8IaBX1Pe4gSzpVVUsKQ== 229 | 230 | end-of-stream@^1.1.0: 231 | version "1.4.4" 232 | resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" 233 | integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== 234 | dependencies: 235 | once "^1.4.0" 236 | 237 | esbuild-android-64@0.14.42: 238 | version "0.14.42" 239 | resolved "https://registry.yarnpkg.com/esbuild-android-64/-/esbuild-android-64-0.14.42.tgz#d7ab3d44d3671218d22bce52f65642b12908d954" 240 | integrity sha512-P4Y36VUtRhK/zivqGVMqhptSrFILAGlYp0Z8r9UQqHJ3iWztRCNWnlBzD9HRx0DbueXikzOiwyOri+ojAFfW6A== 241 | 242 | esbuild-android-arm64@0.14.42: 243 | version "0.14.42" 244 | resolved "https://registry.yarnpkg.com/esbuild-android-arm64/-/esbuild-android-arm64-0.14.42.tgz#45336d8bec49abddb3a022996a23373f45a57c27" 245 | integrity sha512-0cOqCubq+RWScPqvtQdjXG3Czb3AWI2CaKw3HeXry2eoA2rrPr85HF7IpdU26UWdBXgPYtlTN1LUiuXbboROhg== 246 | 247 | esbuild-darwin-64@0.14.42: 248 | version "0.14.42" 249 | resolved "https://registry.yarnpkg.com/esbuild-darwin-64/-/esbuild-darwin-64-0.14.42.tgz#6dff5e44cd70a88c33323e2f5fb598e40c68a9e0" 250 | integrity sha512-ipiBdCA3ZjYgRfRLdQwP82rTiv/YVMtW36hTvAN5ZKAIfxBOyPXY7Cejp3bMXWgzKD8B6O+zoMzh01GZsCuEIA== 251 | 252 | esbuild-darwin-arm64@0.14.42: 253 | version "0.14.42" 254 | resolved "https://registry.yarnpkg.com/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.42.tgz#2c7313e1b12d2fa5b889c03213d682fb92ca8c4f" 255 | integrity sha512-bU2tHRqTPOaoH/4m0zYHbFWpiYDmaA0gt90/3BMEFaM0PqVK/a6MA2V/ypV5PO0v8QxN6gH5hBPY4YJ2lopXgA== 256 | 257 | esbuild-freebsd-64@0.14.42: 258 | version "0.14.42" 259 | resolved "https://registry.yarnpkg.com/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.42.tgz#ad1c5a564a7e473b8ce95ee7f76618d05d6daffc" 260 | integrity sha512-75h1+22Ivy07+QvxHyhVqOdekupiTZVLN1PMwCDonAqyXd8TVNJfIRFrdL8QmSJrOJJ5h8H1I9ETyl2L8LQDaw== 261 | 262 | esbuild-freebsd-arm64@0.14.42: 263 | version "0.14.42" 264 | resolved "https://registry.yarnpkg.com/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.42.tgz#4bdb480234144f944f1930829bace7561135ddc7" 265 | integrity sha512-W6Jebeu5TTDQMJUJVarEzRU9LlKpNkPBbjqSu+GUPTHDCly5zZEQq9uHkmHHl7OKm+mQ2zFySN83nmfCeZCyNA== 266 | 267 | esbuild-linux-32@0.14.42: 268 | version "0.14.42" 269 | resolved "https://registry.yarnpkg.com/esbuild-linux-32/-/esbuild-linux-32-0.14.42.tgz#ef18fd19f067e9d2b5f677d6b82fa81519f5a8c2" 270 | integrity sha512-Ooy/Bj+mJ1z4jlWcK5Dl6SlPlCgQB9zg1UrTCeY8XagvuWZ4qGPyYEWGkT94HUsRi2hKsXvcs6ThTOjBaJSMfg== 271 | 272 | esbuild-linux-64@0.14.42: 273 | version "0.14.42" 274 | resolved "https://registry.yarnpkg.com/esbuild-linux-64/-/esbuild-linux-64-0.14.42.tgz#d84e7333b1c1b22cf8b5b9dbb5dd9b2ecb34b79f" 275 | integrity sha512-2L0HbzQfbTuemUWfVqNIjOfaTRt9zsvjnme6lnr7/MO9toz/MJ5tZhjqrG6uDWDxhsaHI2/nsDgrv8uEEN2eoA== 276 | 277 | esbuild-linux-arm64@0.14.42: 278 | version "0.14.42" 279 | resolved "https://registry.yarnpkg.com/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.42.tgz#dc19e282f8c4ffbaa470c02a4d171e4ae0180cca" 280 | integrity sha512-c3Ug3e9JpVr8jAcfbhirtpBauLxzYPpycjWulD71CF6ZSY26tvzmXMJYooQ2YKqDY4e/fPu5K8bm7MiXMnyxuA== 281 | 282 | esbuild-linux-arm@0.14.42: 283 | version "0.14.42" 284 | resolved "https://registry.yarnpkg.com/esbuild-linux-arm/-/esbuild-linux-arm-0.14.42.tgz#d49870e63e2242b8156bf473f2ee5154226be328" 285 | integrity sha512-STq69yzCMhdRaWnh29UYrLSr/qaWMm/KqwaRF1pMEK7kDiagaXhSL1zQGXbYv94GuGY/zAwzK98+6idCMUOOCg== 286 | 287 | esbuild-linux-mips64le@0.14.42: 288 | version "0.14.42" 289 | resolved "https://registry.yarnpkg.com/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.42.tgz#f4e6ff9bf8a6f175470498826f48d093b054fc22" 290 | integrity sha512-QuvpHGbYlkyXWf2cGm51LBCHx6eUakjaSrRpUqhPwjh/uvNUYvLmz2LgPTTPwCqaKt0iwL+OGVL0tXA5aDbAbg== 291 | 292 | esbuild-linux-ppc64le@0.14.42: 293 | version "0.14.42" 294 | resolved "https://registry.yarnpkg.com/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.42.tgz#ac9c66fc80ba9f8fda15a4cc08f4e55f6c0aed63" 295 | integrity sha512-8ohIVIWDbDT+i7lCx44YCyIRrOW1MYlks9fxTo0ME2LS/fxxdoJBwHWzaDYhjvf8kNpA+MInZvyOEAGoVDrMHg== 296 | 297 | esbuild-linux-riscv64@0.14.42: 298 | version "0.14.42" 299 | resolved "https://registry.yarnpkg.com/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.42.tgz#21e0ae492a3a9bf4eecbfc916339a66e204256d0" 300 | integrity sha512-DzDqK3TuoXktPyG1Lwx7vhaF49Onv3eR61KwQyxYo4y5UKTpL3NmuarHSIaSVlTFDDpcIajCDwz5/uwKLLgKiQ== 301 | 302 | esbuild-linux-s390x@0.14.42: 303 | version "0.14.42" 304 | resolved "https://registry.yarnpkg.com/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.42.tgz#06d40b957250ffd9a2183bfdfc9a03d6fd21b3e8" 305 | integrity sha512-YFRhPCxl8nb//Wn6SiS5pmtplBi4z9yC2gLrYoYI/tvwuB1jldir9r7JwAGy1Ck4D7sE7wBN9GFtUUX/DLdcEQ== 306 | 307 | esbuild-netbsd-64@0.14.42: 308 | version "0.14.42" 309 | resolved "https://registry.yarnpkg.com/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.42.tgz#185664f05f10914f14ed43bd9e22b7de584267f7" 310 | integrity sha512-QYSD2k+oT9dqB/4eEM9c+7KyNYsIPgzYOSrmfNGDIyJrbT1d+CFVKvnKahDKNJLfOYj8N4MgyFaU9/Ytc6w5Vw== 311 | 312 | esbuild-openbsd-64@0.14.42: 313 | version "0.14.42" 314 | resolved "https://registry.yarnpkg.com/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.42.tgz#c29006f659eb4e55283044bbbd4eb4054fae8839" 315 | integrity sha512-M2meNVIKWsm2HMY7+TU9AxM7ZVwI9havdsw6m/6EzdXysyCFFSoaTQ/Jg03izjCsK17FsVRHqRe26Llj6x0MNA== 316 | 317 | esbuild-sunos-64@0.14.42: 318 | version "0.14.42" 319 | resolved "https://registry.yarnpkg.com/esbuild-sunos-64/-/esbuild-sunos-64-0.14.42.tgz#aa9eec112cd1e7105e7bb37000eca7d460083f8f" 320 | integrity sha512-uXV8TAZEw36DkgW8Ak3MpSJs1ofBb3Smkc/6pZ29sCAN1KzCAQzsje4sUwugf+FVicrHvlamCOlFZIXgct+iqQ== 321 | 322 | esbuild-windows-32@0.14.42: 323 | version "0.14.42" 324 | resolved "https://registry.yarnpkg.com/esbuild-windows-32/-/esbuild-windows-32-0.14.42.tgz#c3fc450853c61a74dacc5679de301db23b73e61e" 325 | integrity sha512-4iw/8qWmRICWi9ZOnJJf9sYt6wmtp3hsN4TdI5NqgjfOkBVMxNdM9Vt3626G1Rda9ya2Q0hjQRD9W1o+m6Lz6g== 326 | 327 | esbuild-windows-64@0.14.42: 328 | version "0.14.42" 329 | resolved "https://registry.yarnpkg.com/esbuild-windows-64/-/esbuild-windows-64-0.14.42.tgz#b877aa37ff47d9fcf0ccb1ca6a24b31475a5e555" 330 | integrity sha512-j3cdK+Y3+a5H0wHKmLGTJcq0+/2mMBHPWkItR3vytp/aUGD/ua/t2BLdfBIzbNN9nLCRL9sywCRpOpFMx3CxzA== 331 | 332 | esbuild-windows-arm64@0.14.42: 333 | version "0.14.42" 334 | resolved "https://registry.yarnpkg.com/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.42.tgz#79da8744626f24bc016dc40d016950b5a4a2bac5" 335 | integrity sha512-+lRAARnF+hf8J0mN27ujO+VbhPbDqJ8rCcJKye4y7YZLV6C4n3pTRThAb388k/zqF5uM0lS5O201u0OqoWSicw== 336 | 337 | esbuild@^0.14.27: 338 | version "0.14.42" 339 | resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.14.42.tgz#98587df0b024d5f6341b12a1d735a2bff55e1836" 340 | integrity sha512-V0uPZotCEHokJdNqyozH6qsaQXqmZEOiZWrXnds/zaH/0SyrIayRXWRB98CENO73MIZ9T3HBIOsmds5twWtmgw== 341 | optionalDependencies: 342 | esbuild-android-64 "0.14.42" 343 | esbuild-android-arm64 "0.14.42" 344 | esbuild-darwin-64 "0.14.42" 345 | esbuild-darwin-arm64 "0.14.42" 346 | esbuild-freebsd-64 "0.14.42" 347 | esbuild-freebsd-arm64 "0.14.42" 348 | esbuild-linux-32 "0.14.42" 349 | esbuild-linux-64 "0.14.42" 350 | esbuild-linux-arm "0.14.42" 351 | esbuild-linux-arm64 "0.14.42" 352 | esbuild-linux-mips64le "0.14.42" 353 | esbuild-linux-ppc64le "0.14.42" 354 | esbuild-linux-riscv64 "0.14.42" 355 | esbuild-linux-s390x "0.14.42" 356 | esbuild-netbsd-64 "0.14.42" 357 | esbuild-openbsd-64 "0.14.42" 358 | esbuild-sunos-64 "0.14.42" 359 | esbuild-windows-32 "0.14.42" 360 | esbuild-windows-64 "0.14.42" 361 | esbuild-windows-arm64 "0.14.42" 362 | 363 | execa@^4.0.0: 364 | version "4.1.0" 365 | resolved "https://registry.yarnpkg.com/execa/-/execa-4.1.0.tgz#4e5491ad1572f2f17a77d388c6c857135b22847a" 366 | integrity sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA== 367 | dependencies: 368 | cross-spawn "^7.0.0" 369 | get-stream "^5.0.0" 370 | human-signals "^1.1.1" 371 | is-stream "^2.0.0" 372 | merge-stream "^2.0.0" 373 | npm-run-path "^4.0.0" 374 | onetime "^5.1.0" 375 | signal-exit "^3.0.2" 376 | strip-final-newline "^2.0.0" 377 | 378 | fast-decode-uri-component@^1.0.1: 379 | version "1.0.1" 380 | resolved "https://registry.yarnpkg.com/fast-decode-uri-component/-/fast-decode-uri-component-1.0.1.tgz#46f8b6c22b30ff7a81357d4f59abfae938202543" 381 | integrity sha512-WKgKWg5eUxvRZGwW8FvfbaH7AXSh2cL+3j5fMGzUMCxWBJ3dV3a7Wz8y2f/uQ0e3B6WmodD3oS54jTQ9HVTIIg== 382 | 383 | fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: 384 | version "3.1.3" 385 | resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" 386 | integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== 387 | 388 | fast-json-stable-stringify@^2.0.0: 389 | version "2.1.0" 390 | resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" 391 | integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== 392 | 393 | fast-json-stringify@^2.5.2: 394 | version "2.7.13" 395 | resolved "https://registry.yarnpkg.com/fast-json-stringify/-/fast-json-stringify-2.7.13.tgz#277aa86c2acba4d9851bd6108ed657aa327ed8c0" 396 | integrity sha512-ar+hQ4+OIurUGjSJD1anvYSDcUflywhKjfxnsW4TBTD7+u0tJufv6DKRWoQk3vI6YBOWMoz0TQtfbe7dxbQmvA== 397 | dependencies: 398 | ajv "^6.11.0" 399 | deepmerge "^4.2.2" 400 | rfdc "^1.2.0" 401 | string-similarity "^4.0.1" 402 | 403 | fast-redact@^3.0.0: 404 | version "3.1.1" 405 | resolved "https://registry.yarnpkg.com/fast-redact/-/fast-redact-3.1.1.tgz#790fcff8f808c2e12fabbfb2be5cb2deda448fa0" 406 | integrity sha512-odVmjC8x8jNeMZ3C+rPMESzXVSEU8tSWSHv9HFxP2mm89G/1WwqhrerJDQm9Zus8X6aoRgQDThKqptdNA6bt+A== 407 | 408 | fast-safe-stringify@^2.0.8: 409 | version "2.1.1" 410 | resolved "https://registry.yarnpkg.com/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz#c406a83b6e70d9e35ce3b30a81141df30aeba884" 411 | integrity sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA== 412 | 413 | fastify@^3.29.0: 414 | version "3.29.0" 415 | resolved "https://registry.yarnpkg.com/fastify/-/fastify-3.29.0.tgz#b840107f4fd40cc999b886548bfcda8062e38168" 416 | integrity sha512-zXSiDTdHJCHcmDrSje1f1RfzTmUTjMtHnPhh6cdokgfHhloQ+gy0Du+KlEjwTbcNC3Djj4GAsBzl6KvfI9Ah2g== 417 | dependencies: 418 | "@fastify/ajv-compiler" "^1.0.0" 419 | "@fastify/error" "^2.0.0" 420 | abstract-logging "^2.0.0" 421 | avvio "^7.1.2" 422 | fast-json-stringify "^2.5.2" 423 | find-my-way "^4.5.0" 424 | flatstr "^1.0.12" 425 | light-my-request "^4.2.0" 426 | pino "^6.13.0" 427 | process-warning "^1.0.0" 428 | proxy-addr "^2.0.7" 429 | rfdc "^1.1.4" 430 | secure-json-parse "^2.0.0" 431 | semver "^7.3.2" 432 | tiny-lru "^8.0.1" 433 | 434 | fastq@^1.6.1: 435 | version "1.13.0" 436 | resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.13.0.tgz#616760f88a7526bdfc596b7cab8c18938c36b98c" 437 | integrity sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw== 438 | dependencies: 439 | reusify "^1.0.4" 440 | 441 | find-my-way@^4.5.0: 442 | version "4.5.1" 443 | resolved "https://registry.yarnpkg.com/find-my-way/-/find-my-way-4.5.1.tgz#758e959194b90aea0270db18fff75e2fceb2239f" 444 | integrity sha512-kE0u7sGoUFbMXcOG/xpkmz4sRLCklERnBcg7Ftuu1iAxsfEt2S46RLJ3Sq7vshsEy2wJT2hZxE58XZK27qa8kg== 445 | dependencies: 446 | fast-decode-uri-component "^1.0.1" 447 | fast-deep-equal "^3.1.3" 448 | safe-regex2 "^2.0.0" 449 | semver-store "^0.3.0" 450 | 451 | find-up@^4.1.0: 452 | version "4.1.0" 453 | resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" 454 | integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== 455 | dependencies: 456 | locate-path "^5.0.0" 457 | path-exists "^4.0.0" 458 | 459 | flatstr@^1.0.12: 460 | version "1.0.12" 461 | resolved "https://registry.yarnpkg.com/flatstr/-/flatstr-1.0.12.tgz#c2ba6a08173edbb6c9640e3055b95e287ceb5931" 462 | integrity sha512-4zPxDyhCyiN2wIAtSLI6gc82/EjqZc1onI4Mz/l0pWrAlsSfYH/2ZIcU+e3oA2wDwbzIWNKwa23F8rh6+DRWkw== 463 | 464 | follow-redirects@^1.14.9: 465 | version "1.15.1" 466 | resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.1.tgz#0ca6a452306c9b276e4d3127483e29575e207ad5" 467 | integrity sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA== 468 | 469 | form-data@^4.0.0: 470 | version "4.0.0" 471 | resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" 472 | integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== 473 | dependencies: 474 | asynckit "^0.4.0" 475 | combined-stream "^1.0.8" 476 | mime-types "^2.1.12" 477 | 478 | forwarded@0.2.0: 479 | version "0.2.0" 480 | resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" 481 | integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== 482 | 483 | fsevents@~2.3.2: 484 | version "2.3.2" 485 | resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" 486 | integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== 487 | 488 | function-bind@^1.1.1: 489 | version "1.1.1" 490 | resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" 491 | integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== 492 | 493 | get-func-name@^2.0.0: 494 | version "2.0.0" 495 | resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.0.tgz#ead774abee72e20409433a066366023dd6887a41" 496 | integrity sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig== 497 | 498 | get-stream@^5.0.0: 499 | version "5.2.0" 500 | resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3" 501 | integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== 502 | dependencies: 503 | pump "^3.0.0" 504 | 505 | has-flag@^4.0.0: 506 | version "4.0.0" 507 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" 508 | integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== 509 | 510 | has@^1.0.3: 511 | version "1.0.3" 512 | resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" 513 | integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== 514 | dependencies: 515 | function-bind "^1.1.1" 516 | 517 | human-signals@^1.1.1: 518 | version "1.1.1" 519 | resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-1.1.1.tgz#c5b1cd14f50aeae09ab6c59fe63ba3395fe4dfa3" 520 | integrity sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw== 521 | 522 | husky@8.0.1: 523 | version "8.0.1" 524 | resolved "https://registry.yarnpkg.com/husky/-/husky-8.0.1.tgz#511cb3e57de3e3190514ae49ed50f6bc3f50b3e9" 525 | integrity sha512-xs7/chUH/CKdOCs7Zy0Aev9e/dKOMZf3K1Az1nar3tzlv0jfqnYtu235bstsWTmXOR0EfINrPa97yy4Lz6RiKw== 526 | 527 | ignore@^5.1.4: 528 | version "5.2.0" 529 | resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.0.tgz#6d3bac8fa7fe0d45d9f9be7bac2fc279577e345a" 530 | integrity sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ== 531 | 532 | ipaddr.js@1.9.1: 533 | version "1.9.1" 534 | resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" 535 | integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== 536 | 537 | is-core-module@^2.8.1: 538 | version "2.9.0" 539 | resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.9.0.tgz#e1c34429cd51c6dd9e09e0799e396e27b19a9c69" 540 | integrity sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A== 541 | dependencies: 542 | has "^1.0.3" 543 | 544 | is-stream@^2.0.0: 545 | version "2.0.1" 546 | resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" 547 | integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== 548 | 549 | isexe@^2.0.0: 550 | version "2.0.0" 551 | resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" 552 | integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== 553 | 554 | json-schema-traverse@^0.4.1: 555 | version "0.4.1" 556 | resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" 557 | integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== 558 | 559 | json-schema-traverse@^1.0.0: 560 | version "1.0.0" 561 | resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" 562 | integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== 563 | 564 | light-my-request@^4.2.0: 565 | version "4.10.1" 566 | resolved "https://registry.yarnpkg.com/light-my-request/-/light-my-request-4.10.1.tgz#09a93fa5af6a7b4339322b2e2b3f5d1c9679ed02" 567 | integrity sha512-l+zWk0HXGhGzY7IYTZnYEqIpj3Mpcyk2f8+FkKUyREywvaiWCf2jyQVxpasKRsploY/nVpoqTlxx72CIeQNcIQ== 568 | dependencies: 569 | ajv "^8.1.0" 570 | cookie "^0.5.0" 571 | process-warning "^1.0.0" 572 | set-cookie-parser "^2.4.1" 573 | 574 | local-pkg@^0.4.1: 575 | version "0.4.1" 576 | resolved "https://registry.yarnpkg.com/local-pkg/-/local-pkg-0.4.1.tgz#e7b0d7aa0b9c498a1110a5ac5b00ba66ef38cfff" 577 | integrity sha512-lL87ytIGP2FU5PWwNDo0w3WhIo2gopIAxPg9RxDYF7m4rr5ahuZxP22xnJHIvaLTe4Z9P6uKKY2UHiwyB4pcrw== 578 | 579 | locate-path@^5.0.0: 580 | version "5.0.0" 581 | resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" 582 | integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== 583 | dependencies: 584 | p-locate "^4.1.0" 585 | 586 | loupe@^2.3.1: 587 | version "2.3.4" 588 | resolved "https://registry.yarnpkg.com/loupe/-/loupe-2.3.4.tgz#7e0b9bffc76f148f9be769cb1321d3dcf3cb25f3" 589 | integrity sha512-OvKfgCC2Ndby6aSTREl5aCCPTNIzlDfQZvZxNUrBrihDhL3xcrYegTblhmEiCrg2kKQz4XsFIaemE5BF4ybSaQ== 590 | dependencies: 591 | get-func-name "^2.0.0" 592 | 593 | lru-cache@^6.0.0: 594 | version "6.0.0" 595 | resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" 596 | integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== 597 | dependencies: 598 | yallist "^4.0.0" 599 | 600 | merge-stream@^2.0.0: 601 | version "2.0.0" 602 | resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" 603 | integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== 604 | 605 | mime-db@1.52.0: 606 | version "1.52.0" 607 | resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" 608 | integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== 609 | 610 | mime-types@^2.1.12: 611 | version "2.1.35" 612 | resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" 613 | integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== 614 | dependencies: 615 | mime-db "1.52.0" 616 | 617 | mimic-fn@^2.1.0: 618 | version "2.1.0" 619 | resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" 620 | integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== 621 | 622 | minimatch@^3.0.4: 623 | version "3.1.2" 624 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" 625 | integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== 626 | dependencies: 627 | brace-expansion "^1.1.7" 628 | 629 | mri@^1.1.5: 630 | version "1.2.0" 631 | resolved "https://registry.yarnpkg.com/mri/-/mri-1.2.0.tgz#6721480fec2a11a4889861115a48b6cbe7cc8f0b" 632 | integrity sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA== 633 | 634 | ms@2.1.2: 635 | version "2.1.2" 636 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" 637 | integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== 638 | 639 | multimatch@^4.0.0: 640 | version "4.0.0" 641 | resolved "https://registry.yarnpkg.com/multimatch/-/multimatch-4.0.0.tgz#8c3c0f6e3e8449ada0af3dd29efb491a375191b3" 642 | integrity sha512-lDmx79y1z6i7RNx0ZGCPq1bzJ6ZoDDKbvh7jxr9SJcWLkShMzXrHbYVpTdnhNM5MXpDUxCQ4DgqVttVXlBgiBQ== 643 | dependencies: 644 | "@types/minimatch" "^3.0.3" 645 | array-differ "^3.0.0" 646 | array-union "^2.1.0" 647 | arrify "^2.0.1" 648 | minimatch "^3.0.4" 649 | 650 | nanoid@^3.3.4: 651 | version "3.3.4" 652 | resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.4.tgz#730b67e3cd09e2deacf03c027c81c9d9dbc5e8ab" 653 | integrity sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw== 654 | 655 | npm-run-path@^4.0.0: 656 | version "4.0.1" 657 | resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" 658 | integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== 659 | dependencies: 660 | path-key "^3.0.0" 661 | 662 | once@^1.3.1, once@^1.4.0: 663 | version "1.4.0" 664 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 665 | integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== 666 | dependencies: 667 | wrappy "1" 668 | 669 | onetime@^5.1.0: 670 | version "5.1.2" 671 | resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" 672 | integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== 673 | dependencies: 674 | mimic-fn "^2.1.0" 675 | 676 | p-limit@^2.2.0: 677 | version "2.3.0" 678 | resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" 679 | integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== 680 | dependencies: 681 | p-try "^2.0.0" 682 | 683 | p-locate@^4.1.0: 684 | version "4.1.0" 685 | resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" 686 | integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== 687 | dependencies: 688 | p-limit "^2.2.0" 689 | 690 | p-try@^2.0.0: 691 | version "2.2.0" 692 | resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" 693 | integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== 694 | 695 | path-exists@^4.0.0: 696 | version "4.0.0" 697 | resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" 698 | integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== 699 | 700 | path-key@^3.0.0, path-key@^3.1.0: 701 | version "3.1.1" 702 | resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" 703 | integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== 704 | 705 | path-parse@^1.0.7: 706 | version "1.0.7" 707 | resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" 708 | integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== 709 | 710 | pathval@^1.1.1: 711 | version "1.1.1" 712 | resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.1.tgz#8534e77a77ce7ac5a2512ea21e0fdb8fcf6c3d8d" 713 | integrity sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ== 714 | 715 | picocolors@^1.0.0: 716 | version "1.0.0" 717 | resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" 718 | integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== 719 | 720 | pino-std-serializers@^3.1.0: 721 | version "3.2.0" 722 | resolved "https://registry.yarnpkg.com/pino-std-serializers/-/pino-std-serializers-3.2.0.tgz#b56487c402d882eb96cd67c257868016b61ad671" 723 | integrity sha512-EqX4pwDPrt3MuOAAUBMU0Tk5kR/YcCM5fNPEzgCO2zJ5HfX0vbiH9HbJglnyeQsN96Kznae6MWD47pZB5avTrg== 724 | 725 | pino@^6.13.0: 726 | version "6.14.0" 727 | resolved "https://registry.yarnpkg.com/pino/-/pino-6.14.0.tgz#b745ea87a99a6c4c9b374e4f29ca7910d4c69f78" 728 | integrity sha512-iuhEDel3Z3hF9Jfe44DPXR8l07bhjuFY3GMHIXbjnY9XcafbyDDwl2sN2vw2GjMPf5Nkoe+OFao7ffn9SXaKDg== 729 | dependencies: 730 | fast-redact "^3.0.0" 731 | fast-safe-stringify "^2.0.8" 732 | flatstr "^1.0.12" 733 | pino-std-serializers "^3.1.0" 734 | process-warning "^1.0.0" 735 | quick-format-unescaped "^4.0.3" 736 | sonic-boom "^1.0.2" 737 | 738 | postcss@^8.4.13: 739 | version "8.4.14" 740 | resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.14.tgz#ee9274d5622b4858c1007a74d76e42e56fd21caf" 741 | integrity sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig== 742 | dependencies: 743 | nanoid "^3.3.4" 744 | picocolors "^1.0.0" 745 | source-map-js "^1.0.2" 746 | 747 | prettier@2.6.2: 748 | version "2.6.2" 749 | resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.6.2.tgz#e26d71a18a74c3d0f0597f55f01fb6c06c206032" 750 | integrity sha512-PkUpF+qoXTqhOeWL9fu7As8LXsIUZ1WYaJiY/a7McAQzxjk82OF0tibkFXVCDImZtWxbvojFjerkiLb0/q8mew== 751 | 752 | pretty-quick@3.1.3: 753 | version "3.1.3" 754 | resolved "https://registry.yarnpkg.com/pretty-quick/-/pretty-quick-3.1.3.tgz#15281108c0ddf446675157ca40240099157b638e" 755 | integrity sha512-kOCi2FJabvuh1as9enxYmrnBC6tVMoVOenMaBqRfsvBHB0cbpYHjdQEpSglpASDFEXVwplpcGR4CLEaisYAFcA== 756 | dependencies: 757 | chalk "^3.0.0" 758 | execa "^4.0.0" 759 | find-up "^4.1.0" 760 | ignore "^5.1.4" 761 | mri "^1.1.5" 762 | multimatch "^4.0.0" 763 | 764 | process-warning@^1.0.0: 765 | version "1.0.0" 766 | resolved "https://registry.yarnpkg.com/process-warning/-/process-warning-1.0.0.tgz#980a0b25dc38cd6034181be4b7726d89066b4616" 767 | integrity sha512-du4wfLyj4yCZq1VupnVSZmRsPJsNuxoDQFdCFHLaYiEbFBD7QE0a+I4D7hOxrVnh78QE/YipFAj9lXHiXocV+Q== 768 | 769 | proxy-addr@^2.0.7: 770 | version "2.0.7" 771 | resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" 772 | integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== 773 | dependencies: 774 | forwarded "0.2.0" 775 | ipaddr.js "1.9.1" 776 | 777 | pump@^3.0.0: 778 | version "3.0.0" 779 | resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" 780 | integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== 781 | dependencies: 782 | end-of-stream "^1.1.0" 783 | once "^1.3.1" 784 | 785 | punycode@^2.1.0: 786 | version "2.1.1" 787 | resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" 788 | integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== 789 | 790 | queue-microtask@^1.1.2: 791 | version "1.2.3" 792 | resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" 793 | integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== 794 | 795 | quick-format-unescaped@^4.0.3: 796 | version "4.0.4" 797 | resolved "https://registry.yarnpkg.com/quick-format-unescaped/-/quick-format-unescaped-4.0.4.tgz#93ef6dd8d3453cbc7970dd614fad4c5954d6b5a7" 798 | integrity sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg== 799 | 800 | require-from-string@^2.0.2: 801 | version "2.0.2" 802 | resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" 803 | integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== 804 | 805 | resolve@^1.22.0: 806 | version "1.22.0" 807 | resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.0.tgz#5e0b8c67c15df57a89bdbabe603a002f21731198" 808 | integrity sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw== 809 | dependencies: 810 | is-core-module "^2.8.1" 811 | path-parse "^1.0.7" 812 | supports-preserve-symlinks-flag "^1.0.0" 813 | 814 | ret@~0.2.0: 815 | version "0.2.2" 816 | resolved "https://registry.yarnpkg.com/ret/-/ret-0.2.2.tgz#b6861782a1f4762dce43402a71eb7a283f44573c" 817 | integrity sha512-M0b3YWQs7R3Z917WRQy1HHA7Ba7D8hvZg6UE5mLykJxQVE2ju0IXbGlaHPPlkY+WN7wFP+wUMXmBFA0aV6vYGQ== 818 | 819 | reusify@^1.0.4: 820 | version "1.0.4" 821 | resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" 822 | integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== 823 | 824 | rfdc@^1.1.4, rfdc@^1.2.0: 825 | version "1.3.0" 826 | resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.3.0.tgz#d0b7c441ab2720d05dc4cf26e01c89631d9da08b" 827 | integrity sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA== 828 | 829 | rollup@^2.59.0: 830 | version "2.75.5" 831 | resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.75.5.tgz#7985c1962483235dd07966f09fdad5c5f89f16d0" 832 | integrity sha512-JzNlJZDison3o2mOxVmb44Oz7t74EfSd1SQrplQk0wSaXV7uLQXtVdHbxlcT3w+8tZ1TL4r/eLfc7nAbz38BBA== 833 | optionalDependencies: 834 | fsevents "~2.3.2" 835 | 836 | safe-regex2@^2.0.0: 837 | version "2.0.0" 838 | resolved "https://registry.yarnpkg.com/safe-regex2/-/safe-regex2-2.0.0.tgz#b287524c397c7a2994470367e0185e1916b1f5b9" 839 | integrity sha512-PaUSFsUaNNuKwkBijoAPHAK6/eM6VirvyPWlZ7BAQy4D+hCvh4B6lIG+nPdhbFfIbP+gTGBcrdsOaUs0F+ZBOQ== 840 | dependencies: 841 | ret "~0.2.0" 842 | 843 | secure-json-parse@^2.0.0: 844 | version "2.4.0" 845 | resolved "https://registry.yarnpkg.com/secure-json-parse/-/secure-json-parse-2.4.0.tgz#5aaeaaef85c7a417f76271a4f5b0cc3315ddca85" 846 | integrity sha512-Q5Z/97nbON5t/L/sH6mY2EacfjVGwrCcSi5D3btRO2GZ8pf1K1UN7Z9H5J57hjVU2Qzxr1xO+FmBhOvEkzCMmg== 847 | 848 | semver-store@^0.3.0: 849 | version "0.3.0" 850 | resolved "https://registry.yarnpkg.com/semver-store/-/semver-store-0.3.0.tgz#ce602ff07df37080ec9f4fb40b29576547befbe9" 851 | integrity sha512-TcZvGMMy9vodEFSse30lWinkj+JgOBvPn8wRItpQRSayhc+4ssDs335uklkfvQQJgL/WvmHLVj4Ycv2s7QCQMg== 852 | 853 | semver@^7.3.2: 854 | version "7.3.7" 855 | resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.7.tgz#12c5b649afdbf9049707796e22a4028814ce523f" 856 | integrity sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g== 857 | dependencies: 858 | lru-cache "^6.0.0" 859 | 860 | set-cookie-parser@^2.4.1: 861 | version "2.5.0" 862 | resolved "https://registry.yarnpkg.com/set-cookie-parser/-/set-cookie-parser-2.5.0.tgz#96b59525e1362c94335c3c761100bb6e8f2da4b0" 863 | integrity sha512-cHMAtSXilfyBePduZEBVPTCftTQWz6ehWJD5YNUg4mqvRosrrjKbo4WS8JkB0/RxonMoohHm7cOGH60mDkRQ9w== 864 | 865 | shebang-command@^2.0.0: 866 | version "2.0.0" 867 | resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" 868 | integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== 869 | dependencies: 870 | shebang-regex "^3.0.0" 871 | 872 | shebang-regex@^3.0.0: 873 | version "3.0.0" 874 | resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" 875 | integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== 876 | 877 | signal-exit@^3.0.2: 878 | version "3.0.7" 879 | resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" 880 | integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== 881 | 882 | sonic-boom@^1.0.2: 883 | version "1.4.1" 884 | resolved "https://registry.yarnpkg.com/sonic-boom/-/sonic-boom-1.4.1.tgz#d35d6a74076624f12e6f917ade7b9d75e918f53e" 885 | integrity sha512-LRHh/A8tpW7ru89lrlkU4AszXt1dbwSjVWguGrmlxE7tawVmDBlI1PILMkXAxJTwqhgsEeTHzj36D5CmHgQmNg== 886 | dependencies: 887 | atomic-sleep "^1.0.0" 888 | flatstr "^1.0.12" 889 | 890 | source-map-js@^1.0.2: 891 | version "1.0.2" 892 | resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" 893 | integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== 894 | 895 | string-similarity@^4.0.1: 896 | version "4.0.4" 897 | resolved "https://registry.yarnpkg.com/string-similarity/-/string-similarity-4.0.4.tgz#42d01ab0b34660ea8a018da8f56a3309bb8b2a5b" 898 | integrity sha512-/q/8Q4Bl4ZKAPjj8WerIBJWALKkaPRfrvhfF8k/B23i4nzrlRj2/go1m90In7nG/3XDSbOo0+pu6RvCTM9RGMQ== 899 | 900 | strip-final-newline@^2.0.0: 901 | version "2.0.0" 902 | resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" 903 | integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== 904 | 905 | supports-color@^7.1.0: 906 | version "7.2.0" 907 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" 908 | integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== 909 | dependencies: 910 | has-flag "^4.0.0" 911 | 912 | supports-preserve-symlinks-flag@^1.0.0: 913 | version "1.0.0" 914 | resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" 915 | integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== 916 | 917 | tiny-lru@^8.0.1: 918 | version "8.0.2" 919 | resolved "https://registry.yarnpkg.com/tiny-lru/-/tiny-lru-8.0.2.tgz#812fccbe6e622ded552e3ff8a4c3b5ff34a85e4c" 920 | integrity sha512-ApGvZ6vVvTNdsmt676grvCkUCGwzG9IqXma5Z07xJgiC5L7akUMof5U8G2JTI9Rz/ovtVhJBlY6mNhEvtjzOIg== 921 | 922 | tinypool@^0.1.3: 923 | version "0.1.3" 924 | resolved "https://registry.yarnpkg.com/tinypool/-/tinypool-0.1.3.tgz#b5570b364a1775fd403de5e7660b325308fee26b" 925 | integrity sha512-2IfcQh7CP46XGWGGbdyO4pjcKqsmVqFAPcXfPxcPXmOWt9cYkTP9HcDmGgsfijYoAEc4z9qcpM/BaBz46Y9/CQ== 926 | 927 | tinyspy@^0.3.2: 928 | version "0.3.2" 929 | resolved "https://registry.yarnpkg.com/tinyspy/-/tinyspy-0.3.2.tgz#2f95cb14c38089ca690385f339781cd35faae566" 930 | integrity sha512-2+40EP4D3sFYy42UkgkFFB+kiX2Tg3URG/lVvAZFfLxgGpnWl5qQJuBw1gaLttq8UOS+2p3C0WrhJnQigLTT2Q== 931 | 932 | type-detect@^4.0.0, type-detect@^4.0.5: 933 | version "4.0.8" 934 | resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" 935 | integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== 936 | 937 | typescript@^4.7.3: 938 | version "4.7.3" 939 | resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.7.3.tgz#8364b502d5257b540f9de4c40be84c98e23a129d" 940 | integrity sha512-WOkT3XYvrpXx4vMMqlD+8R8R37fZkjyLGlxavMc4iB8lrl8L0DeTcHbYgw/v0N/z9wAFsgBhcsF0ruoySS22mA== 941 | 942 | uri-js@^4.2.2: 943 | version "4.4.1" 944 | resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" 945 | integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== 946 | dependencies: 947 | punycode "^2.1.0" 948 | 949 | vite@^2.9.9: 950 | version "2.9.9" 951 | resolved "https://registry.yarnpkg.com/vite/-/vite-2.9.9.tgz#8b558987db5e60fedec2f4b003b73164cb081c5e" 952 | integrity sha512-ffaam+NgHfbEmfw/Vuh6BHKKlI/XIAhxE5QSS7gFLIngxg171mg1P3a4LSRME0z2ZU1ScxoKzphkipcYwSD5Ew== 953 | dependencies: 954 | esbuild "^0.14.27" 955 | postcss "^8.4.13" 956 | resolve "^1.22.0" 957 | rollup "^2.59.0" 958 | optionalDependencies: 959 | fsevents "~2.3.2" 960 | 961 | vitest@^0.13.1: 962 | version "0.13.1" 963 | resolved "https://registry.yarnpkg.com/vitest/-/vitest-0.13.1.tgz#4b857c6ca0a9a1a2340dc8a1d9991b1f75934220" 964 | integrity sha512-CfSBf7YFw/i8HumSUQRtZKs0aV91DC9WU8nAgIJAlawKHaFuPHQohDwOTPIFgrxySiuFYUa0Yohf9gDFfBwjxA== 965 | dependencies: 966 | "@types/chai" "^4.3.1" 967 | "@types/chai-subset" "^1.3.3" 968 | chai "^4.3.6" 969 | debug "^4.3.4" 970 | local-pkg "^0.4.1" 971 | tinypool "^0.1.3" 972 | tinyspy "^0.3.2" 973 | vite "^2.9.9" 974 | 975 | which@^2.0.1: 976 | version "2.0.2" 977 | resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" 978 | integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== 979 | dependencies: 980 | isexe "^2.0.0" 981 | 982 | wrappy@1: 983 | version "1.0.2" 984 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 985 | integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= 986 | 987 | yallist@^4.0.0: 988 | version "4.0.0" 989 | resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" 990 | integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== 991 | --------------------------------------------------------------------------------