diff --git a/.gitignore b/.gitignore index 7e3d04e..e2feed4 100644 --- a/.gitignore +++ b/.gitignore @@ -130,4 +130,8 @@ assets/ /frontend/.pnpm-store/ /backend/.pnpm-store/ -.history \ No newline at end of file +.history +/backend/dist/ + +docker-compose-dev.yml +/backend/.env.local diff --git a/.husky/pre-commit b/.husky/pre-commit new file mode 100755 index 0000000..d24fdfc --- /dev/null +++ b/.husky/pre-commit @@ -0,0 +1,4 @@ +#!/usr/bin/env sh +. "$(dirname -- "$0")/_/husky.sh" + +npx lint-staged diff --git a/.lintstagedrc b/.lintstagedrc new file mode 100644 index 0000000..3ed3d7d --- /dev/null +++ b/.lintstagedrc @@ -0,0 +1,7 @@ +{ + "backend/**/*.ts": [ + "backend/node_modules/.bin/eslint --config backend/.eslintrc.json", + "backend/node_modules/.bin/oxlint --config backend/.eslintrc.json" + ], + "frontend/**/*.{ts,tsx}": "frontend/node_modules/.bin/eslint --config frontend/.eslintrc.json", +} diff --git a/.prettierrc.json b/.prettierrc.json index 0c5afce..13d6019 100644 --- a/.prettierrc.json +++ b/.prettierrc.json @@ -5,7 +5,7 @@ "singleQuote": true, "overrides": [ { - "files": ["backend/**/*.js"], + "files": ["backend/**/*.ts"], "options": { "printWidth": 120, "importOrder": ["^[./]"], diff --git a/.tool-versions b/.tool-versions index c2ca3d3..7bd5f0b 100644 --- a/.tool-versions +++ b/.tool-versions @@ -1 +1 @@ -nodejs 20.9.0 +nodejs 20.10.0 diff --git a/backend/.dockerignore b/backend/.dockerignore index 067b246..2c257c4 100644 --- a/backend/.dockerignore +++ b/backend/.dockerignore @@ -70,3 +70,5 @@ node_modules .vercel next-env.d.ts .pnpm-store +dist +built diff --git a/backend/.eslintrc.json b/backend/.eslintrc.json new file mode 100644 index 0000000..ed787a2 --- /dev/null +++ b/backend/.eslintrc.json @@ -0,0 +1,12 @@ +{ + "parser": "@typescript-eslint/parser", + "parserOptions": { + "ecmaVersion": 2022, + "sourceType": "module" + }, + "plugins": ["import", "oxlint"], + "rules": { + "import/extensions": ["error", "always"] + }, + "ignorePatterns": ["dist/", "node_modules/"] +} diff --git a/backend/Dockerfile b/backend/Dockerfile index 0bc2c74..b6d9cd9 100644 --- a/backend/Dockerfile +++ b/backend/Dockerfile @@ -8,22 +8,20 @@ RUN apk add --no-cache libc6-compat FROM base AS build WORKDIR /app - ENV PYTHONUNBUFFERED=1 RUN apk add --update --no-cache g++ make python3 py3-pip && ln -sf python3 /usr/bin/python # pnpm fetch does require only lockfile COPY pnpm-lock.yaml ./ -RUN --mount=type=cache,id=pnpm,target=/pnpm/store pnpm fetch --prod +RUN --mount=type=cache,id=pnpm,target=/pnpm/store pnpm fetch COPY . ./ +RUN --mount=type=cache,id=pnpm,target=/pnpm/store pnpm install -r --offline +RUN pnpm run build RUN --mount=type=cache,id=pnpm,target=/pnpm/store pnpm install -r --offline --prod + FROM base WORKDIR /app - COPY --from=build /app /app - RUN npm install pm2 -g - EXPOSE 8080 - CMD ["./start.sh"] diff --git a/backend/Dockerfile.local b/backend/Dockerfile.local index 65da84f..f54b01e 100644 --- a/backend/Dockerfile.local +++ b/backend/Dockerfile.local @@ -15,4 +15,4 @@ CMD "pnpm install --frozen-lockfile -f" EXPOSE 8080 -CMD sh -c "pnpm migrate:up && pnpm dev" +CMD sh -c "pnpm tsx src/umzug-runner.ts up && pnpm dev" diff --git a/backend/codegen.ts b/backend/codegen.ts new file mode 100644 index 0000000..be3f44e --- /dev/null +++ b/backend/codegen.ts @@ -0,0 +1,36 @@ +import type { CodegenConfig } from '@graphql-codegen/cli'; + +const config: CodegenConfig = { + overwrite: true, + schema: 'http://localhost:8080/graphql', + generates: { + 'src/__generated__/resolvers-types.ts': { + plugins: ['typescript', 'typescript-resolvers'], + config: { + allowParentTypeOverride: true, + defaultMapper: 'Partial<{T}>', + }, + }, + }, + hooks: { + afterOneFileWrite: [ + 'sed -i \'\' -e \'1s|import { GraphQLResolveInfo, GraphQLScalarType, GraphQLScalarTypeConfig } from "graphql";|import { type GraphQLResolveInfo, GraphQLScalarType, type GraphQLScalarTypeConfig } from "graphql";|\' src/__generated__/resolvers-types.ts', + ], + }, + config: { + useIndexSignature: true, + contextType: '../server/apollo.js#ApolloContext', + mappers: { + // Project: '../db/models/types.js#Project as ProjectModel', + // ProjectTag: '../db/models/types.js#ProjectTag as ProjectTagModel', + // CustomField: '../db/models/types.js#ProjectCustomField as ProjectCustomFieldModel', + // User: '../db/models/types.js#User as UserModel', + // Issue: '../db/models/types.js#Issue as IssueModel', + // IssueComment: '../db/models/types.js#IssueComment as IssueCommentModel', + // Board: '../db/models/types.js#Board as BoardModel', + // IssueStatus: '../db/models/types.js#IssueStatus as IssueStatusModel', + }, + }, +}; + +export default config; diff --git a/backend/package.json b/backend/package.json index da314a4..3b0b8ad 100644 --- a/backend/package.json +++ b/backend/package.json @@ -2,41 +2,47 @@ "name": "backend", "version": "0.1.0", "private": true, - "module": "src/index.js", "type": "module", "engines": { "node": ">=20.6.0", "pnpm": ">=8.7.0" }, "scripts": { - "dev": "node --env-file .env --watch src/index.js", - "start": "node src/index.js", + "dev": "tsx watch src/index.ts", + "lint": "pnpm oxlint && pnpm eslint && tsc --noEmit", + "start": "node dist", "format": "prettier --check --ignore-path ../.gitignore .", "format:fix": "prettier --write --ignore-path ../.gitignore .", - "migrate:up": "node src/umzug-runner.js up" + "build": "esbuild `find src \\( -name '*.ts' \\)` --platform=node --outdir=dist", + "check:types": "tsc --noEmit", + "pretest": "pnpm run build", + "codegen": "graphql-codegen --config codegen.ts" }, "dependencies": { "@apollo/server": "^4.9.5", "@as-integrations/fastify": "^2.1.1", "@fastify/cors": "^8.4.1", - "@fastify/websocket": "^8.3.0", + "@fastify/websocket": "^8.3.1", "@graphql-tools/merge": "^9.0.1", "@hocuspocus/extension-database": "^2.8.1", "@hocuspocus/server": "^2.8.1", "axios": "^1.6.0", - "fastify": "^4.24.3", + "dataloader-sequelize": "^2.3.3", + "fastify": "^4.25.2", "fastify-graceful-shutdown": "^3.5.1", "graphql": "^16.8.1", + "graphql-scalars": "^1.22.4", "graphql-tag": "^2.12.6", "graphql-upload": "^16.0.2", "lodash-es": "^4.17.21", "minio": "^7.1.3", "nanoid": "^5.0.4", + "node-cache": "^5.1.2", "pg": "^8.11.3", "pg-hstore": "^2.3.4", "sequelize": "^6.34.0", - "sharp": "^0.32.6", "sinon-chai": "^3.7.0", + "tsconfig-paths": "^4.2.0", "umzug": "^3.4.0", "uuid": "^9.0.1", "y-protocols": "^1.0.6", @@ -44,15 +50,35 @@ "yn": "^5.0.0" }, "devDependencies": { + "@graphql-codegen/cli": "5.0.0", + "@graphql-codegen/typescript": "4.0.1", + "@graphql-codegen/typescript-resolvers": "4.0.1", + "@swc/cli": "^0.1.63", + "@swc/core": "^1.3.102", + "@swc/helpers": "^0.5.3", "@trivago/prettier-plugin-sort-imports": "^4.3.0", + "@types/lodash-es": "^4.17.12", "@types/node": "^20.10.6", + "@types/uuid": "^9.0.7", + "@types/ws": "^8.5.10", + "@typescript-eslint/parser": "^6.18.0", "chai": "^4.3.10", + "esbuild": "^0.19.11", + "eslint": "^8.56.0", + "eslint-plugin-import": "^2.29.1", + "eslint-plugin-oxlint": "^0.1.0", + "husky": "^8.0.3", + "lint-staged": "^15.2.0", "mocha": "^10.2.0", - "prettier": "^3.0.3", + "oxlint": "^0.1.2", + "prettier": "^3.1.1", "proxyquire": "^2.1.3", "sequelize-cli": "^6.6.2", "sequelize-test-helpers": "^1.4.3", "sinon": "^17.0.1", + "ts-node": "^10.9.2", + "tslib": "^2.6.2", + "tsx": "^4.7.0", "typescript": "^5.3.3" }, "optionalDependencies": { diff --git a/backend/pm2.config.json b/backend/pm2.config.json index 3d5ef44..c80aff0 100644 --- a/backend/pm2.config.json +++ b/backend/pm2.config.json @@ -2,7 +2,7 @@ "apps": [ { "name": "api", - "script": "src/index.js", + "script": "dist/index.js", "instances": "max", "exec_mode": "cluster", "interpreter": "/bin/sh", diff --git a/backend/pnpm-lock.yaml b/backend/pnpm-lock.yaml index 4012c3a..4c75ce9 100644 --- a/backend/pnpm-lock.yaml +++ b/backend/pnpm-lock.yaml @@ -10,13 +10,13 @@ dependencies: version: 4.9.5(graphql@16.8.1) '@as-integrations/fastify': specifier: ^2.1.1 - version: 2.1.1(@apollo/server@4.9.5)(fastify@4.24.3) + version: 2.1.1(@apollo/server@4.9.5)(fastify@4.25.2) '@fastify/cors': specifier: ^8.4.1 version: 8.4.1 '@fastify/websocket': - specifier: ^8.3.0 - version: 8.3.0(bufferutil@4.0.8)(utf-8-validate@6.0.3) + specifier: ^8.3.1 + version: 8.3.1(bufferutil@4.0.8)(utf-8-validate@6.0.3) '@graphql-tools/merge': specifier: ^9.0.1 version: 9.0.1(graphql@16.8.1) @@ -29,15 +29,21 @@ dependencies: axios: specifier: ^1.6.0 version: 1.6.0 + dataloader-sequelize: + specifier: ^2.3.3 + version: 2.3.3(sequelize@6.34.0) fastify: - specifier: ^4.24.3 - version: 4.24.3 + specifier: ^4.25.2 + version: 4.25.2 fastify-graceful-shutdown: specifier: ^3.5.1 version: 3.5.1 graphql: specifier: ^16.8.1 version: 16.8.1 + graphql-scalars: + specifier: ^1.22.4 + version: 1.22.4(graphql@16.8.1) graphql-tag: specifier: ^2.12.6 version: 2.12.6(graphql@16.8.1) @@ -53,6 +59,9 @@ dependencies: nanoid: specifier: ^5.0.4 version: 5.0.4 + node-cache: + specifier: ^5.1.2 + version: 5.1.2 pg: specifier: ^8.11.3 version: 8.11.3 @@ -62,12 +71,12 @@ dependencies: sequelize: specifier: ^6.34.0 version: 6.34.0(pg-hstore@2.3.4)(pg@8.11.3) - sharp: - specifier: ^0.32.6 - version: 0.32.6 sinon-chai: specifier: ^3.7.0 version: 3.7.0(chai@4.3.10)(sinon@17.0.1) + tsconfig-paths: + specifier: ^4.2.0 + version: 4.2.0 umzug: specifier: ^3.4.0 version: 3.4.0 @@ -93,21 +102,72 @@ optionalDependencies: version: 6.0.3 devDependencies: + '@graphql-codegen/cli': + specifier: 5.0.0 + version: 5.0.0(@types/node@20.10.6)(bufferutil@4.0.8)(graphql@16.8.1)(typescript@5.3.3)(utf-8-validate@6.0.3) + '@graphql-codegen/typescript': + specifier: 4.0.1 + version: 4.0.1(graphql@16.8.1) + '@graphql-codegen/typescript-resolvers': + specifier: 4.0.1 + version: 4.0.1(graphql@16.8.1) + '@swc/cli': + specifier: ^0.1.63 + version: 0.1.63(@swc/core@1.3.102) + '@swc/core': + specifier: ^1.3.102 + version: 1.3.102(@swc/helpers@0.5.3) + '@swc/helpers': + specifier: ^0.5.3 + version: 0.5.3 '@trivago/prettier-plugin-sort-imports': specifier: ^4.3.0 - version: 4.3.0(prettier@3.0.3) + version: 4.3.0(prettier@3.1.1) + '@types/lodash-es': + specifier: ^4.17.12 + version: 4.17.12 '@types/node': specifier: ^20.10.6 version: 20.10.6 + '@types/uuid': + specifier: ^9.0.7 + version: 9.0.7 + '@types/ws': + specifier: ^8.5.10 + version: 8.5.10 + '@typescript-eslint/parser': + specifier: ^6.18.0 + version: 6.18.0(eslint@8.56.0)(typescript@5.3.3) chai: specifier: ^4.3.10 version: 4.3.10 + esbuild: + specifier: ^0.19.11 + version: 0.19.11 + eslint: + specifier: ^8.56.0 + version: 8.56.0 + eslint-plugin-import: + specifier: ^2.29.1 + version: 2.29.1(@typescript-eslint/parser@6.18.0)(eslint@8.56.0) + eslint-plugin-oxlint: + specifier: ^0.1.0 + version: 0.1.0 + husky: + specifier: ^8.0.3 + version: 8.0.3 + lint-staged: + specifier: ^15.2.0 + version: 15.2.0 mocha: specifier: ^10.2.0 version: 10.2.0 + oxlint: + specifier: ^0.1.2 + version: 0.1.2 prettier: - specifier: ^3.0.3 - version: 3.0.3 + specifier: ^3.1.1 + version: 3.1.1 proxyquire: specifier: ^2.1.3 version: 2.1.3 @@ -120,12 +180,34 @@ devDependencies: sinon: specifier: ^17.0.1 version: 17.0.1 + ts-node: + specifier: ^10.9.2 + version: 10.9.2(@swc/core@1.3.102)(@types/node@20.10.6)(typescript@5.3.3) + tslib: + specifier: ^2.6.2 + version: 2.6.2 + tsx: + specifier: ^4.7.0 + version: 4.7.0 typescript: specifier: ^5.3.3 version: 5.3.3 packages: + /@aashutoshrathi/word-wrap@1.2.6: + resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==} + engines: {node: '>=0.10.0'} + dev: true + + /@ampproject/remapping@2.2.1: + resolution: {integrity: sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==} + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/gen-mapping': 0.3.3 + '@jridgewell/trace-mapping': 0.3.20 + dev: true + /@apollo/cache-control-types@1.0.3(graphql@16.8.1): resolution: {integrity: sha512-F17/vCp7QVwom9eG7ToauIKdAxpSoadsJnqIfyryLFSkLSOEqu+eC5Z3N8OXcUVStuOMcNHlyraRsA6rRICu4g==} peerDependencies: @@ -306,7 +388,45 @@ packages: engines: {node: '>=14'} dev: false - /@as-integrations/fastify@2.1.1(@apollo/server@4.9.5)(fastify@4.24.3): + /@ardatan/relay-compiler@12.0.0(graphql@16.8.1): + resolution: {integrity: sha512-9anThAaj1dQr6IGmzBMcfzOQKTa5artjuPmw8NYK/fiGEMjADbSguBY2FMDykt+QhilR3wc9VA/3yVju7JHg7Q==} + hasBin: true + peerDependencies: + graphql: '*' + dependencies: + '@babel/core': 7.23.7 + '@babel/generator': 7.23.6 + '@babel/parser': 7.23.6 + '@babel/runtime': 7.23.7 + '@babel/traverse': 7.23.7 + '@babel/types': 7.23.6 + babel-preset-fbjs: 3.4.0(@babel/core@7.23.7) + chalk: 4.1.2 + fb-watchman: 2.0.2 + fbjs: 3.0.5 + glob: 7.2.0 + graphql: 16.8.1 + immutable: 3.7.6 + invariant: 2.2.4 + nullthrows: 1.1.1 + relay-runtime: 12.0.0 + signedsource: 1.0.0 + yargs: 15.4.1 + transitivePeerDependencies: + - encoding + - supports-color + dev: true + + /@ardatan/sync-fetch@0.0.1: + resolution: {integrity: sha512-xhlTqH0m31mnsG0tIP4ETgfSB6gXDaYYsUWTrlUV93fFQPI9dd8hE0Ot6MHLCtqgB32hwJAC3YZMWlXZw7AleA==} + engines: {node: '>=14'} + dependencies: + node-fetch: 2.7.0 + transitivePeerDependencies: + - encoding + dev: true + + /@as-integrations/fastify@2.1.1(@apollo/server@4.9.5)(fastify@4.25.2): resolution: {integrity: sha512-iupYSQyRrlBAdsDcCYzuKjJlJAKiQpRDLd33A6yAF3Ip/rGrSDDDrxfJWp6FqyVlivSL+MQkGIphmUI/ckfZkg==} engines: {node: '>=16'} peerDependencies: @@ -314,7 +434,7 @@ packages: fastify: ^4.4.0 dependencies: '@apollo/server': 4.9.5(graphql@16.8.1) - fastify: 4.24.3 + fastify: 4.25.2 fastify-plugin: 4.5.1 dev: false @@ -326,6 +446,34 @@ packages: chalk: 2.4.2 dev: true + /@babel/compat-data@7.23.5: + resolution: {integrity: sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/core@7.23.7: + resolution: {integrity: sha512-+UpDgowcmqe36d4NwqvKsyPMlOLNGMsfMmQ5WGCu+siCe3t3dfe9njrzGfdN4qq+bcNUt0+Vw6haRxBOycs4dw==} + engines: {node: '>=6.9.0'} + dependencies: + '@ampproject/remapping': 2.2.1 + '@babel/code-frame': 7.23.5 + '@babel/generator': 7.23.6 + '@babel/helper-compilation-targets': 7.23.6 + '@babel/helper-module-transforms': 7.23.3(@babel/core@7.23.7) + '@babel/helpers': 7.23.7 + '@babel/parser': 7.23.6 + '@babel/template': 7.22.15 + '@babel/traverse': 7.23.7 + '@babel/types': 7.23.6 + convert-source-map: 2.0.0 + debug: 4.3.4(supports-color@8.1.1) + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + dev: true + /@babel/generator@7.17.7: resolution: {integrity: sha512-oLcVCTeIFadUoArDTwpluncplrYBmTCCZZgXCbgNGvOBBiSDDK3eWO4b/+eOTli5tKv1lg+a5/NAXg+nTcei1w==} engines: {node: '>=6.9.0'} @@ -345,6 +493,42 @@ packages: jsesc: 2.5.2 dev: true + /@babel/helper-annotate-as-pure@7.22.5: + resolution: {integrity: sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.6 + dev: true + + /@babel/helper-compilation-targets@7.23.6: + resolution: {integrity: sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/compat-data': 7.23.5 + '@babel/helper-validator-option': 7.23.5 + browserslist: 4.22.2 + lru-cache: 5.1.1 + semver: 6.3.1 + dev: true + + /@babel/helper-create-class-features-plugin@7.23.7(@babel/core@7.23.7): + resolution: {integrity: sha512-xCoqR/8+BoNnXOY7RVSgv6X+o7pmT5q1d+gGcRlXYkI+9B31glE4jeejhKVpA04O1AtzOt7OSQ6VYKP5FcRl9g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-function-name': 7.23.0 + '@babel/helper-member-expression-to-functions': 7.23.0 + '@babel/helper-optimise-call-expression': 7.22.5 + '@babel/helper-replace-supers': 7.22.20(@babel/core@7.23.7) + '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + semver: 6.3.1 + dev: true + /@babel/helper-environment-visitor@7.22.20: resolution: {integrity: sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==} engines: {node: '>=6.9.0'} @@ -365,6 +549,72 @@ packages: '@babel/types': 7.23.6 dev: true + /@babel/helper-member-expression-to-functions@7.23.0: + resolution: {integrity: sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.6 + dev: true + + /@babel/helper-module-imports@7.22.15: + resolution: {integrity: sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.6 + dev: true + + /@babel/helper-module-transforms@7.23.3(@babel/core@7.23.7): + resolution: {integrity: sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-module-imports': 7.22.15 + '@babel/helper-simple-access': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + '@babel/helper-validator-identifier': 7.22.20 + dev: true + + /@babel/helper-optimise-call-expression@7.22.5: + resolution: {integrity: sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.6 + dev: true + + /@babel/helper-plugin-utils@7.22.5: + resolution: {integrity: sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/helper-replace-supers@7.22.20(@babel/core@7.23.7): + resolution: {integrity: sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-member-expression-to-functions': 7.23.0 + '@babel/helper-optimise-call-expression': 7.22.5 + dev: true + + /@babel/helper-simple-access@7.22.5: + resolution: {integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.6 + dev: true + + /@babel/helper-skip-transparent-expression-wrappers@7.22.5: + resolution: {integrity: sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.6 + dev: true + /@babel/helper-split-export-declaration@7.22.6: resolution: {integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==} engines: {node: '>=6.9.0'} @@ -382,6 +632,22 @@ packages: engines: {node: '>=6.9.0'} dev: true + /@babel/helper-validator-option@7.23.5: + resolution: {integrity: sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/helpers@7.23.7: + resolution: {integrity: sha512-6AMnjCoC8wjqBzDHkuqpa7jAKwvMo4dC+lr/TFBz+ucfulO1XMpDnwWPGBNwClOKZ8h6xn5N81W/R5OrcKtCbQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/template': 7.22.15 + '@babel/traverse': 7.23.7 + '@babel/types': 7.23.6 + transitivePeerDependencies: + - supports-color + dev: true + /@babel/highlight@7.23.4: resolution: {integrity: sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==} engines: {node: '>=6.9.0'} @@ -399,157 +665,1218 @@ packages: '@babel/types': 7.17.0 dev: true - /@babel/template@7.22.15: - resolution: {integrity: sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==} + /@babel/plugin-proposal-class-properties@7.18.6(@babel/core@7.23.7): + resolution: {integrity: sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==} engines: {node: '>=6.9.0'} + deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-class-properties instead. + peerDependencies: + '@babel/core': ^7.0.0-0 dependencies: - '@babel/code-frame': 7.23.5 - '@babel/parser': 7.23.6 - '@babel/types': 7.23.6 + '@babel/core': 7.23.7 + '@babel/helper-create-class-features-plugin': 7.23.7(@babel/core@7.23.7) + '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/traverse@7.23.2: - resolution: {integrity: sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==} + /@babel/plugin-proposal-object-rest-spread@7.20.7(@babel/core@7.23.7): + resolution: {integrity: sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg==} engines: {node: '>=6.9.0'} + deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-object-rest-spread instead. + peerDependencies: + '@babel/core': ^7.0.0-0 dependencies: - '@babel/code-frame': 7.23.5 - '@babel/generator': 7.23.6 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-function-name': 7.23.0 - '@babel/helper-hoist-variables': 7.22.5 - '@babel/helper-split-export-declaration': 7.22.6 - '@babel/parser': 7.23.6 - '@babel/types': 7.23.6 - debug: 4.3.4(supports-color@8.1.1) - globals: 11.12.0 - transitivePeerDependencies: - - supports-color + '@babel/compat-data': 7.23.5 + '@babel/core': 7.23.7 + '@babel/helper-compilation-targets': 7.23.6 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.23.7) + '@babel/plugin-transform-parameters': 7.23.3(@babel/core@7.23.7) dev: true - /@babel/types@7.17.0: - resolution: {integrity: sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==} - engines: {node: '>=6.9.0'} + /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.23.7): + resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} + peerDependencies: + '@babel/core': ^7.0.0-0 dependencies: - '@babel/helper-validator-identifier': 7.22.20 - to-fast-properties: 2.0.0 + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/types@7.23.6: - resolution: {integrity: sha512-+uarb83brBzPKN38NX1MkB6vb6+mwvR6amUulqAE7ccQw1pEl+bCia9TbdG1lsnFP7lZySvUn37CHyXQdfTwzg==} + /@babel/plugin-syntax-flow@7.23.3(@babel/core@7.23.7): + resolution: {integrity: sha512-YZiAIpkJAwQXBJLIQbRFayR5c+gJ35Vcz3bg954k7cd73zqjvhacJuL9RbrzPz8qPmZdgqP6EUKwy0PCNhaaPA==} engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 dependencies: - '@babel/helper-string-parser': 7.23.4 - '@babel/helper-validator-identifier': 7.22.20 - to-fast-properties: 2.0.0 + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 dev: true - /@fastify/ajv-compiler@3.5.0: - resolution: {integrity: sha512-ebbEtlI7dxXF5ziNdr05mOY8NnDiPB1XvAlLHctRt/Rc+C3LCOVW5imUVX+mhvUhnNzmPBHewUkOFgGlCxgdAA==} + /@babel/plugin-syntax-import-assertions@7.23.3(@babel/core@7.23.7): + resolution: {integrity: sha512-lPgDSU+SJLK3xmFDTV2ZRQAiM7UuUjGidwBywFavObCiZc1BeAAcMtHJKUya92hPHO+at63JJPLygilZard8jw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 dependencies: - ajv: 8.12.0 - ajv-formats: 2.1.1(ajv@8.12.0) - fast-uri: 2.3.0 - dev: false + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 + dev: true - /@fastify/cors@8.4.1: - resolution: {integrity: sha512-iYQJtrY3pFiDS5mo5zRaudzg2OcUdJ96PD6xfkKOOEilly5nnrFZx/W6Sce2T79xxlEn2qpU3t5+qS2phS369w==} + /@babel/plugin-syntax-jsx@7.23.3(@babel/core@7.23.7): + resolution: {integrity: sha512-EB2MELswq55OHUoRZLGg/zC7QWUKfNLpE57m/S2yr1uEneIgsTgrSzXP3NXEsMkVn76OlaVVnzN+ugObuYGwhg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 dependencies: - fastify-plugin: 4.5.1 - mnemonist: 0.39.5 - dev: false - - /@fastify/deepmerge@1.3.0: - resolution: {integrity: sha512-J8TOSBq3SoZbDhM9+R/u77hP93gz/rajSA+K2kGyijPpORPWUXHUpTaleoj+92As0S9uPRP7Oi8IqMf0u+ro6A==} - dev: false - - /@fastify/error@3.4.1: - resolution: {integrity: sha512-wWSvph+29GR783IhmvdwWnN4bUxTD01Vm5Xad4i7i1VuAOItLvbPAb69sb0IQ2N57yprvhNIwAP5B6xfKTmjmQ==} - dev: false + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 + dev: true - /@fastify/fast-json-stringify-compiler@4.3.0: - resolution: {integrity: sha512-aZAXGYo6m22Fk1zZzEUKBvut/CIIQe/BapEORnxiD5Qr0kPHqqI69NtEMCme74h+at72sPhbkb4ZrLd1W3KRLA==} + /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.23.7): + resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} + peerDependencies: + '@babel/core': ^7.0.0-0 dependencies: - fast-json-stringify: 5.9.1 - dev: false + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 + dev: true - /@fastify/websocket@8.3.0(bufferutil@4.0.8)(utf-8-validate@6.0.3): - resolution: {integrity: sha512-i9lVHk6nKKQUMETdX5IDVrSxODJxy2mYU7CJ9BLWVtUZVuvB2a69CTuFyoapNWzLDuv0Z0DpAa2QyaTGPCIHZA==} + /@babel/plugin-transform-arrow-functions@7.23.3(@babel/core@7.23.7): + resolution: {integrity: sha512-NzQcQrzaQPkaEwoTm4Mhyl8jI1huEL/WWIEvudjTCMJ9aBZNpsJbMASx7EQECtQQPS/DcnFpo0FIh3LvEO9cxQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 dependencies: - fastify-plugin: 4.5.1 - ws: 8.11.0(bufferutil@4.0.8)(utf-8-validate@6.0.3) - transitivePeerDependencies: - - bufferutil - - utf-8-validate - dev: false + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 + dev: true - /@graphql-tools/merge@8.4.2(graphql@16.8.1): - resolution: {integrity: sha512-XbrHAaj8yDuINph+sAfuq3QCZ/tKblrTLOpirK0+CAgNlZUCHs0Fa+xtMUURgwCVThLle1AF7svJCxFizygLsw==} + /@babel/plugin-transform-block-scoped-functions@7.23.3(@babel/core@7.23.7): + resolution: {integrity: sha512-vI+0sIaPIO6CNuM9Kk5VmXcMVRiOpDh7w2zZt9GXzmE/9KD70CUEVhvPR/etAeNK/FAEkhxQtXOzVF3EuRL41A==} + engines: {node: '>=6.9.0'} peerDependencies: - graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + '@babel/core': ^7.0.0-0 dependencies: - '@graphql-tools/utils': 9.2.1(graphql@16.8.1) - graphql: 16.8.1 - tslib: 2.6.2 - dev: false + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 + dev: true - /@graphql-tools/merge@9.0.1(graphql@16.8.1): - resolution: {integrity: sha512-hIEExWO9fjA6vzsVjJ3s0cCQ+Q/BEeMVJZtMXd7nbaVefVy0YDyYlEkeoYYNV3NVVvu1G9lr6DM1Qd0DGo9Caw==} - engines: {node: '>=16.0.0'} + /@babel/plugin-transform-block-scoping@7.23.4(@babel/core@7.23.7): + resolution: {integrity: sha512-0QqbP6B6HOh7/8iNR4CQU2Th/bbRtBp4KS9vcaZd1fZ0wSh5Fyssg0UCIHwxh+ka+pNDREbVLQnHCMHKZfPwfw==} + engines: {node: '>=6.9.0'} peerDependencies: - graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + '@babel/core': ^7.0.0-0 dependencies: - '@graphql-tools/utils': 10.0.12(graphql@16.8.1) - graphql: 16.8.1 - tslib: 2.6.2 - dev: false + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 + dev: true - /@graphql-tools/schema@9.0.19(graphql@16.8.1): - resolution: {integrity: sha512-oBRPoNBtCkk0zbUsyP4GaIzCt8C0aCI4ycIRUL67KK5pOHljKLBBtGT+Jr6hkzA74C8Gco8bpZPe7aWFjiaK2w==} + /@babel/plugin-transform-classes@7.23.5(@babel/core@7.23.7): + resolution: {integrity: sha512-jvOTR4nicqYC9yzOHIhXG5emiFEOpappSJAl73SDSEDcybD+Puuze8Tnpb9p9qEyYup24tq891gkaygIFvWDqg==} + engines: {node: '>=6.9.0'} peerDependencies: - graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + '@babel/core': ^7.0.0-0 dependencies: - '@graphql-tools/merge': 8.4.2(graphql@16.8.1) - '@graphql-tools/utils': 9.2.1(graphql@16.8.1) - graphql: 16.8.1 - tslib: 2.6.2 - value-or-promise: 1.0.12 - dev: false + '@babel/core': 7.23.7 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-compilation-targets': 7.23.6 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-function-name': 7.23.0 + '@babel/helper-optimise-call-expression': 7.22.5 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-replace-supers': 7.22.20(@babel/core@7.23.7) + '@babel/helper-split-export-declaration': 7.22.6 + globals: 11.12.0 + dev: true - /@graphql-tools/utils@10.0.12(graphql@16.8.1): - resolution: {integrity: sha512-+yS1qlFwXlwU3Gv8ek/h2aJ95quog4yF22haC11M0zReMSTddbGJZ5yXKkE3sXoY2BcL1utilSFjylJ9uXpSNQ==} - engines: {node: '>=16.0.0'} + /@babel/plugin-transform-computed-properties@7.23.3(@babel/core@7.23.7): + resolution: {integrity: sha512-dTj83UVTLw/+nbiHqQSFdwO9CbTtwq1DsDqm3CUEtDrZNET5rT5E6bIdTlOftDTDLMYxvxHNEYO4B9SLl8SLZw==} + engines: {node: '>=6.9.0'} peerDependencies: - graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + '@babel/core': ^7.0.0-0 dependencies: - '@graphql-typed-document-node/core': 3.2.0(graphql@16.8.1) - cross-inspect: 1.0.0 - dset: 3.1.3 - graphql: 16.8.1 - tslib: 2.6.2 - dev: false + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/template': 7.22.15 + dev: true - /@graphql-tools/utils@9.2.1(graphql@16.8.1): - resolution: {integrity: sha512-WUw506Ql6xzmOORlriNrD6Ugx+HjVgYxt9KCXD9mHAak+eaXSwuGGPyE60hy9xaDEoXKBsG7SkG69ybitaVl6A==} + /@babel/plugin-transform-destructuring@7.23.3(@babel/core@7.23.7): + resolution: {integrity: sha512-n225npDqjDIr967cMScVKHXJs7rout1q+tt50inyBCPkyZ8KxeI6d+GIbSBTT/w/9WdlWDOej3V9HE5Lgk57gw==} + engines: {node: '>=6.9.0'} peerDependencies: - graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + '@babel/core': ^7.0.0-0 dependencies: - '@graphql-typed-document-node/core': 3.2.0(graphql@16.8.1) - graphql: 16.8.1 - tslib: 2.6.2 - dev: false + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 + dev: true - /@graphql-typed-document-node/core@3.2.0(graphql@16.8.1): - resolution: {integrity: sha512-mB9oAsNCm9aM3/SOv4YtBMqZbYj10R7dkq8byBqxGY/ncFwhf2oQzMV+LCRlWoDSEBJ3COiR1yeDvMtsoOsuFQ==} + /@babel/plugin-transform-flow-strip-types@7.23.3(@babel/core@7.23.7): + resolution: {integrity: sha512-26/pQTf9nQSNVJCrLB1IkHUKyPxR+lMrH2QDPG89+Znu9rAMbtrybdbWeE9bb7gzjmE5iXHEY+e0HUwM6Co93Q==} + engines: {node: '>=6.9.0'} peerDependencies: - graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + '@babel/core': ^7.0.0-0 dependencies: - graphql: 16.8.1 - dev: false + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-flow': 7.23.3(@babel/core@7.23.7) + dev: true - /@hocuspocus/common@2.8.1: - resolution: {integrity: sha512-pNXBvmiNmF13X/t/VTNfYMyEnWkLJ9e1gTyc7vFozBTfN9EgX7rexT4INradC288wkQ5Ha1gZb908Q4XBucm9g==} + /@babel/plugin-transform-for-of@7.23.6(@babel/core@7.23.7): + resolution: {integrity: sha512-aYH4ytZ0qSuBbpfhuofbg/e96oQ7U2w1Aw/UQmKT+1l39uEhUPoFS3fHevDc1G0OvewyDudfMKY1OulczHzWIw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 dependencies: - lib0: 0.2.88 + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 + dev: true + + /@babel/plugin-transform-function-name@7.23.3(@babel/core@7.23.7): + resolution: {integrity: sha512-I1QXp1LxIvt8yLaib49dRW5Okt7Q4oaxao6tFVKS/anCdEOMtYwWVKoiOA1p34GOWIZjUK0E+zCp7+l1pfQyiw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-compilation-targets': 7.23.6 + '@babel/helper-function-name': 7.23.0 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-literals@7.23.3(@babel/core@7.23.7): + resolution: {integrity: sha512-wZ0PIXRxnwZvl9AYpqNUxpZ5BiTGrYt7kueGQ+N5FiQ7RCOD4cm8iShd6S6ggfVIWaJf2EMk8eRzAh52RfP4rQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-member-expression-literals@7.23.3(@babel/core@7.23.7): + resolution: {integrity: sha512-sC3LdDBDi5x96LA+Ytekz2ZPk8i/Ck+DEuDbRAll5rknJ5XRTSaPKEYwomLcs1AA8wg9b3KjIQRsnApj+q51Ag==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-modules-commonjs@7.23.3(@babel/core@7.23.7): + resolution: {integrity: sha512-aVS0F65LKsdNOtcz6FRCpE4OgsP2OFnW46qNxNIX9h3wuzaNcSQsJysuMwqSibC98HPrf2vCgtxKNwS0DAlgcA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-module-transforms': 7.23.3(@babel/core@7.23.7) + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-simple-access': 7.22.5 + dev: true + + /@babel/plugin-transform-object-super@7.23.3(@babel/core@7.23.7): + resolution: {integrity: sha512-BwQ8q0x2JG+3lxCVFohg+KbQM7plfpBwThdW9A6TMtWwLsbDA01Ek2Zb/AgDN39BiZsExm4qrXxjk+P1/fzGrA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-replace-supers': 7.22.20(@babel/core@7.23.7) + dev: true + + /@babel/plugin-transform-parameters@7.23.3(@babel/core@7.23.7): + resolution: {integrity: sha512-09lMt6UsUb3/34BbECKVbVwrT9bO6lILWln237z7sLaWnMsTi7Yc9fhX5DLpkJzAGfaReXI22wP41SZmnAA3Vw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-property-literals@7.23.3(@babel/core@7.23.7): + resolution: {integrity: sha512-jR3Jn3y7cZp4oEWPFAlRsSWjxKe4PZILGBSd4nis1TsC5qeSpb+nrtihJuDhNI7QHiVbUaiXa0X2RZY3/TI6Nw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-react-display-name@7.23.3(@babel/core@7.23.7): + resolution: {integrity: sha512-GnvhtVfA2OAtzdX58FJxU19rhoGeQzyVndw3GgtdECQvQFXPEZIOVULHVZGAYmOgmqjXpVpfocAbSjh99V/Fqw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-react-jsx@7.23.4(@babel/core@7.23.7): + resolution: {integrity: sha512-5xOpoPguCZCRbo/JeHlloSkTA8Bld1J/E1/kLfD1nsuiW1m8tduTA1ERCgIZokDflX/IBzKcqR3l7VlRgiIfHA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-module-imports': 7.22.15 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-jsx': 7.23.3(@babel/core@7.23.7) + '@babel/types': 7.23.6 + dev: true + + /@babel/plugin-transform-shorthand-properties@7.23.3(@babel/core@7.23.7): + resolution: {integrity: sha512-ED2fgqZLmexWiN+YNFX26fx4gh5qHDhn1O2gvEhreLW2iI63Sqm4llRLCXALKrCnbN4Jy0VcMQZl/SAzqug/jg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-spread@7.23.3(@babel/core@7.23.7): + resolution: {integrity: sha512-VvfVYlrlBVu+77xVTOAoxQ6mZbnIq5FM0aGBSFEcIh03qHf+zNqA4DC/3XMUozTg7bZV3e3mZQ0i13VB6v5yUg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 + dev: true + + /@babel/plugin-transform-template-literals@7.23.3(@babel/core@7.23.7): + resolution: {integrity: sha512-Flok06AYNp7GV2oJPZZcP9vZdszev6vPBkHLwxwSpaIqx75wn6mUd3UFWsSsA0l8nXAKkyCmL/sR02m8RYGeHg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/runtime@7.23.7: + resolution: {integrity: sha512-w06OXVOFso7LcbzMiDGt+3X7Rh7Ho8MmgPoWU3rarH+8upf+wSU/grlGbWzQyr3DkdN6ZeuMFjpdwW0Q+HxobA==} + engines: {node: '>=6.9.0'} + dependencies: + regenerator-runtime: 0.14.1 + dev: true + + /@babel/template@7.22.15: + resolution: {integrity: sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.23.5 + '@babel/parser': 7.23.6 + '@babel/types': 7.23.6 + dev: true + + /@babel/traverse@7.23.2: + resolution: {integrity: sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.23.5 + '@babel/generator': 7.23.6 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-function-name': 7.23.0 + '@babel/helper-hoist-variables': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + '@babel/parser': 7.23.6 + '@babel/types': 7.23.6 + debug: 4.3.4(supports-color@8.1.1) + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/traverse@7.23.7: + resolution: {integrity: sha512-tY3mM8rH9jM0YHFGyfC0/xf+SB5eKUu7HPj7/k3fpi9dAlsMc5YbQvDi0Sh2QTPXqMhyaAtzAr807TIyfQrmyg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.23.5 + '@babel/generator': 7.23.6 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-function-name': 7.23.0 + '@babel/helper-hoist-variables': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + '@babel/parser': 7.23.6 + '@babel/types': 7.23.6 + debug: 4.3.4(supports-color@8.1.1) + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/types@7.17.0: + resolution: {integrity: sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-validator-identifier': 7.22.20 + to-fast-properties: 2.0.0 + dev: true + + /@babel/types@7.23.6: + resolution: {integrity: sha512-+uarb83brBzPKN38NX1MkB6vb6+mwvR6amUulqAE7ccQw1pEl+bCia9TbdG1lsnFP7lZySvUn37CHyXQdfTwzg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-string-parser': 7.23.4 + '@babel/helper-validator-identifier': 7.22.20 + to-fast-properties: 2.0.0 + dev: true + + /@cspotcode/source-map-support@0.8.1: + resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} + engines: {node: '>=12'} + dependencies: + '@jridgewell/trace-mapping': 0.3.9 + dev: true + + /@esbuild/aix-ppc64@0.19.11: + resolution: {integrity: sha512-FnzU0LyE3ySQk7UntJO4+qIiQgI7KoODnZg5xzXIrFJlKd2P2gwHsHY4927xj9y5PJmJSzULiUCWmv7iWnNa7g==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [aix] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-arm64@0.19.11: + resolution: {integrity: sha512-aiu7K/5JnLj//KOnOfEZ0D90obUkRzDMyqd/wNAUQ34m4YUPVhRZpnqKV9uqDGxT7cToSDnIHsGooyIczu9T+Q==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-arm@0.19.11: + resolution: {integrity: sha512-5OVapq0ClabvKvQ58Bws8+wkLCV+Rxg7tUVbo9xu034Nm536QTII4YzhaFriQ7rMrorfnFKUsArD2lqKbFY4vw==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-x64@0.19.11: + resolution: {integrity: sha512-eccxjlfGw43WYoY9QgB82SgGgDbibcqyDTlk3l3C0jOVHKxrjdc9CTwDUQd0vkvYg5um0OH+GpxYvp39r+IPOg==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-arm64@0.19.11: + resolution: {integrity: sha512-ETp87DRWuSt9KdDVkqSoKoLFHYTrkyz2+65fj9nfXsaV3bMhTCjtQfw3y+um88vGRKRiF7erPrh/ZuIdLUIVxQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-x64@0.19.11: + resolution: {integrity: sha512-fkFUiS6IUK9WYUO/+22omwetaSNl5/A8giXvQlcinLIjVkxwTLSktbF5f/kJMftM2MJp9+fXqZ5ezS7+SALp4g==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-arm64@0.19.11: + resolution: {integrity: sha512-lhoSp5K6bxKRNdXUtHoNc5HhbXVCS8V0iZmDvyWvYq9S5WSfTIHU2UGjcGt7UeS6iEYp9eeymIl5mJBn0yiuxA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-x64@0.19.11: + resolution: {integrity: sha512-JkUqn44AffGXitVI6/AbQdoYAq0TEullFdqcMY/PCUZ36xJ9ZJRtQabzMA+Vi7r78+25ZIBosLTOKnUXBSi1Kw==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm64@0.19.11: + resolution: {integrity: sha512-LneLg3ypEeveBSMuoa0kwMpCGmpu8XQUh+mL8XXwoYZ6Be2qBnVtcDI5azSvh7vioMDhoJFZzp9GWp9IWpYoUg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm@0.19.11: + resolution: {integrity: sha512-3CRkr9+vCV2XJbjwgzjPtO8T0SZUmRZla+UL1jw+XqHZPkPgZiyWvbDvl9rqAN8Zl7qJF0O/9ycMtjU67HN9/Q==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ia32@0.19.11: + resolution: {integrity: sha512-caHy++CsD8Bgq2V5CodbJjFPEiDPq8JJmBdeyZ8GWVQMjRD0sU548nNdwPNvKjVpamYYVL40AORekgfIubwHoA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-loong64@0.19.11: + resolution: {integrity: sha512-ppZSSLVpPrwHccvC6nQVZaSHlFsvCQyjnvirnVjbKSHuE5N24Yl8F3UwYUUR1UEPaFObGD2tSvVKbvR+uT1Nrg==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-mips64el@0.19.11: + resolution: {integrity: sha512-B5x9j0OgjG+v1dF2DkH34lr+7Gmv0kzX6/V0afF41FkPMMqaQ77pH7CrhWeR22aEeHKaeZVtZ6yFwlxOKPVFyg==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ppc64@0.19.11: + resolution: {integrity: sha512-MHrZYLeCG8vXblMetWyttkdVRjQlQUb/oMgBNurVEnhj4YWOr4G5lmBfZjHYQHHN0g6yDmCAQRR8MUHldvvRDA==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-riscv64@0.19.11: + resolution: {integrity: sha512-f3DY++t94uVg141dozDu4CCUkYW+09rWtaWfnb3bqe4w5NqmZd6nPVBm+qbz7WaHZCoqXqHz5p6CM6qv3qnSSQ==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-s390x@0.19.11: + resolution: {integrity: sha512-A5xdUoyWJHMMlcSMcPGVLzYzpcY8QP1RtYzX5/bS4dvjBGVxdhuiYyFwp7z74ocV7WDc0n1harxmpq2ePOjI0Q==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-x64@0.19.11: + resolution: {integrity: sha512-grbyMlVCvJSfxFQUndw5mCtWs5LO1gUlwP4CDi4iJBbVpZcqLVT29FxgGuBJGSzyOxotFG4LoO5X+M1350zmPA==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/netbsd-x64@0.19.11: + resolution: {integrity: sha512-13jvrQZJc3P230OhU8xgwUnDeuC/9egsjTkXN49b3GcS5BKvJqZn86aGM8W9pd14Kd+u7HuFBMVtrNGhh6fHEQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/openbsd-x64@0.19.11: + resolution: {integrity: sha512-ysyOGZuTp6SNKPE11INDUeFVVQFrhcNDVUgSQVDzqsqX38DjhPEPATpid04LCoUr2WXhQTEZ8ct/EgJCUDpyNw==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/sunos-x64@0.19.11: + resolution: {integrity: sha512-Hf+Sad9nVwvtxy4DXCZQqLpgmRTQqyFyhT3bZ4F2XlJCjxGmRFF0Shwn9rzhOYRB61w9VMXUkxlBy56dk9JJiQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-arm64@0.19.11: + resolution: {integrity: sha512-0P58Sbi0LctOMOQbpEOvOL44Ne0sqbS0XWHMvvrg6NE5jQ1xguCSSw9jQeUk2lfrXYsKDdOe6K+oZiwKPilYPQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-ia32@0.19.11: + resolution: {integrity: sha512-6YOrWS+sDJDmshdBIQU+Uoyh7pQKrdykdefC1avn76ss5c+RN6gut3LZA4E2cH5xUEp5/cA0+YxRaVtRAb0xBg==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-x64@0.19.11: + resolution: {integrity: sha512-vfkhltrjCAb603XaFhqhAF4LGDi2M4OrCRrFusyQ+iTLQ/o60QQXxc9cZC/FFpihBI9N1Grn6SMKVJ4KP7Fuiw==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@eslint-community/eslint-utils@4.4.0(eslint@8.56.0): + resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + dependencies: + eslint: 8.56.0 + eslint-visitor-keys: 3.4.3 + dev: true + + /@eslint-community/regexpp@4.10.0: + resolution: {integrity: sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + dev: true + + /@eslint/eslintrc@2.1.4: + resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + ajv: 6.12.6 + debug: 4.3.4(supports-color@8.1.1) + espree: 9.6.1 + globals: 13.24.0 + ignore: 5.3.0 + import-fresh: 3.3.0 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@eslint/js@8.56.0: + resolution: {integrity: sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: true + + /@fastify/ajv-compiler@3.5.0: + resolution: {integrity: sha512-ebbEtlI7dxXF5ziNdr05mOY8NnDiPB1XvAlLHctRt/Rc+C3LCOVW5imUVX+mhvUhnNzmPBHewUkOFgGlCxgdAA==} + dependencies: + ajv: 8.12.0 + ajv-formats: 2.1.1(ajv@8.12.0) + fast-uri: 2.3.0 + dev: false + + /@fastify/cors@8.4.1: + resolution: {integrity: sha512-iYQJtrY3pFiDS5mo5zRaudzg2OcUdJ96PD6xfkKOOEilly5nnrFZx/W6Sce2T79xxlEn2qpU3t5+qS2phS369w==} + dependencies: + fastify-plugin: 4.5.1 + mnemonist: 0.39.5 + dev: false + + /@fastify/deepmerge@1.3.0: + resolution: {integrity: sha512-J8TOSBq3SoZbDhM9+R/u77hP93gz/rajSA+K2kGyijPpORPWUXHUpTaleoj+92As0S9uPRP7Oi8IqMf0u+ro6A==} + dev: false + + /@fastify/error@3.4.1: + resolution: {integrity: sha512-wWSvph+29GR783IhmvdwWnN4bUxTD01Vm5Xad4i7i1VuAOItLvbPAb69sb0IQ2N57yprvhNIwAP5B6xfKTmjmQ==} + dev: false + + /@fastify/fast-json-stringify-compiler@4.3.0: + resolution: {integrity: sha512-aZAXGYo6m22Fk1zZzEUKBvut/CIIQe/BapEORnxiD5Qr0kPHqqI69NtEMCme74h+at72sPhbkb4ZrLd1W3KRLA==} + dependencies: + fast-json-stringify: 5.9.1 + dev: false + + /@fastify/websocket@8.3.1(bufferutil@4.0.8)(utf-8-validate@6.0.3): + resolution: {integrity: sha512-hsQYHHJme/kvP3ZS4v/WMUznPBVeeQHHwAoMy1LiN6m/HuPfbdXq1MBJ4Nt8qX1YI+eVbog4MnOsU7MTozkwYA==} + dependencies: + fastify-plugin: 4.5.1 + ws: 8.11.0(bufferutil@4.0.8)(utf-8-validate@6.0.3) + transitivePeerDependencies: + - bufferutil + - utf-8-validate + dev: false + + /@graphql-codegen/cli@5.0.0(@types/node@20.10.6)(bufferutil@4.0.8)(graphql@16.8.1)(typescript@5.3.3)(utf-8-validate@6.0.3): + resolution: {integrity: sha512-A7J7+be/a6e+/ul2KI5sfJlpoqeqwX8EzktaKCeduyVKgOLA6W5t+NUGf6QumBDXU8PEOqXk3o3F+RAwCWOiqA==} + hasBin: true + peerDependencies: + '@parcel/watcher': ^2.1.0 + graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 + peerDependenciesMeta: + '@parcel/watcher': + optional: true + dependencies: + '@babel/generator': 7.23.6 + '@babel/template': 7.22.15 + '@babel/types': 7.23.6 + '@graphql-codegen/core': 4.0.0(graphql@16.8.1) + '@graphql-codegen/plugin-helpers': 5.0.1(graphql@16.8.1) + '@graphql-tools/apollo-engine-loader': 8.0.0(graphql@16.8.1) + '@graphql-tools/code-file-loader': 8.0.3(graphql@16.8.1) + '@graphql-tools/git-loader': 8.0.3(graphql@16.8.1) + '@graphql-tools/github-loader': 8.0.0(@types/node@20.10.6)(graphql@16.8.1) + '@graphql-tools/graphql-file-loader': 8.0.0(graphql@16.8.1) + '@graphql-tools/json-file-loader': 8.0.0(graphql@16.8.1) + '@graphql-tools/load': 8.0.1(graphql@16.8.1) + '@graphql-tools/prisma-loader': 8.0.2(@types/node@20.10.6)(bufferutil@4.0.8)(graphql@16.8.1)(utf-8-validate@6.0.3) + '@graphql-tools/url-loader': 8.0.1(@types/node@20.10.6)(bufferutil@4.0.8)(graphql@16.8.1)(utf-8-validate@6.0.3) + '@graphql-tools/utils': 10.0.12(graphql@16.8.1) + '@whatwg-node/fetch': 0.8.8 + chalk: 4.1.2 + cosmiconfig: 8.3.6(typescript@5.3.3) + debounce: 1.2.1 + detect-indent: 6.1.0 + graphql: 16.8.1 + graphql-config: 5.0.3(@types/node@20.10.6)(bufferutil@4.0.8)(graphql@16.8.1)(typescript@5.3.3)(utf-8-validate@6.0.3) + inquirer: 8.2.6 + is-glob: 4.0.3 + jiti: 1.21.0 + json-to-pretty-yaml: 1.2.2 + listr2: 4.0.5 + log-symbols: 4.1.0 + micromatch: 4.0.5 + shell-quote: 1.8.1 + string-env-interpolation: 1.0.1 + ts-log: 2.2.5 + tslib: 2.6.2 + yaml: 2.3.4 + yargs: 17.7.2 + transitivePeerDependencies: + - '@types/node' + - bufferutil + - cosmiconfig-toml-loader + - encoding + - enquirer + - supports-color + - typescript + - utf-8-validate + dev: true + + /@graphql-codegen/core@4.0.0(graphql@16.8.1): + resolution: {integrity: sha512-JAGRn49lEtSsZVxeIlFVIRxts2lWObR+OQo7V2LHDJ7ohYYw3ilv7nJ8pf8P4GTg/w6ptcYdSdVVdkI8kUHB/Q==} + peerDependencies: + graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 + dependencies: + '@graphql-codegen/plugin-helpers': 5.0.1(graphql@16.8.1) + '@graphql-tools/schema': 10.0.2(graphql@16.8.1) + '@graphql-tools/utils': 10.0.12(graphql@16.8.1) + graphql: 16.8.1 + tslib: 2.5.3 + dev: true + + /@graphql-codegen/plugin-helpers@5.0.1(graphql@16.8.1): + resolution: {integrity: sha512-6L5sb9D8wptZhnhLLBcheSPU7Tg//DGWgc5tQBWX46KYTOTQHGqDpv50FxAJJOyFVJrveN9otWk9UT9/yfY4ww==} + peerDependencies: + graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 + dependencies: + '@graphql-tools/utils': 10.0.12(graphql@16.8.1) + change-case-all: 1.0.15 + common-tags: 1.8.2 + graphql: 16.8.1 + import-from: 4.0.0 + lodash: 4.17.21 + tslib: 2.5.3 + dev: true + + /@graphql-codegen/schema-ast@4.0.0(graphql@16.8.1): + resolution: {integrity: sha512-WIzkJFa9Gz28FITAPILbt+7A8+yzOyd1NxgwFh7ie+EmO9a5zQK6UQ3U/BviirguXCYnn+AR4dXsoDrSrtRA1g==} + peerDependencies: + graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 + dependencies: + '@graphql-codegen/plugin-helpers': 5.0.1(graphql@16.8.1) + '@graphql-tools/utils': 10.0.12(graphql@16.8.1) + graphql: 16.8.1 + tslib: 2.5.3 + dev: true + + /@graphql-codegen/typescript-resolvers@4.0.1(graphql@16.8.1): + resolution: {integrity: sha512-dydE2VsNud/gZZG9FV0DldPA7voExCn7FQE3V9ZAjhqCDjCcSDHUIWxG5JoaW0G75ooPEDmN7ZFd+uaJ2BEqzQ==} + peerDependencies: + graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 + dependencies: + '@graphql-codegen/plugin-helpers': 5.0.1(graphql@16.8.1) + '@graphql-codegen/typescript': 4.0.1(graphql@16.8.1) + '@graphql-codegen/visitor-plugin-common': 4.0.1(graphql@16.8.1) + '@graphql-tools/utils': 10.0.12(graphql@16.8.1) + auto-bind: 4.0.0 + graphql: 16.8.1 + tslib: 2.5.3 + transitivePeerDependencies: + - encoding + - supports-color + dev: true + + /@graphql-codegen/typescript@4.0.1(graphql@16.8.1): + resolution: {integrity: sha512-3YziQ21dCVdnHb+Us1uDb3pA6eG5Chjv0uTK+bt9dXeMlwYBU8MbtzvQTo4qvzWVC1AxSOKj0rgfNu1xCXqJyA==} + peerDependencies: + graphql: ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 + dependencies: + '@graphql-codegen/plugin-helpers': 5.0.1(graphql@16.8.1) + '@graphql-codegen/schema-ast': 4.0.0(graphql@16.8.1) + '@graphql-codegen/visitor-plugin-common': 4.0.1(graphql@16.8.1) + auto-bind: 4.0.0 + graphql: 16.8.1 + tslib: 2.5.3 + transitivePeerDependencies: + - encoding + - supports-color + dev: true + + /@graphql-codegen/visitor-plugin-common@4.0.1(graphql@16.8.1): + resolution: {integrity: sha512-Bi/1z0nHg4QMsAqAJhds+ForyLtk7A3HQOlkrZNm3xEkY7lcBzPtiOTLBtvziwopBsXUxqeSwVjOOFPLS5Yw1Q==} + peerDependencies: + graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 + dependencies: + '@graphql-codegen/plugin-helpers': 5.0.1(graphql@16.8.1) + '@graphql-tools/optimize': 2.0.0(graphql@16.8.1) + '@graphql-tools/relay-operation-optimizer': 7.0.0(graphql@16.8.1) + '@graphql-tools/utils': 10.0.12(graphql@16.8.1) + auto-bind: 4.0.0 + change-case-all: 1.0.15 + dependency-graph: 0.11.0 + graphql: 16.8.1 + graphql-tag: 2.12.6(graphql@16.8.1) + parse-filepath: 1.0.2 + tslib: 2.5.3 + transitivePeerDependencies: + - encoding + - supports-color + dev: true + + /@graphql-tools/apollo-engine-loader@8.0.0(graphql@16.8.1): + resolution: {integrity: sha512-axQTbN5+Yxs1rJ6cWQBOfw3AEeC+fvIuZSfJLPLLvFJLj4pUm9fhxey/g6oQZAAQJqKPfw+tLDUQvnfvRK8Kmg==} + engines: {node: '>=16.0.0'} + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + dependencies: + '@ardatan/sync-fetch': 0.0.1 + '@graphql-tools/utils': 10.0.12(graphql@16.8.1) + '@whatwg-node/fetch': 0.9.15 + graphql: 16.8.1 + tslib: 2.6.2 + transitivePeerDependencies: + - encoding + dev: true + + /@graphql-tools/batch-execute@9.0.2(graphql@16.8.1): + resolution: {integrity: sha512-Y2uwdZI6ZnatopD/SYfZ1eGuQFI7OU2KGZ2/B/7G9ISmgMl5K+ZZWz/PfIEXeiHirIDhyk54s4uka5rj2xwKqQ==} + engines: {node: '>=16.0.0'} + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + dependencies: + '@graphql-tools/utils': 10.0.12(graphql@16.8.1) + dataloader: 2.2.2 + graphql: 16.8.1 + tslib: 2.6.2 + value-or-promise: 1.0.12 + dev: true + + /@graphql-tools/code-file-loader@8.0.3(graphql@16.8.1): + resolution: {integrity: sha512-gVnnlWs0Ua+5FkuHHEriFUOI3OIbHv6DS1utxf28n6NkfGMJldC4j0xlJRY0LS6dWK34IGYgD4HelKYz2l8KiA==} + engines: {node: '>=16.0.0'} + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + dependencies: + '@graphql-tools/graphql-tag-pluck': 8.1.0(graphql@16.8.1) + '@graphql-tools/utils': 10.0.12(graphql@16.8.1) + globby: 11.1.0 + graphql: 16.8.1 + tslib: 2.6.2 + unixify: 1.0.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@graphql-tools/delegate@10.0.3(graphql@16.8.1): + resolution: {integrity: sha512-Jor9oazZ07zuWkykD3OOhT/2XD74Zm6Ar0ENZMk75MDD51wB2UWUIMljtHxbJhV5A6UBC2v8x6iY0xdCGiIlyw==} + engines: {node: '>=16.0.0'} + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + dependencies: + '@graphql-tools/batch-execute': 9.0.2(graphql@16.8.1) + '@graphql-tools/executor': 1.2.0(graphql@16.8.1) + '@graphql-tools/schema': 10.0.2(graphql@16.8.1) + '@graphql-tools/utils': 10.0.12(graphql@16.8.1) + dataloader: 2.2.2 + graphql: 16.8.1 + tslib: 2.6.2 + dev: true + + /@graphql-tools/executor-graphql-ws@1.1.0(bufferutil@4.0.8)(graphql@16.8.1)(utf-8-validate@6.0.3): + resolution: {integrity: sha512-yM67SzwE8rYRpm4z4AuGtABlOp9mXXVy6sxXnTJRoYIdZrmDbKVfIY+CpZUJCqS0FX3xf2+GoHlsj7Qswaxgcg==} + engines: {node: '>=16.0.0'} + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + dependencies: + '@graphql-tools/utils': 10.0.12(graphql@16.8.1) + '@types/ws': 8.5.10 + graphql: 16.8.1 + graphql-ws: 5.14.3(graphql@16.8.1) + isomorphic-ws: 5.0.0(ws@8.16.0) + tslib: 2.6.2 + ws: 8.16.0(bufferutil@4.0.8)(utf-8-validate@6.0.3) + transitivePeerDependencies: + - bufferutil + - utf-8-validate + dev: true + + /@graphql-tools/executor-http@1.0.6(@types/node@20.10.6)(graphql@16.8.1): + resolution: {integrity: sha512-EKZ6b7EtP+oUs+jG4r5OUYRl4OolcRzQElAZofA4TFCK4k7HxlKh8DAwdD2eZHSt/s8q6uRG1dAE0lqfMAA9qQ==} + engines: {node: '>=16.0.0'} + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + dependencies: + '@graphql-tools/utils': 10.0.12(graphql@16.8.1) + '@repeaterjs/repeater': 3.0.5 + '@whatwg-node/fetch': 0.9.15 + extract-files: 11.0.0 + graphql: 16.8.1 + meros: 1.3.0(@types/node@20.10.6) + tslib: 2.6.2 + value-or-promise: 1.0.12 + transitivePeerDependencies: + - '@types/node' + dev: true + + /@graphql-tools/executor-legacy-ws@1.0.5(bufferutil@4.0.8)(graphql@16.8.1)(utf-8-validate@6.0.3): + resolution: {integrity: sha512-w54AZ7zkNuvpyV09FH+eGHnnAmaxhBVHg4Yh2ICcsMfRg0brkLt77PlbjBuxZ4HY8XZnKJaYWf+tKazQZtkQtg==} + engines: {node: '>=16.0.0'} + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + dependencies: + '@graphql-tools/utils': 10.0.12(graphql@16.8.1) + '@types/ws': 8.5.10 + graphql: 16.8.1 + isomorphic-ws: 5.0.0(ws@8.16.0) + tslib: 2.6.2 + ws: 8.16.0(bufferutil@4.0.8)(utf-8-validate@6.0.3) + transitivePeerDependencies: + - bufferutil + - utf-8-validate + dev: true + + /@graphql-tools/executor@1.2.0(graphql@16.8.1): + resolution: {integrity: sha512-SKlIcMA71Dha5JnEWlw4XxcaJ+YupuXg0QCZgl2TOLFz4SkGCwU/geAsJvUJFwK2RbVLpQv/UMq67lOaBuwDtg==} + engines: {node: '>=16.0.0'} + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + dependencies: + '@graphql-tools/utils': 10.0.12(graphql@16.8.1) + '@graphql-typed-document-node/core': 3.2.0(graphql@16.8.1) + '@repeaterjs/repeater': 3.0.5 + graphql: 16.8.1 + tslib: 2.6.2 + value-or-promise: 1.0.12 + dev: true + + /@graphql-tools/git-loader@8.0.3(graphql@16.8.1): + resolution: {integrity: sha512-Iz9KbRUAkuOe8JGTS0qssyJ+D5Snle17W+z9anwWrLFrkBhHrRFUy5AdjZqgJuhls0x30QkZBnnCtnHDBdQ4nA==} + engines: {node: '>=16.0.0'} + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + dependencies: + '@graphql-tools/graphql-tag-pluck': 8.1.0(graphql@16.8.1) + '@graphql-tools/utils': 10.0.12(graphql@16.8.1) + graphql: 16.8.1 + is-glob: 4.0.3 + micromatch: 4.0.5 + tslib: 2.6.2 + unixify: 1.0.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@graphql-tools/github-loader@8.0.0(@types/node@20.10.6)(graphql@16.8.1): + resolution: {integrity: sha512-VuroArWKcG4yaOWzV0r19ElVIV6iH6UKDQn1MXemND0xu5TzrFme0kf3U9o0YwNo0kUYEk9CyFM0BYg4he17FA==} + engines: {node: '>=16.0.0'} + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + dependencies: + '@ardatan/sync-fetch': 0.0.1 + '@graphql-tools/executor-http': 1.0.6(@types/node@20.10.6)(graphql@16.8.1) + '@graphql-tools/graphql-tag-pluck': 8.1.0(graphql@16.8.1) + '@graphql-tools/utils': 10.0.12(graphql@16.8.1) + '@whatwg-node/fetch': 0.9.15 + graphql: 16.8.1 + tslib: 2.6.2 + value-or-promise: 1.0.12 + transitivePeerDependencies: + - '@types/node' + - encoding + - supports-color + dev: true + + /@graphql-tools/graphql-file-loader@8.0.0(graphql@16.8.1): + resolution: {integrity: sha512-wRXj9Z1IFL3+zJG1HWEY0S4TXal7+s1vVhbZva96MSp0kbb/3JBF7j0cnJ44Eq0ClccMgGCDFqPFXty4JlpaPg==} + engines: {node: '>=16.0.0'} + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + dependencies: + '@graphql-tools/import': 7.0.0(graphql@16.8.1) + '@graphql-tools/utils': 10.0.12(graphql@16.8.1) + globby: 11.1.0 + graphql: 16.8.1 + tslib: 2.6.2 + unixify: 1.0.0 + dev: true + + /@graphql-tools/graphql-tag-pluck@8.1.0(graphql@16.8.1): + resolution: {integrity: sha512-kt5l6H/7QxQcIaewInTcune6NpATojdFEW98/8xWcgmy7dgXx5vU9e0AicFZIH+ewGyZzTpwFqO2RI03roxj2w==} + engines: {node: '>=16.0.0'} + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + dependencies: + '@babel/core': 7.23.7 + '@babel/parser': 7.23.6 + '@babel/plugin-syntax-import-assertions': 7.23.3(@babel/core@7.23.7) + '@babel/traverse': 7.23.7 + '@babel/types': 7.23.6 + '@graphql-tools/utils': 10.0.12(graphql@16.8.1) + graphql: 16.8.1 + tslib: 2.6.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@graphql-tools/import@7.0.0(graphql@16.8.1): + resolution: {integrity: sha512-NVZiTO8o1GZs6OXzNfjB+5CtQtqsZZpQOq+Uu0w57kdUkT4RlQKlwhT8T81arEsbV55KpzkpFsOZP7J1wdmhBw==} + engines: {node: '>=16.0.0'} + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + dependencies: + '@graphql-tools/utils': 10.0.12(graphql@16.8.1) + graphql: 16.8.1 + resolve-from: 5.0.0 + tslib: 2.6.2 + dev: true + + /@graphql-tools/json-file-loader@8.0.0(graphql@16.8.1): + resolution: {integrity: sha512-ki6EF/mobBWJjAAC84xNrFMhNfnUFD6Y0rQMGXekrUgY0NdeYXHU0ZUgHzC9O5+55FslqUmAUHABePDHTyZsLg==} + engines: {node: '>=16.0.0'} + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + dependencies: + '@graphql-tools/utils': 10.0.12(graphql@16.8.1) + globby: 11.1.0 + graphql: 16.8.1 + tslib: 2.6.2 + unixify: 1.0.0 + dev: true + + /@graphql-tools/load@8.0.1(graphql@16.8.1): + resolution: {integrity: sha512-qSMsKngJhDqRbuWyo3NvakEFqFL6+eSjy8ooJ1o5qYD26N7dqXkKzIMycQsX7rBK19hOuINAUSaRcVWH6hTccw==} + engines: {node: '>=16.0.0'} + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + dependencies: + '@graphql-tools/schema': 10.0.2(graphql@16.8.1) + '@graphql-tools/utils': 10.0.12(graphql@16.8.1) + graphql: 16.8.1 + p-limit: 3.1.0 + tslib: 2.6.2 + dev: true + + /@graphql-tools/merge@8.4.2(graphql@16.8.1): + resolution: {integrity: sha512-XbrHAaj8yDuINph+sAfuq3QCZ/tKblrTLOpirK0+CAgNlZUCHs0Fa+xtMUURgwCVThLle1AF7svJCxFizygLsw==} + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + dependencies: + '@graphql-tools/utils': 9.2.1(graphql@16.8.1) + graphql: 16.8.1 + tslib: 2.6.2 + dev: false + + /@graphql-tools/merge@9.0.1(graphql@16.8.1): + resolution: {integrity: sha512-hIEExWO9fjA6vzsVjJ3s0cCQ+Q/BEeMVJZtMXd7nbaVefVy0YDyYlEkeoYYNV3NVVvu1G9lr6DM1Qd0DGo9Caw==} + engines: {node: '>=16.0.0'} + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + dependencies: + '@graphql-tools/utils': 10.0.12(graphql@16.8.1) + graphql: 16.8.1 + tslib: 2.6.2 + + /@graphql-tools/optimize@2.0.0(graphql@16.8.1): + resolution: {integrity: sha512-nhdT+CRGDZ+bk68ic+Jw1OZ99YCDIKYA5AlVAnBHJvMawSx9YQqQAIj4refNc1/LRieGiuWvhbG3jvPVYho0Dg==} + engines: {node: '>=16.0.0'} + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + dependencies: + graphql: 16.8.1 + tslib: 2.6.2 + dev: true + + /@graphql-tools/prisma-loader@8.0.2(@types/node@20.10.6)(bufferutil@4.0.8)(graphql@16.8.1)(utf-8-validate@6.0.3): + resolution: {integrity: sha512-8d28bIB0bZ9Bj0UOz9sHagVPW+6AHeqvGljjERtwCnWl8OCQw2c2pNboYXISLYUG5ub76r4lDciLLTU+Ks7Q0w==} + engines: {node: '>=16.0.0'} + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + dependencies: + '@graphql-tools/url-loader': 8.0.1(@types/node@20.10.6)(bufferutil@4.0.8)(graphql@16.8.1)(utf-8-validate@6.0.3) + '@graphql-tools/utils': 10.0.12(graphql@16.8.1) + '@types/js-yaml': 4.0.9 + '@types/json-stable-stringify': 1.0.36 + '@whatwg-node/fetch': 0.9.15 + chalk: 4.1.2 + debug: 4.3.4(supports-color@8.1.1) + dotenv: 16.3.1 + graphql: 16.8.1 + graphql-request: 6.1.0(graphql@16.8.1) + http-proxy-agent: 7.0.0 + https-proxy-agent: 7.0.2 + jose: 5.2.0 + js-yaml: 4.1.0 + json-stable-stringify: 1.1.0 + lodash: 4.17.21 + scuid: 1.1.0 + tslib: 2.6.2 + yaml-ast-parser: 0.0.43 + transitivePeerDependencies: + - '@types/node' + - bufferutil + - encoding + - supports-color + - utf-8-validate + dev: true + + /@graphql-tools/relay-operation-optimizer@7.0.0(graphql@16.8.1): + resolution: {integrity: sha512-UNlJi5y3JylhVWU4MBpL0Hun4Q7IoJwv9xYtmAz+CgRa066szzY7dcuPfxrA7cIGgG/Q6TVsKsYaiF4OHPs1Fw==} + engines: {node: '>=16.0.0'} + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + dependencies: + '@ardatan/relay-compiler': 12.0.0(graphql@16.8.1) + '@graphql-tools/utils': 10.0.12(graphql@16.8.1) + graphql: 16.8.1 + tslib: 2.6.2 + transitivePeerDependencies: + - encoding + - supports-color + dev: true + + /@graphql-tools/schema@10.0.2(graphql@16.8.1): + resolution: {integrity: sha512-TbPsIZnWyDCLhgPGnDjt4hosiNU2mF/rNtSk5BVaXWnZqvKJ6gzJV4fcHcvhRIwtscDMW2/YTnK6dLVnk8pc4w==} + engines: {node: '>=16.0.0'} + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + dependencies: + '@graphql-tools/merge': 9.0.1(graphql@16.8.1) + '@graphql-tools/utils': 10.0.12(graphql@16.8.1) + graphql: 16.8.1 + tslib: 2.6.2 + value-or-promise: 1.0.12 + dev: true + + /@graphql-tools/schema@9.0.19(graphql@16.8.1): + resolution: {integrity: sha512-oBRPoNBtCkk0zbUsyP4GaIzCt8C0aCI4ycIRUL67KK5pOHljKLBBtGT+Jr6hkzA74C8Gco8bpZPe7aWFjiaK2w==} + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + dependencies: + '@graphql-tools/merge': 8.4.2(graphql@16.8.1) + '@graphql-tools/utils': 9.2.1(graphql@16.8.1) + graphql: 16.8.1 + tslib: 2.6.2 + value-or-promise: 1.0.12 + dev: false + + /@graphql-tools/url-loader@8.0.1(@types/node@20.10.6)(bufferutil@4.0.8)(graphql@16.8.1)(utf-8-validate@6.0.3): + resolution: {integrity: sha512-B2k8KQEkEQmfV1zhurT5GLoXo8jbXP+YQHUayhCSxKYlRV7j/1Fhp1b21PDM8LXIDGlDRXaZ0FbWKOs7eYXDuQ==} + engines: {node: '>=16.0.0'} + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + dependencies: + '@ardatan/sync-fetch': 0.0.1 + '@graphql-tools/delegate': 10.0.3(graphql@16.8.1) + '@graphql-tools/executor-graphql-ws': 1.1.0(bufferutil@4.0.8)(graphql@16.8.1)(utf-8-validate@6.0.3) + '@graphql-tools/executor-http': 1.0.6(@types/node@20.10.6)(graphql@16.8.1) + '@graphql-tools/executor-legacy-ws': 1.0.5(bufferutil@4.0.8)(graphql@16.8.1)(utf-8-validate@6.0.3) + '@graphql-tools/utils': 10.0.12(graphql@16.8.1) + '@graphql-tools/wrap': 10.0.1(graphql@16.8.1) + '@types/ws': 8.5.10 + '@whatwg-node/fetch': 0.9.15 + graphql: 16.8.1 + isomorphic-ws: 5.0.0(ws@8.16.0) + tslib: 2.6.2 + value-or-promise: 1.0.12 + ws: 8.16.0(bufferutil@4.0.8)(utf-8-validate@6.0.3) + transitivePeerDependencies: + - '@types/node' + - bufferutil + - encoding + - utf-8-validate + dev: true + + /@graphql-tools/utils@10.0.12(graphql@16.8.1): + resolution: {integrity: sha512-+yS1qlFwXlwU3Gv8ek/h2aJ95quog4yF22haC11M0zReMSTddbGJZ5yXKkE3sXoY2BcL1utilSFjylJ9uXpSNQ==} + engines: {node: '>=16.0.0'} + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + dependencies: + '@graphql-typed-document-node/core': 3.2.0(graphql@16.8.1) + cross-inspect: 1.0.0 + dset: 3.1.3 + graphql: 16.8.1 + tslib: 2.6.2 + + /@graphql-tools/utils@9.2.1(graphql@16.8.1): + resolution: {integrity: sha512-WUw506Ql6xzmOORlriNrD6Ugx+HjVgYxt9KCXD9mHAak+eaXSwuGGPyE60hy9xaDEoXKBsG7SkG69ybitaVl6A==} + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + dependencies: + '@graphql-typed-document-node/core': 3.2.0(graphql@16.8.1) + graphql: 16.8.1 + tslib: 2.6.2 + dev: false + + /@graphql-tools/wrap@10.0.1(graphql@16.8.1): + resolution: {integrity: sha512-Cw6hVrKGM2OKBXeuAGltgy4tzuqQE0Nt7t/uAqnuokSXZhMHXJUb124Bnvxc2gPZn5chfJSDafDe4Cp8ZAVJgg==} + engines: {node: '>=16.0.0'} + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + dependencies: + '@graphql-tools/delegate': 10.0.3(graphql@16.8.1) + '@graphql-tools/schema': 10.0.2(graphql@16.8.1) + '@graphql-tools/utils': 10.0.12(graphql@16.8.1) + graphql: 16.8.1 + tslib: 2.6.2 + value-or-promise: 1.0.12 + dev: true + + /@graphql-typed-document-node/core@3.2.0(graphql@16.8.1): + resolution: {integrity: sha512-mB9oAsNCm9aM3/SOv4YtBMqZbYj10R7dkq8byBqxGY/ncFwhf2oQzMV+LCRlWoDSEBJ3COiR1yeDvMtsoOsuFQ==} + peerDependencies: + graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + dependencies: + graphql: 16.8.1 + + /@hocuspocus/common@2.8.1: + resolution: {integrity: sha512-pNXBvmiNmF13X/t/VTNfYMyEnWkLJ9e1gTyc7vFozBTfN9EgX7rexT4INradC288wkQ5Ha1gZb908Q4XBucm9g==} + dependencies: + lib0: 0.2.88 dev: false /@hocuspocus/extension-database@2.8.1(bufferutil@4.0.8)(utf-8-validate@6.0.3)(y-protocols@1.0.6)(yjs@13.6.10): @@ -580,9 +1907,29 @@ packages: y-protocols: 1.0.6(yjs@13.6.10) yjs: 13.6.10 transitivePeerDependencies: - - bufferutil - - utf-8-validate - dev: false + - bufferutil + - utf-8-validate + dev: false + + /@humanwhocodes/config-array@0.11.13: + resolution: {integrity: sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==} + engines: {node: '>=10.10.0'} + dependencies: + '@humanwhocodes/object-schema': 2.0.1 + debug: 4.3.4(supports-color@8.1.1) + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@humanwhocodes/module-importer@1.0.1: + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + dev: true + + /@humanwhocodes/object-schema@2.0.1: + resolution: {integrity: sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==} + dev: true /@josephg/resolvable@1.0.1: resolution: {integrity: sha512-CtzORUwWTTOTqfVtHaKRJ0I1kNQd1bpn3sUh8I3nJDVY+5/M/Oe1DnEWzPQvqq/xPIIkzzzIP7mfCoAjFRvDhg==} @@ -618,10 +1965,130 @@ packages: '@jridgewell/sourcemap-codec': 1.4.15 dev: true + /@jridgewell/trace-mapping@0.3.9: + resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} + dependencies: + '@jridgewell/resolve-uri': 3.1.1 + '@jridgewell/sourcemap-codec': 1.4.15 + dev: true + + /@kamilkisiela/fast-url-parser@1.1.4: + resolution: {integrity: sha512-gbkePEBupNydxCelHCESvFSFM8XPh1Zs/OAVRW/rKpEqPAl5PbOM90Si8mv9bvnR53uPD2s/FiRxdvSejpRJew==} + dev: true + + /@mole-inc/bin-wrapper@8.0.1: + resolution: {integrity: sha512-sTGoeZnjI8N4KS+sW2AN95gDBErhAguvkw/tWdCjeM8bvxpz5lqrnd0vOJABA1A+Ic3zED7PYoLP/RANLgVotA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + bin-check: 4.1.0 + bin-version-check: 5.1.0 + content-disposition: 0.5.4 + ext-name: 5.0.0 + file-type: 17.1.6 + filenamify: 5.1.1 + got: 11.8.6 + os-filter-obj: 2.0.0 + dev: true + + /@nodelib/fs.scandir@2.1.5: + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + dev: true + + /@nodelib/fs.stat@2.0.5: + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + dev: true + + /@nodelib/fs.walk@1.2.8: + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.15.0 + dev: true + /@one-ini/wasm@0.1.1: resolution: {integrity: sha512-XuySG1E38YScSJoMlqovLru4KTUNSjgVTIjyh7qMX6aNN5HY5Ct5LhRJdxO79JtTzKfzV/bnWpz+zquYrISsvw==} dev: true + /@oxlint/darwin-arm64@0.1.2: + resolution: {integrity: sha512-bOYzbxJEXogwulAhGVNq3vSvp6KEwHaaW1G/3xqFKGxuifaa6YeWfCqqguVLh8N0Ma57LfA93/jzBcnW7XHHTQ==} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@oxlint/darwin-x64@0.1.2: + resolution: {integrity: sha512-Z6Djz/3csdxHnHgmV+OEl9he1MX+qstDGWsLNAwKLsvixTXYlDoIvdlazysemmBFgVbpUzKbx6cW4HqS31DdAg==} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@oxlint/linux-arm64@0.1.2: + resolution: {integrity: sha512-ZjmJVasx0ogX3xG0qhsp9LGliDbS4lzzh9WNZxs76QJOXdulRs5Tk+B+8bYVsZyoo3VXjIofUwRpx11An9hEoA==} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@oxlint/linux-x64@0.1.2: + resolution: {integrity: sha512-HFCJzqKm5PSjB2uVwy5zVzuVILYwvNgjhQyL3NIJEKF8dpCjn9lxbkJXg1xBJUTCVkuhW/jBdbUipIAFbu7VCg==} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@oxlint/win32-arm64@0.1.2: + resolution: {integrity: sha512-NDjeYzu2RqI2Nn/MhKy9MayPw3I2tuIGWZsn27emv/C6s1KW7P3khRgYJE9hX2Zo6pCVXzDRQdcmtJflH9wDlg==} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@oxlint/win32-x64@0.1.2: + resolution: {integrity: sha512-zQpQIBAEclJ8tNQKPmGAOKt2ZYNGRWhucfU3mcUr8YPMy1Tf6GPDZUhXNX9icAMRk83n24EtnQb4lR1ipiStmA==} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@peculiar/asn1-schema@2.3.8: + resolution: {integrity: sha512-ULB1XqHKx1WBU/tTFIA+uARuRoBVZ4pNdOA878RDrRbBfBGcSzi5HBkdScC6ZbHn8z7L8gmKCgPC1LHRrP46tA==} + dependencies: + asn1js: 3.0.5 + pvtsutils: 1.3.5 + tslib: 2.6.2 + dev: true + + /@peculiar/json-schema@1.1.12: + resolution: {integrity: sha512-coUfuoMeIB7B8/NMekxaDzLhaYmp0HZNPEjYRm9goRou8UZIC3z21s0sL9AWoCw4EG876QyO3kYrc61WNF9B/w==} + engines: {node: '>=8.0.0'} + dependencies: + tslib: 2.6.2 + dev: true + + /@peculiar/webcrypto@1.4.3: + resolution: {integrity: sha512-VtaY4spKTdN5LjJ04im/d/joXuvLbQdgy5Z4DXF4MFZhQ+MTrejbNMkfZBp1Bs3O5+bFqnJgyGdPuZQflvIa5A==} + engines: {node: '>=10.12.0'} + dependencies: + '@peculiar/asn1-schema': 2.3.8 + '@peculiar/json-schema': 1.1.12 + pvtsutils: 1.3.5 + tslib: 2.6.2 + webcrypto-core: 1.7.7 + dev: true + /@protobufjs/aspromise@1.1.2: resolution: {integrity: sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==} dev: false @@ -665,6 +2132,10 @@ packages: resolution: {integrity: sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==} dev: false + /@repeaterjs/repeater@3.0.5: + resolution: {integrity: sha512-l3YHBLAol6d/IKnB9LhpD0cEZWAoe3eFKUyTYWmFmCO2Q/WOckxLQAUyMZWwZV2M/m3+4vgRoaolFqaII82/TA==} + dev: true + /@rushstack/ts-command-line@4.17.1: resolution: {integrity: sha512-2jweO1O57BYP5qdBGl6apJLB+aRIn5ccIRTPDyULh0KMwVzFqWtw6IZWt1qtUoZD/pD2RNkIOosH6Cq45rIYeg==} dependencies: @@ -674,6 +2145,11 @@ packages: string-argv: 0.3.2 dev: false + /@sindresorhus/is@4.6.0: + resolution: {integrity: sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==} + engines: {node: '>=10'} + dev: true + /@sinonjs/commons@2.0.0: resolution: {integrity: sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==} dependencies: @@ -704,7 +2180,168 @@ packages: /@sinonjs/text-encoding@0.7.2: resolution: {integrity: sha512-sXXKG+uL9IrKqViTtao2Ws6dy0znu9sOaP1di/jKGW1M6VssO8vlpXCQcpZ+jisQ1tTFAC5Jo/EOzFbggBagFQ==} - /@trivago/prettier-plugin-sort-imports@4.3.0(prettier@3.0.3): + /@swc/cli@0.1.63(@swc/core@1.3.102): + resolution: {integrity: sha512-EM9oxxHzmmsprYRbGqsS2M4M/Gr5Gkcl0ROYYIdlUyTkhOiX822EQiRCpPCwdutdnzH2GyaTN7wc6i0Y+CKd3A==} + engines: {node: '>= 12.13'} + hasBin: true + peerDependencies: + '@swc/core': ^1.2.66 + chokidar: ^3.5.1 + peerDependenciesMeta: + chokidar: + optional: true + dependencies: + '@mole-inc/bin-wrapper': 8.0.1 + '@swc/core': 1.3.102(@swc/helpers@0.5.3) + commander: 7.2.0 + fast-glob: 3.3.2 + semver: 7.5.4 + slash: 3.0.0 + source-map: 0.7.4 + dev: true + + /@swc/core-darwin-arm64@1.3.102: + resolution: {integrity: sha512-CJDxA5Wd2cUMULj3bjx4GEoiYyyiyL8oIOu4Nhrs9X+tlg8DnkCm4nI57RJGP8Mf6BaXPIJkHX8yjcefK2RlDA==} + engines: {node: '>=10'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@swc/core-darwin-x64@1.3.102: + resolution: {integrity: sha512-X5akDkHwk6oAer49oER0qZMjNMkLH3IOZaV1m98uXIasAGyjo5WH1MKPeMLY1sY6V6TrufzwiSwD4ds571ytcg==} + engines: {node: '>=10'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@swc/core-linux-arm-gnueabihf@1.3.102: + resolution: {integrity: sha512-kJH3XtZP9YQdjq/wYVBeFuiVQl4HaC4WwRrIxAHwe2OyvrwUI43dpW3LpxSggBnxXcVCXYWf36sTnv8S75o2Gw==} + engines: {node: '>=10'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@swc/core-linux-arm64-gnu@1.3.102: + resolution: {integrity: sha512-flQP2WDyCgO24WmKA1wjjTx+xfCmavUete2Kp6yrM+631IHLGnr17eu7rYJ/d4EnDBId/ytMyrnWbTVkaVrpbQ==} + engines: {node: '>=10'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@swc/core-linux-arm64-musl@1.3.102: + resolution: {integrity: sha512-bQEQSnC44DyoIGLw1+fNXKVGoCHi7eJOHr8BdH0y1ooy9ArskMjwobBFae3GX4T1AfnrTaejyr0FvLYIb0Zkog==} + engines: {node: '>=10'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@swc/core-linux-x64-gnu@1.3.102: + resolution: {integrity: sha512-dFvnhpI478svQSxqISMt00MKTDS0e4YtIr+ioZDG/uJ/q+RpcNy3QI2KMm05Fsc8Y0d4krVtvCKWgfUMsJZXAg==} + engines: {node: '>=10'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@swc/core-linux-x64-musl@1.3.102: + resolution: {integrity: sha512-+a0M3CvjeIRNA/jTCzWEDh2V+mhKGvLreHOL7J97oULZy5yg4gf7h8lQX9J8t9QLbf6fsk+0F8bVH1Ie/PbXjA==} + engines: {node: '>=10'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@swc/core-win32-arm64-msvc@1.3.102: + resolution: {integrity: sha512-w76JWLjkZNOfkB25nqdWUNCbt0zJ41CnWrJPZ+LxEai3zAnb2YtgB/cCIrwxDebRuMgE9EJXRj7gDDaTEAMOOQ==} + engines: {node: '>=10'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@swc/core-win32-ia32-msvc@1.3.102: + resolution: {integrity: sha512-vlDb09HiGqKwz+2cxDS9T5/461ipUQBplvuhW+cCbzzGuPq8lll2xeyZU0N1E4Sz3MVdSPx1tJREuRvlQjrwNg==} + engines: {node: '>=10'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@swc/core-win32-x64-msvc@1.3.102: + resolution: {integrity: sha512-E/jfSD7sShllxBwwgDPeXp1UxvIqehj/ShSUqq1pjR/IDRXngcRSXKJK92mJkNFY7suH6BcCWwzrxZgkO7sWmw==} + engines: {node: '>=10'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@swc/core@1.3.102(@swc/helpers@0.5.3): + resolution: {integrity: sha512-OAjNLY/f6QWKSDzaM3bk31A+OYHu6cPa9P/rFIx8X5d24tHXUpRiiq6/PYI6SQRjUPlB72GjsjoEU8F+ALadHg==} + engines: {node: '>=10'} + requiresBuild: true + peerDependencies: + '@swc/helpers': ^0.5.0 + peerDependenciesMeta: + '@swc/helpers': + optional: true + dependencies: + '@swc/counter': 0.1.2 + '@swc/helpers': 0.5.3 + '@swc/types': 0.1.5 + optionalDependencies: + '@swc/core-darwin-arm64': 1.3.102 + '@swc/core-darwin-x64': 1.3.102 + '@swc/core-linux-arm-gnueabihf': 1.3.102 + '@swc/core-linux-arm64-gnu': 1.3.102 + '@swc/core-linux-arm64-musl': 1.3.102 + '@swc/core-linux-x64-gnu': 1.3.102 + '@swc/core-linux-x64-musl': 1.3.102 + '@swc/core-win32-arm64-msvc': 1.3.102 + '@swc/core-win32-ia32-msvc': 1.3.102 + '@swc/core-win32-x64-msvc': 1.3.102 + dev: true + + /@swc/counter@0.1.2: + resolution: {integrity: sha512-9F4ys4C74eSTEUNndnER3VJ15oru2NumfQxS8geE+f3eB5xvfxpWyqE5XlVnxb/R14uoXi6SLbBwwiDSkv+XEw==} + dev: true + + /@swc/helpers@0.5.3: + resolution: {integrity: sha512-FaruWX6KdudYloq1AHD/4nU+UsMTdNE8CKyrseXWEcgjDAbvkwJg2QGPAnfIJLIWsjZOSPLOAykK6fuYp4vp4A==} + dependencies: + tslib: 2.6.2 + dev: true + + /@swc/types@0.1.5: + resolution: {integrity: sha512-myfUej5naTBWnqOCc/MdVOLVjXUXtIA+NpDrDBKJtLLg2shUjBu3cZmB/85RyitKc55+lUUyl7oRfLOvkr2hsw==} + dev: true + + /@szmarczak/http-timer@4.0.6: + resolution: {integrity: sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==} + engines: {node: '>=10'} + dependencies: + defer-to-connect: 2.0.1 + dev: true + + /@tokenizer/token@0.3.0: + resolution: {integrity: sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==} + dev: true + + /@trivago/prettier-plugin-sort-imports@4.3.0(prettier@3.1.1): resolution: {integrity: sha512-r3n0onD3BTOVUNPhR4lhVK4/pABGpbA7bW3eumZnYdKaHkf1qEC+Mag6DPbGNuuh0eG8AaYj+YqmVHSiGslaTQ==} peerDependencies: '@vue/compiler-sfc': 3.x @@ -719,11 +2356,27 @@ packages: '@babel/types': 7.17.0 javascript-natural-sort: 0.7.1 lodash: 4.17.21 - prettier: 3.0.3 + prettier: 3.1.1 transitivePeerDependencies: - supports-color dev: true + /@tsconfig/node10@1.0.9: + resolution: {integrity: sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==} + dev: true + + /@tsconfig/node12@1.0.11: + resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} + dev: true + + /@tsconfig/node14@1.0.3: + resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} + dev: true + + /@tsconfig/node16@1.0.4: + resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} + dev: true + /@types/argparse@1.0.38: resolution: {integrity: sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA==} dev: false @@ -741,6 +2394,15 @@ packages: '@types/node': 20.10.6 dev: false + /@types/cacheable-request@6.0.3: + resolution: {integrity: sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==} + dependencies: + '@types/http-cache-semantics': 4.0.4 + '@types/keyv': 3.1.4 + '@types/node': 20.10.6 + '@types/responselike': 1.0.3 + dev: true + /@types/connect@3.4.37: resolution: {integrity: sha512-zBUSRqkfZ59OcwXon4HVxhx5oWCJmc0OtBTK05M+p0dYjgN6iTwIL2T/WbsQZrEsdnwaF9cWQ+azOnpPvIqY3Q==} dependencies: @@ -771,10 +2433,42 @@ packages: '@types/serve-static': 1.15.4 dev: false + /@types/http-cache-semantics@4.0.4: + resolution: {integrity: sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==} + dev: true + /@types/http-errors@2.0.3: resolution: {integrity: sha512-pP0P/9BnCj1OVvQR2lF41EkDG/lWWnDyA203b/4Fmi2eTyORnBtcDoKDwjWQthELrBvWkMOrvSOnZ8OVlW6tXA==} dev: false + /@types/js-yaml@4.0.9: + resolution: {integrity: sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg==} + dev: true + + /@types/json-stable-stringify@1.0.36: + resolution: {integrity: sha512-b7bq23s4fgBB76n34m2b3RBf6M369B0Z9uRR8aHTMd8kZISRkmDEpPD8hhpYvDFzr3bJCPES96cm3Q6qRNDbQw==} + dev: true + + /@types/json5@0.0.29: + resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} + dev: true + + /@types/keyv@3.1.4: + resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==} + dependencies: + '@types/node': 20.10.6 + dev: true + + /@types/lodash-es@4.17.12: + resolution: {integrity: sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==} + dependencies: + '@types/lodash': 4.14.202 + dev: true + + /@types/lodash@4.14.202: + resolution: {integrity: sha512-OvlIYQK9tNneDlS0VN54LLd5uiPCBOp7gS5Z0f1mjoJYBrtStzgmJBxONW3U6OZqdtNzZPmn9BS/7WI7BFFcFQ==} + dev: true + /@types/long@4.0.2: resolution: {integrity: sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==} dev: false @@ -794,45 +2488,177 @@ packages: /@types/node-fetch@2.6.8: resolution: {integrity: sha512-nnH5lV9QCMPsbEVdTb5Y+F3GQxLSw1xQgIydrb2gSfEavRPs50FnMr+KUaa+LoPSqibm2N+ZZxH7lavZlAT4GA==} dependencies: - '@types/node': 20.10.6 - form-data: 4.0.0 - dev: false + '@types/node': 20.10.6 + form-data: 4.0.0 + dev: false + + /@types/node@20.10.6: + resolution: {integrity: sha512-Vac8H+NlRNNlAmDfGUP7b5h/KA+AtWIzuXy0E6OyP8f1tCLYAtPvKRRDJjAPqhpCb0t6U2j7/xqAuLEebW2kiw==} + dependencies: + undici-types: 5.26.5 + + /@types/object-path@0.11.4: + resolution: {integrity: sha512-4tgJ1Z3elF/tOMpA8JLVuR9spt9Ynsf7+JjqsQ2IqtiPJtcLoHoXcT6qU4E10cPFqyXX5HDm9QwIzZhBSkLxsw==} + dev: false + + /@types/qs@6.9.9: + resolution: {integrity: sha512-wYLxw35euwqGvTDx6zfY1vokBFnsK0HNrzc6xNHchxfO2hpuRg74GbkEW7e3sSmPvj0TjCDT1VCa6OtHXnubsg==} + dev: false + + /@types/range-parser@1.2.6: + resolution: {integrity: sha512-+0autS93xyXizIYiyL02FCY8N+KkKPhILhcUSA276HxzreZ16kl+cmwvV2qAM/PuCCwPXzOXOWhiPcw20uSFcA==} + dev: false + + /@types/responselike@1.0.3: + resolution: {integrity: sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==} + dependencies: + '@types/node': 20.10.6 + dev: true + + /@types/send@0.17.3: + resolution: {integrity: sha512-/7fKxvKUoETxjFUsuFlPB9YndePpxxRAOfGC/yJdc9kTjTeP5kRCTzfnE8kPUKCeyiyIZu0YQ76s50hCedI1ug==} + dependencies: + '@types/mime': 1.3.4 + '@types/node': 20.10.6 + dev: false + + /@types/serve-static@1.15.4: + resolution: {integrity: sha512-aqqNfs1XTF0HDrFdlY//+SGUxmdSUbjeRXb5iaZc3x0/vMbYmdw9qvOgHWOyyLFxSSRnUuP5+724zBgfw8/WAw==} + dependencies: + '@types/http-errors': 2.0.3 + '@types/mime': 3.0.3 + '@types/node': 20.10.6 + dev: false + + /@types/uuid@9.0.7: + resolution: {integrity: sha512-WUtIVRUZ9i5dYXefDEAI7sh9/O7jGvHg7Df/5O/gtH3Yabe5odI3UWopVR1qbPXQtvOxWu3mM4XxlYeZtMWF4g==} + dev: true + + /@types/validator@13.11.5: + resolution: {integrity: sha512-xW4qsT4UIYILu+7ZrBnfQdBYniZrMLYYK3wN9M/NdeIHgBN5pZI2/8Q7UfdWIcr5RLJv/OGENsx91JIpUUoC7Q==} + dev: false + + /@types/ws@8.5.10: + resolution: {integrity: sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==} + dependencies: + '@types/node': 20.10.6 + dev: true + + /@typescript-eslint/parser@6.18.0(eslint@8.56.0)(typescript@5.3.3): + resolution: {integrity: sha512-v6uR68SFvqhNQT41frCMCQpsP+5vySy6IdgjlzUWoo7ALCnpaWYcz/Ij2k4L8cEsL0wkvOviCMpjmtRtHNOKzA==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/scope-manager': 6.18.0 + '@typescript-eslint/types': 6.18.0 + '@typescript-eslint/typescript-estree': 6.18.0(typescript@5.3.3) + '@typescript-eslint/visitor-keys': 6.18.0 + debug: 4.3.4(supports-color@8.1.1) + eslint: 8.56.0 + typescript: 5.3.3 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/scope-manager@6.18.0: + resolution: {integrity: sha512-o/UoDT2NgOJ2VfHpfr+KBY2ErWvCySNUIX/X7O9g8Zzt/tXdpfEU43qbNk8LVuWUT2E0ptzTWXh79i74PP0twA==} + engines: {node: ^16.0.0 || >=18.0.0} + dependencies: + '@typescript-eslint/types': 6.18.0 + '@typescript-eslint/visitor-keys': 6.18.0 + dev: true + + /@typescript-eslint/types@6.18.0: + resolution: {integrity: sha512-/RFVIccwkwSdW/1zeMx3hADShWbgBxBnV/qSrex6607isYjj05t36P6LyONgqdUrNLl5TYU8NIKdHUYpFvExkA==} + engines: {node: ^16.0.0 || >=18.0.0} + dev: true + + /@typescript-eslint/typescript-estree@6.18.0(typescript@5.3.3): + resolution: {integrity: sha512-klNvl+Ql4NsBNGB4W9TZ2Od03lm7aGvTbs0wYaFYsplVPhr+oeXjlPZCDI4U9jgJIDK38W1FKhacCFzCC+nbIg==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/types': 6.18.0 + '@typescript-eslint/visitor-keys': 6.18.0 + debug: 4.3.4(supports-color@8.1.1) + globby: 11.1.0 + is-glob: 4.0.3 + minimatch: 9.0.3 + semver: 7.5.4 + ts-api-utils: 1.0.3(typescript@5.3.3) + typescript: 5.3.3 + transitivePeerDependencies: + - supports-color + dev: true - /@types/node@20.10.6: - resolution: {integrity: sha512-Vac8H+NlRNNlAmDfGUP7b5h/KA+AtWIzuXy0E6OyP8f1tCLYAtPvKRRDJjAPqhpCb0t6U2j7/xqAuLEebW2kiw==} + /@typescript-eslint/visitor-keys@6.18.0: + resolution: {integrity: sha512-1wetAlSZpewRDb2h9p/Q8kRjdGuqdTAQbkJIOUMLug2LBLG+QOjiWoSj6/3B/hA9/tVTFFdtiKvAYoYnSRW/RA==} + engines: {node: ^16.0.0 || >=18.0.0} dependencies: - undici-types: 5.26.5 + '@typescript-eslint/types': 6.18.0 + eslint-visitor-keys: 3.4.3 + dev: true - /@types/object-path@0.11.4: - resolution: {integrity: sha512-4tgJ1Z3elF/tOMpA8JLVuR9spt9Ynsf7+JjqsQ2IqtiPJtcLoHoXcT6qU4E10cPFqyXX5HDm9QwIzZhBSkLxsw==} - dev: false + /@ungap/structured-clone@1.2.0: + resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} + dev: true - /@types/qs@6.9.9: - resolution: {integrity: sha512-wYLxw35euwqGvTDx6zfY1vokBFnsK0HNrzc6xNHchxfO2hpuRg74GbkEW7e3sSmPvj0TjCDT1VCa6OtHXnubsg==} - dev: false + /@whatwg-node/events@0.0.3: + resolution: {integrity: sha512-IqnKIDWfXBJkvy/k6tzskWTc2NK3LcqHlb+KHGCrjOCH4jfQckRX0NAiIcC/vIqQkzLYw2r2CTSwAxcrtcD6lA==} + dev: true - /@types/range-parser@1.2.6: - resolution: {integrity: sha512-+0autS93xyXizIYiyL02FCY8N+KkKPhILhcUSA276HxzreZ16kl+cmwvV2qAM/PuCCwPXzOXOWhiPcw20uSFcA==} - dev: false + /@whatwg-node/events@0.1.1: + resolution: {integrity: sha512-AyQEn5hIPV7Ze+xFoXVU3QTHXVbWPrzaOkxtENMPMuNL6VVHrp4hHfDt9nrQpjO7BgvuM95dMtkycX5M/DZR3w==} + engines: {node: '>=16.0.0'} + dev: true - /@types/send@0.17.3: - resolution: {integrity: sha512-/7fKxvKUoETxjFUsuFlPB9YndePpxxRAOfGC/yJdc9kTjTeP5kRCTzfnE8kPUKCeyiyIZu0YQ76s50hCedI1ug==} + /@whatwg-node/fetch@0.8.8: + resolution: {integrity: sha512-CdcjGC2vdKhc13KKxgsc6/616BQ7ooDIgPeTuAiE8qfCnS0mGzcfCOoZXypQSz73nxI+GWc7ZReIAVhxoE1KCg==} dependencies: - '@types/mime': 1.3.4 - '@types/node': 20.10.6 - dev: false + '@peculiar/webcrypto': 1.4.3 + '@whatwg-node/node-fetch': 0.3.6 + busboy: 1.6.0 + urlpattern-polyfill: 8.0.2 + web-streams-polyfill: 3.3.2 + dev: true - /@types/serve-static@1.15.4: - resolution: {integrity: sha512-aqqNfs1XTF0HDrFdlY//+SGUxmdSUbjeRXb5iaZc3x0/vMbYmdw9qvOgHWOyyLFxSSRnUuP5+724zBgfw8/WAw==} + /@whatwg-node/fetch@0.9.15: + resolution: {integrity: sha512-2wIUcolUthZt0nsPRj+pT7K9h/EO3t/j09IBuq0FtITCsASc2fRCmRw2JHS6hk9fzUQrz2+YYrA1ZDpV7+vLsQ==} + engines: {node: '>=16.0.0'} dependencies: - '@types/http-errors': 2.0.3 - '@types/mime': 3.0.3 - '@types/node': 20.10.6 - dev: false + '@whatwg-node/node-fetch': 0.5.3 + urlpattern-polyfill: 9.0.0 + dev: true - /@types/validator@13.11.5: - resolution: {integrity: sha512-xW4qsT4UIYILu+7ZrBnfQdBYniZrMLYYK3wN9M/NdeIHgBN5pZI2/8Q7UfdWIcr5RLJv/OGENsx91JIpUUoC7Q==} - dev: false + /@whatwg-node/node-fetch@0.3.6: + resolution: {integrity: sha512-w9wKgDO4C95qnXZRwZTfCmLWqyRnooGjcIwG0wADWjw9/HN0p7dtvtgSvItZtUyNteEvgTrd8QojNEqV6DAGTA==} + dependencies: + '@whatwg-node/events': 0.0.3 + busboy: 1.6.0 + fast-querystring: 1.1.2 + fast-url-parser: 1.1.3 + tslib: 2.6.2 + dev: true + + /@whatwg-node/node-fetch@0.5.3: + resolution: {integrity: sha512-toMC8N53RxgprcuU7Fc05KOrJhZV49njJCHPZvXBsjZMQBKrDm9o14Y56CsrUC85cvjQu862MaYOjd8rKgHdDw==} + engines: {node: '>=16.0.0'} + dependencies: + '@kamilkisiela/fast-url-parser': 1.1.4 + '@whatwg-node/events': 0.1.1 + busboy: 1.6.0 + fast-querystring: 1.1.2 + tslib: 2.6.2 + dev: true /@zxing/text-encoding@0.9.0: resolution: {integrity: sha512-U/4aVJ2mxI0aDNI8Uq0wEhMgY+u4CNtEb0om3+y3+niDAsoTCOB33UF0sxpzqzdqXLqmvc+vZyAt4O8pPdfkwA==} @@ -863,6 +2689,42 @@ packages: negotiator: 0.6.3 dev: false + /acorn-jsx@5.3.2(acorn@8.11.3): + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + acorn: 8.11.3 + dev: true + + /acorn-walk@8.3.1: + resolution: {integrity: sha512-TgUZgYvqZprrl7YldZNoa9OciCAyZR+Ejm9eXzKCmjsF5IKp/wgQ7Z/ZpjpGTIUPwrHQIcYeI8qDh4PsEwxMbw==} + engines: {node: '>=0.4.0'} + dev: true + + /acorn@8.11.3: + resolution: {integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==} + engines: {node: '>=0.4.0'} + hasBin: true + dev: true + + /agent-base@7.1.0: + resolution: {integrity: sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==} + engines: {node: '>= 14'} + dependencies: + debug: 4.3.4(supports-color@8.1.1) + transitivePeerDependencies: + - supports-color + dev: true + + /aggregate-error@3.1.0: + resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} + engines: {node: '>=8'} + dependencies: + clean-stack: 2.2.0 + indent-string: 4.0.0 + dev: true + /ajv-formats@2.1.1(ajv@8.12.0): resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} peerDependencies: @@ -874,6 +2736,15 @@ packages: ajv: 8.12.0 dev: false + /ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + dev: true + /ajv@8.12.0: resolution: {integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==} dependencies: @@ -888,12 +2759,31 @@ packages: engines: {node: '>=6'} dev: true + /ansi-escapes@4.3.2: + resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} + engines: {node: '>=8'} + dependencies: + type-fest: 0.21.3 + dev: true + + /ansi-escapes@6.2.0: + resolution: {integrity: sha512-kzRaCqXnpzWs+3z5ABPQiVke+iq0KXkHo8xiWV4RPTi5Yli0l97BEQuhXV1s7+aSU/fu1kUuxgS4MsQ0fRuygw==} + engines: {node: '>=14.16'} + dependencies: + type-fest: 3.13.1 + dev: true + /ansi-regex@5.0.1: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} requiresBuild: true dev: true + /ansi-regex@6.0.1: + resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} + engines: {node: '>=12'} + dev: true + /ansi-styles@3.2.1: resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} engines: {node: '>=4'} @@ -908,6 +2798,11 @@ packages: color-convert: 2.0.1 dev: true + /ansi-styles@6.2.1: + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + engines: {node: '>=12'} + dev: true + /anymatch@3.1.3: resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} engines: {node: '>= 8'} @@ -916,10 +2811,18 @@ packages: picomatch: 2.3.1 dev: true + /arch@2.2.0: + resolution: {integrity: sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==} + dev: true + /archy@1.0.0: resolution: {integrity: sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==} dev: false + /arg@4.1.3: + resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} + dev: true + /argparse@1.0.10: resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} dependencies: @@ -930,13 +2833,98 @@ packages: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} dev: true + /array-buffer-byte-length@1.0.0: + resolution: {integrity: sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==} + dependencies: + call-bind: 1.0.5 + is-array-buffer: 3.0.2 + dev: true + /array-flatten@1.1.1: resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} dev: false + /array-includes@3.1.7: + resolution: {integrity: sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.5 + define-properties: 1.2.1 + es-abstract: 1.22.3 + get-intrinsic: 1.2.2 + is-string: 1.0.7 + dev: true + + /array-union@2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} + dev: true + + /array.prototype.findlastindex@1.2.3: + resolution: {integrity: sha512-LzLoiOMAxvy+Gd3BAq3B7VeIgPdo+Q8hthvKtXybMvRV0jrXfJM/t8mw7nNlpEcVlVUnCnM2KSX4XU5HmpodOA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.5 + define-properties: 1.2.1 + es-abstract: 1.22.3 + es-shim-unscopables: 1.0.2 + get-intrinsic: 1.2.2 + dev: true + + /array.prototype.flat@1.3.2: + resolution: {integrity: sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.5 + define-properties: 1.2.1 + es-abstract: 1.22.3 + es-shim-unscopables: 1.0.2 + dev: true + + /array.prototype.flatmap@1.3.2: + resolution: {integrity: sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.5 + define-properties: 1.2.1 + es-abstract: 1.22.3 + es-shim-unscopables: 1.0.2 + dev: true + + /arraybuffer.prototype.slice@1.0.2: + resolution: {integrity: sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw==} + engines: {node: '>= 0.4'} + dependencies: + array-buffer-byte-length: 1.0.0 + call-bind: 1.0.5 + define-properties: 1.2.1 + es-abstract: 1.22.3 + get-intrinsic: 1.2.2 + is-array-buffer: 3.0.2 + is-shared-array-buffer: 1.0.2 + dev: true + + /asap@2.0.6: + resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==} + dev: true + + /asn1js@3.0.5: + resolution: {integrity: sha512-FVnvrKJwpt9LP2lAMl8qZswRNm3T4q9CON+bxldk2iwk3FFpuwhx2FfinyitizWHsVYyaY+y5JzDR0rCMV5yTQ==} + engines: {node: '>=12.0.0'} + dependencies: + pvtsutils: 1.3.5 + pvutils: 1.1.3 + tslib: 2.6.2 + dev: true + /assertion-error@1.1.0: resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} + /astral-regex@2.0.0: + resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==} + engines: {node: '>=8'} + dev: true + /async-lock@1.4.0: resolution: {integrity: sha512-coglx5yIWuetakm3/1dsX9hxCNox22h7+V80RQOu2XUUMidtArxKoZoOtHUPuR84SycKTXzgGzAUR5hJxujyJQ==} dev: false @@ -965,10 +2953,14 @@ packages: engines: {node: '>=8.0.0'} dev: false + /auto-bind@4.0.0: + resolution: {integrity: sha512-Hdw8qdNiqdJ8LqT0iK0sVzkFbzg6fhnQqqfWhBDxcHZvU75+B+ayzTy8x+k5Ix0Y92XOhOUlx74ps+bA6BeYMQ==} + engines: {node: '>=8'} + dev: true + /available-typed-arrays@1.0.5: resolution: {integrity: sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==} engines: {node: '>= 0.4'} - dev: false /avvio@8.2.1: resolution: {integrity: sha512-TAlMYvOuwGyLK3PfBb5WKBXZmXz2fVCgv23d6zZFdle/q3gPjmxBaeuC0pY0Dzs5PWMSgfqqEZkrye19GlDTgw==} @@ -990,16 +2982,75 @@ packages: - debug dev: false - /b4a@1.6.4: - resolution: {integrity: sha512-fpWrvyVHEKyeEvbKZTVOeZF3VSKKWtJxFIxX/jaVPf+cLbGUSitjb49pHLqPV2BUNNZ0LcoeEGfE/YCpyDYHIw==} - dev: false + /babel-plugin-syntax-trailing-function-commas@7.0.0-beta.0: + resolution: {integrity: sha512-Xj9XuRuz3nTSbaTXWv3itLOcxyF4oPD8douBBmj7U9BBC6nEBYfyOJYQMf/8PJAFotC62UY5dFfIGEPr7WswzQ==} + dev: true + + /babel-preset-fbjs@3.4.0(@babel/core@7.23.7): + resolution: {integrity: sha512-9ywCsCvo1ojrw0b+XYk7aFvTH6D9064t0RIL1rtMf3nsa02Xw41MS7sZw216Im35xj/UY0PDBQsa1brUDDF1Ow==} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.23.7 + '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.23.7) + '@babel/plugin-proposal-object-rest-spread': 7.20.7(@babel/core@7.23.7) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.23.7) + '@babel/plugin-syntax-flow': 7.23.3(@babel/core@7.23.7) + '@babel/plugin-syntax-jsx': 7.23.3(@babel/core@7.23.7) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.23.7) + '@babel/plugin-transform-arrow-functions': 7.23.3(@babel/core@7.23.7) + '@babel/plugin-transform-block-scoped-functions': 7.23.3(@babel/core@7.23.7) + '@babel/plugin-transform-block-scoping': 7.23.4(@babel/core@7.23.7) + '@babel/plugin-transform-classes': 7.23.5(@babel/core@7.23.7) + '@babel/plugin-transform-computed-properties': 7.23.3(@babel/core@7.23.7) + '@babel/plugin-transform-destructuring': 7.23.3(@babel/core@7.23.7) + '@babel/plugin-transform-flow-strip-types': 7.23.3(@babel/core@7.23.7) + '@babel/plugin-transform-for-of': 7.23.6(@babel/core@7.23.7) + '@babel/plugin-transform-function-name': 7.23.3(@babel/core@7.23.7) + '@babel/plugin-transform-literals': 7.23.3(@babel/core@7.23.7) + '@babel/plugin-transform-member-expression-literals': 7.23.3(@babel/core@7.23.7) + '@babel/plugin-transform-modules-commonjs': 7.23.3(@babel/core@7.23.7) + '@babel/plugin-transform-object-super': 7.23.3(@babel/core@7.23.7) + '@babel/plugin-transform-parameters': 7.23.3(@babel/core@7.23.7) + '@babel/plugin-transform-property-literals': 7.23.3(@babel/core@7.23.7) + '@babel/plugin-transform-react-display-name': 7.23.3(@babel/core@7.23.7) + '@babel/plugin-transform-react-jsx': 7.23.4(@babel/core@7.23.7) + '@babel/plugin-transform-shorthand-properties': 7.23.3(@babel/core@7.23.7) + '@babel/plugin-transform-spread': 7.23.3(@babel/core@7.23.7) + '@babel/plugin-transform-template-literals': 7.23.3(@babel/core@7.23.7) + babel-plugin-syntax-trailing-function-commas: 7.0.0-beta.0 + dev: true /balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} /base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - dev: false + + /bin-check@4.1.0: + resolution: {integrity: sha512-b6weQyEUKsDGFlACWSIOfveEnImkJyK/FGW6FAG42loyoquvjdtOIqO6yBFzHyqyVVhNgNkQxxx09SFLK28YnA==} + engines: {node: '>=4'} + dependencies: + execa: 0.7.0 + executable: 4.1.1 + dev: true + + /bin-version-check@5.1.0: + resolution: {integrity: sha512-bYsvMqJ8yNGILLz1KP9zKLzQ6YpljV3ln1gqhuLkUtyfGi3qXKGuK2p+U4NAvjVFzDFiBBtOpCOSFNuYYEGZ5g==} + engines: {node: '>=12'} + dependencies: + bin-version: 6.0.0 + semver: 7.5.4 + semver-truncate: 3.0.0 + dev: true + + /bin-version@6.0.0: + resolution: {integrity: sha512-nk5wEsP4RiKjG+vF+uG8lFsEn4d7Y6FVDamzzftSunXOoOcOOkzcWdKVlGgFFwlUQCj63SgnUkLLGF8v7lufhw==} + engines: {node: '>=12'} + dependencies: + execa: 5.1.1 + find-versions: 5.1.0 + dev: true /binary-extensions@2.2.0: resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} @@ -1012,7 +3063,7 @@ packages: buffer: 5.7.1 inherits: 2.0.4 readable-stream: 3.6.2 - dev: false + dev: true /block-stream2@2.1.0: resolution: {integrity: sha512-suhjmLI57Ewpmq00qaygS8UgEq2ly2PCItenIyhMqVjo4t4pGzqMvfgJuX8iWTeSDdfSSqS6j38fL4ToNL7Pfg==} @@ -1092,6 +3143,23 @@ packages: resolution: {integrity: sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==} dev: true + /browserslist@4.22.2: + resolution: {integrity: sha512-0UgcrvQmBDvZHFGdYUehrCNIazki7/lUP3kkoi/r3YB2amZbFM9J43ZRkJTXBUZK4gmx56+Sqk9+Vs9mwZx9+A==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + dependencies: + caniuse-lite: 1.0.30001576 + electron-to-chromium: 1.4.623 + node-releases: 2.0.14 + update-browserslist-db: 1.0.13(browserslist@4.22.2) + dev: true + + /bser@2.1.1: + resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} + dependencies: + node-int64: 0.4.0 + dev: true + /buffer-crc32@0.2.13: resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} dev: false @@ -1106,7 +3174,7 @@ packages: dependencies: base64-js: 1.5.1 ieee754: 1.2.1 - dev: false + dev: true /buffer@6.0.3: resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} @@ -1121,33 +3189,77 @@ packages: requiresBuild: true dependencies: node-gyp-build: 4.7.1 - dev: false /busboy@1.6.0: resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} engines: {node: '>=10.16.0'} dependencies: streamsearch: 1.1.0 - dev: false /bytes@3.1.2: resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} engines: {node: '>= 0.8'} dev: false + /cacheable-lookup@5.0.4: + resolution: {integrity: sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==} + engines: {node: '>=10.6.0'} + dev: true + + /cacheable-request@7.0.4: + resolution: {integrity: sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==} + engines: {node: '>=8'} + dependencies: + clone-response: 1.0.3 + get-stream: 5.2.0 + http-cache-semantics: 4.1.1 + keyv: 4.5.4 + lowercase-keys: 2.0.0 + normalize-url: 6.1.0 + responselike: 2.0.1 + dev: true + /call-bind@1.0.5: resolution: {integrity: sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==} dependencies: function-bind: 1.1.2 get-intrinsic: 1.2.2 set-function-length: 1.1.1 - dev: false + + /callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + dev: true + + /camel-case@4.1.2: + resolution: {integrity: sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==} + dependencies: + pascal-case: 3.1.2 + tslib: 2.6.2 + dev: true + + /camelcase@5.3.1: + resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} + engines: {node: '>=6'} + dev: true /camelcase@6.3.0: resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} engines: {node: '>=10'} dev: true + /caniuse-lite@1.0.30001576: + resolution: {integrity: sha512-ff5BdakGe2P3SQsMsiqmt1Lc8221NR1VzHj5jXN5vBny9A6fpze94HiVV/n7XRosOlsShJcvMv5mdnpjOGCEgg==} + dev: true + + /capital-case@1.0.4: + resolution: {integrity: sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A==} + dependencies: + no-case: 3.0.4 + tslib: 2.6.2 + upper-case-first: 2.0.2 + dev: true + /chai@4.3.10: resolution: {integrity: sha512-0UXG04VuVbruMUYbJ6JctvH0YnC/4q3/AkT18q4NaITo91CUm0liMS9VqzT9vZhVQ/1eqPanMWjBM+Juhfb/9g==} engines: {node: '>=4'} @@ -1177,6 +3289,47 @@ packages: supports-color: 7.2.0 dev: true + /chalk@5.3.0: + resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + dev: true + + /change-case-all@1.0.15: + resolution: {integrity: sha512-3+GIFhk3sNuvFAJKU46o26OdzudQlPNBCu1ZQi3cMeMHhty1bhDxu2WrEilVNYaGvqUtR1VSigFcJOiS13dRhQ==} + dependencies: + change-case: 4.1.2 + is-lower-case: 2.0.2 + is-upper-case: 2.0.2 + lower-case: 2.0.2 + lower-case-first: 2.0.2 + sponge-case: 1.0.1 + swap-case: 2.0.2 + title-case: 3.0.3 + upper-case: 2.0.2 + upper-case-first: 2.0.2 + dev: true + + /change-case@4.1.2: + resolution: {integrity: sha512-bSxY2ws9OtviILG1EiY5K7NNxkqg/JnRnFxLtKQ96JaviiIxi7djMrSd0ECT9AC+lttClmYwKw53BWpOMblo7A==} + dependencies: + camel-case: 4.1.2 + capital-case: 1.0.4 + constant-case: 3.0.4 + dot-case: 3.0.4 + header-case: 2.0.4 + no-case: 3.0.4 + param-case: 3.0.4 + pascal-case: 3.1.2 + path-case: 3.0.4 + sentence-case: 3.0.4 + snake-case: 3.0.4 + tslib: 2.6.2 + dev: true + + /chardet@0.7.0: + resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} + dev: true + /check-error@1.0.3: resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} dependencies: @@ -1197,9 +3350,10 @@ packages: fsevents: 2.3.3 dev: true - /chownr@1.1.4: - resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} - dev: false + /clean-stack@2.2.0: + resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} + engines: {node: '>=6'} + dev: true /cli-color@2.0.3: resolution: {integrity: sha512-OkoZnxyC4ERN3zLzZaY9Emb7f/MhBOIpePv0Ycok0fJYT+Ouo00UBEIwsVsr0yoow++n5YWlSUgST9GKhNHiRQ==} @@ -1212,6 +3366,54 @@ packages: timers-ext: 0.1.7 dev: true + /cli-cursor@3.1.0: + resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} + engines: {node: '>=8'} + dependencies: + restore-cursor: 3.1.0 + dev: true + + /cli-cursor@4.0.0: + resolution: {integrity: sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + restore-cursor: 4.0.0 + dev: true + + /cli-spinners@2.9.2: + resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} + engines: {node: '>=6'} + dev: true + + /cli-truncate@2.1.0: + resolution: {integrity: sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==} + engines: {node: '>=8'} + dependencies: + slice-ansi: 3.0.0 + string-width: 4.2.3 + dev: true + + /cli-truncate@4.0.0: + resolution: {integrity: sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==} + engines: {node: '>=18'} + dependencies: + slice-ansi: 5.0.0 + string-width: 7.0.0 + dev: true + + /cli-width@3.0.0: + resolution: {integrity: sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==} + engines: {node: '>= 10'} + dev: true + + /cliui@6.0.0: + resolution: {integrity: sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==} + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 6.2.0 + dev: true + /cliui@7.0.4: resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} dependencies: @@ -1220,6 +3422,31 @@ packages: wrap-ansi: 7.0.0 dev: true + /cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + dev: true + + /clone-response@1.0.3: + resolution: {integrity: sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==} + dependencies: + mimic-response: 1.0.1 + dev: true + + /clone@1.0.4: + resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} + engines: {node: '>=0.8'} + dev: true + + /clone@2.1.2: + resolution: {integrity: sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==} + engines: {node: '>=0.8'} + dev: false + /color-convert@1.9.3: resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} dependencies: @@ -1231,6 +3458,7 @@ packages: engines: {node: '>=7.0.0'} dependencies: color-name: 1.1.4 + dev: true /color-name@1.1.3: resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} @@ -1238,21 +3466,11 @@ packages: /color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + dev: true - /color-string@1.9.1: - resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==} - dependencies: - color-name: 1.1.4 - simple-swizzle: 0.2.2 - dev: false - - /color@4.2.3: - resolution: {integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==} - engines: {node: '>=12.5.0'} - dependencies: - color-convert: 2.0.1 - color-string: 1.9.1 - dev: false + /colorette@2.0.20: + resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} + dev: true /colors@1.2.5: resolution: {integrity: sha512-erNRLao/Y3Fv54qUa0LBB+//Uf3YwMUmdJinN20yMXm9zdKKqH9wt7R9IIVZ+K7ShzfpLV/Zg8+VyrBJYB4lpg==} @@ -1271,6 +3489,21 @@ packages: engines: {node: '>=14'} dev: true + /commander@11.1.0: + resolution: {integrity: sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==} + engines: {node: '>=16'} + dev: true + + /commander@7.2.0: + resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==} + engines: {node: '>= 10'} + dev: true + + /common-tags@1.8.2: + resolution: {integrity: sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==} + engines: {node: '>=4.0.0'} + dev: true + /concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} requiresBuild: true @@ -1283,18 +3516,29 @@ packages: proto-list: 1.2.4 dev: true + /constant-case@3.0.4: + resolution: {integrity: sha512-I2hSBi7Vvs7BEuJDr5dDHfzb/Ruj3FyvFyh7KLilAjNQw3Be+xgqUBA2W6scVEcL0hL1dwPRtIqEPVUCKkSsyQ==} + dependencies: + no-case: 3.0.4 + tslib: 2.6.2 + upper-case: 2.0.2 + dev: true + /content-disposition@0.5.4: resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} engines: {node: '>= 0.6'} dependencies: safe-buffer: 5.2.1 - dev: false /content-type@1.0.5: resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} engines: {node: '>= 0.6'} dev: false + /convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + dev: true + /cookie-signature@1.0.6: resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==} dev: false @@ -1312,12 +3556,56 @@ packages: vary: 1.1.2 dev: false + /cosmiconfig@8.3.6(typescript@5.3.3): + resolution: {integrity: sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==} + engines: {node: '>=14'} + peerDependencies: + typescript: '>=4.9.5' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + import-fresh: 3.3.0 + js-yaml: 4.1.0 + parse-json: 5.2.0 + path-type: 4.0.0 + typescript: 5.3.3 + dev: true + + /create-require@1.1.1: + resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} + dev: true + + /cross-fetch@3.1.8: + resolution: {integrity: sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg==} + dependencies: + node-fetch: 2.7.0 + transitivePeerDependencies: + - encoding + dev: true + /cross-inspect@1.0.0: resolution: {integrity: sha512-4PFfn4b5ZN6FMNGSZlyb7wUhuN8wvj8t/VQHZdM4JsDcruGJ8L2kf9zao98QIrBPFCpdk27qst/AGTl7pL3ypQ==} engines: {node: '>=16.0.0'} dependencies: tslib: 2.6.2 - dev: false + + /cross-spawn@5.1.0: + resolution: {integrity: sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==} + dependencies: + lru-cache: 4.1.5 + shebang-command: 1.2.0 + which: 1.3.1 + dev: true + + /cross-spawn@7.0.3: + resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + engines: {node: '>= 8'} + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + dev: true /d@1.0.1: resolution: {integrity: sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==} @@ -1326,6 +3614,30 @@ packages: type: 1.2.0 dev: true + /dataloader-sequelize@2.3.3(sequelize@6.34.0): + resolution: {integrity: sha512-85C+CtRYFnR5NYlP11392T85xisOpM+N71824B89mX9eVm2rFOnZVkaLj0lF5zEOlgtZIph2XyEDoBDcbVDpig==} + peerDependencies: + sequelize: ^3.24.6 || ^4.0.0 || ^5.0.0 || ^6.0.0 + dependencies: + dataloader: 1.4.0 + lodash: 4.17.21 + lru-cache: 4.1.5 + sequelize: 6.34.0(pg-hstore@2.3.4)(pg@8.11.3) + shimmer: 1.2.1 + dev: false + + /dataloader@1.4.0: + resolution: {integrity: sha512-68s5jYdlvasItOJnCuI2Q9s4q98g0pCyL3HrcKJu8KNugUl8ahgmZYg38ysLTgQjjXX3H8CJLkAvWrclWfcalw==} + dev: false + + /dataloader@2.2.2: + resolution: {integrity: sha512-8YnDaaf7N3k/q5HnTJVuzSyLETjoZjVmHc4AeKAzOvKHEFQKcn64OKBfzHYtE9zGjctNM7V9I0MfnUVLpi7M5g==} + dev: true + + /debounce@1.2.1: + resolution: {integrity: sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==} + dev: true + /debug@2.6.9: resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} peerDependencies: @@ -1337,6 +3649,17 @@ packages: ms: 2.0.0 dev: false + /debug@3.2.7: + resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.3 + dev: true + /debug@4.3.4(supports-color@8.1.1): resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} engines: {node: '>=6.0'} @@ -1349,6 +3672,11 @@ packages: ms: 2.1.2 supports-color: 8.1.1 + /decamelize@1.2.0: + resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} + engines: {node: '>=0.10.0'} + dev: true + /decamelize@4.0.0: resolution: {integrity: sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==} engines: {node: '>=10'} @@ -1364,7 +3692,7 @@ packages: engines: {node: '>=10'} dependencies: mimic-response: 3.1.0 - dev: false + dev: true /deep-eql@4.1.3: resolution: {integrity: sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==} @@ -1372,10 +3700,20 @@ packages: dependencies: type-detect: 4.0.8 - /deep-extend@0.6.0: - resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} - engines: {node: '>=4.0.0'} - dev: false + /deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + dev: true + + /defaults@1.0.4: + resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} + dependencies: + clone: 1.0.4 + dev: true + + /defer-to-connect@2.0.1: + resolution: {integrity: sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==} + engines: {node: '>=10'} + dev: true /define-data-property@1.1.1: resolution: {integrity: sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==} @@ -1384,7 +3722,15 @@ packages: get-intrinsic: 1.2.2 gopd: 1.0.1 has-property-descriptors: 1.0.1 - dev: false + + /define-properties@1.2.1: + resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} + engines: {node: '>= 0.4'} + dependencies: + define-data-property: 1.1.1 + has-property-descriptors: 1.0.1 + object-keys: 1.1.1 + dev: true /delayed-stream@1.0.0: resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} @@ -1396,15 +3742,25 @@ packages: engines: {node: '>= 0.8'} dev: false + /dependency-graph@0.11.0: + resolution: {integrity: sha512-JeMq7fEshyepOWDfcfHK06N3MhyPhz++vtqWhMT5O9A3K42rdsEDpfdVqjaqaAhsw6a+ZqeDvQVtD0hFHQWrzg==} + engines: {node: '>= 0.6.0'} + dev: true + /destroy@1.2.0: resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} dev: false - /detect-libc@2.0.2: - resolution: {integrity: sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==} + /detect-indent@6.1.0: + resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} engines: {node: '>=8'} - dev: false + dev: true + + /diff@4.0.2: + resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} + engines: {node: '>=0.3.1'} + dev: true /diff@5.0.0: resolution: {integrity: sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==} @@ -1415,6 +3771,39 @@ packages: resolution: {integrity: sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==} engines: {node: '>=0.3.1'} + /dir-glob@3.0.1: + resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} + engines: {node: '>=8'} + dependencies: + path-type: 4.0.0 + dev: true + + /doctrine@2.1.0: + resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} + engines: {node: '>=0.10.0'} + dependencies: + esutils: 2.0.3 + dev: true + + /doctrine@3.0.0: + resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} + engines: {node: '>=6.0.0'} + dependencies: + esutils: 2.0.3 + dev: true + + /dot-case@3.0.4: + resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==} + dependencies: + no-case: 3.0.4 + tslib: 2.6.2 + dev: true + + /dotenv@16.3.1: + resolution: {integrity: sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==} + engines: {node: '>=12'} + dev: true + /dottie@2.0.6: resolution: {integrity: sha512-iGCHkfUc5kFekGiqhe8B/mdaurD+lakO9txNnTvKtA6PISrw86LgqHvRzWYPyoE2Ph5aMIrCw9/uko6XHTKCwA==} dev: false @@ -1422,7 +3811,6 @@ packages: /dset@3.1.3: resolution: {integrity: sha512-20TuZZHCEZ2O71q9/+8BwKwZ0QtD9D8ObhrihJPr+vLLYlSuAU3/zL4cSlgbfeoGHTjCSJBa7NGcrF9/Bx/WJQ==} engines: {node: '>=4'} - dev: false /editorconfig@1.0.4: resolution: {integrity: sha512-L9Qe08KWTlqYMVvMcTIvMAdl1cDUubzRNYL+WfA4bLDMHe4nemKkpmYzkznE1FwLKu0EEmy6obgQKzMJrg4x9Q==} @@ -1439,78 +3827,368 @@ packages: resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} dev: false + /electron-to-chromium@1.4.623: + resolution: {integrity: sha512-lKoz10iCYlP1WtRYdh5MvocQPWVRoI7ysp6qf18bmeBgR8abE6+I2CsfyNKztRDZvhdWc+krKT6wS7Neg8sw3A==} + dev: true + /emittery@0.13.1: resolution: {integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==} engines: {node: '>=12'} dev: false + /emoji-regex@10.3.0: + resolution: {integrity: sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==} + dev: true + /emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} requiresBuild: true dev: true - /encodeurl@1.0.2: - resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} - engines: {node: '>= 0.8'} - dev: false + /encodeurl@1.0.2: + resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} + engines: {node: '>= 0.8'} + dev: false + + /end-of-stream@1.4.4: + resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} + dependencies: + once: 1.4.0 + dev: true + + /error-ex@1.3.2: + resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + dependencies: + is-arrayish: 0.2.1 + dev: true + + /es-abstract@1.22.3: + resolution: {integrity: sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA==} + engines: {node: '>= 0.4'} + dependencies: + array-buffer-byte-length: 1.0.0 + arraybuffer.prototype.slice: 1.0.2 + available-typed-arrays: 1.0.5 + call-bind: 1.0.5 + es-set-tostringtag: 2.0.2 + es-to-primitive: 1.2.1 + function.prototype.name: 1.1.6 + get-intrinsic: 1.2.2 + get-symbol-description: 1.0.0 + globalthis: 1.0.3 + gopd: 1.0.1 + has-property-descriptors: 1.0.1 + has-proto: 1.0.1 + has-symbols: 1.0.3 + hasown: 2.0.0 + internal-slot: 1.0.6 + is-array-buffer: 3.0.2 + is-callable: 1.2.7 + is-negative-zero: 2.0.2 + is-regex: 1.1.4 + is-shared-array-buffer: 1.0.2 + is-string: 1.0.7 + is-typed-array: 1.1.12 + is-weakref: 1.0.2 + object-inspect: 1.13.1 + object-keys: 1.1.1 + object.assign: 4.1.5 + regexp.prototype.flags: 1.5.1 + safe-array-concat: 1.0.1 + safe-regex-test: 1.0.0 + string.prototype.trim: 1.2.8 + string.prototype.trimend: 1.0.7 + string.prototype.trimstart: 1.0.7 + typed-array-buffer: 1.0.0 + typed-array-byte-length: 1.0.0 + typed-array-byte-offset: 1.0.0 + typed-array-length: 1.0.4 + unbox-primitive: 1.0.2 + which-typed-array: 1.1.13 + dev: true + + /es-set-tostringtag@2.0.2: + resolution: {integrity: sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q==} + engines: {node: '>= 0.4'} + dependencies: + get-intrinsic: 1.2.2 + has-tostringtag: 1.0.0 + hasown: 2.0.0 + dev: true + + /es-shim-unscopables@1.0.2: + resolution: {integrity: sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==} + dependencies: + hasown: 2.0.0 + dev: true + + /es-to-primitive@1.2.1: + resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} + engines: {node: '>= 0.4'} + dependencies: + is-callable: 1.2.7 + is-date-object: 1.0.5 + is-symbol: 1.0.4 + dev: true + + /es5-ext@0.10.62: + resolution: {integrity: sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA==} + engines: {node: '>=0.10'} + requiresBuild: true + dependencies: + es6-iterator: 2.0.3 + es6-symbol: 3.1.3 + next-tick: 1.1.0 + dev: true + + /es6-iterator@2.0.3: + resolution: {integrity: sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==} + dependencies: + d: 1.0.1 + es5-ext: 0.10.62 + es6-symbol: 3.1.3 + dev: true + + /es6-symbol@3.1.3: + resolution: {integrity: sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==} + dependencies: + d: 1.0.1 + ext: 1.7.0 + dev: true + + /es6-weak-map@2.0.3: + resolution: {integrity: sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==} + dependencies: + d: 1.0.1 + es5-ext: 0.10.62 + es6-iterator: 2.0.3 + es6-symbol: 3.1.3 + dev: true + + /esbuild@0.19.11: + resolution: {integrity: sha512-HJ96Hev2hX/6i5cDVwcqiJBBtuo9+FeIJOtZ9W1kA5M6AMJRHUZlpYZ1/SbEwtO0ioNAW8rUooVpC/WehY2SfA==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + optionalDependencies: + '@esbuild/aix-ppc64': 0.19.11 + '@esbuild/android-arm': 0.19.11 + '@esbuild/android-arm64': 0.19.11 + '@esbuild/android-x64': 0.19.11 + '@esbuild/darwin-arm64': 0.19.11 + '@esbuild/darwin-x64': 0.19.11 + '@esbuild/freebsd-arm64': 0.19.11 + '@esbuild/freebsd-x64': 0.19.11 + '@esbuild/linux-arm': 0.19.11 + '@esbuild/linux-arm64': 0.19.11 + '@esbuild/linux-ia32': 0.19.11 + '@esbuild/linux-loong64': 0.19.11 + '@esbuild/linux-mips64el': 0.19.11 + '@esbuild/linux-ppc64': 0.19.11 + '@esbuild/linux-riscv64': 0.19.11 + '@esbuild/linux-s390x': 0.19.11 + '@esbuild/linux-x64': 0.19.11 + '@esbuild/netbsd-x64': 0.19.11 + '@esbuild/openbsd-x64': 0.19.11 + '@esbuild/sunos-x64': 0.19.11 + '@esbuild/win32-arm64': 0.19.11 + '@esbuild/win32-ia32': 0.19.11 + '@esbuild/win32-x64': 0.19.11 + dev: true + + /escalade@3.1.1: + resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} + engines: {node: '>=6'} + dev: true + + /escape-html@1.0.3: + resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + dev: false + + /escape-string-regexp@1.0.5: + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: '>=0.8.0'} + dev: true + + /escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + dev: true + + /escape-string-regexp@5.0.0: + resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} + engines: {node: '>=12'} + dev: true + + /eslint-import-resolver-node@0.3.9: + resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} + dependencies: + debug: 3.2.7 + is-core-module: 2.13.1 + resolve: 1.22.8 + transitivePeerDependencies: + - supports-color + dev: true + + /eslint-module-utils@2.8.0(@typescript-eslint/parser@6.18.0)(eslint-import-resolver-node@0.3.9)(eslint@8.56.0): + resolution: {integrity: sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: '*' + eslint-import-resolver-node: '*' + eslint-import-resolver-typescript: '*' + eslint-import-resolver-webpack: '*' + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + eslint: + optional: true + eslint-import-resolver-node: + optional: true + eslint-import-resolver-typescript: + optional: true + eslint-import-resolver-webpack: + optional: true + dependencies: + '@typescript-eslint/parser': 6.18.0(eslint@8.56.0)(typescript@5.3.3) + debug: 3.2.7 + eslint: 8.56.0 + eslint-import-resolver-node: 0.3.9 + transitivePeerDependencies: + - supports-color + dev: true + + /eslint-plugin-import@2.29.1(@typescript-eslint/parser@6.18.0)(eslint@8.56.0): + resolution: {integrity: sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + dependencies: + '@typescript-eslint/parser': 6.18.0(eslint@8.56.0)(typescript@5.3.3) + array-includes: 3.1.7 + array.prototype.findlastindex: 1.2.3 + array.prototype.flat: 1.3.2 + array.prototype.flatmap: 1.3.2 + debug: 3.2.7 + doctrine: 2.1.0 + eslint: 8.56.0 + eslint-import-resolver-node: 0.3.9 + eslint-module-utils: 2.8.0(@typescript-eslint/parser@6.18.0)(eslint-import-resolver-node@0.3.9)(eslint@8.56.0) + hasown: 2.0.0 + is-core-module: 2.13.1 + is-glob: 4.0.3 + minimatch: 3.1.2 + object.fromentries: 2.0.7 + object.groupby: 1.0.1 + object.values: 1.1.7 + semver: 6.3.1 + tsconfig-paths: 3.15.0 + transitivePeerDependencies: + - eslint-import-resolver-typescript + - eslint-import-resolver-webpack + - supports-color + dev: true + + /eslint-plugin-oxlint@0.1.0: + resolution: {integrity: sha512-ahaoMp02ZDf8Z6h9lDmTPD/JFyKsHOJc98R2xTnTucTTA12TAqcp3jg+VbBFUw1UsdQkjMVyFabQbGADaCssPA==} + dev: true - /end-of-stream@1.4.4: - resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} + /eslint-scope@7.2.2: + resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: - once: 1.4.0 - dev: false + esrecurse: 4.3.0 + estraverse: 5.3.0 + dev: true - /es5-ext@0.10.62: - resolution: {integrity: sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA==} - engines: {node: '>=0.10'} - requiresBuild: true - dependencies: - es6-iterator: 2.0.3 - es6-symbol: 3.1.3 - next-tick: 1.1.0 + /eslint-visitor-keys@3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true - /es6-iterator@2.0.3: - resolution: {integrity: sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==} + /eslint@8.56.0: + resolution: {integrity: sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + hasBin: true dependencies: - d: 1.0.1 - es5-ext: 0.10.62 - es6-symbol: 3.1.3 + '@eslint-community/eslint-utils': 4.4.0(eslint@8.56.0) + '@eslint-community/regexpp': 4.10.0 + '@eslint/eslintrc': 2.1.4 + '@eslint/js': 8.56.0 + '@humanwhocodes/config-array': 0.11.13 + '@humanwhocodes/module-importer': 1.0.1 + '@nodelib/fs.walk': 1.2.8 + '@ungap/structured-clone': 1.2.0 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.3 + debug: 4.3.4(supports-color@8.1.1) + doctrine: 3.0.0 + escape-string-regexp: 4.0.0 + eslint-scope: 7.2.2 + eslint-visitor-keys: 3.4.3 + espree: 9.6.1 + esquery: 1.5.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 6.0.1 + find-up: 5.0.0 + glob-parent: 6.0.2 + globals: 13.24.0 + graphemer: 1.4.0 + ignore: 5.3.0 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + is-path-inside: 3.0.3 + js-yaml: 4.1.0 + json-stable-stringify-without-jsonify: 1.0.1 + levn: 0.4.1 + lodash.merge: 4.6.2 + minimatch: 3.1.2 + natural-compare: 1.4.0 + optionator: 0.9.3 + strip-ansi: 6.0.1 + text-table: 0.2.0 + transitivePeerDependencies: + - supports-color dev: true - /es6-symbol@3.1.3: - resolution: {integrity: sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==} + /espree@9.6.1: + resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: - d: 1.0.1 - ext: 1.7.0 + acorn: 8.11.3 + acorn-jsx: 5.3.2(acorn@8.11.3) + eslint-visitor-keys: 3.4.3 dev: true - /es6-weak-map@2.0.3: - resolution: {integrity: sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==} + /esquery@1.5.0: + resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} + engines: {node: '>=0.10'} dependencies: - d: 1.0.1 - es5-ext: 0.10.62 - es6-iterator: 2.0.3 - es6-symbol: 3.1.3 + estraverse: 5.3.0 dev: true - /escalade@3.1.1: - resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} - engines: {node: '>=6'} + /esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + dependencies: + estraverse: 5.3.0 dev: true - /escape-html@1.0.3: - resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} - dev: false - - /escape-string-regexp@1.0.5: - resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} - engines: {node: '>=0.8.0'} + /estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} dev: true - /escape-string-regexp@4.0.0: - resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} - engines: {node: '>=10'} + /esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} dev: true /etag@1.8.1: @@ -1530,15 +4208,64 @@ packages: engines: {node: '>=6'} dev: false + /eventemitter3@5.0.1: + resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} + dev: true + /events@3.3.0: resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} engines: {node: '>=0.8.x'} dev: false - /expand-template@2.0.3: - resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==} - engines: {node: '>=6'} - dev: false + /execa@0.7.0: + resolution: {integrity: sha512-RztN09XglpYI7aBBrJCPW95jEH7YF1UEPOoX9yDhUTPdp7mK+CQvnLTuD10BNXZ3byLTu2uehZ8EcKT/4CGiFw==} + engines: {node: '>=4'} + dependencies: + cross-spawn: 5.1.0 + get-stream: 3.0.0 + is-stream: 1.1.0 + npm-run-path: 2.0.2 + p-finally: 1.0.0 + signal-exit: 3.0.7 + strip-eof: 1.0.0 + dev: true + + /execa@5.1.1: + resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} + engines: {node: '>=10'} + dependencies: + cross-spawn: 7.0.3 + get-stream: 6.0.1 + human-signals: 2.1.0 + is-stream: 2.0.1 + merge-stream: 2.0.0 + npm-run-path: 4.0.1 + onetime: 5.1.2 + signal-exit: 3.0.7 + strip-final-newline: 2.0.0 + dev: true + + /execa@8.0.1: + resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} + engines: {node: '>=16.17'} + dependencies: + cross-spawn: 7.0.3 + get-stream: 8.0.1 + human-signals: 5.0.0 + is-stream: 3.0.0 + merge-stream: 2.0.0 + npm-run-path: 5.2.0 + onetime: 6.0.0 + signal-exit: 4.1.0 + strip-final-newline: 3.0.0 + dev: true + + /executable@4.1.1: + resolution: {integrity: sha512-8iA79xD3uAch729dUG8xaaBBFGaEa0wdD2VkYLFHwlqosEj/jT66AzcreRDSgV7ehnNLBW2WR5jIXwGKjVdTLg==} + engines: {node: '>=4'} + dependencies: + pify: 2.3.0 + dev: true /express@4.18.2: resolution: {integrity: sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==} @@ -1579,27 +4306,65 @@ packages: - supports-color dev: false + /ext-list@2.2.2: + resolution: {integrity: sha512-u+SQgsubraE6zItfVA0tBuCBhfU9ogSRnsvygI7wht9TS510oLkBRXBsqopeUG/GBOIQyKZO9wjTqIu/sf5zFA==} + engines: {node: '>=0.10.0'} + dependencies: + mime-db: 1.52.0 + dev: true + + /ext-name@5.0.0: + resolution: {integrity: sha512-yblEwXAbGv1VQDmow7s38W77hzAgJAO50ztBLMcUyUBfxv1HC+LGwtiEN+Co6LtlqT/5uwVOxsD4TNIilWhwdQ==} + engines: {node: '>=4'} + dependencies: + ext-list: 2.2.2 + sort-keys-length: 1.0.1 + dev: true + /ext@1.7.0: resolution: {integrity: sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==} dependencies: type: 2.7.2 dev: true + /external-editor@3.1.0: + resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} + engines: {node: '>=4'} + dependencies: + chardet: 0.7.0 + iconv-lite: 0.4.24 + tmp: 0.0.33 + dev: true + + /extract-files@11.0.0: + resolution: {integrity: sha512-FuoE1qtbJ4bBVvv94CC7s0oTnKUGvQs+Rjf1L2SJFfS+HTVVjhPFtehPdQ0JiGPqVNfSSZvL5yzHHQq2Z4WNhQ==} + engines: {node: ^12.20 || >= 14.13} + dev: true + /fast-content-type-parse@1.1.0: resolution: {integrity: sha512-fBHHqSTFLVnR61C+gltJuE5GkVQMV0S2nqUO8TJ+5Z3qAKG8vAx4FKai1s5jq/inV1+sREynIWSuQ6HgoSXpDQ==} dev: false /fast-decode-uri-component@1.0.1: resolution: {integrity: sha512-WKgKWg5eUxvRZGwW8FvfbaH7AXSh2cL+3j5fMGzUMCxWBJ3dV3a7Wz8y2f/uQ0e3B6WmodD3oS54jTQ9HVTIIg==} - dev: false /fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} - dev: false - /fast-fifo@1.3.2: - resolution: {integrity: sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==} - dev: false + /fast-glob@3.3.2: + resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} + engines: {node: '>=8.6.0'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.5 + dev: true + + /fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + dev: true /fast-json-stringify@5.9.1: resolution: {integrity: sha512-NMrf+uU9UJnTzfxaumMDXK1NWqtPCfGoM9DYIE+ESlaTQqjlANFBy0VAbsm6FB88Mx0nceyi18zTo5kIEUlzxg==} @@ -1613,11 +4378,14 @@ packages: rfdc: 1.3.0 dev: false + /fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + dev: true + /fast-querystring@1.1.2: resolution: {integrity: sha512-g6KuKWmFXc0fID8WWH0jit4g0AGBoJhCkJMb1RmbsSEUNvQ+ZC8D6CUZ+GtF8nMzSPXnhiePyyqqipzNNEnHjg==} dependencies: fast-decode-uri-component: 1.0.1 - dev: false /fast-redact@3.3.0: resolution: {integrity: sha512-6T5V1QK1u4oF+ATxs1lWUmlEk6P2T9HqJG3e2DnHOdVgZy2rFJBoEnrIedcTXlkAHU/zKC+7KETJ+KGGKwxgMQ==} @@ -1628,6 +4396,12 @@ packages: resolution: {integrity: sha512-eel5UKGn369gGEWOqBShmFJWfq/xSJvsgDzgLYC845GneayWvXBf0lJCBn5qTABfewy1ZDPoaR5OZCP+kssfuw==} dev: false + /fast-url-parser@1.1.3: + resolution: {integrity: sha512-5jOCVXADYNuRkKFzNJ0dCCewsZiYo0dz8QNYljkOpFC6r2U4OBmKtvm/Tsuh4w1YYdDqDb31a8TVhBJ2OJKdqQ==} + dependencies: + punycode: 1.4.1 + dev: true + /fast-xml-parser@4.2.5: resolution: {integrity: sha512-B9/wizE4WngqQftFPmdaMYlXoJlJOYxGQOanC77fq9k8+Z0v5dDSVh+3glErdIROP//s/jgb7ZuxKfB8nVyo0g==} hasBin: true @@ -1647,8 +4421,8 @@ packages: resolution: {integrity: sha512-stRHYGeuqpEZTL1Ef0Ovr2ltazUT9g844X5z/zEBFLG8RYlpDiOCIG+ATvYEp+/zmc7sN29mcIMp8gvYplYPIQ==} dev: false - /fastify@4.24.3: - resolution: {integrity: sha512-6HHJ+R2x2LS3y1PqxnwEIjOTZxFl+8h4kSC/TuDPXtA+v2JnV9yEtOsNSKK1RMD7sIR2y1ZsA4BEFaid/cK5pg==} + /fastify@4.25.2: + resolution: {integrity: sha512-SywRouGleDHvRh054onj+lEZnbC1sBCLkR0UY3oyJwjD4BdZJUrxBqfkfCaqn74pVCwBaRHGuL3nEWeHbHzAfw==} dependencies: '@fastify/ajv-compiler': 3.5.0 '@fastify/error': 3.4.1 @@ -1659,8 +4433,8 @@ packages: fast-json-stringify: 5.9.1 find-my-way: 7.7.0 light-my-request: 5.11.0 - pino: 8.16.1 - process-warning: 2.3.0 + pino: 8.17.2 + process-warning: 3.0.0 proxy-addr: 2.0.7 rfdc: 1.3.0 secure-json-parse: 2.7.0 @@ -1681,7 +4455,67 @@ packages: resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} dependencies: reusify: 1.0.4 - dev: false + + /fb-watchman@2.0.2: + resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==} + dependencies: + bser: 2.1.1 + dev: true + + /fbjs-css-vars@1.0.2: + resolution: {integrity: sha512-b2XGFAFdWZWg0phtAWLHCk836A1Xann+I+Dgd3Gk64MHKZO44FfoD1KxyvbSh0qZsIoXQGGlVztIY+oitJPpRQ==} + dev: true + + /fbjs@3.0.5: + resolution: {integrity: sha512-ztsSx77JBtkuMrEypfhgc3cI0+0h+svqeie7xHbh1k/IKdcydnvadp/mUaGgjAOXQmQSxsqgaRhS3q9fy+1kxg==} + dependencies: + cross-fetch: 3.1.8 + fbjs-css-vars: 1.0.2 + loose-envify: 1.4.0 + object-assign: 4.1.1 + promise: 7.3.1 + setimmediate: 1.0.5 + ua-parser-js: 1.0.37 + transitivePeerDependencies: + - encoding + dev: true + + /figures@3.2.0: + resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==} + engines: {node: '>=8'} + dependencies: + escape-string-regexp: 1.0.5 + dev: true + + /file-entry-cache@6.0.1: + resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} + engines: {node: ^10.12.0 || >=12.0.0} + dependencies: + flat-cache: 3.2.0 + dev: true + + /file-type@17.1.6: + resolution: {integrity: sha512-hlDw5Ev+9e883s0pwUsuuYNu4tD7GgpUnOvykjv1Gya0ZIjuKumthDRua90VUn6/nlRKAjcxLUnHNTIUWwWIiw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + readable-web-to-node-stream: 3.0.2 + strtok3: 7.0.0 + token-types: 5.0.1 + dev: true + + /filename-reserved-regex@3.0.0: + resolution: {integrity: sha512-hn4cQfU6GOT/7cFHXBqeBg2TbrMBgdD0kcjLhvSQYYwm3s4B6cjvBfb7nBALJLAXqmU5xajSa7X2NnUud/VCdw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dev: true + + /filenamify@5.1.1: + resolution: {integrity: sha512-M45CbrJLGACfrPOkrTp3j2EcO9OBkKUYME0eiqOCa7i2poaklU0jhlIaMlr8ijLorT0uLAzrn3qXOp5684CkfA==} + engines: {node: '>=12.20'} + dependencies: + filename-reserved-regex: 3.0.0 + strip-outer: 2.0.0 + trim-repeated: 2.0.0 + dev: true /fill-keys@1.0.2: resolution: {integrity: sha512-tcgI872xXjwFF4xgQmLxi76GnwJG3g/3isB1l4/G5Z4zrbddGpBjqZCO9oEAcB5wX0Hj/5iQB3toxfO7in1hHA==} @@ -1727,6 +4561,14 @@ packages: safe-regex2: 2.0.0 dev: false + /find-up@4.1.0: + resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} + engines: {node: '>=8'} + dependencies: + locate-path: 5.0.0 + path-exists: 4.0.0 + dev: true + /find-up@5.0.0: resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} engines: {node: '>=10'} @@ -1735,11 +4577,31 @@ packages: path-exists: 4.0.0 dev: true + /find-versions@5.1.0: + resolution: {integrity: sha512-+iwzCJ7C5v5KgcBuueqVoNiHVoQpwiUK5XFLjf0affFTep+Wcw93tPvmb8tqujDNmzhBDPddnWV/qgWSXgq+Hg==} + engines: {node: '>=12'} + dependencies: + semver-regex: 4.0.5 + dev: true + + /flat-cache@3.2.0: + resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} + engines: {node: ^10.12.0 || >=12.0.0} + dependencies: + flatted: 3.2.9 + keyv: 4.5.4 + rimraf: 3.0.2 + dev: true + /flat@5.0.2: resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} hasBin: true dev: true + /flatted@3.2.9: + resolution: {integrity: sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==} + dev: true + /follow-redirects@1.15.3: resolution: {integrity: sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q==} engines: {node: '>=4.0'} @@ -1754,7 +4616,6 @@ packages: resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} dependencies: is-callable: 1.2.7 - dev: false /form-data@4.0.0: resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} @@ -1780,10 +4641,6 @@ packages: engines: {node: ^14.17.0 || >=16.0.0} dev: false - /fs-constants@1.0.0: - resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} - dev: false - /fs-extra@9.1.0: resolution: {integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==} engines: {node: '>=10'} @@ -1808,11 +4665,35 @@ packages: /function-bind@1.1.2: resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + /function.prototype.name@1.1.6: + resolution: {integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.5 + define-properties: 1.2.1 + es-abstract: 1.22.3 + functions-have-names: 1.2.3 + dev: true + + /functions-have-names@1.2.3: + resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} + dev: true + + /gensync@1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + dev: true + /get-caller-file@2.0.5: resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} engines: {node: 6.* || 8.* || >= 10.*} dev: true + /get-east-asian-width@1.2.0: + resolution: {integrity: sha512-2nk+7SIVb14QrgXFHcm84tD4bKQz0RxPuMT8Ag5KPOq7J5fEmAg0UbXdTOSHqNuHSU28k55qnceesxXRZGzKWA==} + engines: {node: '>=18'} + dev: true + /get-func-name@2.0.2: resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} @@ -1823,11 +4704,42 @@ packages: has-proto: 1.0.1 has-symbols: 1.0.3 hasown: 2.0.0 - dev: false - /github-from-package@0.0.0: - resolution: {integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==} - dev: false + /get-stream@3.0.0: + resolution: {integrity: sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ==} + engines: {node: '>=4'} + dev: true + + /get-stream@5.2.0: + resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} + engines: {node: '>=8'} + dependencies: + pump: 3.0.0 + dev: true + + /get-stream@6.0.1: + resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} + engines: {node: '>=10'} + dev: true + + /get-stream@8.0.1: + resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} + engines: {node: '>=16'} + dev: true + + /get-symbol-description@1.0.0: + resolution: {integrity: sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.5 + get-intrinsic: 1.2.2 + dev: true + + /get-tsconfig@4.7.2: + resolution: {integrity: sha512-wuMsz4leaj5hbGgg4IvDU0bqJagpftG5l5cXIAvo8uZrqn0NJqwtfupTN00VnkQJPcIRrxYrm1Ue24btpCha2A==} + dependencies: + resolve-pkg-maps: 1.0.0 + dev: true /glob-parent@5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} @@ -1836,6 +4748,13 @@ packages: is-glob: 4.0.3 dev: true + /glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + dependencies: + is-glob: 4.0.3 + dev: true + /glob@7.2.0: resolution: {integrity: sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==} dependencies: @@ -1862,16 +4781,114 @@ packages: engines: {node: '>=4'} dev: true + /globals@13.24.0: + resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} + engines: {node: '>=8'} + dependencies: + type-fest: 0.20.2 + dev: true + + /globalthis@1.0.3: + resolution: {integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==} + engines: {node: '>= 0.4'} + dependencies: + define-properties: 1.2.1 + dev: true + + /globby@11.1.0: + resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} + engines: {node: '>=10'} + dependencies: + array-union: 2.1.0 + dir-glob: 3.0.1 + fast-glob: 3.3.2 + ignore: 5.3.0 + merge2: 1.4.1 + slash: 3.0.0 + dev: true + /gopd@1.0.1: resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} dependencies: get-intrinsic: 1.2.2 - dev: false + + /got@11.8.6: + resolution: {integrity: sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==} + engines: {node: '>=10.19.0'} + dependencies: + '@sindresorhus/is': 4.6.0 + '@szmarczak/http-timer': 4.0.6 + '@types/cacheable-request': 6.0.3 + '@types/responselike': 1.0.3 + cacheable-lookup: 5.0.4 + cacheable-request: 7.0.4 + decompress-response: 6.0.0 + http2-wrapper: 1.0.3 + lowercase-keys: 2.0.0 + p-cancelable: 2.1.1 + responselike: 2.0.1 + dev: true /graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} dev: true + /graphemer@1.4.0: + resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + dev: true + + /graphql-config@5.0.3(@types/node@20.10.6)(bufferutil@4.0.8)(graphql@16.8.1)(typescript@5.3.3)(utf-8-validate@6.0.3): + resolution: {integrity: sha512-BNGZaoxIBkv9yy6Y7omvsaBUHOzfFcII3UN++tpH8MGOKFPFkCPZuwx09ggANMt8FgyWP1Od8SWPmrUEZca4NQ==} + engines: {node: '>= 16.0.0'} + peerDependencies: + cosmiconfig-toml-loader: ^1.0.0 + graphql: ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 + peerDependenciesMeta: + cosmiconfig-toml-loader: + optional: true + dependencies: + '@graphql-tools/graphql-file-loader': 8.0.0(graphql@16.8.1) + '@graphql-tools/json-file-loader': 8.0.0(graphql@16.8.1) + '@graphql-tools/load': 8.0.1(graphql@16.8.1) + '@graphql-tools/merge': 9.0.1(graphql@16.8.1) + '@graphql-tools/url-loader': 8.0.1(@types/node@20.10.6)(bufferutil@4.0.8)(graphql@16.8.1)(utf-8-validate@6.0.3) + '@graphql-tools/utils': 10.0.12(graphql@16.8.1) + cosmiconfig: 8.3.6(typescript@5.3.3) + graphql: 16.8.1 + jiti: 1.21.0 + minimatch: 4.2.3 + string-env-interpolation: 1.0.1 + tslib: 2.6.2 + transitivePeerDependencies: + - '@types/node' + - bufferutil + - encoding + - typescript + - utf-8-validate + dev: true + + /graphql-request@6.1.0(graphql@16.8.1): + resolution: {integrity: sha512-p+XPfS4q7aIpKVcgmnZKhMNqhltk20hfXtkaIkTfjjmiKMJ5xrt5c743cL03y/K7y1rg3WrIC49xGiEQ4mxdNw==} + peerDependencies: + graphql: 14 - 16 + dependencies: + '@graphql-typed-document-node/core': 3.2.0(graphql@16.8.1) + cross-fetch: 3.1.8 + graphql: 16.8.1 + transitivePeerDependencies: + - encoding + dev: true + + /graphql-scalars@1.22.4(graphql@16.8.1): + resolution: {integrity: sha512-ILnv7jq5VKHLUyoaTFX7lgYrjCd6vTee9i8/B+D4zJKJT5TguOl0KkpPEbXHjmeor8AZYrVsrYUHdqRBMX1pjA==} + engines: {node: '>=10'} + peerDependencies: + graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 + dependencies: + graphql: 16.8.1 + tslib: 2.6.2 + dev: false + /graphql-tag@2.12.6(graphql@16.8.1): resolution: {integrity: sha512-FdSNcu2QQcWnM2VNvSCCDCVS5PpPqpzgFT8+GXzqJuoDd0CBncxCY278u4mhRO7tMgo2JjgJA5aZ+nWSQ/Z+xg==} engines: {node: '>=10'} @@ -1880,7 +4897,6 @@ packages: dependencies: graphql: 16.8.1 tslib: 2.6.2 - dev: false /graphql-upload@16.0.2(graphql@16.8.1): resolution: {integrity: sha512-enwIkZqUELdNH9lrjHlTNfj7gLitSa0EAX4TNXZtg2frnmQzPhpjH0l+6K7ft274fhoRCIcz8SKiNRJDf/cG4Q==} @@ -1905,10 +4921,22 @@ packages: object-path: 0.11.8 dev: false + /graphql-ws@5.14.3(graphql@16.8.1): + resolution: {integrity: sha512-F/i2xNIVbaEF2xWggID0X/UZQa2V8kqKDPO8hwmu53bVOcTL7uNkxnexeEgSCVxYBQUTUNEI8+e4LO1FOhKPKQ==} + engines: {node: '>=10'} + peerDependencies: + graphql: '>=0.11 <=16' + dependencies: + graphql: 16.8.1 + dev: true + /graphql@16.8.1: resolution: {integrity: sha512-59LZHPdGZVh695Ud9lRzPBVTtlX9ZCV150Er2W43ro37wVof0ctenSaskPPjN7lVTIN8mSZt8PHUNKZuNQUuxw==} engines: {node: ^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0} - dev: false + + /has-bigints@1.0.2: + resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} + dev: true /has-flag@3.0.0: resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} @@ -1923,24 +4951,20 @@ packages: resolution: {integrity: sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==} dependencies: get-intrinsic: 1.2.2 - dev: false /has-proto@1.0.1: resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==} engines: {node: '>= 0.4'} - dev: false /has-symbols@1.0.3: resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} engines: {node: '>= 0.4'} - dev: false /has-tostringtag@1.0.0: resolution: {integrity: sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==} engines: {node: '>= 0.4'} dependencies: has-symbols: 1.0.3 - dev: false /hasown@2.0.0: resolution: {integrity: sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==} @@ -1953,6 +4977,17 @@ packages: hasBin: true dev: true + /header-case@2.0.4: + resolution: {integrity: sha512-H/vuk5TEEVZwrR0lp2zed9OCo1uAILMlx0JEMgC26rzyJJ3N1v6XkwHHXJQdR2doSjcGPM6OKPYoJgf0plJ11Q==} + dependencies: + capital-case: 1.0.4 + tslib: 2.6.2 + dev: true + + /http-cache-semantics@4.1.1: + resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} + dev: true + /http-errors@2.0.0: resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} engines: {node: '>= 0.8'} @@ -1964,16 +4999,91 @@ packages: toidentifier: 1.0.1 dev: false + /http-proxy-agent@7.0.0: + resolution: {integrity: sha512-+ZT+iBxVUQ1asugqnD6oWoRiS25AkjNfG085dKJGtGxkdwLQrMKU5wJr2bOOFAXzKcTuqq+7fZlTMgG3SRfIYQ==} + engines: {node: '>= 14'} + dependencies: + agent-base: 7.1.0 + debug: 4.3.4(supports-color@8.1.1) + transitivePeerDependencies: + - supports-color + dev: true + + /http2-wrapper@1.0.3: + resolution: {integrity: sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==} + engines: {node: '>=10.19.0'} + dependencies: + quick-lru: 5.1.1 + resolve-alpn: 1.2.1 + dev: true + + /https-proxy-agent@7.0.2: + resolution: {integrity: sha512-NmLNjm6ucYwtcUmL7JQC1ZQ57LmHP4lT15FQ8D61nak1rO6DH+fz5qNK2Ap5UN4ZapYICE3/0KodcLYSPsPbaA==} + engines: {node: '>= 14'} + dependencies: + agent-base: 7.1.0 + debug: 4.3.4(supports-color@8.1.1) + transitivePeerDependencies: + - supports-color + dev: true + + /human-signals@2.1.0: + resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} + engines: {node: '>=10.17.0'} + dev: true + + /human-signals@5.0.0: + resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} + engines: {node: '>=16.17.0'} + dev: true + + /husky@8.0.3: + resolution: {integrity: sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg==} + engines: {node: '>=14'} + hasBin: true + dev: true + /iconv-lite@0.4.24: resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} engines: {node: '>=0.10.0'} dependencies: safer-buffer: 2.1.2 - dev: false /ieee754@1.2.1: resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} - dev: false + + /ignore@5.3.0: + resolution: {integrity: sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==} + engines: {node: '>= 4'} + dev: true + + /immutable@3.7.6: + resolution: {integrity: sha512-AizQPcaofEtO11RZhPPHBOJRdo/20MKQF9mBLnVkBoyHi1/zXK8fzVdnEpSV9gxqtnh6Qomfp3F0xT5qP/vThw==} + engines: {node: '>=0.8.0'} + dev: true + + /import-fresh@3.3.0: + resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} + engines: {node: '>=6'} + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + dev: true + + /import-from@4.0.0: + resolution: {integrity: sha512-P9J71vT5nLlDeV8FHs5nNxaLbrpfAV5cF5srvbZfpwpcJoM/xZR3hiv+q+SAnuSmuGbXMWud063iIMx/V/EWZQ==} + engines: {node: '>=12.2'} + dev: true + + /imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + dev: true + + /indent-string@4.0.0: + resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} + engines: {node: '>=8'} + dev: true /inflection@1.13.4: resolution: {integrity: sha512-6I/HUDeYFfuNCVS3td055BaXBwKYuzw7K3ExVMStBowKo9oOAMJIXIHvdyR3iboTCp1b+1i5DSkIZTcwIktuDw==} @@ -1991,6 +5101,43 @@ packages: /ini@1.3.8: resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + dev: true + + /inquirer@8.2.6: + resolution: {integrity: sha512-M1WuAmb7pn9zdFRtQYk26ZBoY043Sse0wVDdk4Bppr+JOXyQYybdtvK+l9wUibhtjdjvtoiNy8tk+EgsYIUqKg==} + engines: {node: '>=12.0.0'} + dependencies: + ansi-escapes: 4.3.2 + chalk: 4.1.2 + cli-cursor: 3.1.0 + cli-width: 3.0.0 + external-editor: 3.1.0 + figures: 3.2.0 + lodash: 4.17.21 + mute-stream: 0.0.8 + ora: 5.4.1 + run-async: 2.4.1 + rxjs: 7.8.1 + string-width: 4.2.3 + strip-ansi: 6.0.1 + through: 2.3.8 + wrap-ansi: 6.2.0 + dev: true + + /internal-slot@1.0.6: + resolution: {integrity: sha512-Xj6dv+PsbtwyPpEflsejS+oIZxmMlV44zAhG479uYu89MsjcYOhCFnNyKrkJrihbsiasQyY0afoCl/9BLR65bg==} + engines: {node: '>= 0.4'} + dependencies: + get-intrinsic: 1.2.2 + hasown: 2.0.0 + side-channel: 1.0.4 + dev: true + + /invariant@2.2.4: + resolution: {integrity: sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==} + dependencies: + loose-envify: 1.4.0 + dev: true /ipaddr.js@1.9.1: resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} @@ -2002,6 +5149,14 @@ packages: engines: {node: '>= 10'} dev: false + /is-absolute@1.0.0: + resolution: {integrity: sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==} + engines: {node: '>=0.10.0'} + dependencies: + is-relative: 1.0.0 + is-windows: 1.0.2 + dev: true + /is-arguments@1.1.1: resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==} engines: {node: '>= 0.4'} @@ -2010,9 +5165,23 @@ packages: has-tostringtag: 1.0.0 dev: false - /is-arrayish@0.3.2: - resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} - dev: false + /is-array-buffer@3.0.2: + resolution: {integrity: sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==} + dependencies: + call-bind: 1.0.5 + get-intrinsic: 1.2.2 + is-typed-array: 1.1.12 + dev: true + + /is-arrayish@0.2.1: + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + dev: true + + /is-bigint@1.0.4: + resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} + dependencies: + has-bigints: 1.0.2 + dev: true /is-binary-path@2.1.0: resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} @@ -2021,10 +5190,17 @@ packages: binary-extensions: 2.2.0 dev: true + /is-boolean-object@1.1.2: + resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.5 + has-tostringtag: 1.0.0 + dev: true + /is-callable@1.2.7: resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} engines: {node: '>= 0.4'} - dev: false /is-core-module@2.13.1: resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} @@ -2032,6 +5208,13 @@ packages: hasown: 2.0.0 dev: true + /is-date-object@1.0.5: + resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: 1.0.0 + dev: true + /is-extglob@2.1.1: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} @@ -2043,6 +5226,18 @@ packages: requiresBuild: true dev: true + /is-fullwidth-code-point@4.0.0: + resolution: {integrity: sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==} + engines: {node: '>=12'} + dev: true + + /is-fullwidth-code-point@5.0.0: + resolution: {integrity: sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA==} + engines: {node: '>=18'} + dependencies: + get-east-asian-width: 1.2.0 + dev: true + /is-generator-function@1.0.10: resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==} engines: {node: '>= 0.4'} @@ -2057,6 +5252,29 @@ packages: is-extglob: 2.1.1 dev: true + /is-interactive@1.0.0: + resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==} + engines: {node: '>=8'} + dev: true + + /is-lower-case@2.0.2: + resolution: {integrity: sha512-bVcMJy4X5Og6VZfdOZstSexlEy20Sr0k/p/b2IlQJlfdKAQuMpiv5w2Ccxb8sKdRUNAG1PnHVHjFSdRDVS6NlQ==} + dependencies: + tslib: 2.6.2 + dev: true + + /is-negative-zero@2.0.2: + resolution: {integrity: sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==} + engines: {node: '>= 0.4'} + dev: true + + /is-number-object@1.0.7: + resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: 1.0.0 + dev: true + /is-number@7.0.0: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} @@ -2066,6 +5284,16 @@ packages: resolution: {integrity: sha512-2rRIahhZr2UWb45fIOuvZGpFtz0TyOZLf32KxBbSoUCeZR495zCKlWUKKUByk3geS2eAs7ZAABt0Y/Rx0GiQGA==} dev: true + /is-path-inside@3.0.3: + resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} + engines: {node: '>=8'} + dev: true + + /is-plain-obj@1.1.0: + resolution: {integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==} + engines: {node: '>=0.10.0'} + dev: true + /is-plain-obj@2.1.0: resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==} engines: {node: '>=8'} @@ -2075,21 +5303,110 @@ packages: resolution: {integrity: sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==} dev: true + /is-regex@1.1.4: + resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.5 + has-tostringtag: 1.0.0 + dev: true + + /is-relative@1.0.0: + resolution: {integrity: sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==} + engines: {node: '>=0.10.0'} + dependencies: + is-unc-path: 1.0.0 + dev: true + + /is-shared-array-buffer@1.0.2: + resolution: {integrity: sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==} + dependencies: + call-bind: 1.0.5 + dev: true + + /is-stream@1.1.0: + resolution: {integrity: sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==} + engines: {node: '>=0.10.0'} + dev: true + + /is-stream@2.0.1: + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} + engines: {node: '>=8'} + dev: true + + /is-stream@3.0.0: + resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dev: true + + /is-string@1.0.7: + resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: 1.0.0 + dev: true + + /is-symbol@1.0.4: + resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} + engines: {node: '>= 0.4'} + dependencies: + has-symbols: 1.0.3 + dev: true + /is-typed-array@1.1.12: resolution: {integrity: sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==} engines: {node: '>= 0.4'} dependencies: which-typed-array: 1.1.13 - dev: false + + /is-unc-path@1.0.0: + resolution: {integrity: sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==} + engines: {node: '>=0.10.0'} + dependencies: + unc-path-regex: 0.1.2 + dev: true /is-unicode-supported@0.1.0: resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} engines: {node: '>=10'} dev: true + /is-upper-case@2.0.2: + resolution: {integrity: sha512-44pxmxAvnnAOwBg4tHPnkfvgjPwbc5QIsSstNU+YcJ1ovxVzCWpSGosPJOZh/a1tdl81fbgnLc9LLv+x2ywbPQ==} + dependencies: + tslib: 2.6.2 + dev: true + + /is-weakref@1.0.2: + resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} + dependencies: + call-bind: 1.0.5 + dev: true + + /is-windows@1.0.2: + resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} + engines: {node: '>=0.10.0'} + dev: true + /isarray@0.0.1: resolution: {integrity: sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==} + /isarray@2.0.5: + resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} + dev: true + + /isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + dev: true + + /isomorphic-ws@5.0.0(ws@8.16.0): + resolution: {integrity: sha512-muId7Zzn9ywDsyXgTIafTry2sV3nySZeUDe6YedVd1Hvuuep5AsIlqK+XefWpYTyJG5e503F2xIuT2lcU6rCSw==} + peerDependencies: + ws: '*' + dependencies: + ws: 8.16.0(bufferutil@4.0.8)(utf-8-validate@6.0.3) + dev: true + /isomorphic.js@0.2.5: resolution: {integrity: sha512-PIeMbHqMt4DnUP3MA/Flc0HElYjMXArsw1qwJZcm9sqR8mq3l8NYizFMty0pWwE/tzIGH3EKK5+jes5mAr85yw==} dev: false @@ -2098,6 +5415,15 @@ packages: resolution: {integrity: sha512-nO6jcEfZWQXDhOiBtG2KvKyEptz7RVbpGP4vTD2hLBdmNQSsCiicO2Ioinv6UI4y9ukqnBpy+XZ9H6uLNgJTlw==} dev: true + /jiti@1.21.0: + resolution: {integrity: sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==} + hasBin: true + dev: true + + /jose@5.2.0: + resolution: {integrity: sha512-oW3PCnvyrcm1HMvGTzqjxxfnEs9EoFOFWi2HsEGhlFVOXxTE3K9GKWVMFoFw06yPUqwpvEWic1BmtUZBI/tIjw==} + dev: true + /js-beautify@1.14.9: resolution: {integrity: sha512-coM7xq1syLcMyuVGyToxcj2AlzhkDjmfklL8r0JgJ7A76wyGMpJ1oA35mr4APdYNO/o/4YY8H54NQIJzhMbhBg==} engines: {node: '>=12'} @@ -2126,20 +5452,66 @@ packages: hasBin: true dev: true + /json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + dev: true + + /json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + dev: true + /json-schema-ref-resolver@1.0.1: resolution: {integrity: sha512-EJAj1pgHc1hxF6vo2Z3s69fMjO1INq6eGHXZ8Z6wCQeldCuwxGK9Sxf4/cScGn3FZubCVUehfWtcDM/PLteCQw==} dependencies: fast-deep-equal: 3.1.3 dev: false + /json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + dev: true + /json-schema-traverse@1.0.0: resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} dev: false + /json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + dev: true + + /json-stable-stringify@1.1.0: + resolution: {integrity: sha512-zfA+5SuwYN2VWqN1/5HZaDzQKLJHaBVMZIIM+wuYjdptkaQsqzDdqjqf+lZZJUuJq1aanHiY8LhH8LmH+qBYJA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.5 + isarray: 2.0.5 + jsonify: 0.0.1 + object-keys: 1.1.1 + dev: true + /json-stream@1.0.0: resolution: {integrity: sha512-H/ZGY0nIAg3QcOwE1QN/rK/Fa7gJn7Ii5obwp6zyPO4xiPNwpIMjqy2gwjBEGqzkF/vSWEIBQCBuN19hYiL6Qg==} dev: false + /json-to-pretty-yaml@1.2.2: + resolution: {integrity: sha512-rvm6hunfCcqegwYaG5T4yKJWxc9FXFgBVrcTZ4XfSVRwa5HA/Xs+vB/Eo9treYYHCeNM0nrSUr82V/M31Urc7A==} + engines: {node: '>= 0.2.0'} + dependencies: + remedial: 1.0.8 + remove-trailing-spaces: 1.0.8 + dev: true + + /json5@1.0.2: + resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} + hasBin: true + dependencies: + minimist: 1.2.8 + dev: true + + /json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + /jsonfile@6.1.0: resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} dependencies: @@ -2148,29 +5520,113 @@ packages: graceful-fs: 4.2.11 dev: true + /jsonify@0.0.1: + resolution: {integrity: sha512-2/Ki0GcmuqSrgFyelQq9M05y7PS0mEwuIzrf3f1fPqkVDVRvZrPZtVSMHxdgo8Aq0sxAOb/cr2aqqA3LeWHVPg==} + dev: true + /just-extend@4.2.1: resolution: {integrity: sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg==} + /keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + dependencies: + json-buffer: 3.0.1 + dev: true + /kleur@4.1.5: resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} engines: {node: '>=6'} dev: false - /lib0@0.2.88: - resolution: {integrity: sha512-KyroiEvCeZcZEMx5Ys+b4u4eEBbA1ch7XUaBhYpwa/nPMrzTjUhI4RfcytmQfYoTBPcdyx+FX6WFNIoNuJzJfQ==} - engines: {node: '>=16'} - hasBin: true + /levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + dev: true + + /lib0@0.2.88: + resolution: {integrity: sha512-KyroiEvCeZcZEMx5Ys+b4u4eEBbA1ch7XUaBhYpwa/nPMrzTjUhI4RfcytmQfYoTBPcdyx+FX6WFNIoNuJzJfQ==} + engines: {node: '>=16'} + hasBin: true + dependencies: + isomorphic.js: 0.2.5 + dev: false + + /light-my-request@5.11.0: + resolution: {integrity: sha512-qkFCeloXCOMpmEdZ/MV91P8AT4fjwFXWaAFz3lUeStM8RcoM1ks4J/F8r1b3r6y/H4u3ACEJ1T+Gv5bopj7oDA==} + dependencies: + cookie: 0.5.0 + process-warning: 2.3.2 + set-cookie-parser: 2.6.0 + dev: false + + /lilconfig@3.0.0: + resolution: {integrity: sha512-K2U4W2Ff5ibV7j7ydLr+zLAkIg5JJ4lPn1Ltsdt+Tz/IjQ8buJ55pZAxoP34lqIiwtF9iAvtLv3JGv7CAyAg+g==} + engines: {node: '>=14'} + dev: true + + /lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + dev: true + + /lint-staged@15.2.0: + resolution: {integrity: sha512-TFZzUEV00f+2YLaVPWBWGAMq7So6yQx+GG8YRMDeOEIf95Zn5RyiLMsEiX4KTNl9vq/w+NqRJkLA1kPIo15ufQ==} + engines: {node: '>=18.12.0'} + hasBin: true + dependencies: + chalk: 5.3.0 + commander: 11.1.0 + debug: 4.3.4(supports-color@8.1.1) + execa: 8.0.1 + lilconfig: 3.0.0 + listr2: 8.0.0 + micromatch: 4.0.5 + pidtree: 0.6.0 + string-argv: 0.3.2 + yaml: 2.3.4 + transitivePeerDependencies: + - supports-color + dev: true + + /listr2@4.0.5: + resolution: {integrity: sha512-juGHV1doQdpNT3GSTs9IUN43QJb7KHdF9uqg7Vufs/tG9VTzpFphqF4pm/ICdAABGQxsyNn9CiYA3StkI6jpwA==} + engines: {node: '>=12'} + peerDependencies: + enquirer: '>= 2.3.0 < 3' + peerDependenciesMeta: + enquirer: + optional: true + dependencies: + cli-truncate: 2.1.0 + colorette: 2.0.20 + log-update: 4.0.0 + p-map: 4.0.0 + rfdc: 1.3.0 + rxjs: 7.8.1 + through: 2.3.8 + wrap-ansi: 7.0.0 + dev: true + + /listr2@8.0.0: + resolution: {integrity: sha512-u8cusxAcyqAiQ2RhYvV7kRKNLgUvtObIbhOX2NCXqvp1UU32xIg5CT22ykS2TPKJXZWJwtK3IKLiqAGlGNE+Zg==} + engines: {node: '>=18.0.0'} dependencies: - isomorphic.js: 0.2.5 - dev: false + cli-truncate: 4.0.0 + colorette: 2.0.20 + eventemitter3: 5.0.1 + log-update: 6.0.0 + rfdc: 1.3.0 + wrap-ansi: 9.0.0 + dev: true - /light-my-request@5.11.0: - resolution: {integrity: sha512-qkFCeloXCOMpmEdZ/MV91P8AT4fjwFXWaAFz3lUeStM8RcoM1ks4J/F8r1b3r6y/H4u3ACEJ1T+Gv5bopj7oDA==} + /locate-path@5.0.0: + resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} + engines: {node: '>=8'} dependencies: - cookie: 0.5.0 - process-warning: 2.3.0 - set-cookie-parser: 2.6.0 - dev: false + p-locate: 4.1.0 + dev: true /locate-path@6.0.0: resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} @@ -2186,6 +5642,10 @@ packages: /lodash.get@4.4.2: resolution: {integrity: sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==} + /lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + dev: true + /lodash.sortby@4.7.0: resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==} dev: false @@ -2201,6 +5661,27 @@ packages: is-unicode-supported: 0.1.0 dev: true + /log-update@4.0.0: + resolution: {integrity: sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==} + engines: {node: '>=10'} + dependencies: + ansi-escapes: 4.3.2 + cli-cursor: 3.1.0 + slice-ansi: 4.0.0 + wrap-ansi: 6.2.0 + dev: true + + /log-update@6.0.0: + resolution: {integrity: sha512-niTvB4gqvtof056rRIrTZvjNYE4rCUzO6X/X+kYjd7WFxXeJ0NwEFnRxX6ehkvv3jTwrXnNdtAak5XYZuIyPFw==} + engines: {node: '>=18'} + dependencies: + ansi-escapes: 6.2.0 + cli-cursor: 4.0.0 + slice-ansi: 7.1.0 + strip-ansi: 7.1.0 + wrap-ansi: 9.0.0 + dev: true + /loglevel@1.8.1: resolution: {integrity: sha512-tCRIJM51SHjAayKwC+QAg8hT8vg6z7GSgLJKGvzuPb1Wc+hLzqtuVLxp6/HzSPOozuK+8ErAhy7U/sVzw8Dgfg==} engines: {node: '>= 0.6.0'} @@ -2210,11 +5691,47 @@ packages: resolution: {integrity: sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==} dev: false + /loose-envify@1.4.0: + resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} + hasBin: true + dependencies: + js-tokens: 4.0.0 + dev: true + /loupe@2.3.7: resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} dependencies: get-func-name: 2.0.2 + /lower-case-first@2.0.2: + resolution: {integrity: sha512-EVm/rR94FJTZi3zefZ82fLWab+GX14LJN4HrWBcuo6Evmsl9hEfnqxgcHCKb9q+mNf6EVdsjx/qucYFIIB84pg==} + dependencies: + tslib: 2.6.2 + dev: true + + /lower-case@2.0.2: + resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} + dependencies: + tslib: 2.6.2 + dev: true + + /lowercase-keys@2.0.0: + resolution: {integrity: sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==} + engines: {node: '>=8'} + dev: true + + /lru-cache@4.1.5: + resolution: {integrity: sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==} + dependencies: + pseudomap: 1.0.2 + yallist: 2.1.2 + + /lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + dependencies: + yallist: 3.1.1 + dev: true + /lru-cache@6.0.0: resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} engines: {node: '>=10'} @@ -2232,6 +5749,15 @@ packages: es5-ext: 0.10.62 dev: true + /make-error@1.3.6: + resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} + dev: true + + /map-cache@0.2.2: + resolution: {integrity: sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==} + engines: {node: '>=0.10.0'} + dev: true + /media-typer@0.3.0: resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} engines: {node: '>= 0.6'} @@ -2253,15 +5779,43 @@ packages: /merge-descriptors@1.0.1: resolution: {integrity: sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==} + /merge-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + dev: true + + /merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + dev: true + + /meros@1.3.0(@types/node@20.10.6): + resolution: {integrity: sha512-2BNGOimxEz5hmjUG2FwoxCt5HN7BXdaWyFqEwxPTrJzVdABtrL4TiHTcsWSFAxPQ/tOnEaQEJh3qWq71QRMY+w==} + engines: {node: '>=13'} + peerDependencies: + '@types/node': '>=13' + peerDependenciesMeta: + '@types/node': + optional: true + dependencies: + '@types/node': 20.10.6 + dev: true + /methods@1.1.2: resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} engines: {node: '>= 0.6'} dev: false + /micromatch@4.0.5: + resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} + engines: {node: '>=8.6'} + dependencies: + braces: 3.0.2 + picomatch: 2.3.1 + dev: true + /mime-db@1.52.0: resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} engines: {node: '>= 0.6'} - dev: false /mime-types@2.1.35: resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} @@ -2276,10 +5830,25 @@ packages: hasBin: true dev: false + /mimic-fn@2.1.0: + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} + engines: {node: '>=6'} + dev: true + + /mimic-fn@4.0.0: + resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} + engines: {node: '>=12'} + dev: true + + /mimic-response@1.0.1: + resolution: {integrity: sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==} + engines: {node: '>=4'} + dev: true + /mimic-response@3.1.0: resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} engines: {node: '>=10'} - dev: false + dev: true /minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} @@ -2288,6 +5857,13 @@ packages: brace-expansion: 1.1.11 dev: true + /minimatch@4.2.3: + resolution: {integrity: sha512-lIUdtK5hdofgCTu3aT0sOaHsYR37viUuIc0rwnnDXImbwFRcumyLMeZaM0t0I/fgxS6s6JMfu0rLD1Wz9pv1ng==} + engines: {node: '>=10'} + dependencies: + brace-expansion: 1.1.11 + dev: true + /minimatch@5.0.1: resolution: {integrity: sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==} engines: {node: '>=10'} @@ -2308,9 +5884,15 @@ packages: brace-expansion: 2.0.1 dev: true + /minimatch@9.0.3: + resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} + engines: {node: '>=16 || 14 >=14.17'} + dependencies: + brace-expansion: 2.0.1 + dev: true + /minimist@1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - dev: false /minio@7.1.3: resolution: {integrity: sha512-xPrLjWkTT5E7H7VnzOjF//xBp9I40jYB4aWhb2xTFopXXfw+Wo82DDWngdUju7Doy3Wk7R8C4LAgwhLHHnf0wA==} @@ -2332,10 +5914,6 @@ packages: xml2js: 0.5.0 dev: false - /mkdirp-classic@0.5.3: - resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} - dev: false - /mnemonist@0.39.5: resolution: {integrity: sha512-FPUtkhtJ0efmEFGpU14x7jGbTB+s18LrzRL2KgoWz9YvcY3cPomz8tih01GbHwnGk/OmkOKfqd/RAQoc8Lm7DQ==} dependencies: @@ -2394,6 +5972,10 @@ packages: /ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + /mute-stream@0.0.8: + resolution: {integrity: sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==} + dev: true + /nanoid@3.3.3: resolution: {integrity: sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} @@ -2406,9 +5988,9 @@ packages: hasBin: true dev: false - /napi-build-utils@1.0.2: - resolution: {integrity: sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==} - dev: false + /natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + dev: true /negotiator@0.6.3: resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} @@ -2428,19 +6010,22 @@ packages: just-extend: 4.2.1 path-to-regexp: 1.8.0 - /node-abi@3.51.0: - resolution: {integrity: sha512-SQkEP4hmNWjlniS5zdnfIXTk1x7Ome85RDzHlTbBtzE97Gfwz/Ipw4v/Ryk20DWIy3yCNVLVlGKApCnmvYoJbA==} - engines: {node: '>=10'} + /no-case@3.0.4: + resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} dependencies: - semver: 7.5.4 - dev: false + lower-case: 2.0.2 + tslib: 2.6.2 + dev: true /node-abort-controller@3.1.1: resolution: {integrity: sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==} dev: false - /node-addon-api@6.1.0: - resolution: {integrity: sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==} + /node-cache@5.1.2: + resolution: {integrity: sha512-t1QzWwnk4sjLWaQAS8CHgOJ+RAfmHpxFWmc36IWTiWHQfs0w5JDMBS1b1ZxQteo0vVVuWJvIUKHDkkeK7vIGCg==} + engines: {node: '>= 8.0.0'} + dependencies: + clone: 2.1.2 dev: false /node-fetch@2.7.0: @@ -2453,13 +6038,19 @@ packages: optional: true dependencies: whatwg-url: 5.0.0 - dev: false /node-gyp-build@4.7.1: resolution: {integrity: sha512-wTSrZ+8lsRRa3I3H8Xr65dLWSgCvY2l4AOnaeKdPA9TB/WYMPaTcrzf3rXvFoVvjKNVnu0CcWSx54qq9GKRUYg==} hasBin: true requiresBuild: true - dev: false + + /node-int64@0.4.0: + resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} + dev: true + + /node-releases@2.0.14: + resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==} + dev: true /nopt@6.0.0: resolution: {integrity: sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g==} @@ -2469,25 +6060,102 @@ packages: abbrev: 1.1.1 dev: true + /normalize-path@2.1.1: + resolution: {integrity: sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==} + engines: {node: '>=0.10.0'} + dependencies: + remove-trailing-separator: 1.1.0 + dev: true + /normalize-path@3.0.0: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} engines: {node: '>=0.10.0'} dev: true + /normalize-url@6.1.0: + resolution: {integrity: sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==} + engines: {node: '>=10'} + dev: true + + /npm-run-path@2.0.2: + resolution: {integrity: sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==} + engines: {node: '>=4'} + dependencies: + path-key: 2.0.1 + dev: true + + /npm-run-path@4.0.1: + resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} + engines: {node: '>=8'} + dependencies: + path-key: 3.1.1 + dev: true + + /npm-run-path@5.2.0: + resolution: {integrity: sha512-W4/tgAXFqFA0iL7fk0+uQ3g7wkL8xJmx3XdK0VGb4cHW//eZTtKGvFBBoRKVTpY7n6ze4NL9ly7rgXcHufqXKg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + path-key: 4.0.0 + dev: true + + /nullthrows@1.1.1: + resolution: {integrity: sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw==} + dev: true + /object-assign@4.1.1: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} - dev: false /object-inspect@1.13.1: resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==} - dev: false + + /object-keys@1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} + dev: true /object-path@0.11.8: resolution: {integrity: sha512-YJjNZrlXJFM42wTBn6zgOJVar9KFJvzx6sTWDte8sWZF//cnjl0BxHNpfZx+ZffXX63A9q0b1zsFiBX4g4X5KA==} engines: {node: '>= 10.12.0'} dev: false + /object.assign@4.1.5: + resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.5 + define-properties: 1.2.1 + has-symbols: 1.0.3 + object-keys: 1.1.1 + dev: true + + /object.fromentries@2.0.7: + resolution: {integrity: sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.5 + define-properties: 1.2.1 + es-abstract: 1.22.3 + dev: true + + /object.groupby@1.0.1: + resolution: {integrity: sha512-HqaQtqLnp/8Bn4GL16cj+CUYbnpe1bh0TtEaWvybszDG4tgxCJuRpV8VGuvNaI1fAnI4lUJzDG55MXcOH4JZcQ==} + dependencies: + call-bind: 1.0.5 + define-properties: 1.2.1 + es-abstract: 1.22.3 + get-intrinsic: 1.2.2 + dev: true + + /object.values@1.1.7: + resolution: {integrity: sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.5 + define-properties: 1.2.1 + es-abstract: 1.22.3 + dev: true + /obliterator@2.0.4: resolution: {integrity: sha512-lgHwxlxV1qIg1Eap7LgIeoBWIMFibOjbrYPIPJZcI1mmGAI2m3lNYpK12Y+GBdPQ0U1hRwSord7GIaawz962qQ==} dev: false @@ -2509,6 +6177,89 @@ packages: dependencies: wrappy: 1.0.2 + /onetime@5.1.2: + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + engines: {node: '>=6'} + dependencies: + mimic-fn: 2.1.0 + dev: true + + /onetime@6.0.0: + resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} + engines: {node: '>=12'} + dependencies: + mimic-fn: 4.0.0 + dev: true + + /optionator@0.9.3: + resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} + engines: {node: '>= 0.8.0'} + dependencies: + '@aashutoshrathi/word-wrap': 1.2.6 + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + dev: true + + /ora@5.4.1: + resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==} + engines: {node: '>=10'} + dependencies: + bl: 4.1.0 + chalk: 4.1.2 + cli-cursor: 3.1.0 + cli-spinners: 2.9.2 + is-interactive: 1.0.0 + is-unicode-supported: 0.1.0 + log-symbols: 4.1.0 + strip-ansi: 6.0.1 + wcwidth: 1.0.1 + dev: true + + /os-filter-obj@2.0.0: + resolution: {integrity: sha512-uksVLsqG3pVdzzPvmAHpBK0wKxYItuzZr7SziusRPoz67tGV8rL1szZ6IdeUrbqLjGDwApBtN29eEE3IqGHOjg==} + engines: {node: '>=4'} + dependencies: + arch: 2.2.0 + dev: true + + /os-tmpdir@1.0.2: + resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} + engines: {node: '>=0.10.0'} + dev: true + + /oxlint@0.1.2: + resolution: {integrity: sha512-hy/pmCx0zgZr1sLZjQeKYoBc0JbFbvd6r9I8CdNjd3bOH100A3JVSjOkClMq6sMG5+mN7TztZzHnpmVKY+jdjw==} + engines: {node: '>=14.*'} + hasBin: true + optionalDependencies: + '@oxlint/darwin-arm64': 0.1.2 + '@oxlint/darwin-x64': 0.1.2 + '@oxlint/linux-arm64': 0.1.2 + '@oxlint/linux-x64': 0.1.2 + '@oxlint/win32-arm64': 0.1.2 + '@oxlint/win32-x64': 0.1.2 + dev: true + + /p-cancelable@2.1.1: + resolution: {integrity: sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==} + engines: {node: '>=8'} + dev: true + + /p-finally@1.0.0: + resolution: {integrity: sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==} + engines: {node: '>=4'} + dev: true + + /p-limit@2.3.0: + resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} + engines: {node: '>=6'} + dependencies: + p-try: 2.2.0 + dev: true + /p-limit@3.1.0: resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} engines: {node: '>=10'} @@ -2516,6 +6267,13 @@ packages: yocto-queue: 0.1.0 dev: true + /p-locate@4.1.0: + resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} + engines: {node: '>=8'} + dependencies: + p-limit: 2.3.0 + dev: true + /p-locate@5.0.0: resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} engines: {node: '>=10'} @@ -2523,15 +6281,74 @@ packages: p-limit: 3.1.0 dev: true + /p-map@4.0.0: + resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==} + engines: {node: '>=10'} + dependencies: + aggregate-error: 3.1.0 + dev: true + + /p-try@2.2.0: + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + engines: {node: '>=6'} + dev: true + /packet-reader@1.0.0: resolution: {integrity: sha512-HAKu/fG3HpHFO0AA8WE8q2g+gBJaZ9MG7fcKk+IJPLTGAD6Psw4443l+9DGRbOIh3/aXr7Phy0TjilYivJo5XQ==} dev: false + /param-case@3.0.4: + resolution: {integrity: sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==} + dependencies: + dot-case: 3.0.4 + tslib: 2.6.2 + dev: true + + /parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + dependencies: + callsites: 3.1.0 + dev: true + + /parse-filepath@1.0.2: + resolution: {integrity: sha512-FwdRXKCohSVeXqwtYonZTXtbGJKrn+HNyWDYVcp5yuJlesTwNH4rsmRZ+GrKAPJ5bLpRxESMeS+Rl0VCHRvB2Q==} + engines: {node: '>=0.8'} + dependencies: + is-absolute: 1.0.0 + map-cache: 0.2.2 + path-root: 0.1.1 + dev: true + + /parse-json@5.2.0: + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} + dependencies: + '@babel/code-frame': 7.23.5 + error-ex: 1.3.2 + json-parse-even-better-errors: 2.3.1 + lines-and-columns: 1.2.4 + dev: true + /parseurl@1.3.3: resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} engines: {node: '>= 0.8'} dev: false + /pascal-case@3.1.2: + resolution: {integrity: sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==} + dependencies: + no-case: 3.0.4 + tslib: 2.6.2 + dev: true + + /path-case@3.0.4: + resolution: {integrity: sha512-qO4qCFjXqVTrcbPt/hQfhTQ+VhFsqNKOPtytgNKkKxSoEp3XPUQ8ObFuePylOIok5gjn69ry8XiULxCwot3Wfg==} + dependencies: + dot-case: 3.0.4 + tslib: 2.6.2 + dev: true + /path-exists@4.0.0: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} @@ -2543,8 +6360,35 @@ packages: requiresBuild: true dev: true - /path-parse@1.0.7: - resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + /path-key@2.0.1: + resolution: {integrity: sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==} + engines: {node: '>=4'} + dev: true + + /path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + dev: true + + /path-key@4.0.0: + resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} + engines: {node: '>=12'} + dev: true + + /path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + dev: true + + /path-root-regex@0.1.2: + resolution: {integrity: sha512-4GlJ6rZDhQZFE0DPVKh0e9jmZ5egZfxTkp7bcRDuPlJXbAwhxcl2dINPUAsjLdejqaLsCeg8axcLjIbvBjN4pQ==} + engines: {node: '>=0.10.0'} + dev: true + + /path-root@0.1.1: + resolution: {integrity: sha512-QLcPegTHF11axjfojBIoDygmS2E3Lf+8+jI6wOVmNVenrKSo3mFdSGiIgdSHenczw3wPtlVMQaFVwGmM7BJdtg==} + engines: {node: '>=0.10.0'} + dependencies: + path-root-regex: 0.1.2 dev: true /path-to-regexp@0.1.7: @@ -2556,9 +6400,19 @@ packages: dependencies: isarray: 0.0.1 + /path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + dev: true + /pathval@1.1.1: resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} + /peek-readable@5.0.0: + resolution: {integrity: sha512-YtCKvLUOvwtMGmrniQPdO7MwPjgkFBtFIrmfSbYmYuq3tKDV/mcfAhBth1+C3ru7uXIZasc/pHnb+YDYNkkj4A==} + engines: {node: '>=14.16'} + dev: true + /pg-cloudflare@1.1.1: resolution: {integrity: sha512-xWPagP/4B6BgFO+EKz3JONXv3YDgvkbVrGw2mTo3D6tVDQRh1e7cqVGvyR3BE+eQgAvx1XhW/iEASj4/jCWl3Q==} requiresBuild: true @@ -2630,15 +6484,30 @@ packages: split2: 4.2.0 dev: false + /picocolors@1.0.0: + resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + dev: true + /picomatch@2.3.1: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} engines: {node: '>=8.6'} dev: true + /pidtree@0.6.0: + resolution: {integrity: sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==} + engines: {node: '>=0.10'} + hasBin: true + dev: true + + /pify@2.3.0: + resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} + engines: {node: '>=0.10.0'} + dev: true + /pino-abstract-transport@1.1.0: resolution: {integrity: sha512-lsleG3/2a/JIWUtf9Q5gUNErBqwIu1tUKTT3dUzaf5DySw9ra1wcqKjJjLX1VTY64Wk1eEOYsVGSaGfCK85ekA==} dependencies: - readable-stream: 4.4.2 + readable-stream: 4.5.2 split2: 4.2.0 dev: false @@ -2646,8 +6515,8 @@ packages: resolution: {integrity: sha512-cHjPPsE+vhj/tnhCy/wiMh3M3z3h/j15zHQX+S9GkTBgqJuTuJzYJ4gUyACLhDaJ7kk9ba9iRDmbH2tJU03OiA==} dev: false - /pino@8.16.1: - resolution: {integrity: sha512-3bKsVhBmgPjGV9pyn4fO/8RtoVDR8ssW1ev819FsRXlRNgW8gR/9Kx+gCK4UPWd4JjrRDLWpzd/pb1AyWm3MGA==} + /pino@8.17.2: + resolution: {integrity: sha512-LA6qKgeDMLr2ux2y/YiUt47EfgQ+S9LznBWOJdN3q1dx2sv0ziDLUBeVpyVv17TEcGCBuWf0zNtg3M5m1NhhWQ==} hasBin: true dependencies: atomic-sleep: 1.0.0 @@ -2655,7 +6524,7 @@ packages: on-exit-leak-free: 2.1.2 pino-abstract-transport: 1.1.0 pino-std-serializers: 6.2.2 - process-warning: 2.3.0 + process-warning: 3.0.0 quick-format-unescaped: 4.0.4 real-require: 0.2.0 safe-stable-stringify: 2.4.3 @@ -2690,33 +6559,23 @@ packages: xtend: 4.0.2 dev: false - /prebuild-install@7.1.1: - resolution: {integrity: sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==} - engines: {node: '>=10'} - hasBin: true - dependencies: - detect-libc: 2.0.2 - expand-template: 2.0.3 - github-from-package: 0.0.0 - minimist: 1.2.8 - mkdirp-classic: 0.5.3 - napi-build-utils: 1.0.2 - node-abi: 3.51.0 - pump: 3.0.0 - rc: 1.2.8 - simple-get: 4.0.1 - tar-fs: 2.1.1 - tunnel-agent: 0.6.0 - dev: false + /prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + dev: true - /prettier@3.0.3: - resolution: {integrity: sha512-L/4pUDMxcNa8R/EthV08Zt42WBO4h1rarVtK0K+QJG0X187OLo7l699jWw0GKuwzkPQ//jMFA/8Xm6Fh3J/DAg==} + /prettier@3.1.1: + resolution: {integrity: sha512-22UbSzg8luF4UuZtzgiUOfcGM8s4tjBv6dJRT7j275NXsy2jb4aJa4NNveul5x4eqlF1wuhuR2RElK71RvmVaw==} engines: {node: '>=14'} hasBin: true dev: true - /process-warning@2.3.0: - resolution: {integrity: sha512-N6mp1+2jpQr3oCFMz6SeHRGbv6Slb20bRhj4v3xR99HqNToAcOe1MFOp4tytyzOfJn+QtN8Rf7U/h2KAn4kC6g==} + /process-warning@2.3.2: + resolution: {integrity: sha512-n9wh8tvBe5sFmsqlg+XQhaQLumwpqoAUruLwjCopgTmUBjJ/fjtBsJzKleCaIGBOMXYEhp1YfKl4d7rJ5ZKJGA==} + dev: false + + /process-warning@3.0.0: + resolution: {integrity: sha512-mqn0kFRl0EoqhnL0GQ0veqFHyIN1yig9RHh/InzORTUiZHFRAur+aMtRkELNwGs9aNwKS6tg/An4NYBPGwvtzQ==} dev: false /process@0.11.10: @@ -2724,6 +6583,12 @@ packages: engines: {node: '>= 0.6.0'} dev: false + /promise@7.3.1: + resolution: {integrity: sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==} + dependencies: + asap: 2.0.6 + dev: true + /proto-list@1.2.4: resolution: {integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==} dev: true @@ -2748,17 +6613,34 @@ packages: resolve: 1.22.8 dev: true + /pseudomap@1.0.2: + resolution: {integrity: sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==} + /pump@3.0.0: resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} dependencies: end-of-stream: 1.4.4 once: 1.4.0 - dev: false + dev: true + + /punycode@1.4.1: + resolution: {integrity: sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==} + dev: true /punycode@2.3.1: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} - dev: false + + /pvtsutils@1.3.5: + resolution: {integrity: sha512-ARvb14YB9Nm2Xi6nBq1ZX6dAM0FsJnuk+31aUp4TrcZEdKUlSqOqsxJHUPJDNE3qiIp+iUPEIeR6Je/tgV7zsA==} + dependencies: + tslib: 2.6.2 + dev: true + + /pvutils@1.1.3: + resolution: {integrity: sha512-pMpnA0qRdFp32b1sJl1wOJNxZLQ2cbQx+k6tjNtZ8CpvVhNqEPRgivZ2WOUev2YMajecdH7ctUPDvEe87nariQ==} + engines: {node: '>=6.0.0'} + dev: true /qs@6.11.0: resolution: {integrity: sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==} @@ -2777,14 +6659,19 @@ packages: strict-uri-encode: 2.0.0 dev: false - /queue-tick@1.0.1: - resolution: {integrity: sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==} - dev: false + /queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + dev: true /quick-format-unescaped@4.0.4: resolution: {integrity: sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==} dev: false + /quick-lru@5.1.1: + resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} + engines: {node: '>=10'} + dev: true + /randombytes@2.1.0: resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} dependencies: @@ -2816,16 +6703,6 @@ packages: unpipe: 1.0.0 dev: false - /rc@1.2.8: - resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} - hasBin: true - dependencies: - deep-extend: 0.6.0 - ini: 1.3.8 - minimist: 1.2.8 - strip-json-comments: 2.0.1 - dev: false - /readable-stream@3.6.2: resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} engines: {node: '>= 6'} @@ -2833,10 +6710,9 @@ packages: inherits: 2.0.4 string_decoder: 1.3.0 util-deprecate: 1.0.2 - dev: false - /readable-stream@4.4.2: - resolution: {integrity: sha512-Lk/fICSyIhodxy1IDK2HazkeGjSmezAWX2egdtJnYhtzKEsBPJowlI6F6LPb5tqIQILrMbx22S5o3GuJavPusA==} + /readable-stream@4.5.2: + resolution: {integrity: sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: abort-controller: 3.0.0 @@ -2846,6 +6722,13 @@ packages: string_decoder: 1.3.0 dev: false + /readable-web-to-node-stream@3.0.2: + resolution: {integrity: sha512-ePeK6cc1EcKLEhJFt/AebMCLL+GgSKhuygrZ/GLaKZYEecIgIECf4UaUuaByiGtzckwR4ain9VzUh95T1exYGw==} + engines: {node: '>=8'} + dependencies: + readable-stream: 3.6.2 + dev: true + /readdirp@3.6.0: resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} engines: {node: '>=8.10.0'} @@ -2858,6 +6741,41 @@ packages: engines: {node: '>= 12.13.0'} dev: false + /regenerator-runtime@0.14.1: + resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} + dev: true + + /regexp.prototype.flags@1.5.1: + resolution: {integrity: sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.5 + define-properties: 1.2.1 + set-function-name: 2.0.1 + dev: true + + /relay-runtime@12.0.0: + resolution: {integrity: sha512-QU6JKr1tMsry22DXNy9Whsq5rmvwr3LSZiiWV/9+DFpuTWvp+WFhobWMc8TC4OjKFfNhEZy7mOiqUAn5atQtug==} + dependencies: + '@babel/runtime': 7.23.7 + fbjs: 3.0.5 + invariant: 2.2.4 + transitivePeerDependencies: + - encoding + dev: true + + /remedial@1.0.8: + resolution: {integrity: sha512-/62tYiOe6DzS5BqVsNpH/nkGlX45C/Sp6V+NtiN6JQNS1Viay7cWkazmRkrQrdFj2eshDe96SIQNIoMxqhzBOg==} + dev: true + + /remove-trailing-separator@1.1.0: + resolution: {integrity: sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==} + dev: true + + /remove-trailing-spaces@1.0.8: + resolution: {integrity: sha512-O3vsMYfWighyFbTd8hk8VaSj9UAGENxAtX+//ugIst2RMk5e03h6RoIS+0ylsFxY1gvmPuAY/PO4It+gPEeySA==} + dev: true + /require-directory@2.1.1: resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} engines: {node: '>=0.10.0'} @@ -2868,6 +6786,28 @@ packages: engines: {node: '>=0.10.0'} dev: false + /require-main-filename@2.0.0: + resolution: {integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==} + dev: true + + /resolve-alpn@1.2.1: + resolution: {integrity: sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==} + dev: true + + /resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + dev: true + + /resolve-from@5.0.0: + resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} + engines: {node: '>=8'} + dev: true + + /resolve-pkg-maps@1.0.0: + resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} + dev: true + /resolve@1.22.8: resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} hasBin: true @@ -2877,6 +6817,28 @@ packages: supports-preserve-symlinks-flag: 1.0.0 dev: true + /responselike@2.0.1: + resolution: {integrity: sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==} + dependencies: + lowercase-keys: 2.0.0 + dev: true + + /restore-cursor@3.1.0: + resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} + engines: {node: '>=8'} + dependencies: + onetime: 5.1.2 + signal-exit: 3.0.7 + dev: true + + /restore-cursor@4.0.0: + resolution: {integrity: sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + onetime: 5.1.2 + signal-exit: 3.0.7 + dev: true + /ret@0.2.2: resolution: {integrity: sha512-M0b3YWQs7R3Z917WRQy1HHA7Ba7D8hvZg6UE5mLykJxQVE2ju0IXbGlaHPPlkY+WN7wFP+wUMXmBFA0aV6vYGQ==} engines: {node: '>=4'} @@ -2894,15 +6856,55 @@ packages: /reusify@1.0.4: resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - dev: false /rfdc@1.3.0: resolution: {integrity: sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==} - dev: false + + /rimraf@3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + hasBin: true + dependencies: + glob: 7.2.0 + dev: true + + /run-async@2.4.1: + resolution: {integrity: sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==} + engines: {node: '>=0.12.0'} + dev: true + + /run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + dependencies: + queue-microtask: 1.2.3 + dev: true + + /rxjs@7.8.1: + resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==} + dependencies: + tslib: 2.6.2 + dev: true + + /safe-array-concat@1.0.1: + resolution: {integrity: sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q==} + engines: {node: '>=0.4'} + dependencies: + call-bind: 1.0.5 + get-intrinsic: 1.2.2 + has-symbols: 1.0.3 + isarray: 2.0.5 + dev: true /safe-buffer@5.2.1: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + /safe-regex-test@1.0.0: + resolution: {integrity: sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==} + dependencies: + call-bind: 1.0.5 + get-intrinsic: 1.2.2 + is-regex: 1.1.4 + dev: true + /safe-regex2@2.0.0: resolution: {integrity: sha512-PaUSFsUaNNuKwkBijoAPHAK6/eM6VirvyPWlZ7BAQy4D+hCvh4B6lIG+nPdhbFfIbP+gTGBcrdsOaUs0F+ZBOQ==} dependencies: @@ -2916,16 +6918,36 @@ packages: /safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} - dev: false /sax@1.3.0: resolution: {integrity: sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA==} dev: false + /scuid@1.1.0: + resolution: {integrity: sha512-MuCAyrGZcTLfQoH2XoBlQ8C6bzwN88XT/0slOGz0pn8+gIP85BOAfYa44ZXQUTOwRwPU0QvgU+V+OSajl/59Xg==} + dev: true + /secure-json-parse@2.7.0: resolution: {integrity: sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==} dev: false + /semver-regex@4.0.5: + resolution: {integrity: sha512-hunMQrEy1T6Jr2uEVjrAIqjwWcQTgOAcIM52C8MY1EZSD3DDNft04XzvYKPqjED65bNVVko0YI38nYeEHCX3yw==} + engines: {node: '>=12'} + dev: true + + /semver-truncate@3.0.0: + resolution: {integrity: sha512-LJWA9kSvMolR51oDE6PN3kALBNaUdkxzAGcexw8gjMA8xr5zUqK0JiR3CgARSqanYF3Z1YHvsErb1KDgh+v7Rg==} + engines: {node: '>=12'} + dependencies: + semver: 7.5.4 + dev: true + + /semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + dev: true + /semver@7.5.4: resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} engines: {node: '>=10'} @@ -2954,6 +6976,14 @@ packages: - supports-color dev: false + /sentence-case@3.0.4: + resolution: {integrity: sha512-8LS0JInaQMCRoQ7YUytAo/xUu5W2XnQxV2HI/6uM6U7CITS1RqPElr30V6uIqyMKM9lJGRVFy5/4CuzcixNYSg==} + dependencies: + no-case: 3.0.4 + tslib: 2.6.2 + upper-case-first: 2.0.2 + dev: true + /sequelize-cli@6.6.2: resolution: {integrity: sha512-V8Oh+XMz2+uquLZltZES6MVAD+yEnmMfwfn+gpXcDiwE3jyQygLt4xoI0zG8gKt6cRcs84hsKnXAKDQjG/JAgg==} engines: {node: '>=10.0.0'} @@ -3057,6 +7087,10 @@ packages: - supports-color dev: false + /set-blocking@2.0.0: + resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} + dev: true + /set-cookie-parser@2.6.0: resolution: {integrity: sha512-RVnVQxTXuerk653XfuliOxBP81Sf0+qfQE73LIYKcyMYHG94AuH0kgrQpRDuTZnSmjpysHmzxJXKNfa6PjFhyQ==} dev: false @@ -3069,7 +7103,19 @@ packages: get-intrinsic: 1.2.2 gopd: 1.0.1 has-property-descriptors: 1.0.1 - dev: false + + /set-function-name@2.0.1: + resolution: {integrity: sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==} + engines: {node: '>= 0.4'} + dependencies: + define-data-property: 1.1.1 + functions-have-names: 1.2.3 + has-property-descriptors: 1.0.1 + dev: true + + /setimmediate@1.0.5: + resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==} + dev: true /setprototypeof@1.2.0: resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} @@ -3083,19 +7129,36 @@ packages: safe-buffer: 5.2.1 dev: false - /sharp@0.32.6: - resolution: {integrity: sha512-KyLTWwgcR9Oe4d9HwCwNM2l7+J0dUQwn/yf7S0EnTtb0eVS4RxO0eUSvxPtzT4F3SY+C4K6fqdv/DO27sJ/v/w==} - engines: {node: '>=14.15.0'} - requiresBuild: true + /shebang-command@1.2.0: + resolution: {integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==} + engines: {node: '>=0.10.0'} dependencies: - color: 4.2.3 - detect-libc: 2.0.2 - node-addon-api: 6.1.0 - prebuild-install: 7.1.1 - semver: 7.5.4 - simple-get: 4.0.1 - tar-fs: 3.0.4 - tunnel-agent: 0.6.0 + shebang-regex: 1.0.0 + dev: true + + /shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + dependencies: + shebang-regex: 3.0.0 + dev: true + + /shebang-regex@1.0.0: + resolution: {integrity: sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==} + engines: {node: '>=0.10.0'} + dev: true + + /shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + dev: true + + /shell-quote@1.8.1: + resolution: {integrity: sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==} + dev: true + + /shimmer@1.2.1: + resolution: {integrity: sha512-sQTKC1Re/rM6XyFM6fIAGHRPVGvyXfgzIDvzoq608vM+jeyVD0Tu1E6Np0Kc2zAIFWIj963V2800iF/9LPieQw==} dev: false /side-channel@1.0.4: @@ -3104,25 +7167,19 @@ packages: call-bind: 1.0.5 get-intrinsic: 1.2.2 object-inspect: 1.13.1 - dev: false - /simple-concat@1.0.1: - resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==} - dev: false + /signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + dev: true - /simple-get@4.0.1: - resolution: {integrity: sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==} - dependencies: - decompress-response: 6.0.0 - once: 1.4.0 - simple-concat: 1.0.1 - dev: false + /signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + dev: true - /simple-swizzle@0.2.2: - resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} - dependencies: - is-arrayish: 0.3.2 - dev: false + /signedsource@1.0.0: + resolution: {integrity: sha512-6+eerH9fEnNmi/hyM1DXcRK3pWdoMQtlkQ+ns0ntzunjKqp5i3sKCc80ym8Fib3iaYhdJUOPdhlJWj1tvge2Ww==} + dev: true /sinon-chai@3.7.0(chai@4.3.10)(sinon@17.0.1): resolution: {integrity: sha512-mf5NURdUaSdnatJx3uhoBOrY9dtL19fiOtAdT1Azxg3+lNJFiuN0uzaU3xX1LeAfL17kHQhTAJgpsfhbMJMY2g==} @@ -3144,17 +7201,82 @@ packages: nise: 5.1.5 supports-color: 7.2.0 + /slash@3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + dev: true + + /slice-ansi@3.0.0: + resolution: {integrity: sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==} + engines: {node: '>=8'} + dependencies: + ansi-styles: 4.3.0 + astral-regex: 2.0.0 + is-fullwidth-code-point: 3.0.0 + dev: true + + /slice-ansi@4.0.0: + resolution: {integrity: sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + astral-regex: 2.0.0 + is-fullwidth-code-point: 3.0.0 + dev: true + + /slice-ansi@5.0.0: + resolution: {integrity: sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==} + engines: {node: '>=12'} + dependencies: + ansi-styles: 6.2.1 + is-fullwidth-code-point: 4.0.0 + dev: true + + /slice-ansi@7.1.0: + resolution: {integrity: sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==} + engines: {node: '>=18'} + dependencies: + ansi-styles: 6.2.1 + is-fullwidth-code-point: 5.0.0 + dev: true + + /snake-case@3.0.4: + resolution: {integrity: sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==} + dependencies: + dot-case: 3.0.4 + tslib: 2.6.2 + dev: true + /sonic-boom@3.7.0: resolution: {integrity: sha512-IudtNvSqA/ObjN97tfgNmOKyDOs4dNcg4cUUsHDebqsgb8wGBBwb31LIgShNO8fye0dFI52X1+tFoKKI6Rq1Gg==} dependencies: atomic-sleep: 1.0.0 dev: false + /sort-keys-length@1.0.1: + resolution: {integrity: sha512-GRbEOUqCxemTAk/b32F2xa8wDTs+Z1QHOkbhJDQTvv/6G3ZkbJ+frYWsTcc7cBB3Fu4wy4XlLCuNtJuMn7Gsvw==} + engines: {node: '>=0.10.0'} + dependencies: + sort-keys: 1.1.2 + dev: true + + /sort-keys@1.1.2: + resolution: {integrity: sha512-vzn8aSqKgytVik0iwdBEi+zevbTYZogewTUM6dtpmGwEcdzbub/TX4bCzRhebDCRC3QzXgJsLRKB2V/Oof7HXg==} + engines: {node: '>=0.10.0'} + dependencies: + is-plain-obj: 1.1.0 + dev: true + /source-map@0.5.7: resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==} engines: {node: '>=0.10.0'} dev: true + /source-map@0.7.4: + resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} + engines: {node: '>= 8'} + dev: true + /split-on-first@1.1.0: resolution: {integrity: sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw==} engines: {node: '>=6'} @@ -3165,6 +7287,12 @@ packages: engines: {node: '>= 10.x'} dev: false + /sponge-case@1.0.1: + resolution: {integrity: sha512-dblb9Et4DAtiZ5YSUZHLl4XhH4uK80GhAZrVXdN4O2P4gQ40Wa5UIOPUHlA/nFd2PLblBZWUioLMMAVrgpoYcA==} + dependencies: + tslib: 2.6.2 + dev: true + /sprintf-js@1.0.3: resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} dev: false @@ -3177,14 +7305,6 @@ packages: /streamsearch@1.1.0: resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} engines: {node: '>=10.0.0'} - dev: false - - /streamx@2.15.4: - resolution: {integrity: sha512-uSXKl88bibiUCQ1eMpItRljCzDENcDx18rsfDmV79r0e/ThfrAwxG4Y2FarQZ2G4/21xcOKmFFd1Hue+ZIDwHw==} - dependencies: - fast-fifo: 1.3.2 - queue-tick: 1.0.1 - dev: false /strict-uri-encode@2.0.0: resolution: {integrity: sha512-QwiXZgpRcKkhTj2Scnn++4PKtWsH0kpzZ62L2R6c/LUVYv7hVnZqcg2+sMuT6R7Jusu1vviK/MFsu6kNJfWlEQ==} @@ -3194,22 +7314,58 @@ packages: /string-argv@0.3.2: resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} engines: {node: '>=0.6.19'} - dev: false + + /string-env-interpolation@1.0.1: + resolution: {integrity: sha512-78lwMoCcn0nNu8LszbP1UA7g55OeE4v7rCeWnM5B453rnNr4aq+5it3FEYtZrSEiMvHZOZ9Jlqb0OD0M2VInqg==} + dev: true /string-width@4.2.3: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} dependencies: - emoji-regex: 8.0.0 - is-fullwidth-code-point: 3.0.0 - strip-ansi: 6.0.1 + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + dev: true + + /string-width@7.0.0: + resolution: {integrity: sha512-GPQHj7row82Hjo9hKZieKcHIhaAIKOJvFSIZXuCU9OASVZrMNUaZuz++SPVrBjnLsnk4k+z9f2EIypgxf2vNFw==} + engines: {node: '>=18'} + dependencies: + emoji-regex: 10.3.0 + get-east-asian-width: 1.2.0 + strip-ansi: 7.1.0 + dev: true + + /string.prototype.trim@1.2.8: + resolution: {integrity: sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.5 + define-properties: 1.2.1 + es-abstract: 1.22.3 + dev: true + + /string.prototype.trimend@1.0.7: + resolution: {integrity: sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==} + dependencies: + call-bind: 1.0.5 + define-properties: 1.2.1 + es-abstract: 1.22.3 + dev: true + + /string.prototype.trimstart@1.0.7: + resolution: {integrity: sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==} + dependencies: + call-bind: 1.0.5 + define-properties: 1.2.1 + es-abstract: 1.22.3 dev: true /string_decoder@1.3.0: resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} dependencies: safe-buffer: 5.2.1 - dev: false /strip-ansi@6.0.1: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} @@ -3218,20 +7374,54 @@ packages: ansi-regex: 5.0.1 dev: true - /strip-json-comments@2.0.1: - resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} + /strip-ansi@7.1.0: + resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + engines: {node: '>=12'} + dependencies: + ansi-regex: 6.0.1 + dev: true + + /strip-bom@3.0.0: + resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} + engines: {node: '>=4'} + + /strip-eof@1.0.0: + resolution: {integrity: sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==} engines: {node: '>=0.10.0'} - dev: false + dev: true + + /strip-final-newline@2.0.0: + resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} + engines: {node: '>=6'} + dev: true + + /strip-final-newline@3.0.0: + resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} + engines: {node: '>=12'} + dev: true /strip-json-comments@3.1.1: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} dev: true + /strip-outer@2.0.0: + resolution: {integrity: sha512-A21Xsm1XzUkK0qK1ZrytDUvqsQWict2Cykhvi0fBQntGG5JSprESasEyV1EZ/4CiR5WB5KjzLTrP/bO37B0wPg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dev: true + /strnum@1.0.5: resolution: {integrity: sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==} dev: false + /strtok3@7.0.0: + resolution: {integrity: sha512-pQ+V+nYQdC5H3Q7qBZAz/MO6lwGhoC2gOAjuouGf/VO0m7vQRh8QNMl2Uf6SwAtzZ9bOw3UIeBukEGNJl5dtXQ==} + engines: {node: '>=14.16'} + dependencies: + '@tokenizer/token': 0.3.0 + peek-readable: 5.0.0 + dev: true + /supports-color@5.5.0: resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} engines: {node: '>=4'} @@ -3256,41 +7446,15 @@ packages: engines: {node: '>= 0.4'} dev: true - /tar-fs@2.1.1: - resolution: {integrity: sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==} - dependencies: - chownr: 1.1.4 - mkdirp-classic: 0.5.3 - pump: 3.0.0 - tar-stream: 2.2.0 - dev: false - - /tar-fs@3.0.4: - resolution: {integrity: sha512-5AFQU8b9qLfZCX9zp2duONhPmZv0hGYiBPJsyUdqMjzq/mqVpy/rEUSeHk1+YitmxugaptgBh5oDGU3VsAJq4w==} - dependencies: - mkdirp-classic: 0.5.3 - pump: 3.0.0 - tar-stream: 3.1.6 - dev: false - - /tar-stream@2.2.0: - resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} - engines: {node: '>=6'} + /swap-case@2.0.2: + resolution: {integrity: sha512-kc6S2YS/2yXbtkSMunBtKdah4VFETZ8Oh6ONSmSd9bRxhqTrtARUCBUiWXH3xVPpvR7tz2CSnkuXVE42EcGnMw==} dependencies: - bl: 4.1.0 - end-of-stream: 1.4.4 - fs-constants: 1.0.0 - inherits: 2.0.4 - readable-stream: 3.6.2 - dev: false + tslib: 2.6.2 + dev: true - /tar-stream@3.1.6: - resolution: {integrity: sha512-B/UyjYwPpMBv+PaFSWAmtYjwdrlEaZQEhMIBFNC5oEG8lpiW8XjcSdmEaClj28ArfKScKHs2nshz3k2le6crsg==} - dependencies: - b4a: 1.6.4 - fast-fifo: 1.3.2 - streamx: 2.15.4 - dev: false + /text-table@0.2.0: + resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + dev: true /thread-stream@2.4.1: resolution: {integrity: sha512-d/Ex2iWd1whipbT681JmTINKw0ZwOUBZm7+Gjs64DHuX34mmw8vJL2bFAaNacaW72zYiTJxSHi5abUuOi5nsfg==} @@ -3304,6 +7468,10 @@ packages: readable-stream: 3.6.2 dev: false + /through@2.3.8: + resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} + dev: true + /timers-ext@0.1.7: resolution: {integrity: sha512-b85NUNzTSdodShTIbky6ZF02e8STtVVfD+fu4aXXShEELpozH+bCpJLYMPZbsABN2wDH7fJpqIoXxJpzbf0NqQ==} dependencies: @@ -3311,6 +7479,19 @@ packages: next-tick: 1.1.0 dev: true + /title-case@3.0.3: + resolution: {integrity: sha512-e1zGYRvbffpcHIrnuqT0Dh+gEJtDaxDSoG4JAIpq4oDFyooziLBIiYQv0GBT4FUAnUop5uZ1hiIAj7oAF6sOCA==} + dependencies: + tslib: 2.6.2 + dev: true + + /tmp@0.0.33: + resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} + engines: {node: '>=0.6.0'} + dependencies: + os-tmpdir: 1.0.2 + dev: true + /to-fast-properties@2.0.0: resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} engines: {node: '>=4'} @@ -3333,32 +7514,133 @@ packages: engines: {node: '>=0.6'} dev: false + /token-types@5.0.1: + resolution: {integrity: sha512-Y2fmSnZjQdDb9W4w4r1tswlMHylzWIeOKpx0aZH9BgGtACHhrk3OkT52AzwcuqTRBZtvvnTjDBh8eynMulu8Vg==} + engines: {node: '>=14.16'} + dependencies: + '@tokenizer/token': 0.3.0 + ieee754: 1.2.1 + dev: true + /toposort-class@1.0.1: resolution: {integrity: sha512-OsLcGGbYF3rMjPUf8oKktyvCiUxSbqMMS39m33MAjLTC1DVIH6x3WSt63/M77ihI09+Sdfk1AXvfhCEeUmC7mg==} dev: false /tr46@0.0.3: resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + + /trim-repeated@2.0.0: + resolution: {integrity: sha512-QUHBFTJGdOwmp0tbOG505xAgOp/YliZP/6UgafFXYZ26WT1bvQmSMJUvkeVSASuJJHbqsFbynTvkd5W8RBTipg==} + engines: {node: '>=12'} + dependencies: + escape-string-regexp: 5.0.0 + dev: true + + /ts-api-utils@1.0.3(typescript@5.3.3): + resolution: {integrity: sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==} + engines: {node: '>=16.13.0'} + peerDependencies: + typescript: '>=4.2.0' + dependencies: + typescript: 5.3.3 + dev: true + + /ts-log@2.2.5: + resolution: {integrity: sha512-PGcnJoTBnVGy6yYNFxWVNkdcAuAMstvutN9MgDJIV6L0oG8fB+ZNNy1T+wJzah8RPGor1mZuPQkVfXNDpy9eHA==} + dev: true + + /ts-node@10.9.2(@swc/core@1.3.102)(@types/node@20.10.6)(typescript@5.3.3): + resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==} + hasBin: true + peerDependencies: + '@swc/core': '>=1.2.50' + '@swc/wasm': '>=1.2.50' + '@types/node': '*' + typescript: '>=2.7' + peerDependenciesMeta: + '@swc/core': + optional: true + '@swc/wasm': + optional: true + dependencies: + '@cspotcode/source-map-support': 0.8.1 + '@swc/core': 1.3.102(@swc/helpers@0.5.3) + '@tsconfig/node10': 1.0.9 + '@tsconfig/node12': 1.0.11 + '@tsconfig/node14': 1.0.3 + '@tsconfig/node16': 1.0.4 + '@types/node': 20.10.6 + acorn: 8.11.3 + acorn-walk: 8.3.1 + arg: 4.1.3 + create-require: 1.1.1 + diff: 4.0.2 + make-error: 1.3.6 + typescript: 5.3.3 + v8-compile-cache-lib: 3.0.1 + yn: 3.1.1 + dev: true + + /tsconfig-paths@3.15.0: + resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} + dependencies: + '@types/json5': 0.0.29 + json5: 1.0.2 + minimist: 1.2.8 + strip-bom: 3.0.0 + dev: true + + /tsconfig-paths@4.2.0: + resolution: {integrity: sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==} + engines: {node: '>=6'} + dependencies: + json5: 2.2.3 + minimist: 1.2.8 + strip-bom: 3.0.0 dev: false + /tslib@2.5.3: + resolution: {integrity: sha512-mSxlJJwl3BMEQCUNnxXBU9jP4JBktcEGhURcPR6VQVlnP0FdDEsIaz0C35dXNGLyRfrATNofF0F5p2KPxQgB+w==} + dev: true + /tslib@2.6.2: resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} - dev: false - /tunnel-agent@0.6.0: - resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} + /tsx@4.7.0: + resolution: {integrity: sha512-I+t79RYPlEYlHn9a+KzwrvEwhJg35h/1zHsLC2JXvhC2mdynMv6Zxzvhv5EMV6VF5qJlLlkSnMVvdZV3PSIGcg==} + engines: {node: '>=18.0.0'} + hasBin: true dependencies: - safe-buffer: 5.2.1 - dev: false + esbuild: 0.19.11 + get-tsconfig: 4.7.2 + optionalDependencies: + fsevents: 2.3.3 + dev: true + + /type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + dependencies: + prelude-ls: 1.2.1 + dev: true /type-detect@4.0.8: resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} engines: {node: '>=4'} + /type-fest@0.20.2: + resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} + engines: {node: '>=10'} + dev: true + + /type-fest@0.21.3: + resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} + engines: {node: '>=10'} + dev: true + /type-fest@3.13.1: resolution: {integrity: sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==} engines: {node: '>=14.16'} - dev: false /type-is@1.6.18: resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} @@ -3376,12 +7658,54 @@ packages: resolution: {integrity: sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==} dev: true + /typed-array-buffer@1.0.0: + resolution: {integrity: sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.5 + get-intrinsic: 1.2.2 + is-typed-array: 1.1.12 + dev: true + + /typed-array-byte-length@1.0.0: + resolution: {integrity: sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.5 + for-each: 0.3.3 + has-proto: 1.0.1 + is-typed-array: 1.1.12 + dev: true + + /typed-array-byte-offset@1.0.0: + resolution: {integrity: sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==} + engines: {node: '>= 0.4'} + dependencies: + available-typed-arrays: 1.0.5 + call-bind: 1.0.5 + for-each: 0.3.3 + has-proto: 1.0.1 + is-typed-array: 1.1.12 + dev: true + + /typed-array-length@1.0.4: + resolution: {integrity: sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==} + dependencies: + call-bind: 1.0.5 + for-each: 0.3.3 + is-typed-array: 1.1.12 + dev: true + /typescript@5.3.3: resolution: {integrity: sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==} engines: {node: '>=14.17'} hasBin: true dev: true + /ua-parser-js@1.0.37: + resolution: {integrity: sha512-bhTyI94tZofjo+Dn8SN6Zv8nBDvyXTymAdM3LDI/0IboIUwTu1rEhW7v2TfiVsoYWgkQ4kOVqnI8APUFbIQIFQ==} + dev: true + /umzug@2.3.0: resolution: {integrity: sha512-Z274K+e8goZK8QJxmbRPhl89HPO1K+ORFtm6rySPhFKfKc5GHhqdzD0SGhSWHkzoXasqJuItdhorSvY7/Cgflw==} engines: {node: '>=6.0.0'} @@ -3400,6 +7724,20 @@ packages: type-fest: 3.13.1 dev: false + /unbox-primitive@1.0.2: + resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} + dependencies: + call-bind: 1.0.5 + has-bigints: 1.0.2 + has-symbols: 1.0.3 + which-boxed-primitive: 1.0.2 + dev: true + + /unc-path-regex@0.1.2: + resolution: {integrity: sha512-eXL4nmJT7oCpkZsHZUOJo8hcX3GbsiDOa0Qu9F646fi8dT3XuSVopVqAcEiVzSKKH7UoDti23wNX3qGFxcW5Qg==} + engines: {node: '>=0.10.0'} + dev: true + /underscore@1.13.6: resolution: {integrity: sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A==} dev: false @@ -3412,16 +7750,53 @@ packages: engines: {node: '>= 10.0.0'} dev: true + /unixify@1.0.0: + resolution: {integrity: sha512-6bc58dPYhCMHHuwxldQxO3RRNZ4eCogZ/st++0+fcC1nr0jiGUtAdBJ2qzmLQWSxbtz42pWt4QQMiZ9HvZf5cg==} + engines: {node: '>=0.10.0'} + dependencies: + normalize-path: 2.1.1 + dev: true + /unpipe@1.0.0: resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} engines: {node: '>= 0.8'} dev: false + /update-browserslist-db@1.0.13(browserslist@4.22.2): + resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + dependencies: + browserslist: 4.22.2 + escalade: 3.1.1 + picocolors: 1.0.0 + dev: true + + /upper-case-first@2.0.2: + resolution: {integrity: sha512-514ppYHBaKwfJRK/pNC6c/OxfGa0obSnAl106u97Ed0I625Nin96KAjttZF6ZL3e1XLtphxnqrOi9iWgm+u+bg==} + dependencies: + tslib: 2.6.2 + dev: true + + /upper-case@2.0.2: + resolution: {integrity: sha512-KgdgDGJt2TpuwBUIjgG6lzw2GWFRCW9Qkfkiv0DxqHHLYJHmtmdUIKcZd8rHgFSjopVTlw6ggzCm1b8MFQwikg==} + dependencies: + tslib: 2.6.2 + dev: true + /uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} dependencies: punycode: 2.3.1 - dev: false + + /urlpattern-polyfill@8.0.2: + resolution: {integrity: sha512-Qp95D4TPJl1kC9SKigDcqgyM2VDVO4RiJc2d4qe5GrYm+zbIQCWWKAFaJNQ4BhdFeDGwBmAxqJBwWSJDb9T3BQ==} + dev: true + + /urlpattern-polyfill@9.0.0: + resolution: {integrity: sha512-WHN8KDQblxd32odxeIgo83rdVDE2bvdkb86it7bMhYZwWKJz0+O0RK/eZiHYnM+zgt/U7hAHOlCQGfjjvSkw2g==} + dev: true /utf-8-validate@6.0.3: resolution: {integrity: sha512-uIuGf9TWQ/y+0Lp+KGZCMuJWc3N9BHA+l/UmHd/oUHwJJDeysyTRxNQVkbzsIWfGFbRe3OcgML/i0mvVRPOyDA==} @@ -3429,12 +7804,10 @@ packages: requiresBuild: true dependencies: node-gyp-build: 4.7.1 - dev: false /util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} requiresBuild: true - dev: false /util@0.12.5: resolution: {integrity: sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==} @@ -3461,6 +7834,10 @@ packages: hasBin: true dev: false + /v8-compile-cache-lib@3.0.1: + resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} + dev: true + /validator@13.11.0: resolution: {integrity: sha512-Ii+sehpSfZy+At5nPdnyMhx78fEoPDkR2XW/zimHEL3MyGJQOCQ7WeP20jPYRz7ZCpcKLB21NxuXHF3bxjStBQ==} engines: {node: '>= 0.10'} @@ -3469,13 +7846,18 @@ packages: /value-or-promise@1.0.12: resolution: {integrity: sha512-Z6Uz+TYwEqE7ZN50gwn+1LCVo9ZVrpxRPOhOLnncYkY1ZzOYtrX8Fwf/rFktZ8R5mJms6EZf5TqNOMeZmnPq9Q==} engines: {node: '>=12'} - dev: false /vary@1.1.2: resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} engines: {node: '>= 0.8'} dev: false + /wcwidth@1.0.1: + resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} + dependencies: + defaults: 1.0.4 + dev: true + /web-encoding@1.1.5: resolution: {integrity: sha512-HYLeVCdJ0+lBYV2FvNZmv3HJ2Nt0QYXqZojk3d9FJOLkwnuhzM9tmamh8d7HPM8QqjKH8DeHkFTx+CFlWpZZDA==} dependencies: @@ -3484,9 +7866,23 @@ packages: '@zxing/text-encoding': 0.9.0 dev: false + /web-streams-polyfill@3.3.2: + resolution: {integrity: sha512-3pRGuxRF5gpuZc0W+EpwQRmCD7gRqcDOMt688KmdlDAgAyaB1XlN0zq2njfDNm44XVdIouE7pZ6GzbdyH47uIQ==} + engines: {node: '>= 8'} + dev: true + + /webcrypto-core@1.7.7: + resolution: {integrity: sha512-7FjigXNsBfopEj+5DV2nhNpfic2vumtjjgPmeDKk45z+MJwXKKfhPB7118Pfzrmh4jqOMST6Ch37iPAHoImg5g==} + dependencies: + '@peculiar/asn1-schema': 2.3.8 + '@peculiar/json-schema': 1.1.12 + asn1js: 3.0.5 + pvtsutils: 1.3.5 + tslib: 2.6.2 + dev: true + /webidl-conversions@3.0.1: resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} - dev: false /whatwg-mimetype@3.0.0: resolution: {integrity: sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==} @@ -3498,7 +7894,20 @@ packages: dependencies: tr46: 0.0.3 webidl-conversions: 3.0.1 - dev: false + + /which-boxed-primitive@1.0.2: + resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} + dependencies: + is-bigint: 1.0.4 + is-boolean-object: 1.1.2 + is-number-object: 1.0.7 + is-string: 1.0.7 + is-symbol: 1.0.4 + dev: true + + /which-module@2.0.1: + resolution: {integrity: sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==} + dev: true /which-typed-array@1.1.13: resolution: {integrity: sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow==} @@ -3509,7 +7918,21 @@ packages: for-each: 0.3.3 gopd: 1.0.1 has-tostringtag: 1.0.0 - dev: false + + /which@1.3.1: + resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} + hasBin: true + dependencies: + isexe: 2.0.0 + dev: true + + /which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + dependencies: + isexe: 2.0.0 + dev: true /wkx@0.5.0: resolution: {integrity: sha512-Xng/d4Ichh8uN4l0FToV/258EjMGU9MGcA0HV2d9B/ZpZB3lqQm7nkOdZdm5GhKtLLhAE7PiVQwN4eN+2YJJUg==} @@ -3521,6 +7944,15 @@ packages: resolution: {integrity: sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==} dev: true + /wrap-ansi@6.2.0: + resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} + engines: {node: '>=8'} + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + dev: true + /wrap-ansi@7.0.0: resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} engines: {node: '>=10'} @@ -3530,6 +7962,15 @@ packages: strip-ansi: 6.0.1 dev: true + /wrap-ansi@9.0.0: + resolution: {integrity: sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==} + engines: {node: '>=18'} + dependencies: + ansi-styles: 6.2.1 + string-width: 7.0.0 + strip-ansi: 7.1.0 + dev: true + /wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} requiresBuild: true @@ -3550,6 +7991,22 @@ packages: utf-8-validate: 6.0.3 dev: false + /ws@8.16.0(bufferutil@4.0.8)(utf-8-validate@6.0.3): + resolution: {integrity: sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + dependencies: + bufferutil: 4.0.8 + utf-8-validate: 6.0.3 + dev: true + /xml2js@0.5.0: resolution: {integrity: sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA==} engines: {node: '>=4.0.0'} @@ -3582,14 +8039,42 @@ packages: yjs: 13.6.10 dev: false + /y18n@4.0.3: + resolution: {integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==} + dev: true + /y18n@5.0.8: resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} engines: {node: '>=10'} dev: true + /yallist@2.1.2: + resolution: {integrity: sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==} + + /yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + dev: true + /yallist@4.0.0: resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + /yaml-ast-parser@0.0.43: + resolution: {integrity: sha512-2PTINUwsRqSd+s8XxKaJWQlUuEMHJQyEuh2edBbW8KNJz0SJPwUSD2zRWqezFEdN7IzAgeuYHFUCF7o8zRdZ0A==} + dev: true + + /yaml@2.3.4: + resolution: {integrity: sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==} + engines: {node: '>= 14'} + dev: true + + /yargs-parser@18.1.3: + resolution: {integrity: sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==} + engines: {node: '>=6'} + dependencies: + camelcase: 5.3.1 + decamelize: 1.2.0 + dev: true + /yargs-parser@20.2.4: resolution: {integrity: sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==} engines: {node: '>=10'} @@ -3600,6 +8085,11 @@ packages: engines: {node: '>=10'} dev: true + /yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + dev: true + /yargs-unparser@2.0.0: resolution: {integrity: sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==} engines: {node: '>=10'} @@ -3610,6 +8100,23 @@ packages: is-plain-obj: 2.1.0 dev: true + /yargs@15.4.1: + resolution: {integrity: sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==} + engines: {node: '>=8'} + dependencies: + cliui: 6.0.0 + decamelize: 1.2.0 + find-up: 4.1.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + require-main-filename: 2.0.0 + set-blocking: 2.0.0 + string-width: 4.2.3 + which-module: 2.0.1 + y18n: 4.0.3 + yargs-parser: 18.1.3 + dev: true + /yargs@16.2.0: resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} engines: {node: '>=10'} @@ -3623,6 +8130,19 @@ packages: yargs-parser: 20.2.9 dev: true + /yargs@17.7.2: + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: '>=12'} + dependencies: + cliui: 8.0.1 + escalade: 3.1.1 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 21.1.1 + dev: true + /yjs@13.6.10: resolution: {integrity: sha512-1JcyQek1vaMyrDm7Fqfa+pvHg/DURSbVo4VmeN7wjnTKB/lZrfIPhdCj7d8sboK6zLfRBJXegTjc9JlaDd8/Zw==} engines: {node: '>=16.0.0', npm: '>=8.0.0'} @@ -3630,6 +8150,11 @@ packages: lib0: 0.2.88 dev: false + /yn@3.1.1: + resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} + engines: {node: '>=6'} + dev: true + /yn@5.0.0: resolution: {integrity: sha512-+l37+9TyGEsyxGLaTg6QgYy5KnOp74ZZl4dPFLQpBWSkO99uBC5jnS0pOGwXFViPbiaEtWbParH2KrgWWF2duQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} diff --git a/backend/src/__generated__/resolvers-types.ts b/backend/src/__generated__/resolvers-types.ts new file mode 100644 index 0000000..d29a43c --- /dev/null +++ b/backend/src/__generated__/resolvers-types.ts @@ -0,0 +1,1135 @@ +import { type GraphQLResolveInfo, GraphQLScalarType, type GraphQLScalarTypeConfig } from 'graphql'; + +import { type ApolloContext } from '../server/apollo.js'; + +export type Maybe = T | null; +export type InputMaybe = Maybe; +export type Exact = { [K in keyof T]: T[K] }; +export type MakeOptional = Omit & { [SubKey in K]?: Maybe }; +export type MakeMaybe = Omit & { [SubKey in K]: Maybe }; +export type MakeEmpty = { [_ in K]?: never }; +export type Incremental = T | { [P in keyof T]?: P extends ' $fragmentName' | '__typename' ? T[P] : never }; +export type RequireFields = Omit & { [P in K]-?: NonNullable }; +/** All built-in and custom scalars, mapped to their actual values */ +export type Scalars = { + ID: { input: string; output: string }; + String: { input: string; output: string }; + Boolean: { input: boolean; output: boolean }; + Int: { input: number; output: number }; + Float: { input: number; output: number }; + DateTime: { input: any; output: any }; + Upload: { input: any; output: any }; +}; + +export type AddUserToProjectInput = { + projectId: Scalars['String']['input']; + userId: Scalars['String']['input']; +}; + +export type Asset = { + __typename?: 'Asset'; + assetPath?: Maybe; + assetSubType?: Maybe; + assetType?: Maybe; + createdAt?: Maybe; + id: Scalars['ID']['output']; + ownerId?: Maybe; + updatedAt?: Maybe; +}; + +export type AssignAssetAsAvatarInput = { + assetId: Scalars['String']['input']; +}; + +export type Board = { + __typename?: 'Board'; + backlogEnabled?: Maybe; + columns?: Maybe>>; + containerOrder?: Maybe; + createdAt?: Maybe; + id?: Maybe; + issues?: Maybe>>; + name?: Maybe; + projectId?: Maybe; + settings?: Maybe; + status?: Maybe; + style?: Maybe; + updatedAt?: Maybe; + viewState?: Maybe>>; +}; + +export enum BoardStyle { + Kanban = 'KANBAN', + Scrum = 'SCRUM', +} + +export enum Custom_Field_Type { + Boolean = 'BOOLEAN', + Date = 'DATE', + Number = 'NUMBER', + Text = 'TEXT', +} + +export type Column = { + __typename?: 'Column'; + id: Scalars['ID']['output']; + issues?: Maybe>>; + title: Scalars['String']['output']; +}; + +export type CreateBoardInput = { + name?: InputMaybe; + projectId?: InputMaybe; + style?: InputMaybe; +}; + +export type CreateIssueCommentInput = { + comment: Scalars['String']['input']; + commentRaw?: InputMaybe; + issueId: Scalars['String']['input']; +}; + +export type CreateIssueInput = { + assigneeId?: InputMaybe; + boardId?: InputMaybe; + description?: InputMaybe; + issueStatusId?: InputMaybe; + priority?: InputMaybe; + projectId: Scalars['String']['input']; + title: Scalars['String']['input']; +}; + +export type CreateIssueLinkInput = { + issueId: Scalars['String']['input']; + linkType: Scalars['String']['input']; + linkedIssueId: Scalars['String']['input']; +}; + +export type CreateIssueStatusInput = { + name: Scalars['String']['input']; + projectId: Scalars['String']['input']; +}; + +export type CreateProjectCustomFieldInput = { + fieldName: Scalars['String']['input']; + fieldType: Custom_Field_Type; + projectId: Scalars['String']['input']; +}; + +export type CreateProjectInput = { + boardName: Scalars['String']['input']; + boardStyle: BoardStyle; + description?: InputMaybe; + key: Scalars['String']['input']; + name: Scalars['String']['input']; + visibility?: InputMaybe; +}; + +export type CreateProjectTagInput = { + name: Scalars['String']['input']; + projectId: Scalars['String']['input']; +}; + +export type CreateProjectValidationInput = { + key?: InputMaybe; + name?: InputMaybe; +}; + +export type CustomField = { + __typename?: 'CustomField'; + createdAt?: Maybe; + fieldName: Scalars['String']['output']; + fieldType: Custom_Field_Type; + id: Scalars['ID']['output']; + projectId: Scalars['String']['output']; + updatedAt?: Maybe; +}; + +export type CustomFieldValue = { + __typename?: 'CustomFieldValue'; + createdAt?: Maybe; + customField?: Maybe; + customFieldId: Scalars['String']['output']; + id: Scalars['ID']['output']; + updatedAt?: Maybe; + value: Scalars['String']['output']; +}; + +export type DeleteAssetInput = { + assetId: Scalars['String']['input']; +}; + +export type DeleteIssueCommentInput = { + commentId: Scalars['String']['input']; +}; + +export type DeleteIssueInput = { + id: Scalars['String']['input']; +}; + +export type DeleteIssueLinkInput = { + issueId: Scalars['String']['input']; + linkType: Scalars['String']['input']; + linkedIssueId: Scalars['String']['input']; +}; + +export type DeleteProjectCustomFieldInput = { + id: Scalars['String']['input']; +}; + +export type DeleteProjectTagInput = { + id: Scalars['String']['input']; +}; + +export type File = { + __typename?: 'File'; + encoding: Scalars['String']['output']; + filename: Scalars['String']['output']; + mimetype: Scalars['String']['output']; +}; + +export type Issue = { + __typename?: 'Issue'; + archived?: Maybe; + assignee?: Maybe; + comments?: Maybe>>; + createdAt?: Maybe; + customFields?: Maybe>>; + description?: Maybe; + id: Scalars['ID']['output']; + linkType?: Maybe; + linkedIssueId?: Maybe; + links?: Maybe>>; + priority?: Maybe; + project?: Maybe; + projectId?: Maybe; + reporter?: Maybe; + status?: Maybe; + tags?: Maybe>>; + title: Scalars['String']['output']; + updatedAt?: Maybe; +}; + +export type IssueComment = { + __typename?: 'IssueComment'; + comment: Scalars['String']['output']; + createdAt?: Maybe; + id: Scalars['ID']['output']; + issueId: Scalars['String']['output']; + reporter: User; + updatedAt?: Maybe; +}; + +export type IssueStatus = { + __typename?: 'IssueStatus'; + createdAt?: Maybe; + id: Scalars['ID']['output']; + name: Scalars['String']['output']; + projectId?: Maybe; + updatedAt?: Maybe; +}; + +export type MessageAndStatus = { + __typename?: 'MessageAndStatus'; + message?: Maybe; + status?: Maybe; +}; + +export type Mutation = { + __typename?: 'Mutation'; + addUserToProject?: Maybe; + assignAssetAsAvatar?: Maybe; + createBoard?: Maybe; + createIssue?: Maybe; + createIssueComment?: Maybe; + createIssueLink?: Maybe; + createIssueStatus?: Maybe; + createProject?: Maybe; + createProjectCustomField?: Maybe; + createProjectTag?: Maybe; + deleteAsset?: Maybe; + deleteIssue?: Maybe; + deleteIssueComment?: Maybe; + deleteIssueLink?: Maybe; + deleteProjectCustomField?: Maybe; + deleteProjectTag?: Maybe; + removeUserFromProject?: Maybe; + updateBoard?: Maybe; + updateIssue?: Maybe; + updateIssueComment?: Maybe; + updateMe?: Maybe; + uploadAsset?: Maybe; +}; + +export type MutationAddUserToProjectArgs = { + input: AddUserToProjectInput; +}; + +export type MutationAssignAssetAsAvatarArgs = { + input: AssignAssetAsAvatarInput; +}; + +export type MutationCreateBoardArgs = { + input?: InputMaybe; +}; + +export type MutationCreateIssueArgs = { + input?: InputMaybe; +}; + +export type MutationCreateIssueCommentArgs = { + input: CreateIssueCommentInput; +}; + +export type MutationCreateIssueLinkArgs = { + input: CreateIssueLinkInput; +}; + +export type MutationCreateIssueStatusArgs = { + input: CreateIssueStatusInput; +}; + +export type MutationCreateProjectArgs = { + input?: InputMaybe; +}; + +export type MutationCreateProjectCustomFieldArgs = { + input: CreateProjectCustomFieldInput; +}; + +export type MutationCreateProjectTagArgs = { + input: CreateProjectTagInput; +}; + +export type MutationDeleteAssetArgs = { + input: DeleteAssetInput; +}; + +export type MutationDeleteIssueArgs = { + input: DeleteIssueInput; +}; + +export type MutationDeleteIssueCommentArgs = { + input: DeleteIssueCommentInput; +}; + +export type MutationDeleteIssueLinkArgs = { + input: DeleteIssueLinkInput; +}; + +export type MutationDeleteProjectCustomFieldArgs = { + input: DeleteProjectCustomFieldInput; +}; + +export type MutationDeleteProjectTagArgs = { + input: DeleteProjectTagInput; +}; + +export type MutationRemoveUserFromProjectArgs = { + input: RemoveUserFromProjectInput; +}; + +export type MutationUpdateBoardArgs = { + input?: InputMaybe; +}; + +export type MutationUpdateIssueArgs = { + input?: InputMaybe; +}; + +export type MutationUpdateIssueCommentArgs = { + input: UpdateIssueCommentInput; +}; + +export type MutationUpdateMeArgs = { + input: UpdateMeInput; +}; + +export type MutationUploadAssetArgs = { + input: UploadAssetInput; +}; + +export enum Order { + Asc = 'ASC', + Desc = 'DESC', +} + +export type Project = { + __typename?: 'Project'; + boards?: Maybe>>; + createdAt?: Maybe; + customFields?: Maybe>>; + description?: Maybe; + id?: Maybe; + imageId?: Maybe; + issueCount?: Maybe; + issueStatuses?: Maybe>>; + issues?: Maybe>>; + key?: Maybe; + name?: Maybe; + status?: Maybe; + tags?: Maybe>>; + updatedAt?: Maybe; + users?: Maybe>>; + visibility?: Maybe; +}; + +export type ProjectIssuesArgs = { + input?: InputMaybe; +}; + +export type ProjectTag = { + __typename?: 'ProjectTag'; + createdAt?: Maybe; + id: Scalars['ID']['output']; + name: Scalars['String']['output']; + projectId: Scalars['String']['output']; + updatedAt?: Maybe; +}; + +export enum ProjectVisibility { + Internal = 'INTERNAL', + Private = 'PRIVATE', + Public = 'PUBLIC', +} + +export type Query = { + __typename?: 'Query'; + board?: Maybe; + boards?: Maybe>>; + createProjectValidation?: Maybe; + helloWorld: Scalars['String']['output']; + issue?: Maybe; + issues?: Maybe>>; + me?: Maybe; + project?: Maybe; + projectTags?: Maybe>>; + projects?: Maybe>>; + user?: Maybe; + users?: Maybe>>; +}; + +export type QueryBoardArgs = { + input: QueryBoardInput; +}; + +export type QueryCreateProjectValidationArgs = { + input: CreateProjectValidationInput; +}; + +export type QueryIssueArgs = { + input?: InputMaybe; +}; + +export type QueryIssuesArgs = { + input?: InputMaybe; +}; + +export type QueryProjectArgs = { + input?: InputMaybe; +}; + +export type QueryProjectTagsArgs = { + input: QueryProjectTagsInput; +}; + +export type QueryProjectsArgs = { + input?: InputMaybe; +}; + +export type QueryBoardInput = { + id?: InputMaybe; +}; + +export type QueryIssueInput = { + id?: InputMaybe; + projectId?: InputMaybe; + search?: InputMaybe; + searchOperator?: InputMaybe; + sortBy?: InputMaybe>>; +}; + +export type QueryProjectInput = { + id?: InputMaybe; +}; + +export type QueryProjectTagsInput = { + id?: InputMaybe; + name?: InputMaybe; + projectId: Scalars['String']['input']; +}; + +export type RemoveUserFromProjectInput = { + projectId: Scalars['String']['input']; + userId: Scalars['String']['input']; +}; + +export type SortBy = { + field: Scalars['String']['input']; + order: Order; +}; + +export type UpdateBoardInput = { + backlogEnabled?: InputMaybe; + containerOrder?: InputMaybe; + id: Scalars['String']['input']; + name?: InputMaybe; + settings?: InputMaybe; + viewState?: InputMaybe>>; +}; + +export type UpdateIssueCommentInput = { + comment: Scalars['String']['input']; + commentId: Scalars['String']['input']; +}; + +export type UpdateIssueInput = { + archived?: InputMaybe; + assigneeId?: InputMaybe; + customFieldId?: InputMaybe; + customFieldValue?: InputMaybe; + description?: InputMaybe; + id: Scalars['String']['input']; + issueStatusId?: InputMaybe; + priority?: InputMaybe; + reporterId?: InputMaybe; + tagIds?: InputMaybe>>; + title?: InputMaybe; +}; + +export type UpdateMeInput = { + firstName?: InputMaybe; + lastName?: InputMaybe; +}; + +export type UploadAssetInput = { + assetExtension: Scalars['String']['input']; + file: Scalars['Upload']['input']; +}; + +export type User = { + __typename?: 'User'; + avatarUrl?: Maybe; + email?: Maybe; + externalId?: Maybe; + firstName?: Maybe; + id?: Maybe; + lastName?: Maybe; + name?: Maybe; +}; + +export type ViewState = { + __typename?: 'ViewState'; + id: Scalars['ID']['output']; + items?: Maybe>>; + title?: Maybe; +}; + +export type ViewStateInput = { + id: Scalars['ID']['input']; + items?: InputMaybe>>; + title?: InputMaybe; +}; + +export type ViewStateIssueStatus = { + __typename?: 'ViewStateIssueStatus'; + id: Scalars['ID']['output']; + name?: Maybe; + projectId?: Maybe; +}; + +export type ViewStateIssueStatusInput = { + id: Scalars['ID']['input']; + name?: InputMaybe; + projectId?: InputMaybe; +}; + +export type ViewStateItem = { + __typename?: 'ViewStateItem'; + id: Scalars['ID']['output']; + status?: Maybe; + title?: Maybe; +}; + +export type ViewStateItemInput = { + id: Scalars['ID']['input']; + status?: InputMaybe; + title?: InputMaybe; +}; + +export type WithIndex = TObject & Record; +export type ResolversObject = WithIndex; + +export type ResolverTypeWrapper = Promise | T; + +export type ResolverWithResolve = { + resolve: ResolverFn; +}; +export type Resolver = + | ResolverFn + | ResolverWithResolve; + +export type ResolverFn = ( + parent: TParent, + args: TArgs, + context: TContext, + info: GraphQLResolveInfo +) => Promise | TResult; + +export type SubscriptionSubscribeFn = ( + parent: TParent, + args: TArgs, + context: TContext, + info: GraphQLResolveInfo +) => AsyncIterable | Promise>; + +export type SubscriptionResolveFn = ( + parent: TParent, + args: TArgs, + context: TContext, + info: GraphQLResolveInfo +) => TResult | Promise; + +export interface SubscriptionSubscriberObject { + subscribe: SubscriptionSubscribeFn<{ [key in TKey]: TResult }, TParent, TContext, TArgs>; + resolve?: SubscriptionResolveFn; +} + +export interface SubscriptionResolverObject { + subscribe: SubscriptionSubscribeFn; + resolve: SubscriptionResolveFn; +} + +export type SubscriptionObject = + | SubscriptionSubscriberObject + | SubscriptionResolverObject; + +export type SubscriptionResolver = + | ((...args: any[]) => SubscriptionObject) + | SubscriptionObject; + +export type TypeResolveFn = ( + parent: TParent, + context: TContext, + info: GraphQLResolveInfo +) => Maybe | Promise>; + +export type IsTypeOfResolverFn = ( + obj: T, + context: TContext, + info: GraphQLResolveInfo +) => boolean | Promise; + +export type NextResolverFn = () => Promise; + +export type DirectiveResolverFn = ( + next: NextResolverFn, + parent: TParent, + args: TArgs, + context: TContext, + info: GraphQLResolveInfo +) => TResult | Promise; + +/** Mapping between all available schema types and the resolvers types */ +export type ResolversTypes = ResolversObject<{ + AddUserToProjectInput: ResolverTypeWrapper>; + Asset: ResolverTypeWrapper>; + AssignAssetAsAvatarInput: ResolverTypeWrapper>; + Board: ResolverTypeWrapper>; + BoardStyle: ResolverTypeWrapper>; + Boolean: ResolverTypeWrapper>; + CUSTOM_FIELD_TYPE: ResolverTypeWrapper>; + Column: ResolverTypeWrapper>; + CreateBoardInput: ResolverTypeWrapper>; + CreateIssueCommentInput: ResolverTypeWrapper>; + CreateIssueInput: ResolverTypeWrapper>; + CreateIssueLinkInput: ResolverTypeWrapper>; + CreateIssueStatusInput: ResolverTypeWrapper>; + CreateProjectCustomFieldInput: ResolverTypeWrapper>; + CreateProjectInput: ResolverTypeWrapper>; + CreateProjectTagInput: ResolverTypeWrapper>; + CreateProjectValidationInput: ResolverTypeWrapper>; + CustomField: ResolverTypeWrapper>; + CustomFieldValue: ResolverTypeWrapper>; + DateTime: ResolverTypeWrapper>; + DeleteAssetInput: ResolverTypeWrapper>; + DeleteIssueCommentInput: ResolverTypeWrapper>; + DeleteIssueInput: ResolverTypeWrapper>; + DeleteIssueLinkInput: ResolverTypeWrapper>; + DeleteProjectCustomFieldInput: ResolverTypeWrapper>; + DeleteProjectTagInput: ResolverTypeWrapper>; + File: ResolverTypeWrapper>; + ID: ResolverTypeWrapper>; + Int: ResolverTypeWrapper>; + Issue: ResolverTypeWrapper>; + IssueComment: ResolverTypeWrapper>; + IssueStatus: ResolverTypeWrapper>; + MessageAndStatus: ResolverTypeWrapper>; + Mutation: ResolverTypeWrapper<{}>; + Order: ResolverTypeWrapper>; + Project: ResolverTypeWrapper>; + ProjectTag: ResolverTypeWrapper>; + ProjectVisibility: ResolverTypeWrapper>; + Query: ResolverTypeWrapper<{}>; + QueryBoardInput: ResolverTypeWrapper>; + QueryIssueInput: ResolverTypeWrapper>; + QueryProjectInput: ResolverTypeWrapper>; + QueryProjectTagsInput: ResolverTypeWrapper>; + RemoveUserFromProjectInput: ResolverTypeWrapper>; + SortBy: ResolverTypeWrapper>; + String: ResolverTypeWrapper>; + UpdateBoardInput: ResolverTypeWrapper>; + UpdateIssueCommentInput: ResolverTypeWrapper>; + UpdateIssueInput: ResolverTypeWrapper>; + UpdateMeInput: ResolverTypeWrapper>; + Upload: ResolverTypeWrapper>; + UploadAssetInput: ResolverTypeWrapper>; + User: ResolverTypeWrapper>; + ViewState: ResolverTypeWrapper>; + ViewStateInput: ResolverTypeWrapper>; + ViewStateIssueStatus: ResolverTypeWrapper>; + ViewStateIssueStatusInput: ResolverTypeWrapper>; + ViewStateItem: ResolverTypeWrapper>; + ViewStateItemInput: ResolverTypeWrapper>; +}>; + +/** Mapping between all available schema types and the resolvers parents */ +export type ResolversParentTypes = ResolversObject<{ + AddUserToProjectInput: Partial; + Asset: Partial; + AssignAssetAsAvatarInput: Partial; + Board: Partial; + Boolean: Partial; + Column: Partial; + CreateBoardInput: Partial; + CreateIssueCommentInput: Partial; + CreateIssueInput: Partial; + CreateIssueLinkInput: Partial; + CreateIssueStatusInput: Partial; + CreateProjectCustomFieldInput: Partial; + CreateProjectInput: Partial; + CreateProjectTagInput: Partial; + CreateProjectValidationInput: Partial; + CustomField: Partial; + CustomFieldValue: Partial; + DateTime: Partial; + DeleteAssetInput: Partial; + DeleteIssueCommentInput: Partial; + DeleteIssueInput: Partial; + DeleteIssueLinkInput: Partial; + DeleteProjectCustomFieldInput: Partial; + DeleteProjectTagInput: Partial; + File: Partial; + ID: Partial; + Int: Partial; + Issue: Partial; + IssueComment: Partial; + IssueStatus: Partial; + MessageAndStatus: Partial; + Mutation: {}; + Project: Partial; + ProjectTag: Partial; + Query: {}; + QueryBoardInput: Partial; + QueryIssueInput: Partial; + QueryProjectInput: Partial; + QueryProjectTagsInput: Partial; + RemoveUserFromProjectInput: Partial; + SortBy: Partial; + String: Partial; + UpdateBoardInput: Partial; + UpdateIssueCommentInput: Partial; + UpdateIssueInput: Partial; + UpdateMeInput: Partial; + Upload: Partial; + UploadAssetInput: Partial; + User: Partial; + ViewState: Partial; + ViewStateInput: Partial; + ViewStateIssueStatus: Partial; + ViewStateIssueStatusInput: Partial; + ViewStateItem: Partial; + ViewStateItemInput: Partial; +}>; + +export type AssetResolvers = ResolversObject<{ + assetPath?: Resolver, ParentType, ContextType>; + assetSubType?: Resolver, ParentType, ContextType>; + assetType?: Resolver, ParentType, ContextType>; + createdAt?: Resolver, ParentType, ContextType>; + id?: Resolver; + ownerId?: Resolver, ParentType, ContextType>; + updatedAt?: Resolver, ParentType, ContextType>; + __isTypeOf?: IsTypeOfResolverFn; +}>; + +export type BoardResolvers = ResolversObject<{ + backlogEnabled?: Resolver, ParentType, ContextType>; + columns?: Resolver>>, ParentType, ContextType>; + containerOrder?: Resolver, ParentType, ContextType>; + createdAt?: Resolver, ParentType, ContextType>; + id?: Resolver, ParentType, ContextType>; + issues?: Resolver>>, ParentType, ContextType>; + name?: Resolver, ParentType, ContextType>; + projectId?: Resolver, ParentType, ContextType>; + settings?: Resolver, ParentType, ContextType>; + status?: Resolver, ParentType, ContextType>; + style?: Resolver, ParentType, ContextType>; + updatedAt?: Resolver, ParentType, ContextType>; + viewState?: Resolver>>, ParentType, ContextType>; + __isTypeOf?: IsTypeOfResolverFn; +}>; + +export type ColumnResolvers< + ContextType = ApolloContext, + ParentType = ResolversParentTypes['Column'], +> = ResolversObject<{ + id?: Resolver; + issues?: Resolver>>, ParentType, ContextType>; + title?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}>; + +export type CustomFieldResolvers< + ContextType = ApolloContext, + ParentType = ResolversParentTypes['CustomField'], +> = ResolversObject<{ + createdAt?: Resolver, ParentType, ContextType>; + fieldName?: Resolver; + fieldType?: Resolver; + id?: Resolver; + projectId?: Resolver; + updatedAt?: Resolver, ParentType, ContextType>; + __isTypeOf?: IsTypeOfResolverFn; +}>; + +export type CustomFieldValueResolvers< + ContextType = ApolloContext, + ParentType = ResolversParentTypes['CustomFieldValue'], +> = ResolversObject<{ + createdAt?: Resolver, ParentType, ContextType>; + customField?: Resolver, ParentType, ContextType>; + customFieldId?: Resolver; + id?: Resolver; + updatedAt?: Resolver, ParentType, ContextType>; + value?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}>; + +export interface DateTimeScalarConfig extends GraphQLScalarTypeConfig { + name: 'DateTime'; +} + +export type FileResolvers = ResolversObject<{ + encoding?: Resolver; + filename?: Resolver; + mimetype?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}>; + +export type IssueResolvers = ResolversObject<{ + archived?: Resolver, ParentType, ContextType>; + assignee?: Resolver, ParentType, ContextType>; + comments?: Resolver>>, ParentType, ContextType>; + createdAt?: Resolver, ParentType, ContextType>; + customFields?: Resolver>>, ParentType, ContextType>; + description?: Resolver, ParentType, ContextType>; + id?: Resolver; + linkType?: Resolver, ParentType, ContextType>; + linkedIssueId?: Resolver, ParentType, ContextType>; + links?: Resolver>>, ParentType, ContextType>; + priority?: Resolver, ParentType, ContextType>; + project?: Resolver, ParentType, ContextType>; + projectId?: Resolver, ParentType, ContextType>; + reporter?: Resolver, ParentType, ContextType>; + status?: Resolver, ParentType, ContextType>; + tags?: Resolver>>, ParentType, ContextType>; + title?: Resolver; + updatedAt?: Resolver, ParentType, ContextType>; + __isTypeOf?: IsTypeOfResolverFn; +}>; + +export type IssueCommentResolvers< + ContextType = ApolloContext, + ParentType = ResolversParentTypes['IssueComment'], +> = ResolversObject<{ + comment?: Resolver; + createdAt?: Resolver, ParentType, ContextType>; + id?: Resolver; + issueId?: Resolver; + reporter?: Resolver; + updatedAt?: Resolver, ParentType, ContextType>; + __isTypeOf?: IsTypeOfResolverFn; +}>; + +export type IssueStatusResolvers< + ContextType = ApolloContext, + ParentType = ResolversParentTypes['IssueStatus'], +> = ResolversObject<{ + createdAt?: Resolver, ParentType, ContextType>; + id?: Resolver; + name?: Resolver; + projectId?: Resolver, ParentType, ContextType>; + updatedAt?: Resolver, ParentType, ContextType>; + __isTypeOf?: IsTypeOfResolverFn; +}>; + +export type MessageAndStatusResolvers< + ContextType = ApolloContext, + ParentType = ResolversParentTypes['MessageAndStatus'], +> = ResolversObject<{ + message?: Resolver, ParentType, ContextType>; + status?: Resolver, ParentType, ContextType>; + __isTypeOf?: IsTypeOfResolverFn; +}>; + +export type MutationResolvers< + ContextType = ApolloContext, + ParentType = ResolversParentTypes['Mutation'], +> = ResolversObject<{ + addUserToProject?: Resolver< + Maybe, + ParentType, + ContextType, + RequireFields + >; + assignAssetAsAvatar?: Resolver< + Maybe, + ParentType, + ContextType, + RequireFields + >; + createBoard?: Resolver, ParentType, ContextType, Partial>; + createIssue?: Resolver, ParentType, ContextType, Partial>; + createIssueComment?: Resolver< + Maybe, + ParentType, + ContextType, + RequireFields + >; + createIssueLink?: Resolver< + Maybe, + ParentType, + ContextType, + RequireFields + >; + createIssueStatus?: Resolver< + Maybe, + ParentType, + ContextType, + RequireFields + >; + createProject?: Resolver< + Maybe, + ParentType, + ContextType, + Partial + >; + createProjectCustomField?: Resolver< + Maybe, + ParentType, + ContextType, + RequireFields + >; + createProjectTag?: Resolver< + Maybe, + ParentType, + ContextType, + RequireFields + >; + deleteAsset?: Resolver< + Maybe, + ParentType, + ContextType, + RequireFields + >; + deleteIssue?: Resolver< + Maybe, + ParentType, + ContextType, + RequireFields + >; + deleteIssueComment?: Resolver< + Maybe, + ParentType, + ContextType, + RequireFields + >; + deleteIssueLink?: Resolver< + Maybe, + ParentType, + ContextType, + RequireFields + >; + deleteProjectCustomField?: Resolver< + Maybe, + ParentType, + ContextType, + RequireFields + >; + deleteProjectTag?: Resolver< + Maybe, + ParentType, + ContextType, + RequireFields + >; + removeUserFromProject?: Resolver< + Maybe, + ParentType, + ContextType, + RequireFields + >; + updateBoard?: Resolver, ParentType, ContextType, Partial>; + updateIssue?: Resolver, ParentType, ContextType, Partial>; + updateIssueComment?: Resolver< + Maybe, + ParentType, + ContextType, + RequireFields + >; + updateMe?: Resolver< + Maybe, + ParentType, + ContextType, + RequireFields + >; + uploadAsset?: Resolver< + Maybe, + ParentType, + ContextType, + RequireFields + >; +}>; + +export type ProjectResolvers< + ContextType = ApolloContext, + ParentType = ResolversParentTypes['Project'], +> = ResolversObject<{ + boards?: Resolver>>, ParentType, ContextType>; + createdAt?: Resolver, ParentType, ContextType>; + customFields?: Resolver>>, ParentType, ContextType>; + description?: Resolver, ParentType, ContextType>; + id?: Resolver, ParentType, ContextType>; + imageId?: Resolver, ParentType, ContextType>; + issueCount?: Resolver, ParentType, ContextType>; + issueStatuses?: Resolver>>, ParentType, ContextType>; + issues?: Resolver>>, ParentType, ContextType, Partial>; + key?: Resolver, ParentType, ContextType>; + name?: Resolver, ParentType, ContextType>; + status?: Resolver, ParentType, ContextType>; + tags?: Resolver>>, ParentType, ContextType>; + updatedAt?: Resolver, ParentType, ContextType>; + users?: Resolver>>, ParentType, ContextType>; + visibility?: Resolver, ParentType, ContextType>; + __isTypeOf?: IsTypeOfResolverFn; +}>; + +export type ProjectTagResolvers< + ContextType = ApolloContext, + ParentType = ResolversParentTypes['ProjectTag'], +> = ResolversObject<{ + createdAt?: Resolver, ParentType, ContextType>; + id?: Resolver; + name?: Resolver; + projectId?: Resolver; + updatedAt?: Resolver, ParentType, ContextType>; + __isTypeOf?: IsTypeOfResolverFn; +}>; + +export type QueryResolvers = ResolversObject<{ + board?: Resolver, ParentType, ContextType, RequireFields>; + boards?: Resolver>>, ParentType, ContextType>; + createProjectValidation?: Resolver< + Maybe, + ParentType, + ContextType, + RequireFields + >; + helloWorld?: Resolver; + issue?: Resolver, ParentType, ContextType, Partial>; + issues?: Resolver>>, ParentType, ContextType, Partial>; + me?: Resolver, ParentType, ContextType>; + project?: Resolver, ParentType, ContextType, Partial>; + projectTags?: Resolver< + Maybe>>, + ParentType, + ContextType, + RequireFields + >; + projects?: Resolver< + Maybe>>, + ParentType, + ContextType, + Partial + >; + user?: Resolver, ParentType, ContextType>; + users?: Resolver>>, ParentType, ContextType>; +}>; + +export interface UploadScalarConfig extends GraphQLScalarTypeConfig { + name: 'Upload'; +} + +export type UserResolvers = ResolversObject<{ + avatarUrl?: Resolver, ParentType, ContextType>; + email?: Resolver, ParentType, ContextType>; + externalId?: Resolver, ParentType, ContextType>; + firstName?: Resolver, ParentType, ContextType>; + id?: Resolver, ParentType, ContextType>; + lastName?: Resolver, ParentType, ContextType>; + name?: Resolver, ParentType, ContextType>; + __isTypeOf?: IsTypeOfResolverFn; +}>; + +export type ViewStateResolvers< + ContextType = ApolloContext, + ParentType = ResolversParentTypes['ViewState'], +> = ResolversObject<{ + id?: Resolver; + items?: Resolver>>, ParentType, ContextType>; + title?: Resolver, ParentType, ContextType>; + __isTypeOf?: IsTypeOfResolverFn; +}>; + +export type ViewStateIssueStatusResolvers< + ContextType = ApolloContext, + ParentType = ResolversParentTypes['ViewStateIssueStatus'], +> = ResolversObject<{ + id?: Resolver; + name?: Resolver, ParentType, ContextType>; + projectId?: Resolver, ParentType, ContextType>; + __isTypeOf?: IsTypeOfResolverFn; +}>; + +export type ViewStateItemResolvers< + ContextType = ApolloContext, + ParentType = ResolversParentTypes['ViewStateItem'], +> = ResolversObject<{ + id?: Resolver; + status?: Resolver, ParentType, ContextType>; + title?: Resolver, ParentType, ContextType>; + __isTypeOf?: IsTypeOfResolverFn; +}>; + +export type Resolvers = ResolversObject<{ + Asset?: AssetResolvers; + Board?: BoardResolvers; + Column?: ColumnResolvers; + CustomField?: CustomFieldResolvers; + CustomFieldValue?: CustomFieldValueResolvers; + DateTime?: GraphQLScalarType; + File?: FileResolvers; + Issue?: IssueResolvers; + IssueComment?: IssueCommentResolvers; + IssueStatus?: IssueStatusResolvers; + MessageAndStatus?: MessageAndStatusResolvers; + Mutation?: MutationResolvers; + Project?: ProjectResolvers; + ProjectTag?: ProjectTagResolvers; + Query?: QueryResolvers; + Upload?: GraphQLScalarType; + User?: UserResolvers; + ViewState?: ViewStateResolvers; + ViewStateIssueStatus?: ViewStateIssueStatusResolvers; + ViewStateItem?: ViewStateItemResolvers; +}>; diff --git a/backend/src/db/index.js b/backend/src/db/index.js deleted file mode 100644 index 43789d0..0000000 --- a/backend/src/db/index.js +++ /dev/null @@ -1 +0,0 @@ -export { db } from './models/index.js' diff --git a/backend/src/db/index.ts b/backend/src/db/index.ts new file mode 100644 index 0000000..7d73acb --- /dev/null +++ b/backend/src/db/index.ts @@ -0,0 +1,2 @@ +import { db } from './models/index.js'; +export default db; diff --git a/backend/src/db/migrations/20231104044406-create-project.js b/backend/src/db/migrations/20231104044406-create-project.ts similarity index 100% rename from backend/src/db/migrations/20231104044406-create-project.js rename to backend/src/db/migrations/20231104044406-create-project.ts diff --git a/backend/src/db/migrations/20231104183610-create-project-tags.js b/backend/src/db/migrations/20231104183610-create-project-tags.ts similarity index 100% rename from backend/src/db/migrations/20231104183610-create-project-tags.js rename to backend/src/db/migrations/20231104183610-create-project-tags.ts diff --git a/backend/src/db/migrations/20231106043847-create-user.js b/backend/src/db/migrations/20231106043847-create-user.ts similarity index 100% rename from backend/src/db/migrations/20231106043847-create-user.js rename to backend/src/db/migrations/20231106043847-create-user.ts diff --git a/backend/src/db/migrations/20231107183550-create-board.js b/backend/src/db/migrations/20231107183550-create-board.ts similarity index 100% rename from backend/src/db/migrations/20231107183550-create-board.js rename to backend/src/db/migrations/20231107183550-create-board.ts diff --git a/backend/src/db/migrations/20231107183560-create-issue-statuses.js b/backend/src/db/migrations/20231107183560-create-issue-statuses.ts similarity index 100% rename from backend/src/db/migrations/20231107183560-create-issue-statuses.js rename to backend/src/db/migrations/20231107183560-create-issue-statuses.ts diff --git a/backend/src/db/migrations/20231107183570-create-issue.js b/backend/src/db/migrations/20231107183570-create-issue.ts similarity index 100% rename from backend/src/db/migrations/20231107183570-create-issue.js rename to backend/src/db/migrations/20231107183570-create-issue.ts diff --git a/backend/src/db/migrations/20231107183580-create-assets.js b/backend/src/db/migrations/20231107183580-create-assets.ts similarity index 100% rename from backend/src/db/migrations/20231107183580-create-assets.js rename to backend/src/db/migrations/20231107183580-create-assets.ts diff --git a/backend/src/db/migrations/20231107183580-create-issue-comments.js b/backend/src/db/migrations/20231107183580-create-issue-comments.ts similarity index 100% rename from backend/src/db/migrations/20231107183580-create-issue-comments.js rename to backend/src/db/migrations/20231107183580-create-issue-comments.ts diff --git a/backend/src/db/migrations/20231107183620-create-issue-tags.js b/backend/src/db/migrations/20231107183620-create-issue-tags.ts similarity index 100% rename from backend/src/db/migrations/20231107183620-create-issue-tags.js rename to backend/src/db/migrations/20231107183620-create-issue-tags.ts diff --git a/backend/src/db/migrations/20231107183621-create-issue-board.js b/backend/src/db/migrations/20231107183621-create-issue-board.ts similarity index 100% rename from backend/src/db/migrations/20231107183621-create-issue-board.js rename to backend/src/db/migrations/20231107183621-create-issue-board.ts diff --git a/backend/src/db/migrations/20231215000000-add-archive-to-issue.js b/backend/src/db/migrations/20231215000000-add-archive-to-issue.ts similarity index 100% rename from backend/src/db/migrations/20231215000000-add-archive-to-issue.js rename to backend/src/db/migrations/20231215000000-add-archive-to-issue.ts diff --git a/backend/src/db/migrations/20231217000000-add-descrition-raw-to-issue.js b/backend/src/db/migrations/20231217000000-add-descrition-raw-to-issue.ts similarity index 100% rename from backend/src/db/migrations/20231217000000-add-descrition-raw-to-issue.js rename to backend/src/db/migrations/20231217000000-add-descrition-raw-to-issue.ts diff --git a/backend/src/db/migrations/20231217000001-add-comment-raw-to-issue-comment.js b/backend/src/db/migrations/20231217000001-add-comment-raw-to-issue-comment.ts similarity index 100% rename from backend/src/db/migrations/20231217000001-add-comment-raw-to-issue-comment.js rename to backend/src/db/migrations/20231217000001-add-comment-raw-to-issue-comment.ts diff --git a/backend/src/db/migrations/20231218000000-add-parent-id-to-issue.js b/backend/src/db/migrations/20231218000000-add-parent-id-to-issue.ts similarity index 100% rename from backend/src/db/migrations/20231218000000-add-parent-id-to-issue.js rename to backend/src/db/migrations/20231218000000-add-parent-id-to-issue.ts diff --git a/backend/src/db/migrations/20231218000001-create-issue-links.js b/backend/src/db/migrations/20231218000001-create-issue-links.ts similarity index 100% rename from backend/src/db/migrations/20231218000001-create-issue-links.js rename to backend/src/db/migrations/20231218000001-create-issue-links.ts diff --git a/backend/src/db/migrations/20231219000001-alter-raw-columns-on-issue-table.js b/backend/src/db/migrations/20231219000001-alter-raw-columns-on-issue-table.ts similarity index 100% rename from backend/src/db/migrations/20231219000001-alter-raw-columns-on-issue-table.js rename to backend/src/db/migrations/20231219000001-alter-raw-columns-on-issue-table.ts diff --git a/backend/src/db/migrations/20231222000001-add-issue-vector-search.js b/backend/src/db/migrations/20231222000001-add-issue-vector-search.ts similarity index 100% rename from backend/src/db/migrations/20231222000001-add-issue-vector-search.js rename to backend/src/db/migrations/20231222000001-add-issue-vector-search.ts diff --git a/backend/src/db/migrations/20231223000001-add-project-visibility.js b/backend/src/db/migrations/20231223000001-add-project-visibility.ts similarity index 100% rename from backend/src/db/migrations/20231223000001-add-project-visibility.js rename to backend/src/db/migrations/20231223000001-add-project-visibility.ts diff --git a/backend/src/db/migrations/20231223000002-add-project-permissions.js b/backend/src/db/migrations/20231223000002-add-project-permissions.ts similarity index 100% rename from backend/src/db/migrations/20231223000002-add-project-permissions.js rename to backend/src/db/migrations/20231223000002-add-project-permissions.ts diff --git a/backend/src/db/migrations/20231228152900-add-custom-fields.js b/backend/src/db/migrations/20231228152900-add-custom-fields.ts similarity index 100% rename from backend/src/db/migrations/20231228152900-add-custom-fields.js rename to backend/src/db/migrations/20231228152900-add-custom-fields.ts diff --git a/backend/src/db/migrations/20231228153315-add-issue-custom-field-values.js b/backend/src/db/migrations/20231228153315-add-issue-custom-field-values.ts similarity index 100% rename from backend/src/db/migrations/20231228153315-add-issue-custom-field-values.js rename to backend/src/db/migrations/20231228153315-add-issue-custom-field-values.ts diff --git a/backend/src/db/models/asset.js b/backend/src/db/models/asset.ts similarity index 85% rename from backend/src/db/models/asset.js rename to backend/src/db/models/asset.ts index 369a085..ed289b1 100644 --- a/backend/src/db/models/asset.js +++ b/backend/src/db/models/asset.ts @@ -1,8 +1,10 @@ -'use strict'; +import { DataTypes, Sequelize } from 'sequelize'; -export default (sequelize, DataTypes) => { - const Asset = sequelize.define( - 'Asset', +import { Asset } from './types.js'; + +// TODO: Use associations instead of references +export default (sequelize: Sequelize) => { + Asset.init( { id: { type: DataTypes.INTEGER, diff --git a/backend/src/db/models/board.js b/backend/src/db/models/board.ts similarity index 80% rename from backend/src/db/models/board.js rename to backend/src/db/models/board.ts index 81839de..c3ff048 100644 --- a/backend/src/db/models/board.js +++ b/backend/src/db/models/board.ts @@ -1,8 +1,9 @@ -'use strict'; +import { DataTypes, Sequelize } from 'sequelize'; -export default (sequelize, DataTypes) => { - const Board = sequelize.define( - 'Board', +import { Board } from './types.js'; + +export default (sequelize: Sequelize) => { + Board.init( { id: { type: DataTypes.INTEGER, @@ -57,11 +58,16 @@ export default (sequelize, DataTypes) => { } ); - Board.associate = ({ IssueBoard, Issue }) => { + Board.associate = ({ IssueBoard, Project, Issue }) => { Board.belongsToMany(Issue, { through: IssueBoard, foreignKey: 'board_id', otherKey: 'issue_id', + as: 'issues', + }); + Board.belongsTo(Project, { + foreignKey: 'project_id', + as: 'project', }); }; diff --git a/backend/src/db/models/index.js b/backend/src/db/models/index.js deleted file mode 100644 index 08b6a55..0000000 --- a/backend/src/db/models/index.js +++ /dev/null @@ -1,52 +0,0 @@ -'use strict'; - -import { DataTypes, Sequelize } from 'sequelize'; - -import { ENABLE_SEQUELIZE_LOGGING, SQL_URI } from '../../services/config.js'; -import Asset from './asset.js'; -import Board from './board.js'; -import IssueBoard from './issue-board.js'; -import IssueComment from './issue-comment.js'; -import IssueLinks from './issue-links.js'; -import IssueStatuses from './issue-statuses.js'; -import IssueTag from './issue-tag.js'; -import Issue from './issue.js'; -import ProjectCustomFields from './project-custom-fields.js'; -import ProjectPermissions from './project-permissions.js'; -import ProjectTag from './project-tag.js'; -import Project from './project.js'; -import User from './user.js'; - -export const db = {}; - -const init = async () => { - db.sequelize = new Sequelize(SQL_URI, { - logging: ENABLE_SEQUELIZE_LOGGING, - }); - - db.Users = User(db.sequelize, DataTypes); - db.Project = Project(db.sequelize, DataTypes); - db.Board = Board(db.sequelize, DataTypes); - db.IssueStatuses = IssueStatuses(db.sequelize, DataTypes); - db.Issue = Issue(db.sequelize, DataTypes); - db.Asset = Asset(db.sequelize, DataTypes); - db.IssueComment = IssueComment(db.sequelize, DataTypes); - db.ProjectTag = ProjectTag(db.sequelize, DataTypes); - db.IssueTag = IssueTag(db.sequelize, DataTypes); - db.IssueBoard = IssueBoard(db.sequelize, DataTypes); - db.IssueLinks = IssueLinks(db.sequelize, DataTypes); - db.ProjectPermissions = ProjectPermissions(db.sequelize, DataTypes); - db.ProjectCustomFields = ProjectCustomFields(db.sequelize, DataTypes); - - Object.values(db).forEach((model) => { - if (model.associate) { - model.associate(db); - } - }); - - // TODO: Run migration instead of sync - // await db.sequelize.sync(); -}; - -db.init = init; -db.Sequelize = Sequelize; diff --git a/backend/src/db/models/index.ts b/backend/src/db/models/index.ts new file mode 100644 index 0000000..cfc67c5 --- /dev/null +++ b/backend/src/db/models/index.ts @@ -0,0 +1,51 @@ +import { Sequelize } from 'sequelize'; + +import { ENABLE_SEQUELIZE_LOGGING, SQL_URI } from '../../services/config.js'; +import type { Db } from '../../typings.js'; +import Asset from './asset.js'; +import Board from './board.js'; +import IssueBoard from './issue-board.js'; +import IssueComment from './issue-comment.js'; +import IssueLink from './issue-link.js'; +import IssueStatuses from './issue-statuses.js'; +import IssueTag from './issue-tag.js'; +import Issue from './issue.js'; +import ProjectCustomField from './project-custom-field.js'; +import ProjectPermission from './project-permission.js'; +import ProjectTag from './project-tag.js'; +import Project from './project.js'; +import User from './user.js'; + +export const db: Db = {}; + +const init = async () => { + db.sequelize = new Sequelize(SQL_URI, { + logging: ENABLE_SEQUELIZE_LOGGING, + }); + + db.User = User(db.sequelize); + db.Project = Project(db.sequelize); + db.Board = Board(db.sequelize); + db.IssueStatuses = IssueStatuses(db.sequelize); + db.Issue = Issue(db.sequelize); + db.Asset = Asset(db.sequelize); + db.IssueComment = IssueComment(db.sequelize); + db.ProjectTag = ProjectTag(db.sequelize); + db.IssueTag = IssueTag(db.sequelize); + db.IssueBoard = IssueBoard(db.sequelize); + db.IssueLink = IssueLink(db.sequelize); + db.ProjectPermission = ProjectPermission(db.sequelize); + db.ProjectCustomField = ProjectCustomField(db.sequelize); + + Object.values(db).forEach((model: any) => { + if (model.associate) { + model.associate(db); + } + }); + + // TODO: Run migration instead of sync + // await db.sequelize.sync(); +}; + +db.init = init; +db.Sequelize = Sequelize; diff --git a/backend/src/db/models/issue-board.js b/backend/src/db/models/issue-board.ts similarity index 58% rename from backend/src/db/models/issue-board.js rename to backend/src/db/models/issue-board.ts index b5997e7..0960454 100644 --- a/backend/src/db/models/issue-board.js +++ b/backend/src/db/models/issue-board.ts @@ -1,8 +1,10 @@ -'use strict'; // TODO: Migration -export default (sequelize, DataTypes) => { - const IssueBoards = sequelize.define( - 'IssueBoards', +import { DataTypes, Sequelize } from 'sequelize'; + +import { IssueBoard } from './types.js'; + +export default (sequelize: Sequelize) => { + IssueBoard.init( { boardId: { type: DataTypes.INTEGER, @@ -28,10 +30,10 @@ export default (sequelize, DataTypes) => { } ); - IssueBoards.associate = ({ Board, Issue }) => { - IssueBoards.belongsTo(Board, { foreignKey: 'board_id' }); - IssueBoards.belongsTo(Issue, { foreignKey: 'issue_id' }); + IssueBoard.associate = ({ Board, Issue }) => { + IssueBoard.belongsTo(Board, { foreignKey: 'board_id', as: 'board' }); + IssueBoard.belongsTo(Issue, { foreignKey: 'issue_id', as: 'issue' }); }; - return IssueBoards; + return IssueBoard; }; diff --git a/backend/src/db/models/issue-comment.js b/backend/src/db/models/issue-comment.ts similarity index 81% rename from backend/src/db/models/issue-comment.js rename to backend/src/db/models/issue-comment.ts index 5a4ce0c..6ab809b 100644 --- a/backend/src/db/models/issue-comment.js +++ b/backend/src/db/models/issue-comment.ts @@ -1,8 +1,9 @@ -'use strict'; +import { DataTypes, Sequelize } from 'sequelize'; -export default (sequelize, DataTypes) => { - const IssueComment = sequelize.define( - 'IssueComment', +import { IssueComment } from './types.js'; + +export default (sequelize: Sequelize) => { + IssueComment.init( { id: { allowNull: false, @@ -37,7 +38,7 @@ export default (sequelize, DataTypes) => { createdAt: { field: 'created_at', type: DataTypes.DATE, - default: new Date(), + defaultValue: new Date(), }, updatedAt: { field: 'updated_at', @@ -57,7 +58,7 @@ export default (sequelize, DataTypes) => { ); IssueComment.associate = ({ Issue }) => { - IssueComment.belongsTo(Issue, { foreignKey: 'issue_id' }); + IssueComment.belongsTo(Issue, { foreignKey: 'issue_id', as: 'issue' }); }; return IssueComment; diff --git a/backend/src/db/models/issue-links.js b/backend/src/db/models/issue-link.ts similarity index 84% rename from backend/src/db/models/issue-links.js rename to backend/src/db/models/issue-link.ts index 5bf2b38..a69ff1c 100644 --- a/backend/src/db/models/issue-links.js +++ b/backend/src/db/models/issue-link.ts @@ -1,6 +1,8 @@ -'use strict'; +import { DataTypes, Sequelize } from 'sequelize'; -export default (sequelize, DataTypes) => { +import { IssueLink } from './types.js'; + +export default (sequelize: Sequelize) => { const inverseLinkType = { blocks: 'blocked_by', blocked_by: 'blocks', @@ -11,8 +13,7 @@ export default (sequelize, DataTypes) => { is_cloned_by: 'clones', }; - const IssueLink = sequelize.define( - 'IssueLinks', + IssueLink.init( { id: { allowNull: false, @@ -37,6 +38,9 @@ export default (sequelize, DataTypes) => { }, linkTypeInverted: { type: DataTypes.VIRTUAL, + set(value) { + throw new Error('Do not try to set the `linkTypeInverted` value!'); + }, get() { return inverseLinkType?.[this.getDataValue('linkType')]; }, @@ -52,7 +56,7 @@ export default (sequelize, DataTypes) => { createdAt: { field: 'created_at', type: DataTypes.DATE, - default: new Date(), + defaultValue: new Date(), }, updatedAt: { field: 'updated_at', diff --git a/backend/src/db/models/issue-statuses.js b/backend/src/db/models/issue-statuses.ts similarity index 80% rename from backend/src/db/models/issue-statuses.js rename to backend/src/db/models/issue-statuses.ts index dfb10f4..65561eb 100644 --- a/backend/src/db/models/issue-statuses.js +++ b/backend/src/db/models/issue-statuses.ts @@ -1,10 +1,9 @@ -'use strict'; +import { DataTypes, Sequelize } from 'sequelize'; -import IssueComment from './issue-comment.js'; +import { IssueStatus } from './types.js'; -export default (sequelize, DataTypes) => { - const IssueStatuses = sequelize.define( - 'IssueStatuses', +export default (sequelize: Sequelize) => + IssueStatus.init( { id: { type: DataTypes.INTEGER, @@ -43,6 +42,3 @@ export default (sequelize, DataTypes) => { ], } ); - - return IssueStatuses; -}; diff --git a/backend/src/db/models/issue-tag.js b/backend/src/db/models/issue-tag.ts similarity index 80% rename from backend/src/db/models/issue-tag.js rename to backend/src/db/models/issue-tag.ts index d175106..f2ffa0c 100644 --- a/backend/src/db/models/issue-tag.js +++ b/backend/src/db/models/issue-tag.ts @@ -1,8 +1,11 @@ 'use strict'; -export default (sequelize, DataTypes) => { - const IssueTag = sequelize.define( - 'IssueTag', +import { DataTypes, Sequelize } from 'sequelize'; + +import { IssueTag } from './types.js'; + +export default (sequelize: Sequelize) => { + IssueTag.init( { id: { allowNull: false, @@ -29,7 +32,7 @@ export default (sequelize, DataTypes) => { createdAt: { field: 'created_at', type: DataTypes.DATE, - default: new Date(), + defaultValue: new Date(), }, updatedAt: { field: 'updated_at', @@ -50,7 +53,7 @@ export default (sequelize, DataTypes) => { ); IssueTag.associate = ({ Issue }) => { - IssueTag.belongsTo(Issue, { foreignKey: 'issue_id' }); + IssueTag.belongsTo(Issue, { foreignKey: 'issue_id', as: 'issue' }); }; return IssueTag; diff --git a/backend/src/db/models/issue.js b/backend/src/db/models/issue.ts similarity index 86% rename from backend/src/db/models/issue.js rename to backend/src/db/models/issue.ts index e57919c..83aca43 100644 --- a/backend/src/db/models/issue.js +++ b/backend/src/db/models/issue.ts @@ -1,8 +1,9 @@ -'use strict'; +import { DataTypes, Sequelize } from 'sequelize'; -export default (sequelize, DataTypes) => { - const Issue = sequelize.define( - 'Issue', +import { Issue } from './types.js'; + +export default (sequelize: Sequelize) => { + Issue.init( { id: { allowNull: false, @@ -21,7 +22,6 @@ export default (sequelize, DataTypes) => { issueStatusId: { type: DataTypes.INTEGER, field: 'issue_status_id', - underscored: true, references: { model: 'issue_statuses', key: 'id', @@ -104,18 +104,18 @@ export default (sequelize, DataTypes) => { } ); - Issue.associate = ({ IssueComment, IssueBoard, IssueLinks, Issue, Project }) => { - Issue.belongsTo(Project, { foreignKey: 'project_id' }); - Issue.hasMany(IssueComment, { foreignKey: 'issue_id', onDelete: 'CASCADE' }); - Issue.hasMany(IssueBoard, { foreignKey: 'issue_id', onDelete: 'CASCADE' }); + Issue.associate = ({ IssueComment, IssueBoard, IssueLink, Issue, Project }) => { + Issue.belongsTo(Project, { foreignKey: 'project_id', as: 'project' }); + Issue.hasMany(IssueComment, { foreignKey: 'issue_id', onDelete: 'CASCADE', as: 'issueComments' }); + Issue.hasMany(IssueBoard, { foreignKey: 'issue_id', onDelete: 'CASCADE', as: 'issueBoards' }); Issue.belongsToMany(Issue, { - through: IssueLinks, + through: IssueLink, foreignKey: 'issue_id', otherKey: 'linked_issue_id', as: 'linkedToIssues', }); Issue.belongsToMany(Issue, { - through: IssueLinks, + through: IssueLink, foreignKey: 'linked_issue_id', otherKey: 'issue_id', as: 'linkedByIssues', diff --git a/backend/src/db/models/project-custom-fields.js b/backend/src/db/models/project-custom-field.ts similarity index 79% rename from backend/src/db/models/project-custom-fields.js rename to backend/src/db/models/project-custom-field.ts index 4188efd..05ac7a3 100644 --- a/backend/src/db/models/project-custom-fields.js +++ b/backend/src/db/models/project-custom-field.ts @@ -1,8 +1,9 @@ -'use strict'; +import { DataTypes, Sequelize } from 'sequelize'; -export default (sequelize, DataTypes) => { - const ProjectCustomField = sequelize.define( - 'ProjectCustomField', +import { ProjectCustomField } from './types.js'; + +export default (sequelize: Sequelize) => { + ProjectCustomField.init( { id: { allowNull: false, @@ -38,13 +39,14 @@ export default (sequelize, DataTypes) => { { sequelize, tableName: 'project_custom_fields', - timestamps: false, + createdAt: 'created_at', + updatedAt: 'updated_at', indexes: [{ unique: false, fields: ['project_id'] }], } ); ProjectCustomField.associate = ({ Project }) => { - ProjectCustomField.belongsTo(Project, { foreignKey: 'project_id' }); + ProjectCustomField.belongsTo(Project, { foreignKey: 'project_id', as: 'project' }); }; return ProjectCustomField; diff --git a/backend/src/db/models/project-permissions.js b/backend/src/db/models/project-permission.ts similarity index 79% rename from backend/src/db/models/project-permissions.js rename to backend/src/db/models/project-permission.ts index e66312f..bcc9b2a 100644 --- a/backend/src/db/models/project-permissions.js +++ b/backend/src/db/models/project-permission.ts @@ -1,8 +1,9 @@ -'use strict'; +import { DataTypes, Sequelize } from 'sequelize'; -export default (sequelize, DataTypes) => { - const ProjectPermission = sequelize.define( - 'ProjectPermission', +import { ProjectPermission } from './types.js'; + +export default (sequelize: Sequelize) => + ProjectPermission.init( { id: { allowNull: false, @@ -34,6 +35,3 @@ export default (sequelize, DataTypes) => { indexes: [{ unique: true, fields: ['project_id', 'user_id'] }], } ); - - return ProjectPermission; -}; diff --git a/backend/src/db/models/project-tag.js b/backend/src/db/models/project-tag.ts similarity index 76% rename from backend/src/db/models/project-tag.js rename to backend/src/db/models/project-tag.ts index dc2f443..dfc4ada 100644 --- a/backend/src/db/models/project-tag.js +++ b/backend/src/db/models/project-tag.ts @@ -1,8 +1,9 @@ -'use strict'; +import { DataTypes, Sequelize } from 'sequelize'; -export default (sequelize, DataTypes) => { - const ProjectTag = sequelize.define( - 'ProjectTag', +import { ProjectTag } from './types.js'; + +export default (sequelize: Sequelize) => { + ProjectTag.init( { id: { allowNull: false, @@ -21,7 +22,7 @@ export default (sequelize, DataTypes) => { createdAt: { field: 'created_at', type: DataTypes.DATE, - default: new Date(), + defaultValue: new Date(), }, updatedAt: { field: 'updated_at', @@ -42,7 +43,7 @@ export default (sequelize, DataTypes) => { ); ProjectTag.associate = ({ Project }) => { - ProjectTag.belongsTo(Project, { foreignKey: 'project_id' }); + ProjectTag.belongsTo(Project, { foreignKey: 'project_id', as: 'project' }); }; return ProjectTag; diff --git a/backend/src/db/models/project.js b/backend/src/db/models/project.ts similarity index 73% rename from backend/src/db/models/project.js rename to backend/src/db/models/project.ts index 1c4826c..3fed63d 100644 --- a/backend/src/db/models/project.js +++ b/backend/src/db/models/project.ts @@ -1,9 +1,9 @@ -'use strict'; -import ProjectPermissions from './project-permissions.js'; +import { DataTypes, Sequelize } from 'sequelize'; -export default (sequelize, DataTypes) => { - const Project = sequelize.define( - 'Project', +import { Project } from './types.js'; + +export default (sequelize: Sequelize) => { + Project.init( { id: { type: DataTypes.INTEGER, @@ -12,9 +12,11 @@ export default (sequelize, DataTypes) => { }, name: { type: DataTypes.STRING, + allowNull: false, }, key: { type: DataTypes.STRING, + allowNull: false, }, description: { type: DataTypes.TEXT, @@ -54,10 +56,10 @@ export default (sequelize, DataTypes) => { } ); - Project.associate = ({ ProjectTag, Users, ProjectPermissions }) => { - Project.hasMany(ProjectTag, { foreignKey: 'project_id' }); - Project.belongsToMany(Users, { - through: ProjectPermissions, + Project.associate = ({ ProjectTag, User, ProjectPermission }) => { + Project.hasMany(ProjectTag, { foreignKey: 'project_id', as: 'projectTags' }); + Project.belongsToMany(User, { + through: ProjectPermission, foreignKey: 'project_id', otherKey: 'user_id', as: 'users', diff --git a/backend/src/db/models/types.ts b/backend/src/db/models/types.ts new file mode 100644 index 0000000..205b96a --- /dev/null +++ b/backend/src/db/models/types.ts @@ -0,0 +1,330 @@ +// https://sequelize.org/docs/v6/other-topics/typescript/ +import type { + Association, + BelongsToGetAssociationMixin, + BelongsToManyGetAssociationsMixin, + CreationOptional, + ForeignKey, + HasManyAddAssociationMixin, + HasManyAddAssociationsMixin, + HasManyCountAssociationsMixin, + HasManyCreateAssociationMixin, + HasManyGetAssociationsMixin, + HasManyHasAssociationMixin, + HasManyHasAssociationsMixin, + HasManyRemoveAssociationMixin, + HasManyRemoveAssociationsMixin, + HasManySetAssociationsMixin, + InferAttributes, + InferCreationAttributes, + NonAttribute, +} from 'sequelize'; +import { Model } from 'sequelize'; + +import type { Db } from '../../typings.js'; + +type Associate = (db: Db) => void; + +export class User extends Model, InferCreationAttributes> { + // id can be undefined during creation when using `autoIncrement` + declare id: CreationOptional; + declare externalId: string; + declare firstName: CreationOptional; + declare lastName: CreationOptional; + declare email: CreationOptional; + declare avatarAssetId: CreationOptional; + + declare static associate?: Associate; + + // timestamps! + // createdAt can be undefined during creation + declare createdAt: CreationOptional; + // updatedAt can be undefined during creation + declare updatedAt: CreationOptional; +} + +export class ProjectTag extends Model< + InferAttributes, + InferCreationAttributes +> { + // id can be undefined during creation when using `autoIncrement` + declare id: CreationOptional; + declare projectId: ForeignKey; + declare name: CreationOptional; + + declare getProject: BelongsToGetAssociationMixin; + + declare project?: NonAttribute; + + declare static associate: Associate; + + declare createdAt: CreationOptional; + declare updatedAt: CreationOptional; +} + +export class ProjectCustomField extends Model< + InferAttributes, + InferCreationAttributes +> { + // id can be undefined during creation when using `autoIncrement` + declare id: CreationOptional; + declare projectId: ForeignKey; + declare fieldName: string; + declare fieldType: string; + + declare getProject: BelongsToGetAssociationMixin; + + declare project?: NonAttribute; + + declare static associate: Associate; + + declare createdAt: CreationOptional; + declare updatedAt: CreationOptional; +} + +export class ProjectPermission extends Model< + InferAttributes, + InferCreationAttributes +> { + // id can be undefined during creation when using `autoIncrement` + declare id: CreationOptional; + declare projectId: ForeignKey; + declare userId: ForeignKey; + + declare static associate: Associate; +} + +export class Project extends Model< + InferAttributes, + InferCreationAttributes +> { + // id can be undefined during creation when using `autoIncrement` + declare id: CreationOptional; + declare name: string; + declare key: CreationOptional; + declare description: CreationOptional; + declare imageId: CreationOptional; + declare status: CreationOptional; + declare visibility: CreationOptional; + + // You can also pre-declare possible inclusions, these will only be populated if you + // actively include a relation. + declare projectTags?: NonAttribute; // Note this is optional since it's only populated when explicitly requested in code + declare users?: NonAttribute; + declare boards?: NonAttribute; + + declare static associations: { + projectTags: Association; + users: Association; + boards: Association; + }; + + declare static associate?: Associate; + + declare createdAt: CreationOptional; + declare updatedAt: CreationOptional; +} + +export class IssueStatus extends Model, InferCreationAttributes> { + // id can be undefined during creation when using `autoIncrement` + declare id: CreationOptional; + declare projectId: ForeignKey; + declare name: string; + + declare static associate?: Associate; + + declare createdAt: CreationOptional; + declare updatedAt: CreationOptional; +} + +export class IssueComment extends Model< + InferAttributes, + InferCreationAttributes +> { + // id can be undefined during creation when using `autoIncrement` + declare id: CreationOptional; + declare reporterId: ForeignKey; + declare issueId: ForeignKey; + declare comment: string; + declare commentRaw: CreationOptional; + + declare getIssue: BelongsToGetAssociationMixin; + + declare static associate: Associate; + + declare issue?: NonAttribute; // Note this is optional since it's only populated when explicitly requested in code + + declare static associations: { + issue: Association; + }; + + declare createdAt: CreationOptional; + declare updatedAt: CreationOptional; +} + +export class IssueTag extends Model< + InferAttributes, + InferCreationAttributes +> { + // id can be undefined during creation when using `autoIncrement` + declare id: CreationOptional; + declare projectTagId: ForeignKey; + declare issueId: ForeignKey; + + declare getIssue: BelongsToGetAssociationMixin; + + declare static associate: Associate; + + declare issue?: NonAttribute; // Note this is optional since it's only populated when explicitly requested in code + + declare static associations: { + issue: Association; + }; + + declare createdAt: CreationOptional; + declare updatedAt: CreationOptional; +} + +export class Board extends Model< + InferAttributes, + InferCreationAttributes +> { + // id can be undefined during creation when using `autoIncrement` + declare id: CreationOptional; + declare projectId: ForeignKey; + declare name: CreationOptional; + declare style: CreationOptional; + declare viewState: CreationOptional; + declare status: CreationOptional; + declare backlogEnabled: CreationOptional; + declare settings: CreationOptional; + declare containerOrder: CreationOptional; + + declare getIssues: BelongsToManyGetAssociationsMixin; + + declare static associate: Associate; + + declare issues?: NonAttribute; // Note this is optional since it's only populated when explicitly requested in code + + declare static associations: { + issue: Association; + }; + + declare createdAt: CreationOptional; + declare updatedAt: CreationOptional; +} + +export class IssueLink extends Model, InferCreationAttributes> { + // id can be undefined during creation when using `autoIncrement` + declare id: CreationOptional; + declare issueId: ForeignKey; + declare linkType: string; + declare linkTypeInverted: string; + declare linkedIssueId: ForeignKey; + // TODO: Lets double check this is correct + declare static inverseLinkType: { + duplicates: string; + clones: string; + blocks: string; + blocked_by: string; + duplicated_by: string; + relates_to: string; + is_cloned_by: string; + }; + + declare static associate?: Associate; + + declare createdAt: CreationOptional; + declare updatedAt: CreationOptional; +} + +export class IssueBoard extends Model< + InferAttributes, + InferCreationAttributes +> { + // id can be undefined during creation when using `autoIncrement` + declare boardId: ForeignKey; + declare issueId: ForeignKey; + declare position: CreationOptional; + + declare getIssue: BelongsToGetAssociationMixin; + declare getBoard: BelongsToGetAssociationMixin; + + declare static associate: Associate; + + declare issue?: NonAttribute; // Note this is optional since it's only populated when explicitly requested in code + declare board?: NonAttribute; // Note this is optional since it's only populated when explicitly requested in code + + declare static associations: { + issue: Association; + board: Association; + }; +} + +export class Issue extends Model< + InferAttributes, + InferCreationAttributes +> { + // id can be undefined during creation when using `autoIncrement` + declare id: CreationOptional; + declare projectId: ForeignKey; + declare issueStatusId: ForeignKey; + declare assigneeId: ForeignKey; + declare reporterId: ForeignKey; + declare title: CreationOptional; + declare description?: CreationOptional; + declare descriptionRaw?: CreationOptional; + declare priority: CreationOptional; + declare archived: CreationOptional; + declare parentId?: CreationOptional; + declare vectorSearch?: CreationOptional; + declare customFields?: CreationOptional; // ?? + + // declare getProject: BelongsToGetAssociationMixin; + // declare getIssueStatus: BelongsToGetAssociationMixin; // TODO: Write this association + // declare getAssignee: BelongsToGetAssociationMixin; + // declare getReporter: BelongsToGetAssociationMixin; + // declare getIssueComments: HasManyGetAssociationsMixin; + // declare getIssueBoards: HasManyGetAssociationsMixin; + // declare getLinkedToIssues: BelongsToManyGetAssociationsMixin; + // declare getLinkedByIssues: BelongsToManyGetAssociationsMixin; + + declare static associate: Associate; + + // TODO: Add the other relationships + + declare project?: NonAttribute; // Note this is optional since it's only populated when explicitly requested in code + declare linkedToIssues?: NonAttribute; + declare linkedByIssues?: NonAttribute; + declare IssueLink?: NonAttribute; + + declare static associations: { + project: Association; + linkedToIssues: Association; + linkedByIssues: Association; + }; + + // timestamps! + // createdAt can be undefined during creation + declare createdAt: CreationOptional; + // updatedAt can be undefined during creation + declare updatedAt: CreationOptional; +} + +export class Asset extends Model, InferCreationAttributes> { + // id can be undefined during creation when using `autoIncrement` + declare id: CreationOptional; + declare ownerId: ForeignKey; + declare assetType: string; + declare assetSubType: string; + declare assetPath: string; + declare assetProvider: string; + declare assetFilename: string; + + // TODO: Define associations + + declare static associate?: Associate; + + declare createdAt: CreationOptional; + declare updatedAt: CreationOptional; +} diff --git a/backend/src/db/models/user.js b/backend/src/db/models/user.ts similarity index 87% rename from backend/src/db/models/user.js rename to backend/src/db/models/user.ts index 2159936..bb2c22e 100644 --- a/backend/src/db/models/user.js +++ b/backend/src/db/models/user.ts @@ -1,8 +1,9 @@ -'use strict'; +import { DataTypes, Sequelize } from 'sequelize'; -export default (sequelize, DataTypes) => { - const User = sequelize.define( - 'User', +import { User } from './types.js'; + +export default (sequelize: Sequelize) => + User.init( { id: { type: DataTypes.INTEGER, @@ -50,6 +51,3 @@ export default (sequelize, DataTypes) => { indexes: [{ unique: true, fields: ['external_id'] }], } ); - - return User; -}; diff --git a/backend/src/index.js b/backend/src/index.js deleted file mode 100644 index 8da24ee..0000000 --- a/backend/src/index.js +++ /dev/null @@ -1,363 +0,0 @@ -import { ApolloServer } from '@apollo/server'; -import { fastifyApolloDrainPlugin, fastifyApolloHandler } from '@as-integrations/fastify'; -import * as cors from '@fastify/cors'; -import { fastifyWebsocket } from '@fastify/websocket'; -import axios from 'axios'; -import Fastify from 'fastify'; -import processRequest from 'graphql-upload/processRequest.mjs'; -import { GraphQLError } from 'graphql/error/index.js'; -import { nanoid } from 'nanoid'; - -import { db } from './db/index.js'; -import resolvers from './resolvers/index.js'; -import { - ALLOW_LOGIN_DOMAINS_LIST, - ALLOW_LOGIN_EMAILS_LIST, - ALLOW_SIGNUP, - BUCKET_NAME, - CORS_ORIGIN, - ENABLE_FASTIFY_LOGGING, - FRONTEND_HOSTNAME, - HTTP_PORT, -} from './services/config.js'; -import hocuspocusServer from './services/hocuspocus-server.js'; -import { minioClient } from './services/minio-client.js'; -import * as wsServer from './services/ws-server.js'; -import typeDefs from './type-defs.js'; - -const fastify = Fastify({ - logger: ENABLE_FASTIFY_LOGGING, - keepAliveTimeout: 61 * 1000, -}); - -fastify.server.headersTimeout = 65 * 1000; - -fastify.register(cors, { - origin: (origin, cb) => { - // TODO: ENV VAR this... maybe a.com,b.com and split and test - if ( - /localhost/.test(origin) || - /qa\.openpro\.io/.test(origin) || - /openpro\.io/.test(origin) || - CORS_ORIGIN === origin || - origin === null || - origin === undefined - ) { - cb(null, true); - return; - } - console.log('Blocked by CORS', { origin }); - // Generate an error on other origins, disabling access - cb(new Error('Not allowed')); - }, - methods: 'GET,HEAD,PUT,PATCH,POST,DELETE', - allowedHeaders: [ - 'Content-Type', - 'Authorization', - 'Accept', - 'Origin', - 'X-Requested-With', - 'apollographql-client-name', - 'apollographql-client-version', - 'Apollo-Require-Preflight', - ], - exposedHeaders: [], - credentials: true, -}); - -fastify.register(fastifyWebsocket, { - options: { maxPayload: 1048576, clientTracking: true }, -}); - -fastify.addHook('preValidation', async (request, reply) => { - // check if the request is authenticated - // TODO: Refactor to make this cleaner - if (request.headers['connection'] === 'Upgrade' && request.url === '/ws') { - const token = request.headers['sec-websocket-protocol'].split(',').map((x) => x.trim())[1]; - let user = null; - - try { - // TODO: maybe we just call the url of the caller origin - const { data } = await axios.get(`${FRONTEND_HOSTNAME}/api/verify-jwt`, { - headers: { Authorization: `Bearer ${token}` }, - }); - - // TODO: We can inject from DB here the whitelist domains and emails in addition to ENV vars - - if (ALLOW_LOGIN_EMAILS_LIST.length > 0 && !ALLOW_LOGIN_EMAILS_LIST.includes(data.email)) { - throw new GraphQLError('Email is not allowed to login', { - extensions: { - code: 'UNAUTHENTICATED', - http: { status: 401 }, - }, - }); - } - - if ( - ALLOW_LOGIN_DOMAINS_LIST.length > 0 && - !ALLOW_LOGIN_DOMAINS_LIST.includes(data.email.split('@')[1].toLowerCase()) - ) { - throw new GraphQLError('Email is not allowed to login', { - extensions: { - code: 'UNAUTHENTICATED', - http: { status: 401 }, - }, - }); - } - - const externalId = `${data.provider}__${data.sub}`; - - user = await db.sequelize.models.User.findOne({ where: { externalId } }); - - if (!user && ALLOW_SIGNUP) { - try { - const [firstName, lastName] = data.name.split(' '); - - user = await db.sequelize.models.User.create({ - email: data.email, - externalId, - firstName, - lastName, - }); - } catch (e) {} - } - - request.user = user; - } catch (e) { - if (e?.response?.status === 401) { - await reply.code(401).send('not authenticated'); - } else { - // TODO: We should probably throw a 500 here and log the error - console.error({ e }); - } - } - } -}); - -fastify.register(async function (fastify) { - fastify.websocketServer.on('connection', function connection(ws) { - ws.isAlive = true; - - // Heartbeat - ws.on('message', function (message) { - const msg = message.toString(); - if (['ping', 'pong'].includes(msg)) { - this.isAlive = true; - ws.send(msg === 'ping' ? 'pong' : 'ping'); - } - }); - }); - - const interval = setInterval(function ping() { - fastify.websocketServer.clients.forEach(function each(ws) { - if (ws.isAlive === false) return ws.terminate(); - - ws.isAlive = false; - }); - }, 30000); - - fastify.websocketServer.on('close', function close() { - clearInterval(interval); - }); - - fastify.get('/ws', { websocket: true }, (connection /* SocketStream */, req /* FastifyRequest */) => { - const context = {}; - - connection.socket.id = nanoid(); - connection.socket.user = req?.user; - connection.socket.namespace = 'ws'; - const clients = fastify.websocketServer.clients; - - wsServer.handleConnection({ - socket: connection.socket, - req, - context, - clients, - }); - }); -}); - -fastify.register(async function (fastify) { - fastify.get('/collaboration', { websocket: true }, (connection /* SocketStream */, req /* FastifyRequest */) => { - const context = {}; - - hocuspocusServer.handleConnection(connection.socket, req, context); - }); -}); - -// Handle all requests that have the `Content-Type` header set as multipart -fastify.addContentTypeParser('multipart', (request, payload, done) => { - request.isMultipart = true; - done(); -}); - -// Format the request body to follow graphql-upload's -fastify.addHook('preValidation', async function (request, reply) { - if (!request.isMultipart) { - return; - } - - request.body = await processRequest(request.raw, reply.raw); -}); - -await db.init(); - -const apollo = new ApolloServer({ - typeDefs, - resolvers, - // Using graphql-upload without CSRF prevention is very insecure. - csrfPrevention: true, - cache: 'bounded', - allowBatchedHttpRequests: true, - plugins: [fastifyApolloDrainPlugin(fastify)], -}); - -await apollo.start(); - -/** - * Retrieves context information based on the given request object. - * - * @param {import('fastify').RouteGenericInterface} request - The request object. - * @returns {Promise} - The context object. - * @throws {GraphQLError} - If the user is not authenticated. - */ -const myContextFunction = async (request) => { - // get the user token from the headers - const token = request.headers.authorization; - let user = null; - - if (!token) return { db, user }; - - // Allow if introspection query only - if (!Array.isArray(request.body) && request?.body?.query?.includes('IntrospectionQuery')) { - return { - db, - user, - }; - } - - // TODO: maybe we dont make this optional - if (token) { - try { - // TODO: maybe we just call the url of the caller origin - const { data } = await axios.get(`${FRONTEND_HOSTNAME}/api/verify-jwt`, { - headers: { Authorization: request.headers.authorization }, - }); - - // TODO: We can inject from DB here the whitelist domains and emails in addition to ENV vars - - if (ALLOW_LOGIN_EMAILS_LIST.length > 0 && !ALLOW_LOGIN_EMAILS_LIST.includes(data.email)) { - throw new GraphQLError('Email is not allowed to login', { - extensions: { - code: 'UNAUTHENTICATED', - http: { status: 401 }, - }, - }); - } - - if ( - ALLOW_LOGIN_DOMAINS_LIST.length > 0 && - !ALLOW_LOGIN_DOMAINS_LIST.includes(data.email.split('@')[1].toLowerCase()) - ) { - throw new GraphQLError('Email is not allowed to login', { - extensions: { - code: 'UNAUTHENTICATED', - http: { status: 401 }, - }, - }); - } - - const externalId = `${data.provider}__${data.sub}`; - - user = await db.sequelize.models.User.findOne({ where: { externalId } }); - - if (!user && ALLOW_SIGNUP) { - try { - const [firstName, lastName] = data.name.split(' '); - - user = await db.sequelize.models.User.create({ - email: data.email, - externalId, - firstName, - lastName, - }); - } catch (e) {} - } - } catch (e) { - if (e?.response?.status === 401) { - throw new GraphQLError('User is not authenticated', { - extensions: { - code: 'UNAUTHENTICATED', - http: { status: 401 }, - }, - }); - } else { - // TODO: We should probably throw a 500 here and log the error - console.error({ e }); - } - } - } - - // optionally block the user - // we could also check user roles/permissions here - if (!user) { - // throwing a `GraphQLError` here allows us to specify an HTTP status code, - // standard `Error`s will have a 500 status code by default - throw new GraphQLError('User is not authenticated', { - extensions: { - code: 'UNAUTHENTICATED', - http: { status: 401 }, - }, - }); - } - - return { - websocketServer: fastify?.websocketServer, - db, - user, - }; -}; - -fastify.post( - '/graphql', - fastifyApolloHandler(apollo, { - context: myContextFunction, - }) -); - -fastify.get('/uploads/:file', async (request, reply) => { - // TODO: make sure logged in - const { file } = request.params; - - const result = await minioClient.getObject(BUCKET_NAME, file); - - reply.header('Content-Type', result.headers['content-type']); - reply.header('Content-Length', result.headers['content-length']); - - return reply.send(result); -}); - -// TODO: this used to read from filesystem -// -// fastify.get('/assets/avatars/:file', async (request, reply) => { -// const { file } = request.params; -// const filePath = path.join(ASSET_PATH, 'avatars', file); -// -// // Check if the file exists -// try { -// await fs.access(filePath); -// } catch (error) { -// reply.code(404).send({ error: 'File not found' }); -// return; -// } -// -// // Set the headers -// reply.header('Content-Type', 'image/webp'); -// -// const buffer = await fs.readFile(filePath); -// reply.send(buffer); -// }); - -await fastify.listen({ port: HTTP_PORT, host: '0.0.0.0' }); - -console.log(`server listening on ${HTTP_PORT}`); diff --git a/backend/src/index.ts b/backend/src/index.ts new file mode 100644 index 0000000..c7272d1 --- /dev/null +++ b/backend/src/index.ts @@ -0,0 +1,6 @@ +import fastify from './server/index.js'; +import { HTTP_PORT } from './services/config.js'; + +await fastify.listen({ port: Number(HTTP_PORT), host: '0.0.0.0' }); + +console.log(`server listening on ${HTTP_PORT}`); diff --git a/backend/src/resolvers/Board/index.js b/backend/src/resolvers/Board/index.js deleted file mode 100644 index 2f47214..0000000 --- a/backend/src/resolvers/Board/index.js +++ /dev/null @@ -1,62 +0,0 @@ -import { websocketBroadcast } from '../../services/ws-server.js'; - -const resolvers = { - Query: { - boards: (parent, args, { db }) => { - // TODO: should we require a project id to show boards? - return db.sequelize.models.Board.findAll(); - }, - board: async (parent, { input: { id } }, { db }) => { - const boardInfo = await db.sequelize.models.Board.findByPk(id, { - include: db.sequelize.models.Issue, - }); - return boardInfo; - }, - }, - Mutation: { - updateBoard: async (parent, { input }, { db, websocketServer }) => { - const { id, name, viewState, backlogEnabled, settings, containerOrder } = input; - - const board = await db.sequelize.models.Board.findByPk(id); - if (name) board.name = name; - if (typeof viewState !== 'undefined') board.viewState = viewState; - if (backlogEnabled !== undefined) board.backlogEnabled = backlogEnabled; - if (typeof settings !== 'undefined') board.settings = settings; - // TODO: lets add some more safety checks here - if (typeof containerOrder !== 'undefined') { - board.containerOrder = typeof containerOrder === 'string' ? JSON.parse(containerOrder) : null; - } - - await board.save(); - - websocketBroadcast({ - clients: websocketServer.clients, - namespace: 'ws', - message: JSON.stringify({ type: 'BOARD_UPDATED', payload: board.toJSON() }), - }); - - return board; - }, - }, - Board: { - issues: async (parent, args, { db }) => { - const boardIssues = await db.sequelize.models.IssueBoard.findAll({ - where: { boardId: parent.id }, - raw: true, - }); - - const data = parent.Issues.map((issue) => ({ - ...issue.toJSON(), - boardId: parent.id, - position: boardIssues.find((boardIssue) => Number(boardIssue.issueId) === Number(issue.id)).position, - })); - - return data; - }, - containerOrder: (parent) => { - return parent.containerOrder ? JSON.stringify(parent.containerOrder) : undefined; - }, - }, -}; - -export default resolvers; diff --git a/backend/src/resolvers/Issue/index.js b/backend/src/resolvers/Issue/index.js deleted file mode 100644 index 9cf7af5..0000000 --- a/backend/src/resolvers/Issue/index.js +++ /dev/null @@ -1,287 +0,0 @@ -import { keyBy, merge, values } from 'lodash-es'; -import { Op } from 'sequelize'; -import yn from 'yn'; - -import { websocketBroadcast } from '../../services/ws-server.js'; - -const resolvers = { - Query: { - issues: (parent, { input: { projectId, id, search, searchOperator } }, { db }) => { - let whereOr = []; - let queryOperator = Op.or; - - if (projectId) whereOr = [...whereOr, { projectId: Number(projectId) }]; - if (id) whereOr = [...whereOr, { id: Number(id) }]; - if (search) { - whereOr = [ - ...whereOr, - { - [Op.or]: { - vectorSearch: { - [Op.match]: db.Sequelize.fn('to_tsquery', search), - }, - id: { - [Op.eq]: search.replace(/[^0-9]/g, '') || null, - }, - }, - }, - ]; - } - if (searchOperator === 'and') queryOperator = Op.and; - if (searchOperator === 'or') queryOperator = Op.or; - - return db.sequelize.models.Issue.findAll({ - include: [ - { - model: db.sequelize.models.Project, - }, - { - model: db.sequelize.models.Issue, - as: 'linkedToIssues', - through: { - attributes: [ - ['issue_id', 'issueId'], - ['linked_issue_id', 'linkedIssueId'], - ['link_type', 'linkType'], - ], - }, - }, - { - model: db.sequelize.models.Issue, - as: 'linkedByIssues', - through: { - attributes: [ - ['issue_id', 'issueId'], - ['linked_issue_id', 'linkedIssueId'], - ['link_type', 'linkType'], - ], - }, - }, - ], - where: { - [queryOperator]: whereOr, - }, - }); - }, - issue: (parent, { input: { id } }, { db }) => { - return db.sequelize.models.Issue.findByPk(id, { - include: [ - { - model: db.sequelize.models.Issue, - as: 'linkedToIssues', - through: { - attributes: [ - ['issue_id', 'issueId'], - ['linked_issue_id', 'linkedIssueId'], - ['link_type', 'linkType'], - ], - }, - }, - { - model: db.sequelize.models.Issue, - as: 'linkedByIssues', - through: { - attributes: [ - ['issue_id', 'issueId'], - ['linked_issue_id', 'linkedIssueId'], - ['link_type', 'linkType'], - ], - }, - }, - ], - }); - }, - }, - Mutation: { - deleteIssueLink: async (parent, { input: { issueId, linkType, linkedIssueId } }, { db }) => { - await db.sequelize.models.IssueLinks.destroy({ - where: { - issueId, - linkType, - linkedIssueId, - }, - }); - - return { message: 'success', status: 'success' }; - }, - createIssueLink: async (parent, { input: { issueId, linkType, linkedIssueId } }, { db }) => { - const issue = await db.sequelize.models.Issue.findByPk(issueId); - const linkedIssue = await db.sequelize.models.Issue.findByPk(linkedIssueId); - - if (!issue || !linkedIssue) { - throw new Error('Issue not found'); - } - - await db.sequelize.models.IssueLinks.create({ - issueId, - linkType, - linkedIssueId, - }); - - return { message: 'success', status: 'success' }; - }, - updateIssue: async (parent, { input }, { db, websocketServer }) => { - const { - id, - issueStatusId, - assigneeId, - reporterId, - title, - description, - tagIds, - priority, - archived, - customFieldId, - customFieldValue, - } = input; - - const issue = await db.sequelize.models.Issue.findByPk(id); - - if (issueStatusId) issue.issueStatusId = issueStatusId; - if (assigneeId) issue.assigneeId = Number(assigneeId); - if (reporterId) issue.reporterId = Number(reporterId); - if (title) issue.title = title; - if (description) issue.description = description; - if (priority) issue.priority = Number(priority); - if (tagIds) { - await db.sequelize.models.IssueTag.destroy({ where: { issueId: id } }); - await db.sequelize.models.IssueTag.bulkCreate( - tagIds.map((tagId) => ({ - issueId: Number(id), - projectTagId: Number(tagId), - })) - ); - } - if (archived !== undefined) issue.archived = archived; - - // TODO: look for better way to handle nullifying user - if (issue.assigneeId === 0) issue.assigneeId = null; - if (issue.reporterId === 0) issue.reporterId = null; - - if (customFieldId && customFieldValue) { - const customField = await db.sequelize.models.ProjectCustomField.findByPk(Number(customFieldId)); - if (!customField) throw new Error('Custom field not found'); - - let valueCasted = customFieldValue; - - if (customField.fieldType.toLowerCase() === 'number') valueCasted = Number(customFieldValue); - else if (customField.fieldType.toLowerCase() === 'boolean') valueCasted = yn(customFieldValue); - - const customFieldObject = { - id: `${issue.id}-${customField.id}`, - customFieldId, - value: valueCasted, - createdAt: new Date(), // TODO: improve date format decision - }; - - // TODO: investigate how to deep set the value instead of this to leverage DB level updating - issue.customFields = issue.customFields - ? values(merge(keyBy(issue.customFields, 'id'), keyBy([customFieldObject], 'id'))) - : [customFieldObject]; - } - - await issue.save(); - - const issueStatus = await db.sequelize.models.IssueStatuses.findByPk(issueStatusId ?? issue.issueStatusId); - - const returnData = { ...issue.toJSON(), status: issueStatus.toJSON() }; - - websocketBroadcast({ - clients: websocketServer.clients, - namespace: 'ws', - message: JSON.stringify({ type: 'ISSUE_UPDATED', payload: returnData }), - }); - - return returnData; - }, - createIssue: async (parent, { input }, { db, user }) => { - const { projectId, boardId, issueStatusId, assigneeId, title, description, priority } = input; - - // TODO: create issue status as unassigned option - - const issue = await db.sequelize.models.Issue.create({ - projectId, - issueStatusId, - assigneeId, - reporterId: user.id, - title, - description, - priority, - }); - - if (typeof boardId !== 'undefined') { - await db.sequelize.models.IssueBoard.create({ - boardId, - issueId: issue.id, - }); - } - - const issueStatus = await db.sequelize.models.IssueStatuses.findByPk(issueStatusId); - - return { ...issue.toJSON(), status: issueStatus.toJSON() }; - }, - deleteIssue: async (parent, { input }, { db }) => { - const { id } = input; - - await db.sequelize.transaction(async (t) => { - await db.sequelize.models.Issue.destroy({ - where: { - id, - }, - transaction: t, - }); - - // TODO: not needed due to cascade - await db.sequelize.models.IssueComment.destroy({ where: { issueId: id }, transaction: t }); - }); - - return { message: 'issue deleted', status: 'success' }; - }, - }, - CustomFieldValue: { - customField: async (parent, args, { db }) => { - return db.sequelize.models.ProjectCustomField.findByPk(parent.customFieldId); - }, - }, - Issue: { - links: async (parent, args, { db }) => { - return [ - ...parent.linkedToIssues?.map((issue) => ({ - ...issue.toJSON(), - linkType: issue.IssueLinks.linkType, - linkedIssueId: parent.id, - })), - ...parent.linkedByIssues?.map((issue) => ({ - ...issue.toJSON(), - linkType: issue.IssueLinks.linkTypeInverted, - linkedIssueId: parent.id, - })), - ]; - }, - tags: async (parent, args, { db }) => { - const issueTags = await db.sequelize.models.IssueTag.findAll({ where: { issueId: parent.id } }); - - return await db.sequelize.models.ProjectTag.findAll({ - where: { id: issueTags.map((issueTag) => issueTag.projectTagId) }, - }); - }, - comments: (parent, args, { db }) => { - return db.sequelize.models.IssueComment.findAll( - { where: { issueId: parent.id } }, - { order: [['createdAt', 'DESC']] } - ); - }, - status: (parent, args, { db }) => { - return db.sequelize.models.IssueStatuses.findByPk(parent.issueStatusId); - }, - reporter: (parent, args, { db }) => { - return db.sequelize.models.User.findByPk(parent.reporterId); - }, - assignee: (parent, args, { db }) => { - return db.sequelize.models.User.findByPk(parent.assigneeId); - }, - project: (parent) => parent.Project, - }, -}; - -export default resolvers; diff --git a/backend/src/resolvers/IssueComment/index.js b/backend/src/resolvers/IssueComment/index.js deleted file mode 100644 index 91b1e39..0000000 --- a/backend/src/resolvers/IssueComment/index.js +++ /dev/null @@ -1,53 +0,0 @@ -const resolvers = { - Query: {}, - Mutation: { - createIssueComment: async (parent, { input }, { db, user }) => { - const { issueId, comment, commentRaw } = input; - const reporterId = user.id; - - return await db.sequelize.models.IssueComment.create({ - issueId, - reporterId, - comment, - commentRaw: Buffer.from(commentRaw, 'base64') - }); - }, - deleteIssueComment: async (parent, { input }, { db }) => { - const { commentId } = input; - - const findIssueComment = await db.sequelize.models.IssueComment.findByPk(commentId); - - if (!findIssueComment) { - throw new Error('Issue comment not found'); - } - - await findIssueComment.destroy(); - - return { - message: 'deleted comment', - status: 'success', - }; - }, - updateIssueComment: async (parent, { input }, { db }) => { - const { commentId, comment } = input; - - const findIssueComment = await db.sequelize.models.IssueComment.findByPk(commentId); - - if (!findIssueComment) { - throw new Error('Issue comment not found'); - } - - findIssueComment.comment = comment; - await findIssueComment.save(); - - return findIssueComment; - }, - }, - IssueComment: { - reporter: (parent, args, { db }) => { - return db.sequelize.models.User.findByPk(parent.reporterId); - }, - }, -}; - -export default resolvers; diff --git a/backend/src/resolvers/Project/index.js b/backend/src/resolvers/Project/index.js deleted file mode 100644 index bdfaeb9..0000000 --- a/backend/src/resolvers/Project/index.js +++ /dev/null @@ -1,212 +0,0 @@ -import { Op } from 'sequelize'; - -const resolvers = { - Query: { - projects: (parent, args, { db }) => { - // TODO: If project is internal only show projects that the user is a member of - return db.sequelize.models.Project.findAll({ - order: [['id', 'ASC']], - include: [ - { - model: db.sequelize.models.User, - as: 'users', - }, - ], - }); - }, - createProjectValidation: async (parent, { input }, { db }) => { - const { name, key } = input; - - let whereOr = []; - - if (name) whereOr = [...whereOr, { name: name }]; - if (key) whereOr = [...whereOr, { key: key }]; - - const project = await db.sequelize.models.Project.findOne({ - where: { [Op.or]: whereOr }, - }); - - if (project) { - return { - status: 'error', - message: 'Project name or key already exists', - }; - } - - return { - status: 'success', - message: 'Project name and key are available', - }; - }, - project: (parent, args, { db }) => { - const { id } = args?.input; - return db.sequelize.models.Project.findByPk(id, { - include: [ - { - model: db.sequelize.models.User, - as: 'users', - }, - ], - }); - }, - projectTags: (parent, { input: { projectId, id, name } }, { db }) => { - const where = { projectId }; - - if (id) where.id = id; - if (name) { - where.name = { - [Op.like]: `%${name}%`, - }; - } - - return db.sequelize.models.ProjectTag.findAll({ where }); - }, - }, - Mutation: { - createProjectCustomField: async (parent, { input: { projectId, fieldName, fieldType } }, { db }) => - await db.sequelize.models.ProjectCustomField.create( - { - projectId: Number(projectId), - fieldName, - fieldType, - }, - { returning: true } - ), - deleteProjectCustomField: async (parent, { input: { id } }, { db }) => { - const findCustomField = await db.sequelize.models.ProjectCustomField.findByPk(id); - - if (!findCustomField) throw new Error('Custom field not found'); - - await findCustomField.destroy(); - - return { - message: 'deleted custom field', - status: 'success', - }; - }, - createProjectTag: async (parent, { input }, { db }) => { - const { projectId, name } = input; - - return await db.sequelize.models.ProjectTag.create({ - projectId: Number(projectId), - name, - }); - }, - deleteProjectTag: async (parent, { input: { id } }, { db }) => { - const findProjectTag = await db.sequelize.models.ProjectTag.findByPk(id); - - if (!findProjectTag) { - throw new Error('Project tag not found'); - } - - await findProjectTag.destroy(); - - return { - message: 'deleted tag', - status: 'success', - }; - }, - addUserToProject: async (parent, { input: { userId, projectId } }, { db }) => { - const existingPermission = await db.sequelize.models.ProjectPermission.findOne({ - where: { userId, projectId }, - }); - - if (existingPermission) { - return { message: 'User added to project', status: 'success' }; - } - - // Add the user to the project - await db.sequelize.models.ProjectPermission.create({ - userId, - projectId, - }); - - return { message: 'User added to project', status: 'success' }; - }, - removeUserFromProject: async (parent, { input: { userId, projectId } }, { db, user }) => { - if (user.id === userId) { - throw new Error('You cannot remove yourself from the project'); - } - - const existingPermission = await db.sequelize.models.ProjectPermission.findOne({ - where: { userId, projectId }, - }); - - if (!existingPermission) { - throw new Error('User is not added to the project'); - } - - // Remove the user from the project - await db.sequelize.models.ProjectPermission.destroy({ - where: { userId, projectId }, - }); - - return { message: 'User removed from project', status: 'success' }; - }, - createProject: async (parent, { input }, { db, user }) => { - // TODO: we should do a sequelize transaction here - const project = await db.sequelize.models.Project.create({ - name: input.name, - key: input.key, - visibility: input.visibility ?? 'INTERNAL', - }); - - await db.sequelize.models.ProjectPermission.create({ - userId: user.id, - projectId: project.id, - }); - - const projectId = Number(project.id); - - // TODO: We should create mappings for these statuses - const issueStatuses = await db.sequelize.models.IssueStatuses.bulkCreate( - ['Backlog', 'To Do', 'In Progress', 'Done'].map((name) => ({ - projectId, - name, - })) - ); - - const board = await db.sequelize.models.Board.create({ - projectId, - name: input?.boardName ?? 'default', - style: input.boardStyle, - viewState: issueStatuses.map((is) => ({ - id: `container-${is.id}`, - title: is.name, - items: [], - })), - }); - - return { ...project.toJSON(), boards: [board.toJSON()] }; - }, - }, - Project: { - customFields: (parent, args, { db }) => { - return db.sequelize.models.ProjectCustomField.findAll({ where: { projectId: parent.id } }); - }, - tags: (parent, args, { db }) => { - return db.sequelize.models.ProjectTag.findAll({ where: { projectId: parent.id } }); - }, - issues: (parent, args, { db }) => { - const { input } = args; - const findAllInput = { where: { projectId: parent.id } }; - - if (input && input?.sortBy) { - findAllInput.order = [input?.sortBy.map(({ field, order }) => [field, order])]; - } - - return db.sequelize.models.Issue.findAll(findAllInput); - }, - boards: (parent, args, { db }) => { - return db.sequelize.models.Board.findAll({ where: { projectId: parent.id } }); - }, - issueStatuses: (parent, args, { db }) => { - return db.sequelize.models.IssueStatuses.findAll({ where: { projectId: parent.id } }); - }, - issueCount: async (parent, args, { db }) => { - return db.sequelize.models.Issue.count({ where: { projectId: parent.id } }); - }, - }, -}; - -export default resolvers; diff --git a/backend/src/resolvers/User/index.js b/backend/src/resolvers/User/index.js deleted file mode 100644 index 15f1480..0000000 --- a/backend/src/resolvers/User/index.js +++ /dev/null @@ -1,71 +0,0 @@ -import { isUndefined } from 'lodash-es'; - -import { BUCKET_NAME } from '../../services/config.js'; -import { minioClient } from '../../services/minio-client.js'; - -const resolvers = { - Query: { - users: (parent, args, { db }) => { - return db.sequelize.models.User.findAll(); - }, - user: (parent, { id, externalId }, { db }) => { - if (externalId) { - return db.sequelize.models.User.findOne({ where: { externalId } }); - } - - if (id) { - return db.sequelize.models.User.findByPk(id); - } - }, - me: (parent, args, { db, user }) => { - return db.sequelize.models.User.findByPk(user.id); - }, - }, - Mutation: { - updateMe: async (parent, { input }, { db, user }) => { - const { firstName, lastName } = input; - - if (!isUndefined(firstName)) user.firstName = firstName; - if (!isUndefined(lastName)) user.lastName = lastName; - - await user.save(); - - return user; - }, - assignAssetAsAvatar: async (parent, { input }, { db, user }) => { - const { assetId } = input; - let findOldAvatarAsset; - - if (user.avatarAssetId) { - findOldAvatarAsset = await db.sequelize.models.Asset.findByPk(user.avatarAssetId); - } - - const findAsset = await db.sequelize.models.Asset.findByPk(assetId); - - user.avatarAssetId = assetId; - await user.save(); - - if (findOldAvatarAsset) { - // TODO: Remove from minio - await findOldAvatarAsset.destroy(); - await minioClient.removeObject(BUCKET_NAME, findOldAvatarAsset.assetFilename); - } - - return findAsset; - }, - }, - User: { - name: (parent) => `${parent?.firstName} ${parent?.lastName}`, - avatarUrl: async (parent, args, { db }) => { - const findAvatarAsset = await db.sequelize.models.Asset.findByPk(parent.avatarAssetId); - - if (findAvatarAsset) { - return '/' + findAvatarAsset.assetPath; - } - - return null; - }, - }, -}; - -export default resolvers; diff --git a/backend/src/resolvers/board/index.ts b/backend/src/resolvers/board/index.ts new file mode 100644 index 0000000..aa6bdd0 --- /dev/null +++ b/backend/src/resolvers/board/index.ts @@ -0,0 +1,124 @@ +import type { + BoardResolvers, + MutationResolvers, + QueryResolvers, + ViewState, +} from '../../__generated__/resolvers-types.js'; +import type { Board as BoardModel } from '../../db/models/types.js'; +import { websocketBroadcast } from '../../services/ws-server.js'; + +const formatBoardResponse = (board: BoardModel) => { + return { + ...board.toJSON(), + id: `${board.id}`, + projectId: `${board.projectId}`, + containerOrder: board.containerOrder ? JSON.stringify(board.containerOrder) : undefined, + settings: board.settings ? JSON.stringify(board.settings) : undefined, + viewState: board.viewState ? (board.viewState as ViewState[]) : undefined, // TODO: verify this is correct + }; +}; + +const Query: QueryResolvers = { + boards: async (parent, args, { db, dataLoaderContext }) => { + // TODO: should we require a project id to show boards? + const boards = await db.Board.findAll(); + + dataLoaderContext.prime(boards); + + return boards.map(formatBoardResponse); + }, + board: async (parent, { input: { id } }, { db, dataLoaderContext, EXPECTED_OPTIONS_KEY }) => { + const board = await db.Board.findByPk(Number(id), { + // include: { + // model: db.Issue, + // as: 'issues', + // }, + [EXPECTED_OPTIONS_KEY]: dataLoaderContext, + }); + + return formatBoardResponse(board); + }, +}; + +const Mutation: MutationResolvers = { + updateBoard: async (parent, { input }, { db, websocketServer, dataLoaderContext, EXPECTED_OPTIONS_KEY }) => { + const { id, name, viewState, backlogEnabled, settings, containerOrder } = input; + + const board = await db.Board.findByPk(Number(id), { + [EXPECTED_OPTIONS_KEY]: dataLoaderContext, + }); + if (name) board.name = name; + if (typeof viewState !== 'undefined') board.viewState = viewState; + if (backlogEnabled !== undefined) board.backlogEnabled = backlogEnabled; + if (typeof settings !== 'undefined') board.settings = JSON.parse(settings); + // TODO: lets add some more safety checks here + if (typeof containerOrder !== 'undefined') { + board.containerOrder = typeof containerOrder === 'string' ? JSON.parse(containerOrder) : null; + } + + await board.save(); + + dataLoaderContext.prime(board); + + websocketBroadcast({ + clients: websocketServer.clients, + namespace: 'ws', + message: JSON.stringify({ type: 'BOARD_UPDATED', payload: board.toJSON() }), + }); + + return formatBoardResponse(board); + }, +}; + +const Board: BoardResolvers = { + // TODO: this section needs some improvement + issues: async (parent, args, { db, dataLoaderContext, EXPECTED_OPTIONS_KEY }) => { + const board = await db.Board.findByPk(Number(parent.id), { + include: { + model: db.Issue, + as: 'issues', + }, + [EXPECTED_OPTIONS_KEY]: dataLoaderContext, + }); + + const boardIssueIdsFromViewState = board.viewState + // TODO: its typed as object when its an array + // @ts-ignore + .flatMap((container) => container.items) + .map((item) => Number(item.id.replace('item-', ''))); + + const issuesInViewState = await db.Issue.findAll({ + where: { + id: boardIssueIdsFromViewState, + }, + }); + + const boardIssues = await db.IssueBoard.findAll({ + where: { boardId: parent.id }, + raw: true, + }); + + dataLoaderContext.prime(boardIssues); + + return issuesInViewState.map((issue) => ({ + ...issue.toJSON(), + id: `${issue.id}`, + boardId: `${parent.id}`, + projectId: `${parent.projectId}`, + position: boardIssues.find((boardIssue) => Number(boardIssue.issueId) === Number(issue.id))?.position, + project: undefined, + customFields: undefined, + })); + }, + containerOrder: (parent) => { + return parent.containerOrder ?? undefined; + }, +}; + +const resolvers = { + Query, + Mutation, + Board, +}; + +export default resolvers; diff --git a/backend/src/resolvers/index.js b/backend/src/resolvers/index.js deleted file mode 100644 index 072938f..0000000 --- a/backend/src/resolvers/index.js +++ /dev/null @@ -1,144 +0,0 @@ -import { mergeResolvers } from '@graphql-tools/merge'; -import { v4 as uuidv4 } from 'uuid'; - -import { ASSET_PROVIDER, BUCKET_NAME } from '../services/config.js'; -import { minioClient } from '../services/minio-client.js'; -import BoardResolvers from './board/index.js'; -import IssueResolvers from './issue/index.js'; -import IssueCommentResolvers from './issueComment/index.js'; -import ProjectResolvers from './project/index.js'; -import UploadResolvers from './upload/index.js'; -import UserResolvers from './user/index.js'; - -// TODO: make these delete operations with SQL + minio inside a SQL transaction - -const miscResolvers = { - Mutation: { - createIssueStatus: async (parent, { input }, { db }) => { - const { projectId, name } = input; - - return await db.sequelize.models.IssueStatuses.create({ - projectId: Number(projectId), - name, - }); - }, - - deleteAsset: async (parent, { input }, { db }) => { - const { assetId } = input; - - const findAsset = await db.sequelize.models.Asset.findByPk(assetId); - - if (!findAsset) { - throw new Error('Asset not found'); - } - - await findAsset.destroy(); - await minioClient.removeObject(BUCKET_NAME, findAsset.assetFilename); - - return { - message: 'success', - status: 'success', - }; - }, - uploadAsset: async (parent, { input }, { db, user }) => { - const { assetExtension, file } = input; - - const { createReadStream, mimetype } = await file; - - const assetFilename = `${uuidv4()}.${assetExtension}`; - - const metaData = { - 'Content-Type': mimetype, - 'Uploaded-By-User-Id': user.id, - }; - - await minioClient.putObject(BUCKET_NAME, assetFilename, createReadStream(), metaData); - - return await db.sequelize.models.Asset.create({ - ownerId: user.id, - assetType: '', - assetSubType: '', - assetPath: `${BUCKET_NAME}/${assetFilename}`, - assetProvider: ASSET_PROVIDER, - assetFilename: assetFilename, - }); - }, - - // uploadAvatar: async (parent, { input }, { db, user }) => { - // const { data } = input; - // let finalAssetPath = ''; - // - // // Split the string on comma - // const parts = data.split(','); - // - // // this gets the image extension of the uploaded source image - // // const imageExtension = parts[0].split(',')[0].split(';')[0].split(':')[1].replace('image/', ''); - // - // const base64Data = new Buffer(parts[1], 'base64'); - // - // let image = await sharp(base64Data, { - // height: 32, - // width: 32, - // }); - // - // // TODO: lets find more dynamic way to handle this - // if (ASSET_PROVIDER === 'filesystem') { - // finalAssetPath = `${ASSET_PATH}/avatars/user-${user.id}.webp`; - // - // // Get the directory name from the file path - // const finalAssetDirectory = path.dirname(finalAssetPath); - // - // try { - // await fs.access(finalAssetDirectory); - // } catch (error) { - // await fs.mkdir(finalAssetDirectory, { recursive: true }); - // } - // - // await image.webp().resize({ width: 128, height: 128 }).toFile(finalAssetPath); - // } else if (ASSET_PROVIDER === 's3') { - // finalAssetPath = `${ASSET_PATH}/avatars/user-${user.id}.webp`; - // // TODO: implement s3 - // } - // - // const findAsset = await db.sequelize.models.Asset.findOne({ - // where: { - // ownerId: user.id, - // assetType: 'avatar', - // assetSubType: 'image', - // }, - // }); - // - // if (findAsset) { - // findAsset.updatedAt = new Date(); - // await findAsset.save(); - // return findAsset; - // } - // - // // TODO: decide if we want to await inside or outside... probably inside for now to catch exceptions - // return await db.sequelize.models.Asset.create({ - // ownerId: user.id, - // assetType: 'avatar', - // assetSubType: 'image', - // assetPath: finalAssetPath, - // assetProvider: ASSET_PROVIDER, - // assetFilename: path.basename(finalAssetPath), - // }); - // }, - }, - - Query: { - helloWorld: () => 'hello world', - }, -}; - -const resolvers = mergeResolvers([ - miscResolvers, - IssueResolvers, - IssueCommentResolvers, - UploadResolvers, - UserResolvers, - BoardResolvers, - ProjectResolvers, -]); - -export default resolvers; diff --git a/backend/src/resolvers/index.ts b/backend/src/resolvers/index.ts new file mode 100644 index 0000000..a733b7f --- /dev/null +++ b/backend/src/resolvers/index.ts @@ -0,0 +1,87 @@ +import { mergeResolvers } from '@graphql-tools/merge'; +import { GraphQLDateTime } from 'graphql-scalars'; +import { v4 as uuidv4 } from 'uuid'; + +import type { Resolvers } from '../__generated__/resolvers-types.js'; +import { ASSET_PROVIDER, BUCKET_NAME } from '../services/config.js'; +import { minioClient } from '../services/minio-client.js'; +import BoardResolvers from './board/index.js'; +import IssueCommentResolvers from './issue-comment/index.js'; +import IssueResolvers from './issue/index.js'; +import ProjectResolvers from './project/index.js'; +import UploadResolvers from './upload/index.js'; +import UserResolvers from './user/index.js'; + +// TODO: make these delete operations with SQL + minio inside a SQL transaction + +// TODO: lets use this maybe ... https://github.com/excitement-engineer/graphql-iso-date +const miscResolvers = { + DateTime: GraphQLDateTime, + Mutation: { + createIssueStatus: async (parent, { input }, { db }) => { + const { projectId, name } = input; + + return await db.IssueStatuses.create({ + projectId: Number(projectId), + name, + }); + }, + + deleteAsset: async (parent, { input }, { db }) => { + const { assetId } = input; + + const findAsset = await db.Asset.findByPk(assetId); + + if (!findAsset) { + throw new Error('Asset not found'); + } + + await findAsset.destroy(); + await minioClient.removeObject(BUCKET_NAME, findAsset.assetFilename); + + return { + message: 'success', + status: 'success', + }; + }, + uploadAsset: async (parent, { input }, { db, user }) => { + const { assetExtension, file } = input; + + const { createReadStream, mimetype } = await file; + + const assetFilename = `${uuidv4()}.${assetExtension}`; + + const metaData = { + 'Content-Type': mimetype, + 'Uploaded-By-User-Id': user.id, + }; + + await minioClient.putObject(BUCKET_NAME, assetFilename, createReadStream(), metaData); + + return await db.Asset.create({ + ownerId: user.id, + assetType: '', + assetSubType: '', + assetPath: `${BUCKET_NAME}/${assetFilename}`, + assetProvider: ASSET_PROVIDER, + assetFilename: assetFilename, + }); + }, + }, + + Query: { + helloWorld: () => 'hello world', + }, +}; + +const resolvers: Resolvers = mergeResolvers([ + miscResolvers, + IssueResolvers, + IssueCommentResolvers, + UploadResolvers, + UserResolvers, + BoardResolvers, + ProjectResolvers, +]); + +export default resolvers; diff --git a/backend/src/resolvers/issue-comment/index.ts b/backend/src/resolvers/issue-comment/index.ts new file mode 100644 index 0000000..9f6676b --- /dev/null +++ b/backend/src/resolvers/issue-comment/index.ts @@ -0,0 +1,86 @@ +import type { IssueCommentResolvers, MutationResolvers } from '../../__generated__/resolvers-types.js'; + +const Mutation: MutationResolvers = { + createIssueComment: async (parent, { input }, { db, user }) => { + const { issueId, comment, commentRaw } = input; + + const createdIssueComment = await db.IssueComment.create( + { + issueId: Number(issueId), + reporterId: Number(user.id), + comment, + // @ts-ignore + commentRaw: Buffer.from(commentRaw, 'base64'), // TODO: fix this + }, + { + returning: true, + } + ); + + return { + ...createdIssueComment.toJSON(), + id: `${createdIssueComment.id}`, + issueId: `${issueId}`, + }; + }, + deleteIssueComment: async (parent, { input }, { db }) => { + const { commentId } = input; + + const findIssueComment = await db.IssueComment.findByPk(commentId); + + if (!findIssueComment) { + throw new Error('issue comment not found'); + } + + await findIssueComment.destroy(); + + return { + message: 'deleted comment', + status: 'success', + }; + }, + updateIssueComment: async (parent, { input }, { db, dataLoaderContext, EXPECTED_OPTIONS_KEY }) => { + const { commentId, comment } = input; + + const findIssueComment = await db.IssueComment.findByPk(Number(commentId), { + [EXPECTED_OPTIONS_KEY]: dataLoaderContext, + }); + + if (!findIssueComment) throw new Error('Issue comment not found'); + + findIssueComment.comment = comment; + + await findIssueComment.save(); + + return { + ...findIssueComment.toJSON(), + id: `${findIssueComment.id}`, + issueId: `${findIssueComment.issueId}`, + }; + }, +}; + +const IssueComment: IssueCommentResolvers = { + reporter: async (parent, args, { db, dataLoaderContext, EXPECTED_OPTIONS_KEY }) => { + const findIssueComment = await db.IssueComment.findByPk(Number(parent.id), { + [EXPECTED_OPTIONS_KEY]: dataLoaderContext, + }); + + const dbUser = await db.User.findByPk(Number(findIssueComment.reporterId), { + [EXPECTED_OPTIONS_KEY]: dataLoaderContext, + }); + + return { + ...dbUser.toJSON(), + id: `${dbUser.id}`, + }; + }, +}; + +const resolvers = { + Query: {}, + Mutation, + IssueComment, +}; + +export default resolvers; diff --git a/backend/src/resolvers/issue/index.ts b/backend/src/resolvers/issue/index.ts new file mode 100644 index 0000000..f3fa19b --- /dev/null +++ b/backend/src/resolvers/issue/index.ts @@ -0,0 +1,452 @@ +import { keyBy, merge, values } from 'lodash-es'; +import { Op } from 'sequelize'; +import yn from 'yn'; + +import { + type CustomFieldValueResolvers, + Custom_Field_Type, + type IssueResolvers, + type MutationResolvers, + ProjectVisibility, + type QueryResolvers, + type Resolvers, +} from '../../__generated__/resolvers-types.js'; +import { Issue as IssueModel } from '../../db/models/types.js'; +import { websocketBroadcast } from '../../services/ws-server.js'; + +const Query: QueryResolvers = { + issues: async (parent, { input: { projectId, id, search, searchOperator } }, { db, dataLoaderContext }) => { + let whereOr = []; + let queryOperator = Op.or; + + if (projectId) whereOr = [...whereOr, { projectId: Number(projectId) }]; + if (id) whereOr = [...whereOr, { id: Number(id) }]; + if (search) { + whereOr = [ + ...whereOr, + { + [Op.or]: { + vectorSearch: { + [Op.match]: db.Sequelize.fn('to_tsquery', search), + }, + id: { + [Op.eq]: search.replace(/[^0-9]/g, '') || null, + }, + }, + }, + ]; + } + if (searchOperator === 'and') queryOperator = Op.and; + if (searchOperator === 'or') queryOperator = Op.or; + + const issuesListPlain = await db.Issue.findAll({ + // include: [ + // { + // model: db.Project, + // as: 'project', + // }, + // { + // model: db.Issue, + // as: 'linkedToIssues', + // through: { + // attributes: [ + // ['issue_id', 'issueId'], + // ['linked_issue_id', 'linkedIssueId'], + // ['link_type', 'linkType'], + // ], + // }, + // }, + // { + // model: db.Issue, + // as: 'linkedByIssues', + // through: { + // attributes: [ + // ['issue_id', 'issueId'], + // ['linked_issue_id', 'linkedIssueId'], + // ['link_type', 'linkType'], + // ], + // }, + // }, + // ], + where: { + [queryOperator]: whereOr, + }, + }); + + dataLoaderContext.prime(issuesListPlain); + + return ( + issuesListPlain && + issuesListPlain.map((issue) => ({ + ...issue.toJSON(), + id: `${issue.id}`, + projectId: `${issue.projectId}`, + project: undefined, + customFields: undefined, + })) + ); + }, + issue: async (parent, { input: { id } }, { db, dataLoaderContext, EXPECTED_OPTIONS_KEY }) => { + const databaseIssue = await db.Issue.findByPk(id, { + [EXPECTED_OPTIONS_KEY]: dataLoaderContext, + }); + + return { + ...databaseIssue.toJSON(), + id: `${databaseIssue.id}`, + projectId: `${databaseIssue.projectId}`, + project: undefined, + customFields: undefined, + }; + }, +}; + +const Mutation: MutationResolvers = { + deleteIssueLink: async (parent, { input: { issueId, linkType, linkedIssueId } }, { db }) => { + await db.IssueLink.destroy({ + where: { + issueId, + linkType, + linkedIssueId, + }, + }); + + return { message: 'success', status: 'success' }; + }, + createIssueLink: async (parent, { input: { issueId, linkType, linkedIssueId } }, { db }) => { + const issue = await db.Issue.findByPk(issueId); + const linkedIssue = await db.Issue.findByPk(linkedIssueId); + + if (!issue || !linkedIssue) { + throw new Error('Issue not found'); + } + + await db.IssueLink.create({ + issueId: issue.id, + linkType, + linkedIssueId: linkedIssue.id, + }); + + return { message: 'success', status: 'success' }; + }, + updateIssue: async (parent, { input }, { db, websocketServer, dataLoaderContext, EXPECTED_OPTIONS_KEY }) => { + const { + id, + issueStatusId, + assigneeId, + reporterId, + title, + description, + tagIds, + priority, + archived, + customFieldId, + customFieldValue, + } = input; + + const issue = await db.Issue.findByPk(Number(id), { + [EXPECTED_OPTIONS_KEY]: dataLoaderContext, + }); + + if (issueStatusId) issue.issueStatusId = Number(issueStatusId); + if (assigneeId) issue.assigneeId = Number(assigneeId); + if (reporterId) issue.reporterId = Number(reporterId); + if (title) issue.title = title; + if (description) issue.description = description; + if (priority) issue.priority = Number(priority); + if (tagIds) { + await db.IssueTag.destroy({ where: { issueId: id } }); + await db.IssueTag.bulkCreate( + tagIds.map((tagId) => ({ + issueId: Number(id), + projectTagId: Number(tagId), + })) + ); + } + if (archived !== undefined) issue.archived = archived; + + // TODO: look for better way to handle nullifying user + if (issue.assigneeId === 0) issue.assigneeId = null; + if (issue.reporterId === 0) issue.reporterId = null; + + if (customFieldId && customFieldValue) { + const customField = await db.ProjectCustomField.findByPk(Number(customFieldId), { + [EXPECTED_OPTIONS_KEY]: dataLoaderContext, + }); + if (!customField) throw new Error('Custom field not found'); + + let valueCasted: number | string | boolean = customFieldValue; + + if (customField.fieldType.toLowerCase() === 'number') valueCasted = Number(customFieldValue); + else if (customField.fieldType.toLowerCase() === 'boolean') valueCasted = yn(customFieldValue); + + const customFieldObject = { + id: `${issue.id}-${customField.id}`, + customFieldId, + value: valueCasted, + createdAt: new Date(), // TODO: improve date format decision + }; + + // TODO: investigate how to deep set the value instead of this to leverage DB level updating + issue.customFields = issue.customFields + ? values(merge(keyBy(issue.customFields, 'id'), keyBy([customFieldObject], 'id'))) + : [customFieldObject]; + } + + await issue.save(); + dataLoaderContext.prime(issue); + + const issueStatus = await db.IssueStatuses.findByPk(Number(issueStatusId ?? issue.issueStatusId), { + [EXPECTED_OPTIONS_KEY]: dataLoaderContext, + }); + + const returnData = { + ...issue.toJSON(), + id: `${issue.id}`, + projectId: `${issue.projectId}`, + project: undefined, + customFields: undefined, + status: { + ...issueStatus.toJSON(), + id: `${issueStatus.id}`, + projectId: `${issueStatus.projectId}`, + }, + }; + + websocketBroadcast({ + clients: websocketServer.clients, + namespace: 'ws', + message: JSON.stringify({ type: 'ISSUE_UPDATED', payload: returnData }), + }); + + return returnData; + }, + createIssue: async (parent, { input }, { db, user, dataLoaderContext, EXPECTED_OPTIONS_KEY }) => { + const { projectId, boardId, issueStatusId, assigneeId, title, description, priority } = input; + + // TODO: create issue status as unassigned option + + const issue = await db.Issue.create({ + projectId: Number(projectId), + issueStatusId: Number(issueStatusId), + assigneeId: assigneeId ? Number(assigneeId) : undefined, + reporterId: user.id, + title, + description, + priority, + }); + + dataLoaderContext.prime(issue); + + // TODO: This isnt currently implemented in the UI + if (typeof boardId !== 'undefined') { + const issueBoard = await db.IssueBoard.create({ + boardId: Number(boardId), + issueId: Number(issue.id), + }); + + dataLoaderContext.prime(issueBoard); + } + + const issueStatus = await db.IssueStatuses.findByPk(issueStatusId, { + [EXPECTED_OPTIONS_KEY]: dataLoaderContext, + }); + + return { + ...issue.toJSON(), + id: `${issue.id}`, + projectId: `${issue.projectId}`, + project: undefined, + customFields: undefined, + status: { + ...issueStatus.toJSON(), + id: `${issueStatus.id}`, + projectId: `${issueStatus.projectId}`, + }, + }; + }, + deleteIssue: async (parent, { input }, { db }) => { + const { id } = input; + + await db.sequelize.transaction(async (t) => { + await db.Issue.destroy({ + where: { + id, + }, + transaction: t, + }); + + // TODO: not needed due to cascade + await db.IssueComment.destroy({ where: { issueId: id }, transaction: t }); + }); + + return { message: 'issue deleted', status: 'success' }; + }, +}; + +const CustomFieldValue: CustomFieldValueResolvers = { + customField: async (parent, args, { db, dataLoaderContext, EXPECTED_OPTIONS_KEY }) => { + if (!parent.customFieldId) return null; + + const customFieldData = await db.ProjectCustomField.findByPk(Number(parent.customFieldId), { + [EXPECTED_OPTIONS_KEY]: dataLoaderContext, + }); + + return { + ...customFieldData.toJSON(), + id: `${customFieldData.id}`, + projectId: `${customFieldData.projectId}`, + fieldType: customFieldData.fieldType as Custom_Field_Type, + }; + }, +}; + +const Issue: IssueResolvers = { + links: async (parent, args, { db, dataLoaderContext, EXPECTED_OPTIONS_KEY }) => { + const databaseIssues = await db.Issue.findByPk(Number(parent.id), { + [EXPECTED_OPTIONS_KEY]: dataLoaderContext, + include: [ + { + model: db.Issue, + as: 'linkedToIssues', + through: { + attributes: [ + ['issue_id', 'issueId'], + ['linked_issue_id', 'linkedIssueId'], + ['link_type', 'linkType'], + ], + }, + }, + { + model: db.Issue, + as: 'linkedByIssues', + through: { + attributes: [ + ['issue_id', 'issueId'], + ['linked_issue_id', 'linkedIssueId'], + ['link_type', 'linkType'], + ], + }, + }, + ], + }); + + const issueToPlainObject = (issue: IssueModel) => ({ + ...issue.toJSON(), + id: `${issue.id}`, + projectId: `${issue.projectId}`, + createdAt: issue.createdAt, + updatedAt: issue.updatedAt, + linkedIssueId: `${parent.id}`, + customFields: undefined, + project: undefined, + }); + + return [ + ...(databaseIssues.linkedByIssues?.map(issueToPlainObject) ?? []), + ...(databaseIssues.linkedToIssues?.map(issueToPlainObject) ?? []), + ]; + }, + tags: async (parent, args, { db, dataLoaderContext }) => { + const issueTags = await db.IssueTag.findAll({ where: { issueId: parent.id } }); + dataLoaderContext.prime(issueTags); + + const projectTags = await db.ProjectTag.findAll({ + where: { id: issueTags.map((issueTag) => issueTag.projectTagId) }, + }); + dataLoaderContext.prime(projectTags); + + return projectTags.map((projectTag) => ({ + ...projectTag.toJSON(), + projectId: `${projectTag.projectId}`, + id: `${projectTag.id}`, + })); + }, + comments: async (parent, args, { db, dataLoaderContext }) => { + const comments = await db.IssueComment.findAll({ + where: { issueId: Number(parent.id) }, + order: [['createdAt', 'DESC']], + }); + dataLoaderContext.prime(comments); + + return comments.map((comment) => ({ + ...comment.toJSON(), + id: `${comment.id}`, + issueId: `${comment.issueId}`, + })); + }, + status: async (parent, args, { db, dataLoaderContext, EXPECTED_OPTIONS_KEY }) => { + // TODO: parent.issueStatusId does exist but since it is not part of the graphql type it is not available according to typescript + const issue = await db.Issue.findByPk(Number(parent.id), { + [EXPECTED_OPTIONS_KEY]: dataLoaderContext, + }); + + if (!issue.issueStatusId) return null; + + const issueStatus = await db.IssueStatuses.findByPk(issue.issueStatusId, { + [EXPECTED_OPTIONS_KEY]: dataLoaderContext, + }); + + return { + ...issueStatus.toJSON(), + id: `${issueStatus.id}`, + projectId: `${issueStatus.projectId}`, + }; + }, + reporter: async (parent, args, { db, dataLoaderContext, EXPECTED_OPTIONS_KEY }) => { + const issue = await db.Issue.findByPk(Number(parent.id), { + [EXPECTED_OPTIONS_KEY]: dataLoaderContext, + }); + + const reporterUser = await db.User.findByPk(Number(issue.reporterId), { + [EXPECTED_OPTIONS_KEY]: dataLoaderContext, + }); + + if (!reporterUser) return null; + + return { + ...reporterUser.toJSON(), + id: `${reporterUser.id}`, + }; + }, + assignee: async (parent, args, { db, dataLoaderContext, EXPECTED_OPTIONS_KEY }) => { + const databaseIssue = await db.Issue.findByPk(Number(parent.id), { + [EXPECTED_OPTIONS_KEY]: dataLoaderContext, + }); + + if (!databaseIssue?.assigneeId) return null; + + const user = await db.User.findByPk(Number(databaseIssue.assigneeId), { + [EXPECTED_OPTIONS_KEY]: dataLoaderContext, + }); + + return { + ...user.toJSON(), + id: `${user.id}`, + }; + }, + project: async (parent, __, { db, dataLoaderContext, EXPECTED_OPTIONS_KEY }) => { + if (parent.project) return parent.project; + + const databaseProject = await db.Project.findByPk(Number(parent.projectId), { + [EXPECTED_OPTIONS_KEY]: dataLoaderContext, + }); + + return { + ...databaseProject.toJSON(), + id: `${databaseProject.id}`, + visibility: databaseProject.visibility as ProjectVisibility, + boards: undefined, + users: undefined, + }; + }, +}; + +const resolvers: Resolvers = { + Query, + Mutation, + CustomFieldValue, + Issue, +}; + +export default resolvers; diff --git a/backend/src/resolvers/project/index.ts b/backend/src/resolvers/project/index.ts new file mode 100644 index 0000000..565c86b --- /dev/null +++ b/backend/src/resolvers/project/index.ts @@ -0,0 +1,363 @@ +import { Op } from 'sequelize'; + +import { + Custom_Field_Type, + type MutationResolvers, + type ProjectResolvers, + ProjectVisibility, + type QueryResolvers, + type Resolvers, + type ViewState, +} from '../../__generated__/resolvers-types.js'; + +const Query: QueryResolvers = { + projects: async (parent, args, { db, dataLoaderContext }) => { + // TODO: If project is internal only show projects that the user is a member of + const databaseProjects = await db.Project.findAll({ + order: [['id', 'ASC']], + // include: [ + // { + // model: db.User, + // as: 'users', + // }, + // ], + }); + + dataLoaderContext.prime(databaseProjects); + + return databaseProjects.map((project) => ({ + ...project.toJSON(), + id: `${project.id}`, + visibility: project.visibility as ProjectVisibility, + boards: undefined, + users: undefined, + })); + }, + createProjectValidation: async (parent, { input }, { db }) => { + const { name, key } = input; + + let whereOr = []; + + if (name) whereOr = [...whereOr, { name: name }]; + if (key) whereOr = [...whereOr, { key: key }]; + + const project = await db.Project.findOne({ + where: { [Op.or]: whereOr }, + }); + + if (project) { + return { + status: 'error', + message: 'Project name or key already exists', + }; + } + + return { + status: 'success', + message: 'Project name and key are available', + }; + }, + project: async (parent, args, { db, dataLoaderContext, EXPECTED_OPTIONS_KEY }) => { + const { id } = args?.input; + const databaseProject = await db.Project.findByPk(Number(id), { + include: [ + { + model: db.User, + as: 'users', + }, + ], + [EXPECTED_OPTIONS_KEY]: dataLoaderContext, + }); + + return { + ...databaseProject.toJSON(), + id: `${databaseProject.id}`, + visibility: databaseProject.visibility as ProjectVisibility, + boards: undefined, + users: databaseProject.users + ? databaseProject.users.map((user) => ({ ...user.toJSON(), id: `${user.id}` })) + : undefined, + }; + }, + projectTags: async (parent, { input: { projectId, id, name } }, { db, dataLoaderContext }) => { + const where: any = { projectId }; + + if (id) where.id = Number(id); + if (name) { + where.name = { + [Op.like]: `%${name}%`, + }; + } + + const databaseProjectTags = await db.ProjectTag.findAll({ where }); + dataLoaderContext.prime(databaseProjectTags); + + return databaseProjectTags.map((projectTag) => ({ + ...projectTag.toJSON(), + id: `${projectTag.id}`, + projectId: `${projectTag.projectId}`, + })); + }, +}; + +const Mutation: MutationResolvers = { + createProjectCustomField: async ( + parent, + { input: { projectId, fieldName, fieldType } }, + { db, dataLoaderContext } + ) => { + const projectCustomField = await db.ProjectCustomField.create( + { + projectId: Number(projectId), + fieldName, + fieldType, + }, + { + returning: true, + } + ); + + dataLoaderContext.prime(projectCustomField); + + return { + ...projectCustomField.toJSON(), + id: `${projectCustomField.id}`, + projectId: `${projectCustomField.projectId}`, + fieldType: projectCustomField.fieldType as Custom_Field_Type, + }; + }, + deleteProjectCustomField: async (parent, { input: { id } }, { db, dataLoaderContext, EXPECTED_OPTIONS_KEY }) => { + const findCustomField = await db.ProjectCustomField.findByPk(Number(id), { + [EXPECTED_OPTIONS_KEY]: dataLoaderContext, + }); + + if (!findCustomField) throw new Error('Custom field not found'); + + await findCustomField.destroy(); + + return { + message: 'deleted custom field', + status: 'success', + }; + }, + createProjectTag: async (parent, { input }, { db, dataLoaderContext }) => { + const { projectId, name } = input; + + const projectTag = await db.ProjectTag.create( + { + projectId: Number(projectId), + name, + }, + { + returning: true, + } + ); + + dataLoaderContext.prime(projectTag); + + return { + ...projectTag.toJSON(), + id: `${projectTag.id}`, + projectId: `${projectTag.projectId}`, + }; + }, + deleteProjectTag: async (parent, { input: { id } }, { db, dataLoaderContext, EXPECTED_OPTIONS_KEY }) => { + const findProjectTag = await db.ProjectTag.findByPk(Number(id), { + [EXPECTED_OPTIONS_KEY]: dataLoaderContext, + }); + + if (!findProjectTag) { + throw new Error('Project tag not found'); + } + + await findProjectTag.destroy(); + + return { + message: 'deleted tag', + status: 'success', + }; + }, + addUserToProject: async (parent, { input: { userId, projectId } }, { db, dataLoaderContext }) => { + const existingPermission = await db.ProjectPermission.findOne({ + where: { userId, projectId }, + }); + + if (existingPermission) { + return { message: 'User added to project', status: 'success' }; + } + + // Add the user to the project + await db.ProjectPermission.create({ + userId: Number(userId), + projectId: Number(projectId), + }); + + return { message: 'User added to project', status: 'success' }; + }, + removeUserFromProject: async (parent, { input: { userId, projectId } }, { db, user }) => { + if (Number(user.id) === Number(userId)) { + throw new Error('You cannot remove yourself from the project'); + } + + const existingPermission = await db.ProjectPermission.findOne({ + where: { userId, projectId }, + }); + + if (!existingPermission) { + throw new Error('User is not added to the project'); + } + + // Remove the user from the project + await db.ProjectPermission.destroy({ + where: { userId, projectId }, + }); + + return { message: 'User removed from project', status: 'success' }; + }, + createProject: async (parent, { input }, { db, user, dataLoaderContext, EXPECTED_OPTIONS_KEY }) => { + // TODO: we should do a sequelize transaction here + const project = await db.Project.create({ + name: input.name, + key: input.key, + visibility: input.visibility ?? 'INTERNAL', + }); + + const projectPermission = await db.ProjectPermission.create({ + userId: user.id, + projectId: project.id, + }); + + const projectId = Number(project.id); + + // TODO: We should create mappings for these statuses + const issueStatuses = await db.IssueStatuses.bulkCreate( + ['Backlog', 'To Do', 'In Progress', 'Done'].map((name) => ({ + projectId, + name, + })) + ); + + const board = await db.Board.create({ + projectId, + name: input?.boardName ?? 'default', + style: input.boardStyle, + viewState: issueStatuses.map((is) => ({ + id: `container-${is.id}`, + title: is.name, + items: [], + })), + }); + + // TODO: we may not even need this + dataLoaderContext.prime(projectPermission); + dataLoaderContext.prime(issueStatuses); + dataLoaderContext.prime(project); + dataLoaderContext.prime(board); + + return { + ...project.toJSON(), + id: `${project.id}`, + visibility: project.visibility as ProjectVisibility, + boards: [ + { + ...board.toJSON(), + id: `${board.id}`, + projectId: `${board.projectId}`, + containerOrder: board.containerOrder ? JSON.stringify(board.containerOrder) : undefined, // TODO: Fix this + settings: board.settings ? JSON.stringify(board.settings) : undefined, // TODO: Fix this + viewState: board.viewState ? (board.viewState as ViewState[]) : undefined, // TODO: fix this + }, + ], + }; + }, +}; + +const Project: ProjectResolvers = { + customFields: async (parent, args, { db, dataLoaderContext }) => { + const projectFields = await db.ProjectCustomField.findAll({ + where: { projectId: parent.id }, + }); + + dataLoaderContext.prime(projectFields); + + return projectFields.map((field) => ({ + ...field.toJSON(), + id: `${field.id}`, + projectId: `${field.projectId}`, + fieldType: field.fieldType as Custom_Field_Type, + })); + }, + tags: async (parent, args, { db, dataLoaderContext }) => { + const projectTags = await db.ProjectTag.findAll({ + where: { projectId: parent.id }, + }); + + dataLoaderContext.prime(projectTags); + + return projectTags.map((tag) => ({ + ...tag.toJSON(), + id: `${tag.id}`, + projectId: `${tag.projectId}`, + })); + }, + issues: async (parent, { input }, { db, dataLoaderContext, EXPECTED_OPTIONS_KEY }) => { + const findAllInput: any = { where: { projectId: Number(parent.id) } }; + + if (input && input?.sortBy) { + findAllInput.order = [input?.sortBy.map(({ field, order }) => [field, order])]; + } + + const databaseIssues = await db.Issue.findAll(findAllInput); + + dataLoaderContext.prime(databaseIssues); + + return databaseIssues.map((issue) => ({ + ...issue.toJSON(), + id: `${issue.id}`, + projectId: `${issue.projectId}`, + customFields: undefined, + })); + }, + boards: async (parent, args, { db, dataLoaderContext }) => { + const boards = await db.Board.findAll({ + where: { projectId: parent.id }, + }); + + dataLoaderContext.prime(boards); + + return boards.map((board) => ({ + ...board.toJSON(), + id: `${board.id}`, + projectId: `${board.projectId}`, + containerOrder: board.containerOrder ? JSON.stringify(board.containerOrder) : undefined, // TODO: Fix this + settings: board.settings ? JSON.stringify(board.settings) : undefined, // TODO: Fix this + viewState: board.viewState ? (board.viewState as ViewState[]) : undefined, // TODO: fix this + })); + }, + issueStatuses: async (parent, args, { db, dataLoaderContext }) => { + const issueStatuses = await db.IssueStatuses.findAll({ + where: { projectId: parent.id }, + }); + + dataLoaderContext.prime(issueStatuses); + + return issueStatuses.map((issueStatus) => ({ + ...issueStatus.toJSON(), + id: `${issueStatus.id}`, + projectId: `${issueStatus.projectId}`, + })); + }, + issueCount: async (parent, args, { db }) => { + return db.Issue.count({ + where: { projectId: Number(parent.id) }, + }); + }, +}; + +const resolvers: Resolvers = { + Query, + Mutation, + Project, +}; + +export default resolvers; diff --git a/backend/src/resolvers/Upload/index.js b/backend/src/resolvers/upload/index.ts similarity index 100% rename from backend/src/resolvers/Upload/index.js rename to backend/src/resolvers/upload/index.ts diff --git a/backend/src/resolvers/user/index.ts b/backend/src/resolvers/user/index.ts new file mode 100644 index 0000000..cfd1c63 --- /dev/null +++ b/backend/src/resolvers/user/index.ts @@ -0,0 +1,109 @@ +import { isUndefined } from 'lodash-es'; + +import type { MutationResolvers, QueryResolvers, UserResolvers } from '../../__generated__/resolvers-types.js'; +import { Asset as AssetModel, User as UserModel } from '../../db/models/types.js'; +import { BUCKET_NAME } from '../../services/config.js'; +import { minioClient } from '../../services/minio-client.js'; + +const formatUserResponse = (user: UserModel) => ({ + ...user.toJSON(), + id: `${user.id}`, +}); + +const Query: QueryResolvers = { + users: async (parent, args, { db, dataLoaderContext }) => { + const dbUsers = await db.User.findAll(); + + dataLoaderContext.prime(dbUsers); + + return dbUsers.map(formatUserResponse); + }, + user: (parent, __, { db }) => { + // if (externalId) { + // return db.User.findOne({ where: { externalId } }); + // } + + // if (id) { + // return db.User.findByPk(id); + // } + return undefined; + }, + me: async (parent, args, { db, user, dataLoaderContext, EXPECTED_OPTIONS_KEY }) => { + const dbUser = await db.User.findByPk(Number(user.id), { + [EXPECTED_OPTIONS_KEY]: dataLoaderContext, + }); + + return formatUserResponse(dbUser); + }, +}; + +const Mutation: MutationResolvers = { + updateMe: async (parent, { input }, { db, user, dataLoaderContext }) => { + const { firstName, lastName } = input; + + if (!isUndefined(firstName)) user.firstName = firstName; + if (!isUndefined(lastName)) user.lastName = lastName; + + await user.save(); + + dataLoaderContext.prime(user); + + return formatUserResponse(user); + }, + assignAssetAsAvatar: async (parent, { input }, { db, user, dataLoaderContext, EXPECTED_OPTIONS_KEY }) => { + const { assetId } = input; + let findOldAvatarAsset: AssetModel; + + if (user.avatarAssetId) { + findOldAvatarAsset = await db.Asset.findByPk(Number(user.avatarAssetId), { + [EXPECTED_OPTIONS_KEY]: dataLoaderContext, + }); + } + + const findAsset = await db.Asset.findByPk(Number(assetId), { + [EXPECTED_OPTIONS_KEY]: dataLoaderContext, + }); + + user.avatarAssetId = Number(assetId); + await user.save(); + + if (findOldAvatarAsset) { + // TODO: Remove from minio + await findOldAvatarAsset.destroy(); + await minioClient.removeObject(BUCKET_NAME, findOldAvatarAsset.assetFilename); + } + + return { + ...findAsset.toJSON(), + id: `${findAsset.id}`, + ownerId: `${findAsset.ownerId}`, + }; + }, +}; + +const User: UserResolvers = { + name: (parent) => `${parent?.firstName} ${parent?.lastName}`, + avatarUrl: async (parent, args, { db, dataLoaderContext, EXPECTED_OPTIONS_KEY }) => { + const dbUser = await db.User.findByPk(Number(parent.id), { + [EXPECTED_OPTIONS_KEY]: dataLoaderContext, + }); + + const findAvatarAsset = await db.Asset.findByPk(Number(dbUser.avatarAssetId), { + [EXPECTED_OPTIONS_KEY]: dataLoaderContext, + }); + + if (findAvatarAsset) { + return '/' + findAvatarAsset.assetPath; + } + + return null; + }, +}; + +const resolvers = { + Query, + Mutation, + User, +}; + +export default resolvers; diff --git a/backend/src/server/apollo.ts b/backend/src/server/apollo.ts new file mode 100644 index 0000000..d2959b3 --- /dev/null +++ b/backend/src/server/apollo.ts @@ -0,0 +1,83 @@ +import { ApolloServer } from '@apollo/server'; +import { + type ApolloFastifyContextFunction, + fastifyApolloDrainPlugin, + fastifyApolloHandler, +} from '@as-integrations/fastify'; +import { EXPECTED_OPTIONS_KEY, createContext } from 'dataloader-sequelize'; +import type { FastifyInstance } from 'fastify'; +import { GraphQLError } from 'graphql'; + +import db from '../db/index.js'; +import type { User } from '../db/models/types.js'; +import resolvers from '../resolvers/index.js'; +import typeDefs from '../type-defs.js'; +import type { CustomFastifyRequest } from '../typings.js'; + +type DataloaderCreateContext = { + loaders: any; + prime: (data: any) => void; +}; + +export interface ApolloContext { + websocketServer: any; + db: typeof db; + user: User | null; + dataLoaderContext: DataloaderCreateContext; + EXPECTED_OPTIONS_KEY: typeof EXPECTED_OPTIONS_KEY; +} + +export const apolloHandler = async (fastify: FastifyInstance) => { + const apollo = new ApolloServer({ + typeDefs, + resolvers, + // Using graphql-upload without CSRF prevention is very insecure. + csrfPrevention: true, + cache: 'bounded', + allowBatchedHttpRequests: true, + plugins: [fastifyApolloDrainPlugin(fastify)], + }); + + await apollo.start(); + + const myContextFunction: ApolloFastifyContextFunction = async (request: CustomFastifyRequest) => { + // get the user token from the headers + let user: User | null = request?.user; + const dataLoaderContext = createContext(db.sequelize); + + const myContextFunctionData = { + db, + dataLoaderContext, + EXPECTED_OPTIONS_KEY, + user, + websocketServer: fastify?.websocketServer, + }; + + // Allow if introspection query only + if (!Array.isArray(request.body) && request?.body?.query?.includes('IntrospectionQuery')) { + return myContextFunctionData; + } + + // optionally block the user + // we could also check user roles/permissions here + if (!user) { + // throwing a `GraphQLError` here allows us to specify an HTTP status code, + // standard `Error`s will have a 500 status code by default + throw new GraphQLError('User is not authenticated', { + extensions: { + code: 'UNAUTHENTICATED', + http: { status: 401 }, + }, + }); + } + + return myContextFunctionData; + }; + + fastify.post( + '/graphql', + fastifyApolloHandler(apollo, { + context: myContextFunction, + }) + ); +}; diff --git a/backend/src/server/fastify-hooks.ts b/backend/src/server/fastify-hooks.ts new file mode 100644 index 0000000..47457e1 --- /dev/null +++ b/backend/src/server/fastify-hooks.ts @@ -0,0 +1,119 @@ +import axios from 'axios'; +import * as console from 'console'; +import { type FastifyInstance, type FastifyReply } from 'fastify'; +import { GraphQLError } from 'graphql'; +import processRequest from 'graphql-upload/processRequest.mjs'; + +import db from '../db/index.js'; +import { cache } from '../services/cache.js'; +import { + ALLOW_LOGIN_DOMAINS_LIST, + ALLOW_LOGIN_EMAILS_LIST, + ALLOW_SIGNUP, + FRONTEND_HOSTNAME, +} from '../services/config.js'; +import { hash } from '../services/utils.js'; +import type { CustomFastifyRequest, requestGeneric } from '../typings.js'; + +const addUserToRequest = async (request: CustomFastifyRequest, reply: FastifyReply) => { + let token = null; + let user = null; + + if (request.headers.authorization) { + token = request.headers.authorization; + } else if (request.headers['sec-websocket-protocol']) { + token = 'Bearer ' + request.headers['sec-websocket-protocol'].split(',').map((x) => x.trim())[1]; + } + + // Downstream services can use this to check if the user is authenticated. + // They are responsible for checking the user permissions. + if (!token) return; + + const cacheKey = hash(token); + + const cachedUser = cache.get(cacheKey); + + if (cachedUser) { + request.user = db.User.build(cachedUser); + return; + } + + try { + // TODO: maybe we just call the url of the caller origin + const { data } = await axios.get(`${FRONTEND_HOSTNAME}/api/verify-jwt`, { + headers: { Authorization: token }, + }); + + // TODO: We can inject from DB here the whitelist domains and emails in addition to ENV vars + + if ( + ALLOW_LOGIN_EMAILS_LIST && + ALLOW_LOGIN_EMAILS_LIST.length > 0 && + !ALLOW_LOGIN_EMAILS_LIST.includes(data.email) + ) { + throw new GraphQLError('Email is not allowed to login', { + extensions: { + code: 'UNAUTHENTICATED', + http: { status: 401 }, + }, + }); + } + + if ( + ALLOW_LOGIN_DOMAINS_LIST && + ALLOW_LOGIN_DOMAINS_LIST.length > 0 && + !ALLOW_LOGIN_DOMAINS_LIST.includes(data.email.split('@')[1].toLowerCase()) + ) { + throw new GraphQLError('Email is not allowed to login', { + extensions: { + code: 'UNAUTHENTICATED', + http: { status: 401 }, + }, + }); + } + + const externalId = `${data.provider}__${data.sub}`; + + user = await db.User.findOne({ + where: { externalId }, + }); + + if (!user && ALLOW_SIGNUP) { + try { + const [firstName, lastName] = data.name.split(' '); + + user = await db.User.create({ + email: data.email, + externalId, + firstName, + lastName, + }); + } catch (e) {} + } + + // A few seconds is enough to see performance gains as most operations are bursty + cache.set(cacheKey, user, 5); + + // !! Modify the request object + request.user = user; + } catch (e) { + if (e?.response?.status === 401) { + reply.code(401).send({ error: 'not authenticated' }); + } else { + // TODO: We should probably throw a 500 here and log the error + console.error({ e }); + } + } +}; + +export const fastifyHooksHandler = async (fastify: FastifyInstance) => { + fastify.addHook('preValidation', async (request, reply) => { + // This is for apollo file uploading + // https://github.com/jaydenseric/graphql-upload + if (request?.isMultipart) { + request.body = await processRequest(request.raw, reply.raw); + } + + await addUserToRequest(request as CustomFastifyRequest, reply); + }); +}; diff --git a/backend/src/server/fastify-ws.ts b/backend/src/server/fastify-ws.ts new file mode 100644 index 0000000..11b7b0b --- /dev/null +++ b/backend/src/server/fastify-ws.ts @@ -0,0 +1,66 @@ +import { fastifyWebsocket } from '@fastify/websocket'; +import type { FastifyInstance } from 'fastify'; +import { nanoid } from 'nanoid'; +import type { WebSocket } from 'ws'; + +import * as wsServer from '../services/ws-server.js'; + +interface MyWebSocket extends WebSocket { + isAlive?: boolean; + id?: string; + user?: any; + namespace?: string; +} + +const wsPlugin = async (instance: FastifyInstance) => { + instance.websocketServer.on('connection', function connection(ws: MyWebSocket) { + ws.isAlive = true; + + // Heartbeat + ws.on('message', function (message) { + const msg = message.toString(); + if (['ping', 'pong'].includes(msg)) { + ws.isAlive = true; + ws.send(msg === 'ping' ? 'pong' : 'ping'); + } + }); + }); + + const interval = setInterval(function ping() { + instance.websocketServer.clients.forEach(function each(ws: MyWebSocket) { + if (ws.isAlive === false) return ws.terminate(); + + ws.isAlive = false; + }); + }, 30000); + + instance.websocketServer.on('close', function close() { + clearInterval(interval); + }); + + instance.get('/ws', { websocket: true }, (connection, req) => { + const context = {}; + + const clients = instance.websocketServer.clients; + + const handleConnectionSocket: MyWebSocket = connection.socket; + handleConnectionSocket.id = nanoid(); + handleConnectionSocket.user = req?.user; + handleConnectionSocket.namespace = 'ws'; + + wsServer.handleConnection({ + socket: handleConnectionSocket, + req, + context, + clients, + }); + }); +}; + +export const fastifyWsHandler = async (fastify: FastifyInstance) => { + await fastify.register(fastifyWebsocket, { + options: { maxPayload: 1048576, clientTracking: true }, + }); + + await fastify.register(wsPlugin); +}; diff --git a/backend/src/server/hocuspocus.ts b/backend/src/server/hocuspocus.ts new file mode 100644 index 0000000..46ebedf --- /dev/null +++ b/backend/src/server/hocuspocus.ts @@ -0,0 +1,14 @@ +import type { FastifyInstance } from 'fastify'; + +import hocuspocusServer from '../services/hocuspocus-server.js'; + +export const hocuspocusHandler = async (fastify: FastifyInstance) => { + await fastify.register(async function (fastify) { + fastify.get('/collaboration', { websocket: true }, (connection, req) => { + const context = {}; + + // @ts-ignore + hocuspocusServer.handleConnection(connection.socket, req, context); + }); + }); +}; diff --git a/backend/src/server/index.ts b/backend/src/server/index.ts new file mode 100644 index 0000000..96826ba --- /dev/null +++ b/backend/src/server/index.ts @@ -0,0 +1,132 @@ +import cors, { type OriginFunction } from '@fastify/cors'; +import Fastify, { type FastifyRequest } from 'fastify'; +import * as http from 'http'; + +import db from '../db/index.js'; +import { User } from '../db/models/types.js'; +import { cache } from '../services/cache.js'; +import { BUCKET_NAME, CORS_ORIGIN, ENABLE_FASTIFY_LOGGING } from '../services/config.js'; +import { minioClient } from '../services/minio-client.js'; +import type { customRequest, requestGeneric } from '../typings.js'; +import { apolloHandler } from './apollo.js'; +import { fastifyHooksHandler } from './fastify-hooks.js'; +import { fastifyWsHandler } from './fastify-ws.js'; +import { hocuspocusHandler } from './hocuspocus.js'; + +declare module 'fastify' { + export interface FastifyRequest { + user?: User; + isMultipart?: boolean; + } +} + +const fastify = Fastify({ + logger: ENABLE_FASTIFY_LOGGING, + keepAliveTimeout: 61 * 1000, +}); + +fastify.server.headersTimeout = 65 * 1000; + +const corsHandler: OriginFunction = (origin, cb) => { + // undefined is for SSR to backend server requests + if ((CORS_ORIGIN && CORS_ORIGIN.split(',').includes(origin)) || origin === undefined) { + cb(null, true); + return; + } + console.log('Blocked by CORS', { origin }); + cb(new Error('Not allowed'), false); +}; + +await fastify.register(cors, { + origin: corsHandler, + methods: 'GET,HEAD,PUT,PATCH,POST,DELETE', + allowedHeaders: [ + 'Content-Type', + 'Authorization', + 'Accept', + 'Origin', + 'X-Requested-With', + 'apollographql-client-name', + 'apollographql-client-version', + 'Apollo-Require-Preflight', + ], + exposedHeaders: [], + credentials: true, +}); + +// Handle all requests that have the `Content-Type` header set as multipart +fastify.addContentTypeParser('multipart', {}, async (request: FastifyRequest) => { + // https://github.com/jaydenseric/graphql-upload + request.isMultipart = true; +}); + +await db.init(); + +await fastifyHooksHandler(fastify); + +await fastifyWsHandler(fastify); + +await hocuspocusHandler(fastify); + +await apolloHandler(fastify); + +type MinioGetObjectResponse = { + stream: NodeJS.ReadableStream; + headers: { + 'content-type': string; + 'content-length': string; + 'last-modified': string; + etag: string; + server: string; + 'accept-ranges': string; + date: string; + vary: string; + 'x-amz-meta-uploaded-by-user-id': string; + }; +}; + +fastify.get('/cache-stats', async (request, reply) => { + if (!request?.user) { + reply.code(401).send({ error: 'not authenticated' }); + return; + } + + reply.send(cache.getStats()); +}); + +fastify.get('/uploads/:file', async (request, reply) => { + // TODO: make sure logged in + const { file } = request.params; + + // TODO: need better TS fix here + const result = (await minioClient.getObject(BUCKET_NAME, file)) as unknown as MinioGetObjectResponse; + + reply.header('Content-Type', result.headers['content-type']); + reply.header('Content-Length', result.headers['content-length']); + + // @ts-ignore + return reply.send(result); +}); + +// TODO: this used to read from filesystem +// +// fastify.get('/assets/avatars/:file', async (request, reply) => { +// const { file } = request.params; +// const filePath = path.join(ASSET_PATH, 'avatars', file); +// +// // Check if the file exists +// try { +// await fs.access(filePath); +// } catch (error) { +// reply.code(404).send({ error: 'File not found' }); +// return; +// } +// +// // Set the headers +// reply.header('Content-Type', 'image/webp'); +// +// const buffer = await fs.readFile(filePath); +// reply.send(buffer); +// }); + +export default fastify; diff --git a/backend/src/services/cache.ts b/backend/src/services/cache.ts new file mode 100644 index 0000000..4448cc9 --- /dev/null +++ b/backend/src/services/cache.ts @@ -0,0 +1,3 @@ +import NodeCache from 'node-cache'; + +export const cache = new NodeCache(); diff --git a/backend/src/services/config.js b/backend/src/services/config.ts similarity index 100% rename from backend/src/services/config.js rename to backend/src/services/config.ts diff --git a/backend/src/services/hocuspocus-server.js b/backend/src/services/hocuspocus-server.js deleted file mode 100644 index e6452d7..0000000 --- a/backend/src/services/hocuspocus-server.js +++ /dev/null @@ -1,120 +0,0 @@ -import { Server } from '@hocuspocus/server'; -import { FRONTEND_HOSTNAME, HTTP_PORT } from './config.js'; -import { Database } from '@hocuspocus/extension-database'; -import { db } from '../db/index.js'; -import axios from 'axios'; - -const hocuspocusServer = Server.configure({ - port: HTTP_PORT, - address: '0.0.0.0', - extensions: [ - new Database({ - fetch: ({ documentName }) => { - return new Promise(async (resolve, reject) => { - const [entityType, entityId, entityField] = documentName.split('.'); - - if (entityType === 'issue' && entityField === 'description') { - let issue = null; - - try { - issue = await db.sequelize.models.Issue.findOne({ - where: { - id: entityId, - }, - }); - } catch (e) { - reject(e); - } - - if (!issue || !issue?.descriptionRaw) resolve(null); - - const descriptionAsUnit8Array = new Uint8Array(issue.descriptionRaw); - resolve(descriptionAsUnit8Array.length === 0 ? null : descriptionAsUnit8Array); - } - - if (entityType === 'issueComment' && entityField === 'comment') { - if (!isFinite(entityId)) return resolve(null); - - const comment = await db.sequelize.models.IssueComment.findOne({ - where: { - id: entityId, - }, - }); - - if (!comment || !comment?.commentRaw) return resolve(null); - - const commentAsUnit8Array = new Uint8Array(comment.commentRaw); - resolve(commentAsUnit8Array.length === 0 ? null : commentAsUnit8Array); - } - - resolve(null); - }); - }, - store: async ({ documentName, state }) => { - const [entityType, entityId, entityField] = documentName.split('.'); - - if (entityType === 'issue' && entityField === 'description') { - await db.sequelize.models.Issue.update( - { - descriptionRaw: state, - }, - { - where: { - id: entityId, - }, - } - ); - } - - if (entityType === 'issueComment' && entityField === 'comment') { - if (!isFinite(entityId)) return; - - await db.sequelize.models.IssueComment.update( - { - commentRaw: state, - }, - { - where: { - id: entityId, - }, - } - ); - } - }, - }), - ], - async onAuthenticate(data) { - const { token } = data; - - if (!token) { - console.warn('Throwing exception to tiptap user'); - throw new Error('Not authorized!'); - } - - let verifyJwt = {}; - - try { - verifyJwt = await axios.get(`${FRONTEND_HOSTNAME}/api/verify-jwt`, { - headers: { - authorization: `Bearer ${token}`, - }, - }); - } catch (e) { - throw new Error('Unable to verify tiptap user!'); - } - - const { - data: { provider, sub }, - } = verifyJwt; - - const externalId = `${provider}__${sub}`; - - const user = await db.sequelize.models.User.findOne({ where: { externalId } }); - - return { - user: user ? user.toJSON() : null, - }; - }, -}); - -export default hocuspocusServer; diff --git a/backend/src/services/hocuspocus-server.ts b/backend/src/services/hocuspocus-server.ts new file mode 100644 index 0000000..c3ab309 --- /dev/null +++ b/backend/src/services/hocuspocus-server.ts @@ -0,0 +1,157 @@ +import { Database } from '@hocuspocus/extension-database'; +import { Server } from '@hocuspocus/server'; +import type { fetchPayload, storePayload } from '@hocuspocus/server' +import axios from 'axios'; + +import db from '../db/index.js'; +import { cache } from './cache.js'; +import { FRONTEND_HOSTNAME, HTTP_PORT } from './config.js'; +import { hash } from './utils.js'; +import { User } from '../db/models/types.js'; + + +const fetchLogic = async ({entityType, entityId, entityField}) => { + if (entityType === 'issue' && entityField === 'description') { + const issue = await db.Issue.findOne({ + where: { + id: entityId, + }, + }); + + if (!issue || !issue?.descriptionRaw) return null + + // @ts-ignore + const descriptionAsUnit8Array = new Uint8Array(issue.descriptionRaw); + return descriptionAsUnit8Array.length === 0 ? null : descriptionAsUnit8Array; + } + + if (entityType === 'issueComment' && entityField === 'comment') { + // @ts-ignore + if (!isFinite(entityId)) return null; + + const comment = await db.IssueComment.findOne({ + where: { + id: entityId, + }, + }); + + // @ts-ignore + if (!comment || !comment?.commentRaw) return null; + + // @ts-ignore + const commentAsUnit8Array = new Uint8Array(comment.commentRaw); + return commentAsUnit8Array.length === 0 ? null : commentAsUnit8Array; + } +} + +const fetch = async ({ documentName }: fetchPayload): Promise => { + return new Promise((resolve, reject) => { + const [entityType, entityId, entityField] = documentName.split('.'); + + fetchLogic({ entityType, entityId, entityField }).then((result) => { + resolve(result); + }).catch((e) => { + reject(e); + }) + }); +}; + +const store = async ({ documentName, state }: storePayload) => { + const [entityType, entityId, entityField] = documentName.split('.'); + + if (entityType === 'issue' && entityField === 'description') { + await db.Issue.update( + { + // @ts-ignore + descriptionRaw: state, + }, + { + where: { + id: entityId, + }, + } + ); + } + + if (entityType === 'issueComment' && entityField === 'comment' && isFinite(Number(entityId))) { + await db.IssueComment.update( + { + // @ts-ignore + commentRaw: state, + }, + { + where: { + id: entityId, + }, + } + ); + } +}; + +type OnAuthenticatePayload = { + token?: string; +}; + +type VerifyJwtResponse = { + data?: { + provider?: string; + sub?: string; + }; +}; + +type OnAuthenticateResponse = { + user?: User; +} + +const onAuthenticate = async (data: OnAuthenticatePayload): Promise => { + if (!data?.token) { + console.warn('Throwing exception to tiptap user'); + throw new Error('Not authorized!'); + } + + const token = `Bearer ${data?.token}`; + let sub = null; + let provider = null; + + const cacheKey = hash(token); + const cachedUser = cache.get(cacheKey); + if (cachedUser) return { user: db.User.build(cachedUser).toJSON() }; + + try { + ({ + data: { provider, sub }, + } = await axios.get(`${FRONTEND_HOSTNAME}/api/verify-jwt`, { + headers: { + authorization: token, + }, + })); + } catch (e) { + throw new Error('Unable to verify tiptap user!'); + } + + const externalId = `${provider}__${sub}`; + + const user = await db.User.findOne({ + where: { externalId }, + }); + + cache.set(cacheKey, user, 5); + + return { + user, + }; +}; + +const hocuspocusServer = Server.configure({ + port: Number(HTTP_PORT), + address: '0.0.0.0', + extensions: [ + new Database({ + fetch, + store, + }), + ], + onAuthenticate, +}); + +export default hocuspocusServer; diff --git a/backend/src/services/minio-client.js b/backend/src/services/minio-client.ts similarity index 100% rename from backend/src/services/minio-client.js rename to backend/src/services/minio-client.ts diff --git a/backend/src/services/utils.js b/backend/src/services/utils.js deleted file mode 100644 index 9647ccd..0000000 --- a/backend/src/services/utils.js +++ /dev/null @@ -1,4 +0,0 @@ -import * as url from 'node:url'; - -export const __filename = url.fileURLToPath(import.meta.url); -export const __dirname = url.fileURLToPath(new URL('.', import.meta.url)); diff --git a/backend/src/services/utils.ts b/backend/src/services/utils.ts new file mode 100644 index 0000000..a83061c --- /dev/null +++ b/backend/src/services/utils.ts @@ -0,0 +1,10 @@ +import type { BinaryLike } from 'crypto'; +import * as crypto from 'node:crypto'; +import * as url from 'node:url'; + +export const __filename = url.fileURLToPath(import.meta.url); +export const __dirname = url.fileURLToPath(new URL('.', import.meta.url)); + +export const hash = (input: BinaryLike) => { + return crypto.createHash('sha256').update(input).digest('hex'); +}; diff --git a/backend/src/services/ws-server.js b/backend/src/services/ws-server.ts similarity index 52% rename from backend/src/services/ws-server.js rename to backend/src/services/ws-server.ts index ccf7036..41e0c97 100644 --- a/backend/src/services/ws-server.js +++ b/backend/src/services/ws-server.ts @@ -7,15 +7,15 @@ export const handleConnection = ({ socket, req, context, clients }) => { // }); }; -/** - * Broadcasts a message to all connected clients in a specific namespace. - * - * @param {object} args - The function arguments. - * @param {Array} args.clients - The array of connected clients. - * @param {string} args.message - The message to be sent. - * @param {string} [args.namespace] - The namespace in which to broadcast the message. Optional. - */ -export const websocketBroadcast = ({ clients, message, namespace }) => { +export const websocketBroadcast = ({ + clients, + message, + namespace, +}: { + clients: Array; + message: string; + namespace?: string; +}) => { clients.forEach((client) => { if (namespace && client.namespace === namespace) { client.send(message); diff --git a/backend/src/type-defs.js b/backend/src/type-defs.ts similarity index 94% rename from backend/src/type-defs.js rename to backend/src/type-defs.ts index 38e0f7d..7f310d5 100644 --- a/backend/src/type-defs.js +++ b/backend/src/type-defs.ts @@ -6,6 +6,8 @@ const typeDefs = gql` # in the resolver map below. scalar Upload + scalar DateTime + enum ProjectVisibility { PUBLIC INTERNAL @@ -46,8 +48,8 @@ const typeDefs = gql` issueId: String! comment: String! reporter: User! - createdAt: String - updatedAt: String + createdAt: DateTime + updatedAt: DateTime } type User { @@ -64,8 +66,8 @@ const typeDefs = gql` id: ID! name: String! projectId: String! - createdAt: String - updatedAt: String + createdAt: DateTime + updatedAt: DateTime } type Project { @@ -76,8 +78,8 @@ const typeDefs = gql` imageId: Int status: String visibility: ProjectVisibility - createdAt: String - updatedAt: String + createdAt: DateTime + updatedAt: DateTime boards: [Board] issueStatuses: [IssueStatus] issues(input: QueryIssueInput): [Issue] @@ -92,8 +94,8 @@ const typeDefs = gql` projectId: String! fieldName: String! fieldType: CUSTOM_FIELD_TYPE! - createdAt: String - updatedAt: String + createdAt: DateTime + updatedAt: DateTime } type CustomFieldValue { @@ -101,8 +103,8 @@ const typeDefs = gql` customFieldId: String! customField: CustomField value: String! - createdAt: String - updatedAt: String + createdAt: DateTime + updatedAt: DateTime } type Issue { @@ -114,8 +116,8 @@ const typeDefs = gql` status: IssueStatus reporter: User assignee: User - createdAt: String - updatedAt: String + createdAt: DateTime + updatedAt: DateTime priority: Int archived: Boolean comments: [IssueComment] @@ -160,8 +162,8 @@ const typeDefs = gql` status: String viewState: [ViewState] backlogEnabled: Boolean - createdAt: String - updatedAt: String + createdAt: DateTime + updatedAt: DateTime settings: String columns: [Column] issues: [Issue] @@ -172,8 +174,8 @@ const typeDefs = gql` id: ID! projectId: String name: String! - createdAt: String - updatedAt: String + createdAt: DateTime + updatedAt: DateTime } type Asset { @@ -182,8 +184,8 @@ const typeDefs = gql` assetType: String assetSubType: String assetPath: String - createdAt: String - updatedAt: String + createdAt: DateTime + updatedAt: DateTime } enum BoardStyle { diff --git a/backend/src/typings.ts b/backend/src/typings.ts new file mode 100644 index 0000000..c3f7212 --- /dev/null +++ b/backend/src/typings.ts @@ -0,0 +1,87 @@ +import type { FastifyRequest, RequestGenericInterface } from 'fastify'; +import type http from 'http'; +import type Sequelize from 'sequelize/types/sequelize'; +import type { Readable } from 'stream'; + +import { + Asset, + Board, + Issue, + IssueBoard, + IssueComment, + IssueLink, + IssueStatus, + IssueTag, + Project, + ProjectCustomField, + ProjectPermission, + ProjectTag, + User, +} from './db/models/types.js'; + +export type Model = { + associate?: (db: Db) => void; +}; + +export type Db = { + sequelize?: Sequelize; + Sequelize?: typeof Sequelize; + User?: typeof User; + Project?: typeof Project; + Board?: typeof Board; + IssueStatuses?: typeof IssueStatus; + Issue?: typeof Issue; + Asset?: typeof Asset; + IssueComment?: typeof IssueComment; + ProjectTag?: typeof ProjectTag; + IssueTag?: typeof IssueTag; + IssueBoard?: typeof IssueBoard; + IssueLink?: typeof IssueLink; + ProjectPermission?: typeof ProjectPermission; + ProjectCustomField?: typeof ProjectCustomField; + init?: () => Promise; +}; + +export interface IQuerystring {} + +export interface IHeaders { + connection?: string; +} + +export interface IParams { + file?: any; +} + +export interface IReply { + 200?: { success: boolean }; + 302?: { url: string }; + 401?: { error: string }; + error?: string; + Readable?: Readable; + ReadableBase?: Readable; +} + +export interface requestGeneric extends RequestGenericInterface { + Querystring: IQuerystring; + Headers: IHeaders; + Reply: IReply; + Params: IParams; +} + +export interface customRequest extends http.IncomingMessage { + isMultipart?: boolean; +} + +export interface AuthenticatedUser { + user: any; +} + +export type CustomFastifyRequest = FastifyRequest<{ + Body: { + query?: string; + variables?: any; + }; + Headers: { + authorization?: string; + }; +}>; diff --git a/backend/src/umzug-runner.js b/backend/src/umzug-runner.js deleted file mode 100644 index 27c01ac..0000000 --- a/backend/src/umzug-runner.js +++ /dev/null @@ -1,29 +0,0 @@ -import { SequelizeStorage, Umzug } from 'umzug'; -import { dirname } from 'node:path'; -import { fileURLToPath } from 'node:url'; -const __dirname = dirname(fileURLToPath(import.meta.url)); - -import { db } from './db/index.js'; -import { DataTypes } from 'sequelize'; - -await db.init(); - -export const migrator = new Umzug({ - migrations: { - glob: ['db/migrations/*.js', { cwd: __dirname }], - resolve: (params) => { - const getModule = () => import(params.path); - - return { - name: params.name, - up: async (params) => (await getModule()).default.up(params.context.queryInterface, DataTypes), - down: async (params) => (await getModule()).default.down(params.context.queryInterface, DataTypes), - }; - }, - }, - context: db.sequelize, - storage: new SequelizeStorage({ sequelize: db.sequelize }), - logger: console, -}); - -migrator.runAsCLI(); diff --git a/backend/src/umzug-runner.ts b/backend/src/umzug-runner.ts new file mode 100644 index 0000000..4416cf5 --- /dev/null +++ b/backend/src/umzug-runner.ts @@ -0,0 +1,55 @@ +import { SequelizeStorage, Umzug } from 'umzug'; +import { dirname, parse } from 'node:path'; +import { fileURLToPath } from 'node:url'; +const __dirname = dirname(fileURLToPath(import.meta.url)); + +import db from './db/index.js'; +import { DataTypes } from 'sequelize'; + +await db.init(); + +const getTables = await db.sequelize.getQueryInterface().showAllTables(); + +// This will look for migrations that have a file extension and strip it only if a migrations table exists +if (getTables.includes('SequelizeMeta')) { + console.log( + 'Begin: Going to strip file extensions from migration names for compatibility' + ); + + const [results, metadata] = await db.sequelize.query( + "UPDATE \"SequelizeMeta\" SET name = REPLACE(REPLACE(name, '.js', ''), '.ts', '') WHERE name LIKE '%._s';" + ); + + // @ts-ignore + console.log(`End: Rows ${metadata?.rowCount} affected`); +} + +export const migrator = new Umzug({ + migrations: { + glob: ['db/migrations/*', { cwd: __dirname }], + resolve: (params) => { + const getModule = () => import(params.path); + + return { + name: parse(params.name).name, // strip the extension + up: async (params) => + (await getModule()).default.up( + // @ts-ignore + params.context.queryInterface, + DataTypes + ), + down: async (params) => + (await getModule()).default.down( + // @ts-ignore + params.context.queryInterface, + DataTypes + ), + }; + }, + }, + context: db.sequelize, + storage: new SequelizeStorage({ sequelize: db.sequelize }), + logger: console, +}); + +migrator.runAsCLI(); diff --git a/backend/start.sh b/backend/start.sh index d9f12ef..e662252 100755 --- a/backend/start.sh +++ b/backend/start.sh @@ -1,7 +1,7 @@ #!/usr/bin/env sh echo "Running migrations..." -pnpm migrate:up +node dist/umzug-runner.js up # Check the exit code of the last command if [ $? -ne 0 ]; then diff --git a/backend/tests/src/db/index.js b/backend/tests/src/db/index.js deleted file mode 100644 index e69de29..0000000 diff --git a/backend/tests/src/db/models/index.js b/backend/tests/src/db/models/index.js index 0cbfa1c..43a0c60 100644 --- a/backend/tests/src/db/models/index.js +++ b/backend/tests/src/db/models/index.js @@ -1,25 +1,25 @@ import chai from 'chai'; -import sinonChai from 'sinon-chai'; +import { DataTypes, Sequelize } from 'sequelize'; import { - sequelize, - dataTypes, checkModelName, - checkUniqueIndex, checkPropertyExists, + checkUniqueIndex, + dataTypes, makeMockModels, + sequelize, } from 'sequelize-test-helpers'; +import sinonChai from 'sinon-chai'; -import IssueCommentModel from '../../../../src/db/models/issue-comment.js'; -import IssueModel from '../../../../src/db/models/issue.js'; -import { DataTypes, Sequelize } from 'sequelize'; -import User from '../../../../src/db/models/user.js'; -import Project from '../../../../src/db/models/project.js'; +import Asset from '../../../../src/db/models/asset.js'; import Board from '../../../../src/db/models/board.js'; +import IssueCommentModel from '../../../../src/db/models/issue-comment.js'; +import IssueComment from '../../../../src/db/models/issue-comment.js'; import IssueStatuses from '../../../../src/db/models/issue-statuses.js'; +import IssueModel from '../../../../src/db/models/issue.js'; import Issue from '../../../../src/db/models/issue.js'; -import Asset from '../../../../src/db/models/asset.js'; -import IssueComment from '../../../../src/db/models/issue-comment.js'; import ProjectTags from '../../../../src/db/models/project-tag.js'; +import Project from '../../../../src/db/models/project.js'; +import User from '../../../../src/db/models/user.js'; chai.use(sinonChai); @@ -50,7 +50,7 @@ const init = async () => { return db; }; -describe('src/models/IssueComment', () => { +describe('src/models/issue-comment', () => { const Issue = IssueModel(sequelize, dataTypes); const IssueComment = IssueCommentModel(sequelize, dataTypes); const issue = new Issue(); @@ -76,13 +76,13 @@ describe('src/models/IssueComment', () => { Issue.associate({ IssueComment }); }); - it('defined a hasMany association with Issue', () => { + it('defined a hasMany association with issue', () => { expect(Issue.hasMany).to.have.been.calledWith(IssueComment); }); }); }); -describe('src/models/Issue relations', () => { +describe('src/models/issue relations', () => { let db = {}; before(async () => { @@ -90,7 +90,7 @@ describe('src/models/Issue relations', () => { }); context('IssueComment', () => { - it('defined a hasMany association with Issue', async () => { + it('defined a hasMany association with issue', async () => { const projectId = 1; const issueStatusId = 2; const reporterId = 3; @@ -185,8 +185,8 @@ describe('src/models/Issue relations', () => { // db = await init(); // }); // -// context('IssueComment', () => { -// it('defined a hasMany association with Issue', async () => { +// context('issue-comment', () => { +// it('defined a hasMany association with issue', async () => { // const projectId = 1; // const issueStatusId = 2; // const reporterId = 3; @@ -232,9 +232,9 @@ describe('src/models/Issue relations', () => { // comment: 'test', // }; // -// const newAssigneeUser = await db.User.create(assigneeUserData); -// const newReporterUser = await db.User.create(reporterUserData); -// const newProject = await db.Project.create(projectData); +// const newAssigneeUser = await db.user.create(assigneeUserData); +// const newReporterUser = await db.user.create(reporterUserData); +// const newProject = await db.project.create(projectData); // const newIssueStatuses = await db.IssueStatuses.bulkCreate([ // { // projectId: Number(projectId), @@ -249,8 +249,8 @@ describe('src/models/Issue relations', () => { // name: 'Done', // }, // ]); -// const newIssue = await db.Issue.create(issueData); -// const newIssueComment = await db.IssueComment.create(issueCommentData); +// const newIssue = await db.issue.create(issueData); +// const newIssueComment = await db.issue-comment.create(issueCommentData); // const issueComments = await newIssue.getIssueComments(); // // expect(newIssue.toJSON()).to.deep.include({ id: issueId, reporterId, assigneeId }); @@ -262,8 +262,8 @@ describe('src/models/Issue relations', () => { // // We test the cascade delete at this point // await newIssue.destroy(); // -// const findIssueAfterDestroy = await db.Issue.findOne({ where: { id: issueId } }); -// const findIssueCommentAfterDestroy = await db.IssueComment.findOne({ +// const findIssueAfterDestroy = await db.issue.findOne({ where: { id: issueId } }); +// const findIssueCommentAfterDestroy = await db.issue-comment.findOne({ // where: { id: issueCommentId }, // }); // diff --git a/backend/tsconfig.json b/backend/tsconfig.json new file mode 100644 index 0000000..9f20f66 --- /dev/null +++ b/backend/tsconfig.json @@ -0,0 +1,25 @@ +{ + "ts-node": { + "swc": true, + "esm": true + }, + "compilerOptions": { + "esModuleInterop": true, + "allowSyntheticDefaultImports": true, + "incremental": true, + "baseUrl": ".", + "outDir": "./dist", + "allowJs": true, + "target": "ESNext", + "module": "ESNext", + "lib": ["esnext"], + "moduleResolution": "node", + "forceConsistentCasingInFileNames": true, + "skipLibCheck": true, + "sourceMap": true, + "isolatedModules": true, + "verbatimModuleSyntax": true, + }, + "include": ["./src/**/*"], + "exclude": ["node_modules", "**/*.spec.ts"], +} diff --git a/docker-compose-local.yml b/docker-compose-local.yml index ee529f5..accef71 100644 --- a/docker-compose-local.yml +++ b/docker-compose-local.yml @@ -7,6 +7,7 @@ volumes: uploads: pgdata: backend_node_modules: + backend_ts_build_files: frontend_node_modules: x-minio-env-variables: &minio-env-variables @@ -84,6 +85,7 @@ services: volumes: - ./backend:/app - backend_node_modules:/app/node_modules + - backend_ts_build_files:/app/dist depends_on: - postgresql-db - createbuckets diff --git a/frontend/auth.ts b/frontend/auth.ts index f1b9b9e..3acdffe 100644 --- a/frontend/auth.ts +++ b/frontend/auth.ts @@ -5,12 +5,13 @@ import type { } from 'next'; import type { NextAuthOptions as NextAuthConfig } from 'next-auth'; import { getServerSession } from 'next-auth'; +import { AdapterUser } from 'next-auth/adapters'; +import { type JWT, getToken } from 'next-auth/jwt'; // @ts-ignore import { type OAuthConfig } from 'next-auth/providers'; -import { getToken, type JWT } from 'next-auth/jwt'; -import Keycloak, { type KeycloakProfile } from 'next-auth/providers/keycloak'; import GithubProvider from 'next-auth/providers/github'; -import { AdapterUser } from 'next-auth/adapters'; +import Keycloak, { type KeycloakProfile } from 'next-auth/providers/keycloak'; + import { AUTH_KEYCLOAK_ID, AUTH_KEYCLOAK_ISSUER, @@ -150,7 +151,7 @@ export const config = { // console.log('Token: '); // console.log(token); // - // console.log('User: '); + // console.log('user: '); // console.log(user); // // console.log('Account: '); diff --git a/frontend/components/Backlog/index.tsx b/frontend/components/Backlog/index.tsx index a2e5bbc..161a518 100644 --- a/frontend/components/Backlog/index.tsx +++ b/frontend/components/Backlog/index.tsx @@ -172,7 +172,7 @@ export default function Backlog({ projectId }: { projectId: string }) { const notification = { type: 'notification', - title: 'New Issue Created', + title: 'New issue Created', message: `Ticket title: ${backlogState.itemName}`, topic: `user:${session?.user?.id}`, tags: ['white_check_mark', 'openpro.notificationDuration=3000'], diff --git a/frontend/components/CreateProjectSelection/Step2.tsx b/frontend/components/CreateProjectSelection/Step2.tsx index 5de8225..40f799e 100644 --- a/frontend/components/CreateProjectSelection/Step2.tsx +++ b/frontend/components/CreateProjectSelection/Step2.tsx @@ -1,12 +1,13 @@ -import React, { Dispatch, Fragment, SetStateAction } from 'react'; -import { CreateProjectDetails } from '@/constants/types'; +import { Listbox, Transition } from '@headlessui/react'; +import { CheckIcon, ChevronUpDownIcon } from '@heroicons/react/20/solid'; import { useField, useFormik, useFormikContext } from 'formik'; +import React, { Dispatch, Fragment, SetStateAction } from 'react'; import { object, string } from 'yup'; -import { apolloClient } from '@/services/apollo-client'; -import { CREATE_PROJECT_VALIDATION_QUERY } from '@/gql/gql-queries-mutations'; + import { Button } from '@/components/Button'; -import { Listbox, Transition } from '@headlessui/react'; -import { CheckIcon, ChevronUpDownIcon } from '@heroicons/react/20/solid'; +import { CreateProjectDetails } from '@/constants/types'; +import { CREATE_PROJECT_VALIDATION_QUERY } from '@/gql/gql-queries-mutations'; +import { apolloClient } from '@/services/apollo-client'; // Function to check if the field is unique const createProjectValidationQuery = async ({ @@ -222,7 +223,7 @@ const Step2 = ({ > Key - {/* Project keys must start with an uppercase letter, followed by one or more uppercase alphanumeric characters. */} + {/* project keys must start with an uppercase letter, followed by one or more uppercase alphanumeric characters. */} {/* The project key must not exceed 10 characters in length. */}
diff --git a/frontend/components/Editor/plugins/upload-image.tsx b/frontend/components/Editor/plugins/upload-image.tsx index 87bc4ff..65065c3 100644 --- a/frontend/components/Editor/plugins/upload-image.tsx +++ b/frontend/components/Editor/plugins/upload-image.tsx @@ -1,7 +1,8 @@ -import { UploadImage } from '../types/upload-image'; import { EditorState, Plugin, PluginKey } from '@tiptap/pm/state'; import { Decoration, DecorationSet, EditorView } from '@tiptap/pm/view'; +import { UploadImage } from '../types/upload-image'; + const uploadKey = new PluginKey('upload-image'); const UploadImagesPlugin = (cancelUploadImage?: () => any) => @@ -155,7 +156,7 @@ export async function startImageUpload( .setMeta(uploadKey, { remove: { id } }); view.dispatch(transaction); } catch (error) { - console.error('Upload error: ', error); + console.error('upload error: ', error); removePlaceholder(view, id); } } diff --git a/frontend/components/Header/index.tsx b/frontend/components/Header/index.tsx index ddc0925..1c887c9 100644 --- a/frontend/components/Header/index.tsx +++ b/frontend/components/Header/index.tsx @@ -1,9 +1,10 @@ +import Image from 'next/image'; import Link from 'next/link'; + import DarkModeSwitcher from './DarkModeSwitcher'; import DropdownMessage from './DropdownMessage'; import DropdownNotification from './DropdownNotification'; import DropdownUser from './DropdownUser'; -import Image from 'next/image'; const Header = (props: { sidebarOpen: string | boolean | undefined; @@ -88,9 +89,9 @@ const Header = (props: { {/* */} - {/* */} + {/* */} - {/* */} + {/* */}
diff --git a/frontend/components/IssueModal/IssueComment.tsx b/frontend/components/IssueModal/IssueComment.tsx index 0751dc6..16ec844 100644 --- a/frontend/components/IssueModal/IssueComment.tsx +++ b/frontend/components/IssueModal/IssueComment.tsx @@ -50,7 +50,7 @@ const IssueComment = ({
{reporter.name}
- {DateTime.fromMillis(Number(comment.createdAt)).toRelative()} + {DateTime.fromISO(comment.createdAt).toRelative()}
{!showEditor && ( diff --git a/frontend/components/IssueModal/IssueDescription.tsx b/frontend/components/IssueModal/IssueDescription.tsx index 991bf69..6f2604e 100644 --- a/frontend/components/IssueModal/IssueDescription.tsx +++ b/frontend/components/IssueModal/IssueDescription.tsx @@ -37,7 +37,7 @@ export const IssueDescription = ({ issueId }: { issueId?: string }) => { // update(cache, { data: { createIssueComment } }) { // cache.modify({ // id: cache.identify({ - // __typename: 'Issue', + // __typename: 'issue', // id: createIssueComment.issueId, // }), // fields: { diff --git a/frontend/components/IssueModal/IssueDetails.tsx b/frontend/components/IssueModal/IssueDetails.tsx index 52ace36..fdfbe6f 100644 --- a/frontend/components/IssueModal/IssueDetails.tsx +++ b/frontend/components/IssueModal/IssueDetails.tsx @@ -1,16 +1,16 @@ +import { useFragment, useMutation } from '@apollo/client'; import { Disclosure, Transition } from '@headlessui/react'; import { ChevronDownIcon } from '@heroicons/react/20/solid'; +import { DateTime } from 'luxon'; + +import IssueTags from '@/components/IssueModal/IssueTags'; +import IssuePriorityDropdown from '@/components/IssuePriorityDropdown'; import UserSelectionDropdown from '@/components/UserSelectionDropdown'; +import { User } from '@/constants/types'; import { - GET_ISSUE_QUERY, ISSUE_FIELDS, UPDATE_ISSUE_MUTATION, } from '@/gql/gql-queries-mutations'; -import { useFragment, useMutation, useQuery } from '@apollo/client'; -import { User } from '@/constants/types'; -import { DateTime } from 'luxon'; -import IssueTags from '@/components/IssueModal/IssueTags'; -import IssuePriorityDropdown from '@/components/IssuePriorityDropdown'; /** * Returns the actual or relative timestamp based on the given timestamp and options. @@ -21,12 +21,12 @@ import IssuePriorityDropdown from '@/components/IssuePriorityDropdown'; * @return {string|null} - The actual or relative timestamp. */ const returnActualOrRelativeTimestamp = ( - timestamp: number, + timestamp: string | null, { showRelativeDaysMin = 5 }: { showRelativeDaysMin?: number } = {} ): string | null => { if (!timestamp) return null; - const ts = DateTime.fromMillis(Number(timestamp)); + const ts = DateTime.fromISO(timestamp); const now = DateTime.local(); const diffInDays = Math.floor(now.diff(ts, 'days').days); const fullDateFormat = "LLLL d, yyyy 'at' h:mm a"; diff --git a/frontend/components/KanbanBoard/index.tsx b/frontend/components/KanbanBoard/index.tsx index e36d852..c7d1ee9 100644 --- a/frontend/components/KanbanBoard/index.tsx +++ b/frontend/components/KanbanBoard/index.tsx @@ -195,7 +195,7 @@ export default function KanbanBoard({ const notification = { type: 'notification', - title: 'New Issue Created', + title: 'New issue Created', message: `Ticket title: ${itemName}`, topic: `user:${session?.user?.id}`, tags: ['white_check_mark', 'openpro.notificationDuration=3000'], diff --git a/frontend/components/ProjectList/index.tsx b/frontend/components/ProjectList/index.tsx index 02cef56..eff8ff7 100644 --- a/frontend/components/ProjectList/index.tsx +++ b/frontend/components/ProjectList/index.tsx @@ -1,22 +1,22 @@ -import React, { Fragment, useState } from 'react'; +import { useQuery } from '@apollo/client'; import { Menu, Transition } from '@headlessui/react'; - -import { EllipsisHorizontalIcon } from '@heroicons/react/24/solid'; import { ArrowLongLeftIcon, ArrowLongRightIcon, } from '@heroicons/react/20/solid'; +import { EllipsisHorizontalIcon } from '@heroicons/react/24/solid'; +import Link from 'next/link'; import { useRouter } from 'next/navigation'; -import { useQuery } from '@apollo/client'; -import { GET_PROJECTS } from '@/gql/gql-queries-mutations'; +import React, { Fragment, useState } from 'react'; + import { GetProjectsQuery, Project } from '@/gql/__generated__/graphql'; -import Link from 'next/link'; +import { GET_PROJECTS } from '@/gql/gql-queries-mutations'; const cols = [ 'ID', 'Name', 'Key', - 'Board Style', + 'board Style', 'Visibility', 'Description', '', diff --git a/frontend/components/Sidebar/index.tsx b/frontend/components/Sidebar/index.tsx index 9f2e7a2..c331cba 100644 --- a/frontend/components/Sidebar/index.tsx +++ b/frontend/components/Sidebar/index.tsx @@ -133,7 +133,7 @@ const Sidebar = ({ sidebarOpen, setSidebarOpen }: SidebarProps) => { {pathname.includes('projects') && pathname !== '/projects' && ( <>
    - {/* */} + {/* */} @@ -172,7 +172,7 @@ const Sidebar = ({ sidebarOpen, setSidebarOpen }: SidebarProps) => { ); }} - {/* */} + {/* */} {/* */} ; assetSubType?: Maybe; assetType?: Maybe; - createdAt?: Maybe; + createdAt?: Maybe; id: Scalars['ID']['output']; ownerId?: Maybe; - updatedAt?: Maybe; + updatedAt?: Maybe; }; export type AssignAssetAsAvatarInput = { @@ -43,7 +45,7 @@ export type Board = { backlogEnabled?: Maybe; columns?: Maybe>>; containerOrder?: Maybe; - createdAt?: Maybe; + createdAt?: Maybe; id?: Maybe; issues?: Maybe>>; name?: Maybe; @@ -51,7 +53,7 @@ export type Board = { settings?: Maybe; status?: Maybe; style?: Maybe; - updatedAt?: Maybe; + updatedAt?: Maybe; viewState?: Maybe>>; }; @@ -60,6 +62,13 @@ export enum BoardStyle { Scrum = 'SCRUM' } +export enum Custom_Field_Type { + Boolean = 'BOOLEAN', + Date = 'DATE', + Number = 'NUMBER', + Text = 'TEXT' +} + export type Column = { __typename?: 'Column'; id: Scalars['ID']['output']; @@ -100,6 +109,12 @@ export type CreateIssueStatusInput = { projectId: Scalars['String']['input']; }; +export type CreateProjectCustomFieldInput = { + fieldName: Scalars['String']['input']; + fieldType: Custom_Field_Type; + projectId: Scalars['String']['input']; +}; + export type CreateProjectInput = { boardName: Scalars['String']['input']; boardStyle: BoardStyle; @@ -119,6 +134,26 @@ export type CreateProjectValidationInput = { name?: InputMaybe; }; +export type CustomField = { + __typename?: 'CustomField'; + createdAt?: Maybe; + fieldName: Scalars['String']['output']; + fieldType: Custom_Field_Type; + id: Scalars['ID']['output']; + projectId: Scalars['String']['output']; + updatedAt?: Maybe; +}; + +export type CustomFieldValue = { + __typename?: 'CustomFieldValue'; + createdAt?: Maybe; + customField?: Maybe; + customFieldId: Scalars['String']['output']; + id: Scalars['ID']['output']; + updatedAt?: Maybe; + value: Scalars['String']['output']; +}; + export type DeleteAssetInput = { assetId: Scalars['String']['input']; }; @@ -137,6 +172,10 @@ export type DeleteIssueLinkInput = { linkedIssueId: Scalars['String']['input']; }; +export type DeleteProjectCustomFieldInput = { + id: Scalars['String']['input']; +}; + export type DeleteProjectTagInput = { id: Scalars['String']['input']; }; @@ -153,7 +192,8 @@ export type Issue = { archived?: Maybe; assignee?: Maybe; comments?: Maybe>>; - createdAt?: Maybe; + createdAt?: Maybe; + customFields?: Maybe>>; description?: Maybe; id: Scalars['ID']['output']; linkType?: Maybe; @@ -166,26 +206,26 @@ export type Issue = { status?: Maybe; tags?: Maybe>>; title: Scalars['String']['output']; - updatedAt?: Maybe; + updatedAt?: Maybe; }; export type IssueComment = { __typename?: 'IssueComment'; comment: Scalars['String']['output']; - createdAt?: Maybe; + createdAt?: Maybe; id: Scalars['ID']['output']; issueId: Scalars['String']['output']; reporter: User; - updatedAt?: Maybe; + updatedAt?: Maybe; }; export type IssueStatus = { __typename?: 'IssueStatus'; - createdAt?: Maybe; + createdAt?: Maybe; id: Scalars['ID']['output']; name: Scalars['String']['output']; projectId?: Maybe; - updatedAt?: Maybe; + updatedAt?: Maybe; }; export type MessageAndStatus = { @@ -204,11 +244,13 @@ export type Mutation = { createIssueLink?: Maybe; createIssueStatus?: Maybe; createProject?: Maybe; + createProjectCustomField?: Maybe; createProjectTag?: Maybe; deleteAsset?: Maybe; deleteIssue?: Maybe; deleteIssueComment?: Maybe; deleteIssueLink?: Maybe; + deleteProjectCustomField?: Maybe; deleteProjectTag?: Maybe; removeUserFromProject?: Maybe; updateBoard?: Maybe; @@ -259,6 +301,11 @@ export type MutationCreateProjectArgs = { }; +export type MutationCreateProjectCustomFieldArgs = { + input: CreateProjectCustomFieldInput; +}; + + export type MutationCreateProjectTagArgs = { input: CreateProjectTagInput; }; @@ -284,6 +331,11 @@ export type MutationDeleteIssueLinkArgs = { }; +export type MutationDeleteProjectCustomFieldArgs = { + input: DeleteProjectCustomFieldInput; +}; + + export type MutationDeleteProjectTagArgs = { input: DeleteProjectTagInput; }; @@ -326,7 +378,8 @@ export enum Order { export type Project = { __typename?: 'Project'; boards?: Maybe>>; - createdAt?: Maybe; + createdAt?: Maybe; + customFields?: Maybe>>; description?: Maybe; id?: Maybe; imageId?: Maybe; @@ -337,7 +390,7 @@ export type Project = { name?: Maybe; status?: Maybe; tags?: Maybe>>; - updatedAt?: Maybe; + updatedAt?: Maybe; users?: Maybe>>; visibility?: Maybe; }; @@ -349,11 +402,11 @@ export type ProjectIssuesArgs = { export type ProjectTag = { __typename?: 'ProjectTag'; - createdAt?: Maybe; + createdAt?: Maybe; id: Scalars['ID']['output']; name: Scalars['String']['output']; projectId: Scalars['String']['output']; - updatedAt?: Maybe; + updatedAt?: Maybe; }; export enum ProjectVisibility { @@ -462,6 +515,8 @@ export type UpdateIssueCommentInput = { export type UpdateIssueInput = { archived?: InputMaybe; assigneeId?: InputMaybe; + customFieldId?: InputMaybe; + customFieldValue?: InputMaybe; description?: InputMaybe; id: Scalars['String']['input']; issueStatusId?: InputMaybe; @@ -533,10 +588,10 @@ export type ViewStateItemInput = { export type UpdateIssueStatusFragment = { __typename?: 'Issue', id: string, status?: { __typename?: 'IssueStatus', id: string, name: string } | null } & { ' $fragmentName'?: 'UpdateIssueStatusFragment' }; -export type ProjectFieldsFragment = { __typename?: 'Project', id?: string | null, name?: string | null, key?: string | null, description?: string | null, visibility?: ProjectVisibility | null, createdAt?: string | null, updatedAt?: string | null, boards?: Array<{ __typename?: 'Board', id?: string | null, name?: string | null, backlogEnabled?: boolean | null, settings?: string | null, createdAt?: string | null, updatedAt?: string | null, viewState?: Array<( +export type ProjectFieldsFragment = { __typename?: 'Project', id?: string | null, name?: string | null, key?: string | null, description?: string | null, visibility?: ProjectVisibility | null, createdAt?: any | null, updatedAt?: any | null, boards?: Array<{ __typename?: 'Board', id?: string | null, name?: string | null, backlogEnabled?: boolean | null, settings?: string | null, createdAt?: any | null, updatedAt?: any | null, viewState?: Array<( { __typename?: 'ViewState' } & { ' $fragmentRefs'?: { 'ViewStateFieldsFragment': ViewStateFieldsFragment } } - ) | null> | null } | null> | null, issueStatuses?: Array<{ __typename?: 'IssueStatus', id: string, name: string, projectId?: string | null, createdAt?: string | null, updatedAt?: string | null } | null> | null, issues?: Array<( + ) | null> | null } | null> | null, issueStatuses?: Array<{ __typename?: 'IssueStatus', id: string, name: string, projectId?: string | null, createdAt?: any | null, updatedAt?: any | null } | null> | null, issues?: Array<( { __typename?: 'Issue' } & { ' $fragmentRefs'?: { 'IssueFieldsFragment': IssueFieldsFragment } } ) | null> | null, users?: Array<( @@ -544,9 +599,9 @@ export type ProjectFieldsFragment = { __typename?: 'Project', id?: string | null & { ' $fragmentRefs'?: { 'UserFieldsFragment': UserFieldsFragment } } ) | null> | null } & { ' $fragmentName'?: 'ProjectFieldsFragment' }; -export type ProjectOnlyFieldsFragment = { __typename?: 'Project', id?: string | null, name?: string | null, key?: string | null, visibility?: ProjectVisibility | null, description?: string | null, createdAt?: string | null, updatedAt?: string | null } & { ' $fragmentName'?: 'ProjectOnlyFieldsFragment' }; +export type ProjectOnlyFieldsFragment = { __typename?: 'Project', id?: string | null, name?: string | null, key?: string | null, visibility?: ProjectVisibility | null, description?: string | null, createdAt?: any | null, updatedAt?: any | null } & { ' $fragmentName'?: 'ProjectOnlyFieldsFragment' }; -export type IssueFieldsFragment = { __typename?: 'Issue', id: string, title: string, description?: string | null, projectId?: string | null, priority?: number | null, archived?: boolean | null, createdAt?: string | null, updatedAt?: string | null, tags?: Array<{ __typename?: 'ProjectTag', id: string, name: string, projectId: string, createdAt?: string | null, updatedAt?: string | null } | null> | null, status?: { __typename?: 'IssueStatus', id: string, name: string, projectId?: string | null } | null, reporter?: ( +export type IssueFieldsFragment = { __typename?: 'Issue', id: string, title: string, description?: string | null, projectId?: string | null, priority?: number | null, archived?: boolean | null, createdAt?: any | null, updatedAt?: any | null, tags?: Array<{ __typename?: 'ProjectTag', id: string, name: string, projectId: string, createdAt?: any | null, updatedAt?: any | null } | null> | null, status?: { __typename?: 'IssueStatus', id: string, name: string, projectId?: string | null } | null, reporter?: ( { __typename?: 'User' } & { ' $fragmentRefs'?: { 'UserFieldsFragment': UserFieldsFragment } } ) | null, assignee?: ( @@ -559,7 +614,7 @@ export type IssueFieldsFragment = { __typename?: 'Issue', id: string, title: str export type UserFieldsFragment = { __typename?: 'User', id?: string | null, email?: string | null, externalId?: string | null, name?: string | null, firstName?: string | null, lastName?: string | null, avatarUrl?: string | null } & { ' $fragmentName'?: 'UserFieldsFragment' }; -export type IssueCommentFieldsFragment = { __typename?: 'IssueComment', id: string, comment: string, issueId: string, createdAt?: string | null, updatedAt?: string | null, reporter: ( +export type IssueCommentFieldsFragment = { __typename?: 'IssueComment', id: string, comment: string, issueId: string, createdAt?: any | null, updatedAt?: any | null, reporter: ( { __typename?: 'User' } & { ' $fragmentRefs'?: { 'UserFieldsFragment': UserFieldsFragment } } ) } & { ' $fragmentName'?: 'IssueCommentFieldsFragment' }; @@ -618,7 +673,7 @@ export type GetProjectInfoQuery = { __typename?: 'Query', project?: ( ) | null> | null, boards?: Array<{ __typename?: 'Board', id?: string | null, backlogEnabled?: boolean | null, containerOrder?: string | null, viewState?: Array<( { __typename?: 'ViewState' } & { ' $fragmentRefs'?: { 'ViewStateFieldsFragment': ViewStateFieldsFragment } } - ) | null> | null } | null> | null, issueStatuses?: Array<{ __typename?: 'IssueStatus', id: string, projectId?: string | null, name: string, createdAt?: string | null } | null> | null, issues?: Array<( + ) | null> | null } | null> | null, issueStatuses?: Array<{ __typename?: 'IssueStatus', id: string, projectId?: string | null, name: string, createdAt?: any | null } | null> | null, issues?: Array<( { __typename?: 'Issue' } & { ' $fragmentRefs'?: { 'IssueFieldsFragment': IssueFieldsFragment } } ) | null> | null } @@ -667,7 +722,7 @@ export type GetIssueStatusesQueryVariables = Exact<{ }>; -export type GetIssueStatusesQuery = { __typename?: 'Query', project?: { __typename?: 'Project', id?: string | null, name?: string | null, description?: string | null, issueStatuses?: Array<{ __typename?: 'IssueStatus', id: string, projectId?: string | null, name: string, createdAt?: string | null } | null> | null } | null }; +export type GetIssueStatusesQuery = { __typename?: 'Query', project?: { __typename?: 'Project', id?: string | null, name?: string | null, description?: string | null, issueStatuses?: Array<{ __typename?: 'IssueStatus', id: string, projectId?: string | null, name: string, createdAt?: any | null } | null> | null } | null }; export type UpdateIssueMutationVariables = Exact<{ input?: InputMaybe; @@ -728,7 +783,7 @@ export type CreateIssueStatusMutationVariables = Exact<{ }>; -export type CreateIssueStatusMutation = { __typename?: 'Mutation', createIssueStatus?: { __typename?: 'IssueStatus', id: string, name: string, projectId?: string | null, createdAt?: string | null } | null }; +export type CreateIssueStatusMutation = { __typename?: 'Mutation', createIssueStatus?: { __typename?: 'IssueStatus', id: string, name: string, projectId?: string | null, createdAt?: any | null } | null }; export type CreateProjectMutationVariables = Exact<{ input?: InputMaybe; @@ -736,7 +791,7 @@ export type CreateProjectMutationVariables = Exact<{ export type CreateProjectMutation = { __typename?: 'Mutation', createProject?: ( - { __typename?: 'Project', boards?: Array<{ __typename?: 'Board', id?: string | null, style?: string | null, backlogEnabled?: boolean | null, createdAt?: string | null, viewState?: Array<( + { __typename?: 'Project', boards?: Array<{ __typename?: 'Board', id?: string | null, style?: string | null, backlogEnabled?: boolean | null, createdAt?: any | null, viewState?: Array<( { __typename?: 'ViewState' } & { ' $fragmentRefs'?: { 'ViewStateFieldsFragment': ViewStateFieldsFragment } } ) | null> | null } | null> | null } @@ -771,7 +826,7 @@ export type GetProjectTagsQueryVariables = Exact<{ }>; -export type GetProjectTagsQuery = { __typename?: 'Query', projectTags?: Array<{ __typename?: 'ProjectTag', id: string, name: string, projectId: string, createdAt?: string | null, updatedAt?: string | null } | null> | null }; +export type GetProjectTagsQuery = { __typename?: 'Query', projectTags?: Array<{ __typename?: 'ProjectTag', id: string, name: string, projectId: string, createdAt?: any | null, updatedAt?: any | null } | null> | null }; export type CreateProjectTagMutationVariables = Exact<{ input: CreateProjectTagInput; diff --git a/frontend/services/apollo-client.ts b/frontend/services/apollo-client.ts index 3e8867e..b64f21f 100644 --- a/frontend/services/apollo-client.ts +++ b/frontend/services/apollo-client.ts @@ -1,8 +1,13 @@ -import { from, ApolloClient, InMemoryCache, gql, split } from '@apollo/client'; +import { ApolloClient, InMemoryCache, from, gql, split } from '@apollo/client'; +import { createFragmentRegistry } from '@apollo/client/cache'; +import { BatchHttpLink } from '@apollo/client/link/batch-http'; import { setContext } from '@apollo/client/link/context'; +import { getMainDefinition } from '@apollo/client/utilities'; // TODO: Why isn't typescript picking up the ./types definition for this... import createUploadLink from 'apollo-upload-client/createUploadLink.mjs'; +import axios from 'axios'; import { DateTime } from 'luxon'; + import { ISSUE_COMMENT_FIELDS, ISSUE_FIELDS, @@ -12,15 +17,11 @@ import { VIEW_STATE_ISSUE_STATUS_FIELDS, VIEW_STATE_ITEM_FIELDS, } from '@/gql/gql-queries-mutations'; -import { createFragmentRegistry } from '@apollo/client/cache'; import { + API_URL, NEXT_PUBLIC_API_URL, PUBLIC_NEXTAUTH_URL, - API_URL, } from '@/services/config'; -import { BatchHttpLink } from '@apollo/client/link/batch-http'; -import { getMainDefinition } from '@apollo/client/utilities'; -import axios from 'axios'; const authLink = setContext(async (_, { headers }) => { const { data } = await axios.get(`${PUBLIC_NEXTAUTH_URL}/api/get-jwt`); @@ -76,6 +77,18 @@ export const apolloClient = new ApolloClient({ ${PROJECT_ONLY_FIELDS} `), typePolicies: { + ViewState: { + fields: { + items: { + merge(existing = [], incoming) { + // TODO: we should revisit this. I seem to get an error when creating a + // new project/board and i create an issue then drag to another column for first time + // return [...existing, ...incoming]; ?? + return incoming; + }, + }, + }, + }, Board: { fields: { settings: { @@ -93,7 +106,7 @@ export const apolloClient = new ApolloClient({ read(_, { readField }) { const createdAt: string | undefined = readField('createdAt'); return createdAt - ? DateTime.fromMillis(Number(createdAt)).toRelative() + ? DateTime.fromISO(createdAt).toRelative() : null; }, }, diff --git a/package.json b/package.json index 7288686..fb298a5 100644 --- a/package.json +++ b/package.json @@ -9,5 +9,8 @@ "pnpm:install:frontend": "cd frontend && pnpm install", "dev": "docker-compose -f docker-compose-local.yml up --build --force-recreate --remove-orphans" }, - "packageManager": "pnpm@8.10.2" + "packageManager": "pnpm@8.10.2", + "devDependencies": { + "husky": "^8.0.3" + } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100644 index 0000000..9d98399 --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,18 @@ +lockfileVersion: '6.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +devDependencies: + husky: + specifier: ^8.0.3 + version: 8.0.3 + +packages: + + /husky@8.0.3: + resolution: {integrity: sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg==} + engines: {node: '>=14'} + hasBin: true + dev: true