├── index.js ├── test ├── mocha.opts ├── general.test.ts └── domain.test.ts ├── examples ├── node-http-server-ts │ ├── .gitignore │ ├── nodemon.json │ ├── package.json │ ├── tsconfig.json │ ├── src │ │ ├── service.ts │ │ ├── middlewares.ts │ │ ├── index.ts │ │ └── logger.ts │ ├── README.md │ └── yarn.lock ├── express-http-server-ts │ ├── .gitignore │ ├── nodemon.json │ ├── tsconfig.json │ ├── package.json │ ├── src │ │ ├── service.ts │ │ ├── index.ts │ │ ├── middlewares.ts │ │ └── logger.ts │ └── README.md ├── fastify-http-server-ts │ ├── .gitignore │ ├── nodemon.json │ ├── src │ │ ├── service.ts │ │ ├── index.ts │ │ └── plugin.ts │ ├── package.json │ ├── tsconfig.json │ ├── README.md │ └── yarn.lock └── koa-http-server-ts │ ├── nodemon.json │ ├── tsconfig.json │ ├── package.json │ ├── src │ ├── index.ts │ ├── middlewares.ts │ ├── service.ts │ └── logger.ts │ └── README.md ├── .gitignore ├── src ├── constants.ts ├── Middleware.ts ├── AsyncStoreParams.ts ├── StoreDomain.ts ├── AsyncStoreAdapter.ts ├── AsyncStore.ts ├── impl │ └── domain.ts └── index.ts ├── .nycrc.json ├── tsconfig.json ├── .github └── workflows │ └── build-test.yml ├── LICENSE ├── release.sh ├── package.json ├── README.md └── CHANGELOG.md /index.js: -------------------------------------------------------------------------------- 1 | module.exports = require('./dist'); 2 | -------------------------------------------------------------------------------- /test/mocha.opts: -------------------------------------------------------------------------------- 1 | --require ts-node/register 2 | -------------------------------------------------------------------------------- /examples/node-http-server-ts/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | dist/ 3 | -------------------------------------------------------------------------------- /examples/express-http-server-ts/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | dist/ 3 | -------------------------------------------------------------------------------- /examples/fastify-http-server-ts/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | dist/ 3 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/ 2 | dist/ 3 | yarn-error.log 4 | 5 | .nyc_output/ 6 | coverage/ 7 | -------------------------------------------------------------------------------- /src/constants.ts: -------------------------------------------------------------------------------- 1 | export const STORE_CORE = 'async-store:core'; 2 | export const STORE_DOMAIN = 'async-store:domain'; 3 | -------------------------------------------------------------------------------- /examples/express-http-server-ts/nodemon.json: -------------------------------------------------------------------------------- 1 | { 2 | "watch": ["src/**/*", ".env"], 3 | "ext": "ts,js,.env", 4 | "verbose": false, 5 | "exec": "yarn build && node dist/index.js" 6 | } 7 | -------------------------------------------------------------------------------- /examples/fastify-http-server-ts/nodemon.json: -------------------------------------------------------------------------------- 1 | { 2 | "watch": ["src/**/*", ".env"], 3 | "ext": "ts,js,.env", 4 | "verbose": false, 5 | "exec": "yarn build && node dist/index.js" 6 | } 7 | -------------------------------------------------------------------------------- /examples/koa-http-server-ts/nodemon.json: -------------------------------------------------------------------------------- 1 | { 2 | "watch": ["src/**/*", ".env"], 3 | "ext": "ts,js,.env", 4 | "verbose": false, 5 | "exec": "yarn build && node dist/index.js" 6 | } 7 | -------------------------------------------------------------------------------- /examples/node-http-server-ts/nodemon.json: -------------------------------------------------------------------------------- 1 | { 2 | "watch": ["src/**/*", ".env"], 3 | "ext": "ts,js,.env", 4 | "verbose": false, 5 | "exec": "yarn build && node dist/index.js" 6 | } 7 | -------------------------------------------------------------------------------- /src/Middleware.ts: -------------------------------------------------------------------------------- 1 | import { Request, Response, NextFunction } from 'express'; 2 | 3 | /** 4 | * Signature for a middleware function. 5 | */ 6 | type Middleware = (req: Request, res: Response, next: NextFunction) => Promise | void; 7 | 8 | export default Middleware; 9 | -------------------------------------------------------------------------------- /src/AsyncStoreParams.ts: -------------------------------------------------------------------------------- 1 | import { EventEmitter } from 'events'; 2 | 3 | /** 4 | * Async Store params interface. 5 | */ 6 | export interface AsyncStoreParams { 7 | req?: any; 8 | res?: any; 9 | emitters?: EventEmitter[]; 10 | error?: (...args: any[]) => void; 11 | } 12 | 13 | export default AsyncStoreParams; 14 | -------------------------------------------------------------------------------- /.nycrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "@istanbuljs/nyc-config-typescript", 3 | "require": ["ts-node/register"], 4 | "include": ["src"], 5 | "exclude": ["examples", "dist"], 6 | "cache": false, 7 | "sourceMap": true, 8 | "all": true, 9 | "instrument": true, 10 | "reporter": ["lcov", "text", "text-summary"] 11 | } 12 | -------------------------------------------------------------------------------- /examples/koa-http-server-ts/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "module": "commonjs", 4 | "target": "es2017", 5 | "noImplicitAny": true, 6 | "outDir": "./dist", 7 | "sourceMap": true, 8 | "types": ["node"], 9 | "esModuleInterop": true 10 | }, 11 | "include": ["./src/**/*"] 12 | } 13 | -------------------------------------------------------------------------------- /src/StoreDomain.ts: -------------------------------------------------------------------------------- 1 | import { Domain } from 'domain'; 2 | 3 | export const ID_KEY = '__$id__'; 4 | export const STORE_KEY = '__$store__'; 5 | 6 | /** 7 | * The custom domain type with the store. 8 | */ 9 | interface StoreDomain extends Domain { 10 | [STORE_KEY]?: any; 11 | [ID_KEY]?: string; 12 | } 13 | 14 | export default StoreDomain; 15 | -------------------------------------------------------------------------------- /src/AsyncStoreAdapter.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * Async Store adapter types. 3 | */ 4 | enum AsyncStoreAdapter { 5 | DOMAIN = 'domain' 6 | 7 | // Later we can add other implementations of the store as a new adapter, 8 | // for instance, add: ASYNC_HOOKS = 'async_hooks' 9 | // and create implementation for async hooks as per the API requirements. 10 | } 11 | 12 | export default AsyncStoreAdapter; 13 | -------------------------------------------------------------------------------- /examples/fastify-http-server-ts/src/service.ts: -------------------------------------------------------------------------------- 1 | import * as store from '@leapfrogtechnology/async-store'; 2 | 3 | /** 4 | * An example function making use of the request context 5 | * set in the store asynchronously (with delay). 6 | */ 7 | export function doSomethingAsync() { 8 | // Do something with the request with a delay. 9 | return new Promise((resolve, reject) => { 10 | setTimeout(() => { 11 | const data = store.getAll(); 12 | resolve(data); 13 | }, 2000); 14 | }); 15 | } 16 | -------------------------------------------------------------------------------- /examples/fastify-http-server-ts/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "fastify-http-server-ts", 3 | "version": "1.0.0", 4 | "description": "Example of fastify and async-store usage in TypeScript", 5 | "license": "MIT", 6 | "scripts": { 7 | "start": "nodemon", 8 | "build": "tsc" 9 | }, 10 | "dependencies": { 11 | "@leapfrogtechnology/async-store": "^2.0.0", 12 | "fastify": "^3.29.4", 13 | "fastify-plugin": "^3.0.0", 14 | "nodemon": "^2.0.15" 15 | }, 16 | "devDependencies": { 17 | "typescript": "^4.5.4" 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /examples/node-http-server-ts/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "node-http-server-ts", 3 | "version": "1.0.0", 4 | "description": "Example of node and async-store usage in TypeScript", 5 | "scripts": { 6 | "start": "nodemon", 7 | "build": "tsc" 8 | }, 9 | "author": "", 10 | "license": "MIT", 11 | "dependencies": { 12 | "@leapfrogtechnology/async-store": "^2.0.0", 13 | "nodemon": "^2.0.15", 14 | "qs": "^6.9.1" 15 | }, 16 | "devDependencies": { 17 | "@types/qs": "^6.9.0", 18 | "typescript": "^3.7.2" 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/AsyncStore.ts: -------------------------------------------------------------------------------- 1 | import AsyncStoreParams from './AsyncStoreParams'; 2 | 3 | /** 4 | * Async Store implementation contract. 5 | */ 6 | interface AsyncStore { 7 | initialize: (callback: (err?: any) => void, params?: AsyncStoreParams) => any; 8 | set: (properties: any) => void; 9 | get: (key: string) => any; 10 | getAll: () => any; 11 | getByKeys: (keys: string[]) => any; 12 | find: (key: string) => any; 13 | isInitialized: () => boolean; 14 | getId: () => string | undefined; 15 | getShortId: () => string | undefined; 16 | } 17 | 18 | export default AsyncStore; 19 | -------------------------------------------------------------------------------- /examples/express-http-server-ts/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "outDir": "./dist", 4 | "allowJs": false, 5 | "target": "es5", 6 | "sourceMap": true, 7 | "module": "commonjs", 8 | "strictNullChecks": true, 9 | "strict": true, 10 | "alwaysStrict": true, 11 | "noImplicitAny": true, 12 | "removeComments": true, 13 | "lib": ["es2015", "es2016", "es2017"], 14 | "types": ["node"], 15 | "noUnusedLocals": true, 16 | "allowSyntheticDefaultImports": true 17 | }, 18 | "include": ["src/**/*"], 19 | "exclude": ["node_modules", "test/**/*"] 20 | } 21 | -------------------------------------------------------------------------------- /examples/express-http-server-ts/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "express-http-server-ts", 3 | "description": "Example of express and async-store usage in TypeScript", 4 | "version": "1.0.0", 5 | "author": "Kabir Baidhya ", 6 | "license": "MIT", 7 | "scripts": { 8 | "start": "nodemon", 9 | "build": "tsc" 10 | }, 11 | "dependencies": { 12 | "@leapfrogtechnology/async-store": "^2.0.0", 13 | "express": "^4.20.0", 14 | "nodemon": "^2.0.15" 15 | }, 16 | "devDependencies": { 17 | "@types/express": "^4.17.9", 18 | "@types/node": "^14.14.17", 19 | "typescript": "^4.1.3" 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /examples/node-http-server-ts/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "outDir": "./dist", 4 | "allowJs": false, 5 | "target": "es5", 6 | "sourceMap": true, 7 | "module": "commonjs", 8 | "strictNullChecks": true, 9 | "strict": true, 10 | "alwaysStrict": true, 11 | "noImplicitAny": true, 12 | "removeComments": true, 13 | "lib": ["es2015", "es2016", "es2017"], 14 | "types": ["node"], 15 | "noUnusedLocals": true, 16 | "allowSyntheticDefaultImports": true, 17 | "downlevelIteration": true 18 | }, 19 | "include": ["src/**/*"], 20 | "exclude": ["node_modules", "test/**/*"] 21 | } 22 | -------------------------------------------------------------------------------- /examples/express-http-server-ts/src/service.ts: -------------------------------------------------------------------------------- 1 | import * as store from '@leapfrogtechnology/async-store'; 2 | 3 | import * as logger from './logger'; 4 | 5 | /** 6 | * An example function making use of the request context 7 | * set in the store asynchronously (with delay). 8 | */ 9 | export function doSomethingAsync() { 10 | // Do something with the request with a delay. 11 | logger.debug('Simulating delayed access'); 12 | 13 | return new Promise((resolve, reject) => { 14 | setTimeout(() => { 15 | const data = store.getAll(); 16 | logger.info('Store contents: ' + JSON.stringify(data)); 17 | resolve(null); 18 | }, 2000); 19 | }); 20 | } 21 | -------------------------------------------------------------------------------- /examples/fastify-http-server-ts/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "outDir": "./dist", 4 | "allowJs": false, 5 | "target": "es5", 6 | "sourceMap": true, 7 | "module": "commonjs", 8 | "strictNullChecks": true, 9 | "strict": true, 10 | "alwaysStrict": true, 11 | "noImplicitAny": true, 12 | "removeComments": true, 13 | "esModuleInterop": true, 14 | "lib": ["es2015", "es2016", "es2017"], 15 | "skipLibCheck": true, 16 | "types": ["node"], 17 | "noUnusedLocals": true, 18 | "allowSyntheticDefaultImports": true 19 | }, 20 | "include": ["src/**/*"], 21 | "exclude": ["node_modules", "test/**/*"] 22 | } 23 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "outDir": "./dist", 4 | "allowJs": false, 5 | "target": "es5", 6 | "sourceMap": true, 7 | "module": "commonjs", 8 | "strictNullChecks": true, 9 | "declaration": true, 10 | "declarationDir": "./dist", 11 | "strict": true, 12 | "alwaysStrict": true, 13 | "noImplicitAny": true, 14 | "removeComments": false, 15 | "lib": ["es2015", "es2016", "es2017"], 16 | "types": ["node"], 17 | "noUnusedLocals": true, 18 | "skipLibCheck": true, 19 | "allowSyntheticDefaultImports": true, 20 | "esModuleInterop": true 21 | }, 22 | "include": ["src/**/*"], 23 | "exclude": ["node_modules", "test/**/*", "examples/**/*"] 24 | } 25 | -------------------------------------------------------------------------------- /examples/koa-http-server-ts/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "koa-http-server-ts", 3 | "version": "1.0.0", 4 | "description": "Example of koa and async-store usage in TypeScript", 5 | "author": "Swechhya Bista ", 6 | "contributors": [ 7 | "Saroj Rana " 8 | ], 9 | "license": "MIT", 10 | "scripts": { 11 | "start": "nodemon", 12 | "build": "tsc" 13 | }, 14 | "dependencies": { 15 | "@leapfrogtechnology/async-store": "^2.0.0", 16 | "koa": "^3.0.3", 17 | "koa-request": "^1.0.0", 18 | "nodemon": "^2.0.15", 19 | "qs": "^6.9.4" 20 | }, 21 | "devDependencies": { 22 | "@types/koa": "^2.11.6", 23 | "@types/node": "^14.14.17", 24 | "@types/qs": "^6.9.5", 25 | "typescript": "^4.1.3" 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /examples/express-http-server-ts/src/index.ts: -------------------------------------------------------------------------------- 1 | import * as express from 'express'; 2 | import { Request, Response } from 'express'; 3 | 4 | import * as store from '@leapfrogtechnology/async-store'; 5 | 6 | import * as logger from './logger'; 7 | import { storeParams, calculateSum } from './middlewares'; 8 | 9 | const app = express(); 10 | const port = process.env.PORT || 3000; 11 | 12 | app.use(store.initializeMiddleware()); 13 | app.use(storeParams()); 14 | 15 | app.get('/', calculateSum(), (req: Request, res: Response) => { 16 | const a = store.get('a'); 17 | const b = store.get('b'); 18 | const sum = store.get('sum'); 19 | 20 | res.send(`Sum of ${a}, ${b}: ${sum}\n`); 21 | logger.info('Response sent'); 22 | }); 23 | 24 | app.listen(port, () => { 25 | logger.info(`HTTP server listening on port ${port}!\n`); 26 | }); 27 | -------------------------------------------------------------------------------- /examples/koa-http-server-ts/src/index.ts: -------------------------------------------------------------------------------- 1 | import Koa, { Context } from 'koa'; 2 | import * as store from '@leapfrogtechnology/async-store'; 3 | 4 | import * as logger from './logger'; 5 | import { storeParams, calculateSum } from './middlewares'; 6 | 7 | const app = new Koa(); 8 | 9 | const port = process.env.PORT || 3000; 10 | 11 | app.use((ctx: Context) => { 12 | store.initialize()(() => { 13 | storeParams(ctx); 14 | calculateSum(); 15 | handleRequest(ctx); 16 | }); 17 | }); 18 | 19 | app.listen(port, () => { 20 | logger.info(`HTTP server listening on port ${port}!\n`); 21 | }); 22 | 23 | /** 24 | * Handle incoming request. 25 | * 26 | * @param {Context} ctx 27 | */ 28 | function handleRequest(ctx: Context) { 29 | const a = store.get('a'); 30 | const b = store.get('b'); 31 | const sum = store.get('sum'); 32 | 33 | ctx.body = `Sum of ${a}, ${b} = ${sum}\n`; 34 | logger.info('Response sent'); 35 | } 36 | -------------------------------------------------------------------------------- /examples/koa-http-server-ts/src/middlewares.ts: -------------------------------------------------------------------------------- 1 | import { Context } from 'koa'; 2 | import * as store from '@leapfrogtechnology/async-store'; 3 | 4 | import * as logger from './logger'; 5 | import { doSomethingAsync } from './service'; 6 | 7 | /** 8 | * Middleware to set query params `a` and `b` on async-store. 9 | * 10 | * @param {Context} ctx 11 | * 12 | */ 13 | export function storeParams(ctx: Context) { 14 | const { a, b } = ctx.query; 15 | 16 | store.set({ a, b }); 17 | 18 | logger.debug(`Persisted a: ${a}`); 19 | logger.debug(`Persisted b: ${b}`); 20 | } 21 | 22 | /** 23 | * Middleware to add the parameters `a` and `b` and set `sum` on the async store. 24 | */ 25 | export function calculateSum() { 26 | doSomethingAsync(); 27 | 28 | const a = +store.get('a'); 29 | const b = +store.get('b'); 30 | const sum = a + b; 31 | 32 | store.set({ sum }); 33 | 34 | logger.debug(`Calculated sum: ${sum}`); 35 | logger.debug(`Persisted sum: ${sum}`); 36 | } 37 | -------------------------------------------------------------------------------- /examples/node-http-server-ts/src/service.ts: -------------------------------------------------------------------------------- 1 | import * as qs from 'qs'; 2 | import * as logger from './logger'; 3 | 4 | import * as store from '@leapfrogtechnology/async-store'; 5 | 6 | /** 7 | * Set input params received from query in the store. 8 | * 9 | * @param {any} query 10 | */ 11 | export function storeParams(query: any) { 12 | const { a, b } = qs.parse(query); 13 | 14 | store.set({ a, b }); 15 | 16 | logger.debug(`Persisted a: ${a}`); 17 | logger.debug(`Persisted b: ${b}`); 18 | } 19 | 20 | /** 21 | * An example function making use of the request context 22 | * set in the store asynchronously (with delay). 23 | */ 24 | export function doSomethingAsync() { 25 | // Do something with the request with a delay. 26 | logger.debug('Simulating delayed access'); 27 | 28 | return new Promise((resolve, reject) => { 29 | setTimeout(() => { 30 | const data = store.getAll(); 31 | logger.info('Store contents: ' + JSON.stringify(data)); 32 | resolve(null); 33 | }, 2000); 34 | }); 35 | } 36 | -------------------------------------------------------------------------------- /examples/koa-http-server-ts/src/service.ts: -------------------------------------------------------------------------------- 1 | import qs from 'qs'; 2 | import * as store from '@leapfrogtechnology/async-store'; 3 | 4 | import * as logger from './logger'; 5 | 6 | /** 7 | * Set input params received from query in the store. 8 | * 9 | * @param {string} query 10 | */ 11 | export function storeParams(query: string) { 12 | const { a, b } = qs.parse(query); 13 | 14 | store.set({ a, b }); 15 | 16 | logger.debug(`Persisted a: ${a}`); 17 | logger.debug(`Persisted b: ${b}`); 18 | } 19 | 20 | /** 21 | * An example function making use of the request context 22 | * set in the store asynchronously (with delay). 23 | * 24 | * @returns {Promise} 25 | */ 26 | export function doSomethingAsync(): Promise { 27 | // Do something with the request with a delay. 28 | logger.debug('Simulating delayed access'); 29 | 30 | return new Promise((resolve) => { 31 | setTimeout(() => { 32 | const data = store.getAll(); 33 | logger.info('Store contents: ' + JSON.stringify(data)); 34 | resolve(); 35 | }, 2000); 36 | }); 37 | } 38 | -------------------------------------------------------------------------------- /test/general.test.ts: -------------------------------------------------------------------------------- 1 | import 'mocha'; 2 | import { expect } from 'chai'; 3 | 4 | import * as globalStore from '../src'; 5 | import AsyncStoreAdapter from '../src/AsyncStoreAdapter'; 6 | 7 | describe('store: General', () => { 8 | beforeEach(() => { 9 | Object.assign(process, { domain: undefined }); 10 | }); 11 | 12 | it('should throw an error while initializing if unknown adapter passed.', () => { 13 | expect(globalStore.initialize.bind(globalStore, 'UNKNOWN_ADAPTER' as AsyncStoreAdapter)).to.throw( 14 | 'Invalid async store adapter provided UNKNOWN_ADAPTER.' 15 | ); 16 | }); 17 | 18 | it('should throw an error when initialized multiple times.', () => { 19 | const callback = () => { 20 | // Try re-initializing the store and it should throw an error. 21 | expect(globalStore.initialize.bind(globalStore, AsyncStoreAdapter.DOMAIN)).to.throw( 22 | 'Async store already initialized, cannot re-initialize again.' 23 | ); 24 | }; 25 | 26 | globalStore.initialize(AsyncStoreAdapter.DOMAIN)(callback); 27 | }); 28 | }); 29 | -------------------------------------------------------------------------------- /.github/workflows/build-test.yml: -------------------------------------------------------------------------------- 1 | on: 2 | pull_request: 3 | branches: 4 | - main 5 | paths-ignore: 6 | - '**.md' 7 | push: 8 | branches: 9 | - main 10 | paths-ignore: 11 | - '**.md' 12 | 13 | jobs: 14 | build: 15 | runs-on: ubuntu-latest 16 | strategy: 17 | matrix: 18 | node: ['14', '16', '18', '20'] 19 | name: Node ${{ matrix.node }} 20 | steps: 21 | - uses: actions/checkout@v2 22 | - name: Setup node 23 | uses: actions/setup-node@v2 24 | with: 25 | node-version: ${{ matrix.node }} 26 | cache: 'yarn' 27 | 28 | - name: Install dependencies 29 | run: yarn 30 | 31 | - name: Build package 32 | run: yarn build 33 | 34 | - name: Run unit tests 35 | run: yarn test 36 | 37 | - name: Upload coverage to Codecov 38 | uses: codecov/codecov-action@v4 39 | with: 40 | fail_ci_if_error: true 41 | directory: ./coverage 42 | files: ./lcov.info 43 | token: ${{ secrets.CODECOV_TOKEN }} 44 | verbose: true 45 | -------------------------------------------------------------------------------- /examples/node-http-server-ts/src/middlewares.ts: -------------------------------------------------------------------------------- 1 | import * as qs from 'qs'; 2 | import { ServerResponse, IncomingMessage } from 'http'; 3 | 4 | import * as store from '@leapfrogtechnology/async-store'; 5 | 6 | import * as logger from './logger'; 7 | import { doSomethingAsync } from './service'; 8 | 9 | /** 10 | * Set input params received from query in the store. 11 | * 12 | * @param {any} query 13 | */ 14 | export function storeParams(query: any) { 15 | const { a, b } = qs.parse(query); 16 | 17 | store.set({ a, b }); 18 | 19 | logger.debug(`Persisted a: ${a}`); 20 | logger.debug(`Persisted b: ${b}`); 21 | } 22 | 23 | /** 24 | * Middleware to add the parameters `a` and `b` and set `sum` on the async store. 25 | * 26 | * @param {IncomingMessage} req 27 | * @param {ServerResponse} res 28 | */ 29 | export function calculateSum(req: IncomingMessage, res: ServerResponse) { 30 | doSomethingAsync(); 31 | 32 | const a = +store.get('a'); 33 | const b = +store.get('b'); 34 | const sum = a + b; 35 | 36 | store.set({ sum }); 37 | logger.debug(`Calculated sum: ${sum}`); 38 | logger.debug(`Persisted sum: ${sum}`); 39 | } 40 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2019 - present Leapfrog Technology Inc. 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /examples/node-http-server-ts/src/index.ts: -------------------------------------------------------------------------------- 1 | import * as http from 'http'; 2 | import { IncomingMessage, ServerResponse } from 'http'; 3 | import * as store from '@leapfrogtechnology/async-store'; 4 | 5 | import * as logger from './logger'; 6 | import { storeParams, calculateSum } from './middlewares'; 7 | 8 | const port = process.env.PORT || 3000; 9 | 10 | const app = http.createServer((req, res) => 11 | store.initialize()( 12 | () => { 13 | storeParams((req.url || '').split('?', 2)[1]); 14 | calculateSum(req, res); 15 | handleRequest(req, res); 16 | }, 17 | { req, res, error: logger.error } 18 | ) 19 | ); 20 | 21 | app.listen(port, () => { 22 | logger.info(`HTTP server listening on port ${port}!\n`); 23 | }); 24 | 25 | /** 26 | * Handle incoming http request. 27 | * 28 | * @param {IncomingMessage} req 29 | * @param {ServerResponse} res 30 | */ 31 | function handleRequest(req: IncomingMessage, res: ServerResponse) { 32 | const a = store.get('a'); 33 | const b = store.get('b'); 34 | const sum = store.get('sum'); 35 | 36 | res.write(`Sum of ${a}, ${b} = ${sum}\n`); 37 | res.end(); 38 | logger.info('Response sent'); 39 | } 40 | -------------------------------------------------------------------------------- /examples/express-http-server-ts/src/middlewares.ts: -------------------------------------------------------------------------------- 1 | import * as store from '@leapfrogtechnology/async-store'; 2 | import { Request, Response, NextFunction } from 'express'; 3 | 4 | import * as logger from './logger'; 5 | import { doSomethingAsync } from './service'; 6 | 7 | /** 8 | * Middleware to set query params `a` and `b` on async-store. 9 | * 10 | * @returns {(req, res, next) => void} 11 | */ 12 | export function storeParams() { 13 | return (req: Request, res: Response, next: NextFunction) => { 14 | const { a, b } = req.query; 15 | 16 | store.set({ a, b }); 17 | 18 | logger.debug(`Persisted a: ${a}`); 19 | logger.debug(`Persisted b: ${b}`); 20 | 21 | next(); 22 | }; 23 | } 24 | 25 | /** 26 | * Middleware to add the parameters `a` and `b` and set `sum` on the async store. 27 | * 28 | * @returns {(req, res, next) => void} 29 | */ 30 | export function calculateSum() { 31 | return (req: Request, res: Response, next: NextFunction) => { 32 | doSomethingAsync(); 33 | 34 | const a = +store.get('a'); 35 | const b = +store.get('b'); 36 | const sum = a + b; 37 | 38 | store.set({ sum }); 39 | logger.debug(`Calculated sum: ${sum}`); 40 | logger.debug(`Persisted sum: ${sum}`); 41 | 42 | next(); 43 | }; 44 | } 45 | -------------------------------------------------------------------------------- /examples/fastify-http-server-ts/src/index.ts: -------------------------------------------------------------------------------- 1 | import fastifyPlugin from 'fastify-plugin'; 2 | import * as store from '@leapfrogtechnology/async-store'; 3 | import Fastify, { FastifyInstance, FastifyReply, FastifyRequest } from 'fastify'; 4 | 5 | import { storeParams, calculateSum } from './plugin'; 6 | 7 | const fastifyServer: FastifyInstance = Fastify({ logger: true }); 8 | 9 | fastifyServer.register(fastifyPlugin(store.initializeFastifyPlugin())); 10 | 11 | fastifyServer.register((fastifyInstance, opts, done) => { 12 | fastifyInstance.register(fastifyPlugin(storeParams)); 13 | fastifyInstance.register(fastifyPlugin(calculateSum)); 14 | fastifyInstance.get('/', (req: FastifyRequest, reply: FastifyReply) => { 15 | const a = store.get('a'); 16 | const b = store.get('b'); 17 | const sum = store.get('sum'); 18 | 19 | reply.send(`Sum of ${a}, ${b}: ${sum}\n`); 20 | 21 | reply.log.info('Response Sent'); 22 | }); 23 | 24 | done(); 25 | }); 26 | 27 | /** 28 | * Start the Fastify server. 29 | */ 30 | async function start() { 31 | try { 32 | await fastifyServer.listen(3000); 33 | fastifyServer.log.info(`Server is listening at 3000`); 34 | } catch (err) { 35 | fastifyServer.log.error(err); 36 | process.exit(1); 37 | } 38 | } 39 | 40 | start(); 41 | -------------------------------------------------------------------------------- /examples/koa-http-server-ts/src/logger.ts: -------------------------------------------------------------------------------- 1 | import * as store from '@leapfrogtechnology/async-store'; 2 | 3 | /** 4 | * Get unique request id from store or return empty string. 5 | * 6 | * @returns {string} 7 | */ 8 | function getRequestId(): string { 9 | return store.getShortId(); 10 | } 11 | 12 | /** 13 | * Print log message to the stdout / stderr. 14 | * 15 | * @param {string} level 16 | * @param {string} message 17 | */ 18 | function log(level: string, message: string) { 19 | const timestamp = new Date().toISOString(); 20 | const requestId = getRequestId(); 21 | const line = `${timestamp} [ ${level} ] ${requestId ? `${requestId} - ` : ''}${message}\n`; 22 | 23 | if (level === 'ERROR') { 24 | process.stderr.write(line); 25 | 26 | return; 27 | } 28 | 29 | process.stdout.write(line); 30 | } 31 | 32 | /** 33 | * Write info logs and associated request id to stdout. 34 | * 35 | * @param {string} message 36 | */ 37 | export function info(message: string) { 38 | log('INFO', message); 39 | } 40 | 41 | /** 42 | * Write debug logs and associated request id to stdout. 43 | * 44 | * @param {string} message 45 | */ 46 | export function debug(message: string) { 47 | log('DEBUG', message); 48 | } 49 | 50 | /** 51 | * Write error logs and associated request id to stdout. 52 | * 53 | * @param {any} err 54 | */ 55 | export function error(err: any) { 56 | log('ERROR', err); 57 | } 58 | -------------------------------------------------------------------------------- /examples/node-http-server-ts/src/logger.ts: -------------------------------------------------------------------------------- 1 | import * as store from '@leapfrogtechnology/async-store'; 2 | 3 | /** 4 | * Get unique request id from store or return empty string. 5 | * 6 | * @returns {string} 7 | */ 8 | function getRequestId(): string { 9 | return (store.getId() || '').substring(0, 8); 10 | } 11 | 12 | /** 13 | * Print log message to the stdout / stderr. 14 | * 15 | * @param {string} level 16 | * @param {string} message 17 | */ 18 | function log(level: string, message: string) { 19 | const timestamp = new Date().toISOString(); 20 | const requestId = getRequestId(); 21 | const line = `${timestamp} [ ${level} ] ${requestId ? `${requestId} - ` : ''}${message}\n`; 22 | 23 | if (level === 'ERROR') { 24 | process.stderr.write(line); 25 | 26 | return; 27 | } 28 | 29 | process.stdout.write(line); 30 | } 31 | 32 | /** 33 | * Write info logs and associated request id to stdout. 34 | * 35 | * @param {string} message 36 | */ 37 | export function info(message: string) { 38 | log('INFO', message); 39 | } 40 | 41 | /** 42 | * Write debug logs and associated request id to stdout. 43 | * 44 | * @param {string} message 45 | */ 46 | export function debug(message: string) { 47 | log('DEBUG', message); 48 | } 49 | 50 | /** 51 | * Write error logs and associated request id to stdout. 52 | * 53 | * @param {any} err 54 | */ 55 | export function error(err: any) { 56 | log('ERROR', err); 57 | } 58 | -------------------------------------------------------------------------------- /examples/express-http-server-ts/src/logger.ts: -------------------------------------------------------------------------------- 1 | import * as store from '@leapfrogtechnology/async-store'; 2 | 3 | /** 4 | * Get unique request id from store or return empty string. 5 | * 6 | * @returns {string} 7 | */ 8 | function getRequestId(): string { 9 | return (store.getId() || '').substring(0, 8); 10 | } 11 | 12 | /** 13 | * Print log message to the stdout / stderr. 14 | * 15 | * @param {string} level 16 | * @param {string} message 17 | */ 18 | function log(level: string, message: string) { 19 | const timestamp = new Date().toISOString(); 20 | const requestId = getRequestId(); 21 | const line = `${timestamp} [ ${level} ] ${requestId ? `${requestId} - ` : ''}${message}\n`; 22 | 23 | if (level === 'ERROR') { 24 | process.stderr.write(line); 25 | 26 | return; 27 | } 28 | 29 | process.stdout.write(line); 30 | } 31 | 32 | /** 33 | * Write info logs and associated request id to stdout. 34 | * 35 | * @param {string} message 36 | */ 37 | export function info(message: string) { 38 | log('INFO', message); 39 | } 40 | 41 | /** 42 | * Write debug logs and associated request id to stdout. 43 | * 44 | * @param {string} message 45 | */ 46 | export function debug(message: string) { 47 | log('DEBUG', message); 48 | } 49 | 50 | /** 51 | * Write error logs and associated request id to stdout. 52 | * 53 | * @param {any} err 54 | */ 55 | export function error(err: any) { 56 | log('ERROR', err); 57 | } 58 | -------------------------------------------------------------------------------- /examples/fastify-http-server-ts/src/plugin.ts: -------------------------------------------------------------------------------- 1 | import { doSomethingAsync } from './service'; 2 | import * as store from '@leapfrogtechnology/async-store'; 3 | import { FastifyRequest, FastifyPluginCallback, FastifyPluginAsync } from 'fastify'; 4 | 5 | type RequestQuery = FastifyRequest<{ 6 | Querystring: { a: string; b: string }; 7 | }>; 8 | 9 | /** 10 | * Plugin to set query params `a` and `b` on async-store. 11 | * 12 | * @param {FastifyPluginCallback} callback 13 | */ 14 | export const storeParams: FastifyPluginCallback = (fastify, _, next) => { 15 | fastify.addHook('onRequest', (req: RequestQuery, reply, done) => { 16 | const { a, b } = req.query; 17 | store.set({ a, b }); 18 | 19 | fastify.log.info(`Persisted a: ${a}`); 20 | fastify.log.info(`Persisted b: ${b}`); 21 | 22 | done(); 23 | }); 24 | 25 | next(); 26 | }; 27 | 28 | /** 29 | * Plugin to add the parameters `a` and `b` and set `sum` on the async store. 30 | * 31 | * @param {FastifyInstance} fastify 32 | * @param {FastifyPluginOptions} opts 33 | */ 34 | export const calculateSum: FastifyPluginAsync = async (fastify, _) => { 35 | fastify.addHook('preHandler', async () => { 36 | const data = await doSomethingAsync(); 37 | fastify.log.info(`Store contents: ${JSON.stringify(data)}`); 38 | const a = +store.get('a'); 39 | const b = +store.get('b'); 40 | const sum = a + b; 41 | 42 | store.set({ sum }); 43 | 44 | fastify.log.info(`Persisted sum: ${sum}`); 45 | }); 46 | }; 47 | -------------------------------------------------------------------------------- /release.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | ### Release management and changelog generation script. ### 4 | 5 | set -e 6 | 7 | changelog() { 8 | # NOTE: This requires github_changelog_generator to be installed. 9 | # https://github.com/skywinder/github-changelog-generator 10 | 11 | if [ -z "$NEXT" ]; then 12 | NEXT="Unreleased" 13 | fi 14 | 15 | echo "Generating changelog upto version: $NEXT" 16 | github_changelog_generator \ 17 | --user "leapfrogtechnology" \ 18 | --project "async-store" \ 19 | --token $GITHUB_TOKEN \ 20 | --no-verbose \ 21 | --pr-label "**Changes**" \ 22 | --bugs-label "**Bug Fixes**" \ 23 | --issues-label "**Closed Issues**" \ 24 | --issue-line-labels=ALL \ 25 | --future-release="$NEXT" \ 26 | --release-branch=main \ 27 | --exclude-labels=unnecessary,duplicate,question,invalid,wontfix 28 | } 29 | 30 | bump() { 31 | # Bump package version and generate changelog 32 | VERSION="${NEXT/v/}" 33 | 34 | echo "Bump version to ${VERSION}" 35 | 36 | # Update version in the following files 37 | sed -i "s/\(\"version\":\s*\"\)[^\"]*\(\"\)/\1${VERSION}\2/g" package.json 38 | 39 | # Generate change log 40 | changelog 41 | echo "" 42 | 43 | # Generate new build. 44 | yarn && yarn test && yarn build 45 | 46 | # Prepare to commit 47 | git add CHANGELOG.md package.json yarn.lock && \ 48 | git commit -v --edit -m "${VERSION} Release :tada: :fireworks: :bell:" && \ 49 | git tag "$NEXT" && \ 50 | echo -e "\nRelease tagged $NEXT" 51 | git push origin HEAD --tags 52 | yarn publish --new-version "${VERSION}" --no-git-tag-version 53 | } 54 | 55 | # Run command received from args. 56 | $1 57 | -------------------------------------------------------------------------------- /examples/koa-http-server-ts/README.md: -------------------------------------------------------------------------------- 1 | # Koa Example (TypeScript) 2 | 3 | Sample project for with [koa](https://koajs.com/). 4 | 5 | ## Running 6 | 7 | Install dependencies. 8 | 9 | ```bash 10 | $ yarn 11 | ``` 12 | 13 | Run the koa app server. 14 | 15 | ``` 16 | $ yarn start 17 | ``` 18 | 19 | Now you can test it through `curl`. 20 | 21 | ``` 22 | $ curl 'http://localhost:3000?a=20&b=30' && curl 'http://localhost:3000?a=10&b=50' && curl 'http://localhost:3000?a=50&b=100' 23 | ``` 24 | 25 | **Output** 26 | 27 | ``` 28 | 2019-11-28T06:50:55.665Z [ INFO ] HTTP server listening on port 3000! 29 | 30 | 2019-11-28T06:53:31.500Z [ DEBUG ] 36d05498 - Persisted a: 20 31 | 2019-11-28T06:53:31.500Z [ DEBUG ] 36d05498 - Persisted b: 30 32 | 2019-11-28T06:53:31.500Z [ DEBUG ] 36d05498 - Simulating delayed access 33 | 2019-11-28T06:53:31.501Z [ DEBUG ] 36d05498 - Calculated sum: 50 34 | 2019-11-28T06:53:31.501Z [ DEBUG ] 36d05498 - Persisted sum: 50 35 | 2019-11-28T06:53:31.503Z [ INFO ] 36d05498 - Response sent 36 | 2019-11-28T06:53:31.525Z [ DEBUG ] e65f3631 - Persisted a: 10 37 | 2019-11-28T06:53:31.525Z [ DEBUG ] e65f3631 - Persisted b: 50 38 | 2019-11-28T06:53:31.525Z [ DEBUG ] e65f3631 - Simulating delayed access 39 | 2019-11-28T06:53:31.525Z [ DEBUG ] e65f3631 - Calculated sum: 60 40 | 2019-11-28T06:53:31.525Z [ DEBUG ] e65f3631 - Persisted sum: 60 41 | 2019-11-28T06:53:31.525Z [ INFO ] e65f3631 - Response sent 42 | 2019-11-28T06:53:31.541Z [ DEBUG ] 4b0a6a00 - Persisted a: 50 43 | 2019-11-28T06:53:31.541Z [ DEBUG ] 4b0a6a00 - Persisted b: 100 44 | 2019-11-28T06:53:31.541Z [ DEBUG ] 4b0a6a00 - Simulating delayed access 45 | 2019-11-28T06:53:31.541Z [ DEBUG ] 4b0a6a00 - Calculated sum: 150 46 | 2019-11-28T06:53:31.541Z [ DEBUG ] 4b0a6a00 - Persisted sum: 150 47 | 2019-11-28T06:53:31.542Z [ INFO ] 4b0a6a00 - Response sent 48 | 2019-11-28T06:53:33.502Z [ INFO ] 36d05498 - Store contents: {"a":"20","b":"30","sum":50} 49 | 2019-11-28T06:53:33.525Z [ INFO ] e65f3631 - Store contents: {"a":"10","b":"50","sum":60} 50 | 2019-11-28T06:53:33.542Z [ INFO ] 4b0a6a00 - Store contents: {"a":"50","b":"100","sum":150} 51 | 52 | ``` 53 | -------------------------------------------------------------------------------- /examples/express-http-server-ts/README.md: -------------------------------------------------------------------------------- 1 | # Express Example (TypeScript) 2 | 3 | Sample project for with [express](https://expressjs.com/). 4 | 5 | ## Running 6 | 7 | Install dependencies. 8 | 9 | ```bash 10 | $ yarn 11 | ``` 12 | 13 | Run the express app server. 14 | 15 | ``` 16 | $ yarn start 17 | ``` 18 | 19 | Now you can test it through `curl`. 20 | 21 | ``` 22 | $ curl 'http://localhost:3000?a=20&b=30' && curl 'http://localhost:3000?a=10&b=50' && curl 'http://localhost:3000?a=50&b=100' 23 | ``` 24 | 25 | **Output** 26 | 27 | ``` 28 | 2019-09-28T11:08:35.261Z [ INFO ] HTTP server listening on port 3000! 29 | 30 | 2019-09-28T11:08:39.987Z [ DEBUG ] f1aa3c12 - Persisted a: 20 31 | 2019-09-28T11:08:39.987Z [ DEBUG ] f1aa3c12 - Persisted b: 30 32 | 2019-09-28T11:08:39.988Z [ DEBUG ] f1aa3c12 - Simulating delayed access 33 | 2019-09-28T11:08:39.988Z [ DEBUG ] f1aa3c12 - Calculated sum: 50 34 | 2019-09-28T11:08:39.988Z [ DEBUG ] f1aa3c12 - Persisted sum: 50 35 | 2019-09-28T11:08:39.991Z [ INFO ] f1aa3c12 - Response sent 36 | 2019-09-28T11:08:40.003Z [ DEBUG ] 81992355 - Persisted a: 10 37 | 2019-09-28T11:08:40.003Z [ DEBUG ] 81992355 - Persisted b: 50 38 | 2019-09-28T11:08:40.003Z [ DEBUG ] 81992355 - Simulating delayed access 39 | 2019-09-28T11:08:40.003Z [ DEBUG ] 81992355 - Calculated sum: 60 40 | 2019-09-28T11:08:40.003Z [ DEBUG ] 81992355 - Persisted sum: 60 41 | 2019-09-28T11:08:40.003Z [ INFO ] 81992355 - Response sent 42 | 2019-09-28T11:08:40.014Z [ DEBUG ] 66fe2219 - Persisted a: 50 43 | 2019-09-28T11:08:40.014Z [ DEBUG ] 66fe2219 - Persisted b: 100 44 | 2019-09-28T11:08:40.014Z [ DEBUG ] 66fe2219 - Simulating delayed access 45 | 2019-09-28T11:08:40.015Z [ DEBUG ] 66fe2219 - Calculated sum: 150 46 | 2019-09-28T11:08:40.015Z [ DEBUG ] 66fe2219 - Persisted sum: 150 47 | 2019-09-28T11:08:40.015Z [ INFO ] 66fe2219 - Response sent 48 | 2019-09-28T11:08:41.988Z [ INFO ] f1aa3c12 - Store contents: {"a":"20","b":"30","sum":50} 49 | 2019-09-28T11:08:42.003Z [ INFO ] 81992355 - Store contents: {"a":"10","b":"50","sum":60} 50 | 2019-09-28T11:08:42.015Z [ INFO ] 66fe2219 - Store contents: {"a":"50","b":"100","sum":150} 51 | ``` 52 | -------------------------------------------------------------------------------- /examples/node-http-server-ts/README.md: -------------------------------------------------------------------------------- 1 | # Basic HTTP Server (TypeScript) 2 | 3 | Sample http server in node and typescript using async-store. 4 | 5 | ## Running 6 | 7 | Install dependencies. 8 | 9 | ```bash 10 | $ yarn 11 | ``` 12 | 13 | Run the http app server. 14 | 15 | ```bash 16 | $ yarn start 17 | ``` 18 | 19 | Now you can test it through `curl`. 20 | 21 | ``` 22 | $ curl 'http://localhost:3000?a=20&b=30' && curl 'http://localhost:3000?a=10&b=50' && curl 'http://localhost:3000?a=50&b=100' 23 | ``` 24 | 25 | **Output** 26 | 27 | ```plain 28 | 2019-09-28T11:06:55.803Z [ INFO ] HTTP server listening on port 3000! 29 | 30 | 2019-09-28T11:06:58.172Z [ DEBUG ] 24751fd0 - Persisted a: 20 31 | 2019-09-28T11:06:58.172Z [ DEBUG ] 24751fd0 - Persisted b: 30 32 | 2019-09-28T11:06:58.172Z [ DEBUG ] 24751fd0 - Simulating delayed access 33 | 2019-09-28T11:06:58.172Z [ DEBUG ] 24751fd0 - Calculated sum: 50 34 | 2019-09-28T11:06:58.172Z [ DEBUG ] 24751fd0 - Persisted sum: 50 35 | 2019-09-28T11:06:58.174Z [ INFO ] 24751fd0 - Response sent 36 | 2019-09-28T11:06:58.186Z [ DEBUG ] 8c52e047 - Persisted a: 10 37 | 2019-09-28T11:06:58.186Z [ DEBUG ] 8c52e047 - Persisted b: 50 38 | 2019-09-28T11:06:58.186Z [ DEBUG ] 8c52e047 - Simulating delayed access 39 | 2019-09-28T11:06:58.186Z [ DEBUG ] 8c52e047 - Calculated sum: 60 40 | 2019-09-28T11:06:58.186Z [ DEBUG ] 8c52e047 - Persisted sum: 60 41 | 2019-09-28T11:06:58.186Z [ INFO ] 8c52e047 - Response sent 42 | 2019-09-28T11:06:58.198Z [ DEBUG ] f184da79 - Persisted a: 50 43 | 2019-09-28T11:06:58.198Z [ DEBUG ] f184da79 - Persisted b: 100 44 | 2019-09-28T11:06:58.198Z [ DEBUG ] f184da79 - Simulating delayed access 45 | 2019-09-28T11:06:58.198Z [ DEBUG ] f184da79 - Calculated sum: 150 46 | 2019-09-28T11:06:58.198Z [ DEBUG ] f184da79 - Persisted sum: 150 47 | 2019-09-28T11:06:58.198Z [ INFO ] f184da79 - Response sent 48 | 2019-09-28T11:07:00.175Z [ INFO ] 24751fd0 - Store contents: {"a":"20","b":"30","sum":50} 49 | 2019-09-28T11:07:00.187Z [ INFO ] 8c52e047 - Store contents: {"a":"10","b":"50","sum":60} 50 | 2019-09-28T11:07:00.198Z [ INFO ] f184da79 - Store contents: {"a":"50","b":"100","sum":150} 51 | ``` 52 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@leapfrogtechnology/async-store", 3 | "version": "2.1.0", 4 | "description": "Global store utility for an async operation lifecycle and chain of callbacks", 5 | "license": "MIT", 6 | "main": "dist/index.js", 7 | "types": "dist/index.d.ts", 8 | "files": [ 9 | "dist" 10 | ], 11 | "repository": { 12 | "type": "git", 13 | "url": "https://github.com/leapfrogtechnology/async-store" 14 | }, 15 | "bugs": { 16 | "url": "https://github.com/leapfrogtechnology/async-store/issues" 17 | }, 18 | "scripts": { 19 | "transpile": "tsc", 20 | "clean": "rimraf dist", 21 | "build": "NODE_ENV=production yarn clean && yarn transpile", 22 | "test": "NODE_ENV=test nyc mocha --recursive test/**/*.test.ts", 23 | "watch": "tsc --watch", 24 | "prettify": "prettier --single-quote --trailing-comma none --print-width 120 --write './**/*.{ts,js,yml}'", 25 | "prepublishOnly": "yarn build", 26 | "changelog": "./release.sh changelog", 27 | "release": "./release.sh bump" 28 | }, 29 | "husky": { 30 | "hooks": { 31 | "pre-commit": "lint-staged", 32 | "pre-push": "tsc --noEmit" 33 | } 34 | }, 35 | "lint-staged": { 36 | "*.{ts,js,yml}": [ 37 | "prettier --single-quote --trailing-comma none --print-width 120 --write './**/*.{ts,js,yml}'" 38 | ] 39 | }, 40 | "keywords": [ 41 | "typescript", 42 | "javascript", 43 | "node", 44 | "async", 45 | "store", 46 | "thread-local-storage", 47 | "local-storage", 48 | "async-storage", 49 | "request-context", 50 | "context", 51 | "callback-context" 52 | ], 53 | "authors": [ 54 | "Kabir Baidhya ", 55 | "Sagar Chamling " 56 | ], 57 | "dependencies": { 58 | "debug": "4.3.4", 59 | "lodash.merge": "^4.6.2" 60 | }, 61 | "devDependencies": { 62 | "@istanbuljs/nyc-config-typescript": "^1.0.1", 63 | "@types/chai": "^4.3.4", 64 | "@types/chai-as-promised": "^7.1.3", 65 | "@types/debug": "^4.1.5", 66 | "@types/express": "^4.17.17", 67 | "@types/lodash.merge": "^4.6.7", 68 | "@types/mocha": "^10.0.1", 69 | "@types/node": "^14.17.0", 70 | "chai": "^4.3.7", 71 | "chai-as-promised": "^7.1.1", 72 | "fastify": "^4.16.3", 73 | "husky": "^8.0.3", 74 | "lint-staged": "13.2.2", 75 | "mocha": "^10.2.0", 76 | "node-mocks-http": "^1.12.2", 77 | "nyc": "^15.1.0", 78 | "prettier": "^2.8.8", 79 | "ts-node": "^10.9.1", 80 | "typescript": "^5.0.4" 81 | }, 82 | "peerDependencies": { 83 | "express": ">= 4.17.0", 84 | "fastify": ">= 3.10.0" 85 | }, 86 | "publishConfig": { 87 | "access": "public" 88 | }, 89 | "engines": { 90 | "node": ">= 14.17.0" 91 | } 92 | } 93 | -------------------------------------------------------------------------------- /examples/fastify-http-server-ts/README.md: -------------------------------------------------------------------------------- 1 | # Fastify Example (TypeScript) 2 | 3 | Sample project for with [Fastify](https://www.fastify.io/). 4 | 5 | ## Running 6 | 7 | Install dependencies. 8 | 9 | ```bash 10 | $ yarn 11 | ``` 12 | 13 | Run the fastify server. 14 | 15 | ``` 16 | $ yarn start 17 | ``` 18 | 19 | Now you can test it through `curl`. 20 | 21 | ``` 22 | $ curl 'http://localhost:3000?a=20&b=30' && curl 'http://localhost:3000?a=10&b=50' && curl 'http://localhost:3000?a=50&b=100' 23 | ``` 24 | 25 | **Output** 26 | 27 | ```JSON 28 | {"level":30,"time":1642077995342,"pid":652861,"hostname":"pop-os","msg":"Server is listening at 3000"} 29 | {"level":30,"time":1642078016167,"pid":652861,"hostname":"pop-os","reqId":"req-1","req":{"method":"GET","url":"/?a=20&b=30","hostname":"localhost:3000","remoteAddress":"127.0.0.1","remotePort":54584},"msg":"incoming request"} 30 | {"level":30,"time":1642078016168,"pid":652861,"hostname":"pop-os","msg":"Persisted a: 20"} 31 | {"level":30,"time":1642078016169,"pid":652861,"hostname":"pop-os","msg":"Persisted b: 30"} 32 | {"level":30,"time":1642078018172,"pid":652861,"hostname":"pop-os","msg":"Store contents: {\"a\":\"20\",\"b\":\"30\"}"} 33 | {"level":30,"time":1642078018173,"pid":652861,"hostname":"pop-os","msg":"Persisted sum: 50"} 34 | {"level":30,"time":1642078018190,"pid":652861,"hostname":"pop-os","reqId":"req-1","msg":"Response Sent"} 35 | {"level":30,"time":1642078018193,"pid":652861,"hostname":"pop-os","reqId":"req-1","res":{"statusCode":200},"responseTime":2025.341871023178,"msg":"request completed"} 36 | {"level":30,"time":1642078031470,"pid":652861,"hostname":"pop-os","reqId":"req-2","req":{"method":"GET","url":"/?a=10&b=50","hostname":"localhost:3000","remoteAddress":"127.0.0.1","remotePort":54586},"msg":"incoming request"} 37 | {"level":30,"time":1642078031470,"pid":652861,"hostname":"pop-os","msg":"Persisted a: 10"} 38 | {"level":30,"time":1642078031470,"pid":652861,"hostname":"pop-os","msg":"Persisted b: 50"} 39 | {"level":30,"time":1642078033471,"pid":652861,"hostname":"pop-os","msg":"Store contents: {\"a\":\"10\",\"b\":\"50\"}"} 40 | {"level":30,"time":1642078033471,"pid":652861,"hostname":"pop-os","msg":"Persisted sum: 60"} 41 | {"level":30,"time":1642078033472,"pid":652861,"hostname":"pop-os","reqId":"req-2","msg":"Response Sent"} 42 | {"level":30,"time":1642078033472,"pid":652861,"hostname":"pop-os","reqId":"req-2","res":{"statusCode":200},"responseTime":2002.4138559997082,"msg":"request completed"} 43 | {"level":30,"time":1642078041935,"pid":652861,"hostname":"pop-os","reqId":"req-3","req":{"method":"GET","url":"/?a=50&b=100","hostname":"localhost:3000","remoteAddress":"127.0.0.1","remotePort":54588},"msg":"incoming request"} 44 | {"level":30,"time":1642078041936,"pid":652861,"hostname":"pop-os","msg":"Persisted a: 50"} 45 | {"level":30,"time":1642078041936,"pid":652861,"hostname":"pop-os","msg":"Persisted b: 100"} 46 | {"level":30,"time":1642078043937,"pid":652861,"hostname":"pop-os","msg":"Store contents: {\"a\":\"50\",\"b\":\"100\"}"} 47 | {"level":30,"time":1642078043937,"pid":652861,"hostname":"pop-os","msg":"Persisted sum: 150"} 48 | {"level":30,"time":1642078043938,"pid":652861,"hostname":"pop-os","reqId":"req-3","msg":"Response Sent"} 49 | {"level":30,"time":1642078043939,"pid":652861,"hostname":"pop-os","reqId":"req-3","res":{"statusCode":200},"responseTime":2003.156497001648,"msg":"request completed"} 50 | ``` 51 | -------------------------------------------------------------------------------- /src/impl/domain.ts: -------------------------------------------------------------------------------- 1 | import debug from 'debug'; 2 | import * as domain from 'domain'; 3 | import merge from 'lodash.merge'; 4 | import { randomUUID } from 'crypto'; 5 | 6 | import { STORE_DOMAIN } from '../constants'; 7 | import AsyncStoreParams from '../AsyncStoreParams'; 8 | import StoreDomainInterface, { STORE_KEY, ID_KEY } from '../StoreDomain'; 9 | 10 | const logDomain = debug(STORE_DOMAIN); 11 | 12 | /** 13 | * Initialize the store domain and enable all the async 14 | * middlewares/callbacks triggered via the provided 15 | * callback to have access to the store. 16 | * 17 | * @param {AsyncStoreParams} params 18 | */ 19 | export function initialize(callback: (err?: any) => void, params?: AsyncStoreParams) { 20 | const d = createOrUseActiveDomain(); 21 | 22 | if (params) { 23 | bindParams(d, params); 24 | } 25 | 26 | logDomain(`Adding ${STORE_KEY} and ${ID_KEY} in domain store`); 27 | // Initialize the context in the domain. 28 | d[STORE_KEY] = Object.create(null); 29 | d[ID_KEY] = randomUUID(); 30 | 31 | return d.run(callback); 32 | } 33 | 34 | /** 35 | * Bind async store params and error event listener in domain. 36 | * 37 | * @param {StoreDomainInterface} d 38 | * @param {AsyncStoreParams} params 39 | * @returns {void} 40 | */ 41 | function bindParams(d: StoreDomainInterface, params: AsyncStoreParams): void { 42 | const { req, res, error, emitters } = params; 43 | 44 | logDomain('Binding req and res.'); 45 | if (req && res) { 46 | d.add(req); 47 | d.add(res); 48 | } 49 | 50 | logDomain(`Binding emitters.`); 51 | if (emitters && Array.isArray(emitters)) { 52 | emitters.forEach((emitter) => d.add(emitter)); 53 | } 54 | 55 | if (error) { 56 | d.on('error', error); 57 | } 58 | } 59 | 60 | /** 61 | * Create or use active domain. If domain is already initialized 62 | * in application it uses existing domain else create new 63 | * domain object. 64 | * 65 | * @returns {StoreDomainInterface} 66 | */ 67 | function createOrUseActiveDomain(): StoreDomainInterface { 68 | if (isDomainInitialized()) { 69 | logDomain(`Using active domain.`); 70 | 71 | // Some packages like Raven (sentry) uses domain to handle exception 72 | // which might overwrite async store domain. 73 | // For more information: https://github.com/getsentry/sentry-javascript. 74 | return getActiveDomain(); 75 | } 76 | 77 | logDomain(`Creating new domain.`); 78 | 79 | return domain.create(); 80 | } 81 | 82 | /** 83 | * Sets a pair in the store. 84 | * 85 | * Example: 86 | * set({ key1: 'value1', key2: 'value2' }); 87 | * 88 | * @param {*} properties 89 | */ 90 | export function set(properties: any) { 91 | logDomain(`Setting properties in the domain store =`, properties); 92 | 93 | if (properties && typeof properties === 'object') { 94 | updateStore(getStore(), properties); 95 | 96 | return; 97 | } 98 | 99 | throw new Error('Invalid arguments provided for asyncStore.set()'); 100 | } 101 | 102 | /** 103 | * Get a value by a key from the store. 104 | * Throws an error if anything fails while getting the value. 105 | * 106 | * @param {string} key 107 | * @returns {*} 108 | */ 109 | export function get(key: string): any { 110 | const store = getStore(); 111 | 112 | if (!store) { 113 | return null; 114 | } 115 | 116 | logDomain(`Value of ${key} in the domain store =`, store[key]); 117 | 118 | return store[key]; 119 | } 120 | 121 | /** 122 | * Get all values from the store. 123 | * Throws an error if anything fails while getting values. 124 | * 125 | * @returns {*} 126 | */ 127 | export function getAll(): any { 128 | const store = getStore(); 129 | 130 | if (!store) { 131 | return null; 132 | } 133 | 134 | logDomain('All values in the store'); 135 | 136 | return store; 137 | } 138 | 139 | /** 140 | * Retrieves all values that correspond to a given list of keys. 141 | * Any keys not found are included in-order as `undefined`. 142 | * 143 | * Example: 144 | * const a = 1; 145 | * const b = 2; 146 | * const sum = a + b; 147 | * store.set({ a, b, sum }) 148 | * 149 | * const results = store.getByKeys(['a', 'b', 'other', 'sum']); // [1, 2, undefined, 3] 150 | * 151 | * @param {string[]} keys 152 | * @returns {T[]} 153 | */ 154 | export function getByKeys(keys: string[]): T[] { 155 | if (!(keys && keys.length > 0)) { 156 | throw new Error('No keys provided for getting the values from store.'); 157 | } 158 | 159 | return keys.map((key) => get(key)); 160 | } 161 | 162 | /** 163 | * Get a value by a key from the store. 164 | * If anything fails, it returns null without emitting error event. 165 | * 166 | * @param {string} key 167 | * @returns {*} 168 | */ 169 | export function find(key: string): any { 170 | try { 171 | return get(key); 172 | } catch (err) { 173 | logDomain(`Error finding ${key} in store:`, err); 174 | 175 | return null; 176 | } 177 | } 178 | 179 | /** 180 | * Check if the domain has been initialized or not. 181 | * 182 | * @returns {boolean} 183 | */ 184 | function isDomainInitialized(): boolean { 185 | return !!getActiveDomain(); 186 | } 187 | 188 | /** 189 | * Check if the store has been initialized in the active domain. 190 | * 191 | * @returns {boolean} 192 | */ 193 | export function isInitialized(): boolean { 194 | const activeDomain = getActiveDomain(); 195 | 196 | return !!(activeDomain && activeDomain[STORE_KEY]); 197 | } 198 | 199 | /** 200 | * Add (or override) properties to the given store (mutates the central store object). 201 | * 202 | * @param {StoreDomainInterface} store 203 | * @param {*} properties 204 | */ 205 | function updateStore(store: StoreDomainInterface, properties: any) { 206 | const activeDomain = getActiveDomain(); 207 | 208 | const data = merge(store, properties); 209 | 210 | logDomain('Updating store.'); 211 | 212 | activeDomain[STORE_KEY] = data; 213 | } 214 | 215 | /** 216 | * Get the active domain. 217 | * 218 | * @returns {StoreDomainInterface} 219 | */ 220 | export function getActiveDomain(): StoreDomainInterface { 221 | logDomain('Getting active domain.'); 222 | 223 | return process.domain as StoreDomainInterface; 224 | } 225 | 226 | /** 227 | * Gets the unique domain id created for the current context / scope. 228 | * 229 | * @returns {(string | undefined)} 230 | */ 231 | export function getId(): string | undefined { 232 | const activeDomain = getActiveDomain(); 233 | 234 | return activeDomain && activeDomain[ID_KEY]; 235 | } 236 | 237 | /** 238 | * Gets the short unique domain id created for the current context / scope. 239 | * 240 | * Note: This is same as `getId();` the difference being it only returns the first 8 characters. 241 | * 242 | * @returns {(string | undefined)} 243 | */ 244 | export function getShortId(): string | undefined { 245 | const id = getId(); 246 | 247 | return id && id.substring(0, 8); 248 | } 249 | 250 | /** 251 | * Get the store from the active domain. 252 | * 253 | * @returns {*} 254 | */ 255 | function getStore(): any { 256 | const activeDomain = getActiveDomain(); 257 | 258 | if (!activeDomain) { 259 | throw new Error('No active domain found in store.'); 260 | } 261 | 262 | return activeDomain[STORE_KEY]; 263 | } 264 | -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- 1 | import debug from 'debug'; 2 | import { Request, Response, NextFunction } from 'express'; 3 | import { FastifyPluginCallback } from 'fastify'; 4 | 5 | import AsyncStore from './AsyncStore'; 6 | import { STORE_CORE } from './constants'; 7 | import AsyncStoreParams from './AsyncStoreParams'; 8 | import AsyncStoreAdapter from './AsyncStoreAdapter'; 9 | 10 | // Implementations of Async store. 11 | import * as domainImplementation from './impl/domain'; 12 | 13 | const coreLog = debug(STORE_CORE); 14 | 15 | /** 16 | * The adapter which was used to initialize the store. The value 17 | * is set when this is initialized the first time. 18 | * 19 | * Note: There could be only one single, centralized store so, 20 | * once initialized the store cannot be re-initialized. 21 | */ 22 | let initializedAdapter: AsyncStoreAdapter; 23 | 24 | /** 25 | * Middleware to initialize the async store and make it 26 | * accessible from all the subsequent middlewares or 27 | * async operations triggered afterwards. 28 | * 29 | * @param {AsyncStoreAdapter} [adapter=AsyncStoreAdapter.DOMAIN] 30 | * @returns {(req, res, next) => void} 31 | */ 32 | export function initializeMiddleware(adapter: AsyncStoreAdapter = AsyncStoreAdapter.DOMAIN) { 33 | return (req: Request, res: Response, next: NextFunction) => { 34 | // If the store has already been initialized, ignore it. 35 | 36 | if (isInitialized()) { 37 | coreLog(`Store is already initialized.`); 38 | 39 | return next(); 40 | } 41 | 42 | const errorHandler = (err: any) => { 43 | coreLog('Async Store Error: %s', err); 44 | 45 | next(err); 46 | }; 47 | 48 | const params = { 49 | req, 50 | res, 51 | error: errorHandler 52 | }; 53 | 54 | coreLog(`Initializing async store middleware.`); 55 | 56 | initialize(adapter)(next, params); 57 | }; 58 | } 59 | 60 | /** 61 | * Plugin to initialize the async store for fastify and make it 62 | * accessible from all the subsequent fastify plugins 63 | * async operations triggered afterwards. 64 | * 65 | * @param {AsyncStoreAdapter} [adapter=AsyncStoreAdapter.DOMAIN] 66 | * @returns {FastifyPluginCallback} 67 | */ 68 | export function initializeFastifyPlugin(adapter: AsyncStoreAdapter = AsyncStoreAdapter.DOMAIN): FastifyPluginCallback { 69 | return (fastify, opts, next) => { 70 | fastify.addHook('onRequest', (req, reply, done) => { 71 | // If the store has already been initialized, ignore it. 72 | if (isInitialized()) { 73 | coreLog(`Store is already initialized.`); 74 | 75 | return done(); 76 | } 77 | 78 | const errorHandler = (err: any) => { 79 | coreLog('Async Store Error: %s', err); 80 | 81 | done(err); 82 | }; 83 | 84 | const params = { 85 | req, 86 | reply, 87 | error: errorHandler 88 | }; 89 | 90 | coreLog(`Initializing async store middleware.`); 91 | 92 | initialize(adapter)(done, params); 93 | }); 94 | next(); 95 | }; 96 | } 97 | 98 | /** 99 | * Initialize the async store based on the adapter provided. 100 | * 101 | * @param {AsyncStoreAdapter} [adapter=AsyncStoreAdapter.DOMAIN] 102 | * @returns {(callback: (err?: any) => void, params?: AsyncStoreParams) => any } 103 | */ 104 | export function initialize(adapter: AsyncStoreAdapter = AsyncStoreAdapter.DOMAIN) { 105 | if (isInitialized()) { 106 | throw new Error('Async store already initialized, cannot re-initialize again.'); 107 | } 108 | 109 | const instance = getInstance(adapter); 110 | 111 | return (callback: (err?: any) => void, params?: AsyncStoreParams) => { 112 | initializedAdapter = adapter; 113 | 114 | return instance.initialize(callback, params); 115 | }; 116 | } 117 | 118 | /** 119 | * Sets properties in the store. 120 | * 121 | * Example: 122 | * set({ key1: 'value1', key2: 'value2' }); 123 | * 124 | * @param {*} properties 125 | */ 126 | export function set(properties: any) { 127 | if (!isInitialized()) { 128 | throw new Error('Async store not initialized.'); 129 | } 130 | 131 | coreLog(`Setting properties in store =`, properties); 132 | 133 | getInstance(initializedAdapter).set(properties); 134 | } 135 | 136 | /** 137 | * Get a value by a key from the store. 138 | * 139 | * @param {string} key 140 | * @returns {*} 141 | */ 142 | export function get(key: string): any { 143 | coreLog(`Getting ${key} from the store`); 144 | 145 | return initializedAdapter && getInstance(initializedAdapter).get(key); 146 | } 147 | 148 | /** 149 | * Get all values from the store. 150 | * 151 | * @returns {*} 152 | */ 153 | export function getAll(): any { 154 | coreLog(`Getting all values from the store`); 155 | 156 | return initializedAdapter && getInstance(initializedAdapter).getAll(); 157 | } 158 | 159 | /** 160 | * Retrieves all values that correspond to a given list of keys. 161 | * Any keys not found are included in-order as `undefined`. 162 | * 163 | * Example: 164 | * const a = 1; 165 | * const b = 2; 166 | * const sum = a + b; 167 | * store.set({ a, b, sum }) 168 | * 169 | * const results = store.getByKeys(['a', 'b', 'other', 'sum']); // [1, 2, undefined, 3] 170 | * 171 | * @param {string[]} keys 172 | * @returns {T[]} 173 | */ 174 | export function getByKeys(keys: string[]): T[] { 175 | coreLog(`Getting ${keys.join(', ')} from the store`); 176 | 177 | return initializedAdapter && getInstance(initializedAdapter).getByKeys(keys); 178 | } 179 | 180 | /** 181 | * Get a value by a key from the store. 182 | * If error, it returns null without emitting error event. 183 | * 184 | * @param {string} key 185 | * @returns {*} 186 | */ 187 | export function find(key: string): any { 188 | coreLog(`Finding ${key} in the store`); 189 | 190 | return initializedAdapter && getInstance(initializedAdapter).find(key); 191 | } 192 | 193 | /** 194 | * Check if the store has been initialized. 195 | * 196 | * @returns {boolean} 197 | */ 198 | export function isInitialized(): boolean { 199 | return !!(initializedAdapter && getInstance(initializedAdapter).isInitialized()); 200 | } 201 | 202 | /** 203 | * Gets the unique domain id created for the current context / scope. 204 | * 205 | * @returns {(string | undefined)} 206 | */ 207 | export function getId(): string | undefined { 208 | return initializedAdapter && getInstance(initializedAdapter).getId(); 209 | } 210 | 211 | /** 212 | * Gets the short unique domain id created for the current context / scope. 213 | * 214 | * Note: This is same as `getId();` the difference being it only returns the first 8 characters. 215 | * 216 | * @returns {(string | undefined)} 217 | */ 218 | export function getShortId(): string | undefined { 219 | return initializedAdapter && getInstance(initializedAdapter).getShortId(); 220 | } 221 | 222 | /** 223 | * Get the adapter instance based on adapter type. 224 | * 225 | * @param {AsyncStoreAdapter} adapter 226 | * @returns {AsyncStore} 227 | */ 228 | function getInstance(adapter: AsyncStoreAdapter): AsyncStore { 229 | switch (adapter) { 230 | case AsyncStoreAdapter.DOMAIN: 231 | return domainImplementation; 232 | 233 | default: 234 | throw new Error(`Invalid async store adapter provided ${adapter}.`); 235 | } 236 | } 237 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Async Store 2 | 3 | [![npm](https://img.shields.io/npm/v/@leapfrogtechnology/async-store.svg?style=flat-square)](https://www.npmjs.com/package/@leapfrogtechnology/async-store) 4 | [![Codecov](https://img.shields.io/codecov/c/github/leapfrogtechnology/async-store?style=flat-square)](https://codecov.io/gh/leapfrogtechnology/async-store) 5 | [![LICENSE](https://img.shields.io/github/license/leapfrogtechnology/async-store.svg?style=flat-square)](https://github.com/leapfrogtechnology/async-store/blob/master/LICENSE) 6 | [![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg?style=flat-square)](https://github.com/leapfrogtechnology/async-store#contributing) 7 | 8 | Global store utility for an async operation lifecycle and chain of callbacks. It is a utility tool similar to [continuation-local-storage](https://github.com/othiym23/node-continuation-local-storage) which allows us to set and get values that are scoped to the lifetime of these chains of callbacks. 9 | 10 | **Note: async-store uses [domain](https://nodejs.org/api/domain.html) Node.js module under the hood.** 11 | 12 | It is recommended that you read about domain before using this package. 13 | 14 | ## Installation 15 | 16 | ```sh 17 | npm install @leapfrogtechnology/async-store 18 | ``` 19 | 20 | ```sh 21 | yarn add @leapfrogtechnology/async-store 22 | ``` 23 | 24 | ## Version Compatibility 25 | 26 | | Node Version | Async Store Version | 27 | | ----------------- | ------------------- | 28 | | 14.17.0 and above | >= 2.0.0 | 29 | | 14.17.0 and below | >= 1.0.0 < 2.0.0 | 30 | 31 | ## Usage 32 | 33 | ### JavaScript Example 34 | 35 | ```js 36 | const store = require('@leapfrogtechnology/async-store'); 37 | 38 | store.initialize()(callback); 39 | 40 | function callback() { 41 | store.set({ foo: 'Hello', bar: 'World' }); 42 | 43 | Promise.resolve() 44 | .then(() => { 45 | console.log('Value of foo: ', store.get('foo')); 46 | }) 47 | .then(() => { 48 | console.log('Value of bar: ', store.get('bar')); 49 | }) 50 | .then(() => { 51 | console.log('Value of foo: ', store.get('foo')); 52 | }) 53 | .then(() => { 54 | console.log('Value of bar: ', store.get('bar')); 55 | }); 56 | } 57 | ``` 58 | 59 | #### Output 60 | 61 | On initialization the following output in the console is seen: 62 | 63 | ``` 64 | Value of foo: Hello 65 | Value of bar: World 66 | Value of foo: Hello 67 | Value of bar: World 68 | ``` 69 | 70 | ### TypeScript Example 71 | 72 | ```js 73 | import * as store from '@leapfrogtechnology/async-store'; 74 | 75 | store.initialize()(callback); 76 | 77 | function callback() { 78 | store.set({ foo: 'Hello', bar: 'World' }); 79 | 80 | Promise.resolve() 81 | .then(() => { 82 | console.log('Value of foo: ', store.get('foo')); 83 | }) 84 | .then(() => { 85 | console.log('Value of bar: ', store.get('bar')); 86 | }) 87 | .then(() => { 88 | console.log('Value of foo: ', store.get('foo')); 89 | }) 90 | .then(() => { 91 | console.log('Value of bar: ', store.get('bar')); 92 | }); 93 | } 94 | ``` 95 | 96 | #### Output 97 | 98 | On initialization the following output in the console is seen: 99 | 100 | ``` 101 | Value of foo: Hello 102 | Value of bar: World 103 | Value of foo: Hello 104 | Value of bar: World 105 | ``` 106 | 107 | ### Express Example 108 | 109 | ```js 110 | const { randomUUID } = require('crypto'); 111 | const express = require('express'); 112 | const store = require('@leapfrogtechnology/async-store'); 113 | 114 | const app = express(); 115 | const port = 3000; 116 | 117 | // Initialize async store 118 | app.use(store.initializeMiddleware()); 119 | 120 | // Set request Id in store 121 | app.use((req, res, next) => { 122 | store.set({ reqId: randomUUID() }); 123 | next(); 124 | }); 125 | 126 | // Get request Id from store 127 | app.get('/', (req, res) => { 128 | const reqId = store.get('reqId'); 129 | console.log(`Request Id: ${reqId}`); 130 | 131 | res.json({ message: 'Hello World', reqId }); 132 | }); 133 | 134 | app.listen(port, () => console.log(`Example app listening on port ${port}!`)); 135 | ``` 136 | 137 | #### Output 138 | 139 | On request to `http://localhost:3000`, the following output in the console is seen: 140 | 141 | ``` 142 | Example app listening on port 3000! 143 | Request Id: 03d8bd27-9097-427a-9460-7d8d9576f156 144 | ``` 145 | 146 | ### Fastify Example 147 | 148 | ```js 149 | const { randomUUID } = require('crypto'); 150 | const fastifyPlugin = require('fastify-plugin'); 151 | const store = require('@leapfrogtechnology/async-store'); 152 | 153 | const fastifyServer = require('fastify')({ logger: true }); 154 | 155 | const port = 3000; 156 | 157 | fastifyServer.register(fastifyPlugin(store.initializeFastifyPlugin())); 158 | 159 | fastifyServer.register((fastifyInstance, opts, done) => { 160 | fastifyInstance.addHook('preHandler', (req, reply, done) => { 161 | store.set({ reqId: randomUUID() }); 162 | done(); 163 | }); 164 | 165 | fastifyInstance.get('/', (req, reply) => { 166 | const reqId = store.get('reqId'); 167 | console.log(`Request Id: ${reqId}`); 168 | 169 | reply.send({ message: 'Hello World', reqId }); 170 | }); 171 | 172 | done(); 173 | }); 174 | 175 | const start = async () => { 176 | try { 177 | await fastifyServer.listen(port); 178 | fastifyServer.log.info(`Server is listening at ${port}`); 179 | } catch (err) { 180 | fastifyServer.log.error(err); 181 | process.exit(1); 182 | } 183 | }; 184 | 185 | start(); 186 | ``` 187 | 188 | #### Output 189 | 190 | On request to `http://localhost:3000`, the following output in the console is seen: 191 | 192 | ``` 193 | {"level":30,"time":1641890535421,"pid":12489,"hostname":"macbookpro","msg":"Server listening at http://[::1]:3000"} 194 | {"level":30,"time":1641890535421,"pid":12489,"hostname":"macbookpro","msg":"Server is listening at 3000"} 195 | {"level":30,"time":1641890539755,"pid":12489,"hostname":"macbookpro","reqId":"req-1","req":{"method":"GET","url":"/","hostname":"localhost:3000","remoteAddress":"::1","remotePort":51539},"msg":"incoming request"} 196 | Request Id: aa6e86e9-c9d4-414a-8670-9aeaf2a8d932 197 | {"level":30,"time":1641890539759,"pid":12489,"hostname":"macbookpro","reqId":"req-1","res":{"statusCode":200},"responseTime":3.7935830000787973,"msg":"request completed"} 198 | ``` 199 | 200 | ## API Docs 201 | 202 | ### initialize() 203 | 204 | Initialize the async store based on the adapter provided. 205 | 206 | - `@param {AsyncStoreAdapter} [adapter=AsyncStoreAdapter.DOMAIN]` - Async store adapter to use. 207 | - `@returns {(params: AsyncStoreParams) => void}` - Returns a function that takes a callback which will be triggered once the store has been initialized. 208 | 209 | ```js 210 | const store = require('@leapfrogtechnology/async-store'); 211 | 212 | store.initialize()(callback); 213 | 214 | function callback() { 215 | // Do something with the store. 216 | } 217 | ``` 218 | 219 | ### initializeMiddleware() 220 | 221 | Middleware to initialize the async store and make it accessible from all the subsequent middlewares or async operations triggered afterwards. 222 | 223 | - `@param {AsyncStoreAdapter} [adapter=AsyncStoreAdapter.DOMAIN]` - Async store adapter to use. 224 | - `@returns {(req, res, next) => void}` - Returns the express middleware function. 225 | 226 | ```js 227 | const express = require('express'); 228 | const store = require('@leapfrogtechnology/async-store'); 229 | 230 | // Initialize async store 231 | app.use(store.initializeMiddleware()); 232 | ``` 233 | 234 | ### initializeFastifyPlugin() 235 | 236 | Plugin to initialize the async store and make it accessible from all the subsequent plugin or async operations triggered afterwards from fastify server. 237 | 238 | - `@param {AsyncStoreAdapter} [adapter=AsyncStoreAdapter.DOMAIN]` - Async store adapter to use. 239 | - `@returns {(fastifyInstance, opts, next) => void}` - Returns the fastify plugin callback. 240 | 241 | ```js 242 | const fastify = require('fastify'); 243 | const fastifyPlugin = require('fastify-plugin'); 244 | const store = require('@leapfrogtechnology/async-store'); 245 | 246 | // Initialize async store 247 | fastify.register(fastifyPlugin(store.initializeFastifyPlugin())); 248 | ``` 249 | 250 | ### isInitialized() 251 | 252 | Check if the store has been initialized or not. 253 | 254 | - `@returns {boolean}` - Returns either true or false. 255 | 256 | ```js 257 | if (store.isInitialized()) { 258 | // Do something. 259 | } 260 | ``` 261 | 262 | ### set() 263 | 264 | Persists properties in the store. 265 | 266 | - `@params {any} properties` - Persist properties to set in store. 267 | - `@returns {void}` 268 | 269 | ```js 270 | store.set({ foo: 'Hello', bar: 'World' }); 271 | ``` 272 | 273 | ### get() 274 | 275 | Gets a value by a key from the store. 276 | 277 | - `@params {string} key` - Key to get from the store. 278 | - `@returns {any}` - Returns the value persisted in the store by `key` which could be `null` if key not found. Any error caught during the retrieval will be thrown and cascaded. 279 | 280 | ```js 281 | const foo = store.get('foo'); 282 | ``` 283 | 284 | ### getAll() 285 | 286 | Gets all values from the store. 287 | 288 | - `@returns {any}` - Returns all values persisted in the store. Any error caught during the retrieval will be thrown and cascaded. 289 | 290 | ```js 291 | store.set({ foo: 'Hello', bar: 'World', baz: 'Baz' }); 292 | 293 | // Get all the values from the store. 294 | const values = store.getAll(); // { foo: 'Hello', bar: 'World', baz: 'Baz' } 295 | 296 | // De-structure and get only few of them. 297 | const { foo, baz } = store.getAll(); 298 | ``` 299 | 300 | ### getByKeys() 301 | 302 | Gets multiple values from the store for each of the keys provided. 303 | 304 | - `@params {string[] keys}` - Keys to get from the store. 305 | - `@returns {T[]}` - Returns an array of values. Order of the values is same as the order of the keys in the array. 306 | 307 | ```js 308 | const [a, b, sum] = store.getByKeys(['a', 'b', 'sum']); 309 | ``` 310 | 311 | ### find() 312 | 313 | Gets a value by a key from the store. If anything fails, it returns `null` without emitting error event. 314 | 315 | - `@params {string} key` - Key to get from the store. 316 | - `@returns {any}` - Returns the value persisted in the store by `key` which could be `null` if key not found. Any error caught during the retrieval will be supressed and `null` value is returned. 317 | 318 | ```js 319 | const foo = store.find('foo'); 320 | ``` 321 | 322 | ### getId() 323 | 324 | Gets the unique store id created for the current context/scope. 325 | Example: If used in express, it returns unique store id per request. 326 | 327 | - `@returns {string | undefined}` - Returns the unique store id. 328 | 329 | ```js 330 | const requestIdentifier = store.getId(); 331 | ``` 332 | 333 | ### getShortId() 334 | 335 | Gets the short unique store id created for the current context/scope. 336 | 337 | Note: This is same as `getId();` the difference being it only returns the first 8 characters. 338 | 339 | - `@returns {string | undefined}` - Returns the short unique store id. 340 | 341 | ```js 342 | const requestIdentifier = store.getShortId(); 343 | ``` 344 | 345 | ## Example Projects 346 | 347 | 1. [Node Web Server (TypeScript)](examples/node-http-server-ts) 348 | 2. [Express Web Server (TypeScript)](examples/express-http-server-ts) 349 | 3. [Koa Web Server (TypeScript)](examples/koa-http-server-ts) 350 | 4. [Fastify Web Server (TypeScript)](examples/fastify-http-server-ts) 351 | 352 | ## Changelog 353 | 354 | Check the [CHANGELOG](CHANGELOG.md) for release history. 355 | 356 | ## Contributing 357 | 358 | Any types of contributions are welcome. Feel free to send pull requests or create issues. 359 | 360 | ## License 361 | 362 | Licensed under [The MIT License](LICENSE). 363 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Changelog 2 | 3 | ## [v2.0.0](https://github.com/leapfrogtechnology/async-store/tree/v2.0.0) (2022-01-20) 4 | 5 | [Full Changelog](https://github.com/leapfrogtechnology/async-store/compare/1.3.0-beta.0...v2.0.0) 6 | 7 | **Changes** 8 | 9 | - refactor\(impl/domain\): use native uuid generator [\#103](https://github.com/leapfrogtechnology/async-store/pull/103) [[dependencies](https://github.com/leapfrogtechnology/async-store/labels/dependencies)] ([DevAndromeda](https://github.com/DevAndromeda)) 10 | 11 | ## [1.3.0-beta.0](https://github.com/leapfrogtechnology/async-store/tree/1.3.0-beta.0) (2022-01-14) 12 | 13 | [Full Changelog](https://github.com/leapfrogtechnology/async-store/compare/1.2.0...1.3.0-beta.0) 14 | 15 | **Closed Issues** 16 | 17 | - Update Koa Web Server Example from JavaScript to TypeScript [\#47](https://github.com/leapfrogtechnology/async-store/issues/47) [[good first issue](https://github.com/leapfrogtechnology/async-store/labels/good%20first%20issue)] [[example](https://github.com/leapfrogtechnology/async-store/labels/example)] [[improvement](https://github.com/leapfrogtechnology/async-store/labels/improvement)] 18 | 19 | **Changes** 20 | 21 | - Add Fastify example to initialize async store [\#99](https://github.com/leapfrogtechnology/async-store/pull/99) [[example](https://github.com/leapfrogtechnology/async-store/labels/example)] ([Prabeshpd](https://github.com/Prabeshpd)) 22 | - Add a plugin to initialize async store for fastify [\#98](https://github.com/leapfrogtechnology/async-store/pull/98) ([Prabeshpd](https://github.com/Prabeshpd)) 23 | - Bump path-parse from 1.0.6 to 1.0.7 in /examples/koa-http-server-ts [\#97](https://github.com/leapfrogtechnology/async-store/pull/97) [[dependencies](https://github.com/leapfrogtechnology/async-store/labels/dependencies)] ([dependabot[bot]](https://github.com/apps/dependabot)) 24 | - Bump path-parse from 1.0.6 to 1.0.7 in /examples/micro-http-server-ts [\#96](https://github.com/leapfrogtechnology/async-store/pull/96) [[dependencies](https://github.com/leapfrogtechnology/async-store/labels/dependencies)] ([dependabot[bot]](https://github.com/apps/dependabot)) 25 | - Bump path-parse from 1.0.6 to 1.0.7 in /examples/node-http-server-ts [\#95](https://github.com/leapfrogtechnology/async-store/pull/95) [[dependencies](https://github.com/leapfrogtechnology/async-store/labels/dependencies)] ([dependabot[bot]](https://github.com/apps/dependabot)) 26 | - Bump path-parse from 1.0.6 to 1.0.7 in /examples/express-http-server-ts [\#94](https://github.com/leapfrogtechnology/async-store/pull/94) [[dependencies](https://github.com/leapfrogtechnology/async-store/labels/dependencies)] ([dependabot[bot]](https://github.com/apps/dependabot)) 27 | - Bump path-parse from 1.0.6 to 1.0.7 [\#93](https://github.com/leapfrogtechnology/async-store/pull/93) [[dependencies](https://github.com/leapfrogtechnology/async-store/labels/dependencies)] ([dependabot[bot]](https://github.com/apps/dependabot)) 28 | - Bump glob-parent from 5.1.1 to 5.1.2 [\#92](https://github.com/leapfrogtechnology/async-store/pull/92) [[dependencies](https://github.com/leapfrogtechnology/async-store/labels/dependencies)] ([dependabot[bot]](https://github.com/apps/dependabot)) 29 | - Bump browserslist from 4.16.0 to 4.16.6 in /examples/koa-http-server-ts [\#91](https://github.com/leapfrogtechnology/async-store/pull/91) [[dependencies](https://github.com/leapfrogtechnology/async-store/labels/dependencies)] ([dependabot[bot]](https://github.com/apps/dependabot)) 30 | - Bump browserslist from 4.16.0 to 4.16.6 in /examples/micro-http-server-ts [\#90](https://github.com/leapfrogtechnology/async-store/pull/90) [[dependencies](https://github.com/leapfrogtechnology/async-store/labels/dependencies)] ([dependabot[bot]](https://github.com/apps/dependabot)) 31 | - Bump browserslist from 4.16.0 to 4.16.6 in /examples/node-http-server-ts [\#89](https://github.com/leapfrogtechnology/async-store/pull/89) [[dependencies](https://github.com/leapfrogtechnology/async-store/labels/dependencies)] ([dependabot[bot]](https://github.com/apps/dependabot)) 32 | - Bump browserslist from 4.16.0 to 4.16.6 in /examples/express-http-server-ts [\#88](https://github.com/leapfrogtechnology/async-store/pull/88) [[dependencies](https://github.com/leapfrogtechnology/async-store/labels/dependencies)] ([dependabot[bot]](https://github.com/apps/dependabot)) 33 | - Bump lodash from 4.17.20 to 4.17.21 in /examples/koa-http-server-ts [\#87](https://github.com/leapfrogtechnology/async-store/pull/87) [[dependencies](https://github.com/leapfrogtechnology/async-store/labels/dependencies)] ([dependabot[bot]](https://github.com/apps/dependabot)) 34 | - Bump lodash from 4.17.20 to 4.17.21 in /examples/micro-http-server-ts [\#86](https://github.com/leapfrogtechnology/async-store/pull/86) [[dependencies](https://github.com/leapfrogtechnology/async-store/labels/dependencies)] ([dependabot[bot]](https://github.com/apps/dependabot)) 35 | - Bump lodash from 4.17.20 to 4.17.21 in /examples/express-http-server-ts [\#85](https://github.com/leapfrogtechnology/async-store/pull/85) [[dependencies](https://github.com/leapfrogtechnology/async-store/labels/dependencies)] ([dependabot[bot]](https://github.com/apps/dependabot)) 36 | - Bump lodash from 4.17.20 to 4.17.21 in /examples/node-http-server-ts [\#84](https://github.com/leapfrogtechnology/async-store/pull/84) [[dependencies](https://github.com/leapfrogtechnology/async-store/labels/dependencies)] ([dependabot[bot]](https://github.com/apps/dependabot)) 37 | - Bump lodash from 4.17.20 to 4.17.21 [\#83](https://github.com/leapfrogtechnology/async-store/pull/83) [[dependencies](https://github.com/leapfrogtechnology/async-store/labels/dependencies)] ([dependabot[bot]](https://github.com/apps/dependabot)) 38 | - Bump ssri from 6.0.1 to 6.0.2 in /examples/koa-http-server-ts [\#82](https://github.com/leapfrogtechnology/async-store/pull/82) [[dependencies](https://github.com/leapfrogtechnology/async-store/labels/dependencies)] ([dependabot[bot]](https://github.com/apps/dependabot)) 39 | - Bump ssri from 6.0.1 to 6.0.2 in /examples/micro-http-server-ts [\#81](https://github.com/leapfrogtechnology/async-store/pull/81) [[dependencies](https://github.com/leapfrogtechnology/async-store/labels/dependencies)] ([dependabot[bot]](https://github.com/apps/dependabot)) 40 | - Bump ssri from 6.0.1 to 6.0.2 in /examples/express-http-server-ts [\#80](https://github.com/leapfrogtechnology/async-store/pull/80) [[dependencies](https://github.com/leapfrogtechnology/async-store/labels/dependencies)] ([dependabot[bot]](https://github.com/apps/dependabot)) 41 | - Bump ssri from 6.0.1 to 6.0.2 in /examples/node-http-server-ts [\#79](https://github.com/leapfrogtechnology/async-store/pull/79) [[dependencies](https://github.com/leapfrogtechnology/async-store/labels/dependencies)] ([dependabot[bot]](https://github.com/apps/dependabot)) 42 | - Bump elliptic from 6.5.3 to 6.5.4 in /examples/koa-http-server-ts [\#78](https://github.com/leapfrogtechnology/async-store/pull/78) [[dependencies](https://github.com/leapfrogtechnology/async-store/labels/dependencies)] ([dependabot[bot]](https://github.com/apps/dependabot)) 43 | - Bump elliptic from 6.5.3 to 6.5.4 in /examples/micro-http-server-ts [\#77](https://github.com/leapfrogtechnology/async-store/pull/77) [[dependencies](https://github.com/leapfrogtechnology/async-store/labels/dependencies)] ([dependabot[bot]](https://github.com/apps/dependabot)) 44 | - Bump elliptic from 6.5.3 to 6.5.4 in /examples/express-http-server-ts [\#76](https://github.com/leapfrogtechnology/async-store/pull/76) [[dependencies](https://github.com/leapfrogtechnology/async-store/labels/dependencies)] ([dependabot[bot]](https://github.com/apps/dependabot)) 45 | - Bump elliptic from 6.5.3 to 6.5.4 in /examples/node-http-server-ts [\#75](https://github.com/leapfrogtechnology/async-store/pull/75) [[dependencies](https://github.com/leapfrogtechnology/async-store/labels/dependencies)] ([dependabot[bot]](https://github.com/apps/dependabot)) 46 | - Upgrade packages to latest version [\#74](https://github.com/leapfrogtechnology/async-store/pull/74) [[dependencies](https://github.com/leapfrogtechnology/async-store/labels/dependencies)] ([mesaugat](https://github.com/mesaugat)) 47 | - Bump dot-prop from 4.2.0 to 4.2.1 in /examples/node-http-server-ts [\#73](https://github.com/leapfrogtechnology/async-store/pull/73) [[dependencies](https://github.com/leapfrogtechnology/async-store/labels/dependencies)] ([dependabot[bot]](https://github.com/apps/dependabot)) 48 | - Bump dot-prop from 4.2.0 to 4.2.1 in /examples/express-http-server-ts [\#72](https://github.com/leapfrogtechnology/async-store/pull/72) [[dependencies](https://github.com/leapfrogtechnology/async-store/labels/dependencies)] ([dependabot[bot]](https://github.com/apps/dependabot)) 49 | - Bump dot-prop from 4.2.0 to 4.2.1 in /examples/micro-http-server-ts [\#71](https://github.com/leapfrogtechnology/async-store/pull/71) [[dependencies](https://github.com/leapfrogtechnology/async-store/labels/dependencies)] ([dependabot[bot]](https://github.com/apps/dependabot)) 50 | - Bump dot-prop from 4.2.0 to 4.2.1 in /examples/koa-http-server-ts [\#70](https://github.com/leapfrogtechnology/async-store/pull/70) [[dependencies](https://github.com/leapfrogtechnology/async-store/labels/dependencies)] ([dependabot[bot]](https://github.com/apps/dependabot)) 51 | - Bump ini from 1.3.5 to 1.3.8 in /examples/koa-http-server-ts [\#69](https://github.com/leapfrogtechnology/async-store/pull/69) [[dependencies](https://github.com/leapfrogtechnology/async-store/labels/dependencies)] ([dependabot[bot]](https://github.com/apps/dependabot)) 52 | - Bump ini from 1.3.5 to 1.3.8 in /examples/micro-http-server-ts [\#68](https://github.com/leapfrogtechnology/async-store/pull/68) [[dependencies](https://github.com/leapfrogtechnology/async-store/labels/dependencies)] ([dependabot[bot]](https://github.com/apps/dependabot)) 53 | - Bump ini from 1.3.5 to 1.3.8 in /examples/node-http-server-ts [\#67](https://github.com/leapfrogtechnology/async-store/pull/67) [[dependencies](https://github.com/leapfrogtechnology/async-store/labels/dependencies)] ([dependabot[bot]](https://github.com/apps/dependabot)) 54 | - Bump ini from 1.3.5 to 1.3.8 in /examples/express-http-server-ts [\#66](https://github.com/leapfrogtechnology/async-store/pull/66) [[dependencies](https://github.com/leapfrogtechnology/async-store/labels/dependencies)] ([dependabot[bot]](https://github.com/apps/dependabot)) 55 | - Bump node-fetch from 2.6.0 to 2.6.1 [\#65](https://github.com/leapfrogtechnology/async-store/pull/65) [[dependencies](https://github.com/leapfrogtechnology/async-store/labels/dependencies)] ([dependabot[bot]](https://github.com/apps/dependabot)) 56 | - Bump elliptic from 6.5.2 to 6.5.3 in /examples/koa-http-server-ts [\#64](https://github.com/leapfrogtechnology/async-store/pull/64) [[dependencies](https://github.com/leapfrogtechnology/async-store/labels/dependencies)] ([dependabot[bot]](https://github.com/apps/dependabot)) 57 | - Bump elliptic from 6.5.1 to 6.5.3 in /examples/micro-http-server-ts [\#63](https://github.com/leapfrogtechnology/async-store/pull/63) [[dependencies](https://github.com/leapfrogtechnology/async-store/labels/dependencies)] ([dependabot[bot]](https://github.com/apps/dependabot)) 58 | - Bump elliptic from 6.5.1 to 6.5.3 in /examples/node-http-server-ts [\#62](https://github.com/leapfrogtechnology/async-store/pull/62) [[dependencies](https://github.com/leapfrogtechnology/async-store/labels/dependencies)] ([dependabot[bot]](https://github.com/apps/dependabot)) 59 | - Bump elliptic from 6.5.1 to 6.5.3 in /examples/express-http-server-ts [\#61](https://github.com/leapfrogtechnology/async-store/pull/61) [[dependencies](https://github.com/leapfrogtechnology/async-store/labels/dependencies)] ([dependabot[bot]](https://github.com/apps/dependabot)) 60 | - Bump codecov from 3.6.5 to 3.7.1 [\#60](https://github.com/leapfrogtechnology/async-store/pull/60) [[dependencies](https://github.com/leapfrogtechnology/async-store/labels/dependencies)] ([dependabot[bot]](https://github.com/apps/dependabot)) 61 | - Bump lodash from 4.17.15 to 4.17.19 in /examples/micro-http-server-ts [\#59](https://github.com/leapfrogtechnology/async-store/pull/59) [[dependencies](https://github.com/leapfrogtechnology/async-store/labels/dependencies)] ([dependabot[bot]](https://github.com/apps/dependabot)) 62 | - Bump lodash from 4.17.15 to 4.17.19 in /examples/express-http-server-ts [\#58](https://github.com/leapfrogtechnology/async-store/pull/58) [[dependencies](https://github.com/leapfrogtechnology/async-store/labels/dependencies)] ([dependabot[bot]](https://github.com/apps/dependabot)) 63 | - Bump lodash from 4.17.15 to 4.17.19 in /examples/koa-http-server-ts [\#57](https://github.com/leapfrogtechnology/async-store/pull/57) [[dependencies](https://github.com/leapfrogtechnology/async-store/labels/dependencies)] ([dependabot[bot]](https://github.com/apps/dependabot)) 64 | - Bump lodash from 4.17.15 to 4.17.19 in /examples/node-http-server-ts [\#56](https://github.com/leapfrogtechnology/async-store/pull/56) [[dependencies](https://github.com/leapfrogtechnology/async-store/labels/dependencies)] ([dependabot[bot]](https://github.com/apps/dependabot)) 65 | - Bump lodash from 4.17.14 to 4.17.19 [\#55](https://github.com/leapfrogtechnology/async-store/pull/55) [[dependencies](https://github.com/leapfrogtechnology/async-store/labels/dependencies)] ([dependabot[bot]](https://github.com/apps/dependabot)) 66 | - Bump acorn from 6.3.0 to 6.4.1 in /examples/node-http-server-ts [\#54](https://github.com/leapfrogtechnology/async-store/pull/54) [[dependencies](https://github.com/leapfrogtechnology/async-store/labels/dependencies)] ([dependabot[bot]](https://github.com/apps/dependabot)) 67 | - Bump acorn from 6.4.0 to 6.4.1 in /examples/koa-http-server-ts [\#53](https://github.com/leapfrogtechnology/async-store/pull/53) [[dependencies](https://github.com/leapfrogtechnology/async-store/labels/dependencies)] ([dependabot[bot]](https://github.com/apps/dependabot)) 68 | - Bump acorn from 6.3.0 to 6.4.1 in /examples/express-http-server-ts [\#52](https://github.com/leapfrogtechnology/async-store/pull/52) [[dependencies](https://github.com/leapfrogtechnology/async-store/labels/dependencies)] ([dependabot[bot]](https://github.com/apps/dependabot)) 69 | - Bump acorn from 6.3.0 to 6.4.1 in /examples/micro-http-server-ts [\#51](https://github.com/leapfrogtechnology/async-store/pull/51) [[dependencies](https://github.com/leapfrogtechnology/async-store/labels/dependencies)] ([dependabot[bot]](https://github.com/apps/dependabot)) 70 | - Bump codecov from 3.6.1 to 3.6.5 [\#50](https://github.com/leapfrogtechnology/async-store/pull/50) [[dependencies](https://github.com/leapfrogtechnology/async-store/labels/dependencies)] ([dependabot[bot]](https://github.com/apps/dependabot)) 71 | - Bump handlebars from 4.2.0 to 4.5.3 [\#49](https://github.com/leapfrogtechnology/async-store/pull/49) [[dependencies](https://github.com/leapfrogtechnology/async-store/labels/dependencies)] ([dependabot[bot]](https://github.com/apps/dependabot)) 72 | - Convert Koa example based on JavaScript to TypeScript [\#48](https://github.com/leapfrogtechnology/async-store/pull/48) [[example](https://github.com/leapfrogtechnology/async-store/labels/example)] [[types](https://github.com/leapfrogtechnology/async-store/labels/types)] ([sarojrana](https://github.com/sarojrana)) 73 | 74 | ## [1.2.0](https://github.com/leapfrogtechnology/async-store/tree/1.2.0) (2019-11-27) 75 | 76 | [Full Changelog](https://github.com/leapfrogtechnology/async-store/compare/1.1.0...1.2.0) 77 | 78 | **Closed Issues** 79 | 80 | - Micro example doesn't point to correct path. [\#42](https://github.com/leapfrogtechnology/async-store/issues/42) 81 | - Use the latest release in all the examples [\#39](https://github.com/leapfrogtechnology/async-store/issues/39) [[good first issue](https://github.com/leapfrogtechnology/async-store/labels/good%20first%20issue)] [[example](https://github.com/leapfrogtechnology/async-store/labels/example)] 82 | - Add tests to cover initializeMiddleware function [\#38](https://github.com/leapfrogtechnology/async-store/issues/38) [[good first issue](https://github.com/leapfrogtechnology/async-store/labels/good%20first%20issue)] [[test](https://github.com/leapfrogtechnology/async-store/labels/test)] [[coverage](https://github.com/leapfrogtechnology/async-store/labels/coverage)] 83 | - Add an example project for micro [\#13](https://github.com/leapfrogtechnology/async-store/issues/13) [[help wanted](https://github.com/leapfrogtechnology/async-store/labels/help%20wanted)] [[good first issue](https://github.com/leapfrogtechnology/async-store/labels/good%20first%20issue)] [[example](https://github.com/leapfrogtechnology/async-store/labels/example)] [[feature](https://github.com/leapfrogtechnology/async-store/labels/feature)] [[hacktoberfest](https://github.com/leapfrogtechnology/async-store/labels/hacktoberfest)] 84 | 85 | **Changes** 86 | 87 | - Remove is\_enabled flag and unused methods [\#46](https://github.com/leapfrogtechnology/async-store/pull/46) [[improvement](https://github.com/leapfrogtechnology/async-store/labels/improvement)] [[breaking change](https://github.com/leapfrogtechnology/async-store/labels/breaking%20change)] ([mesaugat](https://github.com/mesaugat)) 88 | - Add tests to cover initializeMiddleware function [\#45](https://github.com/leapfrogtechnology/async-store/pull/45) [[test](https://github.com/leapfrogtechnology/async-store/labels/test)] [[coverage](https://github.com/leapfrogtechnology/async-store/labels/coverage)] ([p0k8h](https://github.com/p0k8h)) 89 | - Micro Example Path fix [\#43](https://github.com/leapfrogtechnology/async-store/pull/43) ([sumansta](https://github.com/sumansta)) 90 | - Use latest release in all examples [\#41](https://github.com/leapfrogtechnology/async-store/pull/41) ([sumansta](https://github.com/sumansta)) 91 | - Add example for micro [\#37](https://github.com/leapfrogtechnology/async-store/pull/37) [[documentation](https://github.com/leapfrogtechnology/async-store/labels/documentation)] [[example](https://github.com/leapfrogtechnology/async-store/labels/example)] ([sumansta](https://github.com/sumansta)) 92 | 93 | ## [1.1.0](https://github.com/leapfrogtechnology/async-store/tree/1.1.0) (2019-11-14) 94 | 95 | [Full Changelog](https://github.com/leapfrogtechnology/async-store/compare/1.0.2...1.1.0) 96 | 97 | **Closed Issues** 98 | 99 | - New accessor function to retrieve a list of values by keys [\#28](https://github.com/leapfrogtechnology/async-store/issues/28) [[good first issue](https://github.com/leapfrogtechnology/async-store/labels/good%20first%20issue)] [[feature](https://github.com/leapfrogtechnology/async-store/labels/feature)] [[hacktoberfest](https://github.com/leapfrogtechnology/async-store/labels/hacktoberfest)] 100 | - New accessor function to get all the store contents as a flat object [\#27](https://github.com/leapfrogtechnology/async-store/issues/27) [[good first issue](https://github.com/leapfrogtechnology/async-store/labels/good%20first%20issue)] [[feature](https://github.com/leapfrogtechnology/async-store/labels/feature)] [[improvement](https://github.com/leapfrogtechnology/async-store/labels/improvement)] [[hacktoberfest](https://github.com/leapfrogtechnology/async-store/labels/hacktoberfest)] 101 | - Ability to get short id from store.getId\(\) using a flag [\#26](https://github.com/leapfrogtechnology/async-store/issues/26) [[good first issue](https://github.com/leapfrogtechnology/async-store/labels/good%20first%20issue)] [[feature](https://github.com/leapfrogtechnology/async-store/labels/feature)] [[improvement](https://github.com/leapfrogtechnology/async-store/labels/improvement)] [[hacktoberfest](https://github.com/leapfrogtechnology/async-store/labels/hacktoberfest)] 102 | - CI - Integrate test code coverage reporting [\#21](https://github.com/leapfrogtechnology/async-store/issues/21) [[help wanted](https://github.com/leapfrogtechnology/async-store/labels/help%20wanted)] [[good first issue](https://github.com/leapfrogtechnology/async-store/labels/good%20first%20issue)] [[test](https://github.com/leapfrogtechnology/async-store/labels/test)] 103 | - Add an example project for a basic http server built with just node [\#20](https://github.com/leapfrogtechnology/async-store/issues/20) [[help wanted](https://github.com/leapfrogtechnology/async-store/labels/help%20wanted)] [[good first issue](https://github.com/leapfrogtechnology/async-store/labels/good%20first%20issue)] [[example](https://github.com/leapfrogtechnology/async-store/labels/example)] 104 | - Add an example project for koa js [\#17](https://github.com/leapfrogtechnology/async-store/issues/17) [[help wanted](https://github.com/leapfrogtechnology/async-store/labels/help%20wanted)] [[good first issue](https://github.com/leapfrogtechnology/async-store/labels/good%20first%20issue)] [[example](https://github.com/leapfrogtechnology/async-store/labels/example)] [[hacktoberfest](https://github.com/leapfrogtechnology/async-store/labels/hacktoberfest)] 105 | - Example with request id logging for express sample app [\#16](https://github.com/leapfrogtechnology/async-store/issues/16) [[example](https://github.com/leapfrogtechnology/async-store/labels/example)] 106 | 107 | **Changes** 108 | 109 | - Add example project for koa [\#36](https://github.com/leapfrogtechnology/async-store/pull/36) [[documentation](https://github.com/leapfrogtechnology/async-store/labels/documentation)] [[example](https://github.com/leapfrogtechnology/async-store/labels/example)] ([Swechhya](https://github.com/Swechhya)) 110 | - Add implementation to get short id [\#35](https://github.com/leapfrogtechnology/async-store/pull/35) [[feature](https://github.com/leapfrogtechnology/async-store/labels/feature)] ([silwalanish](https://github.com/silwalanish)) 111 | - Remove unreachable code [\#34](https://github.com/leapfrogtechnology/async-store/pull/34) [[improvement](https://github.com/leapfrogtechnology/async-store/labels/improvement)] ([mesaugat](https://github.com/mesaugat)) 112 | - Add missing tests for edge cases [\#33](https://github.com/leapfrogtechnology/async-store/pull/33) [[test](https://github.com/leapfrogtechnology/async-store/labels/test)] ([kabirbaidhya](https://github.com/kabirbaidhya)) 113 | - Add new accessor function getAll\(\) [\#32](https://github.com/leapfrogtechnology/async-store/pull/32) [[feature](https://github.com/leapfrogtechnology/async-store/labels/feature)] ([evless](https://github.com/evless)) 114 | - Add new accessor function getByKeys\(\) [\#30](https://github.com/leapfrogtechnology/async-store/pull/30) [[feature](https://github.com/leapfrogtechnology/async-store/labels/feature)] ([spencerwi](https://github.com/spencerwi)) 115 | - Refactor all the examples for consistency and simplicity [\#29](https://github.com/leapfrogtechnology/async-store/pull/29) [[refactor](https://github.com/leapfrogtechnology/async-store/labels/refactor)] [[example](https://github.com/leapfrogtechnology/async-store/labels/example)] ([kabirbaidhya](https://github.com/kabirbaidhya)) 116 | - Add an example project for a basic http server built with just node [\#25](https://github.com/leapfrogtechnology/async-store/pull/25) [[example](https://github.com/leapfrogtechnology/async-store/labels/example)] [[node](https://github.com/leapfrogtechnology/async-store/labels/node)] [[web server](https://github.com/leapfrogtechnology/async-store/labels/web%20server)] ([silwalanish](https://github.com/silwalanish)) 117 | - Add example for request id logging [\#24](https://github.com/leapfrogtechnology/async-store/pull/24) [[documentation](https://github.com/leapfrogtechnology/async-store/labels/documentation)] [[example](https://github.com/leapfrogtechnology/async-store/labels/example)] ([silwalanish](https://github.com/silwalanish)) 118 | - Include only source files in test coverage [\#23](https://github.com/leapfrogtechnology/async-store/pull/23) [[coverage](https://github.com/leapfrogtechnology/async-store/labels/coverage)] ([mesaugat](https://github.com/mesaugat)) 119 | - Integrate test code coverage reporting with Codecov and Travis [\#22](https://github.com/leapfrogtechnology/async-store/pull/22) [[test](https://github.com/leapfrogtechnology/async-store/labels/test)] [[coverage](https://github.com/leapfrogtechnology/async-store/labels/coverage)] ([ghost](https://github.com/ghost)) 120 | 121 | ## [1.0.2](https://github.com/leapfrogtechnology/async-store/tree/1.0.2) (2019-07-31) 122 | 123 | [Full Changelog](https://github.com/leapfrogtechnology/async-store/compare/1.0.1...1.0.2) 124 | 125 | **Closed Issues** 126 | 127 | - Make store.getId\(\) fail-safe [\#15](https://github.com/leapfrogtechnology/async-store/issues/15) 128 | 129 | **Changes** 130 | 131 | - Add isInitialized\(\) doc [\#19](https://github.com/leapfrogtechnology/async-store/pull/19) [[documentation](https://github.com/leapfrogtechnology/async-store/labels/documentation)] ([cham11ng](https://github.com/cham11ng)) 132 | - Add test cases for getId\(\) method [\#18](https://github.com/leapfrogtechnology/async-store/pull/18) [[test](https://github.com/leapfrogtechnology/async-store/labels/test)] ([cham11ng](https://github.com/cham11ng)) 133 | - Minor improvements on the documentation [\#12](https://github.com/leapfrogtechnology/async-store/pull/12) [[documentation](https://github.com/leapfrogtechnology/async-store/labels/documentation)] ([kabirbaidhya](https://github.com/kabirbaidhya)) 134 | 135 | ## [1.0.1](https://github.com/leapfrogtechnology/async-store/tree/1.0.1) (2019-07-19) 136 | 137 | [Full Changelog](https://github.com/leapfrogtechnology/async-store/compare/1.0.0...1.0.1) 138 | 139 | **Changes** 140 | 141 | - Update example to use correct store [\#11](https://github.com/leapfrogtechnology/async-store/pull/11) ([mesaugat](https://github.com/mesaugat)) 142 | - Add GitHub URL and update description in package.json [\#10](https://github.com/leapfrogtechnology/async-store/pull/10) [[documentation](https://github.com/leapfrogtechnology/async-store/labels/documentation)] ([mesaugat](https://github.com/mesaugat)) 143 | 144 | ## [1.0.0](https://github.com/leapfrogtechnology/async-store/tree/1.0.0) (2019-07-19) 145 | 146 | [Full Changelog](https://github.com/leapfrogtechnology/async-store/compare/1.0.0-beta.1...1.0.0) 147 | 148 | **Changes** 149 | 150 | - Add a sample project using Express and TypeScript [\#9](https://github.com/leapfrogtechnology/async-store/pull/9) [[example](https://github.com/leapfrogtechnology/async-store/labels/example)] ([kabirbaidhya](https://github.com/kabirbaidhya)) 151 | - Update docs in README.md [\#8](https://github.com/leapfrogtechnology/async-store/pull/8) [[documentation](https://github.com/leapfrogtechnology/async-store/labels/documentation)] ([cham11ng](https://github.com/cham11ng)) 152 | - Cleanup and update dependencies [\#7](https://github.com/leapfrogtechnology/async-store/pull/7) ([kabirbaidhya](https://github.com/kabirbaidhya)) 153 | 154 | ## [1.0.0-beta.1](https://github.com/leapfrogtechnology/async-store/tree/1.0.0-beta.1) (2019-07-05) 155 | 156 | [Full Changelog](https://github.com/leapfrogtechnology/async-store/compare/1.0.0-alpha.1...1.0.0-beta.1) 157 | 158 | **Security fixes:** 159 | 160 | - Upgrade packages using vulnerable js-yaml package as a dependency [\#5](https://github.com/leapfrogtechnology/async-store/pull/5) [[security](https://github.com/leapfrogtechnology/async-store/labels/security)] ([mesaugat](https://github.com/mesaugat)) 161 | 162 | **Changes** 163 | 164 | - Refactor domain implementation and add find\(\) function [\#6](https://github.com/leapfrogtechnology/async-store/pull/6) [[refactor](https://github.com/leapfrogtechnology/async-store/labels/refactor)] ([cham11ng](https://github.com/cham11ng)) 165 | 166 | ## [1.0.0-alpha.1](https://github.com/leapfrogtechnology/async-store/tree/1.0.0-alpha.1) (2019-04-18) 167 | 168 | [Full Changelog](https://github.com/leapfrogtechnology/async-store/compare/622d5ba16aeb9301947471ff0ceca54fcd8e567b...1.0.0-alpha.1) 169 | 170 | **Changes** 171 | 172 | - Add scripts to generate changelog and release [\#4](https://github.com/leapfrogtechnology/async-store/pull/4) [[script](https://github.com/leapfrogtechnology/async-store/labels/script)] ([kabirbaidhya](https://github.com/kabirbaidhya)) 173 | - Configure Travis CI for running tests [\#3](https://github.com/leapfrogtechnology/async-store/pull/3) [[test](https://github.com/leapfrogtechnology/async-store/labels/test)] ([kabirbaidhya](https://github.com/kabirbaidhya)) 174 | - Add MIT License [\#2](https://github.com/leapfrogtechnology/async-store/pull/2) [[documentation](https://github.com/leapfrogtechnology/async-store/labels/documentation)] ([kabirbaidhya](https://github.com/kabirbaidhya)) 175 | - Add initial source code [\#1](https://github.com/leapfrogtechnology/async-store/pull/1) ([kabirbaidhya](https://github.com/kabirbaidhya)) 176 | 177 | 178 | 179 | \* *This Changelog was automatically generated by [github_changelog_generator](https://github.com/github-changelog-generator/github-changelog-generator)* 180 | -------------------------------------------------------------------------------- /test/domain.test.ts: -------------------------------------------------------------------------------- 1 | import 'mocha'; 2 | import { expect } from 'chai'; 3 | import * as domain from 'domain'; 4 | import { EventEmitter } from 'events'; 5 | import { createRequest, createResponse } from 'node-mocks-http'; 6 | 7 | import * as globalStore from '../src'; 8 | import Middleware from '../src/Middleware'; 9 | import { STORE_KEY } from '../src/StoreDomain'; 10 | import AsyncStoreAdapter from '../src/AsyncStoreAdapter'; 11 | 12 | describe('store: [adapter=DOMAIN]', () => { 13 | const adapter = AsyncStoreAdapter.DOMAIN; 14 | const initMiddleware: Middleware = globalStore.initializeMiddleware(adapter); 15 | const initDefaultMiddleware: Middleware = globalStore.initializeMiddleware(); 16 | 17 | beforeEach(() => { 18 | Object.assign(process, { domain: undefined }); 19 | }); 20 | 21 | describe('initializeMiddleware()', () => { 22 | it('should return a middleware function.', () => { 23 | expect(initMiddleware).to.be.a('function'); 24 | expect(initDefaultMiddleware).to.be.a('function'); 25 | expect(initMiddleware.length).to.equal(3); 26 | expect(initDefaultMiddleware.length).to.equal(3); 27 | }); 28 | }); 29 | 30 | describe('initialize()', () => { 31 | it('should initialize the store.', (done) => { 32 | const callback = () => { 33 | expect(!!(process.domain as any)[STORE_KEY]).to.equal(true); 34 | expect(globalStore.isInitialized()).to.equal(true); 35 | 36 | done(); 37 | }; 38 | 39 | globalStore.initialize(adapter)(callback); 40 | }); 41 | 42 | it('should also bind params if params are passed through arguments.', (done) => { 43 | const req = new EventEmitter(); 44 | const res = new EventEmitter(); 45 | const emitters = [req, res]; 46 | const errorCallback = (err: any) => err; 47 | 48 | const callback = () => { 49 | // Postmortem domain to check bound arguments. 50 | expect((process.domain as any)._events.error).to.equal(errorCallback); 51 | expect((process.domain as any).members[0]).to.equal(req); 52 | expect((process.domain as any).members[1]).to.equal(res); 53 | 54 | done(); 55 | }; 56 | 57 | globalStore.initialize(adapter)(callback, { 58 | req, 59 | res, 60 | emitters, 61 | error: errorCallback 62 | }); 63 | }); 64 | }); 65 | 66 | describe('isInitialized()', () => { 67 | const [req, res] = [createRequest(), createResponse()]; 68 | 69 | const checkStore = (done: Mocha.Done) => { 70 | const callback = () => { 71 | const isInitialized = globalStore.isInitialized(); 72 | expect(isInitialized).to.equal(true); 73 | initMiddleware(req, res, () => { 74 | expect(isInitialized).to.equal(true); 75 | }); 76 | 77 | done(); 78 | }; 79 | 80 | initMiddleware(req, res, callback); 81 | }; 82 | 83 | it('should return false when not initialized.', () => { 84 | expect(globalStore.isInitialized()).to.equal(false); 85 | }); 86 | 87 | it('should return true when initialized through the middleware.', (done) => { 88 | checkStore(done); 89 | }); 90 | 91 | it('should return false when initialized but invoked out of the active domain.', (done) => { 92 | // Initialized 93 | globalStore.initialize(adapter)(() => null); 94 | 95 | setTimeout(() => { 96 | // Invoke it out of domain. 97 | expect(globalStore.isInitialized()).to.equal(false); 98 | done(); 99 | }, 500); 100 | }); 101 | 102 | it('should return true when initialized and invoked within the active domain.', (done) => { 103 | const callback = () => { 104 | expect(globalStore.isInitialized()).to.equal(true); 105 | done(); 106 | }; 107 | 108 | globalStore.initialize(adapter)(callback); 109 | }); 110 | }); 111 | 112 | describe('get()', () => { 113 | it('should throw an error if store not initialized.', () => { 114 | expect(globalStore.get.bind(globalStore, 'foo')).to.throw('No active domain found in store.'); 115 | }); 116 | 117 | it('should return null if invoked under active domain w/o proper store initialization.', (done) => { 118 | const d = domain.create(); 119 | 120 | d.run(() => { 121 | // Ensure data in the existing domain is available at this point. 122 | expect(globalStore.get('foo')).to.equal(null); 123 | 124 | done(); 125 | }); 126 | }); 127 | 128 | it('should return `undefined` if the value was not set.', (done) => { 129 | const callback = () => { 130 | expect(globalStore.get('foo')).to.equal(undefined); 131 | done(); 132 | }; 133 | 134 | globalStore.initialize(adapter)(callback); 135 | }); 136 | }); 137 | 138 | describe('getAll()', () => { 139 | it('should return all values from the store.', (done) => { 140 | const a = 1; 141 | const b = 2; 142 | const sum = a + b; 143 | 144 | const callback = () => { 145 | globalStore.set({ a, b }); 146 | globalStore.set({ sum }); 147 | 148 | doSomething().then(done); 149 | }; 150 | 151 | const doSomething = () => 152 | Promise.resolve() 153 | .then(() => { 154 | expect(globalStore.get('a')).to.equal(a); 155 | expect(globalStore.get('b')).to.equal(b); 156 | expect(globalStore.get('sum')).to.equal(sum); 157 | }) 158 | .then(() => { 159 | expect(globalStore.getAll()).deep.equal({ a, b, sum }); 160 | }); 161 | 162 | globalStore.initialize(adapter)(callback); 163 | }); 164 | 165 | it('should return null if invoked under active domain w/o proper store initialization.', (done) => { 166 | const d = domain.create(); 167 | 168 | d.run(() => { 169 | // Ensure data in the existing domain is available at this point. 170 | expect(globalStore.getAll()).to.equal(null); 171 | 172 | done(); 173 | }); 174 | }); 175 | }); 176 | 177 | describe('getByKeys()', () => { 178 | it('should throw an error if store not initialized.', () => { 179 | expect(globalStore.get.bind(globalStore, 'foo')).to.throw('No active domain found in store.'); 180 | }); 181 | 182 | it('should return `undefined` as the value for requested keys that were not set.', (done) => { 183 | const callback = () => { 184 | expect(globalStore.getByKeys(['foo', 'bar'])).to.deep.equal([undefined, undefined]); 185 | 186 | done(); 187 | }; 188 | 189 | globalStore.initialize(adapter)(callback); 190 | }); 191 | 192 | it('should return an array of matching values in the same order as the list of requested keys.', (done) => { 193 | const callback = () => { 194 | globalStore.set({ a: 1, b: 2, sum: 3, somethingNull: null }); 195 | 196 | expect(globalStore.getByKeys(['a', 'b', 'somethingNull', 'sum'])).to.deep.equal([1, 2, null, 3]); 197 | 198 | done(); 199 | }; 200 | 201 | globalStore.initialize(adapter)(callback); 202 | }); 203 | 204 | it('should return an identical array of same length even if there are unknown (not set) keys.', (done) => { 205 | const callback = () => { 206 | globalStore.set({ a: 1, b: 2, z: 5 }); 207 | 208 | expect(globalStore.getByKeys(['a', 'b', 'c', 'd', 'z'])).to.deep.equal([1, 2, undefined, undefined, 5]); 209 | 210 | done(); 211 | }; 212 | 213 | globalStore.initialize(adapter)(callback); 214 | }); 215 | 216 | it('should throw an error when empty list of keys is passed.', () => { 217 | const callback = () => { 218 | expect(globalStore.getByKeys.bind(globalStore, [])).to.throw( 219 | 'No keys provided for getting the values from store.' 220 | ); 221 | }; 222 | 223 | globalStore.initialize(adapter)(callback); 224 | }); 225 | }); 226 | 227 | describe('getId()', () => { 228 | it('should return unique value if store is initialized.', (done) => { 229 | const callback = () => { 230 | expect(globalStore.getId()).to.be.an('string'); 231 | expect(globalStore.getId()).to.not.equal(null); 232 | expect(globalStore.getId()).to.not.equal(undefined); 233 | 234 | done(); 235 | }; 236 | 237 | globalStore.initialize(adapter)(callback); 238 | }); 239 | 240 | it('should return `undefined` if store is not initialized.', (done) => { 241 | expect(globalStore.getId).to.not.throw(); 242 | expect(globalStore.getId()).to.equal(undefined); 243 | 244 | done(); 245 | }); 246 | }); 247 | 248 | describe('getShortId()', () => { 249 | it('should return short (8 chars) unique value if store is initialized.', (done) => { 250 | const callback = () => { 251 | expect(globalStore.getShortId()).to.be.an('string'); 252 | expect(globalStore.getShortId()).to.not.equal(null); 253 | expect(globalStore.getShortId()).to.not.equal(undefined); 254 | expect(globalStore.getShortId()).to.be.lengthOf(8); 255 | 256 | done(); 257 | }; 258 | 259 | globalStore.initialize(adapter)(callback); 260 | }); 261 | 262 | it('should return `undefined` if store is not initialized.', (done) => { 263 | expect(globalStore.getShortId).to.not.throw(); 264 | expect(globalStore.getShortId()).to.equal(undefined); 265 | 266 | done(); 267 | }); 268 | }); 269 | 270 | describe('find()', () => { 271 | it('should successfully return value in synchronous callback.', (done) => { 272 | const callback = () => { 273 | first(); 274 | second(); 275 | 276 | done(); 277 | }; 278 | 279 | const first = () => { 280 | globalStore.set({ 281 | foo: 'foo', 282 | bar: { 283 | key1: { 284 | foo: 'Hello', 285 | bar: 'World' 286 | }, 287 | key2: 'Foo Bar' 288 | } 289 | }); 290 | }; 291 | const second = () => { 292 | expect(globalStore.find('foo')).to.equal('foo'); 293 | expect(globalStore.find('bar')).deep.equal({ 294 | key1: { 295 | foo: 'Hello', 296 | bar: 'World' 297 | }, 298 | key2: 'Foo Bar' 299 | }); 300 | 301 | globalStore.set({ foo: 'Foo' }); 302 | 303 | expect(globalStore.find('foo')).to.equal('Foo'); 304 | }; 305 | 306 | globalStore.initialize(adapter)(callback); 307 | }); 308 | 309 | it('should successfully return value in asynchronous callback.', (done) => { 310 | const callback = () => { 311 | globalStore.set({ foo: 'bar' }); 312 | 313 | doSomething().then(done); 314 | }; 315 | 316 | const doSomething = () => 317 | Promise.resolve() 318 | .then(() => { 319 | expect(globalStore.find('foo')).to.equal('bar'); 320 | }) 321 | .then(() => { 322 | expect(globalStore.find('foo')).to.equal('bar'); 323 | }) 324 | .then(() => { 325 | expect(globalStore.find('foo')).to.equal('bar'); 326 | }) 327 | .then(() => { 328 | expect(globalStore.find('foo')).to.equal('bar'); 329 | }) 330 | .then(() => { 331 | expect(globalStore.find('foo')).to.equal('bar'); 332 | }); 333 | 334 | globalStore.initialize(adapter)(callback); 335 | }); 336 | 337 | it('should return null even if store not initialized.', () => { 338 | expect(globalStore.find('foo')).to.equal(null); 339 | }); 340 | 341 | it('should return `undefined` if the value was not set.', (done) => { 342 | const callback = () => { 343 | expect(globalStore.find('foo')).to.equal(undefined); 344 | done(); 345 | }; 346 | 347 | globalStore.initialize(adapter)(callback); 348 | }); 349 | }); 350 | 351 | describe('set()', () => { 352 | it('should throw an error if store not initialized.', () => { 353 | expect(globalStore.set.bind(globalStore, {})).to.throw('Async store not initialized.'); 354 | }); 355 | 356 | it('should throw an error if invalid arguments are provided.', (done) => { 357 | const callback = () => { 358 | expect(globalStore.set.bind(globalStore, 5)).to.throw('Invalid arguments provided for asyncStore.set()'); 359 | expect(globalStore.set.bind(globalStore, 'five')).to.throw('Invalid arguments provided for asyncStore.set()'); 360 | expect(globalStore.set.bind(globalStore, null)).to.throw('Invalid arguments provided for asyncStore.set()'); 361 | expect(globalStore.set.bind(globalStore, undefined)).to.throw( 362 | 'Invalid arguments provided for asyncStore.set()' 363 | ); 364 | 365 | done(); 366 | }; 367 | 368 | globalStore.initialize(adapter)(callback); 369 | }); 370 | 371 | it('should set properties in the store.', (done) => { 372 | const callback = () => { 373 | globalStore.set({ foo: 'Hello', bar: 'World' }); 374 | second(); 375 | done(); 376 | }; 377 | 378 | const second = () => { 379 | expect((process.domain as any)[STORE_KEY]['foo']).to.equal('Hello'); 380 | expect((process.domain as any)[STORE_KEY]['bar']).to.equal('World'); 381 | }; 382 | 383 | globalStore.initialize(adapter)(callback); 384 | }); 385 | 386 | it('should merge and override existing properties if set multiple times.', (done) => { 387 | const callback = () => { 388 | globalStore.set({ foo: 'Hello', bar: 'World' }); 389 | second(); 390 | third(); 391 | done(); 392 | }; 393 | 394 | const second = () => { 395 | expect((process.domain as any)[STORE_KEY]['foo']).to.equal('Hello'); 396 | expect((process.domain as any)[STORE_KEY]['bar']).to.equal('World'); 397 | 398 | globalStore.set({ foo: 'Foo', bar: 'Bar', baz: 'Baz' }); 399 | }; 400 | 401 | const third = () => { 402 | expect((process.domain as any)[STORE_KEY]['foo']).to.equal('Foo'); 403 | expect((process.domain as any)[STORE_KEY]['bar']).to.equal('Bar'); 404 | expect((process.domain as any)[STORE_KEY]['baz']).to.equal('Baz'); 405 | }; 406 | 407 | globalStore.initialize(adapter)(callback); 408 | }); 409 | 410 | it('should merge and override existing properties recursively.', (done) => { 411 | const callback = () => { 412 | first(); 413 | second(); 414 | done(); 415 | }; 416 | 417 | const first = () => { 418 | globalStore.set({ 419 | foo: 'Foo', 420 | bar: { 421 | key1: { 422 | foo: 'Hello', 423 | bar: 'World' 424 | }, 425 | key2: 'Foo Bar' 426 | } 427 | }); 428 | 429 | expect((process.domain as any)[STORE_KEY]['foo']).to.equal('Foo'); 430 | expect((process.domain as any)[STORE_KEY]['bar']['key1']['foo']).to.equal('Hello'); 431 | expect((process.domain as any)[STORE_KEY]['bar']['key1']['bar']).to.equal('World'); 432 | }; 433 | 434 | const second = () => { 435 | globalStore.set({ 436 | foo: 'Foo', 437 | bar: { 438 | key1: 'Foo Bar', 439 | key2: 'Hello World', 440 | key3: 'Foo World' 441 | }, 442 | baz: 'Baz' 443 | }); 444 | 445 | expect((process.domain as any)[STORE_KEY]['foo']).to.equal('Foo'); 446 | expect((process.domain as any)[STORE_KEY]['bar']['key1']).to.equal('Foo Bar'); 447 | expect((process.domain as any)[STORE_KEY]['bar']['key2']).to.equal('Hello World'); 448 | expect((process.domain as any)[STORE_KEY]['bar']['key3']).to.equal('Foo World'); 449 | expect((process.domain as any)[STORE_KEY]['baz']).to.equal('Baz'); 450 | }; 451 | 452 | globalStore.initialize(adapter)(callback); 453 | }); 454 | 455 | // @see https://github.com/leapfrogtechnology/async-store/issues/105 456 | it('should set properties without polluting the prototype.', (done) => { 457 | const callback = () => { 458 | globalStore.set(JSON.parse('{"__proto__":{"vuln":true}}')); 459 | first(); 460 | done(); 461 | }; 462 | 463 | const first = () => { 464 | expect((process.domain as any)[STORE_KEY]['vuln']).to.not.equal(true); 465 | expect((process.domain as any)[STORE_KEY]['__proto__']).to.equal(undefined); 466 | }; 467 | 468 | globalStore.initialize(adapter)(callback); 469 | }); 470 | 471 | it('should set properties without polluting the prototype of any property.', (done) => { 472 | const callback = () => { 473 | globalStore.set(JSON.parse('{"foo":{"__proto__":{"vuln":true}}}')); 474 | first(); 475 | done(); 476 | }; 477 | 478 | const first = () => { 479 | expect((process.domain as any)[STORE_KEY]['foo']['vuln']).to.not.equal(true); 480 | expect((process.domain as any)[STORE_KEY]['foo']['__proto__']).to.be.not.undefined; 481 | expect((process.domain as any)[STORE_KEY]['__proto__']).to.equal(undefined); 482 | }; 483 | 484 | globalStore.initialize(adapter)(callback); 485 | }); 486 | }); 487 | 488 | describe('Test Cases:', () => { 489 | it('should work with a chain of sequentially invoked callbacks (synchronous).', (done) => { 490 | const callback = () => { 491 | globalStore.set({ foo: 'foo', bar: 'bar' }); 492 | 493 | first(); 494 | second(); 495 | third(); 496 | done(); 497 | }; 498 | 499 | const first = () => { 500 | expect(globalStore.get('foo')).to.equal('foo'); 501 | }; 502 | 503 | const second = () => { 504 | expect(globalStore.get('foo')).to.equal('foo'); 505 | 506 | globalStore.set({ foo: 'Foo' }); 507 | 508 | expect(globalStore.get('foo')).to.equal('Foo'); 509 | }; 510 | 511 | const third = () => { 512 | expect(globalStore.get('foo')).to.equal('Foo'); 513 | }; 514 | 515 | globalStore.initialize(adapter)(callback); 516 | }); 517 | 518 | it('should work with chain of promises resolved.', (done) => { 519 | const doSomething = () => 520 | Promise.resolve() 521 | .then(() => { 522 | expect(globalStore.get('foo')).to.equal('bar'); 523 | }) 524 | .then(() => { 525 | expect(globalStore.get('foo')).to.equal('bar'); 526 | }) 527 | .then(() => { 528 | expect(globalStore.get('foo')).to.equal('bar'); 529 | }) 530 | .then(() => { 531 | expect(globalStore.get('foo')).to.equal('bar'); 532 | }) 533 | .then(() => { 534 | expect(globalStore.get('foo')).to.equal('bar'); 535 | }); 536 | 537 | const callback = () => { 538 | globalStore.set({ foo: 'bar', bar: 'bonk' }); 539 | 540 | doSomething().then(done); 541 | }; 542 | 543 | globalStore.initialize(adapter)(callback); 544 | }); 545 | 546 | it('should work with chain of promises (resolved or rejected).', (done) => { 547 | const doSomething = () => 548 | Promise.reject() 549 | .then(() => { 550 | expect(globalStore.get('bar')).to.equal('Bar'); 551 | }) 552 | .catch(() => { 553 | expect(globalStore.get('bar')).to.equal('Bar'); 554 | }); 555 | 556 | const callback = () => { 557 | globalStore.set({ bar: 'Bar' }); 558 | 559 | doSomething().then(done).catch(done); 560 | }; 561 | 562 | globalStore.initialize(adapter)(callback); 563 | }); 564 | 565 | it('should work with Promise.all().', (done) => { 566 | const p1 = () => 567 | Promise.resolve().then(() => { 568 | expect(globalStore.get('baz')).to.equal('Baz'); 569 | }); 570 | 571 | const p2 = () => 572 | Promise.resolve().then(() => { 573 | expect(globalStore.get('baz')).to.equal('Baz'); 574 | }); 575 | 576 | const doSomething = () => 577 | Promise.all([p1, p2]) 578 | .then(() => { 579 | expect(globalStore.get('baz')).to.equal('Baz'); 580 | }) 581 | .catch(() => { 582 | expect(globalStore.get('baz')).to.equal('Baz'); 583 | }); 584 | 585 | const callback = () => { 586 | globalStore.set({ baz: 'Baz' }); 587 | 588 | doSomething().then(done).catch(done); 589 | }; 590 | 591 | globalStore.initialize(adapter)(callback); 592 | }); 593 | 594 | it('should work with setTimeout() based async callback chains.', (done) => { 595 | const callback = () => { 596 | setTimeout(() => { 597 | globalStore.set({ foo: 'foo' }); 598 | 599 | setTimeout(() => { 600 | first(); 601 | 602 | setTimeout(() => { 603 | second(); 604 | 605 | setTimeout(() => { 606 | third(); 607 | 608 | setTimeout(() => { 609 | fourth(); 610 | 611 | setTimeout(done, 1); 612 | }, 1); 613 | }, 1); 614 | }, 1); 615 | }, 1); 616 | }, 1); 617 | }; 618 | 619 | const first = () => { 620 | expect(globalStore.get('foo')).to.equal('foo'); 621 | }; 622 | 623 | const second = () => { 624 | expect(globalStore.get('foo')).to.equal('foo'); 625 | 626 | globalStore.set({ foo: 'Foo' }); 627 | 628 | expect(globalStore.get('foo')).to.equal('Foo'); 629 | }; 630 | 631 | const third = () => { 632 | expect(globalStore.get('foo')).to.equal('Foo'); 633 | }; 634 | 635 | const fourth = () => { 636 | expect(globalStore.get('foo')).to.equal('Foo'); 637 | }; 638 | 639 | globalStore.initialize(adapter)(callback); 640 | }); 641 | 642 | it('should work with setImmediate() based async callback chains.', (done) => { 643 | const callback = () => { 644 | setImmediate(() => { 645 | globalStore.set({ foo: 'foo' }); 646 | 647 | setImmediate(() => { 648 | first(); 649 | 650 | setImmediate(() => { 651 | second(); 652 | 653 | setImmediate(() => { 654 | third(); 655 | 656 | setImmediate(done); 657 | }); 658 | }); 659 | }); 660 | }); 661 | }; 662 | 663 | const first = () => { 664 | expect(globalStore.get('foo')).to.equal('foo'); 665 | }; 666 | 667 | const second = () => { 668 | expect(globalStore.get('foo')).to.equal('foo'); 669 | 670 | globalStore.set({ foo: 'Foo' }); 671 | 672 | expect(globalStore.get('foo')).to.equal('Foo'); 673 | }; 674 | 675 | const third = () => { 676 | expect(globalStore.get('foo')).to.equal('Foo'); 677 | }; 678 | 679 | globalStore.initialize(adapter)(callback); 680 | }); 681 | 682 | it('should work with process.nextTick() based async callback chains.', (done) => { 683 | const callback = () => { 684 | process.nextTick(() => { 685 | globalStore.set({ foo: 'foo' }); 686 | 687 | process.nextTick(() => { 688 | first(); 689 | 690 | process.nextTick(() => { 691 | second(); 692 | 693 | process.nextTick(() => { 694 | third(); 695 | 696 | process.nextTick(done); 697 | }); 698 | }); 699 | }); 700 | }); 701 | }; 702 | 703 | const first = () => { 704 | expect(globalStore.get('foo')).to.equal('foo'); 705 | }; 706 | 707 | const second = () => { 708 | expect(globalStore.get('foo')).to.equal('foo'); 709 | 710 | globalStore.set({ foo: 'Foo' }); 711 | 712 | expect(globalStore.get('foo')).to.equal('Foo'); 713 | }; 714 | 715 | const third = () => { 716 | expect(globalStore.get('foo')).to.equal('Foo'); 717 | }; 718 | 719 | globalStore.initialize(adapter)(callback); 720 | }); 721 | 722 | it('should work with async and await based callbacks.', (done) => { 723 | const p1 = () => { 724 | return new Promise((resolve) => { 725 | expect(globalStore.get('foo')).to.equal('foo'); 726 | 727 | setTimeout(() => { 728 | expect(globalStore.get('foo')).to.equal('foo'); 729 | resolve(null); 730 | }, 1); 731 | }); 732 | }; 733 | 734 | const p2 = async () => { 735 | expect(globalStore.get('foo')).to.equal('foo'); 736 | }; 737 | 738 | const p3 = async () => { 739 | expect(globalStore.get('foo')).to.equal('foo'); 740 | }; 741 | 742 | const callback = async () => { 743 | globalStore.set({ foo: 'foo' }); 744 | 745 | await Promise.all([p1(), p2(), p3()]); 746 | 747 | expect(globalStore.get('foo')).to.equal('foo'); 748 | 749 | done(); 750 | }; 751 | 752 | globalStore.initialize(adapter)(callback); 753 | }); 754 | 755 | it('should work with stores in different callback contexts loaded separately (dynamic import()).', (done) => { 756 | const first = async () => { 757 | const store = await import('../src'); 758 | 759 | store.set({ foo: 'foo' }); 760 | }; 761 | 762 | const second = async () => { 763 | const store = await import('../src'); 764 | 765 | store.set({ bar: 'bar' }); 766 | 767 | expect(store.get('foo')).to.equal('foo'); 768 | expect(store.get('bar')).to.equal('bar'); 769 | }; 770 | 771 | const third = async () => { 772 | const store = await import('../src'); 773 | 774 | store.set({ tar: 'tar' }); 775 | 776 | expect(store.get('foo')).to.equal('foo'); 777 | expect(store.get('bar')).to.equal('bar'); 778 | expect(store.get('tar')).to.equal('tar'); 779 | }; 780 | 781 | const fourth = async () => { 782 | const store = await import('../src'); 783 | 784 | expect(store.get('foo')).to.equal('foo'); 785 | expect(store.get('bar')).to.equal('bar'); 786 | expect(store.get('tar')).to.equal('tar'); 787 | }; 788 | 789 | const callback = async () => { 790 | const store = await import('../src'); 791 | 792 | await first(); 793 | await second(); 794 | await third(); 795 | await fourth(); 796 | 797 | expect(store.get('foo')).to.equal('foo'); 798 | expect(store.get('bar')).to.equal('bar'); 799 | expect(store.get('tar')).to.equal('tar'); 800 | 801 | done(); 802 | }; 803 | 804 | globalStore.initialize(adapter)(callback); 805 | }); 806 | 807 | it("should work even if the store is initialized under active domain w/o affecting the existing domain's attributes.", (done) => { 808 | // Existing domain. 809 | const d = domain.create() as any; 810 | 811 | d.existingData = 'Hello world'; 812 | 813 | const callback = () => { 814 | Promise.resolve().then(first).then(second).then(third).then(done).catch(done); 815 | }; 816 | 817 | const first = () => { 818 | globalStore.set({ foo: 'foo' }); 819 | }; 820 | 821 | const second = () => { 822 | // Store should still have the data set. 823 | expect(globalStore.get('foo')).to.equal('foo'); 824 | 825 | // And the existing data in the domain before our store 826 | // was initialized should still be there. 827 | expect((process.domain as any).existingData).to.equal('Hello world'); 828 | }; 829 | 830 | const third = () => { 831 | // Ensure the same existing domain is used instead of creating a new one. 832 | expect(process.domain).to.equal(d); 833 | }; 834 | 835 | d.run(() => { 836 | // Ensure data in the existing domain is available at this point. 837 | expect((process.domain as any).existingData).to.equal('Hello world'); 838 | 839 | globalStore.initialize(adapter)(callback); 840 | }); 841 | }); 842 | 843 | it('should return the response from callback function.', (done) => { 844 | const callback = () => { 845 | globalStore.set({ foo: 'foo' }); 846 | 847 | return functionAccessingStore(); 848 | }; 849 | 850 | const functionAccessingStore = () => { 851 | return globalStore.get('foo'); 852 | }; 853 | 854 | const response = globalStore.initialize(adapter)(callback); 855 | expect(response).to.equal('foo'); 856 | 857 | done(); 858 | }); 859 | 860 | it('should return the response from async callback function.', async () => { 861 | const callback = async () => { 862 | globalStore.set({ foo: 'foo' }); 863 | 864 | functionAccessingStore(); 865 | const response = await asyncTask(); 866 | 867 | return response; 868 | }; 869 | 870 | const functionAccessingStore = () => { 871 | expect(globalStore.get('foo')).to.equal('foo'); 872 | }; 873 | 874 | const asyncTask = () => { 875 | return new Promise((resolve) => { 876 | setTimeout(() => { 877 | resolve(globalStore.get('foo')); 878 | }, 1); 879 | }); 880 | }; 881 | 882 | const response = await globalStore.initialize(adapter)(callback); 883 | expect(response).to.equal('foo'); 884 | }); 885 | }); 886 | 887 | describe('Error Handling:', () => { 888 | it('should bubble up the promise rejection from the callback.', async () => { 889 | const callback = () => { 890 | globalStore.set({ foo: 'foo' }); 891 | 892 | return new Promise((resolve, reject) => { 893 | setTimeout(() => { 894 | reject('Hello world'); 895 | }, 1); 896 | }); 897 | }; 898 | 899 | try { 900 | await globalStore.initialize(adapter)(callback); 901 | expect.fail('Should not reach here.'); 902 | } catch (e) { 903 | expect(e).to.equal('Hello world'); 904 | } 905 | }); 906 | 907 | it('should bubble up the error thrown from the callback.', (done) => { 908 | const callback = () => { 909 | globalStore.set({ foo: 'foo' }); 910 | 911 | throw new Error('Hello world'); 912 | }; 913 | 914 | try { 915 | globalStore.initialize(adapter)(callback); 916 | expect.fail('Should not reach here.'); 917 | } catch (e) { 918 | if (e instanceof Error) { 919 | expect(e.message).to.equal('Hello world'); 920 | } 921 | } 922 | 923 | done(); 924 | }); 925 | }); 926 | }); 927 | -------------------------------------------------------------------------------- /examples/node-http-server-ts/yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@leapfrogtechnology/async-store@^2.0.0": 6 | version "2.0.0" 7 | resolved "https://registry.yarnpkg.com/@leapfrogtechnology/async-store/-/async-store-2.0.0.tgz#3dd58c40eb305a7544c1c75472694328f47e1e44" 8 | integrity sha512-SGg31P3zx+vXc7fvzjica0mwtmmFcs7XhstFDarSV0HbbOWOp07exarcoje2wCVn9XOS4HKxO6p3fJZx1MeKoQ== 9 | dependencies: 10 | debug "4.3.1" 11 | ramda "0.27.1" 12 | 13 | "@sindresorhus/is@^0.14.0": 14 | version "0.14.0" 15 | resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.14.0.tgz#9fb3a3cf3132328151f353de4632e01e52102bea" 16 | integrity sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ== 17 | 18 | "@szmarczak/http-timer@^1.1.2": 19 | version "1.1.2" 20 | resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-1.1.2.tgz#b1665e2c461a2cd92f4c1bbf50d5454de0d4b421" 21 | integrity sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA== 22 | dependencies: 23 | defer-to-connect "^1.0.1" 24 | 25 | "@types/qs@^6.9.0": 26 | version "6.9.7" 27 | resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.7.tgz#63bb7d067db107cc1e457c303bc25d511febf6cb" 28 | integrity sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw== 29 | 30 | abbrev@1: 31 | version "1.1.1" 32 | resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" 33 | integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== 34 | 35 | ansi-align@^3.0.0: 36 | version "3.0.1" 37 | resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-3.0.1.tgz#0cdf12e111ace773a86e9a1fad1225c43cb19a59" 38 | integrity sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w== 39 | dependencies: 40 | string-width "^4.1.0" 41 | 42 | ansi-regex@^5.0.1: 43 | version "5.0.1" 44 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" 45 | integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== 46 | 47 | ansi-styles@^4.0.0, ansi-styles@^4.1.0: 48 | version "4.3.0" 49 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" 50 | integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== 51 | dependencies: 52 | color-convert "^2.0.1" 53 | 54 | anymatch@~3.1.2: 55 | version "3.1.2" 56 | resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716" 57 | integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg== 58 | dependencies: 59 | normalize-path "^3.0.0" 60 | picomatch "^2.0.4" 61 | 62 | balanced-match@^1.0.0: 63 | version "1.0.2" 64 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" 65 | integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== 66 | 67 | binary-extensions@^2.0.0: 68 | version "2.2.0" 69 | resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" 70 | integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== 71 | 72 | boxen@^5.0.0: 73 | version "5.1.2" 74 | resolved "https://registry.yarnpkg.com/boxen/-/boxen-5.1.2.tgz#788cb686fc83c1f486dfa8a40c68fc2b831d2b50" 75 | integrity sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ== 76 | dependencies: 77 | ansi-align "^3.0.0" 78 | camelcase "^6.2.0" 79 | chalk "^4.1.0" 80 | cli-boxes "^2.2.1" 81 | string-width "^4.2.2" 82 | type-fest "^0.20.2" 83 | widest-line "^3.1.0" 84 | wrap-ansi "^7.0.0" 85 | 86 | brace-expansion@^1.1.7: 87 | version "1.1.12" 88 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.12.tgz#ab9b454466e5a8cc3a187beaad580412a9c5b843" 89 | integrity sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg== 90 | dependencies: 91 | balanced-match "^1.0.0" 92 | concat-map "0.0.1" 93 | 94 | braces@~3.0.2: 95 | version "3.0.3" 96 | resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789" 97 | integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== 98 | dependencies: 99 | fill-range "^7.1.1" 100 | 101 | cacheable-request@^6.0.0: 102 | version "6.1.0" 103 | resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-6.1.0.tgz#20ffb8bd162ba4be11e9567d823db651052ca912" 104 | integrity sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg== 105 | dependencies: 106 | clone-response "^1.0.2" 107 | get-stream "^5.1.0" 108 | http-cache-semantics "^4.0.0" 109 | keyv "^3.0.0" 110 | lowercase-keys "^2.0.0" 111 | normalize-url "^4.1.0" 112 | responselike "^1.0.2" 113 | 114 | call-bind@^1.0.0: 115 | version "1.0.2" 116 | resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" 117 | integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== 118 | dependencies: 119 | function-bind "^1.1.1" 120 | get-intrinsic "^1.0.2" 121 | 122 | camelcase@^6.2.0: 123 | version "6.3.0" 124 | resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" 125 | integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== 126 | 127 | chalk@^4.1.0: 128 | version "4.1.2" 129 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" 130 | integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== 131 | dependencies: 132 | ansi-styles "^4.1.0" 133 | supports-color "^7.1.0" 134 | 135 | chokidar@^3.5.2: 136 | version "3.5.3" 137 | resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" 138 | integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== 139 | dependencies: 140 | anymatch "~3.1.2" 141 | braces "~3.0.2" 142 | glob-parent "~5.1.2" 143 | is-binary-path "~2.1.0" 144 | is-glob "~4.0.1" 145 | normalize-path "~3.0.0" 146 | readdirp "~3.6.0" 147 | optionalDependencies: 148 | fsevents "~2.3.2" 149 | 150 | ci-info@^2.0.0: 151 | version "2.0.0" 152 | resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" 153 | integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== 154 | 155 | cli-boxes@^2.2.1: 156 | version "2.2.1" 157 | resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-2.2.1.tgz#ddd5035d25094fce220e9cab40a45840a440318f" 158 | integrity sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw== 159 | 160 | clone-response@^1.0.2: 161 | version "1.0.2" 162 | resolved "https://registry.yarnpkg.com/clone-response/-/clone-response-1.0.2.tgz#d1dc973920314df67fbeb94223b4ee350239e96b" 163 | integrity sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws= 164 | dependencies: 165 | mimic-response "^1.0.0" 166 | 167 | color-convert@^2.0.1: 168 | version "2.0.1" 169 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" 170 | integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== 171 | dependencies: 172 | color-name "~1.1.4" 173 | 174 | color-name@~1.1.4: 175 | version "1.1.4" 176 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" 177 | integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== 178 | 179 | concat-map@0.0.1: 180 | version "0.0.1" 181 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 182 | integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== 183 | 184 | configstore@^5.0.1: 185 | version "5.0.1" 186 | resolved "https://registry.yarnpkg.com/configstore/-/configstore-5.0.1.tgz#d365021b5df4b98cdd187d6a3b0e3f6a7cc5ed96" 187 | integrity sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA== 188 | dependencies: 189 | dot-prop "^5.2.0" 190 | graceful-fs "^4.1.2" 191 | make-dir "^3.0.0" 192 | unique-string "^2.0.0" 193 | write-file-atomic "^3.0.0" 194 | xdg-basedir "^4.0.0" 195 | 196 | crypto-random-string@^2.0.0: 197 | version "2.0.0" 198 | resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-2.0.0.tgz#ef2a7a966ec11083388369baa02ebead229b30d5" 199 | integrity sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA== 200 | 201 | debug@4.3.1: 202 | version "4.3.1" 203 | resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.1.tgz#f0d229c505e0c6d8c49ac553d1b13dc183f6b2ee" 204 | integrity sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ== 205 | dependencies: 206 | ms "2.1.2" 207 | 208 | debug@^3.2.7: 209 | version "3.2.7" 210 | resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" 211 | integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== 212 | dependencies: 213 | ms "^2.1.1" 214 | 215 | decompress-response@^3.3.0: 216 | version "3.3.0" 217 | resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-3.3.0.tgz#80a4dd323748384bfa248083622aedec982adff3" 218 | integrity sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M= 219 | dependencies: 220 | mimic-response "^1.0.0" 221 | 222 | deep-extend@^0.6.0: 223 | version "0.6.0" 224 | resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" 225 | integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== 226 | 227 | defer-to-connect@^1.0.1: 228 | version "1.1.3" 229 | resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-1.1.3.tgz#331ae050c08dcf789f8c83a7b81f0ed94f4ac591" 230 | integrity sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ== 231 | 232 | dot-prop@^5.2.0: 233 | version "5.3.0" 234 | resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-5.3.0.tgz#90ccce708cd9cd82cc4dc8c3ddd9abdd55b20e88" 235 | integrity sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q== 236 | dependencies: 237 | is-obj "^2.0.0" 238 | 239 | duplexer3@^0.1.4: 240 | version "0.1.4" 241 | resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2" 242 | integrity sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI= 243 | 244 | emoji-regex@^8.0.0: 245 | version "8.0.0" 246 | resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" 247 | integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== 248 | 249 | end-of-stream@^1.1.0: 250 | version "1.4.4" 251 | resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" 252 | integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== 253 | dependencies: 254 | once "^1.4.0" 255 | 256 | escape-goat@^2.0.0: 257 | version "2.1.1" 258 | resolved "https://registry.yarnpkg.com/escape-goat/-/escape-goat-2.1.1.tgz#1b2dc77003676c457ec760b2dc68edb648188675" 259 | integrity sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q== 260 | 261 | fill-range@^7.1.1: 262 | version "7.1.1" 263 | resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292" 264 | integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== 265 | dependencies: 266 | to-regex-range "^5.0.1" 267 | 268 | fsevents@~2.3.2: 269 | version "2.3.2" 270 | resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" 271 | integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== 272 | 273 | function-bind@^1.1.1: 274 | version "1.1.1" 275 | resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" 276 | integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== 277 | 278 | get-intrinsic@^1.0.2: 279 | version "1.1.1" 280 | resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.1.tgz#15f59f376f855c446963948f0d24cd3637b4abc6" 281 | integrity sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q== 282 | dependencies: 283 | function-bind "^1.1.1" 284 | has "^1.0.3" 285 | has-symbols "^1.0.1" 286 | 287 | get-stream@^4.1.0: 288 | version "4.1.0" 289 | resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" 290 | integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== 291 | dependencies: 292 | pump "^3.0.0" 293 | 294 | get-stream@^5.1.0: 295 | version "5.2.0" 296 | resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3" 297 | integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== 298 | dependencies: 299 | pump "^3.0.0" 300 | 301 | glob-parent@~5.1.2: 302 | version "5.1.2" 303 | resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" 304 | integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== 305 | dependencies: 306 | is-glob "^4.0.1" 307 | 308 | global-dirs@^3.0.0: 309 | version "3.0.0" 310 | resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-3.0.0.tgz#70a76fe84ea315ab37b1f5576cbde7d48ef72686" 311 | integrity sha512-v8ho2DS5RiCjftj1nD9NmnfaOzTdud7RRnVd9kFNOjqZbISlx5DQ+OrTkywgd0dIt7oFCvKetZSHoHcP3sDdiA== 312 | dependencies: 313 | ini "2.0.0" 314 | 315 | got@^9.6.0: 316 | version "9.6.0" 317 | resolved "https://registry.yarnpkg.com/got/-/got-9.6.0.tgz#edf45e7d67f99545705de1f7bbeeeb121765ed85" 318 | integrity sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q== 319 | dependencies: 320 | "@sindresorhus/is" "^0.14.0" 321 | "@szmarczak/http-timer" "^1.1.2" 322 | cacheable-request "^6.0.0" 323 | decompress-response "^3.3.0" 324 | duplexer3 "^0.1.4" 325 | get-stream "^4.1.0" 326 | lowercase-keys "^1.0.1" 327 | mimic-response "^1.0.1" 328 | p-cancelable "^1.0.0" 329 | to-readable-stream "^1.0.0" 330 | url-parse-lax "^3.0.0" 331 | 332 | graceful-fs@^4.1.2: 333 | version "4.2.9" 334 | resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.9.tgz#041b05df45755e587a24942279b9d113146e1c96" 335 | integrity sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ== 336 | 337 | has-flag@^3.0.0: 338 | version "3.0.0" 339 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" 340 | integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= 341 | 342 | has-flag@^4.0.0: 343 | version "4.0.0" 344 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" 345 | integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== 346 | 347 | has-symbols@^1.0.1: 348 | version "1.0.2" 349 | resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.2.tgz#165d3070c00309752a1236a479331e3ac56f1423" 350 | integrity sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw== 351 | 352 | has-yarn@^2.1.0: 353 | version "2.1.0" 354 | resolved "https://registry.yarnpkg.com/has-yarn/-/has-yarn-2.1.0.tgz#137e11354a7b5bf11aa5cb649cf0c6f3ff2b2e77" 355 | integrity sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw== 356 | 357 | has@^1.0.3: 358 | version "1.0.3" 359 | resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" 360 | integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== 361 | dependencies: 362 | function-bind "^1.1.1" 363 | 364 | http-cache-semantics@^4.0.0: 365 | version "4.1.1" 366 | resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz#abe02fcb2985460bf0323be664436ec3476a6d5a" 367 | integrity sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ== 368 | 369 | ignore-by-default@^1.0.1: 370 | version "1.0.1" 371 | resolved "https://registry.yarnpkg.com/ignore-by-default/-/ignore-by-default-1.0.1.tgz#48ca6d72f6c6a3af00a9ad4ae6876be3889e2b09" 372 | integrity sha1-SMptcvbGo68Aqa1K5odr44ieKwk= 373 | 374 | import-lazy@^2.1.0: 375 | version "2.1.0" 376 | resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-2.1.0.tgz#05698e3d45c88e8d7e9d92cb0584e77f096f3e43" 377 | integrity sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM= 378 | 379 | imurmurhash@^0.1.4: 380 | version "0.1.4" 381 | resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" 382 | integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= 383 | 384 | ini@2.0.0: 385 | version "2.0.0" 386 | resolved "https://registry.yarnpkg.com/ini/-/ini-2.0.0.tgz#e5fd556ecdd5726be978fa1001862eacb0a94bc5" 387 | integrity sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA== 388 | 389 | ini@~1.3.0: 390 | version "1.3.8" 391 | resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" 392 | integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== 393 | 394 | is-binary-path@~2.1.0: 395 | version "2.1.0" 396 | resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" 397 | integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== 398 | dependencies: 399 | binary-extensions "^2.0.0" 400 | 401 | is-ci@^2.0.0: 402 | version "2.0.0" 403 | resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-2.0.0.tgz#6bc6334181810e04b5c22b3d589fdca55026404c" 404 | integrity sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w== 405 | dependencies: 406 | ci-info "^2.0.0" 407 | 408 | is-extglob@^2.1.1: 409 | version "2.1.1" 410 | resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" 411 | integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= 412 | 413 | is-fullwidth-code-point@^3.0.0: 414 | version "3.0.0" 415 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" 416 | integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== 417 | 418 | is-glob@^4.0.1, is-glob@~4.0.1: 419 | version "4.0.3" 420 | resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" 421 | integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== 422 | dependencies: 423 | is-extglob "^2.1.1" 424 | 425 | is-installed-globally@^0.4.0: 426 | version "0.4.0" 427 | resolved "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-0.4.0.tgz#9a0fd407949c30f86eb6959ef1b7994ed0b7b520" 428 | integrity sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ== 429 | dependencies: 430 | global-dirs "^3.0.0" 431 | is-path-inside "^3.0.2" 432 | 433 | is-npm@^5.0.0: 434 | version "5.0.0" 435 | resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-5.0.0.tgz#43e8d65cc56e1b67f8d47262cf667099193f45a8" 436 | integrity sha512-WW/rQLOazUq+ST/bCAVBp/2oMERWLsR7OrKyt052dNDk4DHcDE0/7QSXITlmi+VBcV13DfIbysG3tZJm5RfdBA== 437 | 438 | is-number@^7.0.0: 439 | version "7.0.0" 440 | resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" 441 | integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== 442 | 443 | is-obj@^2.0.0: 444 | version "2.0.0" 445 | resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-2.0.0.tgz#473fb05d973705e3fd9620545018ca8e22ef4982" 446 | integrity sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w== 447 | 448 | is-path-inside@^3.0.2: 449 | version "3.0.3" 450 | resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" 451 | integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== 452 | 453 | is-typedarray@^1.0.0: 454 | version "1.0.0" 455 | resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" 456 | integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= 457 | 458 | is-yarn-global@^0.3.0: 459 | version "0.3.0" 460 | resolved "https://registry.yarnpkg.com/is-yarn-global/-/is-yarn-global-0.3.0.tgz#d502d3382590ea3004893746754c89139973e232" 461 | integrity sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw== 462 | 463 | json-buffer@3.0.0: 464 | version "3.0.0" 465 | resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.0.tgz#5b1f397afc75d677bde8bcfc0e47e1f9a3d9a898" 466 | integrity sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg= 467 | 468 | keyv@^3.0.0: 469 | version "3.1.0" 470 | resolved "https://registry.yarnpkg.com/keyv/-/keyv-3.1.0.tgz#ecc228486f69991e49e9476485a5be1e8fc5c4d9" 471 | integrity sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA== 472 | dependencies: 473 | json-buffer "3.0.0" 474 | 475 | latest-version@^5.1.0: 476 | version "5.1.0" 477 | resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-5.1.0.tgz#119dfe908fe38d15dfa43ecd13fa12ec8832face" 478 | integrity sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA== 479 | dependencies: 480 | package-json "^6.3.0" 481 | 482 | lowercase-keys@^1.0.0, lowercase-keys@^1.0.1: 483 | version "1.0.1" 484 | resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f" 485 | integrity sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA== 486 | 487 | lowercase-keys@^2.0.0: 488 | version "2.0.0" 489 | resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-2.0.0.tgz#2603e78b7b4b0006cbca2fbcc8a3202558ac9479" 490 | integrity sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA== 491 | 492 | lru-cache@^6.0.0: 493 | version "6.0.0" 494 | resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" 495 | integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== 496 | dependencies: 497 | yallist "^4.0.0" 498 | 499 | make-dir@^3.0.0: 500 | version "3.1.0" 501 | resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" 502 | integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== 503 | dependencies: 504 | semver "^6.0.0" 505 | 506 | mimic-response@^1.0.0, mimic-response@^1.0.1: 507 | version "1.0.1" 508 | resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b" 509 | integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ== 510 | 511 | minimatch@^3.0.4: 512 | version "3.1.2" 513 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" 514 | integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== 515 | dependencies: 516 | brace-expansion "^1.1.7" 517 | 518 | minimist@^1.2.0: 519 | version "1.2.6" 520 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.6.tgz#8637a5b759ea0d6e98702cfb3a9283323c93af44" 521 | integrity sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q== 522 | 523 | ms@2.1.2: 524 | version "2.1.2" 525 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" 526 | integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== 527 | 528 | ms@^2.1.1: 529 | version "2.1.3" 530 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" 531 | integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== 532 | 533 | nodemon@^2.0.15: 534 | version "2.0.15" 535 | resolved "https://registry.yarnpkg.com/nodemon/-/nodemon-2.0.15.tgz#504516ce3b43d9dc9a955ccd9ec57550a31a8d4e" 536 | integrity sha512-gdHMNx47Gw7b3kWxJV64NI+Q5nfl0y5DgDbiVtShiwa7Z0IZ07Ll4RLFo6AjrhzMtoEZn5PDE3/c2AbVsiCkpA== 537 | dependencies: 538 | chokidar "^3.5.2" 539 | debug "^3.2.7" 540 | ignore-by-default "^1.0.1" 541 | minimatch "^3.0.4" 542 | pstree.remy "^1.1.8" 543 | semver "^5.7.1" 544 | supports-color "^5.5.0" 545 | touch "^3.1.0" 546 | undefsafe "^2.0.5" 547 | update-notifier "^5.1.0" 548 | 549 | nopt@~1.0.10: 550 | version "1.0.10" 551 | resolved "https://registry.yarnpkg.com/nopt/-/nopt-1.0.10.tgz#6ddd21bd2a31417b92727dd585f8a6f37608ebee" 552 | integrity sha1-bd0hvSoxQXuScn3Vhfim83YI6+4= 553 | dependencies: 554 | abbrev "1" 555 | 556 | normalize-path@^3.0.0, normalize-path@~3.0.0: 557 | version "3.0.0" 558 | resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" 559 | integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== 560 | 561 | normalize-url@^4.1.0: 562 | version "4.5.1" 563 | resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-4.5.1.tgz#0dd90cf1288ee1d1313b87081c9a5932ee48518a" 564 | integrity sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA== 565 | 566 | object-inspect@^1.9.0: 567 | version "1.12.0" 568 | resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.0.tgz#6e2c120e868fd1fd18cb4f18c31741d0d6e776f0" 569 | integrity sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g== 570 | 571 | once@^1.3.1, once@^1.4.0: 572 | version "1.4.0" 573 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 574 | integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= 575 | dependencies: 576 | wrappy "1" 577 | 578 | p-cancelable@^1.0.0: 579 | version "1.1.0" 580 | resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-1.1.0.tgz#d078d15a3af409220c886f1d9a0ca2e441ab26cc" 581 | integrity sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw== 582 | 583 | package-json@^6.3.0: 584 | version "6.5.0" 585 | resolved "https://registry.yarnpkg.com/package-json/-/package-json-6.5.0.tgz#6feedaca35e75725876d0b0e64974697fed145b0" 586 | integrity sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ== 587 | dependencies: 588 | got "^9.6.0" 589 | registry-auth-token "^4.0.0" 590 | registry-url "^5.0.0" 591 | semver "^6.2.0" 592 | 593 | picomatch@^2.0.4, picomatch@^2.2.1: 594 | version "2.3.1" 595 | resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" 596 | integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== 597 | 598 | prepend-http@^2.0.0: 599 | version "2.0.0" 600 | resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-2.0.0.tgz#e92434bfa5ea8c19f41cdfd401d741a3c819d897" 601 | integrity sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc= 602 | 603 | pstree.remy@^1.1.8: 604 | version "1.1.8" 605 | resolved "https://registry.yarnpkg.com/pstree.remy/-/pstree.remy-1.1.8.tgz#c242224f4a67c21f686839bbdb4ac282b8373d3a" 606 | integrity sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w== 607 | 608 | pump@^3.0.0: 609 | version "3.0.0" 610 | resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" 611 | integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== 612 | dependencies: 613 | end-of-stream "^1.1.0" 614 | once "^1.3.1" 615 | 616 | pupa@^2.1.1: 617 | version "2.1.1" 618 | resolved "https://registry.yarnpkg.com/pupa/-/pupa-2.1.1.tgz#f5e8fd4afc2c5d97828faa523549ed8744a20d62" 619 | integrity sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A== 620 | dependencies: 621 | escape-goat "^2.0.0" 622 | 623 | qs@^6.9.1: 624 | version "6.10.3" 625 | resolved "https://registry.yarnpkg.com/qs/-/qs-6.10.3.tgz#d6cde1b2ffca87b5aa57889816c5f81535e22e8e" 626 | integrity sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ== 627 | dependencies: 628 | side-channel "^1.0.4" 629 | 630 | ramda@0.27.1: 631 | version "0.27.1" 632 | resolved "https://registry.yarnpkg.com/ramda/-/ramda-0.27.1.tgz#66fc2df3ef873874ffc2da6aa8984658abacf5c9" 633 | integrity sha512-PgIdVpn5y5Yns8vqb8FzBUEYn98V3xcPgawAkkgj0YJ0qDsnHCiNmZYfOGMgOvoB0eWFLpYbhxUR3mxfDIMvpw== 634 | 635 | rc@^1.2.8: 636 | version "1.2.8" 637 | resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" 638 | integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== 639 | dependencies: 640 | deep-extend "^0.6.0" 641 | ini "~1.3.0" 642 | minimist "^1.2.0" 643 | strip-json-comments "~2.0.1" 644 | 645 | readdirp@~3.6.0: 646 | version "3.6.0" 647 | resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" 648 | integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== 649 | dependencies: 650 | picomatch "^2.2.1" 651 | 652 | registry-auth-token@^4.0.0: 653 | version "4.2.1" 654 | resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-4.2.1.tgz#6d7b4006441918972ccd5fedcd41dc322c79b250" 655 | integrity sha512-6gkSb4U6aWJB4SF2ZvLb76yCBjcvufXBqvvEx1HbmKPkutswjW1xNVRY0+daljIYRbogN7O0etYSlbiaEQyMyw== 656 | dependencies: 657 | rc "^1.2.8" 658 | 659 | registry-url@^5.0.0: 660 | version "5.1.0" 661 | resolved "https://registry.yarnpkg.com/registry-url/-/registry-url-5.1.0.tgz#e98334b50d5434b81136b44ec638d9c2009c5009" 662 | integrity sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw== 663 | dependencies: 664 | rc "^1.2.8" 665 | 666 | responselike@^1.0.2: 667 | version "1.0.2" 668 | resolved "https://registry.yarnpkg.com/responselike/-/responselike-1.0.2.tgz#918720ef3b631c5642be068f15ade5a46f4ba1e7" 669 | integrity sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec= 670 | dependencies: 671 | lowercase-keys "^1.0.0" 672 | 673 | semver-diff@^3.1.1: 674 | version "3.1.1" 675 | resolved "https://registry.yarnpkg.com/semver-diff/-/semver-diff-3.1.1.tgz#05f77ce59f325e00e2706afd67bb506ddb1ca32b" 676 | integrity sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg== 677 | dependencies: 678 | semver "^6.3.0" 679 | 680 | semver@^5.7.1: 681 | version "5.7.2" 682 | resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.2.tgz#48d55db737c3287cd4835e17fa13feace1c41ef8" 683 | integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== 684 | 685 | semver@^6.0.0, semver@^6.2.0, semver@^6.3.0: 686 | version "6.3.1" 687 | resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" 688 | integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== 689 | 690 | semver@^7.3.4: 691 | version "7.5.4" 692 | resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e" 693 | integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== 694 | dependencies: 695 | lru-cache "^6.0.0" 696 | 697 | side-channel@^1.0.4: 698 | version "1.0.4" 699 | resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" 700 | integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== 701 | dependencies: 702 | call-bind "^1.0.0" 703 | get-intrinsic "^1.0.2" 704 | object-inspect "^1.9.0" 705 | 706 | signal-exit@^3.0.2: 707 | version "3.0.6" 708 | resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.6.tgz#24e630c4b0f03fea446a2bd299e62b4a6ca8d0af" 709 | integrity sha512-sDl4qMFpijcGw22U5w63KmD3cZJfBuFlVNbVMKje2keoKML7X2UzWbc4XrmEbDwg0NXJc3yv4/ox7b+JWb57kQ== 710 | 711 | string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.2: 712 | version "4.2.3" 713 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" 714 | integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== 715 | dependencies: 716 | emoji-regex "^8.0.0" 717 | is-fullwidth-code-point "^3.0.0" 718 | strip-ansi "^6.0.1" 719 | 720 | strip-ansi@^6.0.0, strip-ansi@^6.0.1: 721 | version "6.0.1" 722 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" 723 | integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== 724 | dependencies: 725 | ansi-regex "^5.0.1" 726 | 727 | strip-json-comments@~2.0.1: 728 | version "2.0.1" 729 | resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" 730 | integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= 731 | 732 | supports-color@^5.5.0: 733 | version "5.5.0" 734 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" 735 | integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== 736 | dependencies: 737 | has-flag "^3.0.0" 738 | 739 | supports-color@^7.1.0: 740 | version "7.2.0" 741 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" 742 | integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== 743 | dependencies: 744 | has-flag "^4.0.0" 745 | 746 | to-readable-stream@^1.0.0: 747 | version "1.0.0" 748 | resolved "https://registry.yarnpkg.com/to-readable-stream/-/to-readable-stream-1.0.0.tgz#ce0aa0c2f3df6adf852efb404a783e77c0475771" 749 | integrity sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q== 750 | 751 | to-regex-range@^5.0.1: 752 | version "5.0.1" 753 | resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" 754 | integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== 755 | dependencies: 756 | is-number "^7.0.0" 757 | 758 | touch@^3.1.0: 759 | version "3.1.0" 760 | resolved "https://registry.yarnpkg.com/touch/-/touch-3.1.0.tgz#fe365f5f75ec9ed4e56825e0bb76d24ab74af83b" 761 | integrity sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA== 762 | dependencies: 763 | nopt "~1.0.10" 764 | 765 | type-fest@^0.20.2: 766 | version "0.20.2" 767 | resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" 768 | integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== 769 | 770 | typedarray-to-buffer@^3.1.5: 771 | version "3.1.5" 772 | resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" 773 | integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q== 774 | dependencies: 775 | is-typedarray "^1.0.0" 776 | 777 | typescript@^3.7.2: 778 | version "3.9.10" 779 | resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.9.10.tgz#70f3910ac7a51ed6bef79da7800690b19bf778b8" 780 | integrity sha512-w6fIxVE/H1PkLKcCPsFqKE7Kv7QUwhU8qQY2MueZXWx5cPZdwFupLgKK3vntcK98BtNHZtAF4LA/yl2a7k8R6Q== 781 | 782 | undefsafe@^2.0.5: 783 | version "2.0.5" 784 | resolved "https://registry.yarnpkg.com/undefsafe/-/undefsafe-2.0.5.tgz#38733b9327bdcd226db889fb723a6efd162e6e2c" 785 | integrity sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA== 786 | 787 | unique-string@^2.0.0: 788 | version "2.0.0" 789 | resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-2.0.0.tgz#39c6451f81afb2749de2b233e3f7c5e8843bd89d" 790 | integrity sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg== 791 | dependencies: 792 | crypto-random-string "^2.0.0" 793 | 794 | update-notifier@^5.1.0: 795 | version "5.1.0" 796 | resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-5.1.0.tgz#4ab0d7c7f36a231dd7316cf7729313f0214d9ad9" 797 | integrity sha512-ItnICHbeMh9GqUy31hFPrD1kcuZ3rpxDZbf4KUDavXwS0bW5m7SLbDQpGX3UYr072cbrF5hFUs3r5tUsPwjfHw== 798 | dependencies: 799 | boxen "^5.0.0" 800 | chalk "^4.1.0" 801 | configstore "^5.0.1" 802 | has-yarn "^2.1.0" 803 | import-lazy "^2.1.0" 804 | is-ci "^2.0.0" 805 | is-installed-globally "^0.4.0" 806 | is-npm "^5.0.0" 807 | is-yarn-global "^0.3.0" 808 | latest-version "^5.1.0" 809 | pupa "^2.1.1" 810 | semver "^7.3.4" 811 | semver-diff "^3.1.1" 812 | xdg-basedir "^4.0.0" 813 | 814 | url-parse-lax@^3.0.0: 815 | version "3.0.0" 816 | resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-3.0.0.tgz#16b5cafc07dbe3676c1b1999177823d6503acb0c" 817 | integrity sha1-FrXK/Afb42dsGxmZF3gj1lA6yww= 818 | dependencies: 819 | prepend-http "^2.0.0" 820 | 821 | widest-line@^3.1.0: 822 | version "3.1.0" 823 | resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-3.1.0.tgz#8292333bbf66cb45ff0de1603b136b7ae1496eca" 824 | integrity sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg== 825 | dependencies: 826 | string-width "^4.0.0" 827 | 828 | wrap-ansi@^7.0.0: 829 | version "7.0.0" 830 | resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" 831 | integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== 832 | dependencies: 833 | ansi-styles "^4.0.0" 834 | string-width "^4.1.0" 835 | strip-ansi "^6.0.0" 836 | 837 | wrappy@1: 838 | version "1.0.2" 839 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 840 | integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= 841 | 842 | write-file-atomic@^3.0.0: 843 | version "3.0.3" 844 | resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-3.0.3.tgz#56bd5c5a5c70481cd19c571bd39ab965a5de56e8" 845 | integrity sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q== 846 | dependencies: 847 | imurmurhash "^0.1.4" 848 | is-typedarray "^1.0.0" 849 | signal-exit "^3.0.2" 850 | typedarray-to-buffer "^3.1.5" 851 | 852 | xdg-basedir@^4.0.0: 853 | version "4.0.0" 854 | resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-4.0.0.tgz#4bc8d9984403696225ef83a1573cbbcb4e79db13" 855 | integrity sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q== 856 | 857 | yallist@^4.0.0: 858 | version "4.0.0" 859 | resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" 860 | integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== 861 | -------------------------------------------------------------------------------- /examples/fastify-http-server-ts/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 | "@leapfrogtechnology/async-store@^2.0.0": 18 | version "2.0.0" 19 | resolved "https://registry.yarnpkg.com/@leapfrogtechnology/async-store/-/async-store-2.0.0.tgz#3dd58c40eb305a7544c1c75472694328f47e1e44" 20 | integrity sha512-SGg31P3zx+vXc7fvzjica0mwtmmFcs7XhstFDarSV0HbbOWOp07exarcoje2wCVn9XOS4HKxO6p3fJZx1MeKoQ== 21 | dependencies: 22 | debug "4.3.1" 23 | ramda "0.27.1" 24 | 25 | "@sindresorhus/is@^0.14.0": 26 | version "0.14.0" 27 | resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.14.0.tgz#9fb3a3cf3132328151f353de4632e01e52102bea" 28 | integrity sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ== 29 | 30 | "@szmarczak/http-timer@^1.1.2": 31 | version "1.1.2" 32 | resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-1.1.2.tgz#b1665e2c461a2cd92f4c1bbf50d5454de0d4b421" 33 | integrity sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA== 34 | dependencies: 35 | defer-to-connect "^1.0.1" 36 | 37 | abbrev@1: 38 | version "1.1.1" 39 | resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" 40 | integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== 41 | 42 | abstract-logging@^2.0.0: 43 | version "2.0.1" 44 | resolved "https://registry.yarnpkg.com/abstract-logging/-/abstract-logging-2.0.1.tgz#6b0c371df212db7129b57d2e7fcf282b8bf1c839" 45 | integrity sha512-2BjRTZxTPvheOvGbBslFSYOUkr+SjPtOnrLP33f+VIWLzezQpZcqVg7ja3L4dBXmzzgwT+a029jRx5PCi3JuiA== 46 | 47 | ajv@^6.11.0, ajv@^6.12.6: 48 | version "6.12.6" 49 | resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" 50 | integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== 51 | dependencies: 52 | fast-deep-equal "^3.1.1" 53 | fast-json-stable-stringify "^2.0.0" 54 | json-schema-traverse "^0.4.1" 55 | uri-js "^4.2.2" 56 | 57 | ajv@^8.1.0: 58 | version "8.8.2" 59 | resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.8.2.tgz#01b4fef2007a28bf75f0b7fc009f62679de4abbb" 60 | integrity sha512-x9VuX+R/jcFj1DHo/fCp99esgGDWiHENrKxaCENuCxpoMCmAt/COCGVDwA7kleEpEzJjDnvh3yGoOuLu0Dtllw== 61 | dependencies: 62 | fast-deep-equal "^3.1.1" 63 | json-schema-traverse "^1.0.0" 64 | require-from-string "^2.0.2" 65 | uri-js "^4.2.2" 66 | 67 | ansi-align@^3.0.0: 68 | version "3.0.1" 69 | resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-3.0.1.tgz#0cdf12e111ace773a86e9a1fad1225c43cb19a59" 70 | integrity sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w== 71 | dependencies: 72 | string-width "^4.1.0" 73 | 74 | ansi-regex@^5.0.1: 75 | version "5.0.1" 76 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" 77 | integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== 78 | 79 | ansi-styles@^4.0.0, ansi-styles@^4.1.0: 80 | version "4.3.0" 81 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" 82 | integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== 83 | dependencies: 84 | color-convert "^2.0.1" 85 | 86 | anymatch@~3.1.2: 87 | version "3.1.2" 88 | resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716" 89 | integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg== 90 | dependencies: 91 | normalize-path "^3.0.0" 92 | picomatch "^2.0.4" 93 | 94 | archy@^1.0.0: 95 | version "1.0.0" 96 | resolved "https://registry.yarnpkg.com/archy/-/archy-1.0.0.tgz#f9c8c13757cc1dd7bc379ac77b2c62a5c2868c40" 97 | integrity sha1-+cjBN1fMHde8N5rHeyxipcKGjEA= 98 | 99 | atomic-sleep@^1.0.0: 100 | version "1.0.0" 101 | resolved "https://registry.yarnpkg.com/atomic-sleep/-/atomic-sleep-1.0.0.tgz#eb85b77a601fc932cfe432c5acd364a9e2c9075b" 102 | integrity sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ== 103 | 104 | avvio@^7.1.2: 105 | version "7.2.2" 106 | resolved "https://registry.yarnpkg.com/avvio/-/avvio-7.2.2.tgz#58e00e7968870026cd7b7d4f689d596db629e251" 107 | integrity sha512-XW2CMCmZaCmCCsIaJaLKxAzPwF37fXi1KGxNOvedOpeisLdmxZnblGc3hpHWYnlP+KOUxZsazh43WXNHgXpbqw== 108 | dependencies: 109 | archy "^1.0.0" 110 | debug "^4.0.0" 111 | fastq "^1.6.1" 112 | queue-microtask "^1.1.2" 113 | 114 | balanced-match@^1.0.0: 115 | version "1.0.2" 116 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" 117 | integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== 118 | 119 | binary-extensions@^2.0.0: 120 | version "2.2.0" 121 | resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" 122 | integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== 123 | 124 | boxen@^5.0.0: 125 | version "5.1.2" 126 | resolved "https://registry.yarnpkg.com/boxen/-/boxen-5.1.2.tgz#788cb686fc83c1f486dfa8a40c68fc2b831d2b50" 127 | integrity sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ== 128 | dependencies: 129 | ansi-align "^3.0.0" 130 | camelcase "^6.2.0" 131 | chalk "^4.1.0" 132 | cli-boxes "^2.2.1" 133 | string-width "^4.2.2" 134 | type-fest "^0.20.2" 135 | widest-line "^3.1.0" 136 | wrap-ansi "^7.0.0" 137 | 138 | brace-expansion@^1.1.7: 139 | version "1.1.12" 140 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.12.tgz#ab9b454466e5a8cc3a187beaad580412a9c5b843" 141 | integrity sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg== 142 | dependencies: 143 | balanced-match "^1.0.0" 144 | concat-map "0.0.1" 145 | 146 | braces@~3.0.2: 147 | version "3.0.3" 148 | resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789" 149 | integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== 150 | dependencies: 151 | fill-range "^7.1.1" 152 | 153 | cacheable-request@^6.0.0: 154 | version "6.1.0" 155 | resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-6.1.0.tgz#20ffb8bd162ba4be11e9567d823db651052ca912" 156 | integrity sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg== 157 | dependencies: 158 | clone-response "^1.0.2" 159 | get-stream "^5.1.0" 160 | http-cache-semantics "^4.0.0" 161 | keyv "^3.0.0" 162 | lowercase-keys "^2.0.0" 163 | normalize-url "^4.1.0" 164 | responselike "^1.0.2" 165 | 166 | camelcase@^6.2.0: 167 | version "6.3.0" 168 | resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" 169 | integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== 170 | 171 | chalk@^4.1.0: 172 | version "4.1.2" 173 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" 174 | integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== 175 | dependencies: 176 | ansi-styles "^4.1.0" 177 | supports-color "^7.1.0" 178 | 179 | chokidar@^3.5.2: 180 | version "3.5.2" 181 | resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.2.tgz#dba3976fcadb016f66fd365021d91600d01c1e75" 182 | integrity sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ== 183 | dependencies: 184 | anymatch "~3.1.2" 185 | braces "~3.0.2" 186 | glob-parent "~5.1.2" 187 | is-binary-path "~2.1.0" 188 | is-glob "~4.0.1" 189 | normalize-path "~3.0.0" 190 | readdirp "~3.6.0" 191 | optionalDependencies: 192 | fsevents "~2.3.2" 193 | 194 | ci-info@^2.0.0: 195 | version "2.0.0" 196 | resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" 197 | integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== 198 | 199 | cli-boxes@^2.2.1: 200 | version "2.2.1" 201 | resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-2.2.1.tgz#ddd5035d25094fce220e9cab40a45840a440318f" 202 | integrity sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw== 203 | 204 | clone-response@^1.0.2: 205 | version "1.0.2" 206 | resolved "https://registry.yarnpkg.com/clone-response/-/clone-response-1.0.2.tgz#d1dc973920314df67fbeb94223b4ee350239e96b" 207 | integrity sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws= 208 | dependencies: 209 | mimic-response "^1.0.0" 210 | 211 | color-convert@^2.0.1: 212 | version "2.0.1" 213 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" 214 | integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== 215 | dependencies: 216 | color-name "~1.1.4" 217 | 218 | color-name@~1.1.4: 219 | version "1.1.4" 220 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" 221 | integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== 222 | 223 | concat-map@0.0.1: 224 | version "0.0.1" 225 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 226 | integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== 227 | 228 | configstore@^5.0.1: 229 | version "5.0.1" 230 | resolved "https://registry.yarnpkg.com/configstore/-/configstore-5.0.1.tgz#d365021b5df4b98cdd187d6a3b0e3f6a7cc5ed96" 231 | integrity sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA== 232 | dependencies: 233 | dot-prop "^5.2.0" 234 | graceful-fs "^4.1.2" 235 | make-dir "^3.0.0" 236 | unique-string "^2.0.0" 237 | write-file-atomic "^3.0.0" 238 | xdg-basedir "^4.0.0" 239 | 240 | content-type@^1.0.4: 241 | version "1.0.4" 242 | resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" 243 | integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== 244 | 245 | cookie@^0.4.0: 246 | version "0.4.1" 247 | resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.1.tgz#afd713fe26ebd21ba95ceb61f9a8116e50a537d1" 248 | integrity sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA== 249 | 250 | crypto-random-string@^2.0.0: 251 | version "2.0.0" 252 | resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-2.0.0.tgz#ef2a7a966ec11083388369baa02ebead229b30d5" 253 | integrity sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA== 254 | 255 | debug@4.3.1: 256 | version "4.3.1" 257 | resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.1.tgz#f0d229c505e0c6d8c49ac553d1b13dc183f6b2ee" 258 | integrity sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ== 259 | dependencies: 260 | ms "2.1.2" 261 | 262 | debug@^3.2.7: 263 | version "3.2.7" 264 | resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" 265 | integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== 266 | dependencies: 267 | ms "^2.1.1" 268 | 269 | debug@^4.0.0: 270 | version "4.3.3" 271 | resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.3.tgz#04266e0b70a98d4462e6e288e38259213332b664" 272 | integrity sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q== 273 | dependencies: 274 | ms "2.1.2" 275 | 276 | decompress-response@^3.3.0: 277 | version "3.3.0" 278 | resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-3.3.0.tgz#80a4dd323748384bfa248083622aedec982adff3" 279 | integrity sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M= 280 | dependencies: 281 | mimic-response "^1.0.0" 282 | 283 | deep-extend@^0.6.0: 284 | version "0.6.0" 285 | resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" 286 | integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== 287 | 288 | deepmerge@^4.2.2: 289 | version "4.2.2" 290 | resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.2.2.tgz#44d2ea3679b8f4d4ffba33f03d865fc1e7bf4955" 291 | integrity sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg== 292 | 293 | defer-to-connect@^1.0.1: 294 | version "1.1.3" 295 | resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-1.1.3.tgz#331ae050c08dcf789f8c83a7b81f0ed94f4ac591" 296 | integrity sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ== 297 | 298 | dot-prop@^5.2.0: 299 | version "5.3.0" 300 | resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-5.3.0.tgz#90ccce708cd9cd82cc4dc8c3ddd9abdd55b20e88" 301 | integrity sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q== 302 | dependencies: 303 | is-obj "^2.0.0" 304 | 305 | duplexer3@^0.1.4: 306 | version "0.1.4" 307 | resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2" 308 | integrity sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI= 309 | 310 | emoji-regex@^8.0.0: 311 | version "8.0.0" 312 | resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" 313 | integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== 314 | 315 | end-of-stream@^1.1.0: 316 | version "1.4.4" 317 | resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" 318 | integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== 319 | dependencies: 320 | once "^1.4.0" 321 | 322 | escape-goat@^2.0.0: 323 | version "2.1.1" 324 | resolved "https://registry.yarnpkg.com/escape-goat/-/escape-goat-2.1.1.tgz#1b2dc77003676c457ec760b2dc68edb648188675" 325 | integrity sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q== 326 | 327 | fast-decode-uri-component@^1.0.1: 328 | version "1.0.1" 329 | resolved "https://registry.yarnpkg.com/fast-decode-uri-component/-/fast-decode-uri-component-1.0.1.tgz#46f8b6c22b30ff7a81357d4f59abfae938202543" 330 | integrity sha512-WKgKWg5eUxvRZGwW8FvfbaH7AXSh2cL+3j5fMGzUMCxWBJ3dV3a7Wz8y2f/uQ0e3B6WmodD3oS54jTQ9HVTIIg== 331 | 332 | fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: 333 | version "3.1.3" 334 | resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" 335 | integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== 336 | 337 | fast-json-stable-stringify@^2.0.0: 338 | version "2.1.0" 339 | resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" 340 | integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== 341 | 342 | fast-json-stringify@^2.5.2: 343 | version "2.7.13" 344 | resolved "https://registry.yarnpkg.com/fast-json-stringify/-/fast-json-stringify-2.7.13.tgz#277aa86c2acba4d9851bd6108ed657aa327ed8c0" 345 | integrity sha512-ar+hQ4+OIurUGjSJD1anvYSDcUflywhKjfxnsW4TBTD7+u0tJufv6DKRWoQk3vI6YBOWMoz0TQtfbe7dxbQmvA== 346 | dependencies: 347 | ajv "^6.11.0" 348 | deepmerge "^4.2.2" 349 | rfdc "^1.2.0" 350 | string-similarity "^4.0.1" 351 | 352 | fast-redact@^3.0.0: 353 | version "3.0.2" 354 | resolved "https://registry.yarnpkg.com/fast-redact/-/fast-redact-3.0.2.tgz#c940ba7162dde3aeeefc522926ae8c5231412904" 355 | integrity sha512-YN+CYfCVRVMUZOUPeinHNKgytM1wPI/C/UCLEi56EsY2dwwvI00kIJHJoI7pMVqGoMew8SMZ2SSfHKHULHXDsg== 356 | 357 | fast-safe-stringify@^2.0.8: 358 | version "2.1.1" 359 | resolved "https://registry.yarnpkg.com/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz#c406a83b6e70d9e35ce3b30a81141df30aeba884" 360 | integrity sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA== 361 | 362 | fastify-plugin@^3.0.0: 363 | version "3.0.0" 364 | resolved "https://registry.yarnpkg.com/fastify-plugin/-/fastify-plugin-3.0.0.tgz#cf1b8c8098e3b5a7c8c30e6aeb06903370c054ca" 365 | integrity sha512-ZdCvKEEd92DNLps5n0v231Bha8bkz1DjnPP/aEz37rz/q42Z5JVLmgnqR4DYuNn3NXAO3IDCPyRvgvxtJ4Ym4w== 366 | 367 | fastify-warning@^0.2.0: 368 | version "0.2.0" 369 | resolved "https://registry.yarnpkg.com/fastify-warning/-/fastify-warning-0.2.0.tgz#e717776026a4493dc9a2befa44db6d17f618008f" 370 | integrity sha512-s1EQguBw/9qtc1p/WTY4eq9WMRIACkj+HTcOIK1in4MV5aFaQC9ZCIt0dJ7pr5bIf4lPpHvAtP2ywpTNgs7hqw== 371 | 372 | fastify@^3.29.4: 373 | version "3.29.4" 374 | resolved "https://registry.yarnpkg.com/fastify/-/fastify-3.29.4.tgz#294e33017b55f3cb72f315c41cf51431bc9b7a34" 375 | integrity sha512-BEyKidZQvscNaiF1BLh+YLE7AzHH03NexhPzrwZP6KBQ+jG2czdgq72X+RFB5rK9hbqdaafVb5yiWN+hCvHfYg== 376 | dependencies: 377 | "@fastify/ajv-compiler" "^1.0.0" 378 | "@fastify/error" "^2.0.0" 379 | abstract-logging "^2.0.0" 380 | avvio "^7.1.2" 381 | content-type "^1.0.4" 382 | fast-json-stringify "^2.5.2" 383 | find-my-way "^4.5.0" 384 | flatstr "^1.0.12" 385 | light-my-request "^4.2.0" 386 | pino "^6.13.0" 387 | process-warning "^1.0.0" 388 | proxy-addr "^2.0.7" 389 | rfdc "^1.1.4" 390 | secure-json-parse "^2.0.0" 391 | semver "^7.3.2" 392 | tiny-lru "^8.0.1" 393 | 394 | fastq@^1.6.1: 395 | version "1.13.0" 396 | resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.13.0.tgz#616760f88a7526bdfc596b7cab8c18938c36b98c" 397 | integrity sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw== 398 | dependencies: 399 | reusify "^1.0.4" 400 | 401 | fill-range@^7.1.1: 402 | version "7.1.1" 403 | resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292" 404 | integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== 405 | dependencies: 406 | to-regex-range "^5.0.1" 407 | 408 | find-my-way@^4.5.0: 409 | version "4.5.1" 410 | resolved "https://registry.yarnpkg.com/find-my-way/-/find-my-way-4.5.1.tgz#758e959194b90aea0270db18fff75e2fceb2239f" 411 | integrity sha512-kE0u7sGoUFbMXcOG/xpkmz4sRLCklERnBcg7Ftuu1iAxsfEt2S46RLJ3Sq7vshsEy2wJT2hZxE58XZK27qa8kg== 412 | dependencies: 413 | fast-decode-uri-component "^1.0.1" 414 | fast-deep-equal "^3.1.3" 415 | safe-regex2 "^2.0.0" 416 | semver-store "^0.3.0" 417 | 418 | flatstr@^1.0.12: 419 | version "1.0.12" 420 | resolved "https://registry.yarnpkg.com/flatstr/-/flatstr-1.0.12.tgz#c2ba6a08173edbb6c9640e3055b95e287ceb5931" 421 | integrity sha512-4zPxDyhCyiN2wIAtSLI6gc82/EjqZc1onI4Mz/l0pWrAlsSfYH/2ZIcU+e3oA2wDwbzIWNKwa23F8rh6+DRWkw== 422 | 423 | forwarded@0.2.0: 424 | version "0.2.0" 425 | resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" 426 | integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== 427 | 428 | fsevents@~2.3.2: 429 | version "2.3.2" 430 | resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" 431 | integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== 432 | 433 | get-stream@^4.1.0: 434 | version "4.1.0" 435 | resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" 436 | integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== 437 | dependencies: 438 | pump "^3.0.0" 439 | 440 | get-stream@^5.1.0: 441 | version "5.2.0" 442 | resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3" 443 | integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== 444 | dependencies: 445 | pump "^3.0.0" 446 | 447 | glob-parent@~5.1.2: 448 | version "5.1.2" 449 | resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" 450 | integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== 451 | dependencies: 452 | is-glob "^4.0.1" 453 | 454 | global-dirs@^3.0.0: 455 | version "3.0.0" 456 | resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-3.0.0.tgz#70a76fe84ea315ab37b1f5576cbde7d48ef72686" 457 | integrity sha512-v8ho2DS5RiCjftj1nD9NmnfaOzTdud7RRnVd9kFNOjqZbISlx5DQ+OrTkywgd0dIt7oFCvKetZSHoHcP3sDdiA== 458 | dependencies: 459 | ini "2.0.0" 460 | 461 | got@^9.6.0: 462 | version "9.6.0" 463 | resolved "https://registry.yarnpkg.com/got/-/got-9.6.0.tgz#edf45e7d67f99545705de1f7bbeeeb121765ed85" 464 | integrity sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q== 465 | dependencies: 466 | "@sindresorhus/is" "^0.14.0" 467 | "@szmarczak/http-timer" "^1.1.2" 468 | cacheable-request "^6.0.0" 469 | decompress-response "^3.3.0" 470 | duplexer3 "^0.1.4" 471 | get-stream "^4.1.0" 472 | lowercase-keys "^1.0.1" 473 | mimic-response "^1.0.1" 474 | p-cancelable "^1.0.0" 475 | to-readable-stream "^1.0.0" 476 | url-parse-lax "^3.0.0" 477 | 478 | graceful-fs@^4.1.2: 479 | version "4.2.9" 480 | resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.9.tgz#041b05df45755e587a24942279b9d113146e1c96" 481 | integrity sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ== 482 | 483 | has-flag@^3.0.0: 484 | version "3.0.0" 485 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" 486 | integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= 487 | 488 | has-flag@^4.0.0: 489 | version "4.0.0" 490 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" 491 | integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== 492 | 493 | has-yarn@^2.1.0: 494 | version "2.1.0" 495 | resolved "https://registry.yarnpkg.com/has-yarn/-/has-yarn-2.1.0.tgz#137e11354a7b5bf11aa5cb649cf0c6f3ff2b2e77" 496 | integrity sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw== 497 | 498 | http-cache-semantics@^4.0.0: 499 | version "4.1.1" 500 | resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz#abe02fcb2985460bf0323be664436ec3476a6d5a" 501 | integrity sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ== 502 | 503 | ignore-by-default@^1.0.1: 504 | version "1.0.1" 505 | resolved "https://registry.yarnpkg.com/ignore-by-default/-/ignore-by-default-1.0.1.tgz#48ca6d72f6c6a3af00a9ad4ae6876be3889e2b09" 506 | integrity sha1-SMptcvbGo68Aqa1K5odr44ieKwk= 507 | 508 | import-lazy@^2.1.0: 509 | version "2.1.0" 510 | resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-2.1.0.tgz#05698e3d45c88e8d7e9d92cb0584e77f096f3e43" 511 | integrity sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM= 512 | 513 | imurmurhash@^0.1.4: 514 | version "0.1.4" 515 | resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" 516 | integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= 517 | 518 | ini@2.0.0: 519 | version "2.0.0" 520 | resolved "https://registry.yarnpkg.com/ini/-/ini-2.0.0.tgz#e5fd556ecdd5726be978fa1001862eacb0a94bc5" 521 | integrity sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA== 522 | 523 | ini@~1.3.0: 524 | version "1.3.8" 525 | resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" 526 | integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== 527 | 528 | ipaddr.js@1.9.1: 529 | version "1.9.1" 530 | resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" 531 | integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== 532 | 533 | is-binary-path@~2.1.0: 534 | version "2.1.0" 535 | resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" 536 | integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== 537 | dependencies: 538 | binary-extensions "^2.0.0" 539 | 540 | is-ci@^2.0.0: 541 | version "2.0.0" 542 | resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-2.0.0.tgz#6bc6334181810e04b5c22b3d589fdca55026404c" 543 | integrity sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w== 544 | dependencies: 545 | ci-info "^2.0.0" 546 | 547 | is-extglob@^2.1.1: 548 | version "2.1.1" 549 | resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" 550 | integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= 551 | 552 | is-fullwidth-code-point@^3.0.0: 553 | version "3.0.0" 554 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" 555 | integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== 556 | 557 | is-glob@^4.0.1, is-glob@~4.0.1: 558 | version "4.0.3" 559 | resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" 560 | integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== 561 | dependencies: 562 | is-extglob "^2.1.1" 563 | 564 | is-installed-globally@^0.4.0: 565 | version "0.4.0" 566 | resolved "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-0.4.0.tgz#9a0fd407949c30f86eb6959ef1b7994ed0b7b520" 567 | integrity sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ== 568 | dependencies: 569 | global-dirs "^3.0.0" 570 | is-path-inside "^3.0.2" 571 | 572 | is-npm@^5.0.0: 573 | version "5.0.0" 574 | resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-5.0.0.tgz#43e8d65cc56e1b67f8d47262cf667099193f45a8" 575 | integrity sha512-WW/rQLOazUq+ST/bCAVBp/2oMERWLsR7OrKyt052dNDk4DHcDE0/7QSXITlmi+VBcV13DfIbysG3tZJm5RfdBA== 576 | 577 | is-number@^7.0.0: 578 | version "7.0.0" 579 | resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" 580 | integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== 581 | 582 | is-obj@^2.0.0: 583 | version "2.0.0" 584 | resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-2.0.0.tgz#473fb05d973705e3fd9620545018ca8e22ef4982" 585 | integrity sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w== 586 | 587 | is-path-inside@^3.0.2: 588 | version "3.0.3" 589 | resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" 590 | integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== 591 | 592 | is-typedarray@^1.0.0: 593 | version "1.0.0" 594 | resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" 595 | integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= 596 | 597 | is-yarn-global@^0.3.0: 598 | version "0.3.0" 599 | resolved "https://registry.yarnpkg.com/is-yarn-global/-/is-yarn-global-0.3.0.tgz#d502d3382590ea3004893746754c89139973e232" 600 | integrity sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw== 601 | 602 | json-buffer@3.0.0: 603 | version "3.0.0" 604 | resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.0.tgz#5b1f397afc75d677bde8bcfc0e47e1f9a3d9a898" 605 | integrity sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg= 606 | 607 | json-schema-traverse@^0.4.1: 608 | version "0.4.1" 609 | resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" 610 | integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== 611 | 612 | json-schema-traverse@^1.0.0: 613 | version "1.0.0" 614 | resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" 615 | integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== 616 | 617 | keyv@^3.0.0: 618 | version "3.1.0" 619 | resolved "https://registry.yarnpkg.com/keyv/-/keyv-3.1.0.tgz#ecc228486f69991e49e9476485a5be1e8fc5c4d9" 620 | integrity sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA== 621 | dependencies: 622 | json-buffer "3.0.0" 623 | 624 | latest-version@^5.1.0: 625 | version "5.1.0" 626 | resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-5.1.0.tgz#119dfe908fe38d15dfa43ecd13fa12ec8832face" 627 | integrity sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA== 628 | dependencies: 629 | package-json "^6.3.0" 630 | 631 | light-my-request@^4.2.0: 632 | version "4.7.0" 633 | resolved "https://registry.yarnpkg.com/light-my-request/-/light-my-request-4.7.0.tgz#5bacd17fa0eaf96fe5eed1682c5e0d361953cf46" 634 | integrity sha512-LTa8YZp3K2AUpqUnwwKajoIHcsKOBnzwJNQSrk7unziPwo6CjOYjyO0F9wfkxFvP+nBsCGe3eMPnedVgIIgdAw== 635 | dependencies: 636 | ajv "^8.1.0" 637 | cookie "^0.4.0" 638 | fastify-warning "^0.2.0" 639 | set-cookie-parser "^2.4.1" 640 | 641 | lowercase-keys@^1.0.0, lowercase-keys@^1.0.1: 642 | version "1.0.1" 643 | resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f" 644 | integrity sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA== 645 | 646 | lowercase-keys@^2.0.0: 647 | version "2.0.0" 648 | resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-2.0.0.tgz#2603e78b7b4b0006cbca2fbcc8a3202558ac9479" 649 | integrity sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA== 650 | 651 | lru-cache@^6.0.0: 652 | version "6.0.0" 653 | resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" 654 | integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== 655 | dependencies: 656 | yallist "^4.0.0" 657 | 658 | make-dir@^3.0.0: 659 | version "3.1.0" 660 | resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" 661 | integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== 662 | dependencies: 663 | semver "^6.0.0" 664 | 665 | mimic-response@^1.0.0, mimic-response@^1.0.1: 666 | version "1.0.1" 667 | resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b" 668 | integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ== 669 | 670 | minimatch@^3.0.4: 671 | version "3.1.2" 672 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" 673 | integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== 674 | dependencies: 675 | brace-expansion "^1.1.7" 676 | 677 | minimist@^1.2.0: 678 | version "1.2.6" 679 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.6.tgz#8637a5b759ea0d6e98702cfb3a9283323c93af44" 680 | integrity sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q== 681 | 682 | ms@2.1.2: 683 | version "2.1.2" 684 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" 685 | integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== 686 | 687 | ms@^2.1.1: 688 | version "2.1.3" 689 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" 690 | integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== 691 | 692 | nodemon@^2.0.15: 693 | version "2.0.15" 694 | resolved "https://registry.yarnpkg.com/nodemon/-/nodemon-2.0.15.tgz#504516ce3b43d9dc9a955ccd9ec57550a31a8d4e" 695 | integrity sha512-gdHMNx47Gw7b3kWxJV64NI+Q5nfl0y5DgDbiVtShiwa7Z0IZ07Ll4RLFo6AjrhzMtoEZn5PDE3/c2AbVsiCkpA== 696 | dependencies: 697 | chokidar "^3.5.2" 698 | debug "^3.2.7" 699 | ignore-by-default "^1.0.1" 700 | minimatch "^3.0.4" 701 | pstree.remy "^1.1.8" 702 | semver "^5.7.1" 703 | supports-color "^5.5.0" 704 | touch "^3.1.0" 705 | undefsafe "^2.0.5" 706 | update-notifier "^5.1.0" 707 | 708 | nopt@~1.0.10: 709 | version "1.0.10" 710 | resolved "https://registry.yarnpkg.com/nopt/-/nopt-1.0.10.tgz#6ddd21bd2a31417b92727dd585f8a6f37608ebee" 711 | integrity sha1-bd0hvSoxQXuScn3Vhfim83YI6+4= 712 | dependencies: 713 | abbrev "1" 714 | 715 | normalize-path@^3.0.0, normalize-path@~3.0.0: 716 | version "3.0.0" 717 | resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" 718 | integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== 719 | 720 | normalize-url@^4.1.0: 721 | version "4.5.1" 722 | resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-4.5.1.tgz#0dd90cf1288ee1d1313b87081c9a5932ee48518a" 723 | integrity sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA== 724 | 725 | once@^1.3.1, once@^1.4.0: 726 | version "1.4.0" 727 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 728 | integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= 729 | dependencies: 730 | wrappy "1" 731 | 732 | p-cancelable@^1.0.0: 733 | version "1.1.0" 734 | resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-1.1.0.tgz#d078d15a3af409220c886f1d9a0ca2e441ab26cc" 735 | integrity sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw== 736 | 737 | package-json@^6.3.0: 738 | version "6.5.0" 739 | resolved "https://registry.yarnpkg.com/package-json/-/package-json-6.5.0.tgz#6feedaca35e75725876d0b0e64974697fed145b0" 740 | integrity sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ== 741 | dependencies: 742 | got "^9.6.0" 743 | registry-auth-token "^4.0.0" 744 | registry-url "^5.0.0" 745 | semver "^6.2.0" 746 | 747 | picomatch@^2.0.4, picomatch@^2.2.1: 748 | version "2.3.1" 749 | resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" 750 | integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== 751 | 752 | pino-std-serializers@^3.1.0: 753 | version "3.2.0" 754 | resolved "https://registry.yarnpkg.com/pino-std-serializers/-/pino-std-serializers-3.2.0.tgz#b56487c402d882eb96cd67c257868016b61ad671" 755 | integrity sha512-EqX4pwDPrt3MuOAAUBMU0Tk5kR/YcCM5fNPEzgCO2zJ5HfX0vbiH9HbJglnyeQsN96Kznae6MWD47pZB5avTrg== 756 | 757 | pino@^6.13.0: 758 | version "6.13.4" 759 | resolved "https://registry.yarnpkg.com/pino/-/pino-6.13.4.tgz#e7bd5e8292019609c841c37a3f1d73ee10bb80f7" 760 | integrity sha512-g4tHSISmQJYUEKEMVdaZ+ZokWwFnTwZL5JPn+lnBVZ1BuBbrSchrXwQINknkM5+Q4fF6U9NjiI8PWwwMDHt9zA== 761 | dependencies: 762 | fast-redact "^3.0.0" 763 | fast-safe-stringify "^2.0.8" 764 | flatstr "^1.0.12" 765 | pino-std-serializers "^3.1.0" 766 | process-warning "^1.0.0" 767 | quick-format-unescaped "^4.0.3" 768 | sonic-boom "^1.0.2" 769 | 770 | prepend-http@^2.0.0: 771 | version "2.0.0" 772 | resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-2.0.0.tgz#e92434bfa5ea8c19f41cdfd401d741a3c819d897" 773 | integrity sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc= 774 | 775 | process-warning@^1.0.0: 776 | version "1.0.0" 777 | resolved "https://registry.yarnpkg.com/process-warning/-/process-warning-1.0.0.tgz#980a0b25dc38cd6034181be4b7726d89066b4616" 778 | integrity sha512-du4wfLyj4yCZq1VupnVSZmRsPJsNuxoDQFdCFHLaYiEbFBD7QE0a+I4D7hOxrVnh78QE/YipFAj9lXHiXocV+Q== 779 | 780 | proxy-addr@^2.0.7: 781 | version "2.0.7" 782 | resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" 783 | integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== 784 | dependencies: 785 | forwarded "0.2.0" 786 | ipaddr.js "1.9.1" 787 | 788 | pstree.remy@^1.1.8: 789 | version "1.1.8" 790 | resolved "https://registry.yarnpkg.com/pstree.remy/-/pstree.remy-1.1.8.tgz#c242224f4a67c21f686839bbdb4ac282b8373d3a" 791 | integrity sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w== 792 | 793 | pump@^3.0.0: 794 | version "3.0.0" 795 | resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" 796 | integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== 797 | dependencies: 798 | end-of-stream "^1.1.0" 799 | once "^1.3.1" 800 | 801 | punycode@^2.1.0: 802 | version "2.1.1" 803 | resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" 804 | integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== 805 | 806 | pupa@^2.1.1: 807 | version "2.1.1" 808 | resolved "https://registry.yarnpkg.com/pupa/-/pupa-2.1.1.tgz#f5e8fd4afc2c5d97828faa523549ed8744a20d62" 809 | integrity sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A== 810 | dependencies: 811 | escape-goat "^2.0.0" 812 | 813 | queue-microtask@^1.1.2: 814 | version "1.2.3" 815 | resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" 816 | integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== 817 | 818 | quick-format-unescaped@^4.0.3: 819 | version "4.0.4" 820 | resolved "https://registry.yarnpkg.com/quick-format-unescaped/-/quick-format-unescaped-4.0.4.tgz#93ef6dd8d3453cbc7970dd614fad4c5954d6b5a7" 821 | integrity sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg== 822 | 823 | ramda@0.27.1: 824 | version "0.27.1" 825 | resolved "https://registry.yarnpkg.com/ramda/-/ramda-0.27.1.tgz#66fc2df3ef873874ffc2da6aa8984658abacf5c9" 826 | integrity sha512-PgIdVpn5y5Yns8vqb8FzBUEYn98V3xcPgawAkkgj0YJ0qDsnHCiNmZYfOGMgOvoB0eWFLpYbhxUR3mxfDIMvpw== 827 | 828 | rc@^1.2.8: 829 | version "1.2.8" 830 | resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" 831 | integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== 832 | dependencies: 833 | deep-extend "^0.6.0" 834 | ini "~1.3.0" 835 | minimist "^1.2.0" 836 | strip-json-comments "~2.0.1" 837 | 838 | readdirp@~3.6.0: 839 | version "3.6.0" 840 | resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" 841 | integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== 842 | dependencies: 843 | picomatch "^2.2.1" 844 | 845 | registry-auth-token@^4.0.0: 846 | version "4.2.1" 847 | resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-4.2.1.tgz#6d7b4006441918972ccd5fedcd41dc322c79b250" 848 | integrity sha512-6gkSb4U6aWJB4SF2ZvLb76yCBjcvufXBqvvEx1HbmKPkutswjW1xNVRY0+daljIYRbogN7O0etYSlbiaEQyMyw== 849 | dependencies: 850 | rc "^1.2.8" 851 | 852 | registry-url@^5.0.0: 853 | version "5.1.0" 854 | resolved "https://registry.yarnpkg.com/registry-url/-/registry-url-5.1.0.tgz#e98334b50d5434b81136b44ec638d9c2009c5009" 855 | integrity sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw== 856 | dependencies: 857 | rc "^1.2.8" 858 | 859 | require-from-string@^2.0.2: 860 | version "2.0.2" 861 | resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" 862 | integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== 863 | 864 | responselike@^1.0.2: 865 | version "1.0.2" 866 | resolved "https://registry.yarnpkg.com/responselike/-/responselike-1.0.2.tgz#918720ef3b631c5642be068f15ade5a46f4ba1e7" 867 | integrity sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec= 868 | dependencies: 869 | lowercase-keys "^1.0.0" 870 | 871 | ret@~0.2.0: 872 | version "0.2.2" 873 | resolved "https://registry.yarnpkg.com/ret/-/ret-0.2.2.tgz#b6861782a1f4762dce43402a71eb7a283f44573c" 874 | integrity sha512-M0b3YWQs7R3Z917WRQy1HHA7Ba7D8hvZg6UE5mLykJxQVE2ju0IXbGlaHPPlkY+WN7wFP+wUMXmBFA0aV6vYGQ== 875 | 876 | reusify@^1.0.4: 877 | version "1.0.4" 878 | resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" 879 | integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== 880 | 881 | rfdc@^1.1.4, rfdc@^1.2.0: 882 | version "1.3.0" 883 | resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.3.0.tgz#d0b7c441ab2720d05dc4cf26e01c89631d9da08b" 884 | integrity sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA== 885 | 886 | safe-regex2@^2.0.0: 887 | version "2.0.0" 888 | resolved "https://registry.yarnpkg.com/safe-regex2/-/safe-regex2-2.0.0.tgz#b287524c397c7a2994470367e0185e1916b1f5b9" 889 | integrity sha512-PaUSFsUaNNuKwkBijoAPHAK6/eM6VirvyPWlZ7BAQy4D+hCvh4B6lIG+nPdhbFfIbP+gTGBcrdsOaUs0F+ZBOQ== 890 | dependencies: 891 | ret "~0.2.0" 892 | 893 | secure-json-parse@^2.0.0: 894 | version "2.4.0" 895 | resolved "https://registry.yarnpkg.com/secure-json-parse/-/secure-json-parse-2.4.0.tgz#5aaeaaef85c7a417f76271a4f5b0cc3315ddca85" 896 | integrity sha512-Q5Z/97nbON5t/L/sH6mY2EacfjVGwrCcSi5D3btRO2GZ8pf1K1UN7Z9H5J57hjVU2Qzxr1xO+FmBhOvEkzCMmg== 897 | 898 | semver-diff@^3.1.1: 899 | version "3.1.1" 900 | resolved "https://registry.yarnpkg.com/semver-diff/-/semver-diff-3.1.1.tgz#05f77ce59f325e00e2706afd67bb506ddb1ca32b" 901 | integrity sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg== 902 | dependencies: 903 | semver "^6.3.0" 904 | 905 | semver-store@^0.3.0: 906 | version "0.3.0" 907 | resolved "https://registry.yarnpkg.com/semver-store/-/semver-store-0.3.0.tgz#ce602ff07df37080ec9f4fb40b29576547befbe9" 908 | integrity sha512-TcZvGMMy9vodEFSse30lWinkj+JgOBvPn8wRItpQRSayhc+4ssDs335uklkfvQQJgL/WvmHLVj4Ycv2s7QCQMg== 909 | 910 | semver@^5.7.1: 911 | version "5.7.2" 912 | resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.2.tgz#48d55db737c3287cd4835e17fa13feace1c41ef8" 913 | integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== 914 | 915 | semver@^6.0.0, semver@^6.2.0, semver@^6.3.0: 916 | version "6.3.1" 917 | resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" 918 | integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== 919 | 920 | semver@^7.3.2, semver@^7.3.4: 921 | version "7.5.4" 922 | resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e" 923 | integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== 924 | dependencies: 925 | lru-cache "^6.0.0" 926 | 927 | set-cookie-parser@^2.4.1: 928 | version "2.4.8" 929 | resolved "https://registry.yarnpkg.com/set-cookie-parser/-/set-cookie-parser-2.4.8.tgz#d0da0ed388bc8f24e706a391f9c9e252a13c58b2" 930 | integrity sha512-edRH8mBKEWNVIVMKejNnuJxleqYE/ZSdcT8/Nem9/mmosx12pctd80s2Oy00KNZzrogMZS5mauK2/ymL1bvlvg== 931 | 932 | signal-exit@^3.0.2: 933 | version "3.0.6" 934 | resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.6.tgz#24e630c4b0f03fea446a2bd299e62b4a6ca8d0af" 935 | integrity sha512-sDl4qMFpijcGw22U5w63KmD3cZJfBuFlVNbVMKje2keoKML7X2UzWbc4XrmEbDwg0NXJc3yv4/ox7b+JWb57kQ== 936 | 937 | sonic-boom@^1.0.2: 938 | version "1.4.1" 939 | resolved "https://registry.yarnpkg.com/sonic-boom/-/sonic-boom-1.4.1.tgz#d35d6a74076624f12e6f917ade7b9d75e918f53e" 940 | integrity sha512-LRHh/A8tpW7ru89lrlkU4AszXt1dbwSjVWguGrmlxE7tawVmDBlI1PILMkXAxJTwqhgsEeTHzj36D5CmHgQmNg== 941 | dependencies: 942 | atomic-sleep "^1.0.0" 943 | flatstr "^1.0.12" 944 | 945 | string-similarity@^4.0.1: 946 | version "4.0.4" 947 | resolved "https://registry.yarnpkg.com/string-similarity/-/string-similarity-4.0.4.tgz#42d01ab0b34660ea8a018da8f56a3309bb8b2a5b" 948 | integrity sha512-/q/8Q4Bl4ZKAPjj8WerIBJWALKkaPRfrvhfF8k/B23i4nzrlRj2/go1m90In7nG/3XDSbOo0+pu6RvCTM9RGMQ== 949 | 950 | string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.2: 951 | version "4.2.3" 952 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" 953 | integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== 954 | dependencies: 955 | emoji-regex "^8.0.0" 956 | is-fullwidth-code-point "^3.0.0" 957 | strip-ansi "^6.0.1" 958 | 959 | strip-ansi@^6.0.0, strip-ansi@^6.0.1: 960 | version "6.0.1" 961 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" 962 | integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== 963 | dependencies: 964 | ansi-regex "^5.0.1" 965 | 966 | strip-json-comments@~2.0.1: 967 | version "2.0.1" 968 | resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" 969 | integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= 970 | 971 | supports-color@^5.5.0: 972 | version "5.5.0" 973 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" 974 | integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== 975 | dependencies: 976 | has-flag "^3.0.0" 977 | 978 | supports-color@^7.1.0: 979 | version "7.2.0" 980 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" 981 | integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== 982 | dependencies: 983 | has-flag "^4.0.0" 984 | 985 | tiny-lru@^8.0.1: 986 | version "8.0.2" 987 | resolved "https://registry.yarnpkg.com/tiny-lru/-/tiny-lru-8.0.2.tgz#812fccbe6e622ded552e3ff8a4c3b5ff34a85e4c" 988 | integrity sha512-ApGvZ6vVvTNdsmt676grvCkUCGwzG9IqXma5Z07xJgiC5L7akUMof5U8G2JTI9Rz/ovtVhJBlY6mNhEvtjzOIg== 989 | 990 | to-readable-stream@^1.0.0: 991 | version "1.0.0" 992 | resolved "https://registry.yarnpkg.com/to-readable-stream/-/to-readable-stream-1.0.0.tgz#ce0aa0c2f3df6adf852efb404a783e77c0475771" 993 | integrity sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q== 994 | 995 | to-regex-range@^5.0.1: 996 | version "5.0.1" 997 | resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" 998 | integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== 999 | dependencies: 1000 | is-number "^7.0.0" 1001 | 1002 | touch@^3.1.0: 1003 | version "3.1.0" 1004 | resolved "https://registry.yarnpkg.com/touch/-/touch-3.1.0.tgz#fe365f5f75ec9ed4e56825e0bb76d24ab74af83b" 1005 | integrity sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA== 1006 | dependencies: 1007 | nopt "~1.0.10" 1008 | 1009 | type-fest@^0.20.2: 1010 | version "0.20.2" 1011 | resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" 1012 | integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== 1013 | 1014 | typedarray-to-buffer@^3.1.5: 1015 | version "3.1.5" 1016 | resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" 1017 | integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q== 1018 | dependencies: 1019 | is-typedarray "^1.0.0" 1020 | 1021 | typescript@^4.5.4: 1022 | version "4.5.4" 1023 | resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.5.4.tgz#a17d3a0263bf5c8723b9c52f43c5084edf13c2e8" 1024 | integrity sha512-VgYs2A2QIRuGphtzFV7aQJduJ2gyfTljngLzjpfW9FoYZF6xuw1W0vW9ghCKLfcWrCFxK81CSGRAvS1pn4fIUg== 1025 | 1026 | undefsafe@^2.0.5: 1027 | version "2.0.5" 1028 | resolved "https://registry.yarnpkg.com/undefsafe/-/undefsafe-2.0.5.tgz#38733b9327bdcd226db889fb723a6efd162e6e2c" 1029 | integrity sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA== 1030 | 1031 | unique-string@^2.0.0: 1032 | version "2.0.0" 1033 | resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-2.0.0.tgz#39c6451f81afb2749de2b233e3f7c5e8843bd89d" 1034 | integrity sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg== 1035 | dependencies: 1036 | crypto-random-string "^2.0.0" 1037 | 1038 | update-notifier@^5.1.0: 1039 | version "5.1.0" 1040 | resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-5.1.0.tgz#4ab0d7c7f36a231dd7316cf7729313f0214d9ad9" 1041 | integrity sha512-ItnICHbeMh9GqUy31hFPrD1kcuZ3rpxDZbf4KUDavXwS0bW5m7SLbDQpGX3UYr072cbrF5hFUs3r5tUsPwjfHw== 1042 | dependencies: 1043 | boxen "^5.0.0" 1044 | chalk "^4.1.0" 1045 | configstore "^5.0.1" 1046 | has-yarn "^2.1.0" 1047 | import-lazy "^2.1.0" 1048 | is-ci "^2.0.0" 1049 | is-installed-globally "^0.4.0" 1050 | is-npm "^5.0.0" 1051 | is-yarn-global "^0.3.0" 1052 | latest-version "^5.1.0" 1053 | pupa "^2.1.1" 1054 | semver "^7.3.4" 1055 | semver-diff "^3.1.1" 1056 | xdg-basedir "^4.0.0" 1057 | 1058 | uri-js@^4.2.2: 1059 | version "4.4.1" 1060 | resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" 1061 | integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== 1062 | dependencies: 1063 | punycode "^2.1.0" 1064 | 1065 | url-parse-lax@^3.0.0: 1066 | version "3.0.0" 1067 | resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-3.0.0.tgz#16b5cafc07dbe3676c1b1999177823d6503acb0c" 1068 | integrity sha1-FrXK/Afb42dsGxmZF3gj1lA6yww= 1069 | dependencies: 1070 | prepend-http "^2.0.0" 1071 | 1072 | widest-line@^3.1.0: 1073 | version "3.1.0" 1074 | resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-3.1.0.tgz#8292333bbf66cb45ff0de1603b136b7ae1496eca" 1075 | integrity sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg== 1076 | dependencies: 1077 | string-width "^4.0.0" 1078 | 1079 | wrap-ansi@^7.0.0: 1080 | version "7.0.0" 1081 | resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" 1082 | integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== 1083 | dependencies: 1084 | ansi-styles "^4.0.0" 1085 | string-width "^4.1.0" 1086 | strip-ansi "^6.0.0" 1087 | 1088 | wrappy@1: 1089 | version "1.0.2" 1090 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 1091 | integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= 1092 | 1093 | write-file-atomic@^3.0.0: 1094 | version "3.0.3" 1095 | resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-3.0.3.tgz#56bd5c5a5c70481cd19c571bd39ab965a5de56e8" 1096 | integrity sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q== 1097 | dependencies: 1098 | imurmurhash "^0.1.4" 1099 | is-typedarray "^1.0.0" 1100 | signal-exit "^3.0.2" 1101 | typedarray-to-buffer "^3.1.5" 1102 | 1103 | xdg-basedir@^4.0.0: 1104 | version "4.0.0" 1105 | resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-4.0.0.tgz#4bc8d9984403696225ef83a1573cbbcb4e79db13" 1106 | integrity sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q== 1107 | 1108 | yallist@^4.0.0: 1109 | version "4.0.0" 1110 | resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" 1111 | integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== 1112 | --------------------------------------------------------------------------------