From e23cbb78370ecd38700fb1d7bbe9d08b59d4555f Mon Sep 17 00:00:00 2001 From: Martin PAUCOT Date: Sat, 10 Aug 2024 01:23:36 +0200 Subject: [PATCH 01/11] Setup openapi-decorators and openapi-adonis --- package.json | 1 + packages/openapi-adonis/.npmignore | 5 + packages/openapi-adonis/biome.json | 21 + packages/openapi-adonis/example/.editorconfig | 22 + packages/openapi-adonis/example/.env.example | 6 + packages/openapi-adonis/example/.gitignore | 25 + packages/openapi-adonis/example/ace.js | 28 + packages/openapi-adonis/example/adonisrc.ts | 69 + .../app/controllers/users_controller.ts | 18 + .../example/app/exceptions/handler.ts | 28 + .../container_bindings_middleware.ts | 19 + .../force_json_response_middleware.ts | 16 + .../openapi-adonis/example/app/models/user.ts | 16 + .../openapi-adonis/example/bin/console.ts | 47 + packages/openapi-adonis/example/bin/server.ts | 45 + packages/openapi-adonis/example/bin/test.ts | 62 + packages/openapi-adonis/example/config/app.ts | 40 + .../example/config/bodyparser.ts | 55 + .../openapi-adonis/example/config/cors.ts | 19 + .../openapi-adonis/example/config/hash.ts | 24 + .../openapi-adonis/example/config/logger.ts | 35 + packages/openapi-adonis/example/package.json | 69 + packages/openapi-adonis/example/start/env.ts | 20 + .../openapi-adonis/example/start/kernel.ts | 41 + .../openapi-adonis/example/start/routes.ts | 25 + .../openapi-adonis/example/tests/bootstrap.ts | 38 + packages/openapi-adonis/example/tsconfig.json | 7 + packages/openapi-adonis/package.json | 76 + .../openapi-adonis/src/decorators/index.ts | 1 + packages/openapi-adonis/src/index.ts | 29 + .../src/loaders/loadController.ts | 57 + .../openapi-adonis/src/loaders/loadRoute.ts | 39 + .../openapi-adonis/src/loaders/loadRouter.ts | 16 + packages/openapi-adonis/src/types.ts | 4 + .../src/utils/normalizeRoutePattern.ts | 13 + packages/openapi-adonis/tsconfig.json | 32 + packages/openapi-adonis/tsup.config.ts | 8 + packages/openapi-adonis/vitest.config.ts | 12 + packages/openapi-decorators/.npmignore | 4 + packages/openapi-decorators/biome.json | 19 + packages/openapi-decorators/package.json | 75 + .../src/builders/base-builder.ts | 3 + .../src/builders/document-builder.ts | 65 + .../openapi-decorators/src/builders/index.ts | 4 + .../src/builders/operation-builder.ts | 37 + .../src/builders/schema-builder.ts | 49 + .../src/decorators/api-body.ts | 19 + .../src/decorators/api-operation.ts | 13 + .../src/decorators/api-param.ts | 22 + .../src/decorators/api-property.ts | 35 + .../src/decorators/api-query.ts | 22 + .../src/decorators/api-response.ts | 26 + .../src/decorators/api-tags.ts | 12 + .../src/decorators/index.ts | 7 + .../src/fixtures/document-base.ts | 17 + packages/openapi-decorators/src/index.ts | 1 + .../openapi-decorators/src/loaders/index.ts | 9 + .../src/loaders/loadApiBody.ts | 19 + .../src/loaders/loadApiOperation.ts | 6 + .../src/loaders/loadApiParam.ts | 16 + .../src/loaders/loadApiProperty.ts | 17 + .../src/loaders/loadApiQuery.ts | 16 + .../src/loaders/loadApiResponse.ts | 23 + .../src/loaders/loadApiTags.ts | 5 + .../src/loaders/loadSchema.ts | 25 + .../src/loaders/loadType.ts | 39 + packages/openapi-decorators/src/types.ts | 9 + packages/openapi-decorators/src/ui/index.ts | 1 + packages/openapi-decorators/src/ui/scalar.ts | 21 + .../openapi-decorators/src/utils/deepmerge.ts | 6 + .../openapi-decorators/src/utils/metadata.ts | 13 + .../test/decorators.test.ts | 132 + .../openapi-decorators/test/loaders.test.ts | 221 + packages/openapi-decorators/tsconfig.json | 33 + packages/openapi-decorators/tsup.config.ts | 8 + packages/openapi-decorators/vitest.config.ts | 12 + pnpm-lock.yaml | 3962 ++++++++++++++++- 77 files changed, 6050 insertions(+), 61 deletions(-) create mode 100644 packages/openapi-adonis/.npmignore create mode 100644 packages/openapi-adonis/biome.json create mode 100644 packages/openapi-adonis/example/.editorconfig create mode 100644 packages/openapi-adonis/example/.env.example create mode 100644 packages/openapi-adonis/example/.gitignore create mode 100644 packages/openapi-adonis/example/ace.js create mode 100644 packages/openapi-adonis/example/adonisrc.ts create mode 100644 packages/openapi-adonis/example/app/controllers/users_controller.ts create mode 100644 packages/openapi-adonis/example/app/exceptions/handler.ts create mode 100644 packages/openapi-adonis/example/app/middleware/container_bindings_middleware.ts create mode 100644 packages/openapi-adonis/example/app/middleware/force_json_response_middleware.ts create mode 100644 packages/openapi-adonis/example/app/models/user.ts create mode 100644 packages/openapi-adonis/example/bin/console.ts create mode 100644 packages/openapi-adonis/example/bin/server.ts create mode 100644 packages/openapi-adonis/example/bin/test.ts create mode 100644 packages/openapi-adonis/example/config/app.ts create mode 100644 packages/openapi-adonis/example/config/bodyparser.ts create mode 100644 packages/openapi-adonis/example/config/cors.ts create mode 100644 packages/openapi-adonis/example/config/hash.ts create mode 100644 packages/openapi-adonis/example/config/logger.ts create mode 100644 packages/openapi-adonis/example/package.json create mode 100644 packages/openapi-adonis/example/start/env.ts create mode 100644 packages/openapi-adonis/example/start/kernel.ts create mode 100644 packages/openapi-adonis/example/start/routes.ts create mode 100644 packages/openapi-adonis/example/tests/bootstrap.ts create mode 100644 packages/openapi-adonis/example/tsconfig.json create mode 100644 packages/openapi-adonis/package.json create mode 100644 packages/openapi-adonis/src/decorators/index.ts create mode 100644 packages/openapi-adonis/src/index.ts create mode 100644 packages/openapi-adonis/src/loaders/loadController.ts create mode 100644 packages/openapi-adonis/src/loaders/loadRoute.ts create mode 100644 packages/openapi-adonis/src/loaders/loadRouter.ts create mode 100644 packages/openapi-adonis/src/types.ts create mode 100644 packages/openapi-adonis/src/utils/normalizeRoutePattern.ts create mode 100644 packages/openapi-adonis/tsconfig.json create mode 100644 packages/openapi-adonis/tsup.config.ts create mode 100644 packages/openapi-adonis/vitest.config.ts create mode 100644 packages/openapi-decorators/.npmignore create mode 100644 packages/openapi-decorators/biome.json create mode 100644 packages/openapi-decorators/package.json create mode 100644 packages/openapi-decorators/src/builders/base-builder.ts create mode 100644 packages/openapi-decorators/src/builders/document-builder.ts create mode 100644 packages/openapi-decorators/src/builders/index.ts create mode 100644 packages/openapi-decorators/src/builders/operation-builder.ts create mode 100644 packages/openapi-decorators/src/builders/schema-builder.ts create mode 100644 packages/openapi-decorators/src/decorators/api-body.ts create mode 100644 packages/openapi-decorators/src/decorators/api-operation.ts create mode 100644 packages/openapi-decorators/src/decorators/api-param.ts create mode 100644 packages/openapi-decorators/src/decorators/api-property.ts create mode 100644 packages/openapi-decorators/src/decorators/api-query.ts create mode 100644 packages/openapi-decorators/src/decorators/api-response.ts create mode 100644 packages/openapi-decorators/src/decorators/api-tags.ts create mode 100644 packages/openapi-decorators/src/decorators/index.ts create mode 100644 packages/openapi-decorators/src/fixtures/document-base.ts create mode 100644 packages/openapi-decorators/src/index.ts create mode 100644 packages/openapi-decorators/src/loaders/index.ts create mode 100644 packages/openapi-decorators/src/loaders/loadApiBody.ts create mode 100644 packages/openapi-decorators/src/loaders/loadApiOperation.ts create mode 100644 packages/openapi-decorators/src/loaders/loadApiParam.ts create mode 100644 packages/openapi-decorators/src/loaders/loadApiProperty.ts create mode 100644 packages/openapi-decorators/src/loaders/loadApiQuery.ts create mode 100644 packages/openapi-decorators/src/loaders/loadApiResponse.ts create mode 100644 packages/openapi-decorators/src/loaders/loadApiTags.ts create mode 100644 packages/openapi-decorators/src/loaders/loadSchema.ts create mode 100644 packages/openapi-decorators/src/loaders/loadType.ts create mode 100644 packages/openapi-decorators/src/types.ts create mode 100644 packages/openapi-decorators/src/ui/index.ts create mode 100644 packages/openapi-decorators/src/ui/scalar.ts create mode 100644 packages/openapi-decorators/src/utils/deepmerge.ts create mode 100644 packages/openapi-decorators/src/utils/metadata.ts create mode 100644 packages/openapi-decorators/test/decorators.test.ts create mode 100644 packages/openapi-decorators/test/loaders.test.ts create mode 100644 packages/openapi-decorators/tsconfig.json create mode 100644 packages/openapi-decorators/tsup.config.ts create mode 100644 packages/openapi-decorators/vitest.config.ts diff --git a/package.json b/package.json index 56ab7896f..8db8550e7 100644 --- a/package.json +++ b/package.json @@ -10,6 +10,7 @@ "scripts": { "build": "pnpm run -r --parallel --filter \"!*docs\" --aggregate-output build", "lint": "pnpm run -r --parallel --aggregate-output lint", + "dev": "pnpm run -r --parallel --filter \"{packages/*}\" --aggregate-output dev", "format": "pnpm run -r --parallel --aggregate-output format", "test": "pnpm run -r --parallel --aggregate-output test", "test-e2e": "pnpm run -r --parallel --aggregate-output test-e2e", diff --git a/packages/openapi-adonis/.npmignore b/packages/openapi-adonis/.npmignore new file mode 100644 index 000000000..a673d1305 --- /dev/null +++ b/packages/openapi-adonis/.npmignore @@ -0,0 +1,5 @@ +example +test +tsconfig*.json +vitest.config.ts +biome.json diff --git a/packages/openapi-adonis/biome.json b/packages/openapi-adonis/biome.json new file mode 100644 index 000000000..c07a9da68 --- /dev/null +++ b/packages/openapi-adonis/biome.json @@ -0,0 +1,21 @@ +{ + "$schema": "https://biomejs.dev/schemas/1.8.1/schema.json", + "extends": [ + "../../biome.json" + ], + "files": { + "ignore": [ + "./test/fixtures/" + ] + }, + "linter": { + "rules": { + "complexity": { + "noBannedTypes": "off" + }, + "suspicious": { + "noConfusingVoidType": "off" + } + } + } +} diff --git a/packages/openapi-adonis/example/.editorconfig b/packages/openapi-adonis/example/.editorconfig new file mode 100644 index 000000000..f830f4041 --- /dev/null +++ b/packages/openapi-adonis/example/.editorconfig @@ -0,0 +1,22 @@ +# http://editorconfig.org + +[*] +indent_style = space +indent_size = 2 +end_of_line = lf +charset = utf-8 +trim_trailing_whitespace = true +insert_final_newline = true + +[*.json] +insert_final_newline = unset + +[**.min.js] +indent_style = unset +insert_final_newline = unset + +[MakeFile] +indent_style = space + +[*.md] +trim_trailing_whitespace = false diff --git a/packages/openapi-adonis/example/.env.example b/packages/openapi-adonis/example/.env.example new file mode 100644 index 000000000..2aa8f14b7 --- /dev/null +++ b/packages/openapi-adonis/example/.env.example @@ -0,0 +1,6 @@ +TZ=UTC +PORT=3333 +HOST=localhost +LOG_LEVEL=info +APP_KEY=30kuDPpn6wxNER9r0phf-cfQTMT2h_n_ +NODE_ENV=development \ No newline at end of file diff --git a/packages/openapi-adonis/example/.gitignore b/packages/openapi-adonis/example/.gitignore new file mode 100644 index 000000000..4e9b44526 --- /dev/null +++ b/packages/openapi-adonis/example/.gitignore @@ -0,0 +1,25 @@ +# Dependencies and AdonisJS build +node_modules +build +tmp + +# Secrets +.env +.env.local +.env.production.local +.env.development.local + +# Frontend assets compiled code +public/assets + +# Build tools specific +npm-debug.log +yarn-error.log + +# Editors specific +.fleet +.idea +.vscode + +# Platform specific +.DS_Store diff --git a/packages/openapi-adonis/example/ace.js b/packages/openapi-adonis/example/ace.js new file mode 100644 index 000000000..d47f53aaf --- /dev/null +++ b/packages/openapi-adonis/example/ace.js @@ -0,0 +1,28 @@ +/* +|-------------------------------------------------------------------------- +| JavaScript entrypoint for running ace commands +|-------------------------------------------------------------------------- +| +| DO NOT MODIFY THIS FILE AS IT WILL BE OVERRIDDEN DURING THE BUILD +| PROCESS. +| +| See docs.adonisjs.com/guides/typescript-build-process#creating-production-build +| +| Since, we cannot run TypeScript source code using "node" binary, we need +| a JavaScript entrypoint to run ace commands. +| +| This file registers the "ts-node/esm" hook with the Node.js module system +| and then imports the "bin/console.ts" file. +| +*/ + +/** + * Register hook to process TypeScript files using ts-node + */ +import { register } from 'node:module' +register('ts-node/esm', import.meta.url) + +/** + * Import ace console entrypoint + */ +await import('./bin/console.js') diff --git a/packages/openapi-adonis/example/adonisrc.ts b/packages/openapi-adonis/example/adonisrc.ts new file mode 100644 index 000000000..a17f48b24 --- /dev/null +++ b/packages/openapi-adonis/example/adonisrc.ts @@ -0,0 +1,69 @@ +import { defineConfig } from '@adonisjs/core/app' + +export default defineConfig({ + /* + |-------------------------------------------------------------------------- + | Commands + |-------------------------------------------------------------------------- + | + | List of ace commands to register from packages. The application commands + | will be scanned automatically from the "./commands" directory. + | + */ + commands: [() => import('@adonisjs/core/commands')], + + /* + |-------------------------------------------------------------------------- + | Service providers + |-------------------------------------------------------------------------- + | + | List of service providers to import and register when booting the + | application + | + */ + providers: [ + () => import('@adonisjs/core/providers/app_provider'), + () => import('@adonisjs/core/providers/hash_provider'), + { + file: () => import('@adonisjs/core/providers/repl_provider'), + environment: ['repl', 'test'], + }, + () => import('@adonisjs/core/providers/vinejs_provider'), + () => import('@adonisjs/cors/cors_provider'), + ], + + /* + |-------------------------------------------------------------------------- + | Preloads + |-------------------------------------------------------------------------- + | + | List of modules to import before starting the application. + | + */ + preloads: [() => import('#start/routes'), () => import('#start/kernel')], + + /* + |-------------------------------------------------------------------------- + | Tests + |-------------------------------------------------------------------------- + | + | List of test suites to organize tests by their type. Feel free to remove + | and add additional suites. + | + */ + tests: { + suites: [ + { + files: ['tests/unit/**/*.spec(.ts|.js)'], + name: 'unit', + timeout: 2000, + }, + { + files: ['tests/functional/**/*.spec(.ts|.js)'], + name: 'functional', + timeout: 30000, + }, + ], + forceExit: false, + }, +}) diff --git a/packages/openapi-adonis/example/app/controllers/users_controller.ts b/packages/openapi-adonis/example/app/controllers/users_controller.ts new file mode 100644 index 000000000..fec83573c --- /dev/null +++ b/packages/openapi-adonis/example/app/controllers/users_controller.ts @@ -0,0 +1,18 @@ +import User from "#models/user"; +import { apiBody, apiOperation, apiResponse, apiParam, apiQuery } from "openapi-adonis/decorators"; + +export default class UsersController { + @apiOperation({ summary: "Get users", tags: ["User"] }) + @apiResponse({ type: User }) + @apiParam({ name: "id" }) + @apiQuery({ name: "query" }) + public async index(): Promise { + return new User(); + } + + @apiOperation({ summary: "Create new user", tags: ["User"] }) + @apiBody({ type: User }) + public async create(): Promise { + return new User(); + } +} diff --git a/packages/openapi-adonis/example/app/exceptions/handler.ts b/packages/openapi-adonis/example/app/exceptions/handler.ts new file mode 100644 index 000000000..367898fc4 --- /dev/null +++ b/packages/openapi-adonis/example/app/exceptions/handler.ts @@ -0,0 +1,28 @@ +import app from '@adonisjs/core/services/app' +import { HttpContext, ExceptionHandler } from '@adonisjs/core/http' + +export default class HttpExceptionHandler extends ExceptionHandler { + /** + * In debug mode, the exception handler will display verbose errors + * with pretty printed stack traces. + */ + protected debug = !app.inProduction + + /** + * The method is used for handling errors and returning + * response to the client + */ + async handle(error: unknown, ctx: HttpContext) { + return super.handle(error, ctx) + } + + /** + * The method is used to report error to the logging service or + * the third party error monitoring service. + * + * @note You should not attempt to send a response from this method. + */ + async report(error: unknown, ctx: HttpContext) { + return super.report(error, ctx) + } +} diff --git a/packages/openapi-adonis/example/app/middleware/container_bindings_middleware.ts b/packages/openapi-adonis/example/app/middleware/container_bindings_middleware.ts new file mode 100644 index 000000000..97abc835b --- /dev/null +++ b/packages/openapi-adonis/example/app/middleware/container_bindings_middleware.ts @@ -0,0 +1,19 @@ +import { Logger } from '@adonisjs/core/logger' +import { HttpContext } from '@adonisjs/core/http' +import type { NextFn } from '@adonisjs/core/types/http' + +/** + * The container bindings middleware binds classes to their request + * specific value using the container resolver. + * + * - We bind "HttpContext" class to the "ctx" object + * - And bind "Logger" class to the "ctx.logger" object + */ +export default class ContainerBindingsMiddleware { + handle(ctx: HttpContext, next: NextFn) { + ctx.containerResolver.bindValue(HttpContext, ctx) + ctx.containerResolver.bindValue(Logger, ctx.logger) + + return next() + } +} diff --git a/packages/openapi-adonis/example/app/middleware/force_json_response_middleware.ts b/packages/openapi-adonis/example/app/middleware/force_json_response_middleware.ts new file mode 100644 index 000000000..58022e7a8 --- /dev/null +++ b/packages/openapi-adonis/example/app/middleware/force_json_response_middleware.ts @@ -0,0 +1,16 @@ +import type { HttpContext } from '@adonisjs/core/http' +import type { NextFn } from '@adonisjs/core/types/http' + +/** + * Updating the "Accept" header to always accept "application/json" response + * from the server. This will force the internals of the framework like + * validator errors or auth errors to return a JSON response. + */ +export default class ForceJsonResponseMiddleware { + async handle({ request }: HttpContext, next: NextFn) { + const headers = request.headers() + headers.accept = 'application/json' + + return next() + } +} diff --git a/packages/openapi-adonis/example/app/models/user.ts b/packages/openapi-adonis/example/app/models/user.ts new file mode 100644 index 000000000..8fdefd755 --- /dev/null +++ b/packages/openapi-adonis/example/app/models/user.ts @@ -0,0 +1,16 @@ +import { BaseModel } from "@adonisjs/lucid/orm"; +import { apiProperty } from "openapi-adonis/decorators"; + +export default class User extends BaseModel { + @apiProperty({ example: "5" }) + declare id: string; + + @apiProperty() + declare name: number; + + @apiProperty() + declare hey: string; + + @apiProperty({ type: User }) + declare user: User; +} diff --git a/packages/openapi-adonis/example/bin/console.ts b/packages/openapi-adonis/example/bin/console.ts new file mode 100644 index 000000000..4b102ee86 --- /dev/null +++ b/packages/openapi-adonis/example/bin/console.ts @@ -0,0 +1,47 @@ +/* +|-------------------------------------------------------------------------- +| Ace entry point +|-------------------------------------------------------------------------- +| +| The "console.ts" file is the entrypoint for booting the AdonisJS +| command-line framework and executing commands. +| +| Commands do not boot the application, unless the currently running command +| has "options.startApp" flag set to true. +| +*/ + +import 'reflect-metadata' +import { Ignitor, prettyPrintError } from '@adonisjs/core' + +/** + * URL to the application root. AdonisJS need it to resolve + * paths to file and directories for scaffolding commands + */ +const APP_ROOT = new URL('../', import.meta.url) + +/** + * The importer is used to import files in context of the + * application. + */ +const IMPORTER = (filePath: string) => { + if (filePath.startsWith('./') || filePath.startsWith('../')) { + return import(new URL(filePath, APP_ROOT).href) + } + return import(filePath) +} + +new Ignitor(APP_ROOT, { importer: IMPORTER }) + .tap((app) => { + app.booting(async () => { + await import('#start/env') + }) + app.listen('SIGTERM', () => app.terminate()) + app.listenIf(app.managedByPm2, 'SIGINT', () => app.terminate()) + }) + .ace() + .handle(process.argv.splice(2)) + .catch((error) => { + process.exitCode = 1 + prettyPrintError(error) + }) diff --git a/packages/openapi-adonis/example/bin/server.ts b/packages/openapi-adonis/example/bin/server.ts new file mode 100644 index 000000000..fe0fefbaf --- /dev/null +++ b/packages/openapi-adonis/example/bin/server.ts @@ -0,0 +1,45 @@ +/* +|-------------------------------------------------------------------------- +| HTTP server entrypoint +|-------------------------------------------------------------------------- +| +| The "server.ts" file is the entrypoint for starting the AdonisJS HTTP +| server. Either you can run this file directly or use the "serve" +| command to run this file and monitor file changes +| +*/ + +import 'reflect-metadata' +import { Ignitor, prettyPrintError } from '@adonisjs/core' + +/** + * URL to the application root. AdonisJS need it to resolve + * paths to file and directories for scaffolding commands + */ +const APP_ROOT = new URL('../', import.meta.url) + +/** + * The importer is used to import files in context of the + * application. + */ +const IMPORTER = (filePath: string) => { + if (filePath.startsWith('./') || filePath.startsWith('../')) { + return import(new URL(filePath, APP_ROOT).href) + } + return import(filePath) +} + +new Ignitor(APP_ROOT, { importer: IMPORTER }) + .tap((app) => { + app.booting(async () => { + await import('#start/env') + }) + app.listen('SIGTERM', () => app.terminate()) + app.listenIf(app.managedByPm2, 'SIGINT', () => app.terminate()) + }) + .httpServer() + .start() + .catch((error) => { + process.exitCode = 1 + prettyPrintError(error) + }) diff --git a/packages/openapi-adonis/example/bin/test.ts b/packages/openapi-adonis/example/bin/test.ts new file mode 100644 index 000000000..d759efe42 --- /dev/null +++ b/packages/openapi-adonis/example/bin/test.ts @@ -0,0 +1,62 @@ +/* +|-------------------------------------------------------------------------- +| Test runner entrypoint +|-------------------------------------------------------------------------- +| +| The "test.ts" file is the entrypoint for running tests using Japa. +| +| Either you can run this file directly or use the "test" +| command to run this file and monitor file changes. +| +*/ + +process.env.NODE_ENV = 'test' + +import 'reflect-metadata' +import { Ignitor, prettyPrintError } from '@adonisjs/core' +import { configure, processCLIArgs, run } from '@japa/runner' + +/** + * URL to the application root. AdonisJS need it to resolve + * paths to file and directories for scaffolding commands + */ +const APP_ROOT = new URL('../', import.meta.url) + +/** + * The importer is used to import files in context of the + * application. + */ +const IMPORTER = (filePath: string) => { + if (filePath.startsWith('./') || filePath.startsWith('../')) { + return import(new URL(filePath, APP_ROOT).href) + } + return import(filePath) +} + +new Ignitor(APP_ROOT, { importer: IMPORTER }) + .tap((app) => { + app.booting(async () => { + await import('#start/env') + }) + app.listen('SIGTERM', () => app.terminate()) + app.listenIf(app.managedByPm2, 'SIGINT', () => app.terminate()) + }) + .testRunner() + .configure(async (app) => { + const { runnerHooks, ...config } = await import('../tests/bootstrap.js') + + processCLIArgs(process.argv.splice(2)) + configure({ + ...app.rcFile.tests, + ...config, + ...{ + setup: runnerHooks.setup, + teardown: runnerHooks.teardown.concat([() => app.terminate()]), + }, + }) + }) + .run(() => run()) + .catch((error) => { + process.exitCode = 1 + prettyPrintError(error) + }) diff --git a/packages/openapi-adonis/example/config/app.ts b/packages/openapi-adonis/example/config/app.ts new file mode 100644 index 000000000..1292af792 --- /dev/null +++ b/packages/openapi-adonis/example/config/app.ts @@ -0,0 +1,40 @@ +import env from '#start/env' +import app from '@adonisjs/core/services/app' +import { Secret } from '@adonisjs/core/helpers' +import { defineConfig } from '@adonisjs/core/http' + +/** + * The app key is used for encrypting cookies, generating signed URLs, + * and by the "encryption" module. + * + * The encryption module will fail to decrypt data if the key is lost or + * changed. Therefore it is recommended to keep the app key secure. + */ +export const appKey = new Secret(env.get('APP_KEY')) + +/** + * The configuration settings used by the HTTP server + */ +export const http = defineConfig({ + generateRequestId: true, + allowMethodSpoofing: false, + + /** + * Enabling async local storage will let you access HTTP context + * from anywhere inside your application. + */ + useAsyncLocalStorage: false, + + /** + * Manage cookies configuration. The settings for the session id cookie are + * defined inside the "config/session.ts" file. + */ + cookie: { + domain: '', + path: '/', + maxAge: '2h', + httpOnly: true, + secure: app.inProduction, + sameSite: 'lax', + }, +}) diff --git a/packages/openapi-adonis/example/config/bodyparser.ts b/packages/openapi-adonis/example/config/bodyparser.ts new file mode 100644 index 000000000..f3d1ead9d --- /dev/null +++ b/packages/openapi-adonis/example/config/bodyparser.ts @@ -0,0 +1,55 @@ +import { defineConfig } from '@adonisjs/core/bodyparser' + +const bodyParserConfig = defineConfig({ + /** + * The bodyparser middleware will parse the request body + * for the following HTTP methods. + */ + allowedMethods: ['POST', 'PUT', 'PATCH', 'DELETE'], + + /** + * Config for the "application/x-www-form-urlencoded" + * content-type parser + */ + form: { + convertEmptyStringsToNull: true, + types: ['application/x-www-form-urlencoded'], + }, + + /** + * Config for the JSON parser + */ + json: { + convertEmptyStringsToNull: true, + types: [ + 'application/json', + 'application/json-patch+json', + 'application/vnd.api+json', + 'application/csp-report', + ], + }, + + /** + * Config for the "multipart/form-data" content-type parser. + * File uploads are handled by the multipart parser. + */ + multipart: { + /** + * Enabling auto process allows bodyparser middleware to + * move all uploaded files inside the tmp folder of your + * operating system + */ + autoProcess: true, + convertEmptyStringsToNull: true, + processManually: [], + + /** + * Maximum limit of data to parse including all files + * and fields + */ + limit: '20mb', + types: ['multipart/form-data'], + }, +}) + +export default bodyParserConfig diff --git a/packages/openapi-adonis/example/config/cors.ts b/packages/openapi-adonis/example/config/cors.ts new file mode 100644 index 000000000..328934b3d --- /dev/null +++ b/packages/openapi-adonis/example/config/cors.ts @@ -0,0 +1,19 @@ +import { defineConfig } from '@adonisjs/cors' + +/** + * Configuration options to tweak the CORS policy. The following + * options are documented on the official documentation website. + * + * https://docs.adonisjs.com/guides/security/cors + */ +const corsConfig = defineConfig({ + enabled: true, + origin: true, + methods: ['GET', 'HEAD', 'POST', 'PUT', 'DELETE'], + headers: true, + exposeHeaders: [], + credentials: true, + maxAge: 90, +}) + +export default corsConfig diff --git a/packages/openapi-adonis/example/config/hash.ts b/packages/openapi-adonis/example/config/hash.ts new file mode 100644 index 000000000..ab1030084 --- /dev/null +++ b/packages/openapi-adonis/example/config/hash.ts @@ -0,0 +1,24 @@ +import { defineConfig, drivers } from '@adonisjs/core/hash' + +const hashConfig = defineConfig({ + default: 'scrypt', + + list: { + scrypt: drivers.scrypt({ + cost: 16384, + blockSize: 8, + parallelization: 1, + maxMemory: 33554432, + }), + }, +}) + +export default hashConfig + +/** + * Inferring types for the list of hashers you have configured + * in your application. + */ +declare module '@adonisjs/core/types' { + export interface HashersList extends InferHashers {} +} diff --git a/packages/openapi-adonis/example/config/logger.ts b/packages/openapi-adonis/example/config/logger.ts new file mode 100644 index 000000000..b96130040 --- /dev/null +++ b/packages/openapi-adonis/example/config/logger.ts @@ -0,0 +1,35 @@ +import env from '#start/env' +import app from '@adonisjs/core/services/app' +import { defineConfig, targets } from '@adonisjs/core/logger' + +const loggerConfig = defineConfig({ + default: 'app', + + /** + * The loggers object can be used to define multiple loggers. + * By default, we configure only one logger (named "app"). + */ + loggers: { + app: { + enabled: true, + name: env.get('APP_NAME'), + level: env.get('LOG_LEVEL'), + transport: { + targets: targets() + .pushIf(!app.inProduction, targets.pretty()) + .pushIf(app.inProduction, targets.file({ destination: 1 })) + .toArray(), + }, + }, + }, +}) + +export default loggerConfig + +/** + * Inferring types for the list of loggers you have configured + * in your application. + */ +declare module '@adonisjs/core/types' { + export interface LoggersList extends InferLoggers {} +} diff --git a/packages/openapi-adonis/example/package.json b/packages/openapi-adonis/example/package.json new file mode 100644 index 000000000..cf5995223 --- /dev/null +++ b/packages/openapi-adonis/example/package.json @@ -0,0 +1,69 @@ +{ + "name": "@example/openapi-adonis", + "version": "0.0.0", + "private": true, + "type": "module", + "license": "UNLICENSED", + "scripts": { + "start": "node bin/server.js", + "build": "node ace build", + "dev": "node ace serve --watch", + "test": "node ace test", + "lint": "eslint .", + "format": "prettier --write .", + "typecheck": "tsc --noEmit" + }, + "imports": { + "#controllers/*": "./app/controllers/*.js", + "#exceptions/*": "./app/exceptions/*.js", + "#models/*": "./app/models/*.js", + "#mails/*": "./app/mails/*.js", + "#services/*": "./app/services/*.js", + "#listeners/*": "./app/listeners/*.js", + "#events/*": "./app/events/*.js", + "#middleware/*": "./app/middleware/*.js", + "#validators/*": "./app/validators/*.js", + "#providers/*": "./providers/*.js", + "#policies/*": "./app/policies/*.js", + "#abilities/*": "./app/abilities/*.js", + "#database/*": "./database/*.js", + "#start/*": "./start/*.js", + "#tests/*": "./tests/*.js", + "#config/*": "./config/*.js" + }, + "devDependencies": { + "@adonisjs/assembler": "^7.7.0", + "@adonisjs/eslint-config": "^1.3.0", + "@adonisjs/http-server": "^7.2.3", + "@adonisjs/prettier-config": "^1.3.0", + "@adonisjs/tsconfig": "^1.3.0", + "@swc/core": "^1.6.5", + "@types/node": "^20.14.9", + "eslint": "^8.57.0", + "hot-hook": "^0.2.6", + "pino-pretty": "^11.2.1", + "prettier": "^3.3.2", + "ts-node": "^10.9.2", + "typescript": "~5.4" + }, + "dependencies": { + "@adonisjs/auth": "^9.2.3", + "@adonisjs/core": "^6.12.1", + "@adonisjs/cors": "^2.2.1", + "@adonisjs/lucid": "^21.1.0", + "@vinejs/vine": "^2.1.0", + "luxon": "^3.5.0", + "openapi-adonis": "workspace:^", + "reflect-metadata": "^0.2.2" + }, + "hotHook": { + "boundaries": [ + "./app/controllers/**/*.ts", + "./app/middleware/*.ts" + ] + }, + "eslintConfig": { + "extends": "@adonisjs/eslint-config/app" + }, + "prettier": "@adonisjs/prettier-config" +} diff --git a/packages/openapi-adonis/example/start/env.ts b/packages/openapi-adonis/example/start/env.ts new file mode 100644 index 000000000..3676c3525 --- /dev/null +++ b/packages/openapi-adonis/example/start/env.ts @@ -0,0 +1,20 @@ +/* +|-------------------------------------------------------------------------- +| Environment variables service +|-------------------------------------------------------------------------- +| +| The `Env.create` method creates an instance of the Env service. The +| service validates the environment variables and also cast values +| to JavaScript data types. +| +*/ + +import { Env } from '@adonisjs/core/env' + +export default await Env.create(new URL('../', import.meta.url), { + NODE_ENV: Env.schema.enum(['development', 'production', 'test'] as const), + PORT: Env.schema.number(), + APP_KEY: Env.schema.string(), + HOST: Env.schema.string({ format: 'host' }), + LOG_LEVEL: Env.schema.enum(['fatal', 'error', 'warn', 'info', 'debug', 'trace']), +}) diff --git a/packages/openapi-adonis/example/start/kernel.ts b/packages/openapi-adonis/example/start/kernel.ts new file mode 100644 index 000000000..865831760 --- /dev/null +++ b/packages/openapi-adonis/example/start/kernel.ts @@ -0,0 +1,41 @@ +/* +|-------------------------------------------------------------------------- +| HTTP kernel file +|-------------------------------------------------------------------------- +| +| The HTTP kernel file is used to register the middleware with the server +| or the router. +| +*/ + +import router from '@adonisjs/core/services/router' +import server from '@adonisjs/core/services/server' + +/** + * The error handler is used to convert an exception + * to a HTTP response. + */ +server.errorHandler(() => import('#exceptions/handler')) + +/** + * The server middleware stack runs middleware on all the HTTP + * requests, even if there is no route registered for + * the request URL. + */ +server.use([ + () => import('#middleware/container_bindings_middleware'), + () => import('#middleware/force_json_response_middleware'), + () => import('@adonisjs/cors/cors_middleware'), +]) + +/** + * The router middleware stack runs middleware on all the HTTP + * requests with a registered route. + */ +router.use([() => import('@adonisjs/core/bodyparser_middleware')]) + +/** + * Named middleware collection must be explicitly assigned to + * the routes or the routes group. + */ +export const middleware = router.named({}) diff --git a/packages/openapi-adonis/example/start/routes.ts b/packages/openapi-adonis/example/start/routes.ts new file mode 100644 index 000000000..3babeee09 --- /dev/null +++ b/packages/openapi-adonis/example/start/routes.ts @@ -0,0 +1,25 @@ +/* +|-------------------------------------------------------------------------- +| Routes file +|-------------------------------------------------------------------------- +| +| The routes file is used for defining the HTTP routes. +| +*/ + +import router from "@adonisjs/core/services/router"; +import AdonisOpenAPI from "openapi-adonis"; + +const UsersController = () => import("#controllers/users_controller"); + +router.get("/", async () => { + return { + hello: "world", + }; +}); + +router.get("/users/:id", [UsersController, "index"]); +router.post("/users", [UsersController, "create"]); + +const builder = AdonisOpenAPI.document().setTitle("OpenAPI Adonis Example"); +AdonisOpenAPI.setup("/docs", router, builder); diff --git a/packages/openapi-adonis/example/tests/bootstrap.ts b/packages/openapi-adonis/example/tests/bootstrap.ts new file mode 100644 index 000000000..39aa4c7cf --- /dev/null +++ b/packages/openapi-adonis/example/tests/bootstrap.ts @@ -0,0 +1,38 @@ +import { assert } from '@japa/assert' +import { apiClient } from '@japa/api-client' +import app from '@adonisjs/core/services/app' +import type { Config } from '@japa/runner/types' +import { pluginAdonisJS } from '@japa/plugin-adonisjs' +import testUtils from '@adonisjs/core/services/test_utils' + +/** + * This file is imported by the "bin/test.ts" entrypoint file + */ + +/** + * Configure Japa plugins in the plugins array. + * Learn more - https://japa.dev/docs/runner-config#plugins-optional + */ +export const plugins: Config['plugins'] = [assert(), apiClient(), pluginAdonisJS(app)] + +/** + * Configure lifecycle function to run before and after all the + * tests. + * + * The setup functions are executed before all the tests + * The teardown functions are executer after all the tests + */ +export const runnerHooks: Required> = { + setup: [], + teardown: [], +} + +/** + * Configure suites by tapping into the test suite instance. + * Learn more - https://japa.dev/docs/test-suites#lifecycle-hooks + */ +export const configureSuite: Config['configureSuite'] = (suite) => { + if (['browser', 'functional', 'e2e'].includes(suite.name)) { + return suite.setup(() => testUtils.httpServer().start()) + } +} diff --git a/packages/openapi-adonis/example/tsconfig.json b/packages/openapi-adonis/example/tsconfig.json new file mode 100644 index 000000000..e05703c28 --- /dev/null +++ b/packages/openapi-adonis/example/tsconfig.json @@ -0,0 +1,7 @@ +{ + "extends": "@adonisjs/tsconfig/tsconfig.app.json", + "compilerOptions": { + "rootDir": "./", + "outDir": "./build", + }, +} diff --git a/packages/openapi-adonis/package.json b/packages/openapi-adonis/package.json new file mode 100644 index 000000000..8feb33846 --- /dev/null +++ b/packages/openapi-adonis/package.json @@ -0,0 +1,76 @@ +{ + "name": "openapi-adonis", + "description": "Auto-Generate OpenAPI specifications for AdonisJS", + "version": "0.0.1", + "author": { + "name": "Martin PAUCOT", + "email": "contact@martin-paucot.Fr" + }, + "type": "module", + "main": "./dist/index.js", + "module": "./dist/index.js", + "types": "./dist/index.d.ts", + "exports": { + ".": { + "types": "./dist/index.d.ts", + "default": "./dist/index.js" + }, + "./*": "./*", + "./decorators": { + "types": "./dist/decorators/index.d.ts", + "default": "./dist/decorators/index.js" + } + }, + "homepage": "https://openapi-ts.dev", + "repository": { + "type": "git", + "url": "https://github.com/openapi-ts/openapi-typescript", + "directory": "packages/openapi-adonis" + }, + "bugs": { + "url": "https://github.com/openapi-ts/openapi-typescript/issues" + }, + "keywords": [ + "openapi", + "swagger", + "rest", + "api", + "oapi_3", + "oapi_3_1", + "typescript", + "adonis" + ], + "scripts": { + "build": "pnpm run build:clean && pnpm run build:esm && pnpm run build:cjs", + "build:clean": "del-cli dist", + "build:esm": "tsc -p tsconfig.json", + "build:cjs": "esbuild --bundle --platform=node --target=es2019 --outfile=dist/index.cjs --external:typescript src/index.ts", + "dev": "tsup --watch", + "format": "biome format . --write", + "lint": "biome check .", + "test": "pnpm run \"/^test:/\"", + "test:js": "vitest run", + "test:ts": "tsc --noEmit", + "version": "pnpm run prepare && pnpm run build" + }, + "dependencies": { + "@fastify/deepmerge": "^2.0.0", + "@vinejs/vine": "^2.1.0", + "lodash": "^4.17.21", + "openapi-decorators": "workspace:^", + "openapi-types": "^12.1.3", + "reflect-metadata": "^0.2.2" + }, + "devDependencies": { + "@adonisjs/core": "^6.12.1", + "@adonisjs/http-server": "^7.2.3", + "@types/lodash": "^4.17.7", + "@types/node": "^22.1.0", + "del-cli": "^5.1.0", + "esbuild": "^0.20.2", + "execa": "^8.0.1", + "tsup": "^8.2.4", + "typescript": "^5.4.5", + "unplugin-swc": "^1.5.1" + } +} diff --git a/packages/openapi-adonis/src/decorators/index.ts b/packages/openapi-adonis/src/decorators/index.ts new file mode 100644 index 000000000..49ccd8402 --- /dev/null +++ b/packages/openapi-adonis/src/decorators/index.ts @@ -0,0 +1 @@ +export * from "openapi-decorators"; diff --git a/packages/openapi-adonis/src/index.ts b/packages/openapi-adonis/src/index.ts new file mode 100644 index 000000000..c1894991d --- /dev/null +++ b/packages/openapi-adonis/src/index.ts @@ -0,0 +1,29 @@ +import type { OpenAPIV3 } from "openapi-types"; + +import type { Router } from "@adonisjs/http-server"; +import { DocumentBuilder } from "openapi-decorators/builders"; +import { generateScalarUI } from "openapi-decorators/ui"; +import { loadRouter } from "./loaders/loadRouter"; + +// biome-ignore lint/complexity/noStaticOnlyClass: TODO: move out of class +export default class AdonisOpenAPI { + public static document() { + return new DocumentBuilder(); + } + + public static async load(builder: DocumentBuilder, router: Router): Promise { + await loadRouter(builder, router); + return builder.build(); + } + + public static setup(pattern: string, router: Router, builder: DocumentBuilder) { + router.get(pattern, () => { + return generateScalarUI("/docs.json"); + }); + + router.get(`${pattern}.json`, async () => { + await AdonisOpenAPI.load(builder, router); + return builder.build(); + }); + } +} diff --git a/packages/openapi-adonis/src/loaders/loadController.ts b/packages/openapi-adonis/src/loaders/loadController.ts new file mode 100644 index 000000000..e678e0f77 --- /dev/null +++ b/packages/openapi-adonis/src/loaders/loadController.ts @@ -0,0 +1,57 @@ +import type { DocumentBuilder, OperationBuilder } from "openapi-decorators/builders"; +import { + getApiBody, + getApiOperation, + getApiParams, + getApiQueries, + getApiResponses, + getApiTags, +} from "openapi-decorators"; +import { + loadApiBody, + loadApiOperation, + loadApiParam, + loadApiQuery, + loadApiResponse, + loadApiTags, +} from "openapi-decorators/loaders"; + +/** + * Enrich operation from Adonis Controller function + */ +export function loadController( + document: DocumentBuilder, + operation: OperationBuilder, + target: any, + propertyKey: string, +) { + const apiOperation = getApiOperation(target, propertyKey); + if (apiOperation) { + loadApiOperation(operation, apiOperation); + } + + const apiTags = getApiTags(target, propertyKey); + if (apiTags) { + loadApiTags(operation, apiTags); + } + + const apiBody = getApiBody(target, propertyKey); + if (apiBody) { + loadApiBody(document, operation, apiBody); + } + + const apiResponses = getApiResponses(target, propertyKey); + for (const apiResponse of apiResponses) { + loadApiResponse(document, operation, apiResponse); + } + + const apiParams = getApiParams(target, propertyKey); + for (const apiParam of apiParams) { + loadApiParam(document, operation, apiParam); + } + + const apiQueries = getApiQueries(target, propertyKey); + for (const apiQuery of apiQueries) { + loadApiQuery(document, operation, apiQuery); + } +} diff --git a/packages/openapi-adonis/src/loaders/loadRoute.ts b/packages/openapi-adonis/src/loaders/loadRoute.ts new file mode 100644 index 000000000..a283d7bd3 --- /dev/null +++ b/packages/openapi-adonis/src/loaders/loadRoute.ts @@ -0,0 +1,39 @@ +import type { OpenAPIV3 } from "openapi-types"; +import { OperationBuilder, type DocumentBuilder } from "openapi-decorators/builders"; +import type { AdonisRoute } from "../types"; +import { loadController } from "./loadController"; +import { getApiTags } from "openapi-decorators"; +import { loadApiTags } from "openapi-decorators/loaders"; +import { normalizeRoutePattern } from "../utils/normalizeRoutePattern"; + +export async function loadRoute(document: DocumentBuilder, route: AdonisRoute) { + if (typeof route.handler !== "object" || !Array.isArray(route.handler.reference)) { + return; + } + + const importer = route.handler.reference[0] as Function; + const propertyKey = route.handler.reference[1] as string; + + const target = (await importer().then((t: any) => t.default)) as any; + + const operation = new OperationBuilder(); + + const apiTags = getApiTags(target); + if (apiTags) { + loadApiTags(operation, apiTags); + } + + loadController(document, operation, target.prototype, propertyKey); + + for (const method of route.methods) { + if (method === "HEAD") { + continue; + } + + document.setOperation( + method.toLowerCase() as OpenAPIV3.HttpMethods, + normalizeRoutePattern(route.pattern), + operation.build(), + ); + } +} diff --git a/packages/openapi-adonis/src/loaders/loadRouter.ts b/packages/openapi-adonis/src/loaders/loadRouter.ts new file mode 100644 index 000000000..251be6212 --- /dev/null +++ b/packages/openapi-adonis/src/loaders/loadRouter.ts @@ -0,0 +1,16 @@ +import type { Router } from "@adonisjs/http-server"; +import type { DocumentBuilder } from "openapi-decorators/builders"; +import { loadRoute } from "./loadRoute"; + +/** + * Enrich document from Adonis Router. + */ +export async function loadRouter(document: DocumentBuilder, router: Router) { + const routerJson = router.toJSON(); + + for (const [_, routes] of Object.entries(routerJson)) { + for (const route of routes) { + await loadRoute(document, route); + } + } +} diff --git a/packages/openapi-adonis/src/types.ts b/packages/openapi-adonis/src/types.ts new file mode 100644 index 000000000..b1b24181f --- /dev/null +++ b/packages/openapi-adonis/src/types.ts @@ -0,0 +1,4 @@ +import type { Router } from "@adonisjs/http-server"; + +export type AdonisRoutes = ReturnType[string]; +export type AdonisRoute = AdonisRoutes[number]; diff --git a/packages/openapi-adonis/src/utils/normalizeRoutePattern.ts b/packages/openapi-adonis/src/utils/normalizeRoutePattern.ts new file mode 100644 index 000000000..dd1687a28 --- /dev/null +++ b/packages/openapi-adonis/src/utils/normalizeRoutePattern.ts @@ -0,0 +1,13 @@ +export const normalizeRoutePattern = (pattern: string) => { + const segments = pattern.split("/"); + + return segments + .map((s) => { + if (s.startsWith(":")) { + return `{${s.replace(":", "")}}`; + } + + return s; + }) + .join("/"); +}; diff --git a/packages/openapi-adonis/tsconfig.json b/packages/openapi-adonis/tsconfig.json new file mode 100644 index 000000000..477f8a606 --- /dev/null +++ b/packages/openapi-adonis/tsconfig.json @@ -0,0 +1,32 @@ +{ + "compilerOptions": { + "allowSyntheticDefaultImports": true, + "declaration": true, + "downlevelIteration": false, + "esModuleInterop": true, + "lib": [ + "ESNext", + "DOM" + ], + "module": "ESNext", + "moduleResolution": "Bundler", + "noUncheckedIndexedAccess": true, + "outDir": "dist", + "skipLibCheck": false, + "strict": true, + "target": "ESNext", + "emitDecoratorMetadata": true, + "experimentalDecorators": true, + "types": [ + "vitest/globals" + ] + }, + "include": [ + "src", + "test" + ], + "exclude": [ + "example", + "node_modules" + ] +} diff --git a/packages/openapi-adonis/tsup.config.ts b/packages/openapi-adonis/tsup.config.ts new file mode 100644 index 000000000..818264f7b --- /dev/null +++ b/packages/openapi-adonis/tsup.config.ts @@ -0,0 +1,8 @@ +import { defineConfig } from "tsup"; + +export default defineConfig({ + entry: ["src/index.ts"], + format: ["esm"], + dts: true, + sourcemap: true, +}); diff --git a/packages/openapi-adonis/vitest.config.ts b/packages/openapi-adonis/vitest.config.ts new file mode 100644 index 000000000..8debcd30d --- /dev/null +++ b/packages/openapi-adonis/vitest.config.ts @@ -0,0 +1,12 @@ +import { defineConfig } from "vitest/config"; +import swc from "unplugin-swc"; + +export default defineConfig({ + plugins: [ + // Required to have typescript metadata working. See https://github.com/vitest-dev/vitest/discussions/3320 + swc.vite(), + ], + test: { + globals: true, + }, +}); diff --git a/packages/openapi-decorators/.npmignore b/packages/openapi-decorators/.npmignore new file mode 100644 index 000000000..215f90603 --- /dev/null +++ b/packages/openapi-decorators/.npmignore @@ -0,0 +1,4 @@ +test +tsconfig*.json +vitest.config.ts +biome.json diff --git a/packages/openapi-decorators/biome.json b/packages/openapi-decorators/biome.json new file mode 100644 index 000000000..ac5658f00 --- /dev/null +++ b/packages/openapi-decorators/biome.json @@ -0,0 +1,19 @@ +{ + "$schema": "https://biomejs.dev/schemas/1.8.1/schema.json", + "extends": [ + "../../biome.json" + ], + "linter": { + "rules": { + "performance": { + "noAccumulatingSpread": "off" + }, + "complexity": { + "noBannedTypes": "off" + }, + "suspicious": { + "noConfusingVoidType": "off" + } + } + } +} diff --git a/packages/openapi-decorators/package.json b/packages/openapi-decorators/package.json new file mode 100644 index 000000000..8ae0ce364 --- /dev/null +++ b/packages/openapi-decorators/package.json @@ -0,0 +1,75 @@ +{ + "name": "openapi-decorators", + "description": "Auto-Generate OpenAPI specifications from Typescript decorators", + "version": "0.0.1", + "author": { + "name": "Martin PAUCOT", + "email": "contact@martin-paucot.Fr" + }, + "type": "module", + "exports": { + ".": { + "types": "./dist/index.d.ts", + "import": "./dist/index.js" + }, + "./builders": { + "types": "./dist/builders/index.d.ts", + "import": "./dist/builders/index.js" + }, + "./loaders": { + "types": "./dist/loaders/index.d.ts", + "import": "./dist/loaders/index.js" + }, + "./ui": { + "types": "./dist/ui/index.d.ts", + "import": "./dist/ui/index.js" + } + }, + "homepage": "https://openapi-ts.dev", + "repository": { + "type": "git", + "url": "https://github.com/openapi-ts/openapi-typescript", + "directory": "packages/openapi-decorators" + }, + "bugs": { + "url": "https://github.com/openapi-ts/openapi-typescript/issues" + }, + "keywords": [ + "openapi", + "swagger", + "rest", + "api", + "oapi_3", + "oapi_3_1", + "typescript" + ], + "scripts": { + "build": "pnpm run build:clean && pnpm run build:esm && pnpm run build:cjs", + "build:clean": "del-cli dist", + "build:esm": "tsc -p tsconfig.json", + "build:cjs": "esbuild --bundle --platform=node --target=es2019 --outfile=dist/index.cjs --external:typescript src/index.ts", + "dev": "tsup --watch", + "format": "biome format . --write", + "lint": "biome check .", + "test": "pnpm run \"/^test:/\"", + "test:js": "vitest run", + "test:ts": "tsc --noEmit", + "version": "pnpm run prepare && pnpm run build" + }, + "dependencies": { + "@fastify/deepmerge": "^2.0.0", + "lodash": "^4.17.21", + "openapi-types": "^12.1.3", + "reflect-metadata": "^0.2.2" + }, + "devDependencies": { + "@types/lodash": "^4.17.7", + "@types/node": "^22.1.0", + "del-cli": "^5.1.0", + "esbuild": "^0.20.2", + "execa": "^8.0.1", + "tsup": "^8.2.4", + "typescript": "^5.4.5", + "unplugin-swc": "^1.5.1" + } +} diff --git a/packages/openapi-decorators/src/builders/base-builder.ts b/packages/openapi-decorators/src/builders/base-builder.ts new file mode 100644 index 000000000..42feac807 --- /dev/null +++ b/packages/openapi-decorators/src/builders/base-builder.ts @@ -0,0 +1,3 @@ +export abstract class BaseBuilder { + public abstract build(): T; +} diff --git a/packages/openapi-decorators/src/builders/document-builder.ts b/packages/openapi-decorators/src/builders/document-builder.ts new file mode 100644 index 000000000..3ba08f047 --- /dev/null +++ b/packages/openapi-decorators/src/builders/document-builder.ts @@ -0,0 +1,65 @@ +import type { OpenAPIV3 } from "openapi-types"; +import { buildDocumentBase } from "../fixtures/document-base"; +import { BaseBuilder } from "./base-builder"; +import { generateScalarUI } from "../ui/scalar"; +import { SchemaBuilder } from "./schema-builder"; + +export class DocumentBuilder extends BaseBuilder { + private readonly document: OpenAPIV3.Document = buildDocumentBase(); + private readonly schemas: Record = {}; + + public setTitle(title: string): this { + this.document.info.title = title; + return this; + } + + public setDescription(description: string): this { + this.document.info.description = description; + return this; + } + + public createSchema(name: string): SchemaBuilder { + const builder = new SchemaBuilder(name); + this.schemas[name] = builder; + return builder; + } + + public hasSchema(name: string): OpenAPIV3.ReferenceObject | false { + const schema = this.schemas[name]; + if (!schema) { + return false; + } + return schema.ref; + } + + public setOperation(method: OpenAPIV3.HttpMethods, pattern: string, operation: OpenAPIV3.OperationObject) { + if (!this.document.paths[pattern]) { + this.document.paths[pattern] = {}; + } + + // biome-ignore lint/style/noNonNullAssertion: Defined two lines above + this.document.paths[pattern]![method] = operation; + } + + public scalar(url: string) { + return generateScalarUI(url); + } + + public build(): OpenAPIV3.Document { + const schemas = Object.entries(this.schemas).reduce( + (a, [name, builder]) => ({ ...a, [name]: builder.build() }), + {}, + ); + + return { + ...this.document, + components: { + ...this.document.components, + schemas: { + ...schemas, + ...this.document.components?.schemas, + }, + }, + }; + } +} diff --git a/packages/openapi-decorators/src/builders/index.ts b/packages/openapi-decorators/src/builders/index.ts new file mode 100644 index 000000000..466ef8da2 --- /dev/null +++ b/packages/openapi-decorators/src/builders/index.ts @@ -0,0 +1,4 @@ +export * from "./base-builder"; +export * from "./document-builder"; +export * from "./operation-builder"; +export * from "./schema-builder"; diff --git a/packages/openapi-decorators/src/builders/operation-builder.ts b/packages/openapi-decorators/src/builders/operation-builder.ts new file mode 100644 index 000000000..0943770e4 --- /dev/null +++ b/packages/openapi-decorators/src/builders/operation-builder.ts @@ -0,0 +1,37 @@ +import type { OpenAPIV3 } from "openapi-types"; +import { BaseBuilder } from "./base-builder"; +import { deepmerge } from "../utils/deepmerge"; + +export class OperationBuilder extends BaseBuilder { + private operation: OpenAPIV3.OperationObject = { + responses: {}, + }; + + public setRequestBody(body: OpenAPIV3.ReferenceObject | OpenAPIV3.RequestBodyObject) { + this.operation.requestBody = body; + return this; + } + + public addTags(...tags: string[]) { + this.operation.tags = [...(this.operation.tags ?? []), ...tags]; + return this; + } + + public setResponse(code: string, response: OpenAPIV3.ResponseObject) { + this.operation.responses[code] = response; + return this; + } + + public addParameter(parameter: OpenAPIV3.ParameterObject) { + this.operation.parameters = [...(this.operation.parameters ?? []), parameter]; + } + + public merge(operation: Partial) { + this.operation = deepmerge(this.operation, operation); + return this; + } + + public build(): OpenAPIV3.OperationObject { + return this.operation; + } +} diff --git a/packages/openapi-decorators/src/builders/schema-builder.ts b/packages/openapi-decorators/src/builders/schema-builder.ts new file mode 100644 index 000000000..f66d5183d --- /dev/null +++ b/packages/openapi-decorators/src/builders/schema-builder.ts @@ -0,0 +1,49 @@ +import type { OpenAPIV3 } from "openapi-types"; +import { BaseBuilder } from "./base-builder"; +import { deepmerge } from "../utils/deepmerge"; + +export class SchemaBuilder extends BaseBuilder { + private schema: OpenAPIV3.SchemaObject = {}; + + constructor(private readonly name: string) { + super(); + } + + public setType(type: "array" | OpenAPIV3.NonArraySchemaObjectType) { + this.schema.type = type; + return this; + } + + public setProperty(name: string, schema: OpenAPIV3.SchemaObject | OpenAPIV3.ReferenceObject, required: boolean) { + if (!this.schema.properties) { + this.schema.properties = {}; + } + + this.schema.properties[name] = schema; + + if (required) { + if (!this.schema.required) { + this.schema.required = []; + } + + this.schema.required.push(name); + } + + return this; + } + + public merge(schema: Partial) { + this.schema = deepmerge(this.schema, schema); + return this; + } + + public get ref(): OpenAPIV3.ReferenceObject { + return { + $ref: `#/components/schemas/${this.name}`, + }; + } + + public build(): OpenAPIV3.SchemaObject { + return this.schema; + } +} diff --git a/packages/openapi-decorators/src/decorators/api-body.ts b/packages/openapi-decorators/src/decorators/api-body.ts new file mode 100644 index 000000000..581a4ad91 --- /dev/null +++ b/packages/openapi-decorators/src/decorators/api-body.ts @@ -0,0 +1,19 @@ +import type { OpenAPIV3 } from "openapi-types"; +import type { SchemaType } from "../types"; + +export const ApiBodyMetadataKey = Symbol("apiBodyKey"); + +export type ApiBodyMetadata = Omit & { + type?: SchemaType; + isArray?: boolean; +}; + +export type ApiBodyOptions = ApiBodyMetadata; + +export function apiBody(options: ApiBodyMetadata): MethodDecorator { + return Reflect.metadata(ApiBodyMetadataKey, options); +} + +export function getApiBody(target: any, propertyKey: string): ApiBodyMetadata | undefined { + return Reflect.getMetadata(ApiBodyMetadataKey, target, propertyKey); +} diff --git a/packages/openapi-decorators/src/decorators/api-operation.ts b/packages/openapi-decorators/src/decorators/api-operation.ts new file mode 100644 index 000000000..52bebaf82 --- /dev/null +++ b/packages/openapi-decorators/src/decorators/api-operation.ts @@ -0,0 +1,13 @@ +import type { OpenAPIV3 } from "openapi-types"; + +export const ApiOperationMetadataKey = Symbol("ApiOperation"); + +export type ApiOperationOptions = Partial; + +export function apiOperation(options: ApiOperationOptions): MethodDecorator { + return Reflect.metadata(ApiOperationMetadataKey, options); +} + +export function getApiOperation(target: any, propertyKey: string) { + return Reflect.getMetadata(ApiOperationMetadataKey, target, propertyKey) as ApiOperationOptions | undefined; +} diff --git a/packages/openapi-decorators/src/decorators/api-param.ts b/packages/openapi-decorators/src/decorators/api-param.ts new file mode 100644 index 000000000..17da18b04 --- /dev/null +++ b/packages/openapi-decorators/src/decorators/api-param.ts @@ -0,0 +1,22 @@ +import type { OpenAPIV3 } from "openapi-types"; +import type { MetadataKey, SchemaType } from "../types"; + +export const ApiParamMetadataKeyPrefix = "__api_param"; + +export type ApiParamOptions = Omit & { + type?: SchemaType; +}; + +export function apiParam(options: ApiParamOptions): MethodDecorator { + return Reflect.metadata(`${ApiParamMetadataKeyPrefix}${options.name}`, options); +} + +export function getApiParams(target: any, propertyKey: string): ApiParamOptions[] { + const keys = Reflect.getMetadataKeys(target, propertyKey) as MetadataKey[]; + + return keys + .filter((k) => typeof k === "string" && k.startsWith(ApiParamMetadataKeyPrefix)) + .map((key) => { + return Reflect.getMetadata(key.toString(), target, propertyKey); + }); +} diff --git a/packages/openapi-decorators/src/decorators/api-property.ts b/packages/openapi-decorators/src/decorators/api-property.ts new file mode 100644 index 000000000..70523d7bc --- /dev/null +++ b/packages/openapi-decorators/src/decorators/api-property.ts @@ -0,0 +1,35 @@ +import type { MetadataKey, SchemaType } from "../types"; +import type { OpenAPIV3 } from "openapi-types"; +import { getMetadataPropertyType } from "../utils/metadata"; + +export type ApiPropertyOptions = Omit & { + type?: SchemaType; + required?: boolean; +}; + +const ApiPropertyMetadataKeyPrefix = "__api_property_"; + +export function apiProperty(options: ApiPropertyOptions = {}): PropertyDecorator { + return (target: any, propertyKey: string | symbol, descriptor?: PropertyDescriptor) => { + if (!options.type) { + options.type = getMetadataPropertyType(target, propertyKey, descriptor); + } + + Reflect.defineMetadata(`${ApiPropertyMetadataKeyPrefix}${propertyKey.toString()}`, options, target); + return target; + }; +} + +export function getApiProperties(target: any) { + const keys = Reflect.getMetadataKeys(target) as MetadataKey[]; + const properties: Record = {}; + + for (const key of keys.filter( + (k) => typeof k === "string" && k.startsWith(ApiPropertyMetadataKeyPrefix), + ) as string[]) { + const propertyKey = key.replace(ApiPropertyMetadataKeyPrefix, ""); + properties[propertyKey] = Reflect.getMetadata(key, target); + } + + return properties; +} diff --git a/packages/openapi-decorators/src/decorators/api-query.ts b/packages/openapi-decorators/src/decorators/api-query.ts new file mode 100644 index 000000000..18a09449d --- /dev/null +++ b/packages/openapi-decorators/src/decorators/api-query.ts @@ -0,0 +1,22 @@ +import type { OpenAPIV3 } from "openapi-types"; +import type { MetadataKey, SchemaType } from "../types"; + +export const ApiQueryMetadataKeyPrefix = "__api_query"; + +export type ApiQueryOptions = Omit & { + type?: SchemaType; +}; + +export function apiQuery(options: ApiQueryOptions): MethodDecorator { + return Reflect.metadata(`${ApiQueryMetadataKeyPrefix}${options.name}`, options); +} + +export function getApiQueries(target: any, propertyKey: string): ApiQueryOptions[] { + const keys = Reflect.getMetadataKeys(target, propertyKey) as MetadataKey[]; + + return keys + .filter((k) => typeof k === "string" && k.startsWith(ApiQueryMetadataKeyPrefix)) + .map((key) => { + return Reflect.getMetadata(key.toString(), target, propertyKey); + }); +} diff --git a/packages/openapi-decorators/src/decorators/api-response.ts b/packages/openapi-decorators/src/decorators/api-response.ts new file mode 100644 index 000000000..7f6cbfd92 --- /dev/null +++ b/packages/openapi-decorators/src/decorators/api-response.ts @@ -0,0 +1,26 @@ +import type { OpenAPIV3 } from "openapi-types"; +import type { MetadataKey, SchemaType } from "../types"; + +const ApiResponseMetadataKeyPrefix = "__api_response_"; + +export type ApiResponseMetadata = { + status?: number; + type?: SchemaType; +} & Omit; + +export type ApiResponseOptions = ApiResponseMetadata; + +export function apiResponse(options: ApiResponseOptions): MethodDecorator { + const status = options.status ?? "default"; + return Reflect.metadata(`${ApiResponseMetadataKeyPrefix}${status}`, options); +} + +export function getApiResponses(target: any, propertyKey: string): ApiResponseOptions[] { + const keys = Reflect.getMetadataKeys(target, propertyKey) as MetadataKey[]; + + return keys + .filter((k) => typeof k === "string" && k.startsWith(ApiResponseMetadataKeyPrefix)) + .map((key) => { + return Reflect.getMetadata(key.toString(), target, propertyKey); + }); +} diff --git a/packages/openapi-decorators/src/decorators/api-tags.ts b/packages/openapi-decorators/src/decorators/api-tags.ts new file mode 100644 index 000000000..e22e3d993 --- /dev/null +++ b/packages/openapi-decorators/src/decorators/api-tags.ts @@ -0,0 +1,12 @@ +export const ApiTagsMetadataKey = Symbol("ApiTags"); + +export function apiTags(...tags: string[]): ClassDecorator & MethodDecorator { + return Reflect.metadata(ApiTagsMetadataKey, tags); +} + +export function getApiTags(target: any, propertyKey?: string): string[] | undefined { + if (propertyKey) { + return Reflect.getMetadata(ApiTagsMetadataKey, target, propertyKey); + } + return Reflect.getMetadata(ApiTagsMetadataKey, target); +} diff --git a/packages/openapi-decorators/src/decorators/index.ts b/packages/openapi-decorators/src/decorators/index.ts new file mode 100644 index 000000000..97a6fb419 --- /dev/null +++ b/packages/openapi-decorators/src/decorators/index.ts @@ -0,0 +1,7 @@ +export * from "./api-body"; +export * from "./api-operation"; +export * from "./api-property"; +export * from "./api-response"; +export * from "./api-tags"; +export * from "./api-param"; +export * from "./api-query"; diff --git a/packages/openapi-decorators/src/fixtures/document-base.ts b/packages/openapi-decorators/src/fixtures/document-base.ts new file mode 100644 index 000000000..1445f73c0 --- /dev/null +++ b/packages/openapi-decorators/src/fixtures/document-base.ts @@ -0,0 +1,17 @@ +import type { OpenAPIV3 } from "openapi-types"; + +export const buildDocumentBase = (): OpenAPIV3.Document => ({ + openapi: "3.0.0", + info: { + title: "", + description: "", + version: "1.0.0", + contact: {}, + }, + tags: [], + servers: [], + paths: {}, + components: { + schemas: {}, + }, +}); diff --git a/packages/openapi-decorators/src/index.ts b/packages/openapi-decorators/src/index.ts new file mode 100644 index 000000000..37b909e72 --- /dev/null +++ b/packages/openapi-decorators/src/index.ts @@ -0,0 +1 @@ +export * from "./decorators"; diff --git a/packages/openapi-decorators/src/loaders/index.ts b/packages/openapi-decorators/src/loaders/index.ts new file mode 100644 index 000000000..c5aa63d4e --- /dev/null +++ b/packages/openapi-decorators/src/loaders/index.ts @@ -0,0 +1,9 @@ +export * from "./loadApiBody"; +export * from "./loadApiOperation"; +export * from "./loadApiParam"; +export * from "./loadApiProperty"; +export * from "./loadApiQuery"; +export * from "./loadApiResponse"; +export * from "./loadApiTags"; +export * from "./loadSchema"; +export * from "./loadType"; diff --git a/packages/openapi-decorators/src/loaders/loadApiBody.ts b/packages/openapi-decorators/src/loaders/loadApiBody.ts new file mode 100644 index 000000000..e4aaf4124 --- /dev/null +++ b/packages/openapi-decorators/src/loaders/loadApiBody.ts @@ -0,0 +1,19 @@ +import type { DocumentBuilder } from "../builders/document-builder"; +import type { OperationBuilder } from "../builders/operation-builder"; +import type { ApiBodyOptions } from "../decorators"; +import { resolveType } from "./loadType"; + +export function loadApiBody(document: DocumentBuilder, operation: OperationBuilder, apiBody: ApiBodyOptions) { + const { type, isArray, ...rest } = apiBody; + + const schema = type ? resolveType(document, type) : undefined; + + operation.setRequestBody({ + ...rest, + content: { + "application/json": { + schema, + }, + }, + }); +} diff --git a/packages/openapi-decorators/src/loaders/loadApiOperation.ts b/packages/openapi-decorators/src/loaders/loadApiOperation.ts new file mode 100644 index 000000000..bbb8a8f51 --- /dev/null +++ b/packages/openapi-decorators/src/loaders/loadApiOperation.ts @@ -0,0 +1,6 @@ +import type { OperationBuilder } from "../builders/operation-builder"; +import type { ApiOperationOptions } from "../decorators/api-operation"; + +export function loadApiOperation(operation: OperationBuilder, apiOperation: ApiOperationOptions) { + operation.merge(apiOperation); +} diff --git a/packages/openapi-decorators/src/loaders/loadApiParam.ts b/packages/openapi-decorators/src/loaders/loadApiParam.ts new file mode 100644 index 000000000..9f786ec57 --- /dev/null +++ b/packages/openapi-decorators/src/loaders/loadApiParam.ts @@ -0,0 +1,16 @@ +import type { DocumentBuilder } from "../builders/document-builder"; +import type { OperationBuilder } from "../builders/operation-builder"; +import type { ApiParamOptions } from "../decorators/api-param"; +import { resolveType } from "./loadType"; + +export function loadApiParam(document: DocumentBuilder, operation: OperationBuilder, apiParam: ApiParamOptions) { + const { type, ...rest } = apiParam; + + const schema = resolveType(document, type ?? "string"); + + operation.addParameter({ + in: "path", + schema, + ...rest, + }); +} diff --git a/packages/openapi-decorators/src/loaders/loadApiProperty.ts b/packages/openapi-decorators/src/loaders/loadApiProperty.ts new file mode 100644 index 000000000..98d798b4e --- /dev/null +++ b/packages/openapi-decorators/src/loaders/loadApiProperty.ts @@ -0,0 +1,17 @@ +import type { DocumentBuilder } from "../builders/document-builder"; +import type { SchemaBuilder } from "../builders/schema-builder"; +import type { ApiPropertyOptions } from "../decorators/api-property"; +import { resolveType } from "./loadType"; + +export function loadApiProperty( + document: DocumentBuilder, + schema: SchemaBuilder, + name: string, + apiProperty: ApiPropertyOptions, +) { + const { type, required, ...rest } = apiProperty; + + const resolved = type ? resolveType(document, type) : undefined; + + schema.setProperty(name, { ...resolved, ...rest }, required ?? true); +} diff --git a/packages/openapi-decorators/src/loaders/loadApiQuery.ts b/packages/openapi-decorators/src/loaders/loadApiQuery.ts new file mode 100644 index 000000000..9b38e40c3 --- /dev/null +++ b/packages/openapi-decorators/src/loaders/loadApiQuery.ts @@ -0,0 +1,16 @@ +import type { DocumentBuilder } from "../builders/document-builder"; +import type { OperationBuilder } from "../builders/operation-builder"; +import type { ApiQueryOptions } from "../decorators/api-query"; +import { resolveType } from "./loadType"; + +export function loadApiQuery(document: DocumentBuilder, operation: OperationBuilder, apiQuery: ApiQueryOptions) { + const { type, ...rest } = apiQuery; + + const schema = resolveType(document, type ?? "string"); + + operation.addParameter({ + in: "query", + schema, + ...rest, + }); +} diff --git a/packages/openapi-decorators/src/loaders/loadApiResponse.ts b/packages/openapi-decorators/src/loaders/loadApiResponse.ts new file mode 100644 index 000000000..7a6707d2c --- /dev/null +++ b/packages/openapi-decorators/src/loaders/loadApiResponse.ts @@ -0,0 +1,23 @@ +import type { DocumentBuilder } from "../builders/document-builder"; +import type { OperationBuilder } from "../builders/operation-builder"; +import type { ApiResponseOptions } from "../decorators/api-response"; +import { resolveType } from "./loadType"; + +export function loadApiResponse( + document: DocumentBuilder, + operation: OperationBuilder, + apiResponse: ApiResponseOptions, +) { + const { type, status, ...rest } = apiResponse; + const schema = type ? resolveType(document, type) : undefined; + + operation.setResponse(status?.toString() ?? "200", { + description: "OK", // TODO: Depends on status, + content: { + "application/json": { + schema, + }, + }, + ...rest, + }); +} diff --git a/packages/openapi-decorators/src/loaders/loadApiTags.ts b/packages/openapi-decorators/src/loaders/loadApiTags.ts new file mode 100644 index 000000000..16e889aa0 --- /dev/null +++ b/packages/openapi-decorators/src/loaders/loadApiTags.ts @@ -0,0 +1,5 @@ +import type { OperationBuilder } from "../builders/operation-builder"; + +export function loadApiTags(operation: OperationBuilder, apiTags: string[]) { + return operation.addTags(...apiTags); +} diff --git a/packages/openapi-decorators/src/loaders/loadSchema.ts b/packages/openapi-decorators/src/loaders/loadSchema.ts new file mode 100644 index 000000000..26c11264a --- /dev/null +++ b/packages/openapi-decorators/src/loaders/loadSchema.ts @@ -0,0 +1,25 @@ +import type { OpenAPIV3 } from "openapi-types"; +import type { DocumentBuilder } from "../builders/document-builder"; +import { getApiProperties } from "../decorators/api-property"; +import { loadApiProperty } from "./loadApiProperty"; + +export function loadSchema(document: DocumentBuilder, target: any): OpenAPIV3.ReferenceObject { + const name = target.constructor.name; + + const existing = document.hasSchema(name); + if (existing) { + return existing; + } + + const schema = document.createSchema(name); + + schema.setType("object"); + + const properties = getApiProperties(target); + + for (const [name, apiProperty] of Object.entries(properties)) { + loadApiProperty(document, schema, name, apiProperty); + } + + return schema.ref; +} diff --git a/packages/openapi-decorators/src/loaders/loadType.ts b/packages/openapi-decorators/src/loaders/loadType.ts new file mode 100644 index 000000000..fcb8cfd7e --- /dev/null +++ b/packages/openapi-decorators/src/loaders/loadType.ts @@ -0,0 +1,39 @@ +import type { OpenAPIV3 } from "openapi-types"; +import type { DocumentBuilder } from "../builders/document-builder"; +import type { SchemaType } from "../types"; +import { loadSchema } from "./loadSchema"; + +export function resolveType( + document: DocumentBuilder, + type: SchemaType, +): OpenAPIV3.ReferenceObject | OpenAPIV3.SchemaObject { + if (typeof type === "string") { + return { + type, + }; + } + + if (type === String) { + return { + type: "string", + }; + } + + if (type === Number) { + return { + type: "number", + }; + } + + if (type === Boolean) { + return { + type: "boolean", + }; + } + + if (typeof type === "object") { + return type; + } + + return loadSchema(document, type.prototype); +} diff --git a/packages/openapi-decorators/src/types.ts b/packages/openapi-decorators/src/types.ts new file mode 100644 index 000000000..7fc982f0a --- /dev/null +++ b/packages/openapi-decorators/src/types.ts @@ -0,0 +1,9 @@ +import type { OpenAPIV3 } from "openapi-types"; + +export interface Type extends Function { + new (...args: any[]): T; +} + +export type MetadataKey = string | Symbol; + +export type SchemaType = Type | OpenAPIV3.NonArraySchemaObjectType | OpenAPIV3.ReferenceObject; diff --git a/packages/openapi-decorators/src/ui/index.ts b/packages/openapi-decorators/src/ui/index.ts new file mode 100644 index 000000000..c9b39ccbf --- /dev/null +++ b/packages/openapi-decorators/src/ui/index.ts @@ -0,0 +1 @@ +export * from "./scalar"; diff --git a/packages/openapi-decorators/src/ui/scalar.ts b/packages/openapi-decorators/src/ui/scalar.ts new file mode 100644 index 000000000..4dce298b8 --- /dev/null +++ b/packages/openapi-decorators/src/ui/scalar.ts @@ -0,0 +1,21 @@ +export function generateScalarUI(url: string) { + return ` + + + + API Reference + + + + + + + + + `; +} diff --git a/packages/openapi-decorators/src/utils/deepmerge.ts b/packages/openapi-decorators/src/utils/deepmerge.ts new file mode 100644 index 000000000..c6cf0b8c2 --- /dev/null +++ b/packages/openapi-decorators/src/utils/deepmerge.ts @@ -0,0 +1,6 @@ +import deepmergeBase from "@fastify/deepmerge"; + +export function deepmerge(target: T, source: Partial): T { + const dm = deepmergeBase(); + return dm(target, source) as T; +} diff --git a/packages/openapi-decorators/src/utils/metadata.ts b/packages/openapi-decorators/src/utils/metadata.ts new file mode 100644 index 000000000..ee4513578 --- /dev/null +++ b/packages/openapi-decorators/src/utils/metadata.ts @@ -0,0 +1,13 @@ +import type { Type } from "../types"; + +export function getMetadataPropertyType( + target: any, + propertyKey: string | symbol, + descriptor?: PropertyDescriptor, +): Type | undefined { + if (descriptor?.get || descriptor?.value) { + return Reflect.getMetadata("design:returntype", target, propertyKey); + } + + return Reflect.getMetadata("design:type", target, propertyKey); +} diff --git a/packages/openapi-decorators/test/decorators.test.ts b/packages/openapi-decorators/test/decorators.test.ts new file mode 100644 index 000000000..491b4402d --- /dev/null +++ b/packages/openapi-decorators/test/decorators.test.ts @@ -0,0 +1,132 @@ +import "reflect-metadata"; +import { + apiBody, + apiOperation, + apiParam, + apiProperty, + apiQuery, + apiResponse, + apiTags, + getApiBody, + getApiOperation, + getApiParams, + getApiProperties, + getApiQueries, + getApiResponses, + getApiTags, +} from "../src/decorators"; + +describe("decorators", () => { + describe("apiBody", () => { + it("should apply decorator properly", () => { + class TestController { + @apiBody({ type: "string" }) + public index() {} + } + + expect(getApiBody(TestController.prototype, "index")).toEqual({ type: "string" }); + }); + }); + + describe("apiOperation", () => { + it("should apply decorator properly", () => { + class TestController { + @apiOperation({ summary: "TEST", tags: ["Test"] }) + public index() {} + } + + expect(getApiOperation(TestController.prototype, "index")).toEqual({ summary: "TEST", tags: ["Test"] }); + }); + }); + + describe("apiParam", () => { + it("should apply decorator properly", () => { + class TestController { + @apiParam({ name: "test", type: "string" }) + @apiParam({ name: "hello" }) + public index() {} + } + + const apiParams = getApiParams(TestController.prototype, "index"); + expect(apiParams).toContainEqual({ name: "test", type: "string" }); + expect(apiParams).toContainEqual({ name: "hello" }); + }); + }); + + describe("apiProperty", () => { + it("should apply decorator properly", () => { + class User { + @apiProperty({ type: String }) + exampleProperty = "test"; + + @apiProperty() + declare exampleDeclared: number; + + @apiProperty() + public exampleMethod(): string { + return this.exampleProperty; + } + + @apiProperty() + public get exampleGetter(): number { + return this.exampleDeclared; + } + } + + expect(getApiProperties(User.prototype)).toEqual({ + exampleProperty: { type: String }, + exampleDeclared: { type: Number }, + exampleMethod: { type: String }, + exampleGetter: { type: Number }, + }); + }); + }); + + describe("apiQuery", () => { + it("should apply decorator properly", () => { + class TestController { + @apiQuery({ name: "query" }) + @apiQuery({ name: "filter" }) + public index() {} + } + + const apiQueries = getApiQueries(TestController.prototype, "index"); + expect(apiQueries).toContainEqual({ name: "query" }); + expect(apiQueries).toContainEqual({ name: "filter" }); + }); + }); + + describe("apiResponse", () => { + it("should apply decorator properly", () => { + class TestController { + @apiResponse({ status: 200, type: String }) + @apiResponse({ status: 400 }) + public index() {} + } + + const apiResponses = getApiResponses(TestController.prototype, "index"); + expect(apiResponses).toContainEqual({ status: 200, type: String }); + expect(apiResponses).toContainEqual({ status: 400 }); + }); + }); + + describe("apiTags", () => { + it("should apply decorator on methods", () => { + class TestController { + @apiTags("test") + public index() {} + } + + expect(getApiTags(TestController.prototype, "index")).toContainEqual("test"); + }); + + it("should apply decorator on classes", () => { + @apiTags("test") + class TestController { + public index() {} + } + + expect(getApiTags(TestController)).toContainEqual("test"); + }); + }); +}); diff --git a/packages/openapi-decorators/test/loaders.test.ts b/packages/openapi-decorators/test/loaders.test.ts new file mode 100644 index 000000000..0409a2a33 --- /dev/null +++ b/packages/openapi-decorators/test/loaders.test.ts @@ -0,0 +1,221 @@ +import "reflect-metadata"; +import { DocumentBuilder, apiProperty } from "../src"; +import { OperationBuilder } from "../src/builders/operation-builder"; +import { loadApiBody } from "../src/loaders/loadApiBody"; +import { loadApiOperation } from "../src/loaders/loadApiOperation"; +import { loadApiParam } from "../src/loaders/loadApiParam"; +import { loadApiProperty } from "../src/loaders/loadApiProperty"; +import { loadApiQuery } from "../src/loaders/loadApiQuery"; +import { loadApiResponse } from "../src/loaders/loadApiResponse"; +import { loadApiTags } from "../src/loaders/loadApiTags"; +import { loadSchema } from "../src/loaders/loadSchema"; +import { resolveType } from "../src/loaders/loadType"; + +describe("loaders", () => { + describe("loadApiBody", () => { + it("should properly enrich operation", () => { + const document = new DocumentBuilder(); + const operation = new OperationBuilder(); + + loadApiBody(document, operation, { + type: "string", + }); + + expect(operation.build().requestBody).toEqual({ + content: { + "application/json": { + schema: { + type: "string", + }, + }, + }, + }); + }); + }); + + describe("loadApiOperation", () => { + it("should properly enrich operation", () => { + const operation = new OperationBuilder(); + + loadApiOperation(operation, { + summary: "Test summary", + }); + + expect(operation.build()).toEqual({ + summary: "Test summary", + responses: {}, + }); + }); + + it("should properly merge tags", () => { + const operation = new OperationBuilder().addTags("Hello"); + + loadApiOperation(operation, { + tags: ["World"], + }); + + expect(operation.build()).toEqual({ + tags: ["Hello", "World"], + responses: {}, + }); + }); + }); + + describe("loadApiParam", () => { + it("should properly enrich operation", () => { + const document = new DocumentBuilder(); + const operation = new OperationBuilder(); + + loadApiParam(document, operation, { + name: "userId", + }); + + loadApiParam(document, operation, { + name: "collectionId", + type: "number", + }); + + const parameters = operation.build().parameters; + expect(parameters).toContainEqual({ name: "userId", in: "path", schema: { type: "string" } }); + expect(parameters).toContainEqual({ name: "collectionId", in: "path", schema: { type: "number" } }); + }); + }); + + describe("loadApiProperty", () => { + it("should properly enrich schema", () => { + const document = new DocumentBuilder(); + const schema = document.createSchema("Test"); + + loadApiProperty(document, schema, "id", {}); + loadApiProperty(document, schema, "name", { type: "string" }); + loadApiProperty(document, schema, "notRequired", { type: "number", required: false }); + + const output = schema.build(); + + expect(output.required).toContainEqual("id"); + expect(output.required).toContainEqual("name"); + expect(output.required).not.toContainEqual("notRequired"); + + expect(output.properties?.id).toEqual({}); + expect(output.properties?.name).toEqual({ type: "string" }); + expect(output.properties?.notRequired).toEqual({ type: "number" }); + }); + }); + + describe("loadApiQuery", () => { + it("should properly enrich operation", () => { + const document = new DocumentBuilder(); + const operation = new OperationBuilder(); + + loadApiQuery(document, operation, { + name: "userId", + }); + + loadApiQuery(document, operation, { + name: "collectionId", + type: "number", + }); + + const parameters = operation.build().parameters; + expect(parameters).toContainEqual({ name: "userId", in: "query", schema: { type: "string" } }); + expect(parameters).toContainEqual({ name: "collectionId", in: "query", schema: { type: "number" } }); + }); + }); + + describe("loadApiResponse", () => { + it("should properly enrich operation", () => { + const document = new DocumentBuilder(); + const operation = new OperationBuilder(); + + loadApiResponse(document, operation, { + status: 200, + type: "string", + }); + + loadApiResponse(document, operation, { + status: 500, + type: "number", + }); + + const responses = operation.build().responses; + expect(responses[200]).toEqual({ + description: "OK", + content: { + "application/json": { + schema: { + type: "string", + }, + }, + }, + }); + + expect(responses[500]).toEqual({ + description: "OK", // TODO: Wrong description + content: { + "application/json": { + schema: { + type: "number", + }, + }, + }, + }); + }); + }); + + describe("loadApiTags", () => { + it("should properly enrich operation", () => { + const operation = new OperationBuilder(); + + loadApiTags(operation, ["hello"]); + + const tags = operation.build().tags; + + expect(tags).toContain("hello"); + }); + }); + + describe("loadSchema", () => { + it("should properly add the schema to the document", () => { + const document = new DocumentBuilder(); + + class Test { + @apiProperty() + declare helloworld: string; + } + + const ref = loadSchema(document, Test.prototype); + const build = document.build(); + + expect(ref).toEqual({ $ref: "#/components/schemas/Test" }); + expect(build.components?.schemas?.Test).toEqual({ + type: "object", + properties: { helloworld: { type: "string" } }, + required: ["helloworld"], + }); + }); + }); + + describe("loadType", () => { + it("should accept string types", () => { + const document = new DocumentBuilder(); + expect(resolveType(document, "boolean")).toEqual({ type: "boolean" }); + expect(resolveType(document, "integer")).toEqual({ type: "integer" }); + expect(resolveType(document, "number")).toEqual({ type: "number" }); + expect(resolveType(document, "string")).toEqual({ type: "string" }); + }); + + it("should accept schema reference", () => { + const document = new DocumentBuilder(); + expect(resolveType(document, { $ref: "#/components/schemas/User" })).toEqual({ + $ref: "#/components/schemas/User", + }); + }); + + it("should accept function types", () => { + const document = new DocumentBuilder(); + expect(resolveType(document, Boolean)).toEqual({ type: "boolean" }); + expect(resolveType(document, Number)).toEqual({ type: "number" }); + expect(resolveType(document, String)).toEqual({ type: "string" }); + }); + }); +}); diff --git a/packages/openapi-decorators/tsconfig.json b/packages/openapi-decorators/tsconfig.json new file mode 100644 index 000000000..5d58f7566 --- /dev/null +++ b/packages/openapi-decorators/tsconfig.json @@ -0,0 +1,33 @@ +{ + "compilerOptions": { + "allowSyntheticDefaultImports": true, + "declaration": true, + "downlevelIteration": false, + "esModuleInterop": true, + "lib": [ + "ESNext", + "DOM" + ], + "module": "ESNext", + "moduleResolution": "Bundler", + "noUncheckedIndexedAccess": true, + "outDir": "dist", + "skipLibCheck": false, + "strict": true, + "target": "ESNext", + "emitDecoratorMetadata": true, + "experimentalDecorators": true, + "types": [ + "vitest/globals", + "reflect-metadata" + ] + }, + "include": [ + "src", + "test" + ], + "exclude": [ + "example", + "node_modules" + ] +} diff --git a/packages/openapi-decorators/tsup.config.ts b/packages/openapi-decorators/tsup.config.ts new file mode 100644 index 000000000..857b52ef6 --- /dev/null +++ b/packages/openapi-decorators/tsup.config.ts @@ -0,0 +1,8 @@ +import { defineConfig } from "tsup"; + +export default defineConfig({ + entry: ["src/index.ts", "src/builders/index.ts", "src/loaders/index.ts", "src/ui/index.ts"], + format: ["esm"], + dts: true, + sourcemap: true, +}); diff --git a/packages/openapi-decorators/vitest.config.ts b/packages/openapi-decorators/vitest.config.ts new file mode 100644 index 000000000..59723706a --- /dev/null +++ b/packages/openapi-decorators/vitest.config.ts @@ -0,0 +1,12 @@ +import { defineConfig } from "vitest/config"; +import swc from "unplugin-swc"; + +export default defineConfig({ + plugins: [ + // Required to have typescript metadata working. See https://github.com/vitest-dev/vitest/discussions/3320 + swc.vite(), + ], + test: { + globals: true, + }, +}); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 2fa72a6f5..f741f8eb5 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -40,7 +40,166 @@ importers: devDependencies: vitepress: specifier: 1.1.4 - version: 1.1.4(@algolia/client-search@4.23.3)(@types/node@20.14.7)(@types/react@18.3.3)(axios@1.7.2)(postcss@8.4.40)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(search-insights@2.13.0)(typescript@5.5.4) + version: 1.1.4(@algolia/client-search@4.23.3)(@types/node@22.1.0)(@types/react@18.3.3)(axios@1.7.2)(postcss@8.4.40)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(search-insights@2.13.0)(typescript@5.5.4) + + packages/openapi-adonis: + dependencies: + '@fastify/deepmerge': + specifier: ^2.0.0 + version: 2.0.0 + '@vinejs/vine': + specifier: ^2.1.0 + version: 2.1.0 + lodash: + specifier: ^4.17.21 + version: 4.17.21 + openapi-decorators: + specifier: workspace:^ + version: link:../openapi-decorators + openapi-types: + specifier: ^12.1.3 + version: 12.1.3 + reflect-metadata: + specifier: ^0.2.2 + version: 0.2.2 + devDependencies: + '@adonisjs/core': + specifier: ^6.12.1 + version: 6.12.1(@adonisjs/assembler@7.7.0(typescript@5.4.5))(@vinejs/vine@2.1.0) + '@adonisjs/http-server': + specifier: ^7.2.3 + version: 7.2.3(@adonisjs/application@8.3.1(@adonisjs/config@5.0.2)(@adonisjs/fold@10.1.2))(@adonisjs/encryption@6.0.2)(@adonisjs/events@9.0.2(@adonisjs/application@8.3.1(@adonisjs/config@5.0.2)(@adonisjs/fold@10.1.2))(@adonisjs/fold@10.1.2))(@adonisjs/fold@10.1.2)(@adonisjs/logger@6.0.3) + '@types/lodash': + specifier: ^4.17.7 + version: 4.17.7 + '@types/node': + specifier: ^22.1.0 + version: 22.1.0 + del-cli: + specifier: ^5.1.0 + version: 5.1.0 + esbuild: + specifier: ^0.20.2 + version: 0.20.2 + execa: + specifier: ^8.0.1 + version: 8.0.1 + tsup: + specifier: ^8.2.4 + version: 8.2.4(@swc/core@1.7.4(@swc/helpers@0.5.5))(postcss@8.4.40)(typescript@5.4.5) + typescript: + specifier: ^5.4.5 + version: 5.4.5 + unplugin-swc: + specifier: ^1.5.1 + version: 1.5.1(@swc/core@1.7.4(@swc/helpers@0.5.5))(rollup@4.20.0) + + packages/openapi-adonis/example: + dependencies: + '@adonisjs/auth': + specifier: ^9.2.3 + version: 9.2.3(@adonisjs/assembler@7.7.0(typescript@5.4.5))(@adonisjs/core@6.12.1(@adonisjs/assembler@7.7.0(typescript@5.4.5))(@vinejs/vine@2.1.0))(@adonisjs/lucid@21.1.1(@adonisjs/assembler@7.7.0(typescript@5.4.5))(@adonisjs/core@6.12.1(@adonisjs/assembler@7.7.0(typescript@5.4.5))(@vinejs/vine@2.1.0))(luxon@3.5.0))(@japa/api-client@2.0.3)(@japa/plugin-adonisjs@3.0.1(@adonisjs/core@6.12.1(@adonisjs/assembler@7.7.0(typescript@5.4.5))(@vinejs/vine@2.1.0))(@japa/api-client@2.0.3)) + '@adonisjs/core': + specifier: ^6.12.1 + version: 6.12.1(@adonisjs/assembler@7.7.0(typescript@5.4.5))(@vinejs/vine@2.1.0) + '@adonisjs/cors': + specifier: ^2.2.1 + version: 2.2.1(@adonisjs/core@6.12.1(@adonisjs/assembler@7.7.0(typescript@5.4.5))(@vinejs/vine@2.1.0)) + '@adonisjs/lucid': + specifier: ^21.1.0 + version: 21.1.1(@adonisjs/assembler@7.7.0(typescript@5.4.5))(@adonisjs/core@6.12.1(@adonisjs/assembler@7.7.0(typescript@5.4.5))(@vinejs/vine@2.1.0))(luxon@3.5.0) + '@vinejs/vine': + specifier: ^2.1.0 + version: 2.1.0 + luxon: + specifier: ^3.5.0 + version: 3.5.0 + openapi-adonis: + specifier: workspace:^ + version: link:.. + reflect-metadata: + specifier: ^0.2.2 + version: 0.2.2 + devDependencies: + '@adonisjs/assembler': + specifier: ^7.7.0 + version: 7.7.0(typescript@5.4.5) + '@adonisjs/eslint-config': + specifier: ^1.3.0 + version: 1.3.0(eslint@8.57.0)(prettier@3.3.2)(typescript@5.4.5) + '@adonisjs/http-server': + specifier: ^7.2.3 + version: 7.2.3(@adonisjs/application@8.3.1(@adonisjs/config@5.0.2)(@adonisjs/fold@10.1.2))(@adonisjs/encryption@6.0.2)(@adonisjs/events@9.0.2(@adonisjs/application@8.3.1(@adonisjs/config@5.0.2)(@adonisjs/fold@10.1.2))(@adonisjs/fold@10.1.2))(@adonisjs/fold@10.1.2)(@adonisjs/logger@6.0.3) + '@adonisjs/prettier-config': + specifier: ^1.3.0 + version: 1.3.0 + '@adonisjs/tsconfig': + specifier: ^1.3.0 + version: 1.3.0 + '@swc/core': + specifier: ^1.6.5 + version: 1.7.4(@swc/helpers@0.5.5) + '@types/node': + specifier: ^20.14.9 + version: 20.14.14 + eslint: + specifier: ^8.57.0 + version: 8.57.0 + hot-hook: + specifier: ^0.2.6 + version: 0.2.6 + pino-pretty: + specifier: ^11.2.1 + version: 11.2.2 + prettier: + specifier: ^3.3.2 + version: 3.3.2 + ts-node: + specifier: ^10.9.2 + version: 10.9.2(@swc/core@1.7.4(@swc/helpers@0.5.5))(@types/node@20.14.14)(typescript@5.4.5) + typescript: + specifier: ~5.4 + version: 5.4.5 + + packages/openapi-decorators: + dependencies: + '@fastify/deepmerge': + specifier: ^2.0.0 + version: 2.0.0 + lodash: + specifier: ^4.17.21 + version: 4.17.21 + openapi-types: + specifier: ^12.1.3 + version: 12.1.3 + reflect-metadata: + specifier: ^0.2.2 + version: 0.2.2 + devDependencies: + '@types/lodash': + specifier: ^4.17.7 + version: 4.17.7 + '@types/node': + specifier: ^22.1.0 + version: 22.1.0 + del-cli: + specifier: ^5.1.0 + version: 5.1.0 + esbuild: + specifier: ^0.20.2 + version: 0.20.2 + execa: + specifier: ^8.0.1 + version: 8.0.1 + tsup: + specifier: ^8.2.4 + version: 8.2.4(@swc/core@1.7.4(@swc/helpers@0.5.5))(postcss@8.4.40)(typescript@5.4.5) + typescript: + specifier: ^5.4.5 + version: 5.4.5 + unplugin-swc: + specifier: ^1.5.1 + version: 1.5.1(@swc/core@1.7.4(@swc/helpers@0.5.5))(rollup@4.20.0) packages/openapi-fetch: dependencies: @@ -80,7 +239,7 @@ importers: version: 5.4.5 vite: specifier: ^5.3.5 - version: 5.3.5(@types/node@20.14.7) + version: 5.3.5(@types/node@22.1.0) packages/openapi-fetch/examples/nextjs: dependencies: @@ -136,13 +295,13 @@ importers: version: 18.3.0 '@vitejs/plugin-react-swc': specifier: ^3.7.0 - version: 3.7.0(@swc/helpers@0.5.5)(vite@5.3.5(@types/node@20.14.7)) + version: 3.7.0(@swc/helpers@0.5.5)(vite@5.3.5(@types/node@22.1.0)) typescript: specifier: ^5.4.5 version: 5.4.5 vite: specifier: ^5.3.5 - version: 5.3.5(@types/node@20.14.7) + version: 5.3.5(@types/node@22.1.0) packages/openapi-fetch/examples/sveltekit: dependencies: @@ -152,13 +311,13 @@ importers: devDependencies: '@sveltejs/adapter-auto': specifier: ^3.2.2 - version: 3.2.2(@sveltejs/kit@2.5.19(@sveltejs/vite-plugin-svelte@3.1.1(svelte@4.2.18)(vite@5.3.5(@types/node@20.14.7)))(svelte@4.2.18)(vite@5.3.5(@types/node@20.14.7))) + version: 3.2.2(@sveltejs/kit@2.5.19(@sveltejs/vite-plugin-svelte@3.1.1(svelte@4.2.18)(vite@5.3.5(@types/node@22.1.0)))(svelte@4.2.18)(vite@5.3.5(@types/node@22.1.0))) '@sveltejs/kit': specifier: ^2.5.19 - version: 2.5.19(@sveltejs/vite-plugin-svelte@3.1.1(svelte@4.2.18)(vite@5.3.5(@types/node@20.14.7)))(svelte@4.2.18)(vite@5.3.5(@types/node@20.14.7)) + version: 2.5.19(@sveltejs/vite-plugin-svelte@3.1.1(svelte@4.2.18)(vite@5.3.5(@types/node@22.1.0)))(svelte@4.2.18)(vite@5.3.5(@types/node@22.1.0)) '@sveltejs/vite-plugin-svelte': specifier: ^3.1.1 - version: 3.1.1(svelte@4.2.18)(vite@5.3.5(@types/node@20.14.7)) + version: 3.1.1(svelte@4.2.18)(vite@5.3.5(@types/node@22.1.0)) openapi-typescript: specifier: workspace:^ version: link:../../../openapi-typescript @@ -176,7 +335,7 @@ importers: version: 5.4.5 vite: specifier: ^5.3.5 - version: 5.3.5(@types/node@20.14.7) + version: 5.3.5(@types/node@22.1.0) packages/openapi-fetch/examples/vue-3: dependencies: @@ -192,7 +351,7 @@ importers: version: 20.1.4 '@vitejs/plugin-vue': specifier: ^5.1.2 - version: 5.1.2(vite@5.3.5(@types/node@20.14.7))(vue@3.4.35(typescript@5.4.5)) + version: 5.1.2(vite@5.3.5(@types/node@22.1.0))(vue@3.4.35(typescript@5.4.5)) '@vue/tsconfig': specifier: ^0.5.1 version: 0.5.1 @@ -204,7 +363,7 @@ importers: version: 5.4.5 vite: specifier: ^5.3.5 - version: 5.3.5(@types/node@20.14.7) + version: 5.3.5(@types/node@22.1.0) vue-tsc: specifier: ^2.0.29 version: 2.0.29(typescript@5.4.5) @@ -229,7 +388,7 @@ importers: version: 18.3.1 '@vitejs/plugin-react': specifier: ^4.3.1 - version: 4.3.1(vite@5.3.5(@types/node@20.14.7)) + version: 4.3.1(vite@5.3.5(@types/node@22.1.0)) del-cli: specifier: ^5.1.0 version: 5.1.0 @@ -296,7 +455,7 @@ importers: version: 5.4.5 vite-node: specifier: ^2.0.5 - version: 2.0.5(@types/node@20.14.7)(supports-color@9.4.0) + version: 2.0.5(@types/node@22.1.0)(supports-color@9.4.0) packages/openapi-typescript-helpers: devDependencies: @@ -306,6 +465,173 @@ importers: packages: + '@adonisjs/ace@13.1.0': + resolution: {integrity: sha512-TMFtJJYLq2eBNaXOcbrssxKWwto98U6fxeIJ1Yx/McB47tBns7Q1V30U4URwYN6DxAAuOaOQkbDOrGYbCy2B2A==} + engines: {node: '>=18.16.0'} + + '@adonisjs/application@8.3.1': + resolution: {integrity: sha512-hfZBgZ23BQAXvoSHDkc/I0hTSXyFVxypNqHPQ/WCk4VoWlBVWVgGaGnHLvIGhrZ3RMvyoC5NBgC0PR5G+/fGSw==} + engines: {node: '>=18.16.0'} + peerDependencies: + '@adonisjs/config': ^5.0.0 + '@adonisjs/fold': ^10.0.0 + + '@adonisjs/assembler@7.7.0': + resolution: {integrity: sha512-YigVvixtdFq87yyBQiuASgaSH9xc1DM+aAO8iPuzsa4N4qnGFRiRl6OQYlw73b+cjdrabnOgM3SG1nR/LLdkUw==} + engines: {node: '>=20.6.0'} + peerDependencies: + typescript: ^4.0.0 || ^5.0.0 + + '@adonisjs/auth@9.2.3': + resolution: {integrity: sha512-my/dqQJo1LQRhT3bW0RuK/1BhDTWcY3tVrGZmVMedCRBfYGt91OAreMy0muukJcWr8AkXBtbBsju2D+myaDa4Q==} + engines: {node: '>=18.16.0'} + peerDependencies: + '@adonisjs/core': ^6.11.0 + '@adonisjs/lucid': ^20.0.0 || ^21.0.1 + '@adonisjs/session': ^7.4.1 + '@japa/api-client': ^2.0.3 + '@japa/browser-client': ^2.0.3 + '@japa/plugin-adonisjs': ^3.0.1 + peerDependenciesMeta: + '@adonisjs/lucid': + optional: true + '@adonisjs/session': + optional: true + '@japa/api-client': + optional: true + '@japa/browser-client': + optional: true + '@japa/plugin-adonisjs': + optional: true + + '@adonisjs/bodyparser@10.0.2': + resolution: {integrity: sha512-dkbn+DK5B1dODTwk5367gHPhaD4ZIoGon/jvq47iX2cnHjk3a0SyQrBEjoFhnrNkVOJZ76I3OJ3oixqgMcE+yA==} + engines: {node: '>=18.16.0'} + peerDependencies: + '@adonisjs/http-server': ^7.0.2 + + '@adonisjs/config@5.0.2': + resolution: {integrity: sha512-NXjFqDHNGRTZ1EnA4zr20GFEt7qw/JvZ4ZV8/PzFyVc7dPoFprpoyE3bw7kmlKHhcQdBbF7YXCGB4q+HQUnqiQ==} + engines: {node: '>=18.16.0'} + + '@adonisjs/core@6.12.1': + resolution: {integrity: sha512-SO3RoLw5KWZH2zVOFFAt9IRsbWiis5fycu1LaYCqau6YhiLWu14wgT+TAnWdr/WbsFm7eS1ojrC5kD/muu5S6Q==} + engines: {node: '>=20.6.0'} + hasBin: true + peerDependencies: + '@adonisjs/assembler': ^7.5.0 + '@vinejs/vine': ^2.0.0 + argon2: ^0.31.2 || ^0.40.0 + bcrypt: ^5.1.1 + edge.js: ^6.0.1 + peerDependenciesMeta: + '@adonisjs/assembler': + optional: true + '@vinejs/vine': + optional: true + argon2: + optional: true + bcrypt: + optional: true + edge.js: + optional: true + + '@adonisjs/cors@2.2.1': + resolution: {integrity: sha512-qnrSG8ylpgTeZBOYEN3yXxY0PBUEg1KGDhgn9VKVFGxLKT+o9GGVOSZxUK3wG341B1zB9w5vuZN1z4M0Jitb6g==} + engines: {node: '>=18.16.0'} + peerDependencies: + '@adonisjs/core': ^6.2.0 + + '@adonisjs/encryption@6.0.2': + resolution: {integrity: sha512-37XqVPsZi6zXMbC0Me1/qlcTP0uE+KAtYOFx7D7Tvtz377NL/6gqxqgpW/BopgOSD+CVDXjzO/Wx3M2UrbkJRQ==} + engines: {node: '>=18.16.0'} + + '@adonisjs/env@6.1.0': + resolution: {integrity: sha512-CzK+njXTH3EK+d/UJPqckyqWocOItmLgHIUbvhpd6WvveBnfv1Dz5j9H3k+ogHqThDSJCXu1RkaRAC+HNym9gA==} + engines: {node: '>=18.16.0'} + + '@adonisjs/eslint-config@1.3.0': + resolution: {integrity: sha512-CBt/fl17+OCmaCd0rt79GvroDidaF/cBTc6iqjEh08IawAcanQE339kPRMgL1T43B6BDFmSahePvYU5es5j4yw==} + peerDependencies: + eslint: '>=7.4.0' + prettier: '>=2.0.0' + + '@adonisjs/eslint-plugin@1.3.0': + resolution: {integrity: sha512-LpN85yyuKkfo4t5PlE2Pij1GU3BcFh15cOH6BK7iDDcMkR6KduXB90hYiRu013EVIH+/sfxP5k2VjhBRc31Mqw==} + + '@adonisjs/events@9.0.2': + resolution: {integrity: sha512-qZn2e9V9C8tF4MNqEWv5JGxMG7gcHSJM8RncGpjuJ4cwFwd2jF4xrN6wkCprTVwoyZSxNS0Cp9NkAonySjG5vg==} + engines: {node: '>=18.16.0'} + peerDependencies: + '@adonisjs/application': ^8.0.2 + '@adonisjs/fold': ^10.0.1 + + '@adonisjs/fold@10.1.2': + resolution: {integrity: sha512-zNlPUpX0HdNLP9lateEqQ+frO+u0Ecs1OW3eS+8CbPTKgfPP1fFP9cZeuYFJK0FwQIFdP1rLVkpUBZAR//5Bfw==} + engines: {node: '>=18.16.0'} + + '@adonisjs/hash@9.0.3': + resolution: {integrity: sha512-03TWe0moQ+bSA3YNzL0kSXxaMGlT5owLgOtPy1UgPN3TN2mDnThI0futh2xSUZZxnLqIy7ghlvn4VfuSWDhqPQ==} + engines: {node: '>=20.6.0'} + peerDependencies: + argon2: ^0.31.2 || ^0.40.0 + bcrypt: ^5.1.1 + peerDependenciesMeta: + argon2: + optional: true + bcrypt: + optional: true + + '@adonisjs/health@2.0.0': + resolution: {integrity: sha512-dEAABiAJew1imzwi+OvV/SAnjkMp8TbD5ZIzx1dMRnPynJAlRf37//bHLwZ5Cw44ke5kPzZ/l1n9cx/VeBCicA==} + engines: {node: '>=20.6.0'} + + '@adonisjs/http-server@7.2.3': + resolution: {integrity: sha512-qN4hbrIIDkP7pzzUm+lhcuCUK8zID+ZAss1Hosjjg1fq6H3pA1kloJIpc6FjlOZXkO6LjkhflAEh9jf1v/G49Q==} + engines: {node: '>=18.16.0'} + peerDependencies: + '@adonisjs/application': ^8.0.2 + '@adonisjs/encryption': ^6.0.0 + '@adonisjs/events': ^9.0.0 + '@adonisjs/fold': ^10.0.1 + '@adonisjs/logger': ^6.0.1 + + '@adonisjs/logger@6.0.3': + resolution: {integrity: sha512-CKxIpWBEX/e6duRE6qq8GJ90NQC8q26Q0aSuj+bUO6X4mgcgawxhciJTfpxmJNj9KEUmNAeHOn0hSpTITdk8Lg==} + engines: {node: '>=18.16.0'} + + '@adonisjs/lucid@21.1.1': + resolution: {integrity: sha512-2b9bu82xC+g+zKcbWib2+jyjs41W5IAwqrfowdi6monue7rsnqqxJOXd98GLLFCTqK/jITg/BKQyI4Ixc5OHzw==} + engines: {node: '>=18.16.0'} + peerDependencies: + '@adonisjs/assembler': ^7.7.0 + '@adonisjs/core': ^6.10.1 + luxon: ^3.4.4 + peerDependenciesMeta: + '@adonisjs/assembler': + optional: true + luxon: + optional: true + + '@adonisjs/presets@2.6.1': + resolution: {integrity: sha512-OIk5FYrbtymu1tGLv5yyZfirnXQSjrJYNyBstrTKvu7dW/jsAi9Mlm8wpXMpNhrEzo6sHGEkQKmDIz0m7TP9Pw==} + peerDependencies: + '@adonisjs/assembler': ^7.4.0 + '@adonisjs/core': ^6.5.0 + peerDependenciesMeta: + '@adonisjs/assembler': + optional: true + + '@adonisjs/prettier-config@1.3.0': + resolution: {integrity: sha512-StwX1dGsf8Yt5Vz48evSDGKMS5iOEgMHUYcDhkQJ79NUXopJ5PiAqb/GbjvA+XmEa+aZNPHqmafgFbfKlLAFZA==} + + '@adonisjs/repl@4.0.1': + resolution: {integrity: sha512-fgDRC5I8RBKHzsJPM4rRQF/OWI0K9cNihCIf4yHdqQt3mhFqWSOUjSi4sXWykdICLiddmyBO86au7i0d0dj5vQ==} + engines: {node: '>=18.16.0'} + + '@adonisjs/tsconfig@1.3.0': + resolution: {integrity: sha512-+nOykDG44b4JSAdsrTdh5HuZqJpr6F+dHpfNYgHfYsFJIEtZo8plHilZAM7iabCRN5R49SPv5p8Ixcp47Rr50g==} + '@algolia/autocomplete-core@1.9.3': resolution: {integrity: sha512-009HdfugtGCdC4JdXUbVJClA0q0zh24yyePn+KUGk3rP7j8FEe/m5Yo/z65gn6nP/cM39PxpzqKrL7A6fP6PPw==} @@ -375,9 +701,16 @@ packages: resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} engines: {node: '>=6.0.0'} + '@antfu/install-pkg@0.3.3': + resolution: {integrity: sha512-nHHsk3NXQ6xkCfiRRC8Nfrg8pU5kkr3P3Y9s9dKqiuRmBD0Yap7fymNDjGFKeWhZQHqqbCS5CfeMy9wtExM24w==} + '@apidevtools/json-schema-ref-parser@9.0.9': resolution: {integrity: sha512-GBD2Le9w2+lVFoc4vswGI/TjkNIZSVp7+9xPf+X3uidBfWnAeUWmquteSyt0+VCrhNMWj/FTABISQrD3Z/YA+w==} + '@arr/every@1.0.1': + resolution: {integrity: sha512-UQFQ6SgyJ6LX42W8rHCs8KVc0JS0tzVL9ct4XYedJukskYVWTo49tNiMEK9C2HTyarbNiT/RVIRSY82vH+6sTg==} + engines: {node: '>=4'} + '@babel/code-frame@7.24.2': resolution: {integrity: sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==} engines: {node: '>=6.9.0'} @@ -634,6 +967,14 @@ packages: '@changesets/write@0.3.1': resolution: {integrity: sha512-SyGtMXzH3qFqlHKcvFY2eX+6b0NGiFcNav8AFsYwy5l8hejOeoeTDemu5Yjmke2V5jpzY+pBvM0vCCQ3gdZpfw==} + '@colors/colors@1.5.0': + resolution: {integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==} + engines: {node: '>=0.1.90'} + + '@cspotcode/source-map-support@0.8.1': + resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} + engines: {node: '>=12'} + '@docsearch/css@3.6.0': resolution: {integrity: sha512-+sbxb71sWre+PwDK7X2T8+bhS6clcVMLwBPznX45Qu6opJcgRjAp7gYSDzVFp187J+feSj5dNBN1mJoi6ckkUQ==} @@ -669,6 +1010,12 @@ packages: cpu: [ppc64] os: [aix] + '@esbuild/aix-ppc64@0.23.0': + resolution: {integrity: sha512-3sG8Zwa5fMcA9bgqB8AfWPQ+HFke6uD3h1s3RIwUNK8EG7a4buxvuFTs3j1IMs2NXAk9F30C/FF4vxRgQCcmoQ==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + '@esbuild/android-arm64@0.20.2': resolution: {integrity: sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==} engines: {node: '>=12'} @@ -681,6 +1028,12 @@ packages: cpu: [arm64] os: [android] + '@esbuild/android-arm64@0.23.0': + resolution: {integrity: sha512-EuHFUYkAVfU4qBdyivULuu03FhJO4IJN9PGuABGrFy4vUuzk91P2d+npxHcFdpUnfYKy0PuV+n6bKIpHOB3prQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + '@esbuild/android-arm@0.20.2': resolution: {integrity: sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==} engines: {node: '>=12'} @@ -693,6 +1046,12 @@ packages: cpu: [arm] os: [android] + '@esbuild/android-arm@0.23.0': + resolution: {integrity: sha512-+KuOHTKKyIKgEEqKbGTK8W7mPp+hKinbMBeEnNzjJGyFcWsfrXjSTNluJHCY1RqhxFurdD8uNXQDei7qDlR6+g==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + '@esbuild/android-x64@0.20.2': resolution: {integrity: sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==} engines: {node: '>=12'} @@ -705,6 +1064,12 @@ packages: cpu: [x64] os: [android] + '@esbuild/android-x64@0.23.0': + resolution: {integrity: sha512-WRrmKidLoKDl56LsbBMhzTTBxrsVwTKdNbKDalbEZr0tcsBgCLbEtoNthOW6PX942YiYq8HzEnb4yWQMLQuipQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + '@esbuild/darwin-arm64@0.20.2': resolution: {integrity: sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==} engines: {node: '>=12'} @@ -717,6 +1082,12 @@ packages: cpu: [arm64] os: [darwin] + '@esbuild/darwin-arm64@0.23.0': + resolution: {integrity: sha512-YLntie/IdS31H54Ogdn+v50NuoWF5BDkEUFpiOChVa9UnKpftgwzZRrI4J132ETIi+D8n6xh9IviFV3eXdxfow==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + '@esbuild/darwin-x64@0.20.2': resolution: {integrity: sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==} engines: {node: '>=12'} @@ -729,6 +1100,12 @@ packages: cpu: [x64] os: [darwin] + '@esbuild/darwin-x64@0.23.0': + resolution: {integrity: sha512-IMQ6eme4AfznElesHUPDZ+teuGwoRmVuuixu7sv92ZkdQcPbsNHzutd+rAfaBKo8YK3IrBEi9SLLKWJdEvJniQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + '@esbuild/freebsd-arm64@0.20.2': resolution: {integrity: sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==} engines: {node: '>=12'} @@ -741,6 +1118,12 @@ packages: cpu: [arm64] os: [freebsd] + '@esbuild/freebsd-arm64@0.23.0': + resolution: {integrity: sha512-0muYWCng5vqaxobq6LB3YNtevDFSAZGlgtLoAc81PjUfiFz36n4KMpwhtAd4he8ToSI3TGyuhyx5xmiWNYZFyw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + '@esbuild/freebsd-x64@0.20.2': resolution: {integrity: sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==} engines: {node: '>=12'} @@ -753,6 +1136,12 @@ packages: cpu: [x64] os: [freebsd] + '@esbuild/freebsd-x64@0.23.0': + resolution: {integrity: sha512-XKDVu8IsD0/q3foBzsXGt/KjD/yTKBCIwOHE1XwiXmrRwrX6Hbnd5Eqn/WvDekddK21tfszBSrE/WMaZh+1buQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + '@esbuild/linux-arm64@0.20.2': resolution: {integrity: sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==} engines: {node: '>=12'} @@ -765,6 +1154,12 @@ packages: cpu: [arm64] os: [linux] + '@esbuild/linux-arm64@0.23.0': + resolution: {integrity: sha512-j1t5iG8jE7BhonbsEg5d9qOYcVZv/Rv6tghaXM/Ug9xahM0nX/H2gfu6X6z11QRTMT6+aywOMA8TDkhPo8aCGw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + '@esbuild/linux-arm@0.20.2': resolution: {integrity: sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==} engines: {node: '>=12'} @@ -777,6 +1172,12 @@ packages: cpu: [arm] os: [linux] + '@esbuild/linux-arm@0.23.0': + resolution: {integrity: sha512-SEELSTEtOFu5LPykzA395Mc+54RMg1EUgXP+iw2SJ72+ooMwVsgfuwXo5Fn0wXNgWZsTVHwY2cg4Vi/bOD88qw==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + '@esbuild/linux-ia32@0.20.2': resolution: {integrity: sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==} engines: {node: '>=12'} @@ -789,6 +1190,12 @@ packages: cpu: [ia32] os: [linux] + '@esbuild/linux-ia32@0.23.0': + resolution: {integrity: sha512-P7O5Tkh2NbgIm2R6x1zGJJsnacDzTFcRWZyTTMgFdVit6E98LTxO+v8LCCLWRvPrjdzXHx9FEOA8oAZPyApWUA==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + '@esbuild/linux-loong64@0.20.2': resolution: {integrity: sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==} engines: {node: '>=12'} @@ -801,6 +1208,12 @@ packages: cpu: [loong64] os: [linux] + '@esbuild/linux-loong64@0.23.0': + resolution: {integrity: sha512-InQwepswq6urikQiIC/kkx412fqUZudBO4SYKu0N+tGhXRWUqAx+Q+341tFV6QdBifpjYgUndV1hhMq3WeJi7A==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + '@esbuild/linux-mips64el@0.20.2': resolution: {integrity: sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==} engines: {node: '>=12'} @@ -813,6 +1226,12 @@ packages: cpu: [mips64el] os: [linux] + '@esbuild/linux-mips64el@0.23.0': + resolution: {integrity: sha512-J9rflLtqdYrxHv2FqXE2i1ELgNjT+JFURt/uDMoPQLcjWQA5wDKgQA4t/dTqGa88ZVECKaD0TctwsUfHbVoi4w==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + '@esbuild/linux-ppc64@0.20.2': resolution: {integrity: sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==} engines: {node: '>=12'} @@ -825,6 +1244,12 @@ packages: cpu: [ppc64] os: [linux] + '@esbuild/linux-ppc64@0.23.0': + resolution: {integrity: sha512-cShCXtEOVc5GxU0fM+dsFD10qZ5UpcQ8AM22bYj0u/yaAykWnqXJDpd77ublcX6vdDsWLuweeuSNZk4yUxZwtw==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + '@esbuild/linux-riscv64@0.20.2': resolution: {integrity: sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==} engines: {node: '>=12'} @@ -837,6 +1262,12 @@ packages: cpu: [riscv64] os: [linux] + '@esbuild/linux-riscv64@0.23.0': + resolution: {integrity: sha512-HEtaN7Y5UB4tZPeQmgz/UhzoEyYftbMXrBCUjINGjh3uil+rB/QzzpMshz3cNUxqXN7Vr93zzVtpIDL99t9aRw==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + '@esbuild/linux-s390x@0.20.2': resolution: {integrity: sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==} engines: {node: '>=12'} @@ -849,6 +1280,12 @@ packages: cpu: [s390x] os: [linux] + '@esbuild/linux-s390x@0.23.0': + resolution: {integrity: sha512-WDi3+NVAuyjg/Wxi+o5KPqRbZY0QhI9TjrEEm+8dmpY9Xir8+HE/HNx2JoLckhKbFopW0RdO2D72w8trZOV+Wg==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + '@esbuild/linux-x64@0.20.2': resolution: {integrity: sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==} engines: {node: '>=12'} @@ -861,6 +1298,12 @@ packages: cpu: [x64] os: [linux] + '@esbuild/linux-x64@0.23.0': + resolution: {integrity: sha512-a3pMQhUEJkITgAw6e0bWA+F+vFtCciMjW/LPtoj99MhVt+Mfb6bbL9hu2wmTZgNd994qTAEw+U/r6k3qHWWaOQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + '@esbuild/netbsd-x64@0.20.2': resolution: {integrity: sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==} engines: {node: '>=12'} @@ -873,6 +1316,18 @@ packages: cpu: [x64] os: [netbsd] + '@esbuild/netbsd-x64@0.23.0': + resolution: {integrity: sha512-cRK+YDem7lFTs2Q5nEv/HHc4LnrfBCbH5+JHu6wm2eP+d8OZNoSMYgPZJq78vqQ9g+9+nMuIsAO7skzphRXHyw==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-arm64@0.23.0': + resolution: {integrity: sha512-suXjq53gERueVWu0OKxzWqk7NxiUWSUlrxoZK7usiF50C6ipColGR5qie2496iKGYNLhDZkPxBI3erbnYkU0rQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + '@esbuild/openbsd-x64@0.20.2': resolution: {integrity: sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==} engines: {node: '>=12'} @@ -885,6 +1340,12 @@ packages: cpu: [x64] os: [openbsd] + '@esbuild/openbsd-x64@0.23.0': + resolution: {integrity: sha512-6p3nHpby0DM/v15IFKMjAaayFhqnXV52aEmv1whZHX56pdkK+MEaLoQWj+H42ssFarP1PcomVhbsR4pkz09qBg==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + '@esbuild/sunos-x64@0.20.2': resolution: {integrity: sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==} engines: {node: '>=12'} @@ -897,6 +1358,12 @@ packages: cpu: [x64] os: [sunos] + '@esbuild/sunos-x64@0.23.0': + resolution: {integrity: sha512-BFelBGfrBwk6LVrmFzCq1u1dZbG4zy/Kp93w2+y83Q5UGYF1d8sCzeLI9NXjKyujjBBniQa8R8PzLFAUrSM9OA==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + '@esbuild/win32-arm64@0.20.2': resolution: {integrity: sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==} engines: {node: '>=12'} @@ -909,6 +1376,12 @@ packages: cpu: [arm64] os: [win32] + '@esbuild/win32-arm64@0.23.0': + resolution: {integrity: sha512-lY6AC8p4Cnb7xYHuIxQ6iYPe6MfO2CC43XXKo9nBXDb35krYt7KGhQnOkRGar5psxYkircpCqfbNDB4uJbS2jQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + '@esbuild/win32-ia32@0.20.2': resolution: {integrity: sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==} engines: {node: '>=12'} @@ -921,6 +1394,12 @@ packages: cpu: [ia32] os: [win32] + '@esbuild/win32-ia32@0.23.0': + resolution: {integrity: sha512-7L1bHlOTcO4ByvI7OXVI5pNN6HSu6pUQq9yodga8izeuB1KcT2UkHaH6118QJwopExPn0rMHIseCTx1CRo/uNA==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + '@esbuild/win32-x64@0.20.2': resolution: {integrity: sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==} engines: {node: '>=12'} @@ -933,6 +1412,50 @@ packages: cpu: [x64] os: [win32] + '@esbuild/win32-x64@0.23.0': + resolution: {integrity: sha512-Arm+WgUFLUATuoxCJcahGuk6Yj9Pzxd6l11Zb/2aAuv5kWWvvfhLFo2fni4uSK5vzlUdCGZ/BdV5tH8klj8p8g==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + + '@eslint-community/eslint-utils@4.4.0': + resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + + '@eslint-community/regexpp@4.11.0': + resolution: {integrity: sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + + '@eslint/eslintrc@2.1.4': + resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@eslint/js@8.57.0': + resolution: {integrity: sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@faker-js/faker@8.4.1': + resolution: {integrity: sha512-XQ3cU+Q8Uqmrbf2e0cIC/QN43sTBSC8KF12u29Mb47tWrt2hAgBXSgpZMj4Ao8Uk0iJcU99QsOCaIL8934obCg==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0, npm: '>=6.14.13'} + + '@fastify/deepmerge@2.0.0': + resolution: {integrity: sha512-fsaybTGDyQ5KpPsplQqb9yKdCf2x/pbNpMNk8Tvp3rRz7lVcupKysH4b2ELMN2P4Hak1+UqTYdTj/u4FNV2p0g==} + + '@humanwhocodes/config-array@0.11.14': + resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==} + engines: {node: '>=10.10.0'} + deprecated: Use @eslint/config-array instead + + '@humanwhocodes/module-importer@1.0.1': + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + + '@humanwhocodes/object-schema@2.0.3': + resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} + deprecated: Use @eslint/object-schema instead + '@inquirer/confirm@3.1.10': resolution: {integrity: sha512-/aAHu83Njy6yf44T+ZrRPUkMcUqprrOiIKsyMvf9jOV+vF5BNb2ja1aLP33MK36W8eaf91MTL/mU/e6METuENg==} engines: {node: '>=18'} @@ -949,6 +1472,37 @@ packages: resolution: {integrity: sha512-xTUt0NulylX27/zMx04ZYar/kr1raaiFTVvQ5feljQsiAgdm0WPj4S73/ye0fbslh+15QrIuDvfCXTek7pMY5A==} engines: {node: '>=18'} + '@isaacs/cliui@8.0.2': + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} + + '@japa/api-client@2.0.3': + resolution: {integrity: sha512-2Eh68Kg1+7glMo+mLSPfBGN21wUEA61niTMwdmhEXyw5VrS4IctZxQWhn5fzwj5KnQJfPpxrRnt9432Zs0uN/g==} + engines: {node: '>=18.16.0'} + peerDependencies: + '@japa/assert': ^2.0.0 || ^3.0.0 + '@japa/runner': ^3.1.2 + peerDependenciesMeta: + '@japa/assert': + optional: true + + '@japa/plugin-adonisjs@3.0.1': + resolution: {integrity: sha512-xUZOzfBXSz2sWRoQT+qs+6LZBtWWE+cCBZ3j9ckz6+nPw3VI0nV6yLaX+oud3AY8Zb+BH+pErABBhaovZYv9dA==} + engines: {node: '>=18.16.0'} + peerDependencies: + '@adonisjs/core': ^6.5.0 + '@japa/api-client': ^2.0.3 + '@japa/browser-client': ^2.0.3 + '@japa/runner': ^3.1.2 + playwright: ^1.42.1 + peerDependenciesMeta: + '@japa/api-client': + optional: true + '@japa/browser-client': + optional: true + playwright: + optional: true + '@jridgewell/gen-mapping@0.3.5': resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} engines: {node: '>=6.0.0'} @@ -961,18 +1515,26 @@ packages: resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} engines: {node: '>=6.0.0'} - '@jridgewell/sourcemap-codec@1.4.15': - resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} - '@jridgewell/sourcemap-codec@1.5.0': resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} '@jridgewell/trace-mapping@0.3.25': resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + '@jridgewell/trace-mapping@0.3.9': + resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} + + '@jsdevtools/ez-spawn@3.0.4': + resolution: {integrity: sha512-f5DRIOZf7wxogefH03RjMPMdBF7ADTWUMoOs9kaJo06EfwF+aFhMZMDZxHg/Xe12hptN9xoZjGso2fdjapBRIA==} + engines: {node: '>=10'} + '@jsdevtools/ono@7.1.3': resolution: {integrity: sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==} + '@lukeed/ms@2.0.2': + resolution: {integrity: sha512-9I2Zn6+NJLfaGoz9jN3lpwDgAYvfGeNYdbAIjJOqzs4Tpc+VU3Jqq4IofSUBKajiDS8k9fZIg18/z13mpk1bsA==} + engines: {node: '>=8'} + '@manypkg/find-root@1.1.0': resolution: {integrity: sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA==} @@ -1044,6 +1606,10 @@ packages: cpu: [x64] os: [win32] + '@noble/hashes@1.4.0': + resolution: {integrity: sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==} + engines: {node: '>= 16'} + '@nodelib/fs.scandir@2.1.5': resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} @@ -1065,6 +1631,21 @@ packages: '@open-draft/until@2.1.0': resolution: {integrity: sha512-U69T3ItWHvLwGg5eJ0n3I62nWuE6ilHlmz7zM0npLBRvPRd7e6NYmg54vvRtP5mZG7kZqZCFVdsTWo7BPtBujg==} + '@paralleldrive/cuid2@2.2.2': + resolution: {integrity: sha512-ZOBkgDwEdoYVlSeRbYYXs0S9MejQofiVYoTbKzy/6GQa39/q5tQU2IX46+shYnUkpEl3wc+J6wRlar7r2EK2xA==} + + '@phc/format@1.0.0': + resolution: {integrity: sha512-m7X9U6BG2+J+R1lSOdCiITLLrxm+cWlNI3HUFA92oLO77ObGNzaKdh8pMLqdZcshtkKuV84olNNXDfMc4FezBQ==} + engines: {node: '>=10'} + + '@pkgjs/parseargs@0.11.0': + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} + + '@pkgr/core@0.1.1': + resolution: {integrity: sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==} + engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + '@playwright/test@1.44.1': resolution: {integrity: sha512-1hZ4TNvD5z9VuhNJ/walIjvMVvYkZKf71axoF/uiAqpntQJXpG64dlXhoDXE3OczPuTuvjf/M5KWFg5VAVUS3Q==} engines: {node: '>=16'} @@ -1073,6 +1654,49 @@ packages: '@polka/url@1.0.0-next.25': resolution: {integrity: sha512-j7P6Rgr3mmtdkeDGTe0E/aYyWEWVtc5yFXtHCRHs28/jptDEWfaVOc5T7cblqy1XKPPfCxJc/8DwQ5YgLOZOVQ==} + '@poppinss/chokidar-ts@4.1.4': + resolution: {integrity: sha512-iX+QSNOo2PAvkv+8ggBkCyv2gZHskJemtsl1PcEbjM7dJOf+n4LSPHAqj4+B0raqZHznXFhKKoQfN1a9j/YuUg==} + engines: {node: '>=18.16.0'} + peerDependencies: + typescript: ^4.0.0 || ^5.0.0 + + '@poppinss/cliui@6.4.1': + resolution: {integrity: sha512-tdV3QpAfrPFRLPOh98F8QxWBvwYF3ziWGGtpVqfZtFNTFkC7nQnVQlUW55UtQ7rkeMmFohxfDI+2JNWScGJ1jQ==} + engines: {node: '>=18.16.0'} + + '@poppinss/colors@4.1.3': + resolution: {integrity: sha512-A0FjJ6x14donWDN3bHAFFjJaPWTwM2PgWT834+bPKVK6Xukf25CscoRqCPYI939a8yuJFX9PYWWnVbUVI0E2Cg==} + engines: {node: '>=18.16.0'} + + '@poppinss/hooks@7.2.3': + resolution: {integrity: sha512-+B7YSazGaCMcoUubwEkCTnpAvJ+Fv7tqgtpu7cm9qt1adEjmXDmaiG76loEnmxAkyHrbZJ5xHGNSD0NwMhLcnA==} + engines: {node: '>=18.16.0'} + + '@poppinss/macroable@1.0.2': + resolution: {integrity: sha512-xhhEcEvhQC8mP5oOr5hbE4CmUgmw/IPV1jhpGg2xSkzoFrt9i8YVqBQt9744EFesi5F7pBheWozg63RUBM/5JA==} + engines: {node: '>=18.16.0'} + + '@poppinss/matchit@3.1.2': + resolution: {integrity: sha512-Bx+jY+vmdQFmwYiHliiPjr+oVBaGnh79B1h1FSAm3jME1QylLFt8PPYC0ymO8Q5PzJj/KuE3jeTnZhRHOWqq8g==} + + '@poppinss/middleware@3.2.3': + resolution: {integrity: sha512-orhgQQ99xB4WS0Ln0X89UTlSkFIVT9zfkyvuWsaCb/9wTa0leDf+2GlFi1nVVT0Xdd2i51CXYYAMQkWM4yAp3Q==} + engines: {node: '>=18.16.0'} + + '@poppinss/multiparty@2.0.1': + resolution: {integrity: sha512-Pf3V9PFyZDIkDBBiAOT2hdmA+1l/+hverHbUnMzNzwtwgO50s2ZPt5KxUydVA0hceg9gryo5unQ0WUF1SO9tkQ==} + + '@poppinss/prompts@3.1.3': + resolution: {integrity: sha512-lNAcOcvB7YhfaWYIsu8tatF9V61A0SEu8PGpGx9RqTVmImKhLT0AAcRPr/5z4UQMl7SIf5REQKMJhHK50xakYQ==} + engines: {node: '>=18.16.0'} + + '@poppinss/utils@6.7.3': + resolution: {integrity: sha512-zQnhVG4Q+n6+V1vrL/TF1Oy8ZcVVGUs49Sj5OBgoari/q42UiG/rht1DRvoeWd9bT1BBDwxO2vcfxj6C0u/Dgg==} + engines: {node: '>=18.16.0'} + + '@poppinss/validator-lite@1.0.3': + resolution: {integrity: sha512-u4dmT7PDHwNtxY3q1jHVp/u+hMEEcBlkzd37QwwM4tVt/0mLlEDttSfPQ+TT7sqPG4VEtWKwVSlMInwPUYyJpA==} + '@redocly/ajv@8.11.0': resolution: {integrity: sha512-9GWx27t7xWhDIR02PA18nzBdLcKQRgc46xNQvjFkrYk4UOmvKhJ/dawwiX0cCOeetN5LcaaiqQbVOWYK62SGHw==} @@ -1083,13 +1707,32 @@ packages: resolution: {integrity: sha512-z06h+svyqbUcdAaePq8LPSwTPlm6Ig7j2VlL8skPBYnJvyaQ2IN7x/JkOvRL4ta+wcOCBdAex5JWnZbKaNktJg==} engines: {node: '>=14.19.0', npm: '>=7.0.0'} + '@rollup/pluginutils@5.1.0': + resolution: {integrity: sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + '@rollup/rollup-android-arm-eabi@4.18.0': resolution: {integrity: sha512-Tya6xypR10giZV1XzxmH5wr25VcZSncG0pZIjfePT0OVBvqNEurzValetGNarVrGiq66EBVAFn15iYX4w6FKgQ==} cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.18.0': - resolution: {integrity: sha512-avCea0RAP03lTsDhEyfy+hpfr85KfyTctMADqHVhLAF3MlIkq83CP8UfAHUssgXTYd+6er6PaAhx/QGv4L1EiA==} + '@rollup/rollup-android-arm-eabi@4.20.0': + resolution: {integrity: sha512-TSpWzflCc4VGAUJZlPpgAJE1+V60MePDQnBd7PPkpuEmOy8i87aL6tinFGKBFKuEDikYpig72QzdT3QPYIi+oA==} + cpu: [arm] + os: [android] + + '@rollup/rollup-android-arm64@4.18.0': + resolution: {integrity: sha512-avCea0RAP03lTsDhEyfy+hpfr85KfyTctMADqHVhLAF3MlIkq83CP8UfAHUssgXTYd+6er6PaAhx/QGv4L1EiA==} + cpu: [arm64] + os: [android] + + '@rollup/rollup-android-arm64@4.20.0': + resolution: {integrity: sha512-u00Ro/nok7oGzVuh/FMYfNoGqxU5CPWz1mxV85S2w9LxHR8OoMQBuSk+3BKVIDYgkpeOET5yXkx90OYFc+ytpQ==} cpu: [arm64] os: [android] @@ -1098,77 +1741,158 @@ packages: cpu: [arm64] os: [darwin] + '@rollup/rollup-darwin-arm64@4.20.0': + resolution: {integrity: sha512-uFVfvzvsdGtlSLuL0ZlvPJvl6ZmrH4CBwLGEFPe7hUmf7htGAN+aXo43R/V6LATyxlKVC/m6UsLb7jbG+LG39Q==} + cpu: [arm64] + os: [darwin] + '@rollup/rollup-darwin-x64@4.18.0': resolution: {integrity: sha512-n2LMsUz7Ynu7DoQrSQkBf8iNrjOGyPLrdSg802vk6XT3FtsgX6JbE8IHRvposskFm9SNxzkLYGSq9QdpLYpRNA==} cpu: [x64] os: [darwin] + '@rollup/rollup-darwin-x64@4.20.0': + resolution: {integrity: sha512-xbrMDdlev53vNXexEa6l0LffojxhqDTBeL+VUxuuIXys4x6xyvbKq5XqTXBCEUA8ty8iEJblHvFaWRJTk/icAQ==} + cpu: [x64] + os: [darwin] + '@rollup/rollup-linux-arm-gnueabihf@4.18.0': resolution: {integrity: sha512-C/zbRYRXFjWvz9Z4haRxcTdnkPt1BtCkz+7RtBSuNmKzMzp3ZxdM28Mpccn6pt28/UWUCTXa+b0Mx1k3g6NOMA==} cpu: [arm] os: [linux] + '@rollup/rollup-linux-arm-gnueabihf@4.20.0': + resolution: {integrity: sha512-jMYvxZwGmoHFBTbr12Xc6wOdc2xA5tF5F2q6t7Rcfab68TT0n+r7dgawD4qhPEvasDsVpQi+MgDzj2faOLsZjA==} + cpu: [arm] + os: [linux] + '@rollup/rollup-linux-arm-musleabihf@4.18.0': resolution: {integrity: sha512-l3m9ewPgjQSXrUMHg93vt0hYCGnrMOcUpTz6FLtbwljo2HluS4zTXFy2571YQbisTnfTKPZ01u/ukJdQTLGh9A==} cpu: [arm] os: [linux] + '@rollup/rollup-linux-arm-musleabihf@4.20.0': + resolution: {integrity: sha512-1asSTl4HKuIHIB1GcdFHNNZhxAYEdqML/MW4QmPS4G0ivbEcBr1JKlFLKsIRqjSwOBkdItn3/ZDlyvZ/N6KPlw==} + cpu: [arm] + os: [linux] + '@rollup/rollup-linux-arm64-gnu@4.18.0': resolution: {integrity: sha512-rJ5D47d8WD7J+7STKdCUAgmQk49xuFrRi9pZkWoRD1UeSMakbcepWXPF8ycChBoAqs1pb2wzvbY6Q33WmN2ftw==} cpu: [arm64] os: [linux] + '@rollup/rollup-linux-arm64-gnu@4.20.0': + resolution: {integrity: sha512-COBb8Bkx56KldOYJfMf6wKeYJrtJ9vEgBRAOkfw6Ens0tnmzPqvlpjZiLgkhg6cA3DGzCmLmmd319pmHvKWWlQ==} + cpu: [arm64] + os: [linux] + '@rollup/rollup-linux-arm64-musl@4.18.0': resolution: {integrity: sha512-be6Yx37b24ZwxQ+wOQXXLZqpq4jTckJhtGlWGZs68TgdKXJgw54lUUoFYrg6Zs/kjzAQwEwYbp8JxZVzZLRepQ==} cpu: [arm64] os: [linux] + '@rollup/rollup-linux-arm64-musl@4.20.0': + resolution: {integrity: sha512-+it+mBSyMslVQa8wSPvBx53fYuZK/oLTu5RJoXogjk6x7Q7sz1GNRsXWjn6SwyJm8E/oMjNVwPhmNdIjwP135Q==} + cpu: [arm64] + os: [linux] + '@rollup/rollup-linux-powerpc64le-gnu@4.18.0': resolution: {integrity: sha512-hNVMQK+qrA9Todu9+wqrXOHxFiD5YmdEi3paj6vP02Kx1hjd2LLYR2eaN7DsEshg09+9uzWi2W18MJDlG0cxJA==} cpu: [ppc64] os: [linux] + '@rollup/rollup-linux-powerpc64le-gnu@4.20.0': + resolution: {integrity: sha512-yAMvqhPfGKsAxHN8I4+jE0CpLWD8cv4z7CK7BMmhjDuz606Q2tFKkWRY8bHR9JQXYcoLfopo5TTqzxgPUjUMfw==} + cpu: [ppc64] + os: [linux] + '@rollup/rollup-linux-riscv64-gnu@4.18.0': resolution: {integrity: sha512-ROCM7i+m1NfdrsmvwSzoxp9HFtmKGHEqu5NNDiZWQtXLA8S5HBCkVvKAxJ8U+CVctHwV2Gb5VUaK7UAkzhDjlg==} cpu: [riscv64] os: [linux] + '@rollup/rollup-linux-riscv64-gnu@4.20.0': + resolution: {integrity: sha512-qmuxFpfmi/2SUkAw95TtNq/w/I7Gpjurx609OOOV7U4vhvUhBcftcmXwl3rqAek+ADBwSjIC4IVNLiszoj3dPA==} + cpu: [riscv64] + os: [linux] + '@rollup/rollup-linux-s390x-gnu@4.18.0': resolution: {integrity: sha512-0UyyRHyDN42QL+NbqevXIIUnKA47A+45WyasO+y2bGJ1mhQrfrtXUpTxCOrfxCR4esV3/RLYyucGVPiUsO8xjg==} cpu: [s390x] os: [linux] + '@rollup/rollup-linux-s390x-gnu@4.20.0': + resolution: {integrity: sha512-I0BtGXddHSHjV1mqTNkgUZLnS3WtsqebAXv11D5BZE/gfw5KoyXSAXVqyJximQXNvNzUo4GKlCK/dIwXlz+jlg==} + cpu: [s390x] + os: [linux] + '@rollup/rollup-linux-x64-gnu@4.18.0': resolution: {integrity: sha512-xuglR2rBVHA5UsI8h8UbX4VJ470PtGCf5Vpswh7p2ukaqBGFTnsfzxUBetoWBWymHMxbIG0Cmx7Y9qDZzr648w==} cpu: [x64] os: [linux] + '@rollup/rollup-linux-x64-gnu@4.20.0': + resolution: {integrity: sha512-y+eoL2I3iphUg9tN9GB6ku1FA8kOfmF4oUEWhztDJ4KXJy1agk/9+pejOuZkNFhRwHAOxMsBPLbXPd6mJiCwew==} + cpu: [x64] + os: [linux] + '@rollup/rollup-linux-x64-musl@4.18.0': resolution: {integrity: sha512-LKaqQL9osY/ir2geuLVvRRs+utWUNilzdE90TpyoX0eNqPzWjRm14oMEE+YLve4k/NAqCdPkGYDaDF5Sw+xBfg==} cpu: [x64] os: [linux] + '@rollup/rollup-linux-x64-musl@4.20.0': + resolution: {integrity: sha512-hM3nhW40kBNYUkZb/r9k2FKK+/MnKglX7UYd4ZUy5DJs8/sMsIbqWK2piZtVGE3kcXVNj3B2IrUYROJMMCikNg==} + cpu: [x64] + os: [linux] + '@rollup/rollup-win32-arm64-msvc@4.18.0': resolution: {integrity: sha512-7J6TkZQFGo9qBKH0pk2cEVSRhJbL6MtfWxth7Y5YmZs57Pi+4x6c2dStAUvaQkHQLnEQv1jzBUW43GvZW8OFqA==} cpu: [arm64] os: [win32] + '@rollup/rollup-win32-arm64-msvc@4.20.0': + resolution: {integrity: sha512-psegMvP+Ik/Bg7QRJbv8w8PAytPA7Uo8fpFjXyCRHWm6Nt42L+JtoqH8eDQ5hRP7/XW2UiIriy1Z46jf0Oa1kA==} + cpu: [arm64] + os: [win32] + '@rollup/rollup-win32-ia32-msvc@4.18.0': resolution: {integrity: sha512-Txjh+IxBPbkUB9+SXZMpv+b/vnTEtFyfWZgJ6iyCmt2tdx0OF5WhFowLmnh8ENGNpfUlUZkdI//4IEmhwPieNg==} cpu: [ia32] os: [win32] + '@rollup/rollup-win32-ia32-msvc@4.20.0': + resolution: {integrity: sha512-GabekH3w4lgAJpVxkk7hUzUf2hICSQO0a/BLFA11/RMxQT92MabKAqyubzDZmMOC/hcJNlc+rrypzNzYl4Dx7A==} + cpu: [ia32] + os: [win32] + '@rollup/rollup-win32-x64-msvc@4.18.0': resolution: {integrity: sha512-UOo5FdvOL0+eIVTgS4tIdbW+TtnBLWg1YBCcU2KWM7nuNwRz9bksDX1bekJJCpu25N1DVWaCwnT39dVQxzqS8g==} cpu: [x64] os: [win32] + '@rollup/rollup-win32-x64-msvc@4.20.0': + resolution: {integrity: sha512-aJ1EJSuTdGnM6qbVC4B5DSmozPTqIag9fSzXRNNo+humQLG89XpPgdt16Ia56ORD7s+H8Pmyx44uczDQ0yDzpg==} + cpu: [x64] + os: [win32] + + '@sec-ant/readable-stream@0.4.1': + resolution: {integrity: sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==} + '@shikijs/core@1.6.4': resolution: {integrity: sha512-WTU9rzZae1p2v6LOxMf6LhtmZOkIHYYW160IuahUyJy7YXPPjyWZLR1ag+SgD22ZMxZtz1gfU6Tccc8t0Il/XA==} '@shikijs/transformers@1.6.4': resolution: {integrity: sha512-NqDt7gUg3ayVBnsipT/KoL1pqsVbsvT/2cB0pb5SG2q72qjAv9Lb5OP99pL//BMmI+sMTo+TeARntklyBu4mZQ==} + '@sindresorhus/is@6.3.1': + resolution: {integrity: sha512-FX4MfcifwJyFOI2lPoX7PQxCqx8BG1HCho7WdiXwpEQx1Ycij0JxkfYtGK7yqNScrZGSlt6RE6sw8QYoH7eKnQ==} + engines: {node: '>=16'} + + '@sindresorhus/merge-streams@2.3.0': + resolution: {integrity: sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==} + engines: {node: '>=18'} + '@sveltejs/adapter-auto@3.2.2': resolution: {integrity: sha512-Mso5xPCA8zgcKrv+QioVlqMZkyUQ5MjDJiEPuG/Z7cV/5tmwV7LmcVWk5tZ+H0NCOV1x12AsoSpt/CwFwuVXMA==} peerDependencies: @@ -1311,10 +2035,28 @@ packages: '@types/react-dom': optional: true + '@tokenizer/token@0.3.0': + resolution: {integrity: sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==} + '@tootallnate/once@2.0.0': resolution: {integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==} engines: {node: '>= 10'} + '@ts-morph/common@0.23.0': + resolution: {integrity: sha512-m7Lllj9n/S6sOkCkRftpM7L24uvmfXQFedlW/4hENcuJH1HHm9u5EgxZb9uVjQSCGrbBWBkOGgcTxNg36r6ywA==} + + '@tsconfig/node10@1.0.11': + resolution: {integrity: sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==} + + '@tsconfig/node12@1.0.11': + resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} + + '@tsconfig/node14@1.0.3': + resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} + + '@tsconfig/node16@1.0.4': + resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} + '@tsconfig/node20@20.1.4': resolution: {integrity: sha512-sqgsT69YFeLWf5NtJ4Xq/xAF8p4ZQHlmGW74Nu2tD4+g5fAsposc4ZfaaPixVu4y01BEiDCWLRDCvDM5JOsRxg==} @@ -1333,15 +2075,24 @@ packages: '@types/babel__traverse@7.20.6': resolution: {integrity: sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==} + '@types/bytes@3.1.4': + resolution: {integrity: sha512-A0uYgOj3zNc4hNjHc5lYUfJQ/HVyBXiUMKdXd7ysclaE6k9oJdavQzODHuwjpUu2/boCP8afjQYi8z/GtvNCWA==} + '@types/cookie@0.6.0': resolution: {integrity: sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==} + '@types/cookiejar@2.1.5': + resolution: {integrity: sha512-he+DHOWReW0nghN24E1WUqM0efK4kI9oTqDm6XmK8ZPe2djZ90BSNdGnIyCLzCPw7/pogPlGbzI2wHGGmi4O/Q==} + '@types/degit@2.8.6': resolution: {integrity: sha512-y0M7sqzsnHB6cvAeTCBPrCQNQiZe8U4qdzf8uBVmOWYap5MMTN/gB2iEqrIqFiYcsyvP74GnGD5tgsHttielFw==} '@types/estree@1.0.5': resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} + '@types/he@1.2.3': + resolution: {integrity: sha512-q67/qwlxblDzEDvzHhVkwc1gzVWxaNxeyHUBF4xElrvjL11O+Ytze+1fGpBHlr/H9myiBUaUXNnNPmBHxxfAcA==} + '@types/js-yaml@4.0.9': resolution: {integrity: sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg==} @@ -1351,12 +2102,18 @@ packages: '@types/linkify-it@5.0.0': resolution: {integrity: sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==} + '@types/lodash@4.17.7': + resolution: {integrity: sha512-8wTvZawATi/lsmNu10/j2hk1KEP0IvjubqPE3cu1Xz7xfXXt5oCq3SNUz4fMIP4XGF9Ky+Ue2tBA3hcS7LSBlA==} + '@types/markdown-it@14.1.1': resolution: {integrity: sha512-4NpsnpYl2Gt1ljyBGrKMxFYAYvpqbnnkgP/i/g+NLpjEUa3obn1XJCur9YbEXKDAkaXqsR1LbDnGEJ0MmKFxfg==} '@types/mdurl@2.0.0': resolution: {integrity: sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==} + '@types/methods@1.1.4': + resolution: {integrity: sha512-ymXWVrDiCxTBE3+RIrrP533E70eA+9qu7zdWoHuOmGujkYtzf4HQF96b8nwHLqhuf4ykX61IGRIB38CC6/sImQ==} + '@types/minimist@1.2.5': resolution: {integrity: sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==} @@ -1366,18 +2123,30 @@ packages: '@types/node@12.20.55': resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} + '@types/node@20.14.14': + resolution: {integrity: sha512-d64f00982fS9YoOgJkAMolK7MN8Iq3TDdVjchbYHdEmjth/DHowx82GnoA+tVUAN+7vxfYUgAzi+JXbKNd2SDQ==} + '@types/node@20.14.7': resolution: {integrity: sha512-uTr2m2IbJJucF3KUxgnGOZvYbN0QgkGyWxG6973HCpMYFy2KfcgYuIwkJQMQkt1VbBMlvWRbpshFTLxnxCZjKQ==} + '@types/node@22.1.0': + resolution: {integrity: sha512-AOmuRF0R2/5j1knA3c6G3HOk523Ga+l+ZXltX8SF1+5oqcXijjfTd8fY3XRZqSihEu9XhtQnKYLmkFaoxgsJHw==} + '@types/normalize-package-data@2.4.4': resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} + '@types/pluralize@0.0.33': + resolution: {integrity: sha512-JOqsl+ZoCpP4e8TDke9W79FDcSgPAR0l6pixx2JHkhnRjvShyYiAYw2LVsnA7K08Y6DeOnaU6ujmENO4os/cYg==} + '@types/prop-types@15.7.12': resolution: {integrity: sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==} '@types/pug@2.0.10': resolution: {integrity: sha512-Sk/uYFOBAB7mb74XcpizmH0KOR2Pv3D2Hmrh1Dmy5BmK3MpdSa5kqZcg6EKBdklU0bFXX9gCfzvpnyUehrPIuA==} + '@types/qs@6.9.15': + resolution: {integrity: sha512-uXHQKES6DQKKCLh441Xv/dwxOq1TVS3JPUMlEqoEglvlhR6Mxnlew/Xq/LRVHpLyk7iK3zODe1qYHIMltO7XGg==} + '@types/react-dom@18.3.0': resolution: {integrity: sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg==} @@ -1393,12 +2162,87 @@ packages: '@types/statuses@2.0.5': resolution: {integrity: sha512-jmIUGWrAiwu3dZpxntxieC+1n/5c3mjrImkmOSQ2NC5uP6cYO4aAZDdSmRcI5C1oiTmqlZGHC+/NmJrKogbP5A==} + '@types/superagent@8.1.8': + resolution: {integrity: sha512-nTqHJ2OTa7PFEpLahzSEEeFeqbMpmcN7OeayiOc7v+xk+/vyTKljRe+o4MPqSnPeRCMvtxuLG+5QqluUVQJOnA==} + + '@types/validator@13.12.0': + resolution: {integrity: sha512-nH45Lk7oPIJ1RVOF6JgFI6Dy0QpHEzq4QecZhvguxYPDwT8c93prCMqAtiIttm39voZ+DDR+qkNnMpJmMBRqag==} + '@types/web-bluetooth@0.0.20': resolution: {integrity: sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow==} '@types/wrap-ansi@3.0.0': resolution: {integrity: sha512-ltIpx+kM7g/MLRZfkbL7EsCEjfzCcScLpkg37eXEtx5kmrAKBkTJwd1GIAjDSL8wTpM6Hzn5YO4pSb91BEwu1g==} + '@typescript-eslint/eslint-plugin@6.21.0': + resolution: {integrity: sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + '@typescript-eslint/parser': ^6.0.0 || ^6.0.0-alpha + eslint: ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/parser@6.21.0': + resolution: {integrity: sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/scope-manager@6.21.0': + resolution: {integrity: sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==} + engines: {node: ^16.0.0 || >=18.0.0} + + '@typescript-eslint/type-utils@6.21.0': + resolution: {integrity: sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/types@6.21.0': + resolution: {integrity: sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==} + engines: {node: ^16.0.0 || >=18.0.0} + + '@typescript-eslint/typescript-estree@6.21.0': + resolution: {integrity: sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/utils@6.21.0': + resolution: {integrity: sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + + '@typescript-eslint/visitor-keys@6.21.0': + resolution: {integrity: sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==} + engines: {node: ^16.0.0 || >=18.0.0} + + '@ungap/structured-clone@1.2.0': + resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} + + '@vinejs/compiler@2.5.0': + resolution: {integrity: sha512-hg4ekaB5Y2zh+IWzBiC/WCDWrIfpVnKu/ubUvelKlidc/VbulsexoFRw5kJGHZenPVI5YzNnDeTdYSALkTV7jQ==} + engines: {node: '>=18.0.0'} + + '@vinejs/vine@2.1.0': + resolution: {integrity: sha512-09aJ2OauxpblqiNqd8qC9RAzzm5SV6fTqZhE4e25j4cM7fmNoXRTjM7Oo8llFADMO4eSA44HqYEO3mkRRYdbYw==} + engines: {node: '>=18.16.0'} + '@vitejs/plugin-react-swc@3.7.0': resolution: {integrity: sha512-yrknSb3Dci6svCd/qhHqhFPDSw0QtjumcqdKMoNNzmOl5lMXTTiqzjWtG4Qask2HdvvzaNgSunbQGet8/GrKdA==} peerDependencies: @@ -1552,9 +2396,25 @@ packages: resolution: {integrity: sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==} deprecated: Use your platform's native atob() and btoa() methods instead + abort-controller@3.0.0: + resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} + engines: {node: '>=6.5'} + + abstract-logging@2.0.1: + resolution: {integrity: sha512-2BjRTZxTPvheOvGbBslFSYOUkr+SjPtOnrLP33f+VIWLzezQpZcqVg7ja3L4dBXmzzgwT+a029jRx5PCi3JuiA==} + + accepts@1.3.8: + resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} + engines: {node: '>= 0.6'} + acorn-globals@7.0.1: resolution: {integrity: sha512-umOSDSDrfHbTNPuNpC2NSnnA3LUrqpevPb4T9jRx4MagXNS0rs+gwiTcAvqCRmsD6utzsrzNt+ebm00SNWiC3Q==} + acorn-jsx@5.3.2: + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + acorn-walk@8.3.3: resolution: {integrity: sha512-MxXdReSRhGO7VlFe1bRG/oI7/mdLV9B9JJT0N8vZOhF7gFRR5l3M8W9G8JxmKV+JC5mGqJ0QvqfSOLsCPa4nUw==} engines: {node: '>=0.4.0'} @@ -1576,6 +2436,9 @@ packages: resolution: {integrity: sha512-0poP0T7el6Vq3rstR8Mn4V/IQrpBLO6POkUSrN7RhyY+GF/InCFShQzsQ39T25gkHhLgSLByyAz+Kjb+c2L98w==} engines: {node: '>=12'} + ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + algoliasearch@4.23.3: resolution: {integrity: sha512-Le/3YgNvjW9zxIQMRhUHuhiUjAlKY/zsdZpfq4dlLqg6mEm0nL6yk+7f2hDOtLpxsgE4jSzDmvHL7nXdBp5feg==} @@ -1587,6 +2450,10 @@ packages: resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} engines: {node: '>=8'} + ansi-escapes@7.0.0: + resolution: {integrity: sha512-GdYO7a61mR0fOlAsvC9/rIHf7L96sBc6dEWzeOu+KAea5bZyQRPIpojrVoI4AXGJS/ycu/fBTdLrUkA4ODrvjw==} + engines: {node: '>=18'} + ansi-regex@5.0.1: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} @@ -1607,10 +2474,20 @@ packages: resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} engines: {node: '>=10'} + ansi-styles@6.2.1: + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + engines: {node: '>=12'} + + any-promise@1.3.0: + resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} + anymatch@3.1.3: resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} engines: {node: '>= 8'} + arg@4.1.3: + resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} + argparse@1.0.10: resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} @@ -1640,6 +2517,9 @@ packages: resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} engines: {node: '>=0.10.0'} + as-table@1.0.55: + resolution: {integrity: sha512-xvsWESUJn0JN421Xb9MQw6AsMHRCUknCe0Wjlxvjud80mU4E6hQf1A6NzQKcYNmYw62MfzEtXc+badstZP3JpQ==} + asap@2.0.6: resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==} @@ -1650,6 +2530,10 @@ packages: asynckit@0.4.0: resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + atomic-sleep@1.0.0: + resolution: {integrity: sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==} + engines: {node: '>=8.0.0'} + available-typed-arrays@1.0.7: resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} engines: {node: '>= 0.4'} @@ -1664,6 +2548,13 @@ packages: balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + + basic-auth@2.0.1: + resolution: {integrity: sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==} + engines: {node: '>= 0.8'} + better-path-resolve@1.0.0: resolution: {integrity: sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g==} engines: {node: '>=4'} @@ -1698,10 +2589,27 @@ packages: resolution: {integrity: sha512-Db1SbgBS/fg/392AblrMJk97KggmvYhr4pB5ZIMTWtaivCPMWLkmb7m21cJvpvgK+J3nsU2CmmixNBZx4vFj/w==} engines: {node: '>=8.0.0'} + buffer@6.0.3: + resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} + + builtin-modules@3.3.0: + resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} + engines: {node: '>=6'} + + bundle-require@5.0.0: + resolution: {integrity: sha512-GuziW3fSSmopcx4KRymQEJVbZUfqlCqcq7dvs6TYwKRZiegK/2buMxQTPs6MGlNv50wms1699qYO54R8XfRX4w==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + peerDependencies: + esbuild: '>=0.18' + busboy@1.6.0: resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} engines: {node: '>=10.16.0'} + bytes@3.1.2: + resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} + engines: {node: '>= 0.8'} + cac@6.7.14: resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} engines: {node: '>=8'} @@ -1713,6 +2621,10 @@ packages: call-me-maybe@1.0.2: resolution: {integrity: sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ==} + callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + camelcase-keys@6.2.2: resolution: {integrity: sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==} engines: {node: '>=8'} @@ -1729,9 +2641,17 @@ packages: resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} engines: {node: '>=10'} + camelcase@8.0.0: + resolution: {integrity: sha512-8WB3Jcas3swSvjIeA2yvCJ+Miyz5l1ZmB6HFb9R1317dt9LCQoswg/BGrmAmkWVEszSrrg4RwmO46qIm2OEnSA==} + engines: {node: '>=16'} + caniuse-lite@1.0.30001646: resolution: {integrity: sha512-dRg00gudiBDDTmUhClSdv3hqRfpbOnU28IpI1T6PBTLWa+kOj0681C8uML3PifYfREuBrVjDGhL3adYpBT6spw==} + case-anything@2.1.13: + resolution: {integrity: sha512-zlOQ80VrQ2Ue+ymH5OuM/DlDq64mEm+B9UTdHULv5osUMD6HalNTblf2b1u/m6QecjsnOkBpqVZ+XPwIVsy7Ng==} + engines: {node: '>=12.13'} + chai@5.1.1: resolution: {integrity: sha512-pT1ZgP8rPNqUgieVaEY+ryQr6Q4HXNg8Ei9UnLUrjN4IA7dvQC5JB+/kxVcPNDHyBcc/26CXPkbNzq3qwrOEKA==} engines: {node: '>=12'} @@ -1747,6 +2667,10 @@ packages: chardet@0.7.0: resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} + check-disk-space@3.4.0: + resolution: {integrity: sha512-drVkSqfwA+TvuEhFipiR1OC9boEGZL5RrWvVsOthdcvQNXyCCuKkEiTOTXZ7qxSf/GLwq4GvzfrQD/Wz325hgw==} + engines: {node: '>=16'} + check-error@2.1.1: resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==} engines: {node: '>= 16'} @@ -1759,14 +2683,34 @@ packages: resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} engines: {node: '>=8'} + clean-regexp@1.0.0: + resolution: {integrity: sha512-GfisEZEJvzKrmGWkvfhgzcz/BllN1USeqD2V6tg14OAOgaCD2Z/PUEuxnAZ/nPvmaHRG7a8y77p1T/IRQ4D1Hw==} + engines: {node: '>=4'} + clean-stack@4.2.0: resolution: {integrity: sha512-LYv6XPxoyODi36Dp976riBtSY27VmFo+MKqEU9QCCWyTrdEPDog+RWA7xQWHi6Vbp61j5c4cdzzX1NidnwtUWg==} engines: {node: '>=12'} + cli-boxes@3.0.0: + resolution: {integrity: sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==} + engines: {node: '>=10'} + + cli-cursor@5.0.0: + resolution: {integrity: sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==} + engines: {node: '>=18'} + cli-spinners@2.9.2: resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} engines: {node: '>=6'} + cli-table3@0.6.5: + resolution: {integrity: sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ==} + engines: {node: 10.* || >= 12.*} + + cli-truncate@4.0.0: + resolution: {integrity: sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==} + engines: {node: '>=18'} + cli-width@4.1.0: resolution: {integrity: sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==} engines: {node: '>= 12'} @@ -1785,6 +2729,9 @@ packages: resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} engines: {node: '>=0.8'} + code-block-writer@13.0.2: + resolution: {integrity: sha512-XfXzAGiStXSmCIwrkdfvc7FS5Dtj8yelCtyOf2p2skCAfvLd6zu0rGzuS9NSCO3bq1JKpFZ7tbKdKlcd5occQA==} + code-red@1.0.4: resolution: {integrity: sha512-7qJWqItLA8/VPVlKJlFXU+NBlo/qyfs39aJcuMT/2ere32ZqvF5OSxgdM5xOfJJ7O429gg2HM47y8v9P+9wrNw==} @@ -1804,14 +2751,28 @@ packages: colorette@1.4.0: resolution: {integrity: sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==} + colorette@2.0.19: + resolution: {integrity: sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==} + + colorette@2.0.20: + resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} + combined-stream@1.0.8: resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} engines: {node: '>= 0.8'} + commander@10.0.1: + resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} + engines: {node: '>=14'} + commander@11.1.0: resolution: {integrity: sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==} engines: {node: '>=16'} + commander@4.1.1: + resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} + engines: {node: '>= 6'} + component-emitter@1.3.1: resolution: {integrity: sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==} @@ -1821,6 +2782,14 @@ packages: concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + consola@3.2.3: + resolution: {integrity: sha512-I5qxpzLv+sJhTVEoLYNcTW+bThDCPsit0vLNKShZx6rLtpilNpmmeTPaeqJb9ZE9dV3DGaeby6Vuhrw38WjeyQ==} + engines: {node: ^14.18.0 || >=16.10.0} + + content-disposition@0.5.4: + resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} + engines: {node: '>= 0.6'} + convert-source-map@2.0.0: resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} @@ -1835,6 +2804,17 @@ packages: cookiejar@2.1.4: resolution: {integrity: sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw==} + copy-file@11.0.0: + resolution: {integrity: sha512-mFsNh/DIANLqFt5VHZoGirdg7bK5+oTWlhnGu6tgRhzBlnEKWaPX2xrFaLltii/6rmhqFMJqffUgknuRdpYlHw==} + engines: {node: '>=18'} + + cpy@11.1.0: + resolution: {integrity: sha512-QGHetPSSuprVs+lJmMDcivvrBwTKASzXQ5qxFvRC2RFESjjod71bDvFvhxTjDgkNjrrb72AI6JPjfYwxrIy33A==} + engines: {node: '>=18'} + + create-require@1.1.1: + resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} + cross-spawn@5.1.0: resolution: {integrity: sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==} @@ -1872,6 +2852,9 @@ packages: resolution: {integrity: sha512-QTaY0XjjhTQOdguARF0lGKm5/mEq9PD9/VhZZegHDIBq2tQwgNpHc3dneD4mGo2iJs+fTKv5Bp0fZ+BRuY3Z0g==} engines: {node: '>= 0.1.90'} + data-uri-to-buffer@2.0.2: + resolution: {integrity: sha512-ND9qDTLc6diwj+Xe5cdAgVTbLVdXbtxTJRXRhli8Mowuaan+0EJOtdqJ0QCHNSSPyoXGx9HX2/VMnKeC34AChA==} + data-urls@3.0.2: resolution: {integrity: sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ==} engines: {node: '>=12'} @@ -1891,9 +2874,24 @@ packages: dataloader@1.4.0: resolution: {integrity: sha512-68s5jYdlvasItOJnCuI2Q9s4q98g0pCyL3HrcKJu8KNugUl8ahgmZYg38ysLTgQjjXX3H8CJLkAvWrclWfcalw==} + dateformat@4.6.3: + resolution: {integrity: sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA==} + + dayjs@1.11.12: + resolution: {integrity: sha512-Rt2g+nTbLlDWZTwwrIXjy9MeiZmSDI375FvZs72ngxx8PDC6YXOeR3q5LAuPzjZQxhiWdRKac7RKV+YyQYfYIg==} + de-indent@1.0.2: resolution: {integrity: sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==} + debug@4.3.4: + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + debug@4.3.5: resolution: {integrity: sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==} engines: {node: '>=6.0'} @@ -1927,10 +2925,21 @@ packages: decimal.js@10.4.3: resolution: {integrity: sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==} + dedent@1.5.3: + resolution: {integrity: sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ==} + peerDependencies: + babel-plugin-macros: ^3.1.0 + peerDependenciesMeta: + babel-plugin-macros: + optional: true + deep-eql@5.0.2: resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} engines: {node: '>=6'} + deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + deepmerge@4.3.1: resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} engines: {node: '>=0.10.0'} @@ -1964,10 +2973,18 @@ packages: resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} engines: {node: '>=0.4.0'} + depd@2.0.0: + resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} + engines: {node: '>= 0.8'} + dequal@2.0.3: resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} engines: {node: '>=6'} + destroy@1.2.0: + resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + detect-indent@6.1.0: resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} engines: {node: '>=8'} @@ -1978,10 +2995,21 @@ packages: dezalgo@1.0.4: resolution: {integrity: sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==} + diff@4.0.2: + resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} + engines: {node: '>=0.3.1'} + dir-glob@3.0.1: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} engines: {node: '>=8'} + dlv@1.1.3: + resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} + + doctrine@3.0.0: + resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} + engines: {node: '>=6.0.0'} + dom-accessibility-api@0.5.16: resolution: {integrity: sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==} @@ -1990,16 +3018,43 @@ packages: engines: {node: '>=12'} deprecated: Use your platform's native DOMException instead + dotenv@16.4.5: + resolution: {integrity: sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==} + engines: {node: '>=12'} + dotenv@8.6.0: resolution: {integrity: sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g==} engines: {node: '>=10'} + eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + + ee-first@1.1.1: + resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} + electron-to-chromium@1.4.807: resolution: {integrity: sha512-kSmJl2ZwhNf/bcIuCH/imtNOKlpkLDn2jqT5FJ+/0CXjhnFaOa9cOe9gHKKy71eM49izwuQjZhKk+lWQ1JxB7A==} + emittery@1.0.3: + resolution: {integrity: sha512-tJdCJitoy2lrC2ldJcqN4vkqJ00lT+tOWNT1hBJjO/3FDMJa5TTIiYGCKGkn/WfCyOzUMObeohbVTj00fhiLiA==} + engines: {node: '>=14.16'} + + emoji-regex@10.3.0: + resolution: {integrity: sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==} + emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + + encodeurl@2.0.0: + resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} + engines: {node: '>= 0.8'} + + end-of-stream@1.4.4: + resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} + enquirer@2.4.1: resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==} engines: {node: '>=8.6'} @@ -2008,6 +3063,10 @@ packages: resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} engines: {node: '>=0.12'} + environment@1.1.0: + resolution: {integrity: sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==} + engines: {node: '>=18'} + error-ex@1.3.2: resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} @@ -2023,6 +3082,9 @@ packages: resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} engines: {node: '>= 0.4'} + es-module-lexer@1.5.4: + resolution: {integrity: sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==} + es-object-atoms@1.0.0: resolution: {integrity: sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==} engines: {node: '>= 0.4'} @@ -2051,6 +3113,11 @@ packages: engines: {node: '>=12'} hasBin: true + esbuild@0.23.0: + resolution: {integrity: sha512-1lvV17H2bMYda/WaFb2jLPeHU3zml2k4/yagNMG8Q/YtfMjCwEUZa2eXXMgZTVSL5q1n4H7sQ0X6CdJDqqeCFA==} + engines: {node: '>=18'} + hasBin: true + escalade@3.1.2: resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} engines: {node: '>=6'} @@ -2059,6 +3126,10 @@ packages: resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} engines: {node: '>=0.8.0'} + escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + escape-string-regexp@5.0.0: resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} engines: {node: '>=12'} @@ -2068,14 +3139,81 @@ packages: engines: {node: '>=6.0'} hasBin: true + eslint-compat-utils@0.5.1: + resolution: {integrity: sha512-3z3vFexKIEnjHE3zCMRo6fn/e44U7T1khUjg+Hp0ZQMCigh28rALD0nPFBcGZuiLC5rLZa2ubQHDRln09JfU2Q==} + engines: {node: '>=12'} + peerDependencies: + eslint: '>=6.0.0' + + eslint-config-prettier@8.10.0: + resolution: {integrity: sha512-SM8AMJdeQqRYT9O9zguiruQZaN7+z+E4eAP9oiLNGKMtomwaB1E9dcgUD6ZAn/eQAb52USbvezbiljfZUhbJcg==} + hasBin: true + peerDependencies: + eslint: '>=7.0.0' + + eslint-plugin-jsonc@2.16.0: + resolution: {integrity: sha512-Af/ZL5mgfb8FFNleH6KlO4/VdmDuTqmM+SPnWcdoWywTetv7kq+vQe99UyQb9XO3b0OWLVuTH7H0d/PXYCMdSg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: '>=6.0.0' + + eslint-plugin-prettier@5.2.1: + resolution: {integrity: sha512-gH3iR3g4JfF+yYPaJYkN7jEl9QbweL/YfkoRlNnuIEHEz1vHVlCmWOS+eGGiRuzHQXdJFCOTxRgvju9b8VUmrw==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + '@types/eslint': '>=8.0.0' + eslint: '>=8.0.0' + eslint-config-prettier: '*' + prettier: '>=3.0.0' + peerDependenciesMeta: + '@types/eslint': + optional: true + eslint-config-prettier: + optional: true + + eslint-plugin-unicorn@47.0.0: + resolution: {integrity: sha512-ivB3bKk7fDIeWOUmmMm9o3Ax9zbMz1Bsza/R2qm46ufw4T6VBFBaJIR1uN3pCKSmSXm8/9Nri8V+iUut1NhQGA==} + engines: {node: '>=16'} + peerDependencies: + eslint: '>=8.38.0' + + eslint-scope@7.2.2: + resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint-visitor-keys@3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint@8.57.0: + resolution: {integrity: sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + hasBin: true + esm-env@1.0.0: resolution: {integrity: sha512-Cf6VksWPsTuW01vU9Mk/3vRue91Zevka5SjyNf3nEpokFRuqt/KjUQoGAwq9qMmhpLTHmXzSIrFRw8zxWzmFBA==} + esm@3.2.25: + resolution: {integrity: sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==} + engines: {node: '>=6'} + + espree@9.6.1: + resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + esprima@4.0.1: resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} engines: {node: '>=4'} hasBin: true + esquery@1.6.0: + resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} + engines: {node: '>=0.10'} + + esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + estraverse@5.3.0: resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} engines: {node: '>=4.0'} @@ -2090,6 +3228,22 @@ packages: resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} engines: {node: '>=0.10.0'} + etag@1.8.1: + resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} + engines: {node: '>= 0.6'} + + event-target-shim@5.0.1: + resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} + engines: {node: '>=6'} + + events@3.3.0: + resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} + engines: {node: '>=0.8.x'} + + execa@5.1.1: + resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} + engines: {node: '>=10'} + execa@8.0.1: resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} engines: {node: '>=16.17'} @@ -2101,19 +3255,47 @@ packages: resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} engines: {node: '>=4'} + fast-copy@3.0.2: + resolution: {integrity: sha512-dl0O9Vhju8IrcLndv2eU4ldt1ftXMqqfgN4H1cpmGV7P6jeB9FwpN9a2c8DPGE1Ys88rNUJVYDHq73CGAGOPfQ==} + fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + fast-diff@1.3.0: + resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==} + fast-glob@3.3.2: resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} engines: {node: '>=8.6.0'} + fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + + fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + + fast-redact@3.5.0: + resolution: {integrity: sha512-dwsoQlS7h9hMeYUq1W++23NDcBLV4KqONnITDV9DjfS3q1SgDGVrBdvvTLUotWtPSD7asWDV9/CmsZPy8Hf70A==} + engines: {node: '>=6'} + fast-safe-stringify@2.1.1: resolution: {integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==} + fastest-levenshtein@1.0.16: + resolution: {integrity: sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==} + engines: {node: '>= 4.9.1'} + fastq@1.17.1: resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} + file-entry-cache@6.0.1: + resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} + engines: {node: ^10.12.0 || >=12.0.0} + + file-type@19.4.0: + resolution: {integrity: sha512-7N7Pu0UzVYV8YP6WXhN+kcvtp/P00eWKVo76nMAK+RasRO/ICzuJzjoG+aSLqbY6khDAFQuqsyImGaSdkm49Iw==} + engines: {node: '>=18'} + fill-range@7.0.1: resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} engines: {node: '>=8'} @@ -2122,6 +3304,10 @@ packages: resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} engines: {node: '>=8'} + find-up-simple@1.0.0: + resolution: {integrity: sha512-q7Us7kcjj2VMePAa02hDAF6d+MzsdsAWEwYyOpwUtlerRBkOEPBCRZrAV4XfcSN8fHAgaD0hP7miwoay6DCprw==} + engines: {node: '>=18'} + find-up@4.1.0: resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} engines: {node: '>=8'} @@ -2133,6 +3319,17 @@ packages: find-yarn-workspace-root2@1.2.16: resolution: {integrity: sha512-hr6hb1w8ePMpPVUK39S4RlwJzi+xPLuVuG8XlwXU3KD5Yn3qgBWVfy3AzNlDhWvE1EORCE65/Qm26rFQt3VLVA==} + flat-cache@3.2.0: + resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} + engines: {node: ^10.12.0 || >=12.0.0} + + flatted@3.3.1: + resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} + + flattie@1.1.1: + resolution: {integrity: sha512-9UbaD6XdAL97+k/n+N7JwX46K/M6Zc6KcFYskrYL8wbBV/Uyk0CTAMY0VT+qiK5PM7AIc9aTWYtq65U7T+aCNQ==} + engines: {node: '>=8'} + focus-trap@7.5.4: resolution: {integrity: sha512-N7kHdlgsO/v+iD/dMoJKtsSqs5Dz/dXZVebRgJw23LDk+jMi/974zyiOYDziY2JPp8xivq9BmUGwIJMiuSBi7w==} @@ -2148,13 +3345,28 @@ packages: for-each@0.3.3: resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} + foreground-child@3.3.0: + resolution: {integrity: sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==} + engines: {node: '>=14'} + form-data@4.0.0: resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} engines: {node: '>= 6'} + formidable@2.1.2: + resolution: {integrity: sha512-CM3GuJ57US06mlpQ47YcunuUZ9jpm8Vx+P2CGt2j7HpgkKZO/DJYQ0Bobim8G6PFQmK5lOqOOdUXboU+h73A4g==} + formidable@3.5.1: resolution: {integrity: sha512-WJWKelbRHN41m5dumb0/k8TeAx7Id/y3a+Z7QfhxP/htI9Js5zYaEDtG8uMgG0vM0lOlqnmjE99/kfpOYi/0Og==} + forwarded@0.2.0: + resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} + engines: {node: '>= 0.6'} + + fresh@0.5.2: + resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} + engines: {node: '>= 0.6'} + fs-extra@11.2.0: resolution: {integrity: sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==} engines: {node: '>=14.14'} @@ -2198,6 +3410,10 @@ packages: resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} engines: {node: 6.* || 8.* || >= 10.*} + get-east-asian-width@1.2.0: + resolution: {integrity: sha512-2nk+7SIVb14QrgXFHcm84tD4bKQz0RxPuMT8Ag5KPOq7J5fEmAg0UbXdTOSHqNuHSU28k55qnceesxXRZGzKWA==} + engines: {node: '>=18'} + get-func-name@2.0.2: resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} @@ -2205,18 +3421,48 @@ packages: resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} engines: {node: '>= 0.4'} + get-package-type@0.1.0: + resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} + engines: {node: '>=8.0.0'} + + get-port@7.1.0: + resolution: {integrity: sha512-QB9NKEeDg3xxVwCCwJQ9+xycaz6pBB6iQ76wiWMl1927n0Kir6alPiP+yuiICLLU4jpMe08dXfpebuQppFA2zw==} + engines: {node: '>=16'} + + get-source@2.0.12: + resolution: {integrity: sha512-X5+4+iD+HoSeEED+uwrQ07BOQr0kEDFMVqqpBuI+RaZBpBpHCuXxo70bjar6f0b0u/DQJsJ7ssurpP0V60Az+w==} + + get-stream@6.0.1: + resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} + engines: {node: '>=10'} + get-stream@8.0.1: resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} engines: {node: '>=16'} + get-stream@9.0.1: + resolution: {integrity: sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==} + engines: {node: '>=18'} + get-symbol-description@1.0.2: resolution: {integrity: sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==} engines: {node: '>= 0.4'} + getopts@2.3.0: + resolution: {integrity: sha512-5eDf9fuSXwxBL6q5HX+dhDj+dslFGWzU5thZ9kNKUkcPtaPdatmUFKwHFrLb/uf/WpA4BHET+AX3Scl56cAjpA==} + glob-parent@5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} + glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + + glob@10.4.5: + resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} + hasBin: true + glob@7.2.3: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} deprecated: Glob versions prior to v9 are no longer supported @@ -2225,6 +3471,10 @@ packages: resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} engines: {node: '>=4'} + globals@13.24.0: + resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} + engines: {node: '>=8'} + globalthis@1.0.4: resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} engines: {node: '>= 0.4'} @@ -2240,6 +3490,10 @@ packages: resolution: {integrity: sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + globby@14.0.2: + resolution: {integrity: sha512-s3Fq41ZVh7vbbe2PN3nrW7yC7U7MFVc5c98/iTl9c2GawNMKx/J648KQRW6WKkuU8GIbbh2IXfIRQjOZnXcTnw==} + engines: {node: '>=18'} + globrex@0.1.2: resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==} @@ -2252,6 +3506,9 @@ packages: grapheme-splitter@1.0.4: resolution: {integrity: sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==} + graphemer@1.4.0: + resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + graphql@16.8.2: resolution: {integrity: sha512-cvVIBILwuoSyD54U4cF/UXDh5yAobhNV/tPygI4lZhgOIJQE/WLWC4waBRb4I6bDVYb3OVx3lfHbaQOEoUD5sg==} engines: {node: ^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0} @@ -2302,6 +3559,9 @@ packages: headers-polyfill@4.0.3: resolution: {integrity: sha512-IScLbePpkvO846sIwOtOTDjutRMWdXdJmXdMvk6gCBHxFO8d+QKOQedyZSxFTTFYRSmlgSTDtXqqq4pcenBXLQ==} + help-me@5.0.0: + resolution: {integrity: sha512-7xgomUX6ADmcYzFik0HzAxh/73YlKR9bmFzf51CZwR+b6YtzU2m0u49hQCqV6SvlqIqsaxovfwdvbnsw3b/zpg==} + hexoid@1.0.0: resolution: {integrity: sha512-QFLV0taWQOZtvIRIAdBChesmogZrtuXvVWsFHZTk2SU+anspqZ2vMnoLg7IE1+Uk16N19APic1BuF8bC8c2m5g==} engines: {node: '>=8'} @@ -2316,10 +3576,21 @@ packages: resolution: {integrity: sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==} engines: {node: '>=10'} + hosted-git-info@7.0.2: + resolution: {integrity: sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==} + engines: {node: ^16.14.0 || >=18.0.0} + + hot-hook@0.2.6: + resolution: {integrity: sha512-sMqK0sejkw+gUh/WiyqYBk8AKB2qM1a1wsC4v0JlnK/1x8CUFF60oPawZy/EOtLmN1Om1GTGVJLIwShxOnuI9Q==} + html-encoding-sniffer@3.0.0: resolution: {integrity: sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==} engines: {node: '>=12'} + http-errors@2.0.0: + resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} + engines: {node: '>= 0.8'} + http-proxy-agent@5.0.0: resolution: {integrity: sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==} engines: {node: '>= 6'} @@ -2335,6 +3606,10 @@ packages: human-id@1.0.2: resolution: {integrity: sha512-UNopramDEhHJD+VR+ehk8rOslwSfByxPIZyJRfV739NDhN5LF1fa1MqnzKm2lGTQRjNrjK19Q5fhkgIfjlVUKw==} + human-signals@2.1.0: + resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} + engines: {node: '>=10.17.0'} + human-signals@5.0.0: resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} engines: {node: '>=16.17.0'} @@ -2347,13 +3622,28 @@ packages: resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} engines: {node: '>=0.10.0'} + ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + + igniculus@1.5.0: + resolution: {integrity: sha512-vhj2J/cSzNg2G5tcK4Z1KZdeYmQa5keoxFULUYAxctK/zHJb1oraO7noCqnJxKe1b2eZdiiaSL1IHPOFAI8UYQ==} + engines: {node: '>=4.0.0'} + ignore@5.3.1: resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==} engines: {node: '>= 4'} + import-fresh@3.3.0: + resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} + engines: {node: '>=6'} + import-meta-resolve@4.1.0: resolution: {integrity: sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw==} + imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + indent-string@4.0.0: resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} engines: {node: '>=8'} @@ -2366,6 +3656,10 @@ packages: resolution: {integrity: sha512-MWDKS3AS1bGCHLBA2VLImJz42f7bJh8wQsTGCzI3j519/CASStoDONUBVz2I/VID0MpiX3SGSnbOD2xUalbE5g==} engines: {node: '>=18'} + inflation@2.1.0: + resolution: {integrity: sha512-t54PPJHG1Pp7VQvxyVCJ9mBbjG3Hqryges9bXoOO6GExCPa+//i/d5GSuFtpx3ALLd7lgIAur6zrIlBQyJuMlQ==} + engines: {node: '>= 0.8.0'} + inflight@1.0.6: resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. @@ -2377,6 +3671,14 @@ packages: resolution: {integrity: sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==} engines: {node: '>= 0.4'} + interpret@2.2.0: + resolution: {integrity: sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==} + engines: {node: '>= 0.10'} + + ipaddr.js@1.9.1: + resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} + engines: {node: '>= 0.10'} + is-array-buffer@3.0.4: resolution: {integrity: sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==} engines: {node: '>= 0.4'} @@ -2395,6 +3697,10 @@ packages: resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} engines: {node: '>= 0.4'} + is-builtin-module@3.2.1: + resolution: {integrity: sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==} + engines: {node: '>=6'} + is-callable@1.2.7: resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} engines: {node: '>= 0.4'} @@ -2418,6 +3724,14 @@ packages: resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} engines: {node: '>=8'} + is-fullwidth-code-point@4.0.0: + resolution: {integrity: sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==} + engines: {node: '>=12'} + + is-fullwidth-code-point@5.0.0: + resolution: {integrity: sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA==} + engines: {node: '>=18'} + is-glob@4.0.3: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'} @@ -2441,6 +3755,10 @@ packages: resolution: {integrity: sha512-kyiNFFLU0Ampr6SDZitD/DwUo4Zs1nSdnygUBqsu3LooL00Qvb5j+UnvApUn/TTj1J3OuE6BTdQ5rudKmU2ZaA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + is-path-inside@3.0.3: + resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} + engines: {node: '>=8'} + is-path-inside@4.0.0: resolution: {integrity: sha512-lJJV/5dYS+RcL8uQdBDW9c9uWFLLBNRyFhnAKXw5tVqLlKZ4RMGZKv+YQ/IA3OhD+RpbJa1LLFM1FQPGyIXvOA==} engines: {node: '>=12'} @@ -2463,10 +3781,18 @@ packages: resolution: {integrity: sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==} engines: {node: '>= 0.4'} + is-stream@2.0.1: + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} + engines: {node: '>=8'} + is-stream@3.0.0: resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + is-stream@4.0.1: + resolution: {integrity: sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==} + engines: {node: '>=18'} + is-string@1.0.7: resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} engines: {node: '>= 0.4'} @@ -2496,6 +3822,13 @@ packages: isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + jackspeak@3.4.3: + resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} + + joycon@3.1.1: + resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} + engines: {node: '>=10'} + js-levenshtein@1.1.6: resolution: {integrity: sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g==} engines: {node: '>=0.10.0'} @@ -2520,11 +3853,23 @@ packages: canvas: optional: true + jsesc@0.5.0: + resolution: {integrity: sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==} + hasBin: true + jsesc@2.5.2: resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} engines: {node: '>=4'} hasBin: true + jsesc@3.0.2: + resolution: {integrity: sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==} + engines: {node: '>=6'} + hasBin: true + + json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + json-parse-even-better-errors@2.3.1: resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} @@ -2533,20 +3878,40 @@ packages: engines: {node: '>=10'} deprecated: Please switch to @apidevtools/json-schema-ref-parser + json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + json-schema-traverse@1.0.0: resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + json5@2.2.3: resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} engines: {node: '>=6'} hasBin: true + jsonc-eslint-parser@2.4.0: + resolution: {integrity: sha512-WYDyuc/uFcGp6YtM2H0uKmUwieOuzeE/5YocFJLnLfclZ4inf3mRn8ZVy1s7Hxji7Jxm6Ss8gqpexD/GlKoGgg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + jsonfile@4.0.0: resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} jsonfile@6.1.0: resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} + jsonschema@1.4.1: + resolution: {integrity: sha512-S6cATIPVv1z0IlxdN+zUk5EPjkGCdnhN4wVSBlvoUO1tOLJootbo9CquNJmbIh4yikWHiUedhRYrNPn1arpEmQ==} + + junk@4.0.1: + resolution: {integrity: sha512-Qush0uP+G8ZScpGMZvHUiRfI0YBWuB3gVBYlI0v0vvOJt5FLicco+IkP0a50LqTTQhmts/m6tP5SWE+USyIvcQ==} + engines: {node: '>=12.20'} + + keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + kind-of@6.0.3: resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} engines: {node: '>=0.10.0'} @@ -2555,9 +3920,53 @@ packages: resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} engines: {node: '>=6'} + knex-dynamic-connection@3.2.0: + resolution: {integrity: sha512-+j6KeUSim0FR8EobOqA1a/TZbN9mahjzHzJgOfQVkv6PUnSqJp70c/5n63M2YVNgNHETyBIUhV8stuQ0T/mG3g==} + engines: {node: '>=14.0.0'} + + knex@3.1.0: + resolution: {integrity: sha512-GLoII6hR0c4ti243gMs5/1Rb3B+AjwMOfjYm97pu0FOQa7JH56hgBxYf5WK2525ceSbBY1cjeZ9yk99GPMB6Kw==} + engines: {node: '>=16'} + hasBin: true + peerDependencies: + better-sqlite3: '*' + mysql: '*' + mysql2: '*' + pg: '*' + pg-native: '*' + sqlite3: '*' + tedious: '*' + peerDependenciesMeta: + better-sqlite3: + optional: true + mysql: + optional: true + mysql2: + optional: true + pg: + optional: true + pg-native: + optional: true + sqlite3: + optional: true + tedious: + optional: true + + levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + + lilconfig@3.1.2: + resolution: {integrity: sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==} + engines: {node: '>=14'} + lines-and-columns@1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + load-tsconfig@0.2.5: + resolution: {integrity: sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + load-yaml-file@0.2.0: resolution: {integrity: sha512-OfCBkGEw4nN6JLtgRidPX6QxjBQGQf72q3si2uvqyFEMbycSFFHwAZeXx6cJgFM9wmLrf9zBwCP3Ivqa+LLZPw==} engines: {node: '>=6'} @@ -2576,9 +3985,22 @@ packages: lodash.isequal@4.5.0: resolution: {integrity: sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==} + lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + + lodash.sortby@4.7.0: + resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==} + lodash.startcase@4.4.0: resolution: {integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==} + lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + + log-update@6.1.0: + resolution: {integrity: sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==} + engines: {node: '>=18'} + loose-envify@1.4.0: resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} hasBin: true @@ -2586,6 +4008,9 @@ packages: loupe@3.1.1: resolution: {integrity: sha512-edNu/8D5MKVfGVFRhFf8aAxiTM6Wumfz5XsaatSxlD3w4R1d/WEKUTydCdPGbl9K7QG/Ca3GnDV2sIKIpXRQcw==} + lru-cache@10.4.3: + resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + lru-cache@4.1.5: resolution: {integrity: sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==} @@ -2596,6 +4021,10 @@ packages: resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} engines: {node: '>=10'} + luxon@3.5.0: + resolution: {integrity: sha512-rh+Zjr6DNfUYR3bPwJEnuwDdqMbxZW7LOQfUN4B54+Cl+0o5zaU9RJ6bcidfDtC1cWCZXQ+nvX8bf6bAji37QQ==} + engines: {node: '>=12'} + lz-string@1.5.0: resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==} hasBin: true @@ -2606,6 +4035,9 @@ packages: magic-string@0.30.11: resolution: {integrity: sha512-+Wri9p0QHMy+545hKww7YAu5NyzF8iomPL/RQazugQ9+Ez4Ic3mERMd8ZTX5rfK944j+560ZJi8iAwgak1Ac7A==} + make-error@1.3.6: + resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} + map-obj@1.0.1: resolution: {integrity: sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==} engines: {node: '>=0.10.0'} @@ -2620,6 +4052,18 @@ packages: mdn-data@2.0.30: resolution: {integrity: sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==} + media-typer@0.3.0: + resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} + engines: {node: '>= 0.6'} + + media-typer@1.1.0: + resolution: {integrity: sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==} + engines: {node: '>= 0.8'} + + memoize@10.0.0: + resolution: {integrity: sha512-H6cBLgsi6vMWOcCpvVCdFFnl3kerEXbrYh9q+lY6VXvQSmM6CkmV08VOwT+WE2tzIEqRPFfAq3fm4v/UIW6mSA==} + engines: {node: '>=18'} + meow@10.1.5: resolution: {integrity: sha512-/d+PQ4GKmGvM9Bee/DPa8z3mXs/pkvJE2KEThngVNOqtmljC6K7NMPxtc2JeZYTmpWb9k/TmxjeL18ez3h7vCw==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -2660,10 +4104,18 @@ packages: engines: {node: '>=4.0.0'} hasBin: true + mimic-fn@2.1.0: + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} + engines: {node: '>=6'} + mimic-fn@4.0.0: resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} engines: {node: '>=12'} + mimic-function@5.0.1: + resolution: {integrity: sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==} + engines: {node: '>=18'} + min-indent@1.0.1: resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} engines: {node: '>=4'} @@ -2675,6 +4127,10 @@ packages: resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} engines: {node: '>=10'} + minimatch@9.0.3: + resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} + engines: {node: '>=16 || 14 >=14.17'} + minimatch@9.0.5: resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} engines: {node: '>=16 || 14 >=14.17'} @@ -2686,6 +4142,10 @@ packages: minimist@1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + minipass@7.1.2: + resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} + engines: {node: '>=16 || 14 >=14.17'} + minisearch@6.3.0: resolution: {integrity: sha512-ihFnidEeU8iXzcVHy74dhkxh/dn8Dc08ERl0xwoMMGqp4+LvRSCgicb+zGqWthVokQKvCSxITlh3P08OzdTYCQ==} @@ -2700,6 +4160,11 @@ packages: resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} hasBin: true + mkdirp@3.0.1: + resolution: {integrity: sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==} + engines: {node: '>=10'} + hasBin: true + mri@1.2.0: resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} engines: {node: '>=4'} @@ -2724,15 +4189,29 @@ packages: muggle-string@0.4.1: resolution: {integrity: sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==} + mustache@4.2.0: + resolution: {integrity: sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==} + hasBin: true + mute-stream@1.0.0: resolution: {integrity: sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + mz@2.7.0: + resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} + nanoid@3.3.7: resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true + natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + + negotiator@0.6.3: + resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} + engines: {node: '>= 0.6'} + neo-async@2.6.2: resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} @@ -2773,10 +4252,22 @@ packages: resolution: {integrity: sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==} engines: {node: '>=10'} + normalize-package-data@6.0.2: + resolution: {integrity: sha512-V6gygoYb/5EmNI+MEGrWkC+e6+Rr7mTmfHrxDbLzxQogBkgzo76rkok0Am6thgSF7Mv2nLOajAJj5vDJZEFn7g==} + engines: {node: ^16.14.0 || >=18.0.0} + normalize-path@3.0.0: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} engines: {node: '>=0.10.0'} + normalize-url@8.0.1: + resolution: {integrity: sha512-IO9QvjUMWxPQQhs60oOu10CRkWCiZzSUkzbXGGV9pviYl1fXYcvkzQ5jV9z8Y6un8ARoVRl4EtC6v6jNqbaJ/w==} + engines: {node: '>=14.16'} + + npm-run-path@4.0.1: + resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} + engines: {node: '>=8'} + npm-run-path@5.3.0: resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -2784,6 +4275,10 @@ packages: nwsapi@2.2.12: resolution: {integrity: sha512-qXDmcVlZV4XRtKFzddidpfVP4oMSGhga+xdMc25mv8kaLUHtgzCDhUxkrN8exkGdTlLNaXj7CV3GtON7zuGZ+w==} + object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + object-inspect@1.13.1: resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==} @@ -2795,13 +4290,32 @@ packages: resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==} engines: {node: '>= 0.4'} + on-exit-leak-free@2.1.2: + resolution: {integrity: sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==} + engines: {node: '>=14.0.0'} + + on-finished@2.4.1: + resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} + engines: {node: '>= 0.8'} + once@1.4.0: resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + onetime@5.1.2: + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + engines: {node: '>=6'} + onetime@6.0.0: resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} engines: {node: '>=12'} + onetime@7.0.0: + resolution: {integrity: sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==} + engines: {node: '>=18'} + + openapi-types@12.1.3: + resolution: {integrity: sha512-N4YtSYJqghVu4iek2ZUvcN/0aqH1kRDuNqzcycDxhOUpg7GdvLa2F3DgS6yBNhInhv2r/6I0Flkn7CqL8+nIcw==} + openapi-typescript-codegen@0.25.0: resolution: {integrity: sha512-nN/TnIcGbP58qYgwEEy5FrAAjePcYgfMaCe3tsmYyTgI3v4RR9v8os14L+LEWDvV50+CmqiyTzRkKKtJeb6Ybg==} hasBin: true @@ -2810,6 +4324,10 @@ packages: resolution: {integrity: sha512-9YkzVKIx9RVIET0lFjJOuf15VjI9AUsoNByBk5WYM66xVlAKDNy8anj08Ci3zZA+HgTwdDamYz5FCVYt2VoHkA==} engines: {node: '>= 12.0.0', npm: '>= 7.0.0'} + optionator@0.9.4: + resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} + engines: {node: '>= 0.8.0'} + os-tmpdir@1.0.2: resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} engines: {node: '>=0.10.0'} @@ -2820,10 +4338,18 @@ packages: outvariant@1.4.2: resolution: {integrity: sha512-Ou3dJ6bA/UJ5GVHxah4LnqDwZRwAmWxrG3wtrHrbGnP4RnLCtA64A4F+ae7Y8ww660JaddSoArUR5HjipWSHAQ==} + p-event@6.0.1: + resolution: {integrity: sha512-Q6Bekk5wpzW5qIyUP4gdMEujObYstZl6DMMOSenwBvV0BlE5LkDwkjs5yHbZmdCEq2o4RJx4tE1vwxFVf2FG1w==} + engines: {node: '>=16.17'} + p-filter@2.1.0: resolution: {integrity: sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw==} engines: {node: '>=8'} + p-filter@4.1.0: + resolution: {integrity: sha512-37/tPdZ3oJwHaS3gNJdenCDB3Tz26i9sjhnguBtvN0vYlRIiDNnvTWkuh+0hETV9rLPdJ3rlL3yVOYPIAnM8rw==} + engines: {node: '>=18'} + p-limit@2.3.0: resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} engines: {node: '>=6'} @@ -2848,10 +4374,29 @@ packages: resolution: {integrity: sha512-VFqfGDHlx87K66yZrNdI4YGtD70IRyd+zSvgks6mzHPRNkoKy+9EKP4SFC77/vTTQYmRmti7dvqC+m5jBrBAcg==} engines: {node: '>=12'} + p-map@7.0.2: + resolution: {integrity: sha512-z4cYYMMdKHzw4O5UkWJImbZynVIo0lSGTXc7bzB1e/rrDqkgGUNysK/o4bTr+0+xKvvLoTyGqYC4Fgljy9qe1Q==} + engines: {node: '>=18'} + + p-timeout@6.1.2: + resolution: {integrity: sha512-UbD77BuZ9Bc9aABo74gfXhNvzC9Tx7SxtHSh1fxvx3jTLLYvmVhiQZZrJzqqU0jKbN32kb5VOKiLEQI/3bIjgQ==} + engines: {node: '>=14.16'} + p-try@2.2.0: resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} engines: {node: '>=6'} + package-json-from-dist@1.0.0: + resolution: {integrity: sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==} + + parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + + parse-imports@1.2.0: + resolution: {integrity: sha512-K5aG9cextqjAlyevwuSMjWPbBr+X8xGgfHS4VopbKC1u3jLndRGl2CoUHMTvuD6LIg4di5TzH/Pw9+XZyTjI/w==} + engines: {node: '>= 12.17'} + parse-json@5.2.0: resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} engines: {node: '>=8'} @@ -2885,6 +4430,10 @@ packages: path-parse@1.0.7: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + path-scurry@1.11.1: + resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} + engines: {node: '>=16 || 14 >=14.18'} + path-to-regexp@6.2.2: resolution: {integrity: sha512-GQX3SSMokngb36+whdpRXE+3f9V8UzyAorlYvOGx87ufGHehNTn5lCxrKtLyZ4Yl/wEKnNnr98ZzOwwDZV5ogw==} @@ -2892,6 +4441,10 @@ packages: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} + path-type@5.0.0: + resolution: {integrity: sha512-5HviZNaZcfqP95rwpv+1HDgUamezbqdSYTyzjTvwtJSnIH+3vnbmWsItli8OFEndS984VT55M3jduxZbX351gg==} + engines: {node: '>=12'} + pathe@1.1.2: resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} @@ -2899,14 +4452,18 @@ packages: resolution: {integrity: sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==} engines: {node: '>= 14.16'} + peek-readable@5.1.3: + resolution: {integrity: sha512-kCsc9HwH5RgVA3H3VqkWFyGQwsxUxLdiSX1d5nqAm7hnMFjNFX1VhBLmJoUY0hZNc8gmDNgBkLjfhiWPsziXWA==} + engines: {node: '>=14.16'} + perfect-debounce@1.0.0: resolution: {integrity: sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==} periscopic@3.1.0: resolution: {integrity: sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw==} - picocolors@1.0.0: - resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + pg-connection-string@2.6.2: + resolution: {integrity: sha512-ch6OwaeaPYcova4kKZ15sbJ2hKb/VP48ZD2gE7i1J+L4MspCtBMAx8nMgz7bksc7IojCIIWuEhHibSMFH8m8oA==} picocolors@1.0.1: resolution: {integrity: sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==} @@ -2915,10 +4472,32 @@ packages: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} engines: {node: '>=8.6'} + picomatch@4.0.2: + resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} + engines: {node: '>=12'} + pify@4.0.1: resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} engines: {node: '>=6'} + pino-abstract-transport@1.2.0: + resolution: {integrity: sha512-Guhh8EZfPCfH+PMXAb6rKOjGQEoy0xlAIn+irODG5kgfYV+BQ0rGYYWTIel3P5mmyXqkYkPmdIkywsn6QKUR1Q==} + + pino-pretty@11.2.2: + resolution: {integrity: sha512-2FnyGir8nAJAqD3srROdrF1J5BIcMT4nwj7hHSc60El6Uxlym00UbCCd8pYIterstVBFlMyF1yFV8XdGIPbj4A==} + hasBin: true + + pino-std-serializers@6.2.2: + resolution: {integrity: sha512-cHjPPsE+vhj/tnhCy/wiMh3M3z3h/j15zHQX+S9GkTBgqJuTuJzYJ4gUyACLhDaJ7kk9ba9iRDmbH2tJU03OiA==} + + pino@8.21.0: + resolution: {integrity: sha512-ip4qdzjkAyDDZklUaZkcRFb2iA118H9SgRh8yzTkSQK8HilsOJF7rSY8HoW5+I0M46AZgX/pxbprf2vvzQCE0Q==} + hasBin: true + + pirates@4.0.6: + resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} + engines: {node: '>= 6'} + pkg-dir@4.2.0: resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} engines: {node: '>=8'} @@ -2941,6 +4520,24 @@ packages: resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} engines: {node: '>= 0.4'} + postcss-load-config@6.0.1: + resolution: {integrity: sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==} + engines: {node: '>= 18'} + peerDependencies: + jiti: '>=1.21.0' + postcss: '>=8.0.9' + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + jiti: + optional: true + postcss: + optional: true + tsx: + optional: true + yaml: + optional: true + postcss@8.4.31: resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==} engines: {node: ^10 || ^12 || >=14} @@ -2956,6 +4553,14 @@ packages: resolution: {integrity: sha512-MkXsENfftWSRpzCzImcp4FRsCc3y1opwB73CfCNWyzMqArju2CrlMHlqB7VexKiPEOjGMbttv1r9fSCn5S610w==} engines: {node: '>=10'} + prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + + prettier-linter-helpers@1.0.0: + resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==} + engines: {node: '>=6.0.0'} + prettier@2.8.8: resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} engines: {node: '>=10.13.0'} @@ -2970,6 +4575,24 @@ packages: resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + pretty-hrtime@1.0.3: + resolution: {integrity: sha512-66hKPCr+72mlfiSjlEB1+45IjXSqvVAIy6mocupoww4tBFE9R9IhwwUGoI4G++Tc9Aq+2rxOt0RFU6gPcrte0A==} + engines: {node: '>= 0.8'} + + printable-characters@1.0.42: + resolution: {integrity: sha512-dKp+C4iXWK4vVYZmYSd0KBH5F/h1HoZRsbJ82AVKRO3PEo8L4lBS/vLwhVtpwwuYcoIsVY+1JYKR268yn480uQ==} + + process-warning@3.0.0: + resolution: {integrity: sha512-mqn0kFRl0EoqhnL0GQ0veqFHyIN1yig9RHh/InzORTUiZHFRAur+aMtRkELNwGs9aNwKS6tg/An4NYBPGwvtzQ==} + + process@0.11.10: + resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} + engines: {node: '>= 0.6.0'} + + proxy-addr@2.0.7: + resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} + engines: {node: '>= 0.10'} + proxy-from-env@1.1.0: resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} @@ -2979,6 +4602,9 @@ packages: psl@1.9.0: resolution: {integrity: sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==} + pump@3.0.0: + resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} + punycode@2.3.1: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} @@ -2987,12 +4613,19 @@ packages: resolution: {integrity: sha512-zWmv4RSuB9r2mYQw3zxQuHWeU+42aKi1wWig/j4ele4ygELZ7PEO6MM7rim9oAQH2A5MWfsAVf/jPvTPgCbvUQ==} engines: {node: '>=0.6'} + qs@6.13.0: + resolution: {integrity: sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==} + engines: {node: '>=0.6'} + querystringify@2.2.0: resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + quick-format-unescaped@4.0.4: + resolution: {integrity: sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==} + quick-lru@4.0.1: resolution: {integrity: sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==} engines: {node: '>=8'} @@ -3001,6 +4634,14 @@ packages: resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} engines: {node: '>=10'} + random-bytes@1.0.0: + resolution: {integrity: sha512-iv7LhNVO047HzYR3InF6pUcUsPQiHTM1Qal51DcGSuZFBil1aBBWG5eHPNek7bvILMaYJ/8RU1e8w1AMdHmLQQ==} + engines: {node: '>= 0.8'} + + raw-body@2.5.2: + resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==} + engines: {node: '>= 0.8'} + react-dom@18.3.1: resolution: {integrity: sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==} peerDependencies: @@ -3022,6 +4663,10 @@ packages: resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==} engines: {node: '>=0.10.0'} + read-package-up@11.0.0: + resolution: {integrity: sha512-MbgfoNPANMdb4oRBNg5eqLbB2t2r+o5Ua1pNt8BqGp4I0FJZhuVSOj3PaBPni4azWuSzEdNn2evevzVmEk1ohQ==} + engines: {node: '>=18'} + read-pkg-up@7.0.1: resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==} engines: {node: '>=8'} @@ -3038,14 +4683,30 @@ packages: resolution: {integrity: sha512-X1Fu3dPuk/8ZLsMhEj5f4wFAF0DWoK7qhGJvgaijocXxBmSToKfbFtqbxMO7bVjNA1dmE5huAzjXj/ey86iw9Q==} engines: {node: '>=12'} + read-pkg@9.0.1: + resolution: {integrity: sha512-9viLL4/n1BJUCT1NXVTdS1jtm80yDEgR5T4yCelII49Mbj0v1rZdKqj7zCiYdbB0CuCgdrvHcNogAKTFPBocFA==} + engines: {node: '>=18'} + read-yaml-file@1.1.0: resolution: {integrity: sha512-VIMnQi/Z4HT2Fxuwg5KrY174U1VdUIASQVWXXyqtNRtxSr9IYkn1rsI6Tb6HsrHCmB7gVpNwX6JxPTHcH6IoTA==} engines: {node: '>=6'} + readable-stream@4.5.2: + resolution: {integrity: sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + readdirp@3.6.0: resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} engines: {node: '>=8.10.0'} + real-require@0.2.0: + resolution: {integrity: sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==} + engines: {node: '>= 12.13.0'} + + rechoir@0.8.0: + resolution: {integrity: sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==} + engines: {node: '>= 10.13.0'} + redent@3.0.0: resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} engines: {node: '>=8'} @@ -3054,13 +4715,24 @@ packages: resolution: {integrity: sha512-tYkDkVVtYkSVhuQ4zBgfvciymHaeuel+zFKXShfDnFP5SyVEP7qo70Rf1jTOTCx3vGNAbnEi/xFkcfQVMIBWag==} engines: {node: '>=12'} + reflect-metadata@0.2.2: + resolution: {integrity: sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==} + regenerator-runtime@0.14.1: resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} + regexp-tree@0.1.27: + resolution: {integrity: sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA==} + hasBin: true + regexp.prototype.flags@1.5.2: resolution: {integrity: sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==} engines: {node: '>= 0.4'} + regjsparser@0.10.0: + resolution: {integrity: sha512-qx+xQGZVsy55CH0a1hiVwHmqjLryfh7wQyF5HO07XJ9f7dQMY/gPQHhlyDkIzJKC+x2fUCpCcUODUUUFrm7SHA==} + hasBin: true + require-directory@2.1.1: resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} engines: {node: '>=0.10.0'} @@ -3075,6 +4747,10 @@ packages: requires-port@1.0.0: resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} + resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + resolve-from@5.0.0: resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} engines: {node: '>=8'} @@ -3083,6 +4759,10 @@ packages: resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} hasBin: true + restore-cursor@5.1.0: + resolution: {integrity: sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==} + engines: {node: '>=18'} + reusify@1.0.4: resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} @@ -3105,6 +4785,11 @@ packages: engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true + rollup@4.20.0: + resolution: {integrity: sha512-6rbWBChcnSGzIlXeIdNIZTopKYad8ZG8ajhl78lGRLsI2rX8IkaotQhVas2Ma+GPxJav19wrSzvRvuiv0YKzWw==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} @@ -3116,10 +4801,23 @@ packages: resolution: {integrity: sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==} engines: {node: '>=0.4'} + safe-buffer@5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + + safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + safe-regex-test@1.0.3: resolution: {integrity: sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==} engines: {node: '>= 0.4'} + safe-regex@2.1.1: + resolution: {integrity: sha512-rx+x8AMzKb5Q5lQ95Zoi6ZbJqwCLkqi3XuJXp5P3rT8OEc6sZCJG5AE5dU3lsgRr/F4Bs31jSlVN+j5KrsGu9A==} + + safe-stable-stringify@2.4.3: + resolution: {integrity: sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==} + engines: {node: '>=10'} + safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} @@ -3136,6 +4834,9 @@ packages: search-insights@2.13.0: resolution: {integrity: sha512-Orrsjf9trHHxFRuo9/rzm0KIWmgzE8RMlZMzuhZOJ01Rnz3D0YBAe+V6473t6/H6c7irs6Lt48brULAiRWb3Vw==} + secure-json-parse@2.7.0: + resolution: {integrity: sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==} + semver@5.7.2: resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} hasBin: true @@ -3173,6 +4874,9 @@ packages: resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} engines: {node: '>= 0.4'} + setprototypeof@1.2.0: + resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + shebang-command@1.2.0: resolution: {integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==} engines: {node: '>=0.10.0'} @@ -3218,11 +4922,36 @@ packages: resolution: {integrity: sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==} engines: {node: '>=12'} + slash@5.1.0: + resolution: {integrity: sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==} + engines: {node: '>=14.16'} + + slashes@3.0.12: + resolution: {integrity: sha512-Q9VME8WyGkc7pJf6QEkj3wE+2CnvZMI+XJhwdTPR8Z/kWQRXi7boAWLDibRPyHRTUTPx5FaU7MsyrjI3yLB4HA==} + + slice-ansi@5.0.0: + resolution: {integrity: sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==} + engines: {node: '>=12'} + + slice-ansi@7.1.0: + resolution: {integrity: sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==} + engines: {node: '>=18'} + + slugify@1.6.6: + resolution: {integrity: sha512-h+z7HKHYXj6wJU+AnS/+IH8Uh9fdcX1Lrhg1/VMdf9PwoBQXFcXiAdsy2tSK0P6gKwJLXp02r90ahUCqHk9rrw==} + engines: {node: '>=8.0.0'} + smartwrap@2.0.2: resolution: {integrity: sha512-vCsKNQxb7PnCNd2wY1WClWifAc2lwqsG8OaswpJkVJsvMGcnEntdTCDajZCkk93Ay1U3t/9puJmb525Rg5MZBA==} engines: {node: '>=6'} hasBin: true + sonic-boom@3.8.1: + resolution: {integrity: sha512-y4Z8LCDBuum+PBP3lSV7RHrXscqksve/bi0as7mhwVnBW+/wUqKT/2Kb7um8yqcFy0duYbbPxzt89Zy2nOCaxg==} + + sonic-boom@4.0.1: + resolution: {integrity: sha512-hTSD/6JMLyT4r9zeof6UtuBDpjJ9sO08/nmS5djaA9eozT9oOlNdpXSnzcgj4FTqpk3nkLrs61l4gip9r1HCrQ==} + sorcery@0.11.1: resolution: {integrity: sha512-o7npfeJE6wi6J9l0/5LKshFzZ2rMatRiCDwYeDQaOzqdzRJwALhX7mk/A/ecg6wjMu7wdZbmXfD2S/vpOg0bdQ==} hasBin: true @@ -3235,6 +4964,10 @@ packages: resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} engines: {node: '>=0.10.0'} + source-map@0.8.0-beta.0: + resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==} + engines: {node: '>= 8'} + spawndamnit@2.0.0: resolution: {integrity: sha512-j4JKEcncSjFlqIwU5L/rp2N5SIPsdxaRsIv678+TZxZ0SRDJTm8JrxJMjE/XuiEZNEir3S8l0Fa3Ke339WI4qA==} @@ -3254,12 +4987,23 @@ packages: resolution: {integrity: sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==} engines: {node: '>=0.10.0'} + split-lines@3.0.0: + resolution: {integrity: sha512-d0TpRBL/VfKDXsk8JxPF7zgF5pCUDdBMSlEL36xBgVeaX448t+yGXcJaikUyzkoKOJ0l6KpMfygzJU9naIuivw==} + engines: {node: '>=12'} + + split2@4.2.0: + resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} + engines: {node: '>= 10.x'} + sprintf-js@1.0.3: resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} stackback@0.0.2: resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} + stacktracey@2.1.8: + resolution: {integrity: sha512-Kpij9riA+UNg7TnphqjH7/CzctQ/owJGNbFkfEeve4Z4uxT5+JapVLFXcsurIfN34gnTWZNJ/f7NMG0E8JDzTw==} + statuses@2.0.1: resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} engines: {node: '>= 0.8'} @@ -3277,10 +5021,22 @@ packages: strict-event-emitter@0.5.1: resolution: {integrity: sha512-vMgjE/GGEPEFnhFub6pa4FmJBRBVOLpIII2hvCZ8Kzb7K0hlHo7mQv6xYrBvCL2LtAIBwFUK8wvuJgTVSQ5MFQ==} + string-argv@0.3.2: + resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} + engines: {node: '>=0.6.19'} + string-width@4.2.3: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} + string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + + string-width@7.2.0: + resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==} + engines: {node: '>=18'} + string.prototype.trim@1.2.9: resolution: {integrity: sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==} engines: {node: '>= 0.4'} @@ -3292,6 +5048,9 @@ packages: resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} engines: {node: '>= 0.4'} + string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + strip-ansi@6.0.1: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} @@ -3304,6 +5063,10 @@ packages: resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} engines: {node: '>=4'} + strip-final-newline@2.0.0: + resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} + engines: {node: '>=6'} + strip-final-newline@3.0.0: resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} engines: {node: '>=12'} @@ -3316,6 +5079,14 @@ packages: resolution: {integrity: sha512-mnVSV2l+Zv6BLpSD/8V87CW/y9EmmbYzGCIavsnsI6/nwn26DwffM/yztm30Z/I2DY9wdS3vXVCMnHDgZaVNoA==} engines: {node: '>=12'} + strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + + strtok3@8.0.1: + resolution: {integrity: sha512-HNkTAnNWQj2YBzfTtoC5OQyu1QwPsMwiB7VyQmNvQKCrmEDSvFB857Vh97UY9InGLNRAB91sdS1ztifRo/3hdA==} + engines: {node: '>=16'} + styled-jsx@5.1.1: resolution: {integrity: sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==} engines: {node: '>= 12.0.0'} @@ -3329,6 +5100,16 @@ packages: babel-plugin-macros: optional: true + sucrase@3.35.0: + resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} + engines: {node: '>=16 || 14 >=14.17'} + hasBin: true + + superagent@8.1.2: + resolution: {integrity: sha512-6WTxW1EB6yCxV5VFOIPQruWGHqc3yI7hEmZK6h+pyk69Lk/Ut7rLUY6W/ONF2MjBuGjvmMiIpsrVJ2vjrHlslA==} + engines: {node: '>=6.4.0 <13 || >=14'} + deprecated: Please upgrade to v9.0.0+ as we have fixed a public vulnerability with formidable dependency. Note that v9.0.0+ requires Node.js v14.18.0+. See https://github.com/ladjs/superagent/pull/1800 for insight. This project is supported and maintained by the team at Forward Email @ https://forwardemail.net + superagent@9.0.2: resolution: {integrity: sha512-xuW7dzkUpcJq7QnhOsnNUgtYp3xRwpt2F7abdRYIpCsAt0hhUqia0EdxyXZQQpNmGtsCzYHryaKSV3q3GJnq7w==} engines: {node: '>=14.18.0'} @@ -3405,15 +5186,52 @@ packages: symbol-tree@3.2.4: resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} + synckit@0.6.2: + resolution: {integrity: sha512-Vhf+bUa//YSTYKseDiiEuQmhGCoIF3CVBhunm3r/DQnYiGT4JssmnKQc44BIyOZRK2pKjXXAgbhfmbeoC9CJpA==} + engines: {node: '>=12.20'} + + synckit@0.9.1: + resolution: {integrity: sha512-7gr8p9TQP6RAHusBOSLs46F4564ZrjV8xFmw5zCmgmhGUcw2hxsShhJ6CEiHQMgPDwAQ1fWHPM0ypc4RMAig4A==} + engines: {node: ^14.18.0 || >=16.0.0} + tabbable@6.2.0: resolution: {integrity: sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==} + tarn@3.0.2: + resolution: {integrity: sha512-51LAVKUSZSVfI05vjPESNc5vwqqZpbXCsU+/+wxlOrUjk2SnFTt97v9ZgQrD4YmxYW1Px6w2KjaDitCfkvgxMQ==} + engines: {node: '>=8.0.0'} + + tempura@0.4.1: + resolution: {integrity: sha512-NQ4Cs23jM6UUp3CcS5vjmyjTC6dtA5EsflBG2cyG0wZvP65AV26tJ920MGvTRYIImCY13RBpOhc7q4/pu+FG5A==} + engines: {node: '>=10'} + term-size@2.2.1: resolution: {integrity: sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==} engines: {node: '>=8'} - tiny-glob@0.2.9: - resolution: {integrity: sha512-g/55ssRPUjShh+xkfx9UPDXqhckHEsHr4Vd9zX55oSdGZc/MD0m3sferOkwWtp98bv+kcVfEHtRJgBVJzelrzg==} + terminal-size@4.0.0: + resolution: {integrity: sha512-rcdty1xZ2/BkWa4ANjWRp4JGpda2quksXIHgn5TMjNBPZfwzJIgR68DKfSYiTL+CZWowDX/sbOo5ME/FRURvYQ==} + engines: {node: '>=18'} + + text-table@0.2.0: + resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + + thenify-all@1.6.0: + resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} + engines: {node: '>=0.8'} + + thenify@3.3.1: + resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} + + thread-stream@2.7.0: + resolution: {integrity: sha512-qQiRWsU/wvNolI6tbbCKd9iKaTnCXsTwVxhhKM6nctPdujTyztjlbUkUTUymidWcMnZ5pWR0ej4a0tjsW021vw==} + + tildify@2.0.0: + resolution: {integrity: sha512-Cc+OraorugtXNfs50hU9KS369rFXCfgGLpfCfvlc+Ud5u6VWmUQsOAa9HbTvheQdYnrdJqqv1e5oIqXppMYnSw==} + engines: {node: '>=8'} + + tiny-glob@0.2.9: + resolution: {integrity: sha512-g/55ssRPUjShh+xkfx9UPDXqhckHEsHr4Vd9zX55oSdGZc/MD0m3sferOkwWtp98bv+kcVfEHtRJgBVJzelrzg==} tinybench@2.8.0: resolution: {integrity: sha512-1/eK7zUnIklz4JUUlL+658n58XO2hHLQfSk1Zf2LKieUjxidN16eKFEoDEfjHc3ohofSSqK3X5yO6VGb6iW8Lw==} @@ -3430,6 +5248,10 @@ packages: resolution: {integrity: sha512-q5nmENpTHgiPVd1cJDDc9cVoYN5x4vCvwT3FMilvKPKneCBZAxn2YWQjDF0UMcE9k0Cay1gBiDfTMU0g+mPMQA==} engines: {node: '>=14.0.0'} + tmp-cache@1.1.0: + resolution: {integrity: sha512-j040fkL/x+XAZQ9K3bKGEPwgYhOZNBQLa3NXEADUiuno9C+3N2JJA4bVPDREixp604G3/vTXWA3DIPpA9lu1RQ==} + engines: {node: '>=6'} + tmp@0.0.33: resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} engines: {node: '>=0.6.0'} @@ -3442,6 +5264,14 @@ packages: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} + toidentifier@1.0.1: + resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} + engines: {node: '>=0.6'} + + token-types@6.0.0: + resolution: {integrity: sha512-lbDrTLVsHhOMljPscd0yitpozq7Ga2M5Cvez5AjGg8GASBjtt6iERCAJ93yommPmz62fb45oFIXHEZ3u9bfJEA==} + engines: {node: '>=14.16'} + totalist@3.0.1: resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==} engines: {node: '>=6'} @@ -3453,10 +5283,17 @@ packages: tr46@0.0.3: resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + tr46@1.0.1: + resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==} + tr46@3.0.0: resolution: {integrity: sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==} engines: {node: '>=12'} + tree-kill@1.2.2: + resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} + hasBin: true + trim-newlines@3.0.1: resolution: {integrity: sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==} engines: {node: '>=8'} @@ -3465,18 +5302,78 @@ packages: resolution: {integrity: sha512-jRKj0n0jXWo6kh62nA5TEh3+4igKDXLvzBJcPpiizP7oOolUrYIxmVBG9TOtHYFHoddUk6YvAkGeGoSVTXfQXQ==} engines: {node: '>=12'} + truncatise@0.0.8: + resolution: {integrity: sha512-cXzueh9pzBCsLzhToB4X4gZCb3KYkrsAcBAX97JnazE74HOl3cpBJYEV7nabHeG/6/WXCU5Yujlde/WPBUwnsg==} + + ts-api-utils@1.3.0: + resolution: {integrity: sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==} + engines: {node: '>=16'} + peerDependencies: + typescript: '>=4.2.0' + + ts-interface-checker@0.1.13: + resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} + + ts-morph@22.0.0: + resolution: {integrity: sha512-M9MqFGZREyeb5fTl6gNHKZLqBQA0TjA1lea+CR48R8EBTDuWrNqW6ccC5QvjNR4s6wDumD3LTCjOFSp9iwlzaw==} + + ts-node@10.9.2: + resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==} + hasBin: true + peerDependencies: + '@swc/core': '>=1.2.50' + '@swc/wasm': '>=1.2.50' + '@types/node': '*' + typescript: '>=2.7' + peerDependenciesMeta: + '@swc/core': + optional: true + '@swc/wasm': + optional: true + tslib@2.6.3: resolution: {integrity: sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==} + tsup@8.2.4: + resolution: {integrity: sha512-akpCPePnBnC/CXgRrcy72ZSntgIEUa1jN0oJbbvpALWKNOz1B7aM+UVDWGRGIO/T/PZugAESWDJUAb5FD48o8Q==} + engines: {node: '>=18'} + hasBin: true + peerDependencies: + '@microsoft/api-extractor': ^7.36.0 + '@swc/core': ^1 + postcss: ^8.4.12 + typescript: '>=4.5.0' + peerDependenciesMeta: + '@microsoft/api-extractor': + optional: true + '@swc/core': + optional: true + postcss: + optional: true + typescript: + optional: true + tty-table@4.2.3: resolution: {integrity: sha512-Fs15mu0vGzCrj8fmJNP7Ynxt5J7praPXqFN0leZeZBXJwkMxv9cb2D454k1ltrtUSJbZ4yH4e0CynsHLxmUfFA==} engines: {node: '>=8.0.0'} hasBin: true + type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + + type-detect@4.1.0: + resolution: {integrity: sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==} + engines: {node: '>=4'} + type-fest@0.13.1: resolution: {integrity: sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==} engines: {node: '>=10'} + type-fest@0.20.2: + resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} + engines: {node: '>=10'} + type-fest@0.21.3: resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} engines: {node: '>=10'} @@ -3497,6 +5394,10 @@ packages: resolution: {integrity: sha512-R6wDsVsoS9xYOpy8vgeBlqpdOyzJ12HNfQhC/aAKWM3YoCV9TtunJzh/QpkMgeDhkoynDcw5f1y+qF9yc/HHyg==} engines: {node: '>=16'} + type-is@1.6.18: + resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} + engines: {node: '>= 0.6'} + typed-array-buffer@1.0.2: resolution: {integrity: sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==} engines: {node: '>= 0.4'} @@ -3528,12 +5429,27 @@ packages: engines: {node: '>=0.8.0'} hasBin: true + uid-safe@2.1.5: + resolution: {integrity: sha512-KPHm4VL5dDXKz01UuEd88Df+KzynaohSL9fBh096KWAxSKZQDI2uBrVqtvRM4rwrIrRRKsdLNML/lnaaVSRioA==} + engines: {node: '>= 0.8'} + + uint8array-extras@1.4.0: + resolution: {integrity: sha512-ZPtzy0hu4cZjv3z5NW9gfKnNLjoz4y6uv4HlelAjDK7sY/xOkKZv9xK/WQpcsBB3jEybChz9DPC2U/+cusjJVQ==} + engines: {node: '>=18'} + unbox-primitive@1.0.2: resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} undici-types@5.26.5: resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + undici-types@6.13.0: + resolution: {integrity: sha512-xtFJHudx8S2DSoujjMd1WeWvn7KKWFRESZTMeL1RptAYERu29D6jphMjjY+vn96jvN3kVPDNxU/E13VTaXj6jg==} + + unicorn-magic@0.1.0: + resolution: {integrity: sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==} + engines: {node: '>=18'} + universalify@0.1.2: resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} engines: {node: '>= 4.0.0'} @@ -3546,6 +5462,19 @@ packages: resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} engines: {node: '>= 10.0.0'} + unpipe@1.0.0: + resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} + engines: {node: '>= 0.8'} + + unplugin-swc@1.5.1: + resolution: {integrity: sha512-/ZLrPNjChhGx3Z95pxJ4tQgfI6rWqukgYHKflrNB4zAV1izOQuDhkTn55JWeivpBxDCoK7M/TStb2aS/14PS/g==} + peerDependencies: + '@swc/core': ^1.2.108 + + unplugin@1.12.1: + resolution: {integrity: sha512-aXEH9c5qi3uYZHo0niUtxDlT9ylG/luMW/dZslSCkbtC31wCyFkmM0kyoBBh+Grhn7CL+/kvKLfN61/EdxPxMQ==} + engines: {node: '>=14.0.0'} + update-browserslist-db@1.0.16: resolution: {integrity: sha512-KVbTxlBYlckhF5wgfyZXTWnMn7MMZjMu9XG8bPlliUOP9ThaF4QnhP8qrjrH7DRzHfSk0oQv1wToW+iA5GajEQ==} hasBin: true @@ -3558,9 +5487,20 @@ packages: url-parse@1.5.10: resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} + v8-compile-cache-lib@3.0.1: + resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} + validate-npm-package-license@3.0.4: resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} + validator@13.12.0: + resolution: {integrity: sha512-c1Q0mCiPlgdTVVVIJIrBuxNicYE+t/7oKeI9MWLj3fh/uq2Pxh/3eeWbVZ4OcGW1TUf53At0njHw5SMdA3tmMg==} + engines: {node: '>= 0.10'} + + vary@1.1.2: + resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} + engines: {node: '>= 0.8'} + vite-node@2.0.5: resolution: {integrity: sha512-LdsW4pxj0Ot69FAoXZ1yTnA9bjGohr2yNBU7QKRxpz8ITSkhuDl6h3zS/tvgz4qrNjeRnvrWeXQ8ZF7Um4W00Q==} engines: {node: ^18.0.0 || >=20.0.0} @@ -3677,10 +5617,20 @@ packages: webidl-conversions@3.0.1: resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + webidl-conversions@4.0.2: + resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} + webidl-conversions@7.0.0: resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} engines: {node: '>=12'} + webpack-sources@3.2.3: + resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==} + engines: {node: '>=10.13.0'} + + webpack-virtual-modules@0.6.2: + resolution: {integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==} + whatwg-encoding@2.0.0: resolution: {integrity: sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==} engines: {node: '>=12'} @@ -3696,6 +5646,9 @@ packages: whatwg-url@5.0.0: resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + whatwg-url@7.1.0: + resolution: {integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==} + which-boxed-primitive@1.0.2: resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} @@ -3724,6 +5677,10 @@ packages: engines: {node: '>=8'} hasBin: true + word-wrap@1.2.5: + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} + engines: {node: '>=0.10.0'} + wordwrap@1.0.0: resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} @@ -3735,6 +5692,14 @@ packages: resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} engines: {node: '>=10'} + wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} + + wrap-ansi@9.0.0: + resolution: {integrity: sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==} + engines: {node: '>=18'} + wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} @@ -3796,12 +5761,273 @@ packages: resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} engines: {node: '>=12'} + yn@3.1.1: + resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} + engines: {node: '>=6'} + yocto-queue@0.1.0: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} + youch-terminal@2.2.3: + resolution: {integrity: sha512-/PE77ZwG072tXBvF47S9RL9/G80u86icZ5QwyjblyM67L4n/T5qQeM3Xrecbu8kkDDr/9T/PTj/X+6G/OSRQug==} + + youch@3.3.3: + resolution: {integrity: sha512-qSFXUk3UZBLfggAW3dJKg0BMblG5biqSF8M34E06o5CSsZtH92u9Hqmj2RzGiHDi64fhe83+4tENFP2DB6t6ZA==} + snapshots: + '@adonisjs/ace@13.1.0': + dependencies: + '@poppinss/cliui': 6.4.1 + '@poppinss/hooks': 7.2.3 + '@poppinss/macroable': 1.0.2 + '@poppinss/prompts': 3.1.3 + '@poppinss/utils': 6.7.3 + fastest-levenshtein: 1.0.16 + jsonschema: 1.4.1 + string-width: 7.2.0 + yargs-parser: 21.1.1 + youch: 3.3.3 + youch-terminal: 2.2.3 + + '@adonisjs/application@8.3.1(@adonisjs/config@5.0.2)(@adonisjs/fold@10.1.2)': + dependencies: + '@adonisjs/config': 5.0.2 + '@adonisjs/fold': 10.1.2 + '@poppinss/hooks': 7.2.3 + '@poppinss/macroable': 1.0.2 + '@poppinss/utils': 6.7.3 + glob-parent: 6.0.2 + tempura: 0.4.1 + + '@adonisjs/assembler@7.7.0(typescript@5.4.5)': + dependencies: + '@adonisjs/env': 6.1.0 + '@antfu/install-pkg': 0.3.3 + '@poppinss/chokidar-ts': 4.1.4(typescript@5.4.5) + '@poppinss/cliui': 6.4.1 + '@poppinss/hooks': 7.2.3 + '@poppinss/utils': 6.7.3 + cpy: 11.1.0 + dedent: 1.5.3 + execa: 8.0.1 + fast-glob: 3.3.2 + get-port: 7.1.0 + junk: 4.0.1 + picomatch: 4.0.2 + pretty-hrtime: 1.0.3 + slash: 5.1.0 + ts-morph: 22.0.0 + typescript: 5.4.5 + transitivePeerDependencies: + - babel-plugin-macros + + '@adonisjs/auth@9.2.3(@adonisjs/assembler@7.7.0(typescript@5.4.5))(@adonisjs/core@6.12.1(@adonisjs/assembler@7.7.0(typescript@5.4.5))(@vinejs/vine@2.1.0))(@adonisjs/lucid@21.1.1(@adonisjs/assembler@7.7.0(typescript@5.4.5))(@adonisjs/core@6.12.1(@adonisjs/assembler@7.7.0(typescript@5.4.5))(@vinejs/vine@2.1.0))(luxon@3.5.0))(@japa/api-client@2.0.3)(@japa/plugin-adonisjs@3.0.1(@adonisjs/core@6.12.1(@adonisjs/assembler@7.7.0(typescript@5.4.5))(@vinejs/vine@2.1.0))(@japa/api-client@2.0.3))': + dependencies: + '@adonisjs/core': 6.12.1(@adonisjs/assembler@7.7.0(typescript@5.4.5))(@vinejs/vine@2.1.0) + '@adonisjs/presets': 2.6.1(@adonisjs/assembler@7.7.0(typescript@5.4.5))(@adonisjs/core@6.12.1(@adonisjs/assembler@7.7.0(typescript@5.4.5))(@vinejs/vine@2.1.0)) + basic-auth: 2.0.1 + optionalDependencies: + '@adonisjs/lucid': 21.1.1(@adonisjs/assembler@7.7.0(typescript@5.4.5))(@adonisjs/core@6.12.1(@adonisjs/assembler@7.7.0(typescript@5.4.5))(@vinejs/vine@2.1.0))(luxon@3.5.0) + '@japa/api-client': 2.0.3 + '@japa/plugin-adonisjs': 3.0.1(@adonisjs/core@6.12.1(@adonisjs/assembler@7.7.0(typescript@5.4.5))(@vinejs/vine@2.1.0))(@japa/api-client@2.0.3) + transitivePeerDependencies: + - '@adonisjs/assembler' + + '@adonisjs/bodyparser@10.0.2(@adonisjs/http-server@7.2.3(@adonisjs/application@8.3.1(@adonisjs/config@5.0.2)(@adonisjs/fold@10.1.2))(@adonisjs/encryption@6.0.2)(@adonisjs/events@9.0.2(@adonisjs/application@8.3.1(@adonisjs/config@5.0.2)(@adonisjs/fold@10.1.2))(@adonisjs/fold@10.1.2))(@adonisjs/fold@10.1.2)(@adonisjs/logger@6.0.3))': + dependencies: + '@adonisjs/http-server': 7.2.3(@adonisjs/application@8.3.1(@adonisjs/config@5.0.2)(@adonisjs/fold@10.1.2))(@adonisjs/encryption@6.0.2)(@adonisjs/events@9.0.2(@adonisjs/application@8.3.1(@adonisjs/config@5.0.2)(@adonisjs/fold@10.1.2))(@adonisjs/fold@10.1.2))(@adonisjs/fold@10.1.2)(@adonisjs/logger@6.0.3) + '@paralleldrive/cuid2': 2.2.2 + '@poppinss/macroable': 1.0.2 + '@poppinss/multiparty': 2.0.1 + '@poppinss/utils': 6.7.3 + '@types/qs': 6.9.15 + bytes: 3.1.2 + file-type: 19.4.0 + inflation: 2.1.0 + media-typer: 1.1.0 + qs: 6.12.1 + raw-body: 2.5.2 + + '@adonisjs/config@5.0.2': + dependencies: + '@poppinss/utils': 6.7.3 + + '@adonisjs/core@6.12.1(@adonisjs/assembler@7.7.0(typescript@5.4.5))(@vinejs/vine@2.1.0)': + dependencies: + '@adonisjs/ace': 13.1.0 + '@adonisjs/application': 8.3.1(@adonisjs/config@5.0.2)(@adonisjs/fold@10.1.2) + '@adonisjs/bodyparser': 10.0.2(@adonisjs/http-server@7.2.3(@adonisjs/application@8.3.1(@adonisjs/config@5.0.2)(@adonisjs/fold@10.1.2))(@adonisjs/encryption@6.0.2)(@adonisjs/events@9.0.2(@adonisjs/application@8.3.1(@adonisjs/config@5.0.2)(@adonisjs/fold@10.1.2))(@adonisjs/fold@10.1.2))(@adonisjs/fold@10.1.2)(@adonisjs/logger@6.0.3)) + '@adonisjs/config': 5.0.2 + '@adonisjs/encryption': 6.0.2 + '@adonisjs/env': 6.1.0 + '@adonisjs/events': 9.0.2(@adonisjs/application@8.3.1(@adonisjs/config@5.0.2)(@adonisjs/fold@10.1.2))(@adonisjs/fold@10.1.2) + '@adonisjs/fold': 10.1.2 + '@adonisjs/hash': 9.0.3 + '@adonisjs/health': 2.0.0 + '@adonisjs/http-server': 7.2.3(@adonisjs/application@8.3.1(@adonisjs/config@5.0.2)(@adonisjs/fold@10.1.2))(@adonisjs/encryption@6.0.2)(@adonisjs/events@9.0.2(@adonisjs/application@8.3.1(@adonisjs/config@5.0.2)(@adonisjs/fold@10.1.2))(@adonisjs/fold@10.1.2))(@adonisjs/fold@10.1.2)(@adonisjs/logger@6.0.3) + '@adonisjs/logger': 6.0.3 + '@adonisjs/repl': 4.0.1 + '@antfu/install-pkg': 0.3.3 + '@paralleldrive/cuid2': 2.2.2 + '@poppinss/macroable': 1.0.2 + '@poppinss/utils': 6.7.3 + '@sindresorhus/is': 6.3.1 + '@types/he': 1.2.3 + he: 1.2.0 + parse-imports: 1.2.0 + pretty-hrtime: 1.0.3 + string-width: 7.2.0 + youch: 3.3.3 + youch-terminal: 2.2.3 + optionalDependencies: + '@adonisjs/assembler': 7.7.0(typescript@5.4.5) + '@vinejs/vine': 2.1.0 + + '@adonisjs/cors@2.2.1(@adonisjs/core@6.12.1(@adonisjs/assembler@7.7.0(typescript@5.4.5))(@vinejs/vine@2.1.0))': + dependencies: + '@adonisjs/core': 6.12.1(@adonisjs/assembler@7.7.0(typescript@5.4.5))(@vinejs/vine@2.1.0) + + '@adonisjs/encryption@6.0.2': + dependencies: + '@poppinss/utils': 6.7.3 + + '@adonisjs/env@6.1.0': + dependencies: + '@poppinss/utils': 6.7.3 + '@poppinss/validator-lite': 1.0.3 + dotenv: 16.4.5 + split-lines: 3.0.0 + + '@adonisjs/eslint-config@1.3.0(eslint@8.57.0)(prettier@3.3.2)(typescript@5.4.5)': + dependencies: + '@adonisjs/eslint-plugin': 1.3.0(eslint@8.57.0)(typescript@5.4.5) + '@typescript-eslint/eslint-plugin': 6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0)(typescript@5.4.5) + '@typescript-eslint/parser': 6.21.0(eslint@8.57.0)(typescript@5.4.5) + eslint: 8.57.0 + eslint-config-prettier: 8.10.0(eslint@8.57.0) + eslint-plugin-jsonc: 2.16.0(eslint@8.57.0) + eslint-plugin-prettier: 5.2.1(eslint-config-prettier@8.10.0(eslint@8.57.0))(eslint@8.57.0)(prettier@3.3.2) + eslint-plugin-unicorn: 47.0.0(eslint@8.57.0) + jsonc-eslint-parser: 2.4.0 + prettier: 3.3.2 + transitivePeerDependencies: + - '@types/eslint' + - supports-color + - typescript + + '@adonisjs/eslint-plugin@1.3.0(eslint@8.57.0)(typescript@5.4.5)': + dependencies: + '@typescript-eslint/utils': 6.21.0(eslint@8.57.0)(typescript@5.4.5) + transitivePeerDependencies: + - eslint + - supports-color + - typescript + + '@adonisjs/events@9.0.2(@adonisjs/application@8.3.1(@adonisjs/config@5.0.2)(@adonisjs/fold@10.1.2))(@adonisjs/fold@10.1.2)': + dependencies: + '@adonisjs/application': 8.3.1(@adonisjs/config@5.0.2)(@adonisjs/fold@10.1.2) + '@adonisjs/fold': 10.1.2 + '@poppinss/utils': 6.7.3 + '@sindresorhus/is': 6.3.1 + emittery: 1.0.3 + + '@adonisjs/fold@10.1.2': + dependencies: + '@poppinss/utils': 6.7.3 + + '@adonisjs/hash@9.0.3': + dependencies: + '@phc/format': 1.0.0 + '@poppinss/utils': 6.7.3 + + '@adonisjs/health@2.0.0': + dependencies: + '@poppinss/utils': 6.7.3 + check-disk-space: 3.4.0 + + '@adonisjs/http-server@7.2.3(@adonisjs/application@8.3.1(@adonisjs/config@5.0.2)(@adonisjs/fold@10.1.2))(@adonisjs/encryption@6.0.2)(@adonisjs/events@9.0.2(@adonisjs/application@8.3.1(@adonisjs/config@5.0.2)(@adonisjs/fold@10.1.2))(@adonisjs/fold@10.1.2))(@adonisjs/fold@10.1.2)(@adonisjs/logger@6.0.3)': + dependencies: + '@adonisjs/application': 8.3.1(@adonisjs/config@5.0.2)(@adonisjs/fold@10.1.2) + '@adonisjs/encryption': 6.0.2 + '@adonisjs/events': 9.0.2(@adonisjs/application@8.3.1(@adonisjs/config@5.0.2)(@adonisjs/fold@10.1.2))(@adonisjs/fold@10.1.2) + '@adonisjs/fold': 10.1.2 + '@adonisjs/logger': 6.0.3 + '@paralleldrive/cuid2': 2.2.2 + '@poppinss/macroable': 1.0.2 + '@poppinss/matchit': 3.1.2 + '@poppinss/middleware': 3.2.3 + '@poppinss/utils': 6.7.3 + '@sindresorhus/is': 6.3.1 + accepts: 1.3.8 + content-disposition: 0.5.4 + cookie: 0.6.0 + destroy: 1.2.0 + encodeurl: 2.0.0 + etag: 1.8.1 + fresh: 0.5.2 + mime-types: 2.1.35 + on-finished: 2.4.1 + proxy-addr: 2.0.7 + qs: 6.13.0 + tmp-cache: 1.1.0 + type-is: 1.6.18 + vary: 1.1.2 + youch: 3.3.3 + + '@adonisjs/logger@6.0.3': + dependencies: + '@poppinss/utils': 6.7.3 + abstract-logging: 2.0.1 + pino: 8.21.0 + + '@adonisjs/lucid@21.1.1(@adonisjs/assembler@7.7.0(typescript@5.4.5))(@adonisjs/core@6.12.1(@adonisjs/assembler@7.7.0(typescript@5.4.5))(@vinejs/vine@2.1.0))(luxon@3.5.0)': + dependencies: + '@adonisjs/core': 6.12.1(@adonisjs/assembler@7.7.0(typescript@5.4.5))(@vinejs/vine@2.1.0) + '@adonisjs/presets': 2.6.1(@adonisjs/assembler@7.7.0(typescript@5.4.5))(@adonisjs/core@6.12.1(@adonisjs/assembler@7.7.0(typescript@5.4.5))(@vinejs/vine@2.1.0)) + '@faker-js/faker': 8.4.1 + '@poppinss/hooks': 7.2.3 + '@poppinss/macroable': 1.0.2 + '@poppinss/utils': 6.7.3 + fast-deep-equal: 3.1.3 + igniculus: 1.5.0 + kleur: 4.1.5 + knex: 3.1.0 + knex-dynamic-connection: 3.2.0 + pretty-hrtime: 1.0.3 + qs: 6.13.0 + slash: 5.1.0 + tarn: 3.0.2 + optionalDependencies: + '@adonisjs/assembler': 7.7.0(typescript@5.4.5) + luxon: 3.5.0 + transitivePeerDependencies: + - better-sqlite3 + - mysql + - mysql2 + - pg + - pg-native + - sqlite3 + - supports-color + - tedious + + '@adonisjs/presets@2.6.1(@adonisjs/assembler@7.7.0(typescript@5.4.5))(@adonisjs/core@6.12.1(@adonisjs/assembler@7.7.0(typescript@5.4.5))(@vinejs/vine@2.1.0))': + dependencies: + '@adonisjs/core': 6.12.1(@adonisjs/assembler@7.7.0(typescript@5.4.5))(@vinejs/vine@2.1.0) + '@poppinss/utils': 6.7.3 + optionalDependencies: + '@adonisjs/assembler': 7.7.0(typescript@5.4.5) + + '@adonisjs/prettier-config@1.3.0': {} + + '@adonisjs/repl@4.0.1': + dependencies: + '@poppinss/colors': 4.1.3 + string-width: 7.2.0 + + '@adonisjs/tsconfig@1.3.0': {} + '@algolia/autocomplete-core@1.9.3(@algolia/client-search@4.23.3)(algoliasearch@4.23.3)(search-insights@2.13.0)': dependencies: '@algolia/autocomplete-plugin-algolia-insights': 1.9.3(@algolia/client-search@4.23.3)(algoliasearch@4.23.3)(search-insights@2.13.0) @@ -3911,6 +6137,10 @@ snapshots: '@jridgewell/gen-mapping': 0.3.5 '@jridgewell/trace-mapping': 0.3.25 + '@antfu/install-pkg@0.3.3': + dependencies: + '@jsdevtools/ez-spawn': 3.0.4 + '@apidevtools/json-schema-ref-parser@9.0.9': dependencies: '@jsdevtools/ono': 7.1.3 @@ -3918,10 +6148,12 @@ snapshots: call-me-maybe: 1.0.2 js-yaml: 4.1.0 + '@arr/every@1.0.1': {} + '@babel/code-frame@7.24.2': dependencies: '@babel/highlight': 7.24.5 - picocolors: 1.0.0 + picocolors: 1.0.1 '@babel/code-frame@7.24.7': dependencies: @@ -4312,6 +6544,13 @@ snapshots: human-id: 1.0.2 prettier: 2.8.8 + '@colors/colors@1.5.0': + optional: true + + '@cspotcode/source-map-support@0.8.1': + dependencies: + '@jridgewell/trace-mapping': 0.3.9 + '@docsearch/css@3.6.0': {} '@docsearch/js@3.6.0(@algolia/client-search@4.23.3)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(search-insights@2.13.0)': @@ -4345,138 +6584,249 @@ snapshots: '@esbuild/aix-ppc64@0.21.5': optional: true + '@esbuild/aix-ppc64@0.23.0': + optional: true + '@esbuild/android-arm64@0.20.2': optional: true '@esbuild/android-arm64@0.21.5': optional: true + '@esbuild/android-arm64@0.23.0': + optional: true + '@esbuild/android-arm@0.20.2': optional: true '@esbuild/android-arm@0.21.5': optional: true + '@esbuild/android-arm@0.23.0': + optional: true + '@esbuild/android-x64@0.20.2': optional: true '@esbuild/android-x64@0.21.5': optional: true + '@esbuild/android-x64@0.23.0': + optional: true + '@esbuild/darwin-arm64@0.20.2': optional: true '@esbuild/darwin-arm64@0.21.5': optional: true + '@esbuild/darwin-arm64@0.23.0': + optional: true + '@esbuild/darwin-x64@0.20.2': optional: true '@esbuild/darwin-x64@0.21.5': optional: true + '@esbuild/darwin-x64@0.23.0': + optional: true + '@esbuild/freebsd-arm64@0.20.2': optional: true '@esbuild/freebsd-arm64@0.21.5': optional: true + '@esbuild/freebsd-arm64@0.23.0': + optional: true + '@esbuild/freebsd-x64@0.20.2': optional: true '@esbuild/freebsd-x64@0.21.5': optional: true + '@esbuild/freebsd-x64@0.23.0': + optional: true + '@esbuild/linux-arm64@0.20.2': optional: true '@esbuild/linux-arm64@0.21.5': optional: true + '@esbuild/linux-arm64@0.23.0': + optional: true + '@esbuild/linux-arm@0.20.2': optional: true '@esbuild/linux-arm@0.21.5': optional: true + '@esbuild/linux-arm@0.23.0': + optional: true + '@esbuild/linux-ia32@0.20.2': optional: true '@esbuild/linux-ia32@0.21.5': optional: true + '@esbuild/linux-ia32@0.23.0': + optional: true + '@esbuild/linux-loong64@0.20.2': optional: true '@esbuild/linux-loong64@0.21.5': optional: true + '@esbuild/linux-loong64@0.23.0': + optional: true + '@esbuild/linux-mips64el@0.20.2': optional: true '@esbuild/linux-mips64el@0.21.5': optional: true + '@esbuild/linux-mips64el@0.23.0': + optional: true + '@esbuild/linux-ppc64@0.20.2': optional: true '@esbuild/linux-ppc64@0.21.5': optional: true + '@esbuild/linux-ppc64@0.23.0': + optional: true + '@esbuild/linux-riscv64@0.20.2': optional: true '@esbuild/linux-riscv64@0.21.5': optional: true + '@esbuild/linux-riscv64@0.23.0': + optional: true + '@esbuild/linux-s390x@0.20.2': optional: true '@esbuild/linux-s390x@0.21.5': optional: true + '@esbuild/linux-s390x@0.23.0': + optional: true + '@esbuild/linux-x64@0.20.2': optional: true '@esbuild/linux-x64@0.21.5': optional: true + '@esbuild/linux-x64@0.23.0': + optional: true + '@esbuild/netbsd-x64@0.20.2': optional: true '@esbuild/netbsd-x64@0.21.5': optional: true + '@esbuild/netbsd-x64@0.23.0': + optional: true + + '@esbuild/openbsd-arm64@0.23.0': + optional: true + '@esbuild/openbsd-x64@0.20.2': optional: true '@esbuild/openbsd-x64@0.21.5': optional: true + '@esbuild/openbsd-x64@0.23.0': + optional: true + '@esbuild/sunos-x64@0.20.2': optional: true '@esbuild/sunos-x64@0.21.5': optional: true + '@esbuild/sunos-x64@0.23.0': + optional: true + '@esbuild/win32-arm64@0.20.2': optional: true '@esbuild/win32-arm64@0.21.5': optional: true + '@esbuild/win32-arm64@0.23.0': + optional: true + '@esbuild/win32-ia32@0.20.2': optional: true '@esbuild/win32-ia32@0.21.5': optional: true + '@esbuild/win32-ia32@0.23.0': + optional: true + '@esbuild/win32-x64@0.20.2': optional: true '@esbuild/win32-x64@0.21.5': optional: true + '@esbuild/win32-x64@0.23.0': + optional: true + + '@eslint-community/eslint-utils@4.4.0(eslint@8.57.0)': + dependencies: + eslint: 8.57.0 + eslint-visitor-keys: 3.4.3 + + '@eslint-community/regexpp@4.11.0': {} + + '@eslint/eslintrc@2.1.4': + dependencies: + ajv: 6.12.6 + debug: 4.3.6(supports-color@9.4.0) + espree: 9.6.1 + globals: 13.24.0 + ignore: 5.3.1 + import-fresh: 3.3.0 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + + '@eslint/js@8.57.0': {} + + '@faker-js/faker@8.4.1': {} + + '@fastify/deepmerge@2.0.0': {} + + '@humanwhocodes/config-array@0.11.14': + dependencies: + '@humanwhocodes/object-schema': 2.0.3 + debug: 4.3.6(supports-color@9.4.0) + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + + '@humanwhocodes/module-importer@1.0.1': {} + + '@humanwhocodes/object-schema@2.0.3': {} + '@inquirer/confirm@3.1.10': dependencies: '@inquirer/core': 8.2.3 @@ -4487,7 +6837,7 @@ snapshots: '@inquirer/figures': 1.0.3 '@inquirer/type': 1.3.3 '@types/mute-stream': 0.0.4 - '@types/node': 20.14.7 + '@types/node': 20.14.14 '@types/wrap-ansi': 3.0.0 ansi-escapes: 4.3.2 chalk: 4.1.2 @@ -4502,6 +6852,34 @@ snapshots: '@inquirer/type@1.3.3': {} + '@isaacs/cliui@8.0.2': + dependencies: + string-width: 5.1.2 + string-width-cjs: string-width@4.2.3 + strip-ansi: 7.1.0 + strip-ansi-cjs: strip-ansi@6.0.1 + wrap-ansi: 8.1.0 + wrap-ansi-cjs: wrap-ansi@7.0.0 + + '@japa/api-client@2.0.3': + dependencies: + '@poppinss/hooks': 7.2.3 + '@poppinss/macroable': 1.0.2 + '@types/superagent': 8.1.8 + cookie: 0.6.0 + set-cookie-parser: 2.7.0 + superagent: 8.1.2 + transitivePeerDependencies: + - supports-color + optional: true + + '@japa/plugin-adonisjs@3.0.1(@adonisjs/core@6.12.1(@adonisjs/assembler@7.7.0(typescript@5.4.5))(@vinejs/vine@2.1.0))(@japa/api-client@2.0.3)': + dependencies: + '@adonisjs/core': 6.12.1(@adonisjs/assembler@7.7.0(typescript@5.4.5))(@vinejs/vine@2.1.0) + optionalDependencies: + '@japa/api-client': 2.0.3 + optional: true + '@jridgewell/gen-mapping@0.3.5': dependencies: '@jridgewell/set-array': 1.2.1 @@ -4512,8 +6890,6 @@ snapshots: '@jridgewell/set-array@1.2.1': {} - '@jridgewell/sourcemap-codec@1.4.15': {} - '@jridgewell/sourcemap-codec@1.5.0': {} '@jridgewell/trace-mapping@0.3.25': @@ -4521,8 +6897,22 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.0 + '@jridgewell/trace-mapping@0.3.9': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.0 + + '@jsdevtools/ez-spawn@3.0.4': + dependencies: + call-me-maybe: 1.0.2 + cross-spawn: 7.0.3 + string-argv: 0.3.2 + type-detect: 4.1.0 + '@jsdevtools/ono@7.1.3': {} + '@lukeed/ms@2.0.2': {} + '@manypkg/find-root@1.1.0': dependencies: '@babel/runtime': 7.24.7 @@ -4579,6 +6969,8 @@ snapshots: '@next/swc-win32-x64-msvc@14.2.3': optional: true + '@noble/hashes@1.4.0': {} + '@nodelib/fs.scandir@2.1.5': dependencies: '@nodelib/fs.stat': 2.0.5 @@ -4600,12 +6992,90 @@ snapshots: '@open-draft/until@2.1.0': {} + '@paralleldrive/cuid2@2.2.2': + dependencies: + '@noble/hashes': 1.4.0 + + '@phc/format@1.0.0': {} + + '@pkgjs/parseargs@0.11.0': + optional: true + + '@pkgr/core@0.1.1': {} + '@playwright/test@1.44.1': dependencies: playwright: 1.44.1 '@polka/url@1.0.0-next.25': {} + '@poppinss/chokidar-ts@4.1.4(typescript@5.4.5)': + dependencies: + chokidar: 3.6.0 + emittery: 1.0.3 + memoize: 10.0.0 + picomatch: 4.0.2 + slash: 5.1.0 + typescript: 5.4.5 + + '@poppinss/cliui@6.4.1': + dependencies: + '@poppinss/colors': 4.1.3 + cli-boxes: 3.0.0 + cli-table3: 0.6.5 + cli-truncate: 4.0.0 + log-update: 6.1.0 + pretty-hrtime: 1.0.3 + string-width: 7.2.0 + supports-color: 9.4.0 + terminal-size: 4.0.0 + wordwrap: 1.0.0 + + '@poppinss/colors@4.1.3': + dependencies: + kleur: 4.1.5 + + '@poppinss/hooks@7.2.3': {} + + '@poppinss/macroable@1.0.2': {} + + '@poppinss/matchit@3.1.2': + dependencies: + '@arr/every': 1.0.1 + + '@poppinss/middleware@3.2.3': {} + + '@poppinss/multiparty@2.0.1': + dependencies: + http-errors: 2.0.0 + safe-buffer: 5.2.1 + uid-safe: 2.1.5 + + '@poppinss/prompts@3.1.3': + dependencies: + '@poppinss/colors': 4.1.3 + '@poppinss/utils': 6.7.3 + enquirer: 2.4.1 + + '@poppinss/utils@6.7.3': + dependencies: + '@lukeed/ms': 2.0.2 + '@types/bytes': 3.1.4 + '@types/pluralize': 0.0.33 + bytes: 3.1.2 + case-anything: 2.1.13 + flattie: 1.1.1 + pluralize: 8.0.0 + safe-stable-stringify: 2.4.3 + secure-json-parse: 2.7.0 + slash: 5.1.0 + slugify: 1.6.6 + truncatise: 0.0.8 + + '@poppinss/validator-lite@1.0.3': + dependencies: + validator: 13.12.0 + '@redocly/ajv@8.11.0': dependencies: fast-deep-equal: 3.1.3 @@ -4632,68 +7102,130 @@ snapshots: - encoding - supports-color + '@rollup/pluginutils@5.1.0(rollup@4.20.0)': + dependencies: + '@types/estree': 1.0.5 + estree-walker: 2.0.2 + picomatch: 2.3.1 + optionalDependencies: + rollup: 4.20.0 + '@rollup/rollup-android-arm-eabi@4.18.0': optional: true + '@rollup/rollup-android-arm-eabi@4.20.0': + optional: true + '@rollup/rollup-android-arm64@4.18.0': optional: true + '@rollup/rollup-android-arm64@4.20.0': + optional: true + '@rollup/rollup-darwin-arm64@4.18.0': optional: true + '@rollup/rollup-darwin-arm64@4.20.0': + optional: true + '@rollup/rollup-darwin-x64@4.18.0': optional: true + '@rollup/rollup-darwin-x64@4.20.0': + optional: true + '@rollup/rollup-linux-arm-gnueabihf@4.18.0': optional: true + '@rollup/rollup-linux-arm-gnueabihf@4.20.0': + optional: true + '@rollup/rollup-linux-arm-musleabihf@4.18.0': optional: true + '@rollup/rollup-linux-arm-musleabihf@4.20.0': + optional: true + '@rollup/rollup-linux-arm64-gnu@4.18.0': optional: true + '@rollup/rollup-linux-arm64-gnu@4.20.0': + optional: true + '@rollup/rollup-linux-arm64-musl@4.18.0': optional: true + '@rollup/rollup-linux-arm64-musl@4.20.0': + optional: true + '@rollup/rollup-linux-powerpc64le-gnu@4.18.0': optional: true + '@rollup/rollup-linux-powerpc64le-gnu@4.20.0': + optional: true + '@rollup/rollup-linux-riscv64-gnu@4.18.0': optional: true + '@rollup/rollup-linux-riscv64-gnu@4.20.0': + optional: true + '@rollup/rollup-linux-s390x-gnu@4.18.0': optional: true + '@rollup/rollup-linux-s390x-gnu@4.20.0': + optional: true + '@rollup/rollup-linux-x64-gnu@4.18.0': optional: true + '@rollup/rollup-linux-x64-gnu@4.20.0': + optional: true + '@rollup/rollup-linux-x64-musl@4.18.0': optional: true + '@rollup/rollup-linux-x64-musl@4.20.0': + optional: true + '@rollup/rollup-win32-arm64-msvc@4.18.0': optional: true + '@rollup/rollup-win32-arm64-msvc@4.20.0': + optional: true + '@rollup/rollup-win32-ia32-msvc@4.18.0': optional: true + '@rollup/rollup-win32-ia32-msvc@4.20.0': + optional: true + '@rollup/rollup-win32-x64-msvc@4.18.0': optional: true + '@rollup/rollup-win32-x64-msvc@4.20.0': + optional: true + + '@sec-ant/readable-stream@0.4.1': {} + '@shikijs/core@1.6.4': {} '@shikijs/transformers@1.6.4': dependencies: shiki: 1.6.4 - '@sveltejs/adapter-auto@3.2.2(@sveltejs/kit@2.5.19(@sveltejs/vite-plugin-svelte@3.1.1(svelte@4.2.18)(vite@5.3.5(@types/node@20.14.7)))(svelte@4.2.18)(vite@5.3.5(@types/node@20.14.7)))': + '@sindresorhus/is@6.3.1': {} + + '@sindresorhus/merge-streams@2.3.0': {} + + '@sveltejs/adapter-auto@3.2.2(@sveltejs/kit@2.5.19(@sveltejs/vite-plugin-svelte@3.1.1(svelte@4.2.18)(vite@5.3.5(@types/node@22.1.0)))(svelte@4.2.18)(vite@5.3.5(@types/node@22.1.0)))': dependencies: - '@sveltejs/kit': 2.5.19(@sveltejs/vite-plugin-svelte@3.1.1(svelte@4.2.18)(vite@5.3.5(@types/node@20.14.7)))(svelte@4.2.18)(vite@5.3.5(@types/node@20.14.7)) + '@sveltejs/kit': 2.5.19(@sveltejs/vite-plugin-svelte@3.1.1(svelte@4.2.18)(vite@5.3.5(@types/node@22.1.0)))(svelte@4.2.18)(vite@5.3.5(@types/node@22.1.0)) import-meta-resolve: 4.1.0 - '@sveltejs/kit@2.5.19(@sveltejs/vite-plugin-svelte@3.1.1(svelte@4.2.18)(vite@5.3.5(@types/node@20.14.7)))(svelte@4.2.18)(vite@5.3.5(@types/node@20.14.7))': + '@sveltejs/kit@2.5.19(@sveltejs/vite-plugin-svelte@3.1.1(svelte@4.2.18)(vite@5.3.5(@types/node@22.1.0)))(svelte@4.2.18)(vite@5.3.5(@types/node@22.1.0))': dependencies: - '@sveltejs/vite-plugin-svelte': 3.1.1(svelte@4.2.18)(vite@5.3.5(@types/node@20.14.7)) + '@sveltejs/vite-plugin-svelte': 3.1.1(svelte@4.2.18)(vite@5.3.5(@types/node@22.1.0)) '@types/cookie': 0.6.0 cookie: 0.6.0 devalue: 5.0.0 @@ -4707,28 +7239,28 @@ snapshots: sirv: 2.0.4 svelte: 4.2.18 tiny-glob: 0.2.9 - vite: 5.3.5(@types/node@20.14.7) + vite: 5.3.5(@types/node@22.1.0) - '@sveltejs/vite-plugin-svelte-inspector@2.1.0(@sveltejs/vite-plugin-svelte@3.1.1(svelte@4.2.18)(vite@5.3.5(@types/node@20.14.7)))(svelte@4.2.18)(vite@5.3.5(@types/node@20.14.7))': + '@sveltejs/vite-plugin-svelte-inspector@2.1.0(@sveltejs/vite-plugin-svelte@3.1.1(svelte@4.2.18)(vite@5.3.5(@types/node@22.1.0)))(svelte@4.2.18)(vite@5.3.5(@types/node@22.1.0))': dependencies: - '@sveltejs/vite-plugin-svelte': 3.1.1(svelte@4.2.18)(vite@5.3.5(@types/node@20.14.7)) + '@sveltejs/vite-plugin-svelte': 3.1.1(svelte@4.2.18)(vite@5.3.5(@types/node@22.1.0)) debug: 4.3.6(supports-color@9.4.0) svelte: 4.2.18 - vite: 5.3.5(@types/node@20.14.7) + vite: 5.3.5(@types/node@22.1.0) transitivePeerDependencies: - supports-color - '@sveltejs/vite-plugin-svelte@3.1.1(svelte@4.2.18)(vite@5.3.5(@types/node@20.14.7))': + '@sveltejs/vite-plugin-svelte@3.1.1(svelte@4.2.18)(vite@5.3.5(@types/node@22.1.0))': dependencies: - '@sveltejs/vite-plugin-svelte-inspector': 2.1.0(@sveltejs/vite-plugin-svelte@3.1.1(svelte@4.2.18)(vite@5.3.5(@types/node@20.14.7)))(svelte@4.2.18)(vite@5.3.5(@types/node@20.14.7)) + '@sveltejs/vite-plugin-svelte-inspector': 2.1.0(@sveltejs/vite-plugin-svelte@3.1.1(svelte@4.2.18)(vite@5.3.5(@types/node@22.1.0)))(svelte@4.2.18)(vite@5.3.5(@types/node@22.1.0)) debug: 4.3.6(supports-color@9.4.0) deepmerge: 4.3.1 kleur: 4.1.5 magic-string: 0.30.11 svelte: 4.2.18 svelte-hmr: 0.16.0(svelte@4.2.18) - vite: 5.3.5(@types/node@20.14.7) - vitefu: 0.2.5(vite@5.3.5(@types/node@20.14.7)) + vite: 5.3.5(@types/node@22.1.0) + vitefu: 0.2.5(vite@5.3.5(@types/node@22.1.0)) transitivePeerDependencies: - supports-color @@ -4825,9 +7357,26 @@ snapshots: '@types/react': 18.3.1 '@types/react-dom': 18.3.0 + '@tokenizer/token@0.3.0': {} + '@tootallnate/once@2.0.0': optional: true + '@ts-morph/common@0.23.0': + dependencies: + fast-glob: 3.3.2 + minimatch: 9.0.5 + mkdirp: 3.0.1 + path-browserify: 1.0.1 + + '@tsconfig/node10@1.0.11': {} + + '@tsconfig/node12@1.0.11': {} + + '@tsconfig/node14@1.0.3': {} + + '@tsconfig/node16@1.0.4': {} + '@tsconfig/node20@20.1.4': {} '@types/aria-query@5.0.4': {} @@ -4853,18 +7402,27 @@ snapshots: dependencies: '@babel/types': 7.24.7 + '@types/bytes@3.1.4': {} + '@types/cookie@0.6.0': {} + '@types/cookiejar@2.1.5': + optional: true + '@types/degit@2.8.6': {} '@types/estree@1.0.5': {} + '@types/he@1.2.3': {} + '@types/js-yaml@4.0.9': {} '@types/json-schema@7.0.15': {} '@types/linkify-it@5.0.0': {} + '@types/lodash@4.17.7': {} + '@types/markdown-it@14.1.1': dependencies: '@types/linkify-it': 5.0.0 @@ -4872,24 +7430,39 @@ snapshots: '@types/mdurl@2.0.0': {} + '@types/methods@1.1.4': + optional: true + '@types/minimist@1.2.5': {} '@types/mute-stream@0.0.4': dependencies: - '@types/node': 20.14.7 + '@types/node': 20.14.14 '@types/node@12.20.55': {} + '@types/node@20.14.14': + dependencies: + undici-types: 5.26.5 + '@types/node@20.14.7': dependencies: undici-types: 5.26.5 + '@types/node@22.1.0': + dependencies: + undici-types: 6.13.0 + '@types/normalize-package-data@2.4.4': {} + '@types/pluralize@0.0.33': {} + '@types/prop-types@15.7.12': {} '@types/pug@2.0.10': {} + '@types/qs@6.9.15': {} + '@types/react-dom@18.3.0': dependencies: '@types/react': 18.3.1 @@ -4908,36 +7481,147 @@ snapshots: '@types/statuses@2.0.5': {} + '@types/superagent@8.1.8': + dependencies: + '@types/cookiejar': 2.1.5 + '@types/methods': 1.1.4 + '@types/node': 20.14.14 + form-data: 4.0.0 + optional: true + + '@types/validator@13.12.0': {} + '@types/web-bluetooth@0.0.20': {} '@types/wrap-ansi@3.0.0': {} - '@vitejs/plugin-react-swc@3.7.0(@swc/helpers@0.5.5)(vite@5.3.5(@types/node@20.14.7))': + '@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0)(typescript@5.4.5)': + dependencies: + '@eslint-community/regexpp': 4.11.0 + '@typescript-eslint/parser': 6.21.0(eslint@8.57.0)(typescript@5.4.5) + '@typescript-eslint/scope-manager': 6.21.0 + '@typescript-eslint/type-utils': 6.21.0(eslint@8.57.0)(typescript@5.4.5) + '@typescript-eslint/utils': 6.21.0(eslint@8.57.0)(typescript@5.4.5) + '@typescript-eslint/visitor-keys': 6.21.0 + debug: 4.3.6(supports-color@9.4.0) + eslint: 8.57.0 + graphemer: 1.4.0 + ignore: 5.3.1 + natural-compare: 1.4.0 + semver: 7.6.3 + ts-api-utils: 1.3.0(typescript@5.4.5) + optionalDependencies: + typescript: 5.4.5 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.4.5)': + dependencies: + '@typescript-eslint/scope-manager': 6.21.0 + '@typescript-eslint/types': 6.21.0 + '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.4.5) + '@typescript-eslint/visitor-keys': 6.21.0 + debug: 4.3.6(supports-color@9.4.0) + eslint: 8.57.0 + optionalDependencies: + typescript: 5.4.5 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/scope-manager@6.21.0': + dependencies: + '@typescript-eslint/types': 6.21.0 + '@typescript-eslint/visitor-keys': 6.21.0 + + '@typescript-eslint/type-utils@6.21.0(eslint@8.57.0)(typescript@5.4.5)': + dependencies: + '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.4.5) + '@typescript-eslint/utils': 6.21.0(eslint@8.57.0)(typescript@5.4.5) + debug: 4.3.6(supports-color@9.4.0) + eslint: 8.57.0 + ts-api-utils: 1.3.0(typescript@5.4.5) + optionalDependencies: + typescript: 5.4.5 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/types@6.21.0': {} + + '@typescript-eslint/typescript-estree@6.21.0(typescript@5.4.5)': + dependencies: + '@typescript-eslint/types': 6.21.0 + '@typescript-eslint/visitor-keys': 6.21.0 + debug: 4.3.6(supports-color@9.4.0) + globby: 11.1.0 + is-glob: 4.0.3 + minimatch: 9.0.3 + semver: 7.6.3 + ts-api-utils: 1.3.0(typescript@5.4.5) + optionalDependencies: + typescript: 5.4.5 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/utils@6.21.0(eslint@8.57.0)(typescript@5.4.5)': + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) + '@types/json-schema': 7.0.15 + '@types/semver': 7.5.8 + '@typescript-eslint/scope-manager': 6.21.0 + '@typescript-eslint/types': 6.21.0 + '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.4.5) + eslint: 8.57.0 + semver: 7.6.3 + transitivePeerDependencies: + - supports-color + - typescript + + '@typescript-eslint/visitor-keys@6.21.0': + dependencies: + '@typescript-eslint/types': 6.21.0 + eslint-visitor-keys: 3.4.3 + + '@ungap/structured-clone@1.2.0': {} + + '@vinejs/compiler@2.5.0': {} + + '@vinejs/vine@2.1.0': + dependencies: + '@poppinss/macroable': 1.0.2 + '@types/validator': 13.12.0 + '@vinejs/compiler': 2.5.0 + camelcase: 8.0.0 + dayjs: 1.11.12 + dlv: 1.1.3 + normalize-url: 8.0.1 + validator: 13.12.0 + + '@vitejs/plugin-react-swc@3.7.0(@swc/helpers@0.5.5)(vite@5.3.5(@types/node@22.1.0))': dependencies: '@swc/core': 1.7.4(@swc/helpers@0.5.5) - vite: 5.3.5(@types/node@20.14.7) + vite: 5.3.5(@types/node@22.1.0) transitivePeerDependencies: - '@swc/helpers' - '@vitejs/plugin-react@4.3.1(vite@5.3.5(@types/node@20.14.7))': + '@vitejs/plugin-react@4.3.1(vite@5.3.5(@types/node@22.1.0))': dependencies: '@babel/core': 7.24.7 '@babel/plugin-transform-react-jsx-self': 7.24.7(@babel/core@7.24.7) '@babel/plugin-transform-react-jsx-source': 7.24.7(@babel/core@7.24.7) '@types/babel__core': 7.20.5 react-refresh: 0.14.2 - vite: 5.3.5(@types/node@20.14.7) + vite: 5.3.5(@types/node@22.1.0) transitivePeerDependencies: - supports-color - '@vitejs/plugin-vue@5.1.2(vite@5.3.5(@types/node@20.14.7))(vue@3.4.35(typescript@5.4.5))': + '@vitejs/plugin-vue@5.1.2(vite@5.3.5(@types/node@22.1.0))(vue@3.4.35(typescript@5.4.5))': dependencies: - vite: 5.3.5(@types/node@20.14.7) + vite: 5.3.5(@types/node@22.1.0) vue: 3.4.35(typescript@5.4.5) - '@vitejs/plugin-vue@5.1.2(vite@5.3.5(@types/node@20.14.7))(vue@3.4.35(typescript@5.5.4))': + '@vitejs/plugin-vue@5.1.2(vite@5.3.5(@types/node@22.1.0))(vue@3.4.35(typescript@5.5.4))': dependencies: - vite: 5.3.5(@types/node@20.14.7) + vite: 5.3.5(@types/node@22.1.0) vue: 3.4.35(typescript@5.5.4) '@vitest/expect@2.0.5': @@ -5118,16 +7802,30 @@ snapshots: abab@2.0.6: optional: true + abort-controller@3.0.0: + dependencies: + event-target-shim: 5.0.1 + + abstract-logging@2.0.1: {} + + accepts@1.3.8: + dependencies: + mime-types: 2.1.35 + negotiator: 0.6.3 + acorn-globals@7.0.1: dependencies: acorn: 8.12.1 acorn-walk: 8.3.3 optional: true + acorn-jsx@5.3.2(acorn@8.12.1): + dependencies: + acorn: 8.12.1 + acorn-walk@8.3.3: dependencies: acorn: 8.12.1 - optional: true acorn@8.12.1: {} @@ -5149,6 +7847,13 @@ snapshots: clean-stack: 4.2.0 indent-string: 5.0.0 + ajv@6.12.6: + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + algoliasearch@4.23.3: dependencies: '@algolia/cache-browser-local-storage': 4.23.3 @@ -5173,6 +7878,10 @@ snapshots: dependencies: type-fest: 0.21.3 + ansi-escapes@7.0.0: + dependencies: + environment: 1.1.0 + ansi-regex@5.0.1: {} ansi-regex@6.0.1: {} @@ -5187,11 +7896,17 @@ snapshots: ansi-styles@5.2.0: {} + ansi-styles@6.2.1: {} + + any-promise@1.3.0: {} + anymatch@3.1.3: dependencies: normalize-path: 3.0.0 picomatch: 2.3.1 + arg@4.1.3: {} + argparse@1.0.10: dependencies: sprintf-js: 1.0.3 @@ -5229,12 +7944,18 @@ snapshots: arrify@1.0.1: {} + as-table@1.0.55: + dependencies: + printable-characters: 1.0.42 + asap@2.0.6: {} assertion-error@2.0.1: {} asynckit@0.4.0: {} + atomic-sleep@1.0.0: {} + available-typed-arrays@1.0.7: dependencies: possible-typed-array-names: 1.0.0 @@ -5251,6 +7972,12 @@ snapshots: balanced-match@1.0.2: {} + base64-js@1.5.1: {} + + basic-auth@2.0.1: + dependencies: + safe-buffer: 5.1.2 + better-path-resolve@1.0.0: dependencies: is-windows: 1.0.2 @@ -5287,10 +8014,24 @@ snapshots: buffer-crc32@1.0.0: {} + buffer@6.0.3: + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + + builtin-modules@3.3.0: {} + + bundle-require@5.0.0(esbuild@0.23.0): + dependencies: + esbuild: 0.23.0 + load-tsconfig: 0.2.5 + busboy@1.6.0: dependencies: streamsearch: 1.1.0 + bytes@3.1.2: {} + cac@6.7.14: {} call-bind@1.0.7: @@ -5303,6 +8044,8 @@ snapshots: call-me-maybe@1.0.2: {} + callsites@3.1.0: {} + camelcase-keys@6.2.2: dependencies: camelcase: 5.3.1 @@ -5320,8 +8063,12 @@ snapshots: camelcase@6.3.0: {} + camelcase@8.0.0: {} + caniuse-lite@1.0.30001646: {} + case-anything@2.1.13: {} + chai@5.1.1: dependencies: assertion-error: 2.0.1 @@ -5343,6 +8090,8 @@ snapshots: chardet@0.7.0: {} + check-disk-space@3.4.0: {} + check-error@2.1.1: {} chokidar@3.6.0: @@ -5359,12 +8108,33 @@ snapshots: ci-info@3.9.0: {} + clean-regexp@1.0.0: + dependencies: + escape-string-regexp: 1.0.5 + clean-stack@4.2.0: dependencies: - escape-string-regexp: 5.0.0 + escape-string-regexp: 5.0.0 + + cli-boxes@3.0.0: {} + + cli-cursor@5.0.0: + dependencies: + restore-cursor: 5.1.0 cli-spinners@2.9.2: {} + cli-table3@0.6.5: + dependencies: + string-width: 4.2.3 + optionalDependencies: + '@colors/colors': 1.5.0 + + cli-truncate@4.0.0: + dependencies: + slice-ansi: 5.0.0 + string-width: 7.2.0 + cli-width@4.1.0: {} client-only@0.0.1: {} @@ -5383,6 +8153,8 @@ snapshots: clone@1.0.4: {} + code-block-writer@13.0.2: {} + code-red@1.0.4: dependencies: '@jridgewell/sourcemap-codec': 1.5.0 @@ -5405,18 +8177,32 @@ snapshots: colorette@1.4.0: {} + colorette@2.0.19: {} + + colorette@2.0.20: {} + combined-stream@1.0.8: dependencies: delayed-stream: 1.0.0 + commander@10.0.1: {} + commander@11.1.0: {} + commander@4.1.1: {} + component-emitter@1.3.1: {} computeds@0.0.1: {} concat-map@0.0.1: {} + consola@3.2.3: {} + + content-disposition@0.5.4: + dependencies: + safe-buffer: 5.2.1 + convert-source-map@2.0.0: {} cookie@0.5.0: {} @@ -5425,6 +8211,22 @@ snapshots: cookiejar@2.1.4: {} + copy-file@11.0.0: + dependencies: + graceful-fs: 4.2.11 + p-event: 6.0.1 + + cpy@11.1.0: + dependencies: + copy-file: 11.0.0 + globby: 14.0.2 + junk: 4.0.1 + micromatch: 4.0.7 + p-filter: 4.1.0 + p-map: 7.0.2 + + create-require@1.1.1: {} + cross-spawn@5.1.0: dependencies: lru-cache: 4.1.5 @@ -5468,6 +8270,8 @@ snapshots: csv-stringify: 5.6.5 stream-transform: 2.1.3 + data-uri-to-buffer@2.0.2: {} + data-urls@3.0.2: dependencies: abab: 2.0.6 @@ -5495,8 +8299,16 @@ snapshots: dataloader@1.4.0: {} + dateformat@4.6.3: {} + + dayjs@1.11.12: {} + de-indent@1.0.2: {} + debug@4.3.4: + dependencies: + ms: 2.1.2 + debug@4.3.5(supports-color@9.4.0): dependencies: ms: 2.1.2 @@ -5521,8 +8333,12 @@ snapshots: decimal.js@10.4.3: optional: true + dedent@1.5.3: {} + deep-eql@5.0.2: {} + deep-is@0.1.4: {} + deepmerge@4.3.1: {} defaults@1.0.4: @@ -5561,8 +8377,12 @@ snapshots: delayed-stream@1.0.0: {} + depd@2.0.0: {} + dequal@2.0.3: {} + destroy@1.2.0: {} + detect-indent@6.1.0: {} devalue@5.0.0: {} @@ -5572,10 +8392,18 @@ snapshots: asap: 2.0.6 wrappy: 1.0.2 + diff@4.0.2: {} + dir-glob@3.0.1: dependencies: path-type: 4.0.0 + dlv@1.1.3: {} + + doctrine@3.0.0: + dependencies: + esutils: 2.0.3 + dom-accessibility-api@0.5.16: {} domexception@4.0.0: @@ -5583,12 +8411,30 @@ snapshots: webidl-conversions: 7.0.0 optional: true + dotenv@16.4.5: {} + dotenv@8.6.0: {} + eastasianwidth@0.2.0: {} + + ee-first@1.1.1: {} + electron-to-chromium@1.4.807: {} + emittery@1.0.3: {} + + emoji-regex@10.3.0: {} + emoji-regex@8.0.0: {} + emoji-regex@9.2.2: {} + + encodeurl@2.0.0: {} + + end-of-stream@1.4.4: + dependencies: + once: 1.4.0 + enquirer@2.4.1: dependencies: ansi-colors: 4.1.3 @@ -5596,6 +8442,8 @@ snapshots: entities@4.5.0: {} + environment@1.1.0: {} + error-ex@1.3.2: dependencies: is-arrayish: 0.2.1 @@ -5655,6 +8503,8 @@ snapshots: es-errors@1.3.0: {} + es-module-lexer@1.5.4: {} + es-object-atoms@1.0.0: dependencies: es-errors: 1.3.0 @@ -5729,10 +8579,39 @@ snapshots: '@esbuild/win32-ia32': 0.21.5 '@esbuild/win32-x64': 0.21.5 + esbuild@0.23.0: + optionalDependencies: + '@esbuild/aix-ppc64': 0.23.0 + '@esbuild/android-arm': 0.23.0 + '@esbuild/android-arm64': 0.23.0 + '@esbuild/android-x64': 0.23.0 + '@esbuild/darwin-arm64': 0.23.0 + '@esbuild/darwin-x64': 0.23.0 + '@esbuild/freebsd-arm64': 0.23.0 + '@esbuild/freebsd-x64': 0.23.0 + '@esbuild/linux-arm': 0.23.0 + '@esbuild/linux-arm64': 0.23.0 + '@esbuild/linux-ia32': 0.23.0 + '@esbuild/linux-loong64': 0.23.0 + '@esbuild/linux-mips64el': 0.23.0 + '@esbuild/linux-ppc64': 0.23.0 + '@esbuild/linux-riscv64': 0.23.0 + '@esbuild/linux-s390x': 0.23.0 + '@esbuild/linux-x64': 0.23.0 + '@esbuild/netbsd-x64': 0.23.0 + '@esbuild/openbsd-arm64': 0.23.0 + '@esbuild/openbsd-x64': 0.23.0 + '@esbuild/sunos-x64': 0.23.0 + '@esbuild/win32-arm64': 0.23.0 + '@esbuild/win32-ia32': 0.23.0 + '@esbuild/win32-x64': 0.23.0 + escalade@3.1.2: {} escape-string-regexp@1.0.5: {} + escape-string-regexp@4.0.0: {} + escape-string-regexp@5.0.0: {} escodegen@2.1.0: @@ -5744,12 +8623,126 @@ snapshots: source-map: 0.6.1 optional: true + eslint-compat-utils@0.5.1(eslint@8.57.0): + dependencies: + eslint: 8.57.0 + semver: 7.6.3 + + eslint-config-prettier@8.10.0(eslint@8.57.0): + dependencies: + eslint: 8.57.0 + + eslint-plugin-jsonc@2.16.0(eslint@8.57.0): + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) + eslint: 8.57.0 + eslint-compat-utils: 0.5.1(eslint@8.57.0) + espree: 9.6.1 + graphemer: 1.4.0 + jsonc-eslint-parser: 2.4.0 + natural-compare: 1.4.0 + synckit: 0.6.2 + + eslint-plugin-prettier@5.2.1(eslint-config-prettier@8.10.0(eslint@8.57.0))(eslint@8.57.0)(prettier@3.3.2): + dependencies: + eslint: 8.57.0 + prettier: 3.3.2 + prettier-linter-helpers: 1.0.0 + synckit: 0.9.1 + optionalDependencies: + eslint-config-prettier: 8.10.0(eslint@8.57.0) + + eslint-plugin-unicorn@47.0.0(eslint@8.57.0): + dependencies: + '@babel/helper-validator-identifier': 7.24.7 + '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) + ci-info: 3.9.0 + clean-regexp: 1.0.0 + eslint: 8.57.0 + esquery: 1.6.0 + indent-string: 4.0.0 + is-builtin-module: 3.2.1 + jsesc: 3.0.2 + lodash: 4.17.21 + pluralize: 8.0.0 + read-pkg-up: 7.0.1 + regexp-tree: 0.1.27 + regjsparser: 0.10.0 + safe-regex: 2.1.1 + semver: 7.6.3 + strip-indent: 3.0.0 + + eslint-scope@7.2.2: + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + + eslint-visitor-keys@3.4.3: {} + + eslint@8.57.0: + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) + '@eslint-community/regexpp': 4.11.0 + '@eslint/eslintrc': 2.1.4 + '@eslint/js': 8.57.0 + '@humanwhocodes/config-array': 0.11.14 + '@humanwhocodes/module-importer': 1.0.1 + '@nodelib/fs.walk': 1.2.8 + '@ungap/structured-clone': 1.2.0 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.3 + debug: 4.3.6(supports-color@9.4.0) + doctrine: 3.0.0 + escape-string-regexp: 4.0.0 + eslint-scope: 7.2.2 + eslint-visitor-keys: 3.4.3 + espree: 9.6.1 + esquery: 1.6.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 6.0.1 + find-up: 5.0.0 + glob-parent: 6.0.2 + globals: 13.24.0 + graphemer: 1.4.0 + ignore: 5.3.1 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + is-path-inside: 3.0.3 + js-yaml: 4.1.0 + json-stable-stringify-without-jsonify: 1.0.1 + levn: 0.4.1 + lodash.merge: 4.6.2 + minimatch: 3.1.2 + natural-compare: 1.4.0 + optionator: 0.9.4 + strip-ansi: 6.0.1 + text-table: 0.2.0 + transitivePeerDependencies: + - supports-color + esm-env@1.0.0: {} + esm@3.2.25: {} + + espree@9.6.1: + dependencies: + acorn: 8.12.1 + acorn-jsx: 5.3.2(acorn@8.12.1) + eslint-visitor-keys: 3.4.3 + esprima@4.0.1: {} - estraverse@5.3.0: - optional: true + esquery@1.6.0: + dependencies: + estraverse: 5.3.0 + + esrecurse@4.3.0: + dependencies: + estraverse: 5.3.0 + + estraverse@5.3.0: {} estree-walker@2.0.2: {} @@ -5757,8 +8750,25 @@ snapshots: dependencies: '@types/estree': 1.0.5 - esutils@2.0.3: - optional: true + esutils@2.0.3: {} + + etag@1.8.1: {} + + event-target-shim@5.0.1: {} + + events@3.3.0: {} + + execa@5.1.1: + dependencies: + cross-spawn: 7.0.3 + get-stream: 6.0.1 + human-signals: 2.1.0 + is-stream: 2.0.1 + merge-stream: 2.0.0 + npm-run-path: 4.0.1 + onetime: 5.1.2 + signal-exit: 3.0.7 + strip-final-newline: 2.0.0 execa@8.0.1: dependencies: @@ -5780,8 +8790,12 @@ snapshots: iconv-lite: 0.4.24 tmp: 0.0.33 + fast-copy@3.0.2: {} + fast-deep-equal@3.1.3: {} + fast-diff@1.3.0: {} + fast-glob@3.3.2: dependencies: '@nodelib/fs.stat': 2.0.5 @@ -5790,12 +8804,31 @@ snapshots: merge2: 1.4.1 micromatch: 4.0.5 + fast-json-stable-stringify@2.1.0: {} + + fast-levenshtein@2.0.6: {} + + fast-redact@3.5.0: {} + fast-safe-stringify@2.1.1: {} + fastest-levenshtein@1.0.16: {} + fastq@1.17.1: dependencies: reusify: 1.0.4 + file-entry-cache@6.0.1: + dependencies: + flat-cache: 3.2.0 + + file-type@19.4.0: + dependencies: + get-stream: 9.0.1 + strtok3: 8.0.1 + token-types: 6.0.0 + uint8array-extras: 1.4.0 + fill-range@7.0.1: dependencies: to-regex-range: 5.0.1 @@ -5804,6 +8837,8 @@ snapshots: dependencies: to-regex-range: 5.0.1 + find-up-simple@1.0.0: {} + find-up@4.1.0: dependencies: locate-path: 5.0.0 @@ -5819,6 +8854,16 @@ snapshots: micromatch: 4.0.7 pkg-dir: 4.2.0 + flat-cache@3.2.0: + dependencies: + flatted: 3.3.1 + keyv: 4.5.4 + rimraf: 3.0.2 + + flatted@3.3.1: {} + + flattie@1.1.1: {} + focus-trap@7.5.4: dependencies: tabbable: 6.2.0 @@ -5829,18 +8874,35 @@ snapshots: dependencies: is-callable: 1.2.7 + foreground-child@3.3.0: + dependencies: + cross-spawn: 7.0.3 + signal-exit: 4.1.0 + form-data@4.0.0: dependencies: asynckit: 0.4.0 combined-stream: 1.0.8 mime-types: 2.1.35 + formidable@2.1.2: + dependencies: + dezalgo: 1.0.4 + hexoid: 1.0.0 + once: 1.4.0 + qs: 6.13.0 + optional: true + formidable@3.5.1: dependencies: dezalgo: 1.0.4 hexoid: 1.0.0 once: 1.4.0 + forwarded@0.2.0: {} + + fresh@0.5.2: {} + fs-extra@11.2.0: dependencies: graceful-fs: 4.2.11 @@ -5882,6 +8944,8 @@ snapshots: get-caller-file@2.0.5: {} + get-east-asian-width@1.2.0: {} + get-func-name@2.0.2: {} get-intrinsic@1.2.4: @@ -5892,18 +8956,49 @@ snapshots: has-symbols: 1.0.3 hasown: 2.0.2 + get-package-type@0.1.0: {} + + get-port@7.1.0: {} + + get-source@2.0.12: + dependencies: + data-uri-to-buffer: 2.0.2 + source-map: 0.6.1 + + get-stream@6.0.1: {} + get-stream@8.0.1: {} + get-stream@9.0.1: + dependencies: + '@sec-ant/readable-stream': 0.4.1 + is-stream: 4.0.1 + get-symbol-description@1.0.2: dependencies: call-bind: 1.0.7 es-errors: 1.3.0 get-intrinsic: 1.2.4 + getopts@2.3.0: {} + glob-parent@5.1.2: dependencies: is-glob: 4.0.3 + glob-parent@6.0.2: + dependencies: + is-glob: 4.0.3 + + glob@10.4.5: + dependencies: + foreground-child: 3.3.0 + jackspeak: 3.4.3 + minimatch: 9.0.5 + minipass: 7.1.2 + package-json-from-dist: 1.0.0 + path-scurry: 1.11.1 + glob@7.2.3: dependencies: fs.realpath: 1.0.0 @@ -5915,6 +9010,10 @@ snapshots: globals@11.12.0: {} + globals@13.24.0: + dependencies: + type-fest: 0.20.2 + globalthis@1.0.4: dependencies: define-properties: 1.2.1 @@ -5939,6 +9038,15 @@ snapshots: merge2: 1.4.1 slash: 4.0.0 + globby@14.0.2: + dependencies: + '@sindresorhus/merge-streams': 2.3.0 + fast-glob: 3.3.2 + ignore: 5.3.1 + path-type: 5.0.0 + slash: 5.1.0 + unicorn-magic: 0.1.0 + globrex@0.1.2: {} gopd@1.0.1: @@ -5949,6 +9057,8 @@ snapshots: grapheme-splitter@1.0.4: {} + graphemer@1.4.0: {} + graphql@16.8.2: {} handlebars@4.7.8: @@ -5988,6 +9098,8 @@ snapshots: headers-polyfill@4.0.3: {} + help-me@5.0.0: {} + hexoid@1.0.0: {} hookable@5.5.3: {} @@ -5998,11 +9110,30 @@ snapshots: dependencies: lru-cache: 6.0.0 + hosted-git-info@7.0.2: + dependencies: + lru-cache: 10.4.3 + + hot-hook@0.2.6: + dependencies: + chokidar: 3.6.0 + fast-glob: 3.3.2 + picomatch: 4.0.2 + read-package-up: 11.0.0 + html-encoding-sniffer@3.0.0: dependencies: whatwg-encoding: 2.0.0 optional: true + http-errors@2.0.0: + dependencies: + depd: 2.0.0 + inherits: 2.0.4 + setprototypeof: 1.2.0 + statuses: 2.0.1 + toidentifier: 1.0.1 + http-proxy-agent@5.0.0: dependencies: '@tootallnate/once': 2.0.0 @@ -6029,6 +9160,8 @@ snapshots: human-id@1.0.2: {} + human-signals@2.1.0: {} + human-signals@5.0.0: {} iconv-lite@0.4.24: @@ -6040,16 +9173,29 @@ snapshots: safer-buffer: 2.1.2 optional: true + ieee754@1.2.1: {} + + igniculus@1.5.0: {} + ignore@5.3.1: {} + import-fresh@3.3.0: + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + import-meta-resolve@4.1.0: {} + imurmurhash@0.1.4: {} + indent-string@4.0.0: {} indent-string@5.0.0: {} index-to-position@0.1.2: {} + inflation@2.1.0: {} + inflight@1.0.6: dependencies: once: 1.4.0 @@ -6063,6 +9209,10 @@ snapshots: hasown: 2.0.2 side-channel: 1.0.6 + interpret@2.2.0: {} + + ipaddr.js@1.9.1: {} + is-array-buffer@3.0.4: dependencies: call-bind: 1.0.7 @@ -6083,6 +9233,10 @@ snapshots: call-bind: 1.0.7 has-tostringtag: 1.0.2 + is-builtin-module@3.2.1: + dependencies: + builtin-modules: 3.3.0 + is-callable@1.2.7: {} is-core-module@2.13.1: @@ -6101,6 +9255,12 @@ snapshots: is-fullwidth-code-point@3.0.0: {} + is-fullwidth-code-point@4.0.0: {} + + is-fullwidth-code-point@5.0.0: + dependencies: + get-east-asian-width: 1.2.0 + is-glob@4.0.3: dependencies: is-extglob: 2.1.1 @@ -6117,6 +9277,8 @@ snapshots: is-path-cwd@3.0.0: {} + is-path-inside@3.0.3: {} + is-path-inside@4.0.0: {} is-plain-obj@1.1.0: {} @@ -6137,8 +9299,12 @@ snapshots: dependencies: call-bind: 1.0.7 + is-stream@2.0.1: {} + is-stream@3.0.0: {} + is-stream@4.0.1: {} + is-string@1.0.7: dependencies: has-tostringtag: 1.0.2 @@ -6165,6 +9331,14 @@ snapshots: isexe@2.0.0: {} + jackspeak@3.4.3: + dependencies: + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 + + joycon@3.1.1: {} + js-levenshtein@1.1.6: {} js-tokens@4.0.0: {} @@ -6212,18 +9386,35 @@ snapshots: - utf-8-validate optional: true + jsesc@0.5.0: {} + jsesc@2.5.2: {} + jsesc@3.0.2: {} + + json-buffer@3.0.1: {} + json-parse-even-better-errors@2.3.1: {} json-schema-ref-parser@9.0.9: dependencies: '@apidevtools/json-schema-ref-parser': 9.0.9 + json-schema-traverse@0.4.1: {} + json-schema-traverse@1.0.0: {} + json-stable-stringify-without-jsonify@1.0.1: {} + json5@2.2.3: {} + jsonc-eslint-parser@2.4.0: + dependencies: + acorn: 8.12.1 + eslint-visitor-keys: 3.4.3 + espree: 9.6.1 + semver: 7.6.3 + jsonfile@4.0.0: optionalDependencies: graceful-fs: 4.2.11 @@ -6234,12 +9425,62 @@ snapshots: optionalDependencies: graceful-fs: 4.2.11 + jsonschema@1.4.1: {} + + junk@4.0.1: {} + + keyv@4.5.4: + dependencies: + json-buffer: 3.0.1 + kind-of@6.0.3: {} kleur@4.1.5: {} + knex-dynamic-connection@3.2.0: + dependencies: + debug: 4.3.6(supports-color@9.4.0) + knex: 3.1.0 + transitivePeerDependencies: + - better-sqlite3 + - mysql + - mysql2 + - pg + - pg-native + - sqlite3 + - supports-color + - tedious + + knex@3.1.0: + dependencies: + colorette: 2.0.19 + commander: 10.0.1 + debug: 4.3.4 + escalade: 3.1.2 + esm: 3.2.25 + get-package-type: 0.1.0 + getopts: 2.3.0 + interpret: 2.2.0 + lodash: 4.17.21 + pg-connection-string: 2.6.2 + rechoir: 0.8.0 + resolve-from: 5.0.0 + tarn: 3.0.2 + tildify: 2.0.0 + transitivePeerDependencies: + - supports-color + + levn@0.4.1: + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + + lilconfig@3.1.2: {} + lines-and-columns@1.2.4: {} + load-tsconfig@0.2.5: {} + load-yaml-file@0.2.0: dependencies: graceful-fs: 4.2.11 @@ -6259,8 +9500,22 @@ snapshots: lodash.isequal@4.5.0: {} + lodash.merge@4.6.2: {} + + lodash.sortby@4.7.0: {} + lodash.startcase@4.4.0: {} + lodash@4.17.21: {} + + log-update@6.1.0: + dependencies: + ansi-escapes: 7.0.0 + cli-cursor: 5.0.0 + slice-ansi: 7.1.0 + strip-ansi: 7.1.0 + wrap-ansi: 9.0.0 + loose-envify@1.4.0: dependencies: js-tokens: 4.0.0 @@ -6269,6 +9524,8 @@ snapshots: dependencies: get-func-name: 2.0.2 + lru-cache@10.4.3: {} + lru-cache@4.1.5: dependencies: pseudomap: 1.0.2 @@ -6282,16 +9539,20 @@ snapshots: dependencies: yallist: 4.0.0 + luxon@3.5.0: {} + lz-string@1.5.0: {} magic-string@0.30.10: dependencies: - '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/sourcemap-codec': 1.5.0 magic-string@0.30.11: dependencies: '@jridgewell/sourcemap-codec': 1.5.0 + make-error@1.3.6: {} + map-obj@1.0.1: {} map-obj@4.3.0: {} @@ -6300,6 +9561,14 @@ snapshots: mdn-data@2.0.30: {} + media-typer@0.3.0: {} + + media-typer@1.1.0: {} + + memoize@10.0.0: + dependencies: + mimic-function: 5.0.1 + meow@10.1.5: dependencies: '@types/minimist': 1.2.5 @@ -6353,8 +9622,12 @@ snapshots: mime@2.6.0: {} + mimic-fn@2.1.0: {} + mimic-fn@4.0.0: {} + mimic-function@5.0.1: {} + min-indent@1.0.1: {} minimatch@3.1.2: @@ -6365,6 +9638,10 @@ snapshots: dependencies: brace-expansion: 2.0.1 + minimatch@9.0.3: + dependencies: + brace-expansion: 2.0.1 + minimatch@9.0.5: dependencies: brace-expansion: 2.0.1 @@ -6377,6 +9654,8 @@ snapshots: minimist@1.2.8: {} + minipass@7.1.2: {} + minisearch@6.3.0: {} mitt@3.0.1: {} @@ -6387,6 +9666,8 @@ snapshots: dependencies: minimist: 1.2.8 + mkdirp@3.0.1: {} + mri@1.2.0: {} mrmime@2.0.0: {} @@ -6439,10 +9720,22 @@ snapshots: muggle-string@0.4.1: {} + mustache@4.2.0: {} + mute-stream@1.0.0: {} + mz@2.7.0: + dependencies: + any-promise: 1.3.0 + object-assign: 4.1.1 + thenify-all: 1.6.0 + nanoid@3.3.7: {} + natural-compare@1.4.0: {} + + negotiator@0.6.3: {} + neo-async@2.6.2: {} next@14.2.3(@playwright/test@1.44.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): @@ -6491,8 +9784,20 @@ snapshots: semver: 7.6.0 validate-npm-package-license: 3.0.4 + normalize-package-data@6.0.2: + dependencies: + hosted-git-info: 7.0.2 + semver: 7.6.3 + validate-npm-package-license: 3.0.4 + normalize-path@3.0.0: {} + normalize-url@8.0.1: {} + + npm-run-path@4.0.1: + dependencies: + path-key: 3.1.1 + npm-run-path@5.3.0: dependencies: path-key: 4.0.0 @@ -6500,6 +9805,8 @@ snapshots: nwsapi@2.2.12: optional: true + object-assign@4.1.1: {} + object-inspect@1.13.1: {} object-keys@1.1.1: {} @@ -6511,14 +9818,30 @@ snapshots: has-symbols: 1.0.3 object-keys: 1.1.1 + on-exit-leak-free@2.1.2: {} + + on-finished@2.4.1: + dependencies: + ee-first: 1.1.1 + once@1.4.0: dependencies: wrappy: 1.0.2 + onetime@5.1.2: + dependencies: + mimic-fn: 2.1.0 + onetime@6.0.0: dependencies: mimic-fn: 4.0.0 + onetime@7.0.0: + dependencies: + mimic-function: 5.0.1 + + openapi-types@12.1.3: {} + openapi-typescript-codegen@0.25.0: dependencies: camelcase: 6.3.0 @@ -6529,16 +9852,33 @@ snapshots: openapi-typescript-fetch@2.0.0: {} + optionator@0.9.4: + dependencies: + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + word-wrap: 1.2.5 + os-tmpdir@1.0.2: {} outdent@0.5.0: {} outvariant@1.4.2: {} + p-event@6.0.1: + dependencies: + p-timeout: 6.1.2 + p-filter@2.1.0: dependencies: p-map: 2.1.0 + p-filter@4.1.0: + dependencies: + p-map: 7.0.2 + p-limit@2.3.0: dependencies: p-try: 2.2.0 @@ -6561,8 +9901,23 @@ snapshots: dependencies: aggregate-error: 4.0.1 + p-map@7.0.2: {} + + p-timeout@6.1.2: {} + p-try@2.2.0: {} + package-json-from-dist@1.0.0: {} + + parent-module@1.0.1: + dependencies: + callsites: 3.1.0 + + parse-imports@1.2.0: + dependencies: + es-module-lexer: 1.5.4 + slashes: 3.0.12 + parse-json@5.2.0: dependencies: '@babel/code-frame': 7.24.2 @@ -6593,14 +9948,23 @@ snapshots: path-parse@1.0.7: {} + path-scurry@1.11.1: + dependencies: + lru-cache: 10.4.3 + minipass: 7.1.2 + path-to-regexp@6.2.2: {} path-type@4.0.0: {} + path-type@5.0.0: {} + pathe@1.1.2: {} pathval@2.0.0: {} + peek-readable@5.1.3: {} + perfect-debounce@1.0.0: {} periscopic@3.1.0: @@ -6609,14 +9973,56 @@ snapshots: estree-walker: 3.0.3 is-reference: 3.0.2 - picocolors@1.0.0: {} + pg-connection-string@2.6.2: {} picocolors@1.0.1: {} picomatch@2.3.1: {} + picomatch@4.0.2: {} + pify@4.0.1: {} + pino-abstract-transport@1.2.0: + dependencies: + readable-stream: 4.5.2 + split2: 4.2.0 + + pino-pretty@11.2.2: + dependencies: + colorette: 2.0.20 + dateformat: 4.6.3 + fast-copy: 3.0.2 + fast-safe-stringify: 2.1.1 + help-me: 5.0.0 + joycon: 3.1.1 + minimist: 1.2.8 + on-exit-leak-free: 2.1.2 + pino-abstract-transport: 1.2.0 + pump: 3.0.0 + readable-stream: 4.5.2 + secure-json-parse: 2.7.0 + sonic-boom: 4.0.1 + strip-json-comments: 3.1.1 + + pino-std-serializers@6.2.2: {} + + pino@8.21.0: + dependencies: + atomic-sleep: 1.0.0 + fast-redact: 3.5.0 + on-exit-leak-free: 2.1.2 + pino-abstract-transport: 1.2.0 + pino-std-serializers: 6.2.2 + process-warning: 3.0.0 + quick-format-unescaped: 4.0.4 + real-require: 0.2.0 + safe-stable-stringify: 2.4.3 + sonic-boom: 3.8.1 + thread-stream: 2.7.0 + + pirates@4.0.6: {} + pkg-dir@4.2.0: dependencies: find-up: 4.1.0 @@ -6633,6 +10039,12 @@ snapshots: possible-typed-array-names@1.0.0: {} + postcss-load-config@6.0.1(postcss@8.4.40): + dependencies: + lilconfig: 3.1.2 + optionalDependencies: + postcss: 8.4.40 + postcss@8.4.31: dependencies: nanoid: 3.3.7 @@ -6654,6 +10066,12 @@ snapshots: path-exists: 4.0.0 which-pm: 2.0.0 + prelude-ls@1.2.1: {} + + prettier-linter-helpers@1.0.0: + dependencies: + fast-diff: 1.3.0 + prettier@2.8.8: {} prettier@3.3.2: {} @@ -6664,6 +10082,19 @@ snapshots: ansi-styles: 5.2.0 react-is: 17.0.2 + pretty-hrtime@1.0.3: {} + + printable-characters@1.0.42: {} + + process-warning@3.0.0: {} + + process@0.11.10: {} + + proxy-addr@2.0.7: + dependencies: + forwarded: 0.2.0 + ipaddr.js: 1.9.1 + proxy-from-env@1.1.0: {} pseudomap@1.0.2: {} @@ -6671,21 +10102,41 @@ snapshots: psl@1.9.0: optional: true + pump@3.0.0: + dependencies: + end-of-stream: 1.4.4 + once: 1.4.0 + punycode@2.3.1: {} qs@6.12.1: dependencies: side-channel: 1.0.6 + qs@6.13.0: + dependencies: + side-channel: 1.0.6 + querystringify@2.2.0: optional: true queue-microtask@1.2.3: {} + quick-format-unescaped@4.0.4: {} + quick-lru@4.0.1: {} quick-lru@5.1.1: {} + random-bytes@1.0.0: {} + + raw-body@2.5.2: + dependencies: + bytes: 3.1.2 + http-errors: 2.0.0 + iconv-lite: 0.4.24 + unpipe: 1.0.0 + react-dom@18.3.1(react@18.3.1): dependencies: loose-envify: 1.4.0 @@ -6705,6 +10156,12 @@ snapshots: dependencies: loose-envify: 1.4.0 + read-package-up@11.0.0: + dependencies: + find-up-simple: 1.0.0 + read-pkg: 9.0.1 + type-fest: 4.20.1 + read-pkg-up@7.0.1: dependencies: find-up: 4.1.0 @@ -6731,6 +10188,14 @@ snapshots: parse-json: 5.2.0 type-fest: 1.4.0 + read-pkg@9.0.1: + dependencies: + '@types/normalize-package-data': 2.4.4 + normalize-package-data: 6.0.2 + parse-json: 8.1.0 + type-fest: 4.20.1 + unicorn-magic: 0.1.0 + read-yaml-file@1.1.0: dependencies: graceful-fs: 4.2.11 @@ -6738,10 +10203,24 @@ snapshots: pify: 4.0.1 strip-bom: 3.0.0 + readable-stream@4.5.2: + dependencies: + abort-controller: 3.0.0 + buffer: 6.0.3 + events: 3.3.0 + process: 0.11.10 + string_decoder: 1.3.0 + readdirp@3.6.0: dependencies: picomatch: 2.3.1 + real-require@0.2.0: {} + + rechoir@0.8.0: + dependencies: + resolve: 1.22.8 + redent@3.0.0: dependencies: indent-string: 4.0.0 @@ -6752,8 +10231,12 @@ snapshots: indent-string: 5.0.0 strip-indent: 4.0.0 + reflect-metadata@0.2.2: {} + regenerator-runtime@0.14.1: {} + regexp-tree@0.1.27: {} + regexp.prototype.flags@1.5.2: dependencies: call-bind: 1.0.7 @@ -6761,6 +10244,10 @@ snapshots: es-errors: 1.3.0 set-function-name: 2.0.2 + regjsparser@0.10.0: + dependencies: + jsesc: 0.5.0 + require-directory@2.1.1: {} require-from-string@2.0.2: {} @@ -6770,6 +10257,8 @@ snapshots: requires-port@1.0.0: optional: true + resolve-from@4.0.0: {} + resolve-from@5.0.0: {} resolve@1.22.8: @@ -6778,6 +10267,11 @@ snapshots: path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 + restore-cursor@5.1.0: + dependencies: + onetime: 7.0.0 + signal-exit: 4.1.0 + reusify@1.0.4: {} rfdc@1.4.1: {} @@ -6812,6 +10306,28 @@ snapshots: '@rollup/rollup-win32-x64-msvc': 4.18.0 fsevents: 2.3.3 + rollup@4.20.0: + dependencies: + '@types/estree': 1.0.5 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.20.0 + '@rollup/rollup-android-arm64': 4.20.0 + '@rollup/rollup-darwin-arm64': 4.20.0 + '@rollup/rollup-darwin-x64': 4.20.0 + '@rollup/rollup-linux-arm-gnueabihf': 4.20.0 + '@rollup/rollup-linux-arm-musleabihf': 4.20.0 + '@rollup/rollup-linux-arm64-gnu': 4.20.0 + '@rollup/rollup-linux-arm64-musl': 4.20.0 + '@rollup/rollup-linux-powerpc64le-gnu': 4.20.0 + '@rollup/rollup-linux-riscv64-gnu': 4.20.0 + '@rollup/rollup-linux-s390x-gnu': 4.20.0 + '@rollup/rollup-linux-x64-gnu': 4.20.0 + '@rollup/rollup-linux-x64-musl': 4.20.0 + '@rollup/rollup-win32-arm64-msvc': 4.20.0 + '@rollup/rollup-win32-ia32-msvc': 4.20.0 + '@rollup/rollup-win32-x64-msvc': 4.20.0 + fsevents: 2.3.3 + run-parallel@1.2.0: dependencies: queue-microtask: 1.2.3 @@ -6827,12 +10343,22 @@ snapshots: has-symbols: 1.0.3 isarray: 2.0.5 + safe-buffer@5.1.2: {} + + safe-buffer@5.2.1: {} + safe-regex-test@1.0.3: dependencies: call-bind: 1.0.7 es-errors: 1.3.0 is-regex: 1.1.4 + safe-regex@2.1.1: + dependencies: + regexp-tree: 0.1.27 + + safe-stable-stringify@2.4.3: {} + safer-buffer@2.1.2: {} sander@0.5.1: @@ -6853,6 +10379,8 @@ snapshots: search-insights@2.13.0: {} + secure-json-parse@2.7.0: {} + semver@5.7.2: {} semver@6.3.1: {} @@ -6885,6 +10413,8 @@ snapshots: functions-have-names: 1.2.3 has-property-descriptors: 1.0.2 + setprototypeof@1.2.0: {} + shebang-command@1.2.0: dependencies: shebang-regex: 1.0.0 @@ -6924,6 +10454,22 @@ snapshots: slash@4.0.0: {} + slash@5.1.0: {} + + slashes@3.0.12: {} + + slice-ansi@5.0.0: + dependencies: + ansi-styles: 6.2.1 + is-fullwidth-code-point: 4.0.0 + + slice-ansi@7.1.0: + dependencies: + ansi-styles: 6.2.1 + is-fullwidth-code-point: 5.0.0 + + slugify@1.6.6: {} + smartwrap@2.0.2: dependencies: array.prototype.flat: 1.3.2 @@ -6933,6 +10479,14 @@ snapshots: wcwidth: 1.0.1 yargs: 15.4.1 + sonic-boom@3.8.1: + dependencies: + atomic-sleep: 1.0.0 + + sonic-boom@4.0.1: + dependencies: + atomic-sleep: 1.0.0 + sorcery@0.11.1: dependencies: '@jridgewell/sourcemap-codec': 1.5.0 @@ -6944,6 +10498,10 @@ snapshots: source-map@0.6.1: {} + source-map@0.8.0-beta.0: + dependencies: + whatwg-url: 7.1.0 + spawndamnit@2.0.0: dependencies: cross-spawn: 5.1.0 @@ -6965,10 +10523,19 @@ snapshots: speakingurl@14.0.1: {} + split-lines@3.0.0: {} + + split2@4.2.0: {} + sprintf-js@1.0.3: {} stackback@0.0.2: {} + stacktracey@2.1.8: + dependencies: + as-table: 1.0.55 + get-source: 2.0.12 + statuses@2.0.1: {} std-env@3.7.0: {} @@ -6981,12 +10548,26 @@ snapshots: strict-event-emitter@0.5.1: {} + string-argv@0.3.2: {} + string-width@4.2.3: dependencies: emoji-regex: 8.0.0 is-fullwidth-code-point: 3.0.0 strip-ansi: 6.0.1 + string-width@5.1.2: + dependencies: + eastasianwidth: 0.2.0 + emoji-regex: 9.2.2 + strip-ansi: 7.1.0 + + string-width@7.2.0: + dependencies: + emoji-regex: 10.3.0 + get-east-asian-width: 1.2.0 + strip-ansi: 7.1.0 + string.prototype.trim@1.2.9: dependencies: call-bind: 1.0.7 @@ -7006,6 +10587,10 @@ snapshots: define-properties: 1.2.1 es-object-atoms: 1.0.0 + string_decoder@1.3.0: + dependencies: + safe-buffer: 5.2.1 + strip-ansi@6.0.1: dependencies: ansi-regex: 5.0.1 @@ -7016,6 +10601,8 @@ snapshots: strip-bom@3.0.0: {} + strip-final-newline@2.0.0: {} + strip-final-newline@3.0.0: {} strip-indent@3.0.0: @@ -7026,11 +10613,44 @@ snapshots: dependencies: min-indent: 1.0.1 + strip-json-comments@3.1.1: {} + + strtok3@8.0.1: + dependencies: + '@tokenizer/token': 0.3.0 + peek-readable: 5.1.3 + styled-jsx@5.1.1(react@18.3.1): dependencies: client-only: 0.0.1 react: 18.3.1 + sucrase@3.35.0: + dependencies: + '@jridgewell/gen-mapping': 0.3.5 + commander: 4.1.1 + glob: 10.4.5 + lines-and-columns: 1.2.4 + mz: 2.7.0 + pirates: 4.0.6 + ts-interface-checker: 0.1.13 + + superagent@8.1.2: + dependencies: + component-emitter: 1.3.1 + cookiejar: 2.1.4 + debug: 4.3.6(supports-color@9.4.0) + fast-safe-stringify: 2.1.1 + form-data: 4.0.0 + formidable: 2.1.2 + methods: 1.1.2 + mime: 2.6.0 + qs: 6.13.0 + semver: 7.6.3 + transitivePeerDependencies: + - supports-color + optional: true + superagent@9.0.2: dependencies: component-emitter: 1.3.1 @@ -7114,10 +10734,41 @@ snapshots: symbol-tree@3.2.4: optional: true + synckit@0.6.2: + dependencies: + tslib: 2.6.3 + + synckit@0.9.1: + dependencies: + '@pkgr/core': 0.1.1 + tslib: 2.6.3 + tabbable@6.2.0: {} + tarn@3.0.2: {} + + tempura@0.4.1: {} + term-size@2.2.1: {} + terminal-size@4.0.0: {} + + text-table@0.2.0: {} + + thenify-all@1.6.0: + dependencies: + thenify: 3.3.1 + + thenify@3.3.1: + dependencies: + any-promise: 1.3.0 + + thread-stream@2.7.0: + dependencies: + real-require: 0.2.0 + + tildify@2.0.0: {} + tiny-glob@0.2.9: dependencies: globalyzer: 0.1.0 @@ -7131,6 +10782,8 @@ snapshots: tinyspy@3.0.0: {} + tmp-cache@1.1.0: {} + tmp@0.0.33: dependencies: os-tmpdir: 1.0.2 @@ -7141,6 +10794,13 @@ snapshots: dependencies: is-number: 7.0.0 + toidentifier@1.0.1: {} + + token-types@6.0.0: + dependencies: + '@tokenizer/token': 0.3.0 + ieee754: 1.2.1 + totalist@3.0.1: {} tough-cookie@4.1.4: @@ -7153,17 +10813,84 @@ snapshots: tr46@0.0.3: {} + tr46@1.0.1: + dependencies: + punycode: 2.3.1 + tr46@3.0.0: dependencies: punycode: 2.3.1 optional: true + tree-kill@1.2.2: {} + trim-newlines@3.0.1: {} trim-newlines@4.1.1: {} + truncatise@0.0.8: {} + + ts-api-utils@1.3.0(typescript@5.4.5): + dependencies: + typescript: 5.4.5 + + ts-interface-checker@0.1.13: {} + + ts-morph@22.0.0: + dependencies: + '@ts-morph/common': 0.23.0 + code-block-writer: 13.0.2 + + ts-node@10.9.2(@swc/core@1.7.4(@swc/helpers@0.5.5))(@types/node@20.14.14)(typescript@5.4.5): + dependencies: + '@cspotcode/source-map-support': 0.8.1 + '@tsconfig/node10': 1.0.11 + '@tsconfig/node12': 1.0.11 + '@tsconfig/node14': 1.0.3 + '@tsconfig/node16': 1.0.4 + '@types/node': 20.14.14 + acorn: 8.12.1 + acorn-walk: 8.3.3 + arg: 4.1.3 + create-require: 1.1.1 + diff: 4.0.2 + make-error: 1.3.6 + typescript: 5.4.5 + v8-compile-cache-lib: 3.0.1 + yn: 3.1.1 + optionalDependencies: + '@swc/core': 1.7.4(@swc/helpers@0.5.5) + tslib@2.6.3: {} + tsup@8.2.4(@swc/core@1.7.4(@swc/helpers@0.5.5))(postcss@8.4.40)(typescript@5.4.5): + dependencies: + bundle-require: 5.0.0(esbuild@0.23.0) + cac: 6.7.14 + chokidar: 3.6.0 + consola: 3.2.3 + debug: 4.3.6(supports-color@9.4.0) + esbuild: 0.23.0 + execa: 5.1.1 + globby: 11.1.0 + joycon: 3.1.1 + picocolors: 1.0.1 + postcss-load-config: 6.0.1(postcss@8.4.40) + resolve-from: 5.0.0 + rollup: 4.20.0 + source-map: 0.8.0-beta.0 + sucrase: 3.35.0 + tree-kill: 1.2.2 + optionalDependencies: + '@swc/core': 1.7.4(@swc/helpers@0.5.5) + postcss: 8.4.40 + typescript: 5.4.5 + transitivePeerDependencies: + - jiti + - supports-color + - tsx + - yaml + tty-table@4.2.3: dependencies: chalk: 4.1.2 @@ -7174,8 +10901,16 @@ snapshots: wcwidth: 1.0.1 yargs: 17.7.2 + type-check@0.4.0: + dependencies: + prelude-ls: 1.2.1 + + type-detect@4.1.0: {} + type-fest@0.13.1: {} + type-fest@0.20.2: {} + type-fest@0.21.3: {} type-fest@0.6.0: {} @@ -7186,6 +10921,11 @@ snapshots: type-fest@4.20.1: {} + type-is@1.6.18: + dependencies: + media-typer: 0.3.0 + mime-types: 2.1.35 + typed-array-buffer@1.0.2: dependencies: call-bind: 1.0.7 @@ -7226,6 +10966,12 @@ snapshots: uglify-js@3.18.0: optional: true + uid-safe@2.1.5: + dependencies: + random-bytes: 1.0.0 + + uint8array-extras@1.4.0: {} + unbox-primitive@1.0.2: dependencies: call-bind: 1.0.7 @@ -7235,6 +10981,10 @@ snapshots: undici-types@5.26.5: {} + undici-types@6.13.0: {} + + unicorn-magic@0.1.0: {} + universalify@0.1.2: {} universalify@0.2.0: @@ -7242,6 +10992,24 @@ snapshots: universalify@2.0.1: {} + unpipe@1.0.0: {} + + unplugin-swc@1.5.1(@swc/core@1.7.4(@swc/helpers@0.5.5))(rollup@4.20.0): + dependencies: + '@rollup/pluginutils': 5.1.0(rollup@4.20.0) + '@swc/core': 1.7.4(@swc/helpers@0.5.5) + load-tsconfig: 0.2.5 + unplugin: 1.12.1 + transitivePeerDependencies: + - rollup + + unplugin@1.12.1: + dependencies: + acorn: 8.12.1 + chokidar: 3.6.0 + webpack-sources: 3.2.3 + webpack-virtual-modules: 0.6.2 + update-browserslist-db@1.0.16(browserslist@4.23.1): dependencies: browserslist: 4.23.1 @@ -7258,12 +11026,18 @@ snapshots: requires-port: 1.0.0 optional: true + v8-compile-cache-lib@3.0.1: {} + validate-npm-package-license@3.0.4: dependencies: spdx-correct: 3.2.0 spdx-expression-parse: 3.0.1 - vite-node@2.0.5(@types/node@20.14.7)(supports-color@9.4.0): + validator@13.12.0: {} + + vary@1.1.2: {} + + vite-node@2.0.5(@types/node@20.14.7): dependencies: cac: 6.7.14 debug: 4.3.5(supports-color@9.4.0) @@ -7280,6 +11054,23 @@ snapshots: - supports-color - terser + vite-node@2.0.5(@types/node@22.1.0)(supports-color@9.4.0): + dependencies: + cac: 6.7.14 + debug: 4.3.5(supports-color@9.4.0) + pathe: 1.1.2 + tinyrainbow: 1.2.0 + vite: 5.3.5(@types/node@22.1.0) + transitivePeerDependencies: + - '@types/node' + - less + - lightningcss + - sass + - stylus + - sugarss + - supports-color + - terser + vite@5.3.5(@types/node@20.14.7): dependencies: esbuild: 0.21.5 @@ -7289,18 +11080,27 @@ snapshots: '@types/node': 20.14.7 fsevents: 2.3.3 - vitefu@0.2.5(vite@5.3.5(@types/node@20.14.7)): + vite@5.3.5(@types/node@22.1.0): + dependencies: + esbuild: 0.21.5 + postcss: 8.4.40 + rollup: 4.18.0 + optionalDependencies: + '@types/node': 22.1.0 + fsevents: 2.3.3 + + vitefu@0.2.5(vite@5.3.5(@types/node@22.1.0)): optionalDependencies: - vite: 5.3.5(@types/node@20.14.7) + vite: 5.3.5(@types/node@22.1.0) - vitepress@1.1.4(@algolia/client-search@4.23.3)(@types/node@20.14.7)(@types/react@18.3.3)(axios@1.7.2)(postcss@8.4.40)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(search-insights@2.13.0)(typescript@5.5.4): + vitepress@1.1.4(@algolia/client-search@4.23.3)(@types/node@22.1.0)(@types/react@18.3.3)(axios@1.7.2)(postcss@8.4.40)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(search-insights@2.13.0)(typescript@5.5.4): dependencies: '@docsearch/css': 3.6.0 '@docsearch/js': 3.6.0(@algolia/client-search@4.23.3)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(search-insights@2.13.0) '@shikijs/core': 1.6.4 '@shikijs/transformers': 1.6.4 '@types/markdown-it': 14.1.1 - '@vitejs/plugin-vue': 5.1.2(vite@5.3.5(@types/node@20.14.7))(vue@3.4.35(typescript@5.5.4)) + '@vitejs/plugin-vue': 5.1.2(vite@5.3.5(@types/node@22.1.0))(vue@3.4.35(typescript@5.5.4)) '@vue/devtools-api': 7.2.1(vue@3.4.35(typescript@5.5.4)) '@vueuse/core': 10.11.0(vue@3.4.35(typescript@5.5.4)) '@vueuse/integrations': 10.11.0(axios@1.7.2)(focus-trap@7.5.4)(vue@3.4.35(typescript@5.5.4)) @@ -7308,7 +11108,7 @@ snapshots: mark.js: 8.11.1 minisearch: 6.3.0 shiki: 1.6.4 - vite: 5.3.5(@types/node@20.14.7) + vite: 5.3.5(@types/node@22.1.0) vue: 3.4.35(typescript@5.5.4) optionalDependencies: postcss: 8.4.40 @@ -7358,7 +11158,7 @@ snapshots: tinypool: 1.0.0 tinyrainbow: 1.2.0 vite: 5.3.5(@types/node@20.14.7) - vite-node: 2.0.5(@types/node@20.14.7)(supports-color@9.4.0) + vite-node: 2.0.5(@types/node@20.14.7) why-is-node-running: 2.3.0 optionalDependencies: '@types/node': 20.14.7 @@ -7416,9 +11216,15 @@ snapshots: webidl-conversions@3.0.1: {} + webidl-conversions@4.0.2: {} + webidl-conversions@7.0.0: optional: true + webpack-sources@3.2.3: {} + + webpack-virtual-modules@0.6.2: {} + whatwg-encoding@2.0.0: dependencies: iconv-lite: 0.6.3 @@ -7438,6 +11244,12 @@ snapshots: tr46: 0.0.3 webidl-conversions: 3.0.1 + whatwg-url@7.1.0: + dependencies: + lodash.sortby: 4.7.0 + tr46: 1.0.1 + webidl-conversions: 4.0.2 + which-boxed-primitive@1.0.2: dependencies: is-bigint: 1.0.4 @@ -7474,6 +11286,8 @@ snapshots: siginfo: 2.0.0 stackback: 0.0.2 + word-wrap@1.2.5: {} + wordwrap@1.0.0: {} wrap-ansi@6.2.0: @@ -7488,6 +11302,18 @@ snapshots: string-width: 4.2.3 strip-ansi: 6.0.1 + wrap-ansi@8.1.0: + dependencies: + ansi-styles: 6.2.1 + string-width: 5.1.2 + strip-ansi: 7.1.0 + + wrap-ansi@9.0.0: + dependencies: + ansi-styles: 6.2.1 + string-width: 7.2.0 + strip-ansi: 7.1.0 + wrappy@1.0.2: {} ws@8.18.0: @@ -7544,4 +11370,18 @@ snapshots: y18n: 5.0.8 yargs-parser: 21.1.1 + yn@3.1.1: {} + yocto-queue@0.1.0: {} + + youch-terminal@2.2.3: + dependencies: + kleur: 4.1.5 + string-width: 4.2.3 + wordwrap: 1.0.0 + + youch@3.3.3: + dependencies: + cookie: 0.5.0 + mustache: 4.2.0 + stacktracey: 2.1.8 From 9cfca5ba0acaebdb62811f5c02635260e9c69115 Mon Sep 17 00:00:00 2001 From: Martin PAUCOT Date: Sat, 10 Aug 2024 02:23:58 +0200 Subject: [PATCH 02/11] Lint files --- packages/openapi-adonis/biome.json | 8 ++----- .../app/controllers/users_controller.ts | 20 ++++++++--------- .../openapi-adonis/example/app/models/user.ts | 14 ++++++------ .../openapi-adonis/example/start/routes.ts | 22 +++++++++---------- packages/openapi-adonis/example/tsconfig.json | 4 ++-- packages/openapi-adonis/tsconfig.json | 19 ++++------------ packages/openapi-decorators/biome.json | 4 +--- packages/openapi-decorators/src/ui/scalar.ts | 2 +- packages/openapi-decorators/tsconfig.json | 20 ++++------------- packages/openapi-decorators/vitest.config.ts | 14 ++++++------ 10 files changed, 49 insertions(+), 78 deletions(-) diff --git a/packages/openapi-adonis/biome.json b/packages/openapi-adonis/biome.json index c07a9da68..8eafd05ea 100644 --- a/packages/openapi-adonis/biome.json +++ b/packages/openapi-adonis/biome.json @@ -1,12 +1,8 @@ { "$schema": "https://biomejs.dev/schemas/1.8.1/schema.json", - "extends": [ - "../../biome.json" - ], + "extends": ["../../biome.json"], "files": { - "ignore": [ - "./test/fixtures/" - ] + "ignore": ["./example/"] }, "linter": { "rules": { diff --git a/packages/openapi-adonis/example/app/controllers/users_controller.ts b/packages/openapi-adonis/example/app/controllers/users_controller.ts index fec83573c..ef2a47f37 100644 --- a/packages/openapi-adonis/example/app/controllers/users_controller.ts +++ b/packages/openapi-adonis/example/app/controllers/users_controller.ts @@ -1,18 +1,18 @@ -import User from "#models/user"; -import { apiBody, apiOperation, apiResponse, apiParam, apiQuery } from "openapi-adonis/decorators"; +import User from '#models/user' +import { apiBody, apiOperation, apiResponse, apiParam, apiQuery } from 'openapi-adonis/decorators' export default class UsersController { - @apiOperation({ summary: "Get users", tags: ["User"] }) + @apiOperation({ summary: 'Get users', tags: ['User'] }) @apiResponse({ type: User }) - @apiParam({ name: "id" }) - @apiQuery({ name: "query" }) - public async index(): Promise { - return new User(); + @apiParam({ name: 'id' }) + @apiQuery({ name: 'query' }) + async index(): Promise { + return new User() } - @apiOperation({ summary: "Create new user", tags: ["User"] }) + @apiOperation({ summary: 'Create new user', tags: ['User'] }) @apiBody({ type: User }) - public async create(): Promise { - return new User(); + async create(): Promise { + return new User() } } diff --git a/packages/openapi-adonis/example/app/models/user.ts b/packages/openapi-adonis/example/app/models/user.ts index 8fdefd755..0b46a5c7b 100644 --- a/packages/openapi-adonis/example/app/models/user.ts +++ b/packages/openapi-adonis/example/app/models/user.ts @@ -1,16 +1,16 @@ -import { BaseModel } from "@adonisjs/lucid/orm"; -import { apiProperty } from "openapi-adonis/decorators"; +import { BaseModel } from '@adonisjs/lucid/orm' +import { apiProperty } from 'openapi-adonis/decorators' export default class User extends BaseModel { - @apiProperty({ example: "5" }) - declare id: string; + @apiProperty({ example: '5' }) + declare id: string @apiProperty() - declare name: number; + declare name: number @apiProperty() - declare hey: string; + declare hey: string @apiProperty({ type: User }) - declare user: User; + declare user: User } diff --git a/packages/openapi-adonis/example/start/routes.ts b/packages/openapi-adonis/example/start/routes.ts index 3babeee09..158b8b882 100644 --- a/packages/openapi-adonis/example/start/routes.ts +++ b/packages/openapi-adonis/example/start/routes.ts @@ -7,19 +7,19 @@ | */ -import router from "@adonisjs/core/services/router"; -import AdonisOpenAPI from "openapi-adonis"; +import router from '@adonisjs/core/services/router' +import AdonisOpenAPI from 'openapi-adonis' -const UsersController = () => import("#controllers/users_controller"); +const UsersController = () => import('#controllers/users_controller') -router.get("/", async () => { +router.get('/', async () => { return { - hello: "world", - }; -}); + hello: 'world', + } +}) -router.get("/users/:id", [UsersController, "index"]); -router.post("/users", [UsersController, "create"]); +router.get('/users/:id', [UsersController, 'index']) +router.post('/users', [UsersController, 'create']) -const builder = AdonisOpenAPI.document().setTitle("OpenAPI Adonis Example"); -AdonisOpenAPI.setup("/docs", router, builder); +const builder = AdonisOpenAPI.document().setTitle('OpenAPI Adonis Example') +AdonisOpenAPI.setup('/docs', router, builder) diff --git a/packages/openapi-adonis/example/tsconfig.json b/packages/openapi-adonis/example/tsconfig.json index e05703c28..86b69e8be 100644 --- a/packages/openapi-adonis/example/tsconfig.json +++ b/packages/openapi-adonis/example/tsconfig.json @@ -2,6 +2,6 @@ "extends": "@adonisjs/tsconfig/tsconfig.app.json", "compilerOptions": { "rootDir": "./", - "outDir": "./build", - }, + "outDir": "./build" + } } diff --git a/packages/openapi-adonis/tsconfig.json b/packages/openapi-adonis/tsconfig.json index 477f8a606..801bb5c7d 100644 --- a/packages/openapi-adonis/tsconfig.json +++ b/packages/openapi-adonis/tsconfig.json @@ -4,10 +4,7 @@ "declaration": true, "downlevelIteration": false, "esModuleInterop": true, - "lib": [ - "ESNext", - "DOM" - ], + "lib": ["ESNext", "DOM"], "module": "ESNext", "moduleResolution": "Bundler", "noUncheckedIndexedAccess": true, @@ -17,16 +14,8 @@ "target": "ESNext", "emitDecoratorMetadata": true, "experimentalDecorators": true, - "types": [ - "vitest/globals" - ] + "types": ["vitest/globals"] }, - "include": [ - "src", - "test" - ], - "exclude": [ - "example", - "node_modules" - ] + "include": ["src", "test"], + "exclude": ["example", "node_modules"] } diff --git a/packages/openapi-decorators/biome.json b/packages/openapi-decorators/biome.json index ac5658f00..bb46eda10 100644 --- a/packages/openapi-decorators/biome.json +++ b/packages/openapi-decorators/biome.json @@ -1,8 +1,6 @@ { "$schema": "https://biomejs.dev/schemas/1.8.1/schema.json", - "extends": [ - "../../biome.json" - ], + "extends": ["../../biome.json"], "linter": { "rules": { "performance": { diff --git a/packages/openapi-decorators/src/ui/scalar.ts b/packages/openapi-decorators/src/ui/scalar.ts index 4dce298b8..240fdad14 100644 --- a/packages/openapi-decorators/src/ui/scalar.ts +++ b/packages/openapi-decorators/src/ui/scalar.ts @@ -1,5 +1,5 @@ export function generateScalarUI(url: string) { - return ` + return ` diff --git a/packages/openapi-decorators/tsconfig.json b/packages/openapi-decorators/tsconfig.json index 5d58f7566..856c8f0d6 100644 --- a/packages/openapi-decorators/tsconfig.json +++ b/packages/openapi-decorators/tsconfig.json @@ -4,10 +4,7 @@ "declaration": true, "downlevelIteration": false, "esModuleInterop": true, - "lib": [ - "ESNext", - "DOM" - ], + "lib": ["ESNext", "DOM"], "module": "ESNext", "moduleResolution": "Bundler", "noUncheckedIndexedAccess": true, @@ -17,17 +14,8 @@ "target": "ESNext", "emitDecoratorMetadata": true, "experimentalDecorators": true, - "types": [ - "vitest/globals", - "reflect-metadata" - ] + "types": ["vitest/globals", "reflect-metadata"] }, - "include": [ - "src", - "test" - ], - "exclude": [ - "example", - "node_modules" - ] + "include": ["src", "test"], + "exclude": ["example", "node_modules"] } diff --git a/packages/openapi-decorators/vitest.config.ts b/packages/openapi-decorators/vitest.config.ts index 59723706a..8debcd30d 100644 --- a/packages/openapi-decorators/vitest.config.ts +++ b/packages/openapi-decorators/vitest.config.ts @@ -2,11 +2,11 @@ import { defineConfig } from "vitest/config"; import swc from "unplugin-swc"; export default defineConfig({ - plugins: [ - // Required to have typescript metadata working. See https://github.com/vitest-dev/vitest/discussions/3320 - swc.vite(), - ], - test: { - globals: true, - }, + plugins: [ + // Required to have typescript metadata working. See https://github.com/vitest-dev/vitest/discussions/3320 + swc.vite(), + ], + test: { + globals: true, + }, }); From b85a87f3ecd5e275383e618bdbfa9c74e72354b7 Mon Sep 17 00:00:00 2001 From: Martin PAUCOT Date: Sat, 10 Aug 2024 02:30:12 +0200 Subject: [PATCH 03/11] Fix builds --- packages/openapi-adonis/example/bin/test.ts | 62 ------------------- .../openapi-adonis/example/tests/bootstrap.ts | 38 ------------ packages/openapi-adonis/package.json | 10 +-- packages/openapi-adonis/tsup.config.ts | 2 +- packages/openapi-decorators/package.json | 7 +-- 5 files changed, 3 insertions(+), 116 deletions(-) delete mode 100644 packages/openapi-adonis/example/bin/test.ts delete mode 100644 packages/openapi-adonis/example/tests/bootstrap.ts diff --git a/packages/openapi-adonis/example/bin/test.ts b/packages/openapi-adonis/example/bin/test.ts deleted file mode 100644 index d759efe42..000000000 --- a/packages/openapi-adonis/example/bin/test.ts +++ /dev/null @@ -1,62 +0,0 @@ -/* -|-------------------------------------------------------------------------- -| Test runner entrypoint -|-------------------------------------------------------------------------- -| -| The "test.ts" file is the entrypoint for running tests using Japa. -| -| Either you can run this file directly or use the "test" -| command to run this file and monitor file changes. -| -*/ - -process.env.NODE_ENV = 'test' - -import 'reflect-metadata' -import { Ignitor, prettyPrintError } from '@adonisjs/core' -import { configure, processCLIArgs, run } from '@japa/runner' - -/** - * URL to the application root. AdonisJS need it to resolve - * paths to file and directories for scaffolding commands - */ -const APP_ROOT = new URL('../', import.meta.url) - -/** - * The importer is used to import files in context of the - * application. - */ -const IMPORTER = (filePath: string) => { - if (filePath.startsWith('./') || filePath.startsWith('../')) { - return import(new URL(filePath, APP_ROOT).href) - } - return import(filePath) -} - -new Ignitor(APP_ROOT, { importer: IMPORTER }) - .tap((app) => { - app.booting(async () => { - await import('#start/env') - }) - app.listen('SIGTERM', () => app.terminate()) - app.listenIf(app.managedByPm2, 'SIGINT', () => app.terminate()) - }) - .testRunner() - .configure(async (app) => { - const { runnerHooks, ...config } = await import('../tests/bootstrap.js') - - processCLIArgs(process.argv.splice(2)) - configure({ - ...app.rcFile.tests, - ...config, - ...{ - setup: runnerHooks.setup, - teardown: runnerHooks.teardown.concat([() => app.terminate()]), - }, - }) - }) - .run(() => run()) - .catch((error) => { - process.exitCode = 1 - prettyPrintError(error) - }) diff --git a/packages/openapi-adonis/example/tests/bootstrap.ts b/packages/openapi-adonis/example/tests/bootstrap.ts deleted file mode 100644 index 39aa4c7cf..000000000 --- a/packages/openapi-adonis/example/tests/bootstrap.ts +++ /dev/null @@ -1,38 +0,0 @@ -import { assert } from '@japa/assert' -import { apiClient } from '@japa/api-client' -import app from '@adonisjs/core/services/app' -import type { Config } from '@japa/runner/types' -import { pluginAdonisJS } from '@japa/plugin-adonisjs' -import testUtils from '@adonisjs/core/services/test_utils' - -/** - * This file is imported by the "bin/test.ts" entrypoint file - */ - -/** - * Configure Japa plugins in the plugins array. - * Learn more - https://japa.dev/docs/runner-config#plugins-optional - */ -export const plugins: Config['plugins'] = [assert(), apiClient(), pluginAdonisJS(app)] - -/** - * Configure lifecycle function to run before and after all the - * tests. - * - * The setup functions are executed before all the tests - * The teardown functions are executer after all the tests - */ -export const runnerHooks: Required> = { - setup: [], - teardown: [], -} - -/** - * Configure suites by tapping into the test suite instance. - * Learn more - https://japa.dev/docs/test-suites#lifecycle-hooks - */ -export const configureSuite: Config['configureSuite'] = (suite) => { - if (['browser', 'functional', 'e2e'].includes(suite.name)) { - return suite.setup(() => testUtils.httpServer().start()) - } -} diff --git a/packages/openapi-adonis/package.json b/packages/openapi-adonis/package.json index 8feb33846..4c199ca50 100644 --- a/packages/openapi-adonis/package.json +++ b/packages/openapi-adonis/package.json @@ -15,7 +15,6 @@ "types": "./dist/index.d.ts", "default": "./dist/index.js" }, - "./*": "./*", "./decorators": { "types": "./dist/decorators/index.d.ts", "default": "./dist/decorators/index.js" @@ -41,16 +40,12 @@ "adonis" ], "scripts": { - "build": "pnpm run build:clean && pnpm run build:esm && pnpm run build:cjs", - "build:clean": "del-cli dist", - "build:esm": "tsc -p tsconfig.json", - "build:cjs": "esbuild --bundle --platform=node --target=es2019 --outfile=dist/index.cjs --external:typescript src/index.ts", + "build": "tsup", "dev": "tsup --watch", "format": "biome format . --write", "lint": "biome check .", "test": "pnpm run \"/^test:/\"", "test:js": "vitest run", - "test:ts": "tsc --noEmit", "version": "pnpm run prepare && pnpm run build" }, "dependencies": { @@ -66,9 +61,6 @@ "@adonisjs/http-server": "^7.2.3", "@types/lodash": "^4.17.7", "@types/node": "^22.1.0", - "del-cli": "^5.1.0", - "esbuild": "^0.20.2", - "execa": "^8.0.1", "tsup": "^8.2.4", "typescript": "^5.4.5", "unplugin-swc": "^1.5.1" diff --git a/packages/openapi-adonis/tsup.config.ts b/packages/openapi-adonis/tsup.config.ts index 818264f7b..dc745a36c 100644 --- a/packages/openapi-adonis/tsup.config.ts +++ b/packages/openapi-adonis/tsup.config.ts @@ -1,7 +1,7 @@ import { defineConfig } from "tsup"; export default defineConfig({ - entry: ["src/index.ts"], + entry: ["src/index.ts", "src/decorators/index.ts"], format: ["esm"], dts: true, sourcemap: true, diff --git a/packages/openapi-decorators/package.json b/packages/openapi-decorators/package.json index 8ae0ce364..59b33d177 100644 --- a/packages/openapi-decorators/package.json +++ b/packages/openapi-decorators/package.json @@ -44,16 +44,11 @@ "typescript" ], "scripts": { - "build": "pnpm run build:clean && pnpm run build:esm && pnpm run build:cjs", - "build:clean": "del-cli dist", - "build:esm": "tsc -p tsconfig.json", - "build:cjs": "esbuild --bundle --platform=node --target=es2019 --outfile=dist/index.cjs --external:typescript src/index.ts", + "build": "tsup", "dev": "tsup --watch", "format": "biome format . --write", "lint": "biome check .", "test": "pnpm run \"/^test:/\"", - "test:js": "vitest run", - "test:ts": "tsc --noEmit", "version": "pnpm run prepare && pnpm run build" }, "dependencies": { From 4d46884476a0b1d1f6f6f5941b645b540d741156 Mon Sep 17 00:00:00 2001 From: Martin PAUCOT Date: Sat, 10 Aug 2024 02:31:00 +0200 Subject: [PATCH 04/11] Fix builds --- pnpm-lock.yaml | 76 ++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 67 insertions(+), 9 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f741f8eb5..69ba27b2a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -75,15 +75,6 @@ importers: '@types/node': specifier: ^22.1.0 version: 22.1.0 - del-cli: - specifier: ^5.1.0 - version: 5.1.0 - esbuild: - specifier: ^0.20.2 - version: 0.20.2 - execa: - specifier: ^8.0.1 - version: 8.0.1 tsup: specifier: ^8.2.4 version: 8.2.4(@swc/core@1.7.4(@swc/helpers@0.5.5))(postcss@8.4.40)(typescript@5.4.5) @@ -161,6 +152,73 @@ importers: specifier: ~5.4 version: 5.4.5 + packages/openapi-adonis/example/build: + dependencies: + '@adonisjs/auth': + specifier: ^9.2.3 + version: 9.2.3(@adonisjs/assembler@7.7.0(typescript@5.4.5))(@adonisjs/core@6.12.1(@adonisjs/assembler@7.7.0(typescript@5.4.5))(@vinejs/vine@2.1.0))(@adonisjs/lucid@21.1.1(@adonisjs/assembler@7.7.0(typescript@5.4.5))(@adonisjs/core@6.12.1(@adonisjs/assembler@7.7.0(typescript@5.4.5))(@vinejs/vine@2.1.0))(luxon@3.5.0))(@japa/api-client@2.0.3)(@japa/plugin-adonisjs@3.0.1(@adonisjs/core@6.12.1(@adonisjs/assembler@7.7.0(typescript@5.4.5))(@vinejs/vine@2.1.0))(@japa/api-client@2.0.3)) + '@adonisjs/core': + specifier: ^6.12.1 + version: 6.12.1(@adonisjs/assembler@7.7.0(typescript@5.4.5))(@vinejs/vine@2.1.0) + '@adonisjs/cors': + specifier: ^2.2.1 + version: 2.2.1(@adonisjs/core@6.12.1(@adonisjs/assembler@7.7.0(typescript@5.4.5))(@vinejs/vine@2.1.0)) + '@adonisjs/lucid': + specifier: ^21.1.0 + version: 21.1.1(@adonisjs/assembler@7.7.0(typescript@5.4.5))(@adonisjs/core@6.12.1(@adonisjs/assembler@7.7.0(typescript@5.4.5))(@vinejs/vine@2.1.0))(luxon@3.5.0) + '@vinejs/vine': + specifier: ^2.1.0 + version: 2.1.0 + luxon: + specifier: ^3.5.0 + version: 3.5.0 + openapi-adonis: + specifier: workspace:^ + version: link:../.. + reflect-metadata: + specifier: ^0.2.2 + version: 0.2.2 + devDependencies: + '@adonisjs/assembler': + specifier: ^7.7.0 + version: 7.7.0(typescript@5.4.5) + '@adonisjs/eslint-config': + specifier: ^1.3.0 + version: 1.3.0(eslint@8.57.0)(prettier@3.3.2)(typescript@5.4.5) + '@adonisjs/http-server': + specifier: ^7.2.3 + version: 7.2.3(@adonisjs/application@8.3.1(@adonisjs/config@5.0.2)(@adonisjs/fold@10.1.2))(@adonisjs/encryption@6.0.2)(@adonisjs/events@9.0.2(@adonisjs/application@8.3.1(@adonisjs/config@5.0.2)(@adonisjs/fold@10.1.2))(@adonisjs/fold@10.1.2))(@adonisjs/fold@10.1.2)(@adonisjs/logger@6.0.3) + '@adonisjs/prettier-config': + specifier: ^1.3.0 + version: 1.3.0 + '@adonisjs/tsconfig': + specifier: ^1.3.0 + version: 1.3.0 + '@swc/core': + specifier: ^1.6.5 + version: 1.7.4(@swc/helpers@0.5.5) + '@types/node': + specifier: ^20.14.9 + version: 20.14.14 + eslint: + specifier: ^8.57.0 + version: 8.57.0 + hot-hook: + specifier: ^0.2.6 + version: 0.2.6 + pino-pretty: + specifier: ^11.2.1 + version: 11.2.2 + prettier: + specifier: ^3.3.2 + version: 3.3.2 + ts-node: + specifier: ^10.9.2 + version: 10.9.2(@swc/core@1.7.4(@swc/helpers@0.5.5))(@types/node@20.14.14)(typescript@5.4.5) + typescript: + specifier: ~5.4 + version: 5.4.5 + packages/openapi-decorators: dependencies: '@fastify/deepmerge': From b8ddd6d59970005e4d8a39a0e9d35f94216e18d1 Mon Sep 17 00:00:00 2001 From: Martin PAUCOT Date: Sat, 10 Aug 2024 02:34:42 +0200 Subject: [PATCH 05/11] Fix builds --- packages/openapi-adonis/example/package.json | 14 +------------- 1 file changed, 1 insertion(+), 13 deletions(-) diff --git a/packages/openapi-adonis/example/package.json b/packages/openapi-adonis/example/package.json index cf5995223..af4aa0bac 100644 --- a/packages/openapi-adonis/example/package.json +++ b/packages/openapi-adonis/example/package.json @@ -6,11 +6,7 @@ "license": "UNLICENSED", "scripts": { "start": "node bin/server.js", - "build": "node ace build", "dev": "node ace serve --watch", - "test": "node ace test", - "lint": "eslint .", - "format": "prettier --write .", "typecheck": "tsc --noEmit" }, "imports": { @@ -33,16 +29,12 @@ }, "devDependencies": { "@adonisjs/assembler": "^7.7.0", - "@adonisjs/eslint-config": "^1.3.0", "@adonisjs/http-server": "^7.2.3", - "@adonisjs/prettier-config": "^1.3.0", "@adonisjs/tsconfig": "^1.3.0", "@swc/core": "^1.6.5", "@types/node": "^20.14.9", - "eslint": "^8.57.0", "hot-hook": "^0.2.6", "pino-pretty": "^11.2.1", - "prettier": "^3.3.2", "ts-node": "^10.9.2", "typescript": "~5.4" }, @@ -61,9 +53,5 @@ "./app/controllers/**/*.ts", "./app/middleware/*.ts" ] - }, - "eslintConfig": { - "extends": "@adonisjs/eslint-config/app" - }, - "prettier": "@adonisjs/prettier-config" + } } From d7d1d2f9cf2f714ff710f2eb14e25e169b4b7c88 Mon Sep 17 00:00:00 2001 From: Martin PAUCOT Date: Sat, 10 Aug 2024 02:37:03 +0200 Subject: [PATCH 06/11] Fix builds --- pnpm-lock.yaml | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 69ba27b2a..98c66dbbf 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -115,15 +115,9 @@ importers: '@adonisjs/assembler': specifier: ^7.7.0 version: 7.7.0(typescript@5.4.5) - '@adonisjs/eslint-config': - specifier: ^1.3.0 - version: 1.3.0(eslint@8.57.0)(prettier@3.3.2)(typescript@5.4.5) '@adonisjs/http-server': specifier: ^7.2.3 version: 7.2.3(@adonisjs/application@8.3.1(@adonisjs/config@5.0.2)(@adonisjs/fold@10.1.2))(@adonisjs/encryption@6.0.2)(@adonisjs/events@9.0.2(@adonisjs/application@8.3.1(@adonisjs/config@5.0.2)(@adonisjs/fold@10.1.2))(@adonisjs/fold@10.1.2))(@adonisjs/fold@10.1.2)(@adonisjs/logger@6.0.3) - '@adonisjs/prettier-config': - specifier: ^1.3.0 - version: 1.3.0 '@adonisjs/tsconfig': specifier: ^1.3.0 version: 1.3.0 @@ -133,18 +127,12 @@ importers: '@types/node': specifier: ^20.14.9 version: 20.14.14 - eslint: - specifier: ^8.57.0 - version: 8.57.0 hot-hook: specifier: ^0.2.6 version: 0.2.6 pino-pretty: specifier: ^11.2.1 version: 11.2.2 - prettier: - specifier: ^3.3.2 - version: 3.3.2 ts-node: specifier: ^10.9.2 version: 10.9.2(@swc/core@1.7.4(@swc/helpers@0.5.5))(@types/node@20.14.14)(typescript@5.4.5) From 06bc94e03970be6fd86c097abd3b504eefe60840 Mon Sep 17 00:00:00 2001 From: Martin PAUCOT Date: Sat, 10 Aug 2024 02:49:07 +0200 Subject: [PATCH 07/11] Remove parallel build to ensure correct builds ordering --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 8db8550e7..940221adc 100644 --- a/package.json +++ b/package.json @@ -8,7 +8,7 @@ "email": "drew@pow.rs" }, "scripts": { - "build": "pnpm run -r --parallel --filter \"!*docs\" --aggregate-output build", + "build": "pnpm run -r --filter \"!*docs\" --aggregate-output build", "lint": "pnpm run -r --parallel --aggregate-output lint", "dev": "pnpm run -r --parallel --filter \"{packages/*}\" --aggregate-output dev", "format": "pnpm run -r --parallel --aggregate-output format", From d565bb156a91ee0c742fb3b19b4db64235a0a473 Mon Sep 17 00:00:00 2001 From: Martin PAUCOT Date: Sat, 10 Aug 2024 02:52:36 +0200 Subject: [PATCH 08/11] Fix tests --- packages/openapi-adonis/package.json | 3 +-- packages/openapi-adonis/test/index.test.ts | 3 +++ packages/openapi-decorators/package.json | 2 +- packages/openapi-decorators/test/loaders.test.ts | 3 ++- 4 files changed, 7 insertions(+), 4 deletions(-) create mode 100644 packages/openapi-adonis/test/index.test.ts diff --git a/packages/openapi-adonis/package.json b/packages/openapi-adonis/package.json index 4c199ca50..fb6284a4a 100644 --- a/packages/openapi-adonis/package.json +++ b/packages/openapi-adonis/package.json @@ -44,8 +44,7 @@ "dev": "tsup --watch", "format": "biome format . --write", "lint": "biome check .", - "test": "pnpm run \"/^test:/\"", - "test:js": "vitest run", + "test": "vitest run", "version": "pnpm run prepare && pnpm run build" }, "dependencies": { diff --git a/packages/openapi-adonis/test/index.test.ts b/packages/openapi-adonis/test/index.test.ts new file mode 100644 index 000000000..0225890b7 --- /dev/null +++ b/packages/openapi-adonis/test/index.test.ts @@ -0,0 +1,3 @@ +it('placeholder', () => { + expect(true).toBe(true) +}) diff --git a/packages/openapi-decorators/package.json b/packages/openapi-decorators/package.json index 59b33d177..e37a29f12 100644 --- a/packages/openapi-decorators/package.json +++ b/packages/openapi-decorators/package.json @@ -48,7 +48,7 @@ "dev": "tsup --watch", "format": "biome format . --write", "lint": "biome check .", - "test": "pnpm run \"/^test:/\"", + "test": "vitest run", "version": "pnpm run prepare && pnpm run build" }, "dependencies": { diff --git a/packages/openapi-decorators/test/loaders.test.ts b/packages/openapi-decorators/test/loaders.test.ts index 0409a2a33..ffc5a821e 100644 --- a/packages/openapi-decorators/test/loaders.test.ts +++ b/packages/openapi-decorators/test/loaders.test.ts @@ -1,5 +1,5 @@ import "reflect-metadata"; -import { DocumentBuilder, apiProperty } from "../src"; +import { DocumentBuilder } from "../src/builders/document-builder"; import { OperationBuilder } from "../src/builders/operation-builder"; import { loadApiBody } from "../src/loaders/loadApiBody"; import { loadApiOperation } from "../src/loaders/loadApiOperation"; @@ -10,6 +10,7 @@ import { loadApiResponse } from "../src/loaders/loadApiResponse"; import { loadApiTags } from "../src/loaders/loadApiTags"; import { loadSchema } from "../src/loaders/loadSchema"; import { resolveType } from "../src/loaders/loadType"; +import { apiProperty } from "../src/decorators/api-property"; describe("loaders", () => { describe("loadApiBody", () => { From b6ac53f7c6e27880a343f587dc737f0d8c15ea6a Mon Sep 17 00:00:00 2001 From: Martin PAUCOT Date: Sat, 10 Aug 2024 02:54:01 +0200 Subject: [PATCH 09/11] Run lint --- packages/openapi-adonis/test/index.test.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/openapi-adonis/test/index.test.ts b/packages/openapi-adonis/test/index.test.ts index 0225890b7..4cc4fd7ba 100644 --- a/packages/openapi-adonis/test/index.test.ts +++ b/packages/openapi-adonis/test/index.test.ts @@ -1,3 +1,3 @@ -it('placeholder', () => { - expect(true).toBe(true) -}) +it("placeholder", () => { + expect(true).toBe(true); +}); From 016d2f62cd4897881204b7cb6021aebc89fa8923 Mon Sep 17 00:00:00 2001 From: Martin PAUCOT Date: Sun, 18 Aug 2024 23:07:40 +0200 Subject: [PATCH 10/11] Improve code splitting and architecture --- .gitignore | 1 + docs/.vitepress/en.ts | 10 + docs/data/contributors.json | 2 +- docs/openapi-adonis/index.md | 70 ++ packages/openapi-adonis/biome.json | 2 +- .../app/controllers/users_controller.ts | 23 +- .../example/app/validators/user.ts | 12 + .../openapi-adonis/example/start/routes.ts | 23 +- packages/openapi-adonis/package.json | 2 + packages/openapi-adonis/src/index.ts | 6 +- .../src/loaders/loadController.ts | 57 - .../openapi-adonis/src/loaders/loadRoute.ts | 30 +- .../src/resolvers/vine-type.resolver.ts | 202 ++++ packages/openapi-adonis/test/vine.test.ts | 114 ++ packages/openapi-adonis/tsconfig.json | 2 +- packages/openapi-decorators/biome.json | 3 + packages/openapi-decorators/package.json | 6 + .../src/builders/document-builder.ts | 126 +- .../openapi-decorators/src/builders/index.ts | 1 - .../src/builders/operation-builder.ts | 29 +- .../src/builders/schema-builder.ts | 49 - .../src/decorators/api-operation.ts | 7 +- .../openapi-decorators/src/loaders/index.ts | 2 +- .../src/loaders/loadApiBody.ts | 4 +- .../src/loaders/loadApiOperation.ts | 12 +- .../src/loaders/loadApiParam.ts | 4 +- .../src/loaders/loadApiProperty.ts | 20 +- .../src/loaders/loadApiQuery.ts | 4 +- .../src/loaders/loadApiResponse.ts | 4 +- .../src/loaders/loadController.ts | 59 + .../src/loaders/loadSchema.ts | 25 - .../src/loaders/loadType.ts | 11 +- .../openapi-decorators/src/resolvers/index.ts | 2 + .../src/resolvers/model-resolver.ts | 37 + .../src/resolvers/type-resolver.ts | 11 + packages/openapi-decorators/src/types.ts | 11 +- .../openapi-decorators/test/loaders.test.ts | 231 +++- packages/openapi-decorators/tsup.config.ts | 2 +- pnpm-lock.yaml | 1037 +++-------------- 39 files changed, 1097 insertions(+), 1156 deletions(-) create mode 100644 docs/openapi-adonis/index.md create mode 100644 packages/openapi-adonis/example/app/validators/user.ts delete mode 100644 packages/openapi-adonis/src/loaders/loadController.ts create mode 100644 packages/openapi-adonis/src/resolvers/vine-type.resolver.ts create mode 100644 packages/openapi-adonis/test/vine.test.ts delete mode 100644 packages/openapi-decorators/src/builders/schema-builder.ts create mode 100644 packages/openapi-decorators/src/loaders/loadController.ts delete mode 100644 packages/openapi-decorators/src/loaders/loadSchema.ts create mode 100644 packages/openapi-decorators/src/resolvers/index.ts create mode 100644 packages/openapi-decorators/src/resolvers/model-resolver.ts create mode 100644 packages/openapi-decorators/src/resolvers/type-resolver.ts diff --git a/.gitignore b/.gitignore index 07389397b..777a4ce87 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,7 @@ .DS_Store dist node_modules +coverage packages/openapi-typescript/test/fixtures/cli-outputs/out diff --git a/docs/.vitepress/en.ts b/docs/.vitepress/en.ts index 2e7af7aca..6433453ab 100644 --- a/docs/.vitepress/en.ts +++ b/docs/.vitepress/en.ts @@ -78,6 +78,16 @@ export const en = defineConfig({ { text: "About", link: "/openapi-react-query/about" }, ], }, + { + text: "openapi-adonis", + items: [ + { text: "Getting Started", link: "/openapi-adonis/" }, + { text: "useQuery", link: "/openapi-react-query/use-query" }, + { text: "useMutation", link: "/openapi-react-query/use-mutation" }, + { text: "useSuspenseQuery", link: "/openapi-react-query/use-suspense-query" }, + { text: "About", link: "/openapi-react-query/about" }, + ], + }, ], }, search: { diff --git a/docs/data/contributors.json b/docs/data/contributors.json index 644326ad7..0195e1dd1 100644 --- a/docs/data/contributors.json +++ b/docs/data/contributors.json @@ -1 +1 @@ -{"openapi-typescript":[{"username":"drwpow","name":"Drew Powers","avatar":"https://avatars.githubusercontent.com/u/1369770?v=4","links":[{"icon":"github","link":"https://github.com/drwpow"}],"lastFetch":1722573008213},{"username":"psmyrdek","name":"Przemek Smyrdek","avatar":"https://avatars.githubusercontent.com/u/6187417?v=4","links":[{"icon":"github","link":"https://github.com/psmyrdek"}],"lastFetch":1722573008422},{"username":"enmand","name":"Dan Enman","avatar":"https://avatars.githubusercontent.com/u/432487?v=4","links":[{"icon":"github","link":"https://github.com/enmand"}],"lastFetch":1722573008545},{"username":"atlefren","name":"Atle Frenvik Sveen","avatar":"https://avatars.githubusercontent.com/u/1829927?v=4","links":[{"icon":"github","link":"https://github.com/atlefren"}],"lastFetch":1722573008666},{"username":"tpdewolf","name":"Tim de Wolf","avatar":"https://avatars.githubusercontent.com/u/4455209?v=4","links":[{"icon":"github","link":"https://github.com/tpdewolf"}],"lastFetch":1722573008782},{"username":"tombarton","name":"Tom Barton","avatar":"https://avatars.githubusercontent.com/u/6222711?v=4","links":[{"icon":"github","link":"https://github.com/tombarton"}],"lastFetch":1722573008907},{"username":"svnv","name":"Sven Nicolai Viig","avatar":"https://avatars.githubusercontent.com/u/1080888?v=4","links":[{"icon":"github","link":"https://github.com/svnv"}],"lastFetch":1722573009052},{"username":"sorin-davidoi","name":"Sorin Davidoi","avatar":"https://avatars.githubusercontent.com/u/2109702?v=4","links":[{"icon":"github","link":"https://github.com/sorin-davidoi"}],"lastFetch":1722573009219},{"username":"scvnathan","name":"Nathan Schneirov","avatar":"https://avatars.githubusercontent.com/u/73474?v=4","links":[{"icon":"github","link":"https://github.com/scvnathan"}],"lastFetch":1722573009321},{"username":"lbenie","name":"Lucien Bénié","avatar":"https://avatars.githubusercontent.com/u/7316046?v=4","links":[{"icon":"github","link":"https://github.com/lbenie"}],"lastFetch":1722573009455},{"username":"bokub","name":"Boris K","avatar":"https://avatars.githubusercontent.com/u/17952318?v=4","links":[{"icon":"github","link":"https://github.com/bokub"}],"lastFetch":1722573009559},{"username":"antonk52","name":"Anton Kastritskii","avatar":"https://avatars.githubusercontent.com/u/5817809?v=4","links":[{"icon":"github","link":"https://github.com/antonk52"}],"lastFetch":1722573009695},{"username":"tshelburne","name":"Tim Shelburne","avatar":"https://avatars.githubusercontent.com/u/1202267?v=4","links":[{"icon":"github","link":"https://github.com/tshelburne"}],"lastFetch":1722573009847},{"username":"typeofweb","name":"Michał Miszczyszyn","avatar":"https://avatars.githubusercontent.com/u/1338731?v=4","links":[{"icon":"github","link":"https://github.com/typeofweb"}],"lastFetch":1722573009953},{"username":"skh-","name":"Sam K Hall","avatar":"https://avatars.githubusercontent.com/u/1292598?v=4","links":[{"icon":"github","link":"https://github.com/skh-"}],"lastFetch":1722573010075},{"username":"BlooJeans","name":"Matt Jeanes","avatar":"https://avatars.githubusercontent.com/u/1751182?v=4","links":[{"icon":"github","link":"https://github.com/BlooJeans"}],"lastFetch":1722573010207},{"username":"selbekk","name":"Kristofer Giltvedt Selbekk","avatar":"https://avatars.githubusercontent.com/u/1307267?v=4","links":[{"icon":"github","link":"https://github.com/selbekk"}],"lastFetch":1722573010317},{"username":"Mause","name":"Elliana May","avatar":"https://avatars.githubusercontent.com/u/1405026?v=4","links":[{"icon":"github","link":"https://github.com/Mause"}],"lastFetch":1722573010571},{"username":"henhal","name":"Henrik Hall","avatar":"https://avatars.githubusercontent.com/u/9608258?v=4","links":[{"icon":"github","link":"https://github.com/henhal"}],"lastFetch":1722573010673},{"username":"gr2m","name":"Gregor Martynus","avatar":"https://avatars.githubusercontent.com/u/39992?v=4","links":[{"icon":"github","link":"https://github.com/gr2m"}],"lastFetch":1722573010774},{"username":"samdbmg","name":"Sam Mesterton-Gibbons","avatar":"https://avatars.githubusercontent.com/u/408983?v=4","links":[{"icon":"github","link":"https://github.com/samdbmg"}],"lastFetch":1722573010906},{"username":"rendall","name":"Rendall","avatar":"https://avatars.githubusercontent.com/u/293263?v=4","links":[{"icon":"github","link":"https://github.com/rendall"}],"lastFetch":1722573011062},{"username":"robertmassaioli","name":"Robert Massaioli","avatar":"https://avatars.githubusercontent.com/u/149178?v=4","links":[{"icon":"github","link":"https://github.com/robertmassaioli"}],"lastFetch":1722573011201},{"username":"jankuca","name":"Jan Kuča","avatar":"https://avatars.githubusercontent.com/u/367262?v=4","links":[{"icon":"github","link":"https://github.com/jankuca"}],"lastFetch":1722573011322},{"username":"th-m","name":"Thomas Valadez","avatar":"https://avatars.githubusercontent.com/u/13792029?v=4","links":[{"icon":"github","link":"https://github.com/th-m"}],"lastFetch":1722573011437},{"username":"asithade","name":"Asitha de Silva","avatar":"https://avatars.githubusercontent.com/u/3814354?v=4","links":[{"icon":"github","link":"https://github.com/asithade"}],"lastFetch":1722573011553},{"username":"misha-erm","name":"Misha","avatar":"https://avatars.githubusercontent.com/u/8783498?v=4","links":[{"icon":"github","link":"https://github.com/misha-erm"}],"lastFetch":1722573011734},{"username":"radist2s","name":"Alex Batalov","avatar":"https://avatars.githubusercontent.com/u/725645?v=4","links":[{"icon":"github","link":"https://github.com/radist2s"}],"lastFetch":1722573011853},{"username":"FedeBev","name":"Federico Bevione","avatar":"https://avatars.githubusercontent.com/u/22151395?v=4","links":[{"icon":"github","link":"https://github.com/FedeBev"}],"lastFetch":1722573011979},{"username":"yamacent","name":"Daisuke Yamamoto","avatar":"https://avatars.githubusercontent.com/u/8544439?v=4","links":[{"icon":"github","link":"https://github.com/yamacent"}],"lastFetch":1722573012203},{"username":"dnalborczyk","name":null,"avatar":"https://avatars.githubusercontent.com/u/2903325?v=4","links":[{"icon":"github","link":"https://github.com/dnalborczyk"}],"lastFetch":1722573012319},{"username":"FabioWanner","name":null,"avatar":"https://avatars.githubusercontent.com/u/46821078?v=4","links":[{"icon":"github","link":"https://github.com/FabioWanner"}],"lastFetch":1722573012431},{"username":"ashsmith","name":"Ash Smith","avatar":"https://avatars.githubusercontent.com/u/1086841?v=4","links":[{"icon":"github","link":"https://github.com/ashsmith"}],"lastFetch":1722573012543},{"username":"mehalter","name":"Micah Halter","avatar":"https://avatars.githubusercontent.com/u/1591837?v=4","links":[{"icon":"github","link":"https://github.com/mehalter"}],"lastFetch":1722573012671},{"username":"Chrg1001","name":"chrg1001","avatar":"https://avatars.githubusercontent.com/u/40189653?v=4","links":[{"icon":"github","link":"https://github.com/Chrg1001"}],"lastFetch":1722573012939},{"username":"sharmarajdaksh","name":"Dakshraj Sharma","avatar":"https://avatars.githubusercontent.com/u/33689528?v=4","links":[{"icon":"github","link":"https://github.com/sharmarajdaksh"}],"lastFetch":1722573013061},{"username":"shuluster","name":"Shaosu Liu","avatar":"https://avatars.githubusercontent.com/u/1707910?v=4","links":[{"icon":"github","link":"https://github.com/shuluster"}],"lastFetch":1722573013177},{"username":"FDiskas","name":"Vytenis","avatar":"https://avatars.githubusercontent.com/u/468006?v=4","links":[{"icon":"github","link":"https://github.com/FDiskas"}],"lastFetch":1722573013322},{"username":"ericzorn93","name":"Eric Zorn","avatar":"https://avatars.githubusercontent.com/u/22532542?v=4","links":[{"icon":"github","link":"https://github.com/ericzorn93"}],"lastFetch":1722573013501},{"username":"mbelsky","name":"Max Belsky","avatar":"https://avatars.githubusercontent.com/u/3923527?v=4","links":[{"icon":"github","link":"https://github.com/mbelsky"}],"lastFetch":1722573013608},{"username":"techbech","name":"Peter Bech","avatar":"https://avatars.githubusercontent.com/u/1520592?v=4","links":[{"icon":"github","link":"https://github.com/techbech"}],"lastFetch":1722573013722},{"username":"rustyconover","name":"Rusty Conover","avatar":"https://avatars.githubusercontent.com/u/731941?v=4","links":[{"icon":"github","link":"https://github.com/rustyconover"}],"lastFetch":1722573013837},{"username":"bunkscene","name":"Dave Carlson","avatar":"https://avatars.githubusercontent.com/u/2693678?v=4","links":[{"icon":"github","link":"https://github.com/bunkscene"}],"lastFetch":1722573013944},{"username":"ottomated","name":null,"avatar":"https://avatars.githubusercontent.com/u/31470743?v=4","links":[{"icon":"github","link":"https://github.com/ottomated"}],"lastFetch":1722573014062},{"username":"sadfsdfdsa","name":"Artem Shuvaev","avatar":"https://avatars.githubusercontent.com/u/28733669?v=4","links":[{"icon":"github","link":"https://github.com/sadfsdfdsa"}],"lastFetch":1722573014174},{"username":"ajaishankar","name":null,"avatar":"https://avatars.githubusercontent.com/u/328008?v=4","links":[{"icon":"github","link":"https://github.com/ajaishankar"}],"lastFetch":1722573014285},{"username":"dominikdosoudil","name":"Dominik Dosoudil","avatar":"https://avatars.githubusercontent.com/u/15929942?v=4","links":[{"icon":"github","link":"https://github.com/dominikdosoudil"}],"lastFetch":1722573014398},{"username":"kgtkr","name":"kgtkr","avatar":"https://avatars.githubusercontent.com/u/17868838?v=4","links":[{"icon":"github","link":"https://github.com/kgtkr"}],"lastFetch":1722573014504},{"username":"berzi","name":null,"avatar":"https://avatars.githubusercontent.com/u/32619123?v=4","links":[{"icon":"github","link":"https://github.com/berzi"}],"lastFetch":1722573014630},{"username":"PhilipTrauner","name":"Philip Trauner","avatar":"https://avatars.githubusercontent.com/u/9287847?v=4","links":[{"icon":"github","link":"https://github.com/PhilipTrauner"}],"lastFetch":1722573014734},{"username":"Powell-v2","name":"Pavel Yermolin","avatar":"https://avatars.githubusercontent.com/u/25308326?v=4","links":[{"icon":"github","link":"https://github.com/Powell-v2"}],"lastFetch":1722573014887},{"username":"duncanbeevers","name":"Duncan Beevers","avatar":"https://avatars.githubusercontent.com/u/7367?v=4","links":[{"icon":"github","link":"https://github.com/duncanbeevers"}],"lastFetch":1722573015007},{"username":"tkukushkin","name":"Timofei Kukushkin","avatar":"https://avatars.githubusercontent.com/u/1482516?v=4","links":[{"icon":"github","link":"https://github.com/tkukushkin"}],"lastFetch":1722573015128},{"username":"Semigradsky","name":"Dmitry Semigradsky","avatar":"https://avatars.githubusercontent.com/u/1198848?v=4","links":[{"icon":"github","link":"https://github.com/Semigradsky"}],"lastFetch":1722573015261},{"username":"MrLeebo","name":"Jeremy Liberman","avatar":"https://avatars.githubusercontent.com/u/2754163?v=4","links":[{"icon":"github","link":"https://github.com/MrLeebo"}],"lastFetch":1722573015371},{"username":"axelhzf","name":"Axel Hernández Ferrera","avatar":"https://avatars.githubusercontent.com/u/175627?v=4","links":[{"icon":"github","link":"https://github.com/axelhzf"}],"lastFetch":1722573015482},{"username":"imagoiq","name":"Loïc Fürhoff","avatar":"https://avatars.githubusercontent.com/u/12294151?v=4","links":[{"icon":"github","link":"https://github.com/imagoiq"}],"lastFetch":1722573015595},{"username":"BTMPL","name":"Bartosz Szczeciński","avatar":"https://avatars.githubusercontent.com/u/247153?v=4","links":[{"icon":"github","link":"https://github.com/BTMPL"}],"lastFetch":1722573015745},{"username":"HiiiiD","name":"Marco Salomone","avatar":"https://avatars.githubusercontent.com/u/61231210?v=4","links":[{"icon":"github","link":"https://github.com/HiiiiD"}],"lastFetch":1722573015860},{"username":"yacinehmito","name":"Yacine Hmito","avatar":"https://avatars.githubusercontent.com/u/6893840?v=4","links":[{"icon":"github","link":"https://github.com/yacinehmito"}],"lastFetch":1722573015982},{"username":"sajadtorkamani","name":"Sajad Torkamani","avatar":"https://avatars.githubusercontent.com/u/9380313?v=4","links":[{"icon":"github","link":"https://github.com/sajadtorkamani"}],"lastFetch":1722573016109},{"username":"mvdbeek","name":"Marius van den Beek","avatar":"https://avatars.githubusercontent.com/u/6804901?v=4","links":[{"icon":"github","link":"https://github.com/mvdbeek"}],"lastFetch":1722573016223},{"username":"sgrimm","name":"Steven Grimm","avatar":"https://avatars.githubusercontent.com/u/1248649?v=4","links":[{"icon":"github","link":"https://github.com/sgrimm"}],"lastFetch":1722573016333},{"username":"Swiftwork","name":"Erik Hughes","avatar":"https://avatars.githubusercontent.com/u/455178?v=4","links":[{"icon":"github","link":"https://github.com/Swiftwork"}],"lastFetch":1722573016449},{"username":"mtth","name":"Matthieu Monsch","avatar":"https://avatars.githubusercontent.com/u/1216372?v=4","links":[{"icon":"github","link":"https://github.com/mtth"}],"lastFetch":1722573016566},{"username":"mitchell-merry","name":"Mitchell Merry","avatar":"https://avatars.githubusercontent.com/u/8567231?v=4","links":[{"icon":"github","link":"https://github.com/mitchell-merry"}],"lastFetch":1722573016684},{"username":"qnp","name":"François Risoud","avatar":"https://avatars.githubusercontent.com/u/6012554?v=4","links":[{"icon":"github","link":"https://github.com/qnp"}],"lastFetch":1722573016852},{"username":"shoffmeister","name":null,"avatar":"https://avatars.githubusercontent.com/u/3868036?v=4","links":[{"icon":"github","link":"https://github.com/shoffmeister"}],"lastFetch":1722573016959},{"username":"liangskyli","name":"liangsky","avatar":"https://avatars.githubusercontent.com/u/31531283?v=4","links":[{"icon":"github","link":"https://github.com/liangskyli"}],"lastFetch":1722573017096},{"username":"happycollision","name":"Don Denton","avatar":"https://avatars.githubusercontent.com/u/3663628?v=4","links":[{"icon":"github","link":"https://github.com/happycollision"}],"lastFetch":1722573017211},{"username":"ysmood","name":"Yad Smood","avatar":"https://avatars.githubusercontent.com/u/1415488?v=4","links":[{"icon":"github","link":"https://github.com/ysmood"}],"lastFetch":1722573017390},{"username":"barakalon","name":"barak","avatar":"https://avatars.githubusercontent.com/u/12398927?v=4","links":[{"icon":"github","link":"https://github.com/barakalon"}],"lastFetch":1722573017515},{"username":"horaklukas","name":"Lukáš Horák","avatar":"https://avatars.githubusercontent.com/u/996088?v=4","links":[{"icon":"github","link":"https://github.com/horaklukas"}],"lastFetch":1722573017667},{"username":"pvanagtmaal","name":null,"avatar":"https://avatars.githubusercontent.com/u/5946464?v=4","links":[{"icon":"github","link":"https://github.com/pvanagtmaal"}],"lastFetch":1722573017785},{"username":"toomuchdesign","name":"Andrea Carraro","avatar":"https://avatars.githubusercontent.com/u/4573549?v=4","links":[{"icon":"github","link":"https://github.com/toomuchdesign"}],"lastFetch":1722573017892},{"username":"psychedelicious","name":"psychedelicious","avatar":"https://avatars.githubusercontent.com/u/4822129?v=4","links":[{"icon":"github","link":"https://github.com/psychedelicious"}],"lastFetch":1722573018006},{"username":"tkrotoff","name":"Tanguy Krotoff","avatar":"https://avatars.githubusercontent.com/u/643434?v=4","links":[{"icon":"github","link":"https://github.com/tkrotoff"}],"lastFetch":1722573018138},{"username":"pimveldhuisen","name":"Pim Veldhuisen","avatar":"https://avatars.githubusercontent.com/u/3043834?v=4","links":[{"icon":"github","link":"https://github.com/pimveldhuisen"}],"lastFetch":1722573018252},{"username":"asvishnyakov","name":"Aleksandr Vishniakov","avatar":"https://avatars.githubusercontent.com/u/6369252?v=4","links":[{"icon":"github","link":"https://github.com/asvishnyakov"}],"lastFetch":1722573018360},{"username":"SchabaJo","name":null,"avatar":"https://avatars.githubusercontent.com/u/138689813?v=4","links":[{"icon":"github","link":"https://github.com/SchabaJo"}],"lastFetch":1722573018465},{"username":"AhsanFazal","name":"Ahsan Fazal","avatar":"https://avatars.githubusercontent.com/u/7458046?v=4","links":[{"icon":"github","link":"https://github.com/AhsanFazal"}],"lastFetch":1722573018591},{"username":"ElForastero","name":"Eugene Dzhumak","avatar":"https://avatars.githubusercontent.com/u/5102818?v=4","links":[{"icon":"github","link":"https://github.com/ElForastero"}],"lastFetch":1722573018720},{"username":"msgadi","name":"Mohammed Gadi","avatar":"https://avatars.githubusercontent.com/u/9037086?v=4","links":[{"icon":"github","link":"https://github.com/msgadi"}],"lastFetch":1722573018835},{"username":"muttonchop","name":"Adam K","avatar":"https://avatars.githubusercontent.com/u/1037657?v=4","links":[{"icon":"github","link":"https://github.com/muttonchop"}],"lastFetch":1722573018956},{"username":"christoph-fricke","name":"Christoph Fricke","avatar":"https://avatars.githubusercontent.com/u/23103835?v=4","links":[{"icon":"github","link":"https://github.com/christoph-fricke"}],"lastFetch":1722573019078},{"username":"JorrinKievit","name":"Jorrin","avatar":"https://avatars.githubusercontent.com/u/43169049?v=4","links":[{"icon":"github","link":"https://github.com/JorrinKievit"}],"lastFetch":1722573019208},{"username":"WickyNilliams","name":"Nick Williams","avatar":"https://avatars.githubusercontent.com/u/1091390?v=4","links":[{"icon":"github","link":"https://github.com/WickyNilliams"}],"lastFetch":1722573019317},{"username":"hrsh7th","name":"hrsh7th","avatar":"https://avatars.githubusercontent.com/u/629908?v=4","links":[{"icon":"github","link":"https://github.com/hrsh7th"}],"lastFetch":1722573019435},{"username":"davidleger95","name":"David Leger","avatar":"https://avatars.githubusercontent.com/u/10498708?v=4","links":[{"icon":"github","link":"https://github.com/davidleger95"}],"lastFetch":1722573019584},{"username":"phk422","name":"Hongkun Peng","avatar":"https://avatars.githubusercontent.com/u/59734322?v=4","links":[{"icon":"github","link":"https://github.com/phk422"}],"lastFetch":1722573019690},{"username":"mzronek","name":"Matthias Zronek","avatar":"https://avatars.githubusercontent.com/u/3847700?v=4","links":[{"icon":"github","link":"https://github.com/mzronek"}],"lastFetch":1722573019933},{"username":"raurfang","name":"Łukasz Wiśniewski","avatar":"https://avatars.githubusercontent.com/u/867241?v=4","links":[{"icon":"github","link":"https://github.com/raurfang"}],"lastFetch":1722573020050},{"username":"JeanRemiDelteil","name":"Jean-Rémi Delteil","avatar":"https://avatars.githubusercontent.com/u/9743907?v=4","links":[{"icon":"github","link":"https://github.com/JeanRemiDelteil"}],"lastFetch":1722573020163},{"username":"TzviPM","name":"Tzvi Melamed","avatar":"https://avatars.githubusercontent.com/u/1950680?v=4","links":[{"icon":"github","link":"https://github.com/TzviPM"}],"lastFetch":1722573020279},{"username":"LucaSchwan","name":"ehrenschwan","avatar":"https://avatars.githubusercontent.com/u/25820532?v=4","links":[{"icon":"github","link":"https://github.com/LucaSchwan"}],"lastFetch":1722573020485},{"username":"nzapponi","name":"Niccolo Zapponi","avatar":"https://avatars.githubusercontent.com/u/20582065?v=4","links":[{"icon":"github","link":"https://github.com/nzapponi"}],"lastFetch":1722573020631},{"username":"luchsamapparat","name":"Marvin Luchs","avatar":"https://avatars.githubusercontent.com/u/875017?v=4","links":[{"icon":"github","link":"https://github.com/luchsamapparat"}],"lastFetch":1722573020758},{"username":"nmacmunn","name":"Neil MacMunn","avatar":"https://avatars.githubusercontent.com/u/849964?v=4","links":[{"icon":"github","link":"https://github.com/nmacmunn"}],"lastFetch":1722573020904}],"openapi-fetch":[{"username":"drwpow","name":"Drew Powers","avatar":"https://avatars.githubusercontent.com/u/1369770?v=4","links":[{"icon":"github","link":"https://github.com/drwpow"}],"lastFetch":1722573008218},{"username":"fergusean","name":null,"avatar":"https://avatars.githubusercontent.com/u/1029297?v=4","links":[{"icon":"github","link":"https://github.com/fergusean"}],"lastFetch":1722573008418},{"username":"shinzui","name":"Nadeem Bitar","avatar":"https://avatars.githubusercontent.com/u/519?v=4","links":[{"icon":"github","link":"https://github.com/shinzui"}],"lastFetch":1722573008602},{"username":"ezpuzz","name":"Emory Petermann","avatar":"https://avatars.githubusercontent.com/u/672182?v=4","links":[{"icon":"github","link":"https://github.com/ezpuzz"}],"lastFetch":1722573008711},{"username":"KotoriK","name":null,"avatar":"https://avatars.githubusercontent.com/u/52659125?v=4","links":[{"icon":"github","link":"https://github.com/KotoriK"}],"lastFetch":1722573008823},{"username":"fletchertyler914","name":"Tyler Fletcher","avatar":"https://avatars.githubusercontent.com/u/3344498?v=4","links":[{"icon":"github","link":"https://github.com/fletchertyler914"}],"lastFetch":1722573008932},{"username":"nholik","name":"Nicklos Holik","avatar":"https://avatars.githubusercontent.com/u/2022214?v=4","links":[{"icon":"github","link":"https://github.com/nholik"}],"lastFetch":1722573009034},{"username":"roj1512","name":null,"avatar":"https://avatars.githubusercontent.com/u/175297870?v=4","links":[{"icon":"github","link":"https://github.com/roj1512"}],"lastFetch":1722573009217},{"username":"nickcaballero","name":"Nick Caballero","avatar":"https://avatars.githubusercontent.com/u/355976?v=4","links":[{"icon":"github","link":"https://github.com/nickcaballero"}],"lastFetch":1722573009336},{"username":"hd-o","name":"Hadrian de Oliveira","avatar":"https://avatars.githubusercontent.com/u/58871222?v=4","links":[{"icon":"github","link":"https://github.com/hd-o"}],"lastFetch":1722573009453},{"username":"kecrily","name":"Percy Ma","avatar":"https://avatars.githubusercontent.com/u/45708948?v=4","links":[{"icon":"github","link":"https://github.com/kecrily"}],"lastFetch":1722573009572},{"username":"psychedelicious","name":"psychedelicious","avatar":"https://avatars.githubusercontent.com/u/4822129?v=4","links":[{"icon":"github","link":"https://github.com/psychedelicious"}],"lastFetch":1722573009700},{"username":"muttonchop","name":"Adam K","avatar":"https://avatars.githubusercontent.com/u/1037657?v=4","links":[{"icon":"github","link":"https://github.com/muttonchop"}],"lastFetch":1722573009855},{"username":"marcomuser","name":"Marco Muser","avatar":"https://avatars.githubusercontent.com/u/64737396?v=4","links":[{"icon":"github","link":"https://github.com/marcomuser"}],"lastFetch":1722573009985},{"username":"HugeLetters","name":"Evgenii Perminov","avatar":"https://avatars.githubusercontent.com/u/119697239?v=4","links":[{"icon":"github","link":"https://github.com/HugeLetters"}],"lastFetch":1722573010093},{"username":"Fumaz","name":"alex","avatar":"https://avatars.githubusercontent.com/u/45318608?v=4","links":[{"icon":"github","link":"https://github.com/Fumaz"}],"lastFetch":1722573010200},{"username":"darwish","name":"Mike Darwish","avatar":"https://avatars.githubusercontent.com/u/292570?v=4","links":[{"icon":"github","link":"https://github.com/darwish"}],"lastFetch":1722573010319},{"username":"kaechele","name":"Felix Kaechele","avatar":"https://avatars.githubusercontent.com/u/454490?v=4","links":[{"icon":"github","link":"https://github.com/kaechele"}],"lastFetch":1722573010569},{"username":"phk422","name":"Hongkun Peng","avatar":"https://avatars.githubusercontent.com/u/59734322?v=4","links":[{"icon":"github","link":"https://github.com/phk422"}],"lastFetch":1722573010687},{"username":"mikestopcontinues","name":"Mike Stop Continues","avatar":"https://avatars.githubusercontent.com/u/150434?v=4","links":[{"icon":"github","link":"https://github.com/mikestopcontinues"}],"lastFetch":1722573010799},{"username":"JE-Lee","name":"maurice","avatar":"https://avatars.githubusercontent.com/u/19794813?v=4","links":[{"icon":"github","link":"https://github.com/JE-Lee"}],"lastFetch":1722573010909},{"username":"vipentti","name":"Ville Penttinen","avatar":"https://avatars.githubusercontent.com/u/4726680?v=4","links":[{"icon":"github","link":"https://github.com/vipentti"}],"lastFetch":1722573011066},{"username":"armandabric","name":"Armand Abric","avatar":"https://avatars.githubusercontent.com/u/95120?v=4","links":[{"icon":"github","link":"https://github.com/armandabric"}],"lastFetch":1722573011174},{"username":"illright","name":"Lev Chelyadinov","avatar":"https://avatars.githubusercontent.com/u/15035286?v=4","links":[{"icon":"github","link":"https://github.com/illright"}],"lastFetch":1722573011279}],"openapi-react-query":[{"username":"drwpow","name":"Drew Powers","avatar":"https://avatars.githubusercontent.com/u/1369770?v=4","links":[{"icon":"github","link":"https://github.com/drwpow"}],"lastFetch":1722573008219},{"username":"kerwanp","name":"Martin Paucot","avatar":"https://avatars.githubusercontent.com/u/36955373?v=4","links":[{"icon":"github","link":"https://github.com/kerwanp"}],"lastFetch":1722573008420}]} \ No newline at end of file +{"openapi-typescript":[{"username":"drwpow","name":"Drew Powers","avatar":"https://avatars.githubusercontent.com/u/1369770?v=4","links":[{"icon":"github","link":"https://github.com/drwpow"}],"lastFetch":1723252526883},{"username":"psmyrdek","name":"Przemek Smyrdek","avatar":"https://avatars.githubusercontent.com/u/6187417?v=4","links":[{"icon":"github","link":"https://github.com/psmyrdek"}],"lastFetch":1723252527044},{"username":"enmand","name":"Dan Enman","avatar":"https://avatars.githubusercontent.com/u/432487?v=4","links":[{"icon":"github","link":"https://github.com/enmand"}],"lastFetch":1723252527203},{"username":"atlefren","name":"Atle Frenvik Sveen","avatar":"https://avatars.githubusercontent.com/u/1829927?v=4","links":[{"icon":"github","link":"https://github.com/atlefren"}],"lastFetch":1723252527360},{"username":"tpdewolf","name":"Tim de Wolf","avatar":"https://avatars.githubusercontent.com/u/4455209?v=4","links":[{"icon":"github","link":"https://github.com/tpdewolf"}],"lastFetch":1723252527514},{"username":"tombarton","name":"Tom Barton","avatar":"https://avatars.githubusercontent.com/u/6222711?v=4","links":[{"icon":"github","link":"https://github.com/tombarton"}],"lastFetch":1723252527668},{"username":"svnv","name":"Sven Nicolai Viig","avatar":"https://avatars.githubusercontent.com/u/1080888?v=4","links":[{"icon":"github","link":"https://github.com/svnv"}],"lastFetch":1723252527821},{"username":"sorin-davidoi","name":"Sorin Davidoi","avatar":"https://avatars.githubusercontent.com/u/2109702?v=4","links":[{"icon":"github","link":"https://github.com/sorin-davidoi"}],"lastFetch":1723252527985},{"username":"scvnathan","name":"Nathan Schneirov","avatar":"https://avatars.githubusercontent.com/u/73474?v=4","links":[{"icon":"github","link":"https://github.com/scvnathan"}],"lastFetch":1723252528123},{"username":"lbenie","name":"Lucien Bénié","avatar":"https://avatars.githubusercontent.com/u/7316046?v=4","links":[{"icon":"github","link":"https://github.com/lbenie"}],"lastFetch":1723252528271},{"username":"bokub","name":"Boris K","avatar":"https://avatars.githubusercontent.com/u/17952318?v=4","links":[{"icon":"github","link":"https://github.com/bokub"}],"lastFetch":1723252528413},{"username":"antonk52","name":"Anton Kastritskii","avatar":"https://avatars.githubusercontent.com/u/5817809?v=4","links":[{"icon":"github","link":"https://github.com/antonk52"}],"lastFetch":1723252528587},{"username":"tshelburne","name":"Tim Shelburne","avatar":"https://avatars.githubusercontent.com/u/1202267?v=4","links":[{"icon":"github","link":"https://github.com/tshelburne"}],"lastFetch":1723252528739},{"username":"typeofweb","name":"Michał Miszczyszyn","avatar":"https://avatars.githubusercontent.com/u/1338731?v=4","links":[{"icon":"github","link":"https://github.com/typeofweb"}],"lastFetch":1723252528892},{"username":"skh-","name":"Sam K Hall","avatar":"https://avatars.githubusercontent.com/u/1292598?v=4","links":[{"icon":"github","link":"https://github.com/skh-"}],"lastFetch":1723252529074},{"username":"BlooJeans","name":"Matt Jeanes","avatar":"https://avatars.githubusercontent.com/u/1751182?v=4","links":[{"icon":"github","link":"https://github.com/BlooJeans"}],"lastFetch":1723252529220},{"username":"selbekk","name":"Kristofer Giltvedt Selbekk","avatar":"https://avatars.githubusercontent.com/u/1307267?v=4","links":[{"icon":"github","link":"https://github.com/selbekk"}],"lastFetch":1723252529422},{"username":"Mause","name":"Elliana May","avatar":"https://avatars.githubusercontent.com/u/1405026?v=4","links":[{"icon":"github","link":"https://github.com/Mause"}],"lastFetch":1723252529576},{"username":"henhal","name":"Henrik Hall","avatar":"https://avatars.githubusercontent.com/u/9608258?v=4","links":[{"icon":"github","link":"https://github.com/henhal"}],"lastFetch":1723252529725},{"username":"gr2m","name":"Gregor Martynus","avatar":"https://avatars.githubusercontent.com/u/39992?v=4","links":[{"icon":"github","link":"https://github.com/gr2m"}],"lastFetch":1723252529880},{"username":"samdbmg","name":"Sam Mesterton-Gibbons","avatar":"https://avatars.githubusercontent.com/u/408983?v=4","links":[{"icon":"github","link":"https://github.com/samdbmg"}],"lastFetch":1723252530029},{"username":"rendall","name":"Rendall","avatar":"https://avatars.githubusercontent.com/u/293263?v=4","links":[{"icon":"github","link":"https://github.com/rendall"}],"lastFetch":1723252530196},{"username":"robertmassaioli","name":"Robert Massaioli","avatar":"https://avatars.githubusercontent.com/u/149178?v=4","links":[{"icon":"github","link":"https://github.com/robertmassaioli"}],"lastFetch":1723252530341},{"username":"jankuca","name":"Jan Kuča","avatar":"https://avatars.githubusercontent.com/u/367262?v=4","links":[{"icon":"github","link":"https://github.com/jankuca"}],"lastFetch":1723252530513},{"username":"th-m","name":"Thomas Valadez","avatar":"https://avatars.githubusercontent.com/u/13792029?v=4","links":[{"icon":"github","link":"https://github.com/th-m"}],"lastFetch":1723252530685},{"username":"asithade","name":"Asitha de Silva","avatar":"https://avatars.githubusercontent.com/u/3814354?v=4","links":[{"icon":"github","link":"https://github.com/asithade"}],"lastFetch":1723252530843},{"username":"misha-erm","name":"Misha","avatar":"https://avatars.githubusercontent.com/u/8783498?v=4","links":[{"icon":"github","link":"https://github.com/misha-erm"}],"lastFetch":1723252531033},{"username":"radist2s","name":"Alex Batalov","avatar":"https://avatars.githubusercontent.com/u/725645?v=4","links":[{"icon":"github","link":"https://github.com/radist2s"}],"lastFetch":1723252531196},{"username":"FedeBev","name":"Federico Bevione","avatar":"https://avatars.githubusercontent.com/u/22151395?v=4","links":[{"icon":"github","link":"https://github.com/FedeBev"}],"lastFetch":1723252531351},{"username":"yamacent","name":"Daisuke Yamamoto","avatar":"https://avatars.githubusercontent.com/u/8544439?v=4","links":[{"icon":"github","link":"https://github.com/yamacent"}],"lastFetch":1723252531512},{"username":"dnalborczyk","name":null,"avatar":"https://avatars.githubusercontent.com/u/2903325?v=4","links":[{"icon":"github","link":"https://github.com/dnalborczyk"}],"lastFetch":1723252531669},{"username":"FabioWanner","name":null,"avatar":"https://avatars.githubusercontent.com/u/46821078?v=4","links":[{"icon":"github","link":"https://github.com/FabioWanner"}],"lastFetch":1723252531832},{"username":"ashsmith","name":"Ash Smith","avatar":"https://avatars.githubusercontent.com/u/1086841?v=4","links":[{"icon":"github","link":"https://github.com/ashsmith"}],"lastFetch":1723252531980},{"username":"mehalter","name":"Micah Halter","avatar":"https://avatars.githubusercontent.com/u/1591837?v=4","links":[{"icon":"github","link":"https://github.com/mehalter"}],"lastFetch":1723252532131},{"username":"Chrg1001","name":"chrg1001","avatar":"https://avatars.githubusercontent.com/u/40189653?v=4","links":[{"icon":"github","link":"https://github.com/Chrg1001"}],"lastFetch":1723252532304},{"username":"sharmarajdaksh","name":"Dakshraj Sharma","avatar":"https://avatars.githubusercontent.com/u/33689528?v=4","links":[{"icon":"github","link":"https://github.com/sharmarajdaksh"}],"lastFetch":1723252532457},{"username":"shuluster","name":"Shaosu Liu","avatar":"https://avatars.githubusercontent.com/u/1707910?v=4","links":[{"icon":"github","link":"https://github.com/shuluster"}],"lastFetch":1723252532646},{"username":"FDiskas","name":"Vytenis","avatar":"https://avatars.githubusercontent.com/u/468006?v=4","links":[{"icon":"github","link":"https://github.com/FDiskas"}],"lastFetch":1723252532794},{"username":"ericzorn93","name":"Eric Zorn","avatar":"https://avatars.githubusercontent.com/u/22532542?v=4","links":[{"icon":"github","link":"https://github.com/ericzorn93"}],"lastFetch":1723252532932},{"username":"mbelsky","name":"Max Belsky","avatar":"https://avatars.githubusercontent.com/u/3923527?v=4","links":[{"icon":"github","link":"https://github.com/mbelsky"}],"lastFetch":1723252533087},{"username":"techbech","name":"Peter Bech","avatar":"https://avatars.githubusercontent.com/u/1520592?v=4","links":[{"icon":"github","link":"https://github.com/techbech"}],"lastFetch":1723252533233},{"username":"rustyconover","name":"Rusty Conover","avatar":"https://avatars.githubusercontent.com/u/731941?v=4","links":[{"icon":"github","link":"https://github.com/rustyconover"}],"lastFetch":1723252533376},{"username":"bunkscene","name":"Dave Carlson","avatar":"https://avatars.githubusercontent.com/u/2693678?v=4","links":[{"icon":"github","link":"https://github.com/bunkscene"}],"lastFetch":1723252533529},{"username":"ottomated","name":null,"avatar":"https://avatars.githubusercontent.com/u/31470743?v=4","links":[{"icon":"github","link":"https://github.com/ottomated"}],"lastFetch":1723252533704},{"username":"sadfsdfdsa","name":"Artem Shuvaev","avatar":"https://avatars.githubusercontent.com/u/28733669?v=4","links":[{"icon":"github","link":"https://github.com/sadfsdfdsa"}],"lastFetch":1723252533852},{"username":"ajaishankar","name":null,"avatar":"https://avatars.githubusercontent.com/u/328008?v=4","links":[{"icon":"github","link":"https://github.com/ajaishankar"}],"lastFetch":1723252534002},{"username":"dominikdosoudil","name":"Dominik Dosoudil","avatar":"https://avatars.githubusercontent.com/u/15929942?v=4","links":[{"icon":"github","link":"https://github.com/dominikdosoudil"}],"lastFetch":1723252534163},{"username":"kgtkr","name":"kgtkr","avatar":"https://avatars.githubusercontent.com/u/17868838?v=4","links":[{"icon":"github","link":"https://github.com/kgtkr"}],"lastFetch":1723252534331},{"username":"berzi","name":null,"avatar":"https://avatars.githubusercontent.com/u/32619123?v=4","links":[{"icon":"github","link":"https://github.com/berzi"}],"lastFetch":1723252534498},{"username":"PhilipTrauner","name":"Philip Trauner","avatar":"https://avatars.githubusercontent.com/u/9287847?v=4","links":[{"icon":"github","link":"https://github.com/PhilipTrauner"}],"lastFetch":1723252534637},{"username":"Powell-v2","name":"Pavel Yermolin","avatar":"https://avatars.githubusercontent.com/u/25308326?v=4","links":[{"icon":"github","link":"https://github.com/Powell-v2"}],"lastFetch":1723252534791},{"username":"duncanbeevers","name":"Duncan Beevers","avatar":"https://avatars.githubusercontent.com/u/7367?v=4","links":[{"icon":"github","link":"https://github.com/duncanbeevers"}],"lastFetch":1723252534944},{"username":"tkukushkin","name":"Timofei Kukushkin","avatar":"https://avatars.githubusercontent.com/u/1482516?v=4","links":[{"icon":"github","link":"https://github.com/tkukushkin"}],"lastFetch":1723252535088},{"username":"Semigradsky","name":"Dmitry Semigradsky","avatar":"https://avatars.githubusercontent.com/u/1198848?v=4","links":[{"icon":"github","link":"https://github.com/Semigradsky"}],"lastFetch":1723252535243},{"username":"MrLeebo","name":"Jeremy Liberman","avatar":"https://avatars.githubusercontent.com/u/2754163?v=4","links":[{"icon":"github","link":"https://github.com/MrLeebo"}],"lastFetch":1723252535442},{"username":"axelhzf","name":"Axel Hernández Ferrera","avatar":"https://avatars.githubusercontent.com/u/175627?v=4","links":[{"icon":"github","link":"https://github.com/axelhzf"}],"lastFetch":1723252535590},{"username":"imagoiq","name":"Loïc Fürhoff","avatar":"https://avatars.githubusercontent.com/u/12294151?v=4","links":[{"icon":"github","link":"https://github.com/imagoiq"}],"lastFetch":1723252535763},{"username":"BTMPL","name":"Bartosz Szczeciński","avatar":"https://avatars.githubusercontent.com/u/247153?v=4","links":[{"icon":"github","link":"https://github.com/BTMPL"}],"lastFetch":1723252535919},{"username":"HiiiiD","name":"Marco Salomone","avatar":"https://avatars.githubusercontent.com/u/61231210?v=4","links":[{"icon":"github","link":"https://github.com/HiiiiD"}],"lastFetch":1723252536072},{"username":"yacinehmito","name":"Yacine Hmito","avatar":"https://avatars.githubusercontent.com/u/6893840?v=4","links":[{"icon":"github","link":"https://github.com/yacinehmito"}],"lastFetch":1723252536288},{"username":"sajadtorkamani","name":"Sajad Torkamani","avatar":"https://avatars.githubusercontent.com/u/9380313?v=4","links":[{"icon":"github","link":"https://github.com/sajadtorkamani"}],"lastFetch":1723252536470},{"username":"mvdbeek","name":"Marius van den Beek","avatar":"https://avatars.githubusercontent.com/u/6804901?v=4","links":[{"icon":"github","link":"https://github.com/mvdbeek"}],"lastFetch":1723252536625},{"username":"sgrimm","name":"Steven Grimm","avatar":"https://avatars.githubusercontent.com/u/1248649?v=4","links":[{"icon":"github","link":"https://github.com/sgrimm"}],"lastFetch":1723252536773},{"username":"Swiftwork","name":"Erik Hughes","avatar":"https://avatars.githubusercontent.com/u/455178?v=4","links":[{"icon":"github","link":"https://github.com/Swiftwork"}],"lastFetch":1723252536937},{"username":"mtth","name":"Matthieu Monsch","avatar":"https://avatars.githubusercontent.com/u/1216372?v=4","links":[{"icon":"github","link":"https://github.com/mtth"}],"lastFetch":1723252537078},{"username":"mitchell-merry","name":"Mitchell Merry","avatar":"https://avatars.githubusercontent.com/u/8567231?v=4","links":[{"icon":"github","link":"https://github.com/mitchell-merry"}],"lastFetch":1723252537242},{"username":"qnp","name":"François Risoud","avatar":"https://avatars.githubusercontent.com/u/6012554?v=4","links":[{"icon":"github","link":"https://github.com/qnp"}],"lastFetch":1723252537394},{"username":"shoffmeister","name":null,"avatar":"https://avatars.githubusercontent.com/u/3868036?v=4","links":[{"icon":"github","link":"https://github.com/shoffmeister"}],"lastFetch":1723252537553},{"username":"liangskyli","name":"liangsky","avatar":"https://avatars.githubusercontent.com/u/31531283?v=4","links":[{"icon":"github","link":"https://github.com/liangskyli"}],"lastFetch":1723252537718},{"username":"happycollision","name":"Don Denton","avatar":"https://avatars.githubusercontent.com/u/3663628?v=4","links":[{"icon":"github","link":"https://github.com/happycollision"}],"lastFetch":1723252537870},{"username":"ysmood","name":"Yad Smood","avatar":"https://avatars.githubusercontent.com/u/1415488?v=4","links":[{"icon":"github","link":"https://github.com/ysmood"}],"lastFetch":1723252538022},{"username":"barakalon","name":"barak","avatar":"https://avatars.githubusercontent.com/u/12398927?v=4","links":[{"icon":"github","link":"https://github.com/barakalon"}],"lastFetch":1723252538164},{"username":"horaklukas","name":"Lukáš Horák","avatar":"https://avatars.githubusercontent.com/u/996088?v=4","links":[{"icon":"github","link":"https://github.com/horaklukas"}],"lastFetch":1723252538329},{"username":"pvanagtmaal","name":null,"avatar":"https://avatars.githubusercontent.com/u/5946464?v=4","links":[{"icon":"github","link":"https://github.com/pvanagtmaal"}],"lastFetch":1723252538469},{"username":"toomuchdesign","name":"Andrea Carraro","avatar":"https://avatars.githubusercontent.com/u/4573549?v=4","links":[{"icon":"github","link":"https://github.com/toomuchdesign"}],"lastFetch":1723252538625},{"username":"psychedelicious","name":"psychedelicious","avatar":"https://avatars.githubusercontent.com/u/4822129?v=4","links":[{"icon":"github","link":"https://github.com/psychedelicious"}],"lastFetch":1723252538789},{"username":"tkrotoff","name":"Tanguy Krotoff","avatar":"https://avatars.githubusercontent.com/u/643434?v=4","links":[{"icon":"github","link":"https://github.com/tkrotoff"}],"lastFetch":1723252538945},{"username":"pimveldhuisen","name":"Pim Veldhuisen","avatar":"https://avatars.githubusercontent.com/u/3043834?v=4","links":[{"icon":"github","link":"https://github.com/pimveldhuisen"}],"lastFetch":1723252539105},{"username":"asvishnyakov","name":"Aleksandr Vishniakov","avatar":"https://avatars.githubusercontent.com/u/6369252?v=4","links":[{"icon":"github","link":"https://github.com/asvishnyakov"}],"lastFetch":1723252539274},{"username":"SchabaJo","name":null,"avatar":"https://avatars.githubusercontent.com/u/138689813?v=4","links":[{"icon":"github","link":"https://github.com/SchabaJo"}],"lastFetch":1723252539436},{"username":"AhsanFazal","name":"Ahsan Fazal","avatar":"https://avatars.githubusercontent.com/u/7458046?v=4","links":[{"icon":"github","link":"https://github.com/AhsanFazal"}],"lastFetch":1723252539592},{"username":"ElForastero","name":"Eugene Dzhumak","avatar":"https://avatars.githubusercontent.com/u/5102818?v=4","links":[{"icon":"github","link":"https://github.com/ElForastero"}],"lastFetch":1723252539741},{"username":"msgadi","name":"Mohammed Gadi","avatar":"https://avatars.githubusercontent.com/u/9037086?v=4","links":[{"icon":"github","link":"https://github.com/msgadi"}],"lastFetch":1723252539886},{"username":"muttonchop","name":"Adam K","avatar":"https://avatars.githubusercontent.com/u/1037657?v=4","links":[{"icon":"github","link":"https://github.com/muttonchop"}],"lastFetch":1723252540038},{"username":"christoph-fricke","name":"Christoph Fricke","avatar":"https://avatars.githubusercontent.com/u/23103835?v=4","links":[{"icon":"github","link":"https://github.com/christoph-fricke"}],"lastFetch":1723252540193},{"username":"JorrinKievit","name":"Jorrin","avatar":"https://avatars.githubusercontent.com/u/43169049?v=4","links":[{"icon":"github","link":"https://github.com/JorrinKievit"}],"lastFetch":1723252540352},{"username":"WickyNilliams","name":"Nick Williams","avatar":"https://avatars.githubusercontent.com/u/1091390?v=4","links":[{"icon":"github","link":"https://github.com/WickyNilliams"}],"lastFetch":1723252540504},{"username":"hrsh7th","name":"hrsh7th","avatar":"https://avatars.githubusercontent.com/u/629908?v=4","links":[{"icon":"github","link":"https://github.com/hrsh7th"}],"lastFetch":1723252540677},{"username":"davidleger95","name":"David Leger","avatar":"https://avatars.githubusercontent.com/u/10498708?v=4","links":[{"icon":"github","link":"https://github.com/davidleger95"}],"lastFetch":1723252540835},{"username":"phk422","name":"Hongkun Peng","avatar":"https://avatars.githubusercontent.com/u/59734322?v=4","links":[{"icon":"github","link":"https://github.com/phk422"}],"lastFetch":1723252540981},{"username":"mzronek","name":"Matthias Zronek","avatar":"https://avatars.githubusercontent.com/u/3847700?v=4","links":[{"icon":"github","link":"https://github.com/mzronek"}],"lastFetch":1723252541153},{"username":"raurfang","name":"Łukasz Wiśniewski","avatar":"https://avatars.githubusercontent.com/u/867241?v=4","links":[{"icon":"github","link":"https://github.com/raurfang"}],"lastFetch":1723252541311},{"username":"JeanRemiDelteil","name":"Jean-Rémi Delteil","avatar":"https://avatars.githubusercontent.com/u/9743907?v=4","links":[{"icon":"github","link":"https://github.com/JeanRemiDelteil"}],"lastFetch":1723252541464},{"username":"TzviPM","name":"Tzvi Melamed","avatar":"https://avatars.githubusercontent.com/u/1950680?v=4","links":[{"icon":"github","link":"https://github.com/TzviPM"}],"lastFetch":1723252541682},{"username":"LucaSchwan","name":"ehrenschwan","avatar":"https://avatars.githubusercontent.com/u/25820532?v=4","links":[{"icon":"github","link":"https://github.com/LucaSchwan"}],"lastFetch":1723252541825},{"username":"nzapponi","name":"Niccolo Zapponi","avatar":"https://avatars.githubusercontent.com/u/20582065?v=4","links":[{"icon":"github","link":"https://github.com/nzapponi"}],"lastFetch":1723252541982},{"username":"luchsamapparat","name":"Marvin Luchs","avatar":"https://avatars.githubusercontent.com/u/875017?v=4","links":[{"icon":"github","link":"https://github.com/luchsamapparat"}],"lastFetch":1723252542132},{"username":"nmacmunn","name":"Neil MacMunn","avatar":"https://avatars.githubusercontent.com/u/849964?v=4","links":[{"icon":"github","link":"https://github.com/nmacmunn"}],"lastFetch":1723252542278}],"openapi-fetch":[{"username":"drwpow","name":"Drew Powers","avatar":"https://avatars.githubusercontent.com/u/1369770?v=4","links":[{"icon":"github","link":"https://github.com/drwpow"}],"lastFetch":1723252526808},{"username":"fergusean","name":null,"avatar":"https://avatars.githubusercontent.com/u/1029297?v=4","links":[{"icon":"github","link":"https://github.com/fergusean"}],"lastFetch":1723252526977},{"username":"shinzui","name":"Nadeem Bitar","avatar":"https://avatars.githubusercontent.com/u/519?v=4","links":[{"icon":"github","link":"https://github.com/shinzui"}],"lastFetch":1723252527135},{"username":"ezpuzz","name":"Emory Petermann","avatar":"https://avatars.githubusercontent.com/u/672182?v=4","links":[{"icon":"github","link":"https://github.com/ezpuzz"}],"lastFetch":1723252527298},{"username":"KotoriK","name":null,"avatar":"https://avatars.githubusercontent.com/u/52659125?v=4","links":[{"icon":"github","link":"https://github.com/KotoriK"}],"lastFetch":1723252527454},{"username":"fletchertyler914","name":"Tyler Fletcher","avatar":"https://avatars.githubusercontent.com/u/3344498?v=4","links":[{"icon":"github","link":"https://github.com/fletchertyler914"}],"lastFetch":1723252527605},{"username":"nholik","name":"Nicklos Holik","avatar":"https://avatars.githubusercontent.com/u/2022214?v=4","links":[{"icon":"github","link":"https://github.com/nholik"}],"lastFetch":1723252527756},{"username":"roj1512","name":null,"avatar":"https://avatars.githubusercontent.com/u/175297870?v=4","links":[{"icon":"github","link":"https://github.com/roj1512"}],"lastFetch":1723252527904},{"username":"nickcaballero","name":"Nick Caballero","avatar":"https://avatars.githubusercontent.com/u/355976?v=4","links":[{"icon":"github","link":"https://github.com/nickcaballero"}],"lastFetch":1723252528054},{"username":"hd-o","name":"Hadrian de Oliveira","avatar":"https://avatars.githubusercontent.com/u/58871222?v=4","links":[{"icon":"github","link":"https://github.com/hd-o"}],"lastFetch":1723252528254},{"username":"kecrily","name":"Percy Ma","avatar":"https://avatars.githubusercontent.com/u/45708948?v=4","links":[{"icon":"github","link":"https://github.com/kecrily"}],"lastFetch":1723252528408},{"username":"psychedelicious","name":"psychedelicious","avatar":"https://avatars.githubusercontent.com/u/4822129?v=4","links":[{"icon":"github","link":"https://github.com/psychedelicious"}],"lastFetch":1723252528561},{"username":"muttonchop","name":"Adam K","avatar":"https://avatars.githubusercontent.com/u/1037657?v=4","links":[{"icon":"github","link":"https://github.com/muttonchop"}],"lastFetch":1723252528706},{"username":"marcomuser","name":"Marco Muser","avatar":"https://avatars.githubusercontent.com/u/64737396?v=4","links":[{"icon":"github","link":"https://github.com/marcomuser"}],"lastFetch":1723252528869},{"username":"HugeLetters","name":"Evgenii Perminov","avatar":"https://avatars.githubusercontent.com/u/119697239?v=4","links":[{"icon":"github","link":"https://github.com/HugeLetters"}],"lastFetch":1723252529026},{"username":"Fumaz","name":"alex","avatar":"https://avatars.githubusercontent.com/u/45318608?v=4","links":[{"icon":"github","link":"https://github.com/Fumaz"}],"lastFetch":1723252529197},{"username":"darwish","name":"Mike Darwish","avatar":"https://avatars.githubusercontent.com/u/292570?v=4","links":[{"icon":"github","link":"https://github.com/darwish"}],"lastFetch":1723252529397},{"username":"kaechele","name":"Felix Kaechele","avatar":"https://avatars.githubusercontent.com/u/454490?v=4","links":[{"icon":"github","link":"https://github.com/kaechele"}],"lastFetch":1723252529557},{"username":"phk422","name":"Hongkun Peng","avatar":"https://avatars.githubusercontent.com/u/59734322?v=4","links":[{"icon":"github","link":"https://github.com/phk422"}],"lastFetch":1723252529713},{"username":"mikestopcontinues","name":"Mike Stop Continues","avatar":"https://avatars.githubusercontent.com/u/150434?v=4","links":[{"icon":"github","link":"https://github.com/mikestopcontinues"}],"lastFetch":1723252529861},{"username":"JE-Lee","name":"maurice","avatar":"https://avatars.githubusercontent.com/u/19794813?v=4","links":[{"icon":"github","link":"https://github.com/JE-Lee"}],"lastFetch":1723252530007},{"username":"vipentti","name":"Ville Penttinen","avatar":"https://avatars.githubusercontent.com/u/4726680?v=4","links":[{"icon":"github","link":"https://github.com/vipentti"}],"lastFetch":1723252530157},{"username":"armandabric","name":"Armand Abric","avatar":"https://avatars.githubusercontent.com/u/95120?v=4","links":[{"icon":"github","link":"https://github.com/armandabric"}],"lastFetch":1723252530324},{"username":"illright","name":"Lev Chelyadinov","avatar":"https://avatars.githubusercontent.com/u/15035286?v=4","links":[{"icon":"github","link":"https://github.com/illright"}],"lastFetch":1723252530477}],"openapi-react-query":[{"username":"drwpow","name":"Drew Powers","avatar":"https://avatars.githubusercontent.com/u/1369770?v=4","links":[{"icon":"github","link":"https://github.com/drwpow"}],"lastFetch":1723252526807},{"username":"kerwanp","name":"Martin Paucot","avatar":"https://avatars.githubusercontent.com/u/36955373?v=4","links":[{"icon":"github","link":"https://github.com/kerwanp"}],"lastFetch":1723252526973}]} \ No newline at end of file diff --git a/docs/openapi-adonis/index.md b/docs/openapi-adonis/index.md new file mode 100644 index 000000000..f754283f6 --- /dev/null +++ b/docs/openapi-adonis/index.md @@ -0,0 +1,70 @@ +--- +title: openapi-adonis +--- + +# Introduction + +openapi-adonis is an [Adonis.js] library to automatically generate OpenAPI schemas and documentation. + +- ✅ Creates operations from the Adonis Router +- ✅ Automatically adds your models to the schemas +- ✅ Automatically adds your `@vinejs/vine` validators to the schemas +- ✅ Extended type-inference using Typescript metadata +- ✅ Extensible using Typescript decorators +- ✅ Generates documentation for **Swagger, Scalar, Rapidoc** + +The library is inspired by the popular library [@nestjs/swagger](https://www.npmjs.com/package/@nestjs/swagger) and is built on top of [openapi-decorators](https://github.com/openapi-ts/openapi-typescript/tree/main/packages/openapi-decorators). + +::: code-group + +```tsx [app/controllers/users_controller.ts] +import { apiOperation, apiResponse } from "openapi-adonis/decorators"; +import User from "#models/user"; + +class UsersController { + @apiOperation({ summary: "List users" }) + @apiResponse({ type: [User] }) + async list() { + return User.findManyBy({}); + } +} +``` + +```tsx [app/models/user.ts] +import { apiProperty } from "openapi-adonis/decorators"; + +class User { + @apiProperty() + declare id: number; + + @apiProperty() + declare name: string; + + @apiProperty({ required: false }) + declare mobile?: string; +} +``` + +```tsx [start/routes.ts] +import router from "@adonisjs/core/services/router"; +import AdonisOpenAPI from "openapi-adonis"; + +const UsersController = () => import("#controllers/users_controller"); + +router.post("/users", [UsersController, "create"]); + +const builder = AdonisOpenAPI.document().setTitle("OpenAPI Adonis Example"); +AdonisOpenAPI.setup("/docs", router, builder); +``` + +::: + +## Setup + +Install this library by using `ace`: + +```bash +node ace add openapi-adonis +``` + +## Basic usage diff --git a/packages/openapi-adonis/biome.json b/packages/openapi-adonis/biome.json index 8eafd05ea..acf999617 100644 --- a/packages/openapi-adonis/biome.json +++ b/packages/openapi-adonis/biome.json @@ -2,7 +2,7 @@ "$schema": "https://biomejs.dev/schemas/1.8.1/schema.json", "extends": ["../../biome.json"], "files": { - "ignore": ["./example/"] + "ignore": ["./example/", "./coverage/"] }, "linter": { "rules": { diff --git a/packages/openapi-adonis/example/app/controllers/users_controller.ts b/packages/openapi-adonis/example/app/controllers/users_controller.ts index ef2a47f37..b4e06ebed 100644 --- a/packages/openapi-adonis/example/app/controllers/users_controller.ts +++ b/packages/openapi-adonis/example/app/controllers/users_controller.ts @@ -1,18 +1,21 @@ -import User from '#models/user' -import { apiBody, apiOperation, apiResponse, apiParam, apiQuery } from 'openapi-adonis/decorators' +import User from "#models/user"; +import { listUserValidator } from "#validators/user"; +import { apiBody, apiOperation, apiParam, apiQuery, apiResponse } from "openapi-adonis/decorators"; +import { VineType, ModelType } from "openapi-adonis"; export default class UsersController { - @apiOperation({ summary: 'Get users', tags: ['User'] }) - @apiResponse({ type: User }) - @apiParam({ name: 'id' }) - @apiQuery({ name: 'query' }) + @apiOperation({ summary: "Get users" }) + @apiResponse({ type: ModelType(User) }) + @apiParam({ name: "id" }) + @apiQuery({ name: "query" }) + @apiBody({ type: VineType(listUserValidator, "listUserValidator") }) async index(): Promise { - return new User() + return new User(); } - @apiOperation({ summary: 'Create new user', tags: ['User'] }) - @apiBody({ type: User }) + @apiOperation({ summary: "Create new user" }) + // @apiBody({ type: User }) async create(): Promise { - return new User() + return new User(); } } diff --git a/packages/openapi-adonis/example/app/validators/user.ts b/packages/openapi-adonis/example/app/validators/user.ts new file mode 100644 index 000000000..98174fdad --- /dev/null +++ b/packages/openapi-adonis/example/app/validators/user.ts @@ -0,0 +1,12 @@ +import vine from "@vinejs/vine"; + +export const listUserValidator = vine.compile( + vine.object({ + one: vine.string(), + two: vine.number(), + nested: vine.object({ + test: vine.number(), + }), + array: vine.array(vine.number()).maxLength(5), + }), +); diff --git a/packages/openapi-adonis/example/start/routes.ts b/packages/openapi-adonis/example/start/routes.ts index 158b8b882..4e645d0d2 100644 --- a/packages/openapi-adonis/example/start/routes.ts +++ b/packages/openapi-adonis/example/start/routes.ts @@ -7,19 +7,20 @@ | */ -import router from '@adonisjs/core/services/router' -import AdonisOpenAPI from 'openapi-adonis' +import router from "@adonisjs/core/services/router"; +import AdonisOpenAPI from "openapi-adonis"; -const UsersController = () => import('#controllers/users_controller') +const UsersController = () => import("#controllers/users_controller"); -router.get('/', async () => { +router.get("/", async () => { return { - hello: 'world', - } -}) + hello: "world", + }; +}); -router.get('/users/:id', [UsersController, 'index']) -router.post('/users', [UsersController, 'create']) +// router.get("/users/:id", [UsersController, "index"]); +// router.post("/users", [UsersController, "create"]); +router.resource("users", UsersController).apiOnly(); -const builder = AdonisOpenAPI.document().setTitle('OpenAPI Adonis Example') -AdonisOpenAPI.setup('/docs', router, builder) +const builder = AdonisOpenAPI.document().setTitle("OpenAPI Adonis Example"); +AdonisOpenAPI.setup("/docs", router, builder); diff --git a/packages/openapi-adonis/package.json b/packages/openapi-adonis/package.json index fb6284a4a..6f442eeb4 100644 --- a/packages/openapi-adonis/package.json +++ b/packages/openapi-adonis/package.json @@ -45,6 +45,7 @@ "format": "biome format . --write", "lint": "biome check .", "test": "vitest run", + "coverage": "vitest run --coverage", "version": "pnpm run prepare && pnpm run build" }, "dependencies": { @@ -60,6 +61,7 @@ "@adonisjs/http-server": "^7.2.3", "@types/lodash": "^4.17.7", "@types/node": "^22.1.0", + "@vitest/coverage-v8": "^2.0.5", "tsup": "^8.2.4", "typescript": "^5.4.5", "unplugin-swc": "^1.5.1" diff --git a/packages/openapi-adonis/src/index.ts b/packages/openapi-adonis/src/index.ts index c1894991d..7867519c4 100644 --- a/packages/openapi-adonis/src/index.ts +++ b/packages/openapi-adonis/src/index.ts @@ -4,11 +4,15 @@ import type { Router } from "@adonisjs/http-server"; import { DocumentBuilder } from "openapi-decorators/builders"; import { generateScalarUI } from "openapi-decorators/ui"; import { loadRouter } from "./loaders/loadRouter"; +import { VineTypeResolver } from "./resolvers/vine-type.resolver"; + +export { VineType } from "./resolvers/vine-type.resolver"; +export { ModelType } from "openapi-decorators/resolvers"; // biome-ignore lint/complexity/noStaticOnlyClass: TODO: move out of class export default class AdonisOpenAPI { public static document() { - return new DocumentBuilder(); + return new DocumentBuilder().addResolver(VineTypeResolver); } public static async load(builder: DocumentBuilder, router: Router): Promise { diff --git a/packages/openapi-adonis/src/loaders/loadController.ts b/packages/openapi-adonis/src/loaders/loadController.ts deleted file mode 100644 index e678e0f77..000000000 --- a/packages/openapi-adonis/src/loaders/loadController.ts +++ /dev/null @@ -1,57 +0,0 @@ -import type { DocumentBuilder, OperationBuilder } from "openapi-decorators/builders"; -import { - getApiBody, - getApiOperation, - getApiParams, - getApiQueries, - getApiResponses, - getApiTags, -} from "openapi-decorators"; -import { - loadApiBody, - loadApiOperation, - loadApiParam, - loadApiQuery, - loadApiResponse, - loadApiTags, -} from "openapi-decorators/loaders"; - -/** - * Enrich operation from Adonis Controller function - */ -export function loadController( - document: DocumentBuilder, - operation: OperationBuilder, - target: any, - propertyKey: string, -) { - const apiOperation = getApiOperation(target, propertyKey); - if (apiOperation) { - loadApiOperation(operation, apiOperation); - } - - const apiTags = getApiTags(target, propertyKey); - if (apiTags) { - loadApiTags(operation, apiTags); - } - - const apiBody = getApiBody(target, propertyKey); - if (apiBody) { - loadApiBody(document, operation, apiBody); - } - - const apiResponses = getApiResponses(target, propertyKey); - for (const apiResponse of apiResponses) { - loadApiResponse(document, operation, apiResponse); - } - - const apiParams = getApiParams(target, propertyKey); - for (const apiParam of apiParams) { - loadApiParam(document, operation, apiParam); - } - - const apiQueries = getApiQueries(target, propertyKey); - for (const apiQuery of apiQueries) { - loadApiQuery(document, operation, apiQuery); - } -} diff --git a/packages/openapi-adonis/src/loaders/loadRoute.ts b/packages/openapi-adonis/src/loaders/loadRoute.ts index a283d7bd3..c098a03f4 100644 --- a/packages/openapi-adonis/src/loaders/loadRoute.ts +++ b/packages/openapi-adonis/src/loaders/loadRoute.ts @@ -1,9 +1,7 @@ import type { OpenAPIV3 } from "openapi-types"; import { OperationBuilder, type DocumentBuilder } from "openapi-decorators/builders"; import type { AdonisRoute } from "../types"; -import { loadController } from "./loadController"; -import { getApiTags } from "openapi-decorators"; -import { loadApiTags } from "openapi-decorators/loaders"; +import { loadApiOperation, loadController } from "openapi-decorators/loaders"; import { normalizeRoutePattern } from "../utils/normalizeRoutePattern"; export async function loadRoute(document: DocumentBuilder, route: AdonisRoute) { @@ -11,29 +9,25 @@ export async function loadRoute(document: DocumentBuilder, route: AdonisRoute) { return; } - const importer = route.handler.reference[0] as Function; + const importer = route.handler.reference[0] as () => Promise<{ default: any }>; const propertyKey = route.handler.reference[1] as string; const target = (await importer().then((t: any) => t.default)) as any; - const operation = new OperationBuilder(); - - const apiTags = getApiTags(target); - if (apiTags) { - loadApiTags(operation, apiTags); - } - - loadController(document, operation, target.prototype, propertyKey); - for (const method of route.methods) { if (method === "HEAD") { continue; } - document.setOperation( - method.toLowerCase() as OpenAPIV3.HttpMethods, - normalizeRoutePattern(route.pattern), - operation.build(), - ); + const operation = new OperationBuilder(); + + loadApiOperation(operation, { + method: method.toLowerCase() as `${OpenAPIV3.HttpMethods}`, + pattern: normalizeRoutePattern(route.pattern), + }); + + loadController(document, operation, target.prototype, propertyKey); + + document.addOperation(operation); } } diff --git a/packages/openapi-adonis/src/resolvers/vine-type.resolver.ts b/packages/openapi-adonis/src/resolvers/vine-type.resolver.ts new file mode 100644 index 000000000..aaac95064 --- /dev/null +++ b/packages/openapi-adonis/src/resolvers/vine-type.resolver.ts @@ -0,0 +1,202 @@ +import { SimpleMessagesProvider, type VineValidator } from "@vinejs/vine"; +import type { SchemaTypes } from "@vinejs/vine/types"; +import { TypeResolver } from "openapi-decorators/resolvers"; +import type { OpenAPIV3 } from "openapi-types"; +import _ from "lodash"; + +type Validator = ReturnType["toJSON"]>; +type Refs = Validator["refs"]; +type CompilerNode = Validator["schema"]["schema"]; +type ObjectNode = CompilerNode & { type: "object" }; +type LiteralNode = CompilerNode & { type: "literal" }; +type ArrayNode = CompilerNode & { type: "array" }; +type ValidationNode = ObjectNode["validations"][number]; + +// TODO: We might want to autoload validators and import theme dynamically to discover constant name + +export class VineTypeResolver< + Schema extends SchemaTypes, + Metadata extends Record | undefined, +> extends TypeResolver { + #name: string; + + constructor( + private readonly validator: VineValidator, + name: string, + ) { + super(); + this.#name = name; + } + + name(): string { + return this.#name; + } + + async schema(): Promise { + const validator = this.validator.toJSON(); + const node = validator.schema.schema; + + if (node.type !== "object") { + // TODO: Better errors + throw new Error("Only object top-level schemas are currently supported"); + } + + const schema = parseCompilerNode(node, validator.refs); + + await enrichType(this.validator, schema); + + return schema; + } +} + +export function parseValidations(validations: ValidationNode[], refs: Refs): Partial { + const schema: Partial = {}; + + for (const validation of validations) { + const rule = refs[validation.ruleFnId]; + + if (!rule || !("options" in rule) || !rule.options) { + continue; + } + + if (rule.options.min) { + schema.minimum = rule.options.min; + } + + if (rule.options.max) { + schema.maximum = rule.options.max; + } + + // TODO: Surely a cleaner way to identify regex + if (rule.options.toString().includes("/")) { + schema.pattern = rule.options.toString(); + } + + // TODO: Choices + } + + return schema; +} + +export function parseCompilerNode(node: CompilerNode, refs: Refs): OpenAPIV3.SchemaObject { + let schema: OpenAPIV3.SchemaObject; + + switch (node.type) { + case "object": + schema = parseObjectNode(node, refs); + break; + case "literal": + schema = parseLiteralNode(node, refs); + break; + case "array": + schema = parseArrayNode(node, refs); + break; + default: + throw new Error(`No parser found for type ${node.type}`); + } + + // TODO: FIX TYPE + return { + ...parseValidations(node.validations, refs), + ...schema, + } as OpenAPIV3.SchemaObject; +} + +export function parseObjectNode(node: ObjectNode, refs: Refs): OpenAPIV3.SchemaObject { + const schema: OpenAPIV3.SchemaObject = { + type: "object", + }; + + for (const property of node.properties) { + schema.properties = { + ...schema.properties, + [property.fieldName]: parseCompilerNode(property, refs), + }; + + if ("isOptional" in property && property.isOptional === false) { + schema.required = [...(schema.required ?? []), property.fieldName]; + } + } + + return schema; +} + +export function parseArrayNode(node: ArrayNode, refs: Refs): OpenAPIV3.SchemaObject { + return { + type: "array", + items: parseCompilerNode(node.each, refs), + }; +} + +// A literal is always marked as string and is then specified properly depending on validator +export function parseLiteralNode(node: LiteralNode, refs: Refs): OpenAPIV3.SchemaObject { + return { + type: "string", + }; +} + +export async function enrichType(validator: VineValidator, schema: OpenAPIV3.SchemaObject) { + if (!schema.properties) { + return; + } + + const obj = nodeToTestObject(schema); + + const [error] = await validator.tryValidate(obj, { + messagesProvider: new SimpleMessagesProvider({ + required: "REQUIRED", + string: "TYPE", + object: "TYPE", + number: "TYPE", + boolean: "TYPE", + }), + }); + + if (!error) { + return schema; + } + + for (const message of error.messages) { + // TODO: This should break if property name starts with 0 + const fieldPath = message.field.replaceAll(/\.(?!0)/g, ".properties.").replaceAll(".0", ".items"); + + if (message.message === "TYPE") { + _.set(schema.properties, `${fieldPath}.type`, message.rule); + } + } +} + +function nodeToTestObject(schema: OpenAPIV3.SchemaObject) { + const res: any = {}; + + for (const [name, property] of Object.entries(schema.properties ?? {})) { + if (!("type" in property)) { + continue; + } + + if (property.type === "object") { + res[name] = nodeToTestObject(property); + } else if (property.type === "array") { + if (!("type" in property.items)) { + continue; + } + + if (property.items.type === "object") { + res[name] = [nodeToTestObject(property.items)]; + } else { + res[name] = ["example"]; + } + } else { + res[name] = "example"; + } + } + + return res; +} + +export function VineType | undefined>( + validator: VineValidator, + name: string, +): TypeResolver { + return new VineTypeResolver(validator, name); +} diff --git a/packages/openapi-adonis/test/vine.test.ts b/packages/openapi-adonis/test/vine.test.ts new file mode 100644 index 000000000..ef93b9931 --- /dev/null +++ b/packages/openapi-adonis/test/vine.test.ts @@ -0,0 +1,114 @@ +import vine from "@vinejs/vine"; +import { enrichType, parseArrayNode, parseLiteralNode, parseObjectNode } from "../src/resolvers/vine-type.resolver"; + +describe("parseLiteralNode", () => { + // INFO: This test is not really necessary + it("should always returns string", () => { + const validator = vine.compile(vine.string()); + const json = validator.toJSON(); + const result = parseLiteralNode(json.schema.schema as any, json.refs); + + expect(result.type).toBe("string"); + }); +}); + +describe("parseArrayNode", () => { + it("should parse array of string", () => { + const validator = vine.compile(vine.array(vine.string())); + const json = validator.toJSON(); + const result: any = parseArrayNode(json.schema.schema as any, json.refs); + + expect(result.type).toBe("array"); + expect(result.items.type).toBe("string"); + }); +}); + +describe("parseObjectNode", () => { + it("should parse object", () => { + const validator = vine.compile( + vine.object({ + example: vine.string(), + }), + ); + const json = validator.toJSON(); + const result: any = parseObjectNode(json.schema.schema as any, json.refs); + + expect(result.properties.example).toBeDefined(); + }); + + it("should parse nested object", () => { + const validator = vine.compile( + vine.object({ + nested: vine.object({ + again: vine.object({ + example: vine.string(), + }), + }), + }), + ); + const json = validator.toJSON(); + + const result: any = parseObjectNode(json.schema.schema as any, json.refs); + + expect(result.properties.nested.properties.again.properties.example).toBeDefined(); + }); + + it("should mark properties as required by default", () => { + const validator = vine.compile( + vine.object({ + example: vine.string(), + }), + ); + const json = validator.toJSON(); + const result: any = parseObjectNode(json.schema.schema as any, json.refs); + + expect(result.required).toContain("example"); + }); + + it("should handle optional properties", () => { + const validator = vine.compile( + vine.object({ + required: vine.string(), + notRequired: vine.string().optional(), + }), + ); + const json = validator.toJSON(); + const result: any = parseObjectNode(json.schema.schema as any, json.refs); + + expect(result.required).toContain("required"); + expect(result.required).not.toContain("notRequired"); + }); +}); + +describe("enrichType", () => { + it("should properly find types using validators", async () => { + const validator = vine.compile( + vine.object({ + boolean: vine.boolean(), + number: vine.number(), + string: vine.string(), + }), + ); + + const schema: any = { + type: "object", + properties: { + boolean: { + type: "string", + }, + number: { + type: "string", + }, + string: { + type: "string", + }, + }, + }; + + await enrichType(validator, schema); + + expect(schema.properties.string.type).toBe("string"); + expect(schema.properties.boolean.type).toBe("boolean"); + expect(schema.properties.number.type).toBe("number"); + }); +}); diff --git a/packages/openapi-adonis/tsconfig.json b/packages/openapi-adonis/tsconfig.json index 801bb5c7d..856c8f0d6 100644 --- a/packages/openapi-adonis/tsconfig.json +++ b/packages/openapi-adonis/tsconfig.json @@ -14,7 +14,7 @@ "target": "ESNext", "emitDecoratorMetadata": true, "experimentalDecorators": true, - "types": ["vitest/globals"] + "types": ["vitest/globals", "reflect-metadata"] }, "include": ["src", "test"], "exclude": ["example", "node_modules"] diff --git a/packages/openapi-decorators/biome.json b/packages/openapi-decorators/biome.json index bb46eda10..3ef072e57 100644 --- a/packages/openapi-decorators/biome.json +++ b/packages/openapi-decorators/biome.json @@ -1,6 +1,9 @@ { "$schema": "https://biomejs.dev/schemas/1.8.1/schema.json", "extends": ["../../biome.json"], + "files": { + "ignore": ["./example/", "./coverage/"] + }, "linter": { "rules": { "performance": { diff --git a/packages/openapi-decorators/package.json b/packages/openapi-decorators/package.json index e37a29f12..9c1d41921 100644 --- a/packages/openapi-decorators/package.json +++ b/packages/openapi-decorators/package.json @@ -20,6 +20,10 @@ "types": "./dist/loaders/index.d.ts", "import": "./dist/loaders/index.js" }, + "./resolvers": { + "types": "./dist/resolvers/index.d.ts", + "import": "./dist/resolvers/index.js" + }, "./ui": { "types": "./dist/ui/index.d.ts", "import": "./dist/ui/index.js" @@ -49,6 +53,7 @@ "format": "biome format . --write", "lint": "biome check .", "test": "vitest run", + "coverage": "vitest run --coverage", "version": "pnpm run prepare && pnpm run build" }, "dependencies": { @@ -60,6 +65,7 @@ "devDependencies": { "@types/lodash": "^4.17.7", "@types/node": "^22.1.0", + "@vitest/coverage-v8": "^2.0.5", "del-cli": "^5.1.0", "esbuild": "^0.20.2", "execa": "^8.0.1", diff --git a/packages/openapi-decorators/src/builders/document-builder.ts b/packages/openapi-decorators/src/builders/document-builder.ts index 3ba08f047..f72fa4808 100644 --- a/packages/openapi-decorators/src/builders/document-builder.ts +++ b/packages/openapi-decorators/src/builders/document-builder.ts @@ -2,11 +2,15 @@ import type { OpenAPIV3 } from "openapi-types"; import { buildDocumentBase } from "../fixtures/document-base"; import { BaseBuilder } from "./base-builder"; import { generateScalarUI } from "../ui/scalar"; -import { SchemaBuilder } from "./schema-builder"; +import type { Type } from "../types"; +import { TypeResolver } from "../resolvers/type-resolver"; +import { ModelTypeResolver } from "../resolvers/model-resolver"; +import type { OperationBuilder } from "./operation-builder"; export class DocumentBuilder extends BaseBuilder { private readonly document: OpenAPIV3.Document = buildDocumentBase(); - private readonly schemas: Record = {}; + private readonly operations: OperationBuilder[] = []; + private readonly resolvers: Type[] = [ModelTypeResolver]; public setTitle(title: string): this { this.document.info.title = title; @@ -18,48 +22,108 @@ export class DocumentBuilder extends BaseBuilder { return this; } - public createSchema(name: string): SchemaBuilder { - const builder = new SchemaBuilder(name); - this.schemas[name] = builder; - return builder; - } - - public hasSchema(name: string): OpenAPIV3.ReferenceObject | false { - const schema = this.schemas[name]; + public schemaRef(name: string): OpenAPIV3.ReferenceObject | false { + const schema = this.document.components?.schemas?.[name]; if (!schema) { return false; } - return schema.ref; + + return { + $ref: `#/components/schemas/${name}`, + }; + } + + public addOperation(operation: OperationBuilder) { + this.operations.push(operation); + } + + // public setOperation(method: OpenAPIV3.HttpMethods, pattern: string, operation: OpenAPIV3.OperationObject) { + // if (!this.document.paths[pattern]) { + // this.document.paths[pattern] = {}; + // } + // + // // biome-ignore lint/style/noNonNullAssertion: Defined two lines above + // this.document.paths[pattern]![method] = operation; + // } + + public scalar(url: string): string { + return generateScalarUI(url); + } + + public addResolver(resolver: Type): this { + this.resolvers.push(resolver); + return this; } - public setOperation(method: OpenAPIV3.HttpMethods, pattern: string, operation: OpenAPIV3.OperationObject) { - if (!this.document.paths[pattern]) { - this.document.paths[pattern] = {}; + public async resolve(type: any): Promise { + if (type instanceof TypeResolver) { + return this.resolveFromTypeResolver(type); } - // biome-ignore lint/style/noNonNullAssertion: Defined two lines above - this.document.paths[pattern]![method] = operation; + for (const typeResolver of this.resolvers) { + // TODO: Fix type + if (!(typeResolver as any).supports(type)) { + continue; + } + + const resolver = new typeResolver(type); + return this.resolveFromTypeResolver(resolver); + } + + throw new Error("Cannot resolve type"); } - public scalar(url: string) { - return generateScalarUI(url); + private async resolveFromTypeResolver(typeResolver: TypeResolver): Promise { + const name = typeResolver.name(); + const existing = this.schemaRef(name); + if (existing) { + return existing; + } + + // TODO: Do this properly + this.document.components = { + ...this.document.components, + schemas: { + ...this.document.components?.schemas, + [name]: {}, + }, + }; + + const schema = await typeResolver.schema(this); + + this.document.components = { + ...this.document.components, + schemas: { + ...this.document.components?.schemas, + [name]: schema, + }, + }; + + return { + $ref: `#/components/schemas/${name}`, + }; } + // TODO: Add proper errors public build(): OpenAPIV3.Document { - const schemas = Object.entries(this.schemas).reduce( - (a, [name, builder]) => ({ ...a, [name]: builder.build() }), - {}, - ); + for (const operation of this.operations) { + if (!operation.pattern) { + throw new Error("Operation does not have a pattern"); + } - return { - ...this.document, - components: { - ...this.document.components, - schemas: { - ...schemas, - ...this.document.components?.schemas, + if (!operation.method) { + throw new Error("Operation does not have a method"); + } + + this.document.paths = { + ...this.document.paths, + [operation.pattern]: { + ...this.document.paths[operation.pattern], + [operation.method]: operation.build(), }, - }, - }; + }; + } + + return this.document; } } diff --git a/packages/openapi-decorators/src/builders/index.ts b/packages/openapi-decorators/src/builders/index.ts index 466ef8da2..7155e5a4b 100644 --- a/packages/openapi-decorators/src/builders/index.ts +++ b/packages/openapi-decorators/src/builders/index.ts @@ -1,4 +1,3 @@ export * from "./base-builder"; export * from "./document-builder"; export * from "./operation-builder"; -export * from "./schema-builder"; diff --git a/packages/openapi-decorators/src/builders/operation-builder.ts b/packages/openapi-decorators/src/builders/operation-builder.ts index 0943770e4..c26b9c8eb 100644 --- a/packages/openapi-decorators/src/builders/operation-builder.ts +++ b/packages/openapi-decorators/src/builders/operation-builder.ts @@ -3,35 +3,38 @@ import { BaseBuilder } from "./base-builder"; import { deepmerge } from "../utils/deepmerge"; export class OperationBuilder extends BaseBuilder { - private operation: OpenAPIV3.OperationObject = { + method: `${OpenAPIV3.HttpMethods}` | undefined; + pattern: string | undefined; + + #operation: OpenAPIV3.OperationObject = { responses: {}, }; - public setRequestBody(body: OpenAPIV3.ReferenceObject | OpenAPIV3.RequestBodyObject) { - this.operation.requestBody = body; + setRequestBody(body: OpenAPIV3.ReferenceObject | OpenAPIV3.RequestBodyObject) { + this.#operation.requestBody = body; return this; } - public addTags(...tags: string[]) { - this.operation.tags = [...(this.operation.tags ?? []), ...tags]; + addTags(...tags: string[]) { + this.#operation.tags = [...(this.#operation.tags ?? []), ...tags]; return this; } - public setResponse(code: string, response: OpenAPIV3.ResponseObject) { - this.operation.responses[code] = response; + setResponse(code: string, response: OpenAPIV3.ResponseObject) { + this.#operation.responses[code] = response; return this; } - public addParameter(parameter: OpenAPIV3.ParameterObject) { - this.operation.parameters = [...(this.operation.parameters ?? []), parameter]; + addParameter(parameter: OpenAPIV3.ParameterObject) { + this.#operation.parameters = [...(this.#operation.parameters ?? []), parameter]; } - public merge(operation: Partial) { - this.operation = deepmerge(this.operation, operation); + merge(operation: Partial) { + this.#operation = deepmerge(this.#operation, operation); return this; } - public build(): OpenAPIV3.OperationObject { - return this.operation; + build(): OpenAPIV3.OperationObject { + return this.#operation; } } diff --git a/packages/openapi-decorators/src/builders/schema-builder.ts b/packages/openapi-decorators/src/builders/schema-builder.ts deleted file mode 100644 index f66d5183d..000000000 --- a/packages/openapi-decorators/src/builders/schema-builder.ts +++ /dev/null @@ -1,49 +0,0 @@ -import type { OpenAPIV3 } from "openapi-types"; -import { BaseBuilder } from "./base-builder"; -import { deepmerge } from "../utils/deepmerge"; - -export class SchemaBuilder extends BaseBuilder { - private schema: OpenAPIV3.SchemaObject = {}; - - constructor(private readonly name: string) { - super(); - } - - public setType(type: "array" | OpenAPIV3.NonArraySchemaObjectType) { - this.schema.type = type; - return this; - } - - public setProperty(name: string, schema: OpenAPIV3.SchemaObject | OpenAPIV3.ReferenceObject, required: boolean) { - if (!this.schema.properties) { - this.schema.properties = {}; - } - - this.schema.properties[name] = schema; - - if (required) { - if (!this.schema.required) { - this.schema.required = []; - } - - this.schema.required.push(name); - } - - return this; - } - - public merge(schema: Partial) { - this.schema = deepmerge(this.schema, schema); - return this; - } - - public get ref(): OpenAPIV3.ReferenceObject { - return { - $ref: `#/components/schemas/${this.name}`, - }; - } - - public build(): OpenAPIV3.SchemaObject { - return this.schema; - } -} diff --git a/packages/openapi-decorators/src/decorators/api-operation.ts b/packages/openapi-decorators/src/decorators/api-operation.ts index 52bebaf82..85afdd7cd 100644 --- a/packages/openapi-decorators/src/decorators/api-operation.ts +++ b/packages/openapi-decorators/src/decorators/api-operation.ts @@ -2,7 +2,12 @@ import type { OpenAPIV3 } from "openapi-types"; export const ApiOperationMetadataKey = Symbol("ApiOperation"); -export type ApiOperationOptions = Partial; +export type ApiOperationOptions = Partial< + OpenAPIV3.OperationObject & { + method: `${OpenAPIV3.HttpMethods}`; + pattern: string; + } +>; export function apiOperation(options: ApiOperationOptions): MethodDecorator { return Reflect.metadata(ApiOperationMetadataKey, options); diff --git a/packages/openapi-decorators/src/loaders/index.ts b/packages/openapi-decorators/src/loaders/index.ts index c5aa63d4e..72202569f 100644 --- a/packages/openapi-decorators/src/loaders/index.ts +++ b/packages/openapi-decorators/src/loaders/index.ts @@ -5,5 +5,5 @@ export * from "./loadApiProperty"; export * from "./loadApiQuery"; export * from "./loadApiResponse"; export * from "./loadApiTags"; -export * from "./loadSchema"; +export * from "./loadController"; export * from "./loadType"; diff --git a/packages/openapi-decorators/src/loaders/loadApiBody.ts b/packages/openapi-decorators/src/loaders/loadApiBody.ts index e4aaf4124..2310e3187 100644 --- a/packages/openapi-decorators/src/loaders/loadApiBody.ts +++ b/packages/openapi-decorators/src/loaders/loadApiBody.ts @@ -3,10 +3,10 @@ import type { OperationBuilder } from "../builders/operation-builder"; import type { ApiBodyOptions } from "../decorators"; import { resolveType } from "./loadType"; -export function loadApiBody(document: DocumentBuilder, operation: OperationBuilder, apiBody: ApiBodyOptions) { +export async function loadApiBody(document: DocumentBuilder, operation: OperationBuilder, apiBody: ApiBodyOptions) { const { type, isArray, ...rest } = apiBody; - const schema = type ? resolveType(document, type) : undefined; + const schema = type ? await resolveType(document, type) : undefined; operation.setRequestBody({ ...rest, diff --git a/packages/openapi-decorators/src/loaders/loadApiOperation.ts b/packages/openapi-decorators/src/loaders/loadApiOperation.ts index bbb8a8f51..5fbab8944 100644 --- a/packages/openapi-decorators/src/loaders/loadApiOperation.ts +++ b/packages/openapi-decorators/src/loaders/loadApiOperation.ts @@ -2,5 +2,15 @@ import type { OperationBuilder } from "../builders/operation-builder"; import type { ApiOperationOptions } from "../decorators/api-operation"; export function loadApiOperation(operation: OperationBuilder, apiOperation: ApiOperationOptions) { - operation.merge(apiOperation); + const { pattern, method, ...rest } = apiOperation; + + if (pattern) { + operation.pattern = pattern; + } + + if (method) { + operation.method = method; + } + + operation.merge(rest); } diff --git a/packages/openapi-decorators/src/loaders/loadApiParam.ts b/packages/openapi-decorators/src/loaders/loadApiParam.ts index 9f786ec57..1cfec7fe0 100644 --- a/packages/openapi-decorators/src/loaders/loadApiParam.ts +++ b/packages/openapi-decorators/src/loaders/loadApiParam.ts @@ -3,10 +3,10 @@ import type { OperationBuilder } from "../builders/operation-builder"; import type { ApiParamOptions } from "../decorators/api-param"; import { resolveType } from "./loadType"; -export function loadApiParam(document: DocumentBuilder, operation: OperationBuilder, apiParam: ApiParamOptions) { +export async function loadApiParam(document: DocumentBuilder, operation: OperationBuilder, apiParam: ApiParamOptions) { const { type, ...rest } = apiParam; - const schema = resolveType(document, type ?? "string"); + const schema = await resolveType(document, type ?? "string"); operation.addParameter({ in: "path", diff --git a/packages/openapi-decorators/src/loaders/loadApiProperty.ts b/packages/openapi-decorators/src/loaders/loadApiProperty.ts index 98d798b4e..832f8c013 100644 --- a/packages/openapi-decorators/src/loaders/loadApiProperty.ts +++ b/packages/openapi-decorators/src/loaders/loadApiProperty.ts @@ -1,17 +1,27 @@ +import type { OpenAPIV3 } from "openapi-types"; import type { DocumentBuilder } from "../builders/document-builder"; -import type { SchemaBuilder } from "../builders/schema-builder"; import type { ApiPropertyOptions } from "../decorators/api-property"; import { resolveType } from "./loadType"; -export function loadApiProperty( +export async function loadApiProperty( document: DocumentBuilder, - schema: SchemaBuilder, + schema: OpenAPIV3.SchemaObject, name: string, apiProperty: ApiPropertyOptions, ) { const { type, required, ...rest } = apiProperty; - const resolved = type ? resolveType(document, type) : undefined; + const resolved = type ? await resolveType(document, type) : undefined; - schema.setProperty(name, { ...resolved, ...rest }, required ?? true); + schema.properties = { + ...schema.properties, + [name]: { + ...resolved, + ...rest, + }, + }; + + if (required !== false) { + schema.required = [...(schema.required ?? []), name]; + } } diff --git a/packages/openapi-decorators/src/loaders/loadApiQuery.ts b/packages/openapi-decorators/src/loaders/loadApiQuery.ts index 9b38e40c3..7c5e9f919 100644 --- a/packages/openapi-decorators/src/loaders/loadApiQuery.ts +++ b/packages/openapi-decorators/src/loaders/loadApiQuery.ts @@ -3,10 +3,10 @@ import type { OperationBuilder } from "../builders/operation-builder"; import type { ApiQueryOptions } from "../decorators/api-query"; import { resolveType } from "./loadType"; -export function loadApiQuery(document: DocumentBuilder, operation: OperationBuilder, apiQuery: ApiQueryOptions) { +export async function loadApiQuery(document: DocumentBuilder, operation: OperationBuilder, apiQuery: ApiQueryOptions) { const { type, ...rest } = apiQuery; - const schema = resolveType(document, type ?? "string"); + const schema = await resolveType(document, type ?? "string"); operation.addParameter({ in: "query", diff --git a/packages/openapi-decorators/src/loaders/loadApiResponse.ts b/packages/openapi-decorators/src/loaders/loadApiResponse.ts index 7a6707d2c..f921c8a76 100644 --- a/packages/openapi-decorators/src/loaders/loadApiResponse.ts +++ b/packages/openapi-decorators/src/loaders/loadApiResponse.ts @@ -3,13 +3,13 @@ import type { OperationBuilder } from "../builders/operation-builder"; import type { ApiResponseOptions } from "../decorators/api-response"; import { resolveType } from "./loadType"; -export function loadApiResponse( +export async function loadApiResponse( document: DocumentBuilder, operation: OperationBuilder, apiResponse: ApiResponseOptions, ) { const { type, status, ...rest } = apiResponse; - const schema = type ? resolveType(document, type) : undefined; + const schema = type ? await resolveType(document, type) : undefined; operation.setResponse(status?.toString() ?? "200", { description: "OK", // TODO: Depends on status, diff --git a/packages/openapi-decorators/src/loaders/loadController.ts b/packages/openapi-decorators/src/loaders/loadController.ts new file mode 100644 index 000000000..6f4d80642 --- /dev/null +++ b/packages/openapi-decorators/src/loaders/loadController.ts @@ -0,0 +1,59 @@ +import type { DocumentBuilder } from "../builders/document-builder"; +import type { OperationBuilder } from "../builders/operation-builder"; +import { getApiBody } from "../decorators/api-body"; +import { getApiOperation } from "../decorators/api-operation"; +import { getApiParams } from "../decorators/api-param"; +import { getApiQueries } from "../decorators/api-query"; +import { getApiResponses } from "../decorators/api-response"; +import { getApiTags } from "../decorators/api-tags"; +import { loadApiBody } from "./loadApiBody"; +import { loadApiOperation } from "./loadApiOperation"; +import { loadApiParam } from "./loadApiParam"; +import { loadApiQuery } from "./loadApiQuery"; +import { loadApiResponse } from "./loadApiResponse"; +import { loadApiTags } from "./loadApiTags"; + +export async function loadController( + document: DocumentBuilder, + operation: OperationBuilder, + target: any, + propertyKey: string, +) { + const globalApiTags = getApiTags(target.constructor); + if (globalApiTags) { + loadApiTags(operation, globalApiTags); + } + + const apiOperation = getApiOperation(target, propertyKey); + if (apiOperation) { + loadApiOperation(operation, apiOperation); + } + + const apiTags = getApiTags(target, propertyKey); + if (apiTags) { + loadApiTags(operation, apiTags); + } + + const apiBody = getApiBody(target, propertyKey); + if (apiBody) { + await loadApiBody(document, operation, apiBody); + } + + const apiResponses = getApiResponses(target, propertyKey); + for (const apiResponse of apiResponses) { + await loadApiResponse(document, operation, apiResponse); + } + + const apiParams = getApiParams(target, propertyKey); + for (const apiParam of apiParams) { + await loadApiParam(document, operation, apiParam); + } + + const apiQueries = getApiQueries(target, propertyKey); + for (const apiQuery of apiQueries) { + await loadApiQuery(document, operation, apiQuery); + } + + const name = target.constructor.name.replace("Controller", ""); + loadApiTags(operation, [name]); +} diff --git a/packages/openapi-decorators/src/loaders/loadSchema.ts b/packages/openapi-decorators/src/loaders/loadSchema.ts deleted file mode 100644 index 26c11264a..000000000 --- a/packages/openapi-decorators/src/loaders/loadSchema.ts +++ /dev/null @@ -1,25 +0,0 @@ -import type { OpenAPIV3 } from "openapi-types"; -import type { DocumentBuilder } from "../builders/document-builder"; -import { getApiProperties } from "../decorators/api-property"; -import { loadApiProperty } from "./loadApiProperty"; - -export function loadSchema(document: DocumentBuilder, target: any): OpenAPIV3.ReferenceObject { - const name = target.constructor.name; - - const existing = document.hasSchema(name); - if (existing) { - return existing; - } - - const schema = document.createSchema(name); - - schema.setType("object"); - - const properties = getApiProperties(target); - - for (const [name, apiProperty] of Object.entries(properties)) { - loadApiProperty(document, schema, name, apiProperty); - } - - return schema.ref; -} diff --git a/packages/openapi-decorators/src/loaders/loadType.ts b/packages/openapi-decorators/src/loaders/loadType.ts index fcb8cfd7e..a1bdb5249 100644 --- a/packages/openapi-decorators/src/loaders/loadType.ts +++ b/packages/openapi-decorators/src/loaders/loadType.ts @@ -1,15 +1,14 @@ import type { OpenAPIV3 } from "openapi-types"; import type { DocumentBuilder } from "../builders/document-builder"; import type { SchemaType } from "../types"; -import { loadSchema } from "./loadSchema"; -export function resolveType( +export async function resolveType( document: DocumentBuilder, type: SchemaType, -): OpenAPIV3.ReferenceObject | OpenAPIV3.SchemaObject { +): Promise { if (typeof type === "string") { return { - type, + type: type as OpenAPIV3.NonArraySchemaObjectType, // TODO: Fix that }; } @@ -31,9 +30,9 @@ export function resolveType( }; } - if (typeof type === "object") { + if (typeof type === "object" && "$ref" in type) { return type; } - return loadSchema(document, type.prototype); + return document.resolve(type); } diff --git a/packages/openapi-decorators/src/resolvers/index.ts b/packages/openapi-decorators/src/resolvers/index.ts new file mode 100644 index 000000000..a510488ea --- /dev/null +++ b/packages/openapi-decorators/src/resolvers/index.ts @@ -0,0 +1,2 @@ +export * from "./type-resolver"; +export { ModelType } from "./model-resolver"; diff --git a/packages/openapi-decorators/src/resolvers/model-resolver.ts b/packages/openapi-decorators/src/resolvers/model-resolver.ts new file mode 100644 index 000000000..ae25152be --- /dev/null +++ b/packages/openapi-decorators/src/resolvers/model-resolver.ts @@ -0,0 +1,37 @@ +import type { OpenAPIV3 } from "openapi-types"; +import { TypeResolver } from "./type-resolver"; +import { getApiProperties } from "../decorators/api-property"; +import { loadApiProperty } from "../loaders"; +import type { DocumentBuilder } from "../builders"; + +export class ModelTypeResolver extends TypeResolver { + constructor(private readonly type: any) { + super(); + } + + public name(): string { + return this.type.name; + } + + public async schema(document: DocumentBuilder): Promise { + const schema: OpenAPIV3.SchemaObject = { + type: "object", + }; + + const properties = getApiProperties(this.type.prototype); + + for (const [name, apiProperty] of Object.entries(properties)) { + loadApiProperty(document, schema, name, apiProperty); + } + + return schema; + } + + public static supports(type: any): boolean { + return true; + } +} + +export function ModelType(type: any) { + return new ModelTypeResolver(type); +} diff --git a/packages/openapi-decorators/src/resolvers/type-resolver.ts b/packages/openapi-decorators/src/resolvers/type-resolver.ts new file mode 100644 index 000000000..f37b17833 --- /dev/null +++ b/packages/openapi-decorators/src/resolvers/type-resolver.ts @@ -0,0 +1,11 @@ +import type { OpenAPIV3 } from "openapi-types"; +import type { DocumentBuilder } from "../builders"; + +export abstract class TypeResolver { + public abstract name(): string; + public abstract schema(document: DocumentBuilder): Promise; + + public static supports(type: any): boolean { + return false; + } +} diff --git a/packages/openapi-decorators/src/types.ts b/packages/openapi-decorators/src/types.ts index 7fc982f0a..752a95ffb 100644 --- a/packages/openapi-decorators/src/types.ts +++ b/packages/openapi-decorators/src/types.ts @@ -1,4 +1,5 @@ import type { OpenAPIV3 } from "openapi-types"; +import type { TypeResolver } from "./resolvers"; export interface Type extends Function { new (...args: any[]): T; @@ -6,4 +7,12 @@ export interface Type extends Function { export type MetadataKey = string | Symbol; -export type SchemaType = Type | OpenAPIV3.NonArraySchemaObjectType | OpenAPIV3.ReferenceObject; +export type SchemaType = + | Type + | TypeResolver + | OpenAPIV3.NonArraySchemaObjectType + | OpenAPIV3.ReferenceObject + | any + | {}; + +export type Resolver = (target: any) => OpenAPIV3.SchemaObject | false; diff --git a/packages/openapi-decorators/test/loaders.test.ts b/packages/openapi-decorators/test/loaders.test.ts index ffc5a821e..fa826c17d 100644 --- a/packages/openapi-decorators/test/loaders.test.ts +++ b/packages/openapi-decorators/test/loaders.test.ts @@ -8,17 +8,18 @@ import { loadApiProperty } from "../src/loaders/loadApiProperty"; import { loadApiQuery } from "../src/loaders/loadApiQuery"; import { loadApiResponse } from "../src/loaders/loadApiResponse"; import { loadApiTags } from "../src/loaders/loadApiTags"; -import { loadSchema } from "../src/loaders/loadSchema"; import { resolveType } from "../src/loaders/loadType"; -import { apiProperty } from "../src/decorators/api-property"; +import type { OpenAPIV3 } from "openapi-types"; +import { apiBody, apiOperation, apiParam, apiQuery, apiResponse, apiTags } from "../src"; +import { loadController } from "../src/loaders"; describe("loaders", () => { describe("loadApiBody", () => { - it("should properly enrich operation", () => { + it("should properly enrich operation", async () => { const document = new DocumentBuilder(); const operation = new OperationBuilder(); - loadApiBody(document, operation, { + await loadApiBody(document, operation, { type: "string", }); @@ -60,18 +61,32 @@ describe("loaders", () => { responses: {}, }); }); + + it("should override method and pattern", () => { + const operation = new OperationBuilder(); + operation.pattern = "/nop"; + operation.method = "post"; + + loadApiOperation(operation, { + method: "get", + pattern: "/users", + }); + + expect(operation.method).toBe("get"); + expect(operation.pattern).toBe("/users"); + }); }); describe("loadApiParam", () => { - it("should properly enrich operation", () => { + it("should properly enrich operation", async () => { const document = new DocumentBuilder(); const operation = new OperationBuilder(); - loadApiParam(document, operation, { + await loadApiParam(document, operation, { name: "userId", }); - loadApiParam(document, operation, { + await loadApiParam(document, operation, { name: "collectionId", type: "number", }); @@ -83,36 +98,34 @@ describe("loaders", () => { }); describe("loadApiProperty", () => { - it("should properly enrich schema", () => { + it("should properly enrich schema", async () => { const document = new DocumentBuilder(); - const schema = document.createSchema("Test"); - - loadApiProperty(document, schema, "id", {}); - loadApiProperty(document, schema, "name", { type: "string" }); - loadApiProperty(document, schema, "notRequired", { type: "number", required: false }); + const schema: OpenAPIV3.SchemaObject = {}; - const output = schema.build(); + await loadApiProperty(document, schema, "id", {}); + await loadApiProperty(document, schema, "name", { type: "string" }); + await loadApiProperty(document, schema, "notRequired", { type: "number", required: false }); - expect(output.required).toContainEqual("id"); - expect(output.required).toContainEqual("name"); - expect(output.required).not.toContainEqual("notRequired"); + expect(schema.required).toContainEqual("id"); + expect(schema.required).toContainEqual("name"); + expect(schema.required).not.toContainEqual("notRequired"); - expect(output.properties?.id).toEqual({}); - expect(output.properties?.name).toEqual({ type: "string" }); - expect(output.properties?.notRequired).toEqual({ type: "number" }); + expect(schema.properties?.id).toEqual({}); + expect(schema.properties?.name).toEqual({ type: "string" }); + expect(schema.properties?.notRequired).toEqual({ type: "number" }); }); }); describe("loadApiQuery", () => { - it("should properly enrich operation", () => { + it("should properly enrich operation", async () => { const document = new DocumentBuilder(); const operation = new OperationBuilder(); - loadApiQuery(document, operation, { + await loadApiQuery(document, operation, { name: "userId", }); - loadApiQuery(document, operation, { + await loadApiQuery(document, operation, { name: "collectionId", type: "number", }); @@ -124,16 +137,16 @@ describe("loaders", () => { }); describe("loadApiResponse", () => { - it("should properly enrich operation", () => { + it("should properly enrich operation", async () => { const document = new DocumentBuilder(); const operation = new OperationBuilder(); - loadApiResponse(document, operation, { + await loadApiResponse(document, operation, { status: 200, type: "string", }); - loadApiResponse(document, operation, { + await loadApiResponse(document, operation, { status: 500, type: "number", }); @@ -175,48 +188,150 @@ describe("loaders", () => { }); }); - describe("loadSchema", () => { - it("should properly add the schema to the document", () => { - const document = new DocumentBuilder(); - - class Test { - @apiProperty() - declare helloworld: string; - } - - const ref = loadSchema(document, Test.prototype); - const build = document.build(); - - expect(ref).toEqual({ $ref: "#/components/schemas/Test" }); - expect(build.components?.schemas?.Test).toEqual({ - type: "object", - properties: { helloworld: { type: "string" } }, - required: ["helloworld"], - }); - }); - }); - describe("loadType", () => { - it("should accept string types", () => { + it("should accept string types", async () => { const document = new DocumentBuilder(); - expect(resolveType(document, "boolean")).toEqual({ type: "boolean" }); - expect(resolveType(document, "integer")).toEqual({ type: "integer" }); - expect(resolveType(document, "number")).toEqual({ type: "number" }); - expect(resolveType(document, "string")).toEqual({ type: "string" }); + expect(await resolveType(document, "boolean")).toEqual({ type: "boolean" }); + expect(await resolveType(document, "integer")).toEqual({ type: "integer" }); + expect(await resolveType(document, "number")).toEqual({ type: "number" }); + expect(await resolveType(document, "string")).toEqual({ type: "string" }); }); - it("should accept schema reference", () => { + it("should accept schema reference", async () => { const document = new DocumentBuilder(); - expect(resolveType(document, { $ref: "#/components/schemas/User" })).toEqual({ + expect(await resolveType(document, { $ref: "#/components/schemas/User" })).toEqual({ $ref: "#/components/schemas/User", }); }); - it("should accept function types", () => { + it("should accept function types", async () => { const document = new DocumentBuilder(); - expect(resolveType(document, Boolean)).toEqual({ type: "boolean" }); - expect(resolveType(document, Number)).toEqual({ type: "number" }); - expect(resolveType(document, String)).toEqual({ type: "string" }); + expect(await resolveType(document, Boolean)).toEqual({ type: "boolean" }); + expect(await resolveType(document, Number)).toEqual({ type: "number" }); + expect(await resolveType(document, String)).toEqual({ type: "string" }); }); }); }); + +// TODO: Move (and maybe rename) this elsewhere as it is different of other loaders +describe("loadController", () => { + it("should load apiOperation", async () => { + class UsersController { + @apiOperation({ + method: "post", + pattern: "/users", + }) + public create() {} + } + + const document = new DocumentBuilder(); + const operation = new OperationBuilder(); + + await loadController(document, operation, UsersController.prototype, "create"); + + expect(operation.pattern).toBe("/users"); + expect(operation.method).toBe("post"); + }); + + it("should load tags", async () => { + @apiTags("Hello") + class UsersController { + @apiOperation({ + method: "post", + pattern: "/users", + }) + @apiTags("World") + public create() {} + } + + const document = new DocumentBuilder(); + const operation = new OperationBuilder(); + + await loadController(document, operation, UsersController.prototype, "create"); + const res = operation.build(); + + expect(res.tags).toContain("Hello"); + expect(res.tags).toContain("World"); + }); + + it("should load apiBody", async () => { + class UsersController { + @apiOperation({ + method: "post", + pattern: "/users", + }) + @apiBody({ type: String }) + public create() {} + } + + const document = new DocumentBuilder(); + const operation = new OperationBuilder(); + + await loadController(document, operation, UsersController.prototype, "create"); + + const res: any = operation.build(); + + expect(res.requestBody.content["application/json"].schema).toBeDefined(); + }); + + it("should load apiResponse", async () => { + class UsersController { + @apiOperation({ + method: "post", + pattern: "/users", + }) + @apiResponse({ type: String }) + public create() {} + } + + const document = new DocumentBuilder(); + const operation = new OperationBuilder(); + + await loadController(document, operation, UsersController.prototype, "create"); + + const res: any = operation.build(); + + expect(res.responses[200].content["application/json"].schema).toBeDefined(); + }); + + it("should load apiParam", async () => { + class UsersController { + @apiOperation({ + method: "post", + pattern: "/users", + }) + @apiParam({ name: "userId", type: String }) + @apiParam({ name: "testId", type: String }) + public create() {} + } + + const document = new DocumentBuilder(); + const operation = new OperationBuilder(); + + await loadController(document, operation, UsersController.prototype, "create"); + + const res: any = operation.build(); + + expect(res.parameters).toHaveLength(2); + }); + + it("should load apiQuery", async () => { + class UsersController { + @apiOperation({ + method: "post", + pattern: "/users", + }) + @apiQuery({ name: "filter", type: String }) + public create() {} + } + + const document = new DocumentBuilder(); + const operation = new OperationBuilder(); + + await loadController(document, operation, UsersController.prototype, "create"); + + const res: any = operation.build(); + + expect(res.parameters).toHaveLength(1); + }); +}); diff --git a/packages/openapi-decorators/tsup.config.ts b/packages/openapi-decorators/tsup.config.ts index 857b52ef6..30c8b1761 100644 --- a/packages/openapi-decorators/tsup.config.ts +++ b/packages/openapi-decorators/tsup.config.ts @@ -1,7 +1,7 @@ import { defineConfig } from "tsup"; export default defineConfig({ - entry: ["src/index.ts", "src/builders/index.ts", "src/loaders/index.ts", "src/ui/index.ts"], + entry: ["src/index.ts", "src/builders/index.ts", "src/loaders/index.ts", "src/resolvers/index.ts", "src/ui/index.ts"], format: ["esm"], dts: true, sourcemap: true, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 98c66dbbf..f04d16b34 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -75,6 +75,9 @@ importers: '@types/node': specifier: ^22.1.0 version: 22.1.0 + '@vitest/coverage-v8': + specifier: ^2.0.5 + version: 2.0.5(vitest@2.0.5(@types/node@22.1.0)(jsdom@20.0.3)) tsup: specifier: ^8.2.4 version: 8.2.4(@swc/core@1.7.4(@swc/helpers@0.5.5))(postcss@8.4.40)(typescript@5.4.5) @@ -140,73 +143,6 @@ importers: specifier: ~5.4 version: 5.4.5 - packages/openapi-adonis/example/build: - dependencies: - '@adonisjs/auth': - specifier: ^9.2.3 - version: 9.2.3(@adonisjs/assembler@7.7.0(typescript@5.4.5))(@adonisjs/core@6.12.1(@adonisjs/assembler@7.7.0(typescript@5.4.5))(@vinejs/vine@2.1.0))(@adonisjs/lucid@21.1.1(@adonisjs/assembler@7.7.0(typescript@5.4.5))(@adonisjs/core@6.12.1(@adonisjs/assembler@7.7.0(typescript@5.4.5))(@vinejs/vine@2.1.0))(luxon@3.5.0))(@japa/api-client@2.0.3)(@japa/plugin-adonisjs@3.0.1(@adonisjs/core@6.12.1(@adonisjs/assembler@7.7.0(typescript@5.4.5))(@vinejs/vine@2.1.0))(@japa/api-client@2.0.3)) - '@adonisjs/core': - specifier: ^6.12.1 - version: 6.12.1(@adonisjs/assembler@7.7.0(typescript@5.4.5))(@vinejs/vine@2.1.0) - '@adonisjs/cors': - specifier: ^2.2.1 - version: 2.2.1(@adonisjs/core@6.12.1(@adonisjs/assembler@7.7.0(typescript@5.4.5))(@vinejs/vine@2.1.0)) - '@adonisjs/lucid': - specifier: ^21.1.0 - version: 21.1.1(@adonisjs/assembler@7.7.0(typescript@5.4.5))(@adonisjs/core@6.12.1(@adonisjs/assembler@7.7.0(typescript@5.4.5))(@vinejs/vine@2.1.0))(luxon@3.5.0) - '@vinejs/vine': - specifier: ^2.1.0 - version: 2.1.0 - luxon: - specifier: ^3.5.0 - version: 3.5.0 - openapi-adonis: - specifier: workspace:^ - version: link:../.. - reflect-metadata: - specifier: ^0.2.2 - version: 0.2.2 - devDependencies: - '@adonisjs/assembler': - specifier: ^7.7.0 - version: 7.7.0(typescript@5.4.5) - '@adonisjs/eslint-config': - specifier: ^1.3.0 - version: 1.3.0(eslint@8.57.0)(prettier@3.3.2)(typescript@5.4.5) - '@adonisjs/http-server': - specifier: ^7.2.3 - version: 7.2.3(@adonisjs/application@8.3.1(@adonisjs/config@5.0.2)(@adonisjs/fold@10.1.2))(@adonisjs/encryption@6.0.2)(@adonisjs/events@9.0.2(@adonisjs/application@8.3.1(@adonisjs/config@5.0.2)(@adonisjs/fold@10.1.2))(@adonisjs/fold@10.1.2))(@adonisjs/fold@10.1.2)(@adonisjs/logger@6.0.3) - '@adonisjs/prettier-config': - specifier: ^1.3.0 - version: 1.3.0 - '@adonisjs/tsconfig': - specifier: ^1.3.0 - version: 1.3.0 - '@swc/core': - specifier: ^1.6.5 - version: 1.7.4(@swc/helpers@0.5.5) - '@types/node': - specifier: ^20.14.9 - version: 20.14.14 - eslint: - specifier: ^8.57.0 - version: 8.57.0 - hot-hook: - specifier: ^0.2.6 - version: 0.2.6 - pino-pretty: - specifier: ^11.2.1 - version: 11.2.2 - prettier: - specifier: ^3.3.2 - version: 3.3.2 - ts-node: - specifier: ^10.9.2 - version: 10.9.2(@swc/core@1.7.4(@swc/helpers@0.5.5))(@types/node@20.14.14)(typescript@5.4.5) - typescript: - specifier: ~5.4 - version: 5.4.5 - packages/openapi-decorators: dependencies: '@fastify/deepmerge': @@ -228,6 +164,9 @@ importers: '@types/node': specifier: ^22.1.0 version: 22.1.0 + '@vitest/coverage-v8': + specifier: ^2.0.5 + version: 2.0.5(vitest@2.0.5(@types/node@22.1.0)(jsdom@20.0.3)) del-cli: specifier: ^5.1.0 version: 5.1.0 @@ -596,15 +535,6 @@ packages: resolution: {integrity: sha512-CzK+njXTH3EK+d/UJPqckyqWocOItmLgHIUbvhpd6WvveBnfv1Dz5j9H3k+ogHqThDSJCXu1RkaRAC+HNym9gA==} engines: {node: '>=18.16.0'} - '@adonisjs/eslint-config@1.3.0': - resolution: {integrity: sha512-CBt/fl17+OCmaCd0rt79GvroDidaF/cBTc6iqjEh08IawAcanQE339kPRMgL1T43B6BDFmSahePvYU5es5j4yw==} - peerDependencies: - eslint: '>=7.4.0' - prettier: '>=2.0.0' - - '@adonisjs/eslint-plugin@1.3.0': - resolution: {integrity: sha512-LpN85yyuKkfo4t5PlE2Pij1GU3BcFh15cOH6BK7iDDcMkR6KduXB90hYiRu013EVIH+/sfxP5k2VjhBRc31Mqw==} - '@adonisjs/events@9.0.2': resolution: {integrity: sha512-qZn2e9V9C8tF4MNqEWv5JGxMG7gcHSJM8RncGpjuJ4cwFwd2jF4xrN6wkCprTVwoyZSxNS0Cp9NkAonySjG5vg==} engines: {node: '>=18.16.0'} @@ -668,9 +598,6 @@ packages: '@adonisjs/assembler': optional: true - '@adonisjs/prettier-config@1.3.0': - resolution: {integrity: sha512-StwX1dGsf8Yt5Vz48evSDGKMS5iOEgMHUYcDhkQJ79NUXopJ5PiAqb/GbjvA+XmEa+aZNPHqmafgFbfKlLAFZA==} - '@adonisjs/repl@4.0.1': resolution: {integrity: sha512-fgDRC5I8RBKHzsJPM4rRQF/OWI0K9cNihCIf4yHdqQt3mhFqWSOUjSi4sXWykdICLiddmyBO86au7i0d0dj5vQ==} engines: {node: '>=18.16.0'} @@ -823,10 +750,6 @@ packages: resolution: {integrity: sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==} engines: {node: '>=6.9.0'} - '@babel/helper-validator-identifier@7.24.5': - resolution: {integrity: sha512-3q93SSKX2TWCG30M2G2kwaKeTYgEUp5Snjuj8qm729SObL6nbtUldAi37qbxkD5gg3xnBio+f9nqpSepGZMvxA==} - engines: {node: '>=6.9.0'} - '@babel/helper-validator-identifier@7.24.7': resolution: {integrity: sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==} engines: {node: '>=6.9.0'} @@ -893,6 +816,9 @@ packages: resolution: {integrity: sha512-YTnYtra7W9e6/oAZEHj0bJehPRUlLH9/fbpT5LfB0NhQXyALCRkRs3zH9v07IYhkgpqX6Z78FnuccZr/l4Fs4Q==} engines: {node: '>=6.9.0'} + '@bcoe/v8-coverage@0.2.3': + resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} + '@biomejs/biome@1.8.1': resolution: {integrity: sha512-fQXGfvq6DIXem12dGQCM2tNF+vsNHH1qs3C7WeOu75Pd0trduoTmoO7G4ntLJ2qDs5wuw981H+cxQhi1uHnAtA==} engines: {node: '>=14.21.3'} @@ -1464,24 +1390,6 @@ packages: cpu: [x64] os: [win32] - '@eslint-community/eslint-utils@4.4.0': - resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - - '@eslint-community/regexpp@4.11.0': - resolution: {integrity: sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==} - engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - - '@eslint/eslintrc@2.1.4': - resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - - '@eslint/js@8.57.0': - resolution: {integrity: sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - '@faker-js/faker@8.4.1': resolution: {integrity: sha512-XQ3cU+Q8Uqmrbf2e0cIC/QN43sTBSC8KF12u29Mb47tWrt2hAgBXSgpZMj4Ao8Uk0iJcU99QsOCaIL8934obCg==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0, npm: '>=6.14.13'} @@ -1489,19 +1397,6 @@ packages: '@fastify/deepmerge@2.0.0': resolution: {integrity: sha512-fsaybTGDyQ5KpPsplQqb9yKdCf2x/pbNpMNk8Tvp3rRz7lVcupKysH4b2ELMN2P4Hak1+UqTYdTj/u4FNV2p0g==} - '@humanwhocodes/config-array@0.11.14': - resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==} - engines: {node: '>=10.10.0'} - deprecated: Use @eslint/config-array instead - - '@humanwhocodes/module-importer@1.0.1': - resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} - engines: {node: '>=12.22'} - - '@humanwhocodes/object-schema@2.0.3': - resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} - deprecated: Use @eslint/object-schema instead - '@inquirer/confirm@3.1.10': resolution: {integrity: sha512-/aAHu83Njy6yf44T+ZrRPUkMcUqprrOiIKsyMvf9jOV+vF5BNb2ja1aLP33MK36W8eaf91MTL/mU/e6METuENg==} engines: {node: '>=18'} @@ -1522,6 +1417,10 @@ packages: resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} engines: {node: '>=12'} + '@istanbuljs/schema@0.1.3': + resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} + engines: {node: '>=8'} + '@japa/api-client@2.0.3': resolution: {integrity: sha512-2Eh68Kg1+7glMo+mLSPfBGN21wUEA61niTMwdmhEXyw5VrS4IctZxQWhn5fzwj5KnQJfPpxrRnt9432Zs0uN/g==} engines: {node: '>=18.16.0'} @@ -1688,10 +1587,6 @@ packages: resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} - '@pkgr/core@0.1.1': - resolution: {integrity: sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==} - engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} - '@playwright/test@1.44.1': resolution: {integrity: sha512-1hZ4TNvD5z9VuhNJ/walIjvMVvYkZKf71axoF/uiAqpntQJXpG64dlXhoDXE3OczPuTuvjf/M5KWFg5VAVUS3Q==} engines: {node: '>=16'} @@ -2220,67 +2115,6 @@ packages: '@types/wrap-ansi@3.0.0': resolution: {integrity: sha512-ltIpx+kM7g/MLRZfkbL7EsCEjfzCcScLpkg37eXEtx5kmrAKBkTJwd1GIAjDSL8wTpM6Hzn5YO4pSb91BEwu1g==} - '@typescript-eslint/eslint-plugin@6.21.0': - resolution: {integrity: sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - '@typescript-eslint/parser': ^6.0.0 || ^6.0.0-alpha - eslint: ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - - '@typescript-eslint/parser@6.21.0': - resolution: {integrity: sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - eslint: ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - - '@typescript-eslint/scope-manager@6.21.0': - resolution: {integrity: sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==} - engines: {node: ^16.0.0 || >=18.0.0} - - '@typescript-eslint/type-utils@6.21.0': - resolution: {integrity: sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - eslint: ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - - '@typescript-eslint/types@6.21.0': - resolution: {integrity: sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==} - engines: {node: ^16.0.0 || >=18.0.0} - - '@typescript-eslint/typescript-estree@6.21.0': - resolution: {integrity: sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - - '@typescript-eslint/utils@6.21.0': - resolution: {integrity: sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - eslint: ^7.0.0 || ^8.0.0 - - '@typescript-eslint/visitor-keys@6.21.0': - resolution: {integrity: sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==} - engines: {node: ^16.0.0 || >=18.0.0} - - '@ungap/structured-clone@1.2.0': - resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} - '@vinejs/compiler@2.5.0': resolution: {integrity: sha512-hg4ekaB5Y2zh+IWzBiC/WCDWrIfpVnKu/ubUvelKlidc/VbulsexoFRw5kJGHZenPVI5YzNnDeTdYSALkTV7jQ==} engines: {node: '>=18.0.0'} @@ -2307,6 +2141,11 @@ packages: vite: ^5.0.0 vue: ^3.2.25 + '@vitest/coverage-v8@2.0.5': + resolution: {integrity: sha512-qeFcySCg5FLO2bHHSa0tAZAOnAUbp4L6/A5JDuj9+bt53JREl8hpLjLHEWF0e/gWc8INVpJaqA7+Ene2rclpZg==} + peerDependencies: + vitest: 2.0.5 + '@vitest/expect@2.0.5': resolution: {integrity: sha512-yHZtwuP7JZivj65Gxoi8upUN2OzHTi3zVfjwdpu2WrvCZPLwsJ2Ey5ILIPccoW23dd/zQBlJ4/dhi7DWNyXCpA==} @@ -2456,11 +2295,6 @@ packages: acorn-globals@7.0.1: resolution: {integrity: sha512-umOSDSDrfHbTNPuNpC2NSnnA3LUrqpevPb4T9jRx4MagXNS0rs+gwiTcAvqCRmsD6utzsrzNt+ebm00SNWiC3Q==} - acorn-jsx@5.3.2: - resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} - peerDependencies: - acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - acorn-walk@8.3.3: resolution: {integrity: sha512-MxXdReSRhGO7VlFe1bRG/oI7/mdLV9B9JJT0N8vZOhF7gFRR5l3M8W9G8JxmKV+JC5mGqJ0QvqfSOLsCPa4nUw==} engines: {node: '>=0.4.0'} @@ -2482,9 +2316,6 @@ packages: resolution: {integrity: sha512-0poP0T7el6Vq3rstR8Mn4V/IQrpBLO6POkUSrN7RhyY+GF/InCFShQzsQ39T25gkHhLgSLByyAz+Kjb+c2L98w==} engines: {node: '>=12'} - ajv@6.12.6: - resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} - algoliasearch@4.23.3: resolution: {integrity: sha512-Le/3YgNvjW9zxIQMRhUHuhiUjAlKY/zsdZpfq4dlLqg6mEm0nL6yk+7f2hDOtLpxsgE4jSzDmvHL7nXdBp5feg==} @@ -2638,10 +2469,6 @@ packages: buffer@6.0.3: resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} - builtin-modules@3.3.0: - resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} - engines: {node: '>=6'} - bundle-require@5.0.0: resolution: {integrity: sha512-GuziW3fSSmopcx4KRymQEJVbZUfqlCqcq7dvs6TYwKRZiegK/2buMxQTPs6MGlNv50wms1699qYO54R8XfRX4w==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -2667,10 +2494,6 @@ packages: call-me-maybe@1.0.2: resolution: {integrity: sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ==} - callsites@3.1.0: - resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} - engines: {node: '>=6'} - camelcase-keys@6.2.2: resolution: {integrity: sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==} engines: {node: '>=8'} @@ -2729,10 +2552,6 @@ packages: resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} engines: {node: '>=8'} - clean-regexp@1.0.0: - resolution: {integrity: sha512-GfisEZEJvzKrmGWkvfhgzcz/BllN1USeqD2V6tg14OAOgaCD2Z/PUEuxnAZ/nPvmaHRG7a8y77p1T/IRQ4D1Hw==} - engines: {node: '>=4'} - clean-stack@4.2.0: resolution: {integrity: sha512-LYv6XPxoyODi36Dp976riBtSY27VmFo+MKqEU9QCCWyTrdEPDog+RWA7xQWHi6Vbp61j5c4cdzzX1NidnwtUWg==} engines: {node: '>=12'} @@ -2983,9 +2802,6 @@ packages: resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} engines: {node: '>=6'} - deep-is@0.1.4: - resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} - deepmerge@4.3.1: resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} engines: {node: '>=0.10.0'} @@ -3052,10 +2868,6 @@ packages: dlv@1.1.3: resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} - doctrine@3.0.0: - resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} - engines: {node: '>=6.0.0'} - dom-accessibility-api@0.5.16: resolution: {integrity: sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==} @@ -3172,10 +2984,6 @@ packages: resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} engines: {node: '>=0.8.0'} - escape-string-regexp@4.0.0: - resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} - engines: {node: '>=10'} - escape-string-regexp@5.0.0: resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} engines: {node: '>=12'} @@ -3185,57 +2993,6 @@ packages: engines: {node: '>=6.0'} hasBin: true - eslint-compat-utils@0.5.1: - resolution: {integrity: sha512-3z3vFexKIEnjHE3zCMRo6fn/e44U7T1khUjg+Hp0ZQMCigh28rALD0nPFBcGZuiLC5rLZa2ubQHDRln09JfU2Q==} - engines: {node: '>=12'} - peerDependencies: - eslint: '>=6.0.0' - - eslint-config-prettier@8.10.0: - resolution: {integrity: sha512-SM8AMJdeQqRYT9O9zguiruQZaN7+z+E4eAP9oiLNGKMtomwaB1E9dcgUD6ZAn/eQAb52USbvezbiljfZUhbJcg==} - hasBin: true - peerDependencies: - eslint: '>=7.0.0' - - eslint-plugin-jsonc@2.16.0: - resolution: {integrity: sha512-Af/ZL5mgfb8FFNleH6KlO4/VdmDuTqmM+SPnWcdoWywTetv7kq+vQe99UyQb9XO3b0OWLVuTH7H0d/PXYCMdSg==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: '>=6.0.0' - - eslint-plugin-prettier@5.2.1: - resolution: {integrity: sha512-gH3iR3g4JfF+yYPaJYkN7jEl9QbweL/YfkoRlNnuIEHEz1vHVlCmWOS+eGGiRuzHQXdJFCOTxRgvju9b8VUmrw==} - engines: {node: ^14.18.0 || >=16.0.0} - peerDependencies: - '@types/eslint': '>=8.0.0' - eslint: '>=8.0.0' - eslint-config-prettier: '*' - prettier: '>=3.0.0' - peerDependenciesMeta: - '@types/eslint': - optional: true - eslint-config-prettier: - optional: true - - eslint-plugin-unicorn@47.0.0: - resolution: {integrity: sha512-ivB3bKk7fDIeWOUmmMm9o3Ax9zbMz1Bsza/R2qm46ufw4T6VBFBaJIR1uN3pCKSmSXm8/9Nri8V+iUut1NhQGA==} - engines: {node: '>=16'} - peerDependencies: - eslint: '>=8.38.0' - - eslint-scope@7.2.2: - resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - - eslint-visitor-keys@3.4.3: - resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - - eslint@8.57.0: - resolution: {integrity: sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - hasBin: true - esm-env@1.0.0: resolution: {integrity: sha512-Cf6VksWPsTuW01vU9Mk/3vRue91Zevka5SjyNf3nEpokFRuqt/KjUQoGAwq9qMmhpLTHmXzSIrFRw8zxWzmFBA==} @@ -3243,23 +3000,11 @@ packages: resolution: {integrity: sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==} engines: {node: '>=6'} - espree@9.6.1: - resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - esprima@4.0.1: resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} engines: {node: '>=4'} hasBin: true - esquery@1.6.0: - resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} - engines: {node: '>=0.10'} - - esrecurse@4.3.0: - resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} - engines: {node: '>=4.0'} - estraverse@5.3.0: resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} engines: {node: '>=4.0'} @@ -3307,19 +3052,10 @@ packages: fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} - fast-diff@1.3.0: - resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==} - fast-glob@3.3.2: resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} engines: {node: '>=8.6.0'} - fast-json-stable-stringify@2.1.0: - resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} - - fast-levenshtein@2.0.6: - resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} - fast-redact@3.5.0: resolution: {integrity: sha512-dwsoQlS7h9hMeYUq1W++23NDcBLV4KqONnITDV9DjfS3q1SgDGVrBdvvTLUotWtPSD7asWDV9/CmsZPy8Hf70A==} engines: {node: '>=6'} @@ -3334,10 +3070,6 @@ packages: fastq@1.17.1: resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} - file-entry-cache@6.0.1: - resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} - engines: {node: ^10.12.0 || >=12.0.0} - file-type@19.4.0: resolution: {integrity: sha512-7N7Pu0UzVYV8YP6WXhN+kcvtp/P00eWKVo76nMAK+RasRO/ICzuJzjoG+aSLqbY6khDAFQuqsyImGaSdkm49Iw==} engines: {node: '>=18'} @@ -3365,13 +3097,6 @@ packages: find-yarn-workspace-root2@1.2.16: resolution: {integrity: sha512-hr6hb1w8ePMpPVUK39S4RlwJzi+xPLuVuG8XlwXU3KD5Yn3qgBWVfy3AzNlDhWvE1EORCE65/Qm26rFQt3VLVA==} - flat-cache@3.2.0: - resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} - engines: {node: ^10.12.0 || >=12.0.0} - - flatted@3.3.1: - resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} - flattie@1.1.1: resolution: {integrity: sha512-9UbaD6XdAL97+k/n+N7JwX46K/M6Zc6KcFYskrYL8wbBV/Uyk0CTAMY0VT+qiK5PM7AIc9aTWYtq65U7T+aCNQ==} engines: {node: '>=8'} @@ -3517,10 +3242,6 @@ packages: resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} engines: {node: '>=4'} - globals@13.24.0: - resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} - engines: {node: '>=8'} - globalthis@1.0.4: resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} engines: {node: '>= 0.4'} @@ -3552,9 +3273,6 @@ packages: grapheme-splitter@1.0.4: resolution: {integrity: sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==} - graphemer@1.4.0: - resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} - graphql@16.8.2: resolution: {integrity: sha512-cvVIBILwuoSyD54U4cF/UXDh5yAobhNV/tPygI4lZhgOIJQE/WLWC4waBRb4I6bDVYb3OVx3lfHbaQOEoUD5sg==} engines: {node: ^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0} @@ -3633,6 +3351,9 @@ packages: resolution: {integrity: sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==} engines: {node: '>=12'} + html-escaper@2.0.2: + resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} + http-errors@2.0.0: resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} engines: {node: '>= 0.8'} @@ -3679,17 +3400,9 @@ packages: resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==} engines: {node: '>= 4'} - import-fresh@3.3.0: - resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} - engines: {node: '>=6'} - import-meta-resolve@4.1.0: resolution: {integrity: sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw==} - imurmurhash@0.1.4: - resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} - engines: {node: '>=0.8.19'} - indent-string@4.0.0: resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} engines: {node: '>=8'} @@ -3743,10 +3456,6 @@ packages: resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} engines: {node: '>= 0.4'} - is-builtin-module@3.2.1: - resolution: {integrity: sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==} - engines: {node: '>=6'} - is-callable@1.2.7: resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} engines: {node: '>= 0.4'} @@ -3801,10 +3510,6 @@ packages: resolution: {integrity: sha512-kyiNFFLU0Ampr6SDZitD/DwUo4Zs1nSdnygUBqsu3LooL00Qvb5j+UnvApUn/TTj1J3OuE6BTdQ5rudKmU2ZaA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - is-path-inside@3.0.3: - resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} - engines: {node: '>=8'} - is-path-inside@4.0.0: resolution: {integrity: sha512-lJJV/5dYS+RcL8uQdBDW9c9uWFLLBNRyFhnAKXw5tVqLlKZ4RMGZKv+YQ/IA3OhD+RpbJa1LLFM1FQPGyIXvOA==} engines: {node: '>=12'} @@ -3868,6 +3573,22 @@ packages: isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + istanbul-lib-coverage@3.2.2: + resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} + engines: {node: '>=8'} + + istanbul-lib-report@3.0.1: + resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} + engines: {node: '>=10'} + + istanbul-lib-source-maps@5.0.6: + resolution: {integrity: sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==} + engines: {node: '>=10'} + + istanbul-reports@3.1.7: + resolution: {integrity: sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==} + engines: {node: '>=8'} + jackspeak@3.4.3: resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} @@ -3899,23 +3620,11 @@ packages: canvas: optional: true - jsesc@0.5.0: - resolution: {integrity: sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==} - hasBin: true - jsesc@2.5.2: resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} engines: {node: '>=4'} hasBin: true - jsesc@3.0.2: - resolution: {integrity: sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==} - engines: {node: '>=6'} - hasBin: true - - json-buffer@3.0.1: - resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} - json-parse-even-better-errors@2.3.1: resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} @@ -3924,24 +3633,14 @@ packages: engines: {node: '>=10'} deprecated: Please switch to @apidevtools/json-schema-ref-parser - json-schema-traverse@0.4.1: - resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} - json-schema-traverse@1.0.0: resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} - json-stable-stringify-without-jsonify@1.0.1: - resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} - json5@2.2.3: resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} engines: {node: '>=6'} hasBin: true - jsonc-eslint-parser@2.4.0: - resolution: {integrity: sha512-WYDyuc/uFcGp6YtM2H0uKmUwieOuzeE/5YocFJLnLfclZ4inf3mRn8ZVy1s7Hxji7Jxm6Ss8gqpexD/GlKoGgg==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - jsonfile@4.0.0: resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} @@ -3955,9 +3654,6 @@ packages: resolution: {integrity: sha512-Qush0uP+G8ZScpGMZvHUiRfI0YBWuB3gVBYlI0v0vvOJt5FLicco+IkP0a50LqTTQhmts/m6tP5SWE+USyIvcQ==} engines: {node: '>=12.20'} - keyv@4.5.4: - resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} - kind-of@6.0.3: resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} engines: {node: '>=0.10.0'} @@ -3998,10 +3694,6 @@ packages: tedious: optional: true - levn@0.4.1: - resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} - engines: {node: '>= 0.8.0'} - lilconfig@3.1.2: resolution: {integrity: sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==} engines: {node: '>=14'} @@ -4031,9 +3723,6 @@ packages: lodash.isequal@4.5.0: resolution: {integrity: sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==} - lodash.merge@4.6.2: - resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} - lodash.sortby@4.7.0: resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==} @@ -4081,6 +3770,13 @@ packages: magic-string@0.30.11: resolution: {integrity: sha512-+Wri9p0QHMy+545hKww7YAu5NyzF8iomPL/RQazugQ9+Ez4Ic3mERMd8ZTX5rfK944j+560ZJi8iAwgak1Ac7A==} + magicast@0.3.4: + resolution: {integrity: sha512-TyDF/Pn36bBji9rWKHlZe+PZb6Mx5V8IHCSxk7X4aljM4e/vyDvZZYwHewdVaqiA0nb3ghfHU/6AUpDxWoER2Q==} + + make-dir@4.0.0: + resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} + engines: {node: '>=10'} + make-error@1.3.6: resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} @@ -4173,10 +3869,6 @@ packages: resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} engines: {node: '>=10'} - minimatch@9.0.3: - resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} - engines: {node: '>=16 || 14 >=14.17'} - minimatch@9.0.5: resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} engines: {node: '>=16 || 14 >=14.17'} @@ -4251,9 +3943,6 @@ packages: engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true - natural-compare@1.4.0: - resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} - negotiator@0.6.3: resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} engines: {node: '>= 0.6'} @@ -4370,10 +4059,6 @@ packages: resolution: {integrity: sha512-9YkzVKIx9RVIET0lFjJOuf15VjI9AUsoNByBk5WYM66xVlAKDNy8anj08Ci3zZA+HgTwdDamYz5FCVYt2VoHkA==} engines: {node: '>= 12.0.0', npm: '>= 7.0.0'} - optionator@0.9.4: - resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} - engines: {node: '>= 0.8.0'} - os-tmpdir@1.0.2: resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} engines: {node: '>=0.10.0'} @@ -4435,10 +4120,6 @@ packages: package-json-from-dist@1.0.0: resolution: {integrity: sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==} - parent-module@1.0.1: - resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} - engines: {node: '>=6'} - parse-imports@1.2.0: resolution: {integrity: sha512-K5aG9cextqjAlyevwuSMjWPbBr+X8xGgfHS4VopbKC1u3jLndRGl2CoUHMTvuD6LIg4di5TzH/Pw9+XZyTjI/w==} engines: {node: '>= 12.17'} @@ -4599,14 +4280,6 @@ packages: resolution: {integrity: sha512-MkXsENfftWSRpzCzImcp4FRsCc3y1opwB73CfCNWyzMqArju2CrlMHlqB7VexKiPEOjGMbttv1r9fSCn5S610w==} engines: {node: '>=10'} - prelude-ls@1.2.1: - resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} - engines: {node: '>= 0.8.0'} - - prettier-linter-helpers@1.0.0: - resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==} - engines: {node: '>=6.0.0'} - prettier@2.8.8: resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} engines: {node: '>=10.13.0'} @@ -4767,18 +4440,10 @@ packages: regenerator-runtime@0.14.1: resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} - regexp-tree@0.1.27: - resolution: {integrity: sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA==} - hasBin: true - regexp.prototype.flags@1.5.2: resolution: {integrity: sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==} engines: {node: '>= 0.4'} - regjsparser@0.10.0: - resolution: {integrity: sha512-qx+xQGZVsy55CH0a1hiVwHmqjLryfh7wQyF5HO07XJ9f7dQMY/gPQHhlyDkIzJKC+x2fUCpCcUODUUUFrm7SHA==} - hasBin: true - require-directory@2.1.1: resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} engines: {node: '>=0.10.0'} @@ -4793,10 +4458,6 @@ packages: requires-port@1.0.0: resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} - resolve-from@4.0.0: - resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} - engines: {node: '>=4'} - resolve-from@5.0.0: resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} engines: {node: '>=8'} @@ -4857,9 +4518,6 @@ packages: resolution: {integrity: sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==} engines: {node: '>= 0.4'} - safe-regex@2.1.1: - resolution: {integrity: sha512-rx+x8AMzKb5Q5lQ95Zoi6ZbJqwCLkqi3XuJXp5P3rT8OEc6sZCJG5AE5dU3lsgRr/F4Bs31jSlVN+j5KrsGu9A==} - safe-stable-stringify@2.4.3: resolution: {integrity: sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==} engines: {node: '>=10'} @@ -5232,14 +4890,6 @@ packages: symbol-tree@3.2.4: resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} - synckit@0.6.2: - resolution: {integrity: sha512-Vhf+bUa//YSTYKseDiiEuQmhGCoIF3CVBhunm3r/DQnYiGT4JssmnKQc44BIyOZRK2pKjXXAgbhfmbeoC9CJpA==} - engines: {node: '>=12.20'} - - synckit@0.9.1: - resolution: {integrity: sha512-7gr8p9TQP6RAHusBOSLs46F4564ZrjV8xFmw5zCmgmhGUcw2hxsShhJ6CEiHQMgPDwAQ1fWHPM0ypc4RMAig4A==} - engines: {node: ^14.18.0 || >=16.0.0} - tabbable@6.2.0: resolution: {integrity: sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==} @@ -5259,8 +4909,9 @@ packages: resolution: {integrity: sha512-rcdty1xZ2/BkWa4ANjWRp4JGpda2quksXIHgn5TMjNBPZfwzJIgR68DKfSYiTL+CZWowDX/sbOo5ME/FRURvYQ==} engines: {node: '>=18'} - text-table@0.2.0: - resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + test-exclude@7.0.1: + resolution: {integrity: sha512-pFYqmTw68LXVjeWJMST4+borgQP2AyMNbg1BpZh9LbyhUeNkeaPF9gzfPGUAnSMV3qPYdWUwDIjjCLiSDOl7vg==} + engines: {node: '>=18'} thenify-all@1.6.0: resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} @@ -5351,12 +5002,6 @@ packages: truncatise@0.0.8: resolution: {integrity: sha512-cXzueh9pzBCsLzhToB4X4gZCb3KYkrsAcBAX97JnazE74HOl3cpBJYEV7nabHeG/6/WXCU5Yujlde/WPBUwnsg==} - ts-api-utils@1.3.0: - resolution: {integrity: sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==} - engines: {node: '>=16'} - peerDependencies: - typescript: '>=4.2.0' - ts-interface-checker@0.1.13: resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} @@ -5404,10 +5049,6 @@ packages: engines: {node: '>=8.0.0'} hasBin: true - type-check@0.4.0: - resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} - engines: {node: '>= 0.8.0'} - type-detect@4.1.0: resolution: {integrity: sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==} engines: {node: '>=4'} @@ -5416,10 +5057,6 @@ packages: resolution: {integrity: sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==} engines: {node: '>=10'} - type-fest@0.20.2: - resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} - engines: {node: '>=10'} - type-fest@0.21.3: resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} engines: {node: '>=10'} @@ -5723,10 +5360,6 @@ packages: engines: {node: '>=8'} hasBin: true - word-wrap@1.2.5: - resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} - engines: {node: '>=0.10.0'} - wordwrap@1.0.0: resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} @@ -5946,31 +5579,6 @@ snapshots: dotenv: 16.4.5 split-lines: 3.0.0 - '@adonisjs/eslint-config@1.3.0(eslint@8.57.0)(prettier@3.3.2)(typescript@5.4.5)': - dependencies: - '@adonisjs/eslint-plugin': 1.3.0(eslint@8.57.0)(typescript@5.4.5) - '@typescript-eslint/eslint-plugin': 6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0)(typescript@5.4.5) - '@typescript-eslint/parser': 6.21.0(eslint@8.57.0)(typescript@5.4.5) - eslint: 8.57.0 - eslint-config-prettier: 8.10.0(eslint@8.57.0) - eslint-plugin-jsonc: 2.16.0(eslint@8.57.0) - eslint-plugin-prettier: 5.2.1(eslint-config-prettier@8.10.0(eslint@8.57.0))(eslint@8.57.0)(prettier@3.3.2) - eslint-plugin-unicorn: 47.0.0(eslint@8.57.0) - jsonc-eslint-parser: 2.4.0 - prettier: 3.3.2 - transitivePeerDependencies: - - '@types/eslint' - - supports-color - - typescript - - '@adonisjs/eslint-plugin@1.3.0(eslint@8.57.0)(typescript@5.4.5)': - dependencies: - '@typescript-eslint/utils': 6.21.0(eslint@8.57.0)(typescript@5.4.5) - transitivePeerDependencies: - - eslint - - supports-color - - typescript - '@adonisjs/events@9.0.2(@adonisjs/application@8.3.1(@adonisjs/config@5.0.2)(@adonisjs/fold@10.1.2))(@adonisjs/fold@10.1.2)': dependencies: '@adonisjs/application': 8.3.1(@adonisjs/config@5.0.2)(@adonisjs/fold@10.1.2) @@ -6065,8 +5673,6 @@ snapshots: optionalDependencies: '@adonisjs/assembler': 7.7.0(typescript@5.4.5) - '@adonisjs/prettier-config@1.3.0': {} - '@adonisjs/repl@4.0.1': dependencies: '@poppinss/colors': 4.1.3 @@ -6221,7 +5827,7 @@ snapshots: '@babel/traverse': 7.24.7 '@babel/types': 7.24.7 convert-source-map: 2.0.0 - debug: 4.3.5(supports-color@9.4.0) + debug: 4.3.6(supports-color@9.4.0) gensync: 1.0.0-beta.2 json5: 2.2.3 semver: 6.3.1 @@ -6230,7 +5836,7 @@ snapshots: '@babel/generator@7.24.7': dependencies: - '@babel/types': 7.24.7 + '@babel/types': 7.25.2 '@jridgewell/gen-mapping': 0.3.5 '@jridgewell/trace-mapping': 0.3.25 jsesc: 2.5.2 @@ -6245,21 +5851,21 @@ snapshots: '@babel/helper-environment-visitor@7.24.7': dependencies: - '@babel/types': 7.24.7 + '@babel/types': 7.25.2 '@babel/helper-function-name@7.24.7': dependencies: '@babel/template': 7.24.7 - '@babel/types': 7.24.7 + '@babel/types': 7.25.2 '@babel/helper-hoist-variables@7.24.7': dependencies: - '@babel/types': 7.24.7 + '@babel/types': 7.25.2 '@babel/helper-module-imports@7.24.7': dependencies: '@babel/traverse': 7.24.7 - '@babel/types': 7.24.7 + '@babel/types': 7.25.2 transitivePeerDependencies: - supports-color @@ -6279,20 +5885,18 @@ snapshots: '@babel/helper-simple-access@7.24.7': dependencies: '@babel/traverse': 7.24.7 - '@babel/types': 7.24.7 + '@babel/types': 7.25.2 transitivePeerDependencies: - supports-color '@babel/helper-split-export-declaration@7.24.7': dependencies: - '@babel/types': 7.24.7 + '@babel/types': 7.25.2 '@babel/helper-string-parser@7.24.7': {} '@babel/helper-string-parser@7.24.8': {} - '@babel/helper-validator-identifier@7.24.5': {} - '@babel/helper-validator-identifier@7.24.7': {} '@babel/helper-validator-option@7.24.7': {} @@ -6300,11 +5904,11 @@ snapshots: '@babel/helpers@7.24.7': dependencies: '@babel/template': 7.24.7 - '@babel/types': 7.24.7 + '@babel/types': 7.25.2 '@babel/highlight@7.24.5': dependencies: - '@babel/helper-validator-identifier': 7.24.5 + '@babel/helper-validator-identifier': 7.24.7 chalk: 2.4.2 js-tokens: 4.0.0 picocolors: 1.0.1 @@ -6318,7 +5922,7 @@ snapshots: '@babel/parser@7.24.7': dependencies: - '@babel/types': 7.24.7 + '@babel/types': 7.25.2 '@babel/parser@7.25.3': dependencies: @@ -6345,8 +5949,8 @@ snapshots: '@babel/template@7.24.7': dependencies: '@babel/code-frame': 7.24.7 - '@babel/parser': 7.24.7 - '@babel/types': 7.24.7 + '@babel/parser': 7.25.3 + '@babel/types': 7.25.2 '@babel/traverse@7.24.7': dependencies: @@ -6356,8 +5960,8 @@ snapshots: '@babel/helper-function-name': 7.24.7 '@babel/helper-hoist-variables': 7.24.7 '@babel/helper-split-export-declaration': 7.24.7 - '@babel/parser': 7.24.7 - '@babel/types': 7.24.7 + '@babel/parser': 7.25.3 + '@babel/types': 7.25.2 debug: 4.3.6(supports-color@9.4.0) globals: 11.12.0 transitivePeerDependencies: @@ -6375,6 +5979,8 @@ snapshots: '@babel/helper-validator-identifier': 7.24.7 to-fast-properties: 2.0.0 + '@bcoe/v8-coverage@0.2.3': {} + '@biomejs/biome@1.8.1': optionalDependencies: '@biomejs/cli-darwin-arm64': 1.8.1 @@ -6834,45 +6440,10 @@ snapshots: '@esbuild/win32-x64@0.23.0': optional: true - '@eslint-community/eslint-utils@4.4.0(eslint@8.57.0)': - dependencies: - eslint: 8.57.0 - eslint-visitor-keys: 3.4.3 - - '@eslint-community/regexpp@4.11.0': {} - - '@eslint/eslintrc@2.1.4': - dependencies: - ajv: 6.12.6 - debug: 4.3.6(supports-color@9.4.0) - espree: 9.6.1 - globals: 13.24.0 - ignore: 5.3.1 - import-fresh: 3.3.0 - js-yaml: 4.1.0 - minimatch: 3.1.2 - strip-json-comments: 3.1.1 - transitivePeerDependencies: - - supports-color - - '@eslint/js@8.57.0': {} - '@faker-js/faker@8.4.1': {} '@fastify/deepmerge@2.0.0': {} - '@humanwhocodes/config-array@0.11.14': - dependencies: - '@humanwhocodes/object-schema': 2.0.3 - debug: 4.3.6(supports-color@9.4.0) - minimatch: 3.1.2 - transitivePeerDependencies: - - supports-color - - '@humanwhocodes/module-importer@1.0.1': {} - - '@humanwhocodes/object-schema@2.0.3': {} - '@inquirer/confirm@3.1.10': dependencies: '@inquirer/core': 8.2.3 @@ -6907,6 +6478,8 @@ snapshots: wrap-ansi: 8.1.0 wrap-ansi-cjs: wrap-ansi@7.0.0 + '@istanbuljs/schema@0.1.3': {} + '@japa/api-client@2.0.3': dependencies: '@poppinss/hooks': 7.2.3 @@ -7047,8 +6620,6 @@ snapshots: '@pkgjs/parseargs@0.11.0': optional: true - '@pkgr/core@0.1.1': {} - '@playwright/test@1.44.1': dependencies: playwright: 1.44.1 @@ -7437,16 +7008,16 @@ snapshots: '@types/babel__generator@7.6.8': dependencies: - '@babel/types': 7.24.7 + '@babel/types': 7.25.2 '@types/babel__template@7.4.4': dependencies: - '@babel/parser': 7.24.7 - '@babel/types': 7.24.7 + '@babel/parser': 7.25.3 + '@babel/types': 7.25.2 '@types/babel__traverse@7.20.6': dependencies: - '@babel/types': 7.24.7 + '@babel/types': 7.25.2 '@types/bytes@3.1.4': {} @@ -7541,94 +7112,6 @@ snapshots: '@types/wrap-ansi@3.0.0': {} - '@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0)(typescript@5.4.5)': - dependencies: - '@eslint-community/regexpp': 4.11.0 - '@typescript-eslint/parser': 6.21.0(eslint@8.57.0)(typescript@5.4.5) - '@typescript-eslint/scope-manager': 6.21.0 - '@typescript-eslint/type-utils': 6.21.0(eslint@8.57.0)(typescript@5.4.5) - '@typescript-eslint/utils': 6.21.0(eslint@8.57.0)(typescript@5.4.5) - '@typescript-eslint/visitor-keys': 6.21.0 - debug: 4.3.6(supports-color@9.4.0) - eslint: 8.57.0 - graphemer: 1.4.0 - ignore: 5.3.1 - natural-compare: 1.4.0 - semver: 7.6.3 - ts-api-utils: 1.3.0(typescript@5.4.5) - optionalDependencies: - typescript: 5.4.5 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.4.5)': - dependencies: - '@typescript-eslint/scope-manager': 6.21.0 - '@typescript-eslint/types': 6.21.0 - '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.4.5) - '@typescript-eslint/visitor-keys': 6.21.0 - debug: 4.3.6(supports-color@9.4.0) - eslint: 8.57.0 - optionalDependencies: - typescript: 5.4.5 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/scope-manager@6.21.0': - dependencies: - '@typescript-eslint/types': 6.21.0 - '@typescript-eslint/visitor-keys': 6.21.0 - - '@typescript-eslint/type-utils@6.21.0(eslint@8.57.0)(typescript@5.4.5)': - dependencies: - '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.4.5) - '@typescript-eslint/utils': 6.21.0(eslint@8.57.0)(typescript@5.4.5) - debug: 4.3.6(supports-color@9.4.0) - eslint: 8.57.0 - ts-api-utils: 1.3.0(typescript@5.4.5) - optionalDependencies: - typescript: 5.4.5 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/types@6.21.0': {} - - '@typescript-eslint/typescript-estree@6.21.0(typescript@5.4.5)': - dependencies: - '@typescript-eslint/types': 6.21.0 - '@typescript-eslint/visitor-keys': 6.21.0 - debug: 4.3.6(supports-color@9.4.0) - globby: 11.1.0 - is-glob: 4.0.3 - minimatch: 9.0.3 - semver: 7.6.3 - ts-api-utils: 1.3.0(typescript@5.4.5) - optionalDependencies: - typescript: 5.4.5 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/utils@6.21.0(eslint@8.57.0)(typescript@5.4.5)': - dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) - '@types/json-schema': 7.0.15 - '@types/semver': 7.5.8 - '@typescript-eslint/scope-manager': 6.21.0 - '@typescript-eslint/types': 6.21.0 - '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.4.5) - eslint: 8.57.0 - semver: 7.6.3 - transitivePeerDependencies: - - supports-color - - typescript - - '@typescript-eslint/visitor-keys@6.21.0': - dependencies: - '@typescript-eslint/types': 6.21.0 - eslint-visitor-keys: 3.4.3 - - '@ungap/structured-clone@1.2.0': {} - '@vinejs/compiler@2.5.0': {} '@vinejs/vine@2.1.0': @@ -7670,6 +7153,24 @@ snapshots: vite: 5.3.5(@types/node@22.1.0) vue: 3.4.35(typescript@5.5.4) + '@vitest/coverage-v8@2.0.5(vitest@2.0.5(@types/node@22.1.0)(jsdom@20.0.3))': + dependencies: + '@ampproject/remapping': 2.3.0 + '@bcoe/v8-coverage': 0.2.3 + debug: 4.3.6(supports-color@9.4.0) + istanbul-lib-coverage: 3.2.2 + istanbul-lib-report: 3.0.1 + istanbul-lib-source-maps: 5.0.6 + istanbul-reports: 3.1.7 + magic-string: 0.30.11 + magicast: 0.3.4 + std-env: 3.7.0 + test-exclude: 7.0.1 + tinyrainbow: 1.2.0 + vitest: 2.0.5(@types/node@22.1.0)(jsdom@20.0.3) + transitivePeerDependencies: + - supports-color + '@vitest/expect@2.0.5': dependencies: '@vitest/spy': 2.0.5 @@ -7689,7 +7190,7 @@ snapshots: '@vitest/snapshot@2.0.5': dependencies: '@vitest/pretty-format': 2.0.5 - magic-string: 0.30.10 + magic-string: 0.30.11 pathe: 1.1.2 '@vitest/spy@2.0.5': @@ -7865,10 +7366,6 @@ snapshots: acorn-walk: 8.3.3 optional: true - acorn-jsx@5.3.2(acorn@8.12.1): - dependencies: - acorn: 8.12.1 - acorn-walk@8.3.3: dependencies: acorn: 8.12.1 @@ -7893,13 +7390,6 @@ snapshots: clean-stack: 4.2.0 indent-string: 5.0.0 - ajv@6.12.6: - dependencies: - fast-deep-equal: 3.1.3 - fast-json-stable-stringify: 2.1.0 - json-schema-traverse: 0.4.1 - uri-js: 4.4.1 - algoliasearch@4.23.3: dependencies: '@algolia/cache-browser-local-storage': 4.23.3 @@ -8065,8 +7555,6 @@ snapshots: base64-js: 1.5.1 ieee754: 1.2.1 - builtin-modules@3.3.0: {} - bundle-require@5.0.0(esbuild@0.23.0): dependencies: esbuild: 0.23.0 @@ -8090,8 +7578,6 @@ snapshots: call-me-maybe@1.0.2: {} - callsites@3.1.0: {} - camelcase-keys@6.2.2: dependencies: camelcase: 5.3.1 @@ -8154,10 +7640,6 @@ snapshots: ci-info@3.9.0: {} - clean-regexp@1.0.0: - dependencies: - escape-string-regexp: 1.0.5 - clean-stack@4.2.0: dependencies: escape-string-regexp: 5.0.0 @@ -8383,8 +7865,6 @@ snapshots: deep-eql@5.0.2: {} - deep-is@0.1.4: {} - deepmerge@4.3.1: {} defaults@1.0.4: @@ -8446,10 +7926,6 @@ snapshots: dlv@1.1.3: {} - doctrine@3.0.0: - dependencies: - esutils: 2.0.3 - dom-accessibility-api@0.5.16: {} domexception@4.0.0: @@ -8656,8 +8132,6 @@ snapshots: escape-string-regexp@1.0.5: {} - escape-string-regexp@4.0.0: {} - escape-string-regexp@5.0.0: {} escodegen@2.1.0: @@ -8669,126 +8143,14 @@ snapshots: source-map: 0.6.1 optional: true - eslint-compat-utils@0.5.1(eslint@8.57.0): - dependencies: - eslint: 8.57.0 - semver: 7.6.3 - - eslint-config-prettier@8.10.0(eslint@8.57.0): - dependencies: - eslint: 8.57.0 - - eslint-plugin-jsonc@2.16.0(eslint@8.57.0): - dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) - eslint: 8.57.0 - eslint-compat-utils: 0.5.1(eslint@8.57.0) - espree: 9.6.1 - graphemer: 1.4.0 - jsonc-eslint-parser: 2.4.0 - natural-compare: 1.4.0 - synckit: 0.6.2 - - eslint-plugin-prettier@5.2.1(eslint-config-prettier@8.10.0(eslint@8.57.0))(eslint@8.57.0)(prettier@3.3.2): - dependencies: - eslint: 8.57.0 - prettier: 3.3.2 - prettier-linter-helpers: 1.0.0 - synckit: 0.9.1 - optionalDependencies: - eslint-config-prettier: 8.10.0(eslint@8.57.0) - - eslint-plugin-unicorn@47.0.0(eslint@8.57.0): - dependencies: - '@babel/helper-validator-identifier': 7.24.7 - '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) - ci-info: 3.9.0 - clean-regexp: 1.0.0 - eslint: 8.57.0 - esquery: 1.6.0 - indent-string: 4.0.0 - is-builtin-module: 3.2.1 - jsesc: 3.0.2 - lodash: 4.17.21 - pluralize: 8.0.0 - read-pkg-up: 7.0.1 - regexp-tree: 0.1.27 - regjsparser: 0.10.0 - safe-regex: 2.1.1 - semver: 7.6.3 - strip-indent: 3.0.0 - - eslint-scope@7.2.2: - dependencies: - esrecurse: 4.3.0 - estraverse: 5.3.0 - - eslint-visitor-keys@3.4.3: {} - - eslint@8.57.0: - dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) - '@eslint-community/regexpp': 4.11.0 - '@eslint/eslintrc': 2.1.4 - '@eslint/js': 8.57.0 - '@humanwhocodes/config-array': 0.11.14 - '@humanwhocodes/module-importer': 1.0.1 - '@nodelib/fs.walk': 1.2.8 - '@ungap/structured-clone': 1.2.0 - ajv: 6.12.6 - chalk: 4.1.2 - cross-spawn: 7.0.3 - debug: 4.3.6(supports-color@9.4.0) - doctrine: 3.0.0 - escape-string-regexp: 4.0.0 - eslint-scope: 7.2.2 - eslint-visitor-keys: 3.4.3 - espree: 9.6.1 - esquery: 1.6.0 - esutils: 2.0.3 - fast-deep-equal: 3.1.3 - file-entry-cache: 6.0.1 - find-up: 5.0.0 - glob-parent: 6.0.2 - globals: 13.24.0 - graphemer: 1.4.0 - ignore: 5.3.1 - imurmurhash: 0.1.4 - is-glob: 4.0.3 - is-path-inside: 3.0.3 - js-yaml: 4.1.0 - json-stable-stringify-without-jsonify: 1.0.1 - levn: 0.4.1 - lodash.merge: 4.6.2 - minimatch: 3.1.2 - natural-compare: 1.4.0 - optionator: 0.9.4 - strip-ansi: 6.0.1 - text-table: 0.2.0 - transitivePeerDependencies: - - supports-color - esm-env@1.0.0: {} esm@3.2.25: {} - espree@9.6.1: - dependencies: - acorn: 8.12.1 - acorn-jsx: 5.3.2(acorn@8.12.1) - eslint-visitor-keys: 3.4.3 - esprima@4.0.1: {} - esquery@1.6.0: - dependencies: - estraverse: 5.3.0 - - esrecurse@4.3.0: - dependencies: - estraverse: 5.3.0 - - estraverse@5.3.0: {} + estraverse@5.3.0: + optional: true estree-walker@2.0.2: {} @@ -8796,7 +8158,8 @@ snapshots: dependencies: '@types/estree': 1.0.5 - esutils@2.0.3: {} + esutils@2.0.3: + optional: true etag@1.8.1: {} @@ -8840,8 +8203,6 @@ snapshots: fast-deep-equal@3.1.3: {} - fast-diff@1.3.0: {} - fast-glob@3.3.2: dependencies: '@nodelib/fs.stat': 2.0.5 @@ -8850,10 +8211,6 @@ snapshots: merge2: 1.4.1 micromatch: 4.0.5 - fast-json-stable-stringify@2.1.0: {} - - fast-levenshtein@2.0.6: {} - fast-redact@3.5.0: {} fast-safe-stringify@2.1.1: {} @@ -8864,10 +8221,6 @@ snapshots: dependencies: reusify: 1.0.4 - file-entry-cache@6.0.1: - dependencies: - flat-cache: 3.2.0 - file-type@19.4.0: dependencies: get-stream: 9.0.1 @@ -8900,14 +8253,6 @@ snapshots: micromatch: 4.0.7 pkg-dir: 4.2.0 - flat-cache@3.2.0: - dependencies: - flatted: 3.3.1 - keyv: 4.5.4 - rimraf: 3.0.2 - - flatted@3.3.1: {} - flattie@1.1.1: {} focus-trap@7.5.4: @@ -9056,10 +8401,6 @@ snapshots: globals@11.12.0: {} - globals@13.24.0: - dependencies: - type-fest: 0.20.2 - globalthis@1.0.4: dependencies: define-properties: 1.2.1 @@ -9103,8 +8444,6 @@ snapshots: grapheme-splitter@1.0.4: {} - graphemer@1.4.0: {} - graphql@16.8.2: {} handlebars@4.7.8: @@ -9172,6 +8511,8 @@ snapshots: whatwg-encoding: 2.0.0 optional: true + html-escaper@2.0.2: {} + http-errors@2.0.0: dependencies: depd: 2.0.0 @@ -9200,7 +8541,7 @@ snapshots: https-proxy-agent@7.0.4(supports-color@9.4.0): dependencies: agent-base: 7.1.1(supports-color@9.4.0) - debug: 4.3.5(supports-color@9.4.0) + debug: 4.3.6(supports-color@9.4.0) transitivePeerDependencies: - supports-color @@ -9225,15 +8566,8 @@ snapshots: ignore@5.3.1: {} - import-fresh@3.3.0: - dependencies: - parent-module: 1.0.1 - resolve-from: 4.0.0 - import-meta-resolve@4.1.0: {} - imurmurhash@0.1.4: {} - indent-string@4.0.0: {} indent-string@5.0.0: {} @@ -9279,10 +8613,6 @@ snapshots: call-bind: 1.0.7 has-tostringtag: 1.0.2 - is-builtin-module@3.2.1: - dependencies: - builtin-modules: 3.3.0 - is-callable@1.2.7: {} is-core-module@2.13.1: @@ -9323,8 +8653,6 @@ snapshots: is-path-cwd@3.0.0: {} - is-path-inside@3.0.3: {} - is-path-inside@4.0.0: {} is-plain-obj@1.1.0: {} @@ -9377,6 +8705,27 @@ snapshots: isexe@2.0.0: {} + istanbul-lib-coverage@3.2.2: {} + + istanbul-lib-report@3.0.1: + dependencies: + istanbul-lib-coverage: 3.2.2 + make-dir: 4.0.0 + supports-color: 7.2.0 + + istanbul-lib-source-maps@5.0.6: + dependencies: + '@jridgewell/trace-mapping': 0.3.25 + debug: 4.3.6(supports-color@9.4.0) + istanbul-lib-coverage: 3.2.2 + transitivePeerDependencies: + - supports-color + + istanbul-reports@3.1.7: + dependencies: + html-escaper: 2.0.2 + istanbul-lib-report: 3.0.1 + jackspeak@3.4.3: dependencies: '@isaacs/cliui': 8.0.2 @@ -9432,35 +8781,18 @@ snapshots: - utf-8-validate optional: true - jsesc@0.5.0: {} - jsesc@2.5.2: {} - jsesc@3.0.2: {} - - json-buffer@3.0.1: {} - json-parse-even-better-errors@2.3.1: {} json-schema-ref-parser@9.0.9: dependencies: '@apidevtools/json-schema-ref-parser': 9.0.9 - json-schema-traverse@0.4.1: {} - json-schema-traverse@1.0.0: {} - json-stable-stringify-without-jsonify@1.0.1: {} - json5@2.2.3: {} - jsonc-eslint-parser@2.4.0: - dependencies: - acorn: 8.12.1 - eslint-visitor-keys: 3.4.3 - espree: 9.6.1 - semver: 7.6.3 - jsonfile@4.0.0: optionalDependencies: graceful-fs: 4.2.11 @@ -9475,10 +8807,6 @@ snapshots: junk@4.0.1: {} - keyv@4.5.4: - dependencies: - json-buffer: 3.0.1 - kind-of@6.0.3: {} kleur@4.1.5: {} @@ -9516,11 +8844,6 @@ snapshots: transitivePeerDependencies: - supports-color - levn@0.4.1: - dependencies: - prelude-ls: 1.2.1 - type-check: 0.4.0 - lilconfig@3.1.2: {} lines-and-columns@1.2.4: {} @@ -9546,8 +8869,6 @@ snapshots: lodash.isequal@4.5.0: {} - lodash.merge@4.6.2: {} - lodash.sortby@4.7.0: {} lodash.startcase@4.4.0: {} @@ -9597,6 +8918,16 @@ snapshots: dependencies: '@jridgewell/sourcemap-codec': 1.5.0 + magicast@0.3.4: + dependencies: + '@babel/parser': 7.25.3 + '@babel/types': 7.25.2 + source-map-js: 1.2.0 + + make-dir@4.0.0: + dependencies: + semver: 7.6.3 + make-error@1.3.6: {} map-obj@1.0.1: {} @@ -9684,10 +9015,6 @@ snapshots: dependencies: brace-expansion: 2.0.1 - minimatch@9.0.3: - dependencies: - brace-expansion: 2.0.1 - minimatch@9.0.5: dependencies: brace-expansion: 2.0.1 @@ -9778,8 +9105,6 @@ snapshots: nanoid@3.3.7: {} - natural-compare@1.4.0: {} - negotiator@0.6.3: {} neo-async@2.6.2: {} @@ -9898,15 +9223,6 @@ snapshots: openapi-typescript-fetch@2.0.0: {} - optionator@0.9.4: - dependencies: - deep-is: 0.1.4 - fast-levenshtein: 2.0.6 - levn: 0.4.1 - prelude-ls: 1.2.1 - type-check: 0.4.0 - word-wrap: 1.2.5 - os-tmpdir@1.0.2: {} outdent@0.5.0: {} @@ -9955,10 +9271,6 @@ snapshots: package-json-from-dist@1.0.0: {} - parent-module@1.0.1: - dependencies: - callsites: 3.1.0 - parse-imports@1.2.0: dependencies: es-module-lexer: 1.5.4 @@ -10112,12 +9424,6 @@ snapshots: path-exists: 4.0.0 which-pm: 2.0.0 - prelude-ls@1.2.1: {} - - prettier-linter-helpers@1.0.0: - dependencies: - fast-diff: 1.3.0 - prettier@2.8.8: {} prettier@3.3.2: {} @@ -10281,8 +9587,6 @@ snapshots: regenerator-runtime@0.14.1: {} - regexp-tree@0.1.27: {} - regexp.prototype.flags@1.5.2: dependencies: call-bind: 1.0.7 @@ -10290,10 +9594,6 @@ snapshots: es-errors: 1.3.0 set-function-name: 2.0.2 - regjsparser@0.10.0: - dependencies: - jsesc: 0.5.0 - require-directory@2.1.1: {} require-from-string@2.0.2: {} @@ -10303,8 +9603,6 @@ snapshots: requires-port@1.0.0: optional: true - resolve-from@4.0.0: {} - resolve-from@5.0.0: {} resolve@1.22.8: @@ -10399,10 +9697,6 @@ snapshots: es-errors: 1.3.0 is-regex: 1.1.4 - safe-regex@2.1.1: - dependencies: - regexp-tree: 0.1.27 - safe-stable-stringify@2.4.3: {} safer-buffer@2.1.2: {} @@ -10780,15 +10074,6 @@ snapshots: symbol-tree@3.2.4: optional: true - synckit@0.6.2: - dependencies: - tslib: 2.6.3 - - synckit@0.9.1: - dependencies: - '@pkgr/core': 0.1.1 - tslib: 2.6.3 - tabbable@6.2.0: {} tarn@3.0.2: {} @@ -10799,7 +10084,11 @@ snapshots: terminal-size@4.0.0: {} - text-table@0.2.0: {} + test-exclude@7.0.1: + dependencies: + '@istanbuljs/schema': 0.1.3 + glob: 10.4.5 + minimatch: 9.0.5 thenify-all@1.6.0: dependencies: @@ -10876,10 +10165,6 @@ snapshots: truncatise@0.0.8: {} - ts-api-utils@1.3.0(typescript@5.4.5): - dependencies: - typescript: 5.4.5 - ts-interface-checker@0.1.13: {} ts-morph@22.0.0: @@ -10947,16 +10232,10 @@ snapshots: wcwidth: 1.0.1 yargs: 17.7.2 - type-check@0.4.0: - dependencies: - prelude-ls: 1.2.1 - type-detect@4.1.0: {} type-fest@0.13.1: {} - type-fest@0.20.2: {} - type-fest@0.21.3: {} type-fest@0.6.0: {} @@ -11100,6 +10379,23 @@ snapshots: - supports-color - terser + vite-node@2.0.5(@types/node@22.1.0): + dependencies: + cac: 6.7.14 + debug: 4.3.5(supports-color@9.4.0) + pathe: 1.1.2 + tinyrainbow: 1.2.0 + vite: 5.3.5(@types/node@22.1.0) + transitivePeerDependencies: + - '@types/node' + - less + - lightningcss + - sass + - stylus + - sugarss + - supports-color + - terser + vite-node@2.0.5(@types/node@22.1.0)(supports-color@9.4.0): dependencies: cac: 6.7.14 @@ -11218,6 +10514,39 @@ snapshots: - supports-color - terser + vitest@2.0.5(@types/node@22.1.0)(jsdom@20.0.3): + dependencies: + '@ampproject/remapping': 2.3.0 + '@vitest/expect': 2.0.5 + '@vitest/pretty-format': 2.0.5 + '@vitest/runner': 2.0.5 + '@vitest/snapshot': 2.0.5 + '@vitest/spy': 2.0.5 + '@vitest/utils': 2.0.5 + chai: 5.1.1 + debug: 4.3.5(supports-color@9.4.0) + execa: 8.0.1 + magic-string: 0.30.10 + pathe: 1.1.2 + std-env: 3.7.0 + tinybench: 2.8.0 + tinypool: 1.0.0 + tinyrainbow: 1.2.0 + vite: 5.3.5(@types/node@22.1.0) + vite-node: 2.0.5(@types/node@22.1.0) + why-is-node-running: 2.3.0 + optionalDependencies: + '@types/node': 22.1.0 + jsdom: 20.0.3 + transitivePeerDependencies: + - less + - lightningcss + - sass + - stylus + - sugarss + - supports-color + - terser + vscode-uri@3.0.8: {} vue-demi@0.14.8(vue@3.4.35(typescript@5.5.4)): @@ -11332,8 +10661,6 @@ snapshots: siginfo: 2.0.0 stackback: 0.0.2 - word-wrap@1.2.5: {} - wordwrap@1.0.0: {} wrap-ansi@6.2.0: From e5b4a619091c3585096c21e79dfd1ff49bdc7cac Mon Sep 17 00:00:00 2001 From: Martin PAUCOT Date: Mon, 19 Aug 2024 00:05:33 +0200 Subject: [PATCH 11/11] openapi-decorators documentation --- docs/.vitepress/en.ts | 11 +- docs/data/contributors.json | 2 +- docs/openapi-adonis/decorators.md | 7 + docs/openapi-decorators/decorators.md | 20 +++ docs/openapi-decorators/index.md | 194 ++++++++++++++++++++++++++ 5 files changed, 229 insertions(+), 5 deletions(-) create mode 100644 docs/openapi-adonis/decorators.md create mode 100644 docs/openapi-decorators/decorators.md create mode 100644 docs/openapi-decorators/index.md diff --git a/docs/.vitepress/en.ts b/docs/.vitepress/en.ts index 6433453ab..8282e4ea0 100644 --- a/docs/.vitepress/en.ts +++ b/docs/.vitepress/en.ts @@ -82,10 +82,13 @@ export const en = defineConfig({ text: "openapi-adonis", items: [ { text: "Getting Started", link: "/openapi-adonis/" }, - { text: "useQuery", link: "/openapi-react-query/use-query" }, - { text: "useMutation", link: "/openapi-react-query/use-mutation" }, - { text: "useSuspenseQuery", link: "/openapi-react-query/use-suspense-query" }, - { text: "About", link: "/openapi-react-query/about" }, + ], + }, + { + text: "openapi-decorators", + items: [ + { text: "Getting Started", link: "/openapi-decorators/" }, + { text: "Decorators", link: "/openapi-decorators/decorators" }, ], }, ], diff --git a/docs/data/contributors.json b/docs/data/contributors.json index 0195e1dd1..ccaeada93 100644 --- a/docs/data/contributors.json +++ b/docs/data/contributors.json @@ -1 +1 @@ -{"openapi-typescript":[{"username":"drwpow","name":"Drew Powers","avatar":"https://avatars.githubusercontent.com/u/1369770?v=4","links":[{"icon":"github","link":"https://github.com/drwpow"}],"lastFetch":1723252526883},{"username":"psmyrdek","name":"Przemek Smyrdek","avatar":"https://avatars.githubusercontent.com/u/6187417?v=4","links":[{"icon":"github","link":"https://github.com/psmyrdek"}],"lastFetch":1723252527044},{"username":"enmand","name":"Dan Enman","avatar":"https://avatars.githubusercontent.com/u/432487?v=4","links":[{"icon":"github","link":"https://github.com/enmand"}],"lastFetch":1723252527203},{"username":"atlefren","name":"Atle Frenvik Sveen","avatar":"https://avatars.githubusercontent.com/u/1829927?v=4","links":[{"icon":"github","link":"https://github.com/atlefren"}],"lastFetch":1723252527360},{"username":"tpdewolf","name":"Tim de Wolf","avatar":"https://avatars.githubusercontent.com/u/4455209?v=4","links":[{"icon":"github","link":"https://github.com/tpdewolf"}],"lastFetch":1723252527514},{"username":"tombarton","name":"Tom Barton","avatar":"https://avatars.githubusercontent.com/u/6222711?v=4","links":[{"icon":"github","link":"https://github.com/tombarton"}],"lastFetch":1723252527668},{"username":"svnv","name":"Sven Nicolai Viig","avatar":"https://avatars.githubusercontent.com/u/1080888?v=4","links":[{"icon":"github","link":"https://github.com/svnv"}],"lastFetch":1723252527821},{"username":"sorin-davidoi","name":"Sorin Davidoi","avatar":"https://avatars.githubusercontent.com/u/2109702?v=4","links":[{"icon":"github","link":"https://github.com/sorin-davidoi"}],"lastFetch":1723252527985},{"username":"scvnathan","name":"Nathan Schneirov","avatar":"https://avatars.githubusercontent.com/u/73474?v=4","links":[{"icon":"github","link":"https://github.com/scvnathan"}],"lastFetch":1723252528123},{"username":"lbenie","name":"Lucien Bénié","avatar":"https://avatars.githubusercontent.com/u/7316046?v=4","links":[{"icon":"github","link":"https://github.com/lbenie"}],"lastFetch":1723252528271},{"username":"bokub","name":"Boris K","avatar":"https://avatars.githubusercontent.com/u/17952318?v=4","links":[{"icon":"github","link":"https://github.com/bokub"}],"lastFetch":1723252528413},{"username":"antonk52","name":"Anton Kastritskii","avatar":"https://avatars.githubusercontent.com/u/5817809?v=4","links":[{"icon":"github","link":"https://github.com/antonk52"}],"lastFetch":1723252528587},{"username":"tshelburne","name":"Tim Shelburne","avatar":"https://avatars.githubusercontent.com/u/1202267?v=4","links":[{"icon":"github","link":"https://github.com/tshelburne"}],"lastFetch":1723252528739},{"username":"typeofweb","name":"Michał Miszczyszyn","avatar":"https://avatars.githubusercontent.com/u/1338731?v=4","links":[{"icon":"github","link":"https://github.com/typeofweb"}],"lastFetch":1723252528892},{"username":"skh-","name":"Sam K Hall","avatar":"https://avatars.githubusercontent.com/u/1292598?v=4","links":[{"icon":"github","link":"https://github.com/skh-"}],"lastFetch":1723252529074},{"username":"BlooJeans","name":"Matt Jeanes","avatar":"https://avatars.githubusercontent.com/u/1751182?v=4","links":[{"icon":"github","link":"https://github.com/BlooJeans"}],"lastFetch":1723252529220},{"username":"selbekk","name":"Kristofer Giltvedt Selbekk","avatar":"https://avatars.githubusercontent.com/u/1307267?v=4","links":[{"icon":"github","link":"https://github.com/selbekk"}],"lastFetch":1723252529422},{"username":"Mause","name":"Elliana May","avatar":"https://avatars.githubusercontent.com/u/1405026?v=4","links":[{"icon":"github","link":"https://github.com/Mause"}],"lastFetch":1723252529576},{"username":"henhal","name":"Henrik Hall","avatar":"https://avatars.githubusercontent.com/u/9608258?v=4","links":[{"icon":"github","link":"https://github.com/henhal"}],"lastFetch":1723252529725},{"username":"gr2m","name":"Gregor Martynus","avatar":"https://avatars.githubusercontent.com/u/39992?v=4","links":[{"icon":"github","link":"https://github.com/gr2m"}],"lastFetch":1723252529880},{"username":"samdbmg","name":"Sam Mesterton-Gibbons","avatar":"https://avatars.githubusercontent.com/u/408983?v=4","links":[{"icon":"github","link":"https://github.com/samdbmg"}],"lastFetch":1723252530029},{"username":"rendall","name":"Rendall","avatar":"https://avatars.githubusercontent.com/u/293263?v=4","links":[{"icon":"github","link":"https://github.com/rendall"}],"lastFetch":1723252530196},{"username":"robertmassaioli","name":"Robert Massaioli","avatar":"https://avatars.githubusercontent.com/u/149178?v=4","links":[{"icon":"github","link":"https://github.com/robertmassaioli"}],"lastFetch":1723252530341},{"username":"jankuca","name":"Jan Kuča","avatar":"https://avatars.githubusercontent.com/u/367262?v=4","links":[{"icon":"github","link":"https://github.com/jankuca"}],"lastFetch":1723252530513},{"username":"th-m","name":"Thomas Valadez","avatar":"https://avatars.githubusercontent.com/u/13792029?v=4","links":[{"icon":"github","link":"https://github.com/th-m"}],"lastFetch":1723252530685},{"username":"asithade","name":"Asitha de Silva","avatar":"https://avatars.githubusercontent.com/u/3814354?v=4","links":[{"icon":"github","link":"https://github.com/asithade"}],"lastFetch":1723252530843},{"username":"misha-erm","name":"Misha","avatar":"https://avatars.githubusercontent.com/u/8783498?v=4","links":[{"icon":"github","link":"https://github.com/misha-erm"}],"lastFetch":1723252531033},{"username":"radist2s","name":"Alex Batalov","avatar":"https://avatars.githubusercontent.com/u/725645?v=4","links":[{"icon":"github","link":"https://github.com/radist2s"}],"lastFetch":1723252531196},{"username":"FedeBev","name":"Federico Bevione","avatar":"https://avatars.githubusercontent.com/u/22151395?v=4","links":[{"icon":"github","link":"https://github.com/FedeBev"}],"lastFetch":1723252531351},{"username":"yamacent","name":"Daisuke Yamamoto","avatar":"https://avatars.githubusercontent.com/u/8544439?v=4","links":[{"icon":"github","link":"https://github.com/yamacent"}],"lastFetch":1723252531512},{"username":"dnalborczyk","name":null,"avatar":"https://avatars.githubusercontent.com/u/2903325?v=4","links":[{"icon":"github","link":"https://github.com/dnalborczyk"}],"lastFetch":1723252531669},{"username":"FabioWanner","name":null,"avatar":"https://avatars.githubusercontent.com/u/46821078?v=4","links":[{"icon":"github","link":"https://github.com/FabioWanner"}],"lastFetch":1723252531832},{"username":"ashsmith","name":"Ash Smith","avatar":"https://avatars.githubusercontent.com/u/1086841?v=4","links":[{"icon":"github","link":"https://github.com/ashsmith"}],"lastFetch":1723252531980},{"username":"mehalter","name":"Micah Halter","avatar":"https://avatars.githubusercontent.com/u/1591837?v=4","links":[{"icon":"github","link":"https://github.com/mehalter"}],"lastFetch":1723252532131},{"username":"Chrg1001","name":"chrg1001","avatar":"https://avatars.githubusercontent.com/u/40189653?v=4","links":[{"icon":"github","link":"https://github.com/Chrg1001"}],"lastFetch":1723252532304},{"username":"sharmarajdaksh","name":"Dakshraj Sharma","avatar":"https://avatars.githubusercontent.com/u/33689528?v=4","links":[{"icon":"github","link":"https://github.com/sharmarajdaksh"}],"lastFetch":1723252532457},{"username":"shuluster","name":"Shaosu Liu","avatar":"https://avatars.githubusercontent.com/u/1707910?v=4","links":[{"icon":"github","link":"https://github.com/shuluster"}],"lastFetch":1723252532646},{"username":"FDiskas","name":"Vytenis","avatar":"https://avatars.githubusercontent.com/u/468006?v=4","links":[{"icon":"github","link":"https://github.com/FDiskas"}],"lastFetch":1723252532794},{"username":"ericzorn93","name":"Eric Zorn","avatar":"https://avatars.githubusercontent.com/u/22532542?v=4","links":[{"icon":"github","link":"https://github.com/ericzorn93"}],"lastFetch":1723252532932},{"username":"mbelsky","name":"Max Belsky","avatar":"https://avatars.githubusercontent.com/u/3923527?v=4","links":[{"icon":"github","link":"https://github.com/mbelsky"}],"lastFetch":1723252533087},{"username":"techbech","name":"Peter Bech","avatar":"https://avatars.githubusercontent.com/u/1520592?v=4","links":[{"icon":"github","link":"https://github.com/techbech"}],"lastFetch":1723252533233},{"username":"rustyconover","name":"Rusty Conover","avatar":"https://avatars.githubusercontent.com/u/731941?v=4","links":[{"icon":"github","link":"https://github.com/rustyconover"}],"lastFetch":1723252533376},{"username":"bunkscene","name":"Dave Carlson","avatar":"https://avatars.githubusercontent.com/u/2693678?v=4","links":[{"icon":"github","link":"https://github.com/bunkscene"}],"lastFetch":1723252533529},{"username":"ottomated","name":null,"avatar":"https://avatars.githubusercontent.com/u/31470743?v=4","links":[{"icon":"github","link":"https://github.com/ottomated"}],"lastFetch":1723252533704},{"username":"sadfsdfdsa","name":"Artem Shuvaev","avatar":"https://avatars.githubusercontent.com/u/28733669?v=4","links":[{"icon":"github","link":"https://github.com/sadfsdfdsa"}],"lastFetch":1723252533852},{"username":"ajaishankar","name":null,"avatar":"https://avatars.githubusercontent.com/u/328008?v=4","links":[{"icon":"github","link":"https://github.com/ajaishankar"}],"lastFetch":1723252534002},{"username":"dominikdosoudil","name":"Dominik Dosoudil","avatar":"https://avatars.githubusercontent.com/u/15929942?v=4","links":[{"icon":"github","link":"https://github.com/dominikdosoudil"}],"lastFetch":1723252534163},{"username":"kgtkr","name":"kgtkr","avatar":"https://avatars.githubusercontent.com/u/17868838?v=4","links":[{"icon":"github","link":"https://github.com/kgtkr"}],"lastFetch":1723252534331},{"username":"berzi","name":null,"avatar":"https://avatars.githubusercontent.com/u/32619123?v=4","links":[{"icon":"github","link":"https://github.com/berzi"}],"lastFetch":1723252534498},{"username":"PhilipTrauner","name":"Philip Trauner","avatar":"https://avatars.githubusercontent.com/u/9287847?v=4","links":[{"icon":"github","link":"https://github.com/PhilipTrauner"}],"lastFetch":1723252534637},{"username":"Powell-v2","name":"Pavel Yermolin","avatar":"https://avatars.githubusercontent.com/u/25308326?v=4","links":[{"icon":"github","link":"https://github.com/Powell-v2"}],"lastFetch":1723252534791},{"username":"duncanbeevers","name":"Duncan Beevers","avatar":"https://avatars.githubusercontent.com/u/7367?v=4","links":[{"icon":"github","link":"https://github.com/duncanbeevers"}],"lastFetch":1723252534944},{"username":"tkukushkin","name":"Timofei Kukushkin","avatar":"https://avatars.githubusercontent.com/u/1482516?v=4","links":[{"icon":"github","link":"https://github.com/tkukushkin"}],"lastFetch":1723252535088},{"username":"Semigradsky","name":"Dmitry Semigradsky","avatar":"https://avatars.githubusercontent.com/u/1198848?v=4","links":[{"icon":"github","link":"https://github.com/Semigradsky"}],"lastFetch":1723252535243},{"username":"MrLeebo","name":"Jeremy Liberman","avatar":"https://avatars.githubusercontent.com/u/2754163?v=4","links":[{"icon":"github","link":"https://github.com/MrLeebo"}],"lastFetch":1723252535442},{"username":"axelhzf","name":"Axel Hernández Ferrera","avatar":"https://avatars.githubusercontent.com/u/175627?v=4","links":[{"icon":"github","link":"https://github.com/axelhzf"}],"lastFetch":1723252535590},{"username":"imagoiq","name":"Loïc Fürhoff","avatar":"https://avatars.githubusercontent.com/u/12294151?v=4","links":[{"icon":"github","link":"https://github.com/imagoiq"}],"lastFetch":1723252535763},{"username":"BTMPL","name":"Bartosz Szczeciński","avatar":"https://avatars.githubusercontent.com/u/247153?v=4","links":[{"icon":"github","link":"https://github.com/BTMPL"}],"lastFetch":1723252535919},{"username":"HiiiiD","name":"Marco Salomone","avatar":"https://avatars.githubusercontent.com/u/61231210?v=4","links":[{"icon":"github","link":"https://github.com/HiiiiD"}],"lastFetch":1723252536072},{"username":"yacinehmito","name":"Yacine Hmito","avatar":"https://avatars.githubusercontent.com/u/6893840?v=4","links":[{"icon":"github","link":"https://github.com/yacinehmito"}],"lastFetch":1723252536288},{"username":"sajadtorkamani","name":"Sajad Torkamani","avatar":"https://avatars.githubusercontent.com/u/9380313?v=4","links":[{"icon":"github","link":"https://github.com/sajadtorkamani"}],"lastFetch":1723252536470},{"username":"mvdbeek","name":"Marius van den Beek","avatar":"https://avatars.githubusercontent.com/u/6804901?v=4","links":[{"icon":"github","link":"https://github.com/mvdbeek"}],"lastFetch":1723252536625},{"username":"sgrimm","name":"Steven Grimm","avatar":"https://avatars.githubusercontent.com/u/1248649?v=4","links":[{"icon":"github","link":"https://github.com/sgrimm"}],"lastFetch":1723252536773},{"username":"Swiftwork","name":"Erik Hughes","avatar":"https://avatars.githubusercontent.com/u/455178?v=4","links":[{"icon":"github","link":"https://github.com/Swiftwork"}],"lastFetch":1723252536937},{"username":"mtth","name":"Matthieu Monsch","avatar":"https://avatars.githubusercontent.com/u/1216372?v=4","links":[{"icon":"github","link":"https://github.com/mtth"}],"lastFetch":1723252537078},{"username":"mitchell-merry","name":"Mitchell Merry","avatar":"https://avatars.githubusercontent.com/u/8567231?v=4","links":[{"icon":"github","link":"https://github.com/mitchell-merry"}],"lastFetch":1723252537242},{"username":"qnp","name":"François Risoud","avatar":"https://avatars.githubusercontent.com/u/6012554?v=4","links":[{"icon":"github","link":"https://github.com/qnp"}],"lastFetch":1723252537394},{"username":"shoffmeister","name":null,"avatar":"https://avatars.githubusercontent.com/u/3868036?v=4","links":[{"icon":"github","link":"https://github.com/shoffmeister"}],"lastFetch":1723252537553},{"username":"liangskyli","name":"liangsky","avatar":"https://avatars.githubusercontent.com/u/31531283?v=4","links":[{"icon":"github","link":"https://github.com/liangskyli"}],"lastFetch":1723252537718},{"username":"happycollision","name":"Don Denton","avatar":"https://avatars.githubusercontent.com/u/3663628?v=4","links":[{"icon":"github","link":"https://github.com/happycollision"}],"lastFetch":1723252537870},{"username":"ysmood","name":"Yad Smood","avatar":"https://avatars.githubusercontent.com/u/1415488?v=4","links":[{"icon":"github","link":"https://github.com/ysmood"}],"lastFetch":1723252538022},{"username":"barakalon","name":"barak","avatar":"https://avatars.githubusercontent.com/u/12398927?v=4","links":[{"icon":"github","link":"https://github.com/barakalon"}],"lastFetch":1723252538164},{"username":"horaklukas","name":"Lukáš Horák","avatar":"https://avatars.githubusercontent.com/u/996088?v=4","links":[{"icon":"github","link":"https://github.com/horaklukas"}],"lastFetch":1723252538329},{"username":"pvanagtmaal","name":null,"avatar":"https://avatars.githubusercontent.com/u/5946464?v=4","links":[{"icon":"github","link":"https://github.com/pvanagtmaal"}],"lastFetch":1723252538469},{"username":"toomuchdesign","name":"Andrea Carraro","avatar":"https://avatars.githubusercontent.com/u/4573549?v=4","links":[{"icon":"github","link":"https://github.com/toomuchdesign"}],"lastFetch":1723252538625},{"username":"psychedelicious","name":"psychedelicious","avatar":"https://avatars.githubusercontent.com/u/4822129?v=4","links":[{"icon":"github","link":"https://github.com/psychedelicious"}],"lastFetch":1723252538789},{"username":"tkrotoff","name":"Tanguy Krotoff","avatar":"https://avatars.githubusercontent.com/u/643434?v=4","links":[{"icon":"github","link":"https://github.com/tkrotoff"}],"lastFetch":1723252538945},{"username":"pimveldhuisen","name":"Pim Veldhuisen","avatar":"https://avatars.githubusercontent.com/u/3043834?v=4","links":[{"icon":"github","link":"https://github.com/pimveldhuisen"}],"lastFetch":1723252539105},{"username":"asvishnyakov","name":"Aleksandr Vishniakov","avatar":"https://avatars.githubusercontent.com/u/6369252?v=4","links":[{"icon":"github","link":"https://github.com/asvishnyakov"}],"lastFetch":1723252539274},{"username":"SchabaJo","name":null,"avatar":"https://avatars.githubusercontent.com/u/138689813?v=4","links":[{"icon":"github","link":"https://github.com/SchabaJo"}],"lastFetch":1723252539436},{"username":"AhsanFazal","name":"Ahsan Fazal","avatar":"https://avatars.githubusercontent.com/u/7458046?v=4","links":[{"icon":"github","link":"https://github.com/AhsanFazal"}],"lastFetch":1723252539592},{"username":"ElForastero","name":"Eugene Dzhumak","avatar":"https://avatars.githubusercontent.com/u/5102818?v=4","links":[{"icon":"github","link":"https://github.com/ElForastero"}],"lastFetch":1723252539741},{"username":"msgadi","name":"Mohammed Gadi","avatar":"https://avatars.githubusercontent.com/u/9037086?v=4","links":[{"icon":"github","link":"https://github.com/msgadi"}],"lastFetch":1723252539886},{"username":"muttonchop","name":"Adam K","avatar":"https://avatars.githubusercontent.com/u/1037657?v=4","links":[{"icon":"github","link":"https://github.com/muttonchop"}],"lastFetch":1723252540038},{"username":"christoph-fricke","name":"Christoph Fricke","avatar":"https://avatars.githubusercontent.com/u/23103835?v=4","links":[{"icon":"github","link":"https://github.com/christoph-fricke"}],"lastFetch":1723252540193},{"username":"JorrinKievit","name":"Jorrin","avatar":"https://avatars.githubusercontent.com/u/43169049?v=4","links":[{"icon":"github","link":"https://github.com/JorrinKievit"}],"lastFetch":1723252540352},{"username":"WickyNilliams","name":"Nick Williams","avatar":"https://avatars.githubusercontent.com/u/1091390?v=4","links":[{"icon":"github","link":"https://github.com/WickyNilliams"}],"lastFetch":1723252540504},{"username":"hrsh7th","name":"hrsh7th","avatar":"https://avatars.githubusercontent.com/u/629908?v=4","links":[{"icon":"github","link":"https://github.com/hrsh7th"}],"lastFetch":1723252540677},{"username":"davidleger95","name":"David Leger","avatar":"https://avatars.githubusercontent.com/u/10498708?v=4","links":[{"icon":"github","link":"https://github.com/davidleger95"}],"lastFetch":1723252540835},{"username":"phk422","name":"Hongkun Peng","avatar":"https://avatars.githubusercontent.com/u/59734322?v=4","links":[{"icon":"github","link":"https://github.com/phk422"}],"lastFetch":1723252540981},{"username":"mzronek","name":"Matthias Zronek","avatar":"https://avatars.githubusercontent.com/u/3847700?v=4","links":[{"icon":"github","link":"https://github.com/mzronek"}],"lastFetch":1723252541153},{"username":"raurfang","name":"Łukasz Wiśniewski","avatar":"https://avatars.githubusercontent.com/u/867241?v=4","links":[{"icon":"github","link":"https://github.com/raurfang"}],"lastFetch":1723252541311},{"username":"JeanRemiDelteil","name":"Jean-Rémi Delteil","avatar":"https://avatars.githubusercontent.com/u/9743907?v=4","links":[{"icon":"github","link":"https://github.com/JeanRemiDelteil"}],"lastFetch":1723252541464},{"username":"TzviPM","name":"Tzvi Melamed","avatar":"https://avatars.githubusercontent.com/u/1950680?v=4","links":[{"icon":"github","link":"https://github.com/TzviPM"}],"lastFetch":1723252541682},{"username":"LucaSchwan","name":"ehrenschwan","avatar":"https://avatars.githubusercontent.com/u/25820532?v=4","links":[{"icon":"github","link":"https://github.com/LucaSchwan"}],"lastFetch":1723252541825},{"username":"nzapponi","name":"Niccolo Zapponi","avatar":"https://avatars.githubusercontent.com/u/20582065?v=4","links":[{"icon":"github","link":"https://github.com/nzapponi"}],"lastFetch":1723252541982},{"username":"luchsamapparat","name":"Marvin Luchs","avatar":"https://avatars.githubusercontent.com/u/875017?v=4","links":[{"icon":"github","link":"https://github.com/luchsamapparat"}],"lastFetch":1723252542132},{"username":"nmacmunn","name":"Neil MacMunn","avatar":"https://avatars.githubusercontent.com/u/849964?v=4","links":[{"icon":"github","link":"https://github.com/nmacmunn"}],"lastFetch":1723252542278}],"openapi-fetch":[{"username":"drwpow","name":"Drew Powers","avatar":"https://avatars.githubusercontent.com/u/1369770?v=4","links":[{"icon":"github","link":"https://github.com/drwpow"}],"lastFetch":1723252526808},{"username":"fergusean","name":null,"avatar":"https://avatars.githubusercontent.com/u/1029297?v=4","links":[{"icon":"github","link":"https://github.com/fergusean"}],"lastFetch":1723252526977},{"username":"shinzui","name":"Nadeem Bitar","avatar":"https://avatars.githubusercontent.com/u/519?v=4","links":[{"icon":"github","link":"https://github.com/shinzui"}],"lastFetch":1723252527135},{"username":"ezpuzz","name":"Emory Petermann","avatar":"https://avatars.githubusercontent.com/u/672182?v=4","links":[{"icon":"github","link":"https://github.com/ezpuzz"}],"lastFetch":1723252527298},{"username":"KotoriK","name":null,"avatar":"https://avatars.githubusercontent.com/u/52659125?v=4","links":[{"icon":"github","link":"https://github.com/KotoriK"}],"lastFetch":1723252527454},{"username":"fletchertyler914","name":"Tyler Fletcher","avatar":"https://avatars.githubusercontent.com/u/3344498?v=4","links":[{"icon":"github","link":"https://github.com/fletchertyler914"}],"lastFetch":1723252527605},{"username":"nholik","name":"Nicklos Holik","avatar":"https://avatars.githubusercontent.com/u/2022214?v=4","links":[{"icon":"github","link":"https://github.com/nholik"}],"lastFetch":1723252527756},{"username":"roj1512","name":null,"avatar":"https://avatars.githubusercontent.com/u/175297870?v=4","links":[{"icon":"github","link":"https://github.com/roj1512"}],"lastFetch":1723252527904},{"username":"nickcaballero","name":"Nick Caballero","avatar":"https://avatars.githubusercontent.com/u/355976?v=4","links":[{"icon":"github","link":"https://github.com/nickcaballero"}],"lastFetch":1723252528054},{"username":"hd-o","name":"Hadrian de Oliveira","avatar":"https://avatars.githubusercontent.com/u/58871222?v=4","links":[{"icon":"github","link":"https://github.com/hd-o"}],"lastFetch":1723252528254},{"username":"kecrily","name":"Percy Ma","avatar":"https://avatars.githubusercontent.com/u/45708948?v=4","links":[{"icon":"github","link":"https://github.com/kecrily"}],"lastFetch":1723252528408},{"username":"psychedelicious","name":"psychedelicious","avatar":"https://avatars.githubusercontent.com/u/4822129?v=4","links":[{"icon":"github","link":"https://github.com/psychedelicious"}],"lastFetch":1723252528561},{"username":"muttonchop","name":"Adam K","avatar":"https://avatars.githubusercontent.com/u/1037657?v=4","links":[{"icon":"github","link":"https://github.com/muttonchop"}],"lastFetch":1723252528706},{"username":"marcomuser","name":"Marco Muser","avatar":"https://avatars.githubusercontent.com/u/64737396?v=4","links":[{"icon":"github","link":"https://github.com/marcomuser"}],"lastFetch":1723252528869},{"username":"HugeLetters","name":"Evgenii Perminov","avatar":"https://avatars.githubusercontent.com/u/119697239?v=4","links":[{"icon":"github","link":"https://github.com/HugeLetters"}],"lastFetch":1723252529026},{"username":"Fumaz","name":"alex","avatar":"https://avatars.githubusercontent.com/u/45318608?v=4","links":[{"icon":"github","link":"https://github.com/Fumaz"}],"lastFetch":1723252529197},{"username":"darwish","name":"Mike Darwish","avatar":"https://avatars.githubusercontent.com/u/292570?v=4","links":[{"icon":"github","link":"https://github.com/darwish"}],"lastFetch":1723252529397},{"username":"kaechele","name":"Felix Kaechele","avatar":"https://avatars.githubusercontent.com/u/454490?v=4","links":[{"icon":"github","link":"https://github.com/kaechele"}],"lastFetch":1723252529557},{"username":"phk422","name":"Hongkun Peng","avatar":"https://avatars.githubusercontent.com/u/59734322?v=4","links":[{"icon":"github","link":"https://github.com/phk422"}],"lastFetch":1723252529713},{"username":"mikestopcontinues","name":"Mike Stop Continues","avatar":"https://avatars.githubusercontent.com/u/150434?v=4","links":[{"icon":"github","link":"https://github.com/mikestopcontinues"}],"lastFetch":1723252529861},{"username":"JE-Lee","name":"maurice","avatar":"https://avatars.githubusercontent.com/u/19794813?v=4","links":[{"icon":"github","link":"https://github.com/JE-Lee"}],"lastFetch":1723252530007},{"username":"vipentti","name":"Ville Penttinen","avatar":"https://avatars.githubusercontent.com/u/4726680?v=4","links":[{"icon":"github","link":"https://github.com/vipentti"}],"lastFetch":1723252530157},{"username":"armandabric","name":"Armand Abric","avatar":"https://avatars.githubusercontent.com/u/95120?v=4","links":[{"icon":"github","link":"https://github.com/armandabric"}],"lastFetch":1723252530324},{"username":"illright","name":"Lev Chelyadinov","avatar":"https://avatars.githubusercontent.com/u/15035286?v=4","links":[{"icon":"github","link":"https://github.com/illright"}],"lastFetch":1723252530477}],"openapi-react-query":[{"username":"drwpow","name":"Drew Powers","avatar":"https://avatars.githubusercontent.com/u/1369770?v=4","links":[{"icon":"github","link":"https://github.com/drwpow"}],"lastFetch":1723252526807},{"username":"kerwanp","name":"Martin Paucot","avatar":"https://avatars.githubusercontent.com/u/36955373?v=4","links":[{"icon":"github","link":"https://github.com/kerwanp"}],"lastFetch":1723252526973}]} \ No newline at end of file +{"openapi-typescript":[{"username":"drwpow","name":"Drew Powers","avatar":"https://avatars.githubusercontent.com/u/1369770?v=4","links":[{"icon":"github","link":"https://github.com/drwpow"}],"lastFetch":1724015541414},{"username":"psmyrdek","name":"Przemek Smyrdek","avatar":"https://avatars.githubusercontent.com/u/6187417?v=4","links":[{"icon":"github","link":"https://github.com/psmyrdek"}],"lastFetch":1724015541567},{"username":"enmand","name":"Dan Enman","avatar":"https://avatars.githubusercontent.com/u/432487?v=4","links":[{"icon":"github","link":"https://github.com/enmand"}],"lastFetch":1724015541749},{"username":"atlefren","name":"Atle Frenvik Sveen","avatar":"https://avatars.githubusercontent.com/u/1829927?v=4","links":[{"icon":"github","link":"https://github.com/atlefren"}],"lastFetch":1724015541906},{"username":"tpdewolf","name":"Tim de Wolf","avatar":"https://avatars.githubusercontent.com/u/4455209?v=4","links":[{"icon":"github","link":"https://github.com/tpdewolf"}],"lastFetch":1724015542067},{"username":"tombarton","name":"Tom Barton","avatar":"https://avatars.githubusercontent.com/u/6222711?v=4","links":[{"icon":"github","link":"https://github.com/tombarton"}],"lastFetch":1724015542214},{"username":"svnv","name":"Sven Nicolai Viig","avatar":"https://avatars.githubusercontent.com/u/1080888?v=4","links":[{"icon":"github","link":"https://github.com/svnv"}],"lastFetch":1724015542374},{"username":"sorin-davidoi","name":"Sorin Davidoi","avatar":"https://avatars.githubusercontent.com/u/2109702?v=4","links":[{"icon":"github","link":"https://github.com/sorin-davidoi"}],"lastFetch":1724015542542},{"username":"scvnathan","name":"Nathan Schneirov","avatar":"https://avatars.githubusercontent.com/u/73474?v=4","links":[{"icon":"github","link":"https://github.com/scvnathan"}],"lastFetch":1724015542688},{"username":"lbenie","name":"Lucien Bénié","avatar":"https://avatars.githubusercontent.com/u/7316046?v=4","links":[{"icon":"github","link":"https://github.com/lbenie"}],"lastFetch":1724015542870},{"username":"bokub","name":"Boris K","avatar":"https://avatars.githubusercontent.com/u/17952318?v=4","links":[{"icon":"github","link":"https://github.com/bokub"}],"lastFetch":1724015543036},{"username":"antonk52","name":"Anton Kastritskii","avatar":"https://avatars.githubusercontent.com/u/5817809?v=4","links":[{"icon":"github","link":"https://github.com/antonk52"}],"lastFetch":1724015543208},{"username":"tshelburne","name":"Tim Shelburne","avatar":"https://avatars.githubusercontent.com/u/1202267?v=4","links":[{"icon":"github","link":"https://github.com/tshelburne"}],"lastFetch":1724015543367},{"username":"typeofweb","name":"Michał Miszczyszyn","avatar":"https://avatars.githubusercontent.com/u/1338731?v=4","links":[{"icon":"github","link":"https://github.com/typeofweb"}],"lastFetch":1724015543507},{"username":"skh-","name":"Sam K Hall","avatar":"https://avatars.githubusercontent.com/u/1292598?v=4","links":[{"icon":"github","link":"https://github.com/skh-"}],"lastFetch":1724015543665},{"username":"BlooJeans","name":"Matt Jeanes","avatar":"https://avatars.githubusercontent.com/u/1751182?v=4","links":[{"icon":"github","link":"https://github.com/BlooJeans"}],"lastFetch":1724015543819},{"username":"selbekk","name":"Kristofer Giltvedt Selbekk","avatar":"https://avatars.githubusercontent.com/u/1307267?v=4","links":[{"icon":"github","link":"https://github.com/selbekk"}],"lastFetch":1724015543967},{"username":"Mause","name":"Elliana May","avatar":"https://avatars.githubusercontent.com/u/1405026?v=4","links":[{"icon":"github","link":"https://github.com/Mause"}],"lastFetch":1724015544147},{"username":"henhal","name":"Henrik Hall","avatar":"https://avatars.githubusercontent.com/u/9608258?v=4","links":[{"icon":"github","link":"https://github.com/henhal"}],"lastFetch":1724015544295},{"username":"gr2m","name":"Gregor Martynus","avatar":"https://avatars.githubusercontent.com/u/39992?v=4","links":[{"icon":"github","link":"https://github.com/gr2m"}],"lastFetch":1724015544441},{"username":"samdbmg","name":"Sam Mesterton-Gibbons","avatar":"https://avatars.githubusercontent.com/u/408983?v=4","links":[{"icon":"github","link":"https://github.com/samdbmg"}],"lastFetch":1724015544589},{"username":"rendall","name":"Rendall","avatar":"https://avatars.githubusercontent.com/u/293263?v=4","links":[{"icon":"github","link":"https://github.com/rendall"}],"lastFetch":1724015544754},{"username":"robertmassaioli","name":"Robert Massaioli","avatar":"https://avatars.githubusercontent.com/u/149178?v=4","links":[{"icon":"github","link":"https://github.com/robertmassaioli"}],"lastFetch":1724015544910},{"username":"jankuca","name":"Jan Kuča","avatar":"https://avatars.githubusercontent.com/u/367262?v=4","links":[{"icon":"github","link":"https://github.com/jankuca"}],"lastFetch":1724015545048},{"username":"th-m","name":"Thomas Valadez","avatar":"https://avatars.githubusercontent.com/u/13792029?v=4","links":[{"icon":"github","link":"https://github.com/th-m"}],"lastFetch":1724015545202},{"username":"asithade","name":"Asitha de Silva","avatar":"https://avatars.githubusercontent.com/u/3814354?v=4","links":[{"icon":"github","link":"https://github.com/asithade"}],"lastFetch":1724015545354},{"username":"misha-erm","name":"Misha","avatar":"https://avatars.githubusercontent.com/u/8783498?v=4","links":[{"icon":"github","link":"https://github.com/misha-erm"}],"lastFetch":1724015545507},{"username":"radist2s","name":"Alex Batalov","avatar":"https://avatars.githubusercontent.com/u/725645?v=4","links":[{"icon":"github","link":"https://github.com/radist2s"}],"lastFetch":1724015545665},{"username":"FedeBev","name":"Federico Bevione","avatar":"https://avatars.githubusercontent.com/u/22151395?v=4","links":[{"icon":"github","link":"https://github.com/FedeBev"}],"lastFetch":1724015545820},{"username":"yamacent","name":"Daisuke Yamamoto","avatar":"https://avatars.githubusercontent.com/u/8544439?v=4","links":[{"icon":"github","link":"https://github.com/yamacent"}],"lastFetch":1724015545982},{"username":"dnalborczyk","name":null,"avatar":"https://avatars.githubusercontent.com/u/2903325?v=4","links":[{"icon":"github","link":"https://github.com/dnalborczyk"}],"lastFetch":1724015546184},{"username":"FabioWanner","name":null,"avatar":"https://avatars.githubusercontent.com/u/46821078?v=4","links":[{"icon":"github","link":"https://github.com/FabioWanner"}],"lastFetch":1724015546326},{"username":"ashsmith","name":"Ash Smith","avatar":"https://avatars.githubusercontent.com/u/1086841?v=4","links":[{"icon":"github","link":"https://github.com/ashsmith"}],"lastFetch":1724015546493},{"username":"mehalter","name":"Micah Halter","avatar":"https://avatars.githubusercontent.com/u/1591837?v=4","links":[{"icon":"github","link":"https://github.com/mehalter"}],"lastFetch":1724015546652},{"username":"Chrg1001","name":"chrg1001","avatar":"https://avatars.githubusercontent.com/u/40189653?v=4","links":[{"icon":"github","link":"https://github.com/Chrg1001"}],"lastFetch":1724015546808},{"username":"sharmarajdaksh","name":"Dakshraj Sharma","avatar":"https://avatars.githubusercontent.com/u/33689528?v=4","links":[{"icon":"github","link":"https://github.com/sharmarajdaksh"}],"lastFetch":1724015546965},{"username":"shuluster","name":"Shaosu Liu","avatar":"https://avatars.githubusercontent.com/u/1707910?v=4","links":[{"icon":"github","link":"https://github.com/shuluster"}],"lastFetch":1724015547111},{"username":"FDiskas","name":"Vytenis","avatar":"https://avatars.githubusercontent.com/u/468006?v=4","links":[{"icon":"github","link":"https://github.com/FDiskas"}],"lastFetch":1724015547261},{"username":"ericzorn93","name":"Eric Zorn","avatar":"https://avatars.githubusercontent.com/u/22532542?v=4","links":[{"icon":"github","link":"https://github.com/ericzorn93"}],"lastFetch":1724015547422},{"username":"mbelsky","name":"Max Belsky","avatar":"https://avatars.githubusercontent.com/u/3923527?v=4","links":[{"icon":"github","link":"https://github.com/mbelsky"}],"lastFetch":1724015547595},{"username":"techbech","name":"Peter Bech","avatar":"https://avatars.githubusercontent.com/u/1520592?v=4","links":[{"icon":"github","link":"https://github.com/techbech"}],"lastFetch":1724015547765},{"username":"rustyconover","name":"Rusty Conover","avatar":"https://avatars.githubusercontent.com/u/731941?v=4","links":[{"icon":"github","link":"https://github.com/rustyconover"}],"lastFetch":1724015547916},{"username":"bunkscene","name":"Dave Carlson","avatar":"https://avatars.githubusercontent.com/u/2693678?v=4","links":[{"icon":"github","link":"https://github.com/bunkscene"}],"lastFetch":1724015548071},{"username":"ottomated","name":null,"avatar":"https://avatars.githubusercontent.com/u/31470743?v=4","links":[{"icon":"github","link":"https://github.com/ottomated"}],"lastFetch":1724015548223},{"username":"sadfsdfdsa","name":"Artem Shuvaev","avatar":"https://avatars.githubusercontent.com/u/28733669?v=4","links":[{"icon":"github","link":"https://github.com/sadfsdfdsa"}],"lastFetch":1724015548379},{"username":"ajaishankar","name":null,"avatar":"https://avatars.githubusercontent.com/u/328008?v=4","links":[{"icon":"github","link":"https://github.com/ajaishankar"}],"lastFetch":1724015548547},{"username":"dominikdosoudil","name":"Dominik Dosoudil","avatar":"https://avatars.githubusercontent.com/u/15929942?v=4","links":[{"icon":"github","link":"https://github.com/dominikdosoudil"}],"lastFetch":1724015548738},{"username":"kgtkr","name":"kgtkr","avatar":"https://avatars.githubusercontent.com/u/17868838?v=4","links":[{"icon":"github","link":"https://github.com/kgtkr"}],"lastFetch":1724015548891},{"username":"berzi","name":null,"avatar":"https://avatars.githubusercontent.com/u/32619123?v=4","links":[{"icon":"github","link":"https://github.com/berzi"}],"lastFetch":1724015549041},{"username":"PhilipTrauner","name":"Philip Trauner","avatar":"https://avatars.githubusercontent.com/u/9287847?v=4","links":[{"icon":"github","link":"https://github.com/PhilipTrauner"}],"lastFetch":1724015549194},{"username":"Powell-v2","name":"Pavel Yermolin","avatar":"https://avatars.githubusercontent.com/u/25308326?v=4","links":[{"icon":"github","link":"https://github.com/Powell-v2"}],"lastFetch":1724015549370},{"username":"duncanbeevers","name":"Duncan Beevers","avatar":"https://avatars.githubusercontent.com/u/7367?v=4","links":[{"icon":"github","link":"https://github.com/duncanbeevers"}],"lastFetch":1724015549514},{"username":"tkukushkin","name":"Timofei Kukushkin","avatar":"https://avatars.githubusercontent.com/u/1482516?v=4","links":[{"icon":"github","link":"https://github.com/tkukushkin"}],"lastFetch":1724015549670},{"username":"Semigradsky","name":"Dmitry Semigradsky","avatar":"https://avatars.githubusercontent.com/u/1198848?v=4","links":[{"icon":"github","link":"https://github.com/Semigradsky"}],"lastFetch":1724015549837},{"username":"MrLeebo","name":"Jeremy Liberman","avatar":"https://avatars.githubusercontent.com/u/2754163?v=4","links":[{"icon":"github","link":"https://github.com/MrLeebo"}],"lastFetch":1724015550005},{"username":"axelhzf","name":"Axel Hernández Ferrera","avatar":"https://avatars.githubusercontent.com/u/175627?v=4","links":[{"icon":"github","link":"https://github.com/axelhzf"}],"lastFetch":1724015550195},{"username":"imagoiq","name":"Loïc Fürhoff","avatar":"https://avatars.githubusercontent.com/u/12294151?v=4","links":[{"icon":"github","link":"https://github.com/imagoiq"}],"lastFetch":1724015550371},{"username":"BTMPL","name":"Bartosz Szczeciński","avatar":"https://avatars.githubusercontent.com/u/247153?v=4","links":[{"icon":"github","link":"https://github.com/BTMPL"}],"lastFetch":1724015550520},{"username":"HiiiiD","name":"Marco Salomone","avatar":"https://avatars.githubusercontent.com/u/61231210?v=4","links":[{"icon":"github","link":"https://github.com/HiiiiD"}],"lastFetch":1724015550724},{"username":"yacinehmito","name":"Yacine Hmito","avatar":"https://avatars.githubusercontent.com/u/6893840?v=4","links":[{"icon":"github","link":"https://github.com/yacinehmito"}],"lastFetch":1724015550891},{"username":"sajadtorkamani","name":"Sajad Torkamani","avatar":"https://avatars.githubusercontent.com/u/9380313?v=4","links":[{"icon":"github","link":"https://github.com/sajadtorkamani"}],"lastFetch":1724015551075},{"username":"mvdbeek","name":"Marius van den Beek","avatar":"https://avatars.githubusercontent.com/u/6804901?v=4","links":[{"icon":"github","link":"https://github.com/mvdbeek"}],"lastFetch":1724015551249},{"username":"sgrimm","name":"Steven Grimm","avatar":"https://avatars.githubusercontent.com/u/1248649?v=4","links":[{"icon":"github","link":"https://github.com/sgrimm"}],"lastFetch":1724015551430},{"username":"Swiftwork","name":"Erik Hughes","avatar":"https://avatars.githubusercontent.com/u/455178?v=4","links":[{"icon":"github","link":"https://github.com/Swiftwork"}],"lastFetch":1724015551580},{"username":"mtth","name":"Matthieu Monsch","avatar":"https://avatars.githubusercontent.com/u/1216372?v=4","links":[{"icon":"github","link":"https://github.com/mtth"}],"lastFetch":1724015551772},{"username":"mitchell-merry","name":"Mitchell Merry","avatar":"https://avatars.githubusercontent.com/u/8567231?v=4","links":[{"icon":"github","link":"https://github.com/mitchell-merry"}],"lastFetch":1724015551927},{"username":"qnp","name":"François Risoud","avatar":"https://avatars.githubusercontent.com/u/6012554?v=4","links":[{"icon":"github","link":"https://github.com/qnp"}],"lastFetch":1724015552082},{"username":"shoffmeister","name":null,"avatar":"https://avatars.githubusercontent.com/u/3868036?v=4","links":[{"icon":"github","link":"https://github.com/shoffmeister"}],"lastFetch":1724015552233},{"username":"liangskyli","name":"liangsky","avatar":"https://avatars.githubusercontent.com/u/31531283?v=4","links":[{"icon":"github","link":"https://github.com/liangskyli"}],"lastFetch":1724015552386},{"username":"happycollision","name":"Don Denton","avatar":"https://avatars.githubusercontent.com/u/3663628?v=4","links":[{"icon":"github","link":"https://github.com/happycollision"}],"lastFetch":1724015552527},{"username":"ysmood","name":"Yad Smood","avatar":"https://avatars.githubusercontent.com/u/1415488?v=4","links":[{"icon":"github","link":"https://github.com/ysmood"}],"lastFetch":1724015552688},{"username":"barakalon","name":"barak","avatar":"https://avatars.githubusercontent.com/u/12398927?v=4","links":[{"icon":"github","link":"https://github.com/barakalon"}],"lastFetch":1724015552859},{"username":"horaklukas","name":"Lukáš Horák","avatar":"https://avatars.githubusercontent.com/u/996088?v=4","links":[{"icon":"github","link":"https://github.com/horaklukas"}],"lastFetch":1724015553015},{"username":"pvanagtmaal","name":null,"avatar":"https://avatars.githubusercontent.com/u/5946464?v=4","links":[{"icon":"github","link":"https://github.com/pvanagtmaal"}],"lastFetch":1724015553174},{"username":"toomuchdesign","name":"Andrea Carraro","avatar":"https://avatars.githubusercontent.com/u/4573549?v=4","links":[{"icon":"github","link":"https://github.com/toomuchdesign"}],"lastFetch":1724015553359},{"username":"psychedelicious","name":"psychedelicious","avatar":"https://avatars.githubusercontent.com/u/4822129?v=4","links":[{"icon":"github","link":"https://github.com/psychedelicious"}],"lastFetch":1724015553522},{"username":"tkrotoff","name":"Tanguy Krotoff","avatar":"https://avatars.githubusercontent.com/u/643434?v=4","links":[{"icon":"github","link":"https://github.com/tkrotoff"}],"lastFetch":1724015553683},{"username":"pimveldhuisen","name":"Pim Veldhuisen","avatar":"https://avatars.githubusercontent.com/u/3043834?v=4","links":[{"icon":"github","link":"https://github.com/pimveldhuisen"}],"lastFetch":1724015553831},{"username":"asvishnyakov","name":"Aleksandr Vishniakov","avatar":"https://avatars.githubusercontent.com/u/6369252?v=4","links":[{"icon":"github","link":"https://github.com/asvishnyakov"}],"lastFetch":1724015554068},{"username":"SchabaJo","name":null,"avatar":"https://avatars.githubusercontent.com/u/138689813?v=4","links":[{"icon":"github","link":"https://github.com/SchabaJo"}],"lastFetch":1724015554248},{"username":"AhsanFazal","name":"Ahsan Fazal","avatar":"https://avatars.githubusercontent.com/u/7458046?v=4","links":[{"icon":"github","link":"https://github.com/AhsanFazal"}],"lastFetch":1724015554388},{"username":"ElForastero","name":"Eugene Dzhumak","avatar":"https://avatars.githubusercontent.com/u/5102818?v=4","links":[{"icon":"github","link":"https://github.com/ElForastero"}],"lastFetch":1724015554556},{"username":"msgadi","name":"Mohammed Gadi","avatar":"https://avatars.githubusercontent.com/u/9037086?v=4","links":[{"icon":"github","link":"https://github.com/msgadi"}],"lastFetch":1724015554739},{"username":"muttonchop","name":"Adam K","avatar":"https://avatars.githubusercontent.com/u/1037657?v=4","links":[{"icon":"github","link":"https://github.com/muttonchop"}],"lastFetch":1724015554895},{"username":"christoph-fricke","name":"Christoph Fricke","avatar":"https://avatars.githubusercontent.com/u/23103835?v=4","links":[{"icon":"github","link":"https://github.com/christoph-fricke"}],"lastFetch":1724015555040},{"username":"JorrinKievit","name":"Jorrin","avatar":"https://avatars.githubusercontent.com/u/43169049?v=4","links":[{"icon":"github","link":"https://github.com/JorrinKievit"}],"lastFetch":1724015555220},{"username":"WickyNilliams","name":"Nick Williams","avatar":"https://avatars.githubusercontent.com/u/1091390?v=4","links":[{"icon":"github","link":"https://github.com/WickyNilliams"}],"lastFetch":1724015555377},{"username":"hrsh7th","name":"hrsh7th","avatar":"https://avatars.githubusercontent.com/u/629908?v=4","links":[{"icon":"github","link":"https://github.com/hrsh7th"}],"lastFetch":1724015555526},{"username":"davidleger95","name":"David Leger","avatar":"https://avatars.githubusercontent.com/u/10498708?v=4","links":[{"icon":"github","link":"https://github.com/davidleger95"}],"lastFetch":1724015555689},{"username":"phk422","name":"Hongkun Peng","avatar":"https://avatars.githubusercontent.com/u/59734322?v=4","links":[{"icon":"github","link":"https://github.com/phk422"}],"lastFetch":1724015555856},{"username":"mzronek","name":"Matthias Zronek","avatar":"https://avatars.githubusercontent.com/u/3847700?v=4","links":[{"icon":"github","link":"https://github.com/mzronek"}],"lastFetch":1724015556006},{"username":"raurfang","name":"Łukasz Wiśniewski","avatar":"https://avatars.githubusercontent.com/u/867241?v=4","links":[{"icon":"github","link":"https://github.com/raurfang"}],"lastFetch":1724015556267},{"username":"JeanRemiDelteil","name":"Jean-Rémi Delteil","avatar":"https://avatars.githubusercontent.com/u/9743907?v=4","links":[{"icon":"github","link":"https://github.com/JeanRemiDelteil"}],"lastFetch":1724015556416},{"username":"TzviPM","name":"Tzvi Melamed","avatar":"https://avatars.githubusercontent.com/u/1950680?v=4","links":[{"icon":"github","link":"https://github.com/TzviPM"}],"lastFetch":1724015556559},{"username":"LucaSchwan","name":"ehrenschwan","avatar":"https://avatars.githubusercontent.com/u/25820532?v=4","links":[{"icon":"github","link":"https://github.com/LucaSchwan"}],"lastFetch":1724015556716},{"username":"nzapponi","name":"Niccolo Zapponi","avatar":"https://avatars.githubusercontent.com/u/20582065?v=4","links":[{"icon":"github","link":"https://github.com/nzapponi"}],"lastFetch":1724015556862},{"username":"luchsamapparat","name":"Marvin Luchs","avatar":"https://avatars.githubusercontent.com/u/875017?v=4","links":[{"icon":"github","link":"https://github.com/luchsamapparat"}],"lastFetch":1724015557019},{"username":"nmacmunn","name":"Neil MacMunn","avatar":"https://avatars.githubusercontent.com/u/849964?v=4","links":[{"icon":"github","link":"https://github.com/nmacmunn"}],"lastFetch":1724015557181}],"openapi-fetch":[{"username":"drwpow","name":"Drew Powers","avatar":"https://avatars.githubusercontent.com/u/1369770?v=4","links":[{"icon":"github","link":"https://github.com/drwpow"}],"lastFetch":1724015541412},{"username":"fergusean","name":null,"avatar":"https://avatars.githubusercontent.com/u/1029297?v=4","links":[{"icon":"github","link":"https://github.com/fergusean"}],"lastFetch":1724015541578},{"username":"shinzui","name":"Nadeem Bitar","avatar":"https://avatars.githubusercontent.com/u/519?v=4","links":[{"icon":"github","link":"https://github.com/shinzui"}],"lastFetch":1724015541740},{"username":"ezpuzz","name":"Emory Petermann","avatar":"https://avatars.githubusercontent.com/u/672182?v=4","links":[{"icon":"github","link":"https://github.com/ezpuzz"}],"lastFetch":1724015541907},{"username":"KotoriK","name":null,"avatar":"https://avatars.githubusercontent.com/u/52659125?v=4","links":[{"icon":"github","link":"https://github.com/KotoriK"}],"lastFetch":1724015542077},{"username":"fletchertyler914","name":"Tyler Fletcher","avatar":"https://avatars.githubusercontent.com/u/3344498?v=4","links":[{"icon":"github","link":"https://github.com/fletchertyler914"}],"lastFetch":1724015542234},{"username":"nholik","name":"Nicklos Holik","avatar":"https://avatars.githubusercontent.com/u/2022214?v=4","links":[{"icon":"github","link":"https://github.com/nholik"}],"lastFetch":1724015542383},{"username":"roj1512","name":null,"avatar":"https://avatars.githubusercontent.com/u/175297870?v=4","links":[{"icon":"github","link":"https://github.com/roj1512"}],"lastFetch":1724015542534},{"username":"nickcaballero","name":"Nick Caballero","avatar":"https://avatars.githubusercontent.com/u/355976?v=4","links":[{"icon":"github","link":"https://github.com/nickcaballero"}],"lastFetch":1724015542696},{"username":"hd-o","name":"Hadrian de Oliveira","avatar":"https://avatars.githubusercontent.com/u/58871222?v=4","links":[{"icon":"github","link":"https://github.com/hd-o"}],"lastFetch":1724015542850},{"username":"kecrily","name":"Percy Ma","avatar":"https://avatars.githubusercontent.com/u/45708948?v=4","links":[{"icon":"github","link":"https://github.com/kecrily"}],"lastFetch":1724015543016},{"username":"psychedelicious","name":"psychedelicious","avatar":"https://avatars.githubusercontent.com/u/4822129?v=4","links":[{"icon":"github","link":"https://github.com/psychedelicious"}],"lastFetch":1724015543213},{"username":"muttonchop","name":"Adam K","avatar":"https://avatars.githubusercontent.com/u/1037657?v=4","links":[{"icon":"github","link":"https://github.com/muttonchop"}],"lastFetch":1724015543357},{"username":"marcomuser","name":"Marco Muser","avatar":"https://avatars.githubusercontent.com/u/64737396?v=4","links":[{"icon":"github","link":"https://github.com/marcomuser"}],"lastFetch":1724015543516},{"username":"HugeLetters","name":"Evgenii Perminov","avatar":"https://avatars.githubusercontent.com/u/119697239?v=4","links":[{"icon":"github","link":"https://github.com/HugeLetters"}],"lastFetch":1724015543687},{"username":"Fumaz","name":"alex","avatar":"https://avatars.githubusercontent.com/u/45318608?v=4","links":[{"icon":"github","link":"https://github.com/Fumaz"}],"lastFetch":1724015543845},{"username":"darwish","name":"Mike Darwish","avatar":"https://avatars.githubusercontent.com/u/292570?v=4","links":[{"icon":"github","link":"https://github.com/darwish"}],"lastFetch":1724015543987},{"username":"kaechele","name":"Felix Kaechele","avatar":"https://avatars.githubusercontent.com/u/454490?v=4","links":[{"icon":"github","link":"https://github.com/kaechele"}],"lastFetch":1724015544146},{"username":"phk422","name":"Hongkun Peng","avatar":"https://avatars.githubusercontent.com/u/59734322?v=4","links":[{"icon":"github","link":"https://github.com/phk422"}],"lastFetch":1724015544300},{"username":"mikestopcontinues","name":"Mike Stop Continues","avatar":"https://avatars.githubusercontent.com/u/150434?v=4","links":[{"icon":"github","link":"https://github.com/mikestopcontinues"}],"lastFetch":1724015544483},{"username":"JE-Lee","name":"maurice","avatar":"https://avatars.githubusercontent.com/u/19794813?v=4","links":[{"icon":"github","link":"https://github.com/JE-Lee"}],"lastFetch":1724015544670},{"username":"vipentti","name":"Ville Penttinen","avatar":"https://avatars.githubusercontent.com/u/4726680?v=4","links":[{"icon":"github","link":"https://github.com/vipentti"}],"lastFetch":1724015544851},{"username":"armandabric","name":"Armand Abric","avatar":"https://avatars.githubusercontent.com/u/95120?v=4","links":[{"icon":"github","link":"https://github.com/armandabric"}],"lastFetch":1724015545014},{"username":"illright","name":"Lev Chelyadinov","avatar":"https://avatars.githubusercontent.com/u/15035286?v=4","links":[{"icon":"github","link":"https://github.com/illright"}],"lastFetch":1724015545162}],"openapi-react-query":[{"username":"drwpow","name":"Drew Powers","avatar":"https://avatars.githubusercontent.com/u/1369770?v=4","links":[{"icon":"github","link":"https://github.com/drwpow"}],"lastFetch":1724015541410},{"username":"kerwanp","name":"Martin Paucot","avatar":"https://avatars.githubusercontent.com/u/36955373?v=4","links":[{"icon":"github","link":"https://github.com/kerwanp"}],"lastFetch":1724015541627}]} \ No newline at end of file diff --git a/docs/openapi-adonis/decorators.md b/docs/openapi-adonis/decorators.md new file mode 100644 index 000000000..b45d46601 --- /dev/null +++ b/docs/openapi-adonis/decorators.md @@ -0,0 +1,7 @@ +--- +title: openapi-adonis +--- + +## `@apiProperty` + + diff --git a/docs/openapi-decorators/decorators.md b/docs/openapi-decorators/decorators.md new file mode 100644 index 000000000..ee1a4c7ff --- /dev/null +++ b/docs/openapi-decorators/decorators.md @@ -0,0 +1,20 @@ +--- +title: Decorators +--- + +# Decorators + +Decorators are used to enrich your OpenAPI specifications. They can be applied on a Controller, a Method or a Model. They are all prefixed with `api`. + +> For more information about the decorators, you can directly refer to the [source code](https://github.com/openapi-ts/openapi-typescript/packages/openapi-decorators/src/decorators). + +| Decorator | Usage | Description | +|-|-|-| +| `@apiProperty` | Model | Configures a schema property. | +| `@apiTags` | Controller / Method | Adds tags to the operation. When applied on a controller, the tags are applied to all of its operations. | +| `@apiOperation` | Method | Configures an operation. | +| `@apiQuery` | Method | Adds a query parameter to the operation. | +| `@apiParam` | Method | Adds a path parameter to the operation. | +| `@apiResponse` | Method | Adds a response to the operation. | +| `@apiBody` | Method | Sets the requestBody of the operation. | + diff --git a/docs/openapi-decorators/index.md b/docs/openapi-decorators/index.md new file mode 100644 index 000000000..8ac17c9fb --- /dev/null +++ b/docs/openapi-decorators/index.md @@ -0,0 +1,194 @@ +--- +title: 'Getting started' +--- + +# Introduction + +`openapi-decorators` is a framework agnostic library to automatically generate OpenAPI schemas and documentation by using Typescript decorators and metadata. + +::: code-group + +```ts [users_controller.ts] +import { apiOperation, apiResponse } from "openapi-adonis/decorators"; +import User from "./user"; + +class UsersController { + @apiOperation({ + method: "get", + pattern: "/users", + summary: "List users" + }) + @apiResponse({ type: [User] }) + async list() { + ... + } +} +``` + +```ts [user.ts] +import { apiProperty } from "openapi-adonis/decorators"; + +class User { + @apiProperty() + declare id: number; + + @apiProperty() + declare name: string; + + @apiProperty({ required: false }) + declare mobile?: string; +} +``` + +```ts [index.ts] +import "reflect-metadata"; +import { DocumentBuilder } from "openapi-decorators/builders"; +import { loadController } from "openapi-decorators/loaders"; +import UsersController from "./users_controller"; + +const builder = new DocumentBuilder() + .setTitle("My API") + .setVersion("1.0.0"); + +await loadController(builder, UsersController); + +console.log(document.build()); // <- Your generated OpenAPI specifications +``` + +::: + +## Getting started + +### Setup + +Install `openapi-decorators` and `reflect-metadata` using your favorite package manager. + +```bash +npm install openapi-decorators reflect-metadata +``` + +Import `reflect-metadata` in your main file. + +::: code-group + +```ts [index.ts] +import "reflect-metadata"; + +// Rest of your app +``` + +::: + +Enable `experimentalDecorators` and `experimentalDecorators`. + + +::: code-group + +```json [tsconfig.json] +{ + "compilerOptions": { + "emitDecoratorMetadata": true, + "experimentalDecorators": true, + } +} +``` + +::: + +### Create your OpenAPI document + +To get started, create a new DocumentBuilder. It will hold all the informations required to generate your OpenAPI specifications. +By using the method `build()` you can already have an (almost) empty documentation. + +::: code-group + +```ts [index.ts] +import "reflect-metadata"; +import { DocumentBuilder } from "openapi-decorators/builders"; + +const builder = new DocumentBuilder() + .setTitle("My API") + .setVersion("1.0.0"); + +console.log(document.build()); // <- Your generated OpenAPI specifications +``` + +::: + +### Create your first model + +Using the `apiProperty` decorator on class properties will allow your operations to use the class as a schema. + +> Unlike other libraries like `@nestjs/swagger`, every element of your OpenAPI schema is lazy-loaded. Your models will only be part of your documentation if it is used. + +::: code-group + +```ts [user.ts] +import { apiProperty } from "openapi-decorators/decorators"; + +class User { + @apiProperty() + declare id: string; + + @apiProperty({ example: "John Doe" }) + declare name: string; + + @apiProperty() + declare email: string; + + @apiProperty({ required: false }) + declare mobile?: string; +} +``` + +::: + +### Create your first controller + +Next we need to define our first operation. We can do this by using a controller. + +In the following example we create an operation `GET /users` that returns a list of `User`. + +::: code-group + +```ts [users_controller.ts] +import { apiOperation, apiResponse } from "openapi-decorators/decorators"; +import User from "./user"; + +class UsersController { + @apiOperation({ + method: "get", + pattern: "/users", + summary: "List users" + }) + @apiResponse({ type: [User] }) + async list() { + ... + } +} +``` + +::: + +### Load the controller into your DocumentBuilder + +You now simply have to load the controller into your DocumentBuilder and tada 🎉. + +::: code-group + +```ts [index.ts] +import "reflect-metadata"; +import { DocumentBuilder } from "openapi-decorators/builders"; +import { loadController } from "openapi-decorators/loaders"; +import UsersController from "./users_controller"; + +const builder = new DocumentBuilder() + .setTitle("My API") + .setVersion("1.0.0"); + +await loadController(builder, UsersController); + +console.log(document.build()); // <- Your generated OpenAPI specifications +``` + +:::