├── .eslintrc ├── .github └── workflows │ └── ci.yml ├── .gitignore ├── .vscode └── settings.json ├── CONTRIBUTING.md ├── README.md ├── changelog.md ├── examples ├── readme.md └── simple │ ├── .env │ ├── nodemon.json │ ├── package.json │ ├── prisma │ ├── .gitignore │ ├── migrations │ │ ├── 20241116165135_initial_migration │ │ │ └── migration.sql │ │ ├── 20241116165136_realtime_user_userlast_post_extramodal_comment_profile_follow_unrelated_idonly_withoutid_withscalars_snakeindb_kebabindb │ │ │ └── migration.sql │ │ └── migration_lock.toml │ └── schema.prisma │ ├── src │ ├── db.ts │ ├── realtime │ │ ├── configs.js │ │ ├── prismaExtension.ts │ │ └── prismaRealtimeStatus.json │ └── server.ts │ ├── tsconfig.json │ └── yarn.lock ├── jest.config.ts ├── package.json ├── src ├── bin.ts ├── env.ts ├── extensionGenerator │ ├── index.test.ts │ ├── index.ts │ └── utils │ │ └── parts.ts ├── generator.ts ├── index.ts ├── migrationsGenerator │ ├── index.test.ts │ ├── index.ts │ └── utils │ │ ├── migrationFile.ts │ │ └── statusFile.ts ├── tests │ ├── complexSchema.prisma │ ├── configs.js │ ├── getPrismaSchema.ts │ ├── health.test.ts │ └── simpleSchema.prisma └── utils │ ├── config.test.ts │ ├── config.ts │ ├── filesystem.ts │ ├── replacer.ts │ └── template.ts ├── tsconfig.json └── yarn.lock /.eslintrc: -------------------------------------------------------------------------------- 1 | { 2 | "extends": ["standard", "plugin:@typescript-eslint/recommended", "plugin:prettier/recommended"], 3 | "env": { 4 | "node": true 5 | }, 6 | "ignorePatterns": ["examples/*"], 7 | "rules": { 8 | "prettier/prettier": [ 9 | "error", 10 | { 11 | "semi": false, 12 | "printWidth": 120, 13 | "tabWidth": 2, 14 | "tabs": false, 15 | "singleQuote": true, 16 | "quoteProps": "consistent", 17 | "jsxSingleQuote": false, 18 | "trailingComma": "all", 19 | "bracketSpacing": true, 20 | "bracketSameLine": false, 21 | "arrowParens": "always", 22 | "endOfLine": "auto" 23 | } 24 | ], 25 | "@typescript-eslint/no-unused-vars": [ 26 | "warn", 27 | { 28 | "argsIgnorePattern": "^_", 29 | "varsIgnorePattern": "^_", 30 | "caughtErrorsIgnorePattern": "^_" 31 | } 32 | ], 33 | "import/order": ["warn", { 34 | "groups": ["builtin", "external", "internal", "parent", "sibling", "index", "object", "type"], 35 | "newlines-between": "never", 36 | "alphabetize": { 37 | "order": "asc", 38 | "caseInsensitive": true 39 | } 40 | }] 41 | }, 42 | "parser": "@typescript-eslint/parser", 43 | "plugins": ["@typescript-eslint"], 44 | "parserOptions": { 45 | "ecmaVersion": "latest", 46 | "sourceType": "module" 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /.github/workflows/ci.yml: -------------------------------------------------------------------------------- 1 | name: CI 2 | 3 | on: 4 | push: 5 | branches: 6 | - main 7 | - master 8 | 9 | pull_request: 10 | types: [opened, synchronize] 11 | 12 | workflow_dispatch: 13 | 14 | jobs: 15 | build: 16 | runs-on: ubuntu-latest 17 | strategy: 18 | matrix: 19 | prisma-version: [4.7.0, 4.8.0] 20 | node-version: [16, 18] 21 | 22 | name: Node ${{ matrix.node-version }} with Prisma ${{ matrix.prisma-version }} 23 | steps: 24 | - name: 🛑 Cancel Previous Runs 25 | uses: styfle/cancel-workflow-action@0.11.0 26 | 27 | - name: ⬇️ Checkout repo 28 | uses: actions/checkout@v3 29 | 30 | - name: ⎔ Setup Node.js environment 31 | uses: actions/setup-node@v3 32 | with: 33 | node-version: ${{ matrix.node-version }} 34 | cache: "yarn" 35 | 36 | - name: 🏗 Swap Prisma version to ~${{ matrix.prisma-version }} 37 | run: | 38 | sed -i -E 's|"prisma": ".*"|"prisma": "~${{ matrix.prisma-version }}"|g' package.json 39 | sed -i -E 's|"\@prisma/client": ".*"|"\@prisma/client": "~${{ matrix.prisma-version }}"|g' package.json 40 | sed -i -E 's|"\@prisma/generator-helper": ".*"|"\@prisma/generator-helper": "~${{ matrix.prisma-version }}"|g' package.json 41 | sed -i -E 's|"\@prisma/internals": ".*"|"\@prisma/internals": "~${{ matrix.prisma-version }}"|g' package.json 42 | 43 | - name: 📥 Install dependencies 44 | run: yarn install 45 | 46 | - name: 🧪 Run tests 47 | run: yarn test 48 | 49 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | coverage 3 | __snapshots__ 4 | generated/* 5 | dmmf.json 6 | log.txt 7 | yarn*.log 8 | dist 9 | tsconfig.tsbuildinfo 10 | TEST-* 11 | -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "files.eol": "\n", 3 | "typescript.tsdk": "node_modules/typescript/lib", 4 | } -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # Disclosures 2 | 3 | - We don't use tsconfig paths, because of examples (the prisma generate don't support paths) -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Prisma Generator Postgres Realtime 2 | 3 | A prisma generator that turns your Postgres Database into a realtime Database and make it easy to subscribe to changes from Prisma Client type-safe Api 4 | 5 | ## How it works? 6 | 7 | 1. On `prisma generate` it will generate the `prismaExtension.ts` and `prismaRealtimeStatus.json` (to store what migrations have been generated and avoid regenerating them) file and the needed `migrations` to make your database send realtime events 8 | 2. Run `prisma migrate dev` to apply all generated migrations 9 | 3. Use the generated extension in prisma client to enable a new client/models method called `$subscribe` and start watching to realtime events sent 10 | 11 | OBS: 12 | - (Optional) Use the `generatorConfigPath` generator option to customize some options for your project (like excluding models, ...) 13 | 14 | ### Set up 15 | 16 | #### Install generator 17 | `npm install --save-dev prisma-generator-postgres-realtime` (or yarn | pnpm version) 18 | 19 | #### Install node-postgres peer dependancy 20 | `npm install pg` 21 | 22 | #### Add the generator to your `schema.prisma` 23 | 24 | ```prisma 25 | // schema.prisma 26 | generator client { 27 | provider = "prisma-client-js" 28 | } 29 | 30 | // new generator here ⬇️ 31 | generator realtime { 32 | provider = "prisma-generator-postgres-realtime" 33 | generatorConfigPath = "../src/realtime/configs.js" // (optional) 34 | } 35 | 36 | /// This is an user 37 | model User { 38 | id String @id 39 | } 40 | ``` 41 | 42 | ### Usage 43 | 44 | 1. Run `prisma generate` to generate the `prismaExtension.ts` file and migrations 45 | 2. Run `prisma migrate dev` to apply all generated migrations 46 | 3. Import the extension to your prisma client 47 | ```ts 48 | /* src/db.ts */ 49 | import { PrismaClient } from "@prisma/client"; 50 | // Import auto generated extension 51 | import { prismaRealtimeExtension } from './realtime/prismaExtension'; 52 | 53 | const prisma = new PrismaClient().$extends(PrismaExtension); 54 | 55 | // global subscription 56 | prisma.$subscribe(({ dbUser, model, newRow, oldRow, operation, tableName, tableSchema, timestamp }) => { 57 | console.log(`${operation} in ${model} at ${timestamp}`) 58 | }) 59 | 60 | // typesafe model subscription 61 | prisma.user.$subscribe(({ dbUser, model, newRow, oldRow, operation, tableName, tableSchema, timestamp }) => { 62 | console.log(`${operation} in ${model} at ${timestamp}`) 63 | }, { 64 | // (optional) Enable logs for connection, by defaults only shows errors 65 | logLevel: "all", 66 | // (optional) Custom postgres connection string, by default it uses the one from `process.env.DATABASE_URL` 67 | connectionString: "postgres://postgres:postgres@localhost:5432/postgres" 68 | }) 69 | ``` 70 | 71 | ### Configuration file (optional) 72 | Create a configuration file (optional) and reference it in your `schema.prisma` generator config called `generatorConfigPath` 73 | 74 | This configuration file enables some options like customize generated code, file paths, Prisma importer for some projects like Monorepos and disabling realtime for some specific models 75 | 76 | ```ts 77 | // ./src/realtime/configs.js 78 | 79 | // /** @type {import('prisma-generator-postgres-realtime').Config} */ 80 | 81 | /** @type {import('../../../../src').Config} */ 82 | module.exports = { 83 | migrations: { 84 | // Option to disable the generation of migrations 85 | disabled: false, 86 | // Directory to generate the custom migrations from project root 87 | outputDirPath: "./prisma/migrations", 88 | // Path to generate the status file to from project root 89 | outputStatusFilePath: "./src/realtime/prismaRealtimeStatus.json", 90 | // A function to replace generated source 91 | replacer: (str) => str 92 | // Included models in migrations 93 | excludeModels: [], 94 | // Excluded models in migrations (Ignored if includeModels is set) 95 | includeModels: [], 96 | }, 97 | extension: { 98 | // Option to disable the generation of crud 99 | disabled: false, 100 | // Path to generate the inputs file to from project root 101 | outputFilePath: "./src/realtime/prismaExtension.ts", 102 | // The code to import the prisma client (Util for some projects like Monorepos) 103 | prismaClientImporter: `import { Prisma } from "@prisma/client";`, 104 | // A function to replace generated source 105 | replacer: (str) => str, 106 | }, 107 | global: { 108 | // Function to run before generate 109 | beforeGenerate: (dmmf) => {}, 110 | // Function to run after generate 111 | afterGenerate: (dmmf) => {}, 112 | // A function to replace generated source 113 | replacer: (str) => str, 114 | // The name of the postgres trigger 115 | triggerName: "prisma_postgres_realtime_trigger", 116 | }, 117 | }; 118 | 119 | ``` 120 | 121 | ### Examples 122 | 123 | Check for the [example](/examples/simple) for a running sample 124 | 125 | ### Disclaimer 126 | 127 | #### Prisma Views 128 | 129 | Currently, prisma does not enable us distinguish between models and views [(issue)](https://github.com/prisma/prisma/issues/17754). So if you are working with views you can disable generation of views from "options.migrations.excludeModels" or by simply deleting this part of code from the migration -------------------------------------------------------------------------------- /changelog.md: -------------------------------------------------------------------------------- 1 | # Changelog 2 | 3 | # 0.1.0 4 | 5 | - [x] Feat: First version 6 | -------------------------------------------------------------------------------- /examples/readme.md: -------------------------------------------------------------------------------- 1 | # Running examples 2 | 3 | ## With source code 4 | 5 | - Clone this repo 6 | - `cd examples/simple` 7 | - `yarn install` 8 | - `yarn migrate` 9 | - `yarn dev` 10 | - Create/update/delete some data in database and see realtime events logs 11 | 12 | ## Without 13 | 14 | - Clone this repo 15 | - `cd examples/simple` 16 | - `yarn install` 17 | - `yarn add prisma-generator-postgres-realtime` 18 | - Replace generator from `/prisma/schema.prisma` from `ts-node --transpile-only ../../src/generator.ts` to `prisma-generator-postgres-realtime` 19 | - `yarn migrate` 20 | - `yarn dev` 21 | - Create/update/delete some data in database and see realtime events logs -------------------------------------------------------------------------------- /examples/simple/.env: -------------------------------------------------------------------------------- 1 | # POSTGRES_REALTIME_CONFIG_PATH="../src/unexist/configs.js" 2 | DATABASE_URL="postgresql://my-pg-user:my-pg-pass@localhost:5432/realtime-postgres" -------------------------------------------------------------------------------- /examples/simple/nodemon.json: -------------------------------------------------------------------------------- 1 | { 2 | "watch": ["src", ".env"], 3 | "ext": "ts", 4 | "exec": "yarn build && yarn start" 5 | } 6 | -------------------------------------------------------------------------------- /examples/simple/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "inputs-simple", 3 | "version": "1.0.0", 4 | "main": "index.js", 5 | "license": "MIT", 6 | "scripts": { 7 | "generate": "prisma generate", 8 | "generate-debug": "npx cross-env DEBUG=* prisma generate", 9 | "migrate": "prisma migrate dev", 10 | "type": "tsc --noEmit", 11 | "dev": "nodemon", 12 | "build": "tsup ./src/server.ts", 13 | "start": "node dist/server.js", 14 | "tscheck": "tsc --noEmit" 15 | }, 16 | "dependencies": { 17 | "@prisma/client": "5.17.0", 18 | "@prisma/extension-pulse": "^1.2.0", 19 | "apollo-server": "^3.13.0", 20 | "graphql": "^16.8.1", 21 | "pg": "^8.13.1" 22 | }, 23 | "devDependencies": { 24 | "@types/pg": "^8.11.10", 25 | "nodemon": "^3.1.0", 26 | "prisma": "^5.17.0", 27 | "ts-node": "^10.9.2", 28 | "tsup": "^8.0.2", 29 | "typescript": "^5.5.3" 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /examples/simple/prisma/.gitignore: -------------------------------------------------------------------------------- 1 | *.db* -------------------------------------------------------------------------------- /examples/simple/prisma/migrations/20241116165135_initial_migration/migration.sql: -------------------------------------------------------------------------------- 1 | -- CreateTable 2 | CREATE TABLE "User" ( 3 | "id" SERIAL NOT NULL, 4 | "firstName" TEXT NOT NULL, 5 | "lastName" TEXT NOT NULL, 6 | "birthdate" TIMESTAMP(3) NOT NULL, 7 | "login" TEXT NOT NULL, 8 | "password" TEXT NOT NULL, 9 | "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, 10 | "updatedAt" TIMESTAMP(3), 11 | 12 | CONSTRAINT "User_pkey" PRIMARY KEY ("id") 13 | ); 14 | 15 | -- CreateTable 16 | CREATE TABLE "UserLast" ( 17 | "id" SERIAL NOT NULL, 18 | "name" TEXT NOT NULL, 19 | 20 | CONSTRAINT "UserLast_pkey" PRIMARY KEY ("id") 21 | ); 22 | 23 | -- CreateTable 24 | CREATE TABLE "Post" ( 25 | "id" SERIAL NOT NULL, 26 | "title" TEXT NOT NULL, 27 | "content" TEXT NOT NULL, 28 | "authorId" INTEGER NOT NULL, 29 | 30 | CONSTRAINT "Post_pkey" PRIMARY KEY ("id") 31 | ); 32 | 33 | -- CreateTable 34 | CREATE TABLE "ExtraModal" ( 35 | "id" SERIAL NOT NULL, 36 | "title" TEXT NOT NULL, 37 | "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, 38 | "updatedAt" TIMESTAMP(3), 39 | 40 | CONSTRAINT "ExtraModal_pkey" PRIMARY KEY ("id") 41 | ); 42 | 43 | -- CreateTable 44 | CREATE TABLE "Comment" ( 45 | "id" SERIAL NOT NULL, 46 | "comment" TEXT NOT NULL, 47 | "authorId" INTEGER NOT NULL, 48 | "postId" INTEGER NOT NULL, 49 | 50 | CONSTRAINT "Comment_pkey" PRIMARY KEY ("id") 51 | ); 52 | 53 | -- CreateTable 54 | CREATE TABLE "Profile" ( 55 | "id" SERIAL NOT NULL, 56 | "bio" TEXT, 57 | "userId" INTEGER NOT NULL, 58 | 59 | CONSTRAINT "Profile_pkey" PRIMARY KEY ("id") 60 | ); 61 | 62 | -- CreateTable 63 | CREATE TABLE "Follow" ( 64 | "fromId" INTEGER NOT NULL, 65 | "toId" INTEGER NOT NULL, 66 | 67 | CONSTRAINT "Follow_pkey" PRIMARY KEY ("fromId","toId") 68 | ); 69 | 70 | -- CreateTable 71 | CREATE TABLE "Unrelated" ( 72 | "id" SERIAL NOT NULL, 73 | "name" TEXT, 74 | 75 | CONSTRAINT "Unrelated_pkey" PRIMARY KEY ("id") 76 | ); 77 | 78 | -- CreateTable 79 | CREATE TABLE "IdOnly" ( 80 | "id" SERIAL NOT NULL, 81 | 82 | CONSTRAINT "IdOnly_pkey" PRIMARY KEY ("id") 83 | ); 84 | 85 | -- CreateTable 86 | CREATE TABLE "WithoutID" ( 87 | "name" TEXT NOT NULL 88 | ); 89 | 90 | -- CreateTable 91 | CREATE TABLE "WithScalars" ( 92 | "id" BIGSERIAL NOT NULL, 93 | "string" TEXT, 94 | "boolean" BOOLEAN, 95 | "int" INTEGER, 96 | "float" DOUBLE PRECISION, 97 | "decimal" DECIMAL(65,30), 98 | "bigint" BIGINT, 99 | "datetime" TIMESTAMP(3), 100 | "bytes" BYTEA, 101 | 102 | CONSTRAINT "WithScalars_pkey" PRIMARY KEY ("id") 103 | ); 104 | 105 | -- CreateTable 106 | CREATE TABLE "snake_in_db" ( 107 | "id" SERIAL NOT NULL, 108 | "title" TEXT NOT NULL, 109 | 110 | CONSTRAINT "snake_in_db_pkey" PRIMARY KEY ("id") 111 | ); 112 | 113 | -- CreateTable 114 | CREATE TABLE "kebab-in-db" ( 115 | "id" SERIAL NOT NULL, 116 | "title" TEXT NOT NULL, 117 | 118 | CONSTRAINT "kebab-in-db_pkey" PRIMARY KEY ("id") 119 | ); 120 | 121 | -- CreateIndex 122 | CREATE UNIQUE INDEX "Profile_userId_key" ON "Profile"("userId"); 123 | 124 | -- CreateIndex 125 | CREATE UNIQUE INDEX "WithoutID_name_key" ON "WithoutID"("name"); 126 | 127 | -- AddForeignKey 128 | ALTER TABLE "Post" ADD CONSTRAINT "Post_authorId_fkey" FOREIGN KEY ("authorId") REFERENCES "User"("id") ON DELETE RESTRICT ON UPDATE CASCADE; 129 | 130 | -- AddForeignKey 131 | ALTER TABLE "Comment" ADD CONSTRAINT "Comment_authorId_fkey" FOREIGN KEY ("authorId") REFERENCES "User"("id") ON DELETE RESTRICT ON UPDATE CASCADE; 132 | 133 | -- AddForeignKey 134 | ALTER TABLE "Comment" ADD CONSTRAINT "Comment_postId_fkey" FOREIGN KEY ("postId") REFERENCES "Post"("id") ON DELETE RESTRICT ON UPDATE CASCADE; 135 | 136 | -- AddForeignKey 137 | ALTER TABLE "Profile" ADD CONSTRAINT "Profile_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE RESTRICT ON UPDATE CASCADE; 138 | 139 | -- AddForeignKey 140 | ALTER TABLE "Follow" ADD CONSTRAINT "Follow_fromId_fkey" FOREIGN KEY ("fromId") REFERENCES "User"("id") ON DELETE RESTRICT ON UPDATE CASCADE; 141 | 142 | -- AddForeignKey 143 | ALTER TABLE "Follow" ADD CONSTRAINT "Follow_toId_fkey" FOREIGN KEY ("toId") REFERENCES "User"("id") ON DELETE RESTRICT ON UPDATE CASCADE; 144 | -------------------------------------------------------------------------------- /examples/simple/prisma/migrations/20241116165136_realtime_user_userlast_post_extramodal_comment_profile_follow_unrelated_idonly_withoutid_withscalars_snakeindb_kebabindb/migration.sql: -------------------------------------------------------------------------------- 1 | CREATE OR REPLACE FUNCTION notify_postgres_realtime() 2 | RETURNS TRIGGER AS $$ 3 | BEGIN 4 | -- Convert the NEW row to JSON and send it as a notification 5 | PERFORM pg_notify('prisma_postgres_realtime_trigger', json_build_object( 6 | 'tableName', TG_RELNAME, 7 | 'tableSchema', TG_TABLE_SCHEMA, 8 | 'operation', TG_OP, 9 | 'newRow', row_to_json(NEW), 10 | 'oldRow', row_to_json(OLD), 11 | 'timestamp', now(), 12 | 'dbUser', current_user 13 | )::text); 14 | RETURN NEW; 15 | END; 16 | $$ LANGUAGE plpgsql; 17 | 18 | CREATE OR REPLACE TRIGGER "User_table_update" 19 | AFTER INSERT OR UPDATE OR DELETE ON "User" 20 | FOR EACH ROW 21 | EXECUTE FUNCTION notify_postgres_realtime(); 22 | 23 | CREATE OR REPLACE TRIGGER "UserLast_table_update" 24 | AFTER INSERT OR UPDATE OR DELETE ON "UserLast" 25 | FOR EACH ROW 26 | EXECUTE FUNCTION notify_postgres_realtime(); 27 | 28 | CREATE OR REPLACE TRIGGER "Post_table_update" 29 | AFTER INSERT OR UPDATE OR DELETE ON "Post" 30 | FOR EACH ROW 31 | EXECUTE FUNCTION notify_postgres_realtime(); 32 | 33 | CREATE OR REPLACE TRIGGER "ExtraModal_table_update" 34 | AFTER INSERT OR UPDATE OR DELETE ON "ExtraModal" 35 | FOR EACH ROW 36 | EXECUTE FUNCTION notify_postgres_realtime(); 37 | 38 | CREATE OR REPLACE TRIGGER "Comment_table_update" 39 | AFTER INSERT OR UPDATE OR DELETE ON "Comment" 40 | FOR EACH ROW 41 | EXECUTE FUNCTION notify_postgres_realtime(); 42 | 43 | CREATE OR REPLACE TRIGGER "Profile_table_update" 44 | AFTER INSERT OR UPDATE OR DELETE ON "Profile" 45 | FOR EACH ROW 46 | EXECUTE FUNCTION notify_postgres_realtime(); 47 | 48 | CREATE OR REPLACE TRIGGER "Follow_table_update" 49 | AFTER INSERT OR UPDATE OR DELETE ON "Follow" 50 | FOR EACH ROW 51 | EXECUTE FUNCTION notify_postgres_realtime(); 52 | 53 | CREATE OR REPLACE TRIGGER "Unrelated_table_update" 54 | AFTER INSERT OR UPDATE OR DELETE ON "Unrelated" 55 | FOR EACH ROW 56 | EXECUTE FUNCTION notify_postgres_realtime(); 57 | 58 | CREATE OR REPLACE TRIGGER "IdOnly_table_update" 59 | AFTER INSERT OR UPDATE OR DELETE ON "IdOnly" 60 | FOR EACH ROW 61 | EXECUTE FUNCTION notify_postgres_realtime(); 62 | 63 | CREATE OR REPLACE TRIGGER "WithoutID_table_update" 64 | AFTER INSERT OR UPDATE OR DELETE ON "WithoutID" 65 | FOR EACH ROW 66 | EXECUTE FUNCTION notify_postgres_realtime(); 67 | 68 | CREATE OR REPLACE TRIGGER "WithScalars_table_update" 69 | AFTER INSERT OR UPDATE OR DELETE ON "WithScalars" 70 | FOR EACH ROW 71 | EXECUTE FUNCTION notify_postgres_realtime(); 72 | 73 | CREATE OR REPLACE TRIGGER "snake_in_db_table_update" 74 | AFTER INSERT OR UPDATE OR DELETE ON "snake_in_db" 75 | FOR EACH ROW 76 | EXECUTE FUNCTION notify_postgres_realtime(); 77 | 78 | CREATE OR REPLACE TRIGGER "kebab-in-db_table_update" 79 | AFTER INSERT OR UPDATE OR DELETE ON "kebab-in-db" 80 | FOR EACH ROW 81 | EXECUTE FUNCTION notify_postgres_realtime(); -------------------------------------------------------------------------------- /examples/simple/prisma/migrations/migration_lock.toml: -------------------------------------------------------------------------------- 1 | # Please do not edit this file manually 2 | # It should be added in your version-control system (i.e. Git) 3 | provider = "postgresql" -------------------------------------------------------------------------------- /examples/simple/prisma/schema.prisma: -------------------------------------------------------------------------------- 1 | datasource db { 2 | provider = "postgresql" 3 | url = env("DATABASE_URL") 4 | } 5 | 6 | generator client { 7 | provider = "prisma-client-js" 8 | } 9 | 10 | generator realtime { 11 | provider = "ts-node --transpile-only ../../src/generator.ts" 12 | generatorConfigPath = "../src/realtime/configs.js" 13 | } 14 | 15 | /// User of prisma 16 | model User { 17 | id Int @id @default(autoincrement()) 18 | /// firstname description 19 | firstName String 20 | /// lastname description 21 | lastName String 22 | birthdate DateTime 23 | login String 24 | password String 25 | /// relation desc 26 | Posts Post[] 27 | Comments Comment[] 28 | createdAt DateTime @default(now()) 29 | updatedAt DateTime? @updatedAt 30 | Profile Profile[] 31 | Followers Follow[] @relation("followers") 32 | Following Follow[] @relation("following") 33 | } 34 | 35 | /// Its for check for duplicating User.LastName and UserLast.Name 36 | model UserLast { 37 | id Int @id @default(autoincrement()) 38 | name String 39 | } 40 | 41 | model Post { 42 | id Int @id @default(autoincrement()) 43 | title String 44 | /// createdAt description 45 | content String 46 | Author User @relation(fields: [authorId], references: [id]) 47 | Comments Comment[] 48 | authorId Int 49 | } 50 | 51 | model ExtraModal { 52 | id Int @id @default(autoincrement()) 53 | /// The title of extramodal 54 | title String 55 | createdAt DateTime @default(now()) 56 | updatedAt DateTime? @updatedAt 57 | } 58 | 59 | /// This is a comment 60 | /// This is a multiline comment 61 | /// This is a 'single quote' comment 62 | /// This is a "double quote" comment 63 | /// This is a `backtick` comment 64 | model Comment { 65 | /// This is a comment 66 | /// This is a multiline comment 67 | /// This is a 'single quote' comment 68 | /// This is a "double quote" comment 69 | /// This is a `backtick` comment 70 | id Int @id @default(autoincrement()) 71 | /// This is a 'single quote' comment 72 | comment String 73 | /// This is a "double quote" comment 74 | Author User @relation(fields: [authorId], references: [id]) 75 | /// This is a `backtick` comment 76 | Post Post @relation(fields: [postId], references: [id]) 77 | authorId Int 78 | postId Int 79 | } 80 | 81 | model Profile { 82 | id Int @id @default(autoincrement()) 83 | bio String? 84 | User User @relation(fields: [userId], references: [id]) 85 | userId Int @unique 86 | } 87 | 88 | model Follow { 89 | fromId Int 90 | toId Int 91 | From User @relation("following", fields: [fromId], references: [id]) 92 | To User @relation("followers", fields: [toId], references: [id]) 93 | 94 | @@id([fromId, toId], name: "compositeID") 95 | } 96 | 97 | model Unrelated { 98 | id Int @id @default(autoincrement()) 99 | name String? 100 | } 101 | 102 | model IdOnly { 103 | id Int @id @default(autoincrement()) 104 | } 105 | 106 | model WithoutID { 107 | name String @unique 108 | } 109 | 110 | model WithScalars { 111 | id BigInt @id @default(autoincrement()) 112 | string String? 113 | boolean Boolean? 114 | int Int? 115 | float Float? 116 | decimal Decimal? 117 | bigint BigInt? 118 | datetime DateTime? 119 | bytes Bytes? 120 | } 121 | 122 | model SnakeInDb { 123 | id Int @id @default(autoincrement()) 124 | title String 125 | 126 | @@map("snake_in_db") 127 | } 128 | 129 | model KebabInDb { 130 | id Int @id @default(autoincrement()) 131 | title String 132 | 133 | @@map("kebab-in-db") 134 | } 135 | -------------------------------------------------------------------------------- /examples/simple/src/db.ts: -------------------------------------------------------------------------------- 1 | import { PrismaClient } from '@prisma/client'; 2 | // import { withPulse } from '@prisma/extension-pulse' 3 | import { prismaRealtimeExtension } from './realtime/prismaExtension'; 4 | 5 | export const db = new PrismaClient({ 6 | // log: ['error', 'info', 'query', 'warn'], 7 | }) 8 | .$extends(prismaRealtimeExtension) 9 | // .$extends( 10 | // withPulse({ apiKey: "process.env.PULSE_API_KEY" }) 11 | // ) 12 | -------------------------------------------------------------------------------- /examples/simple/src/realtime/configs.js: -------------------------------------------------------------------------------- 1 | // /** @type {import('prisma-generator-postgres-realtime').Config} */ 2 | 3 | /** @type {import('../../../../src').Config} */ 4 | module.exports = { 5 | migrations: { 6 | // Option to disable the generation of migrations 7 | disabled: false, 8 | // Directory to generate the custom migrations from project root 9 | outputDirPath: "./prisma/migrations", 10 | // Path to generate the status file to from project root 11 | outputStatusFilePath: "./src/realtime/prismaRealtimeStatus.json", 12 | // A function to replace generated source 13 | replacer: (str) => str, 14 | // Included models in migrations 15 | excludeModels: [], 16 | // Excluded models in migrations (Ignored if includeModels is set) 17 | includeModels: [], 18 | }, 19 | extension: { 20 | // Option to disable the generation of crud 21 | disabled: false, 22 | // Path to generate the inputs file to from project root 23 | outputFilePath: "./src/realtime/prismaExtension.ts", 24 | // The code to import the prisma client (Util for some projects like Monorepos) 25 | prismaClientImporter: `import { Prisma } from "@prisma/client";`, 26 | // A function to replace generated source 27 | replacer: (str) => str, 28 | }, 29 | global: { 30 | // Function to run before generate 31 | beforeGenerate: (dmmf) => {}, 32 | // Function to run after generate 33 | afterGenerate: (dmmf) => {}, 34 | // A function to replace generated source 35 | replacer: (str) => str, 36 | // The name of the postgres trigger 37 | triggerName: "prisma_postgres_realtime_trigger", 38 | }, 39 | }; 40 | -------------------------------------------------------------------------------- /examples/simple/src/realtime/prismaExtension.ts: -------------------------------------------------------------------------------- 1 | import { Prisma } from "@prisma/client"; 2 | import { Client } from "pg"; 3 | 4 | const triggerName = "prisma_postgres_realtime_trigger"; 5 | 6 | type ChangePropsRaw = { 7 | tableName: string; 8 | tableSchema: string; 9 | operation: "INSERT" | "UPDATE" | "DELETE"; 10 | newRow: T; 11 | oldRow: T; 12 | timestamp: string; 13 | dbUser: string; 14 | }; 15 | type ChangeProps = ChangePropsRaw & { 16 | model: Prisma.ModelName; 17 | }; 18 | type FnHanler = (props: ChangeProps) => void; 19 | type LogLevel = "none" | "error" | "all"; 20 | type Options = { logLevel?: LogLevel; connectionString?: string }; 21 | type Subscriber = { 22 | handler: FnHanler; 23 | model: Prisma.ModelName | null; 24 | options?: Options; 25 | }; 26 | 27 | const modelMaps: Record = { 28 | "snake_in_db": "SnakeInDb", 29 | "kebab-in-db": "KebabInDb", 30 | }; 31 | 32 | function log( 33 | options?: Options, 34 | logType?: "success" | "fail", 35 | message?: any, 36 | ...optionalParams: any 37 | ) { 38 | const logLevel = options?.logLevel || "error"; 39 | if (logLevel === "none") return; 40 | if (logLevel === "error" && logType !== "fail") return; 41 | console.log("Prisma Realtime Extension:", message, ...optionalParams); 42 | } 43 | 44 | const pgClient = (() => { 45 | type State = { 46 | client: Client | null; 47 | clientStatus: "disconected" | "connecting" | "connected"; 48 | // model = null to all 49 | subscribers: Array; 50 | }; 51 | const state: State = { 52 | client: null, 53 | clientStatus: "disconected", 54 | subscribers: [], 55 | }; 56 | 57 | const getClient = async (options?: Options): Promise => { 58 | if (state.client) return state.client; 59 | 60 | try { 61 | log(options, "success", `🟡 Trying to connect to PostgreSQL database`); 62 | const pgClient = new Client({ 63 | connectionString: options?.connectionString || process.env.DATABASE_URL, 64 | }); 65 | state.clientStatus = "connecting"; 66 | await pgClient.connect(); 67 | state.client = pgClient; 68 | state.clientStatus = "connected"; 69 | 70 | log(options, "success", `✅ Connected to PostgreSQL database`); 71 | return pgClient; 72 | } catch (error) { 73 | log(options, "fail", "Error connecting to PostgreSQL database:", error); 74 | await new Promise((resolve) => setTimeout(resolve, 2000)); 75 | return getClient(options); 76 | } 77 | }; 78 | 79 | async function startIfDisconnected(options?: Options) { 80 | if (state.clientStatus !== "disconected") return; 81 | 82 | try { 83 | const pgClient = await getClient(options); 84 | 85 | log(options, "success", "🟡 Trying to listen for table changes"); 86 | await pgClient.query(`LISTEN ${triggerName}`); 87 | log(options, "success", "✅ Listening for table changes"); 88 | 89 | pgClient.on("error", async (err) => { 90 | log(options, "fail", "PostgreSQL client error:", err); 91 | await pgClient?.end(); 92 | state.client = null; 93 | state.clientStatus = "disconected"; 94 | 95 | startIfDisconnected(options); 96 | }); 97 | 98 | pgClient.on("notification", (notification) => { 99 | if (!notification.payload) return; 100 | if (notification.channel !== triggerName) return; 101 | const parsed: ChangePropsRaw = JSON.parse(notification.payload); 102 | const model = 103 | modelMaps[parsed.tableName] || (parsed.tableName as Prisma.ModelName); 104 | const change: ChangeProps = { ...parsed, model }; 105 | 106 | for (const subscriber of state.subscribers) { 107 | if (subscriber.model !== null && subscriber.model !== change.model) 108 | continue; 109 | subscriber.handler(change); 110 | } 111 | }); 112 | 113 | return pgClient; 114 | } catch (error) { 115 | log(options, "fail", "Error listening for table changes:", error); 116 | await new Promise((resolve) => setTimeout(resolve, 2000)); 117 | state.client = null; 118 | state.clientStatus = "disconected"; 119 | return startIfDisconnected(options); 120 | } 121 | } 122 | 123 | async function onNotification(props: Subscriber) { 124 | await startIfDisconnected(props.options); 125 | state.subscribers.push(props); 126 | } 127 | 128 | return { onNotification }; 129 | })(); 130 | 131 | export const prismaRealtimeExtension = Prisma.defineExtension((client) => { 132 | return client.$extends({ 133 | client: { 134 | $subscribe: async (handler: FnHanler, options?: Options) => { 135 | pgClient.onNotification({ handler, model: null, options }); 136 | }, 137 | }, 138 | model: { 139 | $allModels: { 140 | async $subscribe< 141 | T, 142 | R extends Prisma.Result[number], 143 | >(this: T, handler: FnHanler, options?: Options) { 144 | pgClient.onNotification({ 145 | handler, 146 | model: (this as { name: Prisma.ModelName }).name, 147 | options, 148 | }); 149 | }, 150 | }, 151 | }, 152 | }); 153 | }); 154 | -------------------------------------------------------------------------------- /examples/simple/src/realtime/prismaRealtimeStatus.json: -------------------------------------------------------------------------------- 1 | { 2 | "migratedModels": [ 3 | "User", 4 | "UserLast", 5 | "Post", 6 | "ExtraModal", 7 | "Comment", 8 | "Profile", 9 | "Follow", 10 | "Unrelated", 11 | "IdOnly", 12 | "WithoutID", 13 | "WithScalars", 14 | "SnakeInDb", 15 | "KebabInDb" 16 | ] 17 | } -------------------------------------------------------------------------------- /examples/simple/src/server.ts: -------------------------------------------------------------------------------- 1 | import { db } from './db'; 2 | import http from 'http' 3 | 4 | const server = http.createServer((req, res) => { 5 | res.statusCode = 200; 6 | res.setHeader('Content-Type', 'text/plain'); 7 | res.end('Hello, World!'); 8 | }); 9 | 10 | db.$subscribe((anyModelChanged) => { 11 | console.log({ anyModelChanged }) 12 | }, { 13 | logLevel: "all" 14 | }) 15 | 16 | db.snakeInDb.$subscribe((snakeSubscribed) => { 17 | console.log({ snakeSubscribed }) 18 | }) 19 | 20 | const hostname = '0.0.0.0'; 21 | const port = 3000; 22 | 23 | server.listen(port, hostname, () => { 24 | console.log(`Server running at http://${hostname}:${port}/`); 25 | }); 26 | 27 | process.on('uncaughtException', function (err) { 28 | console.log('Caught exception: ' + err, 'error') 29 | }) -------------------------------------------------------------------------------- /examples/simple/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "lib": ["ES2023"], 4 | "module": "node16", 5 | "target": "ES2022", 6 | "esModuleInterop": true, 7 | "sourceMap": true, 8 | "outDir": "dist", 9 | "skipLibCheck": true, 10 | "noUncheckedIndexedAccess": true, 11 | "strictNullChecks": true, 12 | "noImplicitAny": true, 13 | "baseUrl": ".", 14 | "paths": { 15 | "@/*": ["src/*"] 16 | } 17 | }, 18 | "include": ["src"], 19 | "exclude": ["node_modules", "dist"] 20 | } 21 | -------------------------------------------------------------------------------- /examples/simple/yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@apollo/protobufjs@1.2.6": 6 | version "1.2.6" 7 | resolved "https://registry.yarnpkg.com/@apollo/protobufjs/-/protobufjs-1.2.6.tgz#d601e65211e06ae1432bf5993a1a0105f2862f27" 8 | integrity sha512-Wqo1oSHNUj/jxmsVp4iR3I480p6qdqHikn38lKrFhfzcDJ7lwd7Ck7cHRl4JE81tWNArl77xhnG/OkZhxKBYOw== 9 | dependencies: 10 | "@protobufjs/aspromise" "^1.1.2" 11 | "@protobufjs/base64" "^1.1.2" 12 | "@protobufjs/codegen" "^2.0.4" 13 | "@protobufjs/eventemitter" "^1.1.0" 14 | "@protobufjs/fetch" "^1.1.0" 15 | "@protobufjs/float" "^1.0.2" 16 | "@protobufjs/inquire" "^1.1.0" 17 | "@protobufjs/path" "^1.1.2" 18 | "@protobufjs/pool" "^1.1.0" 19 | "@protobufjs/utf8" "^1.1.0" 20 | "@types/long" "^4.0.0" 21 | "@types/node" "^10.1.0" 22 | long "^4.0.0" 23 | 24 | "@apollo/protobufjs@1.2.7": 25 | version "1.2.7" 26 | resolved "https://registry.yarnpkg.com/@apollo/protobufjs/-/protobufjs-1.2.7.tgz#3a8675512817e4a046a897e5f4f16415f16a7d8a" 27 | integrity sha512-Lahx5zntHPZia35myYDBRuF58tlwPskwHc5CWBZC/4bMKB6siTBWwtMrkqXcsNwQiFSzSx5hKdRPUmemrEp3Gg== 28 | dependencies: 29 | "@protobufjs/aspromise" "^1.1.2" 30 | "@protobufjs/base64" "^1.1.2" 31 | "@protobufjs/codegen" "^2.0.4" 32 | "@protobufjs/eventemitter" "^1.1.0" 33 | "@protobufjs/fetch" "^1.1.0" 34 | "@protobufjs/float" "^1.0.2" 35 | "@protobufjs/inquire" "^1.1.0" 36 | "@protobufjs/path" "^1.1.2" 37 | "@protobufjs/pool" "^1.1.0" 38 | "@protobufjs/utf8" "^1.1.0" 39 | "@types/long" "^4.0.0" 40 | long "^4.0.0" 41 | 42 | "@apollo/usage-reporting-protobuf@^4.0.0": 43 | version "4.1.1" 44 | resolved "https://registry.yarnpkg.com/@apollo/usage-reporting-protobuf/-/usage-reporting-protobuf-4.1.1.tgz#407c3d18c7fbed7a264f3b9a3812620b93499de1" 45 | integrity sha512-u40dIUePHaSKVshcedO7Wp+mPiZsaU6xjv9J+VyxpoU/zL6Jle+9zWeG98tr/+SZ0nZ4OXhrbb8SNr0rAPpIDA== 46 | dependencies: 47 | "@apollo/protobufjs" "1.2.7" 48 | 49 | "@apollo/utils.dropunuseddefinitions@^1.1.0": 50 | version "1.1.0" 51 | resolved "https://registry.yarnpkg.com/@apollo/utils.dropunuseddefinitions/-/utils.dropunuseddefinitions-1.1.0.tgz#02b04006442eaf037f4c4624146b12775d70d929" 52 | integrity sha512-jU1XjMr6ec9pPoL+BFWzEPW7VHHulVdGKMkPAMiCigpVIT11VmCbnij0bWob8uS3ODJ65tZLYKAh/55vLw2rbg== 53 | 54 | "@apollo/utils.keyvaluecache@^1.0.1": 55 | version "1.0.2" 56 | resolved "https://registry.yarnpkg.com/@apollo/utils.keyvaluecache/-/utils.keyvaluecache-1.0.2.tgz#2bfe358c4d82f3a0950518451996758c52613f57" 57 | integrity sha512-p7PVdLPMnPzmXSQVEsy27cYEjVON+SH/Wb7COyW3rQN8+wJgT1nv9jZouYtztWW8ZgTkii5T6tC9qfoDREd4mg== 58 | dependencies: 59 | "@apollo/utils.logger" "^1.0.0" 60 | lru-cache "7.10.1 - 7.13.1" 61 | 62 | "@apollo/utils.logger@^1.0.0": 63 | version "1.0.1" 64 | resolved "https://registry.yarnpkg.com/@apollo/utils.logger/-/utils.logger-1.0.1.tgz#aea0d1bb7ceb237f506c6bbf38f10a555b99a695" 65 | integrity sha512-XdlzoY7fYNK4OIcvMD2G94RoFZbzTQaNP0jozmqqMudmaGo2I/2Jx71xlDJ801mWA/mbYRihyaw6KJii7k5RVA== 66 | 67 | "@apollo/utils.printwithreducedwhitespace@^1.1.0": 68 | version "1.1.0" 69 | resolved "https://registry.yarnpkg.com/@apollo/utils.printwithreducedwhitespace/-/utils.printwithreducedwhitespace-1.1.0.tgz#c466299a4766eef8577a2a64c8f27712e8bd7e30" 70 | integrity sha512-GfFSkAv3n1toDZ4V6u2d7L4xMwLA+lv+6hqXicMN9KELSJ9yy9RzuEXaX73c/Ry+GzRsBy/fdSUGayGqdHfT2Q== 71 | 72 | "@apollo/utils.removealiases@1.0.0": 73 | version "1.0.0" 74 | resolved "https://registry.yarnpkg.com/@apollo/utils.removealiases/-/utils.removealiases-1.0.0.tgz#75f6d83098af1fcae2d3beb4f515ad4a8452a8c1" 75 | integrity sha512-6cM8sEOJW2LaGjL/0vHV0GtRaSekrPQR4DiywaApQlL9EdROASZU5PsQibe2MWeZCOhNrPRuHh4wDMwPsWTn8A== 76 | 77 | "@apollo/utils.sortast@^1.1.0": 78 | version "1.1.0" 79 | resolved "https://registry.yarnpkg.com/@apollo/utils.sortast/-/utils.sortast-1.1.0.tgz#93218c7008daf3e2a0725196085a33f5aab5ad07" 80 | integrity sha512-VPlTsmUnOwzPK5yGZENN069y6uUHgeiSlpEhRnLFYwYNoJHsuJq2vXVwIaSmts015WTPa2fpz1inkLYByeuRQA== 81 | dependencies: 82 | lodash.sortby "^4.7.0" 83 | 84 | "@apollo/utils.stripsensitiveliterals@^1.2.0": 85 | version "1.2.0" 86 | resolved "https://registry.yarnpkg.com/@apollo/utils.stripsensitiveliterals/-/utils.stripsensitiveliterals-1.2.0.tgz#4920651f36beee8e260e12031a0c5863ad0c7b28" 87 | integrity sha512-E41rDUzkz/cdikM5147d8nfCFVKovXxKBcjvLEQ7bjZm/cg9zEcXvS6vFY8ugTubI3fn6zoqo0CyU8zT+BGP9w== 88 | 89 | "@apollo/utils.usagereporting@^1.0.0": 90 | version "1.0.1" 91 | resolved "https://registry.yarnpkg.com/@apollo/utils.usagereporting/-/utils.usagereporting-1.0.1.tgz#3c70b49e554771659576fe35381c7a4b321d27fd" 92 | integrity sha512-6dk+0hZlnDbahDBB2mP/PZ5ybrtCJdLMbeNJD+TJpKyZmSY6bA3SjI8Cr2EM9QA+AdziywuWg+SgbWUF3/zQqQ== 93 | dependencies: 94 | "@apollo/usage-reporting-protobuf" "^4.0.0" 95 | "@apollo/utils.dropunuseddefinitions" "^1.1.0" 96 | "@apollo/utils.printwithreducedwhitespace" "^1.1.0" 97 | "@apollo/utils.removealiases" "1.0.0" 98 | "@apollo/utils.sortast" "^1.1.0" 99 | "@apollo/utils.stripsensitiveliterals" "^1.2.0" 100 | 101 | "@apollographql/apollo-tools@^0.5.3": 102 | version "0.5.4" 103 | resolved "https://registry.yarnpkg.com/@apollographql/apollo-tools/-/apollo-tools-0.5.4.tgz#cb3998c6cf12e494b90c733f44dd9935e2d8196c" 104 | integrity sha512-shM3q7rUbNyXVVRkQJQseXv6bnYM3BUma/eZhwXR4xsuM+bqWnJKvW7SAfRjP7LuSCocrexa5AXhjjawNHrIlw== 105 | 106 | "@apollographql/graphql-playground-html@1.6.29": 107 | version "1.6.29" 108 | resolved "https://registry.yarnpkg.com/@apollographql/graphql-playground-html/-/graphql-playground-html-1.6.29.tgz#a7a646614a255f62e10dcf64a7f68ead41dec453" 109 | integrity sha512-xCcXpoz52rI4ksJSdOCxeOCn2DLocxwHf9dVT/Q90Pte1LX+LY+91SFtJF3KXVHH8kEin+g1KKCQPKBjZJfWNA== 110 | dependencies: 111 | xss "^1.0.8" 112 | 113 | "@cspotcode/source-map-support@^0.8.0": 114 | version "0.8.1" 115 | resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz#00629c35a688e05a88b1cda684fb9d5e73f000a1" 116 | integrity sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw== 117 | dependencies: 118 | "@jridgewell/trace-mapping" "0.3.9" 119 | 120 | "@esbuild/aix-ppc64@0.21.5": 121 | version "0.21.5" 122 | resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz#c7184a326533fcdf1b8ee0733e21c713b975575f" 123 | integrity sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ== 124 | 125 | "@esbuild/android-arm64@0.21.5": 126 | version "0.21.5" 127 | resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz#09d9b4357780da9ea3a7dfb833a1f1ff439b4052" 128 | integrity sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A== 129 | 130 | "@esbuild/android-arm@0.21.5": 131 | version "0.21.5" 132 | resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.21.5.tgz#9b04384fb771926dfa6d7ad04324ecb2ab9b2e28" 133 | integrity sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg== 134 | 135 | "@esbuild/android-x64@0.21.5": 136 | version "0.21.5" 137 | resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.21.5.tgz#29918ec2db754cedcb6c1b04de8cd6547af6461e" 138 | integrity sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA== 139 | 140 | "@esbuild/darwin-arm64@0.21.5": 141 | version "0.21.5" 142 | resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz#e495b539660e51690f3928af50a76fb0a6ccff2a" 143 | integrity sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ== 144 | 145 | "@esbuild/darwin-x64@0.21.5": 146 | version "0.21.5" 147 | resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz#c13838fa57372839abdddc91d71542ceea2e1e22" 148 | integrity sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw== 149 | 150 | "@esbuild/freebsd-arm64@0.21.5": 151 | version "0.21.5" 152 | resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz#646b989aa20bf89fd071dd5dbfad69a3542e550e" 153 | integrity sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g== 154 | 155 | "@esbuild/freebsd-x64@0.21.5": 156 | version "0.21.5" 157 | resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz#aa615cfc80af954d3458906e38ca22c18cf5c261" 158 | integrity sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ== 159 | 160 | "@esbuild/linux-arm64@0.21.5": 161 | version "0.21.5" 162 | resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz#70ac6fa14f5cb7e1f7f887bcffb680ad09922b5b" 163 | integrity sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q== 164 | 165 | "@esbuild/linux-arm@0.21.5": 166 | version "0.21.5" 167 | resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz#fc6fd11a8aca56c1f6f3894f2bea0479f8f626b9" 168 | integrity sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA== 169 | 170 | "@esbuild/linux-ia32@0.21.5": 171 | version "0.21.5" 172 | resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz#3271f53b3f93e3d093d518d1649d6d68d346ede2" 173 | integrity sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg== 174 | 175 | "@esbuild/linux-loong64@0.21.5": 176 | version "0.21.5" 177 | resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz#ed62e04238c57026aea831c5a130b73c0f9f26df" 178 | integrity sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg== 179 | 180 | "@esbuild/linux-mips64el@0.21.5": 181 | version "0.21.5" 182 | resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz#e79b8eb48bf3b106fadec1ac8240fb97b4e64cbe" 183 | integrity sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg== 184 | 185 | "@esbuild/linux-ppc64@0.21.5": 186 | version "0.21.5" 187 | resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz#5f2203860a143b9919d383ef7573521fb154c3e4" 188 | integrity sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w== 189 | 190 | "@esbuild/linux-riscv64@0.21.5": 191 | version "0.21.5" 192 | resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz#07bcafd99322d5af62f618cb9e6a9b7f4bb825dc" 193 | integrity sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA== 194 | 195 | "@esbuild/linux-s390x@0.21.5": 196 | version "0.21.5" 197 | resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz#b7ccf686751d6a3e44b8627ababc8be3ef62d8de" 198 | integrity sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A== 199 | 200 | "@esbuild/linux-x64@0.21.5": 201 | version "0.21.5" 202 | resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz#6d8f0c768e070e64309af8004bb94e68ab2bb3b0" 203 | integrity sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ== 204 | 205 | "@esbuild/netbsd-x64@0.21.5": 206 | version "0.21.5" 207 | resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz#bbe430f60d378ecb88decb219c602667387a6047" 208 | integrity sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg== 209 | 210 | "@esbuild/openbsd-x64@0.21.5": 211 | version "0.21.5" 212 | resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz#99d1cf2937279560d2104821f5ccce220cb2af70" 213 | integrity sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow== 214 | 215 | "@esbuild/sunos-x64@0.21.5": 216 | version "0.21.5" 217 | resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz#08741512c10d529566baba837b4fe052c8f3487b" 218 | integrity sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg== 219 | 220 | "@esbuild/win32-arm64@0.21.5": 221 | version "0.21.5" 222 | resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz#675b7385398411240735016144ab2e99a60fc75d" 223 | integrity sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A== 224 | 225 | "@esbuild/win32-ia32@0.21.5": 226 | version "0.21.5" 227 | resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz#1bfc3ce98aa6ca9a0969e4d2af72144c59c1193b" 228 | integrity sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA== 229 | 230 | "@esbuild/win32-x64@0.21.5": 231 | version "0.21.5" 232 | resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz#acad351d582d157bb145535db2a6ff53dd514b5c" 233 | integrity sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw== 234 | 235 | "@graphql-tools/merge@8.3.1": 236 | version "8.3.1" 237 | resolved "https://registry.yarnpkg.com/@graphql-tools/merge/-/merge-8.3.1.tgz#06121942ad28982a14635dbc87b5d488a041d722" 238 | integrity sha512-BMm99mqdNZbEYeTPK3it9r9S6rsZsQKtlqJsSBknAclXq2pGEfOxjcIZi+kBSkHZKPKCRrYDd5vY0+rUmIHVLg== 239 | dependencies: 240 | "@graphql-tools/utils" "8.9.0" 241 | tslib "^2.4.0" 242 | 243 | "@graphql-tools/merge@^8.4.1": 244 | version "8.4.2" 245 | resolved "https://registry.yarnpkg.com/@graphql-tools/merge/-/merge-8.4.2.tgz#95778bbe26b635e8d2f60ce9856b388f11fe8288" 246 | integrity sha512-XbrHAaj8yDuINph+sAfuq3QCZ/tKblrTLOpirK0+CAgNlZUCHs0Fa+xtMUURgwCVThLle1AF7svJCxFizygLsw== 247 | dependencies: 248 | "@graphql-tools/utils" "^9.2.1" 249 | tslib "^2.4.0" 250 | 251 | "@graphql-tools/mock@^8.1.2": 252 | version "8.7.20" 253 | resolved "https://registry.yarnpkg.com/@graphql-tools/mock/-/mock-8.7.20.tgz#c83ae0f1940d194a3982120c9c85f3ac6b4f7f20" 254 | integrity sha512-ljcHSJWjC/ZyzpXd5cfNhPI7YljRVvabKHPzKjEs5ElxWu2cdlLGvyNYepApXDsM/OJG/2xuhGM+9GWu5gEAPQ== 255 | dependencies: 256 | "@graphql-tools/schema" "^9.0.18" 257 | "@graphql-tools/utils" "^9.2.1" 258 | fast-json-stable-stringify "^2.1.0" 259 | tslib "^2.4.0" 260 | 261 | "@graphql-tools/schema@^8.0.0": 262 | version "8.5.1" 263 | resolved "https://registry.yarnpkg.com/@graphql-tools/schema/-/schema-8.5.1.tgz#c2f2ff1448380919a330312399c9471db2580b58" 264 | integrity sha512-0Esilsh0P/qYcB5DKQpiKeQs/jevzIadNTaT0jeWklPMwNbT7yMX4EqZany7mbeRRlSRwMzNzL5olyFdffHBZg== 265 | dependencies: 266 | "@graphql-tools/merge" "8.3.1" 267 | "@graphql-tools/utils" "8.9.0" 268 | tslib "^2.4.0" 269 | value-or-promise "1.0.11" 270 | 271 | "@graphql-tools/schema@^9.0.18": 272 | version "9.0.19" 273 | resolved "https://registry.yarnpkg.com/@graphql-tools/schema/-/schema-9.0.19.tgz#c4ad373b5e1b8a0cf365163435b7d236ebdd06e7" 274 | integrity sha512-oBRPoNBtCkk0zbUsyP4GaIzCt8C0aCI4ycIRUL67KK5pOHljKLBBtGT+Jr6hkzA74C8Gco8bpZPe7aWFjiaK2w== 275 | dependencies: 276 | "@graphql-tools/merge" "^8.4.1" 277 | "@graphql-tools/utils" "^9.2.1" 278 | tslib "^2.4.0" 279 | value-or-promise "^1.0.12" 280 | 281 | "@graphql-tools/utils@8.9.0": 282 | version "8.9.0" 283 | resolved "https://registry.yarnpkg.com/@graphql-tools/utils/-/utils-8.9.0.tgz#c6aa5f651c9c99e1aca55510af21b56ec296cdb7" 284 | integrity sha512-pjJIWH0XOVnYGXCqej8g/u/tsfV4LvLlj0eATKQu5zwnxd/TiTHq7Cg313qUPTFFHZ3PP5wJ15chYVtLDwaymg== 285 | dependencies: 286 | tslib "^2.4.0" 287 | 288 | "@graphql-tools/utils@^9.2.1": 289 | version "9.2.1" 290 | resolved "https://registry.yarnpkg.com/@graphql-tools/utils/-/utils-9.2.1.tgz#1b3df0ef166cfa3eae706e3518b17d5922721c57" 291 | integrity sha512-WUw506Ql6xzmOORlriNrD6Ugx+HjVgYxt9KCXD9mHAak+eaXSwuGGPyE60hy9xaDEoXKBsG7SkG69ybitaVl6A== 292 | dependencies: 293 | "@graphql-typed-document-node/core" "^3.1.1" 294 | tslib "^2.4.0" 295 | 296 | "@graphql-typed-document-node/core@^3.1.1": 297 | version "3.2.0" 298 | resolved "https://registry.yarnpkg.com/@graphql-typed-document-node/core/-/core-3.2.0.tgz#5f3d96ec6b2354ad6d8a28bf216a1d97b5426861" 299 | integrity sha512-mB9oAsNCm9aM3/SOv4YtBMqZbYj10R7dkq8byBqxGY/ncFwhf2oQzMV+LCRlWoDSEBJ3COiR1yeDvMtsoOsuFQ== 300 | 301 | "@isaacs/cliui@^8.0.2": 302 | version "8.0.2" 303 | resolved "https://registry.yarnpkg.com/@isaacs/cliui/-/cliui-8.0.2.tgz#b37667b7bc181c168782259bab42474fbf52b550" 304 | integrity sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA== 305 | dependencies: 306 | string-width "^5.1.2" 307 | string-width-cjs "npm:string-width@^4.2.0" 308 | strip-ansi "^7.0.1" 309 | strip-ansi-cjs "npm:strip-ansi@^6.0.1" 310 | wrap-ansi "^8.1.0" 311 | wrap-ansi-cjs "npm:wrap-ansi@^7.0.0" 312 | 313 | "@josephg/resolvable@^1.0.0": 314 | version "1.0.1" 315 | resolved "https://registry.yarnpkg.com/@josephg/resolvable/-/resolvable-1.0.1.tgz#69bc4db754d79e1a2f17a650d3466e038d94a5eb" 316 | integrity sha512-CtzORUwWTTOTqfVtHaKRJ0I1kNQd1bpn3sUh8I3nJDVY+5/M/Oe1DnEWzPQvqq/xPIIkzzzIP7mfCoAjFRvDhg== 317 | 318 | "@jridgewell/gen-mapping@^0.3.2": 319 | version "0.3.5" 320 | resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz#dcce6aff74bdf6dad1a95802b69b04a2fcb1fb36" 321 | integrity sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg== 322 | dependencies: 323 | "@jridgewell/set-array" "^1.2.1" 324 | "@jridgewell/sourcemap-codec" "^1.4.10" 325 | "@jridgewell/trace-mapping" "^0.3.24" 326 | 327 | "@jridgewell/resolve-uri@^3.0.3", "@jridgewell/resolve-uri@^3.1.0": 328 | version "3.1.2" 329 | resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6" 330 | integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== 331 | 332 | "@jridgewell/set-array@^1.2.1": 333 | version "1.2.1" 334 | resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.2.1.tgz#558fb6472ed16a4c850b889530e6b36438c49280" 335 | integrity sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A== 336 | 337 | "@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14": 338 | version "1.4.15" 339 | resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" 340 | integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== 341 | 342 | "@jridgewell/trace-mapping@0.3.9": 343 | version "0.3.9" 344 | resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz#6534fd5933a53ba7cbf3a17615e273a0d1273ff9" 345 | integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== 346 | dependencies: 347 | "@jridgewell/resolve-uri" "^3.0.3" 348 | "@jridgewell/sourcemap-codec" "^1.4.10" 349 | 350 | "@jridgewell/trace-mapping@^0.3.24": 351 | version "0.3.25" 352 | resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz#15f190e98895f3fc23276ee14bc76b675c2e50f0" 353 | integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ== 354 | dependencies: 355 | "@jridgewell/resolve-uri" "^3.1.0" 356 | "@jridgewell/sourcemap-codec" "^1.4.14" 357 | 358 | "@nodelib/fs.scandir@2.1.5": 359 | version "2.1.5" 360 | resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" 361 | integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== 362 | dependencies: 363 | "@nodelib/fs.stat" "2.0.5" 364 | run-parallel "^1.1.9" 365 | 366 | "@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": 367 | version "2.0.5" 368 | resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" 369 | integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== 370 | 371 | "@nodelib/fs.walk@^1.2.3": 372 | version "1.2.8" 373 | resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" 374 | integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== 375 | dependencies: 376 | "@nodelib/fs.scandir" "2.1.5" 377 | fastq "^1.6.0" 378 | 379 | "@pkgjs/parseargs@^0.11.0": 380 | version "0.11.0" 381 | resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33" 382 | integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== 383 | 384 | "@prisma/client@5.17.0": 385 | version "5.17.0" 386 | resolved "https://registry.yarnpkg.com/@prisma/client/-/client-5.17.0.tgz#9079947bd749689c2dabfb9ecc70a24ebefb1f43" 387 | integrity sha512-N2tnyKayT0Zf7mHjwEyE8iG7FwTmXDHFZ1GnNhQp0pJUObsuel4ZZ1XwfuAYkq5mRIiC/Kot0kt0tGCfLJ70Jw== 388 | 389 | "@prisma/debug@5.17.0": 390 | version "5.17.0" 391 | resolved "https://registry.yarnpkg.com/@prisma/debug/-/debug-5.17.0.tgz#a765105848993984535b6066f8ebc6e6ead26533" 392 | integrity sha512-l7+AteR3P8FXiYyo496zkuoiJ5r9jLQEdUuxIxNCN1ud8rdbH3GTxm+f+dCyaSv9l9WY+29L9czaVRXz9mULfg== 393 | 394 | "@prisma/engines-version@5.17.0-31.393aa359c9ad4a4bb28630fb5613f9c281cde053": 395 | version "5.17.0-31.393aa359c9ad4a4bb28630fb5613f9c281cde053" 396 | resolved "https://registry.yarnpkg.com/@prisma/engines-version/-/engines-version-5.17.0-31.393aa359c9ad4a4bb28630fb5613f9c281cde053.tgz#3c7cc1ef3ebc34cbd069e5873b9982f2aabf5acd" 397 | integrity sha512-tUuxZZysZDcrk5oaNOdrBnnkoTtmNQPkzINFDjz7eG6vcs9AVDmA/F6K5Plsb2aQc/l5M2EnFqn3htng9FA4hg== 398 | 399 | "@prisma/engines@5.17.0": 400 | version "5.17.0" 401 | resolved "https://registry.yarnpkg.com/@prisma/engines/-/engines-5.17.0.tgz#74dd1aabb22675892760b3cf69a448e3aef4616b" 402 | integrity sha512-+r+Nf+JP210Jur+/X8SIPLtz+uW9YA4QO5IXA+KcSOBe/shT47bCcRMTYCbOESw3FFYFTwe7vU6KTWHKPiwvtg== 403 | dependencies: 404 | "@prisma/debug" "5.17.0" 405 | "@prisma/engines-version" "5.17.0-31.393aa359c9ad4a4bb28630fb5613f9c281cde053" 406 | "@prisma/fetch-engine" "5.17.0" 407 | "@prisma/get-platform" "5.17.0" 408 | 409 | "@prisma/extension-pulse@^1.2.0": 410 | version "1.2.0" 411 | resolved "https://registry.yarnpkg.com/@prisma/extension-pulse/-/extension-pulse-1.2.0.tgz#527f7792f4db36780002aabec38dfcc866dc2245" 412 | integrity sha512-ya8c0G9XVf1d8c+6iNczEWUVPjgXBokbjRp9M5Igqm3Ph2NRhbD/6ZyjEzDifTbwhlP9jGwur2XOqtYoQIUptA== 413 | dependencies: 414 | ws "^8.16.0" 415 | 416 | "@prisma/fetch-engine@5.17.0": 417 | version "5.17.0" 418 | resolved "https://registry.yarnpkg.com/@prisma/fetch-engine/-/fetch-engine-5.17.0.tgz#f718dc7426411d1ebeeee53e2d0d38652387f87c" 419 | integrity sha512-ESxiOaHuC488ilLPnrv/tM2KrPhQB5TRris/IeIV4ZvUuKeaicCl4Xj/JCQeG9IlxqOgf1cCg5h5vAzlewN91Q== 420 | dependencies: 421 | "@prisma/debug" "5.17.0" 422 | "@prisma/engines-version" "5.17.0-31.393aa359c9ad4a4bb28630fb5613f9c281cde053" 423 | "@prisma/get-platform" "5.17.0" 424 | 425 | "@prisma/get-platform@5.17.0": 426 | version "5.17.0" 427 | resolved "https://registry.yarnpkg.com/@prisma/get-platform/-/get-platform-5.17.0.tgz#89fdcae2adddebbbf0e7bd0474a6c49d6023519b" 428 | integrity sha512-UlDgbRozCP1rfJ5Tlkf3Cnftb6srGrEQ4Nm3og+1Se2gWmCZ0hmPIi+tQikGDUVLlvOWx3Gyi9LzgRP+HTXV9w== 429 | dependencies: 430 | "@prisma/debug" "5.17.0" 431 | 432 | "@protobufjs/aspromise@^1.1.1", "@protobufjs/aspromise@^1.1.2": 433 | version "1.1.2" 434 | resolved "https://registry.yarnpkg.com/@protobufjs/aspromise/-/aspromise-1.1.2.tgz#9b8b0cc663d669a7d8f6f5d0893a14d348f30fbf" 435 | integrity sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ== 436 | 437 | "@protobufjs/base64@^1.1.2": 438 | version "1.1.2" 439 | resolved "https://registry.yarnpkg.com/@protobufjs/base64/-/base64-1.1.2.tgz#4c85730e59b9a1f1f349047dbf24296034bb2735" 440 | integrity sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg== 441 | 442 | "@protobufjs/codegen@^2.0.4": 443 | version "2.0.4" 444 | resolved "https://registry.yarnpkg.com/@protobufjs/codegen/-/codegen-2.0.4.tgz#7ef37f0d010fb028ad1ad59722e506d9262815cb" 445 | integrity sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg== 446 | 447 | "@protobufjs/eventemitter@^1.1.0": 448 | version "1.1.0" 449 | resolved "https://registry.yarnpkg.com/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz#355cbc98bafad5978f9ed095f397621f1d066b70" 450 | integrity sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q== 451 | 452 | "@protobufjs/fetch@^1.1.0": 453 | version "1.1.0" 454 | resolved "https://registry.yarnpkg.com/@protobufjs/fetch/-/fetch-1.1.0.tgz#ba99fb598614af65700c1619ff06d454b0d84c45" 455 | integrity sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ== 456 | dependencies: 457 | "@protobufjs/aspromise" "^1.1.1" 458 | "@protobufjs/inquire" "^1.1.0" 459 | 460 | "@protobufjs/float@^1.0.2": 461 | version "1.0.2" 462 | resolved "https://registry.yarnpkg.com/@protobufjs/float/-/float-1.0.2.tgz#5e9e1abdcb73fc0a7cb8b291df78c8cbd97b87d1" 463 | integrity sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ== 464 | 465 | "@protobufjs/inquire@^1.1.0": 466 | version "1.1.0" 467 | resolved "https://registry.yarnpkg.com/@protobufjs/inquire/-/inquire-1.1.0.tgz#ff200e3e7cf2429e2dcafc1140828e8cc638f089" 468 | integrity sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q== 469 | 470 | "@protobufjs/path@^1.1.2": 471 | version "1.1.2" 472 | resolved "https://registry.yarnpkg.com/@protobufjs/path/-/path-1.1.2.tgz#6cc2b20c5c9ad6ad0dccfd21ca7673d8d7fbf68d" 473 | integrity sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA== 474 | 475 | "@protobufjs/pool@^1.1.0": 476 | version "1.1.0" 477 | resolved "https://registry.yarnpkg.com/@protobufjs/pool/-/pool-1.1.0.tgz#09fd15f2d6d3abfa9b65bc366506d6ad7846ff54" 478 | integrity sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw== 479 | 480 | "@protobufjs/utf8@^1.1.0": 481 | version "1.1.0" 482 | resolved "https://registry.yarnpkg.com/@protobufjs/utf8/-/utf8-1.1.0.tgz#a777360b5b39a1a2e5106f8e858f2fd2d060c570" 483 | integrity sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw== 484 | 485 | "@rollup/rollup-android-arm-eabi@4.18.0": 486 | version "4.18.0" 487 | resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.18.0.tgz#bbd0e616b2078cd2d68afc9824d1fadb2f2ffd27" 488 | integrity sha512-Tya6xypR10giZV1XzxmH5wr25VcZSncG0pZIjfePT0OVBvqNEurzValetGNarVrGiq66EBVAFn15iYX4w6FKgQ== 489 | 490 | "@rollup/rollup-android-arm64@4.18.0": 491 | version "4.18.0" 492 | resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.18.0.tgz#97255ef6384c5f73f4800c0de91f5f6518e21203" 493 | integrity sha512-avCea0RAP03lTsDhEyfy+hpfr85KfyTctMADqHVhLAF3MlIkq83CP8UfAHUssgXTYd+6er6PaAhx/QGv4L1EiA== 494 | 495 | "@rollup/rollup-darwin-arm64@4.18.0": 496 | version "4.18.0" 497 | resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.18.0.tgz#b6dd74e117510dfe94541646067b0545b42ff096" 498 | integrity sha512-IWfdwU7KDSm07Ty0PuA/W2JYoZ4iTj3TUQjkVsO/6U+4I1jN5lcR71ZEvRh52sDOERdnNhhHU57UITXz5jC1/w== 499 | 500 | "@rollup/rollup-darwin-x64@4.18.0": 501 | version "4.18.0" 502 | resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.18.0.tgz#e07d76de1cec987673e7f3d48ccb8e106d42c05c" 503 | integrity sha512-n2LMsUz7Ynu7DoQrSQkBf8iNrjOGyPLrdSg802vk6XT3FtsgX6JbE8IHRvposskFm9SNxzkLYGSq9QdpLYpRNA== 504 | 505 | "@rollup/rollup-linux-arm-gnueabihf@4.18.0": 506 | version "4.18.0" 507 | resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.18.0.tgz#9f1a6d218b560c9d75185af4b8bb42f9f24736b8" 508 | integrity sha512-C/zbRYRXFjWvz9Z4haRxcTdnkPt1BtCkz+7RtBSuNmKzMzp3ZxdM28Mpccn6pt28/UWUCTXa+b0Mx1k3g6NOMA== 509 | 510 | "@rollup/rollup-linux-arm-musleabihf@4.18.0": 511 | version "4.18.0" 512 | resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.18.0.tgz#53618b92e6ffb642c7b620e6e528446511330549" 513 | integrity sha512-l3m9ewPgjQSXrUMHg93vt0hYCGnrMOcUpTz6FLtbwljo2HluS4zTXFy2571YQbisTnfTKPZ01u/ukJdQTLGh9A== 514 | 515 | "@rollup/rollup-linux-arm64-gnu@4.18.0": 516 | version "4.18.0" 517 | resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.18.0.tgz#99a7ba5e719d4f053761a698f7b52291cefba577" 518 | integrity sha512-rJ5D47d8WD7J+7STKdCUAgmQk49xuFrRi9pZkWoRD1UeSMakbcepWXPF8ycChBoAqs1pb2wzvbY6Q33WmN2ftw== 519 | 520 | "@rollup/rollup-linux-arm64-musl@4.18.0": 521 | version "4.18.0" 522 | resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.18.0.tgz#f53db99a45d9bc00ce94db8a35efa7c3c144a58c" 523 | integrity sha512-be6Yx37b24ZwxQ+wOQXXLZqpq4jTckJhtGlWGZs68TgdKXJgw54lUUoFYrg6Zs/kjzAQwEwYbp8JxZVzZLRepQ== 524 | 525 | "@rollup/rollup-linux-powerpc64le-gnu@4.18.0": 526 | version "4.18.0" 527 | resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.18.0.tgz#cbb0837408fe081ce3435cf3730e090febafc9bf" 528 | integrity sha512-hNVMQK+qrA9Todu9+wqrXOHxFiD5YmdEi3paj6vP02Kx1hjd2LLYR2eaN7DsEshg09+9uzWi2W18MJDlG0cxJA== 529 | 530 | "@rollup/rollup-linux-riscv64-gnu@4.18.0": 531 | version "4.18.0" 532 | resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.18.0.tgz#8ed09c1d1262ada4c38d791a28ae0fea28b80cc9" 533 | integrity sha512-ROCM7i+m1NfdrsmvwSzoxp9HFtmKGHEqu5NNDiZWQtXLA8S5HBCkVvKAxJ8U+CVctHwV2Gb5VUaK7UAkzhDjlg== 534 | 535 | "@rollup/rollup-linux-s390x-gnu@4.18.0": 536 | version "4.18.0" 537 | resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.18.0.tgz#938138d3c8e0c96f022252a28441dcfb17afd7ec" 538 | integrity sha512-0UyyRHyDN42QL+NbqevXIIUnKA47A+45WyasO+y2bGJ1mhQrfrtXUpTxCOrfxCR4esV3/RLYyucGVPiUsO8xjg== 539 | 540 | "@rollup/rollup-linux-x64-gnu@4.18.0": 541 | version "4.18.0" 542 | resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.18.0.tgz#1a7481137a54740bee1ded4ae5752450f155d942" 543 | integrity sha512-xuglR2rBVHA5UsI8h8UbX4VJ470PtGCf5Vpswh7p2ukaqBGFTnsfzxUBetoWBWymHMxbIG0Cmx7Y9qDZzr648w== 544 | 545 | "@rollup/rollup-linux-x64-musl@4.18.0": 546 | version "4.18.0" 547 | resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.18.0.tgz#f1186afc601ac4f4fc25fac4ca15ecbee3a1874d" 548 | integrity sha512-LKaqQL9osY/ir2geuLVvRRs+utWUNilzdE90TpyoX0eNqPzWjRm14oMEE+YLve4k/NAqCdPkGYDaDF5Sw+xBfg== 549 | 550 | "@rollup/rollup-win32-arm64-msvc@4.18.0": 551 | version "4.18.0" 552 | resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.18.0.tgz#ed6603e93636a96203c6915be4117245c1bd2daf" 553 | integrity sha512-7J6TkZQFGo9qBKH0pk2cEVSRhJbL6MtfWxth7Y5YmZs57Pi+4x6c2dStAUvaQkHQLnEQv1jzBUW43GvZW8OFqA== 554 | 555 | "@rollup/rollup-win32-ia32-msvc@4.18.0": 556 | version "4.18.0" 557 | resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.18.0.tgz#14e0b404b1c25ebe6157a15edb9c46959ba74c54" 558 | integrity sha512-Txjh+IxBPbkUB9+SXZMpv+b/vnTEtFyfWZgJ6iyCmt2tdx0OF5WhFowLmnh8ENGNpfUlUZkdI//4IEmhwPieNg== 559 | 560 | "@rollup/rollup-win32-x64-msvc@4.18.0": 561 | version "4.18.0" 562 | resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.18.0.tgz#5d694d345ce36b6ecf657349e03eb87297e68da4" 563 | integrity sha512-UOo5FdvOL0+eIVTgS4tIdbW+TtnBLWg1YBCcU2KWM7nuNwRz9bksDX1bekJJCpu25N1DVWaCwnT39dVQxzqS8g== 564 | 565 | "@tsconfig/node10@^1.0.7": 566 | version "1.0.11" 567 | resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.11.tgz#6ee46400685f130e278128c7b38b7e031ff5b2f2" 568 | integrity sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw== 569 | 570 | "@tsconfig/node12@^1.0.7": 571 | version "1.0.11" 572 | resolved "https://registry.yarnpkg.com/@tsconfig/node12/-/node12-1.0.11.tgz#ee3def1f27d9ed66dac6e46a295cffb0152e058d" 573 | integrity sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag== 574 | 575 | "@tsconfig/node14@^1.0.0": 576 | version "1.0.3" 577 | resolved "https://registry.yarnpkg.com/@tsconfig/node14/-/node14-1.0.3.tgz#e4386316284f00b98435bf40f72f75a09dabf6c1" 578 | integrity sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow== 579 | 580 | "@tsconfig/node16@^1.0.2": 581 | version "1.0.4" 582 | resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.4.tgz#0b92dcc0cc1c81f6f306a381f28e31b1a56536e9" 583 | integrity sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA== 584 | 585 | "@types/accepts@^1.3.5": 586 | version "1.3.7" 587 | resolved "https://registry.yarnpkg.com/@types/accepts/-/accepts-1.3.7.tgz#3b98b1889d2b2386604c2bbbe62e4fb51e95b265" 588 | integrity sha512-Pay9fq2lM2wXPWbteBsRAGiWH2hig4ZE2asK+mm7kUzlxRTfL961rj89I6zV/E3PcIkDqyuBEcMxFT7rccugeQ== 589 | dependencies: 590 | "@types/node" "*" 591 | 592 | "@types/body-parser@*": 593 | version "1.19.5" 594 | resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.5.tgz#04ce9a3b677dc8bd681a17da1ab9835dc9d3ede4" 595 | integrity sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg== 596 | dependencies: 597 | "@types/connect" "*" 598 | "@types/node" "*" 599 | 600 | "@types/body-parser@1.19.2": 601 | version "1.19.2" 602 | resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.2.tgz#aea2059e28b7658639081347ac4fab3de166e6f0" 603 | integrity sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g== 604 | dependencies: 605 | "@types/connect" "*" 606 | "@types/node" "*" 607 | 608 | "@types/connect@*": 609 | version "3.4.38" 610 | resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.38.tgz#5ba7f3bc4fbbdeaff8dded952e5ff2cc53f8d858" 611 | integrity sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug== 612 | dependencies: 613 | "@types/node" "*" 614 | 615 | "@types/cors@2.8.12": 616 | version "2.8.12" 617 | resolved "https://registry.yarnpkg.com/@types/cors/-/cors-2.8.12.tgz#6b2c510a7ad7039e98e7b8d3d6598f4359e5c080" 618 | integrity sha512-vt+kDhq/M2ayberEtJcIN/hxXy1Pk+59g2FV/ZQceeaTyCtCucjL2Q7FXlFjtWn4n15KCr1NE2lNNFhp0lEThw== 619 | 620 | "@types/estree@1.0.5": 621 | version "1.0.5" 622 | resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.5.tgz#a6ce3e556e00fd9895dd872dd172ad0d4bd687f4" 623 | integrity sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw== 624 | 625 | "@types/express-serve-static-core@4.17.31": 626 | version "4.17.31" 627 | resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.31.tgz#a1139efeab4e7323834bb0226e62ac019f474b2f" 628 | integrity sha512-DxMhY+NAsTwMMFHBTtJFNp5qiHKJ7TeqOo23zVEM9alT1Ml27Q3xcTH0xwxn7Q0BbMcVEJOs/7aQtUWupUQN3Q== 629 | dependencies: 630 | "@types/node" "*" 631 | "@types/qs" "*" 632 | "@types/range-parser" "*" 633 | 634 | "@types/express-serve-static-core@^4.17.18": 635 | version "4.19.5" 636 | resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.19.5.tgz#218064e321126fcf9048d1ca25dd2465da55d9c6" 637 | integrity sha512-y6W03tvrACO72aijJ5uF02FRq5cgDR9lUxddQ8vyF+GvmjJQqbzDcJngEjURc+ZsG31VI3hODNZJ2URj86pzmg== 638 | dependencies: 639 | "@types/node" "*" 640 | "@types/qs" "*" 641 | "@types/range-parser" "*" 642 | "@types/send" "*" 643 | 644 | "@types/express@4.17.14": 645 | version "4.17.14" 646 | resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.14.tgz#143ea0557249bc1b3b54f15db4c81c3d4eb3569c" 647 | integrity sha512-TEbt+vaPFQ+xpxFLFssxUDXj5cWCxZJjIcB7Yg0k0GMHGtgtQgpvx/MUQUeAkNbA9AAGrwkAsoeItdTgS7FMyg== 648 | dependencies: 649 | "@types/body-parser" "*" 650 | "@types/express-serve-static-core" "^4.17.18" 651 | "@types/qs" "*" 652 | "@types/serve-static" "*" 653 | 654 | "@types/http-errors@*": 655 | version "2.0.4" 656 | resolved "https://registry.yarnpkg.com/@types/http-errors/-/http-errors-2.0.4.tgz#7eb47726c391b7345a6ec35ad7f4de469cf5ba4f" 657 | integrity sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA== 658 | 659 | "@types/long@^4.0.0": 660 | version "4.0.2" 661 | resolved "https://registry.yarnpkg.com/@types/long/-/long-4.0.2.tgz#b74129719fc8d11c01868010082d483b7545591a" 662 | integrity sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA== 663 | 664 | "@types/mime@^1": 665 | version "1.3.5" 666 | resolved "https://registry.yarnpkg.com/@types/mime/-/mime-1.3.5.tgz#1ef302e01cf7d2b5a0fa526790c9123bf1d06690" 667 | integrity sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w== 668 | 669 | "@types/node@*": 670 | version "20.14.7" 671 | resolved "https://registry.yarnpkg.com/@types/node/-/node-20.14.7.tgz#342cada27f97509eb8eb2dbc003edf21ce8ab5a8" 672 | integrity sha512-uTr2m2IbJJucF3KUxgnGOZvYbN0QgkGyWxG6973HCpMYFy2KfcgYuIwkJQMQkt1VbBMlvWRbpshFTLxnxCZjKQ== 673 | dependencies: 674 | undici-types "~5.26.4" 675 | 676 | "@types/node@^10.1.0": 677 | version "10.17.60" 678 | resolved "https://registry.yarnpkg.com/@types/node/-/node-10.17.60.tgz#35f3d6213daed95da7f0f73e75bcc6980e90597b" 679 | integrity sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw== 680 | 681 | "@types/pg@^8.11.10": 682 | version "8.11.10" 683 | resolved "https://registry.yarnpkg.com/@types/pg/-/pg-8.11.10.tgz#b8fb2b2b759d452fe3ec182beadd382563b63291" 684 | integrity sha512-LczQUW4dbOQzsH2RQ5qoeJ6qJPdrcM/DcMLoqWQkMLMsq83J5lAX3LXjdkWdpscFy67JSOWDnh7Ny/sPFykmkg== 685 | dependencies: 686 | "@types/node" "*" 687 | pg-protocol "*" 688 | pg-types "^4.0.1" 689 | 690 | "@types/qs@*": 691 | version "6.9.15" 692 | resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.15.tgz#adde8a060ec9c305a82de1babc1056e73bd64dce" 693 | integrity sha512-uXHQKES6DQKKCLh441Xv/dwxOq1TVS3JPUMlEqoEglvlhR6Mxnlew/Xq/LRVHpLyk7iK3zODe1qYHIMltO7XGg== 694 | 695 | "@types/range-parser@*": 696 | version "1.2.7" 697 | resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.7.tgz#50ae4353eaaddc04044279812f52c8c65857dbcb" 698 | integrity sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ== 699 | 700 | "@types/send@*": 701 | version "0.17.4" 702 | resolved "https://registry.yarnpkg.com/@types/send/-/send-0.17.4.tgz#6619cd24e7270793702e4e6a4b958a9010cfc57a" 703 | integrity sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA== 704 | dependencies: 705 | "@types/mime" "^1" 706 | "@types/node" "*" 707 | 708 | "@types/serve-static@*": 709 | version "1.15.7" 710 | resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.15.7.tgz#22174bbd74fb97fe303109738e9b5c2f3064f714" 711 | integrity sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw== 712 | dependencies: 713 | "@types/http-errors" "*" 714 | "@types/node" "*" 715 | "@types/send" "*" 716 | 717 | accepts@^1.3.5, accepts@~1.3.8: 718 | version "1.3.8" 719 | resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" 720 | integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== 721 | dependencies: 722 | mime-types "~2.1.34" 723 | negotiator "0.6.3" 724 | 725 | acorn-walk@^8.1.1: 726 | version "8.3.3" 727 | resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.3.3.tgz#9caeac29eefaa0c41e3d4c65137de4d6f34df43e" 728 | integrity sha512-MxXdReSRhGO7VlFe1bRG/oI7/mdLV9B9JJT0N8vZOhF7gFRR5l3M8W9G8JxmKV+JC5mGqJ0QvqfSOLsCPa4nUw== 729 | dependencies: 730 | acorn "^8.11.0" 731 | 732 | acorn@^8.11.0, acorn@^8.4.1: 733 | version "8.12.0" 734 | resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.12.0.tgz#1627bfa2e058148036133b8d9b51a700663c294c" 735 | integrity sha512-RTvkC4w+KNXrM39/lWCUaG0IbRkWdCv7W/IOW9oU6SawyxulvkQy5HQPVTKxEjczcUvapcrw3cFx/60VN/NRNw== 736 | 737 | ansi-regex@^5.0.1: 738 | version "5.0.1" 739 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" 740 | integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== 741 | 742 | ansi-regex@^6.0.1: 743 | version "6.0.1" 744 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.0.1.tgz#3183e38fae9a65d7cb5e53945cd5897d0260a06a" 745 | integrity sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA== 746 | 747 | ansi-styles@^4.0.0: 748 | version "4.3.0" 749 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" 750 | integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== 751 | dependencies: 752 | color-convert "^2.0.1" 753 | 754 | ansi-styles@^6.1.0: 755 | version "6.2.1" 756 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5" 757 | integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== 758 | 759 | any-promise@^1.0.0: 760 | version "1.3.0" 761 | resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f" 762 | integrity sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A== 763 | 764 | anymatch@~3.1.2: 765 | version "3.1.3" 766 | resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" 767 | integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== 768 | dependencies: 769 | normalize-path "^3.0.0" 770 | picomatch "^2.0.4" 771 | 772 | apollo-datasource@^3.3.2: 773 | version "3.3.2" 774 | resolved "https://registry.yarnpkg.com/apollo-datasource/-/apollo-datasource-3.3.2.tgz#5711f8b38d4b7b53fb788cb4dbd4a6a526ea74c8" 775 | integrity sha512-L5TiS8E2Hn/Yz7SSnWIVbZw0ZfEIXZCa5VUiVxD9P53JvSrf4aStvsFDlGWPvpIdCR+aly2CfoB79B9/JjKFqg== 776 | dependencies: 777 | "@apollo/utils.keyvaluecache" "^1.0.1" 778 | apollo-server-env "^4.2.1" 779 | 780 | apollo-reporting-protobuf@^3.4.0: 781 | version "3.4.0" 782 | resolved "https://registry.yarnpkg.com/apollo-reporting-protobuf/-/apollo-reporting-protobuf-3.4.0.tgz#6edd31f09d4a3704d9e808d1db30eca2229ded26" 783 | integrity sha512-h0u3EbC/9RpihWOmcSsvTW2O6RXVaD/mPEjfrPkxRPTEPWqncsgOoRJw+wih4OqfH3PvTJvoEIf4LwKrUaqWog== 784 | dependencies: 785 | "@apollo/protobufjs" "1.2.6" 786 | 787 | apollo-server-core@^3.13.0: 788 | version "3.13.0" 789 | resolved "https://registry.yarnpkg.com/apollo-server-core/-/apollo-server-core-3.13.0.tgz#ad6601fbb34cc97eedca27a9fb0b5738d11cd27d" 790 | integrity sha512-v/g6DR6KuHn9DYSdtQijz8dLOkP78I5JSVJzPkARhDbhpH74QNwrQ2PP2URAPPEDJ2EeZNQDX8PvbYkAKqg+kg== 791 | dependencies: 792 | "@apollo/utils.keyvaluecache" "^1.0.1" 793 | "@apollo/utils.logger" "^1.0.0" 794 | "@apollo/utils.usagereporting" "^1.0.0" 795 | "@apollographql/apollo-tools" "^0.5.3" 796 | "@apollographql/graphql-playground-html" "1.6.29" 797 | "@graphql-tools/mock" "^8.1.2" 798 | "@graphql-tools/schema" "^8.0.0" 799 | "@josephg/resolvable" "^1.0.0" 800 | apollo-datasource "^3.3.2" 801 | apollo-reporting-protobuf "^3.4.0" 802 | apollo-server-env "^4.2.1" 803 | apollo-server-errors "^3.3.1" 804 | apollo-server-plugin-base "^3.7.2" 805 | apollo-server-types "^3.8.0" 806 | async-retry "^1.2.1" 807 | fast-json-stable-stringify "^2.1.0" 808 | graphql-tag "^2.11.0" 809 | loglevel "^1.6.8" 810 | lru-cache "^6.0.0" 811 | node-abort-controller "^3.0.1" 812 | sha.js "^2.4.11" 813 | uuid "^9.0.0" 814 | whatwg-mimetype "^3.0.0" 815 | 816 | apollo-server-env@^4.2.1: 817 | version "4.2.1" 818 | resolved "https://registry.yarnpkg.com/apollo-server-env/-/apollo-server-env-4.2.1.tgz#ea5b1944accdbdba311f179e4dfaeca482c20185" 819 | integrity sha512-vm/7c7ld+zFMxibzqZ7SSa5tBENc4B0uye9LTfjJwGoQFY5xsUPH5FpO5j0bMUDZ8YYNbrF9SNtzc5Cngcr90g== 820 | dependencies: 821 | node-fetch "^2.6.7" 822 | 823 | apollo-server-errors@^3.3.1: 824 | version "3.3.1" 825 | resolved "https://registry.yarnpkg.com/apollo-server-errors/-/apollo-server-errors-3.3.1.tgz#ba5c00cdaa33d4cbd09779f8cb6f47475d1cd655" 826 | integrity sha512-xnZJ5QWs6FixHICXHxUfm+ZWqqxrNuPlQ+kj5m6RtEgIpekOPssH/SD9gf2B4HuWV0QozorrygwZnux8POvyPA== 827 | 828 | apollo-server-express@^3.13.0: 829 | version "3.13.0" 830 | resolved "https://registry.yarnpkg.com/apollo-server-express/-/apollo-server-express-3.13.0.tgz#0d8d9bbba3b8b8264912d215f63fd44e74d5f42a" 831 | integrity sha512-iSxICNbDUyebOuM8EKb3xOrpIwOQgKxGbR2diSr4HP3IW8T3njKFOoMce50vr+moOCe1ev8BnLcw9SNbuUtf7g== 832 | dependencies: 833 | "@types/accepts" "^1.3.5" 834 | "@types/body-parser" "1.19.2" 835 | "@types/cors" "2.8.12" 836 | "@types/express" "4.17.14" 837 | "@types/express-serve-static-core" "4.17.31" 838 | accepts "^1.3.5" 839 | apollo-server-core "^3.13.0" 840 | apollo-server-types "^3.8.0" 841 | body-parser "^1.19.0" 842 | cors "^2.8.5" 843 | parseurl "^1.3.3" 844 | 845 | apollo-server-plugin-base@^3.7.2: 846 | version "3.7.2" 847 | resolved "https://registry.yarnpkg.com/apollo-server-plugin-base/-/apollo-server-plugin-base-3.7.2.tgz#c19cd137bc4c993ba2490ba2b571b0f3ce60a0cd" 848 | integrity sha512-wE8dwGDvBOGehSsPTRZ8P/33Jan6/PmL0y0aN/1Z5a5GcbFhDaaJCjK5cav6npbbGL2DPKK0r6MPXi3k3N45aw== 849 | dependencies: 850 | apollo-server-types "^3.8.0" 851 | 852 | apollo-server-types@^3.8.0: 853 | version "3.8.0" 854 | resolved "https://registry.yarnpkg.com/apollo-server-types/-/apollo-server-types-3.8.0.tgz#d976b6967878681f715fe2b9e4dad9ba86b1346f" 855 | integrity sha512-ZI/8rTE4ww8BHktsVpb91Sdq7Cb71rdSkXELSwdSR0eXu600/sY+1UXhTWdiJvk+Eq5ljqoHLwLbY2+Clq2b9A== 856 | dependencies: 857 | "@apollo/utils.keyvaluecache" "^1.0.1" 858 | "@apollo/utils.logger" "^1.0.0" 859 | apollo-reporting-protobuf "^3.4.0" 860 | apollo-server-env "^4.2.1" 861 | 862 | apollo-server@^3.13.0: 863 | version "3.13.0" 864 | resolved "https://registry.yarnpkg.com/apollo-server/-/apollo-server-3.13.0.tgz#38d355756717c0cb519e7ab95bce6dcc8ce35677" 865 | integrity sha512-hgT/MswNB5G1r+oBhggVX4Fjw53CFLqG15yB5sN+OrYkCVWF5YwPbJWHfSWa7699JMEXJGaoVfFzcvLZK0UlDg== 866 | dependencies: 867 | "@types/express" "4.17.14" 868 | apollo-server-core "^3.13.0" 869 | apollo-server-express "^3.13.0" 870 | express "^4.17.1" 871 | 872 | arg@^4.1.0: 873 | version "4.1.3" 874 | resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" 875 | integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== 876 | 877 | array-flatten@1.1.1: 878 | version "1.1.1" 879 | resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" 880 | integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== 881 | 882 | array-union@^2.1.0: 883 | version "2.1.0" 884 | resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" 885 | integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== 886 | 887 | async-retry@^1.2.1: 888 | version "1.3.3" 889 | resolved "https://registry.yarnpkg.com/async-retry/-/async-retry-1.3.3.tgz#0e7f36c04d8478e7a58bdbed80cedf977785f280" 890 | integrity sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw== 891 | dependencies: 892 | retry "0.13.1" 893 | 894 | balanced-match@^1.0.0: 895 | version "1.0.2" 896 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" 897 | integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== 898 | 899 | binary-extensions@^2.0.0: 900 | version "2.3.0" 901 | resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.3.0.tgz#f6e14a97858d327252200242d4ccfe522c445522" 902 | integrity sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw== 903 | 904 | body-parser@1.20.2, body-parser@^1.19.0: 905 | version "1.20.2" 906 | resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.2.tgz#6feb0e21c4724d06de7ff38da36dad4f57a747fd" 907 | integrity sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA== 908 | dependencies: 909 | bytes "3.1.2" 910 | content-type "~1.0.5" 911 | debug "2.6.9" 912 | depd "2.0.0" 913 | destroy "1.2.0" 914 | http-errors "2.0.0" 915 | iconv-lite "0.4.24" 916 | on-finished "2.4.1" 917 | qs "6.11.0" 918 | raw-body "2.5.2" 919 | type-is "~1.6.18" 920 | unpipe "1.0.0" 921 | 922 | brace-expansion@^1.1.7: 923 | version "1.1.11" 924 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" 925 | integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== 926 | dependencies: 927 | balanced-match "^1.0.0" 928 | concat-map "0.0.1" 929 | 930 | brace-expansion@^2.0.1: 931 | version "2.0.1" 932 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" 933 | integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== 934 | dependencies: 935 | balanced-match "^1.0.0" 936 | 937 | braces@^3.0.3, braces@~3.0.2: 938 | version "3.0.3" 939 | resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789" 940 | integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== 941 | dependencies: 942 | fill-range "^7.1.1" 943 | 944 | bundle-require@^4.0.0: 945 | version "4.2.1" 946 | resolved "https://registry.yarnpkg.com/bundle-require/-/bundle-require-4.2.1.tgz#4c450a5807381d20ade987bde8ac391544257919" 947 | integrity sha512-7Q/6vkyYAwOmQNRw75x+4yRtZCZJXUDmHHlFdkiV0wgv/reNjtJwpu1jPJ0w2kbEpIM0uoKI3S4/f39dU7AjSA== 948 | dependencies: 949 | load-tsconfig "^0.2.3" 950 | 951 | bytes@3.1.2: 952 | version "3.1.2" 953 | resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" 954 | integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== 955 | 956 | cac@^6.7.12: 957 | version "6.7.14" 958 | resolved "https://registry.yarnpkg.com/cac/-/cac-6.7.14.tgz#804e1e6f506ee363cb0e3ccbb09cad5dd9870959" 959 | integrity sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ== 960 | 961 | call-bind@^1.0.7: 962 | version "1.0.7" 963 | resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.7.tgz#06016599c40c56498c18769d2730be242b6fa3b9" 964 | integrity sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w== 965 | dependencies: 966 | es-define-property "^1.0.0" 967 | es-errors "^1.3.0" 968 | function-bind "^1.1.2" 969 | get-intrinsic "^1.2.4" 970 | set-function-length "^1.2.1" 971 | 972 | chokidar@^3.5.1, chokidar@^3.5.2: 973 | version "3.6.0" 974 | resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b" 975 | integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw== 976 | dependencies: 977 | anymatch "~3.1.2" 978 | braces "~3.0.2" 979 | glob-parent "~5.1.2" 980 | is-binary-path "~2.1.0" 981 | is-glob "~4.0.1" 982 | normalize-path "~3.0.0" 983 | readdirp "~3.6.0" 984 | optionalDependencies: 985 | fsevents "~2.3.2" 986 | 987 | color-convert@^2.0.1: 988 | version "2.0.1" 989 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" 990 | integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== 991 | dependencies: 992 | color-name "~1.1.4" 993 | 994 | color-name@~1.1.4: 995 | version "1.1.4" 996 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" 997 | integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== 998 | 999 | commander@^2.20.3: 1000 | version "2.20.3" 1001 | resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" 1002 | integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== 1003 | 1004 | commander@^4.0.0: 1005 | version "4.1.1" 1006 | resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068" 1007 | integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA== 1008 | 1009 | concat-map@0.0.1: 1010 | version "0.0.1" 1011 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 1012 | integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== 1013 | 1014 | content-disposition@0.5.4: 1015 | version "0.5.4" 1016 | resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe" 1017 | integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ== 1018 | dependencies: 1019 | safe-buffer "5.2.1" 1020 | 1021 | content-type@~1.0.4, content-type@~1.0.5: 1022 | version "1.0.5" 1023 | resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.5.tgz#8b773162656d1d1086784c8f23a54ce6d73d7918" 1024 | integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA== 1025 | 1026 | cookie-signature@1.0.6: 1027 | version "1.0.6" 1028 | resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" 1029 | integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ== 1030 | 1031 | cookie@0.6.0: 1032 | version "0.6.0" 1033 | resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.6.0.tgz#2798b04b071b0ecbff0dbb62a505a8efa4e19051" 1034 | integrity sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw== 1035 | 1036 | cors@^2.8.5: 1037 | version "2.8.5" 1038 | resolved "https://registry.yarnpkg.com/cors/-/cors-2.8.5.tgz#eac11da51592dd86b9f06f6e7ac293b3df875d29" 1039 | integrity sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g== 1040 | dependencies: 1041 | object-assign "^4" 1042 | vary "^1" 1043 | 1044 | create-require@^1.1.0: 1045 | version "1.1.1" 1046 | resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" 1047 | integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== 1048 | 1049 | cross-spawn@^7.0.0, cross-spawn@^7.0.3: 1050 | version "7.0.3" 1051 | resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" 1052 | integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== 1053 | dependencies: 1054 | path-key "^3.1.0" 1055 | shebang-command "^2.0.0" 1056 | which "^2.0.1" 1057 | 1058 | cssfilter@0.0.10: 1059 | version "0.0.10" 1060 | resolved "https://registry.yarnpkg.com/cssfilter/-/cssfilter-0.0.10.tgz#c6d2672632a2e5c83e013e6864a42ce8defd20ae" 1061 | integrity sha512-FAaLDaplstoRsDR8XGYH51znUN0UY7nMc6Z9/fvE8EXGwvJE9hu7W2vHwx1+bd6gCYnln9nLbzxFTrcO9YQDZw== 1062 | 1063 | debug@2.6.9: 1064 | version "2.6.9" 1065 | resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" 1066 | integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== 1067 | dependencies: 1068 | ms "2.0.0" 1069 | 1070 | debug@^4, debug@^4.3.1: 1071 | version "4.3.5" 1072 | resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.5.tgz#e83444eceb9fedd4a1da56d671ae2446a01a6e1e" 1073 | integrity sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg== 1074 | dependencies: 1075 | ms "2.1.2" 1076 | 1077 | define-data-property@^1.1.4: 1078 | version "1.1.4" 1079 | resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.4.tgz#894dc141bb7d3060ae4366f6a0107e68fbe48c5e" 1080 | integrity sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A== 1081 | dependencies: 1082 | es-define-property "^1.0.0" 1083 | es-errors "^1.3.0" 1084 | gopd "^1.0.1" 1085 | 1086 | depd@2.0.0: 1087 | version "2.0.0" 1088 | resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" 1089 | integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== 1090 | 1091 | destroy@1.2.0: 1092 | version "1.2.0" 1093 | resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" 1094 | integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== 1095 | 1096 | diff@^4.0.1: 1097 | version "4.0.2" 1098 | resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" 1099 | integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== 1100 | 1101 | dir-glob@^3.0.1: 1102 | version "3.0.1" 1103 | resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" 1104 | integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== 1105 | dependencies: 1106 | path-type "^4.0.0" 1107 | 1108 | eastasianwidth@^0.2.0: 1109 | version "0.2.0" 1110 | resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" 1111 | integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== 1112 | 1113 | ee-first@1.1.1: 1114 | version "1.1.1" 1115 | resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" 1116 | integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== 1117 | 1118 | emoji-regex@^8.0.0: 1119 | version "8.0.0" 1120 | resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" 1121 | integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== 1122 | 1123 | emoji-regex@^9.2.2: 1124 | version "9.2.2" 1125 | resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" 1126 | integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== 1127 | 1128 | encodeurl@~1.0.2: 1129 | version "1.0.2" 1130 | resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" 1131 | integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== 1132 | 1133 | es-define-property@^1.0.0: 1134 | version "1.0.0" 1135 | resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.0.tgz#c7faefbdff8b2696cf5f46921edfb77cc4ba3845" 1136 | integrity sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ== 1137 | dependencies: 1138 | get-intrinsic "^1.2.4" 1139 | 1140 | es-errors@^1.3.0: 1141 | version "1.3.0" 1142 | resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" 1143 | integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== 1144 | 1145 | esbuild@^0.21.4: 1146 | version "0.21.5" 1147 | resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.21.5.tgz#9ca301b120922959b766360d8ac830da0d02997d" 1148 | integrity sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw== 1149 | optionalDependencies: 1150 | "@esbuild/aix-ppc64" "0.21.5" 1151 | "@esbuild/android-arm" "0.21.5" 1152 | "@esbuild/android-arm64" "0.21.5" 1153 | "@esbuild/android-x64" "0.21.5" 1154 | "@esbuild/darwin-arm64" "0.21.5" 1155 | "@esbuild/darwin-x64" "0.21.5" 1156 | "@esbuild/freebsd-arm64" "0.21.5" 1157 | "@esbuild/freebsd-x64" "0.21.5" 1158 | "@esbuild/linux-arm" "0.21.5" 1159 | "@esbuild/linux-arm64" "0.21.5" 1160 | "@esbuild/linux-ia32" "0.21.5" 1161 | "@esbuild/linux-loong64" "0.21.5" 1162 | "@esbuild/linux-mips64el" "0.21.5" 1163 | "@esbuild/linux-ppc64" "0.21.5" 1164 | "@esbuild/linux-riscv64" "0.21.5" 1165 | "@esbuild/linux-s390x" "0.21.5" 1166 | "@esbuild/linux-x64" "0.21.5" 1167 | "@esbuild/netbsd-x64" "0.21.5" 1168 | "@esbuild/openbsd-x64" "0.21.5" 1169 | "@esbuild/sunos-x64" "0.21.5" 1170 | "@esbuild/win32-arm64" "0.21.5" 1171 | "@esbuild/win32-ia32" "0.21.5" 1172 | "@esbuild/win32-x64" "0.21.5" 1173 | 1174 | escape-html@~1.0.3: 1175 | version "1.0.3" 1176 | resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" 1177 | integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== 1178 | 1179 | etag@~1.8.1: 1180 | version "1.8.1" 1181 | resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" 1182 | integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== 1183 | 1184 | execa@^5.0.0: 1185 | version "5.1.1" 1186 | resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" 1187 | integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== 1188 | dependencies: 1189 | cross-spawn "^7.0.3" 1190 | get-stream "^6.0.0" 1191 | human-signals "^2.1.0" 1192 | is-stream "^2.0.0" 1193 | merge-stream "^2.0.0" 1194 | npm-run-path "^4.0.1" 1195 | onetime "^5.1.2" 1196 | signal-exit "^3.0.3" 1197 | strip-final-newline "^2.0.0" 1198 | 1199 | express@^4.17.1: 1200 | version "4.19.2" 1201 | resolved "https://registry.yarnpkg.com/express/-/express-4.19.2.tgz#e25437827a3aa7f2a827bc8171bbbb664a356465" 1202 | integrity sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q== 1203 | dependencies: 1204 | accepts "~1.3.8" 1205 | array-flatten "1.1.1" 1206 | body-parser "1.20.2" 1207 | content-disposition "0.5.4" 1208 | content-type "~1.0.4" 1209 | cookie "0.6.0" 1210 | cookie-signature "1.0.6" 1211 | debug "2.6.9" 1212 | depd "2.0.0" 1213 | encodeurl "~1.0.2" 1214 | escape-html "~1.0.3" 1215 | etag "~1.8.1" 1216 | finalhandler "1.2.0" 1217 | fresh "0.5.2" 1218 | http-errors "2.0.0" 1219 | merge-descriptors "1.0.1" 1220 | methods "~1.1.2" 1221 | on-finished "2.4.1" 1222 | parseurl "~1.3.3" 1223 | path-to-regexp "0.1.7" 1224 | proxy-addr "~2.0.7" 1225 | qs "6.11.0" 1226 | range-parser "~1.2.1" 1227 | safe-buffer "5.2.1" 1228 | send "0.18.0" 1229 | serve-static "1.15.0" 1230 | setprototypeof "1.2.0" 1231 | statuses "2.0.1" 1232 | type-is "~1.6.18" 1233 | utils-merge "1.0.1" 1234 | vary "~1.1.2" 1235 | 1236 | fast-glob@^3.2.9: 1237 | version "3.3.2" 1238 | resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129" 1239 | integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow== 1240 | dependencies: 1241 | "@nodelib/fs.stat" "^2.0.2" 1242 | "@nodelib/fs.walk" "^1.2.3" 1243 | glob-parent "^5.1.2" 1244 | merge2 "^1.3.0" 1245 | micromatch "^4.0.4" 1246 | 1247 | fast-json-stable-stringify@^2.1.0: 1248 | version "2.1.0" 1249 | resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" 1250 | integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== 1251 | 1252 | fastq@^1.6.0: 1253 | version "1.17.1" 1254 | resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.17.1.tgz#2a523f07a4e7b1e81a42b91b8bf2254107753b47" 1255 | integrity sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w== 1256 | dependencies: 1257 | reusify "^1.0.4" 1258 | 1259 | fill-range@^7.1.1: 1260 | version "7.1.1" 1261 | resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292" 1262 | integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== 1263 | dependencies: 1264 | to-regex-range "^5.0.1" 1265 | 1266 | finalhandler@1.2.0: 1267 | version "1.2.0" 1268 | resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.2.0.tgz#7d23fe5731b207b4640e4fcd00aec1f9207a7b32" 1269 | integrity sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg== 1270 | dependencies: 1271 | debug "2.6.9" 1272 | encodeurl "~1.0.2" 1273 | escape-html "~1.0.3" 1274 | on-finished "2.4.1" 1275 | parseurl "~1.3.3" 1276 | statuses "2.0.1" 1277 | unpipe "~1.0.0" 1278 | 1279 | foreground-child@^3.1.0: 1280 | version "3.2.1" 1281 | resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.2.1.tgz#767004ccf3a5b30df39bed90718bab43fe0a59f7" 1282 | integrity sha512-PXUUyLqrR2XCWICfv6ukppP96sdFwWbNEnfEMt7jNsISjMsvaLNinAHNDYyvkyU+SZG2BTSbT5NjG+vZslfGTA== 1283 | dependencies: 1284 | cross-spawn "^7.0.0" 1285 | signal-exit "^4.0.1" 1286 | 1287 | forwarded@0.2.0: 1288 | version "0.2.0" 1289 | resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" 1290 | integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== 1291 | 1292 | fresh@0.5.2: 1293 | version "0.5.2" 1294 | resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" 1295 | integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== 1296 | 1297 | fsevents@~2.3.2: 1298 | version "2.3.3" 1299 | resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" 1300 | integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== 1301 | 1302 | function-bind@^1.1.2: 1303 | version "1.1.2" 1304 | resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" 1305 | integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== 1306 | 1307 | get-intrinsic@^1.1.3, get-intrinsic@^1.2.4: 1308 | version "1.2.4" 1309 | resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.4.tgz#e385f5a4b5227d449c3eabbad05494ef0abbeadd" 1310 | integrity sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ== 1311 | dependencies: 1312 | es-errors "^1.3.0" 1313 | function-bind "^1.1.2" 1314 | has-proto "^1.0.1" 1315 | has-symbols "^1.0.3" 1316 | hasown "^2.0.0" 1317 | 1318 | get-stream@^6.0.0: 1319 | version "6.0.1" 1320 | resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" 1321 | integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== 1322 | 1323 | glob-parent@^5.1.2, glob-parent@~5.1.2: 1324 | version "5.1.2" 1325 | resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" 1326 | integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== 1327 | dependencies: 1328 | is-glob "^4.0.1" 1329 | 1330 | glob@^10.3.10: 1331 | version "10.4.2" 1332 | resolved "https://registry.yarnpkg.com/glob/-/glob-10.4.2.tgz#bed6b95dade5c1f80b4434daced233aee76160e5" 1333 | integrity sha512-GwMlUF6PkPo3Gk21UxkCohOv0PLcIXVtKyLlpEI28R/cO/4eNOdmLk3CMW1wROV/WR/EsZOWAfBbBOqYvs88/w== 1334 | dependencies: 1335 | foreground-child "^3.1.0" 1336 | jackspeak "^3.1.2" 1337 | minimatch "^9.0.4" 1338 | minipass "^7.1.2" 1339 | package-json-from-dist "^1.0.0" 1340 | path-scurry "^1.11.1" 1341 | 1342 | globby@^11.0.3: 1343 | version "11.1.0" 1344 | resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" 1345 | integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== 1346 | dependencies: 1347 | array-union "^2.1.0" 1348 | dir-glob "^3.0.1" 1349 | fast-glob "^3.2.9" 1350 | ignore "^5.2.0" 1351 | merge2 "^1.4.1" 1352 | slash "^3.0.0" 1353 | 1354 | gopd@^1.0.1: 1355 | version "1.0.1" 1356 | resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" 1357 | integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== 1358 | dependencies: 1359 | get-intrinsic "^1.1.3" 1360 | 1361 | graphql-tag@^2.11.0: 1362 | version "2.12.6" 1363 | resolved "https://registry.yarnpkg.com/graphql-tag/-/graphql-tag-2.12.6.tgz#d441a569c1d2537ef10ca3d1633b48725329b5f1" 1364 | integrity sha512-FdSNcu2QQcWnM2VNvSCCDCVS5PpPqpzgFT8+GXzqJuoDd0CBncxCY278u4mhRO7tMgo2JjgJA5aZ+nWSQ/Z+xg== 1365 | dependencies: 1366 | tslib "^2.1.0" 1367 | 1368 | graphql@^16.8.1: 1369 | version "16.9.0" 1370 | resolved "https://registry.yarnpkg.com/graphql/-/graphql-16.9.0.tgz#1c310e63f16a49ce1fbb230bd0a000e99f6f115f" 1371 | integrity sha512-GGTKBX4SD7Wdb8mqeDLni2oaRGYQWjWHGKPQ24ZMnUtKfcsVoiv4uX8+LJr1K6U5VW2Lu1BwJnj7uiori0YtRw== 1372 | 1373 | has-flag@^3.0.0: 1374 | version "3.0.0" 1375 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" 1376 | integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== 1377 | 1378 | has-property-descriptors@^1.0.2: 1379 | version "1.0.2" 1380 | resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz#963ed7d071dc7bf5f084c5bfbe0d1b6222586854" 1381 | integrity sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg== 1382 | dependencies: 1383 | es-define-property "^1.0.0" 1384 | 1385 | has-proto@^1.0.1: 1386 | version "1.0.3" 1387 | resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.3.tgz#b31ddfe9b0e6e9914536a6ab286426d0214f77fd" 1388 | integrity sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q== 1389 | 1390 | has-symbols@^1.0.3: 1391 | version "1.0.3" 1392 | resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" 1393 | integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== 1394 | 1395 | hasown@^2.0.0: 1396 | version "2.0.2" 1397 | resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" 1398 | integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== 1399 | dependencies: 1400 | function-bind "^1.1.2" 1401 | 1402 | http-errors@2.0.0: 1403 | version "2.0.0" 1404 | resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3" 1405 | integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== 1406 | dependencies: 1407 | depd "2.0.0" 1408 | inherits "2.0.4" 1409 | setprototypeof "1.2.0" 1410 | statuses "2.0.1" 1411 | toidentifier "1.0.1" 1412 | 1413 | human-signals@^2.1.0: 1414 | version "2.1.0" 1415 | resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" 1416 | integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== 1417 | 1418 | iconv-lite@0.4.24: 1419 | version "0.4.24" 1420 | resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" 1421 | integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== 1422 | dependencies: 1423 | safer-buffer ">= 2.1.2 < 3" 1424 | 1425 | ignore-by-default@^1.0.1: 1426 | version "1.0.1" 1427 | resolved "https://registry.yarnpkg.com/ignore-by-default/-/ignore-by-default-1.0.1.tgz#48ca6d72f6c6a3af00a9ad4ae6876be3889e2b09" 1428 | integrity sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA== 1429 | 1430 | ignore@^5.2.0: 1431 | version "5.3.1" 1432 | resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.1.tgz#5073e554cd42c5b33b394375f538b8593e34d4ef" 1433 | integrity sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw== 1434 | 1435 | inherits@2.0.4, inherits@^2.0.1: 1436 | version "2.0.4" 1437 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" 1438 | integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== 1439 | 1440 | ipaddr.js@1.9.1: 1441 | version "1.9.1" 1442 | resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" 1443 | integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== 1444 | 1445 | is-binary-path@~2.1.0: 1446 | version "2.1.0" 1447 | resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" 1448 | integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== 1449 | dependencies: 1450 | binary-extensions "^2.0.0" 1451 | 1452 | is-extglob@^2.1.1: 1453 | version "2.1.1" 1454 | resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" 1455 | integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== 1456 | 1457 | is-fullwidth-code-point@^3.0.0: 1458 | version "3.0.0" 1459 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" 1460 | integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== 1461 | 1462 | is-glob@^4.0.1, is-glob@~4.0.1: 1463 | version "4.0.3" 1464 | resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" 1465 | integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== 1466 | dependencies: 1467 | is-extglob "^2.1.1" 1468 | 1469 | is-number@^7.0.0: 1470 | version "7.0.0" 1471 | resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" 1472 | integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== 1473 | 1474 | is-stream@^2.0.0: 1475 | version "2.0.1" 1476 | resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" 1477 | integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== 1478 | 1479 | isexe@^2.0.0: 1480 | version "2.0.0" 1481 | resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" 1482 | integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== 1483 | 1484 | jackspeak@^3.1.2: 1485 | version "3.4.0" 1486 | resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-3.4.0.tgz#a75763ff36ad778ede6a156d8ee8b124de445b4a" 1487 | integrity sha512-JVYhQnN59LVPFCEcVa2C3CrEKYacvjRfqIQl+h8oi91aLYQVWRYbxjPcv1bUiUy/kLmQaANrYfNMCO3kuEDHfw== 1488 | dependencies: 1489 | "@isaacs/cliui" "^8.0.2" 1490 | optionalDependencies: 1491 | "@pkgjs/parseargs" "^0.11.0" 1492 | 1493 | joycon@^3.0.1: 1494 | version "3.1.1" 1495 | resolved "https://registry.yarnpkg.com/joycon/-/joycon-3.1.1.tgz#bce8596d6ae808f8b68168f5fc69280996894f03" 1496 | integrity sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw== 1497 | 1498 | lilconfig@^3.0.0: 1499 | version "3.1.2" 1500 | resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-3.1.2.tgz#e4a7c3cb549e3a606c8dcc32e5ae1005e62c05cb" 1501 | integrity sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow== 1502 | 1503 | lines-and-columns@^1.1.6: 1504 | version "1.2.4" 1505 | resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" 1506 | integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== 1507 | 1508 | load-tsconfig@^0.2.3: 1509 | version "0.2.5" 1510 | resolved "https://registry.yarnpkg.com/load-tsconfig/-/load-tsconfig-0.2.5.tgz#453b8cd8961bfb912dea77eb6c168fe8cca3d3a1" 1511 | integrity sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg== 1512 | 1513 | lodash.sortby@^4.7.0: 1514 | version "4.7.0" 1515 | resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" 1516 | integrity sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA== 1517 | 1518 | loglevel@^1.6.8: 1519 | version "1.9.1" 1520 | resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.9.1.tgz#d63976ac9bcd03c7c873116d41c2a85bafff1be7" 1521 | integrity sha512-hP3I3kCrDIMuRwAwHltphhDM1r8i55H33GgqjXbrisuJhF4kRhW1dNuxsRklp4bXl8DSdLaNLuiL4A/LWRfxvg== 1522 | 1523 | long@^4.0.0: 1524 | version "4.0.0" 1525 | resolved "https://registry.yarnpkg.com/long/-/long-4.0.0.tgz#9a7b71cfb7d361a194ea555241c92f7468d5bf28" 1526 | integrity sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA== 1527 | 1528 | "lru-cache@7.10.1 - 7.13.1": 1529 | version "7.13.1" 1530 | resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-7.13.1.tgz#267a81fbd0881327c46a81c5922606a2cfe336c4" 1531 | integrity sha512-CHqbAq7NFlW3RSnoWXLJBxCWaZVBrfa9UEHId2M3AW8iEBurbqduNexEUCGc3SHc6iCYXNJCDi903LajSVAEPQ== 1532 | 1533 | lru-cache@^10.2.0: 1534 | version "10.2.2" 1535 | resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.2.2.tgz#48206bc114c1252940c41b25b41af5b545aca878" 1536 | integrity sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ== 1537 | 1538 | lru-cache@^6.0.0: 1539 | version "6.0.0" 1540 | resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" 1541 | integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== 1542 | dependencies: 1543 | yallist "^4.0.0" 1544 | 1545 | make-error@^1.1.1: 1546 | version "1.3.6" 1547 | resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" 1548 | integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== 1549 | 1550 | media-typer@0.3.0: 1551 | version "0.3.0" 1552 | resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" 1553 | integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== 1554 | 1555 | merge-descriptors@1.0.1: 1556 | version "1.0.1" 1557 | resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" 1558 | integrity sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w== 1559 | 1560 | merge-stream@^2.0.0: 1561 | version "2.0.0" 1562 | resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" 1563 | integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== 1564 | 1565 | merge2@^1.3.0, merge2@^1.4.1: 1566 | version "1.4.1" 1567 | resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" 1568 | integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== 1569 | 1570 | methods@~1.1.2: 1571 | version "1.1.2" 1572 | resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" 1573 | integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== 1574 | 1575 | micromatch@^4.0.4: 1576 | version "4.0.7" 1577 | resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.7.tgz#33e8190d9fe474a9895525f5618eee136d46c2e5" 1578 | integrity sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q== 1579 | dependencies: 1580 | braces "^3.0.3" 1581 | picomatch "^2.3.1" 1582 | 1583 | mime-db@1.52.0: 1584 | version "1.52.0" 1585 | resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" 1586 | integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== 1587 | 1588 | mime-types@~2.1.24, mime-types@~2.1.34: 1589 | version "2.1.35" 1590 | resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" 1591 | integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== 1592 | dependencies: 1593 | mime-db "1.52.0" 1594 | 1595 | mime@1.6.0: 1596 | version "1.6.0" 1597 | resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" 1598 | integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== 1599 | 1600 | mimic-fn@^2.1.0: 1601 | version "2.1.0" 1602 | resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" 1603 | integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== 1604 | 1605 | minimatch@^3.1.2: 1606 | version "3.1.2" 1607 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" 1608 | integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== 1609 | dependencies: 1610 | brace-expansion "^1.1.7" 1611 | 1612 | minimatch@^9.0.4: 1613 | version "9.0.4" 1614 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.4.tgz#8e49c731d1749cbec05050ee5145147b32496a51" 1615 | integrity sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw== 1616 | dependencies: 1617 | brace-expansion "^2.0.1" 1618 | 1619 | "minipass@^5.0.0 || ^6.0.2 || ^7.0.0", minipass@^7.1.2: 1620 | version "7.1.2" 1621 | resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.1.2.tgz#93a9626ce5e5e66bd4db86849e7515e92340a707" 1622 | integrity sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw== 1623 | 1624 | ms@2.0.0: 1625 | version "2.0.0" 1626 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" 1627 | integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== 1628 | 1629 | ms@2.1.2: 1630 | version "2.1.2" 1631 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" 1632 | integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== 1633 | 1634 | ms@2.1.3: 1635 | version "2.1.3" 1636 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" 1637 | integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== 1638 | 1639 | mz@^2.7.0: 1640 | version "2.7.0" 1641 | resolved "https://registry.yarnpkg.com/mz/-/mz-2.7.0.tgz#95008057a56cafadc2bc63dde7f9ff6955948e32" 1642 | integrity sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q== 1643 | dependencies: 1644 | any-promise "^1.0.0" 1645 | object-assign "^4.0.1" 1646 | thenify-all "^1.0.0" 1647 | 1648 | negotiator@0.6.3: 1649 | version "0.6.3" 1650 | resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" 1651 | integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== 1652 | 1653 | node-abort-controller@^3.0.1: 1654 | version "3.1.1" 1655 | resolved "https://registry.yarnpkg.com/node-abort-controller/-/node-abort-controller-3.1.1.tgz#a94377e964a9a37ac3976d848cb5c765833b8548" 1656 | integrity sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ== 1657 | 1658 | node-fetch@^2.6.7: 1659 | version "2.7.0" 1660 | resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d" 1661 | integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A== 1662 | dependencies: 1663 | whatwg-url "^5.0.0" 1664 | 1665 | nodemon@^3.1.0: 1666 | version "3.1.4" 1667 | resolved "https://registry.yarnpkg.com/nodemon/-/nodemon-3.1.4.tgz#c34dcd8eb46a05723ccde60cbdd25addcc8725e4" 1668 | integrity sha512-wjPBbFhtpJwmIeY2yP7QF+UKzPfltVGtfce1g/bB15/8vCGZj8uxD62b/b9M9/WVgme0NZudpownKN+c0plXlQ== 1669 | dependencies: 1670 | chokidar "^3.5.2" 1671 | debug "^4" 1672 | ignore-by-default "^1.0.1" 1673 | minimatch "^3.1.2" 1674 | pstree.remy "^1.1.8" 1675 | semver "^7.5.3" 1676 | simple-update-notifier "^2.0.0" 1677 | supports-color "^5.5.0" 1678 | touch "^3.1.0" 1679 | undefsafe "^2.0.5" 1680 | 1681 | normalize-path@^3.0.0, normalize-path@~3.0.0: 1682 | version "3.0.0" 1683 | resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" 1684 | integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== 1685 | 1686 | npm-run-path@^4.0.1: 1687 | version "4.0.1" 1688 | resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" 1689 | integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== 1690 | dependencies: 1691 | path-key "^3.0.0" 1692 | 1693 | object-assign@^4, object-assign@^4.0.1: 1694 | version "4.1.1" 1695 | resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" 1696 | integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== 1697 | 1698 | object-inspect@^1.13.1: 1699 | version "1.13.1" 1700 | resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.1.tgz#b96c6109324ccfef6b12216a956ca4dc2ff94bc2" 1701 | integrity sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ== 1702 | 1703 | obuf@~1.1.2: 1704 | version "1.1.2" 1705 | resolved "https://registry.yarnpkg.com/obuf/-/obuf-1.1.2.tgz#09bea3343d41859ebd446292d11c9d4db619084e" 1706 | integrity sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg== 1707 | 1708 | on-finished@2.4.1: 1709 | version "2.4.1" 1710 | resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" 1711 | integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== 1712 | dependencies: 1713 | ee-first "1.1.1" 1714 | 1715 | onetime@^5.1.2: 1716 | version "5.1.2" 1717 | resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" 1718 | integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== 1719 | dependencies: 1720 | mimic-fn "^2.1.0" 1721 | 1722 | package-json-from-dist@^1.0.0: 1723 | version "1.0.0" 1724 | resolved "https://registry.yarnpkg.com/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz#e501cd3094b278495eb4258d4c9f6d5ac3019f00" 1725 | integrity sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw== 1726 | 1727 | parseurl@^1.3.3, parseurl@~1.3.3: 1728 | version "1.3.3" 1729 | resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" 1730 | integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== 1731 | 1732 | path-key@^3.0.0, path-key@^3.1.0: 1733 | version "3.1.1" 1734 | resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" 1735 | integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== 1736 | 1737 | path-scurry@^1.11.1: 1738 | version "1.11.1" 1739 | resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.11.1.tgz#7960a668888594a0720b12a911d1a742ab9f11d2" 1740 | integrity sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA== 1741 | dependencies: 1742 | lru-cache "^10.2.0" 1743 | minipass "^5.0.0 || ^6.0.2 || ^7.0.0" 1744 | 1745 | path-to-regexp@0.1.7: 1746 | version "0.1.7" 1747 | resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" 1748 | integrity sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ== 1749 | 1750 | path-type@^4.0.0: 1751 | version "4.0.0" 1752 | resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" 1753 | integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== 1754 | 1755 | pg-cloudflare@^1.1.1: 1756 | version "1.1.1" 1757 | resolved "https://registry.yarnpkg.com/pg-cloudflare/-/pg-cloudflare-1.1.1.tgz#e6d5833015b170e23ae819e8c5d7eaedb472ca98" 1758 | integrity sha512-xWPagP/4B6BgFO+EKz3JONXv3YDgvkbVrGw2mTo3D6tVDQRh1e7cqVGvyR3BE+eQgAvx1XhW/iEASj4/jCWl3Q== 1759 | 1760 | pg-connection-string@^2.7.0: 1761 | version "2.7.0" 1762 | resolved "https://registry.yarnpkg.com/pg-connection-string/-/pg-connection-string-2.7.0.tgz#f1d3489e427c62ece022dba98d5262efcb168b37" 1763 | integrity sha512-PI2W9mv53rXJQEOb8xNR8lH7Hr+EKa6oJa38zsK0S/ky2er16ios1wLKhZyxzD7jUReiWokc9WK5nxSnC7W1TA== 1764 | 1765 | pg-int8@1.0.1: 1766 | version "1.0.1" 1767 | resolved "https://registry.yarnpkg.com/pg-int8/-/pg-int8-1.0.1.tgz#943bd463bf5b71b4170115f80f8efc9a0c0eb78c" 1768 | integrity sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw== 1769 | 1770 | pg-numeric@1.0.2: 1771 | version "1.0.2" 1772 | resolved "https://registry.yarnpkg.com/pg-numeric/-/pg-numeric-1.0.2.tgz#816d9a44026086ae8ae74839acd6a09b0636aa3a" 1773 | integrity sha512-BM/Thnrw5jm2kKLE5uJkXqqExRUY/toLHda65XgFTBTFYZyopbKjBe29Ii3RbkvlsMoFwD+tHeGaCjjv0gHlyw== 1774 | 1775 | pg-pool@^3.7.0: 1776 | version "3.7.0" 1777 | resolved "https://registry.yarnpkg.com/pg-pool/-/pg-pool-3.7.0.tgz#d4d3c7ad640f8c6a2245adc369bafde4ebb8cbec" 1778 | integrity sha512-ZOBQForurqh4zZWjrgSwwAtzJ7QiRX0ovFkZr2klsen3Nm0aoh33Ls0fzfv3imeH/nw/O27cjdz5kzYJfeGp/g== 1779 | 1780 | pg-protocol@*, pg-protocol@^1.7.0: 1781 | version "1.7.0" 1782 | resolved "https://registry.yarnpkg.com/pg-protocol/-/pg-protocol-1.7.0.tgz#ec037c87c20515372692edac8b63cf4405448a93" 1783 | integrity sha512-hTK/mE36i8fDDhgDFjy6xNOG+LCorxLG3WO17tku+ij6sVHXh1jQUJ8hYAnRhNla4QVD2H8er/FOjc/+EgC6yQ== 1784 | 1785 | pg-types@^2.1.0: 1786 | version "2.2.0" 1787 | resolved "https://registry.yarnpkg.com/pg-types/-/pg-types-2.2.0.tgz#2d0250d636454f7cfa3b6ae0382fdfa8063254a3" 1788 | integrity sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA== 1789 | dependencies: 1790 | pg-int8 "1.0.1" 1791 | postgres-array "~2.0.0" 1792 | postgres-bytea "~1.0.0" 1793 | postgres-date "~1.0.4" 1794 | postgres-interval "^1.1.0" 1795 | 1796 | pg-types@^4.0.1: 1797 | version "4.0.2" 1798 | resolved "https://registry.yarnpkg.com/pg-types/-/pg-types-4.0.2.tgz#399209a57c326f162461faa870145bb0f918b76d" 1799 | integrity sha512-cRL3JpS3lKMGsKaWndugWQoLOCoP+Cic8oseVcbr0qhPzYD5DWXK+RZ9LY9wxRf7RQia4SCwQlXk0q6FCPrVng== 1800 | dependencies: 1801 | pg-int8 "1.0.1" 1802 | pg-numeric "1.0.2" 1803 | postgres-array "~3.0.1" 1804 | postgres-bytea "~3.0.0" 1805 | postgres-date "~2.1.0" 1806 | postgres-interval "^3.0.0" 1807 | postgres-range "^1.1.1" 1808 | 1809 | pg@^8.13.1: 1810 | version "8.13.1" 1811 | resolved "https://registry.yarnpkg.com/pg/-/pg-8.13.1.tgz#6498d8b0a87ff76c2df7a32160309d3168c0c080" 1812 | integrity sha512-OUir1A0rPNZlX//c7ksiu7crsGZTKSOXJPgtNiHGIlC9H0lO+NC6ZDYksSgBYY/thSWhnSRBv8w1lieNNGATNQ== 1813 | dependencies: 1814 | pg-connection-string "^2.7.0" 1815 | pg-pool "^3.7.0" 1816 | pg-protocol "^1.7.0" 1817 | pg-types "^2.1.0" 1818 | pgpass "1.x" 1819 | optionalDependencies: 1820 | pg-cloudflare "^1.1.1" 1821 | 1822 | pgpass@1.x: 1823 | version "1.0.5" 1824 | resolved "https://registry.yarnpkg.com/pgpass/-/pgpass-1.0.5.tgz#9b873e4a564bb10fa7a7dbd55312728d422a223d" 1825 | integrity sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug== 1826 | dependencies: 1827 | split2 "^4.1.0" 1828 | 1829 | picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: 1830 | version "2.3.1" 1831 | resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" 1832 | integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== 1833 | 1834 | pirates@^4.0.1: 1835 | version "4.0.6" 1836 | resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.6.tgz#3018ae32ecfcff6c29ba2267cbf21166ac1f36b9" 1837 | integrity sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg== 1838 | 1839 | postcss-load-config@^4.0.1: 1840 | version "4.0.2" 1841 | resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-4.0.2.tgz#7159dcf626118d33e299f485d6afe4aff7c4a3e3" 1842 | integrity sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ== 1843 | dependencies: 1844 | lilconfig "^3.0.0" 1845 | yaml "^2.3.4" 1846 | 1847 | postgres-array@~2.0.0: 1848 | version "2.0.0" 1849 | resolved "https://registry.yarnpkg.com/postgres-array/-/postgres-array-2.0.0.tgz#48f8fce054fbc69671999329b8834b772652d82e" 1850 | integrity sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA== 1851 | 1852 | postgres-array@~3.0.1: 1853 | version "3.0.2" 1854 | resolved "https://registry.yarnpkg.com/postgres-array/-/postgres-array-3.0.2.tgz#68d6182cb0f7f152a7e60dc6a6889ed74b0a5f98" 1855 | integrity sha512-6faShkdFugNQCLwucjPcY5ARoW1SlbnrZjmGl0IrrqewpvxvhSLHimCVzqeuULCbG0fQv7Dtk1yDbG3xv7Veog== 1856 | 1857 | postgres-bytea@~1.0.0: 1858 | version "1.0.0" 1859 | resolved "https://registry.yarnpkg.com/postgres-bytea/-/postgres-bytea-1.0.0.tgz#027b533c0aa890e26d172d47cf9ccecc521acd35" 1860 | integrity sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w== 1861 | 1862 | postgres-bytea@~3.0.0: 1863 | version "3.0.0" 1864 | resolved "https://registry.yarnpkg.com/postgres-bytea/-/postgres-bytea-3.0.0.tgz#9048dc461ac7ba70a6a42d109221619ecd1cb089" 1865 | integrity sha512-CNd4jim9RFPkObHSjVHlVrxoVQXz7quwNFpz7RY1okNNme49+sVyiTvTRobiLV548Hx/hb1BG+iE7h9493WzFw== 1866 | dependencies: 1867 | obuf "~1.1.2" 1868 | 1869 | postgres-date@~1.0.4: 1870 | version "1.0.7" 1871 | resolved "https://registry.yarnpkg.com/postgres-date/-/postgres-date-1.0.7.tgz#51bc086006005e5061c591cee727f2531bf641a8" 1872 | integrity sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q== 1873 | 1874 | postgres-date@~2.1.0: 1875 | version "2.1.0" 1876 | resolved "https://registry.yarnpkg.com/postgres-date/-/postgres-date-2.1.0.tgz#b85d3c1fb6fb3c6c8db1e9942a13a3bf625189d0" 1877 | integrity sha512-K7Juri8gtgXVcDfZttFKVmhglp7epKb1K4pgrkLxehjqkrgPhfG6OO8LHLkfaqkbpjNRnra018XwAr1yQFWGcA== 1878 | 1879 | postgres-interval@^1.1.0: 1880 | version "1.2.0" 1881 | resolved "https://registry.yarnpkg.com/postgres-interval/-/postgres-interval-1.2.0.tgz#b460c82cb1587507788819a06aa0fffdb3544695" 1882 | integrity sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ== 1883 | dependencies: 1884 | xtend "^4.0.0" 1885 | 1886 | postgres-interval@^3.0.0: 1887 | version "3.0.0" 1888 | resolved "https://registry.yarnpkg.com/postgres-interval/-/postgres-interval-3.0.0.tgz#baf7a8b3ebab19b7f38f07566c7aab0962f0c86a" 1889 | integrity sha512-BSNDnbyZCXSxgA+1f5UU2GmwhoI0aU5yMxRGO8CdFEcY2BQF9xm/7MqKnYoM1nJDk8nONNWDk9WeSmePFhQdlw== 1890 | 1891 | postgres-range@^1.1.1: 1892 | version "1.1.4" 1893 | resolved "https://registry.yarnpkg.com/postgres-range/-/postgres-range-1.1.4.tgz#a59c5f9520909bcec5e63e8cf913a92e4c952863" 1894 | integrity sha512-i/hbxIE9803Alj/6ytL7UHQxRvZkI9O4Sy+J3HGc4F4oo/2eQAjTSNJ0bfxyse3bH0nuVesCk+3IRLaMtG3H6w== 1895 | 1896 | prisma@^5.17.0: 1897 | version "5.17.0" 1898 | resolved "https://registry.yarnpkg.com/prisma/-/prisma-5.17.0.tgz#267b43921ab94805b010537cffa5ccaf530fa066" 1899 | integrity sha512-m4UWkN5lBE6yevqeOxEvmepnL5cNPEjzMw2IqDB59AcEV6w7D8vGljDLd1gPFH+W6gUxw9x7/RmN5dCS/WTPxA== 1900 | dependencies: 1901 | "@prisma/engines" "5.17.0" 1902 | 1903 | proxy-addr@~2.0.7: 1904 | version "2.0.7" 1905 | resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" 1906 | integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== 1907 | dependencies: 1908 | forwarded "0.2.0" 1909 | ipaddr.js "1.9.1" 1910 | 1911 | pstree.remy@^1.1.8: 1912 | version "1.1.8" 1913 | resolved "https://registry.yarnpkg.com/pstree.remy/-/pstree.remy-1.1.8.tgz#c242224f4a67c21f686839bbdb4ac282b8373d3a" 1914 | integrity sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w== 1915 | 1916 | punycode@^2.1.0: 1917 | version "2.3.1" 1918 | resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" 1919 | integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== 1920 | 1921 | qs@6.11.0: 1922 | version "6.11.0" 1923 | resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.0.tgz#fd0d963446f7a65e1367e01abd85429453f0c37a" 1924 | integrity sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q== 1925 | dependencies: 1926 | side-channel "^1.0.4" 1927 | 1928 | queue-microtask@^1.2.2: 1929 | version "1.2.3" 1930 | resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" 1931 | integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== 1932 | 1933 | range-parser@~1.2.1: 1934 | version "1.2.1" 1935 | resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" 1936 | integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== 1937 | 1938 | raw-body@2.5.2: 1939 | version "2.5.2" 1940 | resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.2.tgz#99febd83b90e08975087e8f1f9419a149366b68a" 1941 | integrity sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA== 1942 | dependencies: 1943 | bytes "3.1.2" 1944 | http-errors "2.0.0" 1945 | iconv-lite "0.4.24" 1946 | unpipe "1.0.0" 1947 | 1948 | readdirp@~3.6.0: 1949 | version "3.6.0" 1950 | resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" 1951 | integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== 1952 | dependencies: 1953 | picomatch "^2.2.1" 1954 | 1955 | resolve-from@^5.0.0: 1956 | version "5.0.0" 1957 | resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" 1958 | integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== 1959 | 1960 | retry@0.13.1: 1961 | version "0.13.1" 1962 | resolved "https://registry.yarnpkg.com/retry/-/retry-0.13.1.tgz#185b1587acf67919d63b357349e03537b2484658" 1963 | integrity sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg== 1964 | 1965 | reusify@^1.0.4: 1966 | version "1.0.4" 1967 | resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" 1968 | integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== 1969 | 1970 | rollup@^4.0.2: 1971 | version "4.18.0" 1972 | resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.18.0.tgz#497f60f0c5308e4602cf41136339fbf87d5f5dda" 1973 | integrity sha512-QmJz14PX3rzbJCN1SG4Xe/bAAX2a6NpCP8ab2vfu2GiUr8AQcr2nCV/oEO3yneFarB67zk8ShlIyWb2LGTb3Sg== 1974 | dependencies: 1975 | "@types/estree" "1.0.5" 1976 | optionalDependencies: 1977 | "@rollup/rollup-android-arm-eabi" "4.18.0" 1978 | "@rollup/rollup-android-arm64" "4.18.0" 1979 | "@rollup/rollup-darwin-arm64" "4.18.0" 1980 | "@rollup/rollup-darwin-x64" "4.18.0" 1981 | "@rollup/rollup-linux-arm-gnueabihf" "4.18.0" 1982 | "@rollup/rollup-linux-arm-musleabihf" "4.18.0" 1983 | "@rollup/rollup-linux-arm64-gnu" "4.18.0" 1984 | "@rollup/rollup-linux-arm64-musl" "4.18.0" 1985 | "@rollup/rollup-linux-powerpc64le-gnu" "4.18.0" 1986 | "@rollup/rollup-linux-riscv64-gnu" "4.18.0" 1987 | "@rollup/rollup-linux-s390x-gnu" "4.18.0" 1988 | "@rollup/rollup-linux-x64-gnu" "4.18.0" 1989 | "@rollup/rollup-linux-x64-musl" "4.18.0" 1990 | "@rollup/rollup-win32-arm64-msvc" "4.18.0" 1991 | "@rollup/rollup-win32-ia32-msvc" "4.18.0" 1992 | "@rollup/rollup-win32-x64-msvc" "4.18.0" 1993 | fsevents "~2.3.2" 1994 | 1995 | run-parallel@^1.1.9: 1996 | version "1.2.0" 1997 | resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" 1998 | integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== 1999 | dependencies: 2000 | queue-microtask "^1.2.2" 2001 | 2002 | safe-buffer@5.2.1, safe-buffer@^5.0.1: 2003 | version "5.2.1" 2004 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" 2005 | integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== 2006 | 2007 | "safer-buffer@>= 2.1.2 < 3": 2008 | version "2.1.2" 2009 | resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" 2010 | integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== 2011 | 2012 | semver@^7.5.3: 2013 | version "7.6.2" 2014 | resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.2.tgz#1e3b34759f896e8f14d6134732ce798aeb0c6e13" 2015 | integrity sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w== 2016 | 2017 | send@0.18.0: 2018 | version "0.18.0" 2019 | resolved "https://registry.yarnpkg.com/send/-/send-0.18.0.tgz#670167cc654b05f5aa4a767f9113bb371bc706be" 2020 | integrity sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg== 2021 | dependencies: 2022 | debug "2.6.9" 2023 | depd "2.0.0" 2024 | destroy "1.2.0" 2025 | encodeurl "~1.0.2" 2026 | escape-html "~1.0.3" 2027 | etag "~1.8.1" 2028 | fresh "0.5.2" 2029 | http-errors "2.0.0" 2030 | mime "1.6.0" 2031 | ms "2.1.3" 2032 | on-finished "2.4.1" 2033 | range-parser "~1.2.1" 2034 | statuses "2.0.1" 2035 | 2036 | serve-static@1.15.0: 2037 | version "1.15.0" 2038 | resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.15.0.tgz#faaef08cffe0a1a62f60cad0c4e513cff0ac9540" 2039 | integrity sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g== 2040 | dependencies: 2041 | encodeurl "~1.0.2" 2042 | escape-html "~1.0.3" 2043 | parseurl "~1.3.3" 2044 | send "0.18.0" 2045 | 2046 | set-function-length@^1.2.1: 2047 | version "1.2.2" 2048 | resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.2.tgz#aac72314198eaed975cf77b2c3b6b880695e5449" 2049 | integrity sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg== 2050 | dependencies: 2051 | define-data-property "^1.1.4" 2052 | es-errors "^1.3.0" 2053 | function-bind "^1.1.2" 2054 | get-intrinsic "^1.2.4" 2055 | gopd "^1.0.1" 2056 | has-property-descriptors "^1.0.2" 2057 | 2058 | setprototypeof@1.2.0: 2059 | version "1.2.0" 2060 | resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" 2061 | integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== 2062 | 2063 | sha.js@^2.4.11: 2064 | version "2.4.11" 2065 | resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" 2066 | integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ== 2067 | dependencies: 2068 | inherits "^2.0.1" 2069 | safe-buffer "^5.0.1" 2070 | 2071 | shebang-command@^2.0.0: 2072 | version "2.0.0" 2073 | resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" 2074 | integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== 2075 | dependencies: 2076 | shebang-regex "^3.0.0" 2077 | 2078 | shebang-regex@^3.0.0: 2079 | version "3.0.0" 2080 | resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" 2081 | integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== 2082 | 2083 | side-channel@^1.0.4: 2084 | version "1.0.6" 2085 | resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.6.tgz#abd25fb7cd24baf45466406b1096b7831c9215f2" 2086 | integrity sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA== 2087 | dependencies: 2088 | call-bind "^1.0.7" 2089 | es-errors "^1.3.0" 2090 | get-intrinsic "^1.2.4" 2091 | object-inspect "^1.13.1" 2092 | 2093 | signal-exit@^3.0.3: 2094 | version "3.0.7" 2095 | resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" 2096 | integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== 2097 | 2098 | signal-exit@^4.0.1: 2099 | version "4.1.0" 2100 | resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04" 2101 | integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== 2102 | 2103 | simple-update-notifier@^2.0.0: 2104 | version "2.0.0" 2105 | resolved "https://registry.yarnpkg.com/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz#d70b92bdab7d6d90dfd73931195a30b6e3d7cebb" 2106 | integrity sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w== 2107 | dependencies: 2108 | semver "^7.5.3" 2109 | 2110 | slash@^3.0.0: 2111 | version "3.0.0" 2112 | resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" 2113 | integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== 2114 | 2115 | source-map@0.8.0-beta.0: 2116 | version "0.8.0-beta.0" 2117 | resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.8.0-beta.0.tgz#d4c1bb42c3f7ee925f005927ba10709e0d1d1f11" 2118 | integrity sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA== 2119 | dependencies: 2120 | whatwg-url "^7.0.0" 2121 | 2122 | split2@^4.1.0: 2123 | version "4.2.0" 2124 | resolved "https://registry.yarnpkg.com/split2/-/split2-4.2.0.tgz#c9c5920904d148bab0b9f67145f245a86aadbfa4" 2125 | integrity sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg== 2126 | 2127 | statuses@2.0.1: 2128 | version "2.0.1" 2129 | resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" 2130 | integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== 2131 | 2132 | "string-width-cjs@npm:string-width@^4.2.0", string-width@^4.1.0: 2133 | name string-width-cjs 2134 | version "4.2.3" 2135 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" 2136 | integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== 2137 | dependencies: 2138 | emoji-regex "^8.0.0" 2139 | is-fullwidth-code-point "^3.0.0" 2140 | strip-ansi "^6.0.1" 2141 | 2142 | string-width@^5.0.1, string-width@^5.1.2: 2143 | version "5.1.2" 2144 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" 2145 | integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== 2146 | dependencies: 2147 | eastasianwidth "^0.2.0" 2148 | emoji-regex "^9.2.2" 2149 | strip-ansi "^7.0.1" 2150 | 2151 | "strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1: 2152 | name strip-ansi-cjs 2153 | version "6.0.1" 2154 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" 2155 | integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== 2156 | dependencies: 2157 | ansi-regex "^5.0.1" 2158 | 2159 | strip-ansi@^7.0.1: 2160 | version "7.1.0" 2161 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" 2162 | integrity sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ== 2163 | dependencies: 2164 | ansi-regex "^6.0.1" 2165 | 2166 | strip-final-newline@^2.0.0: 2167 | version "2.0.0" 2168 | resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" 2169 | integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== 2170 | 2171 | sucrase@^3.20.3: 2172 | version "3.35.0" 2173 | resolved "https://registry.yarnpkg.com/sucrase/-/sucrase-3.35.0.tgz#57f17a3d7e19b36d8995f06679d121be914ae263" 2174 | integrity sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA== 2175 | dependencies: 2176 | "@jridgewell/gen-mapping" "^0.3.2" 2177 | commander "^4.0.0" 2178 | glob "^10.3.10" 2179 | lines-and-columns "^1.1.6" 2180 | mz "^2.7.0" 2181 | pirates "^4.0.1" 2182 | ts-interface-checker "^0.1.9" 2183 | 2184 | supports-color@^5.5.0: 2185 | version "5.5.0" 2186 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" 2187 | integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== 2188 | dependencies: 2189 | has-flag "^3.0.0" 2190 | 2191 | thenify-all@^1.0.0: 2192 | version "1.6.0" 2193 | resolved "https://registry.yarnpkg.com/thenify-all/-/thenify-all-1.6.0.tgz#1a1918d402d8fc3f98fbf234db0bcc8cc10e9726" 2194 | integrity sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA== 2195 | dependencies: 2196 | thenify ">= 3.1.0 < 4" 2197 | 2198 | "thenify@>= 3.1.0 < 4": 2199 | version "3.3.1" 2200 | resolved "https://registry.yarnpkg.com/thenify/-/thenify-3.3.1.tgz#8932e686a4066038a016dd9e2ca46add9838a95f" 2201 | integrity sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw== 2202 | dependencies: 2203 | any-promise "^1.0.0" 2204 | 2205 | to-regex-range@^5.0.1: 2206 | version "5.0.1" 2207 | resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" 2208 | integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== 2209 | dependencies: 2210 | is-number "^7.0.0" 2211 | 2212 | toidentifier@1.0.1: 2213 | version "1.0.1" 2214 | resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" 2215 | integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== 2216 | 2217 | touch@^3.1.0: 2218 | version "3.1.1" 2219 | resolved "https://registry.yarnpkg.com/touch/-/touch-3.1.1.tgz#097a23d7b161476435e5c1344a95c0f75b4a5694" 2220 | integrity sha512-r0eojU4bI8MnHr8c5bNo7lJDdI2qXlWWJk6a9EAFG7vbhTjElYhBVS3/miuE0uOuoLdb8Mc/rVfsmm6eo5o9GA== 2221 | 2222 | tr46@^1.0.1: 2223 | version "1.0.1" 2224 | resolved "https://registry.yarnpkg.com/tr46/-/tr46-1.0.1.tgz#a8b13fd6bfd2489519674ccde55ba3693b706d09" 2225 | integrity sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA== 2226 | dependencies: 2227 | punycode "^2.1.0" 2228 | 2229 | tr46@~0.0.3: 2230 | version "0.0.3" 2231 | resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" 2232 | integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== 2233 | 2234 | tree-kill@^1.2.2: 2235 | version "1.2.2" 2236 | resolved "https://registry.yarnpkg.com/tree-kill/-/tree-kill-1.2.2.tgz#4ca09a9092c88b73a7cdc5e8a01b507b0790a0cc" 2237 | integrity sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A== 2238 | 2239 | ts-interface-checker@^0.1.9: 2240 | version "0.1.13" 2241 | resolved "https://registry.yarnpkg.com/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz#784fd3d679722bc103b1b4b8030bcddb5db2a699" 2242 | integrity sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA== 2243 | 2244 | ts-node@^10.9.2: 2245 | version "10.9.2" 2246 | resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.9.2.tgz#70f021c9e185bccdca820e26dc413805c101c71f" 2247 | integrity sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ== 2248 | dependencies: 2249 | "@cspotcode/source-map-support" "^0.8.0" 2250 | "@tsconfig/node10" "^1.0.7" 2251 | "@tsconfig/node12" "^1.0.7" 2252 | "@tsconfig/node14" "^1.0.0" 2253 | "@tsconfig/node16" "^1.0.2" 2254 | acorn "^8.4.1" 2255 | acorn-walk "^8.1.1" 2256 | arg "^4.1.0" 2257 | create-require "^1.1.0" 2258 | diff "^4.0.1" 2259 | make-error "^1.1.1" 2260 | v8-compile-cache-lib "^3.0.1" 2261 | yn "3.1.1" 2262 | 2263 | tslib@^2.1.0, tslib@^2.4.0: 2264 | version "2.6.3" 2265 | resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.3.tgz#0438f810ad7a9edcde7a241c3d80db693c8cbfe0" 2266 | integrity sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ== 2267 | 2268 | tsup@^8.0.2: 2269 | version "8.1.0" 2270 | resolved "https://registry.yarnpkg.com/tsup/-/tsup-8.1.0.tgz#354ce9def1721f5029564382ea2a42dc67fbb489" 2271 | integrity sha512-UFdfCAXukax+U6KzeTNO2kAARHcWxmKsnvSPXUcfA1D+kU05XDccCrkffCQpFaWDsZfV0jMyTsxU39VfCp6EOg== 2272 | dependencies: 2273 | bundle-require "^4.0.0" 2274 | cac "^6.7.12" 2275 | chokidar "^3.5.1" 2276 | debug "^4.3.1" 2277 | esbuild "^0.21.4" 2278 | execa "^5.0.0" 2279 | globby "^11.0.3" 2280 | joycon "^3.0.1" 2281 | postcss-load-config "^4.0.1" 2282 | resolve-from "^5.0.0" 2283 | rollup "^4.0.2" 2284 | source-map "0.8.0-beta.0" 2285 | sucrase "^3.20.3" 2286 | tree-kill "^1.2.2" 2287 | 2288 | type-is@~1.6.18: 2289 | version "1.6.18" 2290 | resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" 2291 | integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== 2292 | dependencies: 2293 | media-typer "0.3.0" 2294 | mime-types "~2.1.24" 2295 | 2296 | typescript@^5.5.3: 2297 | version "5.5.3" 2298 | resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.5.3.tgz#e1b0a3c394190838a0b168e771b0ad56a0af0faa" 2299 | integrity sha512-/hreyEujaB0w76zKo6717l3L0o/qEUtRgdvUBvlkhoWeOVMjMuHNHk0BRBzikzuGDqNmPQbg5ifMEqsHLiIUcQ== 2300 | 2301 | undefsafe@^2.0.5: 2302 | version "2.0.5" 2303 | resolved "https://registry.yarnpkg.com/undefsafe/-/undefsafe-2.0.5.tgz#38733b9327bdcd226db889fb723a6efd162e6e2c" 2304 | integrity sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA== 2305 | 2306 | undici-types@~5.26.4: 2307 | version "5.26.5" 2308 | resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" 2309 | integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== 2310 | 2311 | unpipe@1.0.0, unpipe@~1.0.0: 2312 | version "1.0.0" 2313 | resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" 2314 | integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== 2315 | 2316 | utils-merge@1.0.1: 2317 | version "1.0.1" 2318 | resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" 2319 | integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== 2320 | 2321 | uuid@^9.0.0: 2322 | version "9.0.1" 2323 | resolved "https://registry.yarnpkg.com/uuid/-/uuid-9.0.1.tgz#e188d4c8853cc722220392c424cd637f32293f30" 2324 | integrity sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA== 2325 | 2326 | v8-compile-cache-lib@^3.0.1: 2327 | version "3.0.1" 2328 | resolved "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz#6336e8d71965cb3d35a1bbb7868445a7c05264bf" 2329 | integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg== 2330 | 2331 | value-or-promise@1.0.11: 2332 | version "1.0.11" 2333 | resolved "https://registry.yarnpkg.com/value-or-promise/-/value-or-promise-1.0.11.tgz#3e90299af31dd014fe843fe309cefa7c1d94b140" 2334 | integrity sha512-41BrgH+dIbCFXClcSapVs5M6GkENd3gQOJpEfPDNa71LsUGMXDL0jMWpI/Rh7WhX+Aalfz2TTS3Zt5pUsbnhLg== 2335 | 2336 | value-or-promise@^1.0.12: 2337 | version "1.0.12" 2338 | resolved "https://registry.yarnpkg.com/value-or-promise/-/value-or-promise-1.0.12.tgz#0e5abfeec70148c78460a849f6b003ea7986f15c" 2339 | integrity sha512-Z6Uz+TYwEqE7ZN50gwn+1LCVo9ZVrpxRPOhOLnncYkY1ZzOYtrX8Fwf/rFktZ8R5mJms6EZf5TqNOMeZmnPq9Q== 2340 | 2341 | vary@^1, vary@~1.1.2: 2342 | version "1.1.2" 2343 | resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" 2344 | integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== 2345 | 2346 | webidl-conversions@^3.0.0: 2347 | version "3.0.1" 2348 | resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" 2349 | integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== 2350 | 2351 | webidl-conversions@^4.0.2: 2352 | version "4.0.2" 2353 | resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad" 2354 | integrity sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg== 2355 | 2356 | whatwg-mimetype@^3.0.0: 2357 | version "3.0.0" 2358 | resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz#5fa1a7623867ff1af6ca3dc72ad6b8a4208beba7" 2359 | integrity sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q== 2360 | 2361 | whatwg-url@^5.0.0: 2362 | version "5.0.0" 2363 | resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" 2364 | integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== 2365 | dependencies: 2366 | tr46 "~0.0.3" 2367 | webidl-conversions "^3.0.0" 2368 | 2369 | whatwg-url@^7.0.0: 2370 | version "7.1.0" 2371 | resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-7.1.0.tgz#c2c492f1eca612988efd3d2266be1b9fc6170d06" 2372 | integrity sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg== 2373 | dependencies: 2374 | lodash.sortby "^4.7.0" 2375 | tr46 "^1.0.1" 2376 | webidl-conversions "^4.0.2" 2377 | 2378 | which@^2.0.1: 2379 | version "2.0.2" 2380 | resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" 2381 | integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== 2382 | dependencies: 2383 | isexe "^2.0.0" 2384 | 2385 | "wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": 2386 | version "7.0.0" 2387 | resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" 2388 | integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== 2389 | dependencies: 2390 | ansi-styles "^4.0.0" 2391 | string-width "^4.1.0" 2392 | strip-ansi "^6.0.0" 2393 | 2394 | wrap-ansi@^8.1.0: 2395 | version "8.1.0" 2396 | resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" 2397 | integrity sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ== 2398 | dependencies: 2399 | ansi-styles "^6.1.0" 2400 | string-width "^5.0.1" 2401 | strip-ansi "^7.0.1" 2402 | 2403 | ws@^8.16.0: 2404 | version "8.18.0" 2405 | resolved "https://registry.yarnpkg.com/ws/-/ws-8.18.0.tgz#0d7505a6eafe2b0e712d232b42279f53bc289bbc" 2406 | integrity sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw== 2407 | 2408 | xss@^1.0.8: 2409 | version "1.0.15" 2410 | resolved "https://registry.yarnpkg.com/xss/-/xss-1.0.15.tgz#96a0e13886f0661063028b410ed1b18670f4e59a" 2411 | integrity sha512-FVdlVVC67WOIPvfOwhoMETV72f6GbW7aOabBC3WxN/oUdoEMDyLz4OgRv5/gck2ZeNqEQu+Tb0kloovXOfpYVg== 2412 | dependencies: 2413 | commander "^2.20.3" 2414 | cssfilter "0.0.10" 2415 | 2416 | xtend@^4.0.0: 2417 | version "4.0.2" 2418 | resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" 2419 | integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== 2420 | 2421 | yallist@^4.0.0: 2422 | version "4.0.0" 2423 | resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" 2424 | integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== 2425 | 2426 | yaml@^2.3.4: 2427 | version "2.4.5" 2428 | resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.4.5.tgz#60630b206dd6d84df97003d33fc1ddf6296cca5e" 2429 | integrity sha512-aBx2bnqDzVOyNKfsysjA2ms5ZlnjSAW2eG3/L5G/CSujfjLJTJsEw1bGw8kCf04KodQWk1pxlGnZ56CRxiawmg== 2430 | 2431 | yn@3.1.1: 2432 | version "3.1.1" 2433 | resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" 2434 | integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== 2435 | -------------------------------------------------------------------------------- /jest.config.ts: -------------------------------------------------------------------------------- 1 | /* 2 | * For a detailed explanation regarding each configuration property and type check, visit: 3 | * https://jestjs.io/docs/configuration 4 | */ 5 | 6 | // const { pathsToModuleNameMapper } = require('ts-jest') 7 | // const { compilerOptions } = require('./tsconfig') 8 | // import { pathsToModuleNameMapper } from 'ts-jest' 9 | 10 | export default { 11 | roots: ['/src'], 12 | clearMocks: true, 13 | collectCoverage: true, 14 | coverageDirectory: "coverage", 15 | coverageProvider: "v8", 16 | testMatch: [ 17 | "**/__tests__/**/*.[jt]s?(x)", 18 | "**/?(*.)+(spec|test).[tj]s?(x)" 19 | ], 20 | moduleNameMapper: { 21 | "@/(.*)": "/src/$1" 22 | }, 23 | preset: 'ts-jest', 24 | globals: { 25 | "ts-jest": { 26 | diagnostics: { pathRegex: /\.(spec|test)\.js$/ }, 27 | isolatedModules: true, 28 | tsconfig: 'tsconfig.json', 29 | } 30 | }, 31 | testEnvironment: "node", 32 | }; 33 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "prisma-generator-postgres-realtime", 3 | "version": "1.0.0", 4 | "license": "MIT", 5 | "description": "A prisma generator that turns your Postgres Database into a realtime Database and make it easy to subscribe to changes from Prisma Client type-safe Api", 6 | "main": "./src/index.js", 7 | "types": "./src/index.d.ts", 8 | "module": "./src/index.js", 9 | "exports": { 10 | "import": "./src/index.js", 11 | "require": "./src/index.js" 12 | }, 13 | "repository": { 14 | "type": "git", 15 | "url": "git+https://github.com/Cauen/prisma-generator-postgres-realtime.git" 16 | }, 17 | "author": "Cauê Nolasco", 18 | "keywords": [ 19 | "realtime", 20 | "generator", 21 | "extension", 22 | "subscription", 23 | "typescript", 24 | "prisma", 25 | "db", 26 | "postgres", 27 | "codegen" 28 | ], 29 | "scripts": { 30 | "test": "jest", 31 | "build": "tsc", 32 | "tscheck": "tsc -noEmit", 33 | "prebuild": "yarn clean", 34 | "postbuild": "shx cp ./README.md ./dist && shx chmod +x ./dist/src/bin.js", 35 | "clean": "shx rm -rf dist", 36 | "pub": "cd dist && npm publish", 37 | "format": "eslint --fix ./src", 38 | "check-src-and-examples": "yarn test && yarn tscheck && cd examples/inputs-simple-sqlite && yarn generate && yarn tscheck", 39 | "fullcheck": "yarn check-src-and-examples" 40 | }, 41 | "bin": { 42 | "prisma-generator-postgres-realtime": "./src/bin.js" 43 | }, 44 | "peerDependencies": { 45 | "pg": "^8.0.0", 46 | "@prisma/client": "^5.0.0", 47 | "prisma": "^5.0.0" 48 | }, 49 | "devDependencies": { 50 | "@prisma/internals": "5.17.0", 51 | "@types/jest": "29.0.0", 52 | "@types/node": "18.7.14", 53 | "@typescript-eslint/eslint-plugin": "^6.10.0", 54 | "@typescript-eslint/parser": "^6.10.0", 55 | "eslint": "^8.53.0", 56 | "eslint-config-prettier": "^9.0.0", 57 | "eslint-config-standard": "^17.1.0", 58 | "eslint-plugin-import": "^2.29.0", 59 | "eslint-plugin-n": "^16.3.0", 60 | "eslint-plugin-prettier": "^5.0.1", 61 | "eslint-plugin-promise": "^6.1.1", 62 | "jest": "<29.0.0", 63 | "prettier": "^3.0.3", 64 | "shx": "0.3.4", 65 | "ts-jest": "28.0.8", 66 | "ts-node": "10.9.1", 67 | "typescript": "^5.2.2" 68 | }, 69 | "dependencies": { 70 | "@prisma/generator-helper": "^5.22.0" 71 | }, 72 | "packageManager": "yarn@1.22.21+sha1.1959a18351b811cdeedbd484a8f86c3cc3bbaf72" 73 | } 74 | -------------------------------------------------------------------------------- /src/bin.ts: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | import './generator' 3 | -------------------------------------------------------------------------------- /src/env.ts: -------------------------------------------------------------------------------- 1 | export const env = { 2 | isTesting: !!process.env.JEST_WORKER_ID, 3 | } 4 | -------------------------------------------------------------------------------- /src/extensionGenerator/index.test.ts: -------------------------------------------------------------------------------- 1 | import { getSampleDMMF } from '../tests/getPrismaSchema' 2 | import { getDefaultConfig } from '../utils/config' 3 | import { generateExtension } from '.' 4 | 5 | describe('inputsGenerator', () => { 6 | it('should generate inputs', async () => { 7 | const dmmf = await getSampleDMMF('complex') 8 | const defaultConfig = getDefaultConfig() 9 | await generateExtension(defaultConfig, dmmf) 10 | }) 11 | }) 12 | -------------------------------------------------------------------------------- /src/extensionGenerator/index.ts: -------------------------------------------------------------------------------- 1 | import { env } from '../env' 2 | import { ConfigInternal } from '../utils/config' 3 | import { writeFile } from '../utils/filesystem' 4 | import { getExtensionContent } from './utils/parts' 5 | import type { DMMF } from '@prisma/generator-helper' 6 | 7 | export async function generateExtension(config: ConfigInternal, dmmf: DMMF.Document): Promise { 8 | if (env.isTesting) 9 | await writeFile({ 10 | config, 11 | section: 'debug.dmmf', 12 | content: JSON.stringify(dmmf, null, 2), 13 | location: 'dmmf.json', 14 | }) 15 | 16 | if (config.extension.disabled) return 17 | const location = config.extension.outputFilePath 18 | 19 | const content = getExtensionContent(config, dmmf) 20 | 21 | await writeFile({ 22 | config, 23 | section: 'extension', 24 | content, 25 | location, 26 | }) 27 | } 28 | -------------------------------------------------------------------------------- /src/extensionGenerator/utils/parts.ts: -------------------------------------------------------------------------------- 1 | import { DMMF } from '@prisma/generator-helper' 2 | import { ConfigInternal, includeModel } from '../../utils/config' 3 | import { useTemplate } from '../../utils/template' 4 | 5 | const template = `#{prismaClientImport} 6 | import { Client } from "pg"; 7 | 8 | const triggerName = "#{triggerName}"; 9 | 10 | type ChangePropsRaw = { 11 | tableName: string; 12 | tableSchema: string; 13 | operation: "INSERT" | "UPDATE" | "DELETE"; 14 | newRow: T; 15 | oldRow: T; 16 | timestamp: string; 17 | dbUser: string; 18 | }; 19 | type ChangeProps = ChangePropsRaw & { 20 | model: Prisma.ModelName; 21 | }; 22 | type FnHanler = (props: ChangeProps) => void; 23 | type LogLevel = "none" | "error" | "all"; 24 | type Options = { logLevel?: LogLevel; connectionString?: string }; 25 | type Subscriber = { 26 | handler: FnHanler; 27 | model: Prisma.ModelName | null; 28 | options?: Options; 29 | }; 30 | 31 | const modelMaps: Record = { 32 | #{modelMaps} 33 | }; 34 | 35 | function log( 36 | options?: Options, 37 | logType?: "success" | "fail", 38 | message?: any, 39 | ...optionalParams: any 40 | ) { 41 | const logLevel = options?.logLevel || "error"; 42 | if (logLevel === "none") return; 43 | if (logLevel === "error" && logType !== "fail") return; 44 | console.log("Prisma Realtime Extension:", message, ...optionalParams); 45 | } 46 | 47 | const pgClient = (() => { 48 | type State = { 49 | client: Client | null; 50 | clientStatus: "disconected" | "connecting" | "connected"; 51 | // model = null to all 52 | subscribers: Array; 53 | }; 54 | const state: State = { 55 | client: null, 56 | clientStatus: "disconected", 57 | subscribers: [], 58 | }; 59 | 60 | const getClient = async (options?: Options): Promise => { 61 | if (state.client) return state.client; 62 | 63 | try { 64 | log(options, "success", \`🟡 Trying to connect to PostgreSQL database\`); 65 | const pgClient = new Client({ 66 | connectionString: options?.connectionString || process.env.DATABASE_URL, 67 | }); 68 | state.clientStatus = "connecting"; 69 | await pgClient.connect(); 70 | state.client = pgClient; 71 | state.clientStatus = "connected"; 72 | 73 | log(options, "success", \`✅ Connected to PostgreSQL database\`); 74 | return pgClient; 75 | } catch (error) { 76 | log(options, "fail", "Error connecting to PostgreSQL database:", error); 77 | await new Promise((resolve) => setTimeout(resolve, 2000)); 78 | return getClient(options); 79 | } 80 | }; 81 | 82 | async function startIfDisconnected(options?: Options) { 83 | if (state.clientStatus !== "disconected") return; 84 | 85 | try { 86 | const pgClient = await getClient(options); 87 | 88 | log(options, "success", "🟡 Trying to listen for table changes"); 89 | await pgClient.query(\`LISTEN \${triggerName}\`); 90 | log(options, "success", "✅ Listening for table changes"); 91 | 92 | pgClient.on("error", async (err) => { 93 | log(options, "fail", "PostgreSQL client error:", err); 94 | await pgClient?.end(); 95 | state.client = null; 96 | state.clientStatus = "disconected"; 97 | 98 | startIfDisconnected(options); 99 | }); 100 | 101 | pgClient.on("notification", (notification) => { 102 | if (!notification.payload) return; 103 | if (notification.channel !== triggerName) return; 104 | const parsed: ChangePropsRaw = JSON.parse(notification.payload); 105 | const model = 106 | modelMaps[parsed.tableName] || (parsed.tableName as Prisma.ModelName); 107 | const change: ChangeProps = { ...parsed, model }; 108 | 109 | for (const subscriber of state.subscribers) { 110 | if (subscriber.model !== null && subscriber.model !== change.model) 111 | continue; 112 | subscriber.handler(change); 113 | } 114 | }); 115 | 116 | return pgClient; 117 | } catch (error) { 118 | log(options, "fail", "Error listening for table changes:", error); 119 | await new Promise((resolve) => setTimeout(resolve, 2000)); 120 | state.client = null; 121 | state.clientStatus = "disconected"; 122 | return startIfDisconnected(options); 123 | } 124 | } 125 | 126 | async function onNotification(props: Subscriber) { 127 | await startIfDisconnected(props.options); 128 | state.subscribers.push(props); 129 | } 130 | 131 | return { onNotification }; 132 | })(); 133 | 134 | export const prismaRealtimeExtension = Prisma.defineExtension((client) => { 135 | return client.$extends({ 136 | client: { 137 | $subscribe: async (handler: FnHanler, options?: Options) => { 138 | pgClient.onNotification({ handler, model: null, options }); 139 | }, 140 | }, 141 | model: { 142 | $allModels: { 143 | async $subscribe< 144 | T, 145 | R extends Prisma.Result[number], 146 | >(this: T, handler: FnHanler, options?: Options) { 147 | pgClient.onNotification({ 148 | handler, 149 | model: (this as { name: Prisma.ModelName }).name, 150 | options, 151 | }); 152 | }, 153 | }, 154 | }, 155 | }); 156 | }); 157 | ` 158 | 159 | export function getExtensionContent(config: ConfigInternal, dmmf: DMMF.Document) { 160 | return useTemplate(template, { 161 | triggerName: config.global.triggerName, 162 | prismaClientImport: config.extension.prismaClientImporter, 163 | modelMaps: dmmf.datamodel.models 164 | .filter((model) => includeModel({ model, configs: config })) 165 | .filter((model) => model.dbName) 166 | .map((model) => `"${model.dbName}": "${model.name}",`) 167 | .join('\n '), 168 | }) 169 | } 170 | -------------------------------------------------------------------------------- /src/generator.ts: -------------------------------------------------------------------------------- 1 | import { generatorHandler, GeneratorOptions } from '@prisma/generator-helper' 2 | import { generateExtension } from './extensionGenerator' 3 | import { generateMigrations } from './migrationsGenerator' 4 | import { getConfig } from './utils/config' 5 | 6 | // Types from the generator, in `schema.prisma` 7 | type SchemaGeneratorExtensionOptions = { generatorConfigPath?: string } 8 | 9 | // default config from generator, with the path option 10 | export type ExtendedGeneratorOptions = SchemaGeneratorExtensionOptions & GeneratorOptions 11 | 12 | generatorHandler({ 13 | onManifest: () => ({ 14 | prettyName: 'Postgres Realtime', 15 | requiresGenerators: ['prisma-client-js'], 16 | defaultOutput: './src/realtime/prismaExtension.ts', 17 | }), 18 | onGenerate: async (options) => { 19 | const generatorConfig: ExtendedGeneratorOptions = { ...options, ...options.generator.config } 20 | const config = await getConfig(generatorConfig) 21 | 22 | config.global.beforeGenerate(options.dmmf) 23 | await generateMigrations(config, options.dmmf) 24 | await generateExtension(config, options.dmmf) 25 | config.global.afterGenerate(options.dmmf) 26 | }, 27 | }) 28 | -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- 1 | export { Config } from './utils/config' 2 | -------------------------------------------------------------------------------- /src/migrationsGenerator/index.test.ts: -------------------------------------------------------------------------------- 1 | import { getSampleDMMF } from '../tests/getPrismaSchema' 2 | import { getDefaultConfig } from '../utils/config' 3 | import { generateMigrations } from '.' 4 | 5 | describe('crudGenerator', () => { 6 | it('should generate all files', async () => { 7 | const dmmf = await getSampleDMMF('complex') 8 | const defaultConfig = getDefaultConfig() 9 | await generateMigrations(defaultConfig, dmmf) 10 | }) 11 | }) 12 | -------------------------------------------------------------------------------- /src/migrationsGenerator/index.ts: -------------------------------------------------------------------------------- 1 | import { ConfigInternal } from '../utils/config' 2 | import { generateMigrationsFile } from './utils/migrationFile' 3 | import { generateStatusFile } from './utils/statusFile' 4 | import type { DMMF } from '@prisma/generator-helper' 5 | 6 | export async function generateMigrations(config: ConfigInternal, dmmf: DMMF.Document): Promise { 7 | if (config.migrations.disabled) return 8 | 9 | const { apply, unmigratedModels } = await generateStatusFile({ config, dmmf }) 10 | if (!unmigratedModels.length) return 11 | 12 | await generateMigrationsFile({ config, models: unmigratedModels }) 13 | 14 | // Do some thing 15 | await apply() 16 | } 17 | -------------------------------------------------------------------------------- /src/migrationsGenerator/utils/migrationFile.ts: -------------------------------------------------------------------------------- 1 | import path from 'path' 2 | import { DMMF } from '@prisma/generator-helper' 3 | import { ConfigInternal } from '../../utils/config' 4 | import { writeFile } from '../../utils/filesystem' 5 | import { useTemplate } from '../../utils/template' 6 | 7 | const functionTemplate = `CREATE OR REPLACE FUNCTION notify_postgres_realtime() 8 | RETURNS TRIGGER AS $$ 9 | BEGIN 10 | -- Convert the NEW row to JSON and send it as a notification 11 | PERFORM pg_notify('#{triggerName}', json_build_object( 12 | 'tableName', TG_RELNAME, 13 | 'tableSchema', TG_TABLE_SCHEMA, 14 | 'operation', TG_OP, 15 | 'newRow', row_to_json(NEW), 16 | 'oldRow', row_to_json(OLD), 17 | 'timestamp', now(), 18 | 'dbUser', current_user 19 | )::text); 20 | RETURN NEW; 21 | END; 22 | $$ LANGUAGE plpgsql;` 23 | 24 | const tableTriggerTemplate = `CREATE OR REPLACE TRIGGER "#{tableName}_table_update" 25 | AFTER INSERT OR UPDATE OR DELETE ON "#{tableName}" 26 | FOR EACH ROW 27 | EXECUTE FUNCTION notify_postgres_realtime();` 28 | 29 | export const generateMigrationsFile = async ({ config, models }: { config: ConfigInternal; models: DMMF.Model[] }) => { 30 | const content = [ 31 | useTemplate(functionTemplate, { triggerName: config.global.triggerName }), 32 | ...models.map((model) => useTemplate(tableTriggerTemplate, { tableName: model.dbName || model.name })), 33 | ].join('\n\n') 34 | 35 | const isoOnlyNumbers = new Date() 36 | .toISOString() 37 | // Replace everything after dot 38 | .replace(/\..*/, '') 39 | // Keep only numbers 40 | .replace(/[^0-9]/g, '') 41 | const migrationNameRaw = `realtime_${models.map((el) => el.name.toLocaleLowerCase()).join('_')}` 42 | const migrationNameLimit = 150 // linux has 255 chars limit, but 150 is too long 43 | const migrationName = 44 | migrationNameRaw.length > migrationNameLimit ? `realtime_${models.length}_tables` : migrationNameRaw 45 | const migrationFolder = `${isoOnlyNumbers}_${migrationName}` 46 | 47 | await writeFile({ 48 | config, 49 | location: path.join(config.migrations.outputDirPath, migrationFolder, 'migration.sql'), 50 | content, 51 | section: 'migrations', 52 | }) 53 | } 54 | -------------------------------------------------------------------------------- /src/migrationsGenerator/utils/statusFile.ts: -------------------------------------------------------------------------------- 1 | import { DMMF } from '@prisma/generator-helper' 2 | import { includeModel, type ConfigInternal } from '../../utils/config' 3 | import { readFile, writeFile } from '../../utils/filesystem' 4 | 5 | type Content = { 6 | migratedModels: string[] 7 | } 8 | 9 | const getContent = async ({ config }: { config: ConfigInternal }): Promise => { 10 | const filePath = config.migrations.outputStatusFilePath 11 | try { 12 | const fileContent = await readFile(filePath) 13 | if (fileContent) return JSON.parse(fileContent) as Content 14 | return undefined 15 | } catch (err) { 16 | return undefined 17 | } 18 | } 19 | 20 | const setContent = async ({ config, content }: { config: ConfigInternal; content: Content }) => { 21 | return writeFile({ 22 | config, 23 | location: config.migrations.outputStatusFilePath, 24 | content: JSON.stringify(content, null, 2), 25 | section: 'statusFile', 26 | }) 27 | } 28 | 29 | export const generateStatusFile = async ({ config, dmmf }: { config: ConfigInternal; dmmf: DMMF.Document }) => { 30 | const currentContent = await getContent({ config }) 31 | const alreadyMigratedModels = currentContent?.migratedModels || [] 32 | const models = dmmf.datamodel.models 33 | const includedModels = models.filter((model) => includeModel({ model, configs: config })) 34 | const modelNames = includedModels.map((model) => model.name) 35 | const unmigratedModels = includedModels.filter((model) => !alreadyMigratedModels.includes(model.name)) 36 | const content: Content = { migratedModels: modelNames } 37 | 38 | return { 39 | unmigratedModels, 40 | apply: () => setContent({ config, content }), 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /src/tests/complexSchema.prisma: -------------------------------------------------------------------------------- 1 | datasource db { 2 | provider = "postgresql" 3 | url = "postgresql://postgres:mysecretpassword@localhost:5432/realtime-tests" 4 | } 5 | 6 | generator client { 7 | provider = "prisma-client-js" 8 | // Generate into custom location because this repo has multiple prisma schemas 9 | output = "./client" 10 | } 11 | 12 | model User { 13 | id Int @id @default(autoincrement()) 14 | firstName String 15 | /// lastname description 16 | lastName String 17 | /// relation desc 18 | posts Post[] 19 | Comments Comment[] 20 | /// createdAt description 21 | createdAt DateTime @default(now()) @db.Timestamp(6) 22 | updatedAt DateTime? @updatedAt 23 | Profile Profile? 24 | scalar WithScalars @relation(fields: [withScalarsId], references: [id]) 25 | followers Follow[] @relation("followers") 26 | following Follow[] @relation("following") 27 | withScalarsId Int 28 | } 29 | 30 | model Post { 31 | id Int @id @default(autoincrement()) 32 | title String 33 | /// createdAt description 34 | content String 35 | author User @relation(fields: [authorId], references: [id]) 36 | Comments Comment[] 37 | authorId Int 38 | } 39 | 40 | model Comment { 41 | id Int @id @default(autoincrement()) 42 | comment String 43 | author User @relation(fields: [authorId], references: [id]) 44 | post Post @relation(fields: [postId], references: [id]) 45 | authorId Int 46 | postId Int 47 | } 48 | 49 | model Profile { 50 | id Int @id @default(autoincrement()) 51 | bio String? 52 | user User @relation(fields: [userId], references: [id]) 53 | userId Int @unique 54 | } 55 | 56 | model Follow { 57 | fromId Int 58 | toId Int 59 | from User @relation("following", fields: [fromId], references: [id]) 60 | to User @relation("followers", fields: [toId], references: [id]) 61 | 62 | @@id([fromId, toId], name: "compositeID") 63 | } 64 | 65 | model Unrelated { 66 | id Int @id @default(autoincrement()) 67 | name String? 68 | } 69 | 70 | model IdOnly { 71 | id Int @id @default(autoincrement()) 72 | } 73 | 74 | model WithoutID { 75 | name String @unique 76 | } 77 | 78 | model Bird { 79 | id String @id 80 | name String 81 | } 82 | 83 | enum Role { 84 | USER 85 | ADMIN 86 | } 87 | 88 | model WithScalars { 89 | id Int @id @default(autoincrement()) 90 | string String? 91 | boolean Boolean? 92 | int Int? 93 | float Float? 94 | decimal Decimal? 95 | bigint BigInt? 96 | datetime DateTime? @db.Timestamp(6) 97 | json Json? 98 | bytes Bytes? 99 | User User[] 100 | } 101 | -------------------------------------------------------------------------------- /src/tests/configs.js: -------------------------------------------------------------------------------- 1 | // /** @type {import('prisma-generator-postgres-realtime').Config} */ 2 | 3 | /** @type {import('../utils/config').Config} */ 4 | module.exports = { 5 | extension: { 6 | disabled: false, 7 | outputFilePath: './src/realtime/prismaExtension.ts', 8 | }, 9 | global: { 10 | triggerName: 'prisma_postgres_realtime_custom', 11 | }, 12 | migrations: { 13 | disabled: false, 14 | outputDirPath: './prisma/migrations', 15 | outputStatusFilePath: './src/realtime/prismaRealtimeStatus.json', 16 | }, 17 | } 18 | -------------------------------------------------------------------------------- /src/tests/getPrismaSchema.ts: -------------------------------------------------------------------------------- 1 | import path from 'path' 2 | import { getDMMF, getSchema } from '@prisma/internals' 3 | 4 | const simplePrismaSchema = getSchema(path.join(__dirname, './simpleSchema.prisma')) 5 | const complexPrismaSchema = getSchema(path.join(__dirname, './complexSchema.prisma')) 6 | 7 | export const getSampleDMMF = async (type: 'complex' | 'simple') => { 8 | const datamodelSchema = type === 'complex' ? complexPrismaSchema : simplePrismaSchema 9 | 10 | return getDMMF({ 11 | datamodel: await datamodelSchema, 12 | }) 13 | } 14 | -------------------------------------------------------------------------------- /src/tests/health.test.ts: -------------------------------------------------------------------------------- 1 | test('should jest run', () => { 2 | expect(true).toBe(true) 3 | }) 4 | -------------------------------------------------------------------------------- /src/tests/simpleSchema.prisma: -------------------------------------------------------------------------------- 1 | datasource db { 2 | provider = "postgresql" 3 | url = "postgresql://postgres:mysecretpassword@localhost:5432/realtime-tests" 4 | } 5 | 6 | generator client { 7 | provider = "prisma-client-js" 8 | // Generate into custom location because this repo has multiple prisma schemas 9 | output = "./client" 10 | } 11 | 12 | model User { 13 | id Int @id @default(autoincrement()) 14 | firstName String 15 | /// lastname description 16 | lastName String 17 | /// relation desc 18 | posts Post[] 19 | createdAt DateTime @default(now()) @db.Timestamp(6) 20 | updatedAt DateTime? @updatedAt 21 | } 22 | 23 | model Post { 24 | id Int @id @default(autoincrement()) 25 | title String 26 | content String 27 | author User @relation(fields: [authorId], references: [id]) 28 | authorId Int 29 | createdAt DateTime @default(now()) @db.Timestamp(6) 30 | updatedAt DateTime? @updatedAt 31 | } -------------------------------------------------------------------------------- /src/utils/config.test.ts: -------------------------------------------------------------------------------- 1 | import { ExtendedGeneratorOptions } from '../generator' 2 | import { getSampleDMMF } from '../tests/getPrismaSchema' 3 | import * as config from './config' 4 | 5 | const cwd = process.cwd() 6 | 7 | const generateOptions = async (generatorConfigPath?: string): Promise => { 8 | const dmmf = await getSampleDMMF('simple') 9 | 10 | return { 11 | datamodel: '', 12 | datasources: [], 13 | generator: { 14 | sourceFilePath: '', 15 | name: 'realtime', 16 | provider: { 17 | fromEnvVar: null, 18 | value: 'ts-node --transpile-only ../../src/generator.ts', 19 | }, 20 | output: { 21 | value: `${cwd}/src/tests/generated/inputs.ts`, 22 | fromEnvVar: 'null', 23 | }, 24 | config: {}, 25 | binaryTargets: [], 26 | previewFeatures: [], 27 | }, 28 | generatorConfigPath, 29 | dmmf, 30 | otherGenerators: [ 31 | { 32 | sourceFilePath: '', 33 | name: 'client', 34 | provider: { fromEnvVar: null, value: 'prisma-client-js' }, 35 | output: { 36 | value: `${cwd}/src/tests/@prisma/client`, 37 | fromEnvVar: null, 38 | }, 39 | config: {}, 40 | binaryTargets: [], 41 | previewFeatures: [], 42 | }, 43 | ], 44 | schemaPath: `${cwd}/src/tests/simpleSchema.prisma`, 45 | version: '272861e07ab64f234d3ffc4094e32bd61775599c', 46 | } satisfies ExtendedGeneratorOptions 47 | } 48 | 49 | afterEach(() => { 50 | delete process.env.POSTGRES_REALTIME_CONFIG_PATH 51 | }) 52 | 53 | describe('getConfigPath', () => { 54 | const { getConfigPath } = config 55 | 56 | it('should return undefined', async () => { 57 | expect( 58 | getConfigPath({ 59 | generatorConfigPath: undefined, 60 | schemaPath: '.', 61 | }), 62 | ).toBeUndefined() 63 | }) 64 | 65 | it('should return `POSTGRES_REALTIME_CONFIG_PATH`', async () => { 66 | const configPath = '../config-file-env' 67 | process.env.POSTGRES_REALTIME_CONFIG_PATH = configPath 68 | 69 | expect( 70 | getConfigPath({ 71 | generatorConfigPath: undefined, 72 | schemaPath: '.', 73 | }), 74 | ).toBe(configPath) 75 | }) 76 | 77 | it('should return `generatorConfigPath`', async () => { 78 | const generatorConfigPath = '../config-file-path' 79 | 80 | expect( 81 | getConfigPath({ 82 | generatorConfigPath, 83 | schemaPath: '.', 84 | }), 85 | ).toBe(generatorConfigPath) 86 | }) 87 | 88 | it('should return `POSTGRES_REALTIME_CONFIG_PATH` over `generatorConfigPath`', async () => { 89 | const configPath = '../config-file-env' 90 | process.env.POSTGRES_REALTIME_CONFIG_PATH = configPath 91 | 92 | expect( 93 | getConfigPath({ 94 | generatorConfigPath: '../config-file', 95 | schemaPath: '.', 96 | }), 97 | ).toBe(configPath) 98 | }) 99 | }) 100 | 101 | describe('parseConfig', () => { 102 | const { parseConfig } = config 103 | 104 | it(`should throw error if the file doesn't exist`, async () => { 105 | const fileName = './does-not-exist' 106 | const regexp = new RegExp(`^Cannot find module '${fileName}'`) 107 | 108 | await expect(parseConfig(fileName)).rejects.toThrow(regexp) 109 | }) 110 | 111 | it(`should parse the config file`, async () => { 112 | const configs = await parseConfig('../tests/configs.js') 113 | 114 | expect(configs).toEqual({ 115 | extension: expect.objectContaining({ 116 | disabled: false, 117 | outputFilePath: './src/realtime/prismaExtension.ts', 118 | }), 119 | migrations: { 120 | disabled: false, 121 | outputDirPath: './prisma/migrations', 122 | outputStatusFilePath: './src/realtime/prismaRealtimeStatus.json', 123 | }, 124 | global: expect.objectContaining({ 125 | triggerName: 'prisma_postgres_realtime_custom', 126 | }), 127 | }) 128 | }) 129 | }) 130 | 131 | describe('getConfig', () => { 132 | const { getConfig } = config 133 | const getDefaultConfigMock = jest.spyOn(config, 'getDefaultConfig') 134 | 135 | it(`should return the default config if a configPath doesn't exist`, async () => { 136 | const options = await generateOptions() 137 | const configs = await getConfig(options) 138 | 139 | expect(getDefaultConfigMock).toHaveBeenCalledWith() 140 | expect(configs).toEqual({ 141 | extension: expect.objectContaining({ 142 | outputFilePath: './src/realtime/prismaExtension.ts', 143 | replacer: expect.any(Function), 144 | }), 145 | global: expect.objectContaining({ 146 | afterGenerate: expect.any(Function), 147 | beforeGenerate: expect.any(Function), 148 | triggerName: 'prisma_postgres_realtime_trigger', 149 | replacer: expect.any(Function), 150 | }), 151 | migrations: expect.objectContaining({ 152 | disabled: false, 153 | outputDirPath: './prisma/migrations', 154 | outputStatusFilePath: './src/realtime/prismaRealtimeStatus.json', 155 | replacer: expect.any(Function), 156 | }), 157 | }) 158 | }) 159 | 160 | it(`should return custom configuration merged with the defaults`, async () => { 161 | const options = await generateOptions('../tests/configs.js') 162 | const configs = await getConfig(options) 163 | 164 | expect(getDefaultConfigMock).toHaveBeenCalledWith({ 165 | triggerName: 'prisma_postgres_realtime_custom', 166 | }) 167 | expect(configs).toEqual({ 168 | extension: expect.objectContaining({ 169 | replacer: expect.any(Function), 170 | outputFilePath: './src/realtime/prismaExtension.ts', 171 | }), 172 | global: expect.objectContaining({ 173 | afterGenerate: expect.any(Function), 174 | beforeGenerate: expect.any(Function), 175 | replacer: expect.any(Function), 176 | triggerName: 'prisma_postgres_realtime_custom', 177 | }), 178 | migrations: expect.objectContaining({ 179 | disabled: false, 180 | outputDirPath: './prisma/migrations', 181 | outputStatusFilePath: './src/realtime/prismaRealtimeStatus.json', 182 | replacer: expect.any(Function), 183 | }), 184 | }) 185 | }) 186 | }) 187 | -------------------------------------------------------------------------------- /src/utils/config.ts: -------------------------------------------------------------------------------- 1 | import path from 'node:path' 2 | import { ExtendedGeneratorOptions } from '../generator' 3 | import { Replacer } from './replacer' 4 | import type { DMMF } from '@prisma/generator-helper' 5 | 6 | /** Interface used to configure generator behavior */ 7 | export interface Config { 8 | /** Input type generation config */ 9 | migrations?: { 10 | /** Directory to generate the custom migrations from project root. Default: `'./prisma/migrations'` */ 11 | outputDirPath?: string 12 | /** Disable generaton of migrations. Default: `false` */ 13 | disabled?: boolean 14 | /** Disable generaton of migrations. Default: `false` */ 15 | outputStatusFilePath?: string 16 | /** A function to replace generated source. Combined with global replacer config */ 17 | replacer?: Replacer<'migrations'> 18 | /** Included models in migrations */ 19 | includeModels?: string[] 20 | /** Excluded models in migrations (Ignored if includeModels is set) */ 21 | excludeModels?: string[] 22 | } 23 | /** CRUD generation config */ 24 | extension?: { 25 | /** Disable generaton of crud. Default: `false` */ 26 | disabled?: boolean 27 | /** Path to generate the inputs file to from project root. Default: `'./src/realtime/prismaExtension.ts'` */ 28 | outputFilePath?: string 29 | /** A function to replace generated source */ 30 | replacer?: Replacer<'extension'> 31 | /** How to import Prisma. Default `"import { Prisma } from "@prisma/client";"` */ 32 | prismaClientImporter?: string 33 | } 34 | /** Global config */ 35 | global?: { 36 | /** Name of the trigger to send from database and watch from prisma extension. Default: 'prisma_postgres_realtime_trigger' */ 37 | triggerName?: string 38 | /** A function to replace generated source */ 39 | replacer?: Replacer 40 | /** Run function before generate */ 41 | beforeGenerate?: (dmmf: DMMF.Document) => void 42 | /** Run function after generate */ 43 | afterGenerate?: (dmmf: DMMF.Document) => void 44 | } 45 | } 46 | 47 | /** Type representing a configuration filled with default values where the original config was missing them, for internal purposes */ 48 | export type ConfigInternal = { 49 | migrations: NonNullable> 50 | extension: NonNullable> 51 | global: NonNullable> 52 | } 53 | 54 | /** Parses the configuration file path */ 55 | export const getConfigPath = ({ 56 | generatorConfigPath, 57 | schemaPath, 58 | }: { 59 | generatorConfigPath?: string 60 | schemaPath: string 61 | }): string | undefined => { 62 | const envConfigPath = process.env.POSTGRES_REALTIME_CONFIG_PATH 63 | const configPath = envConfigPath || generatorConfigPath // use env var if set 64 | 65 | if (!configPath) return undefined 66 | 67 | const schemaDirName = path.dirname(schemaPath) 68 | const optionsPath = path.join(schemaDirName, configPath) 69 | 70 | return optionsPath 71 | } 72 | 73 | /** Parses the configuration file based on the provided schema and config paths */ 74 | export const parseConfig = async (configPath: string): Promise => { 75 | const importedFile = await import(configPath) // throw error if dont exist 76 | const { migrations, global, extension }: Config = importedFile || {} 77 | 78 | return { migrations, global, extension } 79 | } 80 | 81 | export const getDefaultConfig: (global?: Config['global']) => ConfigInternal = () => ({ 82 | migrations: { 83 | excludeModels: [], 84 | includeModels: [], 85 | disabled: false, 86 | outputDirPath: './prisma/migrations', 87 | outputStatusFilePath: './src/realtime/prismaRealtimeStatus.json', 88 | replacer: (str: string) => str, 89 | }, 90 | extension: { 91 | prismaClientImporter: `import { Prisma } from "@prisma/client";`, 92 | disabled: false, 93 | outputFilePath: './src/realtime/prismaExtension.ts', 94 | replacer: (str: string) => str, 95 | }, 96 | global: { 97 | replacer: (str: string) => str, 98 | triggerName: 'prisma_postgres_realtime_trigger', 99 | beforeGenerate: () => { 100 | // noop 101 | }, 102 | afterGenerate: () => { 103 | // noop 104 | }, 105 | }, 106 | }) 107 | 108 | /** Receives the config path from generator options, loads the config from file, fills out the default values, and returns it */ 109 | export const getConfig = async (extendedGeneratorOptions: ExtendedGeneratorOptions): Promise => { 110 | const { generatorConfigPath, schemaPath } = extendedGeneratorOptions 111 | const configPath = getConfigPath({ generatorConfigPath, schemaPath }) 112 | 113 | if (!configPath) return getDefaultConfig() 114 | 115 | const { extension, migrations, global } = await parseConfig(configPath) 116 | const defaultConfig = getDefaultConfig(global) 117 | 118 | return { 119 | migrations: { ...defaultConfig.migrations, ...migrations }, 120 | extension: { ...defaultConfig.extension, ...extension }, 121 | global: { ...defaultConfig.global, ...global }, 122 | } satisfies ConfigInternal 123 | } 124 | 125 | export const includeModel = ({ model, configs }: { model: DMMF.Model; configs: ConfigInternal }): boolean => { 126 | const { includeModels, excludeModels } = configs?.migrations 127 | const modelName = model.name 128 | if (includeModels.length) return includeModels.includes(modelName) 129 | if (excludeModels.length) return !excludeModels.includes(modelName) 130 | return true 131 | } 132 | -------------------------------------------------------------------------------- /src/utils/filesystem.ts: -------------------------------------------------------------------------------- 1 | import { PathLike } from 'node:fs' 2 | import fs from 'node:fs/promises' 3 | import path from 'node:path' 4 | import { env } from '../env' 5 | import { ConfigInternal } from './config' 6 | import { Replacer, ReplacerSection } from './replacer' 7 | 8 | export const debugLog = async (value: string, timestamp = true) => { 9 | if (!env.isTesting) return 10 | await fs.appendFile('log.txt', `${timestamp ? `${new Date().toISOString()}: ` : ''}${JSON.stringify(value)},\n`) 11 | } 12 | 13 | export const deleteFolder = (path: PathLike) => { 14 | return fs.rm(path, { recursive: true, force: true }) 15 | } 16 | 17 | /** Replace content before writing to file using the replacers set in the config file */ 18 | export const writeFile = async ({ 19 | config, 20 | content, 21 | location, 22 | section, 23 | }: { 24 | config: ConfigInternal 25 | section: ReplacerSection 26 | content: string 27 | location: string 28 | }): Promise => { 29 | await debugLog(`Writing to ${location}`) 30 | 31 | const replace = (str: string): string => 32 | [ 33 | config.global.replacer, 34 | ...(section === 'extension' ? [config.extension.replacer as unknown as Replacer] : []), 35 | ...(section?.includes('migration') ? [config.migrations.replacer as unknown as Replacer] : []), 36 | ].reduce((el, replacer) => replacer(el, section), str) 37 | 38 | try { 39 | const dir = path.dirname(location) 40 | await fs.mkdir(dir, { recursive: true }) 41 | await fs.writeFile(location, replace(content), { flag: 'w' }) 42 | } catch (err) { 43 | await debugLog(JSON.stringify(err)) 44 | } 45 | } 46 | 47 | export const readFile = async (location: string): Promise => { 48 | const content = await fs.readFile(location, 'utf8') 49 | return content 50 | } 51 | -------------------------------------------------------------------------------- /src/utils/replacer.ts: -------------------------------------------------------------------------------- 1 | export type ReplacerSection = 'extension' | 'migrations' | 'statusFile' | 'debug.dmmf' 2 | 3 | export type Replacer = ( 4 | generated: string, 5 | section: keyof { [S in ReplacerSection as S extends `${T}${infer _}` ? S : never]: never }, 6 | ) => string 7 | -------------------------------------------------------------------------------- /src/utils/template.ts: -------------------------------------------------------------------------------- 1 | type Variables = T extends `${infer _}#{${infer VarName}}${infer Tail}` 2 | ? VarName | Variables 3 | : never 4 | 5 | export const useTemplate = | null = null>( 6 | template: T, 7 | variables: Omit<{ [V in Variables]: string }, S extends null ? '' : S>, 8 | skip?: S[], 9 | ): string => { 10 | let newTemplate: string = template 11 | Object.entries(variables).forEach(([name, value]) => { 12 | if (!skip?.includes(name as S)) newTemplate = newTemplate.replace(new RegExp(`#{${name}}`, 'g'), value as string) 13 | }) 14 | return newTemplate 15 | } 16 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "allowJs": false, 4 | "allowSyntheticDefaultImports": true, 5 | "esModuleInterop": true, 6 | "experimentalDecorators": false, 7 | "forceConsistentCasingInFileNames": true, 8 | "lib": ["esnext"], 9 | "module": "commonjs", 10 | "moduleResolution": "node", 11 | "noEmitOnError": false, 12 | "noImplicitOverride": true, 13 | "noImplicitReturns": true, 14 | "pretty": true, 15 | "strict": true, 16 | "noUncheckedIndexedAccess": true, 17 | "removeComments": false, 18 | "skipLibCheck": false, 19 | "sourceMap": true, 20 | "outDir": "dist", 21 | "target": "es2019", 22 | "composite": true, 23 | "resolveJsonModule": true, 24 | "declaration": true, 25 | "noFallthroughCasesInSwitch": true, 26 | "baseUrl": ".", 27 | "newLine": "lf" 28 | }, 29 | "include": ["src", "./package.json"], 30 | "exclude": ["node_modules", "dist", "src/**/*.spec.ts", "src/**/*.test.ts", "src/**/tests/**/*.ts"], 31 | } 32 | --------------------------------------------------------------------------------