diff --git a/.github/workflows/build-release.yml b/.github/workflows/build-release.yml index 45cf25af..1da127ae 100644 --- a/.github/workflows/build-release.yml +++ b/.github/workflows/build-release.yml @@ -132,17 +132,6 @@ jobs: echo "No Embed Release" fi - - name: Trigger Lambda Release - continue-on-error: true - run: | - LAMBDA_VERSION=$(jq -r '.releases[] | select(.name == "@snipcode/code-embed") | .newVersion' release.json) - if [ -n "$LAMBDA_VERSION" ]; then - echo "Ready to release Lambda version $LAMBDA_VERSION" - gh workflow run deploy-lambda.yml -r "${{ secrets.GH_BRANCH }}" -f version=$LAMBDA_VERSION - else - echo "No Lambda Release" - fi - - name: Delete Release File if: ${{ success() }} env: diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 02daf328..64207018 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -45,7 +45,7 @@ jobs: - name: Run tests run: | yarn prisma migrate dev --schema=packages/domain/prisma/schema.prisma - yarn test + yarn test -- --runInBand --coverage preview-frontend: runs-on: ubuntu-latest diff --git a/.github/workflows/deploy-lambda.yml b/.github/workflows/deploy-lambda.yml deleted file mode 100644 index 2a5755a5..00000000 --- a/.github/workflows/deploy-lambda.yml +++ /dev/null @@ -1,52 +0,0 @@ -name: Deploy Code Embed -on: - push: - branches: - - dev - paths: - - 'packages/database/prisma/**' - - 'packages/database/src/**' - - 'apps/functions/code-embed/src/**' - - 'apps/functions/code-embed/serverless.ts' - workflow_dispatch: - inputs: - version: - description: 'New version of the lambda to release' - type: string - required: true - default: 'latest' - -jobs: - deploy: - runs-on: ubuntu-latest - environment: ${{ (github.ref == 'refs/heads/main' && 'Production') || 'Development' }} - env: - DATABASE_URL: ${{ secrets.DATABASE_URL }} - EMBED_STYLE_URL: ${{ secrets.EMBED_STYLE_URL }} - EMBED_JS_URL: ${{ secrets.EMBED_JS_URL }} - WEB_APP_URL: ${{ secrets.WEB_APP_URL }} - WEB_APP_SNIPPET_VIEW_URL: ${{ secrets.WEB_APP_SNIPPET_VIEW_URL }} - ENV: ${{ secrets.ENV }} - SENTRY_DSN: ${{ secrets.CODE_EMBED_SENTRY_DSN }} - AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} - AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} - steps: - - uses: actions/checkout@v4 - - - name: Install dependencies - uses: ./.github/actions/install-dependencies - - - name: Deploy the application in staging - working-directory: 'apps/functions/code-embed' - if: ${{ github.ref == 'refs/heads/dev' }} - run: | - yarn setup:layer:remote - yarn sls deploy --stage dev - - - name: Deploy the application in production - working-directory: 'apps/functions/code-embed' - if: ${{ github.ref == 'refs/heads/main' }} - run: | - yarn setup:layer:remote - yarn sls deploy --stage prod - diff --git a/README.md b/README.md index 7132541a..e8f2b7b1 100644 --- a/README.md +++ b/README.md @@ -15,9 +15,9 @@ Snipcode is an open-source code-sharing platform that makes it easy to create co ## Tech Stack * [Node.js](https://nodejs.org/en/) -* [Typescript](https://www.typescriptlang.org/) +* [TypeScript](https://www.typescriptlang.org/) * [GraphQL](https://graphql.org/) -* [MySQL 8 through PlanetScale](https://planetscale.com/) +* [MySQL 8 with PlanetScale](https://planetscale.com/) * [Prisma](https://www.prisma.io/) * [Tailwind CSS](https://tailwindcss.com/) * [AWS](https://aws.amazon.com) @@ -26,9 +26,7 @@ Snipcode is an open-source code-sharing platform that makes it easy to create co ```text snipcode ├─ apps -│ ├─ core -│ ├─ functions -│ │ ├─ code-embed +│ ├─ backend │ ├─ web ├─ packages │ ├─ database diff --git a/apps/core/.dockerignore b/apps/backend/.dockerignore similarity index 100% rename from apps/core/.dockerignore rename to apps/backend/.dockerignore diff --git a/apps/core/.env.example b/apps/backend/.env.example similarity index 81% rename from apps/core/.env.example rename to apps/backend/.env.example index a8bb993a..26e4eac1 100644 --- a/apps/core/.env.example +++ b/apps/backend/.env.example @@ -1,13 +1,13 @@ NODE_ENV=development +APP_VERSION=1.0.0 HOST=http://localhost PORT=7501 -ENABLE_INTROSPECTION=true +INTROSPECTION_ENABLED=true DATABASE_URL="mysql://root:@127.0.0.1:3311/snipcode" ADMIN_PASSWORD=nwHSvXuQxjey43Bp CONVERTKIT_API_KEY=convertKitApiKey CONVERTKIT_FORM_ID=formId CONVERTKIT_TAG_ID=tagId -REQUEST_TIMEOUT=30000 GITHUB_CLIENT_ID= GITHUB_CLIENT_SECRET= WEB_APP_URL=http://localhost:7500 @@ -16,4 +16,5 @@ WEB_AUTH_ERROR_URL=http://localhost:7500/auth/error SESSION_LIFETIME=90# 90 days SENTRY_DSN= SENTRY_ENABLED=false -SNIPPET_RENDERER_URL=http://localhost:3000/dev +SNIPPET_RENDERER_API_URL=http://localhost:3000/dev +JWT_SECRET=jwtSecret diff --git a/apps/backend/.env.test b/apps/backend/.env.test new file mode 100644 index 00000000..6b1f1aad --- /dev/null +++ b/apps/backend/.env.test @@ -0,0 +1,20 @@ +NODE_ENV=test +APP_VERSION=1.1.0 +HOST=http://localhost +PORT=7509 +INTROSPECTION_ENABLED=false +DATABASE_URL="mysql://root:secret@127.0.0.1:3313/snipcode" +ADMIN_PASSWORD=qwerty +CONVERTKIT_API_KEY=convertkit-api-key +CONVERTKIT_FORM_ID=convertkit-form-id +CONVERTKIT_TAG_ID=convertkit-tag-id +GITHUB_CLIENT_ID=github-client-id +GITHUB_CLIENT_SECRET=github-client-secret +WEB_APP_URL=http://localhost:7500 +WEB_AUTH_SUCCESS_URL=http://localhost:7500/auth/success +WEB_AUTH_ERROR_URL=http://localhost:7500/auth/error +SESSION_LIFETIME=90 +SENTRY_DSN=sentry-dsn +SENTRY_ENABLED=false +SNIPPET_RENDERER_API_URL=http://localhost:3000/dev +JWT_SECRET=jwtSecret diff --git a/apps/backend/.eslintrc.js b/apps/backend/.eslintrc.js new file mode 100644 index 00000000..c1711948 --- /dev/null +++ b/apps/backend/.eslintrc.js @@ -0,0 +1,11 @@ +module.exports = { + root: true, + extends: '../../.eslintrc.json', + ignorePatterns: ['jest.config.ts', '.eslintrc.js', 'graphql.schema.ts', 'generated.ts'], + parserOptions: { + ecmaVersion: 2023, + sourceType: 'module', + project: 'tsconfig.json', + tsconfigRootDir: __dirname, + }, +}; diff --git a/apps/backend/.gitignore b/apps/backend/.gitignore new file mode 100644 index 00000000..b1a21d7c --- /dev/null +++ b/apps/backend/.gitignore @@ -0,0 +1,57 @@ +# compiled output +/dist +/node_modules +/build + +# Logs +logs +*.log +npm-debug.log* +pnpm-debug.log* +yarn-debug.log* +yarn-error.log* +lerna-debug.log* + +# OS +.DS_Store + +# Tests +/coverage +/.nyc_output + +# IDEs and editors +/.idea +.project +.classpath +.c9/ +*.launch +.settings/ +*.sublime-workspace + +# IDE - VSCode +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json + +# dotenv environment variable files +.env +.env.development.local +.env.test.local +.env.production.local +.env.local +.env.docker + +# temp directory +.temp +.tmp + +# Runtime data +pids +*.pid +*.seed +*.pid.lock + +# Diagnostic reports (https://nodejs.org/api/report.html) +report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json diff --git a/apps/core/CHANGELOG.md b/apps/backend/CHANGELOG.md similarity index 92% rename from apps/core/CHANGELOG.md rename to apps/backend/CHANGELOG.md index 8e43db59..4a8399e0 100644 --- a/apps/core/CHANGELOG.md +++ b/apps/backend/CHANGELOG.md @@ -1,4 +1,4 @@ -# @snipcode/core +# @snipcode/backend ## 1.1.0 diff --git a/apps/core/Dockerfile b/apps/backend/Dockerfile similarity index 88% rename from apps/core/Dockerfile rename to apps/backend/Dockerfile index 6658e3a1..fe7f251c 100644 --- a/apps/core/Dockerfile +++ b/apps/backend/Dockerfile @@ -12,7 +12,7 @@ RUN yarn install RUN npx prisma generate --schema=./packages/domain/prisma/schema.prisma -RUN yarn build --filter=...@snipcode/core +RUN yarn build --filter=...@snipcode/backend FROM node:20-alpine as schema-builder @@ -40,8 +40,8 @@ RUN corepack enable && yarn set version berry COPY --chown=node:node --from=builder /app/package.json . COPY --chown=node:node --from=builder /app/.yarnrc.yml . -COPY --chown=node:node --from=builder /app/apps/core/dist/src ./apps/core/src -COPY --chown=node:node --from=builder /app/apps/core/package.json ./apps/core +COPY --chown=node:node --from=builder /app/apps/backend/dist/src ./apps/backend/src +COPY --chown=node:node --from=builder /app/apps/backend/package.json ./apps/backend COPY --chown=node:node --from=builder /app/packages/domain/package.json ./packages/domain/package.json COPY --chown=node:node --from=builder /app/packages/domain/dist ./packages/domain/dist @@ -61,4 +61,4 @@ COPY --chown=node:node --from=schema-builder /app/node_modules/.prisma/client . EXPOSE 7501 -CMD ["node", "apps/core/src/index.js"] +CMD ["node", "apps/backend/src/main.js"] diff --git a/apps/backend/README.md b/apps/backend/README.md new file mode 100644 index 00000000..b7713c6c --- /dev/null +++ b/apps/backend/README.md @@ -0,0 +1,95 @@ +# Snipcode Core + +This is the backend of Snipcode, containing the business logics related to . + +## Tech Stack +* Node.js +* TypeScript +* GraphQL +* MySQL +* Prisma + +## Prerequisites +Make sure you have this tools installed before running the project +* Node.js 20+ +* NPM or Yarn +* Docker +* AWS CLI v2 +* MySQL 8 on PlanetScale + +## Packages dependencies +We use Yarn workspace to create packages we can share with other applications. +These packages are located in the folder `packages`, so you might need to change the code of one or many packages to implement a feature. +Here are the packages used in this project: + +* [@snipcode/domain](../../packages/domain) +* [@snipcode/embed](../../packages/embed) +* [@snipcode/utils](../../packages/utils) + +## Set up the project +Delete the existing folders output from build commands +```shell +yarn clean +``` +Install node modules +````shell +yarn install +```` +Create configuration file from the template +```shell +cp .env.template .env.local + +# Edit configuration to match your local environment and save +nano .env.local +``` + +**Environment variables list** + +| Variable | Description | +|--------------------------|--------------------------------------------------------------------------------------| +| NODE_ENV | Node.js environment (default: development) | +| APP_VERSION | The current version of the application | +| HOST | Host name where the application is running (default: http://localhost) | +| PORT | Port number of the application (default: 7501) | +| ENABLE_INTROSPECTION | Enable/Disable GraphQL introspection (must `false` in production) | +| DATABASE_URL | URL of the database | +| ADMIN_PASSWORD | Password of the default admin user. | +| CONVERTKIT_API_KEY | ConvertKit API key | +| CONVERTKIT_FORM_ID | ConvertKit Form ID | +| CONVERTKIT_TAG_ID | ConvertKit Tag ID | +| REQUEST_TIMEOUT | Max duration of a request (default: 30 seconds) | +| GITHUB_CLIENT_ID | GitHub application client ID for authentication with GitHub | +| GITHUB_CLIENT_SECRET | GitHub application client secret for authentication with GitHub | +| WEB_APP_URL | URL of the frontend the application that communicates with this app | +| WEB_AUTH_SUCCESS_URL | Callback URL of the frontend application when the authentication succeed | +| WEB_AUTH_ERROR_URL | Callback URL of the frontend application when the authentication failed | +| SESSION_LIFETIME | The session's lifetime when a user authenticate (default: 90 days) | +| SENTRY_DSN | Sentry DSN | +| SENTRY_ENABLED | Enable/Disable Sentry | +| SNIPPET_RENDERER_API_URL | Base URL of the API (the current one) for generating the html content from a snippet | +| JWT_SECRET | The secret code for decoding JWT token generated in the application | + +Start the application +```bash +yarn dev +``` +The application will be launched by [Nodemon](https://nodemon.com). + +Open [http://localhost:7501/graphql](http://localhost:7501/graphql) in your browser and use Apollo studio explorer to test your GraphQL queries and mutations. + +## Running tests +Run the command below to run all the tests +```shell +yarn test +``` +To run a specific test file, append the filename after the command +```shell +yarn test controller.test.ts +``` + +## Lint the project +ESLint and Prettier are used to normalize the code style across the project. +Linting the code make sure there is no error +```shell +yarn lint +``` diff --git a/apps/core/deploy.sh b/apps/backend/deploy.sh similarity index 100% rename from apps/core/deploy.sh rename to apps/backend/deploy.sh diff --git a/apps/core/env.d.ts b/apps/backend/env.d.ts similarity index 85% rename from apps/core/env.d.ts rename to apps/backend/env.d.ts index b694eb34..49fdd07a 100644 --- a/apps/core/env.d.ts +++ b/apps/backend/env.d.ts @@ -5,13 +5,16 @@ export type EnvironmentVariables = { CONVERTKIT_FORM_ID: string; CONVERTKIT_TAG_ID: string; DATABASE_URL: string; - ENABLE_INTROSPECTION: string; GITHUB_CLIENT_ID: string; GITHUB_CLIENT_SECRET: string; HOST: string; + INTROSPECTION_ENABLED: string; + JWT_SECRET: string; + NODE_ENV: string; PORT: string; REQUEST_TIMEOUT: string; SENTRY_DSN: string; + SENTRY_ENABLED: string; SESSION_LIFETIME: string; SNIPPET_RENDERER_URL: string; WEB_APP_URL: string; diff --git a/apps/core/jest.config.ts b/apps/backend/jest.config.ts similarity index 63% rename from apps/core/jest.config.ts rename to apps/backend/jest.config.ts index 179365d0..b48aaa30 100644 --- a/apps/core/jest.config.ts +++ b/apps/backend/jest.config.ts @@ -1,15 +1,18 @@ import type { Config } from '@jest/types'; const config: Config.InitialOptions = { - roots: ['.'], - preset: 'ts-jest', - testMatch: ['**/?(*.)+(spec|test).[jt]s'], - testEnvironment: 'node', clearMocks: true, maxWorkers: 1, + moduleFileExtensions: ['js', 'json', 'ts'], + preset: 'ts-jest', + roots: ['.'], snapshotFormat: { - "printBasicPrototype": false - } + printBasicPrototype: false, + }, + testEnvironment: 'node', + testMatch: ['**/?(*.)+(spec|test).[jt]s'], + collectCoverageFrom: ['**/*.(t|j)s'], + coverageDirectory: '../coverage', }; export default config; diff --git a/apps/backend/nest-cli.json b/apps/backend/nest-cli.json new file mode 100644 index 00000000..f9aa683b --- /dev/null +++ b/apps/backend/nest-cli.json @@ -0,0 +1,8 @@ +{ + "$schema": "https://json.schemastore.org/nest-cli", + "collection": "@nestjs/schematics", + "sourceRoot": "src", + "compilerOptions": { + "deleteOutDir": true + } +} diff --git a/apps/backend/package.json b/apps/backend/package.json new file mode 100644 index 00000000..8d9b0d47 --- /dev/null +++ b/apps/backend/package.json @@ -0,0 +1,52 @@ +{ + "name": "@snipcode/backend", + "version": "1.1.0", + "private": true, + "description": "Core backend of the application", + "main": "dist/src/main.js", + "license": "AGPL-3.0", + "scripts": { + "build": "nest build", + "clean": "rm -rf .turbo dist build logs", + "dev": "dotenv -e .env.local -- nest start --watch", + "dev:debug": "nest start --debug --watch", + "gql:gen:types": "ts-node scripts/generate-graphql-types.ts", + "lint": "eslint \"{src,scripts}/**/*.ts\" --fix", + "prod": "node dist/main", + "test": "yarn workspace @snipcode/domain db:test && dotenv -e .env.test -- jest --runInBand", + "test:watch": "yarn workspace @snipcode/domain db:test && dotenv -e .env.test -- jest --watchAll --runInBand", + "test:coverage": "yarn test --coverage", + "test:debug": "node --inspect-brk -r tsconfig-paths/register -r ts-node/register node_modules/.bin/jest --runInBand", + "test:it": "yarn test integration.spec.ts" + }, + "dependencies": { + "@apollo/server": "4.10.4", + "@nestjs/apollo": "12.1.0", + "@nestjs/common": "10.3.8", + "@nestjs/config": "3.2.2", + "@nestjs/core": "10.3.8", + "@nestjs/graphql": "12.1.1", + "@nestjs/platform-express": "10.3.8", + "@prisma/client": "5.14.0", + "@sentry/node": "8.3.0", + "graphql": "16.8.1", + "reflect-metadata": "0.2.2", + "rxjs": "7.8.1", + "zod": "3.23.8" + }, + "devDependencies": { + "@nestjs/cli": "10.3.2", + "@nestjs/schematics": "10.1.1", + "@nestjs/testing": "10.3.8", + "@ngneat/falso": "7.2.0", + "@types/express": "4.17.21", + "@types/supertest": "6.0.2", + "dotenv-cli": "7.4.2", + "source-map-support": "0.5.21", + "supertest": "7.0.0", + "ts-loader": "9.5.1", + "ts-morph": "22.0.0", + "ts-node": "10.9.2", + "tsconfig-paths": "4.2.0" + } +} diff --git a/apps/backend/scripts/generate-graphql-types.ts b/apps/backend/scripts/generate-graphql-types.ts new file mode 100644 index 00000000..a3741a4e --- /dev/null +++ b/apps/backend/scripts/generate-graphql-types.ts @@ -0,0 +1,14 @@ +import { join } from 'path'; + +import { GraphQLDefinitionsFactory } from '@nestjs/graphql'; + +const definitionsFactory = new GraphQLDefinitionsFactory(); + +void definitionsFactory.generate({ + defaultScalarType: 'unknown', + emitTypenameField: true, + enumsAsTypes: true, + outputAs: 'interface', + path: join(process.cwd(), 'src/types/graphql.schema.ts'), + typePaths: ['./src/features/**/*.graphql'], +}); diff --git a/apps/backend/src/app.module.ts b/apps/backend/src/app.module.ts new file mode 100644 index 00000000..ca6971ba --- /dev/null +++ b/apps/backend/src/app.module.ts @@ -0,0 +1,64 @@ +import { ApolloServerPlugin } from '@apollo/server'; +import { ApolloServerPluginLandingPageLocalDefault } from '@apollo/server/plugin/landingPage/default'; +import { ApolloDriver, ApolloDriverConfig } from '@nestjs/apollo'; +import { Logger, Module } from '@nestjs/common'; +import { ConfigModule, ConfigService } from '@nestjs/config'; +import { GraphQLModule } from '@nestjs/graphql'; +import { DomainModule } from '@snipcode/domain'; + +import { EnvironmentVariables, validate } from './configs/environment'; +import { AppController } from './features/app/app.controller'; +import { AppService } from './features/app/app.service'; +import { AuthFeatureModule } from './features/auth/auth.module'; +import { FolderFeatureModule } from './features/folders/folder.module'; +import { SnippetFeatureModule } from './features/snippets/snippet.module'; +import { UserFeatureModule } from './features/users/user.module'; +import { IS_DEV } from './utils/environment'; +import { DateScalar } from './utils/graphql/date-scalar'; + +const explorerPlugin: ApolloServerPlugin[] = IS_DEV ? [ApolloServerPluginLandingPageLocalDefault({ embed: true })] : []; + +@Module({ + controllers: [AppController], + imports: [ + ConfigModule.forRoot({ + envFilePath: ['.env.local', '.env.test'], + isGlobal: true, + validate, + }), + DomainModule.forRootAsync({ + inject: [ConfigService], + isGlobal: true, + useFactory: (configService: ConfigService) => { + return { + convertKit: { + apiKey: configService.get('CONVERTKIT_API_KEY'), + formId: configService.get('CONVERTKIT_FORM_ID'), + }, + databaseUrl: configService.get('DATABASE_URL'), + }; + }, + }), + GraphQLModule.forRootAsync({ + driver: ApolloDriver, + inject: [ConfigService], + useFactory: (configService: ConfigService) => { + return { + cache: 'bounded', + includeStacktraceInErrorResponses: IS_DEV, + introspection: configService.get('INTROSPECTION_ENABLED'), + nodeEnv: configService.get('NODE_ENV'), + playground: false, + plugins: [...explorerPlugin], + typePaths: ['./src/features/**/*.graphql'], + }; + }, + }), + AuthFeatureModule, + FolderFeatureModule, + SnippetFeatureModule, + UserFeatureModule, + ], + providers: [Logger, DateScalar, AppService], +}) +export class AppModule {} diff --git a/apps/backend/src/configs/auth.guard.ts b/apps/backend/src/configs/auth.guard.ts new file mode 100644 index 00000000..293e7bed --- /dev/null +++ b/apps/backend/src/configs/auth.guard.ts @@ -0,0 +1,36 @@ +import { CanActivate, ExecutionContext, Injectable, UnauthorizedException, createParamDecorator } from '@nestjs/common'; +import { GqlExecutionContext } from '@nestjs/graphql'; +import { SessionService } from '@snipcode/domain'; +import { errors } from '@snipcode/utils'; + +import { GraphQLContext } from '../types/common'; + +@Injectable() +export class AuthGuard implements CanActivate { + constructor(private sessionService: SessionService) {} + + async canActivate(context: ExecutionContext): Promise { + const ctx = GqlExecutionContext.create(context); + const request = ctx.getContext().req; + + const token = request.headers.authorization; + + if (!token) { + throw new UnauthorizedException(errors.NOT_AUTHENTICATED); + } + + const session = await this.sessionService.findByToken(token); + + if (!session) { + throw new UnauthorizedException(errors.NOT_AUTHENTICATED); + } + + request['userId'] = session.userId; + + return true; + } +} + +export const UserId = createParamDecorator( + (_data: unknown, ctx: ExecutionContext) => GqlExecutionContext.create(ctx).getContext().req.userId, +); diff --git a/apps/backend/src/configs/environment.ts b/apps/backend/src/configs/environment.ts new file mode 100644 index 00000000..60250a34 --- /dev/null +++ b/apps/backend/src/configs/environment.ts @@ -0,0 +1,36 @@ +import { z } from 'zod'; + +const EnvironmentVariablesSchema = z.object({ + ADMIN_PASSWORD: z.string(), + APP_VERSION: z.string(), + CONVERTKIT_API_KEY: z.string(), + CONVERTKIT_FORM_ID: z.string(), + CONVERTKIT_TAG_ID: z.string(), + DATABASE_URL: z.string(), + GITHUB_CLIENT_ID: z.string(), + GITHUB_CLIENT_SECRET: z.string(), + HOST: z.string(), + INTROSPECTION_ENABLED: z.boolean({ coerce: true }), + JWT_SECRET: z.string(), + NODE_ENV: z.union([z.literal('development'), z.literal('production'), z.literal('test')]), + PORT: z.number({ coerce: true }).min(7000).max(8000), + SENTRY_DSN: z.string(), + SENTRY_ENABLED: z.boolean({ coerce: true }), + SESSION_LIFETIME: z.number({ coerce: true }).min(1), + SNIPPET_RENDERER_API_URL: z.string(), + WEB_APP_URL: z.string(), + WEB_AUTH_ERROR_URL: z.string(), + WEB_AUTH_SUCCESS_URL: z.string(), +}); + +export type EnvironmentVariables = z.infer; + +export const validate = (config: Record): EnvironmentVariables => { + const result = EnvironmentVariablesSchema.safeParse(config); + + if (!result.success) { + throw new Error(JSON.stringify(result.error.format(), null, 2)); + } + + return result.data; +}; diff --git a/apps/backend/src/configs/exception.filter.ts b/apps/backend/src/configs/exception.filter.ts new file mode 100644 index 00000000..e92739bf --- /dev/null +++ b/apps/backend/src/configs/exception.filter.ts @@ -0,0 +1,30 @@ +import { ArgumentsHost, Catch } from '@nestjs/common'; +import { AbstractHttpAdapter, BaseExceptionFilter } from '@nestjs/core'; +import { GqlArgumentsHost, GqlContextType } from '@nestjs/graphql'; +import { isAppError } from '@snipcode/utils'; +import { GraphQLError } from 'graphql'; + +@Catch() +export class ApplicationExceptionFilter extends BaseExceptionFilter { + constructor(httpAdapter: AbstractHttpAdapter) { + super(httpAdapter); + } + + catch(exception: unknown, host: ArgumentsHost) { + const gqlHost = GqlArgumentsHost.create(host); + + if (gqlHost.getType() === 'graphql') { + if (isAppError(exception)) { + throw new GraphQLError(exception.message, { + extensions: { + code: exception.code, + }, + originalError: exception, + }); + } + } else { + // Handle HTTP exceptions + super.catch(exception, host); + } + } +} diff --git a/apps/backend/src/configs/instrument.ts b/apps/backend/src/configs/instrument.ts new file mode 100644 index 00000000..160c701f --- /dev/null +++ b/apps/backend/src/configs/instrument.ts @@ -0,0 +1,24 @@ +import * as Sentry from '@sentry/node'; + +import { IS_DEV, IS_PROD } from '../utils/environment'; + +const isSentryEnabled = () => { + if (process.env.SENTRY_ENABLED !== 'true') { + return false; + } + + return IS_PROD || IS_DEV; +}; + +Sentry.init({ + dsn: process.env.SENTRY_DSN, + enabled: isSentryEnabled(), + environment: process.env.NODE_ENV, + integrations: [Sentry.prismaIntegration()], + // https://docs.sentry.io/platforms/javascript/guides/nestjs/configuration/sampling/#setting-a-uniform-sample-rate + tracesSampleRate: 0.6, +}); + +Sentry.setContext('app', { + version: process.env.APP_VERSION, +}); diff --git a/apps/backend/src/features/app/app.controller.ts b/apps/backend/src/features/app/app.controller.ts new file mode 100644 index 00000000..83771475 --- /dev/null +++ b/apps/backend/src/features/app/app.controller.ts @@ -0,0 +1,11 @@ +import { Controller, Get } from '@nestjs/common'; + +@Controller() +export class AppController { + constructor() {} + + @Get() + async helloWorld(): Promise { + return 'Hello from Snipcode!'; + } +} diff --git a/apps/backend/src/features/app/app.integration.spec.ts b/apps/backend/src/features/app/app.integration.spec.ts new file mode 100644 index 00000000..d38448bb --- /dev/null +++ b/apps/backend/src/features/app/app.integration.spec.ts @@ -0,0 +1,22 @@ +import request from 'supertest'; + +import { TestServer, startTestServer } from '../../utils/tests/server'; + +describe('Application Common Endpoints', () => { + let server: TestServer; + + beforeAll(async () => { + server = await startTestServer(); + }); + + afterAll(async () => { + await server.close(); + }); + + test('The entry endpoint returns a Hello world message', async () => { + const response = await request(server.app.getHttpServer()).get('/').expect(200); + + expect(response.body).toEqual({}); + expect(response.text).toBe('Hello from Snipcode!'); + }); +}); diff --git a/apps/backend/src/features/app/app.service.spec.ts b/apps/backend/src/features/app/app.service.spec.ts new file mode 100644 index 00000000..03241601 --- /dev/null +++ b/apps/backend/src/features/app/app.service.spec.ts @@ -0,0 +1,51 @@ +import { ConfigService } from '@nestjs/config'; +import { Test, TestingModule } from '@nestjs/testing'; +import { PrismaService, RoleService, UserService } from '@snipcode/domain'; +import { mock } from 'jest-mock-extended'; + +import { AppService } from './app.service'; + +const prismaServiceMock = mock(); +const roleServiceMock = mock(); +const userServiceMock = mock(); + +describe('Test App Service', () => { + let appService: AppService; + let roleService: RoleService; + let userService: UserService; + + beforeEach(async () => { + const app: TestingModule = await Test.createTestingModule({ + providers: [ + { provide: PrismaService, useValue: prismaServiceMock }, + ConfigService, + { provide: UserService, useValue: userServiceMock }, + { provide: RoleService, useValue: roleServiceMock }, + AppService, + ], + }).compile(); + + appService = app.get(AppService); + roleService = app.get(RoleService); + userService = app.get(UserService); + }); + + test('load default roles and users on service initialization', async () => { + const role = { + createdAt: new Date(), + description: 'Administrator', + id: '1', + level: 1, + name: 'admin' as const, + updatedAt: new Date(), + }; + + roleServiceMock.findByName.mockResolvedValueOnce(role); + + await expect(appService.onModuleInit()).resolves.not.toThrow(); + + expect(roleService.loadRoles).toHaveBeenCalledTimes(1); + expect(userService.loadAdminUser).toHaveBeenCalledTimes(1); + expect(userService.loadAdminUser).toHaveBeenCalledWith(role, 'qwerty'); + }); +}); diff --git a/apps/backend/src/features/app/app.service.ts b/apps/backend/src/features/app/app.service.ts new file mode 100644 index 00000000..8888b536 --- /dev/null +++ b/apps/backend/src/features/app/app.service.ts @@ -0,0 +1,24 @@ +import { Injectable, OnModuleInit } from '@nestjs/common'; +import { ConfigService } from '@nestjs/config'; +import { RoleService, UserService } from '@snipcode/domain'; + +import { EnvironmentVariables } from '../../configs/environment'; + +@Injectable() +export class AppService implements OnModuleInit { + constructor( + private readonly configService: ConfigService, + private readonly userService: UserService, + private readonly roleService: RoleService, + ) {} + + async onModuleInit(): Promise { + await this.roleService.loadRoles(); + + const adminRole = await this.roleService.findByName('admin'); + + const adminPassword = this.configService.get('ADMIN_PASSWORD'); + + await this.userService.loadAdminUser(adminRole, adminPassword); + } +} diff --git a/apps/backend/src/features/auth/auth.module.ts b/apps/backend/src/features/auth/auth.module.ts new file mode 100644 index 00000000..26d50e0c --- /dev/null +++ b/apps/backend/src/features/auth/auth.module.ts @@ -0,0 +1,10 @@ +import { Module } from '@nestjs/common'; + +import { AuthResolvers } from './graphql/auth.resolvers'; +import { AuthController } from './rest/auth.controller'; +import { GithubService } from './services/github.service'; + +@Module({ + providers: [AuthResolvers, GithubService, AuthController], +}) +export class AuthFeatureModule {} diff --git a/apps/backend/src/features/auth/graphql/auth.integration.spec.ts b/apps/backend/src/features/auth/graphql/auth.integration.spec.ts new file mode 100644 index 00000000..e2bff88c --- /dev/null +++ b/apps/backend/src/features/auth/graphql/auth.integration.spec.ts @@ -0,0 +1,435 @@ +import { PrismaService, RoleService, SessionService, UserService } from '@snipcode/domain'; +import { generateJwtToken, isValidUUIDV4 } from '@snipcode/utils'; +import request from 'supertest'; + +import { TestHelper } from '../../../utils/tests/helpers'; +import { TestServer, startTestServer } from '../../../utils/tests/server'; + +const graphqlEndpoint = '/graphql'; + +describe('Test Authentication', () => { + let server: TestServer; + let testHelper: TestHelper; + let prismaService: PrismaService; + let roleService: RoleService; + let sessionService: SessionService; + let userService: UserService; + + beforeAll(async () => { + server = await startTestServer(); + + prismaService = server.app.get(PrismaService); + roleService = server.app.get(RoleService); + userService = server.app.get(UserService); + sessionService = server.app.get(SessionService); + + testHelper = new TestHelper(prismaService, roleService, userService); + }); + + beforeEach(async () => { + await testHelper.cleanDatabase(); + }); + + afterAll(async () => { + await server.close(); + }); + + test('Register a user', async () => { + const query = ` + mutation SignupUser($input: SignupUserInput!) { + signupUser(input: $input) { + __typename + message + userId + } + } + `; + const variables = { + input: { + email: 'jon.doe@snipcode.dev', + name: 'John Doe', + password: 'password', + }, + }; + + const response = await request(server.app.getHttpServer()) + .post(graphqlEndpoint) + .send({ query, variables }) + .expect(200); + + expect(response.body.data.signupUser).toMatchObject({ + __typename: 'SignupUserResult', + message: 'Account created successfully!', + userId: expect.any(String), + }); + }); + + test('Register a user with an existing email address will returns an error', async () => { + const query = ` + mutation SignupUser($input: SignupUserInput!) { + signupUser(input: $input) { + __typename + message + } + } + `; + const variables = { + input: { + email: 'jon.doe@snipcode.dev', + name: 'John Doe', + password: 'password', + }, + }; + + await testHelper.createTestUser({ email: variables.input.email }); + + const response = await request(server.app.getHttpServer()) + .post(graphqlEndpoint) + .send({ query, variables }) + .expect(200); + + const [error] = response.body.errors; + + expect(error.extensions.code).toEqual('EMAIL_ALREADY_TAKEN'); + expect(error.message).toEqual('The email address is already taken'); + }); + + test('Returns an error when authenticating with bad credentials', async () => { + const query = ` + mutation LoginUser($email: String!, $password: String!) { + loginUser(email: $email, password: $password) { + token + } + } + `; + const variables = { + email: 'jon.doe@example.com', + password: '123456', + }; + + const response = await request(server.app.getHttpServer()) + .post(graphqlEndpoint) + .send({ query, variables }) + .expect(200); + + const [error] = response.body.errors; + + expect(error.extensions.code).toEqual('LOGIN_FAILED'); + expect(error.message).toEqual('Invalid email address or password.'); + }); + + test('Returns a token when authenticating with correct credentials', async () => { + const query = ` + mutation LoginUser($email: String!, $password: String!) { + loginUser(email: $email, password: $password) { + token + } + } + `; + + await testHelper.createTestUser({ + email: 'jane.doe@snipcode.dev', + isEnabled: true, + password: 'password', + role: 'user', + }); + + const variables = { + email: 'jane.doe@snipcode.dev', + password: 'password', + }; + + const response = await request(server.app.getHttpServer()) + .post(graphqlEndpoint) + .send({ query, variables }) + .expect(200); + + const { loginUser } = response.body.data; + + expect(loginUser.token).toBeDefined(); + expect(isValidUUIDV4(loginUser.token)).toBe(true); + + const session = await sessionService.findByToken(loginUser.token); + + expect(session).toBeDefined(); + }); + + test('Returns an error message when trying to authenticate with a disabled account', async () => { + const query = ` + mutation LoginUser($email: String!, $password: String!) { + loginUser(email: $email, password: $password) { + token + } + } + `; + + await testHelper.createTestUser({ + email: 'disabled.user@snipcode.dev', + isEnabled: false, + password: 'password', + role: 'user', + }); + + const variables = { + email: 'disabled.user@snipcode.dev', + password: 'password', + }; + + const response = await request(server.app.getHttpServer()) + .post(graphqlEndpoint) + .send({ query, variables }) + .expect(200); + + const [error] = response.body.errors; + + expect(error.extensions.code).toEqual('ACCOUNT_DISABLED'); + expect(error.message).toEqual('Your account is disabled!'); + }); + + test('Returns when retrieving the authenticated user without an authentication token', async () => { + const authenticatedUserQuery = ` + query AuthenticatedUser { + authenticatedUser { + id + } + } + `; + + const response = await request(server.app.getHttpServer()) + .post(graphqlEndpoint) + .send({ query: authenticatedUserQuery }) + .expect(200); + + const [error] = response.body.errors; + + expect(error.extensions.code).toEqual('UNAUTHENTICATED'); + expect(error.message).toEqual('You must be authenticated to access to this resource.'); + }); + + test('Retrieve the authenticated user', async () => { + const signUpQuery = ` + mutation SignupUser($input: SignupUserInput!) { + signupUser(input: $input) { + __typename + message + userId + } + } + `; + + const signUpVariables = { + input: { + email: 'jon.doe@snipcode.dev', + name: 'John Doe', + password: 'password', + }, + }; + + const signUpResponse = await request(server.app.getHttpServer()) + .post(graphqlEndpoint) + .send({ query: signUpQuery, variables: signUpVariables }) + .expect(200); + + const confirmationToken = generateJwtToken({ + expiresIn: '1h', + payload: { userId: signUpResponse.body.data.signupUser.userId }, + secret: process.env.JWT_SECRET, + }); + + const confirmUserQuery = ` + mutation ConfirmUser($token: String!) { + confirmUser(token: $token) { + message + } + } + `; + + const confirmUserVariables = { + token: confirmationToken, + }; + + await request(server.app.getHttpServer()) + .post(graphqlEndpoint) + .send({ query: confirmUserQuery, variables: confirmUserVariables }) + .expect(200); + + const loginQuery = ` + mutation LoginUser($email: String!, $password: String!) { + loginUser(email: $email, password: $password) { + token + } + } + `; + + const loginVariables = { + email: signUpVariables.input.email, + password: signUpVariables.input.password, + }; + + const loginResponse = await request(server.app.getHttpServer()) + .post(graphqlEndpoint) + .send({ query: loginQuery, variables: loginVariables }) + .expect(200); + + const authToken = loginResponse.body.data.loginUser.token; + + const authenticatedUserQuery = ` + query AuthenticatedUser { + authenticatedUser { + id + name + email + isEnabled + timezone + username + pictureUrl + role { + name + } + rootFolder { + id + name + } + createdAt + oauthProvider + } + } + `; + + const response = await request(server.app.getHttpServer()) + .post(graphqlEndpoint) + .set('Authorization', authToken) + .send({ query: authenticatedUserQuery }) + .expect(200); + + const { authenticatedUser } = response.body.data; + + expect(authenticatedUser).toMatchObject({ + createdAt: expect.any(Number), + email: loginVariables.email, + id: signUpResponse.body.data.signupUser.userId, + isEnabled: true, + name: signUpVariables.input.name, + oauthProvider: 'email', + pictureUrl: null, + role: { + name: 'user', + }, + rootFolder: { + id: expect.any(String), + name: `__${authenticatedUser.id}__`, + }, + timezone: null, + username: expect.any(String), + }); + }); + + test('Log out the authenticated user', async () => { + const signUpQuery = ` + mutation SignupUser($input: SignupUserInput!) { + signupUser(input: $input) { + __typename + message + userId + } + } + `; + + const signUpVariables = { + input: { + email: 'jane.doe@snipcode.dev', + name: 'Jane Doe', + password: 'password', + }, + }; + + const signUpResponse = await request(server.app.getHttpServer()) + .post(graphqlEndpoint) + .send({ query: signUpQuery, variables: signUpVariables }) + .expect(200); + + const confirmationToken = generateJwtToken({ + expiresIn: '1h', + payload: { userId: signUpResponse.body.data.signupUser.userId }, + secret: process.env.JWT_SECRET, + }); + + const confirmUserQuery = ` + mutation ConfirmUser($token: String!) { + confirmUser(token: $token) { + message + } + } + `; + + const confirmUserVariables = { + token: confirmationToken, + }; + + await request(server.app.getHttpServer()) + .post(graphqlEndpoint) + .send({ query: confirmUserQuery, variables: confirmUserVariables }) + .expect(200); + + const loginQuery = ` + mutation LoginUser($email: String!, $password: String!) { + loginUser(email: $email, password: $password) { + token + } + } + `; + + const loginVariables = { + email: signUpVariables.input.email, + password: signUpVariables.input.password, + }; + + const loginResponse = await request(server.app.getHttpServer()) + .post(graphqlEndpoint) + .send({ query: loginQuery, variables: loginVariables }) + .expect(200); + + const authToken = loginResponse.body.data.loginUser.token; + + const authenticatedUserQuery = ` + query AuthenticatedUser { + authenticatedUser { + id + } + } + `; + + const response = await request(server.app.getHttpServer()) + .post(graphqlEndpoint) + .set('Authorization', authToken) + .send({ query: authenticatedUserQuery }) + .expect(200); + + const { authenticatedUser } = response.body.data; + + expect(authenticatedUser.id).toEqual(signUpResponse.body.data.signupUser.userId); + + const logoutQuery = ` + mutation LogoutUser { + logoutUser + } + `; + + await request(server.app.getHttpServer()) + .post(graphqlEndpoint) + .set('Authorization', authToken) + .send({ query: logoutQuery }) + .expect(200); + + const afterLogoutResponse = await request(server.app.getHttpServer()) + .post(graphqlEndpoint) + .set('Authorization', authToken) + .send({ query: authenticatedUserQuery }) + .expect(200); + + const [error] = afterLogoutResponse.body.errors; + + expect(error.extensions.code).toEqual('UNAUTHENTICATED'); + expect(error.message).toEqual('You must be authenticated to access to this resource.'); + }); +}); diff --git a/apps/backend/src/features/auth/graphql/auth.resolvers.ts b/apps/backend/src/features/auth/graphql/auth.resolvers.ts new file mode 100644 index 00000000..b66ceda4 --- /dev/null +++ b/apps/backend/src/features/auth/graphql/auth.resolvers.ts @@ -0,0 +1,144 @@ +import { UseGuards } from '@nestjs/common'; +import { ConfigService } from '@nestjs/config'; +import { Args, Context, Mutation, Parent, Query, ResolveField, Resolver } from '@nestjs/graphql'; +import { + CreateSessionInput, + CreateUserInput, + CreateUserRootFolderInput, + Folder, + FolderService, + Role, + RoleService, + SessionService, + User, + UserService, +} from '@snipcode/domain'; +import { AppError, addDayToDate, errors, verifyJwtToken } from '@snipcode/utils'; + +import { AuthGuard, UserId } from '../../../configs/auth.guard'; +import { EnvironmentVariables } from '../../../configs/environment'; +import { GraphQLContext } from '../../../types/common'; +import { ConfirmUserResult, LoginResult, SignupUserInput, SignupUserResult } from '../../../types/graphql.schema'; +import { AUTH_USER_NOT_FOUND, AUTH_USER_NOT_FOUND_CODE } from '../../../utils/constants'; +import { GraphQLAppError } from '../../../utils/errors'; + +@Resolver('User') +export class AuthResolvers { + constructor( + private readonly configService: ConfigService, + private readonly roleService: RoleService, + private readonly userService: UserService, + private readonly sessionService: SessionService, + private readonly folderService: FolderService, + ) {} + + @Query('authenticatedUser') + @UseGuards(AuthGuard) + async authenticatedUser(@Context() context: GraphQLContext): Promise { + const { userId } = context.req; + + if (!userId) { + throw new GraphQLAppError(AUTH_USER_NOT_FOUND, AUTH_USER_NOT_FOUND_CODE); + } + + const user = await this.userService.findById(userId); + + if (!user) { + throw new GraphQLAppError(AUTH_USER_NOT_FOUND, AUTH_USER_NOT_FOUND_CODE); + } + + return user; + } + + @Mutation('loginUser') + async loginUser(@Args('email') email: string, @Args('password') password: string): Promise { + const user = await this.userService.login(email, password); + + const sessionLifetime = this.configService.get('SESSION_LIFETIME'); + + const sessionInput = new CreateSessionInput({ + expireDate: addDayToDate(new Date(), sessionLifetime), + userId: user.id, + }); + + const session = await this.sessionService.create(sessionInput); + + return { token: session.token }; + } + + @Mutation('logoutUser') + @UseGuards(AuthGuard) + async logoutUser(@UserId() userId: string | undefined): Promise { + console.log('user logged out', userId); + + if (!userId) { + return false; + } + + await this.sessionService.deleteUserSessions(userId); + + return true; + } + + @Mutation('signupUser') + async signupUser(@Args('input') input: SignupUserInput): Promise { + const { email, name, password } = input; + + const role = await this.roleService.findByName('user'); + + const createUserInput = new CreateUserInput({ + email, + name, + oauthProvider: 'email', + password, + pictureUrl: null, + roleId: role.id, + timezone: null, + username: null, + }); + + const user = await this.userService.create(createUserInput); + + const createUserRootFolderDto = new CreateUserRootFolderInput(user.id); + + await this.folderService.createUserRootFolder(createUserRootFolderDto); + + // TODO published user created event + + return { message: 'Account created successfully!', userId: user.id }; + } + + @Mutation('confirmUser') + async confirmUser(@Args('token') token: string): Promise { + const decodedToken = verifyJwtToken<{ userId: string }>({ secret: this.configService.get('JWT_SECRET'), token }); + + if (!decodedToken) { + throw new AppError(errors.INVALID_CONFIRMATION_TOKEN, 'INVALID_CONFIRMATION_TOKEN'); + } + + const user = await this.userService.findById(decodedToken.userId); + + if (!user) { + throw new AppError(errors.USER_NOT_FOUND_FROM_TOKEN, 'USER_NOT_FOUND'); + } + + await this.userService.activate(user.id); + + return { message: 'Email confirmed' }; + } + + @ResolveField() + async folders(@Parent() user: User): Promise { + return this.folderService.findUserFolders(user.id); + } + + @ResolveField() + async role(@Parent() user: User): Promise { + return this.roleService.findById(user.roleId); + } + + @ResolveField() + async rootFolder(@Parent() user: User): Promise { + return this.folderService.findUserRootFolder(user.id); + } +} diff --git a/apps/backend/src/features/auth/graphql/schema.graphql b/apps/backend/src/features/auth/graphql/schema.graphql new file mode 100644 index 00000000..d849716d --- /dev/null +++ b/apps/backend/src/features/auth/graphql/schema.graphql @@ -0,0 +1,29 @@ +type LoginResult { + token: String! +} + +input SignupUserInput { + email: String! + name: String! + password: String! +} + +type SignupUserResult { + message: String! + userId: String! +} + +type ConfirmUserResult { + message: String! +} + +type Query { + authenticatedUser: User! +} + +type Mutation { + loginUser(email: String!, password: String!): LoginResult! + logoutUser: Boolean! + signupUser(input: SignupUserInput!): SignupUserResult! + confirmUser(token: String!): ConfirmUserResult! +} diff --git a/apps/backend/src/features/auth/rest/auth.controller.ts b/apps/backend/src/features/auth/rest/auth.controller.ts new file mode 100644 index 00000000..7a17e46c --- /dev/null +++ b/apps/backend/src/features/auth/rest/auth.controller.ts @@ -0,0 +1,87 @@ +import { Controller, Get, Logger, Query, Res } from '@nestjs/common'; +import { ConfigService } from '@nestjs/config'; +import { + CreateSessionInput, + CreateUserRootFolderInput, + FolderService, + RoleService, + SessionService, + UserService, +} from '@snipcode/domain'; +import { addDayToDate, errors } from '@snipcode/utils'; +import { Response } from 'express'; + +import { EnvironmentVariables } from '../../../configs/environment'; +import { AUTH_SUCCESS_URL } from '../../../utils/constants'; +import { GithubService } from '../services/github.service'; + +@Controller('auth') +export class AuthController { + private readonly logger = new Logger(AuthController.name); + + constructor( + private readonly configService: ConfigService, + private readonly githubService: GithubService, + private readonly userService: UserService, + private readonly roleService: RoleService, + private readonly folderService: FolderService, + private readonly sessionService: SessionService, + ) {} + + @Get('github/callback') + async authenticateWithGitHub(@Query('code') requestToken: string, @Res() res: Response): Promise { + const sessionLifetime = this.configService.get('SESSION_LIFETIME'); + const webAuthSuccessUrl = this.configService.get('WEB_AUTH_SUCCESS_URL'); + const webAuthErrorUrl = this.configService.get('WEB_AUTH_ERROR_URL'); + + const authResponse = await this.githubService.requestAccessTokenFromCode(requestToken); + + const { access_token } = authResponse.data; + + const userResponse = await this.githubService.retrieveGitHubUserData(access_token); + + const userExist = await this.userService.findByEmail(userResponse.data.email); + + if (userExist) { + const sessionInput = new CreateSessionInput({ + expireDate: addDayToDate(new Date(), sessionLifetime), + userId: userExist.id, + }); + const session = await this.sessionService.create(sessionInput); + + const updateUserInput = this.githubService.generateUserUpdateInputFromGitHubData(userExist, userResponse.data); + + await this.userService.update(userExist, updateUserInput); + + return res.redirect(AUTH_SUCCESS_URL(webAuthSuccessUrl, session.token)); + } + + const roleUser = await this.roleService.findByName('user'); + + if (!roleUser) { + this.logger.error(`GitHub Authentication: ${errors.ROLE_USER_NOT_FOUND}`); + + return res.redirect(webAuthErrorUrl); + } + + const createUserInput = this.githubService.generateUserRegistrationInputFromGitHubData( + userResponse.data, + roleUser.id, + ); + + const createdUser = await this.userService.create(createUserInput); + + const createUserRootFolderInput = new CreateUserRootFolderInput(createdUser.id); + + await this.folderService.createUserRootFolder(createUserRootFolderInput); + + const sessionInput = new CreateSessionInput({ + expireDate: addDayToDate(new Date(), sessionLifetime), + userId: createdUser.id, + }); + + const session = await this.sessionService.create(sessionInput); + + return res.redirect(AUTH_SUCCESS_URL(webAuthSuccessUrl, session.token)); + } +} diff --git a/apps/backend/src/features/auth/services/github.service.ts b/apps/backend/src/features/auth/services/github.service.ts new file mode 100644 index 00000000..66cbef3a --- /dev/null +++ b/apps/backend/src/features/auth/services/github.service.ts @@ -0,0 +1,75 @@ +import { Injectable } from '@nestjs/common'; +import { ConfigService } from '@nestjs/config'; +import { CreateUserInput, UpdateUserInput, User } from '@snipcode/domain'; +import axios, { AxiosInstance, AxiosRequestConfig } from 'axios'; + +import { EnvironmentVariables } from '../../../configs/environment'; +import { GitHubUserResponse } from '../types'; + +const GITHUB_AUTH_URL = 'https://github.com/login/oauth/access_token'; +const GITHUB_API_USER_PROFILE_URL = 'https://api.github.com/user'; + +@Injectable() +export class GithubService { + private httpClient: AxiosInstance = axios.create(); + + constructor(private readonly configService: ConfigService) {} + + async requestAccessTokenFromCode(code: string) { + const authQueryObject = { + client_id: this.configService.get('GITHUB_CLIENT_ID'), + client_secret: this.configService.get('GITHUB_CLIENT_SECRET'), + code, + }; + const requestConfig: AxiosRequestConfig = { + headers: { + accept: 'application/json', + }, + }; + const requestBody = {}; + + const authQueryString = new URLSearchParams(Object.entries(authQueryObject)).toString(); + + return this.httpClient.post(`${GITHUB_AUTH_URL}?${authQueryString}`, requestBody, requestConfig); + } + + async retrieveGitHubUserData(accessToken: string) { + const requestConfig: AxiosRequestConfig = { + headers: { + Authorization: `token ${accessToken}`, + }, + }; + + return this.httpClient.get(GITHUB_API_USER_PROFILE_URL, requestConfig); + } + + generateUserRegistrationInputFromGitHubData = (data: GitHubUserResponse, roleId: string): CreateUserInput => { + const { avatar_url, email, login, name } = data; + + const createUserInput = new CreateUserInput({ + email, + name, + oauthProvider: 'github', + pictureUrl: avatar_url, + roleId, + timezone: null, + username: login, + }); + + createUserInput.isEnabled = true; + + return createUserInput; + }; + + generateUserUpdateInputFromGitHubData = (user: User, data: GitHubUserResponse): UpdateUserInput => { + const { avatar_url, name } = data; + + return new UpdateUserInput({ + name, + oauthProvider: 'github', + pictureUrl: avatar_url, + roleId: user.roleId, + timezone: user.timezone, + }); + }; +} diff --git a/apps/core/src/types/auth.ts b/apps/backend/src/features/auth/types.ts similarity index 100% rename from apps/core/src/types/auth.ts rename to apps/backend/src/features/auth/types.ts diff --git a/apps/backend/src/features/folders/folder.module.ts b/apps/backend/src/features/folders/folder.module.ts new file mode 100644 index 00000000..b873bbec --- /dev/null +++ b/apps/backend/src/features/folders/folder.module.ts @@ -0,0 +1,8 @@ +import { Module } from '@nestjs/common'; + +import { FolderResolvers } from './graphql/folder.resolvers'; + +@Module({ + providers: [FolderResolvers], +}) +export class FolderFeatureModule {} diff --git a/apps/backend/src/features/folders/graphql/folder.resolvers.ts b/apps/backend/src/features/folders/graphql/folder.resolvers.ts new file mode 100644 index 00000000..fa16251f --- /dev/null +++ b/apps/backend/src/features/folders/graphql/folder.resolvers.ts @@ -0,0 +1,117 @@ +import { UseGuards } from '@nestjs/common'; +import { Args, Mutation, Parent, Query, ResolveField, Resolver } from '@nestjs/graphql'; +import { + CreateFolderInput, + Folder, + FolderService, + Snippet, + SnippetService, + UpdateFolderInput, + User, + UserService, +} from '@snipcode/domain'; + +import { AuthGuard, UserId } from '../../../configs/auth.guard'; +import { + CreateFolderInput as CreateFolderInputBody, + Directory as DirectoryGenerated, + UpdateFolderInput as UpdateFolderInputBody, +} from '../../../types/graphql.schema'; + +type Directory = Omit & { + folders: Folder[]; + paths: Folder[]; + snippets: Snippet[]; +}; + +@Resolver('Folder') +export class FolderResolvers { + constructor( + private readonly folderService: FolderService, + private readonly snippetService: SnippetService, + private readonly userService: UserService, + ) {} + + @Mutation('createFolder') + @UseGuards(AuthGuard) + async createFolder(@UserId() userId: string, @Args('input') input: CreateFolderInputBody): Promise { + const { name, parentId } = input; + + const createFolderInput = new CreateFolderInput({ name, parentId, userId }); + + return this.folderService.create(createFolderInput); + } + + @Mutation('updateFolder') + @UseGuards(AuthGuard) + async updateFolder( + @UserId() userId: string, + @Args('id') id: string, + @Args('input') input: UpdateFolderInputBody, + ): Promise { + const updateFolderInput = new UpdateFolderInput({ + creatorId: userId, + folderId: id, + name: input.name, + }); + + return this.folderService.update(updateFolderInput); + } + + @Mutation('deleteFolders') + @UseGuards(AuthGuard) + async deleteFolders(@UserId() userId: string, @Args('folderIds') folderIds: string[]): Promise { + await this.folderService.deleteMany(folderIds, userId); + + return true; + } + + @Query('listFolders') + @UseGuards(AuthGuard) + async listFolders(@UserId() userId: string, @Args('folderId') folderId: string): Promise { + return this.folderService.findSubFolders(userId, folderId); + } + + @Query('listDirectory') + @UseGuards(AuthGuard) + async listDirectory(@UserId() userId: string, @Args('folderId') folderId: string): Promise { + const folders = await this.folderService.findSubFolders(userId, folderId); + const snippets = await this.snippetService.findByFolder(folderId); + const paths = await this.folderService.generateBreadcrumb(folderId); + + return { + folders, + paths, + snippets, + }; + } + + @Query('findFolder') + @UseGuards(AuthGuard) + async findFolder(@Args('folderId') folderId: string): Promise { + return this.folderService.findById(folderId); + } + + @ResolveField() + async parent(@Parent() folder: Folder): Promise { + return this.folderService.findById(folder.id); + } + + @ResolveField() + async user(@Parent() folder: Folder): Promise { + return this.userService.findById(folder.userId); + } + + @ResolveField() + async subFolders(@Parent() folder: Folder): Promise { + return this.folderService.findSubFolders(folder.userId, folder.id); + } + + @ResolveField() + async subFoldersCount(@Parent() folder: Folder): Promise { + const folders = await this.folderService.findSubFolders(folder.userId, folder.id); + const snippets = await this.snippetService.findByFolder(folder.id); + + return folders.length + snippets.length; + } +} diff --git a/apps/backend/src/features/folders/graphql/schema.graphql b/apps/backend/src/features/folders/graphql/schema.graphql new file mode 100644 index 00000000..02b2ef18 --- /dev/null +++ b/apps/backend/src/features/folders/graphql/schema.graphql @@ -0,0 +1,26 @@ +type Directory { + folders: [Folder!]! + snippets: [Snippet!]! + paths: [Folder!]! +} + +input CreateFolderInput { + parentId: String! + name: String! +} + +input UpdateFolderInput { + name: String! +} + +type Mutation { + createFolder(input: CreateFolderInput!): Folder! + deleteFolders(folderIds: [String!]!): Boolean! + updateFolder(id: ID!, input: UpdateFolderInput!): Folder! +} + +type Query { + listFolders(folderId: String): [Folder!]! + findFolder(folderId: String!): Folder! + listDirectory(folderId: String!): Directory +} diff --git a/apps/backend/src/features/schema.graphql b/apps/backend/src/features/schema.graphql new file mode 100644 index 00000000..06fcbe51 --- /dev/null +++ b/apps/backend/src/features/schema.graphql @@ -0,0 +1,79 @@ +scalar Date + +enum RoleName { + user + admin +} + +enum OauthProvider { + email + github + stackoverflow + twitter +} + +enum SnippetVisibility { + public + private +} + +type Role { + id: ID! + name: RoleName! + level: Int! + description: String + createdAt: Date! + updatedAt: Date! +} + +type User { + id: ID! + email: String! + username: String + name: String! + timezone: String + isEnabled: Boolean! + pictureUrl: String + role: Role! + oauthProvider: OauthProvider + createdAt: Date! + updatedAt: Date! + rootFolder: Folder! + folders: [Folder!]! +} + +type Folder { + id: ID! + name: String! + isFavorite: Boolean! + createdAt: Date! + updatedAt: Date! + user: User! + parent: Folder + subFolders: [Folder!]! + subFoldersCount: Int! +} + +type Snippet { + id: ID! + name: String! + content: String! + contentHighlighted: String! + language: String! + lineHighlight: String + size: Int! + visibility: SnippetVisibility! + description: String + theme: String! + createdAt: Date! + updatedAt: Date! + folder: Folder! + user: User! +} + +type Query { + ping: String + @deprecated( + reason: "https://stackoverflow.com/questions/59868942/graphql-a-schema-must-have-a-query-operation-defined" + ) +} diff --git a/apps/backend/src/features/snippets/graphql/schema.graphql b/apps/backend/src/features/snippets/graphql/schema.graphql new file mode 100644 index 00000000..9819b7a4 --- /dev/null +++ b/apps/backend/src/features/snippets/graphql/schema.graphql @@ -0,0 +1,58 @@ +enum SnippetSortMethod { + recently_created + recently_updated +} + +type SnippetInfo { + snippet: Snippet! + paths: [Folder!]! +} + +type PublicSnippetsResult { + items: [Snippet!]! + hasMore: Boolean! + itemPerPage: Int + nextToken: String +} + +input CreateSnippetInput { + folderId: String! + name: String! + content: String! + contentHighlighted: String! + language: String! + lineHighlight: String + visibility: SnippetVisibility! + description: String + theme: String! +} + +input UpdateSnippetInput { + name: String! + content: String! + contentHighlighted: String! + language: String! + lineHighlight: String + visibility: SnippetVisibility! + description: String + theme: String! +} + +input PublicSnippetsInput { + nextToken: String + itemPerPage: Int + sortMethod: SnippetSortMethod + keyword: String +} + +type Mutation { + createSnippet(input: CreateSnippetInput!): Snippet! + updateSnippet(id: ID!, input: UpdateSnippetInput!): Snippet! + deleteSnippet(id: ID!): Boolean! +} + +type Query { + publicSnippets(input: PublicSnippetsInput!): PublicSnippetsResult! + mySnippets: [Snippet!]! + findSnippet(snippetId: String!): SnippetInfo! +} diff --git a/apps/backend/src/features/snippets/graphql/snippet.resolvers.ts b/apps/backend/src/features/snippets/graphql/snippet.resolvers.ts new file mode 100644 index 00000000..9f765a7a --- /dev/null +++ b/apps/backend/src/features/snippets/graphql/snippet.resolvers.ts @@ -0,0 +1,148 @@ +import { UseGuards } from '@nestjs/common'; +import { Args, Mutation, Parent, Query, ResolveField, Resolver } from '@nestjs/graphql'; +import { + CreateSnippetInput, + DeleteSnippetInput, + Folder, + FolderService, + Snippet, + SnippetService, + UpdateSnippetInput, + User, + UserService, +} from '@snipcode/domain'; + +import { AuthGuard, UserId } from '../../../configs/auth.guard'; +import { + CreateSnippetInput as CreateSnippetInputBody, + PublicSnippetsInput, + PublicSnippetsResult as PublicSnippetsResultGenerated, + SnippetInfo as SnippetInfoGenerated, + UpdateSnippetInput as UpdateSnippetInputBody, +} from '../../../types/graphql.schema'; + +type SnippetInfo = Omit & { + paths: Folder[]; + snippet: Snippet; +}; + +type PublicSnippetsResult = Omit & { + items: Snippet[]; +}; + +@Resolver('Snippet') +export class SnippetResolvers { + constructor( + private readonly snippetService: SnippetService, + private readonly folderService: FolderService, + private readonly userService: UserService, + ) {} + + @Mutation('createSnippet') + @UseGuards(AuthGuard) + async createSnippet(@UserId() userId: string, @Args('input') input: CreateSnippetInputBody): Promise { + const createSnippetInput = new CreateSnippetInput({ + content: input.content, + contentHighlighted: input.contentHighlighted, + description: input.description ?? null, + folderId: input.folderId, + language: input.language, + lineHighlight: input.lineHighlight ?? null, + name: input.name, + theme: input.theme, + userId, + visibility: input.visibility, + }); + + return this.snippetService.create(createSnippetInput); + } + + @Mutation('updateSnippet') + @UseGuards(AuthGuard) + async updateSnippet( + @UserId() userId: string, + @Args('id') id: string, + @Args('input') input: UpdateSnippetInputBody, + ): Promise { + const updateSnippetInput = new UpdateSnippetInput({ + content: input.content, + contentHighlighted: input.contentHighlighted, + creatorId: userId, + description: input.description ?? null, + language: input.language, + lineHighlight: input.lineHighlight ?? null, + name: input.name, + snippetId: id, + theme: input.theme, + visibility: input.visibility, + }); + + return this.snippetService.update(updateSnippetInput); + } + + @Mutation('deleteSnippet') + @UseGuards(AuthGuard) + async deleteSnippets(@UserId() userId: string, @Args('id') id: string): Promise { + const deleteSnippetInput = new DeleteSnippetInput({ + creatorId: userId, + snippetId: id, + }); + + await this.snippetService.delete(deleteSnippetInput); + + return true; + } + + @Query('findSnippet') + @UseGuards(AuthGuard) + async findSnippet(@Args('snippetId') snippetId: string): Promise { + const snippet = await this.snippetService.findById(snippetId); + const paths = await this.folderService.generateBreadcrumb(snippet.folderId); + + return { + paths, + snippet, + }; + } + + @Query('mySnippets') + @UseGuards(AuthGuard) + async mySnippets(@UserId() userId: string): Promise { + return this.snippetService.findByUser(userId); + } + + @Query('publicSnippets') + @UseGuards(AuthGuard) + async publicSnippets(@Args('input') input: PublicSnippetsInput): Promise { + const { itemPerPage, keyword, nextToken, sortMethod } = input; + + const result = await this.snippetService.findPublicSnippet({ + cursor: nextToken, + itemPerPage: itemPerPage ?? 10, + keyword: keyword ?? undefined, + sortMethod: sortMethod ?? 'recently_created', + }); + + return { + hasMore: result.hasMore, + itemPerPage, + items: result.items, + nextToken: result.nextCursor, + }; + } + + @ResolveField() + async folder(@Parent() snippet: Snippet): Promise { + return this.folderService.findById(snippet.folderId); + } + + @ResolveField() + async user(@Parent() snippet: Snippet): Promise { + return this.userService.findById(snippet.userId); + } + + @ResolveField() + async contentHighlighted(@Parent() snippet: Snippet): Promise { + return snippet.contentHtml; + } +} diff --git a/apps/backend/src/features/snippets/rest/snippet.controller.ts b/apps/backend/src/features/snippets/rest/snippet.controller.ts new file mode 100644 index 00000000..e810edfd --- /dev/null +++ b/apps/backend/src/features/snippets/rest/snippet.controller.ts @@ -0,0 +1,28 @@ +import { Controller, Get, Param } from '@nestjs/common'; +import { ConfigService } from '@nestjs/config'; +import { SnippetService } from '@snipcode/domain'; +import { OEmbedResult, generateOembedMetadata } from '@snipcode/embed'; + +import { EnvironmentVariables } from '../../../configs/environment'; + +@Controller('snippets') +export class SnippetController { + constructor( + private readonly configService: ConfigService, + private readonly snippetService: SnippetService, + ) {} + + @Get(':id/oembed') + async generateOembed(@Param('id') id: string): Promise { + const snippet = await this.snippetService.findById(id); + + return generateOembedMetadata({ + snippet: { + id: snippet.id, + name: snippet.name, + }, + snippetRendererURL: this.configService.get('SNIPPET_RENDERER_API_URL'), + webAppURL: this.configService.get('WEB_APP_URL'), + }); + } +} diff --git a/apps/backend/src/features/snippets/snippet.module.ts b/apps/backend/src/features/snippets/snippet.module.ts new file mode 100644 index 00000000..238ece49 --- /dev/null +++ b/apps/backend/src/features/snippets/snippet.module.ts @@ -0,0 +1,9 @@ +import { Module } from '@nestjs/common'; + +import { SnippetResolvers } from './graphql/snippet.resolvers'; +import { SnippetController } from './rest/snippet.controller'; + +@Module({ + providers: [SnippetResolvers, SnippetController], +}) +export class SnippetFeatureModule {} diff --git a/apps/backend/src/features/users/graphql/schema.graphql b/apps/backend/src/features/users/graphql/schema.graphql new file mode 100644 index 00000000..db822a88 --- /dev/null +++ b/apps/backend/src/features/users/graphql/schema.graphql @@ -0,0 +1,11 @@ +type SubscribeToNewsletterResult { + message: String! +} + +type Mutation { + subscribeToNewsletter(email: String!): SubscribeToNewsletterResult! +} + +type Query { + hello: String! @deprecated +} diff --git a/apps/backend/src/features/users/graphql/user.resolvers.ts b/apps/backend/src/features/users/graphql/user.resolvers.ts new file mode 100644 index 00000000..d4d24394 --- /dev/null +++ b/apps/backend/src/features/users/graphql/user.resolvers.ts @@ -0,0 +1,24 @@ +import { ConfigService } from '@nestjs/config'; +import { Args, Mutation, Resolver } from '@nestjs/graphql'; +import { NewsletterService } from '@snipcode/domain'; + +import { EnvironmentVariables } from '../../../configs/environment'; +import { SubscribeToNewsletterResult } from '../../../types/graphql.schema'; +import { NEWSLETTER_SUBSCRIBE_SUCCESS } from '../../../utils/constants'; + +@Resolver('User') +export class UserResolvers { + constructor( + private readonly configService: ConfigService, + private readonly newsletterService: NewsletterService, + ) {} + + @Mutation() + async subscribeToNewsletter(@Args('email') email: string): Promise { + const convertKitTagId = this.configService.get('CONVERTKIT_TAG_ID'); + + await this.newsletterService.subscribe(email, [convertKitTagId]); + + return { message: NEWSLETTER_SUBSCRIBE_SUCCESS }; + } +} diff --git a/apps/backend/src/features/users/user.module.ts b/apps/backend/src/features/users/user.module.ts new file mode 100644 index 00000000..d82ffb68 --- /dev/null +++ b/apps/backend/src/features/users/user.module.ts @@ -0,0 +1,8 @@ +import { Module } from '@nestjs/common'; + +import { UserResolvers } from './graphql/user.resolvers'; + +@Module({ + providers: [UserResolvers], +}) +export class UserFeatureModule {} diff --git a/apps/backend/src/main.ts b/apps/backend/src/main.ts new file mode 100644 index 00000000..8507fd67 --- /dev/null +++ b/apps/backend/src/main.ts @@ -0,0 +1,24 @@ +import './configs/instrument'; + +import { Logger } from '@nestjs/common'; +import { ConfigService } from '@nestjs/config'; + +import { setupAppServer } from './server'; +import { EnvironmentVariables } from './types/common'; + +const bootstrap = async () => { + const logger = new Logger('NestApplication'); + + const app = await setupAppServer({ logger }); + + const configService = app.get(ConfigService); + + const port = configService.get('PORT'); + const host = configService.get('HOST'); + + await app.listen(port, () => { + logger.log(`Application ready at ${host}:${port}/graphql`); + }); +}; + +void bootstrap(); diff --git a/apps/backend/src/server.ts b/apps/backend/src/server.ts new file mode 100644 index 00000000..98b89281 --- /dev/null +++ b/apps/backend/src/server.ts @@ -0,0 +1,32 @@ +import { INestApplication, LoggerService } from '@nestjs/common'; +import { ConfigService } from '@nestjs/config'; +import { HttpAdapterHost, NestFactory } from '@nestjs/core'; +import * as Sentry from '@sentry/node'; + +import { AppModule } from './app.module'; +import { EnvironmentVariables } from './configs/environment'; +import { ApplicationExceptionFilter } from './configs/exception.filter'; +import { CORS_APOLLO_STUDIO_URL } from './utils/constants'; + +export const setupAppServer = async ({ + logger: loggerService, +}: { + logger?: LoggerService | false; +}): Promise => { + const app = await NestFactory.create(AppModule, { logger: loggerService }); + + const { httpAdapter } = app.get(HttpAdapterHost); + + Sentry.setupNestErrorHandler(app, new ApplicationExceptionFilter(httpAdapter)); + + const configService = app.get(ConfigService); + + app.enableCors({ + credentials: true, + origin: [configService.get('WEB_APP_URL'), CORS_APOLLO_STUDIO_URL], + }); + + app.enableShutdownHooks(); + + return app; +}; diff --git a/apps/backend/src/types/common.ts b/apps/backend/src/types/common.ts new file mode 100644 index 00000000..b10ec60e --- /dev/null +++ b/apps/backend/src/types/common.ts @@ -0,0 +1,7 @@ +import { Request } from 'express'; + +export type { EnvironmentVariables } from '../configs/environment'; + +export type GraphQLContext = { + req: Request & { userId?: string }; +}; diff --git a/apps/backend/src/types/graphql.schema.ts b/apps/backend/src/types/graphql.schema.ts new file mode 100644 index 00000000..3e8ae16a --- /dev/null +++ b/apps/backend/src/types/graphql.schema.ts @@ -0,0 +1,187 @@ +/* + * ------------------------------------------------------- + * THIS FILE WAS AUTOMATICALLY GENERATED (DO NOT MODIFY) + * ------------------------------------------------------- + */ + +/* tslint:disable */ +/* eslint-disable */ +export type RoleName = 'user' | 'admin'; +export type OauthProvider = 'email' | 'github' | 'stackoverflow' | 'twitter'; +export type SnippetVisibility = 'public' | 'private'; +export type SnippetSortMethod = 'recently_created' | 'recently_updated'; + +export interface SignupUserInput { + email: string; + name: string; + password: string; +} + +export interface CreateFolderInput { + parentId: string; + name: string; +} + +export interface UpdateFolderInput { + name: string; +} + +export interface CreateSnippetInput { + folderId: string; + name: string; + content: string; + contentHighlighted: string; + language: string; + lineHighlight?: Nullable; + visibility: SnippetVisibility; + description?: Nullable; + theme: string; +} + +export interface UpdateSnippetInput { + name: string; + content: string; + contentHighlighted: string; + language: string; + lineHighlight?: Nullable; + visibility: SnippetVisibility; + description?: Nullable; + theme: string; +} + +export interface PublicSnippetsInput { + nextToken?: Nullable; + itemPerPage?: Nullable; + sortMethod?: Nullable; + keyword?: Nullable; +} + +export interface LoginResult { + __typename?: 'LoginResult'; + token: string; +} + +export interface SignupUserResult { + __typename?: 'SignupUserResult'; + message: string; + userId: string; +} + +export interface ConfirmUserResult { + __typename?: 'ConfirmUserResult'; + message: string; +} + +export interface IQuery { + __typename?: 'IQuery'; + authenticatedUser(): User | Promise; + listFolders(folderId?: Nullable): Folder[] | Promise; + findFolder(folderId: string): Folder | Promise; + listDirectory(folderId: string): Nullable | Promise>; + ping(): Nullable | Promise>; + publicSnippets(input: PublicSnippetsInput): PublicSnippetsResult | Promise; + mySnippets(): Snippet[] | Promise; + findSnippet(snippetId: string): SnippetInfo | Promise; + hello(): string | Promise; +} + +export interface IMutation { + __typename?: 'IMutation'; + loginUser(email: string, password: string): LoginResult | Promise; + logoutUser(): boolean | Promise; + signupUser(input: SignupUserInput): SignupUserResult | Promise; + confirmUser(token: string): ConfirmUserResult | Promise; + createFolder(input: CreateFolderInput): Folder | Promise; + deleteFolders(folderIds: string[]): boolean | Promise; + updateFolder(id: string, input: UpdateFolderInput): Folder | Promise; + createSnippet(input: CreateSnippetInput): Snippet | Promise; + updateSnippet(id: string, input: UpdateSnippetInput): Snippet | Promise; + deleteSnippet(id: string): boolean | Promise; + subscribeToNewsletter(email: string): SubscribeToNewsletterResult | Promise; +} + +export interface Directory { + __typename?: 'Directory'; + folders: Folder[]; + snippets: Snippet[]; + paths: Folder[]; +} + +export interface Role { + __typename?: 'Role'; + id: string; + name: RoleName; + level: number; + description?: Nullable; + createdAt: Date; + updatedAt: Date; +} + +export interface User { + __typename?: 'User'; + id: string; + email: string; + username?: Nullable; + name: string; + timezone?: Nullable; + isEnabled: boolean; + pictureUrl?: Nullable; + role: Role; + oauthProvider?: Nullable; + createdAt: Date; + updatedAt: Date; + rootFolder: Folder; + folders: Folder[]; +} + +export interface Folder { + __typename?: 'Folder'; + id: string; + name: string; + isFavorite: boolean; + createdAt: Date; + updatedAt: Date; + user: User; + parent?: Nullable; + subFolders: Folder[]; + subFoldersCount: number; +} + +export interface Snippet { + __typename?: 'Snippet'; + id: string; + name: string; + content: string; + contentHighlighted: string; + language: string; + lineHighlight?: Nullable; + size: number; + visibility: SnippetVisibility; + description?: Nullable; + theme: string; + createdAt: Date; + updatedAt: Date; + folder: Folder; + user: User; +} + +export interface SnippetInfo { + __typename?: 'SnippetInfo'; + snippet: Snippet; + paths: Folder[]; +} + +export interface PublicSnippetsResult { + __typename?: 'PublicSnippetsResult'; + items: Snippet[]; + hasMore: boolean; + itemPerPage?: Nullable; + nextToken?: Nullable; +} + +export interface SubscribeToNewsletterResult { + __typename?: 'SubscribeToNewsletterResult'; + message: string; +} + +type Nullable = T | null; diff --git a/apps/core/src/utils/constants.ts b/apps/backend/src/utils/constants.ts similarity index 73% rename from apps/core/src/utils/constants.ts rename to apps/backend/src/utils/constants.ts index f29062d1..aeff5b03 100644 --- a/apps/core/src/utils/constants.ts +++ b/apps/backend/src/utils/constants.ts @@ -7,3 +7,7 @@ export const NEWSLETTER_SUBSCRIBE_SUCCESS = 'Subscribed to the newsletter succes export const AUTH_USER_NOT_FOUND = 'The authenticated user not found'; export const AUTH_USER_NOT_FOUND_CODE = 'AUTH_USER_NOT_FOUND'; + +export const AUTH_SUCCESS_URL = (webAuthSuccessUrl: string, sessionToken: string): string => { + return `${webAuthSuccessUrl}?token=${sessionToken}`; +}; diff --git a/apps/backend/src/utils/environment.ts b/apps/backend/src/utils/environment.ts new file mode 100644 index 00000000..7c577011 --- /dev/null +++ b/apps/backend/src/utils/environment.ts @@ -0,0 +1,2 @@ +export const IS_PROD = process.env.NODE_ENV === 'production'; +export const IS_DEV = process.env.NODE_ENV === 'development'; diff --git a/apps/backend/src/utils/errors.ts b/apps/backend/src/utils/errors.ts new file mode 100644 index 00000000..892af668 --- /dev/null +++ b/apps/backend/src/utils/errors.ts @@ -0,0 +1,11 @@ +import { GraphQLError } from 'graphql'; + +export class GraphQLAppError extends GraphQLError { + constructor(message: string, code: string) { + const enhancedExtension: Record = { + extensions: { code }, + }; + + super(message, enhancedExtension); + } +} diff --git a/apps/backend/src/utils/graphql/date-scalar.ts b/apps/backend/src/utils/graphql/date-scalar.ts new file mode 100644 index 00000000..d5bfacb8 --- /dev/null +++ b/apps/backend/src/utils/graphql/date-scalar.ts @@ -0,0 +1,44 @@ +import { CustomScalar, Scalar } from '@nestjs/graphql'; +import { errors } from '@snipcode/utils'; +import { Kind, ValueNode } from 'graphql'; +import { GraphQLError } from 'graphql'; + +import { DATE_REGEX } from '../constants'; + +@Scalar('Date') +export class DateScalar implements CustomScalar { + description = 'Date custom scalar type'; + name = 'Date'; + + parseValue(value: unknown) { + return new Date(value as string); // Convert incoming integer to Date + } + + serialize(value: unknown) { + return (value as Date).getTime(); // Convert outgoing Date to integer for JSON + } + + parseLiteral(ast: ValueNode): Date { + if (ast.kind === Kind.STRING) { + if (!DATE_REGEX.test(ast.value)) { + throw new GraphQLError(errors.INVALID_DATE_TYPE, { + extensions: { + code: 'INVALID_DATE_TYPE', + }, + }); + } + + return new Date(`${ast.value}T01:00:00`); + } + + if (ast.kind === Kind.INT) { + return new Date(ast.value); + } + + throw new GraphQLError(errors.INVALID_DATE_TYPE, { + extensions: { + code: 'INVALID_DATE_TYPE', + }, + }); + } +} diff --git a/apps/backend/src/utils/tests/helpers.ts b/apps/backend/src/utils/tests/helpers.ts new file mode 100644 index 00000000..902c8a88 --- /dev/null +++ b/apps/backend/src/utils/tests/helpers.ts @@ -0,0 +1,74 @@ +import { randEmail, randFullName, randImg, randNumber, randPassword, randTimeZone, randUserName } from '@ngneat/falso'; +import { + CreateUserInput, + OauthProvider, + PrismaService, + Role, + RoleName, + RoleService, + User, + UserService, +} from '@snipcode/domain'; + +export type CreateUserInputArgs = { + email: string; + isEnabled: boolean; + name: string; + oauthProvider: OauthProvider; + password?: string | null; + pictureUrl: string | null; + role: RoleName; + roleId: string; + timezone: string | null; + username: string | null; +}; +export class TestHelper { + constructor( + private readonly prismaService: PrismaService, + private readonly roleService: RoleService, + private readonly userService: UserService, + ) {} + + static createTestUserInput(override: Partial): CreateUserInput { + const input = new CreateUserInput({ + email: randEmail(), + name: randFullName(), + oauthProvider: 'github', + password: randPassword(), + pictureUrl: randImg(), + roleId: 'roleId', + timezone: randTimeZone(), + username: randUserName(), + ...override, + }); + + input.isEnabled = Boolean(override.isEnabled ?? randNumber({ max: 1, min: 0 })); + + return input; + } + + async findTestRole(name: RoleName): Promise { + const role = await this.roleService.findByName(name); + + if (!role) { + throw new Error(`Role with the name "${name}" not found!`); + } + + return role; + } + + async createTestUser(input: Partial): Promise { + const role = await this.findTestRole(input.role ?? 'user'); + + const createUserInput = TestHelper.createTestUserInput({ ...input, roleId: role.id }); + + return this.userService.create(createUserInput); + } + + async cleanDatabase(): Promise { + await this.prismaService.snippet.deleteMany(); + await this.prismaService.folder.deleteMany(); + await this.prismaService.session.deleteMany(); + await this.prismaService.user.deleteMany(); + } +} diff --git a/apps/backend/src/utils/tests/server.ts b/apps/backend/src/utils/tests/server.ts new file mode 100644 index 00000000..04f7643b --- /dev/null +++ b/apps/backend/src/utils/tests/server.ts @@ -0,0 +1,21 @@ +import { INestApplication } from '@nestjs/common'; + +import { setupAppServer } from '../../server'; + +export type TestServer = { + app: INestApplication; + close: () => Promise; +}; + +export const startTestServer = async (): Promise => { + const app = await setupAppServer({ logger: false }); + + await app.listen(7501); + + return { + app, + close: async () => { + await app.close(); + }, + }; +}; diff --git a/apps/backend/tsconfig.build.json b/apps/backend/tsconfig.build.json new file mode 100644 index 00000000..0dce47a8 --- /dev/null +++ b/apps/backend/tsconfig.build.json @@ -0,0 +1,9 @@ +{ + "extends": "./tsconfig.json", + "exclude": [ + "node_modules", + "dist", + "**/*spec.ts", + "./scripts/**/*" + ] +} diff --git a/apps/core/tsconfig.json b/apps/backend/tsconfig.json similarity index 65% rename from apps/core/tsconfig.json rename to apps/backend/tsconfig.json index 9d32a654..479528f4 100644 --- a/apps/core/tsconfig.json +++ b/apps/backend/tsconfig.json @@ -1,27 +1,28 @@ { "extends": "../../tsconfig.base.json", "compilerOptions": { - "outDir": "./dist", "declaration": true, + "allowSyntheticDefaultImports": true, + "outDir": "./dist", + "incremental": true, "composite": true, - "sourceMap": true + "strictNullChecks": true }, "files": ["env.d.ts"], "include": [ - "./src/**/*", "./tests/**/*" + "./src/**/*", + "./scripts/**/*" ], "exclude": [ - "node_modules", ".turbo" + "node_modules", + ".turbo" ], "references": [ { "path": "../../packages/utils" }, - { - "path": "../../packages/logger" - }, { "path": "../../packages/domain" - }, + } ] } diff --git a/apps/core/.eslintrc.json b/apps/core/.eslintrc.json deleted file mode 100644 index ae4ccc97..00000000 --- a/apps/core/.eslintrc.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "root": true, - "extends": "../../.eslintrc.json", - "ignorePatterns": [ - "graphql.d.ts", - "jest.config.ts" - ], - "parserOptions": { - "ecmaVersion": 2023, - "sourceType": "module", - "project": "tsconfig.json" - } -} diff --git a/apps/core/.gitignore b/apps/core/.gitignore deleted file mode 100644 index 2aa5c054..00000000 --- a/apps/core/.gitignore +++ /dev/null @@ -1,120 +0,0 @@ -# Created by https://www.toptal.com/developers/gitignore/api/node -# Edit at https://www.toptal.com/developers/gitignore?templates=node - -### Node ### -# Logs -logs -*.log -npm-debug.log* -yarn-debug.log* -yarn-error.log* -lerna-debug.log* - -# Diagnostic reports (https://nodejs.org/api/report.html) -report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json - -# Runtime data -pids -*.pid -*.seed -*.pid.lock - -# Directory for instrumented libs generated by jscoverage/JSCover -lib-cov - -# Coverage directory used by tools like istanbul -coverage -*.lcov - -# nyc test coverage -.nyc_output - -# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) -.grunt - -# Bower dependency directory (https://bower.io/) -bower_components - -# node-waf configuration -.lock-wscript - -# Compiled binary addons (https://nodejs.org/api/addons.html) -build/Release - -# Dependency directories -node_modules/ -jspm_packages/ - -# TypeScript v1 declaration files -typings/ - -# TypeScript cache -*.tsbuildinfo - -# Optional npm cache directory -.npm - -# Optional eslint cache -.eslintcache - -# Microbundle cache -.rpt2_cache/ -.rts2_cache_cjs/ -.rts2_cache_es/ -.rts2_cache_umd/ - -# Optional REPL history -.node_repl_history - -# Output of 'npm pack' -*.tgz - -# Yarn Integrity file -.yarn-integrity - -# dotenv environment variables file -.env -../../packages/domain/.env.test -.env*.local -.env.docker -.env.dev - -# parcel-bundler cache (https://parceljs.org/) -.cache -.parcel-cache - -# Next.js build output -.next - -# Nuxt.js build / generate output -.nuxt -dist - -# Gatsby files -.cache/ -# Comment in the public line in if your project uses Gatsby and not Next.js -# https://nextjs.org/blog/next-9-1#public-directory-support -# public - -# vuepress build output -.vuepress/dist - -# Serverless directories -.serverless/ - -# FuseBox cache -.fusebox/ - -# DynamoDB Local files -.dynamodb/ - -# TernJS port file -.tern-port - -# Stores VSCode versions used for testing VSCode extensions -.vscode-test - -# End of https://www.toptal.com/developers/gitignore/api/node - -.idea -build diff --git a/apps/core/README.md b/apps/core/README.md deleted file mode 100644 index 55de104b..00000000 --- a/apps/core/README.md +++ /dev/null @@ -1,92 +0,0 @@ -# Snipcode Core - -This is the backend of Snipcode, containing the business logics related to . - -## Tech Stack -* Node.js -* TypeScript -* GraphQL -* MySQL -* Prisma - -## Prerequisites -Make sure you have this tools installed before running the project -* Node.js 20+ -* NPM or Yarn -* Docker -* AWS CLI v2 -* MySQL 8 on PlanetScale - -## Packages dependencies -We use Yarn workspace to create packages we can share with other applications. -These packages are located in the folder `packages`, so you might need to change the code of one or many packages to implement a feature. -Here are the packages used in this project: - -* [@snipcode/domain](../../packages/domain) -* [@snipcode/logger](../../packages/logger) -* [@snipcode/utils](../../packages/utils) - -## Set up the project -Delete the existing folders output from build commands -```shell -yarn clean -``` -Install node modules -````shell -yarn install -```` -Create configuration file from the template -```shell -cp .env.template .env - -# Edit configuration to match your local environment and save -nano .env -``` - -**Environment variables list** - -| Variable | Description | -|----------------------|--------------------------------------------------------------------------| -| NODE_ENV | Node.js environment (default: development) | -| HOST | Host name where the application is running (default: http://localhost) | -| PORT | Port number of the application (default: 7501) | -| ENABLE_INTROSPECTION | Enable/Disable GraphQL introspection (must `false` in production) | -| DATABASE_URL | URL of the database | -| ADMIN_PASSWORD | Password of the default admin user. | -| CONVERTKIT_API_KEY | ConvertKit API key | -| CONVERTKIT_FORM_ID | ConvertKit Form ID | -| CONVERTKIT_TAG_ID | ConvertKit Tag ID | -| REQUEST_TIMEOUT | Max duration of a request (default: 30 seconds) | -| GITHUB_CLIENT_ID | GitHub application client ID for authentication with GitHub | -| GITHUB_CLIENT_SECRET | GitHub application client secret for authentication with GitHub | -| WEB_APP_URL | URL of the frontend the application that communicates with this app | -| WEB_AUTH_SUCCESS_URL | Callback URL of the frontend application when the authentication succeed | -| WEB_AUTH_ERROR_URL | Callback URL of the frontend application when the authentication failed | -| SESSION_LIFETIME | The session's lifetime when a user authenticate (default: 90 days) | -| SENTRY_DSN | Sentry DSN | -| SENTRY_ENABLED | Enable/Disable Sentry | - -Start the application -```bash -yarn dev -``` -The application will be launched by [Nodemon](https://nodemon.com). - -Open [http://localhost:7501/graphql](http://localhost:7501/graphql) in your browser and use Apollo studio explorer to test your GraphQL queries and mutations. - -## Running tests -Run the command below to run all the tests -```shell -yarn test -``` -To run a specific test file, append the filename after the command -```shell -yarn test controller.test.ts -``` - -## Lint the project -ESLint and Prettier are used to normalize the code style across the project. -Linting the code make sure there is no error -```shell -yarn lint -``` diff --git a/apps/core/codegen.yml b/apps/core/codegen.yml deleted file mode 100644 index f30d4f1d..00000000 --- a/apps/core/codegen.yml +++ /dev/null @@ -1,25 +0,0 @@ -overwrite: true -schema: src/**/schema.graphql.ts -documents: null -generates: - src/types/graphql.d.ts: - config: - enumsAsConst: true - scalars: - Date: Date - mappers: - Role: models#Role - User: models#User - Folder: models#Folder - Snippet: models#Snippet - customResolverFn: | - ( - parent: TParent, - args: TArgs, - context: TContext, - info?: GraphQLResolveInfo - ) => Promise | TResult; - contextType: ./common#AppContext - plugins: - - "typescript" - - "typescript-resolvers" diff --git a/apps/core/package.json b/apps/core/package.json deleted file mode 100644 index 9eee8c82..00000000 --- a/apps/core/package.json +++ /dev/null @@ -1,39 +0,0 @@ -{ - "name": "@snipcode/core", - "version": "1.1.0", - "private": true, - "description": "Snipcode core backend", - "main": "dist/index.js", - "license": "MIT", - "scripts": { - "build": "tsc --project tsconfig.prod.json", - "clean": "rm -rf .turbo dist build logs", - "dev": "nodemon --watch \"*.ts\" --exec \"ts-node\" ./src/index.ts", - "lint": "eslint src", - "build:prod": "esbuild ./src/index.ts --bundle --sourcemap --platform=node --outfile=build/index.js", - "test": "jest", - "gql:gen:types": "yarn graphql-codegen" - }, - "dependencies": { - "@graphql-tools/schema": "10.0.3", - "@snipcode/domain": "workspace:*", - "@snipcode/embed": "workspace:*", - "@snipcode/logger": "workspace:*", - "@snipcode/utils": "workspace:*", - "apollo-server-core": "3.13.0", - "apollo-server-express": "3.13.0", - "axios": "1.6.8", - "cors": "2.8.5", - "dotenv": "16.4.5", - "express": "4.19.1", - "graphql": "16.8.1" - }, - "devDependencies": { - "@graphql-codegen/cli": "5.0.2", - "@graphql-codegen/typescript": "4.0.6", - "@graphql-codegen/typescript-resolvers": "4.0.6", - "@types/cors": "2.8.17", - "@types/express": "4.17.21", - "nodemon": "3.1.0" - } -} diff --git a/apps/core/src/configs/authentication.ts b/apps/core/src/configs/authentication.ts deleted file mode 100644 index 251cf9ce..00000000 --- a/apps/core/src/configs/authentication.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { errors } from '@snipcode/utils'; - -import { AppContext } from '../types/common'; -import AppError from '../utils/errors/app-error'; - -export const getAuthenticatedUser = (context: AppContext): string => { - const { userId } = context.req.session; - - if (!userId) { - throw new AppError(errors.NOT_AUTHENTICATED, 'NOT_AUTHENTICATED'); - } - - return userId; -}; diff --git a/apps/core/src/configs/env.ts b/apps/core/src/configs/env.ts deleted file mode 100644 index 331ad404..00000000 --- a/apps/core/src/configs/env.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { getEnv } from '@snipcode/utils'; -import dotenv from 'dotenv'; - -import { AppEnvironmentVariables } from '../types/common'; - -dotenv.config({ override: true }); - -export const env: AppEnvironmentVariables = { - ADMIN_PASSWORD: getEnv('ADMIN_PASSWORD'), - APP_VERSION: getEnv('APP_VERSION'), - CONVERTKIT_API_KEY: getEnv('CONVERTKIT_API_KEY'), - CONVERTKIT_FORM_ID: getEnv('CONVERTKIT_FORM_ID'), - CONVERTKIT_TAG_ID: getEnv('CONVERTKIT_TAG_ID'), - DATABASE_URL: getEnv('DATABASE_URL'), - ENABLE_INTROSPECTION: getEnv('ENABLE_INTROSPECTION') === 'true', - GITHUB_CLIENT_ID: getEnv('GITHUB_CLIENT_ID'), - GITHUB_CLIENT_SECRET: getEnv('GITHUB_CLIENT_SECRET'), - HOST: getEnv('HOST'), - IS_DEV: getEnv('NODE_ENV') !== 'production', - IS_PROD: getEnv('NODE_ENV') === 'production', - PORT: parseInt(getEnv('PORT'), 10), - REQUEST_TIMEOUT: parseInt(getEnv('REQUEST_TIMEOUT'), 10), - SENTRY_DSN: getEnv('SENTRY_DSN'), - SENTRY_ENABLED: getEnv('SENTRY_ENABLED') === 'true', - SESSION_LIFETIME: parseInt(getEnv('SESSION_LIFETIME'), 10), - SNIPPET_RENDERER_URL: getEnv('SNIPPET_RENDERER_URL'), - VALUE: getEnv('NODE_ENV'), - WEB_APP_URL: getEnv('WEB_APP_URL'), - WEB_AUTH_ERROR_URL: getEnv('WEB_AUTH_ERROR_URL'), - WEB_AUTH_SUCCESS_URL: getEnv('WEB_AUTH_SUCCESS_URL'), -}; diff --git a/apps/core/src/configs/http-client.ts b/apps/core/src/configs/http-client.ts deleted file mode 100644 index 0a0748a4..00000000 --- a/apps/core/src/configs/http-client.ts +++ /dev/null @@ -1,22 +0,0 @@ -import axios from 'axios'; - -import { logger } from './logger'; - -const httpClient = axios.create(); - -httpClient.interceptors.response.use( - (res) => res, - (err) => { - const { - config: { method, url }, - data, - status, - } = err.response; - - logger.error({ data, method, status, url }); - - throw err; - }, -); - -export { httpClient }; diff --git a/apps/core/src/configs/logger.ts b/apps/core/src/configs/logger.ts deleted file mode 100644 index d8e7bbcb..00000000 --- a/apps/core/src/configs/logger.ts +++ /dev/null @@ -1,17 +0,0 @@ -import path from 'path'; - -import { fileLogger } from '@snipcode/logger'; - -import { env } from './env'; - -fileLogger.init({ - appName: 'core', - logFileDirectory: path.resolve(__dirname, '../../logs'), - sentry: { - dsn: env.SENTRY_DSN, - enabled: Boolean(env.SENTRY_DSN) && env.SENTRY_ENABLED, - environment: env.VALUE, - }, -}); - -export { fileLogger as logger }; diff --git a/apps/core/src/index.ts b/apps/core/src/index.ts deleted file mode 100644 index 55dca0df..00000000 --- a/apps/core/src/index.ts +++ /dev/null @@ -1,44 +0,0 @@ -import http from 'http'; - -import { dbClient } from '@snipcode/domain'; -import express from 'express'; - -import { env } from './configs/env'; -import { logger } from './configs/logger'; -import { startGraphqlServer } from './server/graphql'; -import { setupRestEndpoints } from './server/rest'; -import { loadData } from './utils/db/data-init'; - -export const startServer = async () => { - const expressApplication = express(); - - const httpServer = http.createServer(expressApplication); - - const graphqlServer = await startGraphqlServer(expressApplication, httpServer); - - setupRestEndpoints(expressApplication); - - httpServer - .listen(env.PORT, async () => { - await dbClient.$connect(); - - await loadData(); - - logger.info(`🚀 Server ready at ${env.HOST}:${env.PORT}${graphqlServer.graphqlPath}`); - }) - .setTimeout(10000); - - return { graphqlServer, httpServer }; -}; - -void (async () => { - await startServer(); -})(); - -process.on('unhandledRejection', (e) => { - logger.error(e); -}); - -process.on('uncaughtException', (e) => { - logger.error(e); -}); diff --git a/apps/core/src/resources/authentication/handlers/github.ts b/apps/core/src/resources/authentication/handlers/github.ts deleted file mode 100644 index afbeefda..00000000 --- a/apps/core/src/resources/authentication/handlers/github.ts +++ /dev/null @@ -1,126 +0,0 @@ -import { User } from '@snipcode/domain'; -import { - CreateUserDto, - CreateUserRootFolderDto, - UpdateUserDto, - folderService, - roleService, - userService, -} from '@snipcode/domain'; -import { errors } from '@snipcode/utils'; -import { AxiosRequestConfig } from 'axios'; -import { Response } from 'express'; - -import { env } from '../../../configs/env'; -import { httpClient } from '../../../configs/http-client'; -import { logger } from '../../../configs/logger'; -import { GitHubUserResponse } from '../../../types/auth'; -import { ExpressRequestQuery } from '../../../types/common'; -import { authSuccessURL, createUserSession } from '../../../utils/auth/session'; - -const GITHUB_AUTH_URL = 'https://github.com/login/oauth/access_token'; -const GITHUB_API_USER_PROFILE_URL = 'https://api.github.com/user'; - -const requestAccessTokenFromCode = async (code: string) => { - const authQueryObject = { - client_id: env.GITHUB_CLIENT_ID, - client_secret: env.GITHUB_CLIENT_SECRET, - code, - }; - const requestConfig: AxiosRequestConfig = { - headers: { - accept: 'application/json', - }, - }; - const requestBody = {}; - - const authQueryString = new URLSearchParams(Object.entries(authQueryObject)).toString(); - - return httpClient.post(`${GITHUB_AUTH_URL}?${authQueryString}`, requestBody, requestConfig); -}; - -const retrieveGitHubUserData = async (accessToken: string) => { - const requestConfig: AxiosRequestConfig = { - headers: { - Authorization: `token ${accessToken}`, - }, - }; - - return httpClient.get(GITHUB_API_USER_PROFILE_URL, requestConfig); -}; - -const createUserFromGitHubInfo = async (data: GitHubUserResponse, roleId: string): Promise => { - const { avatar_url, email, login, name } = data; - - const createUserDto = new CreateUserDto({ - email, - name, - oauthProvider: 'github', - pictureUrl: avatar_url, - roleId, - timezone: null, - username: login, - }); - - createUserDto.isEnabled = true; - - return userService.create(createUserDto); -}; - -const updateUserFromGitHubInfo = async (user: User, data: GitHubUserResponse): Promise => { - const { avatar_url, name } = data; - - const updateUserDto = new UpdateUserDto({ - name, - oauthProvider: 'github', - pictureUrl: avatar_url, - roleId: user.roleId, - timezone: user.timezone, - }); - - return userService.update(user, updateUserDto); -}; - -export const authenticateWithGitHub = async (req: ExpressRequestQuery<{ code: string }>, res: Response) => { - try { - const requestToken = req.query.code; - - const authResponse = await requestAccessTokenFromCode(requestToken); - - const accessToken = authResponse.data.access_token; - - const userResponse = await retrieveGitHubUserData(accessToken); - - const userExist = await userService.findByEmail(userResponse.data.email); - - if (userExist) { - const session = await createUserSession(userExist.id); - - await updateUserFromGitHubInfo(userExist, userResponse.data); - - return res.redirect(authSuccessURL(session.token)); - } - - const roleUser = await roleService.findByName('user'); - - if (!roleUser) { - logger.error(`Auth: ${errors.ROLE_USER_NOT_FOUND}`); - - return res.redirect(env.WEB_AUTH_ERROR_URL); - } - - const createdUser = await createUserFromGitHubInfo(userResponse.data, roleUser.id); - - const createUserRootFolderDto = new CreateUserRootFolderDto(createdUser.id); - - await folderService.createUserRootFolder(createUserRootFolderDto); - - const session = await createUserSession(createdUser.id); - - return res.redirect(authSuccessURL(session.token)); - } catch (e: unknown) { - logger.error(e); - - return res.redirect(env.WEB_AUTH_ERROR_URL); - } -}; diff --git a/apps/core/src/resources/authentication/routes.ts b/apps/core/src/resources/authentication/routes.ts deleted file mode 100644 index d444bd15..00000000 --- a/apps/core/src/resources/authentication/routes.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { Router } from 'express'; - -import { authenticateWithGitHub } from './handlers/github'; - -const authenticationRoute = (): Router => { - const router = Router(); - - router.get('/auth/github/callback', authenticateWithGitHub); - - return router; -}; - -export { authenticationRoute }; diff --git a/apps/core/src/resources/folders/mutations/create-folder.ts b/apps/core/src/resources/folders/mutations/create-folder.ts deleted file mode 100644 index 856018f9..00000000 --- a/apps/core/src/resources/folders/mutations/create-folder.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { CreateFolderDto } from '@snipcode/domain'; - -import { getAuthenticatedUser } from '../../../configs/authentication'; -import { logger } from '../../../configs/logger'; -import { MutationResolvers } from '../../../types/graphql'; -import { throwApplicationError } from '../../../utils/errors/throw-error'; - -export const createFolder: MutationResolvers['createFolder'] = async (_parent, { input }, context) => { - const userId = getAuthenticatedUser(context); - - const { name, parentId } = input; - - const createFolderDto = new CreateFolderDto({ name, parentId, userId }); - - try { - return context.db.folder.create(createFolderDto); - } catch (err: any) { - logger.error(err); - - return throwApplicationError(err); - } -}; diff --git a/apps/core/src/resources/folders/mutations/delete-folders.ts b/apps/core/src/resources/folders/mutations/delete-folders.ts deleted file mode 100644 index 289f46b5..00000000 --- a/apps/core/src/resources/folders/mutations/delete-folders.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { getAuthenticatedUser } from '../../../configs/authentication'; -import { logger } from '../../../configs/logger'; -import { MutationResolvers } from '../../../types/graphql'; -import { throwApplicationError } from '../../../utils/errors/throw-error'; - -export const deleteFolders: MutationResolvers['deleteFolders'] = async (_parent, args, context) => { - const userId = getAuthenticatedUser(context); - - try { - await context.db.folder.deleteMany(args.folderIds, userId); - } catch (err: any) { - logger.error(err); - - throwApplicationError(err); - } - - return true; -}; diff --git a/apps/core/src/resources/folders/mutations/update-folder.ts b/apps/core/src/resources/folders/mutations/update-folder.ts deleted file mode 100644 index f9aec335..00000000 --- a/apps/core/src/resources/folders/mutations/update-folder.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { UpdateFolderDto } from '@snipcode/domain'; - -import { getAuthenticatedUser } from '../../../configs/authentication'; -import { logger } from '../../../configs/logger'; -import { MutationResolvers } from '../../../types/graphql'; -import { throwApplicationError } from '../../../utils/errors/throw-error'; - -export const updateFolder: MutationResolvers['updateFolder'] = async (_parent, { id, input }, context) => { - const userId = getAuthenticatedUser(context); - - const updateFolderDto = new UpdateFolderDto({ - creatorId: userId, - folderId: id, - name: input.name, - }); - - try { - return context.db.folder.update(updateFolderDto); - } catch (err: any) { - logger.error(err); - - return throwApplicationError(err); - } -}; diff --git a/apps/core/src/resources/folders/queries/find-folder.ts b/apps/core/src/resources/folders/queries/find-folder.ts deleted file mode 100644 index dbb26bc5..00000000 --- a/apps/core/src/resources/folders/queries/find-folder.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { getAuthenticatedUser } from '../../../configs/authentication'; -import { logger } from '../../../configs/logger'; -import { QueryResolvers } from '../../../types/graphql'; -import { throwApplicationError } from '../../../utils/errors/throw-error'; - -export const findFolder: QueryResolvers['findFolder'] = async (_parent, args, context) => { - getAuthenticatedUser(context); - - try { - return context.db.folder.findById(args.folderId); - } catch (err: any) { - logger.error(err); - - return throwApplicationError(err); - } -}; diff --git a/apps/core/src/resources/folders/queries/list-directory.ts b/apps/core/src/resources/folders/queries/list-directory.ts deleted file mode 100644 index 13c25cc0..00000000 --- a/apps/core/src/resources/folders/queries/list-directory.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { getAuthenticatedUser } from '../../../configs/authentication'; -import { QueryResolvers } from '../../../types/graphql'; - -export const listDirectory: QueryResolvers['listDirectory'] = async (_parent, args, context) => { - const userId = getAuthenticatedUser(context); - - const folders = await context.db.folder.findSubFolders(userId, args.folderId); - const snippets = await context.db.snippet.findByFolder(args.folderId); - const paths = await context.db.folder.generateBreadcrumb(args.folderId); - - return { - folders, - paths, - snippets, - }; -}; diff --git a/apps/core/src/resources/folders/queries/list-folders.ts b/apps/core/src/resources/folders/queries/list-folders.ts deleted file mode 100644 index b3aaf376..00000000 --- a/apps/core/src/resources/folders/queries/list-folders.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { getAuthenticatedUser } from '../../../configs/authentication'; -import { QueryResolvers } from '../../../types/graphql'; - -export const listFolders: QueryResolvers['listFolders'] = async (_parent, args, context) => { - const userId = getAuthenticatedUser(context); - - return context.db.folder.findSubFolders(userId, args.folderId); -}; diff --git a/apps/core/src/resources/folders/resolvers.ts b/apps/core/src/resources/folders/resolvers.ts deleted file mode 100644 index 4bb19573..00000000 --- a/apps/core/src/resources/folders/resolvers.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { getAuthenticatedUser } from '../../configs/authentication'; -import { FolderResolvers } from '../../types/graphql'; - -export const subFoldersCountResolver: FolderResolvers['subFoldersCount'] = async (folder, _args, context) => { - const userId = getAuthenticatedUser(context); - - const folders = await context.db.folder.findSubFolders(userId, folder.id); - const snippets = await context.db.snippet.findByFolder(folder.id); - - return folders.length + snippets.length; -}; diff --git a/apps/core/src/resources/folders/schema.graphql.ts b/apps/core/src/resources/folders/schema.graphql.ts deleted file mode 100644 index 2d73d925..00000000 --- a/apps/core/src/resources/folders/schema.graphql.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { gql } from 'apollo-server-core'; - -export default gql` - type Directory { - folders: [Folder!]! - snippets: [Snippet!]! - paths: [Folder!]! - } - - input CreateFolderInput { - parentId: String! - name: String! - } - - input UpdateFolderInput { - name: String! - } - - type Mutation { - createFolder(input: CreateFolderInput!): Folder! - deleteFolders(folderIds: [String!]!): Boolean! - updateFolder(id: ID!, input: UpdateFolderInput!): Folder! - } - - extend type Query { - listFolders(folderId: String): [Folder!]! - findFolder(folderId: String!): Folder! - listDirectory(folderId: String!): Directory - } -`; diff --git a/apps/core/src/resources/newsletter/mutations/subscribe.ts b/apps/core/src/resources/newsletter/mutations/subscribe.ts deleted file mode 100644 index 9950a2c6..00000000 --- a/apps/core/src/resources/newsletter/mutations/subscribe.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { env } from '../../../configs/env'; -import { logger } from '../../../configs/logger'; -import { MutationResolvers } from '../../../types/graphql'; -import { NEWSLETTER_SUBSCRIBE_SUCCESS } from '../../../utils/constants'; -import { throwApplicationError } from '../../../utils/errors/throw-error'; - -export const subscribeToNewsletter: MutationResolvers['subscribeToNewsletter'] = async (_parent, args, context) => { - try { - await context.db.newsletter.subscribe(args.email, [env.CONVERTKIT_TAG_ID]); - - return { message: NEWSLETTER_SUBSCRIBE_SUCCESS }; - } catch (err: any) { - logger.error(err); - - return throwApplicationError(err); - } -}; diff --git a/apps/core/src/resources/newsletter/schema.graphql.ts b/apps/core/src/resources/newsletter/schema.graphql.ts deleted file mode 100644 index abf19be3..00000000 --- a/apps/core/src/resources/newsletter/schema.graphql.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { gql } from 'apollo-server-core'; - -export default gql` - type Result { - message: String! - } - - extend type Mutation { - subscribeToNewsletter(email: String!): Result! - } - - extend type Query { - hello: String! @deprecated - } -`; diff --git a/apps/core/src/resources/resolvers.ts b/apps/core/src/resources/resolvers.ts deleted file mode 100644 index 8b43619f..00000000 --- a/apps/core/src/resources/resolvers.ts +++ /dev/null @@ -1,83 +0,0 @@ -import { createFolder } from './folders/mutations/create-folder'; -import { deleteFolders } from './folders/mutations/delete-folders'; -import { updateFolder } from './folders/mutations/update-folder'; -import { findFolder } from './folders/queries/find-folder'; -import { listDirectory } from './folders/queries/list-directory'; -import { listFolders } from './folders/queries/list-folders'; -import { subFoldersCountResolver } from './folders/resolvers'; -import { subscribeToNewsletter } from './newsletter/mutations/subscribe'; -import { createSnippet } from './snippets/mutations/create-snippet'; -import { deleteSnippet } from './snippets/mutations/delete-snippet'; -import { updateSnippet } from './snippets/mutations/update-snippet'; -import { findSnippet } from './snippets/queries/find-snippet'; -import { mySnippets } from './snippets/queries/my-snippets'; -import { publicSnippets } from './snippets/queries/public-snippets'; -import { dateScalar } from './types/date'; -import { loginUser } from './users/mutations/login-user'; -import { logoutUser } from './users/mutations/logout-user'; -import { signupUser } from './users/mutations/signup-user'; -import { authenticatedUser } from './users/queries/authenticated-user'; -import { Resolvers } from '../types/graphql'; - -const resolvers: Resolvers = { - Date: dateScalar, - Folder: { - parent: (folder, _args, context) => { - return context.db.folder.findById(folder.parentId); - }, - subFolders: (folder, _args, context) => { - return context.db.folder.findSubFolders(folder.id); - }, - subFoldersCount: subFoldersCountResolver, - user: (folder, _args, context) => { - return context.db.user.findById(folder.userId); - }, - }, - Mutation: { - createFolder, - createSnippet, - deleteFolders, - deleteSnippet, - loginUser, - logoutUser, - signupUser, - subscribeToNewsletter, - updateFolder, - updateSnippet, - }, - Query: { - authenticatedUser, - findFolder, - findSnippet, - hello: () => 'Hello from Snipcode', - listDirectory, - listFolders, - mySnippets, - ping: () => 'pong', - publicSnippets, - }, - Snippet: { - contentHighlighted: (snippet) => { - return snippet.contentHtml; - }, - folder: (snippet, _args, context) => { - return context.db.folder.findById(snippet.folderId); - }, - user: (snippet, _args, context) => { - return context.db.user.findById(snippet.userId); - }, - }, - User: { - folders: (user, _args, context) => { - return context.db.folder.findUserFolders(user.id); - }, - role: (user, _args, context) => { - return context.db.role.findById(user.roleId); - }, - rootFolder: (user, _args, context) => { - return context.db.folder.findUserRootFolder(user.id); - }, - }, -}; - -export default resolvers; diff --git a/apps/core/src/resources/schema.graphql.ts b/apps/core/src/resources/schema.graphql.ts deleted file mode 100644 index 270beb83..00000000 --- a/apps/core/src/resources/schema.graphql.ts +++ /dev/null @@ -1,82 +0,0 @@ -import { gql } from 'apollo-server-core'; - -export default gql` - scalar Date - - enum RoleName { - user - admin - } - - enum OauthProvider { - github - stackoverflow - twitter - } - - enum SnippetVisibility { - public - private - } - - type Role { - id: ID! - name: RoleName! - level: Int! - description: String - createdAt: Date! - updatedAt: Date! - } - - type User { - id: ID! - email: String! - username: String - name: String! - timezone: String - isEnabled: Boolean! - pictureUrl: String - role: Role! - oauthProvider: OauthProvider - createdAt: Date! - updatedAt: Date! - rootFolder: Folder! - folders: [Folder!]! - } - - type Folder { - id: ID! - name: String! - isFavorite: Boolean! - createdAt: Date! - updatedAt: Date! - user: User! - parent: Folder - subFolders: [Folder!]! - subFoldersCount: Int! - } - - type Snippet { - id: ID! - name: String! - content: String! - contentHighlighted: String! - language: String! - lineHighlight: String - size: Int! - visibility: SnippetVisibility! - description: String - theme: String! - createdAt: Date! - updatedAt: Date! - folder: Folder! - user: User! - } - - type Query { - ping: String - @deprecated( - reason: "https://stackoverflow.com/questions/59868942/graphql-a-schema-must-have-a-query-operation-defined" - ) - } -`; diff --git a/apps/core/src/resources/schemas.ts b/apps/core/src/resources/schemas.ts deleted file mode 100644 index 325eb9f8..00000000 --- a/apps/core/src/resources/schemas.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { mergeTypeDefs } from '@graphql-tools/merge'; - -import folderSchema from './folders/schema.graphql'; -import newsletterSchema from './newsletter/schema.graphql'; -import mainSchema from './schema.graphql'; -import snippetSchema from './snippets/schema.graphql'; -import userSchema from './users/schema.graphql'; - -const typeDefsArray = [mainSchema, folderSchema, newsletterSchema, snippetSchema, userSchema]; - -export default mergeTypeDefs(typeDefsArray); diff --git a/apps/core/src/resources/snippets/handlers/generate-oembed.ts b/apps/core/src/resources/snippets/handlers/generate-oembed.ts deleted file mode 100644 index 298950ef..00000000 --- a/apps/core/src/resources/snippets/handlers/generate-oembed.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { snippetService } from '@snipcode/domain'; -import { generateOembedMetadata } from '@snipcode/embed'; -import { Request, Response } from 'express'; - -import { env } from '../../../configs/env'; -import { logger } from '../../../configs/logger'; - -export const generateOembed = async (req: Request, res: Response) => { - const { id } = req.params; - - try { - const snippet = await snippetService.findById(id); - - const embedMetadata = generateOembedMetadata({ - snippet: { - id: snippet.id, - name: snippet.name, - }, - snippetRendererURL: env.SNIPPET_RENDERER_URL, - webAppURL: env.WEB_APP_URL, - }); - - return res.json(embedMetadata); - } catch (e) { - logger.error(e); - - return res.status(404).json({ error: 'Not found' }); - } -}; diff --git a/apps/core/src/resources/snippets/mutations/create-snippet.ts b/apps/core/src/resources/snippets/mutations/create-snippet.ts deleted file mode 100644 index b76bbb40..00000000 --- a/apps/core/src/resources/snippets/mutations/create-snippet.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { CreateSnippetDto } from '@snipcode/domain'; - -import { getAuthenticatedUser } from '../../../configs/authentication'; -import { logger } from '../../../configs/logger'; -import { MutationResolvers } from '../../../types/graphql'; -import { throwApplicationError } from '../../../utils/errors/throw-error'; - -export const createSnippet: MutationResolvers['createSnippet'] = async (_parent, { input }, context) => { - const userId = getAuthenticatedUser(context); - - const createSnippetDto = new CreateSnippetDto({ - content: input.content, - contentHighlighted: input.contentHighlighted, - description: input.description ?? null, - folderId: input.folderId, - language: input.language, - lineHighlight: input.lineHighlight ?? null, - name: input.name, - theme: input.theme, - userId, - visibility: input.visibility, - }); - - try { - return context.db.snippet.create(createSnippetDto); - } catch (err: any) { - logger.error(err); - - return throwApplicationError(err); - } -}; diff --git a/apps/core/src/resources/snippets/mutations/delete-snippet.ts b/apps/core/src/resources/snippets/mutations/delete-snippet.ts deleted file mode 100644 index 5f33edb1..00000000 --- a/apps/core/src/resources/snippets/mutations/delete-snippet.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { DeleteSnippetDto } from '@snipcode/domain'; - -import { getAuthenticatedUser } from '../../../configs/authentication'; -import { logger } from '../../../configs/logger'; -import { MutationResolvers } from '../../../types/graphql'; -import { throwApplicationError } from '../../../utils/errors/throw-error'; - -export const deleteSnippet: MutationResolvers['deleteSnippet'] = async (_parent, { id }, context) => { - const userId = getAuthenticatedUser(context); - - const deleteSnippetDto = new DeleteSnippetDto({ - creatorId: userId, - snippetId: id, - }); - - try { - await context.db.snippet.delete(deleteSnippetDto); - - return true; - } catch (err: any) { - logger.error(err); - - return throwApplicationError(err); - } -}; diff --git a/apps/core/src/resources/snippets/mutations/update-snippet.ts b/apps/core/src/resources/snippets/mutations/update-snippet.ts deleted file mode 100644 index d2077fd2..00000000 --- a/apps/core/src/resources/snippets/mutations/update-snippet.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { UpdateSnippetDto } from '@snipcode/domain'; - -import { getAuthenticatedUser } from '../../../configs/authentication'; -import { logger } from '../../../configs/logger'; -import { MutationResolvers } from '../../../types/graphql'; -import { throwApplicationError } from '../../../utils/errors/throw-error'; - -export const updateSnippet: MutationResolvers['updateSnippet'] = async (_parent, { id, input }, context) => { - const userId = getAuthenticatedUser(context); - - const updateSnippetDto = new UpdateSnippetDto({ - content: input.content, - contentHighlighted: input.contentHighlighted, - creatorId: userId, - description: input.description ?? null, - language: input.language, - lineHighlight: input.lineHighlight ?? null, - name: input.name, - snippetId: id, - theme: input.theme, - visibility: input.visibility, - }); - - try { - return context.db.snippet.update(updateSnippetDto); - } catch (err: any) { - logger.error(err); - - return throwApplicationError(err); - } -}; diff --git a/apps/core/src/resources/snippets/queries/find-snippet.ts b/apps/core/src/resources/snippets/queries/find-snippet.ts deleted file mode 100644 index 137db6a8..00000000 --- a/apps/core/src/resources/snippets/queries/find-snippet.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { getAuthenticatedUser } from '../../../configs/authentication'; -import { logger } from '../../../configs/logger'; -import { QueryResolvers } from '../../../types/graphql'; -import { throwApplicationError } from '../../../utils/errors/throw-error'; - -export const findSnippet: QueryResolvers['findSnippet'] = async (_parent, args, context) => { - getAuthenticatedUser(context); - - try { - const snippet = await context.db.snippet.findById(args.snippetId); - const paths = await context.db.folder.generateBreadcrumb(snippet.folderId); - - return { - paths, - snippet, - }; - } catch (err: any) { - logger.error(err); - - return throwApplicationError(err); - } -}; diff --git a/apps/core/src/resources/snippets/queries/my-snippets.ts b/apps/core/src/resources/snippets/queries/my-snippets.ts deleted file mode 100644 index 4665748d..00000000 --- a/apps/core/src/resources/snippets/queries/my-snippets.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { getAuthenticatedUser } from '../../../configs/authentication'; -import { QueryResolvers } from '../../../types/graphql'; - -export const mySnippets: QueryResolvers['mySnippets'] = (_parent, _args, context) => { - const userId = getAuthenticatedUser(context); - - return context.db.snippet.findByUser(userId); -}; diff --git a/apps/core/src/resources/snippets/queries/public-snippets.ts b/apps/core/src/resources/snippets/queries/public-snippets.ts deleted file mode 100644 index b8e751a4..00000000 --- a/apps/core/src/resources/snippets/queries/public-snippets.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { QueryResolvers } from '../../../types/graphql'; - -export const publicSnippets: QueryResolvers['publicSnippets'] = async (_parent, args, context) => { - const { - input: { itemPerPage, keyword, nextToken, sortMethod }, - } = args; - - const result = await context.db.snippet.findPublicSnippet({ - cursor: nextToken, - itemPerPage: itemPerPage ?? 10, - keyword: keyword ?? undefined, - sortMethod: sortMethod ?? 'recently_created', - }); - - return { - hasMore: result.hasMore, - itemPerPage, - items: result.items, - nextToken: result.nextCursor, - }; -}; diff --git a/apps/core/src/resources/snippets/routes.ts b/apps/core/src/resources/snippets/routes.ts deleted file mode 100644 index 34300a74..00000000 --- a/apps/core/src/resources/snippets/routes.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { Router } from 'express'; - -import { generateOembed } from './handlers/generate-oembed'; - -const snippetRoute = (): Router => { - const router = Router(); - - router.get('/oembed/:id', generateOembed); - - return router; -}; - -export { snippetRoute }; diff --git a/apps/core/src/resources/snippets/schema.graphql.ts b/apps/core/src/resources/snippets/schema.graphql.ts deleted file mode 100644 index b1459a6e..00000000 --- a/apps/core/src/resources/snippets/schema.graphql.ts +++ /dev/null @@ -1,62 +0,0 @@ -import { gql } from 'apollo-server-core'; - -export default gql` - enum SnippetSortMethod { - recently_created - recently_updated - } - - type SnippetInfo { - snippet: Snippet! - paths: [Folder!]! - } - - type PublicSnippetsResult { - items: [Snippet!]! - hasMore: Boolean! - itemPerPage: Int - nextToken: String - } - - input CreateSnippetInput { - folderId: String! - name: String! - content: String! - contentHighlighted: String! - language: String! - lineHighlight: String - visibility: SnippetVisibility! - description: String - theme: String! - } - - input UpdateSnippetInput { - name: String! - content: String! - contentHighlighted: String! - language: String! - lineHighlight: String - visibility: SnippetVisibility! - description: String - theme: String! - } - - input PublicSnippetsInput { - nextToken: String - itemPerPage: Int - sortMethod: SnippetSortMethod - keyword: String - } - - extend type Mutation { - createSnippet(input: CreateSnippetInput!): Snippet! - updateSnippet(id: ID!, input: UpdateSnippetInput!): Snippet! - deleteSnippet(id: ID!): Boolean! - } - - extend type Query { - publicSnippets(input: PublicSnippetsInput!): PublicSnippetsResult! - mySnippets: [Snippet!]! - findSnippet(snippetId: String!): SnippetInfo! - } -`; diff --git a/apps/core/src/resources/types/date.ts b/apps/core/src/resources/types/date.ts deleted file mode 100644 index 7fcc8118..00000000 --- a/apps/core/src/resources/types/date.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { errors } from '@snipcode/utils'; -import { ApolloError } from 'apollo-server-express'; -import { GraphQLScalarType, Kind } from 'graphql'; - -import { DATE_REGEX } from '../../utils/constants'; - -export const dateScalar = new GraphQLScalarType({ - description: 'Date custom scalar type', - name: 'Date', - parseLiteral(ast) { - if (ast.kind === Kind.STRING) { - if (!DATE_REGEX.test(ast.value)) { - throw new ApolloError(errors.INVALID_DATE_TYPE, 'INVALID_DATE_TYPE'); - } - - return new Date(`${ast.value}T01:00:00`); - } - - throw new ApolloError(errors.INVALID_DATE_TYPE, 'INVALID_DATE_TYPE'); - }, - parseValue(value: unknown) { - return new Date(value as string); // Convert incoming integer to Date - }, - serialize(value: unknown) { - return (value as Date).getTime(); // Convert outgoing Date to integer for JSON - }, -}); diff --git a/apps/core/src/resources/users/mutations/login-user.ts b/apps/core/src/resources/users/mutations/login-user.ts deleted file mode 100644 index cbafaf06..00000000 --- a/apps/core/src/resources/users/mutations/login-user.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { logger } from '../../../configs/logger'; -import { MutationResolvers } from '../../../types/graphql'; -import { createUserSession } from '../../../utils/auth/session'; -import { throwApplicationError } from '../../../utils/errors/throw-error'; - -export const loginUser: MutationResolvers['loginUser'] = async (_parent, args, context) => { - try { - const { email, password } = args; - const user = await context.db.user.login(email, password); - - const session = await createUserSession(user.id); - - return { token: session.token }; - } catch (err) { - logger.error(err); - - return throwApplicationError(err); - } -}; diff --git a/apps/core/src/resources/users/mutations/logout-user.ts b/apps/core/src/resources/users/mutations/logout-user.ts deleted file mode 100644 index 2baf82c5..00000000 --- a/apps/core/src/resources/users/mutations/logout-user.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { getAuthenticatedUser } from '../../../configs/authentication'; -import { MutationResolvers } from '../../../types/graphql'; - -export const logoutUser: MutationResolvers['logoutUser'] = async (_parent, _args, context) => { - const userId = getAuthenticatedUser(context); - - await context.db.session.deleteUserSessions(userId); - - return true; -}; diff --git a/apps/core/src/resources/users/mutations/signup-user.ts b/apps/core/src/resources/users/mutations/signup-user.ts deleted file mode 100644 index 5df2ea6c..00000000 --- a/apps/core/src/resources/users/mutations/signup-user.ts +++ /dev/null @@ -1,38 +0,0 @@ -import { CreateUserDto, CreateUserRootFolderDto } from '@snipcode/domain'; - -import { logger } from '../../../configs/logger'; -import { MutationResolvers } from '../../../types/graphql'; -import { throwApplicationError } from '../../../utils/errors/throw-error'; - -export const signupUser: MutationResolvers['signupUser'] = async (_parent, args, context) => { - try { - const { email, name, password } = args.input; - - const role = await context.db.role.findByName('user'); - - const createUserDto = new CreateUserDto({ - email, - name, - oauthProvider: 'email', - password, - pictureUrl: null, - roleId: role.id, - timezone: null, - username: null, - }); - - const user = await context.db.user.create(createUserDto); - - const createUserRootFolderDto = new CreateUserRootFolderDto(user.id); - - await context.db.folder.createUserRootFolder(createUserRootFolderDto); - - // TODO published user created event - - return { message: 'Account created successfully!' }; - } catch (err) { - logger.error(err); - - return throwApplicationError(err); - } -}; diff --git a/apps/core/src/resources/users/queries/authenticated-user.ts b/apps/core/src/resources/users/queries/authenticated-user.ts deleted file mode 100644 index 74b82dfb..00000000 --- a/apps/core/src/resources/users/queries/authenticated-user.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { QueryResolvers } from '../../../types/graphql'; -import { AUTH_USER_NOT_FOUND, AUTH_USER_NOT_FOUND_CODE } from '../../../utils/constants'; -import AppError from '../../../utils/errors/app-error'; - -export const authenticatedUser: QueryResolvers['authenticatedUser'] = async (_parent, _args, context) => { - const { userId } = context.req.session; - - if (!userId) { - throw new AppError(AUTH_USER_NOT_FOUND, AUTH_USER_NOT_FOUND_CODE); - } - - const user = await context.db.user.findById(userId); - - if (!user) { - throw new AppError(AUTH_USER_NOT_FOUND, AUTH_USER_NOT_FOUND_CODE); - } - - return user; -}; diff --git a/apps/core/src/resources/users/schema.graphql.ts b/apps/core/src/resources/users/schema.graphql.ts deleted file mode 100644 index 8c3da969..00000000 --- a/apps/core/src/resources/users/schema.graphql.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { gql } from 'apollo-server-core'; - -export default gql` - type LoginResult { - token: String! - } - - input SignupUserInput { - email: String! - name: String! - password: String! - } - - type SignupUserResult { - message: String! - } - - extend type Query { - authenticatedUser: User! - } - - extend type Mutation { - loginUser(email: String!, password: String!): LoginResult! - logoutUser: Boolean! - signupUser(input: SignupUserInput!): SignupUserResult! - } -`; diff --git a/apps/core/src/server/config/build-context.ts b/apps/core/src/server/config/build-context.ts deleted file mode 100644 index 305972a4..00000000 --- a/apps/core/src/server/config/build-context.ts +++ /dev/null @@ -1,45 +0,0 @@ -import { - NewsletterService, - folderService, - roleService, - sessionService, - snippetService, - userService, -} from '@snipcode/domain'; -import { Request, Response } from 'express'; - -import { env } from '../../configs/env'; -import { AppContext } from '../../types/common'; - -const getUserFromToken = async (req: Request): Promise => { - const token = req.headers['authorization']; - - if (!token) { - return; - } - const session = await sessionService.findByToken(token); - - return session?.userId; -}; - -export const buildGraphQLContext = async (req: Request, res: Response): Promise => { - const userId = await getUserFromToken(req); - - const newsletterService = new NewsletterService({ - apiKey: env.CONVERTKIT_API_KEY, - formId: env.CONVERTKIT_FORM_ID, - }); - - return { - db: { - folder: folderService, - newsletter: newsletterService, - role: roleService, - session: sessionService, - snippet: snippetService, - user: userService, - }, - req: Object.assign(req, { session: { userId } }), - res, - }; -}; diff --git a/apps/core/src/server/graphql.ts b/apps/core/src/server/graphql.ts deleted file mode 100644 index 88a4964b..00000000 --- a/apps/core/src/server/graphql.ts +++ /dev/null @@ -1,52 +0,0 @@ -import { Server } from 'http'; - -import { mergeSchemas } from '@graphql-tools/schema'; -import { - ApolloServerPluginDrainHttpServer, - ApolloServerPluginLandingPageLocalDefault, - PluginDefinition, -} from 'apollo-server-core'; -import { ApolloServer } from 'apollo-server-express'; -import { Application } from 'express'; - -import { buildGraphQLContext } from './config/build-context'; -import { env } from '../configs/env'; -import resolvers from '../resources/resolvers'; -import schemas from '../resources/schemas'; -import { AppContext } from '../types/common'; -import { CORS_APOLLO_STUDIO_URL } from '../utils/constants'; - -const explorerPlugin: PluginDefinition[] = env.IS_PROD - ? [] - : [ApolloServerPluginLandingPageLocalDefault({ embed: true })]; - -export const startGraphqlServer = async (expressApplication: Application, httpServer: Server) => { - const schemaWithResolvers = mergeSchemas({ - resolvers, - typeDefs: schemas, - }); - - const apolloServer = new ApolloServer({ - cache: 'bounded', - context: async ({ req, res }): Promise => buildGraphQLContext(req, res), - debug: env.IS_DEV, - introspection: env.ENABLE_INTROSPECTION, - plugins: [ - ApolloServerPluginDrainHttpServer({ httpServer }), // graceful shutdown - ...explorerPlugin, - ], - schema: schemaWithResolvers, - }); - - await apolloServer.start(); - - apolloServer.applyMiddleware({ - app: expressApplication, - cors: { - credentials: true, - origin: [env.WEB_APP_URL, CORS_APOLLO_STUDIO_URL], - }, - }); - - return apolloServer; -}; diff --git a/apps/core/src/server/middleware/error-middleware.ts b/apps/core/src/server/middleware/error-middleware.ts deleted file mode 100644 index f62c1b0e..00000000 --- a/apps/core/src/server/middleware/error-middleware.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { errors } from '@snipcode/utils'; -import { NextFunction, Request, Response } from 'express'; - -import { logger } from '../../configs/logger'; - -// eslint-disable-next-line @typescript-eslint/no-unused-vars -export const errorHandlerMiddleware = (error: unknown, _req: Request, res: Response, _next: NextFunction) => { - logger.error(error); - - return res.status(500).json({ message: errors.INTERNAL_SERVER_ERROR }); -}; diff --git a/apps/core/src/server/middleware/not-found-middleware.ts b/apps/core/src/server/middleware/not-found-middleware.ts deleted file mode 100644 index 4c4dc747..00000000 --- a/apps/core/src/server/middleware/not-found-middleware.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { Request, Response } from 'express'; - -import { PATH_NOT_FOUND } from '../../utils/constants'; - -export const notFoundMiddleware = (_req: Request, res: Response) => { - return res.status(404).json({ message: PATH_NOT_FOUND }); -}; diff --git a/apps/core/src/server/rest.ts b/apps/core/src/server/rest.ts deleted file mode 100644 index e681c8d3..00000000 --- a/apps/core/src/server/rest.ts +++ /dev/null @@ -1,28 +0,0 @@ -import express, { Application, Request, Response } from 'express'; - -import { errorHandlerMiddleware } from './middleware/error-middleware'; -import { notFoundMiddleware } from './middleware/not-found-middleware'; -import { authenticationRoute } from '../resources/authentication/routes'; -import { snippetRoute } from '../resources/snippets/routes'; - -export const setupRestEndpoints = (app: Application) => { - const router = express.Router(); - - app.use(express.urlencoded({ extended: true })); - app.use(express.json()); - - // Allow express to handle cookie and session on a reverse proxy - app.set('trust proxy', true); - - app.use('/', router); - app.use('/', authenticationRoute()); - app.use('/', snippetRoute()); - - app.get('/', (_req: Request, res: Response) => { - res.json({ message: 'Hello from Snipcode!' }); - }); - - app.use(notFoundMiddleware); - - app.use(errorHandlerMiddleware); -}; diff --git a/apps/core/src/tests/index.test.ts b/apps/core/src/tests/index.test.ts deleted file mode 100644 index ec8cb632..00000000 --- a/apps/core/src/tests/index.test.ts +++ /dev/null @@ -1,5 +0,0 @@ -describe('Test Suites', () => { - test('default tests', () => { - expect(true).toEqual(true); - }); -}); diff --git a/apps/core/src/types/common.ts b/apps/core/src/types/common.ts deleted file mode 100644 index bbe9009d..00000000 --- a/apps/core/src/types/common.ts +++ /dev/null @@ -1,65 +0,0 @@ -import { - FolderService, - NewsletterService, - RoleService, - SessionService, - SnippetService, - UserService, -} from '@snipcode/domain'; -import { Request, Response } from 'express'; -import { Query, Send } from 'express-serve-static-core'; - -import { EnvironmentVariables } from '../../env'; - -export type AppEnvironmentVariables = Omit< - EnvironmentVariables, - 'ENABLE_INTROSPECTION' | 'PORT' | 'REQUEST_TIMEOUT' | 'SESSION_LIFETIME' -> & { - ENABLE_INTROSPECTION: boolean; - IS_DEV: boolean; - IS_PROD: boolean; - PORT: number; - REQUEST_TIMEOUT: number; - SENTRY_ENABLED: boolean; - SESSION_LIFETIME: number; - VALUE: string; -}; - -export type AppContext = { - db: { - folder: FolderService; - newsletter: NewsletterService; - role: RoleService; - session: SessionService; - snippet: SnippetService; - user: UserService; - }; - req: Request & { session: { userId?: string } }; - res: Response; -}; - -// eslint-disable-next-line @typescript-eslint/consistent-type-definitions -export interface ExpressRequestBody extends Express.Request { - body: T; -} - -// eslint-disable-next-line @typescript-eslint/consistent-type-definitions -export interface ExpressRequestParams extends Express.Request { - params: T; -} - -// eslint-disable-next-line @typescript-eslint/consistent-type-definitions -export interface ExpressRequestQuery extends Express.Request { - query: T; -} - -// eslint-disable-next-line @typescript-eslint/consistent-type-definitions -export interface ExpressRequest extends Express.Request { - body: U; - query: T; -} - -// eslint-disable-next-line @typescript-eslint/consistent-type-definitions -export interface ExpressResponse extends Express.Response { - json: Send; -} diff --git a/apps/core/src/types/express.d.ts b/apps/core/src/types/express.d.ts deleted file mode 100644 index e052dec1..00000000 --- a/apps/core/src/types/express.d.ts +++ /dev/null @@ -1,8 +0,0 @@ -declare namespace Express { - // eslint-disable-next-line @typescript-eslint/consistent-type-definitions - export interface Request { - session: { - userId?: string; - }; - } -} diff --git a/apps/core/src/types/graphql.d.ts b/apps/core/src/types/graphql.d.ts deleted file mode 100644 index 8913a50f..00000000 --- a/apps/core/src/types/graphql.d.ts +++ /dev/null @@ -1,659 +0,0 @@ -import { GraphQLResolveInfo, GraphQLScalarType, GraphQLScalarTypeConfig } from 'graphql'; -import { Role, User, Folder, Snippet } from 'models'; -import { AppContext } from './common'; -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 ResolverFn = ( - parent: TParent, - args: TArgs, - context: TContext, - info?: GraphQLResolveInfo, -) => Promise | TResult; - -export type Omit = Pick>; -export type RequireFields = Omit & { [P in K]-?: NonNullable }; -/** All built-in and custom scalars, mapped to their actual values */ -export type Scalars = { - ID: string; - String: string; - Boolean: boolean; - Int: number; - Float: number; - Date: Date; -}; - -export type CreateFolderInput = { - name: Scalars['String']; - parentId: Scalars['String']; -}; - -export type CreateSnippetInput = { - content: Scalars['String']; - contentHighlighted: Scalars['String']; - description?: InputMaybe; - folderId: Scalars['String']; - language: Scalars['String']; - lineHighlight?: InputMaybe; - name: Scalars['String']; - theme: Scalars['String']; - visibility: SnippetVisibility; -}; - -export type Directory = { - __typename?: 'Directory'; - folders: Array; - paths: Array; - snippets: Array; -}; - -export type Folder = { - __typename?: 'Folder'; - createdAt: Scalars['Date']; - id: Scalars['ID']; - isFavorite: Scalars['Boolean']; - name: Scalars['String']; - parent?: Maybe; - subFolders: Array; - subFoldersCount: Scalars['Int']; - updatedAt: Scalars['Date']; - user: User; -}; - -export type LoginResult = { - __typename?: 'LoginResult'; - token: Scalars['String']; -}; - -export type Mutation = { - __typename?: 'Mutation'; - createFolder: Folder; - createSnippet: Snippet; - deleteFolders: Scalars['Boolean']; - deleteSnippet: Scalars['Boolean']; - loginUser: LoginResult; - logoutUser: Scalars['Boolean']; - signupUser: SignupUserResult; - subscribeToNewsletter: Result; - updateFolder: Folder; - updateSnippet: Snippet; -}; - -export type MutationCreateFolderArgs = { - input: CreateFolderInput; -}; - -export type MutationCreateSnippetArgs = { - input: CreateSnippetInput; -}; - -export type MutationDeleteFoldersArgs = { - folderIds: Array; -}; - -export type MutationDeleteSnippetArgs = { - id: Scalars['ID']; -}; - -export type MutationLoginUserArgs = { - email: Scalars['String']; - password: Scalars['String']; -}; - -export type MutationSignupUserArgs = { - input: SignupUserInput; -}; - -export type MutationSubscribeToNewsletterArgs = { - email: Scalars['String']; -}; - -export type MutationUpdateFolderArgs = { - id: Scalars['ID']; - input: UpdateFolderInput; -}; - -export type MutationUpdateSnippetArgs = { - id: Scalars['ID']; - input: UpdateSnippetInput; -}; - -export const OauthProvider = { - Github: 'github', - Stackoverflow: 'stackoverflow', - Twitter: 'twitter', -} as const; - -export type OauthProvider = typeof OauthProvider[keyof typeof OauthProvider]; -export type PublicSnippetsInput = { - itemPerPage?: InputMaybe; - keyword?: InputMaybe; - nextToken?: InputMaybe; - sortMethod?: InputMaybe; -}; - -export type PublicSnippetsResult = { - __typename?: 'PublicSnippetsResult'; - hasMore: Scalars['Boolean']; - itemPerPage?: Maybe; - items: Array; - nextToken?: Maybe; -}; - -export type Query = { - __typename?: 'Query'; - authenticatedUser: User; - findFolder: Folder; - findSnippet: SnippetInfo; - /** @deprecated Field no longer supported */ - hello: Scalars['String']; - listDirectory?: Maybe; - listFolders: Array; - mySnippets: Array; - /** @deprecated https://stackoverflow.com/questions/59868942/graphql-a-schema-must-have-a-query-operation-defined */ - ping?: Maybe; - publicSnippets: PublicSnippetsResult; -}; - -export type QueryFindFolderArgs = { - folderId: Scalars['String']; -}; - -export type QueryFindSnippetArgs = { - snippetId: Scalars['String']; -}; - -export type QueryListDirectoryArgs = { - folderId: Scalars['String']; -}; - -export type QueryListFoldersArgs = { - folderId?: InputMaybe; -}; - -export type QueryPublicSnippetsArgs = { - input: PublicSnippetsInput; -}; - -export type Result = { - __typename?: 'Result'; - message: Scalars['String']; -}; - -export type Role = { - __typename?: 'Role'; - createdAt: Scalars['Date']; - description?: Maybe; - id: Scalars['ID']; - level: Scalars['Int']; - name: RoleName; - updatedAt: Scalars['Date']; -}; - -export const RoleName = { - Admin: 'admin', - User: 'user', -} as const; - -export type RoleName = typeof RoleName[keyof typeof RoleName]; -export type SignupUserInput = { - email: Scalars['String']; - name: Scalars['String']; - password: Scalars['String']; -}; - -export type SignupUserResult = { - __typename?: 'SignupUserResult'; - message: Scalars['String']; -}; - -export type Snippet = { - __typename?: 'Snippet'; - content: Scalars['String']; - contentHighlighted: Scalars['String']; - createdAt: Scalars['Date']; - description?: Maybe; - folder: Folder; - id: Scalars['ID']; - language: Scalars['String']; - lineHighlight?: Maybe; - name: Scalars['String']; - size: Scalars['Int']; - theme: Scalars['String']; - updatedAt: Scalars['Date']; - user: User; - visibility: SnippetVisibility; -}; - -export type SnippetInfo = { - __typename?: 'SnippetInfo'; - paths: Array; - snippet: Snippet; -}; - -export const SnippetSortMethod = { - RecentlyCreated: 'recently_created', - RecentlyUpdated: 'recently_updated', -} as const; - -export type SnippetSortMethod = typeof SnippetSortMethod[keyof typeof SnippetSortMethod]; -export const SnippetVisibility = { - Private: 'private', - Public: 'public', -} as const; - -export type SnippetVisibility = typeof SnippetVisibility[keyof typeof SnippetVisibility]; -export type UpdateFolderInput = { - name: Scalars['String']; -}; - -export type UpdateSnippetInput = { - content: Scalars['String']; - contentHighlighted: Scalars['String']; - description?: InputMaybe; - language: Scalars['String']; - lineHighlight?: InputMaybe; - name: Scalars['String']; - theme: Scalars['String']; - visibility: SnippetVisibility; -}; - -export type User = { - __typename?: 'User'; - createdAt: Scalars['Date']; - email: Scalars['String']; - folders: Array; - id: Scalars['ID']; - isEnabled: Scalars['Boolean']; - name: Scalars['String']; - oauthProvider?: Maybe; - pictureUrl?: Maybe; - role: Role; - rootFolder: Folder; - timezone?: Maybe; - updatedAt: Scalars['Date']; - username?: Maybe; -}; - -export type ResolverTypeWrapper = Promise | T; - -export type ResolverWithResolve = { - resolve: ResolverFn; -}; -export type Resolver = - | ResolverFn - | ResolverWithResolve; - -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 = { - Boolean: ResolverTypeWrapper; - CreateFolderInput: CreateFolderInput; - CreateSnippetInput: CreateSnippetInput; - Date: ResolverTypeWrapper; - Directory: ResolverTypeWrapper< - Omit & { - folders: Array; - paths: Array; - snippets: Array; - } - >; - Folder: ResolverTypeWrapper; - ID: ResolverTypeWrapper; - Int: ResolverTypeWrapper; - LoginResult: ResolverTypeWrapper; - Mutation: ResolverTypeWrapper<{}>; - OauthProvider: OauthProvider; - PublicSnippetsInput: PublicSnippetsInput; - PublicSnippetsResult: ResolverTypeWrapper< - Omit & { items: Array } - >; - Query: ResolverTypeWrapper<{}>; - Result: ResolverTypeWrapper; - Role: ResolverTypeWrapper; - RoleName: RoleName; - SignupUserInput: SignupUserInput; - SignupUserResult: ResolverTypeWrapper; - Snippet: ResolverTypeWrapper; - SnippetInfo: ResolverTypeWrapper< - Omit & { - paths: Array; - snippet: ResolversTypes['Snippet']; - } - >; - SnippetSortMethod: SnippetSortMethod; - SnippetVisibility: SnippetVisibility; - String: ResolverTypeWrapper; - UpdateFolderInput: UpdateFolderInput; - UpdateSnippetInput: UpdateSnippetInput; - User: ResolverTypeWrapper; -}; - -/** Mapping between all available schema types and the resolvers parents */ -export type ResolversParentTypes = { - Boolean: Scalars['Boolean']; - CreateFolderInput: CreateFolderInput; - CreateSnippetInput: CreateSnippetInput; - Date: Scalars['Date']; - Directory: Omit & { - folders: Array; - paths: Array; - snippets: Array; - }; - Folder: Folder; - ID: Scalars['ID']; - Int: Scalars['Int']; - LoginResult: LoginResult; - Mutation: {}; - PublicSnippetsInput: PublicSnippetsInput; - PublicSnippetsResult: Omit & { items: Array }; - Query: {}; - Result: Result; - Role: Role; - SignupUserInput: SignupUserInput; - SignupUserResult: SignupUserResult; - Snippet: Snippet; - SnippetInfo: Omit & { - paths: Array; - snippet: ResolversParentTypes['Snippet']; - }; - String: Scalars['String']; - UpdateFolderInput: UpdateFolderInput; - UpdateSnippetInput: UpdateSnippetInput; - User: User; -}; - -export interface DateScalarConfig extends GraphQLScalarTypeConfig { - name: 'Date'; -} - -export type DirectoryResolvers< - ContextType = AppContext, - ParentType extends ResolversParentTypes['Directory'] = ResolversParentTypes['Directory'], -> = { - folders?: Resolver, ParentType, ContextType>; - paths?: Resolver, ParentType, ContextType>; - snippets?: Resolver, ParentType, ContextType>; - __isTypeOf?: IsTypeOfResolverFn; -}; - -export type FolderResolvers< - ContextType = AppContext, - ParentType extends ResolversParentTypes['Folder'] = ResolversParentTypes['Folder'], -> = { - createdAt?: Resolver; - id?: Resolver; - isFavorite?: Resolver; - name?: Resolver; - parent?: Resolver, ParentType, ContextType>; - subFolders?: Resolver, ParentType, ContextType>; - subFoldersCount?: Resolver; - updatedAt?: Resolver; - user?: Resolver; - __isTypeOf?: IsTypeOfResolverFn; -}; - -export type LoginResultResolvers< - ContextType = AppContext, - ParentType extends ResolversParentTypes['LoginResult'] = ResolversParentTypes['LoginResult'], -> = { - token?: Resolver; - __isTypeOf?: IsTypeOfResolverFn; -}; - -export type MutationResolvers< - ContextType = AppContext, - ParentType extends ResolversParentTypes['Mutation'] = ResolversParentTypes['Mutation'], -> = { - createFolder?: Resolver< - ResolversTypes['Folder'], - ParentType, - ContextType, - RequireFields - >; - createSnippet?: Resolver< - ResolversTypes['Snippet'], - ParentType, - ContextType, - RequireFields - >; - deleteFolders?: Resolver< - ResolversTypes['Boolean'], - ParentType, - ContextType, - RequireFields - >; - deleteSnippet?: Resolver< - ResolversTypes['Boolean'], - ParentType, - ContextType, - RequireFields - >; - loginUser?: Resolver< - ResolversTypes['LoginResult'], - ParentType, - ContextType, - RequireFields - >; - logoutUser?: Resolver; - signupUser?: Resolver< - ResolversTypes['SignupUserResult'], - ParentType, - ContextType, - RequireFields - >; - subscribeToNewsletter?: Resolver< - ResolversTypes['Result'], - ParentType, - ContextType, - RequireFields - >; - updateFolder?: Resolver< - ResolversTypes['Folder'], - ParentType, - ContextType, - RequireFields - >; - updateSnippet?: Resolver< - ResolversTypes['Snippet'], - ParentType, - ContextType, - RequireFields - >; -}; - -export type PublicSnippetsResultResolvers< - ContextType = AppContext, - ParentType extends ResolversParentTypes['PublicSnippetsResult'] = ResolversParentTypes['PublicSnippetsResult'], -> = { - hasMore?: Resolver; - itemPerPage?: Resolver, ParentType, ContextType>; - items?: Resolver, ParentType, ContextType>; - nextToken?: Resolver, ParentType, ContextType>; - __isTypeOf?: IsTypeOfResolverFn; -}; - -export type QueryResolvers< - ContextType = AppContext, - ParentType extends ResolversParentTypes['Query'] = ResolversParentTypes['Query'], -> = { - authenticatedUser?: Resolver; - findFolder?: Resolver< - ResolversTypes['Folder'], - ParentType, - ContextType, - RequireFields - >; - findSnippet?: Resolver< - ResolversTypes['SnippetInfo'], - ParentType, - ContextType, - RequireFields - >; - hello?: Resolver; - listDirectory?: Resolver< - Maybe, - ParentType, - ContextType, - RequireFields - >; - listFolders?: Resolver, ParentType, ContextType, Partial>; - mySnippets?: Resolver, ParentType, ContextType>; - ping?: Resolver, ParentType, ContextType>; - publicSnippets?: Resolver< - ResolversTypes['PublicSnippetsResult'], - ParentType, - ContextType, - RequireFields - >; -}; - -export type ResultResolvers< - ContextType = AppContext, - ParentType extends ResolversParentTypes['Result'] = ResolversParentTypes['Result'], -> = { - message?: Resolver; - __isTypeOf?: IsTypeOfResolverFn; -}; - -export type RoleResolvers< - ContextType = AppContext, - ParentType extends ResolversParentTypes['Role'] = ResolversParentTypes['Role'], -> = { - createdAt?: Resolver; - description?: Resolver, ParentType, ContextType>; - id?: Resolver; - level?: Resolver; - name?: Resolver; - updatedAt?: Resolver; - __isTypeOf?: IsTypeOfResolverFn; -}; - -export type SignupUserResultResolvers< - ContextType = AppContext, - ParentType extends ResolversParentTypes['SignupUserResult'] = ResolversParentTypes['SignupUserResult'], -> = { - message?: Resolver; - __isTypeOf?: IsTypeOfResolverFn; -}; - -export type SnippetResolvers< - ContextType = AppContext, - ParentType extends ResolversParentTypes['Snippet'] = ResolversParentTypes['Snippet'], -> = { - content?: Resolver; - contentHighlighted?: Resolver; - createdAt?: Resolver; - description?: Resolver, ParentType, ContextType>; - folder?: Resolver; - id?: Resolver; - language?: Resolver; - lineHighlight?: Resolver, ParentType, ContextType>; - name?: Resolver; - size?: Resolver; - theme?: Resolver; - updatedAt?: Resolver; - user?: Resolver; - visibility?: Resolver; - __isTypeOf?: IsTypeOfResolverFn; -}; - -export type SnippetInfoResolvers< - ContextType = AppContext, - ParentType extends ResolversParentTypes['SnippetInfo'] = ResolversParentTypes['SnippetInfo'], -> = { - paths?: Resolver, ParentType, ContextType>; - snippet?: Resolver; - __isTypeOf?: IsTypeOfResolverFn; -}; - -export type UserResolvers< - ContextType = AppContext, - ParentType extends ResolversParentTypes['User'] = ResolversParentTypes['User'], -> = { - createdAt?: Resolver; - email?: Resolver; - folders?: Resolver, ParentType, ContextType>; - id?: Resolver; - isEnabled?: Resolver; - name?: Resolver; - oauthProvider?: Resolver, ParentType, ContextType>; - pictureUrl?: Resolver, ParentType, ContextType>; - role?: Resolver; - rootFolder?: Resolver; - timezone?: Resolver, ParentType, ContextType>; - updatedAt?: Resolver; - username?: Resolver, ParentType, ContextType>; - __isTypeOf?: IsTypeOfResolverFn; -}; - -export type Resolvers = { - Date?: GraphQLScalarType; - Directory?: DirectoryResolvers; - Folder?: FolderResolvers; - LoginResult?: LoginResultResolvers; - Mutation?: MutationResolvers; - PublicSnippetsResult?: PublicSnippetsResultResolvers; - Query?: QueryResolvers; - Result?: ResultResolvers; - Role?: RoleResolvers; - SignupUserResult?: SignupUserResultResolvers; - Snippet?: SnippetResolvers; - SnippetInfo?: SnippetInfoResolvers; - User?: UserResolvers; -}; diff --git a/apps/core/src/utils/auth/session.ts b/apps/core/src/utils/auth/session.ts deleted file mode 100644 index 0fd04a29..00000000 --- a/apps/core/src/utils/auth/session.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { CreateSessionDto, Session, sessionService } from '@snipcode/domain'; -import { addDayToDate } from '@snipcode/utils'; - -import { env } from '../../configs/env'; - -export const createUserSession = async (userId: string): Promise => { - const sessionInput = new CreateSessionDto({ - expireDate: addDayToDate(env.SESSION_LIFETIME), - userId, - }); - - return sessionService.create(sessionInput); -}; - -export const authSuccessURL = (sessionToken: string): string => { - return `${env.WEB_AUTH_SUCCESS_URL}?token=${sessionToken}`; -}; diff --git a/apps/core/src/utils/db/data-init.ts b/apps/core/src/utils/db/data-init.ts deleted file mode 100644 index b656a422..00000000 --- a/apps/core/src/utils/db/data-init.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { roleService, userService } from '@snipcode/domain'; - -import { env } from '../../configs/env'; - -export const loadData = async () => { - await roleService.loadRoles(); - - const adminRole = await roleService.findByName('admin'); - - if (!adminRole) { - throw new Error('[Data Loader]: Role administrator not found'); - } - - await userService.loadAdminUser(adminRole, env.ADMIN_PASSWORD); -}; diff --git a/apps/core/src/utils/errors/app-error.ts b/apps/core/src/utils/errors/app-error.ts deleted file mode 100644 index da66e28a..00000000 --- a/apps/core/src/utils/errors/app-error.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { ApolloError } from 'apollo-server-core'; - -export default class AppError extends ApolloError { - constructor(message: string, code: string, extensions?: Record) { - super(message, code, extensions); - } -} diff --git a/apps/core/src/utils/errors/throw-error.ts b/apps/core/src/utils/errors/throw-error.ts deleted file mode 100644 index bb9a2248..00000000 --- a/apps/core/src/utils/errors/throw-error.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { errors } from '@snipcode/utils'; - -import AppError from './app-error'; - -const isSnipcodeError = (error: any) => { - return 'message' in error && 'code' in error; -}; - -export const throwApplicationError = (error: any) => { - if (isSnipcodeError(error)) { - throw new AppError(error.message, error.code); - } - - throw new AppError(errors.INTERNAL_SERVER_ERROR, 'INTERNAL_SERVER_ERROR'); -}; diff --git a/apps/core/tsconfig.prod.json b/apps/core/tsconfig.prod.json deleted file mode 100644 index 091fd772..00000000 --- a/apps/core/tsconfig.prod.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "extends": "./tsconfig", - "compilerOptions": { - "sourceMap": false - }, - "exclude": ["src/tests"] -} diff --git a/apps/functions/code-embed/.env.template b/apps/functions/code-embed/.env.template deleted file mode 100644 index 7ba75825..00000000 --- a/apps/functions/code-embed/.env.template +++ /dev/null @@ -1,7 +0,0 @@ -DATABASE_URL="mysql://root:@127.0.0.1:3311/snipcode" -EMBED_STYLE_URL=https://cdn.jsdelivr.net/npm/snipcode-embed@latest/style.min.css -EMBED_JS_URL=https://cdn.jsdelivr.net/npm/snipcode-embed@latest/script.min.js -ENV=development -SENTRY_DSN= -WEB_APP_URL=http://localhost:7500 -WEB_APP_SNIPPET_VIEW_URL=http://localhost:7500/snippets diff --git a/apps/functions/code-embed/.eslintrc.json b/apps/functions/code-embed/.eslintrc.json deleted file mode 100644 index 604d2139..00000000 --- a/apps/functions/code-embed/.eslintrc.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "root": true, - "extends": "../../../.eslintrc.json", - "ignorePatterns": [], - "parserOptions": { - "ecmaVersion": 2023, - "sourceType": "module", - "project": "tsconfig.json" - } -} diff --git a/apps/functions/code-embed/.gitignore b/apps/functions/code-embed/.gitignore deleted file mode 100644 index 16460889..00000000 --- a/apps/functions/code-embed/.gitignore +++ /dev/null @@ -1,13 +0,0 @@ -# package directories -node_modules -jspm_packages - -# Serverless directories -.serverless - -# esbuild directories -.esbuild -.turbo -lib -.env -.env.dev diff --git a/apps/functions/code-embed/CHANGELOG.md b/apps/functions/code-embed/CHANGELOG.md deleted file mode 100644 index 0f0dbacd..00000000 --- a/apps/functions/code-embed/CHANGELOG.md +++ /dev/null @@ -1,9 +0,0 @@ -# @snipcode/code-embed - -## 1.0.1 - -### Patch Changes - -- 43e67ac: Merge the database schema and the application business rules into a single package -- Updated dependencies [43e67ac] - - @snipcode/embed@1.1.4 diff --git a/apps/functions/code-embed/README.md b/apps/functions/code-embed/README.md deleted file mode 100644 index 10edbb05..00000000 --- a/apps/functions/code-embed/README.md +++ /dev/null @@ -1,108 +0,0 @@ -# Snipcode code snippet renderer -This project take a snippet ID and generate the HTML content to be embedded in a web page. - -## Tech stack -* Node.js -* Typescript -* MySQL 8 through PlanetScale -* Prisma - -## Prerequisites -Make sure you have this tools installed before running the project -* Node.js 18+ -* Yarn -* AWS CLI v2 - -## Packages dependencies -We use Yarn workspace to create packages we can share with other applications. -These packages are located in the folder `packages`, so you might need to change the code of one or many packages to implement a feature. -Here are the packages used in this project: - -* [@snipcode/database](../../../packages/database) -* [@snipcode/embed](../../../packages/embed) - -## Set up -> **Note**: This repo requires a connection to the database, follow the instructions in the **database** packages before going to the next step. - - -Delete the existing folders output from build commands -```shell -yarn clean -``` -Install node modules -````shell -yarn install -```` -Create configuration file from the template -```shell -cp .env.template .env - -# Edit configuration to match your local environment and save -nano .env -``` - -**Environment variables list** - -| Variable | Description | -|------------------|---------------------------------------------------------------------| -| ENV | Node.js environment (default: development) | -| DATABASE_URL | The database connection string | -| EMBED_STYLE_URL | The CDN URL of the style to embed in the generated HTML | -| EMBED_JS_URL | The CDN URL of the Javascript to embed in the generated HTML | -| WEB_APP_URL | URL of the frontend the application that communicates with this app | -| SENTRY_DSN | Sentry DSN | - -## Test locally -There are two ways to test the Lambda function local: - -* **Invocation in the CLI** -You can invoke the function locally for that -1. Edit the `pathParameters` property in the file `src/functions/renderer/mock.json` to set the ID of snippet you want to render -2. Run the command below the see to result: - -```shell -yarn invoke:local -``` - -This command will output the HTML content generated. - -* **Preview in the browser** -If you want to see a visual result of the generated HTML, run the command below: - -```shell -yarn offline -``` - -Open your browser and navigate to [http://localhost:3000/dev/snippets/{id}](http://localhost:3000/dev/snippets/{id}) - -Replace the parameter `{id}` with the ID of snippet you want to preview. - -> **Note**: There is no live reload support so, if you edit the code, you must stop the CLI and rerun `yarn offline`. - -## Deploy in dev -* **Method 1** - -To deploy from your computer, run the command below: -```shell -yarn deploy:dev -``` -The deployment will fail if no value is provided for the property `SENTRY_DSN` so, make sure you provided this value. - -* **Method 2** -If you don't want to manage environment variable locally, you can: -1. Commit your changes on your branch -2. Rebase to the main branch -3. Create a branch named `dev` from your current branch -4. Force push and the code will be automagically deployed in dev for you - -## Lambda Layers -This function use two Lambda layers: -* **Prisma layer**: contains the Prisma client with the models to interact to our database. -* **Shiki layer**: contains the node_modules dependencies for highlighting the code. - -Using them as layers reduce the bundle size of the Lambda and thus improve the cold start. - - -### Advanced usage - -Any tsconfig.json can be used, but if you do, set the environment variable `TS_NODE_CONFIG` for building the application, eg `TS_NODE_CONFIG=./tsconfig.app.json npx serverless webpack` diff --git a/apps/functions/code-embed/env.d.ts b/apps/functions/code-embed/env.d.ts deleted file mode 100644 index 475d73be..00000000 --- a/apps/functions/code-embed/env.d.ts +++ /dev/null @@ -1,14 +0,0 @@ -export type EnvironmentVariables = { - EMBED_JS_URL: string; - EMBED_STYLE_URL: string; - WEB_APP_URL: string; - WEB_APP_SNIPPET_VIEW_URL: string; -}; - -declare global { - namespace NodeJS { - type ProcessEnv = EnvironmentVariables; - } -} - -export {}; diff --git a/apps/functions/code-embed/package.json b/apps/functions/code-embed/package.json deleted file mode 100644 index b4da1dd8..00000000 --- a/apps/functions/code-embed/package.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "name": "@snipcode/code-embed", - "version": "1.0.1", - "private": true, - "description": "Generate the HTML page from a code snippet", - "main": "serverless.ts", - "scripts": { - "build": "tsc", - "clean": "rm -rf .turbo lib .esbuild .serverless", - "lint": "eslint src serverless.ts", - "invoke:local": "sls invoke local -f renderer --path src/functions/renderer/mock.json", - "offline": "sls offline start", - "setup:layer:local": "./scripts/setup-layer.sh local", - "setup:layer:remote": "./scripts/setup-layer.sh remote", - "reset:env": "cp -f .env.template .env", - "deploy:dev": "yarn setup:layer:remote && cp -f .env.dev .env && sls deploy --stage dev && yarn reset:env" - }, - "engines": { - "node": ">=16.14.0" - }, - "dependencies": { - "@snipcode/embed": "workspace:*", - "shiki": "^0.11.1" - }, - "devDependencies": { - "@serverless/typescript": "3.21.0", - "@types/aws-lambda": "8.10.136", - "esbuild": "0.20.2", - "serverless": "3.22.0", - "serverless-certificate-creator": "1.6.0", - "serverless-domain-manager": "6.4.4", - "serverless-esbuild": "1.52.1", - "serverless-offline": "13.3.3", - "ts-node": "10.9.2", - "tsconfig-paths": "4.2.0" - } -} diff --git a/apps/functions/code-embed/scripts/setup-layer.sh b/apps/functions/code-embed/scripts/setup-layer.sh deleted file mode 100755 index 25f1b45d..00000000 --- a/apps/functions/code-embed/scripts/setup-layer.sh +++ /dev/null @@ -1,34 +0,0 @@ -#!/usr/bin/env bash - -rm -rf layers - -mkdir -p layers -mkdir -p layers/prisma-layer/nodejs/node_modules/@prisma -mkdir -p layers/shiki-layer/nodejs/node_modules - -cd ../../.. - -yarn workspace @snipcode/domain db:generate - -cp -r node_modules/.prisma apps/functions/code-embed/layers/prisma-layer/nodejs/node_modules - -PRISMA_ENGINE_MACOS=apps/functions/code-embed/layers/prisma-layer/nodejs/node_modules/.prisma/client/libquery_engine-darwin.dylib.node -PRISMA_ENGINE_DOCKER_LINUX=apps/functions/code-embed/layers/prisma-layer/nodejs/node_modules/.prisma/client/libquery_engine-linux-musl.so.node - -if [ $1 = "remote" ]; then - if [ -f "$PRISMA_ENGINE_MACOS" ]; then - rm $PRISMA_ENGINE_MACOS - fi - if [ -f "$PRISMA_ENGINE_DOCKER_LINUX" ]; then - rm $PRISMA_ENGINE_DOCKER_LINUX - fi -else - echo 'local' -fi - -cp -r node_modules/@prisma/client apps/functions/code-embed/layers/prisma-layer/nodejs/node_modules/@prisma - -cp -r node_modules/shiki apps/functions/code-embed/layers/shiki-layer/nodejs/node_modules -cp -r node_modules/vscode-oniguruma apps/functions/code-embed/layers/shiki-layer/nodejs/node_modules -cp -r node_modules/vscode-textmate apps/functions/code-embed/layers/shiki-layer/nodejs/node_modules -cp -r node_modules/jsonc-parser apps/functions/code-embed/layers/shiki-layer/nodejs/node_modules diff --git a/apps/functions/code-embed/serverless.ts b/apps/functions/code-embed/serverless.ts deleted file mode 100644 index 4b4ce4d4..00000000 --- a/apps/functions/code-embed/serverless.ts +++ /dev/null @@ -1,83 +0,0 @@ -import type { AWS } from '@serverless/typescript'; - -import renderer from '@/functions/renderer'; - -const serverlessConfiguration: AWS = { - configValidationMode: 'error', - custom: { - customCertificate: { - certificateName: '${self:custom.domains.${self:provider.stage}.certificateName}', - hostedZoneNames: 'snipcode.dev.', - region: '${self:provider.region}', - }, - customDomain: { - apiType: 'rest', - autoDomain: false, - basePath: '', - certificateName: '${self:custom.domains.${self:provider.stage}.certificateName}', - createRoute53Record: false, - domainName: '${self:custom.domains.${self:provider.stage}.domainName}', - endpointType: 'regional', - }, - domains: { - dev: { - certificateName: 'embedstaging.snipcode.dev', - domainName: 'embedstaging.snipcode.dev', - }, - prod: { - certificateName: 'embed.snipcode.dev', - domainName: 'embed.snipcode.dev', - }, - }, - esbuild: { - bundle: true, - concurrency: 10, - define: { 'require.resolve': undefined }, - exclude: ['aws-sdk', 'vscode-oniguruma', 'shiki', '@prisma'], - minify: false, - platform: 'node', - sourcemap: true, - target: 'node16', - }, - }, - frameworkVersion: '3', - functions: { renderer }, - layers: { - Prisma: { - path: 'layers/prisma-layer', - }, - Shiki: { - path: 'layers/shiki-layer', - }, - }, - package: { - individually: true, - patterns: ['./src/**'], - }, - plugins: ['serverless-esbuild', 'serverless-offline', 'serverless-domain-manager', 'serverless-certificate-creator'], - provider: { - apiGateway: { - minimumCompressionSize: 1024, - shouldStartNameWithService: true, - }, - environment: { - AWS_NODEJS_CONNECTION_REUSE_ENABLED: '1', - DATABASE_URL: '${env:DATABASE_URL}', - EMBED_JS_URL: '${env:EMBED_JS_URL}', - EMBED_STYLE_URL: '${env:EMBED_STYLE_URL}', - ENV: '${env:ENV}', - NODE_OPTIONS: '--stack-trace-limit=1000', - SENTRY_DSN: '${env:SENTRY_DSN}', - WEB_APP_SNIPPET_VIEW_URL: '${env:WEB_APP_SNIPPET_VIEW_URL}', - WEB_APP_URL: '${env:WEB_APP_URL}', - }, - name: 'aws', - region: 'eu-west-1', - runtime: 'nodejs16.x', - stage: "${opt:stage, 'dev'}", - }, - service: 'code-embed', - useDotenv: true, -}; - -module.exports = serverlessConfiguration; diff --git a/apps/functions/code-embed/src/functions/index.ts b/apps/functions/code-embed/src/functions/index.ts deleted file mode 100644 index b5465026..00000000 --- a/apps/functions/code-embed/src/functions/index.ts +++ /dev/null @@ -1 +0,0 @@ -export { default as renderer } from './renderer'; diff --git a/apps/functions/code-embed/src/functions/renderer/handler.ts b/apps/functions/code-embed/src/functions/renderer/handler.ts deleted file mode 100644 index 312e54c0..00000000 --- a/apps/functions/code-embed/src/functions/renderer/handler.ts +++ /dev/null @@ -1,44 +0,0 @@ -import { dbClient } from '@snipcode/domain'; -import { renderSnippetToHtml } from '@snipcode/embed'; -import { APIGatewayProxyEvent, APIGatewayProxyResult, Handler } from 'aws-lambda'; - -// eslint-disable-next-line @typescript-eslint/no-var-requires -const shiki = require('shiki'); - -const findSnippet = async (id?: string | null) => { - if (!id) { - return null; - } - - return dbClient.snippet.findFirst({ - where: { - id, - visibility: 'public', - }, - }); -}; - -export const main: Handler = async (event) => { - const snippetId = event.pathParameters ? event.pathParameters['id'] : null; - - const snippet = await findSnippet(snippetId); - - const content = await renderSnippetToHtml({ - options: { - scriptUrl: process.env.EMBED_JS_URL, - styleUrl: process.env.EMBED_STYLE_URL, - webAppUrl: process.env.WEB_APP_URL, - webAppViewUrl: process.env.WEB_APP_SNIPPET_VIEW_URL, - }, - shiki, - snippet, - }); - - return { - body: content, - headers: { - 'Content-Type': 'text/html', - }, - statusCode: 200, - }; -}; diff --git a/apps/functions/code-embed/src/functions/renderer/index.ts b/apps/functions/code-embed/src/functions/renderer/index.ts deleted file mode 100644 index 62c29dbb..00000000 --- a/apps/functions/code-embed/src/functions/renderer/index.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { handlerPath } from '@/libs/handler-resolver'; - -export default { - events: [ - { - http: { - method: 'get', - path: 'snippets/{id+}', - request: { - parameters: { - paths: { - id: true, - }, - }, - }, - }, - }, - ], - handler: `${handlerPath(__dirname)}/handler.main`, - layers: [ - { - Ref: 'PrismaLambdaLayer', - }, - { - Ref: 'ShikiLambdaLayer', - }, - ], -}; diff --git a/apps/functions/code-embed/src/functions/renderer/mock.json b/apps/functions/code-embed/src/functions/renderer/mock.json deleted file mode 100644 index 79fc54df..00000000 --- a/apps/functions/code-embed/src/functions/renderer/mock.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "headers": { - "Content-Type": "text/html" - }, - "pathParameters": { - "id": "clog7fvwz0006dfn4g8onhcbl" - }, - "queryStringParameters": { - "foo": "bar" - } -} diff --git a/apps/functions/code-embed/src/libs/handler-resolver.ts b/apps/functions/code-embed/src/libs/handler-resolver.ts deleted file mode 100644 index 60a70c82..00000000 --- a/apps/functions/code-embed/src/libs/handler-resolver.ts +++ /dev/null @@ -1,3 +0,0 @@ -export const handlerPath = (context: string) => { - return `${context.split(process.cwd())[1].substring(1).replace(/\\/g, '/')}`; -}; diff --git a/apps/functions/code-embed/tsconfig.json b/apps/functions/code-embed/tsconfig.json deleted file mode 100644 index 48d4e253..00000000 --- a/apps/functions/code-embed/tsconfig.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "extends": "./tsconfig.paths.json", - "compilerOptions": { - "lib": ["ESNext"], - "moduleResolution": "node", - "noUnusedLocals": true, - "noUnusedParameters": true, - "removeComments": true, - "sourceMap": true, - "target": "ES2020", - "outDir": "lib", - "skipLibCheck": true, - "strictNullChecks": true - }, - "include": ["src/**/*.ts", "serverless.ts", "env.d.ts"], - "exclude": [ - "node_modules/**/*", - ".serverless/**/*", - ".webpack/**/*", - "_warmup/**/*", - ".vscode/**/*" - ], - "ts-node": { - "require": ["tsconfig-paths/register"] - } -} diff --git a/apps/functions/code-embed/tsconfig.paths.json b/apps/functions/code-embed/tsconfig.paths.json deleted file mode 100644 index c091e585..00000000 --- a/apps/functions/code-embed/tsconfig.paths.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "compilerOptions": { - "baseUrl": ".", - "paths": { - "@/functions/*": ["src/functions/*"], - "@/libs/*": ["src/libs/*"] - } - } -} diff --git a/apps/web/.eslintrc.js b/apps/web/.eslintrc.js new file mode 100644 index 00000000..19518ab3 --- /dev/null +++ b/apps/web/.eslintrc.js @@ -0,0 +1,94 @@ +module.exports = { + plugins: [], + root: true, + extends: ['next', 'next/core-web-vitals', '../../.eslintrc.json'], + settings: { + next: { + rootDir: '.', + }, + }, + ignorePatterns: [ + 'jest.config.ts', + '__mocks__', + 'next.config.js', + 'tailwind.config.js', + 'postcss.config.js', + 'next-sitemap.js', + 'sentry.client.config.js', + 'sentry.server.config.js', + '.eslintrc.js', + ], + parserOptions: { + ecmaVersion: 2023, + sourceType: 'module', + project: 'tsconfig.json', + tsconfigRootDir: __dirname, + }, + rules: { + camelcase: 'off', + 'import/prefer-default-export': 'off', + 'react/jsx-filename-extension': 'off', + 'react/jsx-props-no-spreading': 'off', + 'react/no-unused-prop-types': 'off', + 'react/require-default-props': 'off', + 'import/extensions': 'off', + quotes: 'off', + 'jsx-a11y/anchor-is-valid': [ + 'error', + { + components: ['Link'], + specialLink: ['hrefLeft', 'hrefRight'], + aspects: ['invalidHref', 'preferButton'], + }, + ], + '@next/next/no-html-link-for-pages': ['error', '.'], + }, + overrides: [ + { + files: '**/*.+(ts|tsx)', + parser: '@typescript-eslint/parser', + plugins: ['testing-library', 'jest-dom'], + extends: ['prettier', 'plugin:jest-dom/recommended'], + rules: { + '@typescript-eslint/explicit-function-return-type': 'off', + '@typescript-eslint/explicit-module-boundary-types': 'off', + 'no-use-before-define': [0], + '@typescript-eslint/no-use-before-define': [1], + '@typescript-eslint/no-explicit-any': 'off', + '@typescript-eslint/no-var-requires': 'off', + '@typescript-eslint/ban-ts-comment': 'off', + '@typescript-eslint/quotes': [ + 2, + 'single', + { + avoidEscape: true, + }, + ], + 'max-len': [ + 'warn', + { + code: 120, + ignorePattern: '/className=".+"/gm', + ignoreTemplateLiterals: true, + ignoreStrings: true, + ignoreComments: true, + }, + ], + 'sort-keys': 'error', + 'react/destructuring-assignment': 'warn', + 'react/display-name': 'warn', + 'react/prop-types': 'warn', + 'react/sort-prop-types': 'warn', + 'react/no-unescaped-entities': 'off', + 'react/jsx-sort-props': [ + 2, + { + callbacksLast: true, + ignoreCase: false, + shorthandLast: true, + }, + ], + }, + }, + ], +}; diff --git a/apps/web/.eslintrc.json b/apps/web/.eslintrc.json deleted file mode 100644 index 3703e973..00000000 --- a/apps/web/.eslintrc.json +++ /dev/null @@ -1,94 +0,0 @@ -{ - "plugins": [], - "root": true, - "extends": [ - "next", - "next/core-web-vitals", - "../../.eslintrc.json" - ], - "settings": { - "next": { - "rootDir": "." - } - }, - "parserOptions": { - "ecmaVersion": 2023, - "sourceType": "module", - "project": "tsconfig.json" - }, - "rules": { - "camelcase": "off", - "import/prefer-default-export": "off", - "react/jsx-filename-extension": "off", - "react/jsx-props-no-spreading": "off", - "react/no-unused-prop-types": "off", - "react/require-default-props": "off", - "import/extensions": "off", - "quotes": "off", - "jsx-a11y/anchor-is-valid": [ - "error", - { - "components": ["Link"], - "specialLink": ["hrefLeft", "hrefRight"], - "aspects": ["invalidHref", "preferButton"] - } - ], - "@next/next/no-html-link-for-pages": ["error", "."] - }, - "overrides": [ - { - "files": "**/*.+(ts|tsx)", - "parser": "@typescript-eslint/parser", - "plugins": ["testing-library", "jest-dom"], - "extends": ["prettier", "plugin:jest-dom/recommended"], - "rules": { - "@typescript-eslint/explicit-function-return-type": "off", - "@typescript-eslint/explicit-module-boundary-types": "off", - "no-use-before-define": [0], - "@typescript-eslint/no-use-before-define": [1], - "@typescript-eslint/no-explicit-any": "off", - "@typescript-eslint/no-var-requires": "off", - "@typescript-eslint/ban-ts-comment": "off", - "@typescript-eslint/quotes": [ - 2, - "single", - { - "avoidEscape": true - } - ], - "max-len": ["warn", - { - "code": 120, - "ignorePattern": "/className=\".+\"/gm", - "ignoreTemplateLiterals": true, - "ignoreStrings": true, - "ignoreComments": true - }], - "sort-keys": "error", - "react/destructuring-assignment": "warn", - "react/display-name": "warn", - "react/prop-types": "warn", - "react/sort-prop-types": "warn", - "react/no-unescaped-entities": "off", - "react/jsx-sort-props": [ - 2, - { - "callbacksLast": true, - "ignoreCase": false, - "shorthandLast": true - } - ] - } - } - ], - "ignorePatterns": [ - "jest.config.ts", - "__mocks__", - "next.config.js", - "tailwind.config.js", - "postcss.config.js", - "next-sitemap.js", - "sentry.client.config.js", - "sentry.server.config.js" - ] -} diff --git a/apps/web/src/hooks/authentication/use-auth.ts b/apps/web/src/hooks/authentication/use-auth.ts index 4ef9dbdd..4a1431e8 100644 --- a/apps/web/src/hooks/authentication/use-auth.ts +++ b/apps/web/src/hooks/authentication/use-auth.ts @@ -14,7 +14,14 @@ const useAuth = () => { const { data, isLoading } = useAuthenticatedUser(); const saveToken = (token: string) => { - setCookie(COOKIE_NAME, token, { expires: addDayToDate(90), path: '/', sameSite: 'none', secure: true }); + const currentDate = new Date(); + + setCookie(COOKIE_NAME, token, { + expires: addDayToDate(currentDate, 90), + path: '/', + sameSite: 'none', + secure: true, + }); }; const deleteToken = async () => { diff --git a/package.json b/package.json index 96bfab82..c0dc8f0f 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "snipcode", "version": "1.0.0", - "license": "MIT", + "license": "AGPL-3.0", "private": true, "scripts": { "build": "turbo run build", @@ -14,17 +14,15 @@ "cache:login": "turbo login", "cache:link": "turbo link", "cache:disable": "turbo unlink", - "pre-release": "changeset" + "prerelease": "changeset" }, "workspaces": [ "packages/domain", "packages/embed", "packages/front", - "packages/logger", "packages/utils", - "apps/core", - "apps/web", - "apps/functions/**" + "apps/backend", + "apps/web" ], "lint-staged": { "**/*.ts?(x)": [ @@ -39,7 +37,7 @@ } }, "devDependencies": { - "@changesets/cli": "^2.27.1", + "@changesets/cli": "2.27.3", "@commitlint/cli": "18.6.0", "@commitlint/config-conventional": "18.6.0", "@types/jest": "29.5.12", @@ -49,6 +47,7 @@ "@typescript-eslint/parser": "7.3.1", "babel-jest": "29.7.0", "dotenv": "16.4.5", + "dotenv-cli": "7.4.2", "eslint": "8.56.0", "eslint-config-prettier": "9.1.0", "eslint-plugin-import": "2.29.1", @@ -60,10 +59,11 @@ "husky": "9.0.11", "jest": "29.7.0", "jest-environment-jsdom": "29.7.0", + "jest-mock-extended": "3.0.7", "prettier": "3.2.5", "prisma": "5.11.0", "ts-jest": "29.1.2", - "turbo": "1.13.0", + "turbo": "1.13.3", "typescript": "5.4.3" }, "packageManager": "yarn@4.2.2" diff --git a/packages/domain/.eslintrc.js b/packages/domain/.eslintrc.js new file mode 100644 index 00000000..bb59aede --- /dev/null +++ b/packages/domain/.eslintrc.js @@ -0,0 +1,11 @@ +module.exports = { + root: true, + extends: '../../.eslintrc.json', + ignorePatterns: ['dist', '.eslintrc.js'], + parserOptions: { + ecmaVersion: 2023, + sourceType: 'module', + project: 'tsconfig.json', + tsconfigRootDir: __dirname, + }, +}; diff --git a/packages/domain/.eslintrc.json b/packages/domain/.eslintrc.json deleted file mode 100644 index dfdb1a26..00000000 --- a/packages/domain/.eslintrc.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "root": true, - "extends": "../../.eslintrc.json", - "ignorePatterns": [ - "jest.config.ts" - ], - "parserOptions": { - "ecmaVersion": 2023, - "sourceType": "module", - "project": "tsconfig.json" - } -} diff --git a/packages/domain/.gitignore b/packages/domain/.gitignore index 0c152fa2..6d29c27a 100644 --- a/packages/domain/.gitignore +++ b/packages/domain/.gitignore @@ -1,5 +1,6 @@ node_modules dist .env +.env.local .env.test coverage diff --git a/packages/domain/env.d.ts b/packages/domain/env.d.ts index aff7859e..df521717 100644 --- a/packages/domain/env.d.ts +++ b/packages/domain/env.d.ts @@ -1,7 +1,6 @@ export type EnvironmentVariables = { DATABASE_URL: string; NODE_ENV: string; - TEST_DATABASE_URL: string; }; declare global { diff --git a/packages/domain/index.ts b/packages/domain/index.ts index f8c6ab5c..ebb5722a 100644 --- a/packages/domain/index.ts +++ b/packages/domain/index.ts @@ -1,53 +1,24 @@ -import { Folder } from './src/entities/folder'; -import { Role, RoleName } from './src/entities/role'; -import { Session } from './src/entities/session'; -import { Snippet, SnippetVisibility } from './src/entities/snippet'; -import { OauthProvider, User } from './src/entities/user'; -import { CreateFolderDto } from './src/folders/dtos/create-folder-dto'; -import { CreateUserRootFolderDto } from './src/folders/dtos/create-user-root-folder-dto'; -import { UpdateFolderDto } from './src/folders/dtos/update-folder-dto'; -import { FolderService } from './src/folders/folder.service'; -import { NewsletterService } from './src/newsletters/newsletter.service'; -import { CreateRoleDto } from './src/roles/dtos/create-role-dto'; -import { RoleService } from './src/roles/role.service'; -import { CreateSessionDto } from './src/sessions/dtos/create-session-dto'; -import { SessionService } from './src/sessions/session.service'; -import { CreateSnippetDto } from './src/snippets/dtos/create-snippet-dto'; -import { DeleteSnippetDto } from './src/snippets/dtos/delete-snippet-dto'; -import { UpdateSnippetDto } from './src/snippets/dtos/update-snippet-dto'; -import { SnippetService } from './src/snippets/snippet.service'; -import { CreateUserDto } from './src/users/dtos/create-user-dto'; -import { UpdateUserDto } from './src/users/dtos/update-user-dto'; -import { UserService } from './src/users/user.service'; -import { dbID } from './src/utils/id'; - -export { dbID }; -export { PrismaClient, prisma as dbClient } from './src/utils/prisma'; -export type { Role, RoleName, User, OauthProvider, Folder, Session, Snippet, SnippetVisibility }; - -const roleService = new RoleService(); -const userService = new UserService(); -const folderService = new FolderService(); -const snippetService = new SnippetService(); -const sessionService = new SessionService(); - -export { - folderService, - roleService, - sessionService, - snippetService, - userService, - CreateRoleDto, - CreateSessionDto, - CreateUserDto, - DeleteSnippetDto, - UpdateUserDto, - CreateFolderDto, - CreateSnippetDto, - CreateUserRootFolderDto, - NewsletterService, - UpdateSnippetDto, - UpdateFolderDto, -}; - -export type { RoleService, UserService, FolderService, SessionService, SnippetService }; +export { DomainModule } from './src/domain.module'; +export { PrismaService } from './src/services/prisma.service'; +export { UserService } from './src/services/users/user.service'; +export { CreateUserInput } from './src/services/users/inputs/create-user-input'; +export { UpdateUserInput } from './src/services/users/inputs/update-user-input'; +export { RoleService } from './src/services/roles/role.service'; +export { FolderService } from './src/services/folders/folder.service'; +export { CreateUserRootFolderInput } from './src/services/folders/inputs/create-user-root-folder-input'; +export { CreateFolderInput } from './src/services/folders/inputs/create-folder-input'; +export { UpdateFolderInput } from './src/services/folders/inputs/update-folder-input'; +export { CreateSnippetInput } from './src/services/snippets/inputs/create-snippet-input'; +export { UpdateSnippetInput } from './src/services/snippets/inputs/update-snippet-input'; +export { DeleteSnippetInput } from './src/services/snippets/inputs/delete-snippet-input'; +export { SnippetService } from './src/services/snippets/snippet.service'; +export { SessionService } from './src/services/sessions/session.service'; +export { CreateSessionInput } from './src/services/sessions/inputs/create-session-input'; +export { NewsletterService } from './src/services/newsletters/newsletter.service'; +export { Folder } from './src/services/folders/folder.entity'; +export { Role, RoleName } from './src/services/roles/role.entity'; +export { Session } from './src/services/sessions/session.entity'; +export { Snippet, SnippetVisibility } from './src/services/snippets/snippet.entity'; +export { OauthProvider, User } from './src/services/users/user.entity'; +export { dbID } from './src/utils/db-id'; +export { prisma as dbClient } from './src/utils/prisma'; diff --git a/packages/domain/jest.config.ts b/packages/domain/jest.config.ts index 27dc4ea5..3c1137a4 100644 --- a/packages/domain/jest.config.ts +++ b/packages/domain/jest.config.ts @@ -1,18 +1,12 @@ import type { Config } from '@jest/types'; const config: Config.InitialOptions = { - roots: ['.'], - preset: 'ts-jest', - testMatch: ['**/?(*.)+(spec|test).[jt]s'], - testEnvironment: 'node', clearMocks: true, - maxWorkers: 1, - snapshotFormat: { - printBasicPrototype: false, - }, - coverageDirectory: 'coverage', - collectCoverage: false, // When set to true, coverage is performed even if coverage flag isn't provided + collectCoverage: false, + // When set to true, coverage is performed even if coverage flag isn't provided collectCoverageFrom: ['src/**/*.ts', '!src/index.ts'], + coverageDirectory: 'coverage', + coverageReporters: ['json', 'lcov', 'text', 'text-summary'], coverageThreshold: { global: { branches: 40, @@ -21,7 +15,15 @@ const config: Config.InitialOptions = { statements: 60, }, }, - coverageReporters: ['json', 'lcov', 'text', 'text-summary'], + maxWorkers: 1, + preset: 'ts-jest', + roots: ['.'], + snapshotFormat: { + printBasicPrototype: false, + }, + testEnvironment: 'node', + testMatch: ['**/?(*.)+(spec|test).[jt]s'], + testPathIgnorePatterns: ['dist'], }; export default config; diff --git a/packages/domain/package.json b/packages/domain/package.json index 30f72152..a3d65229 100644 --- a/packages/domain/package.json +++ b/packages/domain/package.json @@ -8,34 +8,40 @@ "license": "MIT", "scripts": { "build": "tsc --project tsconfig.prod.json", - "clean": "rm -rf .turbo dist", + "clean": "rm -rf .turbo dist coverage", "lint": "eslint --fix", - "db:dev:create": "pscale branch create core-db dev", - "db:dev:connect": "pscale connect core-db dev --port 3311", + "env": "dotenv -e .env.local", + "db:dev:create": "pscale branch create core-db $(git rev-parse --abbrev-ref HEAD)", + "db:dev:connect": "pscale connect core-db $(git rev-parse --abbrev-ref HEAD) --port 3311", "db:shadow": "docker run -d --rm -e MYSQL_ROOT_PASSWORD=secret -e MYSQL_DATABASE=snipcode --name snipcode-shadow-db -p 3312:3306 mysql:8.0.34", "db:shadow:stop": "docker kill snipcode-shadow-db && docker container prune -f", "db:deploy:create": "pscale deploy-request create core-db dev", - "db:generate": "prisma generate", - "db:migrate": "prisma migrate dev", - "db:reset": "prisma migrate reset --skip-seed", - "db:reset:seed": "prisma migrate reset", - "db:view": "prisma studio", - "db:format": "prisma format", - "db:seed": "prisma db seed", + "db:generate": "yarn env -- prisma generate", + "db:migrate": "yarn env -- prisma migrate dev", + "db:reset": "yarn env -- prisma migrate reset --skip-seed --force", + "db:reset:seed": "yarn env -- prisma migrate reset", + "db:view": "yarn env -- prisma studio", + "db:format": "yarn env -- prisma format", + "db:seed": "yarn env -- prisma db seed", + "db:test": "zx tests/database.mjs", "db:test:stop": "docker container kill snipcode-test-db && docker container prune -f", - "test": "NODE_ENV=test zx tests/database.mjs && jest" + "test": "NODE_ENV=test yarn db:test && dotenv -e .env.test -- jest" }, "dependencies": { "@bugsnag/cuid": "3.1.1", "@prisma/client": "5.14.0", "@snipcode/utils": "workspace:*", - "axios": "1.6.8", + "axios": "1.7.2", "bcryptjs": "2.4.3", "unique-username-generator": "1.3.0" }, "devDependencies": { + "@nestjs/common": "10.3.8", + "@nestjs/testing": "10.3.8", "@ngneat/falso": "7.2.0", "@types/bcryptjs": "2.4.6", + "dotenv-cli": "7.4.2", + "mysql2": "3.10.0", "nock": "13.5.4", "prisma": "5.14.0", "zx": "8.0.2" diff --git a/packages/domain/src/constants.ts b/packages/domain/src/constants.ts new file mode 100644 index 00000000..dbe41f87 --- /dev/null +++ b/packages/domain/src/constants.ts @@ -0,0 +1 @@ +export const DOMAIN_SERVICES_OPTIONS = 'DOMAIN_SERVICES_OPTIONS'; diff --git a/packages/domain/src/domain.module.ts b/packages/domain/src/domain.module.ts new file mode 100644 index 00000000..2c41815c --- /dev/null +++ b/packages/domain/src/domain.module.ts @@ -0,0 +1,105 @@ +import { DynamicModule, Module, Provider } from '@nestjs/common'; + +import { DOMAIN_SERVICES_OPTIONS } from './constants'; +import { FolderService } from './services/folders/folder.service'; +import { NewsletterService } from './services/newsletters/newsletter.service'; +import { PrismaService } from './services/prisma.service'; +import { RoleService } from './services/roles/role.service'; +import { SessionService } from './services/sessions/session.service'; +import { SnippetService } from './services/snippets/snippet.service'; +import { UserService } from './services/users/user.service'; + +type DomainModuleServicesOptions = { + convertKit: { + apiKey: string; + formId: string; + }; + databaseUrl: string; +}; + +type DomainModuleConfig = { + inject?: any[]; + isGlobal?: boolean; + useFactory?: (...args: any[]) => Promise | DomainModuleServicesOptions; +} & Partial; + +@Module({ + exports: [PrismaService, UserService, RoleService, FolderService, SnippetService, SessionService, NewsletterService], + providers: [ + PrismaService, + UserService, + RoleService, + FolderService, + SnippetService, + SessionService, + NewsletterService, + ], +}) +export class DomainModule { + static forRootAsync(config: DomainModuleConfig = { isGlobal: false }): DynamicModule { + const asyncProviders = this.createAsyncProviders(config); + + const prismaService = { + inject: [DOMAIN_SERVICES_OPTIONS], + provide: PrismaService, + useFactory: (options: DomainModuleServicesOptions) => { + return new PrismaService({ + datasources: { + db: { + url: options.databaseUrl, + }, + }, + log: [], + }); + }, + }; + + const newsletterService = { + inject: [DOMAIN_SERVICES_OPTIONS], + provide: NewsletterService, + useFactory: (domainConfig: DomainModuleConfig) => { + const { convertKit } = domainConfig; + + if (!convertKit) { + // throw new Error('Parameters are required: apiKey and formId'); + return null; + } + + return new NewsletterService({ + apiKey: convertKit.apiKey, + formId: convertKit.formId, + }); + }, + }; + + return { + exports: [...asyncProviders, PrismaService, NewsletterService], + global: config.isGlobal, + module: DomainModule, + providers: [...asyncProviders, prismaService, newsletterService], + }; + } + + private static createAsyncProviders(config: DomainModuleConfig): Provider[] { + if (config.useFactory) { + return [ + { + inject: config.inject ?? [], + provide: DOMAIN_SERVICES_OPTIONS, + useFactory: config.useFactory, + }, + ]; + } + + if (config.databaseUrl ?? config.convertKit) { + return [ + { + provide: DOMAIN_SERVICES_OPTIONS, + useValue: config, + }, + ]; + } + + return []; + } +} diff --git a/packages/domain/src/folders/folder.service.test.ts b/packages/domain/src/folders/folder.service.test.ts deleted file mode 100644 index fee5a665..00000000 --- a/packages/domain/src/folders/folder.service.test.ts +++ /dev/null @@ -1,426 +0,0 @@ -import SnipcodeError, { errors, generateRandomId } from '@snipcode/utils'; - -import { CreateFolderDto } from './dtos/create-folder-dto'; -import { CreateUserRootFolderDto } from './dtos/create-user-root-folder-dto'; -import { FolderService } from './folder.service'; -import { - createManyTestFolders, - createTestFolderDto, - createTestUser, - createUserWithRootFolder, - deleteTestFoldersById, - deleteTestUsersById, - updateTestFolderDto, -} from '../../tests/helpers'; -import { Folder } from '../entities/folder'; -import { RoleService } from '../roles/role.service'; - -const roleService = new RoleService(); -const folderService = new FolderService(); - -describe('Test Folder service', () => { - beforeAll(async () => { - await roleService.loadRoles(); - }); - - it('should create a root folder for a user', async () => { - // GIVEN - const user = await createTestUser({}); - - const creatUserRootFolderDto = new CreateUserRootFolderDto(user.id); - - // WHEN - const expectedFolder = await folderService.createUserRootFolder(creatUserRootFolderDto); - - // THEN - expect(expectedFolder?.id).toEqual(creatUserRootFolderDto.toFolder().id); - - await deleteTestFoldersById([expectedFolder?.id]); - await deleteTestUsersById([user.id]); - }); - - it('should create folder for the specified user', async () => { - // GIVEN - const [user, rootFolder] = await createUserWithRootFolder(); - - const createFolderDto = new CreateFolderDto({ - name: 'my gist', - parentId: rootFolder.id, - userId: user.id, - }); - - // WHEN - const expectedFolder = await folderService.create(createFolderDto); - - // THEN - expect(expectedFolder).toMatchObject({ - id: createFolderDto.toFolder().id, - isFavorite: false, - name: createFolderDto.name, - parentId: rootFolder.id, - userId: user.id, - }); - - await deleteTestFoldersById([expectedFolder.id]); - await deleteTestFoldersById([rootFolder.id]); - await deleteTestUsersById([user.id]); - }); - - it('should not create the folder cause it already exists', async () => { - // GIVEN - const [user, rootFolder] = await createUserWithRootFolder(); - - const [firstFolder, secondFolder] = await createManyTestFolders({ - folderNames: ['My gist', 'Blogs'], - parentId: rootFolder.id, - userId: user.id, - }); - - const createFolderDto = new CreateFolderDto({ - name: secondFolder.name, - parentId: rootFolder.id, - userId: user.id, - }); - - // WHEN - // THEN - await expect(() => folderService.create(createFolderDto)).rejects.toThrow( - new SnipcodeError(errors.FOLDER_ALREADY_EXIST(createFolderDto.name), 'FOLDER_ALREADY_EXIST'), - ); - - await deleteTestFoldersById([firstFolder.id, secondFolder.id, rootFolder.id]); - await deleteTestUsersById([user.id]); - }); - - it("should find the user's root folder", async () => { - // GIVEN - const [user, rootFolder] = await createUserWithRootFolder(); - - const [firstFolder, secondFolder] = await createManyTestFolders({ - folderNames: ['My gist', 'Blogs'], - parentId: rootFolder.id, - userId: user.id, - }); - - // WHEN - const userRootFolder = await folderService.findUserRootFolder(user.id); - - // THEN - expect(userRootFolder?.name).toEqual(`__${user.id}__`); - - await deleteTestFoldersById([firstFolder.id, secondFolder.id, rootFolder.id]); - await deleteTestUsersById([user.id]); - }); - - it("should not find the user's root folder", async () => { - // GIVEN - const user = await createTestUser({}); - - // WHEN - // THEN - await expect(() => folderService.findUserRootFolder(user.id)).rejects.toThrow( - new SnipcodeError(errors.USER_ROOT_FOLDER_NOT_FOUND(user.id), 'USER_ROOT_FOLDER_NOT_FOUND'), - ); - - await deleteTestUsersById([user.id]); - }); - - it('should find sub folders of the root user folder', async () => { - // GIVEN - const [user, rootFolder] = await createUserWithRootFolder(); - - const [gistFolder, blogsFolder] = await createManyTestFolders({ - folderNames: ['My gist', 'Blogs'], - parentId: rootFolder.id, - userId: user.id, - }); - - const [post1Folder, post2folder] = await createManyTestFolders({ - folderNames: ['post1', 'post2'], - parentId: blogsFolder.id, - userId: user.id, - }); - - // WHEN - const userRootFolders1 = await folderService.findSubFolders(user.id); - const userRootFolders2 = await folderService.findSubFolders(user.id, rootFolder.id); - - // THEN - expect(userRootFolders1).toHaveLength(2); - expect(userRootFolders1).toEqual(userRootFolders2); - - await deleteTestFoldersById([post1Folder.id, post2folder.id, gistFolder.id, blogsFolder.id, rootFolder.id]); - await deleteTestUsersById([user.id]); - }); - - it('should find the sub folders of a folder', async () => { - // GIVEN - const [user, rootFolder] = await createUserWithRootFolder(); - - const [firstFolder, secondFolder] = await createManyTestFolders({ - folderNames: ['My gist', 'Blogs'], - parentId: rootFolder.id, - userId: user.id, - }); - - const [javaFolder, nodeFolder] = await createManyTestFolders({ - folderNames: ['java', 'node.js'], - parentId: firstFolder.id, - userId: user.id, - }); - - const [post1Folder, post2folder] = await createManyTestFolders({ - folderNames: ['post1', 'post2'], - parentId: secondFolder.id, - userId: user.id, - }); - - // WHEN - const subFolders = await folderService.findSubFolders(user.id, firstFolder.id); - - // THEN - expect(subFolders).toHaveLength(2); - expect(subFolders.map((folder) => folder.name)).toEqual(['java', 'node.js']); - - await deleteTestFoldersById([ - javaFolder.id, - nodeFolder.id, - post1Folder.id, - post2folder.id, - firstFolder.id, - secondFolder.id, - rootFolder.id, - ]); - await deleteTestUsersById([user.id]); - }); - - it('should delete folders belonging to the user', async () => { - // GIVEN - const [user1, rootFolder1] = await createUserWithRootFolder(); - const [myGistFolder, blogsFolder] = await createManyTestFolders({ - folderNames: ['My gist', 'Blogs'], - parentId: rootFolder1.id, - userId: user1.id, - }); - - const [user2, rootFolder2] = await createUserWithRootFolder(); - const [projectFolder, snippetFolder] = await createManyTestFolders({ - folderNames: ['project', 'snippet'], - parentId: rootFolder2.id, - userId: user2.id, - }); - - // WHEN - await folderService.deleteMany([myGistFolder.id, blogsFolder.id], user1.id); - const subFolders = await folderService.findSubFolders(user1.id); - - // THEN - expect(subFolders).toHaveLength(0); - - await deleteTestFoldersById([projectFolder.id, snippetFolder.id, rootFolder1.id, rootFolder2.id]); - await deleteTestUsersById([user1.id]); - await deleteTestUsersById([user2.id]); - }); - - it('should delete folders belonging to the user - validation check', async () => { - // GIVEN - const [user1, rootFolder1] = await createUserWithRootFolder(); - const [myGistFolder, blogsFolder] = await createManyTestFolders({ - folderNames: ['My gist', 'Blogs'], - parentId: rootFolder1.id, - userId: user1.id, - }); - - const [user2, rootFolder2] = await createUserWithRootFolder(); - const [projectFolder, snippetFolder] = await createManyTestFolders({ - folderNames: ['project', 'snippet'], - parentId: rootFolder2.id, - userId: user2.id, - }); - - // WHEN - await folderService.deleteMany([myGistFolder.id, projectFolder.id], user1.id); - - // THEN - const user1SubFolders = await folderService.findSubFolders(user1.id); - const user2SubFolders = await folderService.findSubFolders(user2.id); - - expect(user1SubFolders).toHaveLength(1); - expect(user1SubFolders.map((folder) => folder.name)).toEqual(['Blogs']); - - expect(user2SubFolders).toHaveLength(2); - expect(user2SubFolders.map((folder) => folder.name)).toEqual(['project', 'snippet']); - - await deleteTestFoldersById([snippetFolder.id, projectFolder.id, blogsFolder.id, rootFolder1.id, rootFolder2.id]); - await deleteTestUsersById([user1.id]); - await deleteTestUsersById([user2.id]); - }); - - it('should not delete folders because we cannot delete a root folder', async () => { - // GIVEN - const [user, rootFolder] = await createUserWithRootFolder(); - const [myGistFolder] = await createManyTestFolders({ - folderNames: ['My gist'], - parentId: rootFolder.id, - userId: user.id, - }); - - // WHEN - // THEN - await expect(async () => { - await folderService.deleteMany([myGistFolder.id, rootFolder.id], user.id); - }).rejects.toThrow(new SnipcodeError(errors.CANT_DELETE_ROOT_FOLDER, 'CANT_DELETE_ROOT_FOLDER')); - - await deleteTestFoldersById([myGistFolder.id, rootFolder.id]); - await deleteTestUsersById([user.id]); - }); - - it('should generate the breadcrumb path of a folder', async () => { - // GIVEN - const [user, rootFolder] = await createUserWithRootFolder(); - - const gistFolderDto = createTestFolderDto({ - name: 'My gist', - parentId: rootFolder.id, - userId: user.id, - }); - const gistFolder = await folderService.create(gistFolderDto); - - const nodeFolderDto = createTestFolderDto({ - name: 'Node.js', - parentId: gistFolder.id, - userId: user.id, - }); - const nodeFolder = await folderService.create(nodeFolderDto); - - // WHEN - const subFolders = await folderService.generateBreadcrumb(nodeFolder.id); - - // THEN - expect(subFolders).toHaveLength(2); - expect(subFolders.map((folder) => folder.name)).toEqual(['My gist', 'Node.js']); - - await deleteTestFoldersById([nodeFolder.id, gistFolder.id, rootFolder.id]); - await deleteTestUsersById([user.id]); - }); - - it('should generate the breadcrumb path of the root folder', async () => { - // GIVEN - const [user, rootFolder] = await createUserWithRootFolder(); - - // WHEN - const subFolders = await folderService.generateBreadcrumb(rootFolder.id); - - // THEN - expect(subFolders).toHaveLength(0); - - await deleteTestFoldersById([rootFolder.id]); - await deleteTestUsersById([user.id]); - }); - - it('should found no folder given the ID provided', async () => { - // GIVEN - const folderId = generateRandomId(); - - // WHEN - // THEN - await expect(async () => { - await folderService.findById(folderId); - }).rejects.toThrow(new SnipcodeError(errors.FOLDER_NOT_FOUND(folderId), 'FOLDER_NOT_FOUND')); - }); - - it('should update an existing folder in the specified folder', async () => { - // GIVEN - const [user, rootFolder] = await createUserWithRootFolder(); - const [folder] = await createManyTestFolders({ - folderNames: ['My gist'], - parentId: rootFolder.id, - userId: user.id, - }); - - const updateFolderDto = updateTestFolderDto({ folderId: folder.id, name: 'The Gist', userId: user.id }); - - // WHEN - const updatedFolder = await folderService.update(updateFolderDto); - - // THEN - const folderToUpdate = updateFolderDto.toFolder(folder); - - expect(updatedFolder).toMatchObject({ - createdAt: expect.any(Date), - id: folder.id, - isFavorite: false, - name: folderToUpdate.name, - parentId: rootFolder.id, - path: folder.path, - updatedAt: expect.any(Date), - userId: user.id, - }); - - await deleteTestFoldersById([updatedFolder.id, rootFolder.id]); - await deleteTestUsersById([user.id]); - }); - - it('should not update an existing folder in the specified folder because another folder with the updated name already exists in the folder', async () => { - // GIVEN - const [user, rootFolder] = await createUserWithRootFolder(); - const [folder1, folder2] = await createManyTestFolders({ - folderNames: ['folder-one', 'folder-two'], - parentId: rootFolder.id, - userId: user.id, - }); - - const updateFolderDto = updateTestFolderDto({ folderId: folder1.id, name: 'folder-two', userId: user.id }); - - // WHEN - // THEN - await expect(async () => { - await folderService.update(updateFolderDto); - }).rejects.toThrow(new SnipcodeError(errors.FOLDER_ALREADY_EXIST(updateFolderDto.name), 'FOLDER_ALREADY_EXIST')); - - await deleteTestFoldersById([folder1.id, folder2.id]); - await deleteTestFoldersById([rootFolder.id]); - await deleteTestUsersById([user.id]); - }); - - it('should not update an existing folder in the specified folder because it belongs to other user', async () => { - // GIVEN - const [user1, rootFolder1] = await createUserWithRootFolder(); - const [user2, rootFolder2] = await createUserWithRootFolder(); - const [folderUser2] = await createManyTestFolders({ - folderNames: ['folder-user-two'], - parentId: rootFolder2.id, - userId: user2.id, - }); - - const updateFolderDto = updateTestFolderDto({ folderId: folderUser2.id, userId: user1.id }); - - // WHEN - // THEN - await expect(async () => { - await folderService.update(updateFolderDto); - }).rejects.toThrow( - new SnipcodeError(errors.CANT_EDIT_FOLDER(updateFolderDto.creatorId, folderUser2.id), 'CANT_EDIT_FOLDER'), - ); - - await deleteTestFoldersById([folderUser2.id]); - await deleteTestFoldersById([rootFolder1.id, rootFolder2.id]); - await deleteTestUsersById([user1.id, user2.id]); - }); - - it('should not update the user root folder', async () => { - // GIVEN - const [user1, rootFolder] = await createUserWithRootFolder(); - - const updateFolderDto = updateTestFolderDto({ folderId: rootFolder.id, name: 'new-root-folder', userId: user1.id }); - - // WHEN - // THEN - await expect(async () => { - await folderService.update(updateFolderDto); - }).rejects.toThrow(new SnipcodeError(errors.CANT_RENAME_ROOT_FOLDER, 'CANT_RENAME_ROOT_FOLDER')); - - await deleteTestFoldersById([rootFolder.id]); - await deleteTestUsersById([user1.id]); - }); -}); diff --git a/packages/domain/src/roles/dtos/create-role-dto.test.ts b/packages/domain/src/roles/dtos/create-role-dto.test.ts deleted file mode 100644 index 28a84fbc..00000000 --- a/packages/domain/src/roles/dtos/create-role-dto.test.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { CreateRoleDto } from './create-role-dto'; -import { Role } from '../../entities/role'; - -describe('Test Create Role DTO', () => { - it('should return a valid role object', () => { - const dto = new CreateRoleDto({ - description: 'description admin', - level: 100, - name: 'admin', - }); - - const role = dto.toRole(); - - expect(role).toMatchObject({ - createdAt: expect.any(Date), - description: dto.description, - id: expect.any(String), - level: dto.level, - name: dto.name, - updatedAt: expect.any(Date), - }); - }); -}); diff --git a/packages/domain/src/roles/role.service.ts b/packages/domain/src/roles/role.service.ts deleted file mode 100644 index d7d7ddbe..00000000 --- a/packages/domain/src/roles/role.service.ts +++ /dev/null @@ -1,55 +0,0 @@ -import SnipcodeError, { errors } from '@snipcode/utils'; - -import { CreateRoleDto } from './dtos/create-role-dto'; -import { Role, RoleName } from '../entities/role'; -import { prisma } from '../utils/prisma'; - -export class RoleService { - async loadRoles(): Promise { - const roleAdminDto = new CreateRoleDto({ - description: 'can do everything in the application', - level: 200, - name: 'admin', - }); - const roleUserDto = new CreateRoleDto({ description: "can't do everything", level: 100, name: 'user' }); - - const promises = [roleAdminDto, roleUserDto].map(async (roleDto) => { - const role = await prisma.role.findUnique({ where: { name: roleDto.name } }); - - if (!role) { - const input = roleDto.toRole(); - - return prisma.role.create({ - data: { - description: input.description, - id: input.id, - level: input.level, - name: input.name, - }, - }); - } - - return null; - }); - - await Promise.all(promises); - } - - async findByName(name: RoleName): Promise { - const role = await prisma.role.findUnique({ where: { name } }); - - if (!role) { - throw new SnipcodeError(errors.ROLE_USER_NOT_FOUND, 'ROLE_USER_NOT_FOUND'); - } - - return role; - } - - async findById(id: string): Promise { - return prisma.role.findUnique({ where: { id } }); - } - - async findAll(): Promise { - return prisma.role.findMany({ orderBy: { level: 'desc' } }); - } -} diff --git a/packages/domain/src/entities/folder.ts b/packages/domain/src/services/folders/folder.entity.ts similarity index 100% rename from packages/domain/src/entities/folder.ts rename to packages/domain/src/services/folders/folder.entity.ts diff --git a/packages/domain/src/services/folders/folder.service.test.ts b/packages/domain/src/services/folders/folder.service.test.ts new file mode 100644 index 00000000..fa09f411 --- /dev/null +++ b/packages/domain/src/services/folders/folder.service.test.ts @@ -0,0 +1,462 @@ +import { Test, TestingModule } from '@nestjs/testing'; +import { AppError, errors, generateRandomId } from '@snipcode/utils'; + +import { Folder } from './folder.entity'; +import { FolderService } from './folder.service'; +import { CreateFolderInput } from './inputs/create-folder-input'; +import { CreateUserRootFolderInput } from './inputs/create-user-root-folder-input'; +import { TestHelper } from '../../../tests/helpers'; +import { DomainModule } from '../../domain.module'; +import { PrismaService } from '../prisma.service'; +import { RoleService } from '../roles/role.service'; + +describe('Test Folder service', () => { + let folderService: FolderService; + let roleService: RoleService; + let testHelper: TestHelper; + + beforeAll(async () => { + const module: TestingModule = await Test.createTestingModule({ + imports: [ + DomainModule.forRootAsync({ + databaseUrl: process.env.DATABASE_URL, + }), + ], + providers: [RoleService, FolderService], + }).compile(); + + folderService = module.get(FolderService); + roleService = module.get(RoleService); + + const prismaService = module.get(PrismaService); + + testHelper = new TestHelper(prismaService); + + await roleService.loadRoles(); + }); + + it('should create a root folder for a user', async () => { + // GIVEN + const user = await testHelper.createTestUser({}); + + const creatUserRootFolderInput = new CreateUserRootFolderInput(user.id); + + // WHEN + const expectedFolder = await folderService.createUserRootFolder(creatUserRootFolderInput); + + // THEN + expect(expectedFolder?.id).toEqual(creatUserRootFolderInput.toFolder().id); + + await testHelper.deleteTestFoldersById([expectedFolder?.id]); + await testHelper.deleteTestUsersById([user.id]); + }); + + it('should create folder for the specified user', async () => { + // GIVEN + const [user, rootFolder] = await testHelper.createUserWithRootFolder(); + + const createFolderInput = new CreateFolderInput({ + name: 'my gist', + parentId: rootFolder.id, + userId: user.id, + }); + + // WHEN + const expectedFolder = await folderService.create(createFolderInput); + + // THEN + expect(expectedFolder).toMatchObject({ + id: createFolderInput.toFolder().id, + isFavorite: false, + name: createFolderInput.name, + parentId: rootFolder.id, + userId: user.id, + }); + + await testHelper.deleteTestFoldersById([expectedFolder.id]); + await testHelper.deleteTestFoldersById([rootFolder.id]); + await testHelper.deleteTestUsersById([user.id]); + }); + + it('should not create the folder cause it already exists', async () => { + // GIVEN + const [user, rootFolder] = await testHelper.createUserWithRootFolder(); + + const [firstFolder, secondFolder] = await testHelper.createManyTestFolders({ + folderNames: ['My gist', 'Blogs'], + parentId: rootFolder.id, + userId: user.id, + }); + + const createFolderInput = new CreateFolderInput({ + name: secondFolder.name, + parentId: rootFolder.id, + userId: user.id, + }); + + // WHEN + // THEN + await expect(() => folderService.create(createFolderInput)).rejects.toThrow( + new AppError(errors.FOLDER_ALREADY_EXIST(createFolderInput.name), 'FOLDER_ALREADY_EXIST'), + ); + + await testHelper.deleteTestFoldersById([firstFolder.id, secondFolder.id, rootFolder.id]); + await testHelper.deleteTestUsersById([user.id]); + }); + + it("should find the user's root folder", async () => { + // GIVEN + const [user, rootFolder] = await testHelper.createUserWithRootFolder(); + + const [firstFolder, secondFolder] = await testHelper.createManyTestFolders({ + folderNames: ['My gist', 'Blogs'], + parentId: rootFolder.id, + userId: user.id, + }); + + // WHEN + const userRootFolder = await folderService.findUserRootFolder(user.id); + + // THEN + expect(userRootFolder?.name).toEqual(`__${user.id}__`); + + await testHelper.deleteTestFoldersById([firstFolder.id, secondFolder.id, rootFolder.id]); + await testHelper.deleteTestUsersById([user.id]); + }); + + it("should not find the user's root folder", async () => { + // GIVEN + const user = await testHelper.createTestUser({}); + + // WHEN + // THEN + await expect(() => folderService.findUserRootFolder(user.id)).rejects.toThrow( + new AppError(errors.USER_ROOT_FOLDER_NOT_FOUND(user.id), 'USER_ROOT_FOLDER_NOT_FOUND'), + ); + + await testHelper.deleteTestUsersById([user.id]); + }); + + it('should find sub folders of the root user folder', async () => { + // GIVEN + const [user, rootFolder] = await testHelper.createUserWithRootFolder(); + + const [gistFolder, blogsFolder] = await testHelper.createManyTestFolders({ + folderNames: ['My gist', 'Blogs'], + parentId: rootFolder.id, + userId: user.id, + }); + + const [post1Folder, post2folder] = await testHelper.createManyTestFolders({ + folderNames: ['post1', 'post2'], + parentId: blogsFolder.id, + userId: user.id, + }); + + // WHEN + const userRootFolders1 = await folderService.findSubFolders(user.id); + const userRootFolders2 = await folderService.findSubFolders(user.id, rootFolder.id); + + // THEN + expect(userRootFolders1).toHaveLength(2); + expect(userRootFolders1).toEqual(userRootFolders2); + + await testHelper.deleteTestFoldersById([ + post1Folder.id, + post2folder.id, + gistFolder.id, + blogsFolder.id, + rootFolder.id, + ]); + await testHelper.deleteTestUsersById([user.id]); + }); + + it('should find the sub folders of a folder', async () => { + // GIVEN + const [user, rootFolder] = await testHelper.createUserWithRootFolder(); + + const [firstFolder, secondFolder] = await testHelper.createManyTestFolders({ + folderNames: ['My gist', 'Blogs'], + parentId: rootFolder.id, + userId: user.id, + }); + + const [javaFolder, nodeFolder] = await testHelper.createManyTestFolders({ + folderNames: ['java', 'node.js'], + parentId: firstFolder.id, + userId: user.id, + }); + + const [post1Folder, post2folder] = await testHelper.createManyTestFolders({ + folderNames: ['post1', 'post2'], + parentId: secondFolder.id, + userId: user.id, + }); + + // WHEN + const subFolders = await folderService.findSubFolders(user.id, firstFolder.id); + + // THEN + expect(subFolders).toHaveLength(2); + expect(subFolders.map((folder) => folder.name)).toEqual(['java', 'node.js']); + + await testHelper.deleteTestFoldersById([ + javaFolder.id, + nodeFolder.id, + post1Folder.id, + post2folder.id, + firstFolder.id, + secondFolder.id, + rootFolder.id, + ]); + await testHelper.deleteTestUsersById([user.id]); + }); + + it('should delete folders belonging to the user', async () => { + // GIVEN + const [user1, rootFolder1] = await testHelper.createUserWithRootFolder(); + const [myGistFolder, blogsFolder] = await testHelper.createManyTestFolders({ + folderNames: ['My gist', 'Blogs'], + parentId: rootFolder1.id, + userId: user1.id, + }); + + const [user2, rootFolder2] = await testHelper.createUserWithRootFolder(); + const [projectFolder, snippetFolder] = await testHelper.createManyTestFolders({ + folderNames: ['project', 'snippet'], + parentId: rootFolder2.id, + userId: user2.id, + }); + + // WHEN + await folderService.deleteMany([myGistFolder.id, blogsFolder.id], user1.id); + const subFolders = await folderService.findSubFolders(user1.id); + + // THEN + expect(subFolders).toHaveLength(0); + + await testHelper.deleteTestFoldersById([projectFolder.id, snippetFolder.id, rootFolder1.id, rootFolder2.id]); + await testHelper.deleteTestUsersById([user1.id]); + await testHelper.deleteTestUsersById([user2.id]); + }); + + it('should delete folders belonging to the user - validation check', async () => { + // GIVEN + const [user1, rootFolder1] = await testHelper.createUserWithRootFolder(); + const [myGistFolder, blogsFolder] = await testHelper.createManyTestFolders({ + folderNames: ['My gist', 'Blogs'], + parentId: rootFolder1.id, + userId: user1.id, + }); + + const [user2, rootFolder2] = await testHelper.createUserWithRootFolder(); + const [projectFolder, snippetFolder] = await testHelper.createManyTestFolders({ + folderNames: ['project', 'snippet'], + parentId: rootFolder2.id, + userId: user2.id, + }); + + // WHEN + await folderService.deleteMany([myGistFolder.id, projectFolder.id], user1.id); + + // THEN + const user1SubFolders = await folderService.findSubFolders(user1.id); + const user2SubFolders = await folderService.findSubFolders(user2.id); + + expect(user1SubFolders).toHaveLength(1); + expect(user1SubFolders.map((folder) => folder.name)).toEqual(['Blogs']); + + expect(user2SubFolders).toHaveLength(2); + expect(user2SubFolders.map((folder) => folder.name)).toEqual(['project', 'snippet']); + + await testHelper.deleteTestFoldersById([ + snippetFolder.id, + projectFolder.id, + blogsFolder.id, + rootFolder1.id, + rootFolder2.id, + ]); + await testHelper.deleteTestUsersById([user1.id]); + await testHelper.deleteTestUsersById([user2.id]); + }); + + it('should not delete folders because we cannot delete a root folder', async () => { + // GIVEN + const [user, rootFolder] = await testHelper.createUserWithRootFolder(); + const [myGistFolder] = await testHelper.createManyTestFolders({ + folderNames: ['My gist'], + parentId: rootFolder.id, + userId: user.id, + }); + + // WHEN + // THEN + await expect(async () => { + await folderService.deleteMany([myGistFolder.id, rootFolder.id], user.id); + }).rejects.toThrow(new AppError(errors.CANT_DELETE_ROOT_FOLDER, 'CANT_DELETE_ROOT_FOLDER')); + + await testHelper.deleteTestFoldersById([myGistFolder.id, rootFolder.id]); + await testHelper.deleteTestUsersById([user.id]); + }); + + it('should generate the breadcrumb path of a folder', async () => { + // GIVEN + const [user, rootFolder] = await testHelper.createUserWithRootFolder(); + + const gistFolderInput = TestHelper.createTestFolderInput({ + name: 'My gist', + parentId: rootFolder.id, + userId: user.id, + }); + const gistFolder = await folderService.create(gistFolderInput); + + const nodeFolderInput = TestHelper.createTestFolderInput({ + name: 'Node.js', + parentId: gistFolder.id, + userId: user.id, + }); + const nodeFolder = await folderService.create(nodeFolderInput); + + // WHEN + const subFolders = await folderService.generateBreadcrumb(nodeFolder.id); + + // THEN + expect(subFolders).toHaveLength(2); + expect(subFolders.map((folder) => folder.name)).toEqual(['My gist', 'Node.js']); + + await testHelper.deleteTestFoldersById([nodeFolder.id, gistFolder.id, rootFolder.id]); + await testHelper.deleteTestUsersById([user.id]); + }); + + it('should generate the breadcrumb path of the root folder', async () => { + // GIVEN + const [user, rootFolder] = await testHelper.createUserWithRootFolder(); + + // WHEN + const subFolders = await folderService.generateBreadcrumb(rootFolder.id); + + // THEN + expect(subFolders).toHaveLength(0); + + await testHelper.deleteTestFoldersById([rootFolder.id]); + await testHelper.deleteTestUsersById([user.id]); + }); + + it('should found no folder given the ID provided', async () => { + // GIVEN + const folderId = generateRandomId(); + + // WHEN + // THEN + await expect(async () => { + await folderService.findById(folderId); + }).rejects.toThrow(new AppError(errors.FOLDER_NOT_FOUND(folderId), 'FOLDER_NOT_FOUND')); + }); + + it('should update an existing folder in the specified folder', async () => { + // GIVEN + const [user, rootFolder] = await testHelper.createUserWithRootFolder(); + const [folder] = await testHelper.createManyTestFolders({ + folderNames: ['My gist'], + parentId: rootFolder.id, + userId: user.id, + }); + + const updateFolderInput = TestHelper.updateTestFolderInput({ + folderId: folder.id, + name: 'The Gist', + userId: user.id, + }); + + // WHEN + const updatedFolder = await folderService.update(updateFolderInput); + + // THEN + const folderToUpdate = updateFolderInput.toFolder(folder); + + expect(updatedFolder).toMatchObject({ + createdAt: expect.any(Date), + id: folder.id, + isFavorite: false, + name: folderToUpdate.name, + parentId: rootFolder.id, + path: folder.path, + updatedAt: expect.any(Date), + userId: user.id, + }); + + await testHelper.deleteTestFoldersById([updatedFolder.id, rootFolder.id]); + await testHelper.deleteTestUsersById([user.id]); + }); + + it('should not update an existing folder in the specified folder because another folder with the updated name already exists in the folder', async () => { + // GIVEN + const [user, rootFolder] = await testHelper.createUserWithRootFolder(); + const [folder1, folder2] = await testHelper.createManyTestFolders({ + folderNames: ['folder-one', 'folder-two'], + parentId: rootFolder.id, + userId: user.id, + }); + + const updateFolderInput = TestHelper.updateTestFolderInput({ + folderId: folder1.id, + name: 'folder-two', + userId: user.id, + }); + + // WHEN + // THEN + await expect(async () => { + await folderService.update(updateFolderInput); + }).rejects.toThrow(new AppError(errors.FOLDER_ALREADY_EXIST(updateFolderInput.name), 'FOLDER_ALREADY_EXIST')); + + await testHelper.deleteTestFoldersById([folder1.id, folder2.id]); + await testHelper.deleteTestFoldersById([rootFolder.id]); + await testHelper.deleteTestUsersById([user.id]); + }); + + it('should not update an existing folder in the specified folder because it belongs to other user', async () => { + // GIVEN + const [user1, rootFolder1] = await testHelper.createUserWithRootFolder(); + const [user2, rootFolder2] = await testHelper.createUserWithRootFolder(); + const [folderUser2] = await testHelper.createManyTestFolders({ + folderNames: ['folder-user-two'], + parentId: rootFolder2.id, + userId: user2.id, + }); + + const updateFolderInput = TestHelper.updateTestFolderInput({ folderId: folderUser2.id, userId: user1.id }); + + // WHEN + // THEN + await expect(async () => { + await folderService.update(updateFolderInput); + }).rejects.toThrow( + new AppError(errors.CANT_EDIT_FOLDER(updateFolderInput.creatorId, folderUser2.id), 'CANT_EDIT_FOLDER'), + ); + + await testHelper.deleteTestFoldersById([folderUser2.id]); + await testHelper.deleteTestFoldersById([rootFolder1.id, rootFolder2.id]); + await testHelper.deleteTestUsersById([user1.id, user2.id]); + }); + + it('should not update the user root folder', async () => { + // GIVEN + const [user1, rootFolder] = await testHelper.createUserWithRootFolder(); + + const updateFolderInput = TestHelper.updateTestFolderInput({ + folderId: rootFolder.id, + name: 'new-root-folder', + userId: user1.id, + }); + + // WHEN + // THEN + await expect(async () => { + await folderService.update(updateFolderInput); + }).rejects.toThrow(new AppError(errors.CANT_RENAME_ROOT_FOLDER, 'CANT_RENAME_ROOT_FOLDER')); + + await testHelper.deleteTestFoldersById([rootFolder.id]); + await testHelper.deleteTestUsersById([user1.id]); + }); +}); diff --git a/packages/domain/src/folders/folder.service.ts b/packages/domain/src/services/folders/folder.service.ts similarity index 54% rename from packages/domain/src/folders/folder.service.ts rename to packages/domain/src/services/folders/folder.service.ts index 9f87fe70..ac7151d8 100644 --- a/packages/domain/src/folders/folder.service.ts +++ b/packages/domain/src/services/folders/folder.service.ts @@ -1,42 +1,46 @@ -import SnipcodeError, { errors } from '@snipcode/utils'; +import { Injectable } from '@nestjs/common'; +import { AppError, errors } from '@snipcode/utils'; -import { CreateFolderDto } from './dtos/create-folder-dto'; -import { CreateUserRootFolderDto } from './dtos/create-user-root-folder-dto'; -import { UpdateFolderDto } from './dtos/update-folder-dto'; +import { Folder } from './folder.entity'; +import { CreateFolderInput } from './inputs/create-folder-input'; +import { CreateUserRootFolderInput } from './inputs/create-user-root-folder-input'; +import { UpdateFolderInput } from './inputs/update-folder-input'; import { isFoldersContainRoot } from './utils/folders'; -import { Folder } from '../entities/folder'; -import { prisma } from '../utils/prisma'; +import { PrismaService } from '../prisma.service'; +@Injectable() export class FolderService { - async createUserRootFolder(dto: CreateUserRootFolderDto): Promise { - const input = dto.toFolder(); + constructor(private readonly prisma: PrismaService) {} - return prisma.folder.create({ + async createUserRootFolder(input: CreateUserRootFolderInput): Promise { + const folderInput = input.toFolder(); + + return this.prisma.folder.create({ data: { - id: input.id, - name: input.name, - parentId: input.parentId, - userId: input.userId, + id: folderInput.id, + name: folderInput.name, + parentId: folderInput.parentId, + userId: folderInput.userId, }, }); } - async create(createFolderDto: CreateFolderDto): Promise { + async create(createFolderInput: CreateFolderInput): Promise { const isFolderExist = await this.isFolderExistInParentFolder({ - folderName: createFolderDto.name, - parentFolderId: createFolderDto.parentFolderId, - userId: createFolderDto.user, + folderName: createFolderInput.name, + parentFolderId: createFolderInput.parentFolderId, + userId: createFolderInput.user, }); if (isFolderExist) { - throw new SnipcodeError(errors.FOLDER_ALREADY_EXIST(createFolderDto.name), 'FOLDER_ALREADY_EXIST'); + throw new AppError(errors.FOLDER_ALREADY_EXIST(createFolderInput.name), 'FOLDER_ALREADY_EXIST'); } - const input = createFolderDto.toFolder(); + const input = createFolderInput.toFolder(); - const parentFolder = await this.findById(createFolderDto.parentFolderId); + const parentFolder = await this.findById(createFolderInput.parentFolderId); - return prisma.folder.create({ + return this.prisma.folder.create({ data: { id: input.id, name: input.name, @@ -48,14 +52,14 @@ export class FolderService { } async findUserFolders(userId: string): Promise { - return prisma.folder.findMany({ orderBy: { name: 'asc' }, where: { userId } }); + return this.prisma.folder.findMany({ orderBy: { name: 'asc' }, where: { userId } }); } async findById(id: string): Promise { - const folder = await prisma.folder.findUnique({ where: { id } }); + const folder = await this.prisma.folder.findUnique({ where: { id } }); if (!folder) { - throw new SnipcodeError(errors.FOLDER_NOT_FOUND(id), 'FOLDER_NOT_FOUND'); + throw new AppError(errors.FOLDER_NOT_FOUND(id), 'FOLDER_NOT_FOUND'); } return folder; @@ -67,7 +71,7 @@ export class FolderService { const rootFolder = folders.find((folder) => folder.parentId === null); if (!rootFolder) { - throw new SnipcodeError(errors.USER_ROOT_FOLDER_NOT_FOUND(userId), 'USER_ROOT_FOLDER_NOT_FOUND'); + throw new AppError(errors.USER_ROOT_FOLDER_NOT_FOUND(userId), 'USER_ROOT_FOLDER_NOT_FOUND'); } return rootFolder; @@ -84,7 +88,7 @@ export class FolderService { } async deleteMany(folderIds: string[], userId: string): Promise { - const foldersToDelete = await prisma.folder.findMany({ + const foldersToDelete = await this.prisma.folder.findMany({ where: { id: { in: folderIds, @@ -94,12 +98,12 @@ export class FolderService { }); if (isFoldersContainRoot(foldersToDelete)) { - throw new SnipcodeError(errors.CANT_DELETE_ROOT_FOLDER, 'CANT_DELETE_ROOT_FOLDER'); + throw new AppError(errors.CANT_DELETE_ROOT_FOLDER, 'CANT_DELETE_ROOT_FOLDER'); } const ids = foldersToDelete.map((folder) => folder.id); - await prisma.folder.deleteMany({ + await this.prisma.folder.deleteMany({ where: { id: { in: ids, @@ -117,7 +121,7 @@ export class FolderService { return []; } - const parentFoldersOrdered = await prisma.folder.findMany({ + const parentFoldersOrdered = await this.prisma.folder.findMany({ orderBy: { createdAt: 'asc', }, @@ -134,30 +138,30 @@ export class FolderService { return parentFoldersOrdered.concat(folder); } - async update(updateFolderDto: UpdateFolderDto): Promise { - const folder = await this.findById(updateFolderDto.folderId); + async update(updateFolderInput: UpdateFolderInput): Promise { + const folder = await this.findById(updateFolderInput.folderId); - if (folder.userId !== updateFolderDto.creatorId) { - throw new SnipcodeError(errors.CANT_EDIT_FOLDER(updateFolderDto.creatorId, folder.id), 'CANT_EDIT_FOLDER'); + if (folder.userId !== updateFolderInput.creatorId) { + throw new AppError(errors.CANT_EDIT_FOLDER(updateFolderInput.creatorId, folder.id), 'CANT_EDIT_FOLDER'); } if (!folder.parentId) { - throw new SnipcodeError(errors.CANT_RENAME_ROOT_FOLDER, 'CANT_RENAME_ROOT_FOLDER'); + throw new AppError(errors.CANT_RENAME_ROOT_FOLDER, 'CANT_RENAME_ROOT_FOLDER'); } const isFolderExist = await this.isFolderExistInParentFolder({ - folderName: updateFolderDto.name, + folderName: updateFolderInput.name, parentFolderId: folder.parentId, userId: folder.userId, }); if (isFolderExist) { - throw new SnipcodeError(errors.FOLDER_ALREADY_EXIST(updateFolderDto.name), 'FOLDER_ALREADY_EXIST'); + throw new AppError(errors.FOLDER_ALREADY_EXIST(updateFolderInput.name), 'FOLDER_ALREADY_EXIST'); } - const input = updateFolderDto.toFolder(folder); + const input = updateFolderInput.toFolder(folder); - return prisma.folder.update({ + return this.prisma.folder.update({ data: { name: input.name, }, @@ -176,7 +180,7 @@ export class FolderService { } private findFolderSubFolders(folderId: string, userId: string): Promise { - return prisma.folder.findMany({ + return this.prisma.folder.findMany({ where: { parentId: folderId, userId, diff --git a/packages/domain/src/folders/dtos/create-folder-dto.test.ts b/packages/domain/src/services/folders/inputs/create-folder-input.test.ts similarity index 72% rename from packages/domain/src/folders/dtos/create-folder-dto.test.ts rename to packages/domain/src/services/folders/inputs/create-folder-input.test.ts index a60ba572..357fd9cd 100644 --- a/packages/domain/src/folders/dtos/create-folder-dto.test.ts +++ b/packages/domain/src/services/folders/inputs/create-folder-input.test.ts @@ -1,17 +1,17 @@ -import { CreateFolderDto } from './create-folder-dto'; -import { Folder } from '../../entities/folder'; +import { CreateFolderInput } from './create-folder-input'; +import { Folder } from '../folder.entity'; -describe('Test Create Folder DTO', () => { +describe('Test Create Folder Input', () => { it('should create a valid folder object', () => { // GIVEN - const dto = new CreateFolderDto({ + const input = new CreateFolderInput({ name: 'blogs', parentId: 'cl23rzwe5000002czaedc8sll', userId: 'dm34saxf6111113dabfed9tmm', }); // WHEN - const folder = dto.toFolder(); + const folder = input.toFolder(); // THEN expect(folder).toMatchObject({ @@ -28,7 +28,7 @@ describe('Test Create Folder DTO', () => { it('should create the valid folder name', () => { // GIVEN - const dto = new CreateFolderDto({ + const input = new CreateFolderInput({ name: 'blogs', parentId: 'cl23rzwe5000002czaedc8sll', userId: 'dm34saxf6111113dabfed9tmm', @@ -37,12 +37,12 @@ describe('Test Create Folder DTO', () => { // WHEN // THEN - expect(dto.name).toEqual(expectedFolderName); + expect(input.name).toEqual(expectedFolderName); }); it('should create the valid folder parent id', () => { // GIVEN - const dto = new CreateFolderDto({ + const input = new CreateFolderInput({ name: 'blogs', parentId: 'cl23rzwe5000002czaedc8sll', userId: 'dm34saxf6111113dabfed9tmm', @@ -51,12 +51,12 @@ describe('Test Create Folder DTO', () => { // WHEN // THEN - expect(dto.parentFolderId).toEqual(expectedParentId); + expect(input.parentFolderId).toEqual(expectedParentId); }); it('should create the valid folder user id', () => { // GIVEN - const dto = new CreateFolderDto({ + const input = new CreateFolderInput({ name: 'blogs', parentId: 'cl23rzwe5000002czaedc8sll', userId: 'dm34saxf6111113dabfed9tmm', @@ -65,6 +65,6 @@ describe('Test Create Folder DTO', () => { // WHEN // THEN - expect(dto.user).toEqual(expectedUserId); + expect(input.user).toEqual(expectedUserId); }); }); diff --git a/packages/domain/src/folders/dtos/create-folder-dto.ts b/packages/domain/src/services/folders/inputs/create-folder-input.ts similarity index 84% rename from packages/domain/src/folders/dtos/create-folder-dto.ts rename to packages/domain/src/services/folders/inputs/create-folder-input.ts index 13e072f0..0ed63c14 100644 --- a/packages/domain/src/folders/dtos/create-folder-dto.ts +++ b/packages/domain/src/services/folders/inputs/create-folder-input.ts @@ -1,5 +1,5 @@ -import { Folder } from '../../entities/folder'; -import { dbID } from '../../utils/id'; +import { dbID } from '../../../utils/db-id'; +import { Folder } from '../folder.entity'; type Input = { name: string; @@ -7,7 +7,7 @@ type Input = { userId: string; }; -export class CreateFolderDto { +export class CreateFolderInput { private readonly folderId: string; constructor(private _input: Input) { diff --git a/packages/domain/src/folders/dtos/create-user-root-folder-dto.test.ts b/packages/domain/src/services/folders/inputs/create-user-root-folder-input.test.ts similarity index 55% rename from packages/domain/src/folders/dtos/create-user-root-folder-dto.test.ts rename to packages/domain/src/services/folders/inputs/create-user-root-folder-input.test.ts index 2a9f7f47..2b081f9c 100644 --- a/packages/domain/src/folders/dtos/create-user-root-folder-dto.test.ts +++ b/packages/domain/src/services/folders/inputs/create-user-root-folder-input.test.ts @@ -1,11 +1,11 @@ -import { CreateUserRootFolderDto } from './create-user-root-folder-dto'; -import { Folder } from '../../entities/folder'; +import { CreateUserRootFolderInput } from './create-user-root-folder-input'; +import { Folder } from '../folder.entity'; -describe('Test Create User Root Folder DTO', () => { +describe('Test Create User Root Folder Input', () => { it('should create a valid folder object', () => { - const dto = new CreateUserRootFolderDto('dm34saxf6111113dabfed9tmm'); + const input = new CreateUserRootFolderInput('dm34saxf6111113dabfed9tmm'); - const folder = dto.toFolder(); + const folder = input.toFolder(); expect(folder).toMatchObject({ createdAt: expect.any(Date), diff --git a/packages/domain/src/folders/dtos/create-user-root-folder-dto.ts b/packages/domain/src/services/folders/inputs/create-user-root-folder-input.ts similarity index 74% rename from packages/domain/src/folders/dtos/create-user-root-folder-dto.ts rename to packages/domain/src/services/folders/inputs/create-user-root-folder-input.ts index 793a7b89..098b01f8 100644 --- a/packages/domain/src/folders/dtos/create-user-root-folder-dto.ts +++ b/packages/domain/src/services/folders/inputs/create-user-root-folder-input.ts @@ -1,7 +1,7 @@ -import { Folder } from '../../entities/folder'; -import { dbID } from '../../utils/id'; +import { dbID } from '../../../utils/db-id'; +import { Folder } from '../folder.entity'; -export class CreateUserRootFolderDto { +export class CreateUserRootFolderInput { private readonly folderId: string; constructor(private _userId: string) { diff --git a/packages/domain/src/folders/dtos/update-folder-dto.test.ts b/packages/domain/src/services/folders/inputs/update-folder-input.test.ts similarity index 52% rename from packages/domain/src/folders/dtos/update-folder-dto.test.ts rename to packages/domain/src/services/folders/inputs/update-folder-input.test.ts index 4130bef0..7f680a49 100644 --- a/packages/domain/src/folders/dtos/update-folder-dto.test.ts +++ b/packages/domain/src/services/folders/inputs/update-folder-input.test.ts @@ -1,21 +1,21 @@ -import { UpdateFolderDto } from './update-folder-dto'; -import { createTestFolderDto, generateTestId } from '../../../tests/helpers'; -import { Folder } from '../../entities/folder'; +import { UpdateFolderInput } from './update-folder-input'; +import { TestHelper } from '../../../../tests/helpers'; +import { Folder } from '../folder.entity'; -describe('Test Update Folder DTO', () => { +describe('Test Update Folder Input', () => { it('should return the folder to update', () => { - const parentId = generateTestId(); - const userId = generateTestId(); + const parentId = TestHelper.generateTestId(); + const userId = TestHelper.generateTestId(); - const dto = new UpdateFolderDto({ + const input = new UpdateFolderInput({ creatorId: userId, folderId: parentId, name: 'folder updated', }); - const currentFolder = createTestFolderDto({ parentId, userId }).toFolder(); + const currentFolder = TestHelper.createTestFolderInput({ parentId, userId }).toFolder(); - const folderToUpdate = dto.toFolder(currentFolder); + const folderToUpdate = input.toFolder(currentFolder); const expectedFolder: Folder = { createdAt: currentFolder.createdAt, diff --git a/packages/domain/src/folders/dtos/update-folder-dto.ts b/packages/domain/src/services/folders/inputs/update-folder-input.ts similarity index 85% rename from packages/domain/src/folders/dtos/update-folder-dto.ts rename to packages/domain/src/services/folders/inputs/update-folder-input.ts index b076a7f3..deb1550c 100644 --- a/packages/domain/src/folders/dtos/update-folder-dto.ts +++ b/packages/domain/src/services/folders/inputs/update-folder-input.ts @@ -1,4 +1,4 @@ -import { Folder } from '../../entities/folder'; +import { Folder } from '../folder.entity'; type Input = { creatorId: string; @@ -6,7 +6,7 @@ type Input = { name: string; }; -export class UpdateFolderDto { +export class UpdateFolderInput { constructor(private _input: Input) {} get name(): string { diff --git a/packages/domain/src/folders/utils/folders.test.ts b/packages/domain/src/services/folders/utils/folders.test.ts similarity index 54% rename from packages/domain/src/folders/utils/folders.test.ts rename to packages/domain/src/services/folders/utils/folders.test.ts index 0ea1c133..d7659522 100644 --- a/packages/domain/src/folders/utils/folders.test.ts +++ b/packages/domain/src/services/folders/utils/folders.test.ts @@ -1,17 +1,17 @@ import { isFoldersContainRoot } from './folders'; -import { createTestFolderDto, generateTestId } from '../../../tests/helpers'; -import { Folder } from '../../entities/folder'; +import { TestHelper } from '../../../../tests/helpers'; +import { Folder } from '../folder.entity'; describe('Test folders utilities', () => { it('should assert the folders contain the root folder', () => { // GIVEN - const userId = generateTestId(); + const userId = TestHelper.generateTestId(); - const rootFolder = createTestFolderDto({ userId }).toFolder(); + const rootFolder = TestHelper.createTestFolderInput({ userId }).toFolder(); rootFolder.parentId = null; - const foldersToDelete: Folder[] = [createTestFolderDto({ userId }).toFolder(), rootFolder]; + const foldersToDelete: Folder[] = [TestHelper.createTestFolderInput({ userId }).toFolder(), rootFolder]; // WHEN const isValid = isFoldersContainRoot(foldersToDelete); @@ -22,11 +22,11 @@ describe('Test folders utilities', () => { it("should assert the folders doesn't contain the root folder", () => { // GIVEN - const userId = generateTestId(); + const userId = TestHelper.generateTestId(); const foldersToDelete: Folder[] = [ - createTestFolderDto({ userId }).toFolder(), - createTestFolderDto({ userId }).toFolder(), + TestHelper.createTestFolderInput({ userId }).toFolder(), + TestHelper.createTestFolderInput({ userId }).toFolder(), ]; // WHEN diff --git a/packages/domain/src/folders/utils/folders.ts b/packages/domain/src/services/folders/utils/folders.ts similarity index 73% rename from packages/domain/src/folders/utils/folders.ts rename to packages/domain/src/services/folders/utils/folders.ts index f21da7a0..b4960cfd 100644 --- a/packages/domain/src/folders/utils/folders.ts +++ b/packages/domain/src/services/folders/utils/folders.ts @@ -1,4 +1,4 @@ -import { Folder } from '../../entities/folder'; +import { Folder } from '../folder.entity'; export const isFoldersContainRoot = (folders: Folder[]): boolean => { return folders.some((folder) => folder.parentId === null); diff --git a/packages/domain/src/newsletters/newsletter.service.test.ts b/packages/domain/src/services/newsletters/newsletter.service.test.ts similarity index 64% rename from packages/domain/src/newsletters/newsletter.service.test.ts rename to packages/domain/src/services/newsletters/newsletter.service.test.ts index 5f778f5b..20ec9eaa 100644 --- a/packages/domain/src/newsletters/newsletter.service.test.ts +++ b/packages/domain/src/services/newsletters/newsletter.service.test.ts @@ -1,23 +1,37 @@ -import SnipcodeError from '@snipcode/utils'; +import { Test, TestingModule } from '@nestjs/testing'; +import { AppError } from '@snipcode/utils'; import nock from 'nock'; import { NewsletterService } from './newsletter.service'; -const newsletterService = new NewsletterService({ - apiKey: 'apiKey', - formId: 'formId', -}); +const apiBaseURL = 'https://api.convertkit.com/v3'; + +describe('Newsletter service', () => { + let newsletterService: NewsletterService; -const baseURL = 'https://api.convertkit.com/v3'; + beforeAll(async () => { + const module: TestingModule = await Test.createTestingModule({ + providers: [ + { + provide: NewsletterService, + useValue: new NewsletterService({ + apiKey: 'apiKey', + formId: 'formId', + }), + }, + ], + }).compile(); + + newsletterService = module.get(NewsletterService); + }); -describe('Test the newsletter service', () => { test('Add the email address to the newsletter subscribers', async () => { // GIVEN const emailToSubscribe = 'user@email.com'; const tags = ['snipcode']; const formId = 'formId'; - const scope = nock(baseURL) + const scope = nock(apiBaseURL) .post(`/forms/${formId}/subscribe`, { api_key: 'apiKey', email: emailToSubscribe, @@ -44,7 +58,7 @@ describe('Test the newsletter service', () => { const tags = ['snipcode']; const formId = 'formId'; - nock(baseURL) + nock(apiBaseURL) .post(`/forms/${formId}/subscribe`, { api_key: 'apiKey', email: emailToSubscribe, @@ -66,9 +80,7 @@ describe('Test the newsletter service', () => { await expect(async () => { await newsletterService.subscribe(emailToSubscribe, tags); - }).rejects.toThrow( - new SnipcodeError(JSON.stringify(caughtErrorsFormatted, null, 2), 'NEWSLETTER_SUBSCRIBE_FAILED'), - ); + }).rejects.toThrow(new AppError(JSON.stringify(caughtErrorsFormatted, null, 2), 'NEWSLETTER_SUBSCRIBE_FAILED')); nock.cleanAll(); }); diff --git a/packages/domain/src/newsletters/newsletter.service.ts b/packages/domain/src/services/newsletters/newsletter.service.ts similarity index 94% rename from packages/domain/src/newsletters/newsletter.service.ts rename to packages/domain/src/services/newsletters/newsletter.service.ts index ba0a42f0..6d4ca396 100644 --- a/packages/domain/src/newsletters/newsletter.service.ts +++ b/packages/domain/src/services/newsletters/newsletter.service.ts @@ -1,7 +1,7 @@ import axios, { AxiosInstance } from 'axios'; import { NewsletterOption, SubscribeData, SubscribeInput } from './types'; -import { handleRequestError } from '../utils/axios-error'; +import { handleRequestError } from '../../utils/axios-error'; export class NewsletterService { private httpClient: AxiosInstance = axios.create(); diff --git a/packages/domain/src/newsletters/types.ts b/packages/domain/src/services/newsletters/types.ts similarity index 100% rename from packages/domain/src/newsletters/types.ts rename to packages/domain/src/services/newsletters/types.ts diff --git a/packages/domain/src/services/prisma.service.ts b/packages/domain/src/services/prisma.service.ts new file mode 100644 index 00000000..359f950b --- /dev/null +++ b/packages/domain/src/services/prisma.service.ts @@ -0,0 +1,9 @@ +import { Injectable, OnModuleInit } from '@nestjs/common'; +import { PrismaClient } from '@prisma/client'; + +@Injectable() +export class PrismaService extends PrismaClient implements OnModuleInit { + async onModuleInit() { + await this.$connect(); + } +} diff --git a/packages/domain/src/services/roles/inputs/create-role-input.test.ts b/packages/domain/src/services/roles/inputs/create-role-input.test.ts new file mode 100644 index 00000000..992c46d5 --- /dev/null +++ b/packages/domain/src/services/roles/inputs/create-role-input.test.ts @@ -0,0 +1,23 @@ +import { CreateRoleInput } from './create-role-input'; +import { Role } from '../role.entity'; + +describe('Test Create Role Input', () => { + it('should return a valid role object', () => { + const input = new CreateRoleInput({ + description: 'description admin', + level: 100, + name: 'admin', + }); + + const role = input.toRole(); + + expect(role).toMatchObject({ + createdAt: expect.any(Date), + description: input.description, + id: expect.any(String), + level: input.level, + name: input.name, + updatedAt: expect.any(Date), + }); + }); +}); diff --git a/packages/domain/src/roles/dtos/create-role-dto.ts b/packages/domain/src/services/roles/inputs/create-role-input.ts similarity index 83% rename from packages/domain/src/roles/dtos/create-role-dto.ts rename to packages/domain/src/services/roles/inputs/create-role-input.ts index 61dee7c4..dffd2a47 100644 --- a/packages/domain/src/roles/dtos/create-role-dto.ts +++ b/packages/domain/src/services/roles/inputs/create-role-input.ts @@ -1,5 +1,5 @@ -import { Role, RoleName } from '../../entities/role'; -import { dbID } from '../../utils/id'; +import { dbID } from '../../../utils/db-id'; +import { Role, RoleName } from '../role.entity'; type Input = { description: string | null; @@ -7,7 +7,7 @@ type Input = { name: RoleName; }; -export class CreateRoleDto { +export class CreateRoleInput { private readonly roleId: string; constructor(private _input: Input) { diff --git a/packages/domain/src/entities/role.ts b/packages/domain/src/services/roles/role.entity.ts similarity index 100% rename from packages/domain/src/entities/role.ts rename to packages/domain/src/services/roles/role.entity.ts diff --git a/packages/domain/src/services/roles/role.service.ts b/packages/domain/src/services/roles/role.service.ts new file mode 100644 index 00000000..9125f062 --- /dev/null +++ b/packages/domain/src/services/roles/role.service.ts @@ -0,0 +1,59 @@ +import { Injectable } from '@nestjs/common'; +import { AppError, errors } from '@snipcode/utils'; + +import { CreateRoleInput } from './inputs/create-role-input'; +import { Role, RoleName } from './role.entity'; +import { PrismaService } from '../prisma.service'; + +@Injectable() +export class RoleService { + constructor(private readonly prisma: PrismaService) {} + + async loadRoles(): Promise { + const roleAdminInput = new CreateRoleInput({ + description: 'can do everything in the application', + level: 200, + name: 'admin', + }); + const roleUserInput = new CreateRoleInput({ description: "can't do everything", level: 100, name: 'user' }); + + const promises = [roleAdminInput, roleUserInput].map(async (roleInput) => { + const role = await this.prisma.role.findUnique({ where: { name: roleInput.name } }); + + if (!role) { + const input = roleInput.toRole(); + + return this.prisma.role.create({ + data: { + description: input.description, + id: input.id, + level: input.level, + name: input.name, + }, + }); + } + + return null; + }); + + await Promise.all(promises); + } + + async findByName(name: RoleName): Promise { + const role = await this.prisma.role.findUnique({ where: { name } }); + + if (!role) { + throw new AppError(errors.ROLE_USER_NOT_FOUND, 'ROLE_USER_NOT_FOUND'); + } + + return role; + } + + async findById(id: string): Promise { + return this.prisma.role.findUnique({ where: { id } }); + } + + async findAll(): Promise { + return this.prisma.role.findMany({ orderBy: { level: 'desc' } }); + } +} diff --git a/packages/domain/src/sessions/dtos/create-session-dto.test.ts b/packages/domain/src/services/sessions/inputs/create-session-input.test.ts similarity index 53% rename from packages/domain/src/sessions/dtos/create-session-dto.test.ts rename to packages/domain/src/services/sessions/inputs/create-session-input.test.ts index 4958db78..ce2f7d66 100644 --- a/packages/domain/src/sessions/dtos/create-session-dto.test.ts +++ b/packages/domain/src/services/sessions/inputs/create-session-input.test.ts @@ -1,19 +1,19 @@ import { isValidUUIDV4 } from '@snipcode/utils'; -import { CreateSessionDto } from './create-session-dto'; -import { generateTestId } from '../../../tests/helpers'; -import { Session } from '../../entities/session'; +import { CreateSessionInput } from './create-session-input'; +import { TestHelper } from '../../../../tests/helpers'; +import { Session } from '../session.entity'; -describe('Test Create Session DTO', () => { +describe('Test Create Session Input', () => { it('should return a valid role object', () => { - const userId = generateTestId(); + const userId = TestHelper.generateTestId(); - const dto = new CreateSessionDto({ + const input = new CreateSessionInput({ expireDate: new Date(), userId, }); - const session = dto.toSession(); + const session = input.toSession(); expect(session).toMatchObject({ expires: expect.any(Date), diff --git a/packages/domain/src/sessions/dtos/create-session-dto.ts b/packages/domain/src/services/sessions/inputs/create-session-input.ts similarity index 79% rename from packages/domain/src/sessions/dtos/create-session-dto.ts rename to packages/domain/src/services/sessions/inputs/create-session-input.ts index 1202414f..d516083c 100644 --- a/packages/domain/src/sessions/dtos/create-session-dto.ts +++ b/packages/domain/src/services/sessions/inputs/create-session-input.ts @@ -1,14 +1,14 @@ import { generateRandomId } from '@snipcode/utils'; -import { Session } from '../../entities/session'; -import { dbID } from '../../utils/id'; +import { dbID } from '../../../utils/db-id'; +import { Session } from '../session.entity'; type Input = { expireDate: Date; userId: string; }; -export class CreateSessionDto { +export class CreateSessionInput { private readonly sessionId: string; private readonly token: string; diff --git a/packages/domain/src/entities/session.ts b/packages/domain/src/services/sessions/session.entity.ts similarity index 100% rename from packages/domain/src/entities/session.ts rename to packages/domain/src/services/sessions/session.entity.ts diff --git a/packages/domain/src/services/sessions/session.service.test.ts b/packages/domain/src/services/sessions/session.service.test.ts new file mode 100644 index 00000000..b4cdd4d9 --- /dev/null +++ b/packages/domain/src/services/sessions/session.service.test.ts @@ -0,0 +1,75 @@ +import { Test, TestingModule } from '@nestjs/testing'; + +import { Session } from './session.entity'; +import { SessionService } from './session.service'; +import { TestHelper } from '../../../tests/helpers'; +import { DomainModule } from '../../domain.module'; +import { PrismaService } from '../prisma.service'; + +describe('Test Session Service', function () { + let sessionService: SessionService; + let testHelper: TestHelper; + + beforeAll(async () => { + const module: TestingModule = await Test.createTestingModule({ + imports: [ + DomainModule.forRootAsync({ + databaseUrl: process.env.DATABASE_URL, + }), + ], + providers: [SessionService], + }).compile(); + + sessionService = module.get(SessionService); + const prismaService = module.get(PrismaService); + + testHelper = new TestHelper(prismaService); + }); + + it('should create a session', async () => { + // GIVEN + const userId = TestHelper.generateTestId(); + const input = TestHelper.createTestSessionInput(userId); + + // WHEN + const sessionCreated = await sessionService.create(input); + + // THEN + expect(sessionCreated).toMatchObject(input.toSession()); + + await testHelper.deleteTestUserSessions(sessionCreated.userId); + }); + + it('should find a session by token', async () => { + // GIVEN + const userId = TestHelper.generateTestId(); + const session = await testHelper.createTestSession({ userId }); + + // WHEN + const sessionFound = await sessionService.findByToken(session.token); + + // THEN + expect(session).toEqual(sessionFound); + + await testHelper.deleteTestUserSessions(session.userId); + }); + + it('should delete all session of a user', async () => { + // GIVEN + const userId = TestHelper.generateTestId(); + + const sessionsCreated = await Promise.all([ + testHelper.createTestSession({ userId }), + testHelper.createTestSession({ userId }), + testHelper.createTestSession({ userId }), + ]); + + // WHEN + await sessionService.deleteUserSessions(userId); + + // THEN + const userSessions = await Promise.all(sessionsCreated.map(({ token }) => sessionService.findByToken(token))); + + expect(userSessions.every((session) => !session)).toBe(true); + }); +}); diff --git a/packages/domain/src/services/sessions/session.service.ts b/packages/domain/src/services/sessions/session.service.ts new file mode 100644 index 00000000..694d64d6 --- /dev/null +++ b/packages/domain/src/services/sessions/session.service.ts @@ -0,0 +1,31 @@ +import { Injectable } from '@nestjs/common'; + +import { CreateSessionInput } from './inputs/create-session-input'; +import { Session } from './session.entity'; +import { PrismaService } from '../prisma.service'; + +@Injectable() +export class SessionService { + constructor(private readonly prisma: PrismaService) {} + + async create(createSessionInput: CreateSessionInput): Promise { + const input = createSessionInput.toSession(); + + return this.prisma.session.create({ + data: { + expires: input.expires, + id: input.id, + token: input.token, + userId: input.userId, + }, + }); + } + + async deleteUserSessions(userId: string): Promise { + await this.prisma.session.deleteMany({ where: { userId } }); + } + + async findByToken(token: string): Promise { + return this.prisma.session.findUnique({ where: { token } }); + } +} diff --git a/packages/domain/src/snippets/dtos/create-snippet-dto.test.ts b/packages/domain/src/services/snippets/inputs/create-snippet-input.test.ts similarity index 76% rename from packages/domain/src/snippets/dtos/create-snippet-dto.test.ts rename to packages/domain/src/services/snippets/inputs/create-snippet-input.test.ts index 3623e828..d9bdd802 100644 --- a/packages/domain/src/snippets/dtos/create-snippet-dto.test.ts +++ b/packages/domain/src/services/snippets/inputs/create-snippet-input.test.ts @@ -1,14 +1,14 @@ -import { CreateSnippetDto } from './create-snippet-dto'; -import { generateTestId } from '../../../tests/helpers'; -import { Snippet } from '../../entities/snippet'; +import { CreateSnippetInput } from './create-snippet-input'; +import { TestHelper } from '../../../../tests/helpers'; +import { Snippet } from '../snippet.entity'; -describe('Test Create Snippet DTO', () => { +describe('Test Create Snippet Input', () => { it('should return a valid snippet', () => { - const folderId = generateTestId(); - const userId = generateTestId(); + const folderId = TestHelper.generateTestId(); + const userId = TestHelper.generateTestId(); // GIVEN - const dto = new CreateSnippetDto({ + const input = new CreateSnippetInput({ content: 'import React from "react";\n\nexport const App = () => {\n\n\treturn(\n\t\t
Hello
\n\t);\n};', contentHighlighted: 'import React from "react";\n\nexport const App = () => {\n\n\treturn(\n\t\t
Hello
\n\t);\n}; highlighted', @@ -23,7 +23,7 @@ describe('Test Create Snippet DTO', () => { }); // WHEN - const folder = dto.toSnippet(); + const folder = input.toSnippet(); // THEN expect(folder).toMatchObject({ diff --git a/packages/domain/src/snippets/dtos/create-snippet-dto.ts b/packages/domain/src/services/snippets/inputs/create-snippet-input.ts similarity index 89% rename from packages/domain/src/snippets/dtos/create-snippet-dto.ts rename to packages/domain/src/services/snippets/inputs/create-snippet-input.ts index 05a12182..ff81f8cf 100644 --- a/packages/domain/src/snippets/dtos/create-snippet-dto.ts +++ b/packages/domain/src/services/snippets/inputs/create-snippet-input.ts @@ -1,5 +1,5 @@ -import { Snippet, SnippetVisibility } from '../../entities/snippet'; -import { dbID } from '../../utils/id'; +import { dbID } from '../../../utils/db-id'; +import { Snippet, SnippetVisibility } from '../snippet.entity'; type Input = { content: string; @@ -14,7 +14,7 @@ type Input = { visibility: SnippetVisibility; }; -export class CreateSnippetDto { +export class CreateSnippetInput { private readonly snippetId: string; constructor(private _input: Input) { diff --git a/packages/domain/src/services/snippets/inputs/delete-snippet-input.test.ts b/packages/domain/src/services/snippets/inputs/delete-snippet-input.test.ts new file mode 100644 index 00000000..86f3993f --- /dev/null +++ b/packages/domain/src/services/snippets/inputs/delete-snippet-input.test.ts @@ -0,0 +1,20 @@ +import { DeleteSnippetInput } from './delete-snippet-input'; +import { TestHelper } from '../../../../tests/helpers'; + +describe('Test Delete Snippet Input', () => { + it('should have the right property defined', () => { + const snippetId = TestHelper.generateTestId(); + const userId = TestHelper.generateTestId(); + + // GIVEN + const input = new DeleteSnippetInput({ + creatorId: userId, + snippetId, + }); + + // WHEN + // THEN + expect(input.snippetId).toEqual(snippetId); + expect(input.creatorId).toEqual(userId); + }); +}); diff --git a/packages/domain/src/snippets/dtos/delete-snippet-dto.ts b/packages/domain/src/services/snippets/inputs/delete-snippet-input.ts similarity index 87% rename from packages/domain/src/snippets/dtos/delete-snippet-dto.ts rename to packages/domain/src/services/snippets/inputs/delete-snippet-input.ts index 1d7f38c6..41e21e2e 100644 --- a/packages/domain/src/snippets/dtos/delete-snippet-dto.ts +++ b/packages/domain/src/services/snippets/inputs/delete-snippet-input.ts @@ -3,7 +3,7 @@ type Input = { snippetId: string; }; -export class DeleteSnippetDto { +export class DeleteSnippetInput { constructor(private _input: Input) {} get snippetId(): string { diff --git a/packages/domain/src/snippets/dtos/update-snippet-dto.test.ts b/packages/domain/src/services/snippets/inputs/update-snippet-input.test.ts similarity index 74% rename from packages/domain/src/snippets/dtos/update-snippet-dto.test.ts rename to packages/domain/src/services/snippets/inputs/update-snippet-input.test.ts index 9f37be3e..014d124c 100644 --- a/packages/domain/src/snippets/dtos/update-snippet-dto.test.ts +++ b/packages/domain/src/services/snippets/inputs/update-snippet-input.test.ts @@ -1,13 +1,13 @@ -import { UpdateSnippetDto } from './update-snippet-dto'; -import { createTestSnippetDto, generateTestId } from '../../../tests/helpers'; -import { Snippet } from '../../entities/snippet'; +import { UpdateSnippetInput } from './update-snippet-input'; +import { TestHelper } from '../../../../tests/helpers'; +import { Snippet } from '../snippet.entity'; -describe('Test Update Snippet DTO', () => { +describe('Test Update Snippet Input', () => { it('should have the right property defined to update the snippet', () => { - const snippetId = generateTestId(); - const userId = generateTestId(); + const snippetId = TestHelper.generateTestId(); + const userId = TestHelper.generateTestId(); - const dto = new UpdateSnippetDto({ + const input = new UpdateSnippetInput({ content: 'import React from "react";\n\nexport const App = () => {\n\n\treturn(\n\t\t
Hello Updated
\n\t);\n};', contentHighlighted: @@ -22,15 +22,15 @@ describe('Test Update Snippet DTO', () => { visibility: 'private', }); - const folderId = generateTestId(); - const currentSnippet = createTestSnippetDto({ + const folderId = TestHelper.generateTestId(); + const currentSnippet = TestHelper.createTestSnippetInput({ folderId, name: 'app.tsx', userId, visibility: 'public', }).toSnippet(); - const snippetToUpdate = dto.toSnippet(currentSnippet); + const snippetToUpdate = input.toSnippet(currentSnippet); const expectedSnippet: Snippet = { content: diff --git a/packages/domain/src/snippets/dtos/update-snippet-dto.ts b/packages/domain/src/services/snippets/inputs/update-snippet-input.ts similarity index 91% rename from packages/domain/src/snippets/dtos/update-snippet-dto.ts rename to packages/domain/src/services/snippets/inputs/update-snippet-input.ts index 466cba2f..9fb02e2b 100644 --- a/packages/domain/src/snippets/dtos/update-snippet-dto.ts +++ b/packages/domain/src/services/snippets/inputs/update-snippet-input.ts @@ -1,4 +1,4 @@ -import { Snippet, SnippetVisibility } from '../../entities/snippet'; +import { Snippet, SnippetVisibility } from '../snippet.entity'; type Input = { content: string; @@ -13,7 +13,7 @@ type Input = { visibility: SnippetVisibility; }; -export class UpdateSnippetDto { +export class UpdateSnippetInput { constructor(private _input: Input) {} get name(): string { diff --git a/packages/domain/src/entities/snippet.ts b/packages/domain/src/services/snippets/snippet.entity.ts similarity index 100% rename from packages/domain/src/entities/snippet.ts rename to packages/domain/src/services/snippets/snippet.entity.ts diff --git a/packages/domain/src/services/snippets/snippet.service.test.ts b/packages/domain/src/services/snippets/snippet.service.test.ts new file mode 100644 index 00000000..8408a11f --- /dev/null +++ b/packages/domain/src/services/snippets/snippet.service.test.ts @@ -0,0 +1,350 @@ +import { Test, TestingModule } from '@nestjs/testing'; +import { AppError, errors, generateRandomId } from '@snipcode/utils'; + +import { Snippet } from './snippet.entity'; +import { SnippetService } from './snippet.service'; +import { TestHelper } from '../../../tests/helpers'; +import { DomainModule } from '../../domain.module'; +import { PrismaService } from '../prisma.service'; +import { RoleService } from '../roles/role.service'; + +describe('Test Snippet service', () => { + let snippetService: SnippetService; + let roleService: RoleService; + let testHelper: TestHelper; + + beforeAll(async () => { + const module: TestingModule = await Test.createTestingModule({ + imports: [ + DomainModule.forRootAsync({ + databaseUrl: process.env.DATABASE_URL, + }), + ], + providers: [RoleService, SnippetService], + }).compile(); + + snippetService = module.get(SnippetService); + roleService = module.get(RoleService); + + const prismaService = module.get(PrismaService); + + testHelper = new TestHelper(prismaService); + + await roleService.loadRoles(); + }); + + it('should create a snippet in the specified folder', async () => { + // GIVEN + const [user, rootFolder] = await testHelper.createUserWithRootFolder(); + const createSnippetInput = TestHelper.createTestSnippetInput({ folderId: rootFolder.id, userId: user.id }); + + // WHEN + const expectedSnippet = await snippetService.create(createSnippetInput); + + // THEN + expect(expectedSnippet).toMatchObject({ + content: createSnippetInput.toSnippet().content, + contentHtml: createSnippetInput.toSnippet().contentHtml, + createdAt: expect.any(Date), + description: createSnippetInput.toSnippet().description, + folderId: rootFolder.id, + id: createSnippetInput.toSnippet().id, + language: createSnippetInput.toSnippet().language, + lineHighlight: createSnippetInput.toSnippet().lineHighlight, + name: createSnippetInput.toSnippet().name, + size: createSnippetInput.toSnippet().size, + theme: createSnippetInput.toSnippet().theme, + updatedAt: expect.any(Date), + userId: user.id, + visibility: createSnippetInput.toSnippet().visibility, + }); + + await testHelper.deleteTestSnippetsById([expectedSnippet.id]); + await testHelper.deleteTestFoldersById([rootFolder.id]); + await testHelper.deleteTestUsersById([user.id]); + }); + + it('should not create a snippet because it already exists in the specified folder', async () => { + // GIVEN + const [user, rootFolder] = await testHelper.createUserWithRootFolder(); + const snippet = await testHelper.createTestSnippet({ folderId: rootFolder.id, name: 'app.tsx', userId: user.id }); + + const sameCreateSnippetInput = TestHelper.createTestSnippetInput({ + folderId: rootFolder.id, + name: 'app.tsx', + userId: user.id, + }); + + // WHEN + // THEN + await expect(() => snippetService.create(sameCreateSnippetInput)).rejects.toThrow( + new AppError(errors.SNIPPET_ALREADY_EXIST(sameCreateSnippetInput.name), 'SNIPPET_ALREADY_EXIST'), + ); + + await testHelper.deleteTestSnippetsById([snippet.id]); + await testHelper.deleteTestFoldersById([rootFolder.id]); + await testHelper.deleteTestUsersById([user.id]); + }); + + it('should retrieve all public snippets', async () => { + // GIVEN + const [user, rootFolder] = await testHelper.createUserWithRootFolder(); + const existingSnippets = await Promise.all([ + testHelper.createTestSnippet({ folderId: rootFolder.id, userId: user.id, visibility: 'public' }), + testHelper.createTestSnippet({ folderId: rootFolder.id, userId: user.id, visibility: 'private' }), + testHelper.createTestSnippet({ folderId: rootFolder.id, userId: user.id, visibility: 'public' }), + testHelper.createTestSnippet({ folderId: rootFolder.id, userId: user.id, visibility: 'private' }), + testHelper.createTestSnippet({ folderId: rootFolder.id, userId: user.id, visibility: 'public' }), + testHelper.createTestSnippet({ folderId: rootFolder.id, userId: user.id, visibility: 'public' }), + ]); + + // WHEN + const publicSnippets = await snippetService.findPublicSnippet({ itemPerPage: 10 }); + + // THEN + await expect(publicSnippets.hasMore).toEqual(false); + await expect(publicSnippets.nextCursor).toEqual(null); + await expect(publicSnippets.items).toHaveLength(4); + + await testHelper.deleteTestSnippetsById(existingSnippets.map((snippet) => snippet.id)); + await testHelper.deleteTestFoldersById([rootFolder.id]); + await testHelper.deleteTestUsersById([user.id]); + }); + + it('should retrieve a subset of public snippets', async () => { + // GIVEN + const [user, rootFolder] = await testHelper.createUserWithRootFolder(); + const existingSnippets = await Promise.all([ + testHelper.createTestSnippet({ folderId: rootFolder.id, userId: user.id, visibility: 'public' }), + testHelper.createTestSnippet({ folderId: rootFolder.id, userId: user.id, visibility: 'private' }), + testHelper.createTestSnippet({ folderId: rootFolder.id, userId: user.id, visibility: 'public' }), + testHelper.createTestSnippet({ folderId: rootFolder.id, userId: user.id, visibility: 'private' }), + testHelper.createTestSnippet({ folderId: rootFolder.id, userId: user.id, visibility: 'public' }), + testHelper.createTestSnippet({ folderId: rootFolder.id, userId: user.id, visibility: 'public' }), + ]); + + // WHEN + const publicSnippets = await snippetService.findPublicSnippet({ itemPerPage: 3 }); + + // THEN + await expect(publicSnippets.hasMore).toEqual(true); + await expect(publicSnippets.nextCursor).toEqual(expect.any(String)); + await expect(publicSnippets.items).toHaveLength(3); + + await testHelper.deleteTestSnippetsById(existingSnippets.map((snippet) => snippet.id)); + await testHelper.deleteTestFoldersById([rootFolder.id]); + await testHelper.deleteTestUsersById([user.id]); + }); + + it('should find all snippets of a user', async () => { + // GIVEN + const [user1, rootFolder1] = await testHelper.createUserWithRootFolder(); + const [user2, rootFolder2] = await testHelper.createUserWithRootFolder(); + + const existingSnippets = await Promise.all([ + testHelper.createTestSnippet({ folderId: rootFolder1.id, userId: user1.id, visibility: 'public' }), + testHelper.createTestSnippet({ folderId: rootFolder1.id, userId: user1.id, visibility: 'private' }), + testHelper.createTestSnippet({ folderId: rootFolder2.id, userId: user2.id, visibility: 'public' }), + testHelper.createTestSnippet({ folderId: rootFolder1.id, userId: user1.id, visibility: 'private' }), + testHelper.createTestSnippet({ folderId: rootFolder2.id, userId: user2.id, visibility: 'public' }), + testHelper.createTestSnippet({ folderId: rootFolder2.id, userId: user2.id, visibility: 'private' }), + ]); + + // WHEN + const userSnippets = await snippetService.findByUser(user2.id); + + // THEN + await expect(userSnippets).toHaveLength(3); + + await testHelper.deleteTestSnippetsById(existingSnippets.map((snippet) => snippet.id)); + await testHelper.deleteTestFoldersById([rootFolder1.id, rootFolder2.id]); + await testHelper.deleteTestUsersById([user1.id, user2.id]); + }); + + it('should retrieve a snippet by its ID', async () => { + // GIVEN + const [user1, rootFolder1] = await testHelper.createUserWithRootFolder(); + + const snippet = await testHelper.createTestSnippet({ + folderId: rootFolder1.id, + userId: user1.id, + visibility: 'public', + }); + + // WHEN + const snippetFound = await snippetService.findById(snippet.id); + + // THEN + expect(snippetFound).toMatchObject({ + folderId: rootFolder1.id, + id: snippet.id, + userId: user1.id, + visibility: 'public', + }); + + await testHelper.deleteTestSnippetsById([snippet.id]); + await testHelper.deleteTestFoldersById([rootFolder1.id]); + await testHelper.deleteTestUsersById([user1.id]); + }); + + it('should found no snippet given the ID provided', async () => { + // GIVEN + const snippetId = generateRandomId(); + + // WHEN + // THEN + await expect(async () => { + await snippetService.findById(snippetId); + }).rejects.toThrow(new AppError(errors.SNIPPET_NOT_FOUND(snippetId), 'SNIPPET_NOT_FOUND')); + }); + + it('should delete an existing snippet belonging to a user', async () => { + // GIVEN + const [user, rootFolder] = await testHelper.createUserWithRootFolder(); + + const [snippet1, snippet2] = await Promise.all([ + testHelper.createTestSnippet({ folderId: rootFolder.id, userId: user.id, visibility: 'public' }), + testHelper.createTestSnippet({ folderId: rootFolder.id, userId: user.id, visibility: 'private' }), + ]); + + // WHEN + const deleteSnippetInput = TestHelper.deleteTestSnippetInput({ snippetId: snippet1.id, userId: snippet1.userId }); + + await snippetService.delete(deleteSnippetInput); + + // THEN + const folderSnippets = await snippetService.findByFolder(rootFolder.id); + + expect(folderSnippets).toHaveLength(1); + + await testHelper.deleteTestSnippetsById([snippet2.id]); + await testHelper.deleteTestFoldersById([rootFolder.id]); + await testHelper.deleteTestUsersById([user.id]); + }); + + it('should not delete an existing snippet because it belongs to other user', async () => { + // GIVEN + const [user1, rootFolder1] = await testHelper.createUserWithRootFolder(); + const [user2, rootFolder2] = await testHelper.createUserWithRootFolder(); + + const [snippet1, snippet2, snippet3] = await Promise.all([ + testHelper.createTestSnippet({ folderId: rootFolder1.id, userId: user1.id, visibility: 'public' }), + testHelper.createTestSnippet({ folderId: rootFolder2.id, userId: user2.id, visibility: 'private' }), + testHelper.createTestSnippet({ folderId: rootFolder1.id, userId: user1.id, visibility: 'private' }), + ]); + + // WHEN + const deleteSnippetInput = TestHelper.deleteTestSnippetInput({ snippetId: snippet1.id, userId: user2.id }); + + // THEN + await expect(async () => { + await snippetService.delete(deleteSnippetInput); + }).rejects.toThrow( + new AppError(errors.CANT_EDIT_SNIPPET(deleteSnippetInput.creatorId, snippet1.id), 'CANT_EDIT_SNIPPET'), + ); + + const user1FolderSnippets = await snippetService.findByFolder(rootFolder1.id); + const user2FolderSnippets = await snippetService.findByFolder(rootFolder2.id); + + expect(user1FolderSnippets).toHaveLength(2); + expect(user2FolderSnippets).toHaveLength(1); + + await testHelper.deleteTestSnippetsById([snippet2.id, snippet3.id]); + await testHelper.deleteTestFoldersById([rootFolder1.id, rootFolder2.id]); + await testHelper.deleteTestUsersById([user1.id, user2.id]); + }); + + it('should update an existing snippet in the specified folder', async () => { + // GIVEN + const [user, rootFolder] = await testHelper.createUserWithRootFolder(); + const snippet = await testHelper.createTestSnippet({ + folderId: rootFolder.id, + userId: user.id, + visibility: 'public', + }); + + const updateSnippetInput = TestHelper.updateTestSnippetInput({ snippetId: snippet.id, userId: user.id }); + + // WHEN + const updatedSnippet = await snippetService.update(updateSnippetInput); + + // THEN + const snippetToUpdate = updateSnippetInput.toSnippet(snippet); + + expect(updatedSnippet).toMatchObject({ + content: snippetToUpdate.content, + contentHtml: snippetToUpdate.contentHtml, + createdAt: expect.any(Date), + description: snippetToUpdate.description, + folderId: rootFolder.id, + id: snippet.id, + language: snippetToUpdate.language, + lineHighlight: snippetToUpdate.lineHighlight, + name: snippetToUpdate.name, + size: snippetToUpdate.size, + theme: snippetToUpdate.theme, + updatedAt: expect.any(Date), + userId: user.id, + visibility: snippetToUpdate.visibility, + }); + + await testHelper.deleteTestSnippetsById([updatedSnippet.id]); + await testHelper.deleteTestFoldersById([rootFolder.id]); + await testHelper.deleteTestUsersById([user.id]); + }); + + it('should not update an existing snippet in the specified folder because another snippet with the updated name already exists in the folder', async () => { + // GIVEN + const [user, rootFolder] = await testHelper.createUserWithRootFolder(); + const [snippet] = await Promise.all([ + testHelper.createTestSnippet({ folderId: rootFolder.id, name: 'snippet-one.java', userId: user.id }), + testHelper.createTestSnippet({ + folderId: rootFolder.id, + name: 'snippet-two.java', + userId: user.id, + visibility: 'private', + }), + ]); + + const updateSnippetInput = TestHelper.updateTestSnippetInput({ + name: 'snippet-two.java', + snippetId: snippet.id, + userId: user.id, + }); + + // WHEN + // THEN + await expect(async () => { + await snippetService.update(updateSnippetInput); + }).rejects.toThrow(new AppError(errors.SNIPPET_ALREADY_EXIST(updateSnippetInput.name), 'SNIPPET_ALREADY_EXIST')); + + await testHelper.deleteTestSnippetsById([snippet.id]); + await testHelper.deleteTestFoldersById([rootFolder.id]); + await testHelper.deleteTestUsersById([user.id]); + }); + + it('should not update an existing snippet in the specified folder because because it belongs to other user', async () => { + // GIVEN + const [user1, rootFolder1] = await testHelper.createUserWithRootFolder(); + const [user2, rootFolder2] = await testHelper.createUserWithRootFolder(); + const snippet = await testHelper.createTestSnippet({ + folderId: rootFolder1.id, + name: 'snippet-one.java', + userId: user1.id, + }); + + const updateSnippetInput = TestHelper.updateTestSnippetInput({ snippetId: snippet.id, userId: user2.id }); + + // WHEN + // THEN + await expect(async () => { + await snippetService.update(updateSnippetInput); + }).rejects.toThrow( + new AppError(errors.CANT_EDIT_SNIPPET(updateSnippetInput.creatorId, snippet.id), 'CANT_EDIT_SNIPPET'), + ); + + await testHelper.deleteTestSnippetsById([snippet.id]); + await testHelper.deleteTestFoldersById([rootFolder1.id, rootFolder2.id]); + await testHelper.deleteTestUsersById([user1.id, user2.id]); + }); +}); diff --git a/packages/domain/src/snippets/snippet.service.ts b/packages/domain/src/services/snippets/snippet.service.ts similarity index 58% rename from packages/domain/src/snippets/snippet.service.ts rename to packages/domain/src/services/snippets/snippet.service.ts index 9932ac98..6276aae6 100644 --- a/packages/domain/src/snippets/snippet.service.ts +++ b/packages/domain/src/services/snippets/snippet.service.ts @@ -1,10 +1,11 @@ -import SnipcodeError, { errors } from '@snipcode/utils'; +import { Injectable } from '@nestjs/common'; +import { AppError, errors } from '@snipcode/utils'; -import { CreateSnippetDto } from './dtos/create-snippet-dto'; -import { DeleteSnippetDto } from './dtos/delete-snippet-dto'; -import { UpdateSnippetDto } from './dtos/update-snippet-dto'; -import { Snippet, SnippetVisibility } from '../entities/snippet'; -import { prisma } from '../utils/prisma'; +import { CreateSnippetInput } from './inputs/create-snippet-input'; +import { DeleteSnippetInput } from './inputs/delete-snippet-input'; +import { UpdateSnippetInput } from './inputs/update-snippet-input'; +import { Snippet, SnippetVisibility } from './snippet.entity'; +import { PrismaService } from '../prisma.service'; const MAX_ITEM_PER_PAGE = 50; @@ -13,17 +14,20 @@ const sortMethodMap: Record<'recently_updated' | 'recently_created', 'createdAt' recently_updated: 'updatedAt', }; +@Injectable() export class SnippetService { - async create(createSnippetDto: CreateSnippetDto): Promise { - const isSnippetExist = await this.isSnippetExistInFolder(createSnippetDto.folderId, createSnippetDto.name); + constructor(private readonly prisma: PrismaService) {} + + async create(createSnippetInput: CreateSnippetInput): Promise { + const isSnippetExist = await this.isSnippetExistInFolder(createSnippetInput.folderId, createSnippetInput.name); if (isSnippetExist) { - throw new SnipcodeError(errors.SNIPPET_ALREADY_EXIST(createSnippetDto.name), 'SNIPPET_ALREADY_EXIST'); + throw new AppError(errors.SNIPPET_ALREADY_EXIST(createSnippetInput.name), 'SNIPPET_ALREADY_EXIST'); } - const input = createSnippetDto.toSnippet(); + const input = createSnippetInput.toSnippet(); - return prisma.snippet.create({ + return this.prisma.snippet.create({ data: { content: input.content, contentHtml: input.contentHtml, @@ -42,21 +46,21 @@ export class SnippetService { } async findById(id: string): Promise { - const snippet = await prisma.snippet.findUnique({ where: { id } }); + const snippet = await this.prisma.snippet.findUnique({ where: { id } }); if (!snippet) { - throw new SnipcodeError(errors.SNIPPET_NOT_FOUND(id), 'SNIPPET_NOT_FOUND'); + throw new AppError(errors.SNIPPET_NOT_FOUND(id), 'SNIPPET_NOT_FOUND'); } return snippet; } async findByUser(userId: string): Promise { - return prisma.snippet.findMany({ orderBy: { createdAt: 'desc' }, where: { userId } }); + return this.prisma.snippet.findMany({ orderBy: { createdAt: 'desc' }, where: { userId } }); } async findByFolder(folderId: string, visibility?: SnippetVisibility): Promise { - return prisma.snippet.findMany({ + return this.prisma.snippet.findMany({ orderBy: { createdAt: 'desc' }, where: { folderId, @@ -78,7 +82,7 @@ export class SnippetService { // If the use has 20 we fetch 21 which help to know if there still more in the table const limitPlusOne = limit + 1; - const snippets = await prisma.snippet.findMany({ + const snippets = await this.prisma.snippet.findMany({ orderBy: { [sortMethodMap[sortMethod]]: 'desc' }, take: limitPlusOne, where: { @@ -102,14 +106,14 @@ export class SnippetService { }; } - async delete(deleteSnippetDto: DeleteSnippetDto): Promise { - const snippet = await this.findById(deleteSnippetDto.snippetId); + async delete(deleteSnippetInput: DeleteSnippetInput): Promise { + const snippet = await this.findById(deleteSnippetInput.snippetId); - if (snippet.userId !== deleteSnippetDto.creatorId) { - throw new SnipcodeError(errors.CANT_EDIT_SNIPPET(deleteSnippetDto.creatorId, snippet.id), 'CANT_EDIT_SNIPPET'); + if (snippet.userId !== deleteSnippetInput.creatorId) { + throw new AppError(errors.CANT_EDIT_SNIPPET(deleteSnippetInput.creatorId, snippet.id), 'CANT_EDIT_SNIPPET'); } - await prisma.snippet.delete({ where: { id: deleteSnippetDto.snippetId } }); + await this.prisma.snippet.delete({ where: { id: deleteSnippetInput.snippetId } }); } async isSnippetExistInFolder(folderId: string, snippetName: string): Promise { @@ -118,24 +122,24 @@ export class SnippetService { return snippets.some(({ name }) => name.toLowerCase() === snippetName.toLowerCase()); } - async update(updateSnippetDto: UpdateSnippetDto): Promise { - const snippet = await this.findById(updateSnippetDto.snippetId); + async update(updateSnippetInput: UpdateSnippetInput): Promise { + const snippet = await this.findById(updateSnippetInput.snippetId); - if (snippet.userId !== updateSnippetDto.creatorId) { - throw new SnipcodeError(errors.CANT_EDIT_SNIPPET(updateSnippetDto.creatorId, snippet.id), 'CANT_EDIT_SNIPPET'); + if (snippet.userId !== updateSnippetInput.creatorId) { + throw new AppError(errors.CANT_EDIT_SNIPPET(updateSnippetInput.creatorId, snippet.id), 'CANT_EDIT_SNIPPET'); } - if (snippet.name !== updateSnippetDto.name) { - const isSnippetExist = await this.isSnippetExistInFolder(snippet.folderId, updateSnippetDto.name); + if (snippet.name !== updateSnippetInput.name) { + const isSnippetExist = await this.isSnippetExistInFolder(snippet.folderId, updateSnippetInput.name); if (isSnippetExist) { - throw new SnipcodeError(errors.SNIPPET_ALREADY_EXIST(updateSnippetDto.name), 'SNIPPET_ALREADY_EXIST'); + throw new AppError(errors.SNIPPET_ALREADY_EXIST(updateSnippetInput.name), 'SNIPPET_ALREADY_EXIST'); } } - const input = updateSnippetDto.toSnippet(snippet); + const input = updateSnippetInput.toSnippet(snippet); - return prisma.snippet.update({ + return this.prisma.snippet.update({ data: { content: input.content, contentHtml: input.contentHtml, diff --git a/packages/domain/src/users/dtos/create-user-dto.test.ts b/packages/domain/src/services/users/inputs/create-user-input.test.ts similarity index 81% rename from packages/domain/src/users/dtos/create-user-dto.test.ts rename to packages/domain/src/services/users/inputs/create-user-input.test.ts index 81067f50..2442a052 100644 --- a/packages/domain/src/users/dtos/create-user-dto.test.ts +++ b/packages/domain/src/services/users/inputs/create-user-input.test.ts @@ -1,9 +1,9 @@ -import { CreateUserDto } from './create-user-dto'; -import { User } from '../../entities/user'; +import { CreateUserInput } from './create-user-input'; +import { User } from '../user.entity'; -describe('Test Create User DTO', () => { +describe('Test Create User Input', () => { it('should return a valid user object without password', () => { - const dto = new CreateUserDto({ + const input = new CreateUserInput({ email: 'user@email.com', name: 'user admin', oauthProvider: 'github', @@ -13,7 +13,7 @@ describe('Test Create User DTO', () => { username: 'shuser', }); - const user = dto.toUser(); + const user = input.toUser(); const expectedUser: User = { createdAt: expect.any(Date), @@ -34,7 +34,7 @@ describe('Test Create User DTO', () => { }); it('should return a valid user object with a password', () => { - const dto = new CreateUserDto({ + const input = new CreateUserInput({ email: 'user@email.com', name: 'user admin', oauthProvider: 'email', @@ -45,7 +45,7 @@ describe('Test Create User DTO', () => { username: 'shuser', }); - const user = dto.toUser(); + const user = input.toUser(); const expectedUser: User = { createdAt: expect.any(Date), @@ -54,7 +54,7 @@ describe('Test Create User DTO', () => { isEnabled: false, name: 'user admin', oauthProvider: 'email', - password: dto.hashedPassword, + password: input.hashedPassword, pictureUrl: 'pictureUrl', roleId: 'roleId', timezone: 'Europe/Paris', diff --git a/packages/domain/src/users/dtos/create-user-dto.ts b/packages/domain/src/services/users/inputs/create-user-input.ts similarity index 86% rename from packages/domain/src/users/dtos/create-user-dto.ts rename to packages/domain/src/services/users/inputs/create-user-input.ts index 96d4ff62..a5f8e630 100644 --- a/packages/domain/src/users/dtos/create-user-dto.ts +++ b/packages/domain/src/services/users/inputs/create-user-input.ts @@ -1,6 +1,6 @@ -import { OauthProvider, User } from '../../entities/user'; -import { hashPassword } from '../../utils/helpers'; -import { dbID } from '../../utils/id'; +import { dbID } from '../../../utils/db-id'; +import { hashPassword } from '../../../utils/helpers'; +import { OauthProvider, User } from '../user.entity'; type Input = { email: string; @@ -13,7 +13,7 @@ type Input = { username: string | null; }; -export class CreateUserDto { +export class CreateUserInput { readonly hashedPassword: string | null; private readonly userId: string; diff --git a/packages/domain/src/users/dtos/update-user-dto.test.ts b/packages/domain/src/services/users/inputs/update-user-input.test.ts similarity index 68% rename from packages/domain/src/users/dtos/update-user-dto.test.ts rename to packages/domain/src/services/users/inputs/update-user-input.test.ts index 06a662e9..f16922a2 100644 --- a/packages/domain/src/users/dtos/update-user-dto.test.ts +++ b/packages/domain/src/services/users/inputs/update-user-input.test.ts @@ -1,10 +1,10 @@ -import { UpdateUserDto } from './update-user-dto'; -import { createTestUserDto, generateTestId } from '../../../tests/helpers'; -import { User } from '../../entities/user'; +import { UpdateUserInput } from './update-user-input'; +import { TestHelper } from '../../../../tests/helpers'; +import { User } from '../user.entity'; -describe('Test Update User DTO', () => { +describe('Test Update User Input', () => { it('should return the user to update', () => { - const dto = new UpdateUserDto({ + const input = new UpdateUserInput({ name: 'user updated', oauthProvider: 'github', pictureUrl: 'updated pictureUrl', @@ -12,10 +12,10 @@ describe('Test Update User DTO', () => { timezone: 'Europe/Paris', }); - const roleId = generateTestId(); - const currentUser = createTestUserDto({ roleId }).toUser(); + const roleId = TestHelper.generateTestId(); + const currentUser = TestHelper.createTestUserInput({ roleId }).toUser(); - const userToUpdate = dto.toUser(currentUser); + const userToUpdate = input.toUser(currentUser); const expectedUser: User = { createdAt: currentUser.createdAt, @@ -36,7 +36,7 @@ describe('Test Update User DTO', () => { }); it('should return the user to update - validation check', () => { - const dto = new UpdateUserDto({ + const input = new UpdateUserInput({ name: 'user updated', oauthProvider: 'github', pictureUrl: 'updated pictureUrl', @@ -44,11 +44,11 @@ describe('Test Update User DTO', () => { timezone: 'Europe/Paris', }); - const roleId = generateTestId(); - const currentUser = createTestUserDto({ roleId }).toUser(); + const roleId = TestHelper.generateTestId(); + const currentUser = TestHelper.createTestUserInput({ roleId }).toUser(); - dto.isEnabled = true; - const userToUpdate = dto.toUser(currentUser); + input.isEnabled = true; + const userToUpdate = input.toUser(currentUser); const expectedUser: User = { createdAt: currentUser.createdAt, diff --git a/packages/domain/src/users/dtos/update-user-dto.ts b/packages/domain/src/services/users/inputs/update-user-input.ts similarity index 87% rename from packages/domain/src/users/dtos/update-user-dto.ts rename to packages/domain/src/services/users/inputs/update-user-input.ts index 135f2745..6f605a10 100644 --- a/packages/domain/src/users/dtos/update-user-dto.ts +++ b/packages/domain/src/services/users/inputs/update-user-input.ts @@ -1,4 +1,4 @@ -import { OauthProvider, User } from '../../entities/user'; +import { OauthProvider, User } from '../user.entity'; type Input = { name: string; @@ -8,7 +8,7 @@ type Input = { timezone: string | null; }; -export class UpdateUserDto { +export class UpdateUserInput { private enabled = false; constructor(private _input: Input) {} diff --git a/packages/domain/src/entities/user.ts b/packages/domain/src/services/users/user.entity.ts similarity index 100% rename from packages/domain/src/entities/user.ts rename to packages/domain/src/services/users/user.entity.ts diff --git a/packages/domain/src/services/users/user.service.test.ts b/packages/domain/src/services/users/user.service.test.ts new file mode 100644 index 00000000..ad0f0385 --- /dev/null +++ b/packages/domain/src/services/users/user.service.test.ts @@ -0,0 +1,268 @@ +import { Test, TestingModule } from '@nestjs/testing'; +import { AppError, errors, generateRandomId } from '@snipcode/utils'; + +import { User } from './user.entity'; +import { UserService } from './user.service'; +import { TestHelper } from '../../../tests/helpers'; +import { DomainModule } from '../../domain.module'; +import { PrismaService } from '../prisma.service'; +import { RoleService } from '../roles/role.service'; + +describe('Test User service', () => { + let userService: UserService; + let roleService: RoleService; + let testHelper: TestHelper; + + beforeAll(async () => { + const module: TestingModule = await Test.createTestingModule({ + imports: [ + DomainModule.forRootAsync({ + databaseUrl: process.env.DATABASE_URL, + }), + ], + providers: [UserService, RoleService], + }).compile(); + + userService = module.get(UserService); + roleService = module.get(RoleService); + + const prismaService = module.get(PrismaService); + + testHelper = new TestHelper(prismaService); + + await roleService.loadRoles(); + }); + + it('should load users in the database', async () => { + const [roleAdmin] = await roleService.findAll(); + const adminPassword = 'VerStrongPassword'; + + await userService.loadAdminUser(roleAdmin, adminPassword); + + const adminUser = await userService.findByEmail('teco@snipcode.dev'); + + expect(adminUser).toBeDefined(); + + await testHelper.deleteTestUsersById([adminUser?.id]); + }); + + it('should create a user', async () => { + // GIVEN + const role = await testHelper.findTestRole('user'); + const createUserInput = TestHelper.createTestUserInput({ roleId: role.id }); + + // WHEN + const createdUser = await userService.create(createUserInput); + + // THEN + expect(createdUser).toMatchObject({ + createdAt: expect.any(Date), + email: createUserInput.email, + id: createUserInput.toUser().id, + isEnabled: createUserInput.toUser().isEnabled, + name: createUserInput.toUser().name, + oauthProvider: createUserInput.toUser().oauthProvider, + password: null, + pictureUrl: createUserInput.toUser().pictureUrl, + roleId: createUserInput.toUser().roleId, + timezone: createUserInput.toUser().timezone, + updatedAt: expect.any(Date), + username: createUserInput.toUser().username, + }); + + await testHelper.deleteTestUsersById([createdUser.id]); + }); + + it('should create a user with no username', async () => { + // GIVEN + const role = await testHelper.findTestRole('user'); + const createUserInput = TestHelper.createTestUserInput({ roleId: role.id, username: null }); + + // WHEN + const createdUser = await userService.create(createUserInput); + + // THEN + expect(createdUser).toMatchObject({ + createdAt: expect.any(Date), + email: createUserInput.email, + id: createUserInput.toUser().id, + isEnabled: createUserInput.toUser().isEnabled, + name: createUserInput.toUser().name, + oauthProvider: createUserInput.toUser().oauthProvider, + password: null, + pictureUrl: createUserInput.toUser().pictureUrl, + roleId: createUserInput.toUser().roleId, + timezone: createUserInput.toUser().timezone, + updatedAt: expect.any(Date), + username: expect.any(String), + }); + + await testHelper.deleteTestUsersById([createdUser.id]); + }); + + it('should create a user with a username that already exists', async () => { + // GIVEN + const role = await testHelper.findTestRole('user'); + const user = await testHelper.createTestUser({ username: 'roloto' }); + + const createUserInput = await TestHelper.createTestUserInput({ roleId: role.id, username: 'roloto' }); + + // WHEN + const createdUser = await userService.create(createUserInput); + + // THEN + expect(createdUser.username).not.toEqual('roloto'); + + await testHelper.deleteTestUsersById([user.id, createdUser.id]); + }); + + it('should create a user - validation check', async () => { + // GIVEN + const role = await testHelper.findTestRole('user'); + const createUserInput = TestHelper.createTestUserInput({ roleId: role.id }); + + createUserInput.isEnabled = true; + + // WHEN + const createdUser = await userService.create(createUserInput); + + // THEN + expect(createdUser).toMatchObject({ + createdAt: expect.any(Date), + email: createUserInput.email, + id: createUserInput.toUser().id, + isEnabled: createUserInput.toUser().isEnabled, + name: createUserInput.toUser().name, + oauthProvider: createUserInput.toUser().oauthProvider, + password: null, + pictureUrl: createUserInput.toUser().pictureUrl, + roleId: createUserInput.toUser().roleId, + timezone: createUserInput.toUser().timezone, + updatedAt: expect.any(Date), + username: createUserInput.toUser().username, + }); + + await testHelper.deleteTestUsersById([createdUser.id]); + }); + + it('should fail create a user because the email address already exists', async () => { + // GIVEN + const user = await testHelper.createTestUser({ email: 'user@email.com' }); + const role = await testHelper.findTestRole('user'); + const createUserInput = TestHelper.createTestUserInput({ email: 'user@email.com', roleId: role.id }); + + // WHEN + // THEN + await expect(async () => { + await userService.create(createUserInput); + }).rejects.toThrow(new AppError(errors.EMAIL_ALREADY_TAKEN, 'EMAIL_ALREADY_TAKEN')); + + await testHelper.deleteTestUsersById([user.id]); + }); + + it('should update user information', async () => { + // GIVEN + const currentUser = await testHelper.createTestUser({}); + + const role = await testHelper.findTestRole('admin'); + const updateUserInput = TestHelper.updateTestUserInput(role.id); + + // WHEN + const updatedUser = await userService.update(currentUser, updateUserInput); + + // THEN + expect(updatedUser).toMatchObject({ + createdAt: expect.any(Date), + email: currentUser.email, + id: currentUser.id, + isEnabled: updateUserInput.toUser(currentUser).isEnabled, + name: updateUserInput.toUser(currentUser).name, + oauthProvider: updateUserInput.toUser(currentUser).oauthProvider, + password: null, + pictureUrl: updateUserInput.toUser(currentUser).pictureUrl, + roleId: updateUserInput.toUser(currentUser).roleId, + timezone: updateUserInput.toUser(currentUser).timezone, + updatedAt: expect.any(Date), + username: currentUser.username, + }); + + await testHelper.deleteTestUsersById([currentUser.id]); + }); + + it("should fail to authenticate the user because the email doesn't exists", async () => { + // GIVEN + const userEmail = 'email@test.com'; + const userPassword = 'strongPassword'; + + // WHEN + // THEN + await expect(() => userService.login(userEmail, userPassword)).rejects.toThrow( + new AppError(errors.LOGIN_FAILED, 'LOGIN_FAILED'), + ); + }); + + it('should fail to authenticate the user because the password is not correct', async () => { + // GIVEN + const userPassword = 'strongPassword'; + const userBadPassword = 'badPassword'; + const user = await testHelper.createTestUser({ oauthProvider: 'email', password: userPassword }); + + // WHEN + // THEN + await expect(() => userService.login(user.email, userBadPassword)).rejects.toThrow( + new AppError(errors.LOGIN_FAILED, 'LOGIN_FAILED'), + ); + + await testHelper.deleteTestUsersById([user.id]); + }); + + it('should fail to authenticate the user because the user is disabled', async () => { + // GIVEN + const userPassword = 'strongPassword'; + const user = await testHelper.createTestUser({ oauthProvider: 'email', password: userPassword }); + + // WHEN + // THEN + await expect(() => userService.login(user.email, userPassword)).rejects.toThrow( + new AppError(errors.ACCOUNT_DISABLED, 'ACCOUNT_DISABLED'), + ); + + await testHelper.deleteTestUsersById([user.id]); + }); + + it('should successfully authenticate the user', async () => { + // GIVEN + const userPassword = 'strongPassword'; + const user = await testHelper.createTestUser({ + isEnabled: true, + oauthProvider: 'email', + password: userPassword, + }); + + // WHEN + const authenticatedUser = await userService.login(user.email, userPassword); + + // THEN + expect(user).toMatchObject({ + email: authenticatedUser.email, + id: authenticatedUser.id, + name: authenticatedUser.name, + oauthProvider: authenticatedUser.oauthProvider, + roleId: authenticatedUser.roleId, + username: authenticatedUser.username, + }); + + await testHelper.deleteTestUsersById([user.id]); + }); + + it('should found no user given the ID provided', async () => { + // GIVEN + const snippetId = generateRandomId(); + + // WHEN + const user = await userService.findById(snippetId); + + // THEN + expect(user).toBeNull(); + }); +}); diff --git a/packages/domain/src/users/user.service.ts b/packages/domain/src/services/users/user.service.ts similarity index 53% rename from packages/domain/src/users/user.service.ts rename to packages/domain/src/services/users/user.service.ts index 9ff2440b..52976b04 100644 --- a/packages/domain/src/users/user.service.ts +++ b/packages/domain/src/services/users/user.service.ts @@ -1,29 +1,33 @@ -import SnipcodeError, { errors } from '@snipcode/utils'; +import { Injectable } from '@nestjs/common'; +import { AppError, errors } from '@snipcode/utils'; import bcrypt from 'bcryptjs'; import { generateFromEmail } from 'unique-username-generator'; -import { CreateUserDto } from './dtos/create-user-dto'; -import { UpdateUserDto } from './dtos/update-user-dto'; -import { Role } from '../entities/role'; -import { User } from '../entities/user'; -import { CreateUserRootFolderDto } from '../folders/dtos/create-user-root-folder-dto'; -import { prisma } from '../utils/prisma'; +import { CreateUserInput } from './inputs/create-user-input'; +import { UpdateUserInput } from './inputs/update-user-input'; +import { User } from './user.entity'; +import { CreateUserRootFolderInput } from '../folders/inputs/create-user-root-folder-input'; +import { PrismaService } from '../prisma.service'; +import { Role } from '../roles/role.entity'; +@Injectable() export class UserService { - async create(createUserDto: CreateUserDto): Promise { - const user = await this.findByEmail(createUserDto.email); + constructor(private readonly prisma: PrismaService) {} + + async create(createUserInput: CreateUserInput): Promise { + const user = await this.findByEmail(createUserInput.email); if (user) { - throw new SnipcodeError(errors.EMAIL_ALREADY_TAKEN, 'EMAIL_ALREADY_TAKEN'); + throw new AppError(errors.EMAIL_ALREADY_TAKEN, 'EMAIL_ALREADY_TAKEN'); } - const username = await this.generateUsername(createUserDto.email, createUserDto.username); + const username = await this.generateUsername(createUserInput.email, createUserInput.username); - createUserDto.setUsername(username); + createUserInput.setUsername(username); - const input = createUserDto.toUser(); + const input = createUserInput.toUser(); - return prisma.user.create({ + return this.prisma.user.create({ data: { email: input.email, id: input.id, @@ -39,10 +43,10 @@ export class UserService { }); } - async update(currentUser: User, updateUserDto: UpdateUserDto): Promise { - const input = updateUserDto.toUser(currentUser); + async update(currentUser: User, updateUserInput: UpdateUserInput): Promise { + const input = updateUserInput.toUser(currentUser); - return prisma.user.update({ + return this.prisma.user.update({ data: { isEnabled: input.isEnabled, name: input.name, @@ -57,7 +61,7 @@ export class UserService { } async loadAdminUser(role: Role, adminPassword: string): Promise { - const userAdminDto = new CreateUserDto({ + const userAdminInput = new CreateUserInput({ email: 'teco@snipcode.dev', name: 'Eric Teco', oauthProvider: 'email', @@ -68,17 +72,17 @@ export class UserService { username: 'teco', }); - userAdminDto.isEnabled = true; + userAdminInput.isEnabled = true; - const userAdmin = await this.findByEmail(userAdminDto.email); + const userAdmin = await this.findByEmail(userAdminInput.email); if (userAdmin) { return; } - const userInput = userAdminDto.toUser(); + const userInput = userAdminInput.toUser(); - const user = await prisma.user.create({ + const user = await this.prisma.user.create({ data: { email: userInput.email, id: userInput.id, @@ -93,11 +97,11 @@ export class UserService { }, }); - const createUserRootFolderDto = new CreateUserRootFolderDto(user.id); + const createUserRootFolderInput = new CreateUserRootFolderInput(user.id); - const folderInput = createUserRootFolderDto.toFolder(); + const folderInput = createUserRootFolderInput.toFolder(); - await prisma.folder.create({ + await this.prisma.folder.create({ data: { id: folderInput.id, name: folderInput.name, @@ -108,39 +112,49 @@ export class UserService { } async findByEmail(email: string): Promise { - return prisma.user.findUnique({ where: { email } }); + return this.prisma.user.findUnique({ where: { email } }); } async findById(id: string): Promise { - return prisma.user.findUnique({ where: { id } }); + return this.prisma.user.findUnique({ where: { id } }); } async login(email: string, password: string): Promise { const user = await this.findByEmail(email); if (!user) { - throw new SnipcodeError(errors.LOGIN_FAILED, 'LOGIN_FAILED'); + throw new AppError(errors.LOGIN_FAILED, 'LOGIN_FAILED'); } const isPasswordValid = user.password ? bcrypt.compareSync(password, user.password) : false; if (!isPasswordValid) { - throw new SnipcodeError(errors.LOGIN_FAILED, 'LOGIN_FAILED'); + throw new AppError(errors.LOGIN_FAILED, 'LOGIN_FAILED'); } if (!user.isEnabled) { - throw new SnipcodeError(errors.ACCOUNT_DISABLED, 'ACCOUNT_DISABLED'); + throw new AppError(errors.ACCOUNT_DISABLED, 'ACCOUNT_DISABLED'); } return user; } + async activate(userId: string): Promise { + return this.prisma.user.update({ + data: { + isEnabled: true, + updatedAt: new Date(), + }, + where: { id: userId }, + }); + } + private async generateUsername(email: string, username: string | null): Promise { if (!username) { return generateFromEmail(email, 3); } - const user = await prisma.user.findFirst({ + const user = await this.prisma.user.findFirst({ where: { username, }, diff --git a/packages/domain/src/sessions/session.service.test.ts b/packages/domain/src/sessions/session.service.test.ts deleted file mode 100644 index d784f4f4..00000000 --- a/packages/domain/src/sessions/session.service.test.ts +++ /dev/null @@ -1,54 +0,0 @@ -import { SessionService } from './session.service'; -import { createTestSession, createTestSessionDto, deleteTestUserSessions, generateTestId } from '../../tests/helpers'; -import { Session } from '../entities/session'; - -const sessionService = new SessionService(); - -describe('Test Session Service', function () { - it('should create a session', async () => { - // GIVEN - const userId = generateTestId(); - const dto = createTestSessionDto(userId); - - // WHEN - const sessionCreated = await sessionService.create(dto); - - // THEN - expect(sessionCreated).toMatchObject(dto.toSession()); - - await deleteTestUserSessions(sessionCreated.userId); - }); - - it('should find a session by token', async () => { - // GIVEN - const userId = generateTestId(); - const session = await createTestSession({ userId }); - - // WHEN - const sessionFound = await sessionService.findByToken(session.token); - - // THEN - expect(session).toEqual(sessionFound); - - await deleteTestUserSessions(session.userId); - }); - - it('should delete all session of a user', async () => { - // GIVEN - const userId = generateTestId(); - - const sessionsCreated = await Promise.all([ - createTestSession({ userId }), - createTestSession({ userId }), - createTestSession({ userId }), - ]); - - // WHEN - await sessionService.deleteUserSessions(userId); - - // THEN - const userSessions = await Promise.all(sessionsCreated.map(({ token }) => sessionService.findByToken(token))); - - expect(userSessions.every((session) => !session)).toBe(true); - }); -}); diff --git a/packages/domain/src/sessions/session.service.ts b/packages/domain/src/sessions/session.service.ts deleted file mode 100644 index 07ad3182..00000000 --- a/packages/domain/src/sessions/session.service.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { CreateSessionDto } from './dtos/create-session-dto'; -import { Session } from '../entities/session'; -import { prisma } from '../utils/prisma'; - -export class SessionService { - async create(createSessionDto: CreateSessionDto): Promise { - const input = createSessionDto.toSession(); - - return prisma.session.create({ - data: { - expires: input.expires, - id: input.id, - token: input.token, - userId: input.userId, - }, - }); - } - - async deleteUserSessions(userId: string): Promise { - await prisma.session.deleteMany({ where: { userId } }); - } - - async findByToken(token: string): Promise { - return prisma.session.findUnique({ where: { token } }); - } -} diff --git a/packages/domain/src/snippets/dtos/delete-snippet-dto.test.ts b/packages/domain/src/snippets/dtos/delete-snippet-dto.test.ts deleted file mode 100644 index 16ea4597..00000000 --- a/packages/domain/src/snippets/dtos/delete-snippet-dto.test.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { DeleteSnippetDto } from './delete-snippet-dto'; -import { generateTestId } from '../../../tests/helpers'; - -describe('Test Delete Snippet DTO', () => { - it('should have the right property defined', () => { - const snippetId = generateTestId(); - const userId = generateTestId(); - - // GIVEN - const dto = new DeleteSnippetDto({ - creatorId: userId, - snippetId, - }); - - // WHEN - // THEN - expect(dto.snippetId).toEqual(snippetId); - expect(dto.creatorId).toEqual(userId); - }); -}); diff --git a/packages/domain/src/snippets/snippet.service.test.ts b/packages/domain/src/snippets/snippet.service.test.ts deleted file mode 100644 index db811a00..00000000 --- a/packages/domain/src/snippets/snippet.service.test.ts +++ /dev/null @@ -1,320 +0,0 @@ -import SnipcodeError, { errors, generateRandomId } from '@snipcode/utils'; - -import { SnippetService } from './snippet.service'; -import { - createTestSnippet, - createTestSnippetDto, - createUserWithRootFolder, - deleteTestFoldersById, - deleteTestSnippetDto, - deleteTestSnippetsById, - deleteTestUsersById, - updateTestSnippetDto, -} from '../../tests/helpers'; -import { Snippet } from '../entities/snippet'; -import { RoleService } from '../roles/role.service'; - -const snippetService = new SnippetService(); -const roleService = new RoleService(); - -describe('Test Snippet service', () => { - beforeAll(async () => { - await roleService.loadRoles(); - }); - - it('should create a snippet in the specified folder', async () => { - // GIVEN - const [user, rootFolder] = await createUserWithRootFolder(); - const createSnippetDto = createTestSnippetDto({ folderId: rootFolder.id, userId: user.id }); - - // WHEN - const expectedSnippet = await snippetService.create(createSnippetDto); - - // THEN - expect(expectedSnippet).toMatchObject({ - content: createSnippetDto.toSnippet().content, - contentHtml: createSnippetDto.toSnippet().contentHtml, - createdAt: expect.any(Date), - description: createSnippetDto.toSnippet().description, - folderId: rootFolder.id, - id: createSnippetDto.toSnippet().id, - language: createSnippetDto.toSnippet().language, - lineHighlight: createSnippetDto.toSnippet().lineHighlight, - name: createSnippetDto.toSnippet().name, - size: createSnippetDto.toSnippet().size, - theme: createSnippetDto.toSnippet().theme, - updatedAt: expect.any(Date), - userId: user.id, - visibility: createSnippetDto.toSnippet().visibility, - }); - - await deleteTestSnippetsById([expectedSnippet.id]); - await deleteTestFoldersById([rootFolder.id]); - await deleteTestUsersById([user.id]); - }); - - it('should not create a snippet because it already exists in the specified folder', async () => { - // GIVEN - const [user, rootFolder] = await createUserWithRootFolder(); - const snippet = await createTestSnippet({ folderId: rootFolder.id, name: 'app.tsx', userId: user.id }); - - const sameCreateSnippetDto = createTestSnippetDto({ folderId: rootFolder.id, name: 'app.tsx', userId: user.id }); - - // WHEN - // THEN - await expect(() => snippetService.create(sameCreateSnippetDto)).rejects.toThrow( - new SnipcodeError(errors.SNIPPET_ALREADY_EXIST(sameCreateSnippetDto.name), 'SNIPPET_ALREADY_EXIST'), - ); - - await deleteTestSnippetsById([snippet.id]); - await deleteTestFoldersById([rootFolder.id]); - await deleteTestUsersById([user.id]); - }); - - it('should retrieve all public snippets', async () => { - // GIVEN - const [user, rootFolder] = await createUserWithRootFolder(); - const existingSnippets = await Promise.all([ - createTestSnippet({ folderId: rootFolder.id, userId: user.id, visibility: 'public' }), - createTestSnippet({ folderId: rootFolder.id, userId: user.id, visibility: 'private' }), - createTestSnippet({ folderId: rootFolder.id, userId: user.id, visibility: 'public' }), - createTestSnippet({ folderId: rootFolder.id, userId: user.id, visibility: 'private' }), - createTestSnippet({ folderId: rootFolder.id, userId: user.id, visibility: 'public' }), - createTestSnippet({ folderId: rootFolder.id, userId: user.id, visibility: 'public' }), - ]); - - // WHEN - const publicSnippets = await snippetService.findPublicSnippet({ itemPerPage: 10 }); - - // THEN - await expect(publicSnippets.hasMore).toEqual(false); - await expect(publicSnippets.nextCursor).toEqual(null); - await expect(publicSnippets.items).toHaveLength(4); - - await deleteTestSnippetsById(existingSnippets.map((snippet) => snippet.id)); - await deleteTestFoldersById([rootFolder.id]); - await deleteTestUsersById([user.id]); - }); - - it('should retrieve a subset of public snippets', async () => { - // GIVEN - const [user, rootFolder] = await createUserWithRootFolder(); - const existingSnippets = await Promise.all([ - createTestSnippet({ folderId: rootFolder.id, userId: user.id, visibility: 'public' }), - createTestSnippet({ folderId: rootFolder.id, userId: user.id, visibility: 'private' }), - createTestSnippet({ folderId: rootFolder.id, userId: user.id, visibility: 'public' }), - createTestSnippet({ folderId: rootFolder.id, userId: user.id, visibility: 'private' }), - createTestSnippet({ folderId: rootFolder.id, userId: user.id, visibility: 'public' }), - createTestSnippet({ folderId: rootFolder.id, userId: user.id, visibility: 'public' }), - ]); - - // WHEN - const publicSnippets = await snippetService.findPublicSnippet({ itemPerPage: 3 }); - - // THEN - await expect(publicSnippets.hasMore).toEqual(true); - await expect(publicSnippets.nextCursor).toEqual(expect.any(String)); - await expect(publicSnippets.items).toHaveLength(3); - - await deleteTestSnippetsById(existingSnippets.map((snippet) => snippet.id)); - await deleteTestFoldersById([rootFolder.id]); - await deleteTestUsersById([user.id]); - }); - - it('should find all snippets of a user', async () => { - // GIVEN - const [user1, rootFolder1] = await createUserWithRootFolder(); - const [user2, rootFolder2] = await createUserWithRootFolder(); - - const existingSnippets = await Promise.all([ - createTestSnippet({ folderId: rootFolder1.id, userId: user1.id, visibility: 'public' }), - createTestSnippet({ folderId: rootFolder1.id, userId: user1.id, visibility: 'private' }), - createTestSnippet({ folderId: rootFolder2.id, userId: user2.id, visibility: 'public' }), - createTestSnippet({ folderId: rootFolder1.id, userId: user1.id, visibility: 'private' }), - createTestSnippet({ folderId: rootFolder2.id, userId: user2.id, visibility: 'public' }), - createTestSnippet({ folderId: rootFolder2.id, userId: user2.id, visibility: 'private' }), - ]); - - // WHEN - const userSnippets = await snippetService.findByUser(user2.id); - - // THEN - await expect(userSnippets).toHaveLength(3); - - await deleteTestSnippetsById(existingSnippets.map((snippet) => snippet.id)); - await deleteTestFoldersById([rootFolder1.id, rootFolder2.id]); - await deleteTestUsersById([user1.id, user2.id]); - }); - - it('should retrieve a snippet by its ID', async () => { - // GIVEN - const [user1, rootFolder1] = await createUserWithRootFolder(); - - const [snippet] = await Promise.all([ - createTestSnippet({ folderId: rootFolder1.id, userId: user1.id, visibility: 'public' }), - ]); - - // WHEN - const snippetFound = await snippetService.findById(snippet.id); - - // THEN - expect(snippetFound).toMatchObject({ - folderId: rootFolder1.id, - id: snippet.id, - userId: user1.id, - visibility: 'public', - }); - - await deleteTestSnippetsById([snippet.id]); - await deleteTestFoldersById([rootFolder1.id]); - await deleteTestUsersById([user1.id]); - }); - - it('should found no snippet given the ID provided', async () => { - // GIVEN - const snippetId = generateRandomId(); - - // WHEN - // THEN - await expect(async () => { - await snippetService.findById(snippetId); - }).rejects.toThrow(new SnipcodeError(errors.SNIPPET_NOT_FOUND(snippetId), 'SNIPPET_NOT_FOUND')); - }); - - it('should delete an existing snippet belonging to a user', async () => { - // GIVEN - const [user, rootFolder] = await createUserWithRootFolder(); - - const [snippet1, snippet2] = await Promise.all([ - createTestSnippet({ folderId: rootFolder.id, userId: user.id, visibility: 'public' }), - createTestSnippet({ folderId: rootFolder.id, userId: user.id, visibility: 'private' }), - ]); - - // WHEN - const deleteSnippetDto = deleteTestSnippetDto({ snippetId: snippet1.id, userId: snippet1.userId }); - - await snippetService.delete(deleteSnippetDto); - - // THEN - const folderSnippets = await snippetService.findByFolder(rootFolder.id); - - expect(folderSnippets).toHaveLength(1); - - await deleteTestSnippetsById([snippet2.id]); - await deleteTestFoldersById([rootFolder.id]); - await deleteTestUsersById([user.id]); - }); - - it('should not delete an existing snippet because it belongs to other user', async () => { - // GIVEN - const [user1, rootFolder1] = await createUserWithRootFolder(); - const [user2, rootFolder2] = await createUserWithRootFolder(); - - const [snippet1, snippet2, snippet3] = await Promise.all([ - createTestSnippet({ folderId: rootFolder1.id, userId: user1.id, visibility: 'public' }), - createTestSnippet({ folderId: rootFolder2.id, userId: user2.id, visibility: 'private' }), - createTestSnippet({ folderId: rootFolder1.id, userId: user1.id, visibility: 'private' }), - ]); - - // WHEN - const deleteSnippetDto = deleteTestSnippetDto({ snippetId: snippet1.id, userId: user2.id }); - - // THEN - await expect(async () => { - await snippetService.delete(deleteSnippetDto); - }).rejects.toThrow( - new SnipcodeError(errors.CANT_EDIT_SNIPPET(deleteSnippetDto.creatorId, snippet1.id), 'CANT_EDIT_SNIPPET'), - ); - - const user1FolderSnippets = await snippetService.findByFolder(rootFolder1.id); - const user2FolderSnippets = await snippetService.findByFolder(rootFolder2.id); - - expect(user1FolderSnippets).toHaveLength(2); - expect(user2FolderSnippets).toHaveLength(1); - - await deleteTestSnippetsById([snippet2.id, snippet3.id]); - await deleteTestFoldersById([rootFolder1.id, rootFolder2.id]); - await deleteTestUsersById([user1.id, user2.id]); - }); - - it('should update an existing snippet in the specified folder', async () => { - // GIVEN - const [user, rootFolder] = await createUserWithRootFolder(); - const [snippet] = await Promise.all([ - createTestSnippet({ folderId: rootFolder.id, userId: user.id, visibility: 'public' }), - ]); - - const updateSnippetDto = updateTestSnippetDto({ snippetId: snippet.id, userId: user.id }); - - // WHEN - const updatedSnippet = await snippetService.update(updateSnippetDto); - - // THEN - const snippetToUpdate = updateSnippetDto.toSnippet(snippet); - - expect(updatedSnippet).toMatchObject({ - content: snippetToUpdate.content, - contentHtml: snippetToUpdate.contentHtml, - createdAt: expect.any(Date), - description: snippetToUpdate.description, - folderId: rootFolder.id, - id: snippet.id, - language: snippetToUpdate.language, - lineHighlight: snippetToUpdate.lineHighlight, - name: snippetToUpdate.name, - size: snippetToUpdate.size, - theme: snippetToUpdate.theme, - updatedAt: expect.any(Date), - userId: user.id, - visibility: snippetToUpdate.visibility, - }); - - await deleteTestSnippetsById([updatedSnippet.id]); - await deleteTestFoldersById([rootFolder.id]); - await deleteTestUsersById([user.id]); - }); - - it('should not update an existing snippet in the specified folder because another snippet with the updated name already exists in the folder', async () => { - // GIVEN - const [user, rootFolder] = await createUserWithRootFolder(); - const [snippet] = await Promise.all([ - createTestSnippet({ folderId: rootFolder.id, name: 'snippet-one.java', userId: user.id }), - createTestSnippet({ folderId: rootFolder.id, name: 'snippet-two.java', userId: user.id, visibility: 'private' }), - ]); - - const updateSnippetDto = updateTestSnippetDto({ name: 'snippet-two.java', snippetId: snippet.id, userId: user.id }); - - // WHEN - // THEN - await expect(async () => { - await snippetService.update(updateSnippetDto); - }).rejects.toThrow(new SnipcodeError(errors.SNIPPET_ALREADY_EXIST(updateSnippetDto.name), 'SNIPPET_ALREADY_EXIST')); - - await deleteTestSnippetsById([snippet.id]); - await deleteTestFoldersById([rootFolder.id]); - await deleteTestUsersById([user.id]); - }); - - it('should not update an existing snippet in the specified folder because because it belongs to other user', async () => { - // GIVEN - const [user1, rootFolder1] = await createUserWithRootFolder(); - const [user2, rootFolder2] = await createUserWithRootFolder(); - const [snippet] = await Promise.all([ - createTestSnippet({ folderId: rootFolder1.id, name: 'snippet-one.java', userId: user1.id }), - ]); - - const updateSnippetDto = updateTestSnippetDto({ snippetId: snippet.id, userId: user2.id }); - - // WHEN - // THEN - await expect(async () => { - await snippetService.update(updateSnippetDto); - }).rejects.toThrow( - new SnipcodeError(errors.CANT_EDIT_SNIPPET(updateSnippetDto.creatorId, snippet.id), 'CANT_EDIT_SNIPPET'), - ); - - await deleteTestSnippetsById([snippet.id]); - await deleteTestFoldersById([rootFolder1.id, rootFolder2.id]); - await deleteTestUsersById([user1.id, user2.id]); - }); -}); diff --git a/packages/domain/src/users/user.service.test.ts b/packages/domain/src/users/user.service.test.ts deleted file mode 100644 index 3bb4c988..00000000 --- a/packages/domain/src/users/user.service.test.ts +++ /dev/null @@ -1,254 +0,0 @@ -import SnipcodeError, { errors, generateRandomId } from '@snipcode/utils'; - -import { UserService } from './user.service'; -import { - createTestUser, - createTestUserDto, - deleteTestUsersById, - findTestRole, - updateTestUserDto, -} from '../../tests/helpers'; -import { User } from '../entities/user'; -import { RoleService } from '../roles/role.service'; - -const roleService = new RoleService(); -const userService = new UserService(); - -describe('Test User service', () => { - beforeAll(async () => { - await roleService.loadRoles(); - }); - - it('should load users in the database', async () => { - const [roleAdmin] = await roleService.findAll(); - const adminPassword = 'VerStrongPassword'; - - await userService.loadAdminUser(roleAdmin, adminPassword); - - const adminUser = await userService.findByEmail('teco@snipcode.dev'); - - expect(adminUser).toBeDefined(); - - await deleteTestUsersById([adminUser?.id]); - }); - - it('should create a user', async () => { - // GIVEN - const role = await findTestRole('user'); - const createUserDto = await createTestUserDto({ roleId: role.id }); - - // WHEN - const createdUser = await userService.create(createUserDto); - - // THEN - expect(createdUser).toMatchObject({ - createdAt: expect.any(Date), - email: createUserDto.email, - id: createUserDto.toUser().id, - isEnabled: createUserDto.toUser().isEnabled, - name: createUserDto.toUser().name, - oauthProvider: createUserDto.toUser().oauthProvider, - password: null, - pictureUrl: createUserDto.toUser().pictureUrl, - roleId: createUserDto.toUser().roleId, - timezone: createUserDto.toUser().timezone, - updatedAt: expect.any(Date), - username: createUserDto.toUser().username, - }); - - await deleteTestUsersById([createdUser.id]); - }); - - it('should create a user with no username', async () => { - // GIVEN - const role = await findTestRole('user'); - const createUserDto = await createTestUserDto({ roleId: role.id, username: null }); - - // WHEN - const createdUser = await userService.create(createUserDto); - - // THEN - expect(createdUser).toMatchObject({ - createdAt: expect.any(Date), - email: createUserDto.email, - id: createUserDto.toUser().id, - isEnabled: createUserDto.toUser().isEnabled, - name: createUserDto.toUser().name, - oauthProvider: createUserDto.toUser().oauthProvider, - password: null, - pictureUrl: createUserDto.toUser().pictureUrl, - roleId: createUserDto.toUser().roleId, - timezone: createUserDto.toUser().timezone, - updatedAt: expect.any(Date), - username: expect.any(String), - }); - - await deleteTestUsersById([createdUser.id]); - }); - - it('should create a user with a username that already exists', async () => { - // GIVEN - const role = await findTestRole('user'); - const user = await createTestUser({ username: 'roloto' }); - - const createUserDto = await createTestUserDto({ roleId: role.id, username: 'roloto' }); - - // WHEN - const createdUser = await userService.create(createUserDto); - - // THEN - expect(createdUser.username).not.toEqual('roloto'); - - await deleteTestUsersById([user.id, createdUser.id]); - }); - - it('should create a user - validation check', async () => { - // GIVEN - const role = await findTestRole('user'); - const createUserDto = await createTestUserDto({ roleId: role.id }); - - createUserDto.isEnabled = true; - - // WHEN - const createdUser = await userService.create(createUserDto); - - // THEN - expect(createdUser).toMatchObject({ - createdAt: expect.any(Date), - email: createUserDto.email, - id: createUserDto.toUser().id, - isEnabled: createUserDto.toUser().isEnabled, - name: createUserDto.toUser().name, - oauthProvider: createUserDto.toUser().oauthProvider, - password: null, - pictureUrl: createUserDto.toUser().pictureUrl, - roleId: createUserDto.toUser().roleId, - timezone: createUserDto.toUser().timezone, - updatedAt: expect.any(Date), - username: createUserDto.toUser().username, - }); - - await deleteTestUsersById([createdUser.id]); - }); - - it('should fail create a user because the email address already exists', async () => { - // GIVEN - const user = await createTestUser({ email: 'user@email.com' }); - const role = await findTestRole('user'); - const createUserDto = await createTestUserDto({ email: 'user@email.com', roleId: role.id }); - - // WHEN - // THEN - await expect(async () => { - await userService.create(createUserDto); - }).rejects.toThrow(new SnipcodeError(errors.EMAIL_ALREADY_TAKEN, 'EMAIL_ALREADY_TAKEN')); - - await deleteTestUsersById([user.id]); - }); - - it('should update user information', async () => { - // GIVEN - const currentUser = await createTestUser({}); - - const role = await findTestRole('admin'); - const updateUserDto = updateTestUserDto(role.id); - - // WHEN - const updatedUser = await userService.update(currentUser, updateUserDto); - - // THEN - expect(updatedUser).toMatchObject({ - createdAt: expect.any(Date), - email: currentUser.email, - id: currentUser.id, - isEnabled: updateUserDto.toUser(currentUser).isEnabled, - name: updateUserDto.toUser(currentUser).name, - oauthProvider: updateUserDto.toUser(currentUser).oauthProvider, - password: null, - pictureUrl: updateUserDto.toUser(currentUser).pictureUrl, - roleId: updateUserDto.toUser(currentUser).roleId, - timezone: updateUserDto.toUser(currentUser).timezone, - updatedAt: expect.any(Date), - username: currentUser.username, - }); - - await deleteTestUsersById([currentUser.id]); - }); - - it("should fail to authenticate the user because the email doesn't exists", async () => { - // GIVEN - const userEmail = 'email@test.com'; - const userPassword = 'strongPassword'; - - // WHEN - // THEN - await expect(() => userService.login(userEmail, userPassword)).rejects.toThrow( - new SnipcodeError(errors.LOGIN_FAILED, 'LOGIN_FAILED'), - ); - }); - - it('should fail to authenticate the user because the password is not correct', async () => { - // GIVEN - const userPassword = 'strongPassword'; - const userBadPassword = 'badPassword'; - const user = await createTestUser({ oauthProvider: 'email', password: userPassword }); - - // WHEN - // THEN - await expect(() => userService.login(user.email, userBadPassword)).rejects.toThrow( - new SnipcodeError(errors.LOGIN_FAILED, 'LOGIN_FAILED'), - ); - - await deleteTestUsersById([user.id]); - }); - - it('should fail to authenticate the user because the user is disabled', async () => { - // GIVEN - const userPassword = 'strongPassword'; - const user = await createTestUser({ oauthProvider: 'email', password: userPassword }); - - // WHEN - // THEN - await expect(() => userService.login(user.email, userPassword)).rejects.toThrow( - new SnipcodeError(errors.ACCOUNT_DISABLED, 'ACCOUNT_DISABLED'), - ); - - await deleteTestUsersById([user.id]); - }); - - it('should successfully authenticate the user', async () => { - // GIVEN - const userPassword = 'strongPassword'; - const user = await createTestUser({ - isEnabled: true, - oauthProvider: 'email', - password: userPassword, - }); - - // WHEN - const authenticatedUser = await userService.login(user.email, userPassword); - - // THEN - expect(user).toMatchObject({ - email: authenticatedUser.email, - id: authenticatedUser.id, - name: authenticatedUser.name, - oauthProvider: authenticatedUser.oauthProvider, - roleId: authenticatedUser.roleId, - username: authenticatedUser.username, - }); - - await deleteTestUsersById([user.id]); - }); - - it('should found no user given the ID provided', async () => { - // GIVEN - const snippetId = generateRandomId(); - - // WHEN - const user = await userService.findById(snippetId); - - // THEN - expect(user).toBeNull(); - }); -}); diff --git a/packages/domain/src/utils/axios-error.ts b/packages/domain/src/utils/axios-error.ts index 873065eb..e9a2c8c0 100644 --- a/packages/domain/src/utils/axios-error.ts +++ b/packages/domain/src/utils/axios-error.ts @@ -1,12 +1,12 @@ -import SnipcodeError, { ErrorCode } from '@snipcode/utils'; +import { AppError, AppErrorCode } from '@snipcode/utils'; import { AxiosError } from 'axios'; -export const handleRequestError = (errorCode: ErrorCode) => (error: AxiosError) => { +export const handleRequestError = (errorCode: AppErrorCode) => (error: AxiosError) => { const errorInfo = { data: error.response?.data, message: error.message, status: error.response?.status, }; - throw new SnipcodeError(JSON.stringify(errorInfo, null, 2), errorCode); + throw new AppError(JSON.stringify(errorInfo, null, 2), errorCode); }; diff --git a/packages/domain/src/utils/id.test.ts b/packages/domain/src/utils/db-id.test.ts similarity index 92% rename from packages/domain/src/utils/id.test.ts rename to packages/domain/src/utils/db-id.test.ts index 4c71c268..ae680c62 100644 --- a/packages/domain/src/utils/id.test.ts +++ b/packages/domain/src/utils/db-id.test.ts @@ -1,4 +1,4 @@ -import { dbID } from './id'; +import { dbID } from './db-id'; describe('Test Database ID generator', () => { test('generate a valid id', () => { diff --git a/packages/domain/src/utils/id.ts b/packages/domain/src/utils/db-id.ts similarity index 100% rename from packages/domain/src/utils/id.ts rename to packages/domain/src/utils/db-id.ts diff --git a/packages/domain/src/utils/prisma.ts b/packages/domain/src/utils/prisma.ts index eef71154..77c834ea 100644 --- a/packages/domain/src/utils/prisma.ts +++ b/packages/domain/src/utils/prisma.ts @@ -11,14 +11,7 @@ if (process.env.NODE_ENV === 'production') { prisma = new PrismaClient(); } else { if (!global.prisma) { - global.prisma = new PrismaClient({ - datasources: { - db: { - url: process.env.NODE_ENV === 'test' ? process.env.TEST_DATABASE_URL : process.env.DATABASE_URL, - }, - }, - // log: ['query'], - }); + global.prisma = new PrismaClient({}); } // eslint-disable-next-line prefer-destructuring prisma = global.prisma; diff --git a/packages/domain/tests/database.mjs b/packages/domain/tests/database.mjs index 17f7cf0e..506fc9a7 100755 --- a/packages/domain/tests/database.mjs +++ b/packages/domain/tests/database.mjs @@ -1,25 +1,53 @@ #!/usr/bin/env zx import { $, sleep } from 'zx'; +import mysql from 'mysql2/promise'; -const MYSQL_DATABASE = 'snipcode'; const CONTAINER_NAME = 'snipcode-test-db'; +const MYSQL_HOST = '127.0.0.1'; +const MYSQL_PORT = '3313'; +const MYSQL_USER = 'root'; +const MYSQL_PASSWORD = 'secret'; +const MYSQL_DATABASE = 'snipcode'; -if (!process.env.CI) { - console.log('Create the test database if necessary'); +const waitForMysql = async () => { + console.log('Waiting for database availability...'); + while (true) { try { - await $`docker ps | grep ${CONTAINER_NAME}`; + const connection = await mysql.createConnection({ + host: MYSQL_HOST, + port: MYSQL_PORT, + user: MYSQL_USER, + password: MYSQL_PASSWORD, + database: MYSQL_DATABASE, + }); + + await connection.end(); + + console.log('The database is ready!!!'); + break; } catch (error) { - // Container not found, creating a new one. - await $`docker run -d --rm --name ${CONTAINER_NAME} -e MYSQL_ROOT_PASSWORD=secret -e MYSQL_DATABASE=${MYSQL_DATABASE} -p 3313:3306 mysql:8.0.34`; - - await sleep(9000); // Wait for 9 seconds the container to initialize + await sleep(1000); } + } +} + +if (!process.env.CI) { + try { + await $`docker ps | grep ${CONTAINER_NAME}`; + } catch (error) { + console.log('Database container not found, creating...'); + + await $`docker run -d --rm --name ${CONTAINER_NAME} -e MYSQL_ROOT_PASSWORD=${MYSQL_PASSWORD} -e MYSQL_DATABASE=${MYSQL_DATABASE} -p ${MYSQL_PORT}:3306 mysql:8.0.34`; + + await waitForMysql(); + + process.env.DATABASE_URL = `mysql://${MYSQL_USER}:${MYSQL_PASSWORD}@${MYSQL_HOST}:${MYSQL_PORT}/${MYSQL_DATABASE}`; - process.env.DATABASE_URL = `mysql://root:secret@127.0.0.1:3313/${MYSQL_DATABASE}`; + console.log('Applying database migrations...'); - // Reset database and apply all migrations - await $`yarn prisma migrate reset --force`; + await $`yarn prisma migrate dev`; + } } diff --git a/packages/domain/tests/helpers.ts b/packages/domain/tests/helpers.ts index 286f99b1..d0d55ef8 100644 --- a/packages/domain/tests/helpers.ts +++ b/packages/domain/tests/helpers.ts @@ -1,26 +1,21 @@ import { randEmail, randFullName, randImg, randNumber, randTimeZone, randUserName, randWord } from '@ngneat/falso'; -import { - Folder, - OauthProvider, - Role, - RoleName, - Session, - Snippet, - SnippetVisibility, - User, - dbClient, - dbID, -} from '../index'; -import { CreateFolderDto } from '../src/folders/dtos/create-folder-dto'; -import { CreateUserRootFolderDto } from '../src/folders/dtos/create-user-root-folder-dto'; -import { UpdateFolderDto } from '../src/folders/dtos/update-folder-dto'; -import { CreateSessionDto } from '../src/sessions/dtos/create-session-dto'; -import { CreateSnippetDto } from '../src/snippets/dtos/create-snippet-dto'; -import { DeleteSnippetDto } from '../src/snippets/dtos/delete-snippet-dto'; -import { UpdateSnippetDto } from '../src/snippets/dtos/update-snippet-dto'; -import { CreateUserDto } from '../src/users/dtos/create-user-dto'; -import { UpdateUserDto } from '../src/users/dtos/update-user-dto'; +import { Folder } from '../src/services/folders/folder.entity'; +import { CreateFolderInput } from '../src/services/folders/inputs/create-folder-input'; +import { CreateUserRootFolderInput } from '../src/services/folders/inputs/create-user-root-folder-input'; +import { UpdateFolderInput } from '../src/services/folders/inputs/update-folder-input'; +import { PrismaService } from '../src/services/prisma.service'; +import { Role, RoleName } from '../src/services/roles/role.entity'; +import { CreateSessionInput } from '../src/services/sessions/inputs/create-session-input'; +import { Session } from '../src/services/sessions/session.entity'; +import { CreateSnippetInput } from '../src/services/snippets/inputs/create-snippet-input'; +import { DeleteSnippetInput } from '../src/services/snippets/inputs/delete-snippet-input'; +import { UpdateSnippetInput } from '../src/services/snippets/inputs/update-snippet-input'; +import { Snippet, SnippetVisibility } from '../src/services/snippets/snippet.entity'; +import { CreateUserInput } from '../src/services/users/inputs/create-user-input'; +import { UpdateUserInput } from '../src/services/users/inputs/update-user-input'; +import { OauthProvider, User } from '../src/services/users/user.entity'; +import { dbID } from '../src/utils/db-id'; type CreateManyTestFoldersArgs = { folderNames: string[]; @@ -28,7 +23,7 @@ type CreateManyTestFoldersArgs = { userId: string; }; -type CreateTestUserDtoArgs = { +type CreateTestUserInputArgs = { email?: string; isEnabled?: boolean; oauthProvider?: OauthProvider; @@ -46,228 +41,237 @@ type CreateTestUserArgs = { username?: string | null; }; -export const findTestRole = async (name: RoleName): Promise => { - const role = await dbClient.role.findUnique({ where: { name } }); +export class TestHelper { + constructor(private readonly prisma: PrismaService) {} - if (!role) { - throw new Error(`Role with the name "${name}" not found!`); + static createTestUserInput({ + email, + isEnabled, + oauthProvider, + password, + roleId, + username = randUserName(), + }: CreateTestUserInputArgs): CreateUserInput { + const input = new CreateUserInput({ + email: email ?? randEmail(), + name: randFullName(), + oauthProvider: oauthProvider ?? 'github', + password: password ?? null, + pictureUrl: randImg(), + roleId, + timezone: randTimeZone(), + username, + }); + + input.isEnabled = Boolean(isEnabled); + + return input; } - return role; -}; + static generateTestId(): string { + return dbID.generate(); + } -export const createTestUserDto = ({ - email, - isEnabled, - oauthProvider, - password, - roleId, - username = randUserName(), -}: CreateTestUserDtoArgs): CreateUserDto => { - const dto = new CreateUserDto({ - email: email ?? randEmail(), - name: randFullName(), - oauthProvider: oauthProvider ?? 'github', - password: password ?? null, - pictureUrl: randImg(), - roleId, - timezone: randTimeZone(), - username, - }); + static updateTestUserInput(roleId: string): UpdateUserInput { + const providers: OauthProvider[] = ['email', 'google', 'github', 'stackoverflow']; + const index = randNumber({ max: 2, min: 0 }); - dto.isEnabled = Boolean(isEnabled); + return new UpdateUserInput({ + name: randFullName(), + oauthProvider: providers[index], + pictureUrl: randImg(), + roleId, + timezone: randTimeZone(), + }); + } - return dto; -}; + static createTestFolderInput(args?: { name?: string; parentId?: string; userId?: string }): CreateFolderInput { + return new CreateFolderInput({ + name: args?.name ?? randWord(), + parentId: args?.parentId ?? TestHelper.generateTestId(), + userId: args?.userId ?? TestHelper.generateTestId(), + }); + } -export const createTestUser = async ({ - email, - isEnabled, - oauthProvider, - password, - roleName = 'user', - username, -}: CreateTestUserArgs): Promise => { - const role = await findTestRole(roleName); + static updateTestFolderInput( + args: { folderId?: string; name?: string; userId?: string } | undefined, + ): UpdateFolderInput { + return new UpdateFolderInput({ + creatorId: args?.userId ?? TestHelper.generateTestId(), + folderId: args?.folderId ?? TestHelper.generateTestId(), + name: args?.name ?? `${randWord()}`, + }); + } - const createUserDto = createTestUserDto({ email, isEnabled, oauthProvider, password, roleId: role.id, username }); + static createTestSnippetInput( + args: { folderId?: string; name?: string; userId?: string; visibility?: SnippetVisibility } | undefined, + ): CreateSnippetInput { + const languages = ['java', 'js', 'ts', 'c', 'c++', 'python', 'go', 'php', 'csharp']; + const extensions = ['java', 'js', 'ts', 'c', 'cpp', 'py', 'go', 'php', 'cs']; + const themes = ['one-dark-pro', 'dracula', 'dark-plus', 'monokai', 'github-dark', 'github-light']; + + const languageIndex = randNumber({ max: languages.length - 1, min: 0 }); + const themeIndex = randNumber({ max: themes.length - 1, min: 0 }); + + const snippetContent = randWord({ length: randNumber({ max: 30, min: 5 }) }).join('\n'); + + return new CreateSnippetInput({ + content: snippetContent, + contentHighlighted: `${snippetContent} highlighted`, + description: randWord({ length: randNumber({ max: 20, min: 10 }) }).join(' '), + folderId: args?.folderId ?? TestHelper.generateTestId(), + language: languages[languageIndex], + lineHighlight: null, + name: args?.name ?? `${randWord()}.${extensions[languageIndex]}`, + theme: themes[themeIndex], + userId: args?.userId ?? TestHelper.generateTestId(), + visibility: args?.visibility ?? 'public', + }); + } - return dbClient.user.create({ data: createUserDto.toUser() }); -}; + static updateTestSnippetInput( + args: { name?: string; snippetId?: string; userId?: string; visibility?: SnippetVisibility } | undefined, + ): UpdateSnippetInput { + const languages = ['java', 'js', 'ts', 'c', 'c++', 'python', 'go', 'php', 'csharp']; + const extensions = ['java', 'js', 'ts', 'c', 'cpp', 'py', 'go', 'php', 'cs']; + const themes = ['one-dark-pro', 'dracula', 'dark-plus', 'monokai', 'github-dark', 'github-light']; + + const languageIndex = randNumber({ max: languages.length - 1, min: 0 }); + const themeIndex = randNumber({ max: themes.length - 1, min: 0 }); + + const snippetContent = randWord({ length: randNumber({ max: 30, min: 5 }) }).join('\n'); + + return new UpdateSnippetInput({ + content: snippetContent, + contentHighlighted: `${snippetContent} highlighted`, + creatorId: args?.userId ?? TestHelper.generateTestId(), + description: randWord({ length: randNumber({ max: 20, min: 10 }) }).join(' '), + language: languages[languageIndex], + lineHighlight: null, + name: args?.name ?? `${randWord()}.${extensions[languageIndex]}`, + snippetId: args?.snippetId ?? TestHelper.generateTestId(), + theme: themes[themeIndex], + visibility: args?.visibility ?? 'public', + }); + } -export const deleteTestUsersById = async (userIds: Array): Promise => { - const promises = userIds.map(async (userId) => { - if (!userId) { - return; - } + static deleteTestSnippetInput(args: { snippetId: string; userId: string }): DeleteSnippetInput { + return new DeleteSnippetInput({ + creatorId: args.userId, + snippetId: args.snippetId, + }); + } - await dbClient.user.delete({ where: { id: userId } }); - }); + static createTestSessionInput(userId: string): CreateSessionInput { + return new CreateSessionInput({ + expireDate: new Date(), + userId, + }); + } - return Promise.all(promises); -}; + async findTestRole(name: RoleName): Promise { + const role = await this.prisma.role.findUnique({ where: { name } }); -export const deleteTestFoldersById = async (folderIds: Array): Promise => { - for (const folderId of folderIds) { - if (!folderId) { - return; + if (!role) { + throw new Error(`Role with the name "${name}" not found!`); } - // eslint-disable-next-line no-await-in-loop - await dbClient.folder.delete({ where: { id: folderId } }); + return role; } -}; - -export const createUserWithRootFolder = async (): Promise<[User, Folder]> => { - const user = await createTestUser({}); - const rootFolder = await dbClient.folder.create({ data: new CreateUserRootFolderDto(user.id).toFolder() }); - return [user, rootFolder]; -}; - -export const createManyTestFolders = async ({ - folderNames, - parentId, - userId, -}: CreateManyTestFoldersArgs): Promise => { - const promises = folderNames.map((name) => { - const createFolderDto = new CreateFolderDto({ - name, - parentId, - userId, + async createTestUser({ + email, + isEnabled, + oauthProvider, + password, + roleName = 'user', + username, + }: CreateTestUserArgs): Promise { + const role = await this.findTestRole(roleName); + + const createUserInput = TestHelper.createTestUserInput({ + email, + isEnabled, + oauthProvider, + password, + roleId: role.id, + username, }); - return dbClient.folder.create({ data: createFolderDto.toFolder() }); - }); + return this.prisma.user.create({ data: createUserInput.toUser() }); + } - return Promise.all(promises); -}; + async deleteTestUsersById(userIds: Array): Promise { + const promises = userIds.map(async (userId) => { + if (!userId) { + return; + } -export const generateTestId = (): string => dbID.generate(); + await this.prisma.user.delete({ where: { id: userId } }); + }); -export const createTestFolderDto = (args?: { name?: string; parentId?: string; userId?: string }): CreateFolderDto => { - return new CreateFolderDto({ - name: args?.name ?? randWord(), - parentId: args?.parentId ?? generateTestId(), - userId: args?.userId ?? generateTestId(), - }); -}; + return Promise.all(promises); + } -export const createTestSnippetDto = ( - args: { folderId?: string; name?: string; userId?: string; visibility?: SnippetVisibility } | undefined, -): CreateSnippetDto => { - const languages = ['java', 'js', 'ts', 'c', 'c++', 'python', 'go', 'php', 'csharp']; - const extensions = ['java', 'js', 'ts', 'c', 'cpp', 'py', 'go', 'php', 'cs']; - const themes = ['one-dark-pro', 'dracula', 'dark-plus', 'monokai', 'github-dark', 'github-light']; - - const languageIndex = randNumber({ max: languages.length - 1, min: 0 }); - const themeIndex = randNumber({ max: themes.length - 1, min: 0 }); - - const snippetContent = randWord({ length: randNumber({ max: 30, min: 5 }) }).join('\n'); - - return new CreateSnippetDto({ - content: snippetContent, - contentHighlighted: `${snippetContent} highlighted`, - description: randWord({ length: randNumber({ max: 20, min: 10 }) }).join(' '), - folderId: args?.folderId ?? generateTestId(), - language: languages[languageIndex], - lineHighlight: null, - name: args?.name ?? `${randWord()}.${extensions[languageIndex]}`, - theme: themes[themeIndex], - userId: args?.userId ?? generateTestId(), - visibility: args?.visibility ?? 'public', - }); -}; + async deleteTestFoldersById(folderIds: Array): Promise { + for (const folderId of folderIds) { + if (!folderId) { + return; + } -export const deleteTestSnippetsById = async (snippetIds: Array): Promise => { - const promises = snippetIds.map(async (snippetId) => { - if (!snippetId) { - return; + // eslint-disable-next-line no-await-in-loop + await this.prisma.folder.delete({ where: { id: folderId } }); } + } - await dbClient.snippet.delete({ where: { id: snippetId } }); - }); + async createUserWithRootFolder(): Promise<[User, Folder]> { + const user = await this.createTestUser({}); + const rootFolder = await this.prisma.folder.create({ data: new CreateUserRootFolderInput(user.id).toFolder() }); - return Promise.all(promises); -}; + return [user, rootFolder]; + } -export const createTestSnippet = async ( - args: { folderId?: string; name?: string; userId?: string; visibility?: SnippetVisibility } | undefined, -): Promise => { - const createSnippetDto = createTestSnippetDto(args); + async createManyTestFolders({ folderNames, parentId, userId }: CreateManyTestFoldersArgs): Promise { + const promises = folderNames.map((name) => { + const createFolderInput = new CreateFolderInput({ + name, + parentId, + userId, + }); - return dbClient.snippet.create({ data: createSnippetDto.toSnippet() }); -}; + return this.prisma.folder.create({ data: createFolderInput.toFolder() }); + }); -export const updateTestUserDto = (roleId: string): UpdateUserDto => { - const providers: OauthProvider[] = ['email', 'google', 'github', 'stackoverflow']; - const index = randNumber({ max: 2, min: 0 }); + return Promise.all(promises); + } - return new UpdateUserDto({ - name: randFullName(), - oauthProvider: providers[index], - pictureUrl: randImg(), - roleId, - timezone: randTimeZone(), - }); -}; + async deleteTestSnippetsById(snippetIds: Array): Promise { + const promises = snippetIds.map(async (snippetId) => { + if (!snippetId) { + return; + } -export const createTestSessionDto = (userId: string): CreateSessionDto => { - return new CreateSessionDto({ - expireDate: new Date(), - userId, - }); -}; + await this.prisma.snippet.delete({ where: { id: snippetId } }); + }); -export const createTestSession = async (args: { userId: string }): Promise => { - const createSessionDto = createTestSessionDto(args.userId); + return Promise.all(promises); + } - return dbClient.session.create({ data: createSessionDto.toSession() }); -}; + async createTestSnippet( + args: { folderId?: string; name?: string; userId?: string; visibility?: SnippetVisibility } | undefined, + ): Promise { + const createSnippetInput = TestHelper.createTestSnippetInput(args); -export const deleteTestUserSessions = async (userId: string): Promise => { - await dbClient.session.deleteMany({ where: { userId } }); -}; + return this.prisma.snippet.create({ data: createSnippetInput.toSnippet() }); + } -export const deleteTestSnippetDto = (args: { snippetId: string; userId: string }): DeleteSnippetDto => { - return new DeleteSnippetDto({ - creatorId: args.userId, - snippetId: args.snippetId, - }); -}; + async createTestSession(args: { userId: string }): Promise { + const createSessionInput = TestHelper.createTestSessionInput(args.userId); -export const updateTestSnippetDto = ( - args: { name?: string; snippetId?: string; userId?: string; visibility?: SnippetVisibility } | undefined, -): UpdateSnippetDto => { - const languages = ['java', 'js', 'ts', 'c', 'c++', 'python', 'go', 'php', 'csharp']; - const extensions = ['java', 'js', 'ts', 'c', 'cpp', 'py', 'go', 'php', 'cs']; - const themes = ['one-dark-pro', 'dracula', 'dark-plus', 'monokai', 'github-dark', 'github-light']; - - const languageIndex = randNumber({ max: languages.length - 1, min: 0 }); - const themeIndex = randNumber({ max: themes.length - 1, min: 0 }); - - const snippetContent = randWord({ length: randNumber({ max: 30, min: 5 }) }).join('\n'); - - return new UpdateSnippetDto({ - content: snippetContent, - contentHighlighted: `${snippetContent} highlighted`, - creatorId: args?.userId ?? generateTestId(), - description: randWord({ length: randNumber({ max: 20, min: 10 }) }).join(' '), - language: languages[languageIndex], - lineHighlight: null, - name: args?.name ?? `${randWord()}.${extensions[languageIndex]}`, - snippetId: args?.snippetId ?? generateTestId(), - theme: themes[themeIndex], - visibility: args?.visibility ?? 'public', - }); -}; + return this.prisma.session.create({ data: createSessionInput.toSession() }); + } -export const updateTestFolderDto = ( - args: { folderId?: string; name?: string; userId?: string } | undefined, -): UpdateFolderDto => { - return new UpdateFolderDto({ - creatorId: args?.userId ?? generateTestId(), - folderId: args?.folderId ?? generateTestId(), - name: args?.name ?? `${randWord()}`, - }); -}; + async deleteTestUserSessions(userId: string): Promise { + await this.prisma.session.deleteMany({ where: { userId } }); + } +} diff --git a/packages/domain/tsconfig.json b/packages/domain/tsconfig.json index 450fe1ec..d5304608 100644 --- a/packages/domain/tsconfig.json +++ b/packages/domain/tsconfig.json @@ -1,16 +1,12 @@ { "extends": "../../tsconfig.base.json", "compilerOptions": { - "outDir": "./dist", "declaration": true, "composite": true, - "sourceMap": true }, + "exclude": ["node_modules", "dist"], "files": ["env.d.ts"], - "include": ["src", "tests", "index.ts"], - "exclude": [ - "node_modules" - ], + "include": ["src", "tests", "index.ts", "jest.config.ts"], "references": [ { "path": "../../packages/utils" diff --git a/packages/domain/tsconfig.prod.json b/packages/domain/tsconfig.prod.json index fd20e465..330301da 100644 --- a/packages/domain/tsconfig.prod.json +++ b/packages/domain/tsconfig.prod.json @@ -1,10 +1,13 @@ { - "extends": "./tsconfig", + "extends": "../../tsconfig.json", "compilerOptions": { - "sourceMap": false + "outDir": "./dist" }, "exclude": [ + "node_modules", + "dist", "tests", - "**/*.test.ts" + "**/*.test.ts", + "jest.config.ts" ] } diff --git a/packages/embed/.eslintrc.js b/packages/embed/.eslintrc.js new file mode 100644 index 00000000..33942f8f --- /dev/null +++ b/packages/embed/.eslintrc.js @@ -0,0 +1,19 @@ +module.exports = { + root: true, + extends: '../../.eslintrc.json', + ignorePatterns: [ + 'dist', + 'build', + 'tsup.config.ts', + 'env.d.ts', + 'src/server/public', + 'jest.config.ts', + '.eslintrc.js', + ], + parserOptions: { + ecmaVersion: 2023, + sourceType: 'module', + project: 'tsconfig.json', + tsconfigRootDir: __dirname, + }, +}; diff --git a/packages/embed/.eslintrc.json b/packages/embed/.eslintrc.json deleted file mode 100644 index 90eb5d03..00000000 --- a/packages/embed/.eslintrc.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "root": true, - "extends": "../../.eslintrc.json", - "ignorePatterns": [ - "dist", - "build", - "tsup.config.ts", - "env.d.ts", - "src/server/public", - "jest.config.ts" - ], - "parserOptions": { - "ecmaVersion": 2023, - "sourceType": "module", - "project": "tsconfig.json" - } -} diff --git a/packages/embed/README.md b/packages/embed/README.md index 46a2a61a..241b3914 100644 --- a/packages/embed/README.md +++ b/packages/embed/README.md @@ -12,7 +12,7 @@ Make sure you have this tools installed before running the project * Node.js 18+ * Yarn -> **Note**: This repo requires a connection to the database; the command to setup the database is located in the **[database package](../database/README.md)**. +> **Note**: This repo requires a connection to the database; the command to set up the database is located in the **[domain package](../domain/README.md)**. ## Set up the project Delete the existing folders output from build commands @@ -84,7 +84,7 @@ npm config set //registry.npmjs.org/:_authToken npm publish --access=public ``` -Before publishing, make sure to upgrade the package version in the file [package.publish.json](./package.publish.json) . Check out the [Semantic versioning](https://docs.npmjs.com/about-semantic-versioning) to see how to define the version number. +Before publishing, make sure to upgrade the package version in the file [package.publish.json](./package.publish.json). Check out the [Semantic versioning](https://docs.npmjs.com/about-semantic-versioning) to see how to define the version number. ## Build TS library This package also expose functions used in others packages or apps. Run the command below to build them diff --git a/packages/embed/env.d.ts b/packages/embed/env.d.ts index f22295e3..a79455e8 100644 --- a/packages/embed/env.d.ts +++ b/packages/embed/env.d.ts @@ -2,6 +2,7 @@ export type EnvironmentVariables = { DATABASE_URL: string; EMBED_JS_URL: string; EMBED_STYLE_URL: string; + NODE_ENV: string; WEB_APP_URL: string; WEB_APP_SNIPPET_VIEW_URL: string; }; diff --git a/packages/embed/index.ts b/packages/embed/index.ts index 14a2da41..e124f1aa 100644 --- a/packages/embed/index.ts +++ b/packages/embed/index.ts @@ -1,2 +1,2 @@ -export { generateOembedMetadata } from './src/oembed/index'; +export { OEmbedResult, generateOembedMetadata } from './src/oembed/index'; export { renderSnippetToHtml } from './src/renderer/index'; diff --git a/packages/embed/src/oembed/index.ts b/packages/embed/src/oembed/index.ts index 596c470d..d87aa4dd 100644 --- a/packages/embed/src/oembed/index.ts +++ b/packages/embed/src/oembed/index.ts @@ -7,7 +7,7 @@ type Args = { webAppURL: string; }; -type Result = { +export type OEmbedResult = { height: number; html: string; provider_name: string; @@ -21,7 +21,7 @@ type Result = { width: number; }; -export const generateOembedMetadata = ({ snippet, snippetRendererURL, webAppURL }: Args): Result => { +export const generateOembedMetadata = ({ snippet, snippetRendererURL, webAppURL }: Args): OEmbedResult => { const embedUrl = `${snippetRendererURL}/snippets/${snippet.id}`; return { diff --git a/packages/logger/.eslintrc.json b/packages/logger/.eslintrc.json deleted file mode 100644 index c142468b..00000000 --- a/packages/logger/.eslintrc.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "root": true, - "extends": "../../.eslintrc.json", - "ignorePatterns": [ - "jest.config.ts", - "dist" - ], - "parserOptions": { - "ecmaVersion": 2023, - "sourceType": "module", - "project": "tsconfig.json" - } -} diff --git a/packages/logger/.gitignore b/packages/logger/.gitignore deleted file mode 100644 index f06235c4..00000000 --- a/packages/logger/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -node_modules -dist diff --git a/packages/logger/__tests__/utils/index.test.ts b/packages/logger/__tests__/utils/index.test.ts deleted file mode 100644 index 9548fb35..00000000 --- a/packages/logger/__tests__/utils/index.test.ts +++ /dev/null @@ -1,5 +0,0 @@ -describe('Test logger', () => { - test('basic test', () => { - expect(true).toEqual(true); - }); -}); diff --git a/packages/logger/index.ts b/packages/logger/index.ts deleted file mode 100644 index 05623694..00000000 --- a/packages/logger/index.ts +++ /dev/null @@ -1,7 +0,0 @@ -import BaseLogger from './src/base-logger'; -import FileLogger from './src/file-logger'; - -const baseLogger = new BaseLogger(); -const fileLogger = new FileLogger(); - -export { baseLogger, fileLogger }; diff --git a/packages/logger/jest.config.ts b/packages/logger/jest.config.ts deleted file mode 100644 index 179365d0..00000000 --- a/packages/logger/jest.config.ts +++ /dev/null @@ -1,15 +0,0 @@ -import type { Config } from '@jest/types'; - -const config: Config.InitialOptions = { - roots: ['.'], - preset: 'ts-jest', - testMatch: ['**/?(*.)+(spec|test).[jt]s'], - testEnvironment: 'node', - clearMocks: true, - maxWorkers: 1, - snapshotFormat: { - "printBasicPrototype": false - } -}; - -export default config; diff --git a/packages/logger/package.json b/packages/logger/package.json deleted file mode 100644 index 95ca8da3..00000000 --- a/packages/logger/package.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "name": "@snipcode/logger", - "version": "1.0.0", - "private": true, - "description": "Snipcode logger", - "main": "dist/index.js", - "types": "dist/index.d.ts", - "license": "MIT", - "scripts": { - "build": "tsc --project tsconfig.prod.json", - "clean": "rm -rf .turbo dist", - "lint": "eslint src index.ts", - "test": "jest" - }, - "dependencies": { - "@sentry/node": "7.108.0", - "@sentry/tracing": "7.108.0", - "winston": "3.12.0", - "winston-daily-rotate-file": "5.0.0" - } -} diff --git a/packages/logger/src/base-logger.ts b/packages/logger/src/base-logger.ts deleted file mode 100644 index 063d4ef1..00000000 --- a/packages/logger/src/base-logger.ts +++ /dev/null @@ -1,71 +0,0 @@ -import * as Sentry from '@sentry/node'; -import { isObject } from 'lodash'; -import { Logger, createLogger, format, transports } from 'winston'; - -import { LoggerInitOptions } from './types'; - -const { combine, printf, timestamp }: typeof format = format; - -class BaseLogger { - protected logger: Logger = createLogger(); - protected canLogToSentry = false; - - init(options: LoggerInitOptions): void { - this.canLogToSentry = options.sentry.enabled; - - this.initSentryIfNecessary(options.sentry.dsn, options.sentry.environment); - - this.logger = createLogger({ - format: combine(timestamp(), this.customFormat()), - silent: Boolean(options.silent), - transports: [new transports.Console()], - }); - } - - error(error: unknown): void { - this.logger.error(this.logMessage(error)); - - if (this.canLogToSentry) { - this.logErrorToSentry(error); - } - } - - info(output: unknown): void { - this.logger.info(this.logMessage(output)); - } - - private initSentryIfNecessary(sentryDsn?: string, environment?: string) { - if (!this.canLogToSentry || !sentryDsn) { - return; - } - - Sentry.init({ - dsn: sentryDsn, - environment, - tracesSampleRate: 1.0, - }); - } - - private logErrorToSentry(e: any) { - Sentry.captureException(e); - } - - private logMessage(message: any): string { - if (isObject(message)) { - // @ts-expect-error Property 'stack' does not exist on type 'object'. - return 'stack' in message ? message.stack : JSON.stringify(message, undefined, 2); - } - - return message.toString(); - } - - private customFormat() { - return printf((info) => { - const { level, message, timestamp } = info; - - return `${timestamp} ${level}: ${this.logMessage(message)}`; - }); - } -} - -export default BaseLogger; diff --git a/packages/logger/src/file-logger.ts b/packages/logger/src/file-logger.ts deleted file mode 100644 index 03138c83..00000000 --- a/packages/logger/src/file-logger.ts +++ /dev/null @@ -1,29 +0,0 @@ -import fs from 'fs'; - -import WinstonFileRotation from 'winston-daily-rotate-file'; - -import BaseLogger from './base-logger'; -import { FileLoggerInitOptions } from './types'; - -class FileLogger extends BaseLogger { - public init(options: FileLoggerInitOptions) { - super.init(options); - - if (!fs.existsSync(options.logFileDirectory)) { - fs.mkdirSync(options.logFileDirectory); - } - - const transport = new WinstonFileRotation({ - datePattern: 'YYYY-MM-DD', - dirname: options.logFileDirectory, - filename: `${options.appName}-%DATE%.log`, - maxFiles: '14d', - maxSize: '20m', - zippedArchive: true, - }); - - this.logger.add(transport); - } -} - -export default FileLogger; diff --git a/packages/logger/src/types.ts b/packages/logger/src/types.ts deleted file mode 100644 index 12a2eeac..00000000 --- a/packages/logger/src/types.ts +++ /dev/null @@ -1,18 +0,0 @@ -export type EnhancedLogger = { - error: (output: unknown, logToSentry?: boolean) => void; - info: (output: unknown) => void; -}; - -export type LoggerInitOptions = { - sentry: { - dsn: string; - enabled: boolean; - environment: string; - }; - silent?: boolean; -}; - -export type FileLoggerInitOptions = LoggerInitOptions & { - appName: string; - logFileDirectory: string; -}; diff --git a/packages/logger/tsconfig.json b/packages/logger/tsconfig.json deleted file mode 100644 index e250017b..00000000 --- a/packages/logger/tsconfig.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "extends": "../../tsconfig.base.json", - "compilerOptions": { - "outDir": "./dist", - "declaration": true, - "composite": true, - "sourceMap": true, - }, - "include": ["src", "__tests__", "index.ts"], - "exclude": [ - "node_modules" - ] -} diff --git a/packages/logger/tsconfig.prod.json b/packages/logger/tsconfig.prod.json deleted file mode 100644 index e8c5afe2..00000000 --- a/packages/logger/tsconfig.prod.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "extends": "./tsconfig", - "compilerOptions": { - "sourceMap": false - }, - "exclude": [ - "__tests__" - ] -} diff --git a/packages/utils/.eslintrc.js b/packages/utils/.eslintrc.js new file mode 100644 index 00000000..ea147714 --- /dev/null +++ b/packages/utils/.eslintrc.js @@ -0,0 +1,11 @@ +module.exports = { + root: true, + extends: '../../.eslintrc.json', + ignorePatterns: ['jest.config.ts', '.eslintrc.js'], + parserOptions: { + ecmaVersion: 2023, + sourceType: 'module', + project: 'tsconfig.json', + tsconfigRootDir: __dirname, + }, +}; diff --git a/packages/utils/.eslintrc.json b/packages/utils/.eslintrc.json deleted file mode 100644 index dfdb1a26..00000000 --- a/packages/utils/.eslintrc.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "root": true, - "extends": "../../.eslintrc.json", - "ignorePatterns": [ - "jest.config.ts" - ], - "parserOptions": { - "ecmaVersion": 2023, - "sourceType": "module", - "project": "tsconfig.json" - } -} diff --git a/packages/utils/__tests__/common/environment.test.ts b/packages/utils/__tests__/common/environment.test.ts deleted file mode 100644 index e7f68b5b..00000000 --- a/packages/utils/__tests__/common/environment.test.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { UNDEFINED_VARIABLE_MESSAGE } from '../../src/common/constants'; -import { getEnv } from '../../src/common/environment'; - -describe('Tests environment utils', () => { - test('node env is defined', () => { - // GIVEN - const key = 'NODE_ENV'; - - // WHEN - const result = getEnv(key); - - // THEN - expect(result).toBeTruthy(); - }); - - test('environment variable not defined', () => { - // GIVEN - const key = 'UNDEFINED_VAR'; - - // WHEN - // THEN - expect(() => getEnv(key)).toThrow(UNDEFINED_VARIABLE_MESSAGE(key)); - }); -}); diff --git a/packages/utils/index.ts b/packages/utils/index.ts index 566d8fce..6f2812eb 100644 --- a/packages/utils/index.ts +++ b/packages/utils/index.ts @@ -1,12 +1,9 @@ -import SnipcodeError from './src/errors/snipcode-error'; +export { AppError, isAppError } from './src/error/error'; +export type { AppErrorCode } from './src/error/error'; +export * as errors from './src/error/messages'; -export * as constants from './src/common/constants'; -export * as errors from './src/errors/messages'; -export type { ErrorCode } from './src/errors/types'; -export * from './src/common/environment'; -export * from './src/common/uuid'; -export * from './src/date/date'; +export { generateJwtToken, verifyJwtToken } from './src/common/jwt'; +export { isValidUUIDV4, generateRandomId } from './src/common/uuid'; +export { addDayToDate } from './src/date/date'; -export type { Language } from './src/types/snippet'; - -export default SnipcodeError; +export type { Language } from './src/snippet/snippet'; diff --git a/packages/utils/package.json b/packages/utils/package.json index 527eb4ea..d2d7f0bd 100644 --- a/packages/utils/package.json +++ b/packages/utils/package.json @@ -10,14 +10,17 @@ "build": "tsc --project tsconfig.prod.json", "clean": "rm -rf .turbo dist", "lint": "eslint src index.ts", - "test": "jest" + "test": "jest", + "test:watch": "jest --watch" }, "dependencies": { "dayjs": "1.11.10", + "jsonwebtoken": "9.0.2", "lodash": "4.17.21", "uuid": "9.0.1" }, "devDependencies": { + "@types/jsonwebtoken": "9.0.6", "@types/uuid": "9.0.8" } } diff --git a/packages/utils/src/common/constants.ts b/packages/utils/src/common/constants.ts deleted file mode 100644 index 285b18f6..00000000 --- a/packages/utils/src/common/constants.ts +++ /dev/null @@ -1,2 +0,0 @@ -export const UNDEFINED_VARIABLE_MESSAGE = (key: string) => - `The environment variable "${key}" is required but not provided!`; diff --git a/packages/utils/src/common/environment.ts b/packages/utils/src/common/environment.ts deleted file mode 100644 index 1f64dcfd..00000000 --- a/packages/utils/src/common/environment.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { UNDEFINED_VARIABLE_MESSAGE } from './constants'; - -export const getEnv = (key: string): string => { - const value = process.env[key]; - - if (!value) { - throw new Error(UNDEFINED_VARIABLE_MESSAGE(key)); - } - - return value; -}; diff --git a/packages/utils/src/common/jwt.test.ts b/packages/utils/src/common/jwt.test.ts new file mode 100644 index 00000000..9df5e234 --- /dev/null +++ b/packages/utils/src/common/jwt.test.ts @@ -0,0 +1,20 @@ +import { generateJwtToken, verifyJwtToken } from './jwt'; + +describe('JWT utility functions', () => { + const payload = { name: 'John Doe' }; + const secret = 'your-256-bit-secret'; + const expiresIn = '1h'; + + it('should generate a JWT token', () => { + const token = generateJwtToken({ expiresIn, payload, secret }); + + expect(typeof token).toBe('string'); + }); + + it('should verify a JWT token', () => { + const token = generateJwtToken({ expiresIn, payload, secret }); + const decodedPayload = verifyJwtToken({ secret, token }); + + expect(decodedPayload).toEqual(expect.objectContaining({ name: 'John Doe' })); + }); +}); diff --git a/packages/utils/src/common/jwt.ts b/packages/utils/src/common/jwt.ts new file mode 100644 index 00000000..aed66988 --- /dev/null +++ b/packages/utils/src/common/jwt.ts @@ -0,0 +1,17 @@ +import jwt, { JwtPayload } from 'jsonwebtoken'; + +type GenerateJwtInput = { expiresIn: string; payload: Payload; secret: string }; + +type VerifyJwtInput = { secret: string; token: string }; + +export const generateJwtToken = ({ + expiresIn, + payload, + secret, +}: GenerateJwtInput): string => { + return jwt.sign(payload, secret, { expiresIn }); +}; + +export const verifyJwtToken = ({ secret, token }: VerifyJwtInput): T => { + return jwt.verify(token, secret) as T; +}; diff --git a/packages/utils/src/common/uuid.test.ts b/packages/utils/src/common/uuid.test.ts new file mode 100644 index 00000000..beb2b555 --- /dev/null +++ b/packages/utils/src/common/uuid.test.ts @@ -0,0 +1,20 @@ +import { v4 as uuidv4 } from 'uuid'; + +import { generateRandomId, isValidUUIDV4 } from './uuid'; + +describe('UUID utility functions', () => { + it('should generate a valid UUID', () => { + const id = generateRandomId(); + + expect(typeof id).toBe('string'); + expect(isValidUUIDV4(id)).toBe(true); + }); + + it('should validate a UUID', () => { + const validUUID = uuidv4(); + const invalidUUID = 'invalid-uuid'; + + expect(isValidUUIDV4(validUUID)).toBe(true); + expect(isValidUUIDV4(invalidUUID)).toBe(false); + }); +}); diff --git a/packages/utils/src/date/date.test.ts b/packages/utils/src/date/date.test.ts new file mode 100644 index 00000000..fb87998f --- /dev/null +++ b/packages/utils/src/date/date.test.ts @@ -0,0 +1,36 @@ +import { addDayToDate } from './date'; + +describe('TesT addDayToDate', () => { + it('should add the correct number of days to the current date', () => { + const date = new Date(2024, 5, 1, 10, 45, 30); + const numberOfDaysToAdd = 5; + + const result = addDayToDate(date, numberOfDaysToAdd); + + const expectedDate = new Date(2024, 5, 6, 10, 45, 30); + + expect(result).toEqual(expectedDate); + }); + + it('should return the current date when no days are added', () => { + const date = new Date(2024, 5, 1, 10, 45, 30); + const numberOfDaysToAdd = 0; + + const result = addDayToDate(date, numberOfDaysToAdd); + + const expectedDate = new Date(2024, 5, 1, 10, 45, 30); + + expect(result).toEqual(expectedDate); + }); + + it('should handle negative numbers correctly', () => { + const date = new Date(2024, 5, 2, 10, 45, 30); + const numberOfDaysToAdd = -3; + + const result = addDayToDate(date, numberOfDaysToAdd); + + const expectedDate = new Date(2024, 4, 30, 10, 45, 30); + + expect(result).toEqual(expectedDate); + }); +}); diff --git a/packages/utils/src/date/date.ts b/packages/utils/src/date/date.ts index 8a11d65f..27ba5d25 100644 --- a/packages/utils/src/date/date.ts +++ b/packages/utils/src/date/date.ts @@ -1,5 +1,5 @@ import dayjs from 'dayjs'; -export const addDayToDate = (numberOfDay: number): Date => { - return dayjs().add(numberOfDay, 'days').toDate(); +export const addDayToDate = (date: Date, numberOfDay: number): Date => { + return dayjs(date).add(numberOfDay, 'days').toDate(); }; diff --git a/packages/utils/src/errors/types.ts b/packages/utils/src/error/error.ts similarity index 54% rename from packages/utils/src/errors/types.ts rename to packages/utils/src/error/error.ts index ed6d6bce..14679aa8 100644 --- a/packages/utils/src/errors/types.ts +++ b/packages/utils/src/error/error.ts @@ -1,4 +1,4 @@ -export type ErrorCode = +export type AppErrorCode = | 'INTERNAL_ERROR' | 'NEWSLETTER_SUBSCRIBE_FAILED' | 'NOT_AUTHENTICATED' @@ -16,4 +16,19 @@ export type ErrorCode = | 'SNIPPET_NOT_FOUND' | 'CANT_EDIT_SNIPPET' | 'CANT_EDIT_FOLDER' - | 'CANT_RENAME_ROOT_FOLDER'; + | 'CANT_RENAME_ROOT_FOLDER' + | 'INVALID_CONFIRMATION_TOKEN' + | 'USER_NOT_FOUND'; + +export class AppError extends Error { + constructor( + public message: string, + public code: AppErrorCode = 'INTERNAL_ERROR', + ) { + super(); + } +} + +export const isAppError = (error: unknown): error is AppError => { + return error instanceof AppError; +}; diff --git a/packages/utils/src/errors/messages.ts b/packages/utils/src/error/messages.ts similarity index 92% rename from packages/utils/src/errors/messages.ts rename to packages/utils/src/error/messages.ts index 950a6051..39f41a26 100644 --- a/packages/utils/src/errors/messages.ts +++ b/packages/utils/src/error/messages.ts @@ -20,3 +20,5 @@ export const CANT_EDIT_SNIPPET = (userId: string, snippetId: string) => export const CANT_EDIT_FOLDER = (userId: string, folderId: string) => `The user with id ${userId} cannot edit the folder ${folderId}`; export const CANT_RENAME_ROOT_FOLDER = 'The root folder cannot be renamed.'; +export const INVALID_CONFIRMATION_TOKEN = 'Invalid confirmation token'; +export const USER_NOT_FOUND_FROM_TOKEN = 'No user associated with this token'; diff --git a/packages/utils/src/errors/snipcode-error.ts b/packages/utils/src/errors/snipcode-error.ts deleted file mode 100644 index 3e158b23..00000000 --- a/packages/utils/src/errors/snipcode-error.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { ErrorCode } from './types'; - -export default class SnipcodeError extends Error { - constructor( - public message: string, - public code: ErrorCode = 'INTERNAL_ERROR', - ) { - super(); - } -} diff --git a/packages/utils/src/types/snippet.ts b/packages/utils/src/snippet/snippet.ts similarity index 100% rename from packages/utils/src/types/snippet.ts rename to packages/utils/src/snippet/snippet.ts diff --git a/packages/utils/tsconfig.prod.json b/packages/utils/tsconfig.prod.json index e8c5afe2..aa170495 100644 --- a/packages/utils/tsconfig.prod.json +++ b/packages/utils/tsconfig.prod.json @@ -4,6 +4,6 @@ "sourceMap": false }, "exclude": [ - "__tests__" + "**/*.test.ts", ] } diff --git a/release.json b/release.json deleted file mode 100644 index 59ab946c..00000000 --- a/release.json +++ /dev/null @@ -1,64 +0,0 @@ -{ - "changesets": [ - { - "releases": [ - { - "name": "@snipcode/domain", - "type": "minor" - }, - { - "name": "@snipcode/core", - "type": "minor" - }, - { - "name": "@snipcode/code-embed", - "type": "patch" - }, - { - "name": "@snipcode/embed", - "type": "patch" - } - ], - "summary": "Merge the database schema and the application business rules into a single package", - "id": "itchy-cars-yell" - } - ], - "releases": [ - { - "name": "@snipcode/domain", - "type": "minor", - "oldVersion": "1.0.0", - "changesets": [ - "itchy-cars-yell" - ], - "newVersion": "1.1.0" - }, - { - "name": "@snipcode/core", - "type": "minor", - "oldVersion": "1.0.1", - "changesets": [ - "itchy-cars-yell" - ], - "newVersion": "1.1.0" - }, - { - "name": "@snipcode/code-embed", - "type": "patch", - "oldVersion": "1.0.0", - "changesets": [ - "itchy-cars-yell" - ], - "newVersion": "1.0.1" - }, - { - "name": "@snipcode/embed", - "type": "patch", - "oldVersion": "1.1.3", - "changesets": [ - "itchy-cars-yell" - ], - "newVersion": "1.1.4" - } - ] -} \ No newline at end of file diff --git a/tsconfig.base.json b/tsconfig.base.json index 66be0cbe..1cb0b5bb 100644 --- a/tsconfig.base.json +++ b/tsconfig.base.json @@ -29,6 +29,7 @@ "noUnusedLocals": true, "noUnusedParameters": true, "noImplicitReturns": true, - "noFallthroughCasesInSwitch": true + "noFallthroughCasesInSwitch": true, + "strictBindCallApply": true } } diff --git a/tsconfig.json b/tsconfig.json index bfc5c210..d2b25f5e 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -9,12 +9,6 @@ { "path": "./packages/utils" }, - { - "path": "./packages/logger" - }, - { - "path": "./packages/database" - }, { "path": "./packages/domain" }, @@ -25,7 +19,7 @@ "path": "./packages/embed" }, { - "path": "./apps/core" + "path": "./apps/backend" }, { "path": "./apps/web" diff --git a/yarn.lock b/yarn.lock index 26749a1c..25c909cf 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5,16 +5,6 @@ __metadata: version: 8 cacheKey: 10 -"2-thenable@npm:^1.0.0": - version: 1.0.0 - resolution: "2-thenable@npm:1.0.0" - dependencies: - d: "npm:1" - es5-ext: "npm:^0.10.47" - checksum: 10/567cda6fb2fd8884b2a5efdfbec7476da9ec9e3bf84d8bcc637dcda09254c135b4fc91321c0d81a501a9bdafd2d8939f163c2a803c0bccd2f4b6631bbe2e4958 - languageName: node - linkType: hard - "@aashutoshrathi/word-wrap@npm:^1.2.3": version: 1.2.6 resolution: "@aashutoshrathi/word-wrap@npm:1.2.6" @@ -46,6 +36,63 @@ __metadata: languageName: node linkType: hard +"@angular-devkit/core@npm:17.1.2": + version: 17.1.2 + resolution: "@angular-devkit/core@npm:17.1.2" + dependencies: + ajv: "npm:8.12.0" + ajv-formats: "npm:2.1.1" + jsonc-parser: "npm:3.2.0" + picomatch: "npm:3.0.1" + rxjs: "npm:7.8.1" + source-map: "npm:0.7.4" + peerDependencies: + chokidar: ^3.5.2 + peerDependenciesMeta: + chokidar: + optional: true + checksum: 10/c32bb3a32b158b007f894ae7c865fa6618456b154d0abaa3442be2c3acad2c5777eee602c0482f2ee8de96a793b6b6b116f3af73f5f638c76b197a6e7e71bb93 + languageName: node + linkType: hard + +"@angular-devkit/schematics-cli@npm:17.1.2": + version: 17.1.2 + resolution: "@angular-devkit/schematics-cli@npm:17.1.2" + dependencies: + "@angular-devkit/core": "npm:17.1.2" + "@angular-devkit/schematics": "npm:17.1.2" + ansi-colors: "npm:4.1.3" + inquirer: "npm:9.2.12" + symbol-observable: "npm:4.0.0" + yargs-parser: "npm:21.1.1" + bin: + schematics: bin/schematics.js + checksum: 10/0fd6145fb13e59986056257041236a412edab0707c7763c3f8044466d0f52898b05b0fa0f39d5d115e5811f2c695c8f7ab0fcb868e51b4a798c1f8b6c51b72de + languageName: node + linkType: hard + +"@angular-devkit/schematics@npm:17.1.2": + version: 17.1.2 + resolution: "@angular-devkit/schematics@npm:17.1.2" + dependencies: + "@angular-devkit/core": "npm:17.1.2" + jsonc-parser: "npm:3.2.0" + magic-string: "npm:0.30.5" + ora: "npm:5.4.1" + rxjs: "npm:7.8.1" + checksum: 10/478a3801d49da73b2beee694fa240c5acb7cf2d0adbadf46796f146b7524b8e730501190eb3afa848baed66a0e86abe025108a159a86b3e0be40580533dce8ec + languageName: node + linkType: hard + +"@apollo/cache-control-types@npm:^1.0.3": + version: 1.0.3 + resolution: "@apollo/cache-control-types@npm:1.0.3" + peerDependencies: + graphql: 14.x || 15.x || 16.x + checksum: 10/a588e52bfa51e37a1dcd667469c827cbd1145df131650478fa7c7e6f9b01eb71ce9147f94be60c5b3ee0d4f83fd3304da1a78a342ae254c12cfc18e6e3f1e615 + languageName: node + linkType: hard + "@apollo/client@npm:3.9.9": version: 3.9.9 resolution: "@apollo/client@npm:3.9.9" @@ -83,30 +130,6 @@ __metadata: languageName: node linkType: hard -"@apollo/protobufjs@npm:1.2.6": - version: 1.2.6 - resolution: "@apollo/protobufjs@npm:1.2.6" - dependencies: - "@protobufjs/aspromise": "npm:^1.1.2" - "@protobufjs/base64": "npm:^1.1.2" - "@protobufjs/codegen": "npm:^2.0.4" - "@protobufjs/eventemitter": "npm:^1.1.0" - "@protobufjs/fetch": "npm:^1.1.0" - "@protobufjs/float": "npm:^1.0.2" - "@protobufjs/inquire": "npm:^1.1.0" - "@protobufjs/path": "npm:^1.1.2" - "@protobufjs/pool": "npm:^1.1.0" - "@protobufjs/utf8": "npm:^1.1.0" - "@types/long": "npm:^4.0.0" - "@types/node": "npm:^10.1.0" - long: "npm:^4.0.0" - bin: - apollo-pbjs: bin/pbjs - apollo-pbts: bin/pbts - checksum: 10/a134200f943983edbb46cdf358a5e4364599870dc9be4dbce043dfa842903cb0ad4f16e1d99f06f49cf00fbfb6ad95dbac101c9187ce723c968eeb27e6c66822 - languageName: node - linkType: hard - "@apollo/protobufjs@npm:1.2.7": version: 1.2.7 resolution: "@apollo/protobufjs@npm:1.2.7" @@ -130,7 +153,67 @@ __metadata: languageName: node linkType: hard -"@apollo/usage-reporting-protobuf@npm:^4.0.0": +"@apollo/server-gateway-interface@npm:^1.1.1": + version: 1.1.1 + resolution: "@apollo/server-gateway-interface@npm:1.1.1" + dependencies: + "@apollo/usage-reporting-protobuf": "npm:^4.1.1" + "@apollo/utils.fetcher": "npm:^2.0.0" + "@apollo/utils.keyvaluecache": "npm:^2.1.0" + "@apollo/utils.logger": "npm:^2.0.0" + peerDependencies: + graphql: 14.x || 15.x || 16.x + checksum: 10/af0e95399297aa403c32ffff08c6dfa91a70aae73d5954f36e357f045cdb7e89f3bb4c3e70816d244f8f18af21d257bc79e934dd8bbaa1214c5f6d42a6a825d0 + languageName: node + linkType: hard + +"@apollo/server-plugin-landing-page-graphql-playground@npm:4.0.0": + version: 4.0.0 + resolution: "@apollo/server-plugin-landing-page-graphql-playground@npm:4.0.0" + dependencies: + "@apollographql/graphql-playground-html": "npm:1.6.29" + peerDependencies: + "@apollo/server": ^4.0.0 + checksum: 10/be6740cc9d95b277ce5b7ff599d9546676e1433ae258d645393e028f2757d620adb673096f1e6277865262393ed7bef72c9237d25d475d09d32b566fe81714ad + languageName: node + linkType: hard + +"@apollo/server@npm:4.10.4": + version: 4.10.4 + resolution: "@apollo/server@npm:4.10.4" + dependencies: + "@apollo/cache-control-types": "npm:^1.0.3" + "@apollo/server-gateway-interface": "npm:^1.1.1" + "@apollo/usage-reporting-protobuf": "npm:^4.1.1" + "@apollo/utils.createhash": "npm:^2.0.0" + "@apollo/utils.fetcher": "npm:^2.0.0" + "@apollo/utils.isnodelike": "npm:^2.0.0" + "@apollo/utils.keyvaluecache": "npm:^2.1.0" + "@apollo/utils.logger": "npm:^2.0.0" + "@apollo/utils.usagereporting": "npm:^2.1.0" + "@apollo/utils.withrequired": "npm:^2.0.0" + "@graphql-tools/schema": "npm:^9.0.0" + "@josephg/resolvable": "npm:^1.0.0" + "@types/express": "npm:^4.17.13" + "@types/express-serve-static-core": "npm:^4.17.30" + "@types/node-fetch": "npm:^2.6.1" + async-retry: "npm:^1.2.1" + cors: "npm:^2.8.5" + express: "npm:^4.17.1" + loglevel: "npm:^1.6.8" + lru-cache: "npm:^7.10.1" + negotiator: "npm:^0.6.3" + node-abort-controller: "npm:^3.1.1" + node-fetch: "npm:^2.6.7" + uuid: "npm:^9.0.0" + whatwg-mimetype: "npm:^3.0.0" + peerDependencies: + graphql: ^16.6.0 + checksum: 10/f31ca80225542aad5ce1e39cc56038abc2430502c916e348cf8726569406b0ee9f3d4fa9c3812af786b69ab64bf707e5ccc910dd0b956f5cac8a4bb0d6ac2fea + languageName: node + linkType: hard + +"@apollo/usage-reporting-protobuf@npm:^4.1.0, @apollo/usage-reporting-protobuf@npm:^4.1.1": version: 4.1.1 resolution: "@apollo/usage-reporting-protobuf@npm:4.1.1" dependencies: @@ -139,92 +222,114 @@ __metadata: languageName: node linkType: hard -"@apollo/utils.dropunuseddefinitions@npm:^1.1.0": - version: 1.1.0 - resolution: "@apollo/utils.dropunuseddefinitions@npm:1.1.0" +"@apollo/utils.createhash@npm:^2.0.0": + version: 2.0.1 + resolution: "@apollo/utils.createhash@npm:2.0.1" + dependencies: + "@apollo/utils.isnodelike": "npm:^2.0.1" + sha.js: "npm:^2.4.11" + checksum: 10/9e3ba58fd44f7900133a2219b0b66c0656a9c729f7a2ed1a459af8f4149925f0602d9766e57a0cc2acb8d24623f5c34ebad0faac0004cd59060fd6b1c91d5029 + languageName: node + linkType: hard + +"@apollo/utils.dropunuseddefinitions@npm:^2.0.1": + version: 2.0.1 + resolution: "@apollo/utils.dropunuseddefinitions@npm:2.0.1" peerDependencies: graphql: 14.x || 15.x || 16.x - checksum: 10/b66e07086ea65bcb94d84cfd5e6d90d0406c4e7f602c9a5e793c2001273380a4f61c287f60ee1d81d47d49d3a62ef3f0afb8049243540d3021ff445869124094 + checksum: 10/c12166f2551fb44045a8210317b7776abc263136bd07bfe3c6eecdb050468590fc73e524efc437cad21cc4cfcd1efc3e110285025150c2073a4b303934898ac1 languageName: node linkType: hard -"@apollo/utils.keyvaluecache@npm:^1.0.1": - version: 1.0.2 - resolution: "@apollo/utils.keyvaluecache@npm:1.0.2" +"@apollo/utils.fetcher@npm:^2.0.0": + version: 2.0.1 + resolution: "@apollo/utils.fetcher@npm:2.0.1" + checksum: 10/e173d215c3544dade7b4a08733234d5180973c79e8e738e9e2530f2067e8731a5faa7f15176f4ca91f3cc95a4c70166a686c7382a6c6100f56ad5befcd613f9f + languageName: node + linkType: hard + +"@apollo/utils.isnodelike@npm:^2.0.0, @apollo/utils.isnodelike@npm:^2.0.1": + version: 2.0.1 + resolution: "@apollo/utils.isnodelike@npm:2.0.1" + checksum: 10/c2e858186a60cccb7e4fc53e8b97b2a4d5470cd4975ad9cccd29e57a23eff1aa3a0c03edceb13c423632224ce2c327c6f1bb8bd77dc3fb039316bba5750536ec + languageName: node + linkType: hard + +"@apollo/utils.keyvaluecache@npm:^2.1.0": + version: 2.1.1 + resolution: "@apollo/utils.keyvaluecache@npm:2.1.1" dependencies: - "@apollo/utils.logger": "npm:^1.0.0" - lru-cache: "npm:7.10.1 - 7.13.1" - checksum: 10/353794482ad8c476e36c2152d6a647244a8cffbbc26a9b2b28986b3651aaff16b73df1dfed9edc8eb151fe7bd4c59d06b3b1b4c6b1aa516fceb8119a46fa8f72 + "@apollo/utils.logger": "npm:^2.0.1" + lru-cache: "npm:^7.14.1" + checksum: 10/9a6bc7c4645415329a93e77861cb1a9874b2171b741a3a667c277c6339f2ba46fb40011982e7b0993b118af1cc02e59e58fcbe7033ca6216cefec01e7b8eeda6 languageName: node linkType: hard -"@apollo/utils.logger@npm:^1.0.0": - version: 1.0.1 - resolution: "@apollo/utils.logger@npm:1.0.1" - checksum: 10/621bd80ce43a73f97342568b712fd46fee9041212d4c7264a63676e29d17ab292773c3c21b91f8a2dffb1fe7931ece3954886bd04e3100e1765c6d05e231e2a7 +"@apollo/utils.logger@npm:^2.0.0, @apollo/utils.logger@npm:^2.0.1": + version: 2.0.1 + resolution: "@apollo/utils.logger@npm:2.0.1" + checksum: 10/f975c81fcc7e54669b975031349f292930dc4cc3dd6bdc58bc7fe2159e0398a7d18b28860ee324c23722b005848e258094a143d20f6989fde5837379240b0066 languageName: node linkType: hard -"@apollo/utils.printwithreducedwhitespace@npm:^1.1.0": - version: 1.1.0 - resolution: "@apollo/utils.printwithreducedwhitespace@npm:1.1.0" +"@apollo/utils.printwithreducedwhitespace@npm:^2.0.1": + version: 2.0.1 + resolution: "@apollo/utils.printwithreducedwhitespace@npm:2.0.1" peerDependencies: graphql: 14.x || 15.x || 16.x - checksum: 10/86536751681c64f35a2d37b0c2f69a39d91ea0e4f0c3c993d9f76fa109f85e9d306e6994bd6e38eef1e4e5b83245125aaa125ecc94e185d90b3255f06a538503 + checksum: 10/16cd191e66f3801b15deb581426cd1f55066bb824c32d63fe9de9c255bea2e2b6ee1ffc88873607830d2df0f3b4d9a14c707b709f205062e21a502f08f40d513 languageName: node linkType: hard -"@apollo/utils.removealiases@npm:1.0.0": - version: 1.0.0 - resolution: "@apollo/utils.removealiases@npm:1.0.0" +"@apollo/utils.removealiases@npm:2.0.1": + version: 2.0.1 + resolution: "@apollo/utils.removealiases@npm:2.0.1" peerDependencies: graphql: 14.x || 15.x || 16.x - checksum: 10/fda30ad4ee1fbf012e4289b9963b8b75a102eadbdfa5e558dc923cfc68df42eff6e232dc20c34b7e7563e5aac7ae3781d17919cd8f5eccb90c4225a274b2af93 + checksum: 10/2f3f925b239bce49fe9d80bb9fbb551992c8d9180af160e780faf1c88971a30ef16b842e82e1f27a0e1f8c649af0a442ef95f6838d4cde6148939ec73d9464f6 languageName: node linkType: hard -"@apollo/utils.sortast@npm:^1.1.0": - version: 1.1.0 - resolution: "@apollo/utils.sortast@npm:1.1.0" +"@apollo/utils.sortast@npm:^2.0.1": + version: 2.0.1 + resolution: "@apollo/utils.sortast@npm:2.0.1" dependencies: lodash.sortby: "npm:^4.7.0" peerDependencies: graphql: 14.x || 15.x || 16.x - checksum: 10/5ec695d8c91efd82ad75cb3e27662644c71e22be71793908135b38965be6fe1f229c24fd2f4fed1bc1829b84bec2a1f6470817a83c633d95292db7635a625471 + checksum: 10/b71245558ebd64bf93b98aec933d4b5f5758e0fecf7915728d94725ed4201fb2515e2af92fe01a595638147e5e0ef50a27ab5323d9b76eeb126769fb1e58f051 languageName: node linkType: hard -"@apollo/utils.stripsensitiveliterals@npm:^1.2.0": - version: 1.2.0 - resolution: "@apollo/utils.stripsensitiveliterals@npm:1.2.0" +"@apollo/utils.stripsensitiveliterals@npm:^2.0.1": + version: 2.0.1 + resolution: "@apollo/utils.stripsensitiveliterals@npm:2.0.1" peerDependencies: graphql: 14.x || 15.x || 16.x - checksum: 10/5910186a30be23fac59652d350e83a8a7a53adb9146ed545906f6893ad9c8d380752e679348ee210ae01fa39cc0487692b632e960003dcedc2282bd28de2aa01 + checksum: 10/a3f74af0626f89d61f7ed1d25194f6b77006a06653399eecaea0b246cf685a85465091f2dc70280b127871b5c1eda7ded799ce176271c2612946acdc9453d388 languageName: node linkType: hard -"@apollo/utils.usagereporting@npm:^1.0.0": - version: 1.0.1 - resolution: "@apollo/utils.usagereporting@npm:1.0.1" - dependencies: - "@apollo/usage-reporting-protobuf": "npm:^4.0.0" - "@apollo/utils.dropunuseddefinitions": "npm:^1.1.0" - "@apollo/utils.printwithreducedwhitespace": "npm:^1.1.0" - "@apollo/utils.removealiases": "npm:1.0.0" - "@apollo/utils.sortast": "npm:^1.1.0" - "@apollo/utils.stripsensitiveliterals": "npm:^1.2.0" +"@apollo/utils.usagereporting@npm:^2.1.0": + version: 2.1.0 + resolution: "@apollo/utils.usagereporting@npm:2.1.0" + dependencies: + "@apollo/usage-reporting-protobuf": "npm:^4.1.0" + "@apollo/utils.dropunuseddefinitions": "npm:^2.0.1" + "@apollo/utils.printwithreducedwhitespace": "npm:^2.0.1" + "@apollo/utils.removealiases": "npm:2.0.1" + "@apollo/utils.sortast": "npm:^2.0.1" + "@apollo/utils.stripsensitiveliterals": "npm:^2.0.1" peerDependencies: graphql: 14.x || 15.x || 16.x - checksum: 10/9ffd30e60543163dfb112167024b4fb89113974aba7255350b46eafceaf49b267b2660f36e36654c3e97a1676877fe0b17cb3586b2ead4d0abb85b9f4a86916a + checksum: 10/8af4b23000a4c35ba568e6a532e4120ab0e55b291c7b902f2d10a51aad877d0438b80c019296436870ee265edcc8881521fb9a0829796f23a3b2cb73449ac890 languageName: node linkType: hard -"@apollographql/apollo-tools@npm:^0.5.3": - version: 0.5.4 - resolution: "@apollographql/apollo-tools@npm:0.5.4" - peerDependencies: - graphql: ^14.2.1 || ^15.0.0 || ^16.0.0 - checksum: 10/4f69566d23ffb77ffedd87c679dcab608400f297e4cd5423151977b917737c427015485a8e0436feeb5154574171742ab626fb1a8f5ae2739070757976fd49f2 +"@apollo/utils.withrequired@npm:^2.0.0": + version: 2.0.1 + resolution: "@apollo/utils.withrequired@npm:2.0.1" + checksum: 10/ddd3a72d0f13e6283128d1aae787b65f8ef0bf2f2cf351e143c479f0838679e72d82f42f653b6baadd33a092854fc9cb9dd8af4a45938ee25b718274cef408ee languageName: node linkType: hard @@ -275,548 +380,6 @@ __metadata: languageName: node linkType: hard -"@aws-crypto/crc32@npm:3.0.0": - version: 3.0.0 - resolution: "@aws-crypto/crc32@npm:3.0.0" - dependencies: - "@aws-crypto/util": "npm:^3.0.0" - "@aws-sdk/types": "npm:^3.222.0" - tslib: "npm:^1.11.1" - checksum: 10/672d593fd98a88709a1b488db92aabf584b6dad3e8099e04b6d2870e34a2ee668cbbe0e5406e60c0d776b9c34a91cfc427999230ad959518fed56a3db037704c - languageName: node - linkType: hard - -"@aws-crypto/ie11-detection@npm:^3.0.0": - version: 3.0.0 - resolution: "@aws-crypto/ie11-detection@npm:3.0.0" - dependencies: - tslib: "npm:^1.11.1" - checksum: 10/f5aee4a11a113ab9640474e75d398c99538aa30775f484cd519f0de0096ae0d4a6b68d2f0c685f24bd6f2425067c565bc20592c36c0dc1f4d28c1b4751a40734 - languageName: node - linkType: hard - -"@aws-crypto/sha256-browser@npm:3.0.0": - version: 3.0.0 - resolution: "@aws-crypto/sha256-browser@npm:3.0.0" - dependencies: - "@aws-crypto/ie11-detection": "npm:^3.0.0" - "@aws-crypto/sha256-js": "npm:^3.0.0" - "@aws-crypto/supports-web-crypto": "npm:^3.0.0" - "@aws-crypto/util": "npm:^3.0.0" - "@aws-sdk/types": "npm:^3.222.0" - "@aws-sdk/util-locate-window": "npm:^3.0.0" - "@aws-sdk/util-utf8-browser": "npm:^3.0.0" - tslib: "npm:^1.11.1" - checksum: 10/4e075906c48a46bbb8babb60db3e6b280db405a88c68b77c1496c26218292d5ea509beae3ccc19366ca6bc944c6d37fe347d0917909900dbac86f054a19c71c7 - languageName: node - linkType: hard - -"@aws-crypto/sha256-js@npm:3.0.0, @aws-crypto/sha256-js@npm:^3.0.0": - version: 3.0.0 - resolution: "@aws-crypto/sha256-js@npm:3.0.0" - dependencies: - "@aws-crypto/util": "npm:^3.0.0" - "@aws-sdk/types": "npm:^3.222.0" - tslib: "npm:^1.11.1" - checksum: 10/f9fc2d51631950434d0f91f51c2ce17845d4e8e75971806e21604987e3186ee1e54de8a89e5349585b91cb36e56d5f058d6a45004e1bfbce1351dbb40f479152 - languageName: node - linkType: hard - -"@aws-crypto/supports-web-crypto@npm:^3.0.0": - version: 3.0.0 - resolution: "@aws-crypto/supports-web-crypto@npm:3.0.0" - dependencies: - tslib: "npm:^1.11.1" - checksum: 10/8a48788d2866e391354f256aa79b577b2ba1474b50184cbe690467de7e64a79928afece95007ab69a1556f99da97ea129487db091d94489847e14decdc7c9a6f - languageName: node - linkType: hard - -"@aws-crypto/util@npm:^3.0.0": - version: 3.0.0 - resolution: "@aws-crypto/util@npm:3.0.0" - dependencies: - "@aws-sdk/types": "npm:^3.222.0" - "@aws-sdk/util-utf8-browser": "npm:^3.0.0" - tslib: "npm:^1.11.1" - checksum: 10/92c835b83d7a888b37b2f2a37c82e58bb8fabb617e371173c488d2a71b916c69ee566f0ea0b3f7f4e16296226c49793f95b3d59fc07a7ca00af91f8f9f29e6c4 - languageName: node - linkType: hard - -"@aws-sdk/client-lambda@npm:^3.496.0": - version: 3.540.0 - resolution: "@aws-sdk/client-lambda@npm:3.540.0" - dependencies: - "@aws-crypto/sha256-browser": "npm:3.0.0" - "@aws-crypto/sha256-js": "npm:3.0.0" - "@aws-sdk/client-sts": "npm:3.540.0" - "@aws-sdk/core": "npm:3.535.0" - "@aws-sdk/credential-provider-node": "npm:3.540.0" - "@aws-sdk/middleware-host-header": "npm:3.535.0" - "@aws-sdk/middleware-logger": "npm:3.535.0" - "@aws-sdk/middleware-recursion-detection": "npm:3.535.0" - "@aws-sdk/middleware-user-agent": "npm:3.540.0" - "@aws-sdk/region-config-resolver": "npm:3.535.0" - "@aws-sdk/types": "npm:3.535.0" - "@aws-sdk/util-endpoints": "npm:3.540.0" - "@aws-sdk/util-user-agent-browser": "npm:3.535.0" - "@aws-sdk/util-user-agent-node": "npm:3.535.0" - "@smithy/config-resolver": "npm:^2.2.0" - "@smithy/core": "npm:^1.4.0" - "@smithy/eventstream-serde-browser": "npm:^2.2.0" - "@smithy/eventstream-serde-config-resolver": "npm:^2.2.0" - "@smithy/eventstream-serde-node": "npm:^2.2.0" - "@smithy/fetch-http-handler": "npm:^2.5.0" - "@smithy/hash-node": "npm:^2.2.0" - "@smithy/invalid-dependency": "npm:^2.2.0" - "@smithy/middleware-content-length": "npm:^2.2.0" - "@smithy/middleware-endpoint": "npm:^2.5.0" - "@smithy/middleware-retry": "npm:^2.2.0" - "@smithy/middleware-serde": "npm:^2.3.0" - "@smithy/middleware-stack": "npm:^2.2.0" - "@smithy/node-config-provider": "npm:^2.3.0" - "@smithy/node-http-handler": "npm:^2.5.0" - "@smithy/protocol-http": "npm:^3.3.0" - "@smithy/smithy-client": "npm:^2.5.0" - "@smithy/types": "npm:^2.12.0" - "@smithy/url-parser": "npm:^2.2.0" - "@smithy/util-base64": "npm:^2.3.0" - "@smithy/util-body-length-browser": "npm:^2.2.0" - "@smithy/util-body-length-node": "npm:^2.3.0" - "@smithy/util-defaults-mode-browser": "npm:^2.2.0" - "@smithy/util-defaults-mode-node": "npm:^2.3.0" - "@smithy/util-endpoints": "npm:^1.2.0" - "@smithy/util-middleware": "npm:^2.2.0" - "@smithy/util-retry": "npm:^2.2.0" - "@smithy/util-stream": "npm:^2.2.0" - "@smithy/util-utf8": "npm:^2.3.0" - "@smithy/util-waiter": "npm:^2.2.0" - tslib: "npm:^2.6.2" - checksum: 10/d0871a578a81c99b679fdaf6d388e342f30af12a8392c4c7dcf389f10603cb7b541ac355caab999846688911465f070eba2167cb58583b813a6954dcbcf28e2e - languageName: node - linkType: hard - -"@aws-sdk/client-sso-oidc@npm:3.540.0": - version: 3.540.0 - resolution: "@aws-sdk/client-sso-oidc@npm:3.540.0" - dependencies: - "@aws-crypto/sha256-browser": "npm:3.0.0" - "@aws-crypto/sha256-js": "npm:3.0.0" - "@aws-sdk/client-sts": "npm:3.540.0" - "@aws-sdk/core": "npm:3.535.0" - "@aws-sdk/middleware-host-header": "npm:3.535.0" - "@aws-sdk/middleware-logger": "npm:3.535.0" - "@aws-sdk/middleware-recursion-detection": "npm:3.535.0" - "@aws-sdk/middleware-user-agent": "npm:3.540.0" - "@aws-sdk/region-config-resolver": "npm:3.535.0" - "@aws-sdk/types": "npm:3.535.0" - "@aws-sdk/util-endpoints": "npm:3.540.0" - "@aws-sdk/util-user-agent-browser": "npm:3.535.0" - "@aws-sdk/util-user-agent-node": "npm:3.535.0" - "@smithy/config-resolver": "npm:^2.2.0" - "@smithy/core": "npm:^1.4.0" - "@smithy/fetch-http-handler": "npm:^2.5.0" - "@smithy/hash-node": "npm:^2.2.0" - "@smithy/invalid-dependency": "npm:^2.2.0" - "@smithy/middleware-content-length": "npm:^2.2.0" - "@smithy/middleware-endpoint": "npm:^2.5.0" - "@smithy/middleware-retry": "npm:^2.2.0" - "@smithy/middleware-serde": "npm:^2.3.0" - "@smithy/middleware-stack": "npm:^2.2.0" - "@smithy/node-config-provider": "npm:^2.3.0" - "@smithy/node-http-handler": "npm:^2.5.0" - "@smithy/protocol-http": "npm:^3.3.0" - "@smithy/smithy-client": "npm:^2.5.0" - "@smithy/types": "npm:^2.12.0" - "@smithy/url-parser": "npm:^2.2.0" - "@smithy/util-base64": "npm:^2.3.0" - "@smithy/util-body-length-browser": "npm:^2.2.0" - "@smithy/util-body-length-node": "npm:^2.3.0" - "@smithy/util-defaults-mode-browser": "npm:^2.2.0" - "@smithy/util-defaults-mode-node": "npm:^2.3.0" - "@smithy/util-endpoints": "npm:^1.2.0" - "@smithy/util-middleware": "npm:^2.2.0" - "@smithy/util-retry": "npm:^2.2.0" - "@smithy/util-utf8": "npm:^2.3.0" - tslib: "npm:^2.6.2" - peerDependencies: - "@aws-sdk/credential-provider-node": ^3.540.0 - checksum: 10/3d730be4c5031381f3c10b26243e26e5d50178f3aa511a38c0ad28b7f8e68897daead41da65dac98cfe81f6c0e37b074cf02bb63179ff112bdfd2472b70e1160 - languageName: node - linkType: hard - -"@aws-sdk/client-sso@npm:3.540.0": - version: 3.540.0 - resolution: "@aws-sdk/client-sso@npm:3.540.0" - dependencies: - "@aws-crypto/sha256-browser": "npm:3.0.0" - "@aws-crypto/sha256-js": "npm:3.0.0" - "@aws-sdk/core": "npm:3.535.0" - "@aws-sdk/middleware-host-header": "npm:3.535.0" - "@aws-sdk/middleware-logger": "npm:3.535.0" - "@aws-sdk/middleware-recursion-detection": "npm:3.535.0" - "@aws-sdk/middleware-user-agent": "npm:3.540.0" - "@aws-sdk/region-config-resolver": "npm:3.535.0" - "@aws-sdk/types": "npm:3.535.0" - "@aws-sdk/util-endpoints": "npm:3.540.0" - "@aws-sdk/util-user-agent-browser": "npm:3.535.0" - "@aws-sdk/util-user-agent-node": "npm:3.535.0" - "@smithy/config-resolver": "npm:^2.2.0" - "@smithy/core": "npm:^1.4.0" - "@smithy/fetch-http-handler": "npm:^2.5.0" - "@smithy/hash-node": "npm:^2.2.0" - "@smithy/invalid-dependency": "npm:^2.2.0" - "@smithy/middleware-content-length": "npm:^2.2.0" - "@smithy/middleware-endpoint": "npm:^2.5.0" - "@smithy/middleware-retry": "npm:^2.2.0" - "@smithy/middleware-serde": "npm:^2.3.0" - "@smithy/middleware-stack": "npm:^2.2.0" - "@smithy/node-config-provider": "npm:^2.3.0" - "@smithy/node-http-handler": "npm:^2.5.0" - "@smithy/protocol-http": "npm:^3.3.0" - "@smithy/smithy-client": "npm:^2.5.0" - "@smithy/types": "npm:^2.12.0" - "@smithy/url-parser": "npm:^2.2.0" - "@smithy/util-base64": "npm:^2.3.0" - "@smithy/util-body-length-browser": "npm:^2.2.0" - "@smithy/util-body-length-node": "npm:^2.3.0" - "@smithy/util-defaults-mode-browser": "npm:^2.2.0" - "@smithy/util-defaults-mode-node": "npm:^2.3.0" - "@smithy/util-endpoints": "npm:^1.2.0" - "@smithy/util-middleware": "npm:^2.2.0" - "@smithy/util-retry": "npm:^2.2.0" - "@smithy/util-utf8": "npm:^2.3.0" - tslib: "npm:^2.6.2" - checksum: 10/8e2a021624c102ab5a35216ecf1e42dc9d0b7bfb1213477783f64bcc227dcc6cc2363359678b702549d44332f3d2d71173374bd7bf56ea0093aa351a9cba2a90 - languageName: node - linkType: hard - -"@aws-sdk/client-sts@npm:3.540.0": - version: 3.540.0 - resolution: "@aws-sdk/client-sts@npm:3.540.0" - dependencies: - "@aws-crypto/sha256-browser": "npm:3.0.0" - "@aws-crypto/sha256-js": "npm:3.0.0" - "@aws-sdk/core": "npm:3.535.0" - "@aws-sdk/middleware-host-header": "npm:3.535.0" - "@aws-sdk/middleware-logger": "npm:3.535.0" - "@aws-sdk/middleware-recursion-detection": "npm:3.535.0" - "@aws-sdk/middleware-user-agent": "npm:3.540.0" - "@aws-sdk/region-config-resolver": "npm:3.535.0" - "@aws-sdk/types": "npm:3.535.0" - "@aws-sdk/util-endpoints": "npm:3.540.0" - "@aws-sdk/util-user-agent-browser": "npm:3.535.0" - "@aws-sdk/util-user-agent-node": "npm:3.535.0" - "@smithy/config-resolver": "npm:^2.2.0" - "@smithy/core": "npm:^1.4.0" - "@smithy/fetch-http-handler": "npm:^2.5.0" - "@smithy/hash-node": "npm:^2.2.0" - "@smithy/invalid-dependency": "npm:^2.2.0" - "@smithy/middleware-content-length": "npm:^2.2.0" - "@smithy/middleware-endpoint": "npm:^2.5.0" - "@smithy/middleware-retry": "npm:^2.2.0" - "@smithy/middleware-serde": "npm:^2.3.0" - "@smithy/middleware-stack": "npm:^2.2.0" - "@smithy/node-config-provider": "npm:^2.3.0" - "@smithy/node-http-handler": "npm:^2.5.0" - "@smithy/protocol-http": "npm:^3.3.0" - "@smithy/smithy-client": "npm:^2.5.0" - "@smithy/types": "npm:^2.12.0" - "@smithy/url-parser": "npm:^2.2.0" - "@smithy/util-base64": "npm:^2.3.0" - "@smithy/util-body-length-browser": "npm:^2.2.0" - "@smithy/util-body-length-node": "npm:^2.3.0" - "@smithy/util-defaults-mode-browser": "npm:^2.2.0" - "@smithy/util-defaults-mode-node": "npm:^2.3.0" - "@smithy/util-endpoints": "npm:^1.2.0" - "@smithy/util-middleware": "npm:^2.2.0" - "@smithy/util-retry": "npm:^2.2.0" - "@smithy/util-utf8": "npm:^2.3.0" - tslib: "npm:^2.6.2" - peerDependencies: - "@aws-sdk/credential-provider-node": ^3.540.0 - checksum: 10/1344fe3d8ecd0e399859b50034d7b3400ab7f67b3734180bd6ecdef464a1069cdd1135dfc39864fd97033be8c3c9551f28b65e07d658307963836d3f548b4e69 - languageName: node - linkType: hard - -"@aws-sdk/core@npm:3.535.0": - version: 3.535.0 - resolution: "@aws-sdk/core@npm:3.535.0" - dependencies: - "@smithy/core": "npm:^1.4.0" - "@smithy/protocol-http": "npm:^3.3.0" - "@smithy/signature-v4": "npm:^2.2.0" - "@smithy/smithy-client": "npm:^2.5.0" - "@smithy/types": "npm:^2.12.0" - fast-xml-parser: "npm:4.2.5" - tslib: "npm:^2.6.2" - checksum: 10/f80dd5f6293dbfa11fdfdaed6dc56142c86eaf074231be990ce127ebd9fd92e2b574d751d5b15c397b885ad60ef0550b5d80bc516979d0b0289605c9eacdfdb0 - languageName: node - linkType: hard - -"@aws-sdk/credential-provider-env@npm:3.535.0": - version: 3.535.0 - resolution: "@aws-sdk/credential-provider-env@npm:3.535.0" - dependencies: - "@aws-sdk/types": "npm:3.535.0" - "@smithy/property-provider": "npm:^2.2.0" - "@smithy/types": "npm:^2.12.0" - tslib: "npm:^2.6.2" - checksum: 10/a9ab16146a2ba6d5d4af901ebacbd4576effd42c90debc274a9e827bd0a958072b068dfab54e8c6735cc96de40196d84c90c2543692336cca0decef2a16f2fd2 - languageName: node - linkType: hard - -"@aws-sdk/credential-provider-http@npm:3.535.0": - version: 3.535.0 - resolution: "@aws-sdk/credential-provider-http@npm:3.535.0" - dependencies: - "@aws-sdk/types": "npm:3.535.0" - "@smithy/fetch-http-handler": "npm:^2.5.0" - "@smithy/node-http-handler": "npm:^2.5.0" - "@smithy/property-provider": "npm:^2.2.0" - "@smithy/protocol-http": "npm:^3.3.0" - "@smithy/smithy-client": "npm:^2.5.0" - "@smithy/types": "npm:^2.12.0" - "@smithy/util-stream": "npm:^2.2.0" - tslib: "npm:^2.6.2" - checksum: 10/989d97be76e7c93801c216e18974741df14d66c5a1069bc01d80b26a73bae714a4070d1469db8a00db51d8914167e2c8d17eee565fb9fba29527895b0b165e85 - languageName: node - linkType: hard - -"@aws-sdk/credential-provider-ini@npm:3.540.0": - version: 3.540.0 - resolution: "@aws-sdk/credential-provider-ini@npm:3.540.0" - dependencies: - "@aws-sdk/client-sts": "npm:3.540.0" - "@aws-sdk/credential-provider-env": "npm:3.535.0" - "@aws-sdk/credential-provider-process": "npm:3.535.0" - "@aws-sdk/credential-provider-sso": "npm:3.540.0" - "@aws-sdk/credential-provider-web-identity": "npm:3.540.0" - "@aws-sdk/types": "npm:3.535.0" - "@smithy/credential-provider-imds": "npm:^2.3.0" - "@smithy/property-provider": "npm:^2.2.0" - "@smithy/shared-ini-file-loader": "npm:^2.4.0" - "@smithy/types": "npm:^2.12.0" - tslib: "npm:^2.6.2" - checksum: 10/71d6a3eda7ec07e2c516e149f75f33d35217c8ea54cf705fde06173d35fd118f2c1569e56ddd89f229049ef8edcfec26cbebbd51d84c0781f131df1537bab222 - languageName: node - linkType: hard - -"@aws-sdk/credential-provider-node@npm:3.540.0": - version: 3.540.0 - resolution: "@aws-sdk/credential-provider-node@npm:3.540.0" - dependencies: - "@aws-sdk/credential-provider-env": "npm:3.535.0" - "@aws-sdk/credential-provider-http": "npm:3.535.0" - "@aws-sdk/credential-provider-ini": "npm:3.540.0" - "@aws-sdk/credential-provider-process": "npm:3.535.0" - "@aws-sdk/credential-provider-sso": "npm:3.540.0" - "@aws-sdk/credential-provider-web-identity": "npm:3.540.0" - "@aws-sdk/types": "npm:3.535.0" - "@smithy/credential-provider-imds": "npm:^2.3.0" - "@smithy/property-provider": "npm:^2.2.0" - "@smithy/shared-ini-file-loader": "npm:^2.4.0" - "@smithy/types": "npm:^2.12.0" - tslib: "npm:^2.6.2" - checksum: 10/78fde961d1b0b9b5e19b7a8e3ccae2daf35c3cb1dd4fee58e8960e7f7d97a0f42a470caab5c62aa5568f1b2d39171992164f22eb32e5cc231db34a9be4743bc9 - languageName: node - linkType: hard - -"@aws-sdk/credential-provider-process@npm:3.535.0": - version: 3.535.0 - resolution: "@aws-sdk/credential-provider-process@npm:3.535.0" - dependencies: - "@aws-sdk/types": "npm:3.535.0" - "@smithy/property-provider": "npm:^2.2.0" - "@smithy/shared-ini-file-loader": "npm:^2.4.0" - "@smithy/types": "npm:^2.12.0" - tslib: "npm:^2.6.2" - checksum: 10/59260bcd5d42ee61269a3a3d9b2c6c9ab0b6af2b1d48826018e56d44014c3a85fceaf175f3855a24a5f3093ee367afea49a72a559bc7ceb30e7cc9be049c4b0a - languageName: node - linkType: hard - -"@aws-sdk/credential-provider-sso@npm:3.540.0": - version: 3.540.0 - resolution: "@aws-sdk/credential-provider-sso@npm:3.540.0" - dependencies: - "@aws-sdk/client-sso": "npm:3.540.0" - "@aws-sdk/token-providers": "npm:3.540.0" - "@aws-sdk/types": "npm:3.535.0" - "@smithy/property-provider": "npm:^2.2.0" - "@smithy/shared-ini-file-loader": "npm:^2.4.0" - "@smithy/types": "npm:^2.12.0" - tslib: "npm:^2.6.2" - checksum: 10/9aa974a56a2effb2254df63bc5ec08595d6ca9bd5d724d8fc463e798131bfab0c15a47c32f2b359765ef44241dd737ebd09202a09690214f6e52060eba2f0dcd - languageName: node - linkType: hard - -"@aws-sdk/credential-provider-web-identity@npm:3.540.0": - version: 3.540.0 - resolution: "@aws-sdk/credential-provider-web-identity@npm:3.540.0" - dependencies: - "@aws-sdk/client-sts": "npm:3.540.0" - "@aws-sdk/types": "npm:3.535.0" - "@smithy/property-provider": "npm:^2.2.0" - "@smithy/types": "npm:^2.12.0" - tslib: "npm:^2.6.2" - checksum: 10/889dac368f27fde4a47428dd9ba23ba8352bb01a6c9674b36b3972feef5acc68ff5ba37b8932413bff34c7ed128d1a840369e663ac0291eb8ebd8a6fe48e5ce0 - languageName: node - linkType: hard - -"@aws-sdk/middleware-host-header@npm:3.535.0": - version: 3.535.0 - resolution: "@aws-sdk/middleware-host-header@npm:3.535.0" - dependencies: - "@aws-sdk/types": "npm:3.535.0" - "@smithy/protocol-http": "npm:^3.3.0" - "@smithy/types": "npm:^2.12.0" - tslib: "npm:^2.6.2" - checksum: 10/a32cb45c88c8e2361ca4cfca8cd7dc84e743e39e3a161ac4d9aa6c0916b3f259f32c2c8d84cfb60971c4da69fe17b387df75d21903aab8c2c56586cbe025c91c - languageName: node - linkType: hard - -"@aws-sdk/middleware-logger@npm:3.535.0": - version: 3.535.0 - resolution: "@aws-sdk/middleware-logger@npm:3.535.0" - dependencies: - "@aws-sdk/types": "npm:3.535.0" - "@smithy/types": "npm:^2.12.0" - tslib: "npm:^2.6.2" - checksum: 10/1edb993a1e020848be08904e07e7f8bc4925cece85c74d5d67f787e4fe3dcc80da558dd71c530e0910fb86313b9c3955cb4585d1ddbf47fcb85bf8024c735e3a - languageName: node - linkType: hard - -"@aws-sdk/middleware-recursion-detection@npm:3.535.0": - version: 3.535.0 - resolution: "@aws-sdk/middleware-recursion-detection@npm:3.535.0" - dependencies: - "@aws-sdk/types": "npm:3.535.0" - "@smithy/protocol-http": "npm:^3.3.0" - "@smithy/types": "npm:^2.12.0" - tslib: "npm:^2.6.2" - checksum: 10/cf231a98e8f85c4592ccdc8c3d6bff10951fea96c06978068ce6667c6d4c99f95f14b836996dac27c31848030f662f1600629cc63554c5c0d8b4242bba4c5bea - languageName: node - linkType: hard - -"@aws-sdk/middleware-user-agent@npm:3.540.0": - version: 3.540.0 - resolution: "@aws-sdk/middleware-user-agent@npm:3.540.0" - dependencies: - "@aws-sdk/types": "npm:3.535.0" - "@aws-sdk/util-endpoints": "npm:3.540.0" - "@smithy/protocol-http": "npm:^3.3.0" - "@smithy/types": "npm:^2.12.0" - tslib: "npm:^2.6.2" - checksum: 10/032a37e91682a7330e7553c1728c84528a16a1e4efb0d3a0823db49a5c56b64d0cf1a84b4863a5314fc4954d824a77786493f0d305b72305fabd75c4badd7697 - languageName: node - linkType: hard - -"@aws-sdk/region-config-resolver@npm:3.535.0": - version: 3.535.0 - resolution: "@aws-sdk/region-config-resolver@npm:3.535.0" - dependencies: - "@aws-sdk/types": "npm:3.535.0" - "@smithy/node-config-provider": "npm:^2.3.0" - "@smithy/types": "npm:^2.12.0" - "@smithy/util-config-provider": "npm:^2.3.0" - "@smithy/util-middleware": "npm:^2.2.0" - tslib: "npm:^2.6.2" - checksum: 10/a7a1ef6f85f1d05a03d8a132bd4a822c51ac0ba88799d3c3b340118b40c958dc412ed9c97a8945fce8b35ec1f31192003e638e419345054bc514943a9962eb72 - languageName: node - linkType: hard - -"@aws-sdk/token-providers@npm:3.540.0": - version: 3.540.0 - resolution: "@aws-sdk/token-providers@npm:3.540.0" - dependencies: - "@aws-sdk/client-sso-oidc": "npm:3.540.0" - "@aws-sdk/types": "npm:3.535.0" - "@smithy/property-provider": "npm:^2.2.0" - "@smithy/shared-ini-file-loader": "npm:^2.4.0" - "@smithy/types": "npm:^2.12.0" - tslib: "npm:^2.6.2" - checksum: 10/137e43d2257ac87302033bf59731a7c5d21f1fab047c673d90f1adb036cde889debe159f2a59aec70c9daefe0d76528eae51d821f178c0de20b1e328efc25c14 - languageName: node - linkType: hard - -"@aws-sdk/types@npm:3.535.0": - version: 3.535.0 - resolution: "@aws-sdk/types@npm:3.535.0" - dependencies: - "@smithy/types": "npm:^2.12.0" - tslib: "npm:^2.6.2" - checksum: 10/29c2def0ef0a10c0cc44d45b18e149ed6884a6417ddef7a23a58d50ad83f71cf0b00dd774fcc57fcdf85e1e21a8849d9e25999943435a1487ee8ac127a668c6d - languageName: node - linkType: hard - -"@aws-sdk/types@npm:^3.222.0": - version: 3.489.0 - resolution: "@aws-sdk/types@npm:3.489.0" - dependencies: - "@smithy/types": "npm:^2.8.0" - tslib: "npm:^2.5.0" - checksum: 10/48778dad14f6966e974b14b9d421372846c0242e2aa47f76a8161b22f5d9430bf530b88163d913a8acad48480199fc99a012df3689e94a317c1dc875f4a353ed - languageName: node - linkType: hard - -"@aws-sdk/util-endpoints@npm:3.540.0": - version: 3.540.0 - resolution: "@aws-sdk/util-endpoints@npm:3.540.0" - dependencies: - "@aws-sdk/types": "npm:3.535.0" - "@smithy/types": "npm:^2.12.0" - "@smithy/util-endpoints": "npm:^1.2.0" - tslib: "npm:^2.6.2" - checksum: 10/0adf6ef1007e5f059059d926b6ac68a1ae2b70093a8d8af1c5cc15cf62a6291f436f065fc31b6a1950200d4c97cf7ce3e7e8e554b2657b9e11570749a224a5da - languageName: node - linkType: hard - -"@aws-sdk/util-locate-window@npm:^3.0.0": - version: 3.465.0 - resolution: "@aws-sdk/util-locate-window@npm:3.465.0" - dependencies: - tslib: "npm:^2.5.0" - checksum: 10/a8caa2a0052a7cac4038cb04e9e33d63e3524802e8d0a5865a22b8031f391537873a839e1bc7e1bb75f36f7b7fa590aed5b1bfcb02017177d0ba5a4088f584b1 - languageName: node - linkType: hard - -"@aws-sdk/util-user-agent-browser@npm:3.535.0": - version: 3.535.0 - resolution: "@aws-sdk/util-user-agent-browser@npm:3.535.0" - dependencies: - "@aws-sdk/types": "npm:3.535.0" - "@smithy/types": "npm:^2.12.0" - bowser: "npm:^2.11.0" - tslib: "npm:^2.6.2" - checksum: 10/76edb3cb012af16777988c8c63d74504431af33d8ebbcb891abbb972498e49d02ee43e61cf09facf22909d69df645d53480640884d2e76de581016851cafa6d3 - languageName: node - linkType: hard - -"@aws-sdk/util-user-agent-node@npm:3.535.0": - version: 3.535.0 - resolution: "@aws-sdk/util-user-agent-node@npm:3.535.0" - dependencies: - "@aws-sdk/types": "npm:3.535.0" - "@smithy/node-config-provider": "npm:^2.3.0" - "@smithy/types": "npm:^2.12.0" - tslib: "npm:^2.6.2" - peerDependencies: - aws-crt: ">=1.0.0" - peerDependenciesMeta: - aws-crt: - optional: true - checksum: 10/29f8f4e580ebf738e4bc4ea28e942c990ca5146739e424dd33f754359354101e9239cf4e1b3329fe0f776c261075a2248ddc0feabaeaac322cfd57894c731ecb - languageName: node - linkType: hard - -"@aws-sdk/util-utf8-browser@npm:^3.0.0": - version: 3.259.0 - resolution: "@aws-sdk/util-utf8-browser@npm:3.259.0" - dependencies: - tslib: "npm:^2.3.1" - checksum: 10/bdcf29a92a9a1010b44bf8bade3f1224cb6577a6550b39df97cc053d353f2868d355c25589d61e1da54691d65350d8578a496840ad770ed916a6c3af0971f657 - languageName: node - linkType: hard - "@babel/code-frame@npm:^7.0.0, @babel/code-frame@npm:^7.10.4, @babel/code-frame@npm:^7.12.13, @babel/code-frame@npm:^7.22.13, @babel/code-frame@npm:^7.23.5": version: 7.23.5 resolution: "@babel/code-frame@npm:7.23.5" @@ -827,6 +390,16 @@ __metadata: languageName: node linkType: hard +"@babel/code-frame@npm:^7.16.7": + version: 7.24.2 + resolution: "@babel/code-frame@npm:7.24.2" + dependencies: + "@babel/highlight": "npm:^7.24.2" + picocolors: "npm:^1.0.0" + checksum: 10/7db8f5b36ffa3f47a37f58f61e3d130b9ecad21961f3eede7e2a4ac2c7e4a5efb6e9d03a810c669bc986096831b6c0dfc2c3082673d93351b82359c1b03e0590 + languageName: node + linkType: hard + "@babel/compat-data@npm:^7.20.5, @babel/compat-data@npm:^7.23.5": version: 7.23.5 resolution: "@babel/compat-data@npm:7.23.5" @@ -1062,6 +635,13 @@ __metadata: languageName: node linkType: hard +"@babel/helper-validator-identifier@npm:^7.24.5": + version: 7.24.5 + resolution: "@babel/helper-validator-identifier@npm:7.24.5" + checksum: 10/38aaf6a64a0ea2e84766165b461deda3c24fd2173dff18419a2cc9e1ea1d3e709039aee94db29433a07011492717c80900a5eb564cdca7d137757c3c69e26898 + languageName: node + linkType: hard + "@babel/helper-validator-option@npm:^7.23.5": version: 7.23.5 resolution: "@babel/helper-validator-option@npm:7.23.5" @@ -1102,7 +682,19 @@ __metadata: languageName: node linkType: hard -"@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.14.0, @babel/parser@npm:^7.14.7, @babel/parser@npm:^7.16.8, @babel/parser@npm:^7.20.7, @babel/parser@npm:^7.22.15, @babel/parser@npm:^7.23.6": +"@babel/highlight@npm:^7.24.2": + version: 7.24.5 + resolution: "@babel/highlight@npm:7.24.5" + dependencies: + "@babel/helper-validator-identifier": "npm:^7.24.5" + chalk: "npm:^2.4.2" + js-tokens: "npm:^4.0.0" + picocolors: "npm:^1.0.0" + checksum: 10/afde0403154ad69ecd58a98903058e776760444bf4d0363fb740a8596bc6278b72c5226637c4f6b3674d70acb1665207fe2fcecfe93a74f2f4ab033e89fd7e8c + languageName: node + linkType: hard + +"@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.14.0, @babel/parser@npm:^7.14.7, @babel/parser@npm:^7.16.8, @babel/parser@npm:^7.20.7, @babel/parser@npm:^7.22.15, @babel/parser@npm:^7.23.6": version: 7.23.6 resolution: "@babel/parser@npm:7.23.6" bin: @@ -1675,9 +1267,9 @@ __metadata: languageName: node linkType: hard -"@changesets/apply-release-plan@npm:^7.0.0": - version: 7.0.0 - resolution: "@changesets/apply-release-plan@npm:7.0.0" +"@changesets/apply-release-plan@npm:^7.0.1": + version: 7.0.1 + resolution: "@changesets/apply-release-plan@npm:7.0.1" dependencies: "@babel/runtime": "npm:^7.20.1" "@changesets/config": "npm:^3.0.0" @@ -1692,7 +1284,7 @@ __metadata: prettier: "npm:^2.7.1" resolve-from: "npm:^5.0.0" semver: "npm:^7.5.3" - checksum: 10/bf02351e8da1d507a3c1aeb28fddc7812ab027d5127c25af5522130fd676bfad219dbee4a8ebbe9eff7c0654c5b2c5e2451c13d4e02ff45d67990f4f0ff87775 + checksum: 10/dc808835a205cc231215e86ab913294f96c37aa5005d77666d3733fc0d815df567b7fb2f8a5d88b51a331bdba245ea6000689fab31e03046445b064113285e8c languageName: node linkType: hard @@ -1719,12 +1311,12 @@ __metadata: languageName: node linkType: hard -"@changesets/cli@npm:^2.27.1": - version: 2.27.1 - resolution: "@changesets/cli@npm:2.27.1" +"@changesets/cli@npm:2.27.3": + version: 2.27.3 + resolution: "@changesets/cli@npm:2.27.3" dependencies: "@babel/runtime": "npm:^7.20.1" - "@changesets/apply-release-plan": "npm:^7.0.0" + "@changesets/apply-release-plan": "npm:^7.0.1" "@changesets/assemble-release-plan": "npm:^6.0.0" "@changesets/changelog-git": "npm:^0.2.0" "@changesets/config": "npm:^3.0.0" @@ -1736,7 +1328,7 @@ __metadata: "@changesets/pre": "npm:^2.0.0" "@changesets/read": "npm:^0.6.0" "@changesets/types": "npm:^6.0.0" - "@changesets/write": "npm:^0.3.0" + "@changesets/write": "npm:^0.3.1" "@manypkg/get-packages": "npm:^1.1.3" "@types/semver": "npm:^7.5.0" ansi-colors: "npm:^4.1.3" @@ -1757,7 +1349,7 @@ __metadata: tty-table: "npm:^4.1.5" bin: changeset: bin.js - checksum: 10/b7729fae49af7e707d55751a702095f46e0b1143e28e0ca191651ec1ac61fe54dc2e3c11db8476293e71f538f24cc3eb968b1dbe77ce74d3776a90c3468c1c27 + checksum: 10/eada8044f2ef517137decb26f9094b74370cccea3d8710837218475b149ee376fc3fd72ae25613841059c6f0d8df6946ac6d83938f71350627f14904c365b5b2 languageName: node linkType: hard @@ -1897,23 +1489,23 @@ __metadata: languageName: node linkType: hard -"@changesets/write@npm:^0.3.0": - version: 0.3.0 - resolution: "@changesets/write@npm:0.3.0" +"@changesets/write@npm:^0.3.1": + version: 0.3.1 + resolution: "@changesets/write@npm:0.3.1" dependencies: "@babel/runtime": "npm:^7.20.1" "@changesets/types": "npm:^6.0.0" fs-extra: "npm:^7.0.1" human-id: "npm:^1.0.2" prettier: "npm:^2.7.1" - checksum: 10/37588eb3ef2af15b3ea09d46864c994780619d20b791ea5b654801a035a3a12540c7f953e6e4f36731678615edc6d1c32f8fe174d599d3e6ce2d68263865788b + checksum: 10/13b9284e8cb9c55456b62fe4b8e27ab615e46b0214e1a62194afd4ecb33f5e6617478e01b031209d16348e01c7bce5a37cb18afe688c81d98f3657d7c40cc2c9 languageName: node linkType: hard -"@colors/colors@npm:1.6.0, @colors/colors@npm:^1.6.0": - version: 1.6.0 - resolution: "@colors/colors@npm:1.6.0" - checksum: 10/66d00284a3a9a21e5e853b256942e17edbb295f4bd7b9aa7ef06bbb603568d5173eb41b0f64c1e51748bc29d382a23a67d99956e57e7431c64e47e74324182d9 +"@colors/colors@npm:1.5.0": + version: 1.5.0 + resolution: "@colors/colors@npm:1.5.0" + checksum: 10/9d226461c1e91e95f067be2bdc5e6f99cfe55a721f45afb44122e23e4b8602eeac4ff7325af6b5a369f36396ee1514d3809af3f57769066d80d83790d8e53339 languageName: node linkType: hard @@ -2126,17 +1718,6 @@ __metadata: languageName: node linkType: hard -"@dabh/diagnostics@npm:^2.0.2": - version: 2.0.3 - resolution: "@dabh/diagnostics@npm:2.0.3" - dependencies: - colorspace: "npm:1.1.x" - enabled: "npm:2.0.x" - kuler: "npm:^2.0.0" - checksum: 10/14e449a7f42f063f959b472f6ce02d16457a756e852a1910aaa831b63fc21d86f6c32b2a1aa98a4835b856548c926643b51062d241fb6e9b2b7117996053e6b9 - languageName: node - linkType: hard - "@esbuild/aix-ppc64@npm:0.19.12": version: 0.19.12 resolution: "@esbuild/aix-ppc64@npm:0.19.12" @@ -2144,13 +1725,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/aix-ppc64@npm:0.20.2": - version: 0.20.2 - resolution: "@esbuild/aix-ppc64@npm:0.20.2" - conditions: os=aix & cpu=ppc64 - languageName: node - linkType: hard - "@esbuild/android-arm64@npm:0.19.12": version: 0.19.12 resolution: "@esbuild/android-arm64@npm:0.19.12" @@ -2158,13 +1732,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/android-arm64@npm:0.20.2": - version: 0.20.2 - resolution: "@esbuild/android-arm64@npm:0.20.2" - conditions: os=android & cpu=arm64 - languageName: node - linkType: hard - "@esbuild/android-arm@npm:0.19.12": version: 0.19.12 resolution: "@esbuild/android-arm@npm:0.19.12" @@ -2172,13 +1739,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/android-arm@npm:0.20.2": - version: 0.20.2 - resolution: "@esbuild/android-arm@npm:0.20.2" - conditions: os=android & cpu=arm - languageName: node - linkType: hard - "@esbuild/android-x64@npm:0.19.12": version: 0.19.12 resolution: "@esbuild/android-x64@npm:0.19.12" @@ -2186,13 +1746,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/android-x64@npm:0.20.2": - version: 0.20.2 - resolution: "@esbuild/android-x64@npm:0.20.2" - conditions: os=android & cpu=x64 - languageName: node - linkType: hard - "@esbuild/darwin-arm64@npm:0.19.12": version: 0.19.12 resolution: "@esbuild/darwin-arm64@npm:0.19.12" @@ -2200,13 +1753,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/darwin-arm64@npm:0.20.2": - version: 0.20.2 - resolution: "@esbuild/darwin-arm64@npm:0.20.2" - conditions: os=darwin & cpu=arm64 - languageName: node - linkType: hard - "@esbuild/darwin-x64@npm:0.19.12": version: 0.19.12 resolution: "@esbuild/darwin-x64@npm:0.19.12" @@ -2214,13 +1760,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/darwin-x64@npm:0.20.2": - version: 0.20.2 - resolution: "@esbuild/darwin-x64@npm:0.20.2" - conditions: os=darwin & cpu=x64 - languageName: node - linkType: hard - "@esbuild/freebsd-arm64@npm:0.19.12": version: 0.19.12 resolution: "@esbuild/freebsd-arm64@npm:0.19.12" @@ -2228,13 +1767,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/freebsd-arm64@npm:0.20.2": - version: 0.20.2 - resolution: "@esbuild/freebsd-arm64@npm:0.20.2" - conditions: os=freebsd & cpu=arm64 - languageName: node - linkType: hard - "@esbuild/freebsd-x64@npm:0.19.12": version: 0.19.12 resolution: "@esbuild/freebsd-x64@npm:0.19.12" @@ -2242,13 +1774,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/freebsd-x64@npm:0.20.2": - version: 0.20.2 - resolution: "@esbuild/freebsd-x64@npm:0.20.2" - conditions: os=freebsd & cpu=x64 - languageName: node - linkType: hard - "@esbuild/linux-arm64@npm:0.19.12": version: 0.19.12 resolution: "@esbuild/linux-arm64@npm:0.19.12" @@ -2256,13 +1781,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-arm64@npm:0.20.2": - version: 0.20.2 - resolution: "@esbuild/linux-arm64@npm:0.20.2" - conditions: os=linux & cpu=arm64 - languageName: node - linkType: hard - "@esbuild/linux-arm@npm:0.19.12": version: 0.19.12 resolution: "@esbuild/linux-arm@npm:0.19.12" @@ -2270,13 +1788,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-arm@npm:0.20.2": - version: 0.20.2 - resolution: "@esbuild/linux-arm@npm:0.20.2" - conditions: os=linux & cpu=arm - languageName: node - linkType: hard - "@esbuild/linux-ia32@npm:0.19.12": version: 0.19.12 resolution: "@esbuild/linux-ia32@npm:0.19.12" @@ -2284,13 +1795,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-ia32@npm:0.20.2": - version: 0.20.2 - resolution: "@esbuild/linux-ia32@npm:0.20.2" - conditions: os=linux & cpu=ia32 - languageName: node - linkType: hard - "@esbuild/linux-loong64@npm:0.19.12": version: 0.19.12 resolution: "@esbuild/linux-loong64@npm:0.19.12" @@ -2298,13 +1802,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-loong64@npm:0.20.2": - version: 0.20.2 - resolution: "@esbuild/linux-loong64@npm:0.20.2" - conditions: os=linux & cpu=loong64 - languageName: node - linkType: hard - "@esbuild/linux-mips64el@npm:0.19.12": version: 0.19.12 resolution: "@esbuild/linux-mips64el@npm:0.19.12" @@ -2312,13 +1809,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-mips64el@npm:0.20.2": - version: 0.20.2 - resolution: "@esbuild/linux-mips64el@npm:0.20.2" - conditions: os=linux & cpu=mips64el - languageName: node - linkType: hard - "@esbuild/linux-ppc64@npm:0.19.12": version: 0.19.12 resolution: "@esbuild/linux-ppc64@npm:0.19.12" @@ -2326,13 +1816,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-ppc64@npm:0.20.2": - version: 0.20.2 - resolution: "@esbuild/linux-ppc64@npm:0.20.2" - conditions: os=linux & cpu=ppc64 - languageName: node - linkType: hard - "@esbuild/linux-riscv64@npm:0.19.12": version: 0.19.12 resolution: "@esbuild/linux-riscv64@npm:0.19.12" @@ -2340,13 +1823,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-riscv64@npm:0.20.2": - version: 0.20.2 - resolution: "@esbuild/linux-riscv64@npm:0.20.2" - conditions: os=linux & cpu=riscv64 - languageName: node - linkType: hard - "@esbuild/linux-s390x@npm:0.19.12": version: 0.19.12 resolution: "@esbuild/linux-s390x@npm:0.19.12" @@ -2354,13 +1830,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-s390x@npm:0.20.2": - version: 0.20.2 - resolution: "@esbuild/linux-s390x@npm:0.20.2" - conditions: os=linux & cpu=s390x - languageName: node - linkType: hard - "@esbuild/linux-x64@npm:0.19.12": version: 0.19.12 resolution: "@esbuild/linux-x64@npm:0.19.12" @@ -2368,13 +1837,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-x64@npm:0.20.2": - version: 0.20.2 - resolution: "@esbuild/linux-x64@npm:0.20.2" - conditions: os=linux & cpu=x64 - languageName: node - linkType: hard - "@esbuild/netbsd-x64@npm:0.19.12": version: 0.19.12 resolution: "@esbuild/netbsd-x64@npm:0.19.12" @@ -2382,13 +1844,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/netbsd-x64@npm:0.20.2": - version: 0.20.2 - resolution: "@esbuild/netbsd-x64@npm:0.20.2" - conditions: os=netbsd & cpu=x64 - languageName: node - linkType: hard - "@esbuild/openbsd-x64@npm:0.19.12": version: 0.19.12 resolution: "@esbuild/openbsd-x64@npm:0.19.12" @@ -2396,13 +1851,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/openbsd-x64@npm:0.20.2": - version: 0.20.2 - resolution: "@esbuild/openbsd-x64@npm:0.20.2" - conditions: os=openbsd & cpu=x64 - languageName: node - linkType: hard - "@esbuild/sunos-x64@npm:0.19.12": version: 0.19.12 resolution: "@esbuild/sunos-x64@npm:0.19.12" @@ -2410,13 +1858,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/sunos-x64@npm:0.20.2": - version: 0.20.2 - resolution: "@esbuild/sunos-x64@npm:0.20.2" - conditions: os=sunos & cpu=x64 - languageName: node - linkType: hard - "@esbuild/win32-arm64@npm:0.19.12": version: 0.19.12 resolution: "@esbuild/win32-arm64@npm:0.19.12" @@ -2424,13 +1865,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/win32-arm64@npm:0.20.2": - version: 0.20.2 - resolution: "@esbuild/win32-arm64@npm:0.20.2" - conditions: os=win32 & cpu=arm64 - languageName: node - linkType: hard - "@esbuild/win32-ia32@npm:0.19.12": version: 0.19.12 resolution: "@esbuild/win32-ia32@npm:0.19.12" @@ -2438,13 +1872,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/win32-ia32@npm:0.20.2": - version: 0.20.2 - resolution: "@esbuild/win32-ia32@npm:0.20.2" - conditions: os=win32 & cpu=ia32 - languageName: node - linkType: hard - "@esbuild/win32-x64@npm:0.19.12": version: 0.19.12 resolution: "@esbuild/win32-x64@npm:0.19.12" @@ -2452,13 +1879,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/win32-x64@npm:0.20.2": - version: 0.20.2 - resolution: "@esbuild/win32-x64@npm:0.20.2" - conditions: os=win32 & cpu=x64 - languageName: node - linkType: hard - "@eslint-community/eslint-utils@npm:^4.2.0, @eslint-community/eslint-utils@npm:^4.4.0": version: 4.4.0 resolution: "@eslint-community/eslint-utils@npm:4.4.0" @@ -2693,22 +2113,6 @@ __metadata: languageName: node linkType: hard -"@graphql-codegen/typescript-resolvers@npm:4.0.6": - version: 4.0.6 - resolution: "@graphql-codegen/typescript-resolvers@npm:4.0.6" - dependencies: - "@graphql-codegen/plugin-helpers": "npm:^5.0.3" - "@graphql-codegen/typescript": "npm:^4.0.6" - "@graphql-codegen/visitor-plugin-common": "npm:5.1.0" - "@graphql-tools/utils": "npm:^10.0.0" - auto-bind: "npm:~4.0.0" - tslib: "npm:~2.6.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 - checksum: 10/c284a2714b627d9561bb4aee407f1b4a6057de0079fddfa9c60a660ce8aaf1ca785bd6bfc2d6ee65ce479445652ea7ba69211f24ac867ec0299ee8916822fa2a - languageName: node - linkType: hard - "@graphql-codegen/typescript@npm:4.0.6, @graphql-codegen/typescript@npm:^4.0.6": version: 4.0.6 resolution: "@graphql-codegen/typescript@npm:4.0.6" @@ -3019,31 +2423,7 @@ __metadata: languageName: node linkType: hard -"@graphql-tools/merge@npm:8.3.1": - version: 8.3.1 - resolution: "@graphql-tools/merge@npm:8.3.1" - dependencies: - "@graphql-tools/utils": "npm:8.9.0" - tslib: "npm:^2.4.0" - peerDependencies: - graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 - checksum: 10/9354a68aa1b851ee72d2d727a3a264279f1e5ed95100f6c6e7e0a2ad7449943d2ebe6fce43b4873a15e5c3e9df52ea9d23ff51ffc1f73c417c4ccf368f8486ab - languageName: node - linkType: hard - -"@graphql-tools/merge@npm:^8.4.1": - version: 8.4.2 - resolution: "@graphql-tools/merge@npm:8.4.2" - dependencies: - "@graphql-tools/utils": "npm:^9.2.1" - tslib: "npm:^2.4.0" - peerDependencies: - graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 - checksum: 10/62a4e93812e11d083c17f7763f4333a29dbe99fddbff705ff5942a0bdbb9dcd14f668bd76bd3edda485534d5d1a7f09bac311b979196b6149df11d8968a83723 - languageName: node - linkType: hard - -"@graphql-tools/merge@npm:^9.0.0, @graphql-tools/merge@npm:^9.0.1": +"@graphql-tools/merge@npm:9.0.1, @graphql-tools/merge@npm:^9.0.0, @graphql-tools/merge@npm:^9.0.1": version: 9.0.1 resolution: "@graphql-tools/merge@npm:9.0.1" dependencies: @@ -3055,29 +2435,15 @@ __metadata: languageName: node linkType: hard -"@graphql-tools/merge@npm:^9.0.3": - version: 9.0.3 - resolution: "@graphql-tools/merge@npm:9.0.3" - dependencies: - "@graphql-tools/utils": "npm:^10.0.13" - tslib: "npm:^2.4.0" - peerDependencies: - graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 - checksum: 10/c2162297d3c87c39e87b02055224f961a72298ae08f0ea4fe2055530146ec5d261a1b84ef3bc970f7817f269932038d002cde2c957a555c1d62c4d18b643d416 - languageName: node - linkType: hard - -"@graphql-tools/mock@npm:^8.1.2": - version: 8.7.20 - resolution: "@graphql-tools/mock@npm:8.7.20" +"@graphql-tools/merge@npm:^8.4.1": + version: 8.4.2 + resolution: "@graphql-tools/merge@npm:8.4.2" dependencies: - "@graphql-tools/schema": "npm:^9.0.18" "@graphql-tools/utils": "npm:^9.2.1" - fast-json-stable-stringify: "npm:^2.1.0" tslib: "npm:^2.4.0" peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 - checksum: 10/832f8080c91121f1ce7fc5ca37498ae0a0bbc12ef0d65029b97aa192c6ebb3bc6894a275577da37fb5641ce5dab65f1c60ad83fd782e9928d75711e9a5b558bb + checksum: 10/62a4e93812e11d083c17f7763f4333a29dbe99fddbff705ff5942a0bdbb9dcd14f668bd76bd3edda485534d5d1a7f09bac311b979196b6149df11d8968a83723 languageName: node linkType: hard @@ -3133,21 +2499,7 @@ __metadata: languageName: node linkType: hard -"@graphql-tools/schema@npm:10.0.3": - version: 10.0.3 - resolution: "@graphql-tools/schema@npm:10.0.3" - dependencies: - "@graphql-tools/merge": "npm:^9.0.3" - "@graphql-tools/utils": "npm:^10.0.13" - tslib: "npm:^2.4.0" - value-or-promise: "npm:^1.0.12" - peerDependencies: - graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 - checksum: 10/dbe8ea12ea9dd7123672515165db671dc8ce45def8321308078199f0af4bf41bdb5b12867b639065dddd2ff0f55274084672dd586dbcce66a0e93523885545c0 - languageName: node - linkType: hard - -"@graphql-tools/schema@npm:^10.0.0": +"@graphql-tools/schema@npm:10.0.2, @graphql-tools/schema@npm:^10.0.0": version: 10.0.2 resolution: "@graphql-tools/schema@npm:10.0.2" dependencies: @@ -3161,21 +2513,7 @@ __metadata: languageName: node linkType: hard -"@graphql-tools/schema@npm:^8.0.0": - version: 8.5.1 - resolution: "@graphql-tools/schema@npm:8.5.1" - dependencies: - "@graphql-tools/merge": "npm:8.3.1" - "@graphql-tools/utils": "npm:8.9.0" - tslib: "npm:^2.4.0" - value-or-promise: "npm:1.0.11" - peerDependencies: - graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 - checksum: 10/98f57502cc67ee48157bcf6f26c334e27b0673ec6f5a35c1a5bc1901772063c8bfdca435f81664ab1a41f9274b43dc78aa12791feee83546640d0a034b38c836 - languageName: node - linkType: hard - -"@graphql-tools/schema@npm:^9.0.18": +"@graphql-tools/schema@npm:^9.0.0": version: 9.0.19 resolution: "@graphql-tools/schema@npm:9.0.19" dependencies: @@ -3212,18 +2550,7 @@ __metadata: languageName: node linkType: hard -"@graphql-tools/utils@npm:8.9.0": - version: 8.9.0 - resolution: "@graphql-tools/utils@npm:8.9.0" - dependencies: - tslib: "npm:^2.4.0" - peerDependencies: - graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 - checksum: 10/de5930b33664c53f0d22781bb16b4e029afaad165539faf80bd520adfad969c024891db672a2ff96195d8d1185bac66b284ebde67938e554d04c0798453da002 - languageName: node - linkType: hard - -"@graphql-tools/utils@npm:^10.0.0, @graphql-tools/utils@npm:^10.0.10, @graphql-tools/utils@npm:^10.0.11, @graphql-tools/utils@npm:^10.0.13, @graphql-tools/utils@npm:^10.0.2, @graphql-tools/utils@npm:^10.0.5, @graphql-tools/utils@npm:^10.0.8": +"@graphql-tools/utils@npm:10.0.13, @graphql-tools/utils@npm:^10.0.0, @graphql-tools/utils@npm:^10.0.10, @graphql-tools/utils@npm:^10.0.11, @graphql-tools/utils@npm:^10.0.13, @graphql-tools/utils@npm:^10.0.2, @graphql-tools/utils@npm:^10.0.5, @graphql-tools/utils@npm:^10.0.8": version: 10.0.13 resolution: "@graphql-tools/utils@npm:10.0.13" dependencies: @@ -3273,385 +2600,65 @@ __metadata: languageName: node linkType: hard -"@hapi/accept@npm:^6.0.1": - version: 6.0.3 - resolution: "@hapi/accept@npm:6.0.3" +"@headlessui/react@npm:1.7.18": + version: 1.7.18 + resolution: "@headlessui/react@npm:1.7.18" dependencies: - "@hapi/boom": "npm:^10.0.1" - "@hapi/hoek": "npm:^11.0.2" - checksum: 10/40134e34c61093835f5bc9616d9a05cff378dd8a4cd9ef23cf21a8961fb2c2b4e2aca487204e3e9331e1f29d6345fadd7c20ef3023a9229a14e2e5980a5c7d2b + "@tanstack/react-virtual": "npm:^3.0.0-beta.60" + client-only: "npm:^0.0.1" + peerDependencies: + react: ^16 || ^17 || ^18 + react-dom: ^16 || ^17 || ^18 + checksum: 10/9615f7b709842f2e56b3ef1a8f1a77faed7982e86af52f057a5c2a9950d073672073a6c09829f0c26ed7287e298f5e2345f3898dbc2cc13318af10598ceb4bbc languageName: node linkType: hard -"@hapi/ammo@npm:^6.0.1": - version: 6.0.1 - resolution: "@hapi/ammo@npm:6.0.1" - dependencies: - "@hapi/hoek": "npm:^11.0.2" - checksum: 10/42ade652cd5811f9ea307269b9297fbcb9fcd86996c99e5ca4124b166dc98b1a81ea4eee8dfe018a347e4706f4a6a5309e8dc3792b00f44f00e1e66617b762ec +"@heroicons/react@npm:2.1.3": + version: 2.1.3 + resolution: "@heroicons/react@npm:2.1.3" + peerDependencies: + react: ">= 16" + checksum: 10/b9a1100a1381b13567ac5c5a43d77f39fc5d20682bc3e9a1674eecbe656ad756287e5f1c9024cec8f5a2245607f2372278c956c6279ee9b79ef305a7337fd5b8 languageName: node linkType: hard -"@hapi/b64@npm:^6.0.1": - version: 6.0.1 - resolution: "@hapi/b64@npm:6.0.1" - dependencies: - "@hapi/hoek": "npm:^11.0.2" - checksum: 10/95f929fb140164d0b9420c013d573a3ca6829c8d1be9526997c1b26a8e74d0055c270bc721d1aedaf927336ac6bece59b923e29aac0ed08d905b023032f6f0ba +"@hookform/resolvers@npm:3.3.4": + version: 3.3.4 + resolution: "@hookform/resolvers@npm:3.3.4" + peerDependencies: + react-hook-form: ^7.0.0 + checksum: 10/0845e15f53b515ab5dc8d970d4ee7f47bbdfc4f4391bc166361535482d96b6ae3d1812669107fca05bf8687fa5447e3ed65f2eee3e349759b23b229ca978f917 languageName: node linkType: hard -"@hapi/boom@npm:^10.0.0, @hapi/boom@npm:^10.0.1": - version: 10.0.1 - resolution: "@hapi/boom@npm:10.0.1" +"@humanwhocodes/config-array@npm:^0.11.13": + version: 0.11.14 + resolution: "@humanwhocodes/config-array@npm:0.11.14" dependencies: - "@hapi/hoek": "npm:^11.0.2" - checksum: 10/99415b0e2f6aeefae91475e9215620d6cb0cc9f16b836e052c006cffb59cf39c45f724e545c2c50ba036d786c6c7935bffc97ae1cb504c65d2540d200bd40fff + "@humanwhocodes/object-schema": "npm:^2.0.2" + debug: "npm:^4.3.1" + minimatch: "npm:^3.0.5" + checksum: 10/3ffb24ecdfab64014a230e127118d50a1a04d11080cbb748bc21629393d100850496456bbcb4e8c438957fe0934430d731042f1264d6a167b62d32fc2863580a languageName: node linkType: hard -"@hapi/bounce@npm:^3.0.1": - version: 3.0.1 - resolution: "@hapi/bounce@npm:3.0.1" - dependencies: - "@hapi/boom": "npm:^10.0.1" - "@hapi/hoek": "npm:^11.0.2" - checksum: 10/366e17907ee58ca610d16dbdb5ddf4cf888c811b42a1eeb1d3a0be05c78017d9a44085bf1ce5e20f008c31be7f068a7744f963a6714714f2520c863a0659c914 +"@humanwhocodes/module-importer@npm:^1.0.1": + version: 1.0.1 + resolution: "@humanwhocodes/module-importer@npm:1.0.1" + checksum: 10/e993950e346331e5a32eefb27948ecdee2a2c4ab3f072b8f566cd213ef485dd50a3ca497050608db91006f5479e43f91a439aef68d2a313bd3ded06909c7c5b3 languageName: node linkType: hard -"@hapi/bourne@npm:^3.0.0": - version: 3.0.0 - resolution: "@hapi/bourne@npm:3.0.0" - checksum: 10/b3b5d7bdf511fe27b7b8b01b9457f125646665bef72a78848c69170efdea19c2b72522246a87ede6cd811e51e7a556ceff194e46fb1393c6c8c796431c1810b6 +"@humanwhocodes/object-schema@npm:^2.0.2": + version: 2.0.2 + resolution: "@humanwhocodes/object-schema@npm:2.0.2" + checksum: 10/ef915e3e2f34652f3d383b28a9a99cfea476fa991482370889ab14aac8ecd2b38d47cc21932526c6d949da0daf4a4a6bf629d30f41b0caca25e146819cbfa70e languageName: node linkType: hard -"@hapi/call@npm:^9.0.1": - version: 9.0.1 - resolution: "@hapi/call@npm:9.0.1" - dependencies: - "@hapi/boom": "npm:^10.0.1" - "@hapi/hoek": "npm:^11.0.2" - checksum: 10/083ad34770e3314eb311a6d69e088cc9814dd0ae65b860be2b97cd5ee84a44efd6fe83d6aa1c330a72a533dde323d2dc6a4e1e65e76e2c1c347cb87ec25ff190 - languageName: node - linkType: hard - -"@hapi/catbox-memory@npm:^6.0.1": - version: 6.0.1 - resolution: "@hapi/catbox-memory@npm:6.0.1" - dependencies: - "@hapi/boom": "npm:^10.0.1" - "@hapi/hoek": "npm:^11.0.2" - checksum: 10/e1876b066dcf3f0a1fc779490ef97e98b71f829cf70d263fe1b7958264e5f4b253ab10504b7f819d43a3cf83ff8bc26ea205f42b5f0b006af2bfd6a636cd40f9 - languageName: node - linkType: hard - -"@hapi/catbox@npm:^12.1.1": - version: 12.1.1 - resolution: "@hapi/catbox@npm:12.1.1" - dependencies: - "@hapi/boom": "npm:^10.0.1" - "@hapi/hoek": "npm:^11.0.2" - "@hapi/podium": "npm:^5.0.0" - "@hapi/validate": "npm:^2.0.1" - checksum: 10/e59231074a918a938f7d887e03eec05b5375714000cd9e60a6a032b3054a4cb60278f40e117b3ead3a91bcdffe3fdc99bbd180c238d0e85ce69560d4936caf99 - languageName: node - linkType: hard - -"@hapi/content@npm:^6.0.0": - version: 6.0.0 - resolution: "@hapi/content@npm:6.0.0" - dependencies: - "@hapi/boom": "npm:^10.0.0" - checksum: 10/51a62c805e505f90e928d50554a7dcb5a56db7e3508cf258b148f668fa293e814161009340a8f586107edae2d2fdf5bc31056c3c70ec1cf85c325eaae226ce5b - languageName: node - linkType: hard - -"@hapi/cryptiles@npm:^6.0.1": - version: 6.0.1 - resolution: "@hapi/cryptiles@npm:6.0.1" - dependencies: - "@hapi/boom": "npm:^10.0.1" - checksum: 10/eee3887d5474d887aa23c389a41d61e55f08b4325751f7cf35bac0563b4f75890af4a6e1cf5b1b8573656db8d33690804e9e6ca191be20e80a540914c3c7eb19 - languageName: node - linkType: hard - -"@hapi/file@npm:^3.0.0": - version: 3.0.0 - resolution: "@hapi/file@npm:3.0.0" - checksum: 10/3a7d8850e8e395f7a8460878a9993e18694c381a2ce5badb15088d4aef2eb002e08fd32cc255451d0d9fdae229338ea5d5589a01da27be5c0792084311ed3df3 - languageName: node - linkType: hard - -"@hapi/h2o2@npm:^10.0.4": - version: 10.0.4 - resolution: "@hapi/h2o2@npm:10.0.4" - dependencies: - "@hapi/boom": "npm:^10.0.1" - "@hapi/hoek": "npm:^11.0.2" - "@hapi/validate": "npm:^2.0.1" - "@hapi/wreck": "npm:^18.0.1" - checksum: 10/38c1a63dbd6f43c31b3fdeafd6b1f7ea09f75ab6f16c9fd65e98114f62e9a1d5675ff1deb6004bc95cf6ec50d30868de67d320a27ece61e28d4896f135028315 - languageName: node - linkType: hard - -"@hapi/hapi@npm:^21.3.2": - version: 21.3.7 - resolution: "@hapi/hapi@npm:21.3.7" - dependencies: - "@hapi/accept": "npm:^6.0.1" - "@hapi/ammo": "npm:^6.0.1" - "@hapi/boom": "npm:^10.0.1" - "@hapi/bounce": "npm:^3.0.1" - "@hapi/call": "npm:^9.0.1" - "@hapi/catbox": "npm:^12.1.1" - "@hapi/catbox-memory": "npm:^6.0.1" - "@hapi/heavy": "npm:^8.0.1" - "@hapi/hoek": "npm:^11.0.2" - "@hapi/mimos": "npm:^7.0.1" - "@hapi/podium": "npm:^5.0.1" - "@hapi/shot": "npm:^6.0.1" - "@hapi/somever": "npm:^4.1.1" - "@hapi/statehood": "npm:^8.1.1" - "@hapi/subtext": "npm:^8.1.0" - "@hapi/teamwork": "npm:^6.0.0" - "@hapi/topo": "npm:^6.0.1" - "@hapi/validate": "npm:^2.0.1" - checksum: 10/b11742a845923169eece2a219379ff87d6af5b7a20b1a11f2c2f11148d2ab3c1179765fac905e9a263ee3007fc8c03841f2dd59f92c8adcb3cb37ba86c2782a6 - languageName: node - linkType: hard - -"@hapi/heavy@npm:^8.0.1": - version: 8.0.1 - resolution: "@hapi/heavy@npm:8.0.1" - dependencies: - "@hapi/boom": "npm:^10.0.1" - "@hapi/hoek": "npm:^11.0.2" - "@hapi/validate": "npm:^2.0.1" - checksum: 10/7aee6d0dad3e7b7d875c68cbc39eea4338c70fb1b96de9c5e93e52f649fc7345b7fb1fa7521afc73ef333462e17e36b7d1fb774105de563d37322f2b66de1804 - languageName: node - linkType: hard - -"@hapi/hoek@npm:^11.0.2": - version: 11.0.4 - resolution: "@hapi/hoek@npm:11.0.4" - checksum: 10/0cf1c0dbd203701baccae2a78fc2381a77a2f5d2e46722a99c004ddb7eb7440da1bdeb58605acb1afd3287c940e88eec54ec5a35296bcda11e789092b0e58c36 - languageName: node - linkType: hard - -"@hapi/iron@npm:^7.0.1": - version: 7.0.1 - resolution: "@hapi/iron@npm:7.0.1" - dependencies: - "@hapi/b64": "npm:^6.0.1" - "@hapi/boom": "npm:^10.0.1" - "@hapi/bourne": "npm:^3.0.0" - "@hapi/cryptiles": "npm:^6.0.1" - "@hapi/hoek": "npm:^11.0.2" - checksum: 10/e86f8b73cca392dd51888e994b86c44839acc3b5697249a921b03ed66b65e3876d9ca539aaa7072c049398a15a8c0b40c4b72a9a0ec33821a7a718f375d9cf68 - languageName: node - linkType: hard - -"@hapi/mimos@npm:^7.0.1": - version: 7.0.1 - resolution: "@hapi/mimos@npm:7.0.1" - dependencies: - "@hapi/hoek": "npm:^11.0.2" - mime-db: "npm:^1.52.0" - checksum: 10/821a94c757d172291047d0ad588947164c97a32884f01fe41bc547ace9ca4a950a73d14634fd6c21dae91a213ce5ef2cbdb90fc544830f3cde3576082c5e965c - languageName: node - linkType: hard - -"@hapi/nigel@npm:^5.0.1": - version: 5.0.1 - resolution: "@hapi/nigel@npm:5.0.1" - dependencies: - "@hapi/hoek": "npm:^11.0.2" - "@hapi/vise": "npm:^5.0.1" - checksum: 10/50c97ec45a7cc816dc16db0d79ae19633e6e0ecc8d52ba5ef738aaee1cb94a181990ac52df71cb1b01b866ad32b4fb643ae6ff64af7926de4ec5844324664478 - languageName: node - linkType: hard - -"@hapi/pez@npm:^6.1.0": - version: 6.1.0 - resolution: "@hapi/pez@npm:6.1.0" - dependencies: - "@hapi/b64": "npm:^6.0.1" - "@hapi/boom": "npm:^10.0.1" - "@hapi/content": "npm:^6.0.0" - "@hapi/hoek": "npm:^11.0.2" - "@hapi/nigel": "npm:^5.0.1" - checksum: 10/f704d0f5ef9fa65a09559773fbd3e49f938b84e209bae9d1b184a31b2a6f9c670e641a63d7d80ef6ef3be18239a8dc8efb773b05a497268caf4628f6fc756dfe - languageName: node - linkType: hard - -"@hapi/podium@npm:^5.0.0, @hapi/podium@npm:^5.0.1": - version: 5.0.1 - resolution: "@hapi/podium@npm:5.0.1" - dependencies: - "@hapi/hoek": "npm:^11.0.2" - "@hapi/teamwork": "npm:^6.0.0" - "@hapi/validate": "npm:^2.0.1" - checksum: 10/2646c6284c1ffe91512e7a17eb0048a148ac25ef29be389182e99a81e9dda437c261b5c3bf8c4a20757a491e68b53ee1b62c9396f3861ffb4752b782a85d571d - languageName: node - linkType: hard - -"@hapi/shot@npm:^6.0.1": - version: 6.0.1 - resolution: "@hapi/shot@npm:6.0.1" - dependencies: - "@hapi/hoek": "npm:^11.0.2" - "@hapi/validate": "npm:^2.0.1" - checksum: 10/6eb387f9c676922c504b042671139aefa943e0460534179501e793e3658741f45be7fc0a45a4972dd2907ba05157a5a3f9b04c19b0f8de71239e2719744d5a43 - languageName: node - linkType: hard - -"@hapi/somever@npm:^4.1.1": - version: 4.1.1 - resolution: "@hapi/somever@npm:4.1.1" - dependencies: - "@hapi/bounce": "npm:^3.0.1" - "@hapi/hoek": "npm:^11.0.2" - checksum: 10/1e1f5e12743239867574d9020decf834271a515d7fbe39d9005d7706cd6899391d17946d8349bfd87fe841c29c61939fde81e980b27f432d3c9166644ec85115 - languageName: node - linkType: hard - -"@hapi/statehood@npm:^8.1.1": - version: 8.1.1 - resolution: "@hapi/statehood@npm:8.1.1" - dependencies: - "@hapi/boom": "npm:^10.0.1" - "@hapi/bounce": "npm:^3.0.1" - "@hapi/bourne": "npm:^3.0.0" - "@hapi/cryptiles": "npm:^6.0.1" - "@hapi/hoek": "npm:^11.0.2" - "@hapi/iron": "npm:^7.0.1" - "@hapi/validate": "npm:^2.0.1" - checksum: 10/b8259b5470d88064da0f803d39d2ccd244894cd9c20c26f65299398a528eb3a9450c32cde250cb3499d3c80a2e1d9523c609c05658616fcc5be3a8d9f05bbbe1 - languageName: node - linkType: hard - -"@hapi/subtext@npm:^8.1.0": - version: 8.1.0 - resolution: "@hapi/subtext@npm:8.1.0" - dependencies: - "@hapi/boom": "npm:^10.0.1" - "@hapi/bourne": "npm:^3.0.0" - "@hapi/content": "npm:^6.0.0" - "@hapi/file": "npm:^3.0.0" - "@hapi/hoek": "npm:^11.0.2" - "@hapi/pez": "npm:^6.1.0" - "@hapi/wreck": "npm:^18.0.1" - checksum: 10/3f7bf0c689d67307fa4fd454ce491e210c610823386def3155422c0c45c7e0512429a14d8091f72e10b289ae4e6bf1d449f926945148b9e216238412e6aa6901 - languageName: node - linkType: hard - -"@hapi/teamwork@npm:^6.0.0": - version: 6.0.0 - resolution: "@hapi/teamwork@npm:6.0.0" - checksum: 10/e79c8e590e5325ed5a8967cf09ae6a635aac08885953887fc2559e8200ba8575fa12d6637c88ae138ccb157f66c823786e0b53c7f98baf50e3a93207a3f5485c - languageName: node - linkType: hard - -"@hapi/topo@npm:^6.0.1": - version: 6.0.2 - resolution: "@hapi/topo@npm:6.0.2" - dependencies: - "@hapi/hoek": "npm:^11.0.2" - checksum: 10/ef959d3796638e11e5f7a9f2a64295ded7c638d6a21fa37bf1265b14c3a6636da593c9976138826c5b8972830a706d18a82b489e3d902e77026f7f0bec908704 - languageName: node - linkType: hard - -"@hapi/validate@npm:^2.0.1": - version: 2.0.1 - resolution: "@hapi/validate@npm:2.0.1" - dependencies: - "@hapi/hoek": "npm:^11.0.2" - "@hapi/topo": "npm:^6.0.1" - checksum: 10/0fcf0b1b192240080861cfd7d312175cdd9639f43a411847dc54619d28e8bed54956c893a2c10b0d543122a11c5eec16cfca2182936c00a58ddbd98608651782 - languageName: node - linkType: hard - -"@hapi/vise@npm:^5.0.1": - version: 5.0.1 - resolution: "@hapi/vise@npm:5.0.1" - dependencies: - "@hapi/hoek": "npm:^11.0.2" - checksum: 10/093aefdc91024bed1058d8d12cfc691f4ad785a9acbf42bca75791d9f982acb7342922c986bef190d6d660a3e4686c24f6d980e55db58a69ab0299128168052b - languageName: node - linkType: hard - -"@hapi/wreck@npm:^18.0.1": - version: 18.0.1 - resolution: "@hapi/wreck@npm:18.0.1" - dependencies: - "@hapi/boom": "npm:^10.0.1" - "@hapi/bourne": "npm:^3.0.0" - "@hapi/hoek": "npm:^11.0.2" - checksum: 10/456b9d056f71bef9cb4449e1d32bbfbdf4d0f010281b1138225050c3eac3e5194b5d57ba3dd7a18d538199b5cc2284343ccd254079a8ac8cf6776b46f1a0addb - languageName: node - linkType: hard - -"@headlessui/react@npm:1.7.18": - version: 1.7.18 - resolution: "@headlessui/react@npm:1.7.18" - dependencies: - "@tanstack/react-virtual": "npm:^3.0.0-beta.60" - client-only: "npm:^0.0.1" - peerDependencies: - react: ^16 || ^17 || ^18 - react-dom: ^16 || ^17 || ^18 - checksum: 10/9615f7b709842f2e56b3ef1a8f1a77faed7982e86af52f057a5c2a9950d073672073a6c09829f0c26ed7287e298f5e2345f3898dbc2cc13318af10598ceb4bbc - languageName: node - linkType: hard - -"@heroicons/react@npm:2.1.3": - version: 2.1.3 - resolution: "@heroicons/react@npm:2.1.3" - peerDependencies: - react: ">= 16" - checksum: 10/b9a1100a1381b13567ac5c5a43d77f39fc5d20682bc3e9a1674eecbe656ad756287e5f1c9024cec8f5a2245607f2372278c956c6279ee9b79ef305a7337fd5b8 - languageName: node - linkType: hard - -"@hookform/resolvers@npm:3.3.4": - version: 3.3.4 - resolution: "@hookform/resolvers@npm:3.3.4" - peerDependencies: - react-hook-form: ^7.0.0 - checksum: 10/0845e15f53b515ab5dc8d970d4ee7f47bbdfc4f4391bc166361535482d96b6ae3d1812669107fca05bf8687fa5447e3ed65f2eee3e349759b23b229ca978f917 - languageName: node - linkType: hard - -"@humanwhocodes/config-array@npm:^0.11.13": - version: 0.11.14 - resolution: "@humanwhocodes/config-array@npm:0.11.14" - dependencies: - "@humanwhocodes/object-schema": "npm:^2.0.2" - debug: "npm:^4.3.1" - minimatch: "npm:^3.0.5" - checksum: 10/3ffb24ecdfab64014a230e127118d50a1a04d11080cbb748bc21629393d100850496456bbcb4e8c438957fe0934430d731042f1264d6a167b62d32fc2863580a - languageName: node - linkType: hard - -"@humanwhocodes/module-importer@npm:^1.0.1": - version: 1.0.1 - resolution: "@humanwhocodes/module-importer@npm:1.0.1" - checksum: 10/e993950e346331e5a32eefb27948ecdee2a2c4ab3f072b8f566cd213ef485dd50a3ca497050608db91006f5479e43f91a439aef68d2a313bd3ded06909c7c5b3 - languageName: node - linkType: hard - -"@humanwhocodes/object-schema@npm:^2.0.2": - version: 2.0.2 - resolution: "@humanwhocodes/object-schema@npm:2.0.2" - checksum: 10/ef915e3e2f34652f3d383b28a9a99cfea476fa991482370889ab14aac8ecd2b38d47cc21932526c6d949da0daf4a4a6bf629d30f41b0caca25e146819cbfa70e - languageName: node - linkType: hard - -"@isaacs/cliui@npm:^8.0.2": - version: 8.0.2 - resolution: "@isaacs/cliui@npm:8.0.2" +"@isaacs/cliui@npm:^8.0.2": + version: 8.0.2 + resolution: "@isaacs/cliui@npm:8.0.2" dependencies: string-width: "npm:^5.1.2" string-width-cjs: "npm:string-width@^4.2.0" @@ -3931,6 +2938,17 @@ __metadata: languageName: node linkType: hard +"@jridgewell/gen-mapping@npm:^0.3.5": + version: 0.3.5 + resolution: "@jridgewell/gen-mapping@npm:0.3.5" + dependencies: + "@jridgewell/set-array": "npm:^1.2.1" + "@jridgewell/sourcemap-codec": "npm:^1.4.10" + "@jridgewell/trace-mapping": "npm:^0.3.24" + checksum: 10/81587b3c4dd8e6c60252122937cea0c637486311f4ed208b52b62aae2e7a87598f63ec330e6cd0984af494bfb16d3f0d60d3b21d7e5b4aedd2602ff3fe9d32e2 + languageName: node + linkType: hard + "@jridgewell/resolve-uri@npm:^3.0.3, @jridgewell/resolve-uri@npm:^3.1.0": version: 3.1.1 resolution: "@jridgewell/resolve-uri@npm:3.1.1" @@ -3945,7 +2963,24 @@ __metadata: languageName: node linkType: hard -"@jridgewell/sourcemap-codec@npm:^1.4.10, @jridgewell/sourcemap-codec@npm:^1.4.13, @jridgewell/sourcemap-codec@npm:^1.4.14": +"@jridgewell/set-array@npm:^1.2.1": + version: 1.2.1 + resolution: "@jridgewell/set-array@npm:1.2.1" + checksum: 10/832e513a85a588f8ed4f27d1279420d8547743cc37fcad5a5a76fc74bb895b013dfe614d0eed9cb860048e6546b798f8f2652020b4b2ba0561b05caa8c654b10 + languageName: node + linkType: hard + +"@jridgewell/source-map@npm:^0.3.3": + version: 0.3.6 + resolution: "@jridgewell/source-map@npm:0.3.6" + dependencies: + "@jridgewell/gen-mapping": "npm:^0.3.5" + "@jridgewell/trace-mapping": "npm:^0.3.25" + checksum: 10/0a9aca9320dc9044014ba0ef989b3a8411b0d778895553e3b7ca2ac0a75a20af4a5ad3f202acfb1879fa40466036a4417e1d5b38305baed8b9c1ebe6e4b3e7f5 + languageName: node + linkType: hard + +"@jridgewell/sourcemap-codec@npm:^1.4.10, @jridgewell/sourcemap-codec@npm:^1.4.13, @jridgewell/sourcemap-codec@npm:^1.4.14, @jridgewell/sourcemap-codec@npm:^1.4.15": version: 1.4.15 resolution: "@jridgewell/sourcemap-codec@npm:1.4.15" checksum: 10/89960ac087781b961ad918978975bcdf2051cd1741880469783c42de64239703eab9db5230d776d8e6a09d73bb5e4cb964e07d93ee6e2e7aea5a7d726e865c09 @@ -3972,6 +3007,16 @@ __metadata: languageName: node linkType: hard +"@jridgewell/trace-mapping@npm:^0.3.20, @jridgewell/trace-mapping@npm:^0.3.24, @jridgewell/trace-mapping@npm:^0.3.25": + version: 0.3.25 + resolution: "@jridgewell/trace-mapping@npm:0.3.25" + dependencies: + "@jridgewell/resolve-uri": "npm:^3.1.0" + "@jridgewell/sourcemap-codec": "npm:^1.4.14" + checksum: 10/dced32160a44b49d531b80a4a2159dceab6b3ddf0c8e95a0deae4b0e894b172defa63d5ac52a19c2068e1fe7d31ea4ba931fbeec103233ecb4208953967120fc + languageName: node + linkType: hard + "@kamilkisiela/fast-url-parser@npm:^1.1.4": version: 1.1.4 resolution: "@kamilkisiela/fast-url-parser@npm:1.1.4" @@ -3979,19 +3024,19 @@ __metadata: languageName: node linkType: hard -"@kwsites/file-exists@npm:^1.1.1": - version: 1.1.1 - resolution: "@kwsites/file-exists@npm:1.1.1" +"@ljharb/through@npm:^2.3.11": + version: 2.3.13 + resolution: "@ljharb/through@npm:2.3.13" dependencies: - debug: "npm:^4.1.1" - checksum: 10/4ff945de7293285133aeae759caddc71e73c4a44a12fac710fdd4f574cce2671a3f89d8165fdb03d383cfc97f3f96f677d8de3c95133da3d0e12a123a23109fe + call-bind: "npm:^1.0.7" + checksum: 10/6150c6c43a726d52c26863ed6dc4ab54fa7cf625c81463a5ddec86278c99e23bf94dfc99ebf09a9ac3191332d4a27344e092f7e07f252b8cd600e2b38e645870 languageName: node linkType: hard -"@kwsites/promise-deferred@npm:^1.1.1": - version: 1.1.1 - resolution: "@kwsites/promise-deferred@npm:1.1.1" - checksum: 10/07455477a0123d9a38afb503739eeff2c5424afa8d3dbdcc7f9502f13604488a4b1d9742fc7288832a52a6422cf1e1c0a1d51f69a39052f14d27c9a0420b6629 +"@lukeed/csprng@npm:^1.0.0": + version: 1.1.0 + resolution: "@lukeed/csprng@npm:1.1.0" + checksum: 10/926f5f7fc629470ca9a8af355bfcd0271d34535f7be3890f69902432bddc3262029bb5dbe9025542cf6c9883d878692eef2815fc2f3ba5b92e9da1f9eba2e51b languageName: node linkType: hard @@ -4021,55 +3066,294 @@ __metadata: languageName: node linkType: hard -"@next/env@npm:14.1.4": - version: 14.1.4 - resolution: "@next/env@npm:14.1.4" - checksum: 10/76db04d141aed6e4e7f64619f66b84b39a01fd698db735381b530347794b252d74f9d71fe6787402f986a5202e9a4ce1d9c2569fec7c56e67e346c0522883b8b - languageName: node - linkType: hard - -"@next/env@npm:^13.4.3": - version: 13.5.6 - resolution: "@next/env@npm:13.5.6" - checksum: 10/c81bd6052db366407da701e4e431becbc80ef36a88bec7883b0266cdfeb45a7da959d37c38e1a816006cd2da287e5ff5b928bdb71025e3d4aa59e07dea3edd59 +"@nestjs/apollo@npm:12.1.0": + version: 12.1.0 + resolution: "@nestjs/apollo@npm:12.1.0" + dependencies: + "@apollo/server-plugin-landing-page-graphql-playground": "npm:4.0.0" + iterall: "npm:1.3.0" + lodash.omit: "npm:4.5.0" + tslib: "npm:2.6.2" + peerDependencies: + "@apollo/gateway": ^2.0.0 + "@apollo/server": ^4.3.2 + "@apollo/subgraph": ^2.0.0 + "@as-integrations/fastify": ^1.3.0 || ^2.0.0 + "@nestjs/common": ^9.3.8 || ^10.0.0 + "@nestjs/core": ^9.3.8 || ^10.0.0 + "@nestjs/graphql": ^12.0.0 + graphql: ^16.6.0 + peerDependenciesMeta: + "@apollo/gateway": + optional: true + "@apollo/subgraph": + optional: true + "@as-integrations/fastify": + optional: true + checksum: 10/839141c56eea5dac1ae1cc335aa4cabc223f1a56660fa4d8f8101d1d7d2c89e20cc8bd888945c5d1b9ae8f24561aa2464c8695be179ab0ca0113b53869945c69 languageName: node linkType: hard -"@next/eslint-plugin-next@npm:14.1.4": - version: 14.1.4 - resolution: "@next/eslint-plugin-next@npm:14.1.4" +"@nestjs/cli@npm:10.3.2": + version: 10.3.2 + resolution: "@nestjs/cli@npm:10.3.2" dependencies: + "@angular-devkit/core": "npm:17.1.2" + "@angular-devkit/schematics": "npm:17.1.2" + "@angular-devkit/schematics-cli": "npm:17.1.2" + "@nestjs/schematics": "npm:^10.0.1" + chalk: "npm:4.1.2" + chokidar: "npm:3.6.0" + cli-table3: "npm:0.6.3" + commander: "npm:4.1.1" + fork-ts-checker-webpack-plugin: "npm:9.0.2" glob: "npm:10.3.10" - checksum: 10/3ac872e08f3a3fd221492d9f5f6a2ab1a99574207bc6a0b80975a1ee3bd1287bb12a1e595e94525c4d7d505cffad53afd20545fa1d823b21158e0502c258d262 + inquirer: "npm:8.2.6" + node-emoji: "npm:1.11.0" + ora: "npm:5.4.1" + rimraf: "npm:4.4.1" + shelljs: "npm:0.8.5" + source-map-support: "npm:0.5.21" + tree-kill: "npm:1.2.2" + tsconfig-paths: "npm:4.2.0" + tsconfig-paths-webpack-plugin: "npm:4.1.0" + typescript: "npm:5.3.3" + webpack: "npm:5.90.1" + webpack-node-externals: "npm:3.0.0" + peerDependencies: + "@swc/cli": ^0.1.62 || ^0.3.0 + "@swc/core": ^1.3.62 + peerDependenciesMeta: + "@swc/cli": + optional: true + "@swc/core": + optional: true + bin: + nest: bin/nest.js + checksum: 10/fef0719e22fd9ed8f68f792aac10d75b9a5420395ecf9cc8614b1a8631f92d86c519ac2e798250a405ac13bdcd4747a9ef93ea294adc1f29f3e26f54e2d3fc0e languageName: node linkType: hard -"@next/swc-darwin-arm64@npm:14.1.4": - version: 14.1.4 - resolution: "@next/swc-darwin-arm64@npm:14.1.4" - conditions: os=darwin & cpu=arm64 +"@nestjs/common@npm:10.3.8": + version: 10.3.8 + resolution: "@nestjs/common@npm:10.3.8" + dependencies: + iterare: "npm:1.2.1" + tslib: "npm:2.6.2" + uid: "npm:2.0.2" + peerDependencies: + class-transformer: "*" + class-validator: "*" + reflect-metadata: ^0.1.12 || ^0.2.0 + rxjs: ^7.1.0 + peerDependenciesMeta: + class-transformer: + optional: true + class-validator: + optional: true + checksum: 10/e13fcfc11d4d0fdf2bf8c7482e7b3d6da2218cfd7f1483973084e49fd5f0ab4e9b4f36ce573a8ec88c32bd04fc792ab8468b377ba1446901fec8f02f2baafa17 languageName: node linkType: hard -"@next/swc-darwin-x64@npm:14.1.4": - version: 14.1.4 - resolution: "@next/swc-darwin-x64@npm:14.1.4" - conditions: os=darwin & cpu=x64 +"@nestjs/config@npm:3.2.2": + version: 3.2.2 + resolution: "@nestjs/config@npm:3.2.2" + dependencies: + dotenv: "npm:16.4.5" + dotenv-expand: "npm:10.0.0" + lodash: "npm:4.17.21" + uuid: "npm:9.0.1" + peerDependencies: + "@nestjs/common": ^8.0.0 || ^9.0.0 || ^10.0.0 + rxjs: ^7.1.0 + checksum: 10/c7f0cea0f6c73a5168b572510437d6033d27c6abdf686fa600ae42828b668470f1dd6240a3f8897e0f3c779582f4648ce28591369874e2a4bcf1e7b34c88c9b6 languageName: node linkType: hard -"@next/swc-linux-arm64-gnu@npm:14.1.4": - version: 14.1.4 - resolution: "@next/swc-linux-arm64-gnu@npm:14.1.4" - conditions: os=linux & cpu=arm64 & libc=glibc +"@nestjs/core@npm:10.3.8": + version: 10.3.8 + resolution: "@nestjs/core@npm:10.3.8" + dependencies: + "@nuxtjs/opencollective": "npm:0.3.2" + fast-safe-stringify: "npm:2.1.1" + iterare: "npm:1.2.1" + path-to-regexp: "npm:3.2.0" + tslib: "npm:2.6.2" + uid: "npm:2.0.2" + peerDependencies: + "@nestjs/common": ^10.0.0 + "@nestjs/microservices": ^10.0.0 + "@nestjs/platform-express": ^10.0.0 + "@nestjs/websockets": ^10.0.0 + reflect-metadata: ^0.1.12 || ^0.2.0 + rxjs: ^7.1.0 + peerDependenciesMeta: + "@nestjs/microservices": + optional: true + "@nestjs/platform-express": + optional: true + "@nestjs/websockets": + optional: true + checksum: 10/62aebc3a5f48f79137a4dc5fcb0b72120c0ef9ac8ddf9a7c18164f7fe81b4374d47ff652ac876845f982d6126db555ca3c47ec89c772e65196e93e8c32c008f4 languageName: node linkType: hard -"@next/swc-linux-arm64-musl@npm:14.1.4": - version: 14.1.4 - resolution: "@next/swc-linux-arm64-musl@npm:14.1.4" - conditions: os=linux & cpu=arm64 & libc=musl - languageName: node +"@nestjs/graphql@npm:12.1.1": + version: 12.1.1 + resolution: "@nestjs/graphql@npm:12.1.1" + dependencies: + "@graphql-tools/merge": "npm:9.0.1" + "@graphql-tools/schema": "npm:10.0.2" + "@graphql-tools/utils": "npm:10.0.13" + "@nestjs/mapped-types": "npm:2.0.5" + chokidar: "npm:3.6.0" + fast-glob: "npm:3.3.2" + graphql-tag: "npm:2.12.6" + graphql-ws: "npm:5.14.3" + lodash: "npm:4.17.21" + normalize-path: "npm:3.0.0" + subscriptions-transport-ws: "npm:0.11.0" + tslib: "npm:2.6.2" + uuid: "npm:9.0.1" + ws: "npm:8.16.0" + peerDependencies: + "@apollo/subgraph": ^2.0.0 + "@nestjs/common": ^9.3.8 || ^10.0.0 + "@nestjs/core": ^9.3.8 || ^10.0.0 + class-transformer: "*" + class-validator: "*" + graphql: ^16.6.0 + reflect-metadata: ^0.1.13 || ^0.2.0 + ts-morph: ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^20.0.0 || ^21.0.0 + peerDependenciesMeta: + "@apollo/subgraph": + optional: true + class-transformer: + optional: true + class-validator: + optional: true + ts-morph: + optional: true + checksum: 10/5b47033c07ea271699a227fd746303d726a5031e75b82e0de12f4cef4ab4774e41c655803370408d2c1b01ef7417302419069612d0ca8a9c4b1f66c76ef3ab30 + languageName: node + linkType: hard + +"@nestjs/mapped-types@npm:2.0.5": + version: 2.0.5 + resolution: "@nestjs/mapped-types@npm:2.0.5" + peerDependencies: + "@nestjs/common": ^8.0.0 || ^9.0.0 || ^10.0.0 + class-transformer: ^0.4.0 || ^0.5.0 + class-validator: ^0.13.0 || ^0.14.0 + reflect-metadata: ^0.1.12 || ^0.2.0 + peerDependenciesMeta: + class-transformer: + optional: true + class-validator: + optional: true + checksum: 10/f3c2c29b2225ca46c8bad32188993248ae1551772e130b8a540b0249f56613b3242177480d367425bb1e235461b968843f0c8064f527a82a9f68b480e7c86880 + languageName: node + linkType: hard + +"@nestjs/platform-express@npm:10.3.8": + version: 10.3.8 + resolution: "@nestjs/platform-express@npm:10.3.8" + dependencies: + body-parser: "npm:1.20.2" + cors: "npm:2.8.5" + express: "npm:4.19.2" + multer: "npm:1.4.4-lts.1" + tslib: "npm:2.6.2" + peerDependencies: + "@nestjs/common": ^10.0.0 + "@nestjs/core": ^10.0.0 + checksum: 10/62b4da16167650e87a8823214b0a1d8195760a565aecbae77fe584b8666131979b8653c42707e55d8c1d6f50d31f374fe25ab49e4ec86488f125be4e07bbb921 + languageName: node + linkType: hard + +"@nestjs/schematics@npm:10.1.1, @nestjs/schematics@npm:^10.0.1": + version: 10.1.1 + resolution: "@nestjs/schematics@npm:10.1.1" + dependencies: + "@angular-devkit/core": "npm:17.1.2" + "@angular-devkit/schematics": "npm:17.1.2" + comment-json: "npm:4.2.3" + jsonc-parser: "npm:3.2.1" + pluralize: "npm:8.0.0" + peerDependencies: + typescript: ">=4.8.2" + checksum: 10/4488deae3f96dcc429d2b55478bfd782e0442c48a47f69f9b59862f054ffc792f1a9cfca7700fe049ab68a2e392a0aea1ef7b4d1e2c97ffb9efd83f6c8f8e349 + languageName: node + linkType: hard + +"@nestjs/testing@npm:10.3.8": + version: 10.3.8 + resolution: "@nestjs/testing@npm:10.3.8" + dependencies: + tslib: "npm:2.6.2" + peerDependencies: + "@nestjs/common": ^10.0.0 + "@nestjs/core": ^10.0.0 + "@nestjs/microservices": ^10.0.0 + "@nestjs/platform-express": ^10.0.0 + peerDependenciesMeta: + "@nestjs/microservices": + optional: true + "@nestjs/platform-express": + optional: true + checksum: 10/87a07be7868451a51b040e19eae82bb0c6c3f1005663b3d43756cf4a98816254bed46ba679ed2d1db4e4e6b6b143acb9e7a8a86cfa3cec412e513071b70c454d + languageName: node + linkType: hard + +"@next/env@npm:14.1.4": + version: 14.1.4 + resolution: "@next/env@npm:14.1.4" + checksum: 10/76db04d141aed6e4e7f64619f66b84b39a01fd698db735381b530347794b252d74f9d71fe6787402f986a5202e9a4ce1d9c2569fec7c56e67e346c0522883b8b + languageName: node + linkType: hard + +"@next/env@npm:^13.4.3": + version: 13.5.6 + resolution: "@next/env@npm:13.5.6" + checksum: 10/c81bd6052db366407da701e4e431becbc80ef36a88bec7883b0266cdfeb45a7da959d37c38e1a816006cd2da287e5ff5b928bdb71025e3d4aa59e07dea3edd59 + languageName: node + linkType: hard + +"@next/eslint-plugin-next@npm:14.1.4": + version: 14.1.4 + resolution: "@next/eslint-plugin-next@npm:14.1.4" + dependencies: + glob: "npm:10.3.10" + checksum: 10/3ac872e08f3a3fd221492d9f5f6a2ab1a99574207bc6a0b80975a1ee3bd1287bb12a1e595e94525c4d7d505cffad53afd20545fa1d823b21158e0502c258d262 + languageName: node + linkType: hard + +"@next/swc-darwin-arm64@npm:14.1.4": + version: 14.1.4 + resolution: "@next/swc-darwin-arm64@npm:14.1.4" + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + +"@next/swc-darwin-x64@npm:14.1.4": + version: 14.1.4 + resolution: "@next/swc-darwin-x64@npm:14.1.4" + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + +"@next/swc-linux-arm64-gnu@npm:14.1.4": + version: 14.1.4 + resolution: "@next/swc-linux-arm64-gnu@npm:14.1.4" + conditions: os=linux & cpu=arm64 & libc=glibc + languageName: node + linkType: hard + +"@next/swc-linux-arm64-musl@npm:14.1.4": + version: 14.1.4 + resolution: "@next/swc-linux-arm64-musl@npm:14.1.4" + conditions: os=linux & cpu=arm64 & libc=musl + languageName: node linkType: hard "@next/swc-linux-x64-gnu@npm:14.1.4": @@ -4166,6 +3450,334 @@ __metadata: languageName: node linkType: hard +"@nuxtjs/opencollective@npm:0.3.2": + version: 0.3.2 + resolution: "@nuxtjs/opencollective@npm:0.3.2" + dependencies: + chalk: "npm:^4.1.0" + consola: "npm:^2.15.0" + node-fetch: "npm:^2.6.1" + bin: + opencollective: bin/opencollective.js + checksum: 10/0512871f424a2eae41e9385671ac840f28e8508a209df68c363cc97e009b95a6fd4bdfa2a34c9df78a74fa36d7e171e28792cd11da0b2be28c20ee1806b3ea5e + languageName: node + linkType: hard + +"@opentelemetry/api-logs@npm:0.51.1": + version: 0.51.1 + resolution: "@opentelemetry/api-logs@npm:0.51.1" + dependencies: + "@opentelemetry/api": "npm:^1.0.0" + checksum: 10/99638f09b79a306cb8fa586c1e5b15cb60ab51ba4921e0611e86b72fff5a30b928edbc01cc38c36cc968702d273025786982b54361a7b2195cc9d0e193db561d + languageName: node + linkType: hard + +"@opentelemetry/api@npm:^1.0.0, @opentelemetry/api@npm:^1.6.0, @opentelemetry/api@npm:^1.8, @opentelemetry/api@npm:^1.8.0": + version: 1.8.0 + resolution: "@opentelemetry/api@npm:1.8.0" + checksum: 10/62f0c42711b9f0c56ea9527c2e6e609e371bfb47d0b78956c91fe27365b4744d7dcc407636ef5b19a24a1d5e2c3cfa79c1b715deca829074e24e3ffba1315ba2 + languageName: node + linkType: hard + +"@opentelemetry/context-async-hooks@npm:^1.23.0": + version: 1.24.1 + resolution: "@opentelemetry/context-async-hooks@npm:1.24.1" + peerDependencies: + "@opentelemetry/api": ">=1.0.0 <1.9.0" + checksum: 10/6b9faefce4f2563cc9bda70f234ddb24a56e7f9a355eb3e9e32f2d07e14df9abdd87bbf8bf5ad59db09e672c930bc9cf4c8a8a5950cc15c8e3afe608ae1f9fe0 + languageName: node + linkType: hard + +"@opentelemetry/core@npm:1.24.1, @opentelemetry/core@npm:^1.1.0, @opentelemetry/core@npm:^1.24.1, @opentelemetry/core@npm:^1.8.0": + version: 1.24.1 + resolution: "@opentelemetry/core@npm:1.24.1" + dependencies: + "@opentelemetry/semantic-conventions": "npm:1.24.1" + peerDependencies: + "@opentelemetry/api": ">=1.0.0 <1.9.0" + checksum: 10/cdfb38acbee388605910514c66a6168216167d0a03cc11e8b18663852ffd200efd295a6becd888e31e247e87ce65c06df668eb95df92f19e32a6a1bb8f258976 + languageName: node + linkType: hard + +"@opentelemetry/instrumentation-connect@npm:0.36.0": + version: 0.36.0 + resolution: "@opentelemetry/instrumentation-connect@npm:0.36.0" + dependencies: + "@opentelemetry/core": "npm:^1.8.0" + "@opentelemetry/instrumentation": "npm:^0.51.0" + "@opentelemetry/semantic-conventions": "npm:^1.0.0" + "@types/connect": "npm:3.4.36" + peerDependencies: + "@opentelemetry/api": ^1.3.0 + checksum: 10/403253a13240aa109ea1a7a9e09ec514313cce80840c75c84a918e55ca7a7dc56585d07b41a99e74fb3190bb556a76a5516e9b6f329278aaf6b9b56c34adc688 + languageName: node + linkType: hard + +"@opentelemetry/instrumentation-express@npm:0.39.0": + version: 0.39.0 + resolution: "@opentelemetry/instrumentation-express@npm:0.39.0" + dependencies: + "@opentelemetry/core": "npm:^1.8.0" + "@opentelemetry/instrumentation": "npm:^0.51.0" + "@opentelemetry/semantic-conventions": "npm:^1.22.0" + peerDependencies: + "@opentelemetry/api": ^1.3.0 + checksum: 10/0a7b73d762b5fbbe453604bfe78064cad5e8fe42129ee2790d66a0f281cafe5b4a43d82ba096addb5a3988a50b3745ebfa95f9b53dcd9ea8d818b45adc8a0028 + languageName: node + linkType: hard + +"@opentelemetry/instrumentation-fastify@npm:0.36.1": + version: 0.36.1 + resolution: "@opentelemetry/instrumentation-fastify@npm:0.36.1" + dependencies: + "@opentelemetry/core": "npm:^1.8.0" + "@opentelemetry/instrumentation": "npm:^0.51.0" + "@opentelemetry/semantic-conventions": "npm:^1.22.0" + peerDependencies: + "@opentelemetry/api": ^1.3.0 + checksum: 10/614daa9aebc45c7ddd56170869aba2b74879241ed3dba99bb09b7e1e6c6bea6475d6fc500b2e06f33f535325c45efd2b234d013b6be2b2190c145e1c052186ed + languageName: node + linkType: hard + +"@opentelemetry/instrumentation-graphql@npm:0.40.0": + version: 0.40.0 + resolution: "@opentelemetry/instrumentation-graphql@npm:0.40.0" + dependencies: + "@opentelemetry/instrumentation": "npm:^0.51.0" + peerDependencies: + "@opentelemetry/api": ^1.3.0 + checksum: 10/86e52d78a9b1091c10612f03bf03674a2ccfaf4112af81f4cd685ed73548c4a962e592a14286440f978aafbb6e9186bad53b7f98e8fe1e18dbb3e849578777c1 + languageName: node + linkType: hard + +"@opentelemetry/instrumentation-hapi@npm:0.38.0": + version: 0.38.0 + resolution: "@opentelemetry/instrumentation-hapi@npm:0.38.0" + dependencies: + "@opentelemetry/core": "npm:^1.8.0" + "@opentelemetry/instrumentation": "npm:^0.51.0" + "@opentelemetry/semantic-conventions": "npm:^1.0.0" + peerDependencies: + "@opentelemetry/api": ^1.3.0 + checksum: 10/90f446300d9ab24a49035e71a50e30ecd9497408266e1591d22dfaa9288c3f6186de627bb775991b79ae85803ac12286dd52c0cb1ba86473baf1b9eebfc34629 + languageName: node + linkType: hard + +"@opentelemetry/instrumentation-http@npm:0.51.1": + version: 0.51.1 + resolution: "@opentelemetry/instrumentation-http@npm:0.51.1" + dependencies: + "@opentelemetry/core": "npm:1.24.1" + "@opentelemetry/instrumentation": "npm:0.51.1" + "@opentelemetry/semantic-conventions": "npm:1.24.1" + semver: "npm:^7.5.2" + peerDependencies: + "@opentelemetry/api": ^1.3.0 + checksum: 10/2c7626e8bd57a6d5ace46cf08342aed326db069c36f94ae27bcdcc2e4e1c64f8308562c4e1c388d7b338157db333b9d4d8fc65cbea550cf01a4adf238ecd5614 + languageName: node + linkType: hard + +"@opentelemetry/instrumentation-ioredis@npm:0.40.0": + version: 0.40.0 + resolution: "@opentelemetry/instrumentation-ioredis@npm:0.40.0" + dependencies: + "@opentelemetry/instrumentation": "npm:^0.51.0" + "@opentelemetry/redis-common": "npm:^0.36.2" + "@opentelemetry/semantic-conventions": "npm:^1.0.0" + peerDependencies: + "@opentelemetry/api": ^1.3.0 + checksum: 10/3ba1f7dfd277ca4f5b94c3011052e8bd09c0749bf5387a69e7990b6414e2ffefebf68fdc0a670faf311782dae8198ff1b6571c07990366a8d5940429427849d2 + languageName: node + linkType: hard + +"@opentelemetry/instrumentation-koa@npm:0.40.0": + version: 0.40.0 + resolution: "@opentelemetry/instrumentation-koa@npm:0.40.0" + dependencies: + "@opentelemetry/core": "npm:^1.8.0" + "@opentelemetry/instrumentation": "npm:^0.51.0" + "@opentelemetry/semantic-conventions": "npm:^1.22.0" + "@types/koa": "npm:2.14.0" + "@types/koa__router": "npm:12.0.3" + peerDependencies: + "@opentelemetry/api": ^1.3.0 + checksum: 10/541b26d93e5316173a0c6a7371bcf11845ded1a1ca7736b4092c9ac6aedcdb11549c3c0cb20a36567f533193408c87b4f1c7e3ed15e5f362ae94112b7b79a3f3 + languageName: node + linkType: hard + +"@opentelemetry/instrumentation-mongodb@npm:0.43.0": + version: 0.43.0 + resolution: "@opentelemetry/instrumentation-mongodb@npm:0.43.0" + dependencies: + "@opentelemetry/instrumentation": "npm:^0.51.0" + "@opentelemetry/sdk-metrics": "npm:^1.9.1" + "@opentelemetry/semantic-conventions": "npm:^1.22.0" + peerDependencies: + "@opentelemetry/api": ^1.3.0 + checksum: 10/bd9eadf593819549c064d3caf03532efc0711af9e7ea598b1b72e38944644f33dbf2625d86737c38c3bec0a91079ab1b2a2ebfab200ef744f2f46d2d17cac9aa + languageName: node + linkType: hard + +"@opentelemetry/instrumentation-mongoose@npm:0.38.1": + version: 0.38.1 + resolution: "@opentelemetry/instrumentation-mongoose@npm:0.38.1" + dependencies: + "@opentelemetry/core": "npm:^1.8.0" + "@opentelemetry/instrumentation": "npm:^0.51.0" + "@opentelemetry/semantic-conventions": "npm:^1.22.0" + peerDependencies: + "@opentelemetry/api": ^1.3.0 + checksum: 10/c36c74093ae0b3cb0fc6313c5812cabce3377f56869a8aba129a18a2371c0ad516ff9bf787e7127156c1f0202687e48b6cf13c3c4842cbd141ff60e47af4cdbe + languageName: node + linkType: hard + +"@opentelemetry/instrumentation-mysql2@npm:0.38.1": + version: 0.38.1 + resolution: "@opentelemetry/instrumentation-mysql2@npm:0.38.1" + dependencies: + "@opentelemetry/instrumentation": "npm:^0.51.0" + "@opentelemetry/semantic-conventions": "npm:^1.22.0" + "@opentelemetry/sql-common": "npm:^0.40.1" + peerDependencies: + "@opentelemetry/api": ^1.3.0 + checksum: 10/ad08a5bb231d2a70781430704a35e28095b6c28d1e8cde907f5940e3596dfff63b6e389f819fe4aebe81058a2edf2b0ed8d9c837125f5237efb11d250bcf67e8 + languageName: node + linkType: hard + +"@opentelemetry/instrumentation-mysql@npm:0.38.1": + version: 0.38.1 + resolution: "@opentelemetry/instrumentation-mysql@npm:0.38.1" + dependencies: + "@opentelemetry/instrumentation": "npm:^0.51.0" + "@opentelemetry/semantic-conventions": "npm:^1.22.0" + "@types/mysql": "npm:2.15.22" + peerDependencies: + "@opentelemetry/api": ^1.3.0 + checksum: 10/8705932ede1888eaf86c4c05d9278cf8ce41c3b0440f2d768cc6f9b74f5f151b43e5d70d3e100a34bcad6e74079da3d7328d1608e44443dba95daa1f876a079e + languageName: node + linkType: hard + +"@opentelemetry/instrumentation-nestjs-core@npm:0.37.1": + version: 0.37.1 + resolution: "@opentelemetry/instrumentation-nestjs-core@npm:0.37.1" + dependencies: + "@opentelemetry/instrumentation": "npm:^0.51.0" + "@opentelemetry/semantic-conventions": "npm:^1.0.0" + peerDependencies: + "@opentelemetry/api": ^1.3.0 + checksum: 10/a5a938c189b0c3ea826b18267fc11549cbeb7e1664d0809ddf0ee131d3d9033830739b39145836cf768f75c69cdd7ebcebf330a5a926f5afe57ae745a845c0de + languageName: node + linkType: hard + +"@opentelemetry/instrumentation-pg@npm:0.41.0": + version: 0.41.0 + resolution: "@opentelemetry/instrumentation-pg@npm:0.41.0" + dependencies: + "@opentelemetry/instrumentation": "npm:^0.51.0" + "@opentelemetry/semantic-conventions": "npm:^1.22.0" + "@opentelemetry/sql-common": "npm:^0.40.1" + "@types/pg": "npm:8.6.1" + "@types/pg-pool": "npm:2.0.4" + peerDependencies: + "@opentelemetry/api": ^1.3.0 + checksum: 10/541147971e7e57c61551f5e75a014c7f78d99c6abdce787dec2b2b6af41a07c3cbd527b4114d2fd7931d6899bb908c0557631ff9ddc18d2d9a2798999794e3a4 + languageName: node + linkType: hard + +"@opentelemetry/instrumentation@npm:0.51.1, @opentelemetry/instrumentation@npm:^0.49 || ^0.50 || ^0.51, @opentelemetry/instrumentation@npm:^0.51.0, @opentelemetry/instrumentation@npm:^0.51.1": + version: 0.51.1 + resolution: "@opentelemetry/instrumentation@npm:0.51.1" + dependencies: + "@opentelemetry/api-logs": "npm:0.51.1" + "@types/shimmer": "npm:^1.0.2" + import-in-the-middle: "npm:1.7.4" + require-in-the-middle: "npm:^7.1.1" + semver: "npm:^7.5.2" + shimmer: "npm:^1.2.1" + peerDependencies: + "@opentelemetry/api": ^1.3.0 + checksum: 10/54d670d5fffb404a1bde62d5232f9275f0387a929f49bebcea610818b684b68dfc19dd2025e6460269ca0a35ea0ba42fa2b4b977d9ac18d6624d59bce2c6b54e + languageName: node + linkType: hard + +"@opentelemetry/instrumentation@npm:^0.43.0": + version: 0.43.0 + resolution: "@opentelemetry/instrumentation@npm:0.43.0" + dependencies: + "@types/shimmer": "npm:^1.0.2" + import-in-the-middle: "npm:1.4.2" + require-in-the-middle: "npm:^7.1.1" + semver: "npm:^7.5.2" + shimmer: "npm:^1.2.1" + peerDependencies: + "@opentelemetry/api": ^1.3.0 + checksum: 10/776d566dc42154b9161797d7489c5e3697abe761537a103fd19d9e2221931076fbbe9c6ddd16696fa39c16feae2e75deedc2d3ed75d82abc0506ef1299557992 + languageName: node + linkType: hard + +"@opentelemetry/redis-common@npm:^0.36.2": + version: 0.36.2 + resolution: "@opentelemetry/redis-common@npm:0.36.2" + checksum: 10/e7f610f79c95bab9156a9831162c7b55b94ab43c5e47ecb9efcc10c08a236395fdd54b6bb018da981e6641bac9da6fda1b50636fb49db584e87d988750d255e1 + languageName: node + linkType: hard + +"@opentelemetry/resources@npm:1.24.1, @opentelemetry/resources@npm:^1.23.0": + version: 1.24.1 + resolution: "@opentelemetry/resources@npm:1.24.1" + dependencies: + "@opentelemetry/core": "npm:1.24.1" + "@opentelemetry/semantic-conventions": "npm:1.24.1" + peerDependencies: + "@opentelemetry/api": ">=1.0.0 <1.9.0" + checksum: 10/f46c6556326ff61b652bafb05a89f4cb1728b08e5a6aa675c60a533f5bd558a19c4bcd58d3994b49cba6ebc327755f933aaf29b2088a2d783e752a06b26a2532 + languageName: node + linkType: hard + +"@opentelemetry/sdk-metrics@npm:^1.9.1": + version: 1.24.1 + resolution: "@opentelemetry/sdk-metrics@npm:1.24.1" + dependencies: + "@opentelemetry/core": "npm:1.24.1" + "@opentelemetry/resources": "npm:1.24.1" + lodash.merge: "npm:^4.6.2" + peerDependencies: + "@opentelemetry/api": ">=1.3.0 <1.9.0" + checksum: 10/261e026fd28d1d26d7fae231b52f6f0f7c1bb523b084b32b5983e4550a511202023bb41ecb062b2993251ad3eef02167bcb33a119a0b913874e975308f972cb7 + languageName: node + linkType: hard + +"@opentelemetry/sdk-trace-base@npm:^1.22, @opentelemetry/sdk-trace-base@npm:^1.23.0": + version: 1.24.1 + resolution: "@opentelemetry/sdk-trace-base@npm:1.24.1" + dependencies: + "@opentelemetry/core": "npm:1.24.1" + "@opentelemetry/resources": "npm:1.24.1" + "@opentelemetry/semantic-conventions": "npm:1.24.1" + peerDependencies: + "@opentelemetry/api": ">=1.0.0 <1.9.0" + checksum: 10/8366bab0df75b76f7ef5b8cb026982f45ae25472a429d95e07fe9311a6aba4dbc28d9549b00c672a1d40f384f1e03e1f3e686f0df20c52cc57e4bd7821c32456 + languageName: node + linkType: hard + +"@opentelemetry/semantic-conventions@npm:1.24.1, @opentelemetry/semantic-conventions@npm:^1.0.0, @opentelemetry/semantic-conventions@npm:^1.17.0, @opentelemetry/semantic-conventions@npm:^1.22.0, @opentelemetry/semantic-conventions@npm:^1.23.0": + version: 1.24.1 + resolution: "@opentelemetry/semantic-conventions@npm:1.24.1" + checksum: 10/f09fa2ecd1994c3601c108922fb1c175618b14acc0f2a2436ca1506f6c48f2e51c505c6490fc5aeac9b94fbd372dd2081a8b7c0e83d96c57fedd360af13d68a5 + languageName: node + linkType: hard + +"@opentelemetry/sql-common@npm:^0.40.1": + version: 0.40.1 + resolution: "@opentelemetry/sql-common@npm:0.40.1" + dependencies: + "@opentelemetry/core": "npm:^1.1.0" + peerDependencies: + "@opentelemetry/api": ^1.1.0 + checksum: 10/f887b4135be56c9ef6e29f040c9f75f34709e38c11897d59d284d7e73175a2dd2c6267c18061144e81a0045fc461b7813769db2e49c42a8d6becc58b1456d55c + languageName: node + linkType: hard + "@peculiar/asn1-schema@npm:^2.3.6": version: 2.3.8 resolution: "@peculiar/asn1-schema@npm:2.3.8" @@ -4317,6 +3929,17 @@ __metadata: languageName: node linkType: hard +"@prisma/instrumentation@npm:5.14.0": + version: 5.14.0 + resolution: "@prisma/instrumentation@npm:5.14.0" + dependencies: + "@opentelemetry/api": "npm:^1.8" + "@opentelemetry/instrumentation": "npm:^0.49 || ^0.50 || ^0.51" + "@opentelemetry/sdk-trace-base": "npm:^1.22" + checksum: 10/fb146cd0b2b54c1427e9571a7ff4cbe2c03ab05e5be869cdcdd43a25eb38e4a4fa76aad2a4ccb604459c75f69e831c0daa41d1745e9d6fe0d04ee265ce04a831 + languageName: node + linkType: hard + "@protobufjs/aspromise@npm:^1.1.1, @protobufjs/aspromise@npm:^1.1.2": version: 1.1.2 resolution: "@protobufjs/aspromise@npm:1.1.2" @@ -4605,6 +4228,16 @@ __metadata: languageName: node linkType: hard +"@sentry/core@npm:8.3.0": + version: 8.3.0 + resolution: "@sentry/core@npm:8.3.0" + dependencies: + "@sentry/types": "npm:8.3.0" + "@sentry/utils": "npm:8.3.0" + checksum: 10/8ef5419989236daaf1800457b27f5d97875e64620052e5cb66fd9e5ed61d9396bac8c0789b04d7b86881413b1e931afc8665fc3311fc0d37d99f2f7cc05352c8 + languageName: node + linkType: hard + "@sentry/integrations@npm:7.108.0": version: 7.108.0 resolution: "@sentry/integrations@npm:7.108.0" @@ -4657,6 +4290,61 @@ __metadata: languageName: node linkType: hard +"@sentry/node@npm:8.3.0": + version: 8.3.0 + resolution: "@sentry/node@npm:8.3.0" + dependencies: + "@opentelemetry/api": "npm:^1.8.0" + "@opentelemetry/context-async-hooks": "npm:^1.23.0" + "@opentelemetry/core": "npm:^1.24.1" + "@opentelemetry/instrumentation": "npm:^0.51.1" + "@opentelemetry/instrumentation-connect": "npm:0.36.0" + "@opentelemetry/instrumentation-express": "npm:0.39.0" + "@opentelemetry/instrumentation-fastify": "npm:0.36.1" + "@opentelemetry/instrumentation-graphql": "npm:0.40.0" + "@opentelemetry/instrumentation-hapi": "npm:0.38.0" + "@opentelemetry/instrumentation-http": "npm:0.51.1" + "@opentelemetry/instrumentation-ioredis": "npm:0.40.0" + "@opentelemetry/instrumentation-koa": "npm:0.40.0" + "@opentelemetry/instrumentation-mongodb": "npm:0.43.0" + "@opentelemetry/instrumentation-mongoose": "npm:0.38.1" + "@opentelemetry/instrumentation-mysql": "npm:0.38.1" + "@opentelemetry/instrumentation-mysql2": "npm:0.38.1" + "@opentelemetry/instrumentation-nestjs-core": "npm:0.37.1" + "@opentelemetry/instrumentation-pg": "npm:0.41.0" + "@opentelemetry/resources": "npm:^1.23.0" + "@opentelemetry/sdk-trace-base": "npm:^1.23.0" + "@opentelemetry/semantic-conventions": "npm:^1.23.0" + "@prisma/instrumentation": "npm:5.14.0" + "@sentry/core": "npm:8.3.0" + "@sentry/opentelemetry": "npm:8.3.0" + "@sentry/types": "npm:8.3.0" + "@sentry/utils": "npm:8.3.0" + opentelemetry-instrumentation-fetch-node: "npm:1.2.0" + dependenciesMeta: + opentelemetry-instrumentation-fetch-node: + optional: true + checksum: 10/3e40ababfa9736b428a563157063d55a66899825fb4951365b8085188fcb669786e3765855c703bb144cc670563466863a6096a9c5788d987cf08c713bacceea + languageName: node + linkType: hard + +"@sentry/opentelemetry@npm:8.3.0": + version: 8.3.0 + resolution: "@sentry/opentelemetry@npm:8.3.0" + dependencies: + "@sentry/core": "npm:8.3.0" + "@sentry/types": "npm:8.3.0" + "@sentry/utils": "npm:8.3.0" + peerDependencies: + "@opentelemetry/api": ^1.8.0 + "@opentelemetry/core": ^1.24.1 + "@opentelemetry/instrumentation": ^0.51.1 + "@opentelemetry/sdk-trace-base": ^1.23.0 + "@opentelemetry/semantic-conventions": ^1.23.0 + checksum: 10/884f95fe4181286d21921c3a8a50368d6faad755c2d949629dbcad7bf473ab4aed2ef3899b97b4436680886b3972f205631b646322e40e849631a2184e8da751 + languageName: node + linkType: hard + "@sentry/react@npm:7.108.0": version: 7.108.0 resolution: "@sentry/react@npm:7.108.0" @@ -4684,15 +4372,6 @@ __metadata: languageName: node linkType: hard -"@sentry/tracing@npm:7.108.0": - version: 7.108.0 - resolution: "@sentry/tracing@npm:7.108.0" - dependencies: - "@sentry-internal/tracing": "npm:7.108.0" - checksum: 10/ab8e8fd199fe7a4396ed51bec8f9a78b1fc0fff9978f59dfb792200fb8514340cb22cee45aa585f1265320a958f9eac28d08becea0ba4922e53bb33276b94a5e - languageName: node - linkType: hard - "@sentry/types@npm:7.108.0": version: 7.108.0 resolution: "@sentry/types@npm:7.108.0" @@ -4700,6 +4379,13 @@ __metadata: languageName: node linkType: hard +"@sentry/types@npm:8.3.0": + version: 8.3.0 + resolution: "@sentry/types@npm:8.3.0" + checksum: 10/e4294bfa568ca95234986633aac540ce8d8f657da564d1efe5e8c8592cc923304cf8a02b2789784f5747f13d40c00bfc0021c9463cb54bd82b09917aae12eb41 + languageName: node + linkType: hard + "@sentry/utils@npm:7.108.0": version: 7.108.0 resolution: "@sentry/utils@npm:7.108.0" @@ -4709,6 +4395,15 @@ __metadata: languageName: node linkType: hard +"@sentry/utils@npm:8.3.0": + version: 8.3.0 + resolution: "@sentry/utils@npm:8.3.0" + dependencies: + "@sentry/types": "npm:8.3.0" + checksum: 10/8b3e08928b7af045fd966381c8b16c18ff1669b3bb05bcff9801ac13bef2742cff99bdd0ac3cfa5b42ad9ccd8b915c9fade6ca03fc1b4d054cfc2a7b78c44b23 + languageName: node + linkType: hard + "@sentry/vercel-edge@npm:7.108.0": version: 7.108.0 resolution: "@sentry/vercel-edge@npm:7.108.0" @@ -4724,716 +4419,68 @@ __metadata: "@sentry/webpack-plugin@npm:1.21.0": version: 1.21.0 resolution: "@sentry/webpack-plugin@npm:1.21.0" - dependencies: - "@sentry/cli": "npm:^1.77.1" - webpack-sources: "npm:^2.0.0 || ^3.0.0" - checksum: 10/fc28506d72ae6eeddd9b2e1eb3e79fc7d186d902c0193cdab3367c8f10bd29ff23a50c6117d34652eb6bd35812469f2a5a2ba5180c62a4ea9b9e36f3075b3ee1 - languageName: node - linkType: hard - -"@serverless/dashboard-plugin@npm:^6.2.2": - version: 6.4.0 - resolution: "@serverless/dashboard-plugin@npm:6.4.0" - dependencies: - "@serverless/event-mocks": "npm:^1.1.1" - "@serverless/platform-client": "npm:^4.3.2" - "@serverless/utils": "npm:^6.8.2" - child-process-ext: "npm:^3.0.1" - chokidar: "npm:^3.5.3" - flat: "npm:^5.0.2" - fs-extra: "npm:^9.1.0" - js-yaml: "npm:^4.1.0" - jszip: "npm:^3.10.1" - lodash: "npm:^4.17.21" - memoizee: "npm:^0.4.15" - ncjsm: "npm:^4.3.2" - node-dir: "npm:^0.1.17" - node-fetch: "npm:^2.6.8" - open: "npm:^7.4.2" - semver: "npm:^7.3.8" - simple-git: "npm:^3.16.0" - type: "npm:^2.7.2" - uuid: "npm:^8.3.2" - yamljs: "npm:^0.3.0" - checksum: 10/48f501bc7bf686b36a57aaa471f32943df5240fdc3fc29e2127aa9fca36d9abc90c94816703af5ccae3fe90073dafd36835dbe77aa95cd66de24e77e4a007e6c - languageName: node - linkType: hard - -"@serverless/event-mocks@npm:^1.1.1": - version: 1.1.1 - resolution: "@serverless/event-mocks@npm:1.1.1" - dependencies: - "@types/lodash": "npm:^4.14.123" - lodash: "npm:^4.17.11" - checksum: 10/27d345f69909fec7717a23bfa58fd8cfefe13997e5cc917bcd8d249cfd57e03e44a3278d6107f9024b6e959dd505bb27d95c50a71678da106ff57d0d468f0c0d - languageName: node - linkType: hard - -"@serverless/platform-client@npm:^4.3.2": - version: 4.5.1 - resolution: "@serverless/platform-client@npm:4.5.1" - dependencies: - adm-zip: "npm:^0.5.5" - archiver: "npm:^5.3.0" - axios: "npm:^1.6.2" - fast-glob: "npm:^3.2.7" - https-proxy-agent: "npm:^5.0.0" - ignore: "npm:^5.1.8" - isomorphic-ws: "npm:^4.0.1" - js-yaml: "npm:^3.14.1" - jwt-decode: "npm:^2.2.0" - minimatch: "npm:^3.0.4" - querystring: "npm:^0.2.1" - run-parallel-limit: "npm:^1.1.0" - throat: "npm:^5.0.0" - traverse: "npm:^0.6.6" - ws: "npm:^7.5.3" - checksum: 10/8751df64ecbeb78b505a36cf60ecb3e223278b01215c9ff3b947d850a90fe9ee474bbe9ed5f4c3c9d2ab455984fcf9d29551ace350f476b820e3be7341d6f68f - languageName: node - linkType: hard - -"@serverless/typescript@npm:3.21.0": - version: 3.21.0 - resolution: "@serverless/typescript@npm:3.21.0" - checksum: 10/23856d232d1b53a9f3382a5a6be28519b1a578e28cf6be25ef5d6f4a473b8066c27e1b0e5c05a99c3684d1a7f60912a6d2ffef31da920edc19f91190d732ef4d - languageName: node - linkType: hard - -"@serverless/utils@npm:^6.15.0, @serverless/utils@npm:^6.7.0, @serverless/utils@npm:^6.8.2": - version: 6.15.0 - resolution: "@serverless/utils@npm:6.15.0" - dependencies: - archive-type: "npm:^4.0.0" - chalk: "npm:^4.1.2" - ci-info: "npm:^3.8.0" - cli-progress-footer: "npm:^2.3.2" - content-disposition: "npm:^0.5.4" - d: "npm:^1.0.1" - decompress: "npm:^4.2.1" - event-emitter: "npm:^0.3.5" - ext: "npm:^1.7.0" - ext-name: "npm:^5.0.0" - file-type: "npm:^16.5.4" - filenamify: "npm:^4.3.0" - get-stream: "npm:^6.0.1" - got: "npm:^11.8.6" - inquirer: "npm:^8.2.5" - js-yaml: "npm:^4.1.0" - jwt-decode: "npm:^3.1.2" - lodash: "npm:^4.17.21" - log: "npm:^6.3.1" - log-node: "npm:^8.0.3" - make-dir: "npm:^4.0.0" - memoizee: "npm:^0.4.15" - ms: "npm:^2.1.3" - ncjsm: "npm:^4.3.2" - node-fetch: "npm:^2.6.11" - open: "npm:^8.4.2" - p-event: "npm:^4.2.0" - supports-color: "npm:^8.1.1" - timers-ext: "npm:^0.1.7" - type: "npm:^2.7.2" - uni-global: "npm:^1.0.0" - uuid: "npm:^8.3.2" - write-file-atomic: "npm:^4.0.2" - checksum: 10/061e43fac8497fa0cf15349309171c113dbb47e5e4098106dc115c2f1f6538b6655353917e76dd2b33a565d73d47fa767e74489af799a17a52e31c1000a3c0c4 - languageName: node - linkType: hard - -"@sinclair/typebox@npm:^0.27.8": - version: 0.27.8 - resolution: "@sinclair/typebox@npm:0.27.8" - checksum: 10/297f95ff77c82c54de8c9907f186076e715ff2621c5222ba50b8d40a170661c0c5242c763cba2a4791f0f91cb1d8ffa53ea1d7294570cf8cd4694c0e383e484d - languageName: node - linkType: hard - -"@sindresorhus/is@npm:^4.0.0": - version: 4.6.0 - resolution: "@sindresorhus/is@npm:4.6.0" - checksum: 10/e7f36ed72abfcd5e0355f7423a72918b9748bb1ef370a59f3e5ad8d40b728b85d63b272f65f63eec1faf417cda89dcb0aeebe94015647b6054659c1442fe5ce0 - languageName: node - linkType: hard - -"@sinonjs/commons@npm:^3.0.0": - version: 3.0.0 - resolution: "@sinonjs/commons@npm:3.0.0" - dependencies: - type-detect: "npm:4.0.8" - checksum: 10/086720ae0bc370829322df32612205141cdd44e592a8a9ca97197571f8f970352ea39d3bda75b347c43789013ddab36b34b59e40380a49bdae1c2df3aa85fe4f - languageName: node - linkType: hard - -"@sinonjs/fake-timers@npm:^10.0.2": - version: 10.3.0 - resolution: "@sinonjs/fake-timers@npm:10.3.0" - dependencies: - "@sinonjs/commons": "npm:^3.0.0" - checksum: 10/78155c7bd866a85df85e22028e046b8d46cf3e840f72260954f5e3ed5bd97d66c595524305a6841ffb3f681a08f6e5cef572a2cce5442a8a232dc29fb409b83e - languageName: node - linkType: hard - -"@smithy/abort-controller@npm:^2.2.0": - version: 2.2.0 - resolution: "@smithy/abort-controller@npm:2.2.0" - dependencies: - "@smithy/types": "npm:^2.12.0" - tslib: "npm:^2.6.2" - checksum: 10/dd4f1496a06d69fa3e1e430c432b2ee455422680ba4f9e217cbaf6a4dfb8f5bb0c3886db09e234839db94cb89db93b1c7c15a999f3320f656a0004d3c4f77d06 - languageName: node - linkType: hard - -"@smithy/config-resolver@npm:^2.2.0": - version: 2.2.0 - resolution: "@smithy/config-resolver@npm:2.2.0" - dependencies: - "@smithy/node-config-provider": "npm:^2.3.0" - "@smithy/types": "npm:^2.12.0" - "@smithy/util-config-provider": "npm:^2.3.0" - "@smithy/util-middleware": "npm:^2.2.0" - tslib: "npm:^2.6.2" - checksum: 10/a2dc144434af649845f68c862185fdf162b8161bf196887f667b67742a456a678424189193110beea13d1916fb64931b69d6632b4c3a1888e9c6adf58416c937 - languageName: node - linkType: hard - -"@smithy/core@npm:^1.4.0": - version: 1.4.0 - resolution: "@smithy/core@npm:1.4.0" - dependencies: - "@smithy/middleware-endpoint": "npm:^2.5.0" - "@smithy/middleware-retry": "npm:^2.2.0" - "@smithy/middleware-serde": "npm:^2.3.0" - "@smithy/protocol-http": "npm:^3.3.0" - "@smithy/smithy-client": "npm:^2.5.0" - "@smithy/types": "npm:^2.12.0" - "@smithy/util-middleware": "npm:^2.2.0" - tslib: "npm:^2.6.2" - checksum: 10/c8851f7347b98e09c55200fbfb634e96f6f8eff70989410eebd88965d96096b197bbf5779df938e746fc2f63e947eb6e24a17d2f36ce2dd9b799e5f16d464c31 - languageName: node - linkType: hard - -"@smithy/credential-provider-imds@npm:^2.3.0": - version: 2.3.0 - resolution: "@smithy/credential-provider-imds@npm:2.3.0" - dependencies: - "@smithy/node-config-provider": "npm:^2.3.0" - "@smithy/property-provider": "npm:^2.2.0" - "@smithy/types": "npm:^2.12.0" - "@smithy/url-parser": "npm:^2.2.0" - tslib: "npm:^2.6.2" - checksum: 10/a14bda4cc66f4e638aca83b77d1fc45c75ba6a8516655488269f095c8e035097d79c8d107e74fc61275a75abe0d62bf280f9a4d1f6b395b4972c47b98cd4e569 - languageName: node - linkType: hard - -"@smithy/eventstream-codec@npm:^2.2.0": - version: 2.2.0 - resolution: "@smithy/eventstream-codec@npm:2.2.0" - dependencies: - "@aws-crypto/crc32": "npm:3.0.0" - "@smithy/types": "npm:^2.12.0" - "@smithy/util-hex-encoding": "npm:^2.2.0" - tslib: "npm:^2.6.2" - checksum: 10/c258d9df82c574416c40795481e4accd4ccf65f065944114a8a336758ad21bd5190ba69f48e57a3cd0e4aa67af35fa4b960b58475890a64d483799739bab0a23 - languageName: node - linkType: hard - -"@smithy/eventstream-serde-browser@npm:^2.2.0": - version: 2.2.0 - resolution: "@smithy/eventstream-serde-browser@npm:2.2.0" - dependencies: - "@smithy/eventstream-serde-universal": "npm:^2.2.0" - "@smithy/types": "npm:^2.12.0" - tslib: "npm:^2.6.2" - checksum: 10/5eb7f24c813dc7d7efd9fd1498159a67767a96f85d971126daa5dc1e1d9170f1de7ddd5325b8f442a943f875a4d0e64c0ded63c5bbeb5810eb3cdaa5f7117113 - languageName: node - linkType: hard - -"@smithy/eventstream-serde-config-resolver@npm:^2.2.0": - version: 2.2.0 - resolution: "@smithy/eventstream-serde-config-resolver@npm:2.2.0" - dependencies: - "@smithy/types": "npm:^2.12.0" - tslib: "npm:^2.6.2" - checksum: 10/4006101f3a66eb3e1ac779f9b77c731ce3396b0124626b5e8f98cb327e558c65144ecb34f79dba71f7a3bcbde7f394eddd7a13a49992e6443157732d416d9c7f - languageName: node - linkType: hard - -"@smithy/eventstream-serde-node@npm:^2.2.0": - version: 2.2.0 - resolution: "@smithy/eventstream-serde-node@npm:2.2.0" - dependencies: - "@smithy/eventstream-serde-universal": "npm:^2.2.0" - "@smithy/types": "npm:^2.12.0" - tslib: "npm:^2.6.2" - checksum: 10/5f297d9f9b0a1322d251f751e4f0d19d0d3e3a5cfec14e44a4c0ed7a087f73020d3683e5c7abedf3b8e1bee313e3dc2c955e733ac27c236cd10e07c37cab8312 - languageName: node - linkType: hard - -"@smithy/eventstream-serde-universal@npm:^2.2.0": - version: 2.2.0 - resolution: "@smithy/eventstream-serde-universal@npm:2.2.0" - dependencies: - "@smithy/eventstream-codec": "npm:^2.2.0" - "@smithy/types": "npm:^2.12.0" - tslib: "npm:^2.6.2" - checksum: 10/9c4b2959b588f9a74272bfa48721bbcb23954aa51c2a3450b029fa41d393da0db77278a08e644a524044483b397688ce08b36b49a112f259cf8d62523985df5d - languageName: node - linkType: hard - -"@smithy/fetch-http-handler@npm:^2.5.0": - version: 2.5.0 - resolution: "@smithy/fetch-http-handler@npm:2.5.0" - dependencies: - "@smithy/protocol-http": "npm:^3.3.0" - "@smithy/querystring-builder": "npm:^2.2.0" - "@smithy/types": "npm:^2.12.0" - "@smithy/util-base64": "npm:^2.3.0" - tslib: "npm:^2.6.2" - checksum: 10/83283b298e05d14c35b3bd9a0f14a2f402e477ed6e28c027ea866df3187f1721464d00b7f7c1fe97bf6bdcc4dbac32f97d69a56dc602f0946e8d13f1dc364b35 - languageName: node - linkType: hard - -"@smithy/hash-node@npm:^2.2.0": - version: 2.2.0 - resolution: "@smithy/hash-node@npm:2.2.0" - dependencies: - "@smithy/types": "npm:^2.12.0" - "@smithy/util-buffer-from": "npm:^2.2.0" - "@smithy/util-utf8": "npm:^2.3.0" - tslib: "npm:^2.6.2" - checksum: 10/d39c4e37bd5af8153671c0738c8db9ed64569457e2c8f80e40ac2e355b718c33e85bab8c7f54f1a3474f43bec88a53e3d4a238cebf23a13a19db7b8ec6106f71 - languageName: node - linkType: hard - -"@smithy/invalid-dependency@npm:^2.2.0": - version: 2.2.0 - resolution: "@smithy/invalid-dependency@npm:2.2.0" - dependencies: - "@smithy/types": "npm:^2.12.0" - tslib: "npm:^2.6.2" - checksum: 10/2ef41cc2093eeff3541c7af4ee3dd173aed3982fb1c1f58fa70657fa944e661107e21d1275bb63d0914699a2e7357a0f53c884cf1155e6b5992f72ffe9077113 - languageName: node - linkType: hard - -"@smithy/is-array-buffer@npm:^2.2.0": - version: 2.2.0 - resolution: "@smithy/is-array-buffer@npm:2.2.0" - dependencies: - tslib: "npm:^2.6.2" - checksum: 10/d366743ecc7a9fc3bad21dbb3950d213c12bdd4aeb62b1265bf6cbe38309df547664ef3e51ab732e704485194f15e89d361943b0bfbe3fe1a4b3178b942913cc - languageName: node - linkType: hard - -"@smithy/middleware-content-length@npm:^2.2.0": - version: 2.2.0 - resolution: "@smithy/middleware-content-length@npm:2.2.0" - dependencies: - "@smithy/protocol-http": "npm:^3.3.0" - "@smithy/types": "npm:^2.12.0" - tslib: "npm:^2.6.2" - checksum: 10/0df67d3531a5f421d3e4c11ad8065393cdf316a6c12277867456402cd86c377cf4ad078530f083a3c713be2bd281e9c610156129734dd9ef7ed7594e8e15c658 - languageName: node - linkType: hard - -"@smithy/middleware-endpoint@npm:^2.5.0": - version: 2.5.0 - resolution: "@smithy/middleware-endpoint@npm:2.5.0" - dependencies: - "@smithy/middleware-serde": "npm:^2.3.0" - "@smithy/node-config-provider": "npm:^2.3.0" - "@smithy/shared-ini-file-loader": "npm:^2.4.0" - "@smithy/types": "npm:^2.12.0" - "@smithy/url-parser": "npm:^2.2.0" - "@smithy/util-middleware": "npm:^2.2.0" - tslib: "npm:^2.6.2" - checksum: 10/9d4ea6335671d97a58d245b5497bddbee7b44c45de49e930e9ab2685bf0e57029a5d76f61cf4390f1d336231459ef562f90d80e988ce3b272bf33aa394fcf29a - languageName: node - linkType: hard - -"@smithy/middleware-retry@npm:^2.2.0": - version: 2.2.0 - resolution: "@smithy/middleware-retry@npm:2.2.0" - dependencies: - "@smithy/node-config-provider": "npm:^2.3.0" - "@smithy/protocol-http": "npm:^3.3.0" - "@smithy/service-error-classification": "npm:^2.1.5" - "@smithy/smithy-client": "npm:^2.5.0" - "@smithy/types": "npm:^2.12.0" - "@smithy/util-middleware": "npm:^2.2.0" - "@smithy/util-retry": "npm:^2.2.0" - tslib: "npm:^2.6.2" - uuid: "npm:^8.3.2" - checksum: 10/ee534e2c5abd6838f3f30f1b71539bac3bcff21235aea6e5b9c01116e82a662b1e6cb1d04f9345b76f2c1a03766a049918cbb7f219346b61bd2af009263b9438 - languageName: node - linkType: hard - -"@smithy/middleware-serde@npm:^2.3.0": - version: 2.3.0 - resolution: "@smithy/middleware-serde@npm:2.3.0" - dependencies: - "@smithy/types": "npm:^2.12.0" - tslib: "npm:^2.6.2" - checksum: 10/dfd9c35ccf2a8d11a041d028689627763823e60cd47b3bd94c1da3b578c475f7f251557b6bc6524730a701ba7338682537de480af6337bea2cfdca01ca8a80f3 - languageName: node - linkType: hard - -"@smithy/middleware-stack@npm:^2.2.0": - version: 2.2.0 - resolution: "@smithy/middleware-stack@npm:2.2.0" - dependencies: - "@smithy/types": "npm:^2.12.0" - tslib: "npm:^2.6.2" - checksum: 10/b45e13242212ecfbb618af35063946caa53d8954ec730de2dbd42b2a9ecac11fe7f3cd58ef6e1202425fbd5e0b2088f45bd8e30253523b146a78f04062a820e1 - languageName: node - linkType: hard - -"@smithy/node-config-provider@npm:^2.3.0": - version: 2.3.0 - resolution: "@smithy/node-config-provider@npm:2.3.0" - dependencies: - "@smithy/property-provider": "npm:^2.2.0" - "@smithy/shared-ini-file-loader": "npm:^2.4.0" - "@smithy/types": "npm:^2.12.0" - tslib: "npm:^2.6.2" - checksum: 10/1add1b70f2be8b84f9814da6a998bdde603b68627d961b26daf9845552d7c485fce3e5b663479e718c89440c66f3ceea607adbcde38a844c90fbba164cc53c1e - languageName: node - linkType: hard - -"@smithy/node-http-handler@npm:^2.5.0": - version: 2.5.0 - resolution: "@smithy/node-http-handler@npm:2.5.0" - dependencies: - "@smithy/abort-controller": "npm:^2.2.0" - "@smithy/protocol-http": "npm:^3.3.0" - "@smithy/querystring-builder": "npm:^2.2.0" - "@smithy/types": "npm:^2.12.0" - tslib: "npm:^2.6.2" - checksum: 10/0ed937770ec766699d21f6e5b3560e44a666461fa2b44da75598d2c02ab9c0f22b4b251917e942e4bdc132882c193be49030d565a7dc722139ce145d9d162adf - languageName: node - linkType: hard - -"@smithy/property-provider@npm:^2.2.0": - version: 2.2.0 - resolution: "@smithy/property-provider@npm:2.2.0" - dependencies: - "@smithy/types": "npm:^2.12.0" - tslib: "npm:^2.6.2" - checksum: 10/191ddc92aa3c38fda0d95d11559823ea90436fdbb3f51fbd20eb57a63268663eed233b7bace507dd4d52a9798a52cacc8fbcd636a04f4a79816a05dd140cb997 - languageName: node - linkType: hard - -"@smithy/protocol-http@npm:^3.3.0": - version: 3.3.0 - resolution: "@smithy/protocol-http@npm:3.3.0" - dependencies: - "@smithy/types": "npm:^2.12.0" - tslib: "npm:^2.6.2" - checksum: 10/4fc882004f6aafac3a6c9110aa264e34db5421893bac046f9ee6683726c9aae49288cf776caadac0b82f2303add353f41d1a194e2cb22acc4f237722198abeb5 - languageName: node - linkType: hard - -"@smithy/querystring-builder@npm:^2.2.0": - version: 2.2.0 - resolution: "@smithy/querystring-builder@npm:2.2.0" - dependencies: - "@smithy/types": "npm:^2.12.0" - "@smithy/util-uri-escape": "npm:^2.2.0" - tslib: "npm:^2.6.2" - checksum: 10/d69b3313f0464bf3e8efaa28f94e7b14f594ea913d31f7795b8fc378ad3a2bcfeb6657fa815b9ac800ce113647aabb3ef8412bab13671db41c5139f3cd5784a8 - languageName: node - linkType: hard - -"@smithy/querystring-parser@npm:^2.2.0": - version: 2.2.0 - resolution: "@smithy/querystring-parser@npm:2.2.0" - dependencies: - "@smithy/types": "npm:^2.12.0" - tslib: "npm:^2.6.2" - checksum: 10/4e9b14f1e0c2761bd761057a5b38526c7301c6a9b3f6410ff5d5b7a0b72944521dd6d50d6322f3f36ae51dc5768d83cde2df32e56882d6b6560501d9a2617a93 - languageName: node - linkType: hard - -"@smithy/service-error-classification@npm:^2.1.5": - version: 2.1.5 - resolution: "@smithy/service-error-classification@npm:2.1.5" - dependencies: - "@smithy/types": "npm:^2.12.0" - checksum: 10/189af1ea4bcc24e4ed6bb6a221da2995a5da26db41a271dc360b7e86c52511d8ed5d7abc64027f8d523c0c2a45bf45c7fb05ecec2c3b05ca23d9a559607475d6 - languageName: node - linkType: hard - -"@smithy/shared-ini-file-loader@npm:^2.4.0": - version: 2.4.0 - resolution: "@smithy/shared-ini-file-loader@npm:2.4.0" - dependencies: - "@smithy/types": "npm:^2.12.0" - tslib: "npm:^2.6.2" - checksum: 10/63bc0ce07840100cd19d276636dac6b9261f3feabce647fae16c1fe82dbfe817e9de9603be3f8df9ac43334cce2be6ddaf1795c3e188a37971742d0a19531e33 - languageName: node - linkType: hard - -"@smithy/signature-v4@npm:^2.2.0": - version: 2.2.0 - resolution: "@smithy/signature-v4@npm:2.2.0" - dependencies: - "@smithy/eventstream-codec": "npm:^2.2.0" - "@smithy/is-array-buffer": "npm:^2.2.0" - "@smithy/types": "npm:^2.12.0" - "@smithy/util-hex-encoding": "npm:^2.2.0" - "@smithy/util-middleware": "npm:^2.2.0" - "@smithy/util-uri-escape": "npm:^2.2.0" - "@smithy/util-utf8": "npm:^2.3.0" - tslib: "npm:^2.6.2" - checksum: 10/c1d356c73d7641a9f5636e0598fcc5a7e4a06d2a464a39f1cb0a9104b8f0166291e37ee1afd158c7815d933a01d6a2ba5b08090f055d177094ac8690a58bbd93 - languageName: node - linkType: hard - -"@smithy/smithy-client@npm:^2.5.0": - version: 2.5.0 - resolution: "@smithy/smithy-client@npm:2.5.0" - dependencies: - "@smithy/middleware-endpoint": "npm:^2.5.0" - "@smithy/middleware-stack": "npm:^2.2.0" - "@smithy/protocol-http": "npm:^3.3.0" - "@smithy/types": "npm:^2.12.0" - "@smithy/util-stream": "npm:^2.2.0" - tslib: "npm:^2.6.2" - checksum: 10/ea12f139b6967d477b42b0af634861f1d4040cdeeef2cfea87c213845e202db63231a2a967048e799c756f5f84bb292cfbe90df2cec338c287d1324cff4e79f9 - languageName: node - linkType: hard - -"@smithy/types@npm:^2.12.0": - version: 2.12.0 - resolution: "@smithy/types@npm:2.12.0" - dependencies: - tslib: "npm:^2.6.2" - checksum: 10/2fb459b10d0c51d10da92e9d4b1551c1312dfb2a4739c4aeaeab703e8b35260a87ebc0c1cbb8a1deba669369ae7addab4eb81d99c70d0021b13cd26050a8c9b8 - languageName: node - linkType: hard - -"@smithy/types@npm:^2.8.0": - version: 2.8.0 - resolution: "@smithy/types@npm:2.8.0" - dependencies: - tslib: "npm:^2.5.0" - checksum: 10/802ab14632d2e6a646d4d5e3edafde1dc0a066047140367176477e35645aebb568e4086080fe2758fcf713c102eebbc3e5d7097c0f6cb5b58e7da7da3e8d714f - languageName: node - linkType: hard - -"@smithy/url-parser@npm:^2.2.0": - version: 2.2.0 - resolution: "@smithy/url-parser@npm:2.2.0" - dependencies: - "@smithy/querystring-parser": "npm:^2.2.0" - "@smithy/types": "npm:^2.12.0" - tslib: "npm:^2.6.2" - checksum: 10/85a8acd44985140fd62428927f90ba597faa3b2b3b3f9ad18333df675c669cde39d43b4c990b586cd36d7abe0b5feca9c544fda2ff3366d886a1cedcc041a5b4 - languageName: node - linkType: hard - -"@smithy/util-base64@npm:^2.3.0": - version: 2.3.0 - resolution: "@smithy/util-base64@npm:2.3.0" - dependencies: - "@smithy/util-buffer-from": "npm:^2.2.0" - "@smithy/util-utf8": "npm:^2.3.0" - tslib: "npm:^2.6.2" - checksum: 10/72da04a4cc026b8f75aa983af385669f6e2f771ded7ee4a8637efd7f33a96986fa6ca070f884abe432e25354dcef4315891e9bbc6194dd7f370e6b6ee0ee20cb - languageName: node - linkType: hard - -"@smithy/util-body-length-browser@npm:^2.2.0": - version: 2.2.0 - resolution: "@smithy/util-body-length-browser@npm:2.2.0" - dependencies: - tslib: "npm:^2.6.2" - checksum: 10/2b5fdceafec4fd4867645347d31ee464236945501446c34d5db0eab16316edba9b48dfa267067ed3dcd5c4349b0cca1c68d72e1921c4ad528f9479ee4311ad49 - languageName: node - linkType: hard - -"@smithy/util-body-length-node@npm:^2.3.0": - version: 2.3.0 - resolution: "@smithy/util-body-length-node@npm:2.3.0" - dependencies: - tslib: "npm:^2.6.2" - checksum: 10/244678838b8c926f61898ff101e3a392d9c5cea809df0589bf8fe283ff08cfe52eb090e421308ec102861f5caca7be7bae02e1a27d1a0458fdb1b613f0f72203 - languageName: node - linkType: hard - -"@smithy/util-buffer-from@npm:^2.2.0": - version: 2.2.0 - resolution: "@smithy/util-buffer-from@npm:2.2.0" - dependencies: - "@smithy/is-array-buffer": "npm:^2.2.0" - tslib: "npm:^2.6.2" - checksum: 10/53253e4e351df3c4b7907dca48a0a6ceae783e98a8e73526820b122b3047a53fd127c19f4d8301f68d852011d821da519da783de57e0b22eed57c4df5b90d089 - languageName: node - linkType: hard - -"@smithy/util-config-provider@npm:^2.3.0": - version: 2.3.0 - resolution: "@smithy/util-config-provider@npm:2.3.0" - dependencies: - tslib: "npm:^2.6.2" - checksum: 10/840a76d209f9f6e04ef116905a85a9bb5d87d2382f2348b55f2c95b66bfd60eba435b8d7aa6b16d1f856a04d15ed87092f4febd480eae83093cd0db832b7ea6b - languageName: node - linkType: hard - -"@smithy/util-defaults-mode-browser@npm:^2.2.0": - version: 2.2.0 - resolution: "@smithy/util-defaults-mode-browser@npm:2.2.0" - dependencies: - "@smithy/property-provider": "npm:^2.2.0" - "@smithy/smithy-client": "npm:^2.5.0" - "@smithy/types": "npm:^2.12.0" - bowser: "npm:^2.11.0" - tslib: "npm:^2.6.2" - checksum: 10/06def0134965de01a35ba1a814d83a464b9d752974109a306588418a643a4205a716635cd4b97a3fc80af4a74c1e82550221f6d1ebea3c8e0d7106d8647e240d - languageName: node - linkType: hard - -"@smithy/util-defaults-mode-node@npm:^2.3.0": - version: 2.3.0 - resolution: "@smithy/util-defaults-mode-node@npm:2.3.0" - dependencies: - "@smithy/config-resolver": "npm:^2.2.0" - "@smithy/credential-provider-imds": "npm:^2.3.0" - "@smithy/node-config-provider": "npm:^2.3.0" - "@smithy/property-provider": "npm:^2.2.0" - "@smithy/smithy-client": "npm:^2.5.0" - "@smithy/types": "npm:^2.12.0" - tslib: "npm:^2.6.2" - checksum: 10/2dab5c7b346b128d50ef7c4e7d80d4dbe8f7ba1578bf0ae3b78ea0c6dd6c02778e8b8c71d880163f835be6cc9ee435b55d645fd0f5cae3983765990d3115079d - languageName: node - linkType: hard - -"@smithy/util-endpoints@npm:^1.2.0": - version: 1.2.0 - resolution: "@smithy/util-endpoints@npm:1.2.0" - dependencies: - "@smithy/node-config-provider": "npm:^2.3.0" - "@smithy/types": "npm:^2.12.0" - tslib: "npm:^2.6.2" - checksum: 10/5c175e656120bb02825d07f9ca79a6319b52027cbc492a34d8a042be85d686fc9a4ff8df8544e24594e97fb33b6516a1e5ab187d5db34c852c3f30fce76e2d2d - languageName: node - linkType: hard - -"@smithy/util-hex-encoding@npm:^2.2.0": - version: 2.2.0 - resolution: "@smithy/util-hex-encoding@npm:2.2.0" - dependencies: - tslib: "npm:^2.6.2" - checksum: 10/1c98323e5837c3c3e41169f38a87d0d69e6d0fb4482593025a00de90861ab635381093dcc35c78cffde6a448b5cd885735f049a5e39375e0431a09b491935f01 - languageName: node - linkType: hard - -"@smithy/util-middleware@npm:^2.2.0": - version: 2.2.0 - resolution: "@smithy/util-middleware@npm:2.2.0" - dependencies: - "@smithy/types": "npm:^2.12.0" - tslib: "npm:^2.6.2" - checksum: 10/c6b874de71184472c7b2ca2859322bbd7bffe05d11c68a821d2831a6c79a15d5ba22366d2fd72415f636481296dffa16a2aab7b44c2106e400858be7ea0dc464 - languageName: node - linkType: hard - -"@smithy/util-retry@npm:^2.2.0": - version: 2.2.0 - resolution: "@smithy/util-retry@npm:2.2.0" - dependencies: - "@smithy/service-error-classification": "npm:^2.1.5" - "@smithy/types": "npm:^2.12.0" - tslib: "npm:^2.6.2" - checksum: 10/c55522ee8ef528c29db21d70dd8d0a5db04a5a06a437f5e55f8deea907533a4f78df93e6c22e1071116fde5efde13524459c5566830d4f8ee6e140da7ffba44b - languageName: node - linkType: hard - -"@smithy/util-stream@npm:^2.2.0": - version: 2.2.0 - resolution: "@smithy/util-stream@npm:2.2.0" - dependencies: - "@smithy/fetch-http-handler": "npm:^2.5.0" - "@smithy/node-http-handler": "npm:^2.5.0" - "@smithy/types": "npm:^2.12.0" - "@smithy/util-base64": "npm:^2.3.0" - "@smithy/util-buffer-from": "npm:^2.2.0" - "@smithy/util-hex-encoding": "npm:^2.2.0" - "@smithy/util-utf8": "npm:^2.3.0" - tslib: "npm:^2.6.2" - checksum: 10/deab9955e47833577dae9efa057feaed822d5f7dd813ad9fd5a6e332ca9c92079c8cac6e1e6e1c254495a5df0c2756ef7498f5e7e0a783b51609a384c971a7f2 + dependencies: + "@sentry/cli": "npm:^1.77.1" + webpack-sources: "npm:^2.0.0 || ^3.0.0" + checksum: 10/fc28506d72ae6eeddd9b2e1eb3e79fc7d186d902c0193cdab3367c8f10bd29ff23a50c6117d34652eb6bd35812469f2a5a2ba5180c62a4ea9b9e36f3075b3ee1 languageName: node linkType: hard -"@smithy/util-uri-escape@npm:^2.2.0": - version: 2.2.0 - resolution: "@smithy/util-uri-escape@npm:2.2.0" - dependencies: - tslib: "npm:^2.6.2" - checksum: 10/ffb93944865b2966ce101da2d484d149dc6e2a51cdecdb3b3bc3e632f936058234f3806038bef4cbc5baf762a7f09184c488ea814594492e56c68afabbb2522b +"@sinclair/typebox@npm:^0.27.8": + version: 0.27.8 + resolution: "@sinclair/typebox@npm:0.27.8" + checksum: 10/297f95ff77c82c54de8c9907f186076e715ff2621c5222ba50b8d40a170661c0c5242c763cba2a4791f0f91cb1d8ffa53ea1d7294570cf8cd4694c0e383e484d languageName: node linkType: hard -"@smithy/util-utf8@npm:^2.3.0": - version: 2.3.0 - resolution: "@smithy/util-utf8@npm:2.3.0" +"@sinonjs/commons@npm:^3.0.0": + version: 3.0.0 + resolution: "@sinonjs/commons@npm:3.0.0" dependencies: - "@smithy/util-buffer-from": "npm:^2.2.0" - tslib: "npm:^2.6.2" - checksum: 10/c766ead8dac6bc6169f4cac1cc47ef7bd86928d06255148f9528228002f669c8cc49f78dc2b9ba5d7e214d40315024a9e32c5c9130b33e20f0fe4532acd0dff5 + type-detect: "npm:4.0.8" + checksum: 10/086720ae0bc370829322df32612205141cdd44e592a8a9ca97197571f8f970352ea39d3bda75b347c43789013ddab36b34b59e40380a49bdae1c2df3aa85fe4f languageName: node linkType: hard -"@smithy/util-waiter@npm:^2.2.0": - version: 2.2.0 - resolution: "@smithy/util-waiter@npm:2.2.0" +"@sinonjs/fake-timers@npm:^10.0.2": + version: 10.3.0 + resolution: "@sinonjs/fake-timers@npm:10.3.0" dependencies: - "@smithy/abort-controller": "npm:^2.2.0" - "@smithy/types": "npm:^2.12.0" - tslib: "npm:^2.6.2" - checksum: 10/a98f99721a325717eb32eafdd6ab046c055c7f3a23455f79b92e2769e5c874bf5d1d026cabe2ec0b3545ebd0c45017b1025243920eee788d70d3bdbc205264f1 + "@sinonjs/commons": "npm:^3.0.0" + checksum: 10/78155c7bd866a85df85e22028e046b8d46cf3e840f72260954f5e3ed5bd97d66c595524305a6841ffb3f681a08f6e5cef572a2cce5442a8a232dc29fb409b83e languageName: node linkType: hard -"@snipcode/code-embed@workspace:apps/functions/code-embed": - version: 0.0.0-use.local - resolution: "@snipcode/code-embed@workspace:apps/functions/code-embed" - dependencies: - "@serverless/typescript": "npm:3.21.0" - "@snipcode/embed": "workspace:*" - "@types/aws-lambda": "npm:8.10.136" - esbuild: "npm:0.20.2" - serverless: "npm:3.22.0" - serverless-certificate-creator: "npm:1.6.0" - serverless-domain-manager: "npm:6.4.4" - serverless-esbuild: "npm:1.52.1" - serverless-offline: "npm:13.3.3" - shiki: "npm:^0.11.1" - ts-node: "npm:10.9.2" - tsconfig-paths: "npm:4.2.0" - languageName: unknown - linkType: soft - -"@snipcode/core@workspace:apps/core": +"@snipcode/backend@workspace:apps/backend": version: 0.0.0-use.local - resolution: "@snipcode/core@workspace:apps/core" - dependencies: - "@graphql-codegen/cli": "npm:5.0.2" - "@graphql-codegen/typescript": "npm:4.0.6" - "@graphql-codegen/typescript-resolvers": "npm:4.0.6" - "@graphql-tools/schema": "npm:10.0.3" - "@snipcode/domain": "workspace:*" - "@snipcode/embed": "workspace:*" - "@snipcode/logger": "workspace:*" - "@snipcode/utils": "workspace:*" - "@types/cors": "npm:2.8.17" + resolution: "@snipcode/backend@workspace:apps/backend" + dependencies: + "@apollo/server": "npm:4.10.4" + "@nestjs/apollo": "npm:12.1.0" + "@nestjs/cli": "npm:10.3.2" + "@nestjs/common": "npm:10.3.8" + "@nestjs/config": "npm:3.2.2" + "@nestjs/core": "npm:10.3.8" + "@nestjs/graphql": "npm:12.1.1" + "@nestjs/platform-express": "npm:10.3.8" + "@nestjs/schematics": "npm:10.1.1" + "@nestjs/testing": "npm:10.3.8" + "@ngneat/falso": "npm:7.2.0" + "@prisma/client": "npm:5.14.0" + "@sentry/node": "npm:8.3.0" "@types/express": "npm:4.17.21" - apollo-server-core: "npm:3.13.0" - apollo-server-express: "npm:3.13.0" - axios: "npm:1.6.8" - cors: "npm:2.8.5" - dotenv: "npm:16.4.5" - express: "npm:4.19.1" + "@types/supertest": "npm:6.0.2" + dotenv-cli: "npm:7.4.2" graphql: "npm:16.8.1" - nodemon: "npm:3.1.0" + reflect-metadata: "npm:0.2.2" + rxjs: "npm:7.8.1" + source-map-support: "npm:0.5.21" + supertest: "npm:7.0.0" + ts-loader: "npm:9.5.1" + ts-morph: "npm:22.0.0" + ts-node: "npm:10.9.2" + tsconfig-paths: "npm:4.2.0" + zod: "npm:3.23.8" languageName: unknown linkType: soft @@ -5442,12 +4489,16 @@ __metadata: resolution: "@snipcode/domain@workspace:packages/domain" dependencies: "@bugsnag/cuid": "npm:3.1.1" + "@nestjs/common": "npm:10.3.8" + "@nestjs/testing": "npm:10.3.8" "@ngneat/falso": "npm:7.2.0" "@prisma/client": "npm:5.14.0" "@snipcode/utils": "workspace:*" "@types/bcryptjs": "npm:2.4.6" - axios: "npm:1.6.8" + axios: "npm:1.7.2" bcryptjs: "npm:2.4.3" + dotenv-cli: "npm:7.4.2" + mysql2: "npm:3.10.0" nock: "npm:13.5.4" prisma: "npm:5.14.0" unique-username-generator: "npm:1.3.0" @@ -5455,7 +4506,7 @@ __metadata: languageName: unknown linkType: soft -"@snipcode/embed@workspace:*, @snipcode/embed@workspace:packages/embed": +"@snipcode/embed@workspace:packages/embed": version: 0.0.0-use.local resolution: "@snipcode/embed@workspace:packages/embed" dependencies: @@ -5496,23 +4547,14 @@ __metadata: languageName: unknown linkType: soft -"@snipcode/logger@workspace:*, @snipcode/logger@workspace:packages/logger": - version: 0.0.0-use.local - resolution: "@snipcode/logger@workspace:packages/logger" - dependencies: - "@sentry/node": "npm:7.108.0" - "@sentry/tracing": "npm:7.108.0" - winston: "npm:3.12.0" - winston-daily-rotate-file: "npm:5.0.0" - languageName: unknown - linkType: soft - "@snipcode/utils@workspace:*, @snipcode/utils@workspace:packages/utils": version: 0.0.0-use.local resolution: "@snipcode/utils@workspace:packages/utils" dependencies: + "@types/jsonwebtoken": "npm:9.0.6" "@types/uuid": "npm:9.0.8" dayjs: "npm:1.11.10" + jsonwebtoken: "npm:9.0.2" lodash: "npm:4.17.21" uuid: "npm:9.0.1" languageName: unknown @@ -5564,15 +4606,6 @@ __metadata: languageName: node linkType: hard -"@szmarczak/http-timer@npm:^4.0.5": - version: 4.0.6 - resolution: "@szmarczak/http-timer@npm:4.0.6" - dependencies: - defer-to-connect: "npm:^2.0.0" - checksum: 10/c29df3bcec6fc3bdec2b17981d89d9c9fc9bd7d0c9bcfe92821dc533f4440bc890ccde79971838b4ceed1921d456973c4180d7175ee1d0023ad0562240a58d95 - languageName: node - linkType: hard - "@tailwindcss/forms@npm:0.5.7": version: 0.5.7 resolution: "@tailwindcss/forms@npm:0.5.7" @@ -5675,13 +4708,6 @@ __metadata: languageName: node linkType: hard -"@tokenizer/token@npm:^0.3.0": - version: 0.3.0 - resolution: "@tokenizer/token@npm:0.3.0" - checksum: 10/889c1f1e63ac7c92c0ea22d4a2861142f1b43c3d92eb70ec42aa9e9851fab2e9952211d50f541b287781280df2f979bf5600a9c1f91fbc61b7fcf9994e9376a5 - languageName: node - linkType: hard - "@tootallnate/once@npm:2": version: 2.0.0 resolution: "@tootallnate/once@npm:2.0.0" @@ -5689,6 +4715,18 @@ __metadata: languageName: node linkType: hard +"@ts-morph/common@npm:~0.23.0": + version: 0.23.0 + resolution: "@ts-morph/common@npm:0.23.0" + dependencies: + fast-glob: "npm:^3.3.2" + minimatch: "npm:^9.0.3" + mkdirp: "npm:^3.0.1" + path-browserify: "npm:^1.0.1" + checksum: 10/05eabbab5a63d71a7dac17202519d23d4d4ec30780364d4dc3096ca86291e19f0284d0592a6ee89ec257204075a985d00f4788d816a89c41d0c1e0c8d281c480 + languageName: node + linkType: hard + "@tsconfig/node10@npm:^1.0.7": version: 1.0.9 resolution: "@tsconfig/node10@npm:1.0.9" @@ -5717,7 +4755,7 @@ __metadata: languageName: node linkType: hard -"@types/accepts@npm:^1.3.5": +"@types/accepts@npm:*": version: 1.3.7 resolution: "@types/accepts@npm:1.3.7" dependencies: @@ -5733,13 +4771,6 @@ __metadata: languageName: node linkType: hard -"@types/aws-lambda@npm:8.10.136": - version: 8.10.136 - resolution: "@types/aws-lambda@npm:8.10.136" - checksum: 10/df7afa66d3ee9fb3697cd81156c7f71104437d81e0bce8a16e8c6c56f176ea93c1f3cb7ed0f219936f410849b413a739c485ca8572c22fb24b46b8ecd571949a - languageName: node - linkType: hard - "@types/babel__core@npm:^7.1.14": version: 7.20.5 resolution: "@types/babel__core@npm:7.20.5" @@ -5798,34 +4829,28 @@ __metadata: languageName: node linkType: hard -"@types/body-parser@npm:1.19.2": - version: 1.19.2 - resolution: "@types/body-parser@npm:1.19.2" +"@types/connect@npm:*": + version: 3.4.38 + resolution: "@types/connect@npm:3.4.38" dependencies: - "@types/connect": "npm:*" "@types/node": "npm:*" - checksum: 10/e17840c7d747a549f00aebe72c89313d09fbc4b632b949b2470c5cb3b1cb73863901ae84d9335b567a79ec5efcfb8a28ff8e3f36bc8748a9686756b6d5681f40 + checksum: 10/7eb1bc5342a9604facd57598a6c62621e244822442976c443efb84ff745246b10d06e8b309b6e80130026a396f19bf6793b7cecd7380169f369dac3bfc46fb99 languageName: node linkType: hard -"@types/cacheable-request@npm:^6.0.1": - version: 6.0.3 - resolution: "@types/cacheable-request@npm:6.0.3" +"@types/connect@npm:3.4.36": + version: 3.4.36 + resolution: "@types/connect@npm:3.4.36" dependencies: - "@types/http-cache-semantics": "npm:*" - "@types/keyv": "npm:^3.1.4" "@types/node": "npm:*" - "@types/responselike": "npm:^1.0.0" - checksum: 10/159f9fdb2a1b7175eef453ae2ced5ea04c0d2b9610cc9ccd9f9abb066d36dacb1f37acd879ace10ad7cbb649490723feb396fb7307004c9670be29636304b988 + checksum: 10/4dee3d966fb527b98f0cbbdcf6977c9193fc3204ed539b7522fe5e64dfa45f9017bdda4ffb1f760062262fce7701a0ee1c2f6ce2e50af36c74d4e37052303172 languageName: node linkType: hard -"@types/connect@npm:*": - version: 3.4.38 - resolution: "@types/connect@npm:3.4.38" - dependencies: - "@types/node": "npm:*" - checksum: 10/7eb1bc5342a9604facd57598a6c62621e244822442976c443efb84ff745246b10d06e8b309b6e80130026a396f19bf6793b7cecd7380169f369dac3bfc46fb99 +"@types/content-disposition@npm:*": + version: 0.5.8 + resolution: "@types/content-disposition@npm:0.5.8" + checksum: 10/eeea868fb510ae7a32aa2d7de680fba79d59001f3e758a334621e10bc0a6496d3a42bb79243a5e53b9c63cb524522853ccc144fe1ab160c4247d37cdb81146c4 languageName: node linkType: hard @@ -5836,41 +4861,65 @@ __metadata: languageName: node linkType: hard -"@types/cors@npm:2.8.12": - version: 2.8.12 - resolution: "@types/cors@npm:2.8.12" - checksum: 10/8c45f112c7d1d2d831b4b266f2e6ed33a1887a35dcbfe2a18b28370751fababb7cd045e745ef84a523c33a25932678097bf79afaa367c6cb3fa0daa7a6438257 +"@types/cookiejar@npm:^2.1.5": + version: 2.1.5 + resolution: "@types/cookiejar@npm:2.1.5" + checksum: 10/04d5990e87b6387532d15a87d9ec9b2eb783039291193863751dcfd7fc723a3b3aa30ce4c06b03975cba58632e933772f1ff031af23eaa3ac7f94e71afa6e073 languageName: node linkType: hard -"@types/cors@npm:2.8.17": - version: 2.8.17 - resolution: "@types/cors@npm:2.8.17" +"@types/cookies@npm:*": + version: 0.9.0 + resolution: "@types/cookies@npm:0.9.0" dependencies: + "@types/connect": "npm:*" + "@types/express": "npm:*" + "@types/keygrip": "npm:*" "@types/node": "npm:*" - checksum: 10/469bd85e29a35977099a3745c78e489916011169a664e97c4c3d6538143b0a16e4cc72b05b407dc008df3892ed7bf595f9b7c0f1f4680e169565ee9d64966bde + checksum: 10/88d2106834fca85cf9dfef984e99bf4969e77d48538d8e8408a29679b4d1f675fe4725d35f2e38d252a336b76d14a2bc84bcb34edc72238a7a8261c0808c7c56 languageName: node linkType: hard -"@types/estree@npm:*, @types/estree@npm:1.0.5, @types/estree@npm:^1.0.0": +"@types/eslint-scope@npm:^3.7.3": + version: 3.7.7 + resolution: "@types/eslint-scope@npm:3.7.7" + dependencies: + "@types/eslint": "npm:*" + "@types/estree": "npm:*" + checksum: 10/e2889a124aaab0b89af1bab5959847c5bec09809209255de0e63b9f54c629a94781daa04adb66bffcdd742f5e25a17614fb933965093c0eea64aacda4309380e + languageName: node + linkType: hard + +"@types/eslint@npm:*": + version: 8.56.10 + resolution: "@types/eslint@npm:8.56.10" + dependencies: + "@types/estree": "npm:*" + "@types/json-schema": "npm:*" + checksum: 10/0cdd914b944ebba51c35827d3ef95bc3e16eb82b4c2741f6437fa57cdb00a4407c77f89c220afe9e4c9566982ec8a0fb9b97c956ac3bd4623a3b6af32eed8424 + languageName: node + linkType: hard + +"@types/estree@npm:*, @types/estree@npm:1.0.5, @types/estree@npm:^1.0.0, @types/estree@npm:^1.0.5": version: 1.0.5 resolution: "@types/estree@npm:1.0.5" checksum: 10/7de6d928dd4010b0e20c6919e1a6c27b61f8d4567befa89252055fad503d587ecb9a1e3eab1b1901f923964d7019796db810b7fd6430acb26c32866d126fd408 languageName: node linkType: hard -"@types/express-serve-static-core@npm:4.17.31": - version: 4.17.31 - resolution: "@types/express-serve-static-core@npm:4.17.31" +"@types/express-serve-static-core@npm:^4.17.30": + version: 4.19.1 + resolution: "@types/express-serve-static-core@npm:4.19.1" dependencies: "@types/node": "npm:*" "@types/qs": "npm:*" "@types/range-parser": "npm:*" - checksum: 10/020210f32d12fa4848d686e3acb98bc35dcec3ade16ae857e99005ac808aa07e1e1a909fdf4f1f2033159afb3eec3622811ac4cb82fa41553c714d9fa35fb77a + "@types/send": "npm:*" + checksum: 10/a400e2c6a2d64373290f0fa25fa2d70bad44fbb1d12a56237a8dfb3bf300bc102d6f5fa6aaed2ce853e37226589905ce0d658ad1b9c0115d9cd7ce446608140c languageName: node linkType: hard -"@types/express-serve-static-core@npm:^4.17.18, @types/express-serve-static-core@npm:^4.17.33": +"@types/express-serve-static-core@npm:^4.17.33": version: 4.17.41 resolution: "@types/express-serve-static-core@npm:4.17.41" dependencies: @@ -5882,19 +4931,7 @@ __metadata: languageName: node linkType: hard -"@types/express@npm:4.17.14": - version: 4.17.14 - resolution: "@types/express@npm:4.17.14" - dependencies: - "@types/body-parser": "npm:*" - "@types/express-serve-static-core": "npm:^4.17.18" - "@types/qs": "npm:*" - "@types/serve-static": "npm:*" - checksum: 10/293e53a7572ef93f70c830a0b1d620b5e16670509bb91e800393a67e7f41f170478809d862deed0edf573fc1afc3a6f7fc99ed176a28c0d8dd3f07c433f88672 - languageName: node - linkType: hard - -"@types/express@npm:4.17.21": +"@types/express@npm:*, @types/express@npm:4.17.21, @types/express@npm:^4.17.13": version: 4.17.21 resolution: "@types/express@npm:4.17.21" dependencies: @@ -5935,10 +4972,10 @@ __metadata: languageName: node linkType: hard -"@types/http-cache-semantics@npm:*": - version: 4.0.4 - resolution: "@types/http-cache-semantics@npm:4.0.4" - checksum: 10/a59566cff646025a5de396d6b3f44a39ab6a74f2ed8150692e0f31cc52f3661a68b04afe3166ebe0d566bd3259cb18522f46e949576d5204781cd6452b7fe0c5 +"@types/http-assert@npm:*": + version: 1.5.5 + resolution: "@types/http-assert@npm:1.5.5" + checksum: 10/cd6bb7fd42cc6e2a702cb55370b8b25231954ad74c04bcd185b943a74ded3d4c28099c30f77b26951df2426441baff41718816c60b5af80efe2b8888d900bf93 languageName: node linkType: hard @@ -6002,7 +5039,7 @@ __metadata: languageName: node linkType: hard -"@types/json-schema@npm:^7.0.12, @types/json-schema@npm:^7.0.9": +"@types/json-schema@npm:*, @types/json-schema@npm:^7.0.12, @types/json-schema@npm:^7.0.8, @types/json-schema@npm:^7.0.9": version: 7.0.15 resolution: "@types/json-schema@npm:7.0.15" checksum: 10/1a3c3e06236e4c4aab89499c428d585527ce50c24fe8259e8b3926d3df4cfbbbcf306cfc73ddfb66cbafc973116efd15967020b0f738f63e09e64c7d260519e7 @@ -6032,12 +5069,69 @@ __metadata: languageName: node linkType: hard -"@types/keyv@npm:^3.1.4": - version: 3.1.4 - resolution: "@types/keyv@npm:3.1.4" +"@types/jsonwebtoken@npm:9.0.6": + version: 9.0.6 + resolution: "@types/jsonwebtoken@npm:9.0.6" + dependencies: + "@types/node": "npm:*" + checksum: 10/1f2145222f62da1b3dbfc586160c4f9685782a671f4a4f4a72151c773945fe25807fd88ed1c270536b76f49053ed932c5dbf714ea0ed77f785665abb75beef05 + languageName: node + linkType: hard + +"@types/keygrip@npm:*": + version: 1.0.6 + resolution: "@types/keygrip@npm:1.0.6" + checksum: 10/d157f60bf920492347791d2b26d530d5069ce05796549fbacd4c24d66ffbebbcb0ab67b21e7a1b80a593b9fd4b67dc4843dec04c12bbc2e0fddfb8577a826c41 + languageName: node + linkType: hard + +"@types/koa-compose@npm:*": + version: 3.2.8 + resolution: "@types/koa-compose@npm:3.2.8" + dependencies: + "@types/koa": "npm:*" + checksum: 10/95c32bdee738ac7c10439bbf6342ca3b9f0aafd7e8118739eac7fb0fa703a23cfe4c88f63e13a69a16fbde702e0bcdc62b272aa734325fc8efa7e5625479752e + languageName: node + linkType: hard + +"@types/koa@npm:*": + version: 2.15.0 + resolution: "@types/koa@npm:2.15.0" + dependencies: + "@types/accepts": "npm:*" + "@types/content-disposition": "npm:*" + "@types/cookies": "npm:*" + "@types/http-assert": "npm:*" + "@types/http-errors": "npm:*" + "@types/keygrip": "npm:*" + "@types/koa-compose": "npm:*" + "@types/node": "npm:*" + checksum: 10/2be9dff1ef66bf15b037386c188893761a8fb46390a5e1d2a2031d9e1ba4473e40ddfbd625980a504bd804d7148b3e230c18e240503f33eac3b6e5e830645d30 + languageName: node + linkType: hard + +"@types/koa@npm:2.14.0": + version: 2.14.0 + resolution: "@types/koa@npm:2.14.0" dependencies: + "@types/accepts": "npm:*" + "@types/content-disposition": "npm:*" + "@types/cookies": "npm:*" + "@types/http-assert": "npm:*" + "@types/http-errors": "npm:*" + "@types/keygrip": "npm:*" + "@types/koa-compose": "npm:*" "@types/node": "npm:*" - checksum: 10/e009a2bfb50e90ca9b7c6e8f648f8464067271fd99116f881073fa6fa76dc8d0133181dd65e6614d5fb1220d671d67b0124aef7d97dc02d7e342ab143a47779d + checksum: 10/00bd0dd9f2366eabbd05a9af1c83e10679b4241e69b75927c7653826508c03e9b19b2c03499c5ff6496acbb192f5c0a860b4e95308462e945e2fb79636cbf3cf + languageName: node + linkType: hard + +"@types/koa__router@npm:12.0.3": + version: 12.0.3 + resolution: "@types/koa__router@npm:12.0.3" + dependencies: + "@types/koa": "npm:*" + checksum: 10/4608eb48867aabcd5cf3049b8115b3df9dc32cf4f5b950245dc9ab9d26055162a7deaae0f2a819f583aa21f57a66326c532a8763f82dceaf03a7e1f8cc08977d languageName: node linkType: hard @@ -6048,13 +5142,6 @@ __metadata: languageName: node linkType: hard -"@types/lodash@npm:^4.14.123": - version: 4.14.202 - resolution: "@types/lodash@npm:4.14.202" - checksum: 10/1bb9760a5b1dda120132c4b987330d67979c95dbc22612678682cd61b00302e190f4207228f3728580059cdab5582362262e3819aea59960c1017bd2b9fb26f6 - languageName: node - linkType: hard - "@types/long@npm:^4.0.0": version: 4.0.2 resolution: "@types/long@npm:4.0.2" @@ -6062,6 +5149,13 @@ __metadata: languageName: node linkType: hard +"@types/methods@npm:^1.1.4": + version: 1.1.4 + resolution: "@types/methods@npm:1.1.4" + checksum: 10/ad2a7178486f2fd167750f3eb920ab032a947ff2e26f55c86670a6038632d790b46f52e5b6ead5823f1e53fc68028f1e9ddd15cfead7903e04517c88debd72b1 + languageName: node + linkType: hard + "@types/mime@npm:*": version: 3.0.4 resolution: "@types/mime@npm:3.0.4" @@ -6083,6 +5177,25 @@ __metadata: languageName: node linkType: hard +"@types/mysql@npm:2.15.22": + version: 2.15.22 + resolution: "@types/mysql@npm:2.15.22" + dependencies: + "@types/node": "npm:*" + checksum: 10/6be0aac58fe5c0f20ebf149d2ab228c620f751569a24fda33df457e0520b3c2f071bda06973ad54815ef54b0e0fa2176e56aba96b65b5990054930f4e2b7bb4e + languageName: node + linkType: hard + +"@types/node-fetch@npm:^2.6.1": + version: 2.6.11 + resolution: "@types/node-fetch@npm:2.6.11" + dependencies: + "@types/node": "npm:*" + form-data: "npm:^4.0.0" + checksum: 10/c416df8f182ec3826278ea42557fda08f169a48a05e60722d9c8edd4e5b2076ae281c6b6601ad406035b7201f885b0257983b61c26b3f9eb0f41192a807b5de5 + languageName: node + linkType: hard + "@types/node@npm:*": version: 20.11.0 resolution: "@types/node@npm:20.11.0" @@ -6110,13 +5223,6 @@ __metadata: languageName: node linkType: hard -"@types/node@npm:^10.1.0": - version: 10.17.60 - resolution: "@types/node@npm:10.17.60" - checksum: 10/f9161493b3284b1d41d5d594c2768625acdd9e33f992f71ccde47861916e662e2ae438d2cc5f1b285053391a31b52a7564ecedc22d485610d236bfad9c7e6a1c - languageName: node - linkType: hard - "@types/node@npm:^12.7.1": version: 12.20.55 resolution: "@types/node@npm:12.20.55" @@ -6131,6 +5237,37 @@ __metadata: languageName: node linkType: hard +"@types/pg-pool@npm:2.0.4": + version: 2.0.4 + resolution: "@types/pg-pool@npm:2.0.4" + dependencies: + "@types/pg": "npm:*" + checksum: 10/5ae1c49fe1820ec011f8e2a877198a62f4c9795d2cc340dff4527c26f24ee22dffe99a8ca5cdec6edb54613bded820cc51256fb668e0eb4d22794181b94fad82 + languageName: node + linkType: hard + +"@types/pg@npm:*": + version: 8.11.6 + resolution: "@types/pg@npm:8.11.6" + dependencies: + "@types/node": "npm:*" + pg-protocol: "npm:*" + pg-types: "npm:^4.0.1" + checksum: 10/4eb22d42c5363abf58b1be0104e01332a0928e9dce8571ad136ce3e256c16dd97343a17c29066e4f390ed366548cca0bda55ff48b495ee4c1d70d123cc75edf6 + languageName: node + linkType: hard + +"@types/pg@npm:8.6.1": + version: 8.6.1 + resolution: "@types/pg@npm:8.6.1" + dependencies: + "@types/node": "npm:*" + pg-protocol: "npm:*" + pg-types: "npm:^2.2.0" + checksum: 10/bf1134ea194ad9cb8bfe0aab7a532713c63bae1d95909fa45e8dc1945e44ede74f2d4c5b2cd2f9712c6b970896929e0d82480f9c9da79addf405c089b590e562 + languageName: node + linkType: hard + "@types/prop-types@npm:*": version: 15.7.11 resolution: "@types/prop-types@npm:15.7.11" @@ -6192,22 +5329,6 @@ __metadata: languageName: node linkType: hard -"@types/responselike@npm:^1.0.0": - version: 1.0.3 - resolution: "@types/responselike@npm:1.0.3" - dependencies: - "@types/node": "npm:*" - checksum: 10/6ac4b35723429b11b117e813c7acc42c3af8b5554caaf1fc750404c1ae59f9b7376bc69b9e9e194a5a97357a597c2228b7173d317320f0360d617b6425212f58 - languageName: node - linkType: hard - -"@types/retry@npm:0.12.2": - version: 0.12.2 - resolution: "@types/retry@npm:0.12.2" - checksum: 10/e5675035717b39ce4f42f339657cae9637cf0c0051cf54314a6a2c44d38d91f6544be9ddc0280587789b6afd056be5d99dbe3e9f4df68c286c36321579b1bf4a - languageName: node - linkType: hard - "@types/scheduler@npm:*": version: 0.16.8 resolution: "@types/scheduler@npm:0.16.8" @@ -6243,6 +5364,13 @@ __metadata: languageName: node linkType: hard +"@types/shimmer@npm:^1.0.2": + version: 1.0.5 + resolution: "@types/shimmer@npm:1.0.5" + checksum: 10/f6b0c950dc9187464c5393faf4f4e2b7b44b16665bb49196da28affecceb4fdcd9749af15cbe50f1a2de39f3a84b7523e73445f117f6b48bdbd61b892568364a + languageName: node + linkType: hard + "@types/stack-utils@npm:^2.0.0": version: 2.0.3 resolution: "@types/stack-utils@npm:2.0.3" @@ -6250,6 +5378,27 @@ __metadata: languageName: node linkType: hard +"@types/superagent@npm:^8.1.0": + version: 8.1.7 + resolution: "@types/superagent@npm:8.1.7" + dependencies: + "@types/cookiejar": "npm:^2.1.5" + "@types/methods": "npm:^1.1.4" + "@types/node": "npm:*" + checksum: 10/40e34f3c6d928a9d08736998f6851ac7c604583272ace8983e90875bcc64ba7783a7092c1423951b15bd5d3968defd3559c79834ca01b61143756cf2883b8131 + languageName: node + linkType: hard + +"@types/supertest@npm:6.0.2": + version: 6.0.2 + resolution: "@types/supertest@npm:6.0.2" + dependencies: + "@types/methods": "npm:^1.1.4" + "@types/superagent": "npm:^8.1.0" + checksum: 10/4b67fb2d1bfbb7ff0a7dfaaf190cdf2e0014522615fb2dc53c214bdac95b4ee42696dd1df13332c90a7765cc52934c9cc0c428bf0f9e8189167aef01042e7448 + languageName: node + linkType: hard + "@types/tough-cookie@npm:*": version: 4.0.5 resolution: "@types/tough-cookie@npm:4.0.5" @@ -6257,13 +5406,6 @@ __metadata: languageName: node linkType: hard -"@types/triple-beam@npm:^1.3.2": - version: 1.3.5 - resolution: "@types/triple-beam@npm:1.3.5" - checksum: 10/519b6a1b30d4571965c9706ad5400a200b94e4050feca3e7856e3ea7ac00ec9903e32e9a10e2762d0f7e472d5d03e5f4b29c16c0bd8c1f77c8876c683b2231f1 - languageName: node - linkType: hard - "@types/uuid@npm:9.0.8": version: 9.0.8 resolution: "@types/uuid@npm:9.0.8" @@ -6527,40 +5669,191 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/visitor-keys@npm:5.62.0": - version: 5.62.0 - resolution: "@typescript-eslint/visitor-keys@npm:5.62.0" +"@typescript-eslint/visitor-keys@npm:5.62.0": + version: 5.62.0 + resolution: "@typescript-eslint/visitor-keys@npm:5.62.0" + dependencies: + "@typescript-eslint/types": "npm:5.62.0" + eslint-visitor-keys: "npm:^3.3.0" + checksum: 10/dc613ab7569df9bbe0b2ca677635eb91839dfb2ca2c6fa47870a5da4f160db0b436f7ec0764362e756d4164e9445d49d5eb1ff0b87f4c058946ae9d8c92eb388 + languageName: node + linkType: hard + +"@typescript-eslint/visitor-keys@npm:6.21.0": + version: 6.21.0 + resolution: "@typescript-eslint/visitor-keys@npm:6.21.0" + dependencies: + "@typescript-eslint/types": "npm:6.21.0" + eslint-visitor-keys: "npm:^3.4.1" + checksum: 10/30422cdc1e2ffad203df40351a031254b272f9c6f2b7e02e9bfa39e3fc2c7b1c6130333b0057412968deda17a3a68a578a78929a8139c6acef44d9d841dc72e1 + languageName: node + linkType: hard + +"@typescript-eslint/visitor-keys@npm:7.3.1": + version: 7.3.1 + resolution: "@typescript-eslint/visitor-keys@npm:7.3.1" + dependencies: + "@typescript-eslint/types": "npm:7.3.1" + eslint-visitor-keys: "npm:^3.4.1" + checksum: 10/163a93597c1d696920a19b3c1627d02368bdd52059f811c0fadd680c38034bb6418ebefe99d8ce26e0dd44ae184f18fab186af775de1a8771256be1a7905c174 + languageName: node + linkType: hard + +"@ungap/structured-clone@npm:^1.2.0": + version: 1.2.0 + resolution: "@ungap/structured-clone@npm:1.2.0" + checksum: 10/c6fe89a505e513a7592e1438280db1c075764793a2397877ff1351721fe8792a966a5359769e30242b3cd023f2efb9e63ca2ca88019d73b564488cc20e3eab12 + languageName: node + linkType: hard + +"@webassemblyjs/ast@npm:1.12.1, @webassemblyjs/ast@npm:^1.11.5": + version: 1.12.1 + resolution: "@webassemblyjs/ast@npm:1.12.1" + dependencies: + "@webassemblyjs/helper-numbers": "npm:1.11.6" + "@webassemblyjs/helper-wasm-bytecode": "npm:1.11.6" + checksum: 10/a775b0559437ae122d14fec0cfe59fdcaf5ca2d8ff48254014fd05d6797e20401e0f1518e628f9b06819aa085834a2534234977f9608b3f2e51f94b6e8b0bc43 + languageName: node + linkType: hard + +"@webassemblyjs/floating-point-hex-parser@npm:1.11.6": + version: 1.11.6 + resolution: "@webassemblyjs/floating-point-hex-parser@npm:1.11.6" + checksum: 10/29b08758841fd8b299c7152eda36b9eb4921e9c584eb4594437b5cd90ed6b920523606eae7316175f89c20628da14326801090167cc7fbffc77af448ac84b7e2 + languageName: node + linkType: hard + +"@webassemblyjs/helper-api-error@npm:1.11.6": + version: 1.11.6 + resolution: "@webassemblyjs/helper-api-error@npm:1.11.6" + checksum: 10/e8563df85161096343008f9161adb138a6e8f3c2cc338d6a36011aa55eabb32f2fd138ffe63bc278d009ada001cc41d263dadd1c0be01be6c2ed99076103689f + languageName: node + linkType: hard + +"@webassemblyjs/helper-buffer@npm:1.12.1": + version: 1.12.1 + resolution: "@webassemblyjs/helper-buffer@npm:1.12.1" + checksum: 10/1d8705daa41f4d22ef7c6d422af4c530b84d69d0c253c6db5adec44d511d7caa66837803db5b1addcea611a1498fd5a67d2cf318b057a916283ae41ffb85ba8a + languageName: node + linkType: hard + +"@webassemblyjs/helper-numbers@npm:1.11.6": + version: 1.11.6 + resolution: "@webassemblyjs/helper-numbers@npm:1.11.6" + dependencies: + "@webassemblyjs/floating-point-hex-parser": "npm:1.11.6" + "@webassemblyjs/helper-api-error": "npm:1.11.6" + "@xtuc/long": "npm:4.2.2" + checksum: 10/9ffd258ad809402688a490fdef1fd02222f20cdfe191c895ac215a331343292164e5033dbc0347f0f76f2447865c0b5c2d2e3304ee948d44f7aa27857028fd08 + languageName: node + linkType: hard + +"@webassemblyjs/helper-wasm-bytecode@npm:1.11.6": + version: 1.11.6 + resolution: "@webassemblyjs/helper-wasm-bytecode@npm:1.11.6" + checksum: 10/4ebf03e9c1941288c10e94e0f813f413f972bfaa1f09be2cc2e5577f300430906b61aa24d52f5ef2f894e8e24e61c6f7c39871d7e3d98bc69460e1b8e00bb20b + languageName: node + linkType: hard + +"@webassemblyjs/helper-wasm-section@npm:1.12.1": + version: 1.12.1 + resolution: "@webassemblyjs/helper-wasm-section@npm:1.12.1" + dependencies: + "@webassemblyjs/ast": "npm:1.12.1" + "@webassemblyjs/helper-buffer": "npm:1.12.1" + "@webassemblyjs/helper-wasm-bytecode": "npm:1.11.6" + "@webassemblyjs/wasm-gen": "npm:1.12.1" + checksum: 10/e91e6b28114e35321934070a2db8973a08a5cd9c30500b817214c683bbf5269ed4324366dd93ad83bf2fba0d671ac8f39df1c142bf58f70c57a827eeba4a3d2f + languageName: node + linkType: hard + +"@webassemblyjs/ieee754@npm:1.11.6": + version: 1.11.6 + resolution: "@webassemblyjs/ieee754@npm:1.11.6" + dependencies: + "@xtuc/ieee754": "npm:^1.2.0" + checksum: 10/13574b8e41f6ca39b700e292d7edf102577db5650fe8add7066a320aa4b7a7c09a5056feccac7a74eb68c10dea9546d4461412af351f13f6b24b5f32379b49de + languageName: node + linkType: hard + +"@webassemblyjs/leb128@npm:1.11.6": + version: 1.11.6 + resolution: "@webassemblyjs/leb128@npm:1.11.6" + dependencies: + "@xtuc/long": "npm:4.2.2" + checksum: 10/ec3b72db0e7ce7908fe08ec24395bfc97db486063824c0edc580f0973a4cfbadf30529569d9c7db663a56513e45b94299cca03be9e1992ea3308bb0744164f3d + languageName: node + linkType: hard + +"@webassemblyjs/utf8@npm:1.11.6": + version: 1.11.6 + resolution: "@webassemblyjs/utf8@npm:1.11.6" + checksum: 10/361a537bd604101b320a5604c3c96d1038d83166f1b9fb86cedadc7e81bae54c3785ae5d90bf5b1842f7da08194ccaf0f44a64fcca0cbbd6afe1a166196986d6 + languageName: node + linkType: hard + +"@webassemblyjs/wasm-edit@npm:^1.11.5": + version: 1.12.1 + resolution: "@webassemblyjs/wasm-edit@npm:1.12.1" dependencies: - "@typescript-eslint/types": "npm:5.62.0" - eslint-visitor-keys: "npm:^3.3.0" - checksum: 10/dc613ab7569df9bbe0b2ca677635eb91839dfb2ca2c6fa47870a5da4f160db0b436f7ec0764362e756d4164e9445d49d5eb1ff0b87f4c058946ae9d8c92eb388 + "@webassemblyjs/ast": "npm:1.12.1" + "@webassemblyjs/helper-buffer": "npm:1.12.1" + "@webassemblyjs/helper-wasm-bytecode": "npm:1.11.6" + "@webassemblyjs/helper-wasm-section": "npm:1.12.1" + "@webassemblyjs/wasm-gen": "npm:1.12.1" + "@webassemblyjs/wasm-opt": "npm:1.12.1" + "@webassemblyjs/wasm-parser": "npm:1.12.1" + "@webassemblyjs/wast-printer": "npm:1.12.1" + checksum: 10/5678ae02dbebba2f3a344e25928ea5a26a0df777166c9be77a467bfde7aca7f4b57ef95587e4bd768a402cdf2fddc4c56f0a599d164cdd9fe313520e39e18137 languageName: node linkType: hard -"@typescript-eslint/visitor-keys@npm:6.21.0": - version: 6.21.0 - resolution: "@typescript-eslint/visitor-keys@npm:6.21.0" +"@webassemblyjs/wasm-gen@npm:1.12.1": + version: 1.12.1 + resolution: "@webassemblyjs/wasm-gen@npm:1.12.1" dependencies: - "@typescript-eslint/types": "npm:6.21.0" - eslint-visitor-keys: "npm:^3.4.1" - checksum: 10/30422cdc1e2ffad203df40351a031254b272f9c6f2b7e02e9bfa39e3fc2c7b1c6130333b0057412968deda17a3a68a578a78929a8139c6acef44d9d841dc72e1 + "@webassemblyjs/ast": "npm:1.12.1" + "@webassemblyjs/helper-wasm-bytecode": "npm:1.11.6" + "@webassemblyjs/ieee754": "npm:1.11.6" + "@webassemblyjs/leb128": "npm:1.11.6" + "@webassemblyjs/utf8": "npm:1.11.6" + checksum: 10/ec45bd50e86bc9856f80fe9af4bc1ae5c98fb85f57023d11dff2b670da240c47a7b1b9b6c89755890314212bd167cf3adae7f1157216ddffb739a4ce589fc338 languageName: node linkType: hard -"@typescript-eslint/visitor-keys@npm:7.3.1": - version: 7.3.1 - resolution: "@typescript-eslint/visitor-keys@npm:7.3.1" +"@webassemblyjs/wasm-opt@npm:1.12.1": + version: 1.12.1 + resolution: "@webassemblyjs/wasm-opt@npm:1.12.1" dependencies: - "@typescript-eslint/types": "npm:7.3.1" - eslint-visitor-keys: "npm:^3.4.1" - checksum: 10/163a93597c1d696920a19b3c1627d02368bdd52059f811c0fadd680c38034bb6418ebefe99d8ce26e0dd44ae184f18fab186af775de1a8771256be1a7905c174 + "@webassemblyjs/ast": "npm:1.12.1" + "@webassemblyjs/helper-buffer": "npm:1.12.1" + "@webassemblyjs/wasm-gen": "npm:1.12.1" + "@webassemblyjs/wasm-parser": "npm:1.12.1" + checksum: 10/21f25ae109012c49bb084e09f3b67679510429adc3e2408ad3621b2b505379d9cce337799a7919ef44db64e0d136833216914aea16b0d4856f353b9778e0cdb7 languageName: node linkType: hard -"@ungap/structured-clone@npm:^1.2.0": - version: 1.2.0 - resolution: "@ungap/structured-clone@npm:1.2.0" - checksum: 10/c6fe89a505e513a7592e1438280db1c075764793a2397877ff1351721fe8792a966a5359769e30242b3cd023f2efb9e63ca2ca88019d73b564488cc20e3eab12 +"@webassemblyjs/wasm-parser@npm:1.12.1, @webassemblyjs/wasm-parser@npm:^1.11.5": + version: 1.12.1 + resolution: "@webassemblyjs/wasm-parser@npm:1.12.1" + dependencies: + "@webassemblyjs/ast": "npm:1.12.1" + "@webassemblyjs/helper-api-error": "npm:1.11.6" + "@webassemblyjs/helper-wasm-bytecode": "npm:1.11.6" + "@webassemblyjs/ieee754": "npm:1.11.6" + "@webassemblyjs/leb128": "npm:1.11.6" + "@webassemblyjs/utf8": "npm:1.11.6" + checksum: 10/f7311685b76c3e1def2abea3488be1e77f06ecd8633143a6c5c943ca289660952b73785231bb76a010055ca64645227a4bc79705c26ab7536216891b6bb36320 + languageName: node + linkType: hard + +"@webassemblyjs/wast-printer@npm:1.12.1": + version: 1.12.1 + resolution: "@webassemblyjs/wast-printer@npm:1.12.1" + dependencies: + "@webassemblyjs/ast": "npm:1.12.1" + "@xtuc/long": "npm:4.2.2" + checksum: 10/1a6a4b6bc4234f2b5adbab0cb11a24911b03380eb1cab6fb27a2250174a279fdc6aa2f5a9cf62dd1f6d4eb39f778f488e8ff15b9deb0670dee5c5077d46cf572 languageName: node linkType: hard @@ -6672,6 +5965,20 @@ __metadata: languageName: node linkType: hard +"@xtuc/ieee754@npm:^1.2.0": + version: 1.2.0 + resolution: "@xtuc/ieee754@npm:1.2.0" + checksum: 10/ab033b032927d77e2f9fa67accdf31b1ca7440974c21c9cfabc8349e10ca2817646171c4f23be98d0e31896d6c2c3462a074fe37752e523abc3e45c79254259c + languageName: node + linkType: hard + +"@xtuc/long@npm:4.2.2": + version: 4.2.2 + resolution: "@xtuc/long@npm:4.2.2" + checksum: 10/7217bae9fe240e0d804969e7b2af11cb04ec608837c78b56ca88831991b287e232a0b7fce8d548beaff42aaf0197ffa471d81be6ac4c4e53b0148025a2c076ec + languageName: node + linkType: hard + "@zeit/schemas@npm:2.29.0": version: 2.29.0 resolution: "@zeit/schemas@npm:2.29.0" @@ -6712,7 +6019,7 @@ __metadata: languageName: node linkType: hard -"accepts@npm:^1.3.5, accepts@npm:~1.3.5, accepts@npm:~1.3.8": +"accepts@npm:~1.3.5, accepts@npm:~1.3.8": version: 1.3.8 resolution: "accepts@npm:1.3.8" dependencies: @@ -6732,6 +6039,24 @@ __metadata: languageName: node linkType: hard +"acorn-import-assertions@npm:^1.9.0": + version: 1.9.0 + resolution: "acorn-import-assertions@npm:1.9.0" + peerDependencies: + acorn: ^8 + checksum: 10/af8dd58f6b0c6a43e85849744534b99f2133835c6fcdabda9eea27d0a0da625a0d323c4793ba7cb25cf4507609d0f747c210ccc2fc9b5866de04b0e59c9c5617 + languageName: node + linkType: hard + +"acorn-import-attributes@npm:^1.9.5": + version: 1.9.5 + resolution: "acorn-import-attributes@npm:1.9.5" + peerDependencies: + acorn: ^8 + checksum: 10/8bfbfbb6e2467b9b47abb4d095df717ab64fce2525da65eabee073e85e7975fb3a176b6c8bba17c99a7d8ede283a10a590272304eb54a93c4aa1af9790d47a8b + languageName: node + linkType: hard + "acorn-jsx@npm:^5.2.0, acorn-jsx@npm:^5.3.2": version: 5.3.2 resolution: "acorn-jsx@npm:5.3.2" @@ -6741,7 +6066,7 @@ __metadata: languageName: node linkType: hard -"acorn-walk@npm:^8.0.2, acorn-walk@npm:^8.1.1, acorn-walk@npm:^8.2.0": +"acorn-walk@npm:^8.0.2, acorn-walk@npm:^8.1.1": version: 8.3.2 resolution: "acorn-walk@npm:8.3.2" checksum: 10/57dbe2fd8cf744f562431775741c5c087196cd7a65ce4ccb3f3981cdfad25cd24ad2bad404997b88464ac01e789a0a61e5e355b2a84876f13deef39fb39686ca @@ -6757,7 +6082,7 @@ __metadata: languageName: node linkType: hard -"acorn@npm:^8.1.0, acorn@npm:^8.4.1, acorn@npm:^8.8.1, acorn@npm:^8.9.0": +"acorn@npm:^8.1.0, acorn@npm:^8.4.1, acorn@npm:^8.7.1, acorn@npm:^8.8.1, acorn@npm:^8.8.2, acorn@npm:^8.9.0": version: 8.11.3 resolution: "acorn@npm:8.11.3" bin: @@ -6766,13 +6091,6 @@ __metadata: languageName: node linkType: hard -"adm-zip@npm:^0.5.5": - version: 0.5.10 - resolution: "adm-zip@npm:0.5.10" - checksum: 10/c5ab79b77114d8277f0cbfd6cca830198d6c7ee4971f6960f48e08cd2375953b11dc71729b7f396abd51d2d6cce8c862fad185ea90cb2c84ab5161c37ed1b099 - languageName: node - linkType: hard - "agent-base@npm:6": version: 6.0.2 resolution: "agent-base@npm:6.0.2" @@ -6801,7 +6119,7 @@ __metadata: languageName: node linkType: hard -"ajv-formats@npm:^2.1.1": +"ajv-formats@npm:2.1.1": version: 2.1.1 resolution: "ajv-formats@npm:2.1.1" dependencies: @@ -6815,6 +6133,15 @@ __metadata: languageName: node linkType: hard +"ajv-keywords@npm:^3.5.2": + version: 3.5.2 + resolution: "ajv-keywords@npm:3.5.2" + peerDependencies: + ajv: ^6.9.1 + checksum: 10/d57c9d5bf8849bddcbd801b79bc3d2ddc736c2adb6b93a6a365429589dd7993ddbd5d37c6025ed6a7f89c27506b80131d5345c5b1fa6a97e40cd10a96bcd228c + languageName: node + linkType: hard + "ajv@npm:8.11.0": version: 8.11.0 resolution: "ajv@npm:8.11.0" @@ -6827,27 +6154,27 @@ __metadata: languageName: node linkType: hard -"ajv@npm:^6.12.4": - version: 6.12.6 - resolution: "ajv@npm:6.12.6" +"ajv@npm:8.12.0, ajv@npm:^8.0.0, ajv@npm:^8.11.0": + version: 8.12.0 + resolution: "ajv@npm:8.12.0" dependencies: fast-deep-equal: "npm:^3.1.1" - fast-json-stable-stringify: "npm:^2.0.0" - json-schema-traverse: "npm:^0.4.1" + json-schema-traverse: "npm:^1.0.0" + require-from-string: "npm:^2.0.2" uri-js: "npm:^4.2.2" - checksum: 10/48d6ad21138d12eb4d16d878d630079a2bda25a04e745c07846a4ad768319533031e28872a9b3c5790fa1ec41aabdf2abed30a56e5a03ebc2cf92184b8ee306c + checksum: 10/b406f3b79b5756ac53bfe2c20852471b08e122bc1ee4cde08ae4d6a800574d9cd78d60c81c69c63ff81e4da7cd0b638fafbb2303ae580d49cf1600b9059efb85 languageName: node linkType: hard -"ajv@npm:^8.0.0, ajv@npm:^8.11.0": - version: 8.12.0 - resolution: "ajv@npm:8.12.0" +"ajv@npm:^6.12.4, ajv@npm:^6.12.5": + version: 6.12.6 + resolution: "ajv@npm:6.12.6" dependencies: fast-deep-equal: "npm:^3.1.1" - json-schema-traverse: "npm:^1.0.0" - require-from-string: "npm:^2.0.2" + fast-json-stable-stringify: "npm:^2.0.0" + json-schema-traverse: "npm:^0.4.1" uri-js: "npm:^4.2.2" - checksum: 10/b406f3b79b5756ac53bfe2c20852471b08e122bc1ee4cde08ae4d6a800574d9cd78d60c81c69c63ff81e4da7cd0b638fafbb2303ae580d49cf1600b9059efb85 + checksum: 10/48d6ad21138d12eb4d16d878d630079a2bda25a04e745c07846a4ad768319533031e28872a9b3c5790fa1ec41aabdf2abed30a56e5a03ebc2cf92184b8ee306c languageName: node linkType: hard @@ -6860,14 +6187,14 @@ __metadata: languageName: node linkType: hard -"ansi-colors@npm:^4.1.1, ansi-colors@npm:^4.1.3": +"ansi-colors@npm:4.1.3, ansi-colors@npm:^4.1.1, ansi-colors@npm:^4.1.3": version: 4.1.3 resolution: "ansi-colors@npm:4.1.3" checksum: 10/43d6e2fc7b1c6e4dc373de708ee76311ec2e0433e7e8bd3194e7ff123ea6a747428fc61afdcf5969da5be3a5f0fd054602bec56fc0ebe249ce2fcde6e649e3c2 languageName: node linkType: hard -"ansi-escapes@npm:^4.2.1, ansi-escapes@npm:^4.3.0": +"ansi-escapes@npm:^4.2.1, ansi-escapes@npm:^4.3.0, ansi-escapes@npm:^4.3.2": version: 4.3.2 resolution: "ansi-escapes@npm:4.3.2" dependencies: @@ -6936,7 +6263,7 @@ __metadata: languageName: node linkType: hard -"anymatch@npm:^3.0.3, anymatch@npm:^3.1.3, anymatch@npm:~3.1.2": +"anymatch@npm:^3.0.3, anymatch@npm:~3.1.2": version: 3.1.3 resolution: "anymatch@npm:3.1.3" dependencies: @@ -6946,120 +6273,10 @@ __metadata: languageName: node linkType: hard -"apollo-datasource@npm:^3.3.2": - version: 3.3.2 - resolution: "apollo-datasource@npm:3.3.2" - dependencies: - "@apollo/utils.keyvaluecache": "npm:^1.0.1" - apollo-server-env: "npm:^4.2.1" - checksum: 10/70244e792655b357213b92e9dd0e8ca553724857847c9bedb53a1dbf7a92fc0d8b05a60d77203d6c30331599b44c5d7cc5f4d94c934465fa05b146b681ed2293 - languageName: node - linkType: hard - -"apollo-reporting-protobuf@npm:^3.4.0": - version: 3.4.0 - resolution: "apollo-reporting-protobuf@npm:3.4.0" - dependencies: - "@apollo/protobufjs": "npm:1.2.6" - checksum: 10/d6c731c1e07f952770166c71222a34ea97dd90f4b1d74f3261caa1542e1fb81a591c74586cd973c28c12e8bb9aa54ff0de411698f2311978f7144f98258c1a0b - languageName: node - linkType: hard - -"apollo-server-core@npm:3.13.0, apollo-server-core@npm:^3.13.0": - version: 3.13.0 - resolution: "apollo-server-core@npm:3.13.0" - dependencies: - "@apollo/utils.keyvaluecache": "npm:^1.0.1" - "@apollo/utils.logger": "npm:^1.0.0" - "@apollo/utils.usagereporting": "npm:^1.0.0" - "@apollographql/apollo-tools": "npm:^0.5.3" - "@apollographql/graphql-playground-html": "npm:1.6.29" - "@graphql-tools/mock": "npm:^8.1.2" - "@graphql-tools/schema": "npm:^8.0.0" - "@josephg/resolvable": "npm:^1.0.0" - apollo-datasource: "npm:^3.3.2" - apollo-reporting-protobuf: "npm:^3.4.0" - apollo-server-env: "npm:^4.2.1" - apollo-server-errors: "npm:^3.3.1" - apollo-server-plugin-base: "npm:^3.7.2" - apollo-server-types: "npm:^3.8.0" - async-retry: "npm:^1.2.1" - fast-json-stable-stringify: "npm:^2.1.0" - graphql-tag: "npm:^2.11.0" - loglevel: "npm:^1.6.8" - lru-cache: "npm:^6.0.0" - node-abort-controller: "npm:^3.0.1" - sha.js: "npm:^2.4.11" - uuid: "npm:^9.0.0" - whatwg-mimetype: "npm:^3.0.0" - peerDependencies: - graphql: ^15.3.0 || ^16.0.0 - checksum: 10/7d0c7d712a2f3d70b08d4d0b303d73b9ccaf5edfa9de324724332f0949b51ff1da29fa720e598390843d27eeb73ae66978f49c130b3cf582b0851d1c58c8c44f - languageName: node - linkType: hard - -"apollo-server-env@npm:^4.2.1": - version: 4.2.1 - resolution: "apollo-server-env@npm:4.2.1" - dependencies: - node-fetch: "npm:^2.6.7" - checksum: 10/9172288c89c2ebb2a02d58542f807896de1ca0ba80c430f09242f2fa9ece40d7ecb8f9527357ba5e1d9997c64c364e7a9716e4f5485c5fb4938f69627bf1cea4 - languageName: node - linkType: hard - -"apollo-server-errors@npm:^3.3.1": - version: 3.3.1 - resolution: "apollo-server-errors@npm:3.3.1" - peerDependencies: - graphql: ^15.3.0 || ^16.0.0 - checksum: 10/5090af0280e40ce9b3b042fca6bd195d84c8507d8fe0b16b7fd52501b8f88cb2b5cca99882a9c5253f04c78b94ff2d350eb148867e20b0ddd6211071bb17f553 - languageName: node - linkType: hard - -"apollo-server-express@npm:3.13.0": - version: 3.13.0 - resolution: "apollo-server-express@npm:3.13.0" - dependencies: - "@types/accepts": "npm:^1.3.5" - "@types/body-parser": "npm:1.19.2" - "@types/cors": "npm:2.8.12" - "@types/express": "npm:4.17.14" - "@types/express-serve-static-core": "npm:4.17.31" - accepts: "npm:^1.3.5" - apollo-server-core: "npm:^3.13.0" - apollo-server-types: "npm:^3.8.0" - body-parser: "npm:^1.19.0" - cors: "npm:^2.8.5" - parseurl: "npm:^1.3.3" - peerDependencies: - express: ^4.17.1 - graphql: ^15.3.0 || ^16.0.0 - checksum: 10/0699c87d7016e31c1a3c30bc790820e32337d6269439b7817388459d5001ca018556005ec7982a7c414898ec5122b384be102eac5df70fd2df703989eb9d2ab5 - languageName: node - linkType: hard - -"apollo-server-plugin-base@npm:^3.7.2": - version: 3.7.2 - resolution: "apollo-server-plugin-base@npm:3.7.2" - dependencies: - apollo-server-types: "npm:^3.8.0" - peerDependencies: - graphql: ^15.3.0 || ^16.0.0 - checksum: 10/b2599f51e66dce930208c1c6f6b4394e3bde6c635e971a80d677b33e7d3d6c2050453ede99bde66281e4d6d6675094b6fb50a5ec30d16e04bee13d7570ad2715 - languageName: node - linkType: hard - -"apollo-server-types@npm:^3.8.0": - version: 3.8.0 - resolution: "apollo-server-types@npm:3.8.0" - dependencies: - "@apollo/utils.keyvaluecache": "npm:^1.0.1" - "@apollo/utils.logger": "npm:^1.0.0" - apollo-reporting-protobuf: "npm:^3.4.0" - apollo-server-env: "npm:^4.2.1" - peerDependencies: - graphql: ^15.3.0 || ^16.0.0 - checksum: 10/c802fecba27ff5f0b45fc4a3d6c88e18c39c6e5ba5785db067588d4e0c7d56aba6f4dc69171b07ac6348e9e313b036c57c178af58b8b3414331517e0b280324e +"append-field@npm:^1.0.0": + version: 1.0.0 + resolution: "append-field@npm:1.0.0" + checksum: 10/afb50f5ff668af1cb66bc5cfebb55ed9a1d99e24901782ee83d00aed1a499835f9375a149cf27b17f79595ecfcc3d1de0cd5b020b210a5359c43eaf607c217de languageName: node linkType: hard @@ -7070,66 +6287,6 @@ __metadata: languageName: node linkType: hard -"archive-type@npm:^4.0.0": - version: 4.0.0 - resolution: "archive-type@npm:4.0.0" - dependencies: - file-type: "npm:^4.2.0" - checksum: 10/271f0d118294dd0305831f0700b635e8a9475f97693212d548eee48017f917e14349a25ad578f8e13486ba4b7cde1972d53e613d980e8738cfccea5fc626c76f - languageName: node - linkType: hard - -"archiver-utils@npm:^2.1.0": - version: 2.1.0 - resolution: "archiver-utils@npm:2.1.0" - dependencies: - glob: "npm:^7.1.4" - graceful-fs: "npm:^4.2.0" - lazystream: "npm:^1.0.0" - lodash.defaults: "npm:^4.2.0" - lodash.difference: "npm:^4.5.0" - lodash.flatten: "npm:^4.4.0" - lodash.isplainobject: "npm:^4.0.6" - lodash.union: "npm:^4.6.0" - normalize-path: "npm:^3.0.0" - readable-stream: "npm:^2.0.0" - checksum: 10/4df493c0e6a3a544119b08b350308923500e2c6efee6a283cba4c3202293ce3acb70897e54e24f735e3a38ff43e5a65f66e2e5225fdfc955bf2335491377be2e - languageName: node - linkType: hard - -"archiver-utils@npm:^3.0.4": - version: 3.0.4 - resolution: "archiver-utils@npm:3.0.4" - dependencies: - glob: "npm:^7.2.3" - graceful-fs: "npm:^4.2.0" - lazystream: "npm:^1.0.0" - lodash.defaults: "npm:^4.2.0" - lodash.difference: "npm:^4.5.0" - lodash.flatten: "npm:^4.4.0" - lodash.isplainobject: "npm:^4.0.6" - lodash.union: "npm:^4.6.0" - normalize-path: "npm:^3.0.0" - readable-stream: "npm:^3.6.0" - checksum: 10/a838c325a1e1d6798c07e6a3af08f480fdce57cba2964bff8761126715aa1b71e9a119442eac19b7ec6313f5298e54a180dc6612ae548825fbc9be6836e50487 - languageName: node - linkType: hard - -"archiver@npm:^5.3.0, archiver@npm:^5.3.1": - version: 5.3.2 - resolution: "archiver@npm:5.3.2" - dependencies: - archiver-utils: "npm:^2.1.0" - async: "npm:^3.2.4" - buffer-crc32: "npm:^0.2.1" - readable-stream: "npm:^3.6.0" - readdir-glob: "npm:^1.1.2" - tar-stream: "npm:^2.2.0" - zip-stream: "npm:^4.1.0" - checksum: 10/9384b3b20d330f95140c2b7a9b51140d14e9bc7b133be6cf573067ed8fc67a6e9618cfbfe60b1ba78b8034857001fd02c8900f2fba4864514670a2274d36dc9e - languageName: node - linkType: hard - "arg@npm:5.0.2, arg@npm:^5.0.2": version: 5.0.2 resolution: "arg@npm:5.0.2" @@ -7215,10 +6372,10 @@ __metadata: languageName: node linkType: hard -"array-unflat-js@npm:^0.1.3": - version: 0.1.3 - resolution: "array-unflat-js@npm:0.1.3" - checksum: 10/9384e65fb007fccfbedb95decfa962ff1f0672ce9255a82f0877478848d79f42c456f5e43f2bfbdf246f93c33786398fcbd12242458cac3c83e5366474530afc +"array-timsort@npm:^1.0.3": + version: 1.0.3 + resolution: "array-timsort@npm:1.0.3" + checksum: 10/f417f073b3733baec3a80decdf5d45bf763f04676ef3610b0e71f9b1d88c6e4c38154c05b28b31529d308bfd0e043d08059fcd9df966245a1276af15b5584936 languageName: node linkType: hard @@ -7342,13 +6499,6 @@ __metadata: languageName: node linkType: hard -"async@npm:^3.2.0, async@npm:^3.2.3, async@npm:^3.2.4": - version: 3.2.5 - resolution: "async@npm:3.2.5" - checksum: 10/323c3615c3f0ab1ac25a6f953296bc0ac3213d5e0f1c0debdb12964e55963af288d570293c11e44f7967af58c06d2a88d0ea588c86ec0fbf62fa98037f604a0f - languageName: node - linkType: hard - "asynciterator.prototype@npm:^1.0.0": version: 1.0.0 resolution: "asynciterator.prototype@npm:1.0.0" @@ -7365,13 +6515,6 @@ __metadata: languageName: node linkType: hard -"at-least-node@npm:^1.0.0": - version: 1.0.0 - resolution: "at-least-node@npm:1.0.0" - checksum: 10/463e2f8e43384f1afb54bc68485c436d7622acec08b6fad269b421cb1d29cebb5af751426793d0961ed243146fe4dc983402f6d5a51b720b277818dbf6f2e49e - languageName: node - linkType: hard - "auto-bind@npm:~4.0.0": version: 4.0.0 resolution: "auto-bind@npm:4.0.0" @@ -7404,42 +6547,6 @@ __metadata: languageName: node linkType: hard -"aws-sdk@npm:^2.1195.0": - version: 2.1584.0 - resolution: "aws-sdk@npm:2.1584.0" - dependencies: - buffer: "npm:4.9.2" - events: "npm:1.1.1" - ieee754: "npm:1.1.13" - jmespath: "npm:0.16.0" - querystring: "npm:0.2.0" - sax: "npm:1.2.1" - url: "npm:0.10.3" - util: "npm:^0.12.4" - uuid: "npm:8.0.0" - xml2js: "npm:0.6.2" - checksum: 10/c889a1549cd99a90bddf6af45a72babaf412733234b66e069e7ac14ad7e14e13e28c9b2f4a49c359005e5bdefff0b3bdea04bfec07b72f65a6b5c63d0c4d3a68 - languageName: node - linkType: hard - -"aws-sdk@npm:^2.1322.0, aws-sdk@npm:^2.320.0": - version: 2.1534.0 - resolution: "aws-sdk@npm:2.1534.0" - dependencies: - buffer: "npm:4.9.2" - events: "npm:1.1.1" - ieee754: "npm:1.1.13" - jmespath: "npm:0.16.0" - querystring: "npm:0.2.0" - sax: "npm:1.2.1" - url: "npm:0.10.3" - util: "npm:^0.12.4" - uuid: "npm:8.0.0" - xml2js: "npm:0.5.0" - checksum: 10/a46a8f46e1f786815fd000af9632b22e7ded9718b797c56eb85cc7bda9bd617e345d882bc0d90102037efbe2aac59df7167c3905991428c9c3083ac8c0cb2955 - languageName: node - linkType: hard - "axe-core@npm:=4.7.0": version: 4.7.0 resolution: "axe-core@npm:4.7.0" @@ -7447,25 +6554,14 @@ __metadata: languageName: node linkType: hard -"axios@npm:1.6.8": - version: 1.6.8 - resolution: "axios@npm:1.6.8" +"axios@npm:1.7.2": + version: 1.7.2 + resolution: "axios@npm:1.7.2" dependencies: follow-redirects: "npm:^1.15.6" form-data: "npm:^4.0.0" proxy-from-env: "npm:^1.1.0" - checksum: 10/3f9a79eaf1d159544fca9576261ff867cbbff64ed30017848e4210e49f3b01e97cf416390150e6fdf6633f336cd43dc1151f890bbd09c3c01ad60bb0891eee63 - languageName: node - linkType: hard - -"axios@npm:^1.6.2": - version: 1.6.5 - resolution: "axios@npm:1.6.5" - dependencies: - follow-redirects: "npm:^1.15.4" - form-data: "npm:^4.0.0" - proxy-from-env: "npm:^1.1.0" - checksum: 10/465489d9bf8f039b9adbc8103b6299d6a5e26de77b27f0e4173d814d39bca8f4b4659d94e09ee40461aedccd8c2452f1e2b3edace1c9f81220060d2974ff9dc7 + checksum: 10/6ae80dda9736bb4762ce717f1a26ff997d94672d3a5799ad9941c24d4fb019c1dff45be8272f08d1975d7950bac281f3ba24aff5ecd49ef5a04d872ec428782f languageName: node linkType: hard @@ -7598,6 +6694,13 @@ __metadata: languageName: node linkType: hard +"backo2@npm:^1.0.2": + version: 1.0.2 + resolution: "backo2@npm:1.0.2" + checksum: 10/fda8d0a0f4810068d23715f2f45153146d6ee8f62dd827ce1e0b6cc3c8328e84ad61e11399a83931705cef702fe7cbb457856bf99b9bd10c4ed57b0786252385 + languageName: node + linkType: hard + "balanced-match@npm:^1.0.0": version: 1.0.2 resolution: "balanced-match@npm:1.0.2" @@ -7605,7 +6708,7 @@ __metadata: languageName: node linkType: hard -"base64-js@npm:^1.0.2, base64-js@npm:^1.3.1": +"base64-js@npm:^1.3.1": version: 1.5.1 resolution: "base64-js@npm:1.5.1" checksum: 10/669632eb3745404c2f822a18fc3a0122d2f9a7a13f7fb8b5823ee19d1d2ff9ee5b52c53367176ea4ad093c332fd5ab4bd0ebae5a8e27917a4105a4cfc86b1005 @@ -7619,21 +6722,6 @@ __metadata: languageName: node linkType: hard -"bestzip@npm:^2.2.1": - version: 2.2.1 - resolution: "bestzip@npm:2.2.1" - dependencies: - archiver: "npm:^5.3.0" - async: "npm:^3.2.0" - glob: "npm:^7.1.6" - which: "npm:^2.0.2" - yargs: "npm:^16.2.0" - bin: - bestzip: bin/cli.js - checksum: 10/a80a14b50a52be4a49fbe82b72ff62945a959a99abfcf2f2688f1c8594527a17b80a9d497e011092782d204b5d8cdcc0854fdc62cdac8bd7a7cde37b6dfc7858 - languageName: node - linkType: hard - "better-path-resolve@npm:1.0.0": version: 1.0.0 resolution: "better-path-resolve@npm:1.0.0" @@ -7650,17 +6738,7 @@ __metadata: languageName: node linkType: hard -"bl@npm:^1.0.0": - version: 1.2.3 - resolution: "bl@npm:1.2.3" - dependencies: - readable-stream: "npm:^2.3.5" - safe-buffer: "npm:^5.1.1" - checksum: 10/11d775b09ebd7d8c0df1ed7efd03cc8a2b1283c804a55153c81a0b586728a085fa24240647cac9a60163eb6f36a28cf8c45b80bf460a46336d4c84c40205faff - languageName: node - linkType: hard - -"bl@npm:^4.0.3, bl@npm:^4.1.0": +"bl@npm:^4.1.0": version: 4.1.0 resolution: "bl@npm:4.1.0" dependencies: @@ -7671,14 +6749,7 @@ __metadata: languageName: node linkType: hard -"bluebird@npm:^3.7.2": - version: 3.7.2 - resolution: "bluebird@npm:3.7.2" - checksum: 10/007c7bad22c5d799c8dd49c85b47d012a1fe3045be57447721e6afbd1d5be43237af1db62e26cb9b0d9ba812d2e4ca3bac82f6d7e016b6b88de06ee25ceb96e7 - languageName: node - linkType: hard - -"body-parser@npm:1.20.2, body-parser@npm:^1.19.0": +"body-parser@npm:1.20.2": version: 1.20.2 resolution: "body-parser@npm:1.20.2" dependencies: @@ -7698,13 +6769,6 @@ __metadata: languageName: node linkType: hard -"bowser@npm:^2.11.0": - version: 2.11.0 - resolution: "bowser@npm:2.11.0" - checksum: 10/ef46500eafe35072455e7c3ae771244e97827e0626686a9a3601c436d16eb272dad7ccbd49e2130b599b617ca9daa67027de827ffc4c220e02f63c84b69a8751 - languageName: node - linkType: hard - "boxen@npm:7.0.0": version: 7.0.0 resolution: "boxen@npm:7.0.0" @@ -7721,22 +6785,6 @@ __metadata: languageName: node linkType: hard -"boxen@npm:^7.1.1": - version: 7.1.1 - resolution: "boxen@npm:7.1.1" - dependencies: - ansi-align: "npm:^3.0.1" - camelcase: "npm:^7.0.1" - chalk: "npm:^5.2.0" - cli-boxes: "npm:^3.0.0" - string-width: "npm:^5.1.2" - type-fest: "npm:^2.13.0" - widest-line: "npm:^4.0.1" - wrap-ansi: "npm:^8.1.0" - checksum: 10/a21d514435ccdd51f11088ad42e6298e3ff6be1bc2801699dcc1d3d79a2c5b005b5384dd03742e91a1ce2d9aedf99996efb36ed5fc7c5c392e19de2404bcfa37 - languageName: node - linkType: hard - "brace-expansion@npm:^1.1.7": version: 1.1.11 resolution: "brace-expansion@npm:1.1.11" @@ -7765,6 +6813,15 @@ __metadata: languageName: node linkType: hard +"braces@npm:^3.0.3": + version: 3.0.3 + resolution: "braces@npm:3.0.3" + dependencies: + fill-range: "npm:^7.1.1" + checksum: 10/fad11a0d4697a27162840b02b1fad249c1683cbc510cd5bf1a471f2f8085c046d41094308c577a50a03a579dd99d5a6b3724c4b5e8b14df2c4443844cfcda2c6 + languageName: node + linkType: hard + "breakword@npm:^1.0.5": version: 1.0.6 resolution: "breakword@npm:1.0.6" @@ -7774,31 +6831,31 @@ __metadata: languageName: node linkType: hard -"browserslist@npm:^4.22.2": - version: 4.22.2 - resolution: "browserslist@npm:4.22.2" +"browserslist@npm:^4.21.10, browserslist@npm:^4.23.0": + version: 4.23.0 + resolution: "browserslist@npm:4.23.0" dependencies: - caniuse-lite: "npm:^1.0.30001565" - electron-to-chromium: "npm:^1.4.601" + caniuse-lite: "npm:^1.0.30001587" + electron-to-chromium: "npm:^1.4.668" node-releases: "npm:^2.0.14" update-browserslist-db: "npm:^1.0.13" bin: browserslist: cli.js - checksum: 10/e3590793db7f66ad3a50817e7b7f195ce61e029bd7187200244db664bfbe0ac832f784e4f6b9c958aef8ea4abe001ae7880b7522682df521f4bc0a5b67660b5e + checksum: 10/496c3862df74565dd942b4ae65f502c575cbeba1fa4a3894dad7aa3b16130dc3033bc502d8848147f7b625154a284708253d9598bcdbef5a1e34cf11dc7bad8e languageName: node linkType: hard -"browserslist@npm:^4.23.0": - version: 4.23.0 - resolution: "browserslist@npm:4.23.0" +"browserslist@npm:^4.22.2": + version: 4.22.2 + resolution: "browserslist@npm:4.22.2" dependencies: - caniuse-lite: "npm:^1.0.30001587" - electron-to-chromium: "npm:^1.4.668" + caniuse-lite: "npm:^1.0.30001565" + electron-to-chromium: "npm:^1.4.601" node-releases: "npm:^2.0.14" update-browserslist-db: "npm:^1.0.13" bin: browserslist: cli.js - checksum: 10/496c3862df74565dd942b4ae65f502c575cbeba1fa4a3894dad7aa3b16130dc3033bc502d8848147f7b625154a284708253d9598bcdbef5a1e34cf11dc7bad8e + checksum: 10/e3590793db7f66ad3a50817e7b7f195ce61e029bd7187200244db664bfbe0ac832f784e4f6b9c958aef8ea4abe001ae7880b7522682df521f4bc0a5b67660b5e languageName: node linkType: hard @@ -7807,47 +6864,23 @@ __metadata: resolution: "bs-logger@npm:0.2.6" dependencies: fast-json-stable-stringify: "npm:2.x" - checksum: 10/e6d3ff82698bb3f20ce64fb85355c5716a3cf267f3977abe93bf9c32a2e46186b253f48a028ae5b96ab42bacd2c826766d9ae8cf6892f9b944656be9113cf212 - languageName: node - linkType: hard - -"bser@npm:2.1.1": - version: 2.1.1 - resolution: "bser@npm:2.1.1" - dependencies: - node-int64: "npm:^0.4.0" - checksum: 10/edba1b65bae682450be4117b695997972bd9a3c4dfee029cab5bcb72ae5393a79a8f909b8bc77957eb0deec1c7168670f18f4d5c556f46cdd3bca5f3b3a8d020 - languageName: node - linkType: hard - -"buffer-alloc-unsafe@npm:^1.1.0": - version: 1.1.0 - resolution: "buffer-alloc-unsafe@npm:1.1.0" - checksum: 10/c5e18bf51f67754ec843c9af3d4c005051aac5008a3992938dda1344e5cfec77c4b02b4ca303644d1e9a6e281765155ce6356d85c6f5ccc5cd21afc868def396 - languageName: node - linkType: hard - -"buffer-alloc@npm:^1.2.0": - version: 1.2.0 - resolution: "buffer-alloc@npm:1.2.0" - dependencies: - buffer-alloc-unsafe: "npm:^1.1.0" - buffer-fill: "npm:^1.0.0" - checksum: 10/560cd27f3cbe73c614867da373407d4506309c62fe18de45a1ce191f3785ec6ca2488d802ff82065798542422980ca25f903db078c57822218182c37c3576df5 + checksum: 10/e6d3ff82698bb3f20ce64fb85355c5716a3cf267f3977abe93bf9c32a2e46186b253f48a028ae5b96ab42bacd2c826766d9ae8cf6892f9b944656be9113cf212 languageName: node linkType: hard -"buffer-crc32@npm:^0.2.1, buffer-crc32@npm:^0.2.13, buffer-crc32@npm:~0.2.3": - version: 0.2.13 - resolution: "buffer-crc32@npm:0.2.13" - checksum: 10/06252347ae6daca3453b94e4b2f1d3754a3b146a111d81c68924c22d91889a40623264e95e67955b1cb4a68cbedf317abeabb5140a9766ed248973096db5ce1c +"bser@npm:2.1.1": + version: 2.1.1 + resolution: "bser@npm:2.1.1" + dependencies: + node-int64: "npm:^0.4.0" + checksum: 10/edba1b65bae682450be4117b695997972bd9a3c4dfee029cab5bcb72ae5393a79a8f909b8bc77957eb0deec1c7168670f18f4d5c556f46cdd3bca5f3b3a8d020 languageName: node linkType: hard -"buffer-fill@npm:^1.0.0": - version: 1.0.0 - resolution: "buffer-fill@npm:1.0.0" - checksum: 10/c29b4723ddeab01e74b5d3b982a0c6828f2ded49cef049ddca3dac661c874ecdbcecb5dd8380cf0f4adbeb8cff90a7de724126750a1f1e5ebd4eb6c59a1315b1 +"buffer-equal-constant-time@npm:1.0.1": + version: 1.0.1 + resolution: "buffer-equal-constant-time@npm:1.0.1" + checksum: 10/80bb945f5d782a56f374b292770901065bad21420e34936ecbe949e57724b4a13874f735850dd1cc61f078773c4fb5493a41391e7bda40d1fa388d6bd80daaab languageName: node linkType: hard @@ -7858,18 +6891,7 @@ __metadata: languageName: node linkType: hard -"buffer@npm:4.9.2": - version: 4.9.2 - resolution: "buffer@npm:4.9.2" - dependencies: - base64-js: "npm:^1.0.2" - ieee754: "npm:^1.1.4" - isarray: "npm:^1.0.0" - checksum: 10/4852a455e167bc8ca580c3c585176bbe0931c9929aeb68f3e0b49adadcb4e513fd0922a43efdf67ddb2e8785bbe8254ae17f4b69038dd06329ee9e3283c8508f - languageName: node - linkType: hard - -"buffer@npm:^5.2.1, buffer@npm:^5.5.0": +"buffer@npm:^5.5.0": version: 5.7.1 resolution: "buffer@npm:5.7.1" dependencies: @@ -7879,20 +6901,6 @@ __metadata: languageName: node linkType: hard -"builtin-modules@npm:^3.3.0": - version: 3.3.0 - resolution: "builtin-modules@npm:3.3.0" - checksum: 10/62e063ab40c0c1efccbfa9ffa31873e4f9d57408cb396a2649981a0ecbce56aabc93c28feaccbc5658c95aab2703ad1d11980e62ec2e5e72637404e1eb60f39e - languageName: node - linkType: hard - -"builtins@npm:^1.0.3": - version: 1.0.3 - resolution: "builtins@npm:1.0.3" - checksum: 10/8f756616bd3d92611bcb5bcc3008308e7cdaadbc4603a5ce6fe709193198bc115351d138524d79e5269339ef7ba5ba73185da541c7b4bc076b00dd0124f938f6 - languageName: node - linkType: hard - "bundle-require@npm:^4.0.0": version: 4.0.2 resolution: "bundle-require@npm:4.0.2" @@ -7904,7 +6912,7 @@ __metadata: languageName: node linkType: hard -"busboy@npm:1.6.0, busboy@npm:^1.6.0": +"busboy@npm:1.6.0, busboy@npm:^1.0.0, busboy@npm:^1.6.0": version: 1.6.0 resolution: "busboy@npm:1.6.0" dependencies: @@ -7954,35 +6962,6 @@ __metadata: languageName: node linkType: hard -"cacheable-lookup@npm:^5.0.3": - version: 5.0.4 - resolution: "cacheable-lookup@npm:5.0.4" - checksum: 10/618a8b3eea314060e74cb3285a6154e8343c244a34235acf91cfe626ee0705c24e3cd11e4b1a7b3900bd749ee203ae65afe13adf610c8ab173e99d4a208faf75 - languageName: node - linkType: hard - -"cacheable-request@npm:^7.0.2": - version: 7.0.4 - resolution: "cacheable-request@npm:7.0.4" - dependencies: - clone-response: "npm:^1.0.2" - get-stream: "npm:^5.1.0" - http-cache-semantics: "npm:^4.0.0" - keyv: "npm:^4.0.0" - lowercase-keys: "npm:^2.0.0" - normalize-url: "npm:^6.0.1" - responselike: "npm:^2.0.0" - checksum: 10/0f4f2001260ecca78b9f64fc8245e6b5a5dcde24ea53006daab71f5e0e1338095aa1512ec099c4f9895a9e5acfac9da423cb7c079e131485891e9214aca46c41 - languageName: node - linkType: hard - -"cachedir@npm:^2.3.0": - version: 2.4.0 - resolution: "cachedir@npm:2.4.0" - checksum: 10/43198514eaa61f65b5535ed29ad651f22836fba3868ed58a6a87731f05462f317d39098fa3ac778801c25455483c9b7f32a2fcad1f690a978947431f12a0f4d0 - languageName: node - linkType: hard - "call-bind@npm:^1.0.0, call-bind@npm:^1.0.2, call-bind@npm:^1.0.4, call-bind@npm:^1.0.5": version: 1.0.5 resolution: "call-bind@npm:1.0.5" @@ -7994,6 +6973,19 @@ __metadata: languageName: node linkType: hard +"call-bind@npm:^1.0.7": + version: 1.0.7 + resolution: "call-bind@npm:1.0.7" + dependencies: + es-define-property: "npm:^1.0.0" + es-errors: "npm:^1.3.0" + function-bind: "npm:^1.1.2" + get-intrinsic: "npm:^1.2.4" + set-function-length: "npm:^1.2.1" + checksum: 10/cd6fe658e007af80985da5185bff7b55e12ef4c2b6f41829a26ed1eef254b1f1c12e3dfd5b2b068c6ba8b86aba62390842d81752e67dcbaec4f6f76e7113b6b7 + languageName: node + linkType: hard + "callsites@npm:^3.0.0": version: 3.1.0 resolution: "callsites@npm:3.1.0" @@ -8043,7 +7035,7 @@ __metadata: languageName: node linkType: hard -"camelcase@npm:^7.0.0, camelcase@npm:^7.0.1": +"camelcase@npm:^7.0.0": version: 7.0.1 resolution: "camelcase@npm:7.0.1" checksum: 10/86ab8f3ebf08bcdbe605a211a242f00ed30d8bfb77dab4ebb744dd36efbc84432d1c4adb28975ba87a1b8be40a80fbd1e60e2f06565315918fa7350011a26d3d @@ -8101,6 +7093,16 @@ __metadata: languageName: node linkType: hard +"chalk@npm:4.1.2, chalk@npm:^4.0.0, chalk@npm:^4.1.0, chalk@npm:^4.1.1, chalk@npm:^4.1.2": + version: 4.1.2 + resolution: "chalk@npm:4.1.2" + dependencies: + ansi-styles: "npm:^4.1.0" + supports-color: "npm:^7.1.0" + checksum: 10/cb3f3e594913d63b1814d7ca7c9bafbf895f75fbf93b92991980610dfd7b48500af4e3a5d4e3a8f337990a96b168d7eb84ee55efdce965e2ee8efc20f8c8f139 + languageName: node + linkType: hard + "chalk@npm:5.0.1": version: 5.0.1 resolution: "chalk@npm:5.0.1" @@ -8119,17 +7121,7 @@ __metadata: languageName: node linkType: hard -"chalk@npm:^4.0.0, chalk@npm:^4.1.0, chalk@npm:^4.1.1, chalk@npm:^4.1.2": - version: 4.1.2 - resolution: "chalk@npm:4.1.2" - dependencies: - ansi-styles: "npm:^4.1.0" - supports-color: "npm:^7.1.0" - checksum: 10/cb3f3e594913d63b1814d7ca7c9bafbf895f75fbf93b92991980610dfd7b48500af4e3a5d4e3a8f337990a96b168d7eb84ee55efdce965e2ee8efc20f8c8f139 - languageName: node - linkType: hard - -"chalk@npm:^5.0.1, chalk@npm:^5.2.0, chalk@npm:^5.3.0": +"chalk@npm:^5.0.1, chalk@npm:^5.3.0": version: 5.3.0 resolution: "chalk@npm:5.3.0" checksum: 10/6373caaab21bd64c405bfc4bd9672b145647fc9482657b5ea1d549b3b2765054e9d3d928870cdf764fb4aad67555f5061538ff247b8310f110c5c888d92397ea @@ -8188,29 +7180,22 @@ __metadata: languageName: node linkType: hard -"child-process-ext@npm:^2.1.1": - version: 2.1.1 - resolution: "child-process-ext@npm:2.1.1" - dependencies: - cross-spawn: "npm:^6.0.5" - es5-ext: "npm:^0.10.53" - log: "npm:^6.0.0" - split2: "npm:^3.1.1" - stream-promise: "npm:^3.2.0" - checksum: 10/a7cc593d833a9fedccf1b24179bdbd014c8bdfad4ce5b598c21b85ef58e359603bb1a2827746c93c4f6690fbfda3ca3a27557496d67ec4f7ce0e32308120acba - languageName: node - linkType: hard - -"child-process-ext@npm:^3.0.1": - version: 3.0.2 - resolution: "child-process-ext@npm:3.0.2" +"chokidar@npm:3.6.0": + version: 3.6.0 + resolution: "chokidar@npm:3.6.0" dependencies: - cross-spawn: "npm:^7.0.3" - es5-ext: "npm:^0.10.62" - log: "npm:^6.3.1" - split2: "npm:^3.2.2" - stream-promise: "npm:^3.2.0" - checksum: 10/3b21cc38c3bded8ad6fb71d700348f5ff35fdbc717496fbb06f7cf4be069ddaa8e967b6038f54c8fcbbb8e20495b190ae560b90f8b7db60569956cb94883d238 + anymatch: "npm:~3.1.2" + braces: "npm:~3.0.2" + fsevents: "npm:~2.3.2" + glob-parent: "npm:~5.1.2" + is-binary-path: "npm:~2.1.0" + is-glob: "npm:~4.0.1" + normalize-path: "npm:~3.0.0" + readdirp: "npm:~3.6.0" + dependenciesMeta: + fsevents: + optional: true + checksum: 10/c327fb07704443f8d15f7b4a7ce93b2f0bc0e6cea07ec28a7570aa22cd51fcf0379df589403976ea956c369f25aa82d84561947e227cd925902e1751371658df languageName: node linkType: hard @@ -8240,7 +7225,14 @@ __metadata: languageName: node linkType: hard -"ci-info@npm:^3.2.0, ci-info@npm:^3.3.2, ci-info@npm:^3.7.0, ci-info@npm:^3.8.0": +"chrome-trace-event@npm:^1.0.2": + version: 1.0.3 + resolution: "chrome-trace-event@npm:1.0.3" + checksum: 10/b5fbdae5bf00c96fa3213de919f2b2617a942bfcb891cdf735fbad2a6f4f3c25d42e3f2b1703328619d352c718b46b9e18999fd3af7ef86c26c91db6fae1f0da + languageName: node + linkType: hard + +"ci-info@npm:^3.2.0, ci-info@npm:^3.7.0": version: 3.9.0 resolution: "ci-info@npm:3.9.0" checksum: 10/75bc67902b4d1c7b435497adeb91598f6d52a3389398e44294f6601b20cfef32cf2176f7be0eb961d9e085bb333a8a5cae121cb22f81cf238ae7f58eb80e9397 @@ -8254,6 +7246,13 @@ __metadata: languageName: node linkType: hard +"cjs-module-lexer@npm:^1.2.2": + version: 1.3.1 + resolution: "cjs-module-lexer@npm:1.3.1" + checksum: 10/6629188d5ce74b57e5dce2222db851b5496a8d65b533a05957fb24089a3cec8d769378013c375a954c5a0f7522cde6a36d5a65bfd88f5575cb2de3176046fa8e + languageName: node + linkType: hard + "classnames@npm:2.5.1": version: 2.5.1 resolution: "classnames@npm:2.5.1" @@ -8275,19 +7274,6 @@ __metadata: languageName: node linkType: hard -"cli-color@npm:^2.0.1, cli-color@npm:^2.0.2": - version: 2.0.3 - resolution: "cli-color@npm:2.0.3" - dependencies: - d: "npm:^1.0.1" - es5-ext: "npm:^0.10.61" - es6-iterator: "npm:^2.0.3" - memoizee: "npm:^0.4.15" - timers-ext: "npm:^0.1.7" - checksum: 10/35244ba10cd7e5e38df02fbe54128dd11362f0114fdcaf44ee5a59c6af8b7680258fee4954de114cc3f824ed5bf7337270098b15e05bde6ae3877a4f67558b41 - languageName: node - linkType: hard - "cli-cursor@npm:^3.1.0": version: 3.1.0 resolution: "cli-cursor@npm:3.1.0" @@ -8297,21 +7283,6 @@ __metadata: languageName: node linkType: hard -"cli-progress-footer@npm:^2.3.2": - version: 2.3.2 - resolution: "cli-progress-footer@npm:2.3.2" - dependencies: - cli-color: "npm:^2.0.2" - d: "npm:^1.0.1" - es5-ext: "npm:^0.10.61" - mute-stream: "npm:0.0.8" - process-utils: "npm:^4.0.0" - timers-ext: "npm:^0.1.7" - type: "npm:^2.6.0" - checksum: 10/a5b5e7e352468b6e70e129203fe7de57be71e26d5982754a58ed5da7b9e3cabfd90e9349806a5c6b392200d6b3284e740376700c0433ec130a96ba39bfae3464 - languageName: node - linkType: hard - "cli-spinners@npm:^2.5.0": version: 2.9.2 resolution: "cli-spinners@npm:2.9.2" @@ -8319,15 +7290,16 @@ __metadata: languageName: node linkType: hard -"cli-sprintf-format@npm:^1.1.1": - version: 1.1.1 - resolution: "cli-sprintf-format@npm:1.1.1" +"cli-table3@npm:0.6.3": + version: 0.6.3 + resolution: "cli-table3@npm:0.6.3" dependencies: - cli-color: "npm:^2.0.1" - es5-ext: "npm:^0.10.53" - sprintf-kit: "npm:^2.0.1" - supports-color: "npm:^6.1.0" - checksum: 10/3dad8362e16f553cbabaec36a76350c76ccf988e56205352d9392c9311449cfa50a5c677e780411237e3712fb77928cd642406b23a5c3af1716ab0dde170815d + "@colors/colors": "npm:1.5.0" + string-width: "npm:^4.2.0" + dependenciesMeta: + "@colors/colors": + optional: true + checksum: 10/8d82b75be7edc7febb1283dc49582a521536527cba80af62a2e4522a0ee39c252886a1a2f02d05ae9d753204dbcffeb3a40d1358ee10dccd7fe8d935cfad3f85 languageName: node linkType: hard @@ -8348,6 +7320,13 @@ __metadata: languageName: node linkType: hard +"cli-width@npm:^4.1.0": + version: 4.1.0 + resolution: "cli-width@npm:4.1.0" + checksum: 10/b58876fbf0310a8a35c79b72ecfcf579b354e18ad04e6b20588724ea2b522799a758507a37dfe132fafaf93a9922cafd9514d9e1598e6b2cd46694853aed099f + languageName: node + linkType: hard + "client-only@npm:0.0.1, client-only@npm:^0.0.1": version: 0.0.1 resolution: "client-only@npm:0.0.1" @@ -8377,17 +7356,6 @@ __metadata: languageName: node linkType: hard -"cliui@npm:^7.0.2": - version: 7.0.4 - resolution: "cliui@npm:7.0.4" - dependencies: - string-width: "npm:^4.2.0" - strip-ansi: "npm:^6.0.0" - wrap-ansi: "npm:^7.0.0" - checksum: 10/db858c49af9d59a32d603987e6fddaca2ce716cd4602ba5a2bb3a5af1351eebe82aba8dff3ef3e1b331f7fa9d40ca66e67bdf8e7c327ce0ea959747ead65c0ef - languageName: node - linkType: hard - "cliui@npm:^8.0.1": version: 8.0.1 resolution: "cliui@npm:8.0.1" @@ -8399,15 +7367,6 @@ __metadata: languageName: node linkType: hard -"clone-response@npm:^1.0.2": - version: 1.0.3 - resolution: "clone-response@npm:1.0.3" - dependencies: - mimic-response: "npm:^1.0.0" - checksum: 10/4e671cac39b11c60aa8ba0a450657194a5d6504df51bca3fac5b3bd0145c4f8e8464898f87c8406b83232e3bc5cca555f51c1f9c8ac023969ebfbf7f6bdabb2e - languageName: node - linkType: hard - "clone@npm:^1.0.2": version: 1.0.4 resolution: "clone@npm:1.0.4" @@ -8422,6 +7381,13 @@ __metadata: languageName: node linkType: hard +"code-block-writer@npm:^13.0.1": + version: 13.0.1 + resolution: "code-block-writer@npm:13.0.1" + checksum: 10/3da803b1149d05a09b99e150df0e6d2ac5007bcf2ddd23d72e8b3e827cb6b7cb69b695472cfbc8b46a2bca4e7c11636788b9a7e7d518f3b45d0bddcac240b4af + languageName: node + linkType: hard + "collect-v8-coverage@npm:^1.0.0": version: 1.0.2 resolution: "collect-v8-coverage@npm:1.0.2" @@ -8429,7 +7395,7 @@ __metadata: languageName: node linkType: hard -"color-convert@npm:^1.9.0, color-convert@npm:^1.9.3": +"color-convert@npm:^1.9.0": version: 1.9.3 resolution: "color-convert@npm:1.9.3" dependencies: @@ -8454,33 +7420,13 @@ __metadata: languageName: node linkType: hard -"color-name@npm:^1.0.0, color-name@npm:~1.1.4": +"color-name@npm:~1.1.4": version: 1.1.4 resolution: "color-name@npm:1.1.4" checksum: 10/b0445859521eb4021cd0fb0cc1a75cecf67fceecae89b63f62b201cca8d345baf8b952c966862a9d9a2632987d4f6581f0ec8d957dfacece86f0a7919316f610 languageName: node linkType: hard -"color-string@npm:^1.6.0": - version: 1.9.1 - resolution: "color-string@npm:1.9.1" - dependencies: - color-name: "npm:^1.0.0" - simple-swizzle: "npm:^0.2.2" - checksum: 10/72aa0b81ee71b3f4fb1ac9cd839cdbd7a011a7d318ef58e6cb13b3708dca75c7e45029697260488709f1b1c7ac4e35489a87e528156c1e365917d1c4ccb9b9cd - languageName: node - linkType: hard - -"color@npm:^3.1.3": - version: 3.2.1 - resolution: "color@npm:3.2.1" - dependencies: - color-convert: "npm:^1.9.3" - color-string: "npm:^1.6.0" - checksum: 10/bf70438e0192f4f62f4bfbb303e7231289e8cc0d15ff6b6cbdb722d51f680049f38d4fdfc057a99cb641895cf5e350478c61d98586400b060043afc44285e7ae - languageName: node - linkType: hard - "colorette@npm:^2.0.16": version: 2.0.20 resolution: "colorette@npm:2.0.20" @@ -8488,16 +7434,6 @@ __metadata: languageName: node linkType: hard -"colorspace@npm:1.1.x": - version: 1.1.4 - resolution: "colorspace@npm:1.1.4" - dependencies: - color: "npm:^3.1.3" - text-hex: "npm:1.0.x" - checksum: 10/bb3934ef3c417e961e6d03d7ca60ea6e175947029bfadfcdb65109b01881a1c0ecf9c2b0b59abcd0ee4a0d7c1eae93beed01b0e65848936472270a0b341ebce8 - languageName: node - linkType: hard - "combined-stream@npm:^1.0.8": version: 1.0.8 resolution: "combined-stream@npm:1.0.8" @@ -8507,17 +7443,30 @@ __metadata: languageName: node linkType: hard -"commander@npm:^2.20.3, commander@npm:^2.8.1": +"commander@npm:4.1.1, commander@npm:^4.0.0": + version: 4.1.1 + resolution: "commander@npm:4.1.1" + checksum: 10/3b2dc4125f387dab73b3294dbcb0ab2a862f9c0ad748ee2b27e3544d25325b7a8cdfbcc228d103a98a716960b14478114a5206b5415bd48cdafa38797891562c + languageName: node + linkType: hard + +"commander@npm:^2.20.0, commander@npm:^2.20.3": version: 2.20.3 resolution: "commander@npm:2.20.3" checksum: 10/90c5b6898610cd075984c58c4f88418a4fb44af08c1b1415e9854c03171bec31b336b7f3e4cefe33de994b3f12b03c5e2d638da4316df83593b9e82554e7e95b languageName: node linkType: hard -"commander@npm:^4.0.0, commander@npm:~4.1.1": - version: 4.1.1 - resolution: "commander@npm:4.1.1" - checksum: 10/3b2dc4125f387dab73b3294dbcb0ab2a862f9c0ad748ee2b27e3544d25325b7a8cdfbcc228d103a98a716960b14478114a5206b5415bd48cdafa38797891562c +"comment-json@npm:4.2.3": + version: 4.2.3 + resolution: "comment-json@npm:4.2.3" + dependencies: + array-timsort: "npm:^1.0.3" + core-util-is: "npm:^1.0.3" + esprima: "npm:^4.0.1" + has-own-prop: "npm:^2.0.0" + repeat-string: "npm:^1.6.1" + checksum: 10/97eb6ff8231653864cea5c7721636e823194f0322cd7f0faa6154a1c5b5eb1cab2ca60526bc36d5b39e7c2bcf7eb175b57fd8e44b1c398f0c70ea8c9a114e834 languageName: node linkType: hard @@ -8552,18 +7501,6 @@ __metadata: languageName: node linkType: hard -"compress-commons@npm:^4.1.2": - version: 4.1.2 - resolution: "compress-commons@npm:4.1.2" - dependencies: - buffer-crc32: "npm:^0.2.13" - crc32-stream: "npm:^4.0.2" - normalize-path: "npm:^3.0.0" - readable-stream: "npm:^3.6.0" - checksum: 10/76fa281412e4a95f89893dc1e3399e797de20253365cf53102ac4738fa004d3540abb12c26e3a54156f8fb4e4392ef9a9c5eecbe752f3a7d30e28c808b671e1b - languageName: node - linkType: hard - "compressible@npm:~2.0.16": version: 2.0.18 resolution: "compressible@npm:2.0.18" @@ -8595,6 +7532,25 @@ __metadata: languageName: node linkType: hard +"concat-stream@npm:^1.5.2": + version: 1.6.2 + resolution: "concat-stream@npm:1.6.2" + dependencies: + buffer-from: "npm:^1.0.0" + inherits: "npm:^2.0.3" + readable-stream: "npm:^2.2.2" + typedarray: "npm:^0.0.6" + checksum: 10/71db903c84fc073ca35a274074e8d26c4330713d299f8623e993c448c1f6bf8b967806dd1d1a7b0f8add6f15ab1af7435df21fe79b4fe7efd78420c89e054e28 + languageName: node + linkType: hard + +"consola@npm:^2.15.0": + version: 2.15.3 + resolution: "consola@npm:2.15.3" + checksum: 10/ba5b3c6960b2eafb9d2ff2325444dd1d4eb53115df46eba823a4e7bfe6afbba0eb34747c0de82c7cd8a939db59b0cb5a8b8a54a94bb2e44feeddc26cefde3622 + languageName: node + linkType: hard + "constant-case@npm:^3.0.4": version: 3.0.4 resolution: "constant-case@npm:3.0.4" @@ -8613,7 +7569,7 @@ __metadata: languageName: node linkType: hard -"content-disposition@npm:0.5.4, content-disposition@npm:^0.5.4": +"content-disposition@npm:0.5.4": version: 0.5.4 resolution: "content-disposition@npm:0.5.4" dependencies: @@ -8682,14 +7638,14 @@ __metadata: languageName: node linkType: hard -"cookiejar@npm:^2.1.3": +"cookiejar@npm:^2.1.4": version: 2.1.4 resolution: "cookiejar@npm:2.1.4" checksum: 10/4a184f5a0591df8b07d22a43ea5d020eacb4572c383e853a33361a99710437eaa0971716c688684075bbf695b484f5872e9e3f562382e46858716cb7fc8ce3f4 languageName: node linkType: hard -"core-util-is@npm:~1.0.0": +"core-util-is@npm:^1.0.3, core-util-is@npm:~1.0.0": version: 1.0.3 resolution: "core-util-is@npm:1.0.3" checksum: 10/9de8597363a8e9b9952491ebe18167e3b36e7707569eed0ebf14f8bba773611376466ae34575bca8cfe3c767890c859c74056084738f09d4e4a6f902b2ad7d99 @@ -8719,7 +7675,7 @@ __metadata: languageName: node linkType: hard -"cosmiconfig@npm:^8.1.0, cosmiconfig@npm:^8.1.3, cosmiconfig@npm:^8.3.6": +"cosmiconfig@npm:^8.1.0, cosmiconfig@npm:^8.1.3, cosmiconfig@npm:^8.2.0, cosmiconfig@npm:^8.3.6": version: 8.3.6 resolution: "cosmiconfig@npm:8.3.6" dependencies: @@ -8736,25 +7692,6 @@ __metadata: languageName: node linkType: hard -"crc-32@npm:^1.2.0": - version: 1.2.2 - resolution: "crc-32@npm:1.2.2" - bin: - crc32: bin/crc32.njs - checksum: 10/824f696a5baaf617809aa9cd033313c8f94f12d15ebffa69f10202480396be44aef9831d900ab291638a8022ed91c360696dd5b1ba691eb3f34e60be8835b7c3 - languageName: node - linkType: hard - -"crc32-stream@npm:^4.0.2": - version: 4.0.3 - resolution: "crc32-stream@npm:4.0.3" - dependencies: - crc-32: "npm:^1.2.0" - readable-stream: "npm:^3.4.0" - checksum: 10/d44d0ec6f04d8a1bed899ac3e4fbb82111ed567ea6d506be39147362af45c747887fce1032f4beca1646b4824e5a9614cd3332bfa94bbc5577ca5445e7f75ddd - languageName: node - linkType: hard - "create-jest@npm:^29.7.0": version: 29.7.0 resolution: "create-jest@npm:29.7.0" @@ -8779,15 +7716,6 @@ __metadata: languageName: node linkType: hard -"cron-parser@npm:^4.2.0": - version: 4.9.0 - resolution: "cron-parser@npm:4.9.0" - dependencies: - luxon: "npm:^3.2.1" - checksum: 10/ffca5e532a5ee0923412ee6e4c7f9bbceacc6ddf8810c16d3e9fb4fe5ec7e2de1b6896d7956f304bb6bc96b0ce37ad7e3935304179d52951c18d84107184faa7 - languageName: node - linkType: hard - "cross-fetch@npm:^3.1.5": version: 3.1.8 resolution: "cross-fetch@npm:3.1.8" @@ -8817,19 +7745,6 @@ __metadata: languageName: node linkType: hard -"cross-spawn@npm:^6.0.5": - version: 6.0.5 - resolution: "cross-spawn@npm:6.0.5" - dependencies: - nice-try: "npm:^1.0.4" - path-key: "npm:^2.0.1" - semver: "npm:^5.5.0" - shebang-command: "npm:^1.2.0" - which: "npm:^1.2.9" - checksum: 10/f07e643b4875f26adffcd7f13bc68d9dff20cf395f8ed6f43a23f3ee24fc3a80a870a32b246fd074e514c8fd7da5f978ac6a7668346eec57aa87bac89c1ed3a1 - languageName: node - linkType: hard - "cross-spawn@npm:^7.0.0, cross-spawn@npm:^7.0.2, cross-spawn@npm:^7.0.3": version: 7.0.3 resolution: "cross-spawn@npm:7.0.3" @@ -8927,16 +7842,6 @@ __metadata: languageName: node linkType: hard -"d@npm:1, d@npm:^1.0.1": - version: 1.0.1 - resolution: "d@npm:1.0.1" - dependencies: - es5-ext: "npm:^0.10.50" - type: "npm:^1.0.1" - checksum: 10/1296e3f92e646895681c1cb564abd0eb23c29db7d62c5120a279e84e98915499a477808e9580760f09e3744c0ed7ac8f7cff98d096ba9770754f6ef0f1c97983 - languageName: node - linkType: hard - "damerau-levenshtein@npm:^1.0.8": version: 1.0.8 resolution: "damerau-levenshtein@npm:1.0.8" @@ -8969,7 +7874,7 @@ __metadata: languageName: node linkType: hard -"dayjs@npm:1.11.10, dayjs@npm:^1.11.5": +"dayjs@npm:1.11.10": version: 1.11.10 resolution: "dayjs@npm:1.11.10" checksum: 10/27e8f5bc01c0a76f36c656e62ab7f08c2e7b040b09e613cd4844abf03fb258e0350f0a83b02c887b84d771c1f11e092deda0beef8c6df2a1afbc3f6c1fade279 @@ -8992,7 +7897,7 @@ __metadata: languageName: node linkType: hard -"debug@npm:4, debug@npm:^4, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.1, debug@npm:^4.3.2, debug@npm:^4.3.3, debug@npm:^4.3.4": +"debug@npm:4, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.1, debug@npm:^4.3.2, debug@npm:^4.3.4": version: 4.3.4 resolution: "debug@npm:4.3.4" dependencies: @@ -9037,78 +7942,6 @@ __metadata: languageName: node linkType: hard -"decompress-response@npm:^6.0.0": - version: 6.0.0 - resolution: "decompress-response@npm:6.0.0" - dependencies: - mimic-response: "npm:^3.1.0" - checksum: 10/d377cf47e02d805e283866c3f50d3d21578b779731e8c5072d6ce8c13cc31493db1c2f6784da9d1d5250822120cefa44f1deab112d5981015f2e17444b763812 - languageName: node - linkType: hard - -"decompress-tar@npm:^4.0.0, decompress-tar@npm:^4.1.0, decompress-tar@npm:^4.1.1": - version: 4.1.1 - resolution: "decompress-tar@npm:4.1.1" - dependencies: - file-type: "npm:^5.2.0" - is-stream: "npm:^1.1.0" - tar-stream: "npm:^1.5.2" - checksum: 10/820c645dfa9a0722c4c817363431d07687374338e2af337cc20c9a44b285fdd89296837a1d1281ee9fa85c6f03d7c0f50670aec9abbd4eb198a714bb179ea0bd - languageName: node - linkType: hard - -"decompress-tarbz2@npm:^4.0.0": - version: 4.1.1 - resolution: "decompress-tarbz2@npm:4.1.1" - dependencies: - decompress-tar: "npm:^4.1.0" - file-type: "npm:^6.1.0" - is-stream: "npm:^1.1.0" - seek-bzip: "npm:^1.0.5" - unbzip2-stream: "npm:^1.0.9" - checksum: 10/519c81337730159a1f2d7072a6ee8523ffd76df48d34f14c27cb0a27f89b4e2acf75dad2f761838e5bc63230cea1ac154b092ecb7504be4e93f7d0e32ddd6aff - languageName: node - linkType: hard - -"decompress-targz@npm:^4.0.0": - version: 4.1.1 - resolution: "decompress-targz@npm:4.1.1" - dependencies: - decompress-tar: "npm:^4.1.1" - file-type: "npm:^5.2.0" - is-stream: "npm:^1.1.0" - checksum: 10/22738f58eb034568dc50d370c03b346c428bfe8292fe56165847376b5af17d3c028fefca82db642d79cb094df4c0a599d40a8f294b02aad1d3ddec82f3fd45d4 - languageName: node - linkType: hard - -"decompress-unzip@npm:^4.0.1": - version: 4.0.1 - resolution: "decompress-unzip@npm:4.0.1" - dependencies: - file-type: "npm:^3.8.0" - get-stream: "npm:^2.2.0" - pify: "npm:^2.3.0" - yauzl: "npm:^2.4.2" - checksum: 10/ba9f3204ab2415bedb18d796244928a18148ef40dbb15174d0d01e5991b39536b03d02800a8a389515a1523f8fb13efc7cd44697df758cd06c674879caefd62b - languageName: node - linkType: hard - -"decompress@npm:^4.2.1": - version: 4.2.1 - resolution: "decompress@npm:4.2.1" - dependencies: - decompress-tar: "npm:^4.0.0" - decompress-tarbz2: "npm:^4.0.0" - decompress-targz: "npm:^4.0.0" - decompress-unzip: "npm:^4.0.1" - graceful-fs: "npm:^4.1.10" - make-dir: "npm:^1.0.0" - pify: "npm:^2.3.0" - strip-dirs: "npm:^2.0.0" - checksum: 10/8247a31c6db7178413715fdfb35a482f019c81dfcd6e8e623d9f0382c9889ce797ce0144de016b256ed03298907a620ce81387cca0e69067a933470081436cb8 - languageName: node - linkType: hard - "dedent@npm:^1.0.0": version: 1.5.1 resolution: "dedent@npm:1.5.1" @@ -9177,26 +8010,6 @@ __metadata: languageName: node linkType: hard -"defer-to-connect@npm:^2.0.0": - version: 2.0.1 - resolution: "defer-to-connect@npm:2.0.1" - checksum: 10/8a9b50d2f25446c0bfefb55a48e90afd58f85b21bcf78e9207cd7b804354f6409032a1705c2491686e202e64fc05f147aa5aa45f9aa82627563f045937f5791b - languageName: node - linkType: hard - -"deferred@npm:^0.7.11": - version: 0.7.11 - resolution: "deferred@npm:0.7.11" - dependencies: - d: "npm:^1.0.1" - es5-ext: "npm:^0.10.50" - event-emitter: "npm:^0.3.5" - next-tick: "npm:^1.0.0" - timers-ext: "npm:^0.1.7" - checksum: 10/be852df96582030f5fa3fa8ab85f75ef1f83f92f0894bf7653e949fd1c0ef529fc419e47066a1234378079e7d70144217ea8a19f5cee02a72e33e2496d974210 - languageName: node - linkType: hard - "define-data-property@npm:^1.0.1, define-data-property@npm:^1.1.1": version: 1.1.1 resolution: "define-data-property@npm:1.1.1" @@ -9208,10 +8021,14 @@ __metadata: languageName: node linkType: hard -"define-lazy-prop@npm:^2.0.0": - version: 2.0.0 - resolution: "define-lazy-prop@npm:2.0.0" - checksum: 10/0115fdb065e0490918ba271d7339c42453d209d4cb619dfe635870d906731eff3e1ade8028bb461ea27ce8264ec5e22c6980612d332895977e89c1bbc80fcee2 +"define-data-property@npm:^1.1.4": + version: 1.1.4 + resolution: "define-data-property@npm:1.1.4" + dependencies: + es-define-property: "npm:^1.0.0" + es-errors: "npm:^1.3.0" + gopd: "npm:^1.0.1" + checksum: 10/abdcb2505d80a53524ba871273e5da75e77e52af9e15b3aa65d8aad82b8a3a424dad7aee2cc0b71470ac7acf501e08defac362e8b6a73cdb4309f028061df4ae languageName: node linkType: hard @@ -9226,13 +8043,6 @@ __metadata: languageName: node linkType: hard -"delay@npm:^4.3.0": - version: 4.4.1 - resolution: "delay@npm:4.4.1" - checksum: 10/97b001126a3979a398b6c5f33e437d78acda3b19731d9e6f991a05e2e09e7a410d655b8fdcaedc05743928bb533c0ac9401826cccb2af71c81d2cab50e199351 - languageName: node - linkType: hard - "delayed-stream@npm:~1.0.0": version: 1.0.0 resolution: "delayed-stream@npm:1.0.0" @@ -9240,6 +8050,13 @@ __metadata: languageName: node linkType: hard +"denque@npm:^2.1.0": + version: 2.1.0 + resolution: "denque@npm:2.1.0" + checksum: 10/8ea05321576624b90acfc1ee9208b8d1d04b425cf7573b9b4fa40a2c3ed4d4b0af5190567858f532f677ed2003d4d2b73c8130b34e3c7b8d5e88cdcfbfaa1fe7 + languageName: node + linkType: hard + "depd@npm:2.0.0": version: 2.0.0 resolution: "depd@npm:2.0.0" @@ -9261,13 +8078,6 @@ __metadata: languageName: node linkType: hard -"desm@npm:^1.3.1": - version: 1.3.1 - resolution: "desm@npm:1.3.1" - checksum: 10/9bf5bfaf863d355b9ea64c71550fc1d7fff9d1e68cd90fa263f0b512f1e520d166f2279a66fc0125633b40ae749e2056d92426f22a7843d8548420ad86332f5d - languageName: node - linkType: hard - "destroy@npm:1.2.0": version: 1.2.0 resolution: "destroy@npm:1.2.0" @@ -9396,24 +8206,31 @@ __metadata: languageName: node linkType: hard -"dotenv-expand@npm:^5.1.0": - version: 5.1.0 - resolution: "dotenv-expand@npm:5.1.0" - checksum: 10/d52af2a6e4642979ae4221408f1b75102508dbe4f5bac1c0613f92a3cf3880d5c31f86b2f5cff3273f7c23e10421e75028546e8b6cd0376fcd20e3803b374e15 +"dotenv-cli@npm:7.4.2": + version: 7.4.2 + resolution: "dotenv-cli@npm:7.4.2" + dependencies: + cross-spawn: "npm:^7.0.3" + dotenv: "npm:^16.3.0" + dotenv-expand: "npm:^10.0.0" + minimist: "npm:^1.2.6" + bin: + dotenv: cli.js + checksum: 10/48d887ea9be08f7453dc87d6c938311989e951d0b43028eadcbaff3be1ca56180f8c38b8f932fc2e59f0210e59f4b5c59cf8a34da3e6c92f63fe6d7ce4f09f65 languageName: node linkType: hard -"dotenv@npm:16.4.5": - version: 16.4.5 - resolution: "dotenv@npm:16.4.5" - checksum: 10/55a3134601115194ae0f924e54473459ed0d9fc340ae610b676e248cca45aa7c680d86365318ea964e6da4e2ea80c4514c1adab5adb43d6867fb57ff068f95c8 +"dotenv-expand@npm:10.0.0, dotenv-expand@npm:^10.0.0": + version: 10.0.0 + resolution: "dotenv-expand@npm:10.0.0" + checksum: 10/b41eb278bc96b92cbf3037ca5f3d21e8845bf165dc06b6f9a0a03d278c2bd5a01c0cfbb3528ae3a60301ba1a8a9cace30e748c54b460753bc00d4c014b675597 languageName: node linkType: hard -"dotenv@npm:^10.0.0": - version: 10.0.0 - resolution: "dotenv@npm:10.0.0" - checksum: 10/55f701ae213e3afe3f4232fae5edfb6e0c49f061a363ff9f1c5a0c2bf3fb990a6e49aeada11b2a116efb5fdc3bc3f1ef55ab330be43033410b267f7c0809a9dc +"dotenv@npm:16.4.5, dotenv@npm:^16.3.0": + version: 16.4.5 + resolution: "dotenv@npm:16.4.5" + checksum: 10/55a3134601115194ae0f924e54473459ed0d9fc340ae610b676e248cca45aa7c680d86365318ea964e6da4e2ea80c4514c1adab5adb43d6867fb57ff068f95c8 languageName: node linkType: hard @@ -9431,16 +8248,6 @@ __metadata: languageName: node linkType: hard -"duration@npm:^0.2.2": - version: 0.2.2 - resolution: "duration@npm:0.2.2" - dependencies: - d: "npm:1" - es5-ext: "npm:~0.10.46" - checksum: 10/823c7d1d06c5126346147e5271ddce1c1bd186c110beaac3d18f22a83a1725d4a66c29bbefe1a550cd49a093727978a01708628c2f0d479eb2abd9e0afb77554 - languageName: node - linkType: hard - "eastasianwidth@npm:^0.2.0": version: 0.2.0 resolution: "eastasianwidth@npm:0.2.0" @@ -9448,6 +8255,15 @@ __metadata: languageName: node linkType: hard +"ecdsa-sig-formatter@npm:1.0.11": + version: 1.0.11 + resolution: "ecdsa-sig-formatter@npm:1.0.11" + dependencies: + safe-buffer: "npm:^5.0.1" + checksum: 10/878e1aab8a42773320bc04c6de420bee21aebd71810e40b1799880a8a1c4594bcd6adc3d4213a0fb8147d4c3f529d8f9a618d7f59ad5a9a41b142058aceda23f + languageName: node + linkType: hard + "ee-first@npm:1.1.1": version: 1.1.1 resolution: "ee-first@npm:1.1.1" @@ -9490,13 +8306,6 @@ __metadata: languageName: node linkType: hard -"enabled@npm:2.0.x": - version: 2.0.0 - resolution: "enabled@npm:2.0.0" - checksum: 10/9d256d89f4e8a46ff988c6a79b22fa814b4ffd82826c4fdacd9b42e9b9465709d3b748866d0ab4d442dfc6002d81de7f7b384146ccd1681f6a7f868d2acca063 - languageName: node - linkType: hard - "encodeurl@npm:~1.0.2": version: 1.0.2 resolution: "encodeurl@npm:1.0.2" @@ -9513,12 +8322,13 @@ __metadata: languageName: node linkType: hard -"end-of-stream@npm:^1.0.0, end-of-stream@npm:^1.1.0, end-of-stream@npm:^1.4.1": - version: 1.4.4 - resolution: "end-of-stream@npm:1.4.4" +"enhanced-resolve@npm:^5.0.0, enhanced-resolve@npm:^5.15.0, enhanced-resolve@npm:^5.7.0": + version: 5.16.1 + resolution: "enhanced-resolve@npm:5.16.1" dependencies: - once: "npm:^1.4.0" - checksum: 10/530a5a5a1e517e962854a31693dbb5c0b2fc40b46dad2a56a2deec656ca040631124f4795823acc68238147805f8b021abbe221f4afed5ef3c8e8efc2024908b + graceful-fs: "npm:^4.2.4" + tapable: "npm:^2.2.0" + checksum: 10/1c44474437ec52d938ee0776d5883d5fec8fc645bccbebf6eb58229f3223c111bc1f5cb94222949a5a4565e7a2d7c34f03a0f7e97c10d6cd800e7a46c95e3aec languageName: node linkType: hard @@ -9619,6 +8429,22 @@ __metadata: languageName: node linkType: hard +"es-define-property@npm:^1.0.0": + version: 1.0.0 + resolution: "es-define-property@npm:1.0.0" + dependencies: + get-intrinsic: "npm:^1.2.4" + checksum: 10/f66ece0a887b6dca71848fa71f70461357c0e4e7249696f81bad0a1f347eed7b31262af4a29f5d726dc026426f085483b6b90301855e647aa8e21936f07293c6 + languageName: node + linkType: hard + +"es-errors@npm:^1.3.0": + version: 1.3.0 + resolution: "es-errors@npm:1.3.0" + checksum: 10/96e65d640156f91b707517e8cdc454dd7d47c32833aa3e85d79f24f9eb7ea85f39b63e36216ef0114996581969b59fe609a94e30316b08f5f4df1d44134cf8d5 + languageName: node + linkType: hard + "es-get-iterator@npm:^1.1.3": version: 1.1.3 resolution: "es-get-iterator@npm:1.1.3" @@ -9658,6 +8484,13 @@ __metadata: languageName: node linkType: hard +"es-module-lexer@npm:^1.2.1": + version: 1.5.3 + resolution: "es-module-lexer@npm:1.5.3" + checksum: 10/2d80297e955f52ec6a4c7c7683ec2ee80b33c61b46af4f6ed3ef8feab16ba10fd4798141132b3fd0f5e2edb36abd4ad50c63cf3e26da2cca1c56debc68816c44 + languageName: node + linkType: hard + "es-set-tostringtag@npm:^2.0.1": version: 2.0.2 resolution: "es-set-tostringtag@npm:2.0.2" @@ -9689,144 +8522,6 @@ __metadata: languageName: node linkType: hard -"es5-ext@npm:^0.10.35, es5-ext@npm:^0.10.46, es5-ext@npm:^0.10.47, es5-ext@npm:^0.10.49, es5-ext@npm:^0.10.50, es5-ext@npm:^0.10.53, es5-ext@npm:^0.10.61, es5-ext@npm:^0.10.62, es5-ext@npm:~0.10.14, es5-ext@npm:~0.10.2, es5-ext@npm:~0.10.46": - version: 0.10.62 - resolution: "es5-ext@npm:0.10.62" - dependencies: - es6-iterator: "npm:^2.0.3" - es6-symbol: "npm:^3.1.3" - next-tick: "npm:^1.1.0" - checksum: 10/3f6a3bcdb7ff82aaf65265799729828023c687a2645da04005b8f1dc6676a0c41fd06571b2517f89dcf143e0268d3d9ef0fdfd536ab74580083204c688d6fb45 - languageName: node - linkType: hard - -"es6-iterator@npm:^2.0.3, es6-iterator@npm:~2.0.3": - version: 2.0.3 - resolution: "es6-iterator@npm:2.0.3" - dependencies: - d: "npm:1" - es5-ext: "npm:^0.10.35" - es6-symbol: "npm:^3.1.1" - checksum: 10/dbadecf3d0e467692815c2b438dfa99e5a97cbbecf4a58720adcb467a04220e0e36282399ba297911fd472c50ae4158fffba7ed0b7d4273fe322b69d03f9e3a5 - languageName: node - linkType: hard - -"es6-set@npm:^0.1.6": - version: 0.1.6 - resolution: "es6-set@npm:0.1.6" - dependencies: - d: "npm:^1.0.1" - es5-ext: "npm:^0.10.62" - es6-iterator: "npm:~2.0.3" - es6-symbol: "npm:^3.1.3" - event-emitter: "npm:^0.3.5" - type: "npm:^2.7.2" - checksum: 10/45e8a4432edf71be7e0b7415ec434f62e294a6cb790646a5475b01ac13fda820141eab9fa7d18e91f4e5977bdf8d27d944123fafd15740a1c7f832a2caf45ba4 - languageName: node - linkType: hard - -"es6-symbol@npm:^3.1.1, es6-symbol@npm:^3.1.3": - version: 3.1.3 - resolution: "es6-symbol@npm:3.1.3" - dependencies: - d: "npm:^1.0.1" - ext: "npm:^1.1.2" - checksum: 10/b404e5ecae1a076058aa2ba2568d87e2cb4490cb1130784b84e7b4c09c570b487d4f58ed685a08db8d350bd4916500dd3d623b26e6b3520841d30d2ebb152f8d - languageName: node - linkType: hard - -"es6-weak-map@npm:^2.0.3": - version: 2.0.3 - resolution: "es6-weak-map@npm:2.0.3" - dependencies: - d: "npm:1" - es5-ext: "npm:^0.10.46" - es6-iterator: "npm:^2.0.3" - es6-symbol: "npm:^3.1.1" - checksum: 10/5958a321cf8dfadc82b79eeaa57dc855893a4afd062b4ef5c9ded0010d3932099311272965c3d3fdd3c85df1d7236013a570e704fa6c1f159bbf979c203dd3a3 - languageName: node - linkType: hard - -"esbuild@npm:0.20.2": - version: 0.20.2 - resolution: "esbuild@npm:0.20.2" - dependencies: - "@esbuild/aix-ppc64": "npm:0.20.2" - "@esbuild/android-arm": "npm:0.20.2" - "@esbuild/android-arm64": "npm:0.20.2" - "@esbuild/android-x64": "npm:0.20.2" - "@esbuild/darwin-arm64": "npm:0.20.2" - "@esbuild/darwin-x64": "npm:0.20.2" - "@esbuild/freebsd-arm64": "npm:0.20.2" - "@esbuild/freebsd-x64": "npm:0.20.2" - "@esbuild/linux-arm": "npm:0.20.2" - "@esbuild/linux-arm64": "npm:0.20.2" - "@esbuild/linux-ia32": "npm:0.20.2" - "@esbuild/linux-loong64": "npm:0.20.2" - "@esbuild/linux-mips64el": "npm:0.20.2" - "@esbuild/linux-ppc64": "npm:0.20.2" - "@esbuild/linux-riscv64": "npm:0.20.2" - "@esbuild/linux-s390x": "npm:0.20.2" - "@esbuild/linux-x64": "npm:0.20.2" - "@esbuild/netbsd-x64": "npm:0.20.2" - "@esbuild/openbsd-x64": "npm:0.20.2" - "@esbuild/sunos-x64": "npm:0.20.2" - "@esbuild/win32-arm64": "npm:0.20.2" - "@esbuild/win32-ia32": "npm:0.20.2" - "@esbuild/win32-x64": "npm:0.20.2" - dependenciesMeta: - "@esbuild/aix-ppc64": - optional: true - "@esbuild/android-arm": - optional: true - "@esbuild/android-arm64": - optional: true - "@esbuild/android-x64": - optional: true - "@esbuild/darwin-arm64": - optional: true - "@esbuild/darwin-x64": - optional: true - "@esbuild/freebsd-arm64": - optional: true - "@esbuild/freebsd-x64": - optional: true - "@esbuild/linux-arm": - optional: true - "@esbuild/linux-arm64": - optional: true - "@esbuild/linux-ia32": - optional: true - "@esbuild/linux-loong64": - optional: true - "@esbuild/linux-mips64el": - optional: true - "@esbuild/linux-ppc64": - optional: true - "@esbuild/linux-riscv64": - optional: true - "@esbuild/linux-s390x": - optional: true - "@esbuild/linux-x64": - optional: true - "@esbuild/netbsd-x64": - optional: true - "@esbuild/openbsd-x64": - optional: true - "@esbuild/sunos-x64": - optional: true - "@esbuild/win32-arm64": - optional: true - "@esbuild/win32-ia32": - optional: true - "@esbuild/win32-x64": - optional: true - bin: - esbuild: bin/esbuild - checksum: 10/663215ab7e599651e00d61b528a63136e1f1d397db8b9c3712540af928c9476d61da95aefa81b7a8dfc7a9fdd7616fcf08395c27be68be8c99953fb461863ce4 - languageName: node - linkType: hard - "esbuild@npm:^0.19.2": version: 0.19.12 resolution: "esbuild@npm:0.19.12" @@ -9921,7 +8616,7 @@ __metadata: languageName: node linkType: hard -"escape-string-regexp@npm:^1.0.2, escape-string-regexp@npm:^1.0.5": +"escape-string-regexp@npm:^1.0.5": version: 1.0.5 resolution: "escape-string-regexp@npm:1.0.5" checksum: 10/6092fda75c63b110c706b6a9bfde8a612ad595b628f0bd2147eea1d3406723020810e591effc7db1da91d80a71a737a313567c5abb3813e8d9c71f4aa595b410 @@ -9942,6 +8637,13 @@ __metadata: languageName: node linkType: hard +"escape-string-regexp@npm:^5.0.0": + version: 5.0.0 + resolution: "escape-string-regexp@npm:5.0.0" + checksum: 10/20daabe197f3cb198ec28546deebcf24b3dbb1a5a269184381b3116d12f0532e06007f4bc8da25669d6a7f8efb68db0758df4cd981f57bc5b57f521a3e12c59e + languageName: node + linkType: hard + "escodegen@npm:^2.0.0": version: 2.1.0 resolution: "escodegen@npm:2.1.0" @@ -10226,7 +8928,7 @@ __metadata: languageName: node linkType: hard -"eslint-scope@npm:^5.1.1": +"eslint-scope@npm:5.1.1, eslint-scope@npm:^5.1.1": version: 5.1.1 resolution: "eslint-scope@npm:5.1.1" dependencies: @@ -10308,16 +9010,6 @@ __metadata: languageName: node linkType: hard -"esniff@npm:^1.1.0": - version: 1.1.3 - resolution: "esniff@npm:1.1.3" - dependencies: - d: "npm:^1.0.1" - es5-ext: "npm:^0.10.62" - checksum: 10/595bd73a9477347524bbec9880f8d09fb8112588196806280fa9e0859664271f19ca4bf5bb3d6c3086da0ae600544d1467ac913d023a497f6c2601135858b0c5 - languageName: node - linkType: hard - "espree@npm:^6.1.2": version: 6.2.1 resolution: "espree@npm:6.2.1" @@ -10368,15 +9060,6 @@ __metadata: languageName: node linkType: hard -"essentials@npm:^1.2.0": - version: 1.2.0 - resolution: "essentials@npm:1.2.0" - dependencies: - uni-global: "npm:^1.0.0" - checksum: 10/a283d3150feb4258deaab3b3f3c638979f92944564753658ae2e77f130f1c98d69856c5b12056936c1aacba8e02581db9cef0cbb2ceb2394067733cea28b5119 - languageName: node - linkType: hard - "estraverse@npm:^4.1.1": version: 4.3.0 resolution: "estraverse@npm:4.3.0" @@ -10412,20 +9095,17 @@ __metadata: languageName: node linkType: hard -"event-emitter@npm:^0.3.5": - version: 0.3.5 - resolution: "event-emitter@npm:0.3.5" - dependencies: - d: "npm:1" - es5-ext: "npm:~0.10.14" - checksum: 10/a7f5ea80029193f4869782d34ef7eb43baa49cd397013add1953491b24588468efbe7e3cc9eb87d53f33397e7aab690fd74c079ec440bf8b12856f6bdb6e9396 +"eventemitter3@npm:^3.1.0": + version: 3.1.2 + resolution: "eventemitter3@npm:3.1.2" + checksum: 10/e2886001beb52cd2fe47d2470fd6266b7c70bd3ac356c0041a7e64336ed57bb1fc9b07bc9043d34b39913488a8d81bfcde62d3af597974980aa01b50844d869b languageName: node linkType: hard -"events@npm:1.1.1": - version: 1.1.1 - resolution: "events@npm:1.1.1" - checksum: 10/524355c4364b4851d53ccf4fdab9570e3953e1f64ebca15554f33e50bebb4e71ab947ac0dee6f4ed5a567ff2eda54b0489b278b4fb7c8ec1f4982150079dfd40 +"events@npm:^3.2.0": + version: 3.3.0 + resolution: "events@npm:3.3.0" + checksum: 10/a3d47e285e28d324d7180f1e493961a2bbb4cad6412090e4dec114f4db1f5b560c7696ee8e758f55e23913ede856e3689cd3aa9ae13c56b5d8314cd3b3ddd1be languageName: node linkType: hard @@ -10446,23 +9126,6 @@ __metadata: languageName: node linkType: hard -"execa@npm:^8.0.1": - version: 8.0.1 - resolution: "execa@npm:8.0.1" - dependencies: - cross-spawn: "npm:^7.0.3" - get-stream: "npm:^8.0.1" - human-signals: "npm:^5.0.0" - is-stream: "npm:^3.0.0" - merge-stream: "npm:^2.0.0" - npm-run-path: "npm:^5.1.0" - onetime: "npm:^6.0.0" - signal-exit: "npm:^4.1.0" - strip-final-newline: "npm:^3.0.0" - checksum: 10/d2ab5fe1e2bb92b9788864d0713f1fce9a07c4594e272c0c97bc18c90569897ab262e4ea58d27a694d288227a2e24f16f5e2575b44224ad9983b799dc7f1098d - languageName: node - linkType: hard - "exit@npm:^0.1.2": version: 0.1.2 resolution: "exit@npm:0.1.2" @@ -10529,31 +9192,42 @@ __metadata: languageName: node linkType: hard -"ext-list@npm:^2.0.0": - version: 2.2.2 - resolution: "ext-list@npm:2.2.2" - dependencies: - mime-db: "npm:^1.28.0" - checksum: 10/fe69fedbef044e14d4ce9e84c6afceb696ba71500c15b8d0ce0a1e280237e17c95031b3d62d5e597652fea0065b9bf957346b3900d989dff59128222231ac859 - languageName: node - linkType: hard - -"ext-name@npm:^5.0.0": - version: 5.0.0 - resolution: "ext-name@npm:5.0.0" - dependencies: - ext-list: "npm:^2.0.0" - sort-keys-length: "npm:^1.0.0" - checksum: 10/f598269bd5de4295540ea7d6f8f6a01d82a7508f148b7700a05628ef6121648d26e6e5e942049e953b3051863df6b54bd8fe951e7877f185e34ace5d44370b33 - languageName: node - linkType: hard - -"ext@npm:^1.1.2, ext@npm:^1.4.0, ext@npm:^1.6.0, ext@npm:^1.7.0": - version: 1.7.0 - resolution: "ext@npm:1.7.0" +"express@npm:4.19.2, express@npm:^4.17.1": + version: 4.19.2 + resolution: "express@npm:4.19.2" dependencies: - type: "npm:^2.7.2" - checksum: 10/666a135980b002df0e75c8ac6c389140cdc59ac953db62770479ee2856d58ce69d2f845e5f2586716350b725400f6945e51e9159573158c39f369984c72dcd84 + accepts: "npm:~1.3.8" + array-flatten: "npm:1.1.1" + body-parser: "npm:1.20.2" + content-disposition: "npm:0.5.4" + content-type: "npm:~1.0.4" + cookie: "npm:0.6.0" + cookie-signature: "npm:1.0.6" + debug: "npm:2.6.9" + depd: "npm:2.0.0" + encodeurl: "npm:~1.0.2" + escape-html: "npm:~1.0.3" + etag: "npm:~1.8.1" + finalhandler: "npm:1.2.0" + fresh: "npm:0.5.2" + http-errors: "npm:2.0.0" + merge-descriptors: "npm:1.0.1" + methods: "npm:~1.1.2" + on-finished: "npm:2.4.1" + parseurl: "npm:~1.3.3" + path-to-regexp: "npm:0.1.7" + proxy-addr: "npm:~2.0.7" + qs: "npm:6.11.0" + range-parser: "npm:~1.2.1" + safe-buffer: "npm:5.2.1" + send: "npm:0.18.0" + serve-static: "npm:1.15.0" + setprototypeof: "npm:1.2.0" + statuses: "npm:2.0.1" + type-is: "npm:~1.6.18" + utils-merge: "npm:1.0.1" + vary: "npm:~1.1.2" + checksum: 10/3fcd792536f802c059789ef48db3851b87e78fba103423e524144d79af37da7952a2b8d4e1a007f423329c7377d686d9476ac42e7d9ea413b80345d495e30a3a languageName: node linkType: hard @@ -10603,7 +9277,7 @@ __metadata: languageName: node linkType: hard -"fast-glob@npm:^3.2.12, fast-glob@npm:^3.2.7, fast-glob@npm:^3.2.9, fast-glob@npm:^3.3.0, fast-glob@npm:^3.3.1": +"fast-glob@npm:3.3.2, fast-glob@npm:^3.2.12, fast-glob@npm:^3.2.9, fast-glob@npm:^3.3.0, fast-glob@npm:^3.3.1, fast-glob@npm:^3.3.2": version: 3.3.2 resolution: "fast-glob@npm:3.3.2" dependencies: @@ -10639,7 +9313,7 @@ __metadata: languageName: node linkType: hard -"fast-safe-stringify@npm:^2.1.1": +"fast-safe-stringify@npm:2.1.1, fast-safe-stringify@npm:^2.1.1": version: 2.1.1 resolution: "fast-safe-stringify@npm:2.1.1" checksum: 10/dc1f063c2c6ac9533aee14d406441f86783a8984b2ca09b19c2fe281f9ff59d315298bc7bc22fd1f83d26fe19ef2f20e2ddb68e96b15040292e555c5ced0c1e4 @@ -10655,24 +9329,6 @@ __metadata: languageName: node linkType: hard -"fast-xml-parser@npm:4.2.5": - version: 4.2.5 - resolution: "fast-xml-parser@npm:4.2.5" - dependencies: - strnum: "npm:^1.0.5" - bin: - fxparser: src/cli/cli.js - checksum: 10/4be7ebe24d6a9a60c278e1423cd86a7da9a77ec64c95563e2c552363caf7a777e0c87c9de1255c2f4e8dea9bce8905dc2bdc58a34e9f2b73c4693654456ad284 - languageName: node - linkType: hard - -"fastest-levenshtein@npm:^1.0.16": - version: 1.0.16 - resolution: "fastest-levenshtein@npm:1.0.16" - checksum: 10/ee85d33b5cef592033f70e1c13ae8624055950b4eb832435099cd56aa313d7f251b873bedbc06a517adfaff7b31756d139535991e2406967438e03a1bf1b008e - languageName: node - linkType: hard - "fastq@npm:^1.6.0": version: 1.16.0 resolution: "fastq@npm:1.16.0" @@ -10683,140 +9339,61 @@ __metadata: linkType: hard "fb-watchman@npm:^2.0.0": - version: 2.0.2 - resolution: "fb-watchman@npm:2.0.2" - dependencies: - bser: "npm:2.1.1" - checksum: 10/4f95d336fb805786759e383fd7fff342ceb7680f53efcc0ef82f502eb479ce35b98e8b207b6dfdfeea0eba845862107dc73813775fc6b56b3098c6e90a2dad77 - languageName: node - linkType: hard - -"fbjs-css-vars@npm:^1.0.0": - version: 1.0.2 - resolution: "fbjs-css-vars@npm:1.0.2" - checksum: 10/72baf6d22c45b75109118b4daecb6c8016d4c83c8c0f23f683f22e9d7c21f32fff6201d288df46eb561e3c7d4bb4489b8ad140b7f56444c453ba407e8bd28511 - languageName: node - linkType: hard - -"fbjs@npm:^3.0.0": - version: 3.0.5 - resolution: "fbjs@npm:3.0.5" - dependencies: - cross-fetch: "npm:^3.1.5" - fbjs-css-vars: "npm:^1.0.0" - loose-envify: "npm:^1.0.0" - object-assign: "npm:^4.1.0" - promise: "npm:^7.1.1" - setimmediate: "npm:^1.0.5" - ua-parser-js: "npm:^1.0.35" - checksum: 10/71252595b00b06fb0475a295c74d81ada1cc499b7e11f2cde51fef04618affa568f5b7f4927f61720c23254b9144be28f8acb2086a5001cf65df8eec87c6ca5c - languageName: node - linkType: hard - -"fd-slicer@npm:~1.1.0": - version: 1.1.0 - resolution: "fd-slicer@npm:1.1.0" - dependencies: - pend: "npm:~1.2.0" - checksum: 10/db3e34fa483b5873b73f248e818f8a8b59a6427fd8b1436cd439c195fdf11e8659419404826059a642b57d18075c856d06d6a50a1413b714f12f833a9341ead3 - languageName: node - linkType: hard - -"fecha@npm:^4.2.0": - version: 4.2.3 - resolution: "fecha@npm:4.2.3" - checksum: 10/534ce630c8f63c116292145607fc18c0f06bfa2fd74094357bf65daacc5d3f4f2b285bf8eb112c3bbf98c5caa6d386cced797f44b9b1b33da0c0a81020444826 - languageName: node - linkType: hard - -"figures@npm:^3.0.0": - version: 3.2.0 - resolution: "figures@npm:3.2.0" - dependencies: - escape-string-regexp: "npm:^1.0.5" - checksum: 10/a3bf94e001be51d3770500789157f067218d4bc681a65e1f69d482de15120bcac822dceb1a7b3803f32e4e3a61a46df44f7f2c8ba95d6375e7491502e0dd3d97 - languageName: node - linkType: hard - -"file-entry-cache@npm:^6.0.1": - version: 6.0.1 - resolution: "file-entry-cache@npm:6.0.1" - dependencies: - flat-cache: "npm:^3.0.4" - checksum: 10/099bb9d4ab332cb93c48b14807a6918a1da87c45dce91d4b61fd40e6505d56d0697da060cb901c729c90487067d93c9243f5da3dc9c41f0358483bfdebca736b - languageName: node - linkType: hard - -"file-stream-rotator@npm:^0.6.1": - version: 0.6.1 - resolution: "file-stream-rotator@npm:0.6.1" - dependencies: - moment: "npm:^2.29.1" - checksum: 10/8014bad7aca807b7437b8696c58142ea939d6a50473eff9df36dcbcf66899a78130f762494c0500baa4b0687f33c1a714d1dd191446a7781868a68fc5024dac5 - languageName: node - linkType: hard - -"file-type@npm:^16.5.4": - version: 16.5.4 - resolution: "file-type@npm:16.5.4" - dependencies: - readable-web-to-node-stream: "npm:^3.0.0" - strtok3: "npm:^6.2.4" - token-types: "npm:^4.1.1" - checksum: 10/46ced46bb925ab547e0a6d43108a26d043619d234cb0588d7abce7b578dafac142bcfd2e23a6adb0a4faa4b951bd1b14b355134a193362e07cd352f9bf0dc349 - languageName: node - linkType: hard - -"file-type@npm:^3.8.0": - version: 3.9.0 - resolution: "file-type@npm:3.9.0" - checksum: 10/1c8bc99bbb9cfcf13d3489e0c0250188dde622658b5a990f2ba09e6c784f183556b37b7de22104b4b0fd87f478ce12f8dc199b988616ce7cdcb41248dc0a79f9 - languageName: node - linkType: hard - -"file-type@npm:^4.2.0": - version: 4.4.0 - resolution: "file-type@npm:4.4.0" - checksum: 10/92b417a5c736ee972ba34e6a67413a6e7a3b652a624861beb5c6ace748eb684904b59712a250ac79f807d9928ba5980188bff1d8e853a72e43fb27ad340e19b2 + version: 2.0.2 + resolution: "fb-watchman@npm:2.0.2" + dependencies: + bser: "npm:2.1.1" + checksum: 10/4f95d336fb805786759e383fd7fff342ceb7680f53efcc0ef82f502eb479ce35b98e8b207b6dfdfeea0eba845862107dc73813775fc6b56b3098c6e90a2dad77 languageName: node linkType: hard -"file-type@npm:^5.2.0": - version: 5.2.0 - resolution: "file-type@npm:5.2.0" - checksum: 10/73b44eaba7a3e0684d35f24bb3f98ea8a943bf897e103768371b747b0714618301411e66ceff717c866db780af6f5bb1a3da15b744c2e04fa83d605a0682b72b +"fbjs-css-vars@npm:^1.0.0": + version: 1.0.2 + resolution: "fbjs-css-vars@npm:1.0.2" + checksum: 10/72baf6d22c45b75109118b4daecb6c8016d4c83c8c0f23f683f22e9d7c21f32fff6201d288df46eb561e3c7d4bb4489b8ad140b7f56444c453ba407e8bd28511 languageName: node linkType: hard -"file-type@npm:^6.1.0": - version: 6.2.0 - resolution: "file-type@npm:6.2.0" - checksum: 10/c7214c3cf6c72a4ed02b473a792841b4bf626a8e95bb010bd8679016b86e5bf52117264c3133735a8424bfde378c3a39b90e1f4902f5f294c41de4e81ec85fdc +"fbjs@npm:^3.0.0": + version: 3.0.5 + resolution: "fbjs@npm:3.0.5" + dependencies: + cross-fetch: "npm:^3.1.5" + fbjs-css-vars: "npm:^1.0.0" + loose-envify: "npm:^1.0.0" + object-assign: "npm:^4.1.0" + promise: "npm:^7.1.1" + setimmediate: "npm:^1.0.5" + ua-parser-js: "npm:^1.0.35" + checksum: 10/71252595b00b06fb0475a295c74d81ada1cc499b7e11f2cde51fef04618affa568f5b7f4927f61720c23254b9144be28f8acb2086a5001cf65df8eec87c6ca5c languageName: node linkType: hard -"filename-reserved-regex@npm:^2.0.0": - version: 2.0.0 - resolution: "filename-reserved-regex@npm:2.0.0" - checksum: 10/9322b45726b86c45d0b4fe91be5c51e62b2e7e63db02c4a6ff3fd499bbc134d12fbf3c8b91979440ef45b3be834698ab9c3e66cb63b79fea4817e33da237d32a +"figures@npm:^3.0.0": + version: 3.2.0 + resolution: "figures@npm:3.2.0" + dependencies: + escape-string-regexp: "npm:^1.0.5" + checksum: 10/a3bf94e001be51d3770500789157f067218d4bc681a65e1f69d482de15120bcac822dceb1a7b3803f32e4e3a61a46df44f7f2c8ba95d6375e7491502e0dd3d97 languageName: node linkType: hard -"filenamify@npm:^4.3.0": - version: 4.3.0 - resolution: "filenamify@npm:4.3.0" +"figures@npm:^5.0.0": + version: 5.0.0 + resolution: "figures@npm:5.0.0" dependencies: - filename-reserved-regex: "npm:^2.0.0" - strip-outer: "npm:^1.0.1" - trim-repeated: "npm:^1.0.0" - checksum: 10/5b71a7ff8e958c8621957e6fbf7872024126d3b5da50f59b1634af3343ba1a69d4cc15cfe4ca4bbfa7c959ad4d98614ee51e6f1d9fa7326eef8ceda2da8cd74e + escape-string-regexp: "npm:^5.0.0" + is-unicode-supported: "npm:^1.2.0" + checksum: 10/951d18be2f450c90462c484eff9bda705293319bc2f17b250194a0cf1a291600db4cb283a6ce199d49380c95b08d85d822ce4b18d2f9242663fd5895476d667c languageName: node linkType: hard -"filesize@npm:^8.0.7": - version: 8.0.7 - resolution: "filesize@npm:8.0.7" - checksum: 10/e35f1799c314cef49a585af82fe2d15b362f743a74c95f06e3dd99cf0334ca45516ed144f6a58649ca0e2e5e63844c0ef476d9374d5d43736d26f7c13aa49dad +"file-entry-cache@npm:^6.0.1": + version: 6.0.1 + resolution: "file-entry-cache@npm:6.0.1" + dependencies: + flat-cache: "npm:^3.0.4" + checksum: 10/099bb9d4ab332cb93c48b14807a6918a1da87c45dce91d4b61fd40e6505d56d0697da060cb901c729c90487067d93c9243f5da3dc9c41f0358483bfdebca736b languageName: node linkType: hard @@ -10829,6 +9406,15 @@ __metadata: languageName: node linkType: hard +"fill-range@npm:^7.1.1": + version: 7.1.1 + resolution: "fill-range@npm:7.1.1" + dependencies: + to-regex-range: "npm:^5.0.1" + checksum: 10/a7095cb39e5bc32fada2aa7c7249d3f6b01bd1ce461a61b0adabacccabd9198500c6fb1f68a7c851a657e273fce2233ba869638897f3d7ed2e87a2d89b4436ea + languageName: node + linkType: hard + "finalhandler@npm:1.2.0": version: 1.2.0 resolution: "finalhandler@npm:1.2.0" @@ -10844,18 +9430,6 @@ __metadata: languageName: node linkType: hard -"find-requires@npm:^1.0.0": - version: 1.0.0 - resolution: "find-requires@npm:1.0.0" - dependencies: - es5-ext: "npm:^0.10.49" - esniff: "npm:^1.1.0" - bin: - find-requires: ./bin/find-requires.js - checksum: 10/02c2a35da7cfbdc38ea6e3e130aa5d11c2fdd82f83fe13ecc5f906305d05da4af066545e89b4ed9b773a6632e7a83a238ba8bdd89f2825442751329dee5d5e24 - languageName: node - linkType: hard - "find-up@npm:^4.0.0, find-up@npm:^4.1.0": version: 4.1.0 resolution: "find-up@npm:4.1.0" @@ -10897,15 +9471,6 @@ __metadata: languageName: node linkType: hard -"flat@npm:^5.0.2": - version: 5.0.2 - resolution: "flat@npm:5.0.2" - bin: - flat: cli.js - checksum: 10/72479e651c15eab53e25ce04c31bab18cfaac0556505cac19221dbbe85bbb9686bc76e4d397e89e5bf516ce667dcf818f8b07e585568edba55abc2bf1f698fb5 - languageName: node - linkType: hard - "flatted@npm:^3.2.9": version: 3.2.9 resolution: "flatted@npm:3.2.9" @@ -10913,23 +9478,6 @@ __metadata: languageName: node linkType: hard -"fn.name@npm:1.x.x": - version: 1.1.0 - resolution: "fn.name@npm:1.1.0" - checksum: 10/000198af190ae02f0138ac5fa4310da733224c628e0230c81e3fff7c4e094af7e0e8bb9f4357cabd21db601759d89f3445da744afbae20623cfa41edf3888397 - languageName: node - linkType: hard - -"follow-redirects@npm:^1.15.4": - version: 1.15.4 - resolution: "follow-redirects@npm:1.15.4" - peerDependenciesMeta: - debug: - optional: true - checksum: 10/2e8f5f259a6b02dfa8dc199e08431848a7c3beed32eb4c19945966164a52c89f07b86c3afcc32ebe4279cf0a960520e45a63013d6350309c5ec90133c5d9351a - languageName: node - linkType: hard - "follow-redirects@npm:^1.15.6": version: 1.15.6 resolution: "follow-redirects@npm:1.15.6" @@ -10959,6 +9507,29 @@ __metadata: languageName: node linkType: hard +"fork-ts-checker-webpack-plugin@npm:9.0.2": + version: 9.0.2 + resolution: "fork-ts-checker-webpack-plugin@npm:9.0.2" + dependencies: + "@babel/code-frame": "npm:^7.16.7" + chalk: "npm:^4.1.2" + chokidar: "npm:^3.5.3" + cosmiconfig: "npm:^8.2.0" + deepmerge: "npm:^4.2.2" + fs-extra: "npm:^10.0.0" + memfs: "npm:^3.4.1" + minimatch: "npm:^3.0.4" + node-abort-controller: "npm:^3.0.1" + schema-utils: "npm:^3.1.1" + semver: "npm:^7.3.5" + tapable: "npm:^2.2.1" + peerDependencies: + typescript: ">3.6.0" + webpack: ^5.11.0 + checksum: 10/3399ea114d9397da5e51baaa1cf2ca704f4616c8255df672889cafc2a823f77e8bf9913133852d29d676657b1d40e4a2fba8eb9fafee09e00faeda924289220e + languageName: node + linkType: hard + "form-data@npm:^4.0.0": version: 4.0.0 resolution: "form-data@npm:4.0.0" @@ -10970,15 +9541,14 @@ __metadata: languageName: node linkType: hard -"formidable@npm:^2.0.1": - version: 2.1.2 - resolution: "formidable@npm:2.1.2" +"formidable@npm:^3.5.1": + version: 3.5.1 + resolution: "formidable@npm:3.5.1" dependencies: dezalgo: "npm:^1.0.4" hexoid: "npm:^1.0.0" once: "npm:^1.4.0" - qs: "npm:^6.11.0" - checksum: 10/d385180e0461f65e6f7b70452859fe1c32aa97a290c2ca33f00cdc33145ef44fa68bbc9b93af2c3af73ae726e42c3477c6619c49f3c34b49934e9481275b7b4c + checksum: 10/c9a7bbbd4ca8142893da88b51cf7797adee022344ea180cf157a108bf999bed5ad8bc07a10a28d8a39fcbfaa02e8cba07f4ba336fbeb330deb23907336ba1fc2 languageName: node linkType: hard @@ -10989,13 +9559,6 @@ __metadata: languageName: node linkType: hard -"fp-ts@npm:^2.13.1": - version: 2.16.2 - resolution: "fp-ts@npm:2.16.2" - checksum: 10/61c1f3db171191527e9d902a8a0195942e8de9380c0c491c61e3e2c39d6007c6432be03e9f55d73dd8aae1431f35083c729636c59bbd185830b09e5db2615adb - languageName: node - linkType: hard - "fraction.js@npm:^4.3.7": version: 4.3.7 resolution: "fraction.js@npm:4.3.7" @@ -11010,21 +9573,14 @@ __metadata: languageName: node linkType: hard -"fs-constants@npm:^1.0.0": - version: 1.0.0 - resolution: "fs-constants@npm:1.0.0" - checksum: 10/18f5b718371816155849475ac36c7d0b24d39a11d91348cfcb308b4494824413e03572c403c86d3a260e049465518c4f0d5bd00f0371cdfcad6d4f30a85b350d - languageName: node - linkType: hard - -"fs-extra@npm:^11.1.0, fs-extra@npm:^11.2.0": - version: 11.2.0 - resolution: "fs-extra@npm:11.2.0" +"fs-extra@npm:^10.0.0": + version: 10.1.0 + resolution: "fs-extra@npm:10.1.0" dependencies: graceful-fs: "npm:^4.2.0" jsonfile: "npm:^6.0.1" universalify: "npm:^2.0.0" - checksum: 10/0579bf6726a4cd054d4aa308f10b483f52478bb16284f32cf60b4ce0542063d551fca1a08a2af365e35db21a3fa5a06cf2a6ed614004b4368982bc754cb816b3 + checksum: 10/05ce2c3b59049bcb7b52001acd000e44b3c4af4ec1f8839f383ef41ec0048e3cfa7fd8a637b1bddfefad319145db89be91f4b7c1db2908205d38bf91e7d1d3b7 languageName: node linkType: hard @@ -11050,18 +9606,6 @@ __metadata: languageName: node linkType: hard -"fs-extra@npm:^9.1.0": - version: 9.1.0 - resolution: "fs-extra@npm:9.1.0" - dependencies: - at-least-node: "npm:^1.0.0" - graceful-fs: "npm:^4.2.0" - jsonfile: "npm:^6.0.1" - universalify: "npm:^2.0.0" - checksum: 10/08600da1b49552ed23dfac598c8fc909c66776dd130fea54fbcad22e330f7fcc13488bb995f6bc9ce5651aa35b65702faf616fe76370ee56f1aade55da982dca - languageName: node - linkType: hard - "fs-minipass@npm:^2.0.0": version: 2.1.0 resolution: "fs-minipass@npm:2.1.0" @@ -11080,6 +9624,13 @@ __metadata: languageName: node linkType: hard +"fs-monkey@npm:^1.0.4": + version: 1.0.6 + resolution: "fs-monkey@npm:1.0.6" + checksum: 10/a0502a23aa0b467f671cd5c7f989ff48611cce1f23deb8f6924862b49234ff37de6828f739a4f2c1acf8f20e80cb426bf6a9d135c401f3df1e7089b7de04c815 + languageName: node + linkType: hard + "fs.realpath@npm:^1.0.0": version: 1.0.0 resolution: "fs.realpath@npm:1.0.0" @@ -11087,21 +9638,6 @@ __metadata: languageName: node linkType: hard -"fs2@npm:^0.3.9": - version: 0.3.9 - resolution: "fs2@npm:0.3.9" - dependencies: - d: "npm:^1.0.1" - deferred: "npm:^0.7.11" - es5-ext: "npm:^0.10.53" - event-emitter: "npm:^0.3.5" - ignore: "npm:^5.1.8" - memoizee: "npm:^0.4.14" - type: "npm:^2.1.0" - checksum: 10/d9b7bd8433f5fc7ccf709d9636996eea80fa4df85a673428f1f7e9fd62ce0a362b29062fbc188c977a0d3cfb18389bb191be8aa9f3476ad1a3b6c6ae88060cc7 - languageName: node - linkType: hard - "fsevents@npm:^2.3.2, fsevents@npm:~2.3.2": version: 2.3.3 resolution: "fsevents@npm:2.3.3" @@ -11147,6 +9683,15 @@ __metadata: languageName: node linkType: hard +"generate-function@npm:^2.3.1": + version: 2.3.1 + resolution: "generate-function@npm:2.3.1" + dependencies: + is-property: "npm:^1.0.2" + checksum: 10/318f85af87c3258d86df4ebbb56b63a2ae52e71bd6cde8d0a79de09450de7422a7047fb1f8d52ccc135564a36cb986d73c63149eed96b7ac57e38acba44f29e2 + languageName: node + linkType: hard + "gensync@npm:^1.0.0-beta.2": version: 1.0.0-beta.2 resolution: "gensync@npm:1.0.0-beta.2" @@ -11173,53 +9718,33 @@ __metadata: languageName: node linkType: hard -"get-package-type@npm:^0.1.0": - version: 0.1.0 - resolution: "get-package-type@npm:0.1.0" - checksum: 10/bba0811116d11e56d702682ddef7c73ba3481f114590e705fc549f4d868972263896af313c57a25c076e3c0d567e11d919a64ba1b30c879be985fc9d44f96148 - languageName: node - linkType: hard - -"get-stdin@npm:^8.0.0": - version: 8.0.0 - resolution: "get-stdin@npm:8.0.0" - checksum: 10/40128b6cd25781ddbd233344f1a1e4006d4284906191ed0a7d55ec2c1a3e44d650f280b2c9eeab79c03ac3037da80257476c0e4e5af38ddfb902d6ff06282d77 - languageName: node - linkType: hard - -"get-stream@npm:^2.2.0": - version: 2.3.1 - resolution: "get-stream@npm:2.3.1" +"get-intrinsic@npm:^1.2.4": + version: 1.2.4 + resolution: "get-intrinsic@npm:1.2.4" dependencies: - object-assign: "npm:^4.0.1" - pinkie-promise: "npm:^2.0.0" - checksum: 10/712738e6a39b06da774aea5d35efa16a8f067a0d93b1b564e8d0e733fafddcf021e03098895735bc45d6594d3094369d700daa0d33891f980595cf6495e33294 + es-errors: "npm:^1.3.0" + function-bind: "npm:^1.1.2" + has-proto: "npm:^1.0.1" + has-symbols: "npm:^1.0.3" + hasown: "npm:^2.0.0" + checksum: 10/85bbf4b234c3940edf8a41f4ecbd4e25ce78e5e6ad4e24ca2f77037d983b9ef943fd72f00f3ee97a49ec622a506b67db49c36246150377efcda1c9eb03e5f06d languageName: node linkType: hard -"get-stream@npm:^5.1.0": - version: 5.2.0 - resolution: "get-stream@npm:5.2.0" - dependencies: - pump: "npm:^3.0.0" - checksum: 10/13a73148dca795e41421013da6e3ebff8ccb7fba4d2f023fd0c6da2c166ec4e789bec9774a73a7b49c08daf2cae552f8a3e914042ac23b5f59dd278cc8f9cbfb +"get-package-type@npm:^0.1.0": + version: 0.1.0 + resolution: "get-package-type@npm:0.1.0" + checksum: 10/bba0811116d11e56d702682ddef7c73ba3481f114590e705fc549f4d868972263896af313c57a25c076e3c0d567e11d919a64ba1b30c879be985fc9d44f96148 languageName: node linkType: hard -"get-stream@npm:^6.0.0, get-stream@npm:^6.0.1": +"get-stream@npm:^6.0.0": version: 6.0.1 resolution: "get-stream@npm:6.0.1" checksum: 10/781266d29725f35c59f1d214aedc92b0ae855800a980800e2923b3fbc4e56b3cb6e462c42e09a1cf1a00c64e056a78fa407cbe06c7c92b7e5cd49b4b85c2a497 languageName: node linkType: hard -"get-stream@npm:^8.0.1": - version: 8.0.1 - resolution: "get-stream@npm:8.0.1" - checksum: 10/dde5511e2e65a48e9af80fea64aff11b4921b14b6e874c6f8294c50975095af08f41bfb0b680c887f28b566dd6ec2cb2f960f9d36a323359be324ce98b766e9e - languageName: node - linkType: hard - "get-symbol-description@npm:^1.0.0": version: 1.0.0 resolution: "get-symbol-description@npm:1.0.0" @@ -11272,6 +9797,13 @@ __metadata: languageName: node linkType: hard +"glob-to-regexp@npm:^0.4.1": + version: 0.4.1 + resolution: "glob-to-regexp@npm:0.4.1" + checksum: 10/9009529195a955c40d7b9690794aeff5ba665cc38f1519e111c58bb54366fd0c106bde80acf97ba4e533208eb53422c83b136611a54c5fefb1edd8dc267cb62e + languageName: node + linkType: hard + "glob@npm:10.3.10, glob@npm:^10.2.2, glob@npm:^10.3.10": version: 10.3.10 resolution: "glob@npm:10.3.10" @@ -11287,7 +9819,7 @@ __metadata: languageName: node linkType: hard -"glob@npm:^7.0.5, glob@npm:^7.1.1, glob@npm:^7.1.3, glob@npm:^7.1.4, glob@npm:^7.1.6, glob@npm:^7.2.3": +"glob@npm:^7.0.0, glob@npm:^7.1.1, glob@npm:^7.1.3, glob@npm:^7.1.4": version: 7.2.3 resolution: "glob@npm:7.2.3" dependencies: @@ -11314,6 +9846,18 @@ __metadata: languageName: node linkType: hard +"glob@npm:^9.2.0": + version: 9.3.5 + resolution: "glob@npm:9.3.5" + dependencies: + fs.realpath: "npm:^1.0.0" + minimatch: "npm:^8.0.2" + minipass: "npm:^4.2.4" + path-scurry: "npm:^1.6.1" + checksum: 10/e5fa8a58adf53525bca42d82a1fad9e6800032b7e4d372209b80cfdca524dd9a7dbe7d01a92d7ed20d89c572457f12c250092bc8817cb4f1c63efefdf9b658c0 + languageName: node + linkType: hard + "global-dirs@npm:^0.1.1": version: 0.1.1 resolution: "global-dirs@npm:0.1.1" @@ -11348,7 +9892,7 @@ __metadata: languageName: node linkType: hard -"globby@npm:^11.0.0, globby@npm:^11.0.3, globby@npm:^11.0.4, globby@npm:^11.1.0": +"globby@npm:^11.0.0, globby@npm:^11.0.3, globby@npm:^11.1.0": version: 11.1.0 resolution: "globby@npm:11.1.0" dependencies: @@ -11371,26 +9915,7 @@ __metadata: languageName: node linkType: hard -"got@npm:^11.8.5, got@npm:^11.8.6": - version: 11.8.6 - resolution: "got@npm:11.8.6" - dependencies: - "@sindresorhus/is": "npm:^4.0.0" - "@szmarczak/http-timer": "npm:^4.0.5" - "@types/cacheable-request": "npm:^6.0.1" - "@types/responselike": "npm:^1.0.0" - cacheable-lookup: "npm:^5.0.3" - cacheable-request: "npm:^7.0.2" - decompress-response: "npm:^6.0.0" - http2-wrapper: "npm:^1.0.0-beta.5.2" - lowercase-keys: "npm:^2.0.0" - p-cancelable: "npm:^2.0.0" - responselike: "npm:^2.0.0" - checksum: 10/a30c74029d81bd5fe50dea1a0c970595d792c568e188ff8be254b5bc11e6158d1b014570772d4a30d0a97723e7dd34e7c8cc1a2f23018f60aece3070a7a5c2a5 - languageName: node - linkType: hard - -"graceful-fs@npm:^4.1.10, graceful-fs@npm:^4.1.2, graceful-fs@npm:^4.1.5, graceful-fs@npm:^4.1.6, graceful-fs@npm:^4.2.0, graceful-fs@npm:^4.2.10, graceful-fs@npm:^4.2.11, graceful-fs@npm:^4.2.4, graceful-fs@npm:^4.2.6, graceful-fs@npm:^4.2.9": +"graceful-fs@npm:^4.1.2, graceful-fs@npm:^4.1.5, graceful-fs@npm:^4.1.6, graceful-fs@npm:^4.2.0, graceful-fs@npm:^4.2.11, graceful-fs@npm:^4.2.4, graceful-fs@npm:^4.2.6, graceful-fs@npm:^4.2.9": version: 4.2.11 resolution: "graceful-fs@npm:4.2.11" checksum: 10/bf152d0ed1dc159239db1ba1f74fdbc40cb02f626770dcd5815c427ce0688c2635a06ed69af364396da4636d0408fcf7d4afdf7881724c3307e46aff30ca49e2 @@ -11411,15 +9936,6 @@ __metadata: languageName: node linkType: hard -"graphlib@npm:^2.1.8": - version: 2.1.8 - resolution: "graphlib@npm:2.1.8" - dependencies: - lodash: "npm:^4.17.15" - checksum: 10/37cbd851d3c1fb99f3174750ccaa22305d23d11746e5df81a38ba3bf25c0ba29cd9658ba69a0159ea81d56c28e8e875033eeaaa7167d838419fae08d9cd2c62c - languageName: node - linkType: hard - "graphql-config@npm:^5.0.2": version: 5.0.3 resolution: "graphql-config@npm:5.0.3" @@ -11457,7 +9973,7 @@ __metadata: languageName: node linkType: hard -"graphql-tag@npm:^2.11.0, graphql-tag@npm:^2.12.6": +"graphql-tag@npm:2.12.6, graphql-tag@npm:^2.11.0, graphql-tag@npm:^2.12.6": version: 2.12.6 resolution: "graphql-tag@npm:2.12.6" dependencies: @@ -11468,6 +9984,15 @@ __metadata: languageName: node linkType: hard +"graphql-ws@npm:5.14.3": + version: 5.14.3 + resolution: "graphql-ws@npm:5.14.3" + peerDependencies: + graphql: ">=0.11 <=16" + checksum: 10/ab528f7451824902eba1b81105386855db4017a7bea523451155962fc3bec17196c83acce856e5955ce6675957a5c89049d4b141fa6f2f4fa88eab4841a57d68 + languageName: node + linkType: hard + "graphql-ws@npm:^5.14.0": version: 5.15.0 resolution: "graphql-ws@npm:5.15.0" @@ -11512,6 +10037,13 @@ __metadata: languageName: node linkType: hard +"has-own-prop@npm:^2.0.0": + version: 2.0.0 + resolution: "has-own-prop@npm:2.0.0" + checksum: 10/ca6336e85ead2295c9603880cbc199e2d3ff7eaea0e9035d68fbc79892e9cf681abc62c0909520f112c671dad9961be2173b21dff951358cc98425c560e789e0 + languageName: node + linkType: hard + "has-property-descriptors@npm:^1.0.0": version: 1.0.1 resolution: "has-property-descriptors@npm:1.0.1" @@ -11521,6 +10053,15 @@ __metadata: languageName: node linkType: hard +"has-property-descriptors@npm:^1.0.2": + version: 1.0.2 + resolution: "has-property-descriptors@npm:1.0.2" + dependencies: + es-define-property: "npm:^1.0.0" + checksum: 10/2d8c9ab8cebb572e3362f7d06139a4592105983d4317e68f7adba320fe6ddfc8874581e0971e899e633fd5f72e262830edce36d5a0bc863dad17ad20572484b2 + languageName: node + linkType: hard + "has-proto@npm:^1.0.1": version: 1.0.1 resolution: "has-proto@npm:1.0.1" @@ -11611,7 +10152,7 @@ __metadata: languageName: node linkType: hard -"http-cache-semantics@npm:^4.0.0, http-cache-semantics@npm:^4.1.1": +"http-cache-semantics@npm:^4.1.1": version: 4.1.1 resolution: "http-cache-semantics@npm:4.1.1" checksum: 10/362d5ed66b12ceb9c0a328fb31200b590ab1b02f4a254a697dc796850cc4385603e75f53ec59f768b2dad3bfa1464bd229f7de278d2899a0e3beffc634b6683f @@ -11652,16 +10193,6 @@ __metadata: languageName: node linkType: hard -"http2-wrapper@npm:^1.0.0-beta.5.2": - version: 1.0.3 - resolution: "http2-wrapper@npm:1.0.3" - dependencies: - quick-lru: "npm:^5.1.1" - resolve-alpn: "npm:^1.0.0" - checksum: 10/8097ee2699440c2e64bda52124990cc5b0fb347401c7797b1a0c1efd5a0f79a4ebaa68e8a6ac3e2dde5f09460c1602764da6da2412bad628ed0a3b0ae35e72d4 - languageName: node - linkType: hard - "https-proxy-agent@npm:^5.0.0, https-proxy-agent@npm:^5.0.1": version: 5.0.1 resolution: "https-proxy-agent@npm:5.0.1" @@ -11706,13 +10237,6 @@ __metadata: languageName: node linkType: hard -"human-signals@npm:^5.0.0": - version: 5.0.0 - resolution: "human-signals@npm:5.0.0" - checksum: 10/30f8870d831cdcd2d6ec0486a7d35d49384996742052cee792854273fa9dd9e7d5db06bb7985d4953e337e10714e994e0302e90dc6848069171b05ec836d65b0 - languageName: node - linkType: hard - "husky@npm:9.0.11": version: 9.0.11 resolution: "husky@npm:9.0.11" @@ -11731,7 +10255,7 @@ __metadata: languageName: node linkType: hard -"iconv-lite@npm:0.6.3, iconv-lite@npm:^0.6.2": +"iconv-lite@npm:0.6.3, iconv-lite@npm:^0.6.2, iconv-lite@npm:^0.6.3": version: 0.6.3 resolution: "iconv-lite@npm:0.6.3" dependencies: @@ -11740,14 +10264,7 @@ __metadata: languageName: node linkType: hard -"ieee754@npm:1.1.13": - version: 1.1.13 - resolution: "ieee754@npm:1.1.13" - checksum: 10/5c2f365168e629b164f6b8863c399af03e4515cafb690fe143039c9bd76b8f670af6539a43859bbfbe7df707eac755478515319a357a29f8c5f17ec2daa24a4c - languageName: node - linkType: hard - -"ieee754@npm:^1.1.13, ieee754@npm:^1.1.4, ieee754@npm:^1.2.1": +"ieee754@npm:^1.1.13": version: 1.2.1 resolution: "ieee754@npm:1.2.1" checksum: 10/d9f2557a59036f16c282aaeb107832dc957a93d73397d89bbad4eb1130560560eb695060145e8e6b3b498b15ab95510226649a0b8f52ae06583575419fe10fc4 @@ -11761,7 +10278,7 @@ __metadata: languageName: node linkType: hard -"ignore@npm:^5.1.8, ignore@npm:^5.2.0, ignore@npm:^5.2.4": +"ignore@npm:^5.2.0, ignore@npm:^5.2.4": version: 5.3.0 resolution: "ignore@npm:5.3.0" checksum: 10/51594355cea4c6ad6b28b3b85eb81afa7b988a1871feefd7062baf136c95aa06760ee934fa9590e43d967bd377ce84a4cf6135fbeb6063e063f1182a0e9a3bcd @@ -11799,6 +10316,30 @@ __metadata: languageName: node linkType: hard +"import-in-the-middle@npm:1.4.2": + version: 1.4.2 + resolution: "import-in-the-middle@npm:1.4.2" + dependencies: + acorn: "npm:^8.8.2" + acorn-import-assertions: "npm:^1.9.0" + cjs-module-lexer: "npm:^1.2.2" + module-details-from-path: "npm:^1.0.3" + checksum: 10/fe853b5f4fe521b3dc6ee1946fd9ef3f4c1aaab33a1c80130e57983cab91f95b469d4da27878312bfd300f87b056ae1d7d77f5dbf636647418221fac174c8fc0 + languageName: node + linkType: hard + +"import-in-the-middle@npm:1.7.4": + version: 1.7.4 + resolution: "import-in-the-middle@npm:1.7.4" + dependencies: + acorn: "npm:^8.8.2" + acorn-import-attributes: "npm:^1.9.5" + cjs-module-lexer: "npm:^1.2.2" + module-details-from-path: "npm:^1.0.3" + checksum: 10/f1aeff5f3f4108be7c51b22d19a3528e527157c6c8671cef0aa8365c1cfa1d2f18342b7cba7a9478364ea564c483d33b9fcb34b5770d97db0a71e3ef0bd861eb + languageName: node + linkType: hard + "import-local@npm:^3.0.2": version: 3.1.0 resolution: "import-local@npm:3.1.0" @@ -11849,7 +10390,7 @@ __metadata: languageName: node linkType: hard -"inquirer@npm:^8.0.0, inquirer@npm:^8.2.5": +"inquirer@npm:8.2.6, inquirer@npm:^8.0.0": version: 8.2.6 resolution: "inquirer@npm:8.2.6" dependencies: @@ -11872,6 +10413,29 @@ __metadata: languageName: node linkType: hard +"inquirer@npm:9.2.12": + version: 9.2.12 + resolution: "inquirer@npm:9.2.12" + dependencies: + "@ljharb/through": "npm:^2.3.11" + ansi-escapes: "npm:^4.3.2" + chalk: "npm:^5.3.0" + cli-cursor: "npm:^3.1.0" + cli-width: "npm:^4.1.0" + external-editor: "npm:^3.1.0" + figures: "npm:^5.0.0" + lodash: "npm:^4.17.21" + mute-stream: "npm:1.0.0" + ora: "npm:^5.4.1" + run-async: "npm:^3.0.0" + rxjs: "npm:^7.8.1" + string-width: "npm:^4.2.3" + strip-ansi: "npm:^6.0.1" + wrap-ansi: "npm:^6.2.0" + checksum: 10/02b259c641fd6c6b88c0c530aced23389d586bd5360799bab0ae11d2a965ac5ce9c587402faefad70f08b8b56ccae56fb973da3a8deb6e17ba4577f803d427c5 + languageName: node + linkType: hard + "internal-slot@npm:^1.0.4, internal-slot@npm:^1.0.5": version: 1.0.6 resolution: "internal-slot@npm:1.0.6" @@ -11883,6 +10447,13 @@ __metadata: languageName: node linkType: hard +"interpret@npm:^1.0.0": + version: 1.4.0 + resolution: "interpret@npm:1.4.0" + checksum: 10/5beec568d3f60543d0f61f2c5969d44dffcb1a372fe5abcdb8013968114d4e4aaac06bc971a4c9f5bd52d150881d8ebad72a8c60686b1361f5f0522f39c0e1a3 + languageName: node + linkType: hard + "invariant@npm:^2.2.4": version: 2.2.4 resolution: "invariant@npm:2.2.4" @@ -11916,7 +10487,7 @@ __metadata: languageName: node linkType: hard -"is-arguments@npm:^1.0.4, is-arguments@npm:^1.1.1": +"is-arguments@npm:^1.1.1": version: 1.1.1 resolution: "is-arguments@npm:1.1.1" dependencies: @@ -11944,13 +10515,6 @@ __metadata: languageName: node linkType: hard -"is-arrayish@npm:^0.3.1": - version: 0.3.2 - resolution: "is-arrayish@npm:0.3.2" - checksum: 10/81a78d518ebd8b834523e25d102684ee0f7e98637136d3bdc93fd09636350fa06f1d8ca997ea28143d4d13cb1b69c0824f082db0ac13e1ab3311c10ffea60ade - languageName: node - linkType: hard - "is-async-function@npm:^2.0.0": version: 2.0.0 resolution: "is-async-function@npm:2.0.0" @@ -12013,7 +10577,7 @@ __metadata: languageName: node linkType: hard -"is-docker@npm:^2.0.0, is-docker@npm:^2.1.1, is-docker@npm:^2.2.1": +"is-docker@npm:^2.0.0": version: 2.2.1 resolution: "is-docker@npm:2.2.1" bin: @@ -12022,15 +10586,6 @@ __metadata: languageName: node linkType: hard -"is-docker@npm:^3.0.0": - version: 3.0.0 - resolution: "is-docker@npm:3.0.0" - bin: - is-docker: cli.js - checksum: 10/b698118f04feb7eaf3338922bd79cba064ea54a1c3db6ec8c0c8d8ee7613e7e5854d802d3ef646812a8a3ace81182a085dfa0a71cc68b06f3fa794b9783b3c90 - languageName: node - linkType: hard - "is-extglob@npm:^2.1.1": version: 2.1.1 resolution: "is-extglob@npm:2.1.1" @@ -12061,7 +10616,7 @@ __metadata: languageName: node linkType: hard -"is-generator-function@npm:^1.0.10, is-generator-function@npm:^1.0.7": +"is-generator-function@npm:^1.0.10": version: 1.0.10 resolution: "is-generator-function@npm:1.0.10" dependencies: @@ -12079,17 +10634,6 @@ __metadata: languageName: node linkType: hard -"is-inside-container@npm:^1.0.0": - version: 1.0.0 - resolution: "is-inside-container@npm:1.0.0" - dependencies: - is-docker: "npm:^3.0.0" - bin: - is-inside-container: cli.js - checksum: 10/c50b75a2ab66ab3e8b92b3bc534e1ea72ca25766832c0623ac22d134116a98bcf012197d1caabe1d1c4bd5f84363d4aa5c36bb4b585fbcaf57be172cd10a1a03 - languageName: node - linkType: hard - "is-interactive@npm:^1.0.0": version: 1.0.0 resolution: "is-interactive@npm:1.0.0" @@ -12120,13 +10664,6 @@ __metadata: languageName: node linkType: hard -"is-natural-number@npm:^4.0.1": - version: 4.0.1 - resolution: "is-natural-number@npm:4.0.1" - checksum: 10/3e5e3d52e0dfa4fea923b5d2b8a5cdbd9bf110c4598d30304b98528b02f40c9058a2abf1bae10bcbaf2bac18ace41cff7bc9673aff339f8c8297fae74ae0e75d - languageName: node - linkType: hard - "is-negative-zero@npm:^2.0.2": version: 2.0.2 resolution: "is-negative-zero@npm:2.0.2" @@ -12134,13 +10671,6 @@ __metadata: languageName: node linkType: hard -"is-network-error@npm:^1.0.0": - version: 1.1.0 - resolution: "is-network-error@npm:1.1.0" - checksum: 10/b2fe6aac07f814a9de275efd05934c832c129e7ba292d27614e9e8eec9e043b7a0bbeaeca5d0916b0f462edbec2aa2eaee974ee0a12ac095040e9515c222c251 - languageName: node - linkType: hard - "is-number-object@npm:^1.0.4": version: 1.0.7 resolution: "is-number-object@npm:1.0.7" @@ -12171,7 +10701,7 @@ __metadata: languageName: node linkType: hard -"is-plain-obj@npm:^1.0.0, is-plain-obj@npm:^1.1.0": +"is-plain-obj@npm:^1.1.0": version: 1.1.0 resolution: "is-plain-obj@npm:1.1.0" checksum: 10/0ee04807797aad50859652a7467481816cbb57e5cc97d813a7dcd8915da8195dc68c436010bf39d195226cde6a2d352f4b815f16f26b7bf486a5754290629931 @@ -12192,10 +10722,10 @@ __metadata: languageName: node linkType: hard -"is-promise@npm:^2.2.2": - version: 2.2.2 - resolution: "is-promise@npm:2.2.2" - checksum: 10/18bf7d1c59953e0ad82a1ed963fb3dc0d135c8f299a14f89a17af312fc918373136e56028e8831700e1933519630cc2fd4179a777030330fde20d34e96f40c78 +"is-property@npm:^1.0.2": + version: 1.0.2 + resolution: "is-property@npm:1.0.2" + checksum: 10/2f66eacb3d7237ba5c725496672edec656a20b12c80790921988578e6b11c258a062ce1e602f3cd2e3c2e05dd8b6e24e1d59254375207f157424a02ef0abb3d7 languageName: node linkType: hard @@ -12243,13 +10773,6 @@ __metadata: languageName: node linkType: hard -"is-stream@npm:^1.1.0": - version: 1.1.0 - resolution: "is-stream@npm:1.1.0" - checksum: 10/351aa77c543323c4e111204482808cfad68d2e940515949e31ccd0b010fc13d5fba4b9c230e4887fd24284713040f43e542332fbf172f6b9944b7d62e389c0ec - languageName: node - linkType: hard - "is-stream@npm:^2.0.0": version: 2.0.1 resolution: "is-stream@npm:2.0.1" @@ -12257,13 +10780,6 @@ __metadata: languageName: node linkType: hard -"is-stream@npm:^3.0.0": - version: 3.0.0 - resolution: "is-stream@npm:3.0.0" - checksum: 10/172093fe99119ffd07611ab6d1bcccfe8bc4aa80d864b15f43e63e54b7abc71e779acd69afdb854c4e2a67fdc16ae710e370eda40088d1cfc956a50ed82d8f16 - languageName: node - linkType: hard - "is-string@npm:^1.0.5, is-string@npm:^1.0.7": version: 1.0.7 resolution: "is-string@npm:1.0.7" @@ -12300,7 +10816,7 @@ __metadata: languageName: node linkType: hard -"is-typed-array@npm:^1.1.10, is-typed-array@npm:^1.1.12, is-typed-array@npm:^1.1.3, is-typed-array@npm:^1.1.9": +"is-typed-array@npm:^1.1.10, is-typed-array@npm:^1.1.12, is-typed-array@npm:^1.1.9": version: 1.1.12 resolution: "is-typed-array@npm:1.1.12" dependencies: @@ -12325,6 +10841,13 @@ __metadata: languageName: node linkType: hard +"is-unicode-supported@npm:^1.2.0": + version: 1.3.0 + resolution: "is-unicode-supported@npm:1.3.0" + checksum: 10/20a1fc161afafaf49243551a5ac33b6c4cf0bbcce369fcd8f2951fbdd000c30698ce320de3ee6830497310a8f41880f8066d440aa3eb0a853e2aa4836dd89abc + languageName: node + linkType: hard + "is-upper-case@npm:^2.0.2": version: 2.0.2 resolution: "is-upper-case@npm:2.0.2" @@ -12367,7 +10890,7 @@ __metadata: languageName: node linkType: hard -"is-wsl@npm:^2.1.1, is-wsl@npm:^2.2.0": +"is-wsl@npm:^2.2.0": version: 2.2.0 resolution: "is-wsl@npm:2.2.0" dependencies: @@ -12376,22 +10899,6 @@ __metadata: languageName: node linkType: hard -"is-wsl@npm:^3.1.0": - version: 3.1.0 - resolution: "is-wsl@npm:3.1.0" - dependencies: - is-inside-container: "npm:^1.0.0" - checksum: 10/f9734c81f2f9cf9877c5db8356bfe1ff61680f1f4c1011e91278a9c0564b395ae796addb4bf33956871041476ec82c3e5260ed57b22ac91794d4ae70a1d2f0a9 - languageName: node - linkType: hard - -"isarray@npm:^1.0.0, isarray@npm:~1.0.0": - version: 1.0.0 - resolution: "isarray@npm:1.0.0" - checksum: 10/f032df8e02dce8ec565cf2eb605ea939bdccea528dbcf565cdf92bfa2da9110461159d86a537388ef1acef8815a330642d7885b29010e8f7eac967c9993b65ab - languageName: node - linkType: hard - "isarray@npm:^2.0.5": version: 2.0.5 resolution: "isarray@npm:2.0.5" @@ -12399,6 +10906,13 @@ __metadata: languageName: node linkType: hard +"isarray@npm:~1.0.0": + version: 1.0.0 + resolution: "isarray@npm:1.0.0" + checksum: 10/f032df8e02dce8ec565cf2eb605ea939bdccea528dbcf565cdf92bfa2da9110461159d86a537388ef1acef8815a330642d7885b29010e8f7eac967c9993b65ab + languageName: node + linkType: hard + "isexe@npm:^2.0.0": version: 2.0.0 resolution: "isexe@npm:2.0.0" @@ -12413,15 +10927,6 @@ __metadata: languageName: node linkType: hard -"isomorphic-ws@npm:^4.0.1": - version: 4.0.1 - resolution: "isomorphic-ws@npm:4.0.1" - peerDependencies: - ws: "*" - checksum: 10/d7190eadefdc28bdb93d67b5f0c603385aaf87724fa2974abb382ac1ec9756ed2cfb27065cbe76122879c2d452e2982bc4314317f3d6c737ddda6c047328771a - languageName: node - linkType: hard - "isomorphic-ws@npm:^5.0.0": version: 5.0.0 resolution: "isomorphic-ws@npm:5.0.0" @@ -12496,6 +11001,20 @@ __metadata: languageName: node linkType: hard +"iterall@npm:1.3.0, iterall@npm:^1.2.1": + version: 1.3.0 + resolution: "iterall@npm:1.3.0" + checksum: 10/700c3e9ae194a00b66dc8dcb449195f84add4e64afaf7ed624177e19565393f9bddd34d621ea70c8eceab87a8536fc0e45bb1c9d1ea7c710d41ed0c3d937b19f + languageName: node + linkType: hard + +"iterare@npm:1.2.1": + version: 1.2.1 + resolution: "iterare@npm:1.2.1" + checksum: 10/ee8322dd9d92e86d8653c899df501c58c5b8e90d6767cf2af0b6d6dc5a4b9b7ed8bce936976f4f4c3a55be110a300c8a7d71967d03f72e104e8db66befcfd874 + languageName: node + linkType: hard + "iterator.prototype@npm:^1.1.2": version: 1.1.2 resolution: "iterator.prototype@npm:1.1.2" @@ -12522,15 +11041,6 @@ __metadata: languageName: node linkType: hard -"java-invoke-local@npm:0.0.6": - version: 0.0.6 - resolution: "java-invoke-local@npm:0.0.6" - bin: - java-invoke-local: lib/cli.js - checksum: 10/e433098a3d6e3d32acdff483d43e8f9d2a5ef2c08e18ca79c79bd9cb475e912ceec9d2a5e4923ff877e38eaa06f29dfac2c0b4e800eefc9d6e1df674cbf797c1 - languageName: node - linkType: hard - "jest-changed-files@npm:^29.7.0": version: 29.7.0 resolution: "jest-changed-files@npm:29.7.0" @@ -12772,6 +11282,18 @@ __metadata: languageName: node linkType: hard +"jest-mock-extended@npm:3.0.7": + version: 3.0.7 + resolution: "jest-mock-extended@npm:3.0.7" + dependencies: + ts-essentials: "npm:^10.0.0" + peerDependencies: + jest: ^24.0.0 || ^25.0.0 || ^26.0.0 || ^27.0.0 || ^28.0.0 || ^29.0.0 + typescript: ^3.0.0 || ^4.0.0 || ^5.0.0 + checksum: 10/7d5fb9d4ad07dbed9d4f1dd011eb26ca20d9ca4aab3c807749f761220315ef8a6bdf767b1ce1e68ae10405e35ba899c4fcee55cf327deb2d9950910e818f40fa + languageName: node + linkType: hard + "jest-mock@npm:^29.7.0": version: 29.7.0 resolution: "jest-mock@npm:29.7.0" @@ -12960,6 +11482,17 @@ __metadata: languageName: node linkType: hard +"jest-worker@npm:^27.4.5": + version: 27.5.1 + resolution: "jest-worker@npm:27.5.1" + dependencies: + "@types/node": "npm:*" + merge-stream: "npm:^2.0.0" + supports-color: "npm:^8.0.0" + checksum: 10/06c6e2a84591d9ede704d5022fc13791e8876e83397c89d481b0063332abbb64c0f01ef4ca7de520b35c7a1058556078d6bdc3631376f4e9ffb42316c1a8488e + languageName: node + linkType: hard + "jest-worker@npm:^29.7.0": version: 29.7.0 resolution: "jest-worker@npm:29.7.0" @@ -13000,13 +11533,6 @@ __metadata: languageName: node linkType: hard -"jmespath@npm:0.16.0": - version: 0.16.0 - resolution: "jmespath@npm:0.16.0" - checksum: 10/cc8b4a5cd2a22a79fc2695d66e5a43bc0020ec1ebdbe648440e796764751af2f495771ce877dea45ee6545530f0a1528450c3c3026bc0e9d976a93447af9fb74 - languageName: node - linkType: hard - "jose@npm:^5.0.0": version: 5.2.2 resolution: "jose@npm:5.2.2" @@ -13014,13 +11540,6 @@ __metadata: languageName: node linkType: hard -"jose@npm:^5.2.0": - version: 5.2.3 - resolution: "jose@npm:5.2.3" - checksum: 10/33056092ed6c1539eee6c0c75bd3664a39c639e02f21ec5cb32ddd231b9345f239e7bffe3f4741c903c711e237ceafb816ed634bd9cd5e4fb61b5a1f067e2c40 - languageName: node - linkType: hard - "joycon@npm:^3.0.1": version: 3.1.1 resolution: "joycon@npm:3.1.1" @@ -13028,13 +11547,6 @@ __metadata: languageName: node linkType: hard -"js-string-escape@npm:^1.0.1": - version: 1.0.1 - resolution: "js-string-escape@npm:1.0.1" - checksum: 10/f11e0991bf57e0c183b55c547acec85bd2445f043efc9ea5aa68b41bd2a3e7d3ce94636cb233ae0d84064ba4c1a505d32e969813c5b13f81e7d4be12c59256fe - languageName: node - linkType: hard - "js-tokens@npm:^3.0.0 || ^4.0.0, js-tokens@npm:^4.0.0": version: 4.0.0 resolution: "js-tokens@npm:4.0.0" @@ -13042,7 +11554,7 @@ __metadata: languageName: node linkType: hard -"js-yaml@npm:^3.13.0, js-yaml@npm:^3.13.1, js-yaml@npm:^3.14.1, js-yaml@npm:^3.6.1": +"js-yaml@npm:^3.13.0, js-yaml@npm:^3.13.1, js-yaml@npm:^3.6.1": version: 3.14.1 resolution: "js-yaml@npm:3.14.1" dependencies: @@ -13120,38 +11632,13 @@ __metadata: languageName: node linkType: hard -"json-cycle@npm:^1.3.0": - version: 1.5.0 - resolution: "json-cycle@npm:1.5.0" - checksum: 10/4ce7594eb8f42e820c708ceaed12759168c4d29f91e0f8e213909331f7fd12b765a3b9c4a5e8f0e72bc25d5ed2a380211ff3ec95c3ba1cbb2cb5c68ea396ae9f - languageName: node - linkType: hard - -"json-parse-even-better-errors@npm:^2.3.0": +"json-parse-even-better-errors@npm:^2.3.0, json-parse-even-better-errors@npm:^2.3.1": version: 2.3.1 resolution: "json-parse-even-better-errors@npm:2.3.1" checksum: 10/5f3a99009ed5f2a5a67d06e2f298cc97bc86d462034173308156f15b43a6e850be8511dc204b9b94566305da2947f7d90289657237d210351a39059ff9d666cf languageName: node linkType: hard -"json-refs@npm:^3.0.15": - version: 3.0.15 - resolution: "json-refs@npm:3.0.15" - dependencies: - commander: "npm:~4.1.1" - graphlib: "npm:^2.1.8" - js-yaml: "npm:^3.13.1" - lodash: "npm:^4.17.15" - native-promise-only: "npm:^0.8.1" - path-loader: "npm:^1.0.10" - slash: "npm:^3.0.0" - uri-js: "npm:^4.2.2" - bin: - json-refs: ./bin/json-refs - checksum: 10/381a5bc91fc57a10c9df036ea1c077e60e433fe5e690a441c30384b2e5ebe82e9b746c1fb1b30dcb67d4e03ee819b625057df80c5738dc13b5056fdfc5c1432b - languageName: node - linkType: hard - "json-schema-traverse@npm:^0.4.1": version: 0.4.1 resolution: "json-schema-traverse@npm:0.4.1" @@ -13229,14 +11716,14 @@ __metadata: languageName: node linkType: hard -"jsonc-parser@npm:^3.0.0": +"jsonc-parser@npm:3.2.0": version: 3.2.0 resolution: "jsonc-parser@npm:3.2.0" checksum: 10/bd68b902e5f9394f01da97921f49c5084b2dc03a0c5b4fdb2a429f8d6f292686c1bf87badaeb0a8148d024192a88f5ad2e57b2918ba43fe25cf15f3371db64d4 languageName: node linkType: hard -"jsonc-parser@npm:^3.2.0": +"jsonc-parser@npm:3.2.1, jsonc-parser@npm:^3.2.0": version: 3.2.1 resolution: "jsonc-parser@npm:3.2.1" checksum: 10/fe2df6f39e21653781d52cae20c5b9e0ab62461918d97f9430b216cea9b6500efc1d8b42c6584cc0a7548b4c996055e9cdc39f09b9782fa6957af2f45306c530 @@ -13282,20 +11769,21 @@ __metadata: languageName: node linkType: hard -"jsonpath-plus@npm:^8.0.0": - version: 8.1.0 - resolution: "jsonpath-plus@npm:8.1.0" - bin: - jsonpath: bin/jsonpath-cli.js - jsonpath-plus: bin/jsonpath-cli.js - checksum: 10/1954bbf0f9b2b8b749d0ed22cb84e0f475efe66c6cd186cbe0f97c1c8350ac68d156053ac690629cf9ad8ff00aa0fc8e2e97100a5cdd5ee7610074f5f7151650 - languageName: node - linkType: hard - -"jsonschema@npm:^1.4.1": - version: 1.4.1 - resolution: "jsonschema@npm:1.4.1" - checksum: 10/d7a188da7a3100a2caa362b80e98666d46607b7a7153aac405b8e758132961911c6df02d444d4700691330874e21a62639f550e856b21ddd28423690751ca9c6 +"jsonwebtoken@npm:9.0.2": + version: 9.0.2 + resolution: "jsonwebtoken@npm:9.0.2" + dependencies: + jws: "npm:^3.2.2" + lodash.includes: "npm:^4.3.0" + lodash.isboolean: "npm:^3.0.3" + lodash.isinteger: "npm:^4.0.4" + lodash.isnumber: "npm:^3.0.3" + lodash.isplainobject: "npm:^4.0.6" + lodash.isstring: "npm:^4.0.1" + lodash.once: "npm:^4.0.0" + ms: "npm:^2.1.1" + semver: "npm:^7.5.4" + checksum: 10/6e9b6d879cec2b27f2f3a88a0c0973edc7ba956a5d9356b2626c4fddfda969e34a3832deaf79c3e1c6c9a525bc2c4f2c2447fa477f8ac660f0017c31a59ae96b languageName: node linkType: hard @@ -13311,33 +11799,28 @@ __metadata: languageName: node linkType: hard -"jszip@npm:^3.10.1": - version: 3.10.1 - resolution: "jszip@npm:3.10.1" +"jwa@npm:^1.4.1": + version: 1.4.1 + resolution: "jwa@npm:1.4.1" dependencies: - lie: "npm:~3.3.0" - pako: "npm:~1.0.2" - readable-stream: "npm:~2.3.6" - setimmediate: "npm:^1.0.5" - checksum: 10/bfbfbb9b0a27121330ac46ab9cdb3b4812433faa9ba4a54742c87ca441e31a6194ff70ae12acefa5fe25406c432290e68003900541d948a169b23d30c34dd984 - languageName: node - linkType: hard - -"jwt-decode@npm:^2.2.0": - version: 2.2.0 - resolution: "jwt-decode@npm:2.2.0" - checksum: 10/2d368aeb1d355b58af73a422e10c44d1adfd444f77f3a95bdc124696bde9cfe8423a9e43cdbce8761eb667252e25a59b5e36d30ebf4b6d2a8f8b107c2f25f358 + buffer-equal-constant-time: "npm:1.0.1" + ecdsa-sig-formatter: "npm:1.0.11" + safe-buffer: "npm:^5.0.1" + checksum: 10/0bc002b71dd70480fedc7d442a4d2b9185a9947352a027dcb4935864ad2323c57b5d391adf968a3622b61e940cef4f3484d5813b95864539272d41cac145d6f3 languageName: node linkType: hard -"jwt-decode@npm:^3.1.2": - version: 3.1.2 - resolution: "jwt-decode@npm:3.1.2" - checksum: 10/20a4b072d44ce3479f42d0d2c8d3dabeb353081ba4982e40b83a779f2459a70be26441be6c160bfc8c3c6eadf9f6380a036fbb06ac5406b5674e35d8c4205eeb +"jws@npm:^3.2.2": + version: 3.2.2 + resolution: "jws@npm:3.2.2" + dependencies: + jwa: "npm:^1.4.1" + safe-buffer: "npm:^5.0.1" + checksum: 10/70b016974af8a76d25030c80a0097b24ed5b17a9cf10f43b163c11cb4eb248d5d04a3fe48c0d724d2884c32879d878ccad7be0663720f46b464f662f7ed778fe languageName: node linkType: hard -"keyv@npm:^4.0.0, keyv@npm:^4.5.3": +"keyv@npm:^4.5.3": version: 4.5.4 resolution: "keyv@npm:4.5.4" dependencies: @@ -13367,13 +11850,6 @@ __metadata: languageName: node linkType: hard -"kuler@npm:^2.0.0": - version: 2.0.0 - resolution: "kuler@npm:2.0.0" - checksum: 10/9e10b5a1659f9ed8761d38df3c35effabffbd19fc6107324095238e4ef0ff044392cae9ac64a1c2dda26e532426485342226b93806bd97504b174b0dcf04ed81 - languageName: node - linkType: hard - "language-subtag-registry@npm:^0.3.20": version: 0.3.22 resolution: "language-subtag-registry@npm:0.3.22" @@ -13390,15 +11866,6 @@ __metadata: languageName: node linkType: hard -"lazystream@npm:^1.0.0": - version: 1.0.1 - resolution: "lazystream@npm:1.0.1" - dependencies: - readable-stream: "npm:^2.0.5" - checksum: 10/35f8cf8b5799c76570b211b079d4d706a20cbf13a4936d44cc7dbdacab1de6b346ab339ed3e3805f4693155ee5bbebbda4050fa2b666d61956e89a573089e3d4 - languageName: node - linkType: hard - "leven@npm:^3.1.0": version: 3.1.0 resolution: "leven@npm:3.1.0" @@ -13425,15 +11892,6 @@ __metadata: languageName: node linkType: hard -"lie@npm:~3.3.0": - version: 3.3.0 - resolution: "lie@npm:3.3.0" - dependencies: - immediate: "npm:~3.0.5" - checksum: 10/f335ce67fe221af496185d7ce39c8321304adb701e122942c495f4f72dcee8803f9315ee572f5f8e8b08b9e8d7195da91b9fad776e8864746ba8b5e910adf76e - languageName: node - linkType: hard - "lilconfig@npm:^2.1.0": version: 2.1.0 resolution: "lilconfig@npm:2.1.0" @@ -13495,6 +11953,13 @@ __metadata: languageName: node linkType: hard +"loader-runner@npm:^4.2.0": + version: 4.3.0 + resolution: "loader-runner@npm:4.3.0" + checksum: 10/555ae002869c1e8942a0efd29a99b50a0ce6c3296efea95caf48f00d7f6f7f659203ed6613688b6181aa81dc76de3e65ece43094c6dffef3127fe1a84d973cd3 + languageName: node + linkType: hard + "localforage@npm:^1.8.1": version: 1.10.0 resolution: "localforage@npm:1.10.0" @@ -13529,24 +11994,17 @@ __metadata: languageName: node linkType: hard -"lodash.defaults@npm:^4.2.0": - version: 4.2.0 - resolution: "lodash.defaults@npm:4.2.0" - checksum: 10/6a2a9ea5ad7585aff8d76836c9e1db4528e5f5fa50fc4ad81183152ba8717d83aef8aec4fa88bf3417ed946fd4b4358f145ee08fbc77fb82736788714d3e12db - languageName: node - linkType: hard - -"lodash.difference@npm:^4.5.0": - version: 4.5.0 - resolution: "lodash.difference@npm:4.5.0" - checksum: 10/b22adb1be9c60e5997b8b483f8bab19878cb40eda65437907958e5d27990214716e1b00ebe312a97f47e63d8b891e4ae30947d08e1f0861ccdb9462f56ab9d77 +"lodash.includes@npm:^4.3.0": + version: 4.3.0 + resolution: "lodash.includes@npm:4.3.0" + checksum: 10/45e0a7c7838c931732cbfede6327da321b2b10482d5063ed21c020fa72b09ca3a4aa3bda4073906ab3f436cf36eb85a52ea3f08b7bab1e0baca8235b0e08fe51 languageName: node linkType: hard -"lodash.flatten@npm:^4.4.0": - version: 4.4.0 - resolution: "lodash.flatten@npm:4.4.0" - checksum: 10/a2b192f220b0b6c78a6c0175e96bad888b9e0f2a887a8e8c1d0c29d03231fbf110bbb9be0d9de5f936537d143eeb9d5b4f44c4a44f5592c195bf2fae6a6b1e3a +"lodash.isboolean@npm:^3.0.3": + version: 3.0.3 + resolution: "lodash.isboolean@npm:3.0.3" + checksum: 10/b70068b4a8b8837912b54052557b21fc4774174e3512ed3c5b94621e5aff5eb6c68089d0a386b7e801d679cd105d2e35417978a5e99071750aa2ed90bffd0250 languageName: node linkType: hard @@ -13557,6 +12015,20 @@ __metadata: languageName: node linkType: hard +"lodash.isinteger@npm:^4.0.4": + version: 4.0.4 + resolution: "lodash.isinteger@npm:4.0.4" + checksum: 10/c971f5a2d67384f429892715550c67bac9f285604a0dd79275fd19fef7717aec7f2a6a33d60769686e436ceb9771fd95fe7fcb68ad030fc907d568d5a3b65f70 + languageName: node + linkType: hard + +"lodash.isnumber@npm:^3.0.3": + version: 3.0.3 + resolution: "lodash.isnumber@npm:3.0.3" + checksum: 10/913784275b565346255e6ae6a6e30b760a0da70abc29f3e1f409081585875105138cda4a429ff02577e1bc0a7ae2a90e0a3079a37f3a04c3d6c5aaa532f4cab2 + languageName: node + linkType: hard + "lodash.isplainobject@npm:^4.0.6": version: 4.0.6 resolution: "lodash.isplainobject@npm:4.0.6" @@ -13564,6 +12036,13 @@ __metadata: languageName: node linkType: hard +"lodash.isstring@npm:^4.0.1": + version: 4.0.1 + resolution: "lodash.isstring@npm:4.0.1" + checksum: 10/eaac87ae9636848af08021083d796e2eea3d02e80082ab8a9955309569cb3a463ce97fd281d7dc119e402b2e7d8c54a23914b15d2fc7fff56461511dc8937ba0 + languageName: node + linkType: hard + "lodash.kebabcase@npm:^4.1.1": version: 4.1.1 resolution: "lodash.kebabcase@npm:4.1.1" @@ -13592,6 +12071,20 @@ __metadata: languageName: node linkType: hard +"lodash.omit@npm:4.5.0": + version: 4.5.0 + resolution: "lodash.omit@npm:4.5.0" + checksum: 10/f5c67cd1df11f1275662060febb629a4d4e7b547c4bea66454508b5e6096162c2af882aab1ff8cb5dcf2b328f22252416de6ca9c1334588f6310edfac525e511 + languageName: node + linkType: hard + +"lodash.once@npm:^4.0.0": + version: 4.1.1 + resolution: "lodash.once@npm:4.1.1" + checksum: 10/202f2c8c3d45e401b148a96de228e50ea6951ee5a9315ca5e15733d5a07a6b1a02d9da1e7fdf6950679e17e8ca8f7190ec33cae47beb249b0c50019d753f38f3 + languageName: node + linkType: hard + "lodash.snakecase@npm:^4.1.1": version: 4.1.1 resolution: "lodash.snakecase@npm:4.1.1" @@ -13613,13 +12106,6 @@ __metadata: languageName: node linkType: hard -"lodash.union@npm:^4.6.0": - version: 4.6.0 - resolution: "lodash.union@npm:4.6.0" - checksum: 10/175f5786efc527238c1350ce561c28e5ba527b5957605f9e5b8a804fce78801d09ced7b72de0302325e5b14c711f94690b1a733c13ad3674cc1a76e1172db1f8 - languageName: node - linkType: hard - "lodash.uniq@npm:^4.5.0": version: 4.5.0 resolution: "lodash.uniq@npm:4.5.0" @@ -13634,31 +12120,13 @@ __metadata: languageName: node linkType: hard -"lodash@npm:4.17.21, lodash@npm:^4.17.11, lodash@npm:^4.17.15, lodash@npm:^4.17.20, lodash@npm:^4.17.21, lodash@npm:~4.17.0": +"lodash@npm:4.17.21, lodash@npm:^4.17.15, lodash@npm:^4.17.20, lodash@npm:^4.17.21, lodash@npm:~4.17.0": version: 4.17.21 resolution: "lodash@npm:4.17.21" checksum: 10/c08619c038846ea6ac754abd6dd29d2568aa705feb69339e836dfa8d8b09abbb2f859371e86863eda41848221f9af43714491467b5b0299122431e202bb0c532 languageName: node linkType: hard -"log-node@npm:^8.0.3": - version: 8.0.3 - resolution: "log-node@npm:8.0.3" - dependencies: - ansi-regex: "npm:^5.0.1" - cli-color: "npm:^2.0.1" - cli-sprintf-format: "npm:^1.1.1" - d: "npm:^1.0.1" - es5-ext: "npm:^0.10.53" - sprintf-kit: "npm:^2.0.1" - supports-color: "npm:^8.1.1" - type: "npm:^2.5.0" - peerDependencies: - log: ^6.0.0 - checksum: 10/32a085b7f16a32b110536f1c6c2768235c471343a7a988285af21ce2beab3dadf21d0c2e923ce81f60e2efc9047fe48d8d0940e76ce0c1188324ce8bf62ea4c1 - languageName: node - linkType: hard - "log-symbols@npm:^4.0.0, log-symbols@npm:^4.1.0": version: 4.1.0 resolution: "log-symbols@npm:4.1.0" @@ -13681,35 +12149,6 @@ __metadata: languageName: node linkType: hard -"log@npm:^6.0.0, log@npm:^6.3.1": - version: 6.3.1 - resolution: "log@npm:6.3.1" - dependencies: - d: "npm:^1.0.1" - duration: "npm:^0.2.2" - es5-ext: "npm:^0.10.53" - event-emitter: "npm:^0.3.5" - sprintf-kit: "npm:^2.0.1" - type: "npm:^2.5.0" - uni-global: "npm:^1.0.0" - checksum: 10/d452894862ba9188ee48a192e0aad4a67e94b0e8b6310dd78c7619110465905ac2187b7ad0ae41e1207670fdfee664f5ae98b224bc0c254234cfee222f50aa06 - languageName: node - linkType: hard - -"logform@npm:^2.3.2, logform@npm:^2.4.0": - version: 2.6.0 - resolution: "logform@npm:2.6.0" - dependencies: - "@colors/colors": "npm:1.6.0" - "@types/triple-beam": "npm:^1.3.2" - fecha: "npm:^4.2.0" - ms: "npm:^2.1.1" - safe-stable-stringify: "npm:^2.3.1" - triple-beam: "npm:^1.3.0" - checksum: 10/92de5696a529a7ccf4359fe65a21fce2398ba20c4b4e5769cba187b8fde01d590a22d3c83f797d31b436f49770fb1b2f28646e7c881d30b8d1f4080a05ae7006 - languageName: node - linkType: hard - "loglevel@npm:^1.6.8": version: 1.8.1 resolution: "loglevel@npm:1.8.1" @@ -13717,13 +12156,6 @@ __metadata: languageName: node linkType: hard -"long-timeout@npm:0.1.1": - version: 0.1.1 - resolution: "long-timeout@npm:0.1.1" - checksum: 10/48668e5362cb74c4b77a6b833d59f149b9bb9e99c5a5097609807e2597cd0920613b2a42b89bd0870848298be3691064d95599a04ae010023d07dba39932afa7 - languageName: node - linkType: hard - "long@npm:^4.0.0": version: 4.0.0 resolution: "long@npm:4.0.0" @@ -13731,6 +12163,13 @@ __metadata: languageName: node linkType: hard +"long@npm:^5.2.1": + version: 5.2.3 + resolution: "long@npm:5.2.3" + checksum: 10/9167ec6947a825b827c30da169a7384eec6c0c9ec2f0b9c74da2e93d81159bbe39fb09c3f13dae9721d4b807ccfa09797a7dd1012f5d478e3e33ca3c78b608e6 + languageName: node + linkType: hard + "loose-envify@npm:^1.0.0, loose-envify@npm:^1.1.0, loose-envify@npm:^1.4.0": version: 1.4.0 resolution: "loose-envify@npm:1.4.0" @@ -13760,20 +12199,6 @@ __metadata: languageName: node linkType: hard -"lowercase-keys@npm:^2.0.0": - version: 2.0.0 - resolution: "lowercase-keys@npm:2.0.0" - checksum: 10/1c233d2da35056e8c49fae8097ee061b8c799b2f02e33c2bf32f9913c7de8fb481ab04dab7df35e94156c800f5f34e99acbf32b21781d87c3aa43ef7b748b79e - languageName: node - linkType: hard - -"lru-cache@npm:7.10.1 - 7.13.1": - version: 7.13.1 - resolution: "lru-cache@npm:7.13.1" - checksum: 10/81ebb3f1fd3e1d3c32762a58c5964364220fc4b413f5180588b74473bd9a075cdafee32421f8ee6105148c8986d183bf40539017dea03abed32f4e1e59bf2654 - languageName: node - linkType: hard - "lru-cache@npm:^10.0.1, lru-cache@npm:^9.1.1 || ^10.0.0": version: 10.1.0 resolution: "lru-cache@npm:10.1.0" @@ -13781,6 +12206,13 @@ __metadata: languageName: node linkType: hard +"lru-cache@npm:^10.2.0": + version: 10.2.2 + resolution: "lru-cache@npm:10.2.2" + checksum: 10/ff1a496d30b5eaec2c9079080965bb0cede203cf878371f7033a007f1e54cd4aa13cc8abf7ccec4c994a83a22ed5476e83a55bb57cc07e6c1547a42937e42c37 + languageName: node + linkType: hard + "lru-cache@npm:^4.0.1": version: 4.1.5 resolution: "lru-cache@npm:4.1.5" @@ -13809,19 +12241,17 @@ __metadata: languageName: node linkType: hard -"lru-queue@npm:^0.1.0": - version: 0.1.0 - resolution: "lru-queue@npm:0.1.0" - dependencies: - es5-ext: "npm:~0.10.2" - checksum: 10/55b08ee3a7dbefb7d8ee2d14e0a97c69a887f78bddd9e28a687a1944b57e09513d4b401db515279e8829d52331df12a767f3ed27ca67c3322c723cc25c06403f +"lru-cache@npm:^7.10.1, lru-cache@npm:^7.14.1": + version: 7.18.3 + resolution: "lru-cache@npm:7.18.3" + checksum: 10/6029ca5aba3aacb554e919d7ef804fffd4adfc4c83db00fac8248c7c78811fb6d4b6f70f7fd9d55032b3823446546a007edaa66ad1f2377ae833bd983fac5d98 languageName: node linkType: hard -"luxon@npm:^3.2.1, luxon@npm:^3.4.4": - version: 3.4.4 - resolution: "luxon@npm:3.4.4" - checksum: 10/c14164bc338987349075a08e63ea3ff902866735f7f5553a355b27be22667919765ff96fde4d3413d0e9a0edc4ff9e2e74ebcb8f86eae0ce8b14b27330d87d6e +"lru-cache@npm:^8.0.0": + version: 8.0.5 + resolution: "lru-cache@npm:8.0.5" + checksum: 10/74153ab136d0c2d735003b8b1c0fa8213c94c2520701dfe8bb31d957f975b3d3665b1ef27ac9a5b9f92c8f581c79008834c0f9bd60c5adf368476f9a95e8fa82 languageName: node linkType: hard @@ -13834,6 +12264,15 @@ __metadata: languageName: node linkType: hard +"magic-string@npm:0.30.5": + version: 0.30.5 + resolution: "magic-string@npm:0.30.5" + dependencies: + "@jridgewell/sourcemap-codec": "npm:^1.4.15" + checksum: 10/c8a6b25f813215ca9db526f3a407d6dc0bf35429c2b8111d6f1c2cf6cf6afd5e2d9f9cd189416a0e3959e20ecd635f73639f9825c73de1074b29331fe36ace59 + languageName: node + linkType: hard + "magic-string@npm:^0.27.0": version: 0.27.0 resolution: "magic-string@npm:0.27.0" @@ -13843,15 +12282,6 @@ __metadata: languageName: node linkType: hard -"make-dir@npm:^1.0.0": - version: 1.3.0 - resolution: "make-dir@npm:1.3.0" - dependencies: - pify: "npm:^3.0.0" - checksum: 10/c564f6e7bb5ace1c02ad56b3a5f5e07d074af0c0b693c55c7b2c2b148882827c8c2afc7b57e43338a9f90c125b58d604e8cf3e6990a48bf949dfea8c79668c0b - languageName: node - linkType: hard - "make-dir@npm:^4.0.0": version: 4.0.0 resolution: "make-dir@npm:4.0.0" @@ -13924,19 +12354,12 @@ __metadata: languageName: node linkType: hard -"memoizee@npm:^0.4.14, memoizee@npm:^0.4.15": - version: 0.4.15 - resolution: "memoizee@npm:0.4.15" +"memfs@npm:^3.4.1": + version: 3.5.3 + resolution: "memfs@npm:3.5.3" dependencies: - d: "npm:^1.0.1" - es5-ext: "npm:^0.10.53" - es6-weak-map: "npm:^2.0.3" - event-emitter: "npm:^0.3.5" - is-promise: "npm:^2.2.2" - lru-queue: "npm:^0.1.0" - next-tick: "npm:^1.1.0" - timers-ext: "npm:^0.1.7" - checksum: 10/3c72cc59ae721e40980b604479e11e7d702f4167943f40f1e5c5d5da95e4b2664eec49ae533b2d41ffc938f642f145b48389ee4099e0945996fcf297e3dcb221 + fs-monkey: "npm:^1.0.4" + checksum: 10/7c9cdb453a6b06e87f11e2dbe6c518fd3c1c1581b370ffa24f42f3fd5b1db8c2203f596e43321a0032963f3e9b66400f2c3cf043904ac496d6ae33eafd0878fe languageName: node linkType: hard @@ -14025,6 +12448,16 @@ __metadata: languageName: node linkType: hard +"micromatch@npm:^4.0.0": + version: 4.0.7 + resolution: "micromatch@npm:4.0.7" + dependencies: + braces: "npm:^3.0.3" + picomatch: "npm:^2.3.1" + checksum: 10/a11ed1cb67dcbbe9a5fc02c4062cf8bb0157d73bf86956003af8dcfdf9b287f9e15ec0f6d6925ff6b8b5b496202335e497b01de4d95ef6cf06411bc5e5c474a0 + languageName: node + linkType: hard + "micromatch@npm:^4.0.2, micromatch@npm:^4.0.4, micromatch@npm:^4.0.5": version: 4.0.5 resolution: "micromatch@npm:4.0.5" @@ -14035,7 +12468,7 @@ __metadata: languageName: node linkType: hard -"mime-db@npm:1.52.0, mime-db@npm:>= 1.43.0 < 2, mime-db@npm:^1.28.0, mime-db@npm:^1.52.0": +"mime-db@npm:1.52.0, mime-db@npm:>= 1.43.0 < 2": version: 1.52.0 resolution: "mime-db@npm:1.52.0" checksum: 10/54bb60bf39e6f8689f6622784e668a3d7f8bed6b0d886f5c3c446cb3284be28b30bf707ed05d0fe44a036f8469976b2629bbea182684977b084de9da274694d7 @@ -14058,7 +12491,7 @@ __metadata: languageName: node linkType: hard -"mime-types@npm:^2.1.12, mime-types@npm:~2.1.24, mime-types@npm:~2.1.34": +"mime-types@npm:^2.1.12, mime-types@npm:^2.1.27, mime-types@npm:~2.1.24, mime-types@npm:~2.1.34": version: 2.1.35 resolution: "mime-types@npm:2.1.35" dependencies: @@ -14092,27 +12525,6 @@ __metadata: languageName: node linkType: hard -"mimic-fn@npm:^4.0.0": - version: 4.0.0 - resolution: "mimic-fn@npm:4.0.0" - checksum: 10/995dcece15ee29aa16e188de6633d43a3db4611bcf93620e7e62109ec41c79c0f34277165b8ce5e361205049766e371851264c21ac64ca35499acb5421c2ba56 - languageName: node - linkType: hard - -"mimic-response@npm:^1.0.0": - version: 1.0.1 - resolution: "mimic-response@npm:1.0.1" - checksum: 10/034c78753b0e622bc03c983663b1cdf66d03861050e0c8606563d149bc2b02d63f62ce4d32be4ab50d0553ae0ffe647fc34d1f5281184c6e1e8cf4d85e8d9823 - languageName: node - linkType: hard - -"mimic-response@npm:^3.1.0": - version: 3.1.0 - resolution: "mimic-response@npm:3.1.0" - checksum: 10/7e719047612411fe071332a7498cf0448bbe43c485c0d780046c76633a771b223ff49bd00267be122cedebb897037fdb527df72335d0d0f74724604ca70b37ad - languageName: node - linkType: hard - "min-indent@npm:^1.0.0": version: 1.0.1 resolution: "min-indent@npm:1.0.1" @@ -14129,7 +12541,7 @@ __metadata: languageName: node linkType: hard -"minimatch@npm:3.1.2, minimatch@npm:^3.0.2, minimatch@npm:^3.0.4, minimatch@npm:^3.0.5, minimatch@npm:^3.1.1, minimatch@npm:^3.1.2": +"minimatch@npm:3.1.2, minimatch@npm:^3.0.4, minimatch@npm:^3.0.5, minimatch@npm:^3.1.1, minimatch@npm:^3.1.2": version: 3.1.2 resolution: "minimatch@npm:3.1.2" dependencies: @@ -14156,7 +12568,7 @@ __metadata: languageName: node linkType: hard -"minimatch@npm:^5.0.1, minimatch@npm:^5.1.0": +"minimatch@npm:^5.0.1": version: 5.1.6 resolution: "minimatch@npm:5.1.6" dependencies: @@ -14165,6 +12577,24 @@ __metadata: languageName: node linkType: hard +"minimatch@npm:^8.0.2": + version: 8.0.4 + resolution: "minimatch@npm:8.0.4" + dependencies: + brace-expansion: "npm:^2.0.1" + checksum: 10/aef05598ee565e1013bc8a10f53410ac681561f901c1a084b8ecfd016c9ed919f58f4bbd5b63e05643189dfb26e8106a84f0e1ff12e4a263aa37e1cae7ce9828 + languageName: node + linkType: hard + +"minimatch@npm:^9.0.3": + version: 9.0.4 + resolution: "minimatch@npm:9.0.4" + dependencies: + brace-expansion: "npm:^2.0.1" + checksum: 10/4cdc18d112b164084513e890d6323370db14c22249d536ad1854539577a895e690a27513dc346392f61a4a50afbbd8abc88f3f25558bfbbbb862cd56508b20f5 + languageName: node + linkType: hard + "minimist-options@npm:4.1.0, minimist-options@npm:^4.0.2": version: 4.1.0 resolution: "minimist-options@npm:4.1.0" @@ -14243,6 +12673,13 @@ __metadata: languageName: node linkType: hard +"minipass@npm:^4.2.4": + version: 4.2.8 + resolution: "minipass@npm:4.2.8" + checksum: 10/e148eb6dcb85c980234cad889139ef8ddf9d5bdac534f4f0268446c8792dd4c74f4502479be48de3c1cce2f6450f6da4d0d4a86405a8a12be04c1c36b339569a + languageName: node + linkType: hard + "minipass@npm:^5.0.0": version: 5.0.0 resolution: "minipass@npm:5.0.0" @@ -14274,7 +12711,7 @@ __metadata: languageName: node linkType: hard -"mkdirp@npm:^0.5.5": +"mkdirp@npm:^0.5.4, mkdirp@npm:^0.5.5": version: 0.5.6 resolution: "mkdirp@npm:0.5.6" dependencies: @@ -14285,7 +12722,7 @@ __metadata: languageName: node linkType: hard -"mkdirp@npm:^1.0.3, mkdirp@npm:^1.0.4": +"mkdirp@npm:^1.0.3": version: 1.0.4 resolution: "mkdirp@npm:1.0.4" bin: @@ -14294,10 +12731,19 @@ __metadata: languageName: node linkType: hard -"moment@npm:^2.29.1": - version: 2.30.1 - resolution: "moment@npm:2.30.1" - checksum: 10/ae42d876d4ec831ef66110bdc302c0657c664991e45cf2afffc4b0f6cd6d251dde11375c982a5c0564ccc0fa593fc564576ddceb8c8845e87c15f58aa6baca69 +"mkdirp@npm:^3.0.1": + version: 3.0.1 + resolution: "mkdirp@npm:3.0.1" + bin: + mkdirp: dist/cjs/src/bin.js + checksum: 10/16fd79c28645759505914561e249b9a1f5fe3362279ad95487a4501e4467abeb714fd35b95307326b8fd03f3c7719065ef11a6f97b7285d7888306d1bd2232ba + languageName: node + linkType: hard + +"module-details-from-path@npm:^1.0.3": + version: 1.0.3 + resolution: "module-details-from-path@npm:1.0.3" + checksum: 10/f93226e9154fc8cb91f4609b639167ec7ad9155b30be4924d9717656648a3ae5f181d4e2338434d4c5afc7b5f4c10dd3b64109e5b89a4be70b20a25ba3573d54 languageName: node linkType: hard @@ -14315,13 +12761,28 @@ __metadata: languageName: node linkType: hard -"ms@npm:2.1.3, ms@npm:^2.1.1, ms@npm:^2.1.3": +"ms@npm:2.1.3, ms@npm:^2.1.1": version: 2.1.3 resolution: "ms@npm:2.1.3" checksum: 10/aa92de608021b242401676e35cfa5aa42dd70cbdc082b916da7fb925c542173e36bce97ea3e804923fe92c0ad991434e4a38327e15a1b5b5f945d66df615ae6d languageName: node linkType: hard +"multer@npm:1.4.4-lts.1": + version: 1.4.4-lts.1 + resolution: "multer@npm:1.4.4-lts.1" + dependencies: + append-field: "npm:^1.0.0" + busboy: "npm:^1.0.0" + concat-stream: "npm:^1.5.2" + mkdirp: "npm:^0.5.4" + object-assign: "npm:^4.1.1" + type-is: "npm:^1.6.4" + xtend: "npm:^4.0.0" + checksum: 10/b9618376479edbaca85aa9371dc7e765f76e26f75f656439414e3e1870c2f9db3fb2421396715df0688907f8bf3b7f82bab9f25f0e12a8ca165f1cf070c4b59f + languageName: node + linkType: hard + "mute-stream@npm:0.0.8": version: 0.0.8 resolution: "mute-stream@npm:0.0.8" @@ -14329,6 +12790,29 @@ __metadata: languageName: node linkType: hard +"mute-stream@npm:1.0.0": + version: 1.0.0 + resolution: "mute-stream@npm:1.0.0" + checksum: 10/36fc968b0e9c9c63029d4f9dc63911950a3bdf55c9a87f58d3a266289b67180201cade911e7699f8b2fa596b34c9db43dad37649e3f7fdd13c3bb9edb0017ee7 + languageName: node + linkType: hard + +"mysql2@npm:3.10.0": + version: 3.10.0 + resolution: "mysql2@npm:3.10.0" + dependencies: + denque: "npm:^2.1.0" + generate-function: "npm:^2.3.1" + iconv-lite: "npm:^0.6.3" + long: "npm:^5.2.1" + lru-cache: "npm:^8.0.0" + named-placeholders: "npm:^1.1.3" + seq-queue: "npm:^0.0.5" + sqlstring: "npm:^2.3.2" + checksum: 10/81426e2b64b2b193c6652a45caef2aec00ddcc849dfaf7e36750f4b2cc8f4bf235b98b1ed385bb541f3a019bcd4310c57ee1522f609c02e1bb3b8964e95acf8b + languageName: node + linkType: hard + "mz@npm:^2.7.0": version: 2.7.0 resolution: "mz@npm:2.7.0" @@ -14340,6 +12824,15 @@ __metadata: languageName: node linkType: hard +"named-placeholders@npm:^1.1.3": + version: 1.1.3 + resolution: "named-placeholders@npm:1.1.3" + dependencies: + lru-cache: "npm:^7.14.1" + checksum: 10/7834adc91e92ae1b9c4413384e3ccd297de5168bb44017ff0536705ddc4db421723bd964607849265feb3f6ded390f84cf138e5925f22f7c13324f87a803dc73 + languageName: node + linkType: hard + "nanoid@npm:^3.3.6, nanoid@npm:^3.3.7": version: 3.3.7 resolution: "nanoid@npm:3.3.7" @@ -14349,13 +12842,6 @@ __metadata: languageName: node linkType: hard -"native-promise-only@npm:^0.8.1": - version: 0.8.1 - resolution: "native-promise-only@npm:0.8.1" - checksum: 10/fbc99d8dc2863658260a519557b0634c45583d9412de85fd706fa4fa9b11bfe4660bdac53f29171c4b2ad01a4b201c658a56f82431d19a5c155cc092c5127170 - languageName: node - linkType: hard - "natural-compare-lite@npm:^1.4.0": version: 1.4.0 resolution: "natural-compare-lite@npm:1.4.0" @@ -14370,22 +12856,6 @@ __metadata: languageName: node linkType: hard -"ncjsm@npm:^4.3.2": - version: 4.3.2 - resolution: "ncjsm@npm:4.3.2" - dependencies: - builtin-modules: "npm:^3.3.0" - deferred: "npm:^0.7.11" - es5-ext: "npm:^0.10.62" - es6-set: "npm:^0.1.6" - ext: "npm:^1.7.0" - find-requires: "npm:^1.0.0" - fs2: "npm:^0.3.9" - type: "npm:^2.7.2" - checksum: 10/cb06d4c4926106c7b82f2a5c9753e4e28b3870bb08bb81889957579aa281ce4ee403ebc10ca0852d0f5895295b1ddc3996485e7d572b7bc6d3c81a92dc6de31f - languageName: node - linkType: hard - "negotiator@npm:0.6.3, negotiator@npm:^0.6.3": version: 0.6.3 resolution: "negotiator@npm:0.6.3" @@ -14393,6 +12863,13 @@ __metadata: languageName: node linkType: hard +"neo-async@npm:^2.6.2": + version: 2.6.2 + resolution: "neo-async@npm:2.6.2" + checksum: 10/1a7948fea86f2b33ec766bc899c88796a51ba76a4afc9026764aedc6e7cde692a09067031e4a1bf6db4f978ccd99e7f5b6c03fe47ad9865c3d4f99050d67e002 + languageName: node + linkType: hard + "next-router-mock@npm:^0.9.12": version: 0.9.12 resolution: "next-router-mock@npm:0.9.12" @@ -14431,13 +12908,6 @@ __metadata: languageName: node linkType: hard -"next-tick@npm:1, next-tick@npm:^1.0.0, next-tick@npm:^1.1.0": - version: 1.1.0 - resolution: "next-tick@npm:1.1.0" - checksum: 10/83b5cf36027a53ee6d8b7f9c0782f2ba87f4858d977342bfc3c20c21629290a2111f8374d13a81221179603ffc4364f38374b5655d17b6a8f8a8c77bdea4fe8b - languageName: node - linkType: hard - "next@npm:14.1.4": version: 14.1.4 resolution: "next@npm:14.1.4" @@ -14493,13 +12963,6 @@ __metadata: languageName: node linkType: hard -"nice-try@npm:^1.0.4": - version: 1.0.5 - resolution: "nice-try@npm:1.0.5" - checksum: 10/0b4af3b5bb5d86c289f7a026303d192a7eb4417231fe47245c460baeabae7277bcd8fd9c728fb6bd62c30b3e15cd6620373e2cf33353b095d8b403d3e8a15aff - languageName: node - linkType: hard - "no-case@npm:^3.0.4": version: 3.0.4 resolution: "no-case@npm:3.0.4" @@ -14521,23 +12984,23 @@ __metadata: languageName: node linkType: hard -"node-abort-controller@npm:^3.0.1": +"node-abort-controller@npm:^3.0.1, node-abort-controller@npm:^3.1.1": version: 3.1.1 resolution: "node-abort-controller@npm:3.1.1" checksum: 10/0a2cdb7ec0aeaf3cb31e1ca0e192f5add48f1c5c9c9ed822129f9dddbd9432f69b7425982f94ce803c56a2104884530aa67cd57696e5774b2e5b8ec2f58de042 languageName: node linkType: hard -"node-dir@npm:^0.1.17": - version: 0.1.17 - resolution: "node-dir@npm:0.1.17" +"node-emoji@npm:1.11.0": + version: 1.11.0 + resolution: "node-emoji@npm:1.11.0" dependencies: - minimatch: "npm:^3.0.2" - checksum: 10/281fdea12d9c080a7250e5b5afefa3ab39426d40753ec8126a2d1e67f189b8824723abfed74f5d8549c5d78352d8c489fe08d0b067d7684c87c07283d38374a5 + lodash: "npm:^4.17.21" + checksum: 10/1d7ae9bcb0f23d7cdfcac5c3a90a6fd6ec584e6f7c70ff073f6122bfbed6c06284da7334092500d24e14162f5c4016e5dcd3355753cbd5b7e60de560a973248d languageName: node linkType: hard -"node-fetch@npm:^2.6.1, node-fetch@npm:^2.6.11, node-fetch@npm:^2.6.12, node-fetch@npm:^2.6.7, node-fetch@npm:^2.6.8": +"node-fetch@npm:^2.6.1, node-fetch@npm:^2.6.12, node-fetch@npm:^2.6.7": version: 2.7.0 resolution: "node-fetch@npm:2.7.0" dependencies: @@ -14585,17 +13048,6 @@ __metadata: languageName: node linkType: hard -"node-schedule@npm:^2.1.1": - version: 2.1.1 - resolution: "node-schedule@npm:2.1.1" - dependencies: - cron-parser: "npm:^4.2.0" - long-timeout: "npm:0.1.1" - sorted-array-functions: "npm:^1.3.0" - checksum: 10/0b0449f8a1f784cd599a8d79b1fa404ed9e3e4e2b1a48f027c97fd0632cd86e48ad762d366d6b6f9d48a940cad5b7afbdb1b833649ee870407591a6cf1297749 - languageName: node - linkType: hard - "nodemon@npm:2.0.22": version: 2.0.22 resolution: "nodemon@npm:2.0.22" @@ -14616,26 +13068,6 @@ __metadata: languageName: node linkType: hard -"nodemon@npm:3.1.0": - version: 3.1.0 - resolution: "nodemon@npm:3.1.0" - dependencies: - chokidar: "npm:^3.5.2" - debug: "npm:^4" - ignore-by-default: "npm:^1.0.1" - minimatch: "npm:^3.1.2" - pstree.remy: "npm:^1.1.8" - semver: "npm:^7.5.3" - simple-update-notifier: "npm:^2.0.0" - supports-color: "npm:^5.5.0" - touch: "npm:^3.1.0" - undefsafe: "npm:^2.0.5" - bin: - nodemon: bin/nodemon.js - checksum: 10/a8757f3eda5e11fbe0e50ef47177d5e86cf8a22e99723373100d37d5f25fb758280419c02d286210d242d0675adf5ef0d61052948f10c8318d656761d3dfa2b1 - languageName: node - linkType: hard - "nopt@npm:^7.0.0": version: 7.2.0 resolution: "nopt@npm:7.2.0" @@ -14682,6 +13114,13 @@ __metadata: languageName: node linkType: hard +"normalize-path@npm:3.0.0, normalize-path@npm:^3.0.0, normalize-path@npm:~3.0.0": + version: 3.0.0 + resolution: "normalize-path@npm:3.0.0" + checksum: 10/88eeb4da891e10b1318c4b2476b6e2ecbeb5ff97d946815ffea7794c31a89017c70d7f34b3c2ebf23ef4e9fc9fb99f7dffe36da22011b5b5c6ffa34f4873ec20 + languageName: node + linkType: hard + "normalize-path@npm:^2.1.1": version: 2.1.1 resolution: "normalize-path@npm:2.1.1" @@ -14691,13 +13130,6 @@ __metadata: languageName: node linkType: hard -"normalize-path@npm:^3.0.0, normalize-path@npm:~3.0.0": - version: 3.0.0 - resolution: "normalize-path@npm:3.0.0" - checksum: 10/88eeb4da891e10b1318c4b2476b6e2ecbeb5ff97d946815ffea7794c31a89017c70d7f34b3c2ebf23ef4e9fc9fb99f7dffe36da22011b5b5c6ffa34f4873ec20 - languageName: node - linkType: hard - "normalize-range@npm:^0.1.2": version: 0.1.2 resolution: "normalize-range@npm:0.1.2" @@ -14705,28 +13137,6 @@ __metadata: languageName: node linkType: hard -"normalize-url@npm:^6.0.1": - version: 6.1.0 - resolution: "normalize-url@npm:6.1.0" - checksum: 10/5ae699402c9d5ffa330adc348fcd6fc6e6a155ab7c811b96e30b7ecab60ceef821d8f86443869671dda71bbc47f4b9625739c82ad247e883e9aefe875bfb8659 - languageName: node - linkType: hard - -"npm-registry-utilities@npm:^1.0.0": - version: 1.0.0 - resolution: "npm-registry-utilities@npm:1.0.0" - dependencies: - ext: "npm:^1.6.0" - fs2: "npm:^0.3.9" - memoizee: "npm:^0.4.15" - node-fetch: "npm:^2.6.7" - semver: "npm:^7.3.5" - type: "npm:^2.6.0" - validate-npm-package-name: "npm:^3.0.0" - checksum: 10/bc49d51c90ed997fd7b5dc9b1018c39160fac8fd53d5fd7140c7ad1e9de2e515f89530b8c65a08b6f4d8c5d4d59a4cd35503f9df274b19d6553261f6f8d6be75 - languageName: node - linkType: hard - "npm-run-path@npm:^4.0.1": version: 4.0.1 resolution: "npm-run-path@npm:4.0.1" @@ -14736,15 +13146,6 @@ __metadata: languageName: node linkType: hard -"npm-run-path@npm:^5.1.0": - version: 5.2.0 - resolution: "npm-run-path@npm:5.2.0" - dependencies: - path-key: "npm:^4.0.0" - checksum: 10/c5325e016014e715689c4014f7e0be16cc4cbf529f32a1723e511bc4689b5f823b704d2bca61ac152ce2bda65e0205dc8b3ba0ec0f5e4c3e162d302f6f5b9efb - languageName: node - linkType: hard - "nullthrows@npm:^1.1.1": version: 1.1.1 resolution: "nullthrows@npm:1.1.1" @@ -14766,13 +13167,6 @@ __metadata: languageName: node linkType: hard -"object-hash@npm:^2.2.0": - version: 2.2.0 - resolution: "object-hash@npm:2.2.0" - checksum: 10/dee06b6271bf5769ae5f1a7386fdd52c1f18aae9fcb0b8d4bb1232f2d743d06cb5b662be42378b60a1c11829f96f3f86834a16bbaa57a085763295fff8b93e27 - languageName: node - linkType: hard - "object-hash@npm:^3.0.0": version: 3.0.0 resolution: "object-hash@npm:3.0.0" @@ -14871,6 +13265,13 @@ __metadata: languageName: node linkType: hard +"obuf@npm:~1.1.2": + version: 1.1.2 + resolution: "obuf@npm:1.1.2" + checksum: 10/53ff4ab3a13cc33ba6c856cf281f2965c0aec9720967af450e8fd06cfd50aceeefc791986a16bcefa14e7898b3ca9acdfcf15b9d9a1b9c7e1366581a8ad6e65e + languageName: node + linkType: hard + "on-finished@npm:2.4.1": version: 2.4.1 resolution: "on-finished@npm:2.4.1" @@ -14887,7 +13288,7 @@ __metadata: languageName: node linkType: hard -"once@npm:^1.3.0, once@npm:^1.3.1, once@npm:^1.4.0": +"once@npm:^1.3.0, once@npm:^1.4.0": version: 1.4.0 resolution: "once@npm:1.4.0" dependencies: @@ -14896,15 +13297,6 @@ __metadata: languageName: node linkType: hard -"one-time@npm:^1.0.0": - version: 1.0.0 - resolution: "one-time@npm:1.0.0" - dependencies: - fn.name: "npm:1.x.x" - checksum: 10/64d0160480eeae4e3b2a6fc0a02f452e05bb0cc8373a4ed56a4fc08c3939dcb91bc20075003ed499655bd16919feb63ca56f86eee7932c5251f7d629b55dfc90 - languageName: node - linkType: hard - "onetime@npm:^5.1.0, onetime@npm:^5.1.2": version: 5.1.2 resolution: "onetime@npm:5.1.2" @@ -14914,33 +13306,14 @@ __metadata: languageName: node linkType: hard -"onetime@npm:^6.0.0": - version: 6.0.0 - resolution: "onetime@npm:6.0.0" - dependencies: - mimic-fn: "npm:^4.0.0" - checksum: 10/0846ce78e440841335d4e9182ef69d5762e9f38aa7499b19f42ea1c4cd40f0b4446094c455c713f9adac3f4ae86f613bb5e30c99e52652764d06a89f709b3788 - languageName: node - linkType: hard - -"open@npm:^7.4.2": - version: 7.4.2 - resolution: "open@npm:7.4.2" - dependencies: - is-docker: "npm:^2.0.0" - is-wsl: "npm:^2.1.1" - checksum: 10/4fc02ed3368dcd5d7247ad3566433ea2695b0713b041ebc0eeb2f0f9e5d4e29fc2068f5cdd500976b3464e77fe8b61662b1b059c73233ccc601fe8b16d6c1cd6 - languageName: node - linkType: hard - -"open@npm:^8.4.2": - version: 8.4.2 - resolution: "open@npm:8.4.2" +"opentelemetry-instrumentation-fetch-node@npm:1.2.0": + version: 1.2.0 + resolution: "opentelemetry-instrumentation-fetch-node@npm:1.2.0" dependencies: - define-lazy-prop: "npm:^2.0.0" - is-docker: "npm:^2.1.1" - is-wsl: "npm:^2.2.0" - checksum: 10/acd81a1d19879c818acb3af2d2e8e9d81d17b5367561e623248133deb7dd3aefaed527531df2677d3e6aaf0199f84df57b6b2262babff8bf46ea0029aac536c9 + "@opentelemetry/api": "npm:^1.6.0" + "@opentelemetry/instrumentation": "npm:^0.43.0" + "@opentelemetry/semantic-conventions": "npm:^1.17.0" + checksum: 10/01435363058af094a66f91724a308ebafa81faf331ff92a1087146ca64986271e529417af361f65a47a8bc0202d1bf522f95e34b6ac2e74fd24bbdf5989a0a8f languageName: node linkType: hard @@ -14970,7 +13343,7 @@ __metadata: languageName: node linkType: hard -"ora@npm:^5.4.1": +"ora@npm:5.4.1, ora@npm:^5.4.1": version: 5.4.1 resolution: "ora@npm:5.4.1" dependencies: @@ -15001,22 +13374,6 @@ __metadata: languageName: node linkType: hard -"p-cancelable@npm:^2.0.0": - version: 2.1.1 - resolution: "p-cancelable@npm:2.1.1" - checksum: 10/7f1b64db17fc54acf359167d62898115dcf2a64bf6b3b038e4faf36fc059e5ed762fb9624df8ed04b25bee8de3ab8d72dea9879a2a960cd12e23c420a4aca6ed - languageName: node - linkType: hard - -"p-event@npm:^4.2.0": - version: 4.2.0 - resolution: "p-event@npm:4.2.0" - dependencies: - p-timeout: "npm:^3.1.0" - checksum: 10/d03238ff31f5694f11bd7dcc0eae16c35b1ffb8cad4e5263d5422ba0bd6736dbfdb33b72745ecb6b06b98494db80f49f12c14f5e8da1212bf6a424609ad8d885 - languageName: node - linkType: hard - "p-filter@npm:^2.1.0": version: 2.1.0 resolution: "p-filter@npm:2.1.0" @@ -15026,13 +13383,6 @@ __metadata: languageName: node linkType: hard -"p-finally@npm:^1.0.0": - version: 1.0.0 - resolution: "p-finally@npm:1.0.0" - checksum: 10/93a654c53dc805dd5b5891bab16eb0ea46db8f66c4bfd99336ae929323b1af2b70a8b0654f8f1eae924b2b73d037031366d645f1fd18b3d30cbd15950cc4b1d4 - languageName: node - linkType: hard - "p-limit@npm:3.1.0, p-limit@npm:^3.0.2, p-limit@npm:^3.1.0": version: 3.1.0 resolution: "p-limit@npm:3.1.0" @@ -15085,36 +13435,6 @@ __metadata: languageName: node linkType: hard -"p-memoize@npm:^7.1.1": - version: 7.1.1 - resolution: "p-memoize@npm:7.1.1" - dependencies: - mimic-fn: "npm:^4.0.0" - type-fest: "npm:^3.0.0" - checksum: 10/2fc5b12fc530aed9c1e455f706d8da2a2e6bed4573f611a4e92b2a75f253e8c0acc63ad014b55f155b5d5de110c586b490a4d6612d64bc743106cad626d995fd - languageName: node - linkType: hard - -"p-retry@npm:^6.2.0": - version: 6.2.0 - resolution: "p-retry@npm:6.2.0" - dependencies: - "@types/retry": "npm:0.12.2" - is-network-error: "npm:^1.0.0" - retry: "npm:^0.13.1" - checksum: 10/1a5ac16828c96c03c354f78d643dfc7aa8f8b998e1b60e27533da2c75e5cabfb1c7f88ce312e813e09a80b056011fbb372d384132e9c92d27d052bd7c282a978 - languageName: node - linkType: hard - -"p-timeout@npm:^3.1.0": - version: 3.2.0 - resolution: "p-timeout@npm:3.2.0" - dependencies: - p-finally: "npm:^1.0.0" - checksum: 10/3dd0eaa048780a6f23e5855df3dd45c7beacff1f820476c1d0d1bcd6648e3298752ba2c877aa1c92f6453c7dd23faaf13d9f5149fc14c0598a142e2c5e8d649c - languageName: node - linkType: hard - "p-try@npm:^2.0.0": version: 2.2.0 resolution: "p-try@npm:2.2.0" @@ -15122,13 +13442,6 @@ __metadata: languageName: node linkType: hard -"pako@npm:~1.0.2": - version: 1.0.11 - resolution: "pako@npm:1.0.11" - checksum: 10/1ad07210e894472685564c4d39a08717e84c2a68a70d3c1d9e657d32394ef1670e22972a433cbfe48976cb98b154ba06855dcd3fcfba77f60f1777634bec48c0 - languageName: node - linkType: hard - "param-case@npm:^3.0.4": version: 3.0.4 resolution: "param-case@npm:3.0.4" @@ -15180,7 +13493,7 @@ __metadata: languageName: node linkType: hard -"parseurl@npm:^1.3.3, parseurl@npm:~1.3.3": +"parseurl@npm:~1.3.3": version: 1.3.3 resolution: "parseurl@npm:1.3.3" checksum: 10/407cee8e0a3a4c5cd472559bca8b6a45b82c124e9a4703302326e9ab60fc1081442ada4e02628efef1eb16197ddc7f8822f5a91fd7d7c86b51f530aedb17dfa2 @@ -15197,6 +13510,13 @@ __metadata: languageName: node linkType: hard +"path-browserify@npm:^1.0.1": + version: 1.0.1 + resolution: "path-browserify@npm:1.0.1" + checksum: 10/7e7368a5207e7c6b9051ef045711d0dc3c2b6203e96057e408e6e74d09f383061010d2be95cb8593fe6258a767c3e9fc6b2bfc7ce8d48ae8c3d9f6994cca9ad8 + languageName: node + linkType: hard + "path-case@npm:^3.0.4": version: 3.0.4 resolution: "path-case@npm:3.0.4" @@ -15228,13 +13548,6 @@ __metadata: languageName: node linkType: hard -"path-key@npm:^2.0.1": - version: 2.0.1 - resolution: "path-key@npm:2.0.1" - checksum: 10/6e654864e34386a2a8e6bf72cf664dcabb76574dd54013add770b374384d438aca95f4357bb26935b514a4e4c2c9b19e191f2200b282422a76ee038b9258c5e7 - languageName: node - linkType: hard - "path-key@npm:^3.0.0, path-key@npm:^3.1.0": version: 3.1.1 resolution: "path-key@npm:3.1.1" @@ -15242,23 +13555,6 @@ __metadata: languageName: node linkType: hard -"path-key@npm:^4.0.0": - version: 4.0.0 - resolution: "path-key@npm:4.0.0" - checksum: 10/8e6c314ae6d16b83e93032c61020129f6f4484590a777eed709c4a01b50e498822b00f76ceaf94bc64dbd90b327df56ceadce27da3d83393790f1219e07721d7 - languageName: node - linkType: hard - -"path-loader@npm:^1.0.10": - version: 1.0.12 - resolution: "path-loader@npm:1.0.12" - dependencies: - native-promise-only: "npm:^0.8.1" - superagent: "npm:^7.1.6" - checksum: 10/63475f4bd14570eb7ab6298ec2ca19da47bac99bc98d30957a3128552a6c3212b31a8b06a5622d51301d462e6faf8de3683ea07c2f08cd17b9ab6cbc66d0f626 - languageName: node - linkType: hard - "path-parse@npm:^1.0.7": version: 1.0.7 resolution: "path-parse@npm:1.0.7" @@ -15292,6 +13588,16 @@ __metadata: languageName: node linkType: hard +"path-scurry@npm:^1.6.1": + version: 1.11.1 + resolution: "path-scurry@npm:1.11.1" + dependencies: + lru-cache: "npm:^10.2.0" + minipass: "npm:^5.0.0 || ^6.0.2 || ^7.0.0" + checksum: 10/5e8845c159261adda6f09814d7725683257fcc85a18f329880ab4d7cc1d12830967eae5d5894e453f341710d5484b8fdbbd4d75181b4d6e1eb2f4dc7aeadc434 + languageName: node + linkType: hard + "path-to-regexp@npm:0.1.7": version: 0.1.7 resolution: "path-to-regexp@npm:0.1.7" @@ -15306,6 +13612,13 @@ __metadata: languageName: node linkType: hard +"path-to-regexp@npm:3.2.0": + version: 3.2.0 + resolution: "path-to-regexp@npm:3.2.0" + checksum: 10/3c86811e0d69719e20908ed6457b6f51d0d66ffc526e04d259cddea5fd777c7b967adb60907658b7e1a98cb7bf1bbbbad3523337a676c98513fd76a7b513075e + languageName: node + linkType: hard + "path-type@npm:^4.0.0": version: 4.0.0 resolution: "path-type@npm:4.0.0" @@ -15313,24 +13626,52 @@ __metadata: languageName: node linkType: hard -"path2@npm:^0.1.0": - version: 0.1.0 - resolution: "path2@npm:0.1.0" - checksum: 10/ef63ed39388718f5d446f87555dee6afe0923e3f1aa3b38fd2f90a74b82e19ea72fa14b25cb3b07c0434a503ccdcf1f481c456442ed60a5f8a2ef85823d0fa6a +"pg-int8@npm:1.0.1": + version: 1.0.1 + resolution: "pg-int8@npm:1.0.1" + checksum: 10/a1e3a05a69005ddb73e5f324b6b4e689868a447c5fa280b44cd4d04e6916a344ac289e0b8d2695d66e8e89a7fba023affb9e0e94778770ada5df43f003d664c9 languageName: node linkType: hard -"peek-readable@npm:^4.1.0": - version: 4.1.0 - resolution: "peek-readable@npm:4.1.0" - checksum: 10/97373215dcf382748645c3d22ac5e8dbd31759f7bd0c539d9fdbaaa7d22021838be3e55110ad0ed8f241c489342304b14a50dfee7ef3bcee2987d003b24ecc41 +"pg-numeric@npm:1.0.2": + version: 1.0.2 + resolution: "pg-numeric@npm:1.0.2" + checksum: 10/8899f8200caa1744439a8778a9eb3ceefb599d893e40a09eef84ee0d4c151319fd416634a6c0fc7b7db4ac268710042da5be700b80ef0de716fe089b8652c84f languageName: node linkType: hard -"pend@npm:~1.2.0": - version: 1.2.0 - resolution: "pend@npm:1.2.0" - checksum: 10/6c72f5243303d9c60bd98e6446ba7d30ae29e3d56fdb6fae8767e8ba6386f33ee284c97efe3230a0d0217e2b1723b8ab490b1bbf34fcbb2180dbc8a9de47850d +"pg-protocol@npm:*": + version: 1.6.1 + resolution: "pg-protocol@npm:1.6.1" + checksum: 10/9af672208adae8214f55f5b4597c4699ab9946205a99863d3e2bb8d024fdab16711457b539bc366cc29040218aa87508cf61294b76d288f48881b973d9117bd6 + languageName: node + linkType: hard + +"pg-types@npm:^2.2.0": + version: 2.2.0 + resolution: "pg-types@npm:2.2.0" + dependencies: + pg-int8: "npm:1.0.1" + postgres-array: "npm:~2.0.0" + postgres-bytea: "npm:~1.0.0" + postgres-date: "npm:~1.0.4" + postgres-interval: "npm:^1.1.0" + checksum: 10/87a84d4baa91378d3a3da6076c69685eb905d1087bf73525ae1ba84b291b9dd8738c6716b333d8eac6cec91bf087237adc3e9281727365e9cbab0d9d072778b1 + languageName: node + linkType: hard + +"pg-types@npm:^4.0.1": + version: 4.0.2 + resolution: "pg-types@npm:4.0.2" + dependencies: + pg-int8: "npm:1.0.1" + pg-numeric: "npm:1.0.2" + postgres-array: "npm:~3.0.1" + postgres-bytea: "npm:~3.0.0" + postgres-date: "npm:~2.1.0" + postgres-interval: "npm:^3.0.0" + postgres-range: "npm:^1.1.1" + checksum: 10/f4d529da864d4169afab300eb8629a84a6a06aa70c471160a7e46c34b6d4dd0e61cbd57d10d98c3a36e98f474e2ff85d41e4b1c953a321146b4bae09372c58d3 languageName: node linkType: hard @@ -15341,6 +13682,13 @@ __metadata: languageName: node linkType: hard +"picomatch@npm:3.0.1": + version: 3.0.1 + resolution: "picomatch@npm:3.0.1" + checksum: 10/65ac837fedbd0640586f7c214f6c7481e1e12f41cdcd22a95eb6a2914d1773707ed0f0b5bd2d1e39b5ec7860b43a4c9150152332a3884cd8dd1d419b2a2fa5b5 + languageName: node + linkType: hard + "picomatch@npm:^2.0.4, picomatch@npm:^2.2.1, picomatch@npm:^2.2.3, picomatch@npm:^2.3.1": version: 2.3.1 resolution: "picomatch@npm:2.3.1" @@ -15355,13 +13703,6 @@ __metadata: languageName: node linkType: hard -"pify@npm:^3.0.0": - version: 3.0.0 - resolution: "pify@npm:3.0.0" - checksum: 10/668c1dc8d9fc1b34b9ce3b16ba59deb39d4dc743527bf2ed908d2b914cb8ba40aa5ba6960b27c417c241531c5aafd0598feeac2d50cb15278cf9863fa6b02a77 - languageName: node - linkType: hard - "pify@npm:^4.0.1": version: 4.0.1 resolution: "pify@npm:4.0.1" @@ -15369,22 +13710,6 @@ __metadata: languageName: node linkType: hard -"pinkie-promise@npm:^2.0.0": - version: 2.0.1 - resolution: "pinkie-promise@npm:2.0.1" - dependencies: - pinkie: "npm:^2.0.0" - checksum: 10/b53a4a2e73bf56b6f421eef711e7bdcb693d6abb474d57c5c413b809f654ba5ee750c6a96dd7225052d4b96c4d053cdcb34b708a86fceed4663303abee52fcca - languageName: node - linkType: hard - -"pinkie@npm:^2.0.0": - version: 2.0.4 - resolution: "pinkie@npm:2.0.4" - checksum: 10/11d207257a044d1047c3755374d36d84dda883a44d030fe98216bf0ea97da05a5c9d64e82495387edeb9ee4f52c455bca97cdb97629932be65e6f54b29f5aec8 - languageName: node - linkType: hard - "pirates@npm:^4.0.1, pirates@npm:^4.0.4": version: 4.0.6 resolution: "pirates@npm:4.0.6" @@ -15401,6 +13726,13 @@ __metadata: languageName: node linkType: hard +"pluralize@npm:8.0.0": + version: 8.0.0 + resolution: "pluralize@npm:8.0.0" + checksum: 10/17877fdfdb7ddb3639ce257ad73a7c51a30a966091e40f56ea9f2f545b5727ce548d4928f8cb3ce38e7dc0c5150407d318af6a4ed0ea5265d378473b4c2c61ec + languageName: node + linkType: hard + "postcss-import@npm:^15.1.0": version: 15.1.0 resolution: "postcss-import@npm:15.1.0" @@ -15504,6 +13836,73 @@ __metadata: languageName: node linkType: hard +"postgres-array@npm:~2.0.0": + version: 2.0.0 + resolution: "postgres-array@npm:2.0.0" + checksum: 10/aff99e79714d1271fe942fec4ffa2007b755e7e7dc3d2feecae3f1ceecb86fd3637c8138037fc3d9e7ec369231eeb136843c0b25927bf1ce295245a40ef849b4 + languageName: node + linkType: hard + +"postgres-array@npm:~3.0.1": + version: 3.0.2 + resolution: "postgres-array@npm:3.0.2" + checksum: 10/0159517e4e5f263bf9e324f0c4d3c10244a294021f2b5980abc8c23afdb965370a7fc0c82012fce4d28e83186ad089b6476b05fcef6c88f8e43e37a3a2fa0ad5 + languageName: node + linkType: hard + +"postgres-bytea@npm:~1.0.0": + version: 1.0.0 + resolution: "postgres-bytea@npm:1.0.0" + checksum: 10/d844ae4ca7a941b70e45cac1261a73ee8ed39d72d3d74ab1d645248185a1b7f0ac91a3c63d6159441020f4e1f7fe64689ac56536a307b31cef361e5187335090 + languageName: node + linkType: hard + +"postgres-bytea@npm:~3.0.0": + version: 3.0.0 + resolution: "postgres-bytea@npm:3.0.0" + dependencies: + obuf: "npm:~1.1.2" + checksum: 10/f5c01758fd2fa807afbd34e1ba2146f683818ebc2d23f4a62f0fd627c0b1126fc543cab1b63925f97ce6c7d8f5f316043218619c447445210ea82f10411efb1b + languageName: node + linkType: hard + +"postgres-date@npm:~1.0.4": + version: 1.0.7 + resolution: "postgres-date@npm:1.0.7" + checksum: 10/571ef45bec4551bb5d608c31b79987d7a895141f7d6c7b82e936a52d23d97474c770c6143e5cf8936c1cdc8b0dfd95e79f8136bf56a90164182a60f242c19f2b + languageName: node + linkType: hard + +"postgres-date@npm:~2.1.0": + version: 2.1.0 + resolution: "postgres-date@npm:2.1.0" + checksum: 10/faa1c70dfad0e35bd4aa7cb6088fcd4e4f039aa25dc42150129178fc2a0baa7e37eca0bf18e4142a40dea18d1955459b08783f78ec487ef27b4b93ab5e854597 + languageName: node + linkType: hard + +"postgres-interval@npm:^1.1.0": + version: 1.2.0 + resolution: "postgres-interval@npm:1.2.0" + dependencies: + xtend: "npm:^4.0.0" + checksum: 10/746b71f93805ae33b03528e429dc624706d1f9b20ee81bf743263efb6a0cd79ae02a642a8a480dbc0f09547b4315ab7df6ce5ec0be77ed700bac42730f5c76b2 + languageName: node + linkType: hard + +"postgres-interval@npm:^3.0.0": + version: 3.0.0 + resolution: "postgres-interval@npm:3.0.0" + checksum: 10/c7a1cf006de97de663b6b8c4d2b167aa9909a238c4866a94b15d303762f5ac884ff4796cd6e2111b7f0a91302b83c570453aa8506fd005b5a5d5dfa87441bebc + languageName: node + linkType: hard + +"postgres-range@npm:^1.1.1": + version: 1.1.4 + resolution: "postgres-range@npm:1.1.4" + checksum: 10/035759f17b44bf9ba7e71a30402ed2ca1e2b7fabb3ad794b08169a5b453d38d06905a6dfb51fe41a3f6d9fac4e183dac9e769b95053053db933be16785edce1f + languageName: node + linkType: hard + "preferred-pm@npm:^3.0.0": version: 3.1.3 resolution: "preferred-pm@npm:3.1.3" @@ -15608,18 +14007,6 @@ __metadata: languageName: node linkType: hard -"process-utils@npm:^4.0.0": - version: 4.0.0 - resolution: "process-utils@npm:4.0.0" - dependencies: - ext: "npm:^1.4.0" - fs2: "npm:^0.3.9" - memoizee: "npm:^0.4.14" - type: "npm:^2.1.0" - checksum: 10/b905df2a57324b219cd99b999c68fd098a1790f60bd553346444424db35634c99f5c0941354017070bf42ca9ca9048034bfc2643054cf3e5034ac4a17d42fbb6 - languageName: node - linkType: hard - "progress@npm:^2.0.3": version: 2.0.3 resolution: "progress@npm:2.0.3" @@ -15627,13 +14014,6 @@ __metadata: languageName: node linkType: hard -"promise-queue@npm:^2.2.5": - version: 2.2.5 - resolution: "promise-queue@npm:2.2.5" - checksum: 10/3e3c33d91c4f4afb59d50d18c4d22e820fbb82c912ba73691a2c1d28257dc1f5ca2cc0319a3d4035cf662579a9a020e2948cd375b500422d7c59581004e2dc1a - languageName: node - linkType: hard - "promise-retry@npm:^2.0.1": version: 2.0.1 resolution: "promise-retry@npm:2.0.1" @@ -15726,23 +14106,6 @@ __metadata: languageName: node linkType: hard -"pump@npm:^3.0.0": - version: 3.0.0 - resolution: "pump@npm:3.0.0" - dependencies: - end-of-stream: "npm:^1.1.0" - once: "npm:^1.3.1" - checksum: 10/e42e9229fba14732593a718b04cb5e1cfef8254544870997e0ecd9732b189a48e1256e4e5478148ecb47c8511dca2b09eae56b4d0aad8009e6fac8072923cfc9 - languageName: node - linkType: hard - -"punycode@npm:1.3.2": - version: 1.3.2 - resolution: "punycode@npm:1.3.2" - checksum: 10/5c57d588c60679fd1b9400c75de06e327723f2b38e21e195027ba7a59006725f7b817dce5b26d47c7f8c1c842d28275aa59955a06d2e467cffeba70b7e0576bb - languageName: node - linkType: hard - "punycode@npm:^1.3.2": version: 1.4.1 resolution: "punycode@npm:1.4.1" @@ -15789,7 +14152,7 @@ __metadata: languageName: node linkType: hard -"qs@npm:^6.10.3, qs@npm:^6.11.0": +"qs@npm:^6.11.0": version: 6.11.2 resolution: "qs@npm:6.11.2" dependencies: @@ -15798,20 +14161,6 @@ __metadata: languageName: node linkType: hard -"querystring@npm:0.2.0": - version: 0.2.0 - resolution: "querystring@npm:0.2.0" - checksum: 10/37b91720be8c8de87b49d1a68f0ceafbbeda6efe6334ce7aad080b0b4111f933a40650b8a6669c1bc629cd8bb37c67cb7b5a42ec0758662efbce44b8faa1766d - languageName: node - linkType: hard - -"querystring@npm:^0.2.1": - version: 0.2.1 - resolution: "querystring@npm:0.2.1" - checksum: 10/5ae2eeb8c6d70263a3d13ffaf234ce9593ae0e95ad8ea04aa540e14ff66679347420817aeb4fe6fdfa2aaa7fac86e311b6f1d3da2187f433082ad9125c808c14 - languageName: node - linkType: hard - "querystringify@npm:^2.1.1": version: 2.2.0 resolution: "querystringify@npm:2.2.0" @@ -15833,17 +14182,12 @@ __metadata: languageName: node linkType: hard -"quick-lru@npm:^5.1.1": - version: 5.1.1 - resolution: "quick-lru@npm:5.1.1" - checksum: 10/a516faa25574be7947969883e6068dbe4aa19e8ef8e8e0fd96cddd6d36485e9106d85c0041a27153286b0770b381328f4072aa40d3b18a19f5f7d2b78b94b5ed - languageName: node - linkType: hard - -"ramda@npm:^0.28.0": - version: 0.28.0 - resolution: "ramda@npm:0.28.0" - checksum: 10/1925e1881ece9feacd7eae620036996dcd3fb4973d931200e8594813238169afeaae8cc4377b4cb40978c26a07929f4e7f88cb2776a6c41b2e65f18dfba6530d +"randombytes@npm:^2.1.0": + version: 2.1.0 + resolution: "randombytes@npm:2.1.0" + dependencies: + safe-buffer: "npm:^5.1.0" + checksum: 10/4efd1ad3d88db77c2d16588dc54c2b52fd2461e70fe5724611f38d283857094fe09040fa2c9776366803c3152cf133171b452ef717592b65631ce5dc3a2bdafc languageName: node linkType: hard @@ -16005,7 +14349,7 @@ __metadata: languageName: node linkType: hard -"readable-stream@npm:3, readable-stream@npm:^3.0.0, readable-stream@npm:^3.1.1, readable-stream@npm:^3.4.0, readable-stream@npm:^3.6.0": +"readable-stream@npm:3, readable-stream@npm:^3.0.0, readable-stream@npm:^3.4.0": version: 3.6.2 resolution: "readable-stream@npm:3.6.2" dependencies: @@ -16016,7 +14360,7 @@ __metadata: languageName: node linkType: hard -"readable-stream@npm:^2.0.0, readable-stream@npm:^2.0.5, readable-stream@npm:^2.3.0, readable-stream@npm:^2.3.5, readable-stream@npm:~2.3.6": +"readable-stream@npm:^2.2.2": version: 2.3.8 resolution: "readable-stream@npm:2.3.8" dependencies: @@ -16027,25 +14371,7 @@ __metadata: safe-buffer: "npm:~5.1.1" string_decoder: "npm:~1.1.1" util-deprecate: "npm:~1.0.1" - checksum: 10/8500dd3a90e391d6c5d889256d50ec6026c059fadee98ae9aa9b86757d60ac46fff24fafb7a39fa41d54cb39d8be56cc77be202ebd4cd8ffcf4cb226cbaa40d4 - languageName: node - linkType: hard - -"readable-web-to-node-stream@npm:^3.0.0": - version: 3.0.2 - resolution: "readable-web-to-node-stream@npm:3.0.2" - dependencies: - readable-stream: "npm:^3.6.0" - checksum: 10/d3a5bf9d707c01183d546a64864aa63df4d9cb835dfd2bf89ac8305e17389feef2170c4c14415a10d38f9b9bfddf829a57aaef7c53c8b40f11d499844bf8f1a4 - languageName: node - linkType: hard - -"readdir-glob@npm:^1.1.2": - version: 1.1.3 - resolution: "readdir-glob@npm:1.1.3" - dependencies: - minimatch: "npm:^5.1.0" - checksum: 10/ca3a20aa1e715d671302d4ec785a32bf08e59d6d0dd25d5fc03e9e5a39f8c612cdf809ab3e638a79973db7ad6868492edf38504701e313328e767693671447d6 + checksum: 10/8500dd3a90e391d6c5d889256d50ec6026c059fadee98ae9aa9b86757d60ac46fff24fafb7a39fa41d54cb39d8be56cc77be202ebd4cd8ffcf4cb226cbaa40d4 languageName: node linkType: hard @@ -16058,6 +14384,15 @@ __metadata: languageName: node linkType: hard +"rechoir@npm:^0.6.2": + version: 0.6.2 + resolution: "rechoir@npm:0.6.2" + dependencies: + resolve: "npm:^1.1.6" + checksum: 10/fe76bf9c21875ac16e235defedd7cbd34f333c02a92546142b7911a0f7c7059d2e16f441fe6fb9ae203f459c05a31b2bcf26202896d89e390eda7514d5d2702b + languageName: node + linkType: hard + "redent@npm:^3.0.0": version: 3.0.0 resolution: "redent@npm:3.0.0" @@ -16068,6 +14403,13 @@ __metadata: languageName: node linkType: hard +"reflect-metadata@npm:0.2.2": + version: 0.2.2 + resolution: "reflect-metadata@npm:0.2.2" + checksum: 10/1c93f9ac790fea1c852fde80c91b2760420069f4862f28e6fae0c00c6937a56508716b0ed2419ab02869dd488d123c4ab92d062ae84e8739ea7417fae10c4745 + languageName: node + linkType: hard + "reflect.getprototypeof@npm:^1.0.4": version: 1.0.4 resolution: "reflect.getprototypeof@npm:1.0.4" @@ -16166,6 +14508,13 @@ __metadata: languageName: node linkType: hard +"repeat-string@npm:^1.6.1": + version: 1.6.1 + resolution: "repeat-string@npm:1.6.1" + checksum: 10/1b809fc6db97decdc68f5b12c4d1a671c8e3f65ec4a40c238bc5200e44e85bcc52a54f78268ab9c29fcf5fe4f1343e805420056d1f30fa9a9ee4c2d93e3cc6c0 + languageName: node + linkType: hard + "require-directory@npm:^2.1.1": version: 2.1.1 resolution: "require-directory@npm:2.1.1" @@ -16180,6 +14529,17 @@ __metadata: languageName: node linkType: hard +"require-in-the-middle@npm:^7.1.1": + version: 7.3.0 + resolution: "require-in-the-middle@npm:7.3.0" + dependencies: + debug: "npm:^4.1.1" + module-details-from-path: "npm:^1.0.3" + resolve: "npm:^1.22.1" + checksum: 10/883343b9ba15d42dd443b20fba5f9135cc4b7c2c2af3ae87f0105c28c499f98438a414e49bbfafd3f607dbe60a91c0da3610d31c9c3f61d222e565a8e8dd161e + languageName: node + linkType: hard + "require-main-filename@npm:^2.0.0": version: 2.0.0 resolution: "require-main-filename@npm:2.0.0" @@ -16201,13 +14561,6 @@ __metadata: languageName: node linkType: hard -"resolve-alpn@npm:^1.0.0": - version: 1.2.1 - resolution: "resolve-alpn@npm:1.2.1" - checksum: 10/744e87888f0b6fa0b256ab454ca0b9c0b80808715e2ef1f3672773665c92a941f6181194e30ccae4a8cd0adbe0d955d3f133102636d2ee0cca0119fec0bc9aec - languageName: node - linkType: hard - "resolve-cwd@npm:^3.0.0": version: 3.0.0 resolution: "resolve-cwd@npm:3.0.0" @@ -16254,7 +14607,7 @@ __metadata: languageName: node linkType: hard -"resolve@npm:1.22.8, resolve@npm:^1.1.7, resolve@npm:^1.10.0, resolve@npm:^1.20.0, resolve@npm:^1.22.2, resolve@npm:^1.22.4": +"resolve@npm:1.22.8, resolve@npm:^1.1.6, resolve@npm:^1.1.7, resolve@npm:^1.10.0, resolve@npm:^1.20.0, resolve@npm:^1.22.1, resolve@npm:^1.22.2, resolve@npm:^1.22.4": version: 1.22.8 resolution: "resolve@npm:1.22.8" dependencies: @@ -16280,7 +14633,7 @@ __metadata: languageName: node linkType: hard -"resolve@patch:resolve@npm%3A1.22.8#optional!builtin, resolve@patch:resolve@npm%3A^1.1.7#optional!builtin, resolve@patch:resolve@npm%3A^1.10.0#optional!builtin, resolve@patch:resolve@npm%3A^1.20.0#optional!builtin, resolve@patch:resolve@npm%3A^1.22.2#optional!builtin, resolve@patch:resolve@npm%3A^1.22.4#optional!builtin": +"resolve@patch:resolve@npm%3A1.22.8#optional!builtin, resolve@patch:resolve@npm%3A^1.1.6#optional!builtin, resolve@patch:resolve@npm%3A^1.1.7#optional!builtin, resolve@patch:resolve@npm%3A^1.10.0#optional!builtin, resolve@patch:resolve@npm%3A^1.20.0#optional!builtin, resolve@patch:resolve@npm%3A^1.22.1#optional!builtin, resolve@patch:resolve@npm%3A^1.22.2#optional!builtin, resolve@patch:resolve@npm%3A^1.22.4#optional!builtin": version: 1.22.8 resolution: "resolve@patch:resolve@npm%3A1.22.8#optional!builtin::version=1.22.8&hash=c3c19d" dependencies: @@ -16313,15 +14666,6 @@ __metadata: languageName: node linkType: hard -"responselike@npm:^2.0.0": - version: 2.0.1 - resolution: "responselike@npm:2.0.1" - dependencies: - lowercase-keys: "npm:^2.0.0" - checksum: 10/b122535466e9c97b55e69c7f18e2be0ce3823c5d47ee8de0d9c0b114aa55741c6db8bfbfce3766a94d1272e61bfb1ebf0a15e9310ac5629fbb7446a861b4fd3a - languageName: node - linkType: hard - "restore-cursor@npm:^3.1.0": version: 3.1.0 resolution: "restore-cursor@npm:3.1.0" @@ -16332,7 +14676,7 @@ __metadata: languageName: node linkType: hard -"retry@npm:0.13.1, retry@npm:^0.13.1": +"retry@npm:0.13.1": version: 0.13.1 resolution: "retry@npm:0.13.1" checksum: 10/6125ec2e06d6e47e9201539c887defba4e47f63471db304c59e4b82fc63c8e89ca06a77e9d34939a9a42a76f00774b2f46c0d4a4cbb3e287268bd018ed69426d @@ -16360,6 +14704,17 @@ __metadata: languageName: node linkType: hard +"rimraf@npm:4.4.1": + version: 4.4.1 + resolution: "rimraf@npm:4.4.1" + dependencies: + glob: "npm:^9.2.0" + bin: + rimraf: dist/cjs/src/bin.js + checksum: 10/218ef9122145ccce9d0a71124d36a3894537de46600b37fae7dba26ccff973251eaa98aa63c2c5855a05fa04bca7cbbd7a92d4b29f2875d2203e72530ecf6ede + languageName: node + linkType: hard + "rimraf@npm:^3.0.2": version: 3.0.2 resolution: "rimraf@npm:3.0.2" @@ -16446,12 +14801,10 @@ __metadata: languageName: node linkType: hard -"run-parallel-limit@npm:^1.1.0": - version: 1.1.0 - resolution: "run-parallel-limit@npm:1.1.0" - dependencies: - queue-microtask: "npm:^1.2.2" - checksum: 10/672c3b87e7f939c684b9965222b361421db0930223ed1e43ebf0e7e48ccc1a022ea4de080bef4d5468434e2577c33b7681e3f03b7593fdc49ad250a55381123c +"run-async@npm:^3.0.0": + version: 3.0.0 + resolution: "run-async@npm:3.0.0" + checksum: 10/97fb8747f7765b77ebcd311d3a33548099336f04c6434e0763039b98c1de0f1b4421000695aff8751f309c0b995d8dfd620c1f1e4c35572da38c101488165305 languageName: node linkType: hard @@ -16464,7 +14817,7 @@ __metadata: languageName: node linkType: hard -"rxjs@npm:^7.5.5": +"rxjs@npm:7.8.1, rxjs@npm:^7.5.5, rxjs@npm:^7.8.1": version: 7.8.1 resolution: "rxjs@npm:7.8.1" dependencies: @@ -16492,7 +14845,7 @@ __metadata: languageName: node linkType: hard -"safe-buffer@npm:5.2.1, safe-buffer@npm:^5.0.1, safe-buffer@npm:^5.1.1, safe-buffer@npm:~5.2.0": +"safe-buffer@npm:5.2.1, safe-buffer@npm:^5.0.1, safe-buffer@npm:^5.1.0, safe-buffer@npm:~5.2.0": version: 5.2.1 resolution: "safe-buffer@npm:5.2.1" checksum: 10/32872cd0ff68a3ddade7a7617b8f4c2ae8764d8b7d884c651b74457967a9e0e886267d3ecc781220629c44a865167b61c375d2da6c720c840ecd73f45d5d9451 @@ -16510,13 +14863,6 @@ __metadata: languageName: node linkType: hard -"safe-stable-stringify@npm:^2.3.1": - version: 2.4.3 - resolution: "safe-stable-stringify@npm:2.4.3" - checksum: 10/a6c192bbefe47770a11072b51b500ed29be7b1c15095371c1ee1dc13e45ce48ee3c80330214c56764d006c485b88bd0b24940d868948170dddc16eed312582d8 - languageName: node - linkType: hard - "safer-buffer@npm:>= 2.1.2 < 3, safer-buffer@npm:>= 2.1.2 < 3.0.0": version: 2.1.2 resolution: "safer-buffer@npm:2.1.2" @@ -16524,20 +14870,6 @@ __metadata: languageName: node linkType: hard -"sax@npm:1.2.1": - version: 1.2.1 - resolution: "sax@npm:1.2.1" - checksum: 10/d64f65291ce127f191eb2c22012f8f608736e306db6a28306e618bb1324cfbc19f6783c49ce0d88e5628fde30878c29189c8fb3c62c83f079b471734e4df455d - languageName: node - linkType: hard - -"sax@npm:>=0.6.0": - version: 1.3.0 - resolution: "sax@npm:1.3.0" - checksum: 10/bb571b31d30ecb0353c2ff5f87b117a03e5fb9eb4c1519141854c1a8fbee0a77ddbe8045f413259e711833aa03da210887df8527d19cdc55f299822dbf4b34de - languageName: node - linkType: hard - "saxes@npm:^6.0.0": version: 6.0.0 resolution: "saxes@npm:6.0.0" @@ -16556,6 +14888,17 @@ __metadata: languageName: node linkType: hard +"schema-utils@npm:^3.1.1, schema-utils@npm:^3.2.0": + version: 3.3.0 + resolution: "schema-utils@npm:3.3.0" + dependencies: + "@types/json-schema": "npm:^7.0.8" + ajv: "npm:^6.12.5" + ajv-keywords: "npm:^3.5.2" + checksum: 10/2c7bbb1da967fdfd320e6cea538949006ec6e8c13ea560a4f94ff2c56809a8486fa5ec419e023452501a6befe1ca381e409c2798c24f4993c7c4094d97fdb258 + languageName: node + linkType: hard + "scuid@npm:^1.1.0": version: 1.1.0 resolution: "scuid@npm:1.1.0" @@ -16570,19 +14913,7 @@ __metadata: languageName: node linkType: hard -"seek-bzip@npm:^1.0.5": - version: 1.0.6 - resolution: "seek-bzip@npm:1.0.6" - dependencies: - commander: "npm:^2.8.1" - bin: - seek-bunzip: bin/seek-bunzip - seek-table: bin/seek-bzip-table - checksum: 10/e47967b694ba51b87a4e7b388772f9c9f6826547972c4c0d2f72b6dd9a41825fe63e810ad56be0f1bcba71c90550b7cb3aee53c261b9aebc15af1cd04fae008f - languageName: node - linkType: hard - -"semver@npm:2 || 3 || 4 || 5, semver@npm:^5.5.0, semver@npm:^5.7.1": +"semver@npm:2 || 3 || 4 || 5, semver@npm:^5.7.1": version: 5.7.2 resolution: "semver@npm:5.7.2" bin: @@ -16591,7 +14922,7 @@ __metadata: languageName: node linkType: hard -"semver@npm:7.5.4, semver@npm:^7.3.4, semver@npm:^7.3.5, semver@npm:^7.3.7, semver@npm:^7.3.8, semver@npm:^7.5.3, semver@npm:^7.5.4": +"semver@npm:7.5.4, semver@npm:^7.3.4, semver@npm:^7.3.5, semver@npm:^7.3.7, semver@npm:^7.5.3, semver@npm:^7.5.4": version: 7.5.4 resolution: "semver@npm:7.5.4" dependencies: @@ -16611,6 +14942,15 @@ __metadata: languageName: node linkType: hard +"semver@npm:^7.5.2": + version: 7.6.2 + resolution: "semver@npm:7.6.2" + bin: + semver: bin/semver.js + checksum: 10/296b17d027f57a87ef645e9c725bff4865a38dfc9caf29b26aa084b85820972fbe7372caea1ba6857162fa990702c6d9c1d82297cecb72d56c78ab29070d2ca2 + languageName: node + linkType: hard + "semver@npm:~7.0.0": version: 7.0.0 resolution: "semver@npm:7.0.0" @@ -16652,6 +14992,22 @@ __metadata: languageName: node linkType: hard +"seq-queue@npm:^0.0.5": + version: 0.0.5 + resolution: "seq-queue@npm:0.0.5" + checksum: 10/fa302e3b2aaece644532603ae42d675f9b8750e395a98740dd58dc5e02985ce6f0c2b78715b5984d6f6a807893735a14212a70d6ec591e6fba410397269588a0 + languageName: node + linkType: hard + +"serialize-javascript@npm:^6.0.1": + version: 6.0.2 + resolution: "serialize-javascript@npm:6.0.2" + dependencies: + randombytes: "npm:^2.1.0" + checksum: 10/445a420a6fa2eaee4b70cbd884d538e259ab278200a2ededd73253ada17d5d48e91fb1f4cd224a236ab62ea7ba0a70c6af29fc93b4f3d3078bf7da1c031fde58 + languageName: node + linkType: hard + "serve-handler@npm:6.1.5": version: 6.1.5 resolution: "serve-handler@npm:6.1.5" @@ -16701,154 +15057,6 @@ __metadata: languageName: node linkType: hard -"serverless-certificate-creator@npm:1.6.0": - version: 1.6.0 - resolution: "serverless-certificate-creator@npm:1.6.0" - dependencies: - aws-sdk: "npm:^2.320.0" - chalk: "npm:^2.4.2" - delay: "npm:^4.3.0" - mkdirp: "npm:^1.0.4" - semver: "npm:^7.3.4" - yamljs: "npm:^0.3.0" - checksum: 10/5559db23ab0a964870c56a55c772f409a98ebf74972fa1fc1e76c8290721887cb948dcc0676fcc0a57a748f35bcdce7865854eb540f84ab043fab08d87b93946 - languageName: node - linkType: hard - -"serverless-domain-manager@npm:6.4.4": - version: 6.4.4 - resolution: "serverless-domain-manager@npm:6.4.4" - dependencies: - aws-sdk: "npm:^2.1322.0" - checksum: 10/ada035be44f6c0aa218747abbee43b2145d7fe8249f51dbc60efb321f4a5adc7ca01490305788ffc263c2fcc4e456b564e986d429c80aa0125bf9e4676513452 - languageName: node - linkType: hard - -"serverless-esbuild@npm:1.52.1": - version: 1.52.1 - resolution: "serverless-esbuild@npm:1.52.1" - dependencies: - acorn: "npm:^8.8.1" - acorn-walk: "npm:^8.2.0" - anymatch: "npm:^3.1.3" - archiver: "npm:^5.3.1" - bestzip: "npm:^2.2.1" - chokidar: "npm:^3.5.3" - execa: "npm:^5.1.1" - fp-ts: "npm:^2.13.1" - fs-extra: "npm:^11.1.0" - globby: "npm:^11.0.4" - p-map: "npm:^4.0.0" - ramda: "npm:^0.28.0" - semver: "npm:^7.3.8" - peerDependencies: - esbuild: ">=0.8 <0.21" - esbuild-node-externals: ^1.0.0 - peerDependenciesMeta: - esbuild-node-externals: - optional: true - checksum: 10/c9397b160dad4285eab6362622390b5b743b35815bc219c6b1fbd4900f533441ac42fd7ecb35c438d9130e8fcf2340b5b083fcc18625a720f014600c5ea952f1 - languageName: node - linkType: hard - -"serverless-offline@npm:13.3.3": - version: 13.3.3 - resolution: "serverless-offline@npm:13.3.3" - dependencies: - "@aws-sdk/client-lambda": "npm:^3.496.0" - "@hapi/boom": "npm:^10.0.1" - "@hapi/h2o2": "npm:^10.0.4" - "@hapi/hapi": "npm:^21.3.2" - "@serverless/utils": "npm:^6.15.0" - array-unflat-js: "npm:^0.1.3" - boxen: "npm:^7.1.1" - chalk: "npm:^5.3.0" - desm: "npm:^1.3.1" - execa: "npm:^8.0.1" - fs-extra: "npm:^11.2.0" - is-wsl: "npm:^3.1.0" - java-invoke-local: "npm:0.0.6" - jose: "npm:^5.2.0" - js-string-escape: "npm:^1.0.1" - jsonpath-plus: "npm:^8.0.0" - jsonschema: "npm:^1.4.1" - jszip: "npm:^3.10.1" - luxon: "npm:^3.4.4" - node-schedule: "npm:^2.1.1" - p-memoize: "npm:^7.1.1" - p-retry: "npm:^6.2.0" - velocityjs: "npm:^2.0.6" - ws: "npm:^8.16.0" - peerDependencies: - serverless: ^3.2.0 - checksum: 10/6bd2a7cc99c6c871f53386c0ef6f31fad2bf00924886ac733211878558780ed06c9fad57664504f89a049a8017b36257c3ca18d0739eef74166babc0383845f5 - languageName: node - linkType: hard - -"serverless@npm:3.22.0": - version: 3.22.0 - resolution: "serverless@npm:3.22.0" - dependencies: - "@serverless/dashboard-plugin": "npm:^6.2.2" - "@serverless/platform-client": "npm:^4.3.2" - "@serverless/utils": "npm:^6.7.0" - ajv: "npm:^8.11.0" - ajv-formats: "npm:^2.1.1" - archiver: "npm:^5.3.1" - aws-sdk: "npm:^2.1195.0" - bluebird: "npm:^3.7.2" - cachedir: "npm:^2.3.0" - chalk: "npm:^4.1.2" - child-process-ext: "npm:^2.1.1" - ci-info: "npm:^3.3.2" - cli-progress-footer: "npm:^2.3.2" - d: "npm:^1.0.1" - dayjs: "npm:^1.11.5" - decompress: "npm:^4.2.1" - dotenv: "npm:^10.0.0" - dotenv-expand: "npm:^5.1.0" - essentials: "npm:^1.2.0" - ext: "npm:^1.6.0" - fastest-levenshtein: "npm:^1.0.16" - filesize: "npm:^8.0.7" - fs-extra: "npm:^9.1.0" - get-stdin: "npm:^8.0.0" - globby: "npm:^11.1.0" - got: "npm:^11.8.5" - graceful-fs: "npm:^4.2.10" - https-proxy-agent: "npm:^5.0.1" - is-docker: "npm:^2.2.1" - js-yaml: "npm:^4.1.0" - json-cycle: "npm:^1.3.0" - json-refs: "npm:^3.0.15" - lodash: "npm:^4.17.21" - memoizee: "npm:^0.4.15" - micromatch: "npm:^4.0.5" - node-fetch: "npm:^2.6.7" - npm-registry-utilities: "npm:^1.0.0" - object-hash: "npm:^2.2.0" - open: "npm:^7.4.2" - path2: "npm:^0.1.0" - process-utils: "npm:^4.0.0" - promise-queue: "npm:^2.2.5" - require-from-string: "npm:^2.0.2" - semver: "npm:^7.3.7" - signal-exit: "npm:^3.0.7" - strip-ansi: "npm:^6.0.1" - supports-color: "npm:^8.1.1" - tar: "npm:^6.1.11" - timers-ext: "npm:^0.1.7" - type: "npm:^2.7.2" - untildify: "npm:^4.0.0" - uuid: "npm:^8.3.2" - yaml-ast-parser: "npm:0.0.43" - bin: - serverless: bin/serverless.js - sls: bin/serverless.js - checksum: 10/f2e0c66e2d2fa8d315dbf6bb4208b27e2640153530aa9777efdf91b13bae7876b09f114a4d573f1a8b8b9213d1db40deb89d82cd3ab5e23aa5b5548ed1244c15 - languageName: node - linkType: hard - "set-blocking@npm:^2.0.0": version: 2.0.0 resolution: "set-blocking@npm:2.0.0" @@ -16868,6 +15076,20 @@ __metadata: languageName: node linkType: hard +"set-function-length@npm:^1.2.1": + version: 1.2.2 + resolution: "set-function-length@npm:1.2.2" + dependencies: + define-data-property: "npm:^1.1.4" + es-errors: "npm:^1.3.0" + function-bind: "npm:^1.1.2" + get-intrinsic: "npm:^1.2.4" + gopd: "npm:^1.0.1" + has-property-descriptors: "npm:^1.0.2" + checksum: 10/505d62b8e088468917ca4e3f8f39d0e29f9a563b97dbebf92f4bd2c3172ccfb3c5b8e4566d5fcd00784a00433900e7cb8fbc404e2dbd8c3818ba05bb9d4a8a6d + languageName: node + linkType: hard + "set-function-name@npm:^2.0.0, set-function-name@npm:^2.0.1": version: 2.0.1 resolution: "set-function-name@npm:2.0.1" @@ -16944,6 +15166,19 @@ __metadata: languageName: node linkType: hard +"shelljs@npm:0.8.5": + version: 0.8.5 + resolution: "shelljs@npm:0.8.5" + dependencies: + glob: "npm:^7.0.0" + interpret: "npm:^1.0.0" + rechoir: "npm:^0.6.2" + bin: + shjs: bin/shjs + checksum: 10/f2178274b97b44332bbe9ddb78161137054f55ecf701c7a99db9552cb5478fe279ad5f5131d8a7c2f0730e01ccf0c629d01094143f0541962ce1a3d0243d23f7 + languageName: node + linkType: hard + "shiki@npm:0.14.7": version: 0.14.7 resolution: "shiki@npm:0.14.7" @@ -16956,14 +15191,10 @@ __metadata: languageName: node linkType: hard -"shiki@npm:^0.11.1": - version: 0.11.1 - resolution: "shiki@npm:0.11.1" - dependencies: - jsonc-parser: "npm:^3.0.0" - vscode-oniguruma: "npm:^1.6.1" - vscode-textmate: "npm:^6.0.0" - checksum: 10/44f3b28eb12b2f306304d909958c23b0eea596152d2137de5e65e55477fb9c45a127c0015200e67620a15bc49e22583f0da0da81fb9279a63c15fbf0e1a46b6b +"shimmer@npm:^1.2.1": + version: 1.2.1 + resolution: "shimmer@npm:1.2.1" + checksum: 10/aa0d6252ad1c682a4fdfda69e541be987f7a265ac7b00b1208e5e48cc68dc55f293955346ea4c71a169b7324b82c70f8400b3d3d2d60b2a7519f0a3522423250 languageName: node linkType: hard @@ -16985,7 +15216,7 @@ __metadata: languageName: node linkType: hard -"signal-exit@npm:^4.0.1, signal-exit@npm:^4.1.0": +"signal-exit@npm:^4.0.1": version: 4.1.0 resolution: "signal-exit@npm:4.1.0" checksum: 10/c9fa63bbbd7431066174a48ba2dd9986dfd930c3a8b59de9c29d7b6854ec1c12a80d15310869ea5166d413b99f041bfa3dd80a7947bcd44ea8e6eb3ffeabfa1f @@ -16999,26 +15230,6 @@ __metadata: languageName: node linkType: hard -"simple-git@npm:^3.16.0": - version: 3.22.0 - resolution: "simple-git@npm:3.22.0" - dependencies: - "@kwsites/file-exists": "npm:^1.1.1" - "@kwsites/promise-deferred": "npm:^1.1.1" - debug: "npm:^4.3.4" - checksum: 10/309e7f0b73550f99949c0c6cfd4b4799ec0452fc4835dc440f89ec9351fe553c979c4e2bf7a772308e608697d3a27512281fbc64df0328a73607641f389b0aaf - languageName: node - linkType: hard - -"simple-swizzle@npm:^0.2.2": - version: 0.2.2 - resolution: "simple-swizzle@npm:0.2.2" - dependencies: - is-arrayish: "npm:^0.3.1" - checksum: 10/c6dffff17aaa383dae7e5c056fbf10cf9855a9f79949f20ee225c04f06ddde56323600e0f3d6797e82d08d006e93761122527438ee9531620031c08c9e0d73cc - languageName: node - linkType: hard - "simple-update-notifier@npm:^1.0.7": version: 1.1.0 resolution: "simple-update-notifier@npm:1.1.0" @@ -17028,15 +15239,6 @@ __metadata: languageName: node linkType: hard -"simple-update-notifier@npm:^2.0.0": - version: 2.0.0 - resolution: "simple-update-notifier@npm:2.0.0" - dependencies: - semver: "npm:^7.5.3" - checksum: 10/40bd4f96aa89aedbf717ae9f4ab8fca70e8f7511e8b766feb15471cca3f6fe4fe673743309b08b4ba8abfe0965c9cd927e1de46550a757b819b70fc7430cc85d - languageName: node - linkType: hard - "sisteransi@npm:^1.0.5": version: 1.0.5 resolution: "sisteransi@npm:1.0.5" @@ -17110,7 +15312,7 @@ __metadata: version: 0.0.0-use.local resolution: "snipcode@workspace:." dependencies: - "@changesets/cli": "npm:^2.27.1" + "@changesets/cli": "npm:2.27.3" "@commitlint/cli": "npm:18.6.0" "@commitlint/config-conventional": "npm:18.6.0" "@types/jest": "npm:29.5.12" @@ -17120,6 +15322,7 @@ __metadata: "@typescript-eslint/parser": "npm:7.3.1" babel-jest: "npm:29.7.0" dotenv: "npm:16.4.5" + dotenv-cli: "npm:7.4.2" eslint: "npm:8.56.0" eslint-config-prettier: "npm:9.1.0" eslint-plugin-import: "npm:2.29.1" @@ -17131,10 +15334,11 @@ __metadata: husky: "npm:9.0.11" jest: "npm:29.7.0" jest-environment-jsdom: "npm:29.7.0" + jest-mock-extended: "npm:3.0.7" prettier: "npm:3.2.5" prisma: "npm:5.11.0" ts-jest: "npm:29.1.2" - turbo: "npm:1.13.0" + turbo: "npm:1.13.3" typescript: "npm:5.4.3" languageName: unknown linkType: soft @@ -17160,31 +15364,6 @@ __metadata: languageName: node linkType: hard -"sort-keys-length@npm:^1.0.0": - version: 1.0.1 - resolution: "sort-keys-length@npm:1.0.1" - dependencies: - sort-keys: "npm:^1.0.0" - checksum: 10/f9acac5fb31580a9e3d43b419dc86a1b75e85b79036a084d95dd4d1062b621c9589906588ac31e370a0dd381be46d8dbe900efa306d087ca9c912d7a59b5a590 - languageName: node - linkType: hard - -"sort-keys@npm:^1.0.0": - version: 1.1.2 - resolution: "sort-keys@npm:1.1.2" - dependencies: - is-plain-obj: "npm:^1.0.0" - checksum: 10/0ac2ea2327d92252f07aa7b2f8c7023a1f6ce3306439a3e81638cce9905893c069521d168f530fb316d1a929bdb052b742969a378190afaef1bc64fa69e29576 - languageName: node - linkType: hard - -"sorted-array-functions@npm:^1.3.0": - version: 1.3.0 - resolution: "sorted-array-functions@npm:1.3.0" - checksum: 10/673fd39ca3b6c92644d4483eac1700bb7d7555713a536822a7522a35af559bef3e72f10d89356b75042dc394cd7c2e2ab6f40024385218ec3c85bb7335032857 - languageName: node - linkType: hard - "source-map-js@npm:^1.0.2": version: 1.0.2 resolution: "source-map-js@npm:1.0.2" @@ -17209,6 +15388,23 @@ __metadata: languageName: node linkType: hard +"source-map-support@npm:0.5.21, source-map-support@npm:~0.5.20": + version: 0.5.21 + resolution: "source-map-support@npm:0.5.21" + dependencies: + buffer-from: "npm:^1.0.0" + source-map: "npm:^0.6.0" + checksum: 10/8317e12d84019b31e34b86d483dd41d6f832f389f7417faf8fc5c75a66a12d9686e47f589a0554a868b8482f037e23df9d040d29387eb16fa14cb85f091ba207 + languageName: node + linkType: hard + +"source-map@npm:0.7.4, source-map@npm:^0.7.4": + version: 0.7.4 + resolution: "source-map@npm:0.7.4" + checksum: 10/a0f7c9b797eda93139842fd28648e868a9a03ea0ad0d9fa6602a0c1f17b7fb6a7dcca00c144476cccaeaae5042e99a285723b1a201e844ad67221bf5d428f1dc + languageName: node + linkType: hard + "source-map@npm:0.8.0-beta.0": version: 0.8.0-beta.0 resolution: "source-map@npm:0.8.0-beta.0" @@ -17269,7 +15465,7 @@ __metadata: languageName: node linkType: hard -"split2@npm:^3.0.0, split2@npm:^3.1.1, split2@npm:^3.2.2": +"split2@npm:^3.0.0": version: 3.2.2 resolution: "split2@npm:3.2.2" dependencies: @@ -17301,12 +15497,10 @@ __metadata: languageName: node linkType: hard -"sprintf-kit@npm:^2.0.1": - version: 2.0.1 - resolution: "sprintf-kit@npm:2.0.1" - dependencies: - es5-ext: "npm:^0.10.53" - checksum: 10/fa388720a9cf16d4265f5d28269680e5697b90e3bb8974fafec2c1dcaa971f64431069f4bed9604fd4bc7027f43f768e6c096140d2d8ec8821b15adf8a50b589 +"sqlstring@npm:^2.3.2": + version: 2.3.3 + resolution: "sqlstring@npm:2.3.3" + checksum: 10/4e5a25af2d77a031fe00694034bf9fd822ddc3a483c9383124b120aa6b9ae9ab71e173cd29fba9c653998ebfef9e97be668957839960b9b3dc1afcb45f1ddb64 languageName: node linkType: hard @@ -17319,13 +15513,6 @@ __metadata: languageName: node linkType: hard -"stack-trace@npm:0.0.x": - version: 0.0.10 - resolution: "stack-trace@npm:0.0.10" - checksum: 10/7bd633f0e9ac46e81a0b0fe6538482c1d77031959cf94478228731709db4672fbbed59176f5b9a9fd89fec656b5dae03d084ef2d1b0c4c2f5683e05f2dbb1405 - languageName: node - linkType: hard - "stack-utils@npm:^2.0.3": version: 2.0.6 resolution: "stack-utils@npm:2.0.6" @@ -17360,17 +15547,6 @@ __metadata: languageName: node linkType: hard -"stream-promise@npm:^3.2.0": - version: 3.2.0 - resolution: "stream-promise@npm:3.2.0" - dependencies: - 2-thenable: "npm:^1.0.0" - es5-ext: "npm:^0.10.49" - is-stream: "npm:^1.1.0" - checksum: 10/a8693a8db38537e6e34a1b75aa5c597ce8f281c16af6fe47c8f4314cb0b5bf6b28d9428cfc91ca3a93030e01f5b660b99658720ad9404735cd5eb9d49851dfc0 - languageName: node - linkType: hard - "stream-transform@npm:^2.1.3": version: 2.1.3 resolution: "stream-transform@npm:2.1.3" @@ -17526,15 +15702,6 @@ __metadata: languageName: node linkType: hard -"strip-dirs@npm:^2.0.0": - version: 2.1.0 - resolution: "strip-dirs@npm:2.1.0" - dependencies: - is-natural-number: "npm:^4.0.1" - checksum: 10/7284fc61cf667e403c54ea515c421094ae641a382a8c8b6019f06658e828556c8e4bb439d5797f7d42247a5342eb6feef200c88ad0582e69b3261e1ec0dbc3a6 - languageName: node - linkType: hard - "strip-final-newline@npm:^2.0.0": version: 2.0.0 resolution: "strip-final-newline@npm:2.0.0" @@ -17542,13 +15709,6 @@ __metadata: languageName: node linkType: hard -"strip-final-newline@npm:^3.0.0": - version: 3.0.0 - resolution: "strip-final-newline@npm:3.0.0" - checksum: 10/23ee263adfa2070cd0f23d1ac14e2ed2f000c9b44229aec9c799f1367ec001478469560abefd00c5c99ee6f0b31c137d53ec6029c53e9f32a93804e18c201050 - languageName: node - linkType: hard - "strip-indent@npm:^3.0.0": version: 3.0.0 resolution: "strip-indent@npm:3.0.0" @@ -17572,32 +15732,6 @@ __metadata: languageName: node linkType: hard -"strip-outer@npm:^1.0.1": - version: 1.0.1 - resolution: "strip-outer@npm:1.0.1" - dependencies: - escape-string-regexp: "npm:^1.0.2" - checksum: 10/f8d65d33ca2b49aabc66bb41d689dda7b8b9959d320e3a40a2ef4d7079ff2f67ffb72db43f179f48dbf9495c2e33742863feab7a584d180fa62505439162c191 - languageName: node - linkType: hard - -"strnum@npm:^1.0.5": - version: 1.0.5 - resolution: "strnum@npm:1.0.5" - checksum: 10/d3117975db8372d4d7b2c07601ed2f65bf21cc48d741f37a8617b76370d228f2ec26336e53791ebc3638264d23ca54e6c241f57f8c69bd4941c63c79440525ca - languageName: node - linkType: hard - -"strtok3@npm:^6.2.4": - version: 6.3.0 - resolution: "strtok3@npm:6.3.0" - dependencies: - "@tokenizer/token": "npm:^0.3.0" - peek-readable: "npm:^4.1.0" - checksum: 10/98fba564d3830202aa3a6bcd5ccaf2cbd849bd87ae79ece91d337e1913916705a8e633c9577138d030a984f8ec987dea51807e01252f995cf5e183fdea35eb2b - languageName: node - linkType: hard - "styled-jsx@npm:5.1.1": version: 5.1.1 resolution: "styled-jsx@npm:5.1.1" @@ -17614,6 +15748,21 @@ __metadata: languageName: node linkType: hard +"subscriptions-transport-ws@npm:0.11.0": + version: 0.11.0 + resolution: "subscriptions-transport-ws@npm:0.11.0" + dependencies: + backo2: "npm:^1.0.2" + eventemitter3: "npm:^3.1.0" + iterall: "npm:^1.2.1" + symbol-observable: "npm:^1.0.4" + ws: "npm:^5.2.0 || ^6.0.0 || ^7.0.0" + peerDependencies: + graphql: ^15.7.2 || ^16.0.0 + checksum: 10/3835ce81543e8d11909e4b03f17315104b5934a8a134f0d652f3e8a60d8dc3715ebc75eb5048af8f87082e14709cd7a07dae5a854d073d2965072abd632a1d1a + languageName: node + linkType: hard + "sucrase@npm:^3.20.3, sucrase@npm:^3.32.0": version: 3.35.0 resolution: "sucrase@npm:3.35.0" @@ -17632,40 +15781,39 @@ __metadata: languageName: node linkType: hard -"superagent@npm:^7.1.6": - version: 7.1.6 - resolution: "superagent@npm:7.1.6" +"superagent@npm:^9.0.1": + version: 9.0.2 + resolution: "superagent@npm:9.0.2" dependencies: component-emitter: "npm:^1.3.0" - cookiejar: "npm:^2.1.3" + cookiejar: "npm:^2.1.4" debug: "npm:^4.3.4" fast-safe-stringify: "npm:^2.1.1" form-data: "npm:^4.0.0" - formidable: "npm:^2.0.1" + formidable: "npm:^3.5.1" methods: "npm:^1.1.2" mime: "npm:2.6.0" - qs: "npm:^6.10.3" - readable-stream: "npm:^3.6.0" - semver: "npm:^7.3.7" - checksum: 10/a160ccadbea31dd804501fc6b6632265f1d6ef57feca13075e6c828d6d5494e9021545673d6f4dff7fb6c8a290de9ceae8b02881a9ebfb1aed59348b4315590d + qs: "npm:^6.11.0" + checksum: 10/d3c0c9051ceec84d5b431eaa410ad81bcd53255cea57af1fc66d683a24c34f3ba4761b411072a9bf489a70e3d5b586a78a0e6f2eac6a561067e7d196ddab0907 languageName: node linkType: hard -"supports-color@npm:^5.3.0, supports-color@npm:^5.5.0": - version: 5.5.0 - resolution: "supports-color@npm:5.5.0" +"supertest@npm:7.0.0": + version: 7.0.0 + resolution: "supertest@npm:7.0.0" dependencies: - has-flag: "npm:^3.0.0" - checksum: 10/5f505c6fa3c6e05873b43af096ddeb22159831597649881aeb8572d6fe3b81e798cc10840d0c9735e0026b250368851b7f77b65e84f4e4daa820a4f69947f55b + methods: "npm:^1.1.2" + superagent: "npm:^9.0.1" + checksum: 10/73bf2a37e13856a1b3e6a37b9df5cec8e506aa0360a5f5ecd989d1f4b0edf168883e306012e81e371d5252c17d4c7bef4ba30633dbf3877cbf52fc7af51cca9b languageName: node linkType: hard -"supports-color@npm:^6.1.0": - version: 6.1.0 - resolution: "supports-color@npm:6.1.0" +"supports-color@npm:^5.3.0, supports-color@npm:^5.5.0": + version: 5.5.0 + resolution: "supports-color@npm:5.5.0" dependencies: has-flag: "npm:^3.0.0" - checksum: 10/78a5c43b9e478966ed41ed923a942dfd6209bf3bcc826a01435cfec98d5a17ca5d866effd2b6be438c16cd73b99f4a4397fcbb282e6f653e39046e1335334189 + checksum: 10/5f505c6fa3c6e05873b43af096ddeb22159831597649881aeb8572d6fe3b81e798cc10840d0c9735e0026b250368851b7f77b65e84f4e4daa820a4f69947f55b languageName: node linkType: hard @@ -17678,7 +15826,7 @@ __metadata: languageName: node linkType: hard -"supports-color@npm:^8.0.0, supports-color@npm:^8.1.1": +"supports-color@npm:^8.0.0": version: 8.1.1 resolution: "supports-color@npm:8.1.1" dependencies: @@ -17703,13 +15851,20 @@ __metadata: languageName: node linkType: hard -"symbol-observable@npm:^4.0.0": +"symbol-observable@npm:4.0.0, symbol-observable@npm:^4.0.0": version: 4.0.0 resolution: "symbol-observable@npm:4.0.0" checksum: 10/983aef3912ad080fc834b9ad115d44bc2994074c57cea4fb008e9f7ab9bb4118b908c63d9edc861f51257bc0595025510bdf7263bb09d8953a6929f240165c24 languageName: node linkType: hard +"symbol-observable@npm:^1.0.4": + version: 1.2.0 + resolution: "symbol-observable@npm:1.2.0" + checksum: 10/4684327a2fef2453dcd4238b5bd8f69c460a4708fb8c024a824c6a707ca644b2b2a586e36e5197d0d1162ff48e288299a48844a8c46274ffcfd9260e03df7692 + languageName: node + linkType: hard + "symbol-tree@npm:^3.2.4": version: 3.2.4 resolution: "symbol-tree@npm:3.2.4" @@ -17760,41 +15915,13 @@ __metadata: languageName: node linkType: hard -"tapable@npm:^2.2.0": +"tapable@npm:^2.1.1, tapable@npm:^2.2.0, tapable@npm:^2.2.1": version: 2.2.1 resolution: "tapable@npm:2.2.1" checksum: 10/1769336dd21481ae6347611ca5fca47add0962fd8e80466515032125eca0084a4f0ede11e65341b9c0018ef4e1cf1ad820adbb0fba7cc99865c6005734000b0a languageName: node linkType: hard -"tar-stream@npm:^1.5.2": - version: 1.6.2 - resolution: "tar-stream@npm:1.6.2" - dependencies: - bl: "npm:^1.0.0" - buffer-alloc: "npm:^1.2.0" - end-of-stream: "npm:^1.0.0" - fs-constants: "npm:^1.0.0" - readable-stream: "npm:^2.3.0" - to-buffer: "npm:^1.1.1" - xtend: "npm:^4.0.0" - checksum: 10/ac9b850bd40e6d4b251abcf92613bafd9fc9e592c220c781ebcdbb0ba76da22a245d9ea3ea638ad7168910e7e1ae5079333866cd679d2f1ffadb99c403f99d7f - languageName: node - linkType: hard - -"tar-stream@npm:^2.2.0": - version: 2.2.0 - resolution: "tar-stream@npm:2.2.0" - dependencies: - bl: "npm:^4.0.3" - end-of-stream: "npm:^1.4.1" - fs-constants: "npm:^1.0.0" - inherits: "npm:^2.0.3" - readable-stream: "npm:^3.1.1" - checksum: 10/1a52a51d240c118cbcd30f7368ea5e5baef1eac3e6b793fb1a41e6cd7319296c79c0264ccc5859f5294aa80f8f00b9239d519e627b9aade80038de6f966fec6a - languageName: node - linkType: hard - "tar@npm:^6.1.11, tar@npm:^6.1.2": version: 6.2.0 resolution: "tar@npm:6.2.0" @@ -17809,10 +15936,46 @@ __metadata: languageName: node linkType: hard -"term-size@npm:^2.1.0": - version: 2.2.1 - resolution: "term-size@npm:2.2.1" - checksum: 10/f96aca2d4139c91e3359f5949ffb86f0a58f8c254ab7fe4a64b65126974939c782db6aaa91bf51a56d0344e505e22f9a0186f2f689e23ac9382b54606603c537 +"term-size@npm:^2.1.0": + version: 2.2.1 + resolution: "term-size@npm:2.2.1" + checksum: 10/f96aca2d4139c91e3359f5949ffb86f0a58f8c254ab7fe4a64b65126974939c782db6aaa91bf51a56d0344e505e22f9a0186f2f689e23ac9382b54606603c537 + languageName: node + linkType: hard + +"terser-webpack-plugin@npm:^5.3.10": + version: 5.3.10 + resolution: "terser-webpack-plugin@npm:5.3.10" + dependencies: + "@jridgewell/trace-mapping": "npm:^0.3.20" + jest-worker: "npm:^27.4.5" + schema-utils: "npm:^3.1.1" + serialize-javascript: "npm:^6.0.1" + terser: "npm:^5.26.0" + peerDependencies: + webpack: ^5.1.0 + peerDependenciesMeta: + "@swc/core": + optional: true + esbuild: + optional: true + uglify-js: + optional: true + checksum: 10/fb1c2436ae1b4e983be043fa0a3d355c047b16b68f102437d08c736d7960c001e7420e2f722b9d99ce0dc70ca26a68cc63c0b82bc45f5b48671142b352a9d938 + languageName: node + linkType: hard + +"terser@npm:^5.26.0": + version: 5.31.0 + resolution: "terser@npm:5.31.0" + dependencies: + "@jridgewell/source-map": "npm:^0.3.3" + acorn: "npm:^8.8.2" + commander: "npm:^2.20.0" + source-map-support: "npm:~0.5.20" + bin: + terser: bin/terser + checksum: 10/11b28065d6fd9f496acf1f23b22982867e4625e769d0a1821861a15e6bebfdb414142a8444f74f2a93f458d0182b8314ceb889be053b50eb5907cc98e8230467 languageName: node linkType: hard @@ -17834,13 +15997,6 @@ __metadata: languageName: node linkType: hard -"text-hex@npm:1.0.x": - version: 1.0.0 - resolution: "text-hex@npm:1.0.0" - checksum: 10/1138f68adc97bf4381a302a24e2352f04992b7b1316c5003767e9b0d3367ffd0dc73d65001ea02b07cd0ecc2a9d186de0cf02f3c2d880b8a522d4ccb9342244a - languageName: node - linkType: hard - "text-table@npm:^0.2.0": version: 0.2.0 resolution: "text-table@npm:0.2.0" @@ -17866,13 +16022,6 @@ __metadata: languageName: node linkType: hard -"throat@npm:^5.0.0": - version: 5.0.0 - resolution: "throat@npm:5.0.0" - checksum: 10/00f7197977d433d1c960edfaa6465c1217652999170ef3ecd8dbefa6add6e2304b321480523ae87354df285474ba2c5feff03842e9f398b4bcdd95cfa18cff9c - languageName: node - linkType: hard - "through2@npm:^4.0.0": version: 4.0.2 resolution: "through2@npm:4.0.2" @@ -17889,16 +16038,6 @@ __metadata: languageName: node linkType: hard -"timers-ext@npm:^0.1.7": - version: 0.1.7 - resolution: "timers-ext@npm:0.1.7" - dependencies: - es5-ext: "npm:~0.10.46" - next-tick: "npm:1" - checksum: 10/a8fffe2841ed6c3b16b2e72522ee46537c6a758294da45486c7e8ca52ff065931dd023c9f9946b87a13f48ae3dafe12678ab1f9d1ef24b6aea465762e0ffdcae - languageName: node - linkType: hard - "tiny-case@npm:^1.0.3": version: 1.0.3 resolution: "tiny-case@npm:1.0.3" @@ -17931,13 +16070,6 @@ __metadata: languageName: node linkType: hard -"to-buffer@npm:^1.1.1": - version: 1.1.1 - resolution: "to-buffer@npm:1.1.1" - checksum: 10/8ade59fe04239b281496b6067bc83ad0371a3657552276cbd09ffffaeb3ad0018a28306d61b854b83280eabe1829cbc53001ccd761e834c6062cbcc7fee2766a - languageName: node - linkType: hard - "to-fast-properties@npm:^2.0.0": version: 2.0.0 resolution: "to-fast-properties@npm:2.0.0" @@ -17961,16 +16093,6 @@ __metadata: languageName: node linkType: hard -"token-types@npm:^4.1.1": - version: 4.2.1 - resolution: "token-types@npm:4.2.1" - dependencies: - "@tokenizer/token": "npm:^0.3.0" - ieee754: "npm:^1.2.1" - checksum: 10/2995257d246387e773758c3c92a3cc99d0c0bf13cbafe0de5d712e4c35ed298da6704e21545cb123fa1f1b42ad62936c35bbd0611018b735e78c30b8b22b42d9 - languageName: node - linkType: hard - "toposort@npm:^2.0.2": version: 2.0.2 resolution: "toposort@npm:2.0.2" @@ -18026,14 +16148,7 @@ __metadata: languageName: node linkType: hard -"traverse@npm:^0.6.6": - version: 0.6.8 - resolution: "traverse@npm:0.6.8" - checksum: 10/b0df554b47e32c6a3525d277a64982bd43c94c05a378248d71ce591e8ee781b74051e9391020e60bb33bdbe8cfe0d26861934979eeadee584918a91812ba82bb - languageName: node - linkType: hard - -"tree-kill@npm:^1.2.2": +"tree-kill@npm:1.2.2, tree-kill@npm:^1.2.2": version: 1.2.2 resolution: "tree-kill@npm:1.2.2" bin: @@ -18049,22 +16164,6 @@ __metadata: languageName: node linkType: hard -"trim-repeated@npm:^1.0.0": - version: 1.0.0 - resolution: "trim-repeated@npm:1.0.0" - dependencies: - escape-string-regexp: "npm:^1.0.2" - checksum: 10/e25c235305b82c43f1d64a67a71226c406b00281755e4c2c4f3b1d0b09c687a535dd3c4483327f949f28bb89dc400a0bc5e5b749054f4b99f49ebfe48ba36496 - languageName: node - linkType: hard - -"triple-beam@npm:^1.3.0, triple-beam@npm:^1.4.1": - version: 1.4.1 - resolution: "triple-beam@npm:1.4.1" - checksum: 10/2e881a3e8e076b6f2b85b9ec9dd4a900d3f5016e6d21183ed98e78f9abcc0149e7d54d79a3f432b23afde46b0885bdcdcbff789f39bc75de796316961ec07f61 - languageName: node - linkType: hard - "ts-api-utils@npm:^1.0.1": version: 1.2.1 resolution: "ts-api-utils@npm:1.2.1" @@ -18074,6 +16173,18 @@ __metadata: languageName: node linkType: hard +"ts-essentials@npm:^10.0.0": + version: 10.0.0 + resolution: "ts-essentials@npm:10.0.0" + peerDependencies: + typescript: ">=4.5.0" + peerDependenciesMeta: + typescript: + optional: true + checksum: 10/cee2ba41a5d78688246550e8e30ce201bce7fbcfb9ccb517460a5823143e1b35937e6764cc146d09a132d7da0f2d758a1d45e47a550b6928b98154d3b5f732d8 + languageName: node + linkType: hard + "ts-interface-checker@npm:^0.1.9": version: 0.1.13 resolution: "ts-interface-checker@npm:0.1.13" @@ -18123,6 +16234,22 @@ __metadata: languageName: node linkType: hard +"ts-loader@npm:9.5.1": + version: 9.5.1 + resolution: "ts-loader@npm:9.5.1" + dependencies: + chalk: "npm:^4.1.0" + enhanced-resolve: "npm:^5.0.0" + micromatch: "npm:^4.0.0" + semver: "npm:^7.3.4" + source-map: "npm:^0.7.4" + peerDependencies: + typescript: "*" + webpack: ^5.0.0 + checksum: 10/a85d43bb6f72858d613290ac02d1d24e81c38ba2dcb98b90465dc97eb6c2036bf9a389542c1a7865548643e7ed39f063fdff2dbb3e5aafbc511de6a3eb275adf + languageName: node + linkType: hard + "ts-log@npm:^2.2.3": version: 2.2.5 resolution: "ts-log@npm:2.2.5" @@ -18130,6 +16257,16 @@ __metadata: languageName: node linkType: hard +"ts-morph@npm:22.0.0": + version: 22.0.0 + resolution: "ts-morph@npm:22.0.0" + dependencies: + "@ts-morph/common": "npm:~0.23.0" + code-block-writer: "npm:^13.0.1" + checksum: 10/e5d81d0d8d990fa9f86e285bd4052bcfa462e2f798f7eda86e11afc7d884dfdb053998dcbf79942942e8032070f8b266745e017771674a169731494fe035e192 + languageName: node + linkType: hard + "ts-node@npm:10.9.2": version: 10.9.2 resolution: "ts-node@npm:10.9.2" @@ -18168,7 +16305,18 @@ __metadata: languageName: node linkType: hard -"tsconfig-paths@npm:4.2.0": +"tsconfig-paths-webpack-plugin@npm:4.1.0": + version: 4.1.0 + resolution: "tsconfig-paths-webpack-plugin@npm:4.1.0" + dependencies: + chalk: "npm:^4.1.0" + enhanced-resolve: "npm:^5.7.0" + tsconfig-paths: "npm:^4.1.2" + checksum: 10/e5a36902528e51bfd13daddd9b843cf4c12d40f23bb21953bdbf4fe97ade11ccd848ca5f1353f89688c7ef4704099e26a8f9f1b1cd0a0484287b93b00215b63e + languageName: node + linkType: hard + +"tsconfig-paths@npm:4.2.0, tsconfig-paths@npm:^4.1.2": version: 4.2.0 resolution: "tsconfig-paths@npm:4.2.0" dependencies: @@ -18191,20 +16339,20 @@ __metadata: languageName: node linkType: hard -"tslib@npm:^1.11.1, tslib@npm:^1.8.1": - version: 1.14.1 - resolution: "tslib@npm:1.14.1" - checksum: 10/7dbf34e6f55c6492637adb81b555af5e3b4f9cc6b998fb440dac82d3b42bdc91560a35a5fb75e20e24a076c651438234da6743d139e4feabf0783f3cdfe1dddb - languageName: node - linkType: hard - -"tslib@npm:^2.0.0, tslib@npm:^2.0.3, tslib@npm:^2.1.0, tslib@npm:^2.3.0, tslib@npm:^2.3.1, tslib@npm:^2.4.0, tslib@npm:^2.5.0, tslib@npm:^2.6.1, tslib@npm:^2.6.2, tslib@npm:~2.6.0": +"tslib@npm:2.6.2, tslib@npm:^2.0.0, tslib@npm:^2.0.3, tslib@npm:^2.1.0, tslib@npm:^2.3.0, tslib@npm:^2.3.1, tslib@npm:^2.4.0, tslib@npm:^2.5.0, tslib@npm:^2.6.1, tslib@npm:^2.6.2, tslib@npm:~2.6.0": version: 2.6.2 resolution: "tslib@npm:2.6.2" checksum: 10/bd26c22d36736513980091a1e356378e8b662ded04204453d353a7f34a4c21ed0afc59b5f90719d4ba756e581a162ecbf93118dc9c6be5acf70aa309188166ca languageName: node linkType: hard +"tslib@npm:^1.8.1": + version: 1.14.1 + resolution: "tslib@npm:1.14.1" + checksum: 10/7dbf34e6f55c6492637adb81b555af5e3b4f9cc6b998fb440dac82d3b42bdc91560a35a5fb75e20e24a076c651438234da6743d139e4feabf0783f3cdfe1dddb + languageName: node + linkType: hard + "tsup@npm:8.0.2": version: 8.0.2 resolution: "tsup@npm:8.0.2" @@ -18272,58 +16420,58 @@ __metadata: languageName: node linkType: hard -"turbo-darwin-64@npm:1.13.0": - version: 1.13.0 - resolution: "turbo-darwin-64@npm:1.13.0" +"turbo-darwin-64@npm:1.13.3": + version: 1.13.3 + resolution: "turbo-darwin-64@npm:1.13.3" conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"turbo-darwin-arm64@npm:1.13.0": - version: 1.13.0 - resolution: "turbo-darwin-arm64@npm:1.13.0" +"turbo-darwin-arm64@npm:1.13.3": + version: 1.13.3 + resolution: "turbo-darwin-arm64@npm:1.13.3" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"turbo-linux-64@npm:1.13.0": - version: 1.13.0 - resolution: "turbo-linux-64@npm:1.13.0" +"turbo-linux-64@npm:1.13.3": + version: 1.13.3 + resolution: "turbo-linux-64@npm:1.13.3" conditions: os=linux & cpu=x64 languageName: node linkType: hard -"turbo-linux-arm64@npm:1.13.0": - version: 1.13.0 - resolution: "turbo-linux-arm64@npm:1.13.0" +"turbo-linux-arm64@npm:1.13.3": + version: 1.13.3 + resolution: "turbo-linux-arm64@npm:1.13.3" conditions: os=linux & cpu=arm64 languageName: node linkType: hard -"turbo-windows-64@npm:1.13.0": - version: 1.13.0 - resolution: "turbo-windows-64@npm:1.13.0" +"turbo-windows-64@npm:1.13.3": + version: 1.13.3 + resolution: "turbo-windows-64@npm:1.13.3" conditions: os=win32 & cpu=x64 languageName: node linkType: hard -"turbo-windows-arm64@npm:1.13.0": - version: 1.13.0 - resolution: "turbo-windows-arm64@npm:1.13.0" +"turbo-windows-arm64@npm:1.13.3": + version: 1.13.3 + resolution: "turbo-windows-arm64@npm:1.13.3" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"turbo@npm:1.13.0": - version: 1.13.0 - resolution: "turbo@npm:1.13.0" +"turbo@npm:1.13.3": + version: 1.13.3 + resolution: "turbo@npm:1.13.3" dependencies: - turbo-darwin-64: "npm:1.13.0" - turbo-darwin-arm64: "npm:1.13.0" - turbo-linux-64: "npm:1.13.0" - turbo-linux-arm64: "npm:1.13.0" - turbo-windows-64: "npm:1.13.0" - turbo-windows-arm64: "npm:1.13.0" + turbo-darwin-64: "npm:1.13.3" + turbo-darwin-arm64: "npm:1.13.3" + turbo-linux-64: "npm:1.13.3" + turbo-linux-arm64: "npm:1.13.3" + turbo-windows-64: "npm:1.13.3" + turbo-windows-arm64: "npm:1.13.3" dependenciesMeta: turbo-darwin-64: optional: true @@ -18339,7 +16487,7 @@ __metadata: optional: true bin: turbo: bin/turbo - checksum: 10/56a7d69d800ef8874a84dc8a684e6a3106d7a72650719b538f7194136360660963a93da3d05b9bd8d6e01698bb28756834a5b94c9f3eefc9334eba9d0d01d4a6 + checksum: 10/de96309b3c4c28b51d9436cdec57e3df452dea4ec4512e6c3b7f6596265d4b22d2c16b9c8a674cc1bafa3cc2eea9feb89a807526d6d820f9bca0522d8d86df12 languageName: node linkType: hard @@ -18415,14 +16563,7 @@ __metadata: languageName: node linkType: hard -"type-fest@npm:^3.0.0": - version: 3.13.1 - resolution: "type-fest@npm:3.13.1" - checksum: 10/9a8a2359ada34c9b3affcaf3a8f73ee14c52779e89950db337ce66fb74c3399776c697c99f2532e9b16e10e61cfdba3b1c19daffb93b338b742f0acd0117ce12 - languageName: node - linkType: hard - -"type-is@npm:~1.6.18": +"type-is@npm:^1.6.4, type-is@npm:~1.6.18": version: 1.6.18 resolution: "type-is@npm:1.6.18" dependencies: @@ -18432,20 +16573,6 @@ __metadata: languageName: node linkType: hard -"type@npm:^1.0.1": - version: 1.2.0 - resolution: "type@npm:1.2.0" - checksum: 10/b4d4b27d1926028be45fc5baaca205896e2a1fe9e5d24dc892046256efbe88de6acd0149e7353cd24dad596e1483e48ec60b0912aa47ca078d68cdd198b09885 - languageName: node - linkType: hard - -"type@npm:^2.1.0, type@npm:^2.5.0, type@npm:^2.6.0, type@npm:^2.7.2": - version: 2.7.2 - resolution: "type@npm:2.7.2" - checksum: 10/602f1b369fba60687fa4d0af6fcfb814075bcaf9ed3a87637fb384d9ff849e2ad15bc244a431f341374562e51a76c159527ffdb1f1f24b0f1f988f35a301c41d - languageName: node - linkType: hard - "typed-array-buffer@npm:^1.0.0": version: 1.0.0 resolution: "typed-array-buffer@npm:1.0.0" @@ -18493,6 +16620,23 @@ __metadata: languageName: node linkType: hard +"typedarray@npm:^0.0.6": + version: 0.0.6 + resolution: "typedarray@npm:0.0.6" + checksum: 10/2cc1bcf7d8c1237f6a16c04efc06637b2c5f2d74e58e84665445cf87668b85a21ab18dd751fa49eee6ae024b70326635d7b79ad37b1c370ed2fec6aeeeb52714 + languageName: node + linkType: hard + +"typescript@npm:5.3.3": + version: 5.3.3 + resolution: "typescript@npm:5.3.3" + bin: + tsc: bin/tsc + tsserver: bin/tsserver + checksum: 10/6e4e6a14a50c222b3d14d4ea2f729e79f972fa536ac1522b91202a9a65af3605c2928c4a790a4a50aa13694d461c479ba92cedaeb1e7b190aadaa4e4b96b8e18 + languageName: node + linkType: hard + "typescript@npm:5.4.3": version: 5.4.3 resolution: "typescript@npm:5.4.3" @@ -18503,6 +16647,16 @@ __metadata: languageName: node linkType: hard +"typescript@patch:typescript@npm%3A5.3.3#optional!builtin": + version: 5.3.3 + resolution: "typescript@patch:typescript@npm%3A5.3.3#optional!builtin::version=5.3.3&hash=e012d7" + bin: + tsc: bin/tsc + tsserver: bin/tsserver + checksum: 10/c93786fcc9a70718ba1e3819bab56064ead5817004d1b8186f8ca66165f3a2d0100fee91fa64c840dcd45f994ca5d615d8e1f566d39a7470fc1e014dbb4cf15d + languageName: node + linkType: hard + "typescript@patch:typescript@npm%3A5.4.3#optional!builtin": version: 5.4.3 resolution: "typescript@patch:typescript@npm%3A5.4.3#optional!builtin::version=5.4.3&hash=5adc0c" @@ -18520,6 +16674,15 @@ __metadata: languageName: node linkType: hard +"uid@npm:2.0.2": + version: 2.0.2 + resolution: "uid@npm:2.0.2" + dependencies: + "@lukeed/csprng": "npm:^1.0.0" + checksum: 10/18f6da43d8e1b8643077e8123f877b4506759d9accc15337140a1bf7c99f299a66e88b27ab4c640e66e6a10f19e3a85afa45fdf830dd4bab7570d07a3d51e073 + languageName: node + linkType: hard + "unbox-primitive@npm:^1.0.2": version: 1.0.2 resolution: "unbox-primitive@npm:1.0.2" @@ -18532,16 +16695,6 @@ __metadata: languageName: node linkType: hard -"unbzip2-stream@npm:^1.0.9": - version: 1.4.3 - resolution: "unbzip2-stream@npm:1.4.3" - dependencies: - buffer: "npm:^5.2.1" - through: "npm:^2.3.8" - checksum: 10/4ffc0e14f4af97400ed0f37be83b112b25309af21dd08fa55c4513e7cb4367333f63712aec010925dbe491ef6e92db1248e1e306e589f9f6a8da8b3a9c4db90b - languageName: node - linkType: hard - "unc-path-regex@npm:^0.1.2": version: 0.1.2 resolution: "unc-path-regex@npm:0.1.2" @@ -18563,15 +16716,6 @@ __metadata: languageName: node linkType: hard -"uni-global@npm:^1.0.0": - version: 1.0.0 - resolution: "uni-global@npm:1.0.0" - dependencies: - type: "npm:^2.5.0" - checksum: 10/df3e622f33fc62aa646d36fd226dd41a5bc76e68a5676b8c8da9f22d9f1b885b7e3ca794866676b055205c01abe8b9eb8365b5da685dc3fbfc9638a14df4d147 - languageName: node - linkType: hard - "unique-filename@npm:^3.0.0": version: 3.0.0 resolution: "unique-filename@npm:3.0.0" @@ -18644,13 +16788,6 @@ __metadata: languageName: node linkType: hard -"untildify@npm:^4.0.0": - version: 4.0.0 - resolution: "untildify@npm:4.0.0" - checksum: 10/39ced9c418a74f73f0a56e1ba4634b4d959422dff61f4c72a8e39f60b99380c1b45ed776fbaa0a4101b157e4310d873ad7d114e8534ca02609b4916bb4187fb9 - languageName: node - linkType: hard - "update-browserslist-db@npm:^1.0.13": version: 1.0.13 resolution: "update-browserslist-db@npm:1.0.13" @@ -18712,16 +16849,6 @@ __metadata: languageName: node linkType: hard -"url@npm:0.10.3": - version: 0.10.3 - resolution: "url@npm:0.10.3" - dependencies: - punycode: "npm:1.3.2" - querystring: "npm:0.2.0" - checksum: 10/8c04e30d65907a1e01569cead632c74ea3af99d1b9b63dfbb2cf636640fe210f7a1bc16990aac04914dbb63ad2bd50effee3e782e0170d5938a11e8aa38358a5 - languageName: node - linkType: hard - "urlpattern-polyfill@npm:^10.0.0": version: 10.0.0 resolution: "urlpattern-polyfill@npm:10.0.0" @@ -18743,19 +16870,6 @@ __metadata: languageName: node linkType: hard -"util@npm:^0.12.4": - version: 0.12.5 - resolution: "util@npm:0.12.5" - dependencies: - inherits: "npm:^2.0.3" - is-arguments: "npm:^1.0.4" - is-generator-function: "npm:^1.0.7" - is-typed-array: "npm:^1.1.3" - which-typed-array: "npm:^1.1.2" - checksum: 10/61a10de7753353dd4d744c917f74cdd7d21b8b46379c1e48e1c4fd8e83f8190e6bd9978fc4e5102ab6a10ebda6019d1b36572fa4a325e175ec8b789a121f6147 - languageName: node - linkType: hard - "utils-merge@npm:1.0.1": version: 1.0.1 resolution: "utils-merge@npm:1.0.1" @@ -18763,16 +16877,7 @@ __metadata: languageName: node linkType: hard -"uuid@npm:8.0.0": - version: 8.0.0 - resolution: "uuid@npm:8.0.0" - bin: - uuid: dist/bin/uuid - checksum: 10/5086c43bbe11e2337d9bb9a3b3a156311e5f5ba5da2de8152da9e00cfd5fbbf626d36e6a2838dde06e2105ac563bc298470acc0e4800c96fa2d50565c5782f8a - languageName: node - linkType: hard - -"uuid@npm:8.3.2, uuid@npm:^8.3.2": +"uuid@npm:8.3.2": version: 8.3.2 resolution: "uuid@npm:8.3.2" bin: @@ -18818,22 +16923,6 @@ __metadata: languageName: node linkType: hard -"validate-npm-package-name@npm:^3.0.0": - version: 3.0.0 - resolution: "validate-npm-package-name@npm:3.0.0" - dependencies: - builtins: "npm:^1.0.3" - checksum: 10/6f89bcc91bb0d46e3c756eec2fd33887eeb76c85d20e5d3e452b69fe3ffbd37062704a4e8422735ea82d69fd963451b4f85501a4dc856f384138411ec42608fa - languageName: node - linkType: hard - -"value-or-promise@npm:1.0.11": - version: 1.0.11 - resolution: "value-or-promise@npm:1.0.11" - checksum: 10/9bd1cf82be5b59ec4a7ee9fa17ca7b3f16165c3ea33ebabe514f7a20e4f88dd11f912900f0279760618eb7fbd5e3bb2a4cf4b351b5fd8e8da69aa2719725e54a - languageName: node - linkType: hard - "value-or-promise@npm:^1.0.11, value-or-promise@npm:^1.0.12": version: 1.0.12 resolution: "value-or-promise@npm:1.0.12" @@ -18848,31 +16937,13 @@ __metadata: languageName: node linkType: hard -"velocityjs@npm:^2.0.6": - version: 2.0.6 - resolution: "velocityjs@npm:2.0.6" - dependencies: - debug: "npm:^4.3.3" - bin: - velocity: bin/velocity - checksum: 10/a8c538dad5d27426c71b061ed209c13a8685feb8db2a5e9b14884a7b899a46ce5b62729198c91e554e98ca85c7c08f33bba722568b767c2b5e82cd55aaa576bf - languageName: node - linkType: hard - -"vscode-oniguruma@npm:^1.6.1, vscode-oniguruma@npm:^1.7.0": +"vscode-oniguruma@npm:^1.7.0": version: 1.7.0 resolution: "vscode-oniguruma@npm:1.7.0" checksum: 10/7da9d21459f9788544b258a5fd1b9752df6edd8b406a19eea0209c6bf76507d5717277016799301c4da0d536095f9ca8c06afd1ab8f4001189090c804ca4814e languageName: node linkType: hard -"vscode-textmate@npm:^6.0.0": - version: 6.0.0 - resolution: "vscode-textmate@npm:6.0.0" - checksum: 10/5db7e2c9a4e4f5e9c3937f74d86dbaeb6f5a6325dc7d23b9087f9b37acdf640611b5b436c5977cd0d5f830631af42f12c48107b41e0aa80a55284ace0c685a6f - languageName: node - linkType: hard - "vscode-textmate@npm:^8.0.0": version: 8.0.0 resolution: "vscode-textmate@npm:8.0.0" @@ -18898,6 +16969,16 @@ __metadata: languageName: node linkType: hard +"watchpack@npm:^2.4.0": + version: 2.4.1 + resolution: "watchpack@npm:2.4.1" + dependencies: + glob-to-regexp: "npm:^0.4.1" + graceful-fs: "npm:^4.1.2" + checksum: 10/0736ebd20b75d3931f9b6175c819a66dee29297c1b389b2e178bc53396a6f867ecc2fd5d87a713ae92dcb73e487daec4905beee20ca00a9e27f1184a7c2bca5e + languageName: node + linkType: hard + "wcwidth@npm:^1.0.1": version: 1.0.1 resolution: "wcwidth@npm:1.0.1" @@ -18948,13 +17029,57 @@ __metadata: languageName: node linkType: hard -"webpack-sources@npm:^2.0.0 || ^3.0.0": +"webpack-node-externals@npm:3.0.0": + version: 3.0.0 + resolution: "webpack-node-externals@npm:3.0.0" + checksum: 10/1a08102f73be2d6e787d16cf677f98c413076f35f379d64a4c83aa83769099b38091a4592953fac5b2eb0c7e3eb1977f6b901ef2cba531d458e32665314b8025 + languageName: node + linkType: hard + +"webpack-sources@npm:^2.0.0 || ^3.0.0, webpack-sources@npm:^3.2.3": version: 3.2.3 resolution: "webpack-sources@npm:3.2.3" checksum: 10/a661f41795d678b7526ae8a88cd1b3d8ce71a7d19b6503da8149b2e667fc7a12f9b899041c1665d39e38245ed3a59ab68de648ea31040c3829aa695a5a45211d languageName: node linkType: hard +"webpack@npm:5.90.1": + version: 5.90.1 + resolution: "webpack@npm:5.90.1" + dependencies: + "@types/eslint-scope": "npm:^3.7.3" + "@types/estree": "npm:^1.0.5" + "@webassemblyjs/ast": "npm:^1.11.5" + "@webassemblyjs/wasm-edit": "npm:^1.11.5" + "@webassemblyjs/wasm-parser": "npm:^1.11.5" + acorn: "npm:^8.7.1" + acorn-import-assertions: "npm:^1.9.0" + browserslist: "npm:^4.21.10" + chrome-trace-event: "npm:^1.0.2" + enhanced-resolve: "npm:^5.15.0" + es-module-lexer: "npm:^1.2.1" + eslint-scope: "npm:5.1.1" + events: "npm:^3.2.0" + glob-to-regexp: "npm:^0.4.1" + graceful-fs: "npm:^4.2.9" + json-parse-even-better-errors: "npm:^2.3.1" + loader-runner: "npm:^4.2.0" + mime-types: "npm:^2.1.27" + neo-async: "npm:^2.6.2" + schema-utils: "npm:^3.2.0" + tapable: "npm:^2.1.1" + terser-webpack-plugin: "npm:^5.3.10" + watchpack: "npm:^2.4.0" + webpack-sources: "npm:^3.2.3" + peerDependenciesMeta: + webpack-cli: + optional: true + bin: + webpack: bin/webpack.js + checksum: 10/6ad23518123f1742238177920cefa61152d981f986adac5901236845c86ba9bb375a3ba75e188925c856c3d2a76a2ba119e95b8a608a51424968389041089075 + languageName: node + linkType: hard + "whatwg-encoding@npm:^2.0.0": version: 2.0.0 resolution: "whatwg-encoding@npm:2.0.0" @@ -19064,7 +17189,7 @@ __metadata: languageName: node linkType: hard -"which-typed-array@npm:^1.1.11, which-typed-array@npm:^1.1.13, which-typed-array@npm:^1.1.2, which-typed-array@npm:^1.1.9": +"which-typed-array@npm:^1.1.11, which-typed-array@npm:^1.1.13, which-typed-array@npm:^1.1.9": version: 1.1.13 resolution: "which-typed-array@npm:1.1.13" dependencies: @@ -19119,50 +17244,6 @@ __metadata: languageName: node linkType: hard -"winston-daily-rotate-file@npm:5.0.0": - version: 5.0.0 - resolution: "winston-daily-rotate-file@npm:5.0.0" - dependencies: - file-stream-rotator: "npm:^0.6.1" - object-hash: "npm:^3.0.0" - triple-beam: "npm:^1.4.1" - winston-transport: "npm:^4.7.0" - peerDependencies: - winston: ^3 - checksum: 10/4204deaea0f2a6a9d89747b734547e44d3c30681d6f871d6e146e64ce5807656a6d6fc51057e9c2bda792139356aa36ddd842ce458270e5a77cbd3ed002b7123 - languageName: node - linkType: hard - -"winston-transport@npm:^4.7.0": - version: 4.7.0 - resolution: "winston-transport@npm:4.7.0" - dependencies: - logform: "npm:^2.3.2" - readable-stream: "npm:^3.6.0" - triple-beam: "npm:^1.3.0" - checksum: 10/c8eae7b110e68396edcf26aec86608bd8ac98f3cc05961064e2e577b023d9c4aa485546cacba84efaf48b7d6b1e282dc211fd959ee16cbd31d34476d96daea43 - languageName: node - linkType: hard - -"winston@npm:3.12.0": - version: 3.12.0 - resolution: "winston@npm:3.12.0" - dependencies: - "@colors/colors": "npm:^1.6.0" - "@dabh/diagnostics": "npm:^2.0.2" - async: "npm:^3.2.3" - is-stream: "npm:^2.0.0" - logform: "npm:^2.4.0" - one-time: "npm:^1.0.0" - readable-stream: "npm:^3.4.0" - safe-stable-stringify: "npm:^2.3.1" - stack-trace: "npm:0.0.x" - triple-beam: "npm:^1.3.0" - winston-transport: "npm:^4.7.0" - checksum: 10/df4ffb509a489e72d457749f0e03c588e492af3ae946c47b47d8ec9aef83c59ec70d0deaa7d366df38d936dd10374d4b0a87e1a871e8d02b4cd4d65a518b40f7 - languageName: node - linkType: hard - "wrap-ansi-cjs@npm:wrap-ansi@^7.0.0, wrap-ansi@npm:^7.0.0": version: 7.0.0 resolution: "wrap-ansi@npm:7.0.0" @@ -19213,33 +17294,33 @@ __metadata: languageName: node linkType: hard -"ws@npm:^7.5.3": - version: 7.5.9 - resolution: "ws@npm:7.5.9" +"ws@npm:8.16.0, ws@npm:^8.11.0, ws@npm:^8.12.0, ws@npm:^8.13.0, ws@npm:^8.15.0": + version: 8.16.0 + resolution: "ws@npm:8.16.0" peerDependencies: bufferutil: ^4.0.1 - utf-8-validate: ^5.0.2 + utf-8-validate: ">=5.0.2" peerDependenciesMeta: bufferutil: optional: true utf-8-validate: optional: true - checksum: 10/171e35012934bd8788150a7f46f963e50bac43a4dc524ee714c20f258693ac4d3ba2abadb00838fdac42a47af9e958c7ae7e6f4bc56db047ba897b8a2268cf7c + checksum: 10/7c511c59e979bd37b63c3aea4a8e4d4163204f00bd5633c053b05ed67835481995f61a523b0ad2b603566f9a89b34cb4965cb9fab9649fbfebd8f740cea57f17 languageName: node linkType: hard -"ws@npm:^8.11.0, ws@npm:^8.12.0, ws@npm:^8.13.0, ws@npm:^8.15.0, ws@npm:^8.16.0": - version: 8.16.0 - resolution: "ws@npm:8.16.0" +"ws@npm:^5.2.0 || ^6.0.0 || ^7.0.0": + version: 7.5.9 + resolution: "ws@npm:7.5.9" peerDependencies: bufferutil: ^4.0.1 - utf-8-validate: ">=5.0.2" + utf-8-validate: ^5.0.2 peerDependenciesMeta: bufferutil: optional: true utf-8-validate: optional: true - checksum: 10/7c511c59e979bd37b63c3aea4a8e4d4163204f00bd5633c053b05ed67835481995f61a523b0ad2b603566f9a89b34cb4965cb9fab9649fbfebd8f740cea57f17 + checksum: 10/171e35012934bd8788150a7f46f963e50bac43a4dc524ee714c20f258693ac4d3ba2abadb00838fdac42a47af9e958c7ae7e6f4bc56db047ba897b8a2268cf7c languageName: node linkType: hard @@ -19250,33 +17331,6 @@ __metadata: languageName: node linkType: hard -"xml2js@npm:0.5.0": - version: 0.5.0 - resolution: "xml2js@npm:0.5.0" - dependencies: - sax: "npm:>=0.6.0" - xmlbuilder: "npm:~11.0.0" - checksum: 10/27c4d759214e99be5ec87ee5cb1290add427fa43df509d3b92d10152b3806fd2f7c9609697a18b158ccf2caa01e96af067cdba93196f69ca10c90e4f79a08896 - languageName: node - linkType: hard - -"xml2js@npm:0.6.2": - version: 0.6.2 - resolution: "xml2js@npm:0.6.2" - dependencies: - sax: "npm:>=0.6.0" - xmlbuilder: "npm:~11.0.0" - checksum: 10/df29de8eeedb762c367d87945c39bcf54db19a2c522607491c266ed6184b5a749e37ff29cfaed0ac149da9ba332ac3dcf8e5ff2bd0a206be3343eca95faa941d - languageName: node - linkType: hard - -"xmlbuilder@npm:~11.0.0": - version: 11.0.1 - resolution: "xmlbuilder@npm:11.0.1" - checksum: 10/c8c3d208783718db5b285101a736cd8e6b69a5c265199a0739abaa93d1a1b7de5489fd16df4e776e18b2c98cb91f421a7349e99fd8c1ebeb44ecfed72a25091a - languageName: node - linkType: hard - "xmlchars@npm:^2.2.0": version: 2.2.0 resolution: "xmlchars@npm:2.2.0" @@ -19338,7 +17392,7 @@ __metadata: languageName: node linkType: hard -"yaml-ast-parser@npm:0.0.43, yaml-ast-parser@npm:^0.0.43": +"yaml-ast-parser@npm:^0.0.43": version: 0.0.43 resolution: "yaml-ast-parser@npm:0.0.43" checksum: 10/a54d00c8e0716a392c6e76eee965b3b4bba434494196490946e416fc47f20a1d89820461afacd9431edbb8209e28fce33bcff1fb42dd83f90e51fc31e80251c9 @@ -19352,16 +17406,10 @@ __metadata: languageName: node linkType: hard -"yamljs@npm:^0.3.0": - version: 0.3.0 - resolution: "yamljs@npm:0.3.0" - dependencies: - argparse: "npm:^1.0.7" - glob: "npm:^7.0.5" - bin: - json2yaml: ./bin/json2yaml - yaml2json: ./bin/yaml2json - checksum: 10/041ccb467b04e0ebfa8224fceca03a28fb28666f46d8ac82ba19b2b118d44604566c17def5cb5ae6681fcedd903affbb42f757706b1e5440dcd304d5f802ef3c +"yargs-parser@npm:21.1.1, yargs-parser@npm:^21.0.1, yargs-parser@npm:^21.1.1": + version: 21.1.1 + resolution: "yargs-parser@npm:21.1.1" + checksum: 10/9dc2c217ea3bf8d858041252d43e074f7166b53f3d010a8c711275e09cd3d62a002969a39858b92bbda2a6a63a585c7127014534a560b9c69ed2d923d113406e languageName: node linkType: hard @@ -19375,20 +17423,13 @@ __metadata: languageName: node linkType: hard -"yargs-parser@npm:^20.2.2, yargs-parser@npm:^20.2.3": +"yargs-parser@npm:^20.2.3": version: 20.2.9 resolution: "yargs-parser@npm:20.2.9" checksum: 10/0188f430a0f496551d09df6719a9132a3469e47fe2747208b1dd0ab2bb0c512a95d0b081628bbca5400fb20dbf2fabe63d22badb346cecadffdd948b049f3fcc languageName: node linkType: hard -"yargs-parser@npm:^21.0.1, yargs-parser@npm:^21.1.1": - version: 21.1.1 - resolution: "yargs-parser@npm:21.1.1" - checksum: 10/9dc2c217ea3bf8d858041252d43e074f7166b53f3d010a8c711275e09cd3d62a002969a39858b92bbda2a6a63a585c7127014534a560b9c69ed2d923d113406e - languageName: node - linkType: hard - "yargs@npm:^15.1.0, yargs@npm:^15.3.1": version: 15.4.1 resolution: "yargs@npm:15.4.1" @@ -19408,21 +17449,6 @@ __metadata: languageName: node linkType: hard -"yargs@npm:^16.2.0": - version: 16.2.0 - resolution: "yargs@npm:16.2.0" - dependencies: - cliui: "npm:^7.0.2" - escalade: "npm:^3.1.1" - get-caller-file: "npm:^2.0.5" - require-directory: "npm:^2.1.1" - string-width: "npm:^4.2.0" - y18n: "npm:^5.0.5" - yargs-parser: "npm:^20.2.2" - checksum: 10/807fa21211d2117135d557f95fcd3c3d390530cda2eca0c840f1d95f0f40209dcfeb5ec18c785a1f3425896e623e3b2681e8bb7b6600060eda1c3f4804e7957e - languageName: node - linkType: hard - "yargs@npm:^17.0.0, yargs@npm:^17.3.1, yargs@npm:^17.7.1": version: 17.7.2 resolution: "yargs@npm:17.7.2" @@ -19438,16 +17464,6 @@ __metadata: languageName: node linkType: hard -"yauzl@npm:^2.4.2": - version: 2.10.0 - resolution: "yauzl@npm:2.10.0" - dependencies: - buffer-crc32: "npm:~0.2.3" - fd-slicer: "npm:~1.1.0" - checksum: 10/1e4c311050dc0cf2ee3dbe8854fe0a6cde50e420b3e561a8d97042526b4cf7a0718d6c8d89e9e526a152f4a9cec55bcea9c3617264115f48bd6704cf12a04445 - languageName: node - linkType: hard - "yn@npm:3.1.1": version: 3.1.1 resolution: "yn@npm:3.1.1" @@ -19490,14 +17506,10 @@ __metadata: languageName: node linkType: hard -"zip-stream@npm:^4.1.0": - version: 4.1.1 - resolution: "zip-stream@npm:4.1.1" - dependencies: - archiver-utils: "npm:^3.0.4" - compress-commons: "npm:^4.1.2" - readable-stream: "npm:^3.6.0" - checksum: 10/33bd5ee7017656c2ad728b5d4ba510e15bd65ce1ec180c5bbdc7a5f063256353ec482e6a2bc74de7515219d8494147924b9aae16e63fdaaf37cdf7d1ee8df125 +"zod@npm:3.23.8": + version: 3.23.8 + resolution: "zod@npm:3.23.8" + checksum: 10/846fd73e1af0def79c19d510ea9e4a795544a67d5b34b7e1c4d0425bf6bfd1c719446d94cdfa1721c1987d891321d61f779e8236fde517dc0e524aa851a6eff1 languageName: node linkType: hard