diff --git a/.gitignore b/.gitignore index c2dd9a5..ac2e2e2 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,6 @@ node_modules dist -.vscode \ No newline at end of file +.vscode + +*.lock +*.log \ No newline at end of file diff --git a/package.json b/package.json index 4ba1e14..7d4ea58 100644 --- a/package.json +++ b/package.json @@ -26,24 +26,28 @@ "scripts": { "build": "tsc", "dev": "tsc -w", + "dev:watch": "nodemon --watch src --ext ts --exec \"ts-node\" src/example/index.ts", "lint": "eslint --ext .ts src/" }, "peerDependencies": { "@nestjs/common": "^9.2.1", "@nestjs/core": "^9.2.1", "@nestjs/platform-express": "^9.2.1", + "@nestjs/platform-fastify": "^9.4.2", "@trpc/server": "~10.10.0", "reflect-metadata": "^0.1.12", - "rxjs": "^7.1.0" + "rxjs": "^7.1.0", + "fastify": "^4.17.0" + }, + "dependencies": { + "@fastify/cookie": "^8.3.0" }, - "dependencies": {}, "devDependencies": { "@nestjs/common": "^9.2.1", "@nestjs/core": "^9.2.1", "@nestjs/platform-express": "^9.2.1", + "@nestjs/platform-fastify": "^9.4.2", "@trpc/server": "~10.10.0", - "reflect-metadata": "^0.1.12", - "rxjs": "^7.1.0", "@types/node": "^16.0.0", "@typescript-eslint/eslint-plugin": "^5.48.2", "@typescript-eslint/parser": "^5.48.2", @@ -52,6 +56,9 @@ "eslint-config-airbnb-typescript": "^17.0.0", "eslint-plugin-import": "^2.25.2", "nodemon": "^2.0.20", + "reflect-metadata": "^0.1.12", + "rxjs": "^7.1.0", + "ts-node": "^10.9.1", "typescript": "^4.9.4" }, "files": [ diff --git a/src/example/app.module.ts b/src/example/app.module.ts index d2510e5..a3a2e59 100644 --- a/src/example/app.module.ts +++ b/src/example/app.module.ts @@ -1,7 +1,7 @@ import { Module } from '@nestjs/common'; import { TrpcModule } from '../lib/trpc.module'; import { AModule } from './domain-b/a.module'; -import { appRouter } from './init-trpc'; +import { appRouter, createContext } from './init-trpc'; @Module({ imports: [ @@ -9,7 +9,7 @@ import { appRouter } from './init-trpc'; TrpcModule.forRoot({ path: '/trpc', router: appRouter, - createContext: () => ({}), + createContext, }), ], }) diff --git a/src/example/index.ts b/src/example/index.ts index 73ebc17..8ee503e 100644 --- a/src/example/index.ts +++ b/src/example/index.ts @@ -1,9 +1,16 @@ +/* eslint-disable import/no-extraneous-dependencies */ import { NestFactory } from '@nestjs/core'; -import { NestExpressApplication } from '@nestjs/platform-express'; +import { + FastifyAdapter, + NestFastifyApplication, +} from '@nestjs/platform-fastify'; +import fastifyCookie from '@fastify/cookie'; import { AppModule } from './app.module'; async function bootstrap() { - const app = await NestFactory.create(AppModule); + const app = await NestFactory.create(AppModule, new FastifyAdapter()); + app.register(fastifyCookie); + await app.listen(3000); } diff --git a/src/example/init-trpc.ts b/src/example/init-trpc.ts index 804048d..c346fd5 100644 --- a/src/example/init-trpc.ts +++ b/src/example/init-trpc.ts @@ -1,13 +1,24 @@ +/* eslint-disable import/no-extraneous-dependencies */ import { initTRPC } from '@trpc/server'; +import { CreateFastifyContextOptions } from '@trpc/server/adapters/fastify'; +import { FastifyReply, FastifyRequest } from 'fastify'; import { InferContextType } from '../lib/infer-context-type.type'; import { AService } from './domain-b/a.service'; // You can use any variable name you like. // We use t to keep things simple. -type CtxType = InferContextType; -const createContext = () => ({ - someValueOnContext: 'randomValue', -}); + +export const createContext = ({ req }: CreateFastifyContextOptions) => { + const { hostname } = req; + + return { + hostname, + someValueOnContext: 'randomValue', + }; +}; + +type CtxType = InferContextType; + const trpc = initTRPC.context().create({ }); @@ -18,7 +29,6 @@ const publicProcedure = trpc.procedure; export const appRouter = router({ something: publicProcedure.query(async ({ ctx }) => { const service = await ctx.resolveNestDependency(AService); - console.log({ service }); return service.smth(); }), }); diff --git a/src/lib/attach-trpc-to-express-app.ts b/src/lib/attach-trpc-to-express-app.ts index 51dfd68..054868a 100644 --- a/src/lib/attach-trpc-to-express-app.ts +++ b/src/lib/attach-trpc-to-express-app.ts @@ -1,11 +1,24 @@ -import { NestExpressApplication } from '@nestjs/platform-express'; +import type { NestExpressApplication } from '@nestjs/platform-express'; +import { fastifyTRPCPlugin } from '@trpc/server/adapters/fastify'; +import type { FastifyInstance } from 'fastify'; import { TrpcModuleOptions } from './trpc-module-options.type'; +import { + buildTrpcNestMiddleware, + BuildTrpcNestMiddlewareOptions, + extendTrpcContext, +} from './build-trpc-nest-middleware'; -import { buildTrpcNestMiddleware, BuildTrpcNestMiddlewareOptions } from './build-trpc-nest-middleware'; +type ExpressApp = { + expressApp?: NestExpressApplication, + fastifyApp?: never, +} & TrpcModuleOptions & BuildTrpcNestMiddlewareOptions; -interface Options extends TrpcModuleOptions, BuildTrpcNestMiddlewareOptions { - expressApp: NestExpressApplication, -} +type FastifyApp = { + expressApp?: never, + fastifyApp?: FastifyInstance, +} & TrpcModuleOptions & BuildTrpcNestMiddlewareOptions; + +type Options = ExpressApp | FastifyApp; /** * Attaches a TRPC router to your nestExpressApp @@ -20,5 +33,23 @@ export function attachTrpcToExpressApp({ createContext, }); - expressApp.use(path, trpcNestMiddleware); + expressApp?.use(path, trpcNestMiddleware); +} + +/** + * Attaches a TRPC router to your fastifyApp + * @param options: Options + */ +export function attachTrpcToFastifyApp({ + router, moduleRef, createContext, path, fastifyApp, +}: Options): void { + fastifyApp?.removeContentTypeParser(['application/json']); + + fastifyApp?.register(fastifyTRPCPlugin, { + prefix: path, + trpcOptions: { + router, + createContext: extendTrpcContext(createContext, moduleRef), + }, + }); } diff --git a/src/lib/build-trpc-nest-middleware.ts b/src/lib/build-trpc-nest-middleware.ts index 448ced9..eeb2862 100644 --- a/src/lib/build-trpc-nest-middleware.ts +++ b/src/lib/build-trpc-nest-middleware.ts @@ -1,6 +1,7 @@ import { createHTTPHandler } from '@trpc/server/adapters/standalone'; import { ModuleRef } from '@nestjs/core'; import { AnyRouter } from '@trpc/server'; +import { CreateFastifyContextOptions } from '@trpc/server/adapters/fastify'; import { buildNestResolver } from './build-nest-resolver'; export interface BuildTrpcNestMiddlewareOptions { @@ -36,6 +37,8 @@ export function buildTrpcNestMiddleware({ moduleRef, router, createContext }: Bu const userProvidedContext = createContext(); return { + req, + res, ...userProvidedContext, resolveNestDependency, }; @@ -43,3 +46,16 @@ export function buildTrpcNestMiddleware({ moduleRef, router, createContext }: Bu })(req, res); }; } + +export function extendTrpcContext(origContext: (args: CreateFastifyContextOptions) => any, moduleRef: ModuleRef) { + return function createContext({ req, res }: CreateFastifyContextOptions) { + const { resolveNestDependency } = buildNestResolver(req, moduleRef); + + return { + ...origContext({ req, res }), + req, + res, + resolveNestDependency, + }; + }; +} diff --git a/src/lib/infer-context-type.type.ts b/src/lib/infer-context-type.type.ts index d560476..2432d5f 100644 --- a/src/lib/infer-context-type.type.ts +++ b/src/lib/infer-context-type.type.ts @@ -1,7 +1,8 @@ import { inferAsyncReturnType } from '@trpc/server'; +import { IncomingMessage, ServerResponse } from 'http'; import { NestResolver } from './nest-resolver.type'; -export type InferContextType = - TContext extends () => any - ? inferAsyncReturnType & NestResolver - : NestResolver; +export type InferContextType = + TContext extends (args?:any) => any + ? inferAsyncReturnType & NestResolver + : NestResolver; diff --git a/src/lib/nest-resolver.type.ts b/src/lib/nest-resolver.type.ts index f87c5bd..2945ef9 100644 --- a/src/lib/nest-resolver.type.ts +++ b/src/lib/nest-resolver.type.ts @@ -3,7 +3,7 @@ interface Type extends Function { new(...args: any[]): T; } -export interface NestResolver { +export interface NestResolver { /** * Resolves any NestJS dependency from your project. a proxy to `moduleRef.get()` * @@ -12,4 +12,12 @@ export interface NestResolver { * Returns a promise which resolves to the dependency. */ resolveNestDependency: (typeOrToken: Type | Function | string | symbol) => Promise; + + /** + * + * Include request and response objects + * + */ + req: TReq, + res: TRes, } diff --git a/src/lib/trpc-module-options.type.ts b/src/lib/trpc-module-options.type.ts index 1667d12..3045819 100644 --- a/src/lib/trpc-module-options.type.ts +++ b/src/lib/trpc-module-options.type.ts @@ -3,5 +3,5 @@ import { AnyRouter } from '@trpc/server'; export interface TrpcModuleOptions { path: '/trpc' | string; router: TRouter; - createContext: () => any; + createContext: (args?: any) => any; } diff --git a/src/lib/trpc.module.ts b/src/lib/trpc.module.ts index fd45e43..f6f553c 100644 --- a/src/lib/trpc.module.ts +++ b/src/lib/trpc.module.ts @@ -2,7 +2,7 @@ import { DynamicModule, Inject, Module, OnModuleInit, } from '@nestjs/common'; import { HttpAdapterHost, ModuleRef } from '@nestjs/core'; -import { attachTrpcToExpressApp } from './attach-trpc-to-express-app'; +import { attachTrpcToFastifyApp } from './attach-trpc-to-express-app'; import { TRPC_CREATE_CONTEXT_TOKEN, TRPC_PATH_TOKEN, TRPC_ROUTER_TOKEN } from './tokens'; import { TrpcModuleOptions } from './trpc-module-options.type'; @@ -40,9 +40,9 @@ export class TrpcModule implements OnModuleInit { } onModuleInit() { - attachTrpcToExpressApp({ + attachTrpcToFastifyApp({ moduleRef: this.moduleRef, - expressApp: this.httpAdapterHost.httpAdapter.getInstance(), + fastifyApp: this.httpAdapterHost.httpAdapter.getInstance(), path: this.path, createContext: this.createContext, router: this.router, diff --git a/yarn.lock b/yarn.lock index e1d5c3b..4468405 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,6 +2,13 @@ # yarn lockfile v1 +"@cspotcode/source-map-support@^0.8.0": + version "0.8.1" + resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz#00629c35a688e05a88b1cda684fb9d5e73f000a1" + integrity sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw== + dependencies: + "@jridgewell/trace-mapping" "0.3.9" + "@eslint/eslintrc@^1.4.1": version "1.4.1" resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-1.4.1.tgz#af58772019a2d271b7e2d4c23ff4ddcba3ccfb3e" @@ -36,6 +43,24 @@ resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45" integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== +"@jridgewell/resolve-uri@^3.0.3": + version "3.1.1" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz#c08679063f279615a3326583ba3a90d1d82cc721" + integrity sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA== + +"@jridgewell/sourcemap-codec@^1.4.10": + version "1.4.15" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" + integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== + +"@jridgewell/trace-mapping@0.3.9": + version "0.3.9" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz#6534fd5933a53ba7cbf3a17615e273a0d1273ff9" + integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== + dependencies: + "@jridgewell/resolve-uri" "^3.0.3" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@lukeed/csprng@^1.0.0": version "1.0.1" resolved "https://registry.yarnpkg.com/@lukeed/csprng/-/csprng-1.0.1.tgz#625e93a0edb2c830e3c52ce2d67b9d53377c6a66" @@ -109,6 +134,26 @@ resolved "https://registry.yarnpkg.com/@trpc/server/-/server-10.10.0.tgz#0b494335140d4fd5e1452f7b57dcc9b8886720a4" integrity sha512-tCTqcqBT+3nebYFTHtwM877qo5xQPtVlptxKdUzMVWleWT4lFTL4oddk45qVURToci2iMbVJjd4jQU9y9/XwlQ== +"@tsconfig/node10@^1.0.7": + version "1.0.9" + resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.9.tgz#df4907fc07a886922637b15e02d4cebc4c0021b2" + integrity sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA== + +"@tsconfig/node12@^1.0.7": + version "1.0.11" + resolved "https://registry.yarnpkg.com/@tsconfig/node12/-/node12-1.0.11.tgz#ee3def1f27d9ed66dac6e46a295cffb0152e058d" + integrity sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag== + +"@tsconfig/node14@^1.0.0": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@tsconfig/node14/-/node14-1.0.3.tgz#e4386316284f00b98435bf40f72f75a09dabf6c1" + integrity sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow== + +"@tsconfig/node16@^1.0.2": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.4.tgz#0b92dcc0cc1c81f6f306a381f28e31b1a56536e9" + integrity sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA== + "@types/json-schema@^7.0.9": version "7.0.11" resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.11.tgz#d421b6c527a3037f7c84433fd2c4229e016863d3" @@ -231,7 +276,12 @@ acorn-jsx@^5.3.2: resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== -acorn@^8.8.0: +acorn-walk@^8.1.1: + version "8.2.0" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1" + integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== + +acorn@^8.4.1, acorn@^8.8.0: version "8.8.2" resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.2.tgz#1b2f25db02af965399b9776b0c2c391276d37c4a" integrity sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw== @@ -271,6 +321,11 @@ append-field@^1.0.0: resolved "https://registry.yarnpkg.com/append-field/-/append-field-1.0.0.tgz#1e3440e915f0b1203d23748e78edd7b9b5b43e56" integrity sha512-klpgFSWLW1ZEs8svjfb7g4qWY0YS5imI82dTg+QahUvJ8YqAY0P10Uk8tTyh9ZGuYEZEMaeJYCF5BFuX552hsw== +arg@^4.1.0: + version "4.1.3" + resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" + integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== + argparse@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" @@ -490,6 +545,11 @@ cors@2.8.5: object-assign "^4" vary "^1" +create-require@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" + integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== + cross-spawn@^7.0.2: version "7.0.3" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" @@ -543,6 +603,11 @@ destroy@1.2.0: resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== +diff@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" + integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== + dir-glob@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" @@ -1390,6 +1455,11 @@ lru-cache@^6.0.0: dependencies: yallist "^4.0.0" +make-error@^1.1.1: + version "1.3.6" + resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" + integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== + media-typer@0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" @@ -2019,6 +2089,25 @@ tr46@~0.0.3: resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== +ts-node@^10.9.1: + version "10.9.1" + resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.9.1.tgz#e73de9102958af9e1f0b168a6ff320e25adcff4b" + integrity sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw== + dependencies: + "@cspotcode/source-map-support" "^0.8.0" + "@tsconfig/node10" "^1.0.7" + "@tsconfig/node12" "^1.0.7" + "@tsconfig/node14" "^1.0.0" + "@tsconfig/node16" "^1.0.2" + acorn "^8.4.1" + acorn-walk "^8.1.1" + arg "^4.1.0" + create-require "^1.1.0" + diff "^4.0.1" + make-error "^1.1.1" + v8-compile-cache-lib "^3.0.1" + yn "3.1.1" + tsconfig-paths@^3.14.1: version "3.14.1" resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz#ba0734599e8ea36c862798e920bcf163277b137a" @@ -2134,6 +2223,11 @@ uuid@9.0.0: resolved "https://registry.yarnpkg.com/uuid/-/uuid-9.0.0.tgz#592f550650024a38ceb0c562f2f6aa435761efb5" integrity sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg== +v8-compile-cache-lib@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz#6336e8d71965cb3d35a1bbb7868445a7c05264bf" + integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg== + vary@^1, vary@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" @@ -2202,6 +2296,11 @@ yallist@^4.0.0: resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== +yn@3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" + integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== + yocto-queue@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b"