diff --git a/.adonisjs/client/data.d.ts b/.adonisjs/client/data.d.ts
new file mode 100644
index 0000000..ee014a4
--- /dev/null
+++ b/.adonisjs/client/data.d.ts
@@ -0,0 +1,15 @@
+/**
+ * This file is automatically generated.
+ * DO NOT EDIT manually
+ */
+
+///
+import type { InferData, InferVariants } from '@adonisjs/core/types/transformers'
+import type UserTransformer from '#transformers/user_transformer'
+
+export namespace Data {
+ export type User = InferData
+ export namespace User {
+ export type Variants = InferVariants
+ }
+}
diff --git a/.adonisjs/client/manifest.d.ts b/.adonisjs/client/manifest.d.ts
new file mode 100644
index 0000000..27cbe6d
--- /dev/null
+++ b/.adonisjs/client/manifest.d.ts
@@ -0,0 +1,12 @@
+/**
+ * This file is automatically generated.
+ * DO NOT EDIT manually
+ */
+
+///
+///
+///
+///
+///
+///
+///
diff --git a/.adonisjs/client/registry/index.ts b/.adonisjs/client/registry/index.ts
new file mode 100644
index 0000000..298b217
--- /dev/null
+++ b/.adonisjs/client/registry/index.ts
@@ -0,0 +1,47 @@
+/* eslint-disable prettier/prettier */
+import type { AdonisEndpoint } from '@tuyau/core/types'
+import type { Registry } from './schema.d.ts'
+import type { ApiDefinition } from './tree.d.ts'
+
+const placeholder: any = {}
+
+const routes = {
+ 'auth.new_account.store': {
+ methods: ["POST"],
+ pattern: '/api/v1/auth/signup',
+ tokens: [{"old":"/api/v1/auth/signup","type":0,"val":"api","end":""},{"old":"/api/v1/auth/signup","type":0,"val":"v1","end":""},{"old":"/api/v1/auth/signup","type":0,"val":"auth","end":""},{"old":"/api/v1/auth/signup","type":0,"val":"signup","end":""}],
+ types: placeholder as Registry['auth.new_account.store']['types'],
+ },
+ 'auth.access_tokens.store': {
+ methods: ["POST"],
+ pattern: '/api/v1/auth/login',
+ tokens: [{"old":"/api/v1/auth/login","type":0,"val":"api","end":""},{"old":"/api/v1/auth/login","type":0,"val":"v1","end":""},{"old":"/api/v1/auth/login","type":0,"val":"auth","end":""},{"old":"/api/v1/auth/login","type":0,"val":"login","end":""}],
+ types: placeholder as Registry['auth.access_tokens.store']['types'],
+ },
+ 'profile.profile.show': {
+ methods: ["GET","HEAD"],
+ pattern: '/api/v1/account/profile',
+ tokens: [{"old":"/api/v1/account/profile","type":0,"val":"api","end":""},{"old":"/api/v1/account/profile","type":0,"val":"v1","end":""},{"old":"/api/v1/account/profile","type":0,"val":"account","end":""},{"old":"/api/v1/account/profile","type":0,"val":"profile","end":""}],
+ types: placeholder as Registry['profile.profile.show']['types'],
+ },
+ 'profile.access_tokens.destroy': {
+ methods: ["POST"],
+ pattern: '/api/v1/account/logout',
+ tokens: [{"old":"/api/v1/account/logout","type":0,"val":"api","end":""},{"old":"/api/v1/account/logout","type":0,"val":"v1","end":""},{"old":"/api/v1/account/logout","type":0,"val":"account","end":""},{"old":"/api/v1/account/logout","type":0,"val":"logout","end":""}],
+ types: placeholder as Registry['profile.access_tokens.destroy']['types'],
+ },
+} as const satisfies Record
+
+export { routes }
+
+export const registry = {
+ routes,
+ $tree: {} as ApiDefinition,
+}
+
+declare module '@tuyau/core/types' {
+ export interface UserRegistry {
+ routes: typeof routes
+ $tree: ApiDefinition
+ }
+}
diff --git a/.adonisjs/client/registry/schema.d.ts b/.adonisjs/client/registry/schema.d.ts
new file mode 100644
index 0000000..82c02fd
--- /dev/null
+++ b/.adonisjs/client/registry/schema.d.ts
@@ -0,0 +1,58 @@
+/* eslint-disable prettier/prettier */
+///
+
+import type { ExtractBody, ExtractErrorResponse, ExtractQuery, ExtractQueryForGet, ExtractResponse } from '@tuyau/core/types'
+import type { InferInput, SimpleError } from '@vinejs/vine/types'
+
+export type ParamValue = string | number | bigint | boolean
+
+export interface Registry {
+ 'auth.new_account.store': {
+ methods: ["POST"]
+ pattern: '/api/v1/auth/signup'
+ types: {
+ body: ExtractBody>
+ paramsTuple: []
+ params: {}
+ query: ExtractQuery>
+ response: ExtractResponse>>
+ errorResponse: ExtractErrorResponse>> | { status: 422; response: { errors: SimpleError[] } }
+ }
+ }
+ 'auth.access_tokens.store': {
+ methods: ["POST"]
+ pattern: '/api/v1/auth/login'
+ types: {
+ body: ExtractBody>
+ paramsTuple: []
+ params: {}
+ query: ExtractQuery>
+ response: ExtractResponse>>
+ errorResponse: ExtractErrorResponse>> | { status: 422; response: { errors: SimpleError[] } }
+ }
+ }
+ 'profile.profile.show': {
+ methods: ["GET","HEAD"]
+ pattern: '/api/v1/account/profile'
+ types: {
+ body: {}
+ paramsTuple: []
+ params: {}
+ query: {}
+ response: ExtractResponse>>
+ errorResponse: ExtractErrorResponse>>
+ }
+ }
+ 'profile.access_tokens.destroy': {
+ methods: ["POST"]
+ pattern: '/api/v1/account/logout'
+ types: {
+ body: {}
+ paramsTuple: []
+ params: {}
+ query: {}
+ response: ExtractResponse>>
+ errorResponse: ExtractErrorResponse>>
+ }
+ }
+}
diff --git a/.adonisjs/client/registry/tree.d.ts b/.adonisjs/client/registry/tree.d.ts
new file mode 100644
index 0000000..3964805
--- /dev/null
+++ b/.adonisjs/client/registry/tree.d.ts
@@ -0,0 +1,21 @@
+/* eslint-disable prettier/prettier */
+import type { routes } from './index.ts'
+
+export interface ApiDefinition {
+ auth: {
+ newAccount: {
+ store: typeof routes['auth.new_account.store']
+ }
+ accessTokens: {
+ store: typeof routes['auth.access_tokens.store']
+ }
+ }
+ profile: {
+ profile: {
+ show: typeof routes['profile.profile.show']
+ }
+ accessTokens: {
+ destroy: typeof routes['profile.access_tokens.destroy']
+ }
+ }
+}
diff --git a/.adonisjs/server/controllers.ts b/.adonisjs/server/controllers.ts
new file mode 100644
index 0000000..202eb41
--- /dev/null
+++ b/.adonisjs/server/controllers.ts
@@ -0,0 +1,10 @@
+/**
+ * This file is automatically generated.
+ * DO NOT EDIT manually
+ */
+
+export const controllers = {
+ AccessTokens: () => import('#controllers/access_tokens_controller'),
+ NewAccount: () => import('#controllers/new_account_controller'),
+ Profile: () => import('#controllers/profile_controller'),
+}
diff --git a/.adonisjs/server/events.ts b/.adonisjs/server/events.ts
new file mode 100644
index 0000000..a74e59b
--- /dev/null
+++ b/.adonisjs/server/events.ts
@@ -0,0 +1,6 @@
+/**
+ * This file is automatically generated.
+ * DO NOT EDIT manually
+ */
+
+export const events = {}
diff --git a/.adonisjs/server/listeners.ts b/.adonisjs/server/listeners.ts
new file mode 100644
index 0000000..05f35f8
--- /dev/null
+++ b/.adonisjs/server/listeners.ts
@@ -0,0 +1,6 @@
+/**
+ * This file is automatically generated.
+ * DO NOT EDIT manually
+ */
+
+export const listeners = {}
diff --git a/.adonisjs/server/routes.d.ts b/.adonisjs/server/routes.d.ts
new file mode 100644
index 0000000..9aa155f
--- /dev/null
+++ b/.adonisjs/server/routes.d.ts
@@ -0,0 +1,26 @@
+import '@adonisjs/core/types/http'
+
+type ParamValue = string | number | bigint | boolean
+
+export type ScannedRoutes = {
+ ALL: {
+ 'auth.new_account.store': { paramsTuple?: []; params?: {} }
+ 'auth.access_tokens.store': { paramsTuple?: []; params?: {} }
+ 'profile.profile.show': { paramsTuple?: []; params?: {} }
+ 'profile.access_tokens.destroy': { paramsTuple?: []; params?: {} }
+ }
+ GET: {
+ 'profile.profile.show': { paramsTuple?: []; params?: {} }
+ }
+ HEAD: {
+ 'profile.profile.show': { paramsTuple?: []; params?: {} }
+ }
+ POST: {
+ 'auth.new_account.store': { paramsTuple?: []; params?: {} }
+ 'auth.access_tokens.store': { paramsTuple?: []; params?: {} }
+ 'profile.access_tokens.destroy': { paramsTuple?: []; params?: {} }
+ }
+}
+declare module '@adonisjs/core/types/http' {
+ export interface RoutesList extends ScannedRoutes {}
+}
\ No newline at end of file
diff --git a/.editorconfig b/.editorconfig
new file mode 100644
index 0000000..f830f40
--- /dev/null
+++ b/.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/.env.example b/.env.example
new file mode 100644
index 0000000..79a6cf8
--- /dev/null
+++ b/.env.example
@@ -0,0 +1,18 @@
+# Node
+TZ=UTC
+PORT=3333
+HOST=localhost
+NODE_ENV=development
+
+# App
+LOG_LEVEL=info
+APP_KEY=
+APP_URL=http://${HOST}:${PORT}
+
+# Session
+SESSION_DRIVER=cookie
+
+#--------------------------------------------------------------------
+# CORS (configure allowed origins for API access)
+#--------------------------------------------------------------------
+# CORS_ORIGIN=http://localhost:5173,http://localhost:3000
\ No newline at end of file
diff --git a/.env.test b/.env.test
new file mode 100644
index 0000000..28d2da0
--- /dev/null
+++ b/.env.test
@@ -0,0 +1 @@
+SESSION_DRIVER=memory
diff --git a/.gitignore b/.gitignore
index 9ffe97c..dd7579a 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,113 +1,26 @@
-# Logs
-logs
-*.log
-npm-debug.log*
-yarn-debug.log*
-yarn-error.log*
-lerna-debug.log*
+# Dependencies and AdonisJS build
+node_modules
+build
+tmp/*
+!tmp/.gitkeep
-# Diagnostic reports (https://nodejs.org/api/report.html)
-report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json
-
-# Runtime data
-pids
-*.pid
-*.seed
-*.pid.lock
-
-# Directory for instrumented libs generated by jscoverage/JSCover
-lib-cov
-
-# Coverage directory used by tools like istanbul
-coverage
-*.lcov
-
-# nyc test coverage
-.nyc_output
-
-# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-temporary-files)
-.grunt
-
-# Bower dependency directory (https://bower.io/)
-bower_components
-
-# node-waf configuration
-.lock-wscript
-
-# Compiled binary addons (https://nodejs.org/api/addons.html)
-build/Release
-
-# Dependency directories
-node_modules/
-jspm_packages/
-
-# TypeScript v1 declaration files
-typings/
-
-# Optional npm cache directory
-.npm
-
-# Optional eslint cache
-.eslintcache
-
-# Microbundle cache
-.rpt2_cache/
-.rts2_cache_cjs/
-.rts2_cache_es/
-.rts2_cache_umd/
-
-# Optional REPL history
-.node_repl_history
-
-# Output of 'npm pack'
-*.tgz
-
-# Yarn Integrity file
-.yarn-integrity
-
-# dotenv environment variables file
+# Secrets
.env
-.env.test
+.env.local
+.env.production.local
+.env.development.local
-# parcel-bundler cache (https://parceljs.org/)
-.cache
+# Frontend assets compiled code
+public/assets
-# Next.js build output
-.next
+# Build tools specific
+npm-debug.log
+yarn-error.log
-# Nuxt.js build output
-.nuxt
+# Editors specific
+.fleet
+.idea
+.vscode
-# Gatsby files
-.cache/
-# Comment in the public line in if your project uses Gatsby and not Next.js
-# https://nextjs.org/blog/next-9-1#public-directory-support
-# public
-
-# vuepress build output
-.vuepress/dist
-
-# Serverless directories
-.serverless/
-
-# FuseBox cache
-.fusebox/
-
-# DynamoDB Local files
-.dynamodb/
-
-# TernJS port file
-.tern-port
-
-# Stores VSCode versions used for testing VSCode extensions
-.vscode-test
-
-# IDE files
-.idea/
-.vscode/
-*.swp
-database.sqlite
-*.par2
-*.nzb
-files
-*.bin
+# Platform specific
+.DS_Store
diff --git a/.prettierignore b/.prettierignore
new file mode 100644
index 0000000..8e91c7d
--- /dev/null
+++ b/.prettierignore
@@ -0,0 +1,3 @@
+.adonisjs
+node_modules
+build
diff --git a/ace.js b/ace.js
new file mode 100644
index 0000000..0eefd20
--- /dev/null
+++ b/ace.js
@@ -0,0 +1,27 @@
+/*
+|--------------------------------------------------------------------------
+| 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 @poppinss/ts-exec
+ */
+import '@poppinss/ts-exec'
+
+/**
+ * Import ace console entrypoint
+ */
+await import('./bin/console.js')
diff --git a/adonisrc.ts b/adonisrc.ts
new file mode 100644
index 0000000..a96390d
--- /dev/null
+++ b/adonisrc.ts
@@ -0,0 +1,116 @@
+import { indexEntities } from '@adonisjs/core'
+import { defineConfig } from '@adonisjs/core/app'
+import { generateRegistry } from '@tuyau/core/hooks'
+
+export default defineConfig({
+ /*
+ |--------------------------------------------------------------------------
+ | Experimental flags
+ |--------------------------------------------------------------------------
+ |
+ | The following features will be enabled by default in the next major release
+ | of AdonisJS. You can opt into them today to avoid any breaking changes
+ | during upgrade.
+ |
+ */
+ experimental: {},
+
+ /*
+ |--------------------------------------------------------------------------
+ | 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'),
+ () => import('@adonisjs/lucid/commands'),
+ () => import('@adonisjs/session/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/session/session_provider'),
+ () => import('@adonisjs/shield/shield_provider'),
+ () => import('@adonisjs/lucid/database_provider'),
+ () => import('@adonisjs/cors/cors_provider'),
+ () => import('@adonisjs/auth/auth_provider'),
+ () => import('#providers/api_provider'),
+ ],
+
+ /*
+ |--------------------------------------------------------------------------
+ | Preloads
+ |--------------------------------------------------------------------------
+ |
+ | List of modules to import before starting the application.
+ |
+ */
+ preloads: [
+ () => import('#start/routes'),
+ () => import('#start/kernel'),
+ () => import('#start/validator'),
+ ],
+
+ /*
+ |--------------------------------------------------------------------------
+ | 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,
+ },
+
+ /*
+ |--------------------------------------------------------------------------
+ | Metafiles
+ |--------------------------------------------------------------------------
+ |
+ | A collection of files you want to copy to the build folder when creating
+ | the production build.
+ |
+ */
+ metaFiles: [],
+
+ hooks: {
+ init: [
+ indexEntities({
+ transformers: { enabled: true },
+ }),
+ generateRegistry(),
+ ],
+ },
+})
diff --git a/app/controllers/access_tokens_controller.ts b/app/controllers/access_tokens_controller.ts
new file mode 100644
index 0000000..153267c
--- /dev/null
+++ b/app/controllers/access_tokens_controller.ts
@@ -0,0 +1,29 @@
+import User from '#models/user'
+import { loginValidator } from '#validators/user'
+import type { HttpContext } from '@adonisjs/core/http'
+import UserTransformer from '#transformers/user_transformer'
+
+export default class AccessTokensController {
+ async store({ request, serialize }: HttpContext) {
+ const { email, password } = await request.validateUsing(loginValidator)
+
+ const user = await User.verifyCredentials(email, password)
+ const token = await User.accessTokens.create(user)
+
+ return serialize({
+ user: UserTransformer.transform(user),
+ token: token.value!.release(),
+ })
+ }
+
+ async destroy({ auth }: HttpContext) {
+ const user = auth.getUserOrFail()
+ if (user.currentAccessToken) {
+ await User.accessTokens.delete(user, user.currentAccessToken.identifier)
+ }
+
+ return {
+ message: 'Logged out successfully',
+ }
+ }
+}
diff --git a/app/controllers/new_account_controller.ts b/app/controllers/new_account_controller.ts
new file mode 100644
index 0000000..1251fb7
--- /dev/null
+++ b/app/controllers/new_account_controller.ts
@@ -0,0 +1,18 @@
+import User from '#models/user'
+import { signupValidator } from '#validators/user'
+import type { HttpContext } from '@adonisjs/core/http'
+import UserTransformer from '#transformers/user_transformer'
+
+export default class NewAccountController {
+ async store({ request, serialize }: HttpContext) {
+ const { fullName, email, password } = await request.validateUsing(signupValidator)
+
+ const user = await User.create({ fullName, email, password })
+ const token = await User.accessTokens.create(user)
+
+ return serialize({
+ user: UserTransformer.transform(user),
+ token: token.value!.release(),
+ })
+ }
+}
diff --git a/app/controllers/profile_controller.ts b/app/controllers/profile_controller.ts
new file mode 100644
index 0000000..1fe82f2
--- /dev/null
+++ b/app/controllers/profile_controller.ts
@@ -0,0 +1,8 @@
+import UserTransformer from '#transformers/user_transformer'
+import type { HttpContext } from '@adonisjs/core/http'
+
+export default class ProfileController {
+ async show({ auth, serialize }: HttpContext) {
+ return serialize(UserTransformer.transform(auth.getUserOrFail()))
+ }
+}
diff --git a/app/exceptions/handler.ts b/app/exceptions/handler.ts
new file mode 100644
index 0000000..30ddc51
--- /dev/null
+++ b/app/exceptions/handler.ts
@@ -0,0 +1,28 @@
+import app from '@adonisjs/core/services/app'
+import { type 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 a 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/app/middleware/auth_middleware.ts b/app/middleware/auth_middleware.ts
new file mode 100644
index 0000000..8c86950
--- /dev/null
+++ b/app/middleware/auth_middleware.ts
@@ -0,0 +1,20 @@
+import type { HttpContext } from '@adonisjs/core/http'
+import type { NextFn } from '@adonisjs/core/types/http'
+import type { Authenticators } from '@adonisjs/auth/types'
+
+/**
+ * Auth middleware is used authenticate HTTP requests and deny
+ * access to unauthenticated users.
+ */
+export default class AuthMiddleware {
+ async handle(
+ ctx: HttpContext,
+ next: NextFn,
+ options: {
+ guards?: (keyof Authenticators)[]
+ } = {}
+ ) {
+ await ctx.auth.authenticateUsing(options.guards)
+ return next()
+ }
+}
diff --git a/app/middleware/container_bindings_middleware.ts b/app/middleware/container_bindings_middleware.ts
new file mode 100644
index 0000000..8f5322b
--- /dev/null
+++ b/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/app/middleware/force_json_response_middleware.ts b/app/middleware/force_json_response_middleware.ts
new file mode 100644
index 0000000..f46ec9c
--- /dev/null
+++ b/app/middleware/force_json_response_middleware.ts
@@ -0,0 +1,9 @@
+import type { HttpContext } from '@adonisjs/core/http'
+import type { NextFn } from '@adonisjs/core/types/http'
+
+export default class ForceJsonResponseMiddleware {
+ handle(ctx: HttpContext, next: NextFn) {
+ ctx.request.request.headers.accept = 'application/json'
+ return next()
+ }
+}
diff --git a/app/middleware/silent_auth_middleware.ts b/app/middleware/silent_auth_middleware.ts
new file mode 100644
index 0000000..3e46f40
--- /dev/null
+++ b/app/middleware/silent_auth_middleware.ts
@@ -0,0 +1,16 @@
+import type { HttpContext } from '@adonisjs/core/http'
+import type { NextFn } from '@adonisjs/core/types/http'
+
+/**
+ * Silent auth middleware can be used as a global middleware to silent check
+ * if the user is logged-in or not.
+ *
+ * The request continues as usual, even when the user is not logged-in.
+ */
+export default class SilentAuthMiddleware {
+ async handle(ctx: HttpContext, next: NextFn) {
+ await ctx.auth.check()
+
+ return next()
+ }
+}
diff --git a/app/models/base_model.ts b/app/models/base_model.ts
new file mode 100644
index 0000000..44cf9ca
--- /dev/null
+++ b/app/models/base_model.ts
@@ -0,0 +1,4 @@
+import { BaseModel as AdonisBaseModel } from '@adonisjs/lucid/orm'
+
+export default class BaseModel extends AdonisBaseModel {
+}
diff --git a/app/models/file.ts b/app/models/file.ts
new file mode 100644
index 0000000..331ca9d
--- /dev/null
+++ b/app/models/file.ts
@@ -0,0 +1,32 @@
+import { DateTime } from 'luxon'
+import { column } from '@adonisjs/lucid/orm'
+import BaseModel from '#models/base_model'
+
+export default class File extends BaseModel {
+ @column({ isPrimary: true })
+ declare id: number
+
+ @column()
+ declare filename: string
+
+ @column()
+ declare poster: string
+
+ @column()
+ declare date: number
+
+ @column()
+ declare parts: number
+
+ @column({ columnName: 'message_ids' })
+ declare messageIds: Record
+
+ @column()
+ declare groups: string[]
+
+ @column.dateTime({ autoCreate: true })
+ declare createdAt: DateTime
+
+ @column.dateTime({ autoCreate: true, autoUpdate: true })
+ declare updatedAt: DateTime
+}
diff --git a/app/models/group.ts b/app/models/group.ts
new file mode 100644
index 0000000..f1cab96
--- /dev/null
+++ b/app/models/group.ts
@@ -0,0 +1,23 @@
+import { DateTime } from 'luxon'
+import { column } from '@adonisjs/lucid/orm'
+import BaseModel from '#models/base_model'
+
+export default class Group extends BaseModel {
+ @column({ isPrimary: true })
+ declare id: number
+
+ @column()
+ declare name: string
+
+ @column()
+ declare active: boolean
+
+ @column({ columnName: 'last_indexed_id' })
+ declare lastIndexedId: bigint
+
+ @column.dateTime({ autoCreate: true })
+ declare createdAt: DateTime
+
+ @column.dateTime({ autoCreate: true, autoUpdate: true })
+ declare updatedAt: DateTime
+}
diff --git a/app/models/user.ts b/app/models/user.ts
new file mode 100644
index 0000000..7bc5a08
--- /dev/null
+++ b/app/models/user.ts
@@ -0,0 +1,18 @@
+import { UserSchema } from '#database/schema'
+import hash from '@adonisjs/core/services/hash'
+import { compose } from '@adonisjs/core/helpers'
+import { withAuthFinder } from '@adonisjs/auth/mixins/lucid'
+import { type AccessToken, DbAccessTokensProvider } from '@adonisjs/auth/access_tokens'
+
+export default class User extends compose(UserSchema, withAuthFinder(hash)) {
+ static accessTokens = DbAccessTokensProvider.forModel(User)
+ declare currentAccessToken?: AccessToken
+
+ get initials() {
+ const [first, last] = this.fullName ? this.fullName.split(' ') : this.email.split('@')
+ if (first && last) {
+ return `${first.charAt(0)}${last.charAt(0)}`.toUpperCase()
+ }
+ return `${first.slice(0, 2)}`.toUpperCase()
+ }
+}
diff --git a/app/services/NntpService.ts b/app/services/NntpService.ts
new file mode 100644
index 0000000..1daa2b4
--- /dev/null
+++ b/app/services/NntpService.ts
@@ -0,0 +1,72 @@
+import nntpConfig from '#config/nntp'
+import { NNTP } from "nntp-js";
+
+class NntpService {
+ private readonly poolSize: number;
+ private allConnections: Set;
+ private idleConnections: any[];
+ private waiters: ((conn: any) => void)[];
+ private createdCount: number;
+
+ constructor(poolSize = 10) {
+ this.poolSize = poolSize;
+ this.allConnections = new Set();
+ this.idleConnections = [];
+ this.waiters = [];
+ this.createdCount = 0;
+ console.log(`NNTP Pool initialized with size ${this.poolSize}`)
+ }
+
+ private async _createConnection() {
+ // This connection logic is based on the older, working pool implementation.
+ const conn = new NNTP(nntpConfig.host, nntpConfig.port);
+ await conn.connect();
+ if (nntpConfig.user) {
+ await conn.login(nntpConfig.user, nntpConfig.password?.release());
+ }
+ this.allConnections.add(conn);
+ return conn;
+ }
+
+ public async acquire() {
+ if (this.idleConnections.length > 0) {
+ console.log('Reusing existing connection from pool.');
+ return this.idleConnections.pop();
+ }
+
+ if (this.createdCount < this.poolSize) {
+ this.createdCount++;
+ console.log(`Creating new connection (${this.createdCount}/${this.poolSize}).`);
+ return this._createConnection();
+ }
+
+ console.log(`Pool maxed out at ${this.poolSize}. Waiting for a connection to become available.`);
+ return new Promise(resolve => this.waiters.push(resolve));
+ }
+
+ public release(conn: any) {
+ if (this.waiters.length > 0) {
+ console.log('Releasing connection directly to a waiting task.');
+ const resolve = this.waiters.shift();
+ if(resolve) resolve(conn);
+ } else {
+ console.log('Returning connection to the idle pool.');
+ this.idleConnections.push(conn);
+ }
+ }
+
+ public async shutdown() {
+ console.log('Shutting down all connections in the pool.');
+ const shutdownPromises: Promise[] = [];
+ for (const conn of this.allConnections) {
+ shutdownPromises.push(conn.quit());
+ }
+ await Promise.all(shutdownPromises);
+ this.allConnections.clear();
+ this.idleConnections.length = 0;
+ this.waiters.length = 0;
+ this.createdCount = 0;
+ }
+}
+
+export default new NntpService();
diff --git a/app/services/QueueService.ts b/app/services/QueueService.ts
new file mode 100644
index 0000000..5824c11
--- /dev/null
+++ b/app/services/QueueService.ts
@@ -0,0 +1,30 @@
+import { Queue } from 'bullmq'
+import queueConfig from '#config/queue'
+
+class QueueService {
+ public readonly nntpFetchQueue: Queue
+ public readonly headerQueue: Queue
+ public readonly fileQueue: Queue
+ public readonly bodyQueue: Queue
+ public readonly collectionQueue: Queue
+
+ constructor() {
+ this.nntpFetchQueue = new Queue('nntp-fetch-queue', { connection: queueConfig.connection })
+ this.headerQueue = new Queue('header-queue', { connection: queueConfig.connection })
+ this.fileQueue = new Queue('file-queue', { connection: queueConfig.connection })
+ this.bodyQueue = new Queue('body-queue', { connection: queueConfig.connection })
+ this.collectionQueue = new Queue('collection-queue', { connection: queueConfig.connection })
+ }
+
+ async closeAll() {
+ await Promise.all([
+ this.nntpFetchQueue.close(),
+ this.headerQueue.close(),
+ this.fileQueue.close(),
+ this.bodyQueue.close(),
+ this.collectionQueue.close(),
+ ])
+ }
+}
+
+export default new QueueService()
diff --git a/app/services/RedisService.ts b/app/services/RedisService.ts
new file mode 100644
index 0000000..fc75fcd
--- /dev/null
+++ b/app/services/RedisService.ts
@@ -0,0 +1,15 @@
+import { createRequire } from 'module'
+import redisConfig from '#config/redis'
+
+const require = createRequire(import.meta.url)
+const IORedis = require('ioredis')
+
+class RedisService {
+ public readonly client: any
+
+ constructor() {
+ this.client = new IORedis(redisConfig.connections.main)
+ }
+}
+
+export default new RedisService()
diff --git a/app/services/YencFile.ts b/app/services/YencFile.ts
new file mode 100644
index 0000000..e42c795
--- /dev/null
+++ b/app/services/YencFile.ts
@@ -0,0 +1,19 @@
+import { decode } from 'simple-yenc'
+
+export class YencFile {
+ private buffer: Buffer | null = null
+
+ public processPart(partBuffer: Buffer) {
+ // This is a simplified implementation.
+ // simple-yenc's decode function is synchronous and works on a full buffer.
+ // A more complex implementation would handle multi-part decoding.
+ this.buffer = decode(partBuffer)
+ }
+
+ public getBuffer(): Buffer {
+ if (!this.buffer) {
+ throw new Error('No data has been processed yet.')
+ }
+ return this.buffer
+ }
+}
diff --git a/app/services/YencService.ts b/app/services/YencService.ts
new file mode 100644
index 0000000..ca0e01a
--- /dev/null
+++ b/app/services/YencService.ts
@@ -0,0 +1,36 @@
+export function parseYencMeta(buffer: Buffer): { header: Record; crc32?: string } {
+ const text = buffer.toString('latin1')
+ const lines = text.split(/\\r?\\n/)
+
+ const header: Record = {}
+ let crc32: string | undefined
+
+ for (const line of lines) {
+ if (line.startsWith('=ybegin')) {
+ const parts = line.split(' ')
+ parts.forEach((part) => {
+ if (part.includes('=')) {
+ const [key, value] = part.split('=')
+ if (key === 'name') {
+ header[key] = value.trim()
+ } else {
+ header[key] = parseInt(value, 10)
+ }
+ }
+ })
+ } else if (line.startsWith('=ypart')) {
+ const match = /begin=(\d+)/.exec(line)
+ if (match) {
+ header.partBegin = parseInt(match[1], 10)
+ }
+ } else if (line.startsWith('=yend')) {
+ const match = /crc32=([a-fA-F0-9]+)/.exec(line)
+ if (match) {
+ crc32 = match[1]
+ }
+ break // End of yenc data
+ }
+ }
+
+ return { header, crc32 }
+}
diff --git a/app/transformers/user_transformer.ts b/app/transformers/user_transformer.ts
new file mode 100644
index 0000000..c772ff7
--- /dev/null
+++ b/app/transformers/user_transformer.ts
@@ -0,0 +1,15 @@
+import type User from '#models/user'
+import { BaseTransformer } from '@adonisjs/core/transformers'
+
+export default class UserTransformer extends BaseTransformer {
+ toObject() {
+ return this.pick(this.resource, [
+ 'id',
+ 'fullName',
+ 'email',
+ 'createdAt',
+ 'updatedAt',
+ 'initials',
+ ])
+ }
+}
diff --git a/app/validators/user.ts b/app/validators/user.ts
new file mode 100644
index 0000000..5c4ff9a
--- /dev/null
+++ b/app/validators/user.ts
@@ -0,0 +1,26 @@
+import vine from '@vinejs/vine'
+
+/**
+ * Shared rules for email and password.
+ */
+const email = () => vine.string().email().maxLength(254)
+const password = () => vine.string().minLength(8).maxLength(32)
+
+/**
+ * Validator to use when performing self-signup
+ */
+export const signupValidator = vine.create({
+ fullName: vine.string().nullable(),
+ email: email().unique({ table: 'users', column: 'email' }),
+ password: password(),
+ passwordConfirmation: password().sameAs('password'),
+})
+
+/**
+ * Validator to use before validating user credentials
+ * during login
+ */
+export const loginValidator = vine.create({
+ email: email(),
+ password: vine.string(),
+})
diff --git a/bin/console.ts b/bin/console.ts
new file mode 100644
index 0000000..86bf4d2
--- /dev/null
+++ b/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.
+|
+*/
+
+await import('reflect-metadata')
+const { Ignitor, prettyPrintError } = await import('@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/bin/server.ts b/bin/server.ts
new file mode 100644
index 0000000..297b371
--- /dev/null
+++ b/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
+|
+*/
+
+await import('reflect-metadata')
+const { Ignitor, prettyPrintError } = await import('@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/bin/test.ts b/bin/test.ts
new file mode 100644
index 0000000..d759efe
--- /dev/null
+++ b/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/commands/IndexScheduler.ts b/commands/IndexScheduler.ts
new file mode 100644
index 0000000..3367b44
--- /dev/null
+++ b/commands/IndexScheduler.ts
@@ -0,0 +1,85 @@
+import { BaseCommand } from '@adonisjs/core/ace'
+import { CommandOptions } from '@adonisjs/core/types/ace'
+import Group from '#models/group'
+import NntpService from '#services/NntpService'
+import QueueService from '#services/QueueService'
+
+export default class IndexScheduler extends BaseCommand {
+ public static commandName = 'index:scheduler'
+ public static description = 'Periodically checks for new articles and schedules them for fetching.'
+
+ public static options: CommandOptions = {
+ startApp: true,
+ }
+
+ private pool = NntpService
+ private fetchQueue = QueueService.nntpFetchQueue
+
+ public async run() {
+ this.logger.info('Scheduler started. Awaiting tasks...')
+
+ const schedule = async () => {
+ this.logger.info('Checking for new headers...')
+ const groups = await Group.query().where('active', true)
+
+ if (groups.length === 0) {
+ this.logger.info('No active groups to index. Add some via `node ace db:seed` or manually.')
+ return
+ }
+
+ let conn
+ try {
+ conn = await this.pool.acquire()
+
+ for (const group of groups) {
+ try {
+ const groupInfo: any = await conn.group(group.name)
+
+ // nntp-js returns article numbers as strings. We must parse them to BigInts.
+ const firstArticle = BigInt(groupInfo.first)
+ const lastArticle = BigInt(groupInfo.last)
+
+ // lastIndexedId from the database should also be treated as a BigInt.
+ const lastIndexed = group.lastIndexedId ? BigInt(group.lastIndexedId) : null
+
+ const startId = lastIndexed ? lastIndexed + 1n : firstArticle
+
+ if (startId > lastArticle) {
+ this.logger.info(`No new headers for group ${group.name}.`)
+ continue
+ }
+
+ const BATCH_SIZE = 100000n
+ const proposedEndId = startId + BATCH_SIZE - 1n
+ const endId = proposedEndId < lastArticle ? proposedEndId : lastArticle
+
+ this.logger.info(`Queueing fetch job for ${group.name}: articles ${startId} to ${endId}`)
+ await this.fetchQueue.add('fetch-headers', {
+ groupName: group.name,
+ startId: startId.toString(),
+ endId: endId.toString(),
+ })
+
+ group.lastIndexedId = endId
+ await group.save()
+ } catch (err: any) {
+ this.logger.error(`Error processing group ${group.name}: ${err.message}`)
+ }
+ }
+ } catch (err: any) {
+ this.logger.error(`Error in scheduler main loop: ${err.message}`)
+ } finally {
+ if (conn) {
+ this.pool.release(conn)
+ }
+ }
+ }
+
+ // Run once immediately and then on an interval.
+ schedule()
+ setInterval(schedule, 60000) // 1 minute
+
+ // Keep the command running
+ await new Promise(() => {})
+ }
+}
diff --git a/commands/workers/Body.ts b/commands/workers/Body.ts
new file mode 100644
index 0000000..a05815b
--- /dev/null
+++ b/commands/workers/Body.ts
@@ -0,0 +1,74 @@
+import { BaseCommand } from '@adonisjs/core/ace'
+import { CommandOptions } from '@adonisjs/core/types/ace'
+import { Worker } from 'bullmq'
+import fs from 'node:fs/promises'
+import path from 'node:path'
+import queueConfig from '#config/queue'
+import QueueService from '#services/QueueService'
+import NntpService from '#services/NntpService'
+import { parseYencMeta } from '#services/YencService'
+
+export default class BodyWorker extends BaseCommand {
+ public static commandName = 'worker:body'
+ public static description = 'Starts a worker to process article bodies for yEnc metadata.'
+
+ public static options: CommandOptions = {
+ startApp: true,
+ }
+
+ public async run() {
+ this.logger.info('Starting body worker...')
+
+ const pool = NntpService
+ const headerQueue = QueueService.headerQueue
+
+ const worker = new Worker('body-queue', async (job) => {
+ const { header, group } = job.data
+ const messageId = header['message-id']
+ this.logger.debug(`Processing header with unparsable subject: ${header.subject}`)
+
+ let conn
+ try {
+ conn = await pool.acquire()
+ const bodyBuffer: Buffer = (await conn.body(messageId)).data
+
+ try {
+ const meta = parseYencMeta(bodyBuffer)
+ if (meta.header.name) {
+ const { name, part, total } = meta.header
+ const newSubject = `"${name}" yEnc (${part}/${total})`
+ header.subject = newSubject
+
+ this.logger.info(`Found yEnc metadata in body. New subject: ${newSubject}`)
+ await headerQueue.add('process-header', { header, group })
+ } else {
+ this.logger.warning(`Could not find yEnc metadata in body for header: ${header.subject}`)
+ }
+ } catch (parseError: any) {
+ this.logger.error(`Failed to parse yEnc data for message ID ${messageId}. Dumping buffer.`)
+ const debugDir = path.join(this.app.appRoot.pathname, 'debug')
+ await fs.mkdir(debugDir, { recursive: true })
+ const timestamp = new Date().toISOString().replace(/:/g, '-')
+ const dumpFile = path.join(debugDir, `body-error-${timestamp}-${messageId.replace(/[<>]/g, '')}.bin`)
+ await fs.writeFile(dumpFile, bodyBuffer)
+ this.logger.error(`Problematic body buffer saved to: ${dumpFile}`)
+ throw parseError
+ }
+ } catch (error: any) {
+ this.logger.error(`Error in body worker for message ID ${messageId}: ${error.message}`)
+ throw error
+ } finally {
+ if (conn) {
+ pool.release(conn)
+ }
+ }
+ }, { connection: queueConfig.connection })
+
+ worker.on('failed', (job, err) => {
+ this.logger.error(`Body job ${job?.id} failed: ${err.message}`)
+ })
+
+ this.logger.info('Body worker started and listening for jobs.')
+ await new Promise(() => {})
+ }
+}
diff --git a/commands/workers/Collection.ts b/commands/workers/Collection.ts
new file mode 100644
index 0000000..9796181
--- /dev/null
+++ b/commands/workers/Collection.ts
@@ -0,0 +1,80 @@
+import { BaseCommand } from '@adonisjs/core/ace'
+import { CommandOptions } from '@adonisjs/core/types/ace'
+import { Worker } from 'bullmq'
+import queueConfig from '#config/queue'
+import NntpService from '#services/NntpService'
+import { YencFile } from '#services/YencFile'
+import File from '#models/file'
+import { createExtractorFromData } from 'node-unrar-js'
+
+export default class CollectionWorker extends BaseCommand {
+ public static commandName = 'worker:collection'
+ public static description = 'Starts a worker to process file collections (e.g., RAR archives).'
+
+ public static options: CommandOptions = {
+ startApp: true,
+ }
+
+ public async run() {
+ this.logger.info('Starting collection worker...')
+
+ const pool = NntpService
+
+ const worker = new Worker('collection-queue', async (job) => {
+ const { fileId } = job.data
+ this.logger.debug(`Processing file ID ${fileId} for collection.`)
+
+ const file = await File.find(fileId)
+ if (!file) {
+ this.logger.error(`File with ID ${fileId} not found in the database.`)
+ return
+ }
+
+ const RAR_REGEX = /\.part0*1\.rar$/
+ if (RAR_REGEX.test(file.filename)) {
+ this.logger.info(`File "${file.filename}" is the first part of a RAR set.`)
+
+ const firstPart = file.messageIds['1']
+ if (!firstPart || !firstPart.id) {
+ this.logger.error(`Could not find message ID for the first part of file "${file.filename}".`)
+ return
+ }
+
+ let conn
+ try {
+ conn = await pool.acquire()
+ const bodyBuffer = (await conn.body(`<${firstPart.id}>`)).data
+
+ const yencFile = new YencFile()
+ yencFile.processPart(bodyBuffer)
+ const decodedBuffer = yencFile.getBuffer()
+
+ const extractor = await createExtractorFromData({ data: new Uint8Array(decodedBuffer).buffer })
+ const fileList = extractor.getFileList()
+ // In a real implementation, we would save this file list.
+ this.logger.info(`Files in "${file.filename}": ${JSON.stringify(fileList)}`)
+
+ } catch (error: any) {
+ if (error.code === 430) {
+ this.logger.error(`Article not found for first part of RAR set (Message ID: ${firstPart.id})`)
+ } else {
+ this.logger.error(`Error processing RAR file: ${error.message}`)
+ }
+ } finally {
+ if (conn) {
+ pool.release(conn)
+ }
+ }
+ } else {
+ this.logger.debug(`File "${file.filename}" is not the first part of a RAR set.`)
+ }
+ }, { connection: queueConfig.connection })
+
+ worker.on('failed', (job, err) => {
+ this.logger.error(`Collection job ${job?.id} failed: ${err.message}`)
+ })
+
+ this.logger.info('Collection worker started and listening for jobs.')
+ await new Promise(() => {})
+ }
+}
diff --git a/commands/workers/Fetch.ts b/commands/workers/Fetch.ts
new file mode 100644
index 0000000..c92b038
--- /dev/null
+++ b/commands/workers/Fetch.ts
@@ -0,0 +1,69 @@
+import { BaseCommand } from '@adonisjs/core/ace'
+import { CommandOptions } from '@adonisjs/core/types/ace'
+import { Worker } from 'bullmq'
+import queueConfig from '#config/queue'
+import QueueService from '#services/QueueService'
+import NntpService from '#services/NntpService'
+
+export default class FetchWorker extends BaseCommand {
+ public static commandName = 'worker:fetch'
+ public static description = 'Starts a worker to fetch headers from the NNTP server.'
+
+ public static options: CommandOptions = {
+ startApp: true,
+ }
+
+ public async run() {
+ this.logger.info('Starting fetch worker...')
+
+ const pool = NntpService
+ const headerQueue = QueueService.headerQueue
+
+ const worker = new Worker('nntp-fetch-queue', async (job) => {
+ const { groupName, startId, endId } = job.data
+ this.logger.info(`Processing fetch job for ${groupName}, articles ${startId}-${endId}`)
+
+ let conn
+ try {
+ conn = await pool.acquire()
+ await conn.group(groupName)
+ const overview: any = await conn.xover(startId, endId)
+ this.logger.info(`Fetched ${overview.overviews.length} headers from ${groupName}.`)
+
+ if (overview.overviews.length > 0) {
+ const jobs = overview.overviews.map(([id, header]: [number, any]) => {
+ if (!header) {
+ this.logger.warning(`Header is undefined for job ${job.id}`)
+ return null
+ }
+ return {
+ name: 'process-header',
+ data: { header, group: groupName },
+ opts: { jobId: `${groupName}-${id}` },
+ }
+ }).filter(Boolean)
+
+ await headerQueue.addBulk(jobs)
+ this.logger.info(`Added ${jobs.length} header jobs to the queue for ${groupName}.`)
+ }
+ } catch (error: any) {
+ this.logger.error(`Error fetching headers for ${groupName}: ${error.message}`)
+ throw error
+ } finally {
+ if (conn) {
+ pool.release(conn)
+ }
+ }
+ }, {
+ connection: queueConfig.connection,
+ concurrency: 5,
+ })
+
+ worker.on('failed', (job, err) => {
+ this.logger.error(`Fetch job ${job?.id} failed for group ${job?.data.groupName}: ${err.message}`)
+ })
+
+ this.logger.info('Fetch worker started and listening for jobs.')
+ await new Promise(() => {}) // Keep command running
+ }
+}
diff --git a/commands/workers/File.ts b/commands/workers/File.ts
new file mode 100644
index 0000000..b498dfa
--- /dev/null
+++ b/commands/workers/File.ts
@@ -0,0 +1,70 @@
+import { BaseCommand } from '@adonisjs/core/ace'
+import { CommandOptions } from '@adonisjs/core/types/ace'
+import { Worker } from 'bullmq'
+import queueConfig from '#config/queue'
+import QueueService from '#services/QueueService'
+import File from '#models/file'
+
+export default class FileWorker extends BaseCommand {
+ public static commandName = 'worker:file'
+ public static description = 'Starts a worker to process completed files.'
+
+ public static options: CommandOptions = {
+ startApp: true,
+ }
+
+ public async run() {
+ this.logger.info('Starting file worker...')
+
+ const collectionQueue = QueueService.collectionQueue
+
+ const worker = new Worker('file-queue', async (job) => {
+ const { filename, parts, groups } = job.data
+ const partCount = Object.keys(parts).length
+ this.logger.debug(`Processing complete file: "${filename}" with ${partCount} parts.`)
+
+ const firstPart = JSON.parse(Object.values(parts)[0] as string)
+ const poster = firstPart.from
+ const date = new Date(firstPart.date).getTime()
+
+ const messageIds = Object.entries(parts).reduce((acc, [partNumber, partData]) => {
+ const part = JSON.parse(partData as string)
+ const messageId = part['message-id']
+ if (messageId) {
+ acc[partNumber] = {
+ id: messageId.replace(/[<>]/g, ''),
+ size: part[':bytes'],
+ }
+ } else {
+ this.logger.warning(`Message ID not found for part ${partNumber} of file "${filename}"`)
+ }
+ return acc
+ }, {} as Record)
+
+ if (Object.keys(messageIds).length !== partCount) {
+ throw new Error(`Could not process all parts for file "${filename}" due to missing message IDs.`)
+ }
+
+ const file = await File.create({
+ filename,
+ poster,
+ date,
+ parts: partCount,
+ messageIds,
+ groups,
+ })
+
+ this.logger.debug(`Saved file "${filename}" to database with ID: ${file.id}`)
+
+ await collectionQueue.add('process-collection', { fileId: file.id })
+ this.logger.debug(`Added file ID ${file.id} to collection queue.`)
+ }, { connection: queueConfig.connection })
+
+ worker.on('failed', (job, err) => {
+ this.logger.error(`File job ${job?.id} failed: ${err.message}`)
+ })
+
+ this.logger.info('File worker started and listening for jobs.')
+ await new Promise(() => {})
+ }
+}
diff --git a/commands/workers/Header.ts b/commands/workers/Header.ts
new file mode 100644
index 0000000..e53997a
--- /dev/null
+++ b/commands/workers/Header.ts
@@ -0,0 +1,65 @@
+import { BaseCommand } from '@adonisjs/core/ace'
+import { CommandOptions } from '@adonisjs/core/types/ace'
+import { Worker } from 'bullmq'
+import queueConfig from '#config/queue'
+import QueueService from '#services/QueueService'
+import RedisService from '#services/RedisService'
+
+export default class HeaderWorker extends BaseCommand {
+ public static commandName = 'worker:header'
+ public static description = 'Starts a worker to process headers.'
+
+ public static options: CommandOptions = {
+ startApp: true,
+ }
+
+ public async run() {
+ this.logger.info('Starting header worker...')
+
+ const redis = RedisService.client
+ const fileQueue = QueueService.fileQueue
+ const bodyQueue = QueueService.bodyQueue
+
+ const worker = new Worker('header-queue', async (job) => {
+ const { header, group } = job.data
+ if (!header || !header.subject) {
+ this.logger.warning(`Received job with invalid header data. JobID: ${job.id}`)
+ return
+ }
+
+ const subject = header.subject
+ const SUBJECT_REGEX = /"(.+)"(?: yEnc)? \((\d+)\/(\d+)\)/
+ const match = subject.match(SUBJECT_REGEX)
+
+ if (match) {
+ const filename = match[1]
+ const part = parseInt(match[2], 10)
+ const total = parseInt(match[3], 10)
+
+ const fileKey = `file:${filename}`
+ await redis.hset(fileKey, part, JSON.stringify(header))
+
+ const partCount = await redis.hlen(fileKey)
+
+ if (partCount === total) {
+ const fileParts = await redis.hgetall(fileKey)
+ await fileQueue.add('process-file', { filename, parts: fileParts, groups: [group] })
+ await redis.del(fileKey)
+ this.logger.info(`File "${filename}" is complete and moved to file-queue.`)
+ } else {
+ this.logger.info(`Stored part ${part}/${total} for file "${filename}"`)
+ }
+ } else {
+ this.logger.warning(`Could not parse subject: "${subject}". Moving to body-queue.`)
+ await bodyQueue.add('process-body', { header, group })
+ }
+ }, { connection: queueConfig.connection })
+
+ worker.on('failed', (job, err) => {
+ this.logger.error(`Header job ${job?.id} failed: ${err.message}`)
+ })
+
+ this.logger.info('Header worker started and listening for jobs.')
+ await new Promise(() => {})
+ }
+}
diff --git a/config/app.ts b/config/app.ts
new file mode 100644
index 0000000..c03915e
--- /dev/null
+++ b/config/app.ts
@@ -0,0 +1,84 @@
+import env from '#start/env'
+import app from '@adonisjs/core/services/app'
+import { defineConfig } from '@adonisjs/core/http'
+
+/**
+ * The app URL can be used in various places where you want to create absolute
+ * URLs to your application. For example, when sending emails, images should
+ * use absolute URLs.
+ */
+export const appUrl = env.get('APP_URL')
+
+/**
+ * The configuration settings used by the HTTP server
+ */
+export const http = defineConfig({
+ /**
+ * Generate a unique request id for each incoming request.
+ * Useful to correlate logs and debug a request flow.
+ */
+ generateRequestId: true,
+
+ /**
+ * Allow HTTP method spoofing via the "_method" form/query parameter.
+ * This lets HTML forms target PUT/PATCH/DELETE routes while still
+ * submitting with POST.
+ */
+ allowMethodSpoofing: false,
+
+ /**
+ * Enabling async local storage will let you access HTTP context
+ * from anywhere inside your application.
+ */
+ useAsyncLocalStorage: false,
+
+ /**
+ * Redirect configuration controls the behavior of
+ * response.redirect().back() and query string forwarding.
+ */
+ redirect: {
+ /**
+ * When enabled, all redirects automatically carry over the current
+ * request's query string parameters to the redirect destination.
+ * Use withQs(false) to opt out for a specific redirect.
+ */
+ forwardQueryString: true,
+ },
+
+ /**
+ * Manage cookies configuration. The settings for the session id cookie are
+ * defined inside the "config/session.ts" file.
+ */
+ cookie: {
+ /**
+ * Restrict the cookie to a specific domain.
+ * Keep empty to use the current host.
+ */
+ domain: '',
+
+ /**
+ * Restrict the cookie to a URL path. '/' means all routes.
+ */
+ path: '/',
+
+ /**
+ * Default lifetime for cookies managed by the HTTP layer.
+ */
+ maxAge: '2h',
+
+ /**
+ * Prevent JavaScript access to the cookie in the browser.
+ */
+ httpOnly: true,
+
+ /**
+ * Send cookies only over HTTPS in production.
+ */
+ secure: app.inProduction,
+
+ /**
+ * Cross-site policy for cookie sending.
+ */
+ sameSite: 'lax',
+ },
+})
diff --git a/config/auth.ts b/config/auth.ts
new file mode 100644
index 0000000..686e0ae
--- /dev/null
+++ b/config/auth.ts
@@ -0,0 +1,50 @@
+import { defineConfig } from '@adonisjs/auth'
+import { sessionGuard, sessionUserProvider } from '@adonisjs/auth/session'
+import { tokensGuard, tokensUserProvider } from '@adonisjs/auth/access_tokens'
+import type { InferAuthenticators, InferAuthEvents, Authenticators } from '@adonisjs/auth/types'
+
+const authConfig = defineConfig({
+ /**
+ * Default guard used when no guard is explicitly specified.
+ */
+ default: 'api',
+
+ guards: {
+ /**
+ * Token-based guard for stateless API authentication.
+ */
+ api: tokensGuard({
+ provider: tokensUserProvider({
+ tokens: 'accessTokens',
+ model: () => import('#models/user'),
+ }),
+ }),
+
+ /**
+ * Session-based guard for browser authentication.
+ */
+ web: sessionGuard({
+ /**
+ * Enable persistent login using remember-me tokens.
+ */
+ useRememberMeTokens: false,
+
+ provider: sessionUserProvider({
+ model: () => import('#models/user'),
+ }),
+ }),
+ },
+})
+
+export default authConfig
+
+/**
+ * Inferring types from the configured auth
+ * guards.
+ */
+declare module '@adonisjs/auth/types' {
+ export interface Authenticators extends InferAuthenticators {}
+}
+declare module '@adonisjs/core/types' {
+ interface EventsList extends InferAuthEvents {}
+}
diff --git a/config/bodyparser.ts b/config/bodyparser.ts
new file mode 100644
index 0000000..7e836e6
--- /dev/null
+++ b/config/bodyparser.ts
@@ -0,0 +1,78 @@
+import { defineConfig } from '@adonisjs/core/bodyparser'
+
+const bodyParserConfig = defineConfig({
+ /**
+ * Parse request bodies for these HTTP methods.
+ * Keep this aligned with methods that receive payloads in your routes.
+ */
+ allowedMethods: ['POST', 'PUT', 'PATCH', 'DELETE'],
+
+ /**
+ * Config for the "application/x-www-form-urlencoded"
+ * content-type parser.
+ */
+ form: {
+ /**
+ * Normalize empty string values to null.
+ */
+ convertEmptyStringsToNull: true,
+
+ /**
+ * Content types handled by the form parser.
+ */
+ types: ['application/x-www-form-urlencoded'],
+ },
+
+ /**
+ * Config for the JSON parser.
+ */
+ json: {
+ /**
+ * Normalize empty string values to null.
+ */
+ convertEmptyStringsToNull: true,
+
+ /**
+ * Content types handled by the JSON parser.
+ */
+ 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: {
+ /**
+ * Automatically process uploaded files into the system tmp directory.
+ */
+ autoProcess: true,
+
+ /**
+ * Normalize empty string values to null.
+ */
+ convertEmptyStringsToNull: true,
+
+ /**
+ * Routes where multipart processing is handled manually.
+ */
+ processManually: [],
+
+ /**
+ * Maximum accepted payload size for multipart requests.
+ */
+ limit: '20mb',
+
+ /**
+ * Content types handled by the multipart parser.
+ */
+ types: ['multipart/form-data'],
+ },
+})
+
+export default bodyParserConfig
diff --git a/config/cors.ts b/config/cors.ts
new file mode 100644
index 0000000..56f9d5c
--- /dev/null
+++ b/config/cors.ts
@@ -0,0 +1,50 @@
+import app from '@adonisjs/core/services/app'
+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({
+ /**
+ * Enable or disable CORS handling globally.
+ */
+ enabled: true,
+
+ /**
+ * In development, allow every origin to simplify local front/backend setup.
+ * In production, keep an explicit allowlist (empty by default, so no
+ * cross-origin browser access is allowed until configured).
+ */
+ origin: app.inDev ? true : [],
+
+ /**
+ * HTTP methods accepted for cross-origin requests.
+ */
+ methods: ['GET', 'HEAD', 'POST', 'PUT', 'PATCH', 'DELETE'],
+
+ /**
+ * Reflect request headers by default. Use a string array to restrict
+ * allowed headers.
+ */
+ headers: true,
+
+ /**
+ * Response headers exposed to the browser.
+ */
+ exposeHeaders: [],
+
+ /**
+ * Allow cookies/authorization headers on cross-origin requests.
+ */
+ credentials: true,
+
+ /**
+ * Cache CORS preflight response for N seconds.
+ */
+ maxAge: 90,
+})
+
+export default corsConfig
diff --git a/config/database.ts b/config/database.ts
new file mode 100644
index 0000000..f50be91
--- /dev/null
+++ b/config/database.ts
@@ -0,0 +1,132 @@
+import app from '@adonisjs/core/services/app'
+import { defineConfig } from '@adonisjs/lucid'
+import env from '#start/env'
+
+const dbConfig = defineConfig({
+ /**
+ * Default connection used for all queries.
+ */
+ connection: env.get('DB_CONNECTION', 'sqlite'),
+
+ connections: {
+ /**
+ * SQLite connection (default).
+ */
+ sqlite: {
+ client: 'better-sqlite3',
+
+ connection: {
+ filename: app.tmpPath('db.sqlite3'),
+ },
+
+ /**
+ * Required by Knex for SQLite defaults.
+ */
+ useNullAsDefault: true,
+
+ migrations: {
+ /**
+ * Sort migration files naturally by filename.
+ */
+ naturalSort: true,
+
+ /**
+ * Paths containing migration files.
+ */
+ paths: ['database/migrations'],
+ },
+
+ schemaGeneration: {
+ /**
+ * Enable schema generation from Lucid models.
+ */
+ enabled: true,
+
+ /**
+ * Custom schema rules file paths.
+ */
+ rulesPaths: ['./database/schema_rules.js'],
+ },
+ },
+
+ /**
+ * PostgreSQL connection.
+ * Install package to switch: npm install pg
+ */
+ pg: {
+ client: 'pg',
+ connection: {
+ host: env.get('DB_HOST'),
+ port: env.get('DB_PORT'),
+ user: env.get('DB_USER'),
+ password: env.get('DB_PASSWORD')?.release(),
+ database: env.get('DB_DATABASE'),
+ },
+ migrations: {
+ naturalSort: true,
+ paths: ['database/migrations'],
+ },
+ debug: app.inDev,
+ },
+
+ /**
+ * MySQL / MariaDB connection.
+ * Install package to switch: npm install mysql2
+ */
+ // mysql: {
+ // client: 'mysql2',
+ // connection: {
+ // host: env.get('DB_HOST'),
+ // port: env.get('DB_PORT'),
+ // user: env.get('DB_USER'),
+ // password: env.get('DB_PASSWORD'),
+ // database: env.get('DB_DATABASE'),
+ // },
+ // migrations: {
+ // naturalSort: true,
+ // paths: ['database/migrations'],
+ // },
+ // debug: app.inDev,
+ // },
+
+ /**
+ * Microsoft SQL Server connection.
+ * Install package to switch: npm install tedious
+ */
+ // mssql: {
+ // client: 'mssql',
+ // connection: {
+ // server: env.get('DB_HOST'),
+ // port: env.get('DB_PORT'),
+ // user: env.get('DB_USER'),
+ // password: env.get('DB_PASSWORD'),
+ // database: env.get('DB_DATABASE'),
+ // },
+ // migrations: {
+ // naturalSort: true,
+ // paths: ['database/migrations'],
+ // },
+ // debug: app.inDev,
+ // },
+
+ /**
+ * libSQL (Turso) connection.
+ * Install package to switch: npm install @libsql/client
+ */
+ // libsql: {
+ // client: 'libsql',
+ // connection: {
+ // url: env.get('LIBSQL_URL'),
+ // authToken: env.get('LIBSQL_AUTH_TOKEN'),
+ // },
+ // useNullAsDefault: true,
+ // migrations: {
+ // naturalSort: true,
+ // paths: ['database/migrations'],
+ // },
+ // debug: app.inDev,
+ // },
+ },
+})
+
+export default dbConfig
diff --git a/config/encryption.ts b/config/encryption.ts
new file mode 100644
index 0000000..1bb3dc5
--- /dev/null
+++ b/config/encryption.ts
@@ -0,0 +1,34 @@
+import env from '#start/env'
+import { defineConfig, drivers } from '@adonisjs/core/encryption'
+
+const encryptionConfig = defineConfig({
+ /**
+ * Default encryption driver used by the application.
+ */
+ default: 'gcm',
+
+ list: {
+ gcm: drivers.aes256gcm({
+ /**
+ * Keys used for encryption/decryption.
+ * First key encrypts, all keys are tried for decryption.
+ */
+ keys: [env.get('APP_KEY')],
+
+ /**
+ * Stable identifier for this driver.
+ */
+ id: 'gcm',
+ }),
+ },
+})
+
+export default encryptionConfig
+
+/**
+ * Inferring types for the list of encryptors you have configured
+ * in your application.
+ */
+declare module '@adonisjs/core/types' {
+ export interface EncryptorsList extends InferEncryptors {}
+}
diff --git a/config/hash.ts b/config/hash.ts
new file mode 100644
index 0000000..a54c086
--- /dev/null
+++ b/config/hash.ts
@@ -0,0 +1,75 @@
+import { defineConfig, drivers } from '@adonisjs/core/hash'
+
+/**
+ * Hashing configuration.
+ *
+ * This starter uses Node.js scrypt under the hood.
+ * Node.js reference: https://nodejs.org/api/crypto.html#cryptoscryptpassword-salt-keylen-options-callback
+ */
+const hashConfig = defineConfig({
+ /**
+ * Default hasher used by the application.
+ */
+ default: 'scrypt',
+
+ list: {
+ /**
+ * Scrypt is memory-hard, which makes brute-force attacks more expensive.
+ */
+ scrypt: drivers.scrypt({
+ /**
+ * Work factor (Node alias: N / cost).
+ * Higher values increase security and CPU+memory usage.
+ *
+ * Tuning guideline:
+ * - Start with 16384.
+ * - Increase gradually (for example 32768) and benchmark login/signup latency.
+ * - Keep values practical for your slowest production machine.
+ *
+ * Node constraint: value must be a power of two greater than 1.
+ */
+ cost: 16384,
+
+ /**
+ * Block size (Node alias: r / blockSize).
+ * Increases memory and CPU linearly.
+ *
+ * Tuning guideline:
+ * - Keep 8 unless you have a measured reason to change it.
+ * - Raise only with benchmark data, because memory usage grows quickly.
+ */
+ blockSize: 8,
+
+ /**
+ * Parallelization (Node alias: p / parallelization).
+ * Controls how many independent computations are performed.
+ *
+ * Tuning guideline:
+ * - Keep 1 for most applications.
+ * - Increase only after load testing if your infrastructure benefits from it.
+ */
+ parallelization: 1,
+
+ /**
+ * Maximum memory limit in bytes (Node alias: maxmem / maxMemory).
+ * Hashing throws if the estimated memory usage is above this limit.
+ * Node documents the check as approximately: 128 * N * r > maxmem.
+ *
+ * Tuning guideline:
+ * - Keep this aligned with your cost/blockSize choices.
+ * - Increase carefully on memory-constrained environments.
+ */
+ 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/config/logger.ts b/config/logger.ts
new file mode 100644
index 0000000..ba8c96a
--- /dev/null
+++ b/config/logger.ts
@@ -0,0 +1,51 @@
+import env from '#start/env'
+import app from '@adonisjs/core/services/app'
+import { defineConfig, syncDestination, targets } from '@adonisjs/core/logger'
+
+const loggerConfig = defineConfig({
+ /**
+ * Default logger name used by ctx.logger and app logger calls.
+ */
+ default: 'app',
+
+ loggers: {
+ app: {
+ /**
+ * Toggle this logger on/off.
+ */
+ enabled: true,
+
+ /**
+ * Logger name shown in log records.
+ */
+ name: env.get('APP_NAME'),
+
+ /**
+ * Minimum level to output (trace, debug, info, warn, error, fatal).
+ */
+ level: env.get('LOG_LEVEL'),
+
+ /**
+ * Use sync destination in non-production for immediate flush.
+ */
+ destination: !app.inProduction ? await syncDestination() : undefined,
+
+ /**
+ * Configure where logs are written.
+ */
+ transport: {
+ targets: [targets.file({ destination: 1 })],
+ },
+ },
+ },
+})
+
+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/config/nntp.ts b/config/nntp.ts
new file mode 100644
index 0000000..625eebf
--- /dev/null
+++ b/config/nntp.ts
@@ -0,0 +1,9 @@
+import env from '#start/env'
+
+export default {
+ host: env.get('NNTP_HOST'),
+ port: env.get('NNTP_PORT', 119),
+ user: env.get('NNTP_USER'),
+ password: env.get('NNTP_PASSWORD'),
+ secure: env.get('NNTP_SECURE', false),
+}
diff --git a/config/queue.ts b/config/queue.ts
new file mode 100644
index 0000000..440b098
--- /dev/null
+++ b/config/queue.ts
@@ -0,0 +1,8 @@
+import env from '#start/env'
+
+export default {
+ connection: {
+ host: env.get('REDIS_HOST', '127.0.0.1'),
+ port: env.get('REDIS_PORT', 6379),
+ },
+}
diff --git a/config/redis.ts b/config/redis.ts
new file mode 100644
index 0000000..ddef176
--- /dev/null
+++ b/config/redis.ts
@@ -0,0 +1,12 @@
+import env from '#start/env'
+
+export default {
+ connection: 'main',
+ connections: {
+ main: {
+ host: env.get('REDIS_HOST', '127.0.0.1'),
+ port: env.get('REDIS_PORT'),
+ password: env.get('REDIS_PASSWORD')?.release(),
+ },
+ },
+}
diff --git a/config/session.ts b/config/session.ts
new file mode 100644
index 0000000..cc34262
--- /dev/null
+++ b/config/session.ts
@@ -0,0 +1,78 @@
+import env from '#start/env'
+import app from '@adonisjs/core/services/app'
+import { defineConfig, stores } from '@adonisjs/session'
+
+const sessionConfig = defineConfig({
+ /**
+ * Enable or disable session support globally.
+ */
+ enabled: true,
+
+ /**
+ * Cookie name storing the session identifier.
+ */
+ cookieName: 'adonis-session',
+
+ /**
+ * When set to true, the session id cookie will be deleted
+ * once the user closes the browser.
+ */
+ clearWithBrowser: false,
+
+ /**
+ * Define how long to keep the session data alive without
+ * any activity.
+ */
+ age: '2h',
+
+ /**
+ * Configuration for session cookie and the
+ * cookie store.
+ */
+ cookie: {
+ /**
+ * Restrict the cookie to a URL path. '/' means all routes.
+ */
+ path: '/',
+
+ /**
+ * Prevent JavaScript access to the cookie in the browser.
+ */
+ httpOnly: true,
+
+ /**
+ * Send cookies only over HTTPS in production.
+ */
+ secure: app.inProduction,
+
+ /**
+ * Cross-site policy for cookie sending.
+ */
+ sameSite: 'lax',
+ },
+
+ /**
+ * The store to use. Make sure to validate the environment
+ * variable in order to infer the store name without any
+ * errors.
+ */
+ store: env.get('SESSION_DRIVER'),
+
+ /**
+ * List of configured stores. Refer documentation to see
+ * list of available stores and their config.
+ */
+ stores: {
+ /**
+ * Store session data inside encrypted cookies.
+ */
+ cookie: stores.cookie(),
+
+ /**
+ * Store session data inside the configured database.
+ */
+ database: stores.database(),
+ },
+})
+
+export default sessionConfig
diff --git a/config/shield.ts b/config/shield.ts
new file mode 100644
index 0000000..ad1e618
--- /dev/null
+++ b/config/shield.ts
@@ -0,0 +1,95 @@
+import { defineConfig } from '@adonisjs/shield'
+
+const shieldConfig = defineConfig({
+ /**
+ * Configure CSP policies for your app. Refer documentation
+ * to learn more.
+ */
+ csp: {
+ /**
+ * Enable the Content-Security-Policy header.
+ */
+ enabled: false,
+
+ /**
+ * Per-resource CSP directives.
+ */
+ directives: {},
+
+ /**
+ * Report violations without blocking resources.
+ */
+ reportOnly: false,
+ },
+
+ /**
+ * Configure CSRF protection options. Refer documentation
+ * to learn more.
+ */
+ csrf: {
+ /**
+ * Enable CSRF token verification for state-changing requests.
+ */
+ enabled: false,
+
+ /**
+ * Route patterns to exclude from CSRF checks.
+ * Useful for external webhooks or API endpoints.
+ */
+ exceptRoutes: [],
+
+ /**
+ * Expose an encrypted XSRF-TOKEN cookie for frontend HTTP clients.
+ */
+ enableXsrfCookie: true,
+
+ /**
+ * HTTP methods protected by CSRF validation.
+ */
+ methods: ['POST', 'PUT', 'PATCH', 'DELETE'],
+ },
+
+ /**
+ * Control how your website should be embedded inside
+ * iframes.
+ */
+ xFrame: {
+ /**
+ * Enable the X-Frame-Options header.
+ */
+ enabled: true,
+
+ /**
+ * Block all framing attempts. Default value is DENY.
+ */
+ action: 'DENY',
+ },
+
+ /**
+ * Force browser to always use HTTPS.
+ */
+ hsts: {
+ /**
+ * Enable the Strict-Transport-Security header.
+ */
+ enabled: true,
+
+ /**
+ * HSTS policy duration remembered by browsers.
+ */
+ maxAge: '180 days',
+ },
+
+ /**
+ * Disable browsers from sniffing content types and rely only
+ * on the response content-type header.
+ */
+ contentTypeSniffing: {
+ /**
+ * Enable X-Content-Type-Options: nosniff.
+ */
+ enabled: true,
+ },
+})
+
+export default shieldConfig
diff --git a/database/migrations/1761885935168_create_users_table.ts b/database/migrations/1761885935168_create_users_table.ts
new file mode 100644
index 0000000..dbca083
--- /dev/null
+++ b/database/migrations/1761885935168_create_users_table.ts
@@ -0,0 +1,21 @@
+import { BaseSchema } from '@adonisjs/lucid/schema'
+
+export default class extends BaseSchema {
+ protected tableName = 'users'
+
+ async up() {
+ this.schema.createTable(this.tableName, (table) => {
+ table.increments('id').notNullable()
+ table.string('full_name').nullable()
+ table.string('email', 254).notNullable().unique()
+ table.string('password').notNullable()
+
+ table.timestamp('created_at').notNullable()
+ table.timestamp('updated_at').nullable()
+ })
+ }
+
+ async down() {
+ this.schema.dropTable(this.tableName)
+ }
+}
diff --git a/database/migrations/1768620764696_create_access_tokens_table.ts b/database/migrations/1768620764696_create_access_tokens_table.ts
new file mode 100644
index 0000000..a3ce197
--- /dev/null
+++ b/database/migrations/1768620764696_create_access_tokens_table.ts
@@ -0,0 +1,31 @@
+import { BaseSchema } from '@adonisjs/lucid/schema'
+
+export default class extends BaseSchema {
+ protected tableName = 'auth_access_tokens'
+
+ async up() {
+ this.schema.createTable(this.tableName, (table) => {
+ table.increments('id')
+ table
+ .integer('tokenable_id')
+ .notNullable()
+ .unsigned()
+ .references('id')
+ .inTable('users')
+ .onDelete('CASCADE')
+
+ table.string('type').notNullable()
+ table.string('name').nullable()
+ table.string('hash').notNullable()
+ table.text('abilities').notNullable()
+ table.timestamp('created_at')
+ table.timestamp('updated_at')
+ table.timestamp('last_used_at').nullable()
+ table.timestamp('expires_at').nullable()
+ })
+ }
+
+ async down() {
+ this.schema.dropTable(this.tableName)
+ }
+}
diff --git a/database/migrations/1768620764700_create_groups_table.ts b/database/migrations/1768620764700_create_groups_table.ts
new file mode 100644
index 0000000..e3f756e
--- /dev/null
+++ b/database/migrations/1768620764700_create_groups_table.ts
@@ -0,0 +1,21 @@
+import { BaseSchema } from '@adonisjs/lucid/schema'
+
+export default class extends BaseSchema {
+ protected tableName = 'groups'
+
+ async up() {
+ this.schema.createTable(this.tableName, (table) => {
+ table.increments('id')
+ table.string('name').notNullable().unique()
+ table.boolean('active').notNullable().defaultTo(true)
+ table.bigInteger('last_indexed_id').defaultTo(0)
+
+ table.timestamp('created_at', { useTz: true })
+ table.timestamp('updated_at', { useTz: true })
+ })
+ }
+
+ async down() {
+ this.schema.dropTable(this.tableName)
+ }
+}
diff --git a/database/migrations/1768620764710_create_files_table.ts b/database/migrations/1768620764710_create_files_table.ts
new file mode 100644
index 0000000..2e540fc
--- /dev/null
+++ b/database/migrations/1768620764710_create_files_table.ts
@@ -0,0 +1,24 @@
+import { BaseSchema } from '@adonisjs/lucid/schema'
+
+export default class extends BaseSchema {
+ protected tableName = 'files'
+
+ async up() {
+ this.schema.createTable(this.tableName, (table) => {
+ table.increments('id').primary()
+ table.string('filename').notNullable()
+ table.string('poster').notNullable()
+ table.bigInteger('date').notNullable()
+ table.integer('parts').notNullable()
+ table.jsonb('message_ids').notNullable()
+ table.jsonb('groups')
+
+ table.timestamp('created_at', { useTz: true })
+ table.timestamp('updated_at', { useTz: true })
+ })
+ }
+
+ async down() {
+ this.schema.dropTable(this.tableName)
+ }
+}
diff --git a/database/schema.ts b/database/schema.ts
new file mode 100644
index 0000000..7078378
--- /dev/null
+++ b/database/schema.ts
@@ -0,0 +1,90 @@
+/**
+ * This file is automatically generated
+ * DO NOT EDIT manually
+ * Run "node ace migration:run" command to re-generate this file
+ */
+
+import { BaseModel, column } from '@adonisjs/lucid/orm'
+import { DateTime } from 'luxon'
+
+export class AuthAccessTokenSchema extends BaseModel {
+ static $columns = ['abilities', 'createdAt', 'expiresAt', 'hash', 'id', 'lastUsedAt', 'name', 'tokenableId', 'type', 'updatedAt'] as const
+ $columns = AuthAccessTokenSchema.$columns
+ @column()
+ declare abilities: string
+ @column.dateTime({ autoCreate: true })
+ declare createdAt: DateTime | null
+ @column.dateTime()
+ declare expiresAt: DateTime | null
+ @column()
+ declare hash: string
+ @column({ isPrimary: true })
+ declare id: number
+ @column.dateTime()
+ declare lastUsedAt: DateTime | null
+ @column()
+ declare name: string | null
+ @column()
+ declare tokenableId: number
+ @column()
+ declare type: string
+ @column.dateTime({ autoCreate: true, autoUpdate: true })
+ declare updatedAt: DateTime | null
+}
+
+export class FileSchema extends BaseModel {
+ static $columns = ['createdAt', 'date', 'filename', 'groups', 'id', 'messageIds', 'parts', 'poster', 'updatedAt'] as const
+ $columns = FileSchema.$columns
+ @column.dateTime({ autoCreate: true })
+ declare createdAt: DateTime | null
+ @column()
+ declare date: bigint | number
+ @column()
+ declare filename: string
+ @column()
+ declare groups: any | null
+ @column({ isPrimary: true })
+ declare id: number
+ @column()
+ declare messageIds: any
+ @column()
+ declare parts: number
+ @column()
+ declare poster: string
+ @column.dateTime({ autoCreate: true, autoUpdate: true })
+ declare updatedAt: DateTime | null
+}
+
+export class GroupSchema extends BaseModel {
+ static $columns = ['active', 'createdAt', 'id', 'lastIndexedId', 'name', 'updatedAt'] as const
+ $columns = GroupSchema.$columns
+ @column()
+ declare active: boolean
+ @column.dateTime({ autoCreate: true })
+ declare createdAt: DateTime | null
+ @column({ isPrimary: true })
+ declare id: number
+ @column()
+ declare lastIndexedId: bigint | number | null
+ @column()
+ declare name: string
+ @column.dateTime({ autoCreate: true, autoUpdate: true })
+ declare updatedAt: DateTime | null
+}
+
+export class UserSchema extends BaseModel {
+ static $columns = ['createdAt', 'email', 'fullName', 'id', 'password', 'updatedAt'] as const
+ $columns = UserSchema.$columns
+ @column.dateTime({ autoCreate: true })
+ declare createdAt: DateTime
+ @column()
+ declare email: string
+ @column()
+ declare fullName: string | null
+ @column({ isPrimary: true })
+ declare id: number
+ @column({ serializeAs: null })
+ declare password: string
+ @column.dateTime({ autoCreate: true, autoUpdate: true })
+ declare updatedAt: DateTime | null
+}
diff --git a/database/schema_rules.ts b/database/schema_rules.ts
new file mode 100644
index 0000000..1153c92
--- /dev/null
+++ b/database/schema_rules.ts
@@ -0,0 +1,3 @@
+import { type SchemaRules } from '@adonisjs/lucid/types/schema_generator'
+
+export default {} satisfies SchemaRules
diff --git a/database/seeders/group_seeder.ts b/database/seeders/group_seeder.ts
new file mode 100644
index 0000000..77ca0bb
--- /dev/null
+++ b/database/seeders/group_seeder.ts
@@ -0,0 +1,11 @@
+import { BaseSeeder } from '@adonisjs/lucid/seeders'
+import Group from '#models/group'
+
+export default class extends BaseSeeder {
+ async run() {
+ await Group.create({
+ name: 'alt.binaries.test',
+ active: true,
+ })
+ }
+}
\ No newline at end of file
diff --git a/eslint.config.js b/eslint.config.js
new file mode 100644
index 0000000..9be1be3
--- /dev/null
+++ b/eslint.config.js
@@ -0,0 +1,2 @@
+import { configApp } from '@adonisjs/eslint-config'
+export default configApp()
diff --git a/package-lock.json b/package-lock.json
index ec4225c..d788ff7 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,44 +1,1337 @@
{
- "name": "usenet-indexer",
- "version": "1.0.0",
+ "name": "temp_adonis_project",
+ "version": "0.0.0",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
- "name": "usenet-indexer",
- "version": "1.0.0",
- "license": "ISC",
+ "name": "temp_adonis_project",
+ "version": "0.0.0",
+ "license": "MIT",
"dependencies": {
- "bullmq": "^5.77.3",
+ "@adonisjs/auth": "^10.1.0",
+ "@adonisjs/core": "^7.3.3",
+ "@adonisjs/cors": "^3.0.0",
+ "@adonisjs/lucid": "^22.4.2",
+ "@adonisjs/session": "^8.1.0",
+ "@adonisjs/shield": "^9.0.0",
+ "@japa/api-client": "^3.2.1",
+ "@tuyau/core": "^1.2.2",
+ "@vinejs/vine": "^4.4.0",
+ "better-sqlite3": "^12.10.0",
+ "bullmq": "^5.78.0",
"crc": "^4.3.2",
- "dotenv": "^16.3.1",
- "ioredis": "^5.3.2",
+ "ioredis": "5.11.0",
"log4js": "^6.9.1",
+ "luxon": "^3.7.2",
"nntp-js": "^1.0.4",
- "node-unrar-js": "^2.0.0",
+ "node-unrar-js": "^2.0.2",
+ "pg": "^8.21.0",
+ "reflect-metadata": "^0.2.2",
"simple-yenc": "^1.0.4",
- "sqlite": "^5.1.1",
- "sqlite3": "^6.0.1",
- "xmlbuilder2": "^3.1.1",
- "yencode": "^1.0.1"
+ "xmlbuilder2": "^4.0.3",
+ "yencode": "^1.2.4"
+ },
+ "devDependencies": {
+ "@adonisjs/assembler": "^8.4.0",
+ "@adonisjs/eslint-config": "^3.1.0",
+ "@adonisjs/prettier-config": "^1.5.0",
+ "@adonisjs/tsconfig": "^2.0.0",
+ "@japa/assert": "^4.2.0",
+ "@japa/plugin-adonisjs": "^5.2.0",
+ "@japa/runner": "^5.3.0",
+ "@poppinss/ts-exec": "^1.4.4",
+ "@types/luxon": "^3.7.1",
+ "@types/node": "~25.9.1",
+ "eslint": "^10.4.0",
+ "hot-hook": "^1.0.0",
+ "pino-pretty": "^13.1.3",
+ "prettier": "^3.8.3",
+ "typescript": "~6.0.3",
+ "youch": "^4.1.1"
+ }
+ },
+ "node_modules/@adonisjs/ace": {
+ "version": "14.1.0",
+ "resolved": "https://registry.npmjs.org/@adonisjs/ace/-/ace-14.1.0.tgz",
+ "integrity": "sha512-8N8z1YKePBiXz7wLxHFz/HSqjCRSL/9Vzs4XQt8gk8G17u4PXwNncWt0vSgYEcDrvPAt+QOavY1vMeKOOWe29w==",
+ "license": "MIT",
+ "dependencies": {
+ "@poppinss/cliui": "^6.8.0",
+ "@poppinss/hooks": "^7.3.0",
+ "@poppinss/macroable": "^1.1.2",
+ "@poppinss/prompts": "^3.1.6",
+ "@poppinss/utils": "^7.0.1",
+ "fastest-levenshtein": "^1.0.16",
+ "jsonschema": "^1.5.0",
+ "string-width": "^8.2.0",
+ "yargs-parser": "^22.0.0"
+ },
+ "engines": {
+ "node": ">=24.0.0"
+ },
+ "peerDependencies": {
+ "youch": "^4.1.0-beta.11 || ^4.1.0"
+ }
+ },
+ "node_modules/@adonisjs/application": {
+ "version": "9.0.1",
+ "resolved": "https://registry.npmjs.org/@adonisjs/application/-/application-9.0.1.tgz",
+ "integrity": "sha512-bSUC8vcECEr9qvvHeMAhjvH73ngAm5c6kOnEJYNCczP6rgG7AdH03MGtrY2ewKYDyS/QepNpDKj4oVE2XtxVtw==",
+ "license": "MIT",
+ "dependencies": {
+ "@poppinss/hooks": "^7.3.0",
+ "@poppinss/macroable": "^1.1.2",
+ "@poppinss/utils": "^7.0.1",
+ "glob-parent": "^6.0.2",
+ "tempura": "^0.4.1"
+ },
+ "engines": {
+ "node": ">=24.0.0"
+ },
+ "peerDependencies": {
+ "@adonisjs/assembler": "^8.0.0-next.23 || ^8.0.0",
+ "@adonisjs/config": "^6.1.0-next.0 || ^6.0.0",
+ "@adonisjs/fold": "^11.0.0-next.3 || ^11.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@adonisjs/assembler": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@adonisjs/assembler": {
+ "version": "8.4.0",
+ "resolved": "https://registry.npmjs.org/@adonisjs/assembler/-/assembler-8.4.0.tgz",
+ "integrity": "sha512-Nxi6UU2fd/Wq8iLb+FwicK+7ePyvZcmtbJaT25RhGbgSZ2tgbxzaI7YF4TbaLKDIsF48DOcTP0dTfUIcgjBchw==",
+ "devOptional": true,
+ "license": "MIT",
+ "dependencies": {
+ "@adonisjs/env": "^7.0.0",
+ "@antfu/install-pkg": "^1.1.0",
+ "@ast-grep/napi": "^0.42.0",
+ "@poppinss/cliui": "^6.8.1",
+ "@poppinss/hooks": "^7.3.0",
+ "@poppinss/utils": "^7.0.1",
+ "chokidar": "^5.0.0",
+ "dedent": "^1.7.2",
+ "execa": "^9.6.1",
+ "fast-glob": "^3.3.3",
+ "fdir": "^6.5.0",
+ "get-port": "^7.2.0",
+ "get-tsconfig": "^4.13.7",
+ "import-meta-resolve": "^4.2.0",
+ "junk": "^4.0.1",
+ "open": "^11.0.0",
+ "parse-imports": "^3.0.0",
+ "picomatch": "^4.0.4",
+ "pretty-hrtime": "^1.0.3",
+ "tmp-cache": "^1.1.0",
+ "ts-morph": "^27.0.2"
+ },
+ "engines": {
+ "node": ">=24.0.0"
+ },
+ "peerDependencies": {
+ "typescript": "^5.0.0 || ^6.0.0"
+ }
+ },
+ "node_modules/@adonisjs/auth": {
+ "version": "10.1.0",
+ "resolved": "https://registry.npmjs.org/@adonisjs/auth/-/auth-10.1.0.tgz",
+ "integrity": "sha512-H92C4HLWBpvxtQrgnsdWdWfoGu2bM/j+nyk/tHmpxH9ETkNOH0z3dRfEebLJI63vtTDpRp5cwiI0bzn32gUQiA==",
+ "license": "MIT",
+ "dependencies": {
+ "@adonisjs/presets": "^3.0.0",
+ "basic-auth": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=24.0.0"
+ },
+ "peerDependencies": {
+ "@adonisjs/assembler": "^8.0.0-next.26 || ^8.0.0",
+ "@adonisjs/core": "^7.0.0-next.16 || ^7.0.0",
+ "@adonisjs/i18n": "^3.0.0-next.2 || ^3.0.0",
+ "@adonisjs/lucid": "^22.0.0-next.1 || ^22.0.0",
+ "@adonisjs/session": "^8.0.0-next.1 || ^8.0.0",
+ "@japa/api-client": "^3.1.1",
+ "@japa/browser-client": "^2.2.0",
+ "@japa/plugin-adonisjs": "^5.1.0-next.0 || ^5.1.0"
+ },
+ "peerDependenciesMeta": {
+ "@adonisjs/assembler": {
+ "optional": true
+ },
+ "@adonisjs/i18n": {
+ "optional": true
+ },
+ "@adonisjs/lucid": {
+ "optional": true
+ },
+ "@adonisjs/session": {
+ "optional": true
+ },
+ "@japa/api-client": {
+ "optional": true
+ },
+ "@japa/browser-client": {
+ "optional": true
+ },
+ "@japa/plugin-adonisjs": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@adonisjs/bodyparser": {
+ "version": "11.0.4",
+ "resolved": "https://registry.npmjs.org/@adonisjs/bodyparser/-/bodyparser-11.0.4.tgz",
+ "integrity": "sha512-amqMPVFbzxkOoCMbkFs5sC+rTu7cER2rSv+1v8dsGKszolk5lnGuyNjkha1Lqksvw1qykIIbC1fXr37B9WJTdg==",
+ "license": "MIT",
+ "dependencies": {
+ "@poppinss/macroable": "^1.1.2",
+ "@poppinss/middleware": "^3.2.7",
+ "@poppinss/multiparty": "^3.0.0",
+ "@poppinss/qs": "^6.15.0",
+ "@poppinss/utils": "^7.0.1",
+ "file-type": "^22.0.1",
+ "inflation": "^2.1.0",
+ "media-typer": "^1.1.0",
+ "raw-body": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=24.0.0"
+ },
+ "peerDependencies": {
+ "@adonisjs/http-server": "^8.0.0-next.17 || ^8.0.0 || ^9.0.0"
+ }
+ },
+ "node_modules/@adonisjs/config": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/@adonisjs/config/-/config-6.1.0.tgz",
+ "integrity": "sha512-YVDRL8xHCtM6iMnAefOBaz6iXVpojwBPDQWPKxnVSucycYeNGrGitJiLy+cGaeAU7Gjm8al9SJRJt3rRPr5PKg==",
+ "license": "MIT",
+ "dependencies": {
+ "@poppinss/utils": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=24.0.0"
+ }
+ },
+ "node_modules/@adonisjs/core": {
+ "version": "7.3.3",
+ "resolved": "https://registry.npmjs.org/@adonisjs/core/-/core-7.3.3.tgz",
+ "integrity": "sha512-FSrfhuj8rQM96/L3aiVIH2Um9CSHjfJukopaQAyllGGUs/ct1bQZb3pursMRunYXnpEJzbX+YC/oCP4QcMEXog==",
+ "license": "MIT",
+ "dependencies": {
+ "@adonisjs/ace": "^14.1.0",
+ "@adonisjs/application": "^9.0.0",
+ "@adonisjs/bodyparser": "^11.0.2",
+ "@adonisjs/config": "^6.1.0",
+ "@adonisjs/env": "^7.0.0",
+ "@adonisjs/events": "^10.2.0",
+ "@adonisjs/fold": "^11.0.0",
+ "@adonisjs/hash": "^10.1.0",
+ "@adonisjs/health": "^3.1.0",
+ "@adonisjs/http-server": "^9.0.0",
+ "@adonisjs/http-transformers": "^2.3.1",
+ "@adonisjs/logger": "^7.1.1",
+ "@adonisjs/repl": "^5.0.0",
+ "@boringnode/encryption": "^1.0.0",
+ "@poppinss/colors": "^4.1.6",
+ "@poppinss/dumper": "^0.7.0",
+ "@poppinss/macroable": "^1.1.2",
+ "@poppinss/utils": "^7.0.1",
+ "@sindresorhus/is": "^8.1.0",
+ "@types/he": "^1.2.3",
+ "error-stack-parser-es": "^1.0.5",
+ "he": "^1.2.0",
+ "pretty-hrtime": "^1.0.3",
+ "string-width": "^8.2.1"
+ },
+ "bin": {
+ "adonis-kit": "build/toolkit/main.js"
+ },
+ "engines": {
+ "node": ">=24.0.0"
+ },
+ "peerDependencies": {
+ "@adonisjs/assembler": "^8.0.0-next.23 || ^8.0.0",
+ "@vinejs/vine": "^4.0.0",
+ "argon2": "^0.44.0",
+ "bcrypt": "^6.0.0",
+ "edge.js": "^6.2.0",
+ "pino-pretty": "^13.1.3",
+ "youch": "^4.1.0-beta.13 || ^4.1.0"
+ },
+ "peerDependenciesMeta": {
+ "@adonisjs/assembler": {
+ "optional": true
+ },
+ "@vinejs/vine": {
+ "optional": true
+ },
+ "argon2": {
+ "optional": true
+ },
+ "bcrypt": {
+ "optional": true
+ },
+ "edge.js": {
+ "optional": true
+ },
+ "pino-pretty": {
+ "optional": true
+ },
+ "youch": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@adonisjs/cors": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/@adonisjs/cors/-/cors-3.0.0.tgz",
+ "integrity": "sha512-S3LS+zZ2SziwVvilnkKg4DjmU+df1xqdZRDSQjUKJr5hYEOVAlnci0kHTiz2szxB+QiseQXr/XfN/D5ooMMlYQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=18.16.0"
+ },
+ "peerDependencies": {
+ "@adonisjs/assembler": "^8.0.0-next.7 || ^8.0.0",
+ "@adonisjs/core": "^7.0.0-next.0 || ^7.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@adonisjs/assembler": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@adonisjs/env": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/@adonisjs/env/-/env-7.0.0.tgz",
+ "integrity": "sha512-9lSGONI4B1E7LxyVZiUd1yCH9BOri4Ybp4b9x3ojT9AkKfYwqvj4S2USIvFAlkE7eHUC2WMvPgMLX17342Y3ww==",
+ "license": "MIT",
+ "dependencies": {
+ "@poppinss/utils": "^7.0.0",
+ "@poppinss/validator-lite": "^2.1.2",
+ "split-lines": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=24.0.0"
+ }
+ },
+ "node_modules/@adonisjs/eslint-config": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/@adonisjs/eslint-config/-/eslint-config-3.1.0.tgz",
+ "integrity": "sha512-vybyTN/doUTh8mmbontXG1Qi2n32VHb2rqRQ72T40cWym+qMwJhKTwi64TBJTuo2Lg1lnjXrouc9e9VDDrIcPQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@adonisjs/eslint-plugin": "^2.2.2",
+ "@stylistic/eslint-plugin": "^5.10.0",
+ "eslint-config-prettier": "^10.1.8",
+ "eslint-plugin-prettier": "^5.5.5",
+ "eslint-plugin-unicorn": "^64.0.0",
+ "typescript-eslint": "^8.60.0"
+ },
+ "peerDependencies": {
+ "eslint": "^9.9.0 || ^10.0.0",
+ "eslint-plugin-react": "^7.37.5",
+ "eslint-plugin-react-hooks": "^7.1.1",
+ "eslint-plugin-vue": "^10.9.1",
+ "prettier": "^3.8.1"
+ },
+ "peerDependenciesMeta": {
+ "eslint-plugin-react": {
+ "optional": true
+ },
+ "eslint-plugin-react-hooks": {
+ "optional": true
+ },
+ "eslint-plugin-vue": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@adonisjs/eslint-plugin": {
+ "version": "2.2.2",
+ "resolved": "https://registry.npmjs.org/@adonisjs/eslint-plugin/-/eslint-plugin-2.2.2.tgz",
+ "integrity": "sha512-OAIrljEpbhyikG+BQ8r7195GoRDPmMEBUfSfr6ajM6IPtQMPAb/oKzeXF8XTy2CxupUoGhMd2n8+sx/pgL1m4g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/utils": "^8.56.0",
+ "micromatch": "^4.0.8",
+ "read-package-up": "^12.0.0"
+ },
+ "engines": {
+ "node": ">=20.6.0"
+ },
+ "peerDependencies": {
+ "eslint": "^9.9.1 || ^10.0.0"
+ }
+ },
+ "node_modules/@adonisjs/events": {
+ "version": "10.2.0",
+ "resolved": "https://registry.npmjs.org/@adonisjs/events/-/events-10.2.0.tgz",
+ "integrity": "sha512-SzwzbmTLsybSZd47zZMZ3df7puwhY7D8vZ5Uy79SiHjLKbr2eVzUuKjjoYB6/0pZu6IwK9Qx06dI43sl+tLoDw==",
+ "license": "MIT",
+ "dependencies": {
+ "@poppinss/utils": "^7.0.0",
+ "@sindresorhus/is": "^7.2.0",
+ "emittery": "^1.2.0"
+ },
+ "engines": {
+ "node": ">=24.0.0"
+ },
+ "peerDependencies": {
+ "@adonisjs/application": "^9.0.0-next.14 || ^9.0.0",
+ "@adonisjs/fold": "^11.0.0-next.4 || ^11.0.0"
+ }
+ },
+ "node_modules/@adonisjs/events/node_modules/@sindresorhus/is": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-7.2.0.tgz",
+ "integrity": "sha512-P1Cz1dWaFfR4IR+U13mqqiGsLFf1KbayybWwdd2vfctdV6hDpUkgCY0nKOLLTMSoRd/jJNjtbqzf13K8DCCXQw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sindresorhus/is?sponsor=1"
+ }
+ },
+ "node_modules/@adonisjs/fold": {
+ "version": "11.0.0",
+ "resolved": "https://registry.npmjs.org/@adonisjs/fold/-/fold-11.0.0.tgz",
+ "integrity": "sha512-RnmDPWz2imVp/B74xitxCPqTdoP07bZvfJe1bh9CD9Rmia4jjDvehZF67KFyGNMZ24MuKasqs3jOcM1vGJp0GA==",
+ "license": "MIT",
+ "dependencies": {
+ "@poppinss/utils": "^7.0.0",
+ "parse-imports": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=24.0.0"
+ }
+ },
+ "node_modules/@adonisjs/hash": {
+ "version": "10.1.0",
+ "resolved": "https://registry.npmjs.org/@adonisjs/hash/-/hash-10.1.0.tgz",
+ "integrity": "sha512-lW0lGwpscu9PUo3Sb3PF580jYU29I9wsPn3dIKzZbTVedqkpaNpBK3YKedwZYkDpYmiyYXi08eTTNhdWjiGLQw==",
+ "license": "MIT",
+ "dependencies": {
+ "@phc/format": "^1.0.0",
+ "@poppinss/utils": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=20.6.0"
+ },
+ "peerDependencies": {
+ "argon2": "^0.31.2 || ^0.41.0 || ^0.43.0 || ^0.44.0",
+ "bcrypt": "^5.1.1 || ^6.0.0"
+ },
+ "peerDependenciesMeta": {
+ "argon2": {
+ "optional": true
+ },
+ "bcrypt": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@adonisjs/health": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/@adonisjs/health/-/health-3.1.0.tgz",
+ "integrity": "sha512-m3doBnSwi/l9v1DO79xmjAoSPl9b2XCp+crGwF8QUlhe5CgWgtfnL0SeFNEiZGliD3c4gYdihKz4Pnydctva8A==",
+ "license": "MIT",
+ "dependencies": {
+ "@poppinss/utils": "^7.0.0",
+ "check-disk-space": "^3.4.0"
+ },
+ "engines": {
+ "node": ">=24.0.0"
+ }
+ },
+ "node_modules/@adonisjs/http-server": {
+ "version": "9.0.2",
+ "resolved": "https://registry.npmjs.org/@adonisjs/http-server/-/http-server-9.0.2.tgz",
+ "integrity": "sha512-x+kfbX8wzy/p2TgbhhnQ5E93/eIioIII0cgOH9l0nqlYRktJkFR0PvH+RmvvX05OVhkt+TZ0jz2t+2EgreDkaw==",
+ "license": "MIT",
+ "dependencies": {
+ "@poppinss/macroable": "^1.1.2",
+ "@poppinss/matchit": "^3.2.0",
+ "@poppinss/middleware": "^3.2.7",
+ "@poppinss/qs": "^6.15.0",
+ "@poppinss/utils": "^7.0.1",
+ "@sindresorhus/is": "^8.1.0",
+ "content-disposition": "^1.1.0",
+ "cookie-es": "^3.1.1",
+ "destroy": "^1.2.0",
+ "encodeurl": "^2.0.0",
+ "etag": "^1.8.1",
+ "fresh": "^0.5.2",
+ "mime-types": "^3.0.2",
+ "on-finished": "^2.4.1",
+ "proxy-addr": "^2.0.7",
+ "tmp-cache": "^1.1.0",
+ "type-is": "^2.1.0",
+ "vary": "^1.1.2"
+ },
+ "engines": {
+ "node": ">=24.0.0"
+ },
+ "peerDependencies": {
+ "@adonisjs/application": "^9.0.0-next.14 || ^9.0.0",
+ "@adonisjs/events": "^10.1.0-next.4 || ^10.1.0",
+ "@adonisjs/fold": "^11.0.0-next.4 || ^11.0.0",
+ "@adonisjs/logger": "^7.1.0-next.3 || ^7.1.0",
+ "@boringnode/encryption": "^0.2.0 || ^1.0.0",
+ "youch": "^4.1.0-beta.13 || ^4.1.0"
+ },
+ "peerDependenciesMeta": {
+ "youch": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@adonisjs/http-transformers": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/@adonisjs/http-transformers/-/http-transformers-2.3.1.tgz",
+ "integrity": "sha512-N3gBcKyoPHDeVvVIedTzc+ARSUURwNGTPid/e3iLdM4v/myoSnXd76FL/GGzMmjfqqxegpjI2IEMibG7ylrKSQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@poppinss/exception": "^1.2.3",
+ "@poppinss/types": "^1.2.1"
+ },
+ "engines": {
+ "node": ">=24.0.0"
+ },
+ "peerDependencies": {
+ "@adonisjs/fold": "^11.0.0-next.2"
+ }
+ },
+ "node_modules/@adonisjs/logger": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/@adonisjs/logger/-/logger-7.1.1.tgz",
+ "integrity": "sha512-MmUlp8xBMT6zZy0+vnQcQjHIlNfU4pUJARlINr7Bqha9BvhIn03QZgJL5QJ+kJe1tl6ZpNAryoRTJUiOk/wINQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@poppinss/utils": "^7.0.0",
+ "abstract-logging": "^2.0.1",
+ "pino": "^10.3.1"
+ },
+ "engines": {
+ "node": ">=24.0.0"
+ },
+ "peerDependencies": {
+ "pino-pretty": "^13.1.1"
+ },
+ "peerDependenciesMeta": {
+ "pino-pretty": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@adonisjs/lucid": {
+ "version": "22.4.2",
+ "resolved": "https://registry.npmjs.org/@adonisjs/lucid/-/lucid-22.4.2.tgz",
+ "integrity": "sha512-3ztENqBQIFSGAWREHKCGbL1g4ehtsxxsuFX72Uf5bq+oSc0D6UcumjzYpU8TPyBxhmgS6HuRSfz2rG42iuz7AA==",
+ "license": "MIT",
+ "dependencies": {
+ "@adonisjs/presets": "^3.0.0",
+ "@faker-js/faker": "^10.4.0",
+ "@poppinss/hooks": "^7.3.0",
+ "@poppinss/macroable": "^1.1.2",
+ "@poppinss/qs": "^6.15.0",
+ "@poppinss/utils": "^7.0.1",
+ "deepmerge": "^4.3.1",
+ "fast-deep-equal": "^3.1.3",
+ "igniculus": "^1.5.0",
+ "kleur": "^4.1.5",
+ "knex": "^3.2.8",
+ "knex-dynamic-connection": "^5.0.1",
+ "pretty-hrtime": "^1.0.3",
+ "slash": "^5.1.0",
+ "tarn": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=24.0.0"
+ },
+ "peerDependencies": {
+ "@adonisjs/assembler": "^8.0.0-next.29 || ^8.0.0",
+ "@adonisjs/core": "^7.0.0-next.21 || ^7.0.0",
+ "@vinejs/vine": "^3.0.0 || ^4.0.0",
+ "luxon": "^3.4.4"
+ },
+ "peerDependenciesMeta": {
+ "@adonisjs/assembler": {
+ "optional": true
+ },
+ "@vinejs/vine": {
+ "optional": true
+ },
+ "luxon": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@adonisjs/presets": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/@adonisjs/presets/-/presets-3.0.0.tgz",
+ "integrity": "sha512-+gVIvyEiM7jiN5Gb93200TAC8ed3vZIPfxFFo0pIVgX8k40BleuYhWxFhI6TPocVXXIIpw2JuMFV2Pqjk36W2A==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=24.0.0"
+ },
+ "peerDependencies": {
+ "@adonisjs/assembler": "^8.0.0-next.9 || ^8.0.0",
+ "@adonisjs/core": "^7.0.0-next.1 || ^7.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@adonisjs/assembler": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@adonisjs/prettier-config": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/@adonisjs/prettier-config/-/prettier-config-1.5.0.tgz",
+ "integrity": "sha512-im5V503HAaWSqmDWXV3k40KMCXvgurGNExkjGjvEkl2N7Wp+RcBN3pC6PAWUA1j4iukp4azzuuuR2tPFgnIkbA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "prettier-edge": "^1.0.0"
+ }
+ },
+ "node_modules/@adonisjs/repl": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/@adonisjs/repl/-/repl-5.0.0.tgz",
+ "integrity": "sha512-cPp0w5svYUA3M1gdxQBO2Mx5g+SZfPweqKCAxk7C1Os/Qu67JKgWqXqNnl1q0Tzv/l0L19Ms1C7ivzQxeBNajg==",
+ "license": "MIT",
+ "dependencies": {
+ "@poppinss/colors": "^4.1.6",
+ "string-width": "^8.2.0"
+ },
+ "engines": {
+ "node": ">=24.0.0"
+ }
+ },
+ "node_modules/@adonisjs/session": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/@adonisjs/session/-/session-8.1.0.tgz",
+ "integrity": "sha512-hTd5m49Ro8XhxVQN0yyCeDOihDhj+mFIVltzeWPXkCxK19JHAtA++TAygxSUEhvcm56IVS43XWNE1lNIOPjMJA==",
+ "license": "MIT",
+ "dependencies": {
+ "@poppinss/macroable": "^1.1.2",
+ "@poppinss/utils": "^7.0.1"
+ },
+ "engines": {
+ "node": ">=24.0.0"
+ },
+ "peerDependencies": {
+ "@adonisjs/assembler": "^8.0.0-next.26 || ^8.0.0",
+ "@adonisjs/core": "^7.0.0-next.16 || ^7.0.0",
+ "@adonisjs/lucid": "^22.0.0-next.0 || ^22.0.0",
+ "@adonisjs/redis": "^10.0.0-next.2 || ^10.0.0",
+ "@aws-sdk/client-dynamodb": "^3.955.0",
+ "@aws-sdk/util-dynamodb": "^3.955.0",
+ "@japa/api-client": "^3.1.0",
+ "@japa/browser-client": "^2.0.3",
+ "@japa/plugin-adonisjs": "^5.1.0-next.0 || ^5.1.0",
+ "edge.js": "^6.4.0"
+ },
+ "peerDependenciesMeta": {
+ "@adonisjs/assembler": {
+ "optional": true
+ },
+ "@adonisjs/lucid": {
+ "optional": true
+ },
+ "@adonisjs/redis": {
+ "optional": true
+ },
+ "@aws-sdk/client-dynamodb": {
+ "optional": true
+ },
+ "@aws-sdk/util-dynamodb": {
+ "optional": true
+ },
+ "@japa/api-client": {
+ "optional": true
+ },
+ "@japa/browser-client": {
+ "optional": true
+ },
+ "@japa/plugin-adonisjs": {
+ "optional": true
+ },
+ "edge.js": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@adonisjs/shield": {
+ "version": "9.0.0",
+ "resolved": "https://registry.npmjs.org/@adonisjs/shield/-/shield-9.0.0.tgz",
+ "integrity": "sha512-RmupWRspYGyzS/fAC0QspL7+Uhp6IaidvxE4CYbuqO43PBPCxhC47VjXML720B8hcps7ClK9RWjdMiJkUrn7fA==",
+ "license": "MIT",
+ "dependencies": {
+ "csrf": "^3.1.0"
+ },
+ "engines": {
+ "node": ">=24.0.0"
+ },
+ "peerDependencies": {
+ "@adonisjs/assembler": "^8.0.0-next.26 || ^8.0.0",
+ "@adonisjs/core": "^7.0.0-next.16 || ^7.0.0",
+ "@adonisjs/i18n": "^3.0.0-next.2 || ^3.0.0",
+ "@adonisjs/session": "^8.0.0-next.1 || ^8.0.0",
+ "@japa/api-client": "^3.1.1",
+ "@japa/plugin-adonisjs": "^5.1.0-next.0 || ^5.1.0",
+ "edge.js": "^6.4.0"
+ },
+ "peerDependenciesMeta": {
+ "@adonisjs/assembler": {
+ "optional": true
+ },
+ "@adonisjs/i18n": {
+ "optional": true
+ },
+ "@japa/api-client": {
+ "optional": true
+ },
+ "@japa/plugin-adonisjs": {
+ "optional": true
+ },
+ "edge.js": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@adonisjs/tsconfig": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/@adonisjs/tsconfig/-/tsconfig-2.0.0.tgz",
+ "integrity": "sha512-Uz8qvB6KR9otCh9zei2VEj7tPwdsrT7R+voYoN4tUfEijWRdTNgJ8d1CtyLKHaggCCOwZIwZLVklV/h2FDHgNw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@antfu/install-pkg": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@antfu/install-pkg/-/install-pkg-1.1.0.tgz",
+ "integrity": "sha512-MGQsmw10ZyI+EJo45CdSER4zEb+p31LpDAFp2Z3gkSd1yqVZGi0Ebx++YTEMonJy4oChEMLsxZ64j8FH6sSqtQ==",
+ "devOptional": true,
+ "license": "MIT",
+ "dependencies": {
+ "package-manager-detector": "^1.3.0",
+ "tinyexec": "^1.0.1"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ }
+ },
+ "node_modules/@arr/every": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@arr/every/-/every-1.0.1.tgz",
+ "integrity": "sha512-UQFQ6SgyJ6LX42W8rHCs8KVc0JS0tzVL9ct4XYedJukskYVWTo49tNiMEK9C2HTyarbNiT/RVIRSY82vH+6sTg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/@ast-grep/napi": {
+ "version": "0.42.3",
+ "resolved": "https://registry.npmjs.org/@ast-grep/napi/-/napi-0.42.3.tgz",
+ "integrity": "sha512-iWuH84nptrXpfrpYAsc93CD6JRnyRLYWFRzP9j1KRMK2hspVMBCbmfRyEoMd2B572dd2sSF3eXIQvY/CqIxYmQ==",
+ "devOptional": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 10"
+ },
+ "optionalDependencies": {
+ "@ast-grep/napi-darwin-arm64": "0.42.3",
+ "@ast-grep/napi-darwin-x64": "0.42.3",
+ "@ast-grep/napi-linux-arm64-gnu": "0.42.3",
+ "@ast-grep/napi-linux-arm64-musl": "0.42.3",
+ "@ast-grep/napi-linux-x64-gnu": "0.42.3",
+ "@ast-grep/napi-linux-x64-musl": "0.42.3",
+ "@ast-grep/napi-win32-arm64-msvc": "0.42.3",
+ "@ast-grep/napi-win32-ia32-msvc": "0.42.3",
+ "@ast-grep/napi-win32-x64-msvc": "0.42.3"
+ }
+ },
+ "node_modules/@ast-grep/napi-darwin-arm64": {
+ "version": "0.42.3",
+ "resolved": "https://registry.npmjs.org/@ast-grep/napi-darwin-arm64/-/napi-darwin-arm64-0.42.3.tgz",
+ "integrity": "sha512-pcTBI8UiNQ9xVOYfu3Ww5KXcrrHV/jJqECQ6efpJpzTGwW+mOpzgihfrq5GKjbMONhr0OaRARCMwEsvKgBXCpA==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@ast-grep/napi-darwin-x64": {
+ "version": "0.42.3",
+ "resolved": "https://registry.npmjs.org/@ast-grep/napi-darwin-x64/-/napi-darwin-x64-0.42.3.tgz",
+ "integrity": "sha512-mQeDYeMWUruf0oiYJejzRzG9BEXjopbhPML8rJombviX6ePmulNjh6SDX/Mxe+vqNGt0JHXgdYtsAtDu9d0LQg==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@ast-grep/napi-linux-arm64-gnu": {
+ "version": "0.42.3",
+ "resolved": "https://registry.npmjs.org/@ast-grep/napi-linux-arm64-gnu/-/napi-linux-arm64-gnu-0.42.3.tgz",
+ "integrity": "sha512-T2/8eEvFTKSEXd9Dql34/bsyWogFYh7IGsuOoqYNJOcYwT+TPCLTWPZdcpGqrdYdTYT92qX+4H0dUmaZ+TuOPw==",
+ "cpu": [
+ "arm64"
+ ],
+ "libc": [
+ "glibc"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@ast-grep/napi-linux-arm64-musl": {
+ "version": "0.42.3",
+ "resolved": "https://registry.npmjs.org/@ast-grep/napi-linux-arm64-musl/-/napi-linux-arm64-musl-0.42.3.tgz",
+ "integrity": "sha512-O/K4p/GB5MiK2NE8s7pCBDpZ0EOUrMkMF0HbZKi/HIXH9HQdkoYYO+NqKumk92YNr3gUo8fkGkIG6v4wowANvQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "libc": [
+ "musl"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@ast-grep/napi-linux-x64-gnu": {
+ "version": "0.42.3",
+ "resolved": "https://registry.npmjs.org/@ast-grep/napi-linux-x64-gnu/-/napi-linux-x64-gnu-0.42.3.tgz",
+ "integrity": "sha512-HnljxyLZmt7t7al46j/j/fLj7e9qG8Nlk6/vrj+AD6nRqoeu7pW4YHcQA9NXst79GBz2CU0nba1WEtjUfkNgGg==",
+ "cpu": [
+ "x64"
+ ],
+ "libc": [
+ "glibc"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@ast-grep/napi-linux-x64-musl": {
+ "version": "0.42.3",
+ "resolved": "https://registry.npmjs.org/@ast-grep/napi-linux-x64-musl/-/napi-linux-x64-musl-0.42.3.tgz",
+ "integrity": "sha512-6WLvV3ErwWXQcpMS4BEVjD7QiTGO2Hr3LuDouQoUUBSMu9gI0bBAZGQaqGfWidI+aXYZ0eL5KmCCDB4X6Oyskg==",
+ "cpu": [
+ "x64"
+ ],
+ "libc": [
+ "musl"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@ast-grep/napi-win32-arm64-msvc": {
+ "version": "0.42.3",
+ "resolved": "https://registry.npmjs.org/@ast-grep/napi-win32-arm64-msvc/-/napi-win32-arm64-msvc-0.42.3.tgz",
+ "integrity": "sha512-LiDOhkvBEeXi+yJomrfUYgnLvCntrWianruKXMzIK1QpxWmFSVC2uwWacMbq2v/DTk0MlQ09225yD6sAuL5pEQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@ast-grep/napi-win32-ia32-msvc": {
+ "version": "0.42.3",
+ "resolved": "https://registry.npmjs.org/@ast-grep/napi-win32-ia32-msvc/-/napi-win32-ia32-msvc-0.42.3.tgz",
+ "integrity": "sha512-DOAzKQPWQF42a9jgvCz4ajitARcMm9j2xKzcSNwkgZjrconAsRphqCTG3qkfEXX2x7KaVHAqoUp4XgPZXZ5vlA==",
+ "cpu": [
+ "ia32"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@ast-grep/napi-win32-x64-msvc": {
+ "version": "0.42.3",
+ "resolved": "https://registry.npmjs.org/@ast-grep/napi-win32-x64-msvc/-/napi-win32-x64-msvc-0.42.3.tgz",
+ "integrity": "sha512-1bl5eAbRGI5VRlKzXVPiq+sFJezh60O3ur6G+w8elA20uEZ7ik+WLQZu9T5tScFxOfCQQcjV9v4fQiaGNgHJsA==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@babel/code-frame": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz",
+ "integrity": "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-validator-identifier": "^7.29.7",
+ "js-tokens": "^4.0.0",
+ "picocolors": "^1.1.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-validator-identifier": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz",
+ "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@borewit/text-codec": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/@borewit/text-codec/-/text-codec-0.2.2.tgz",
+ "integrity": "sha512-DDaRehssg1aNrH4+2hnj1B7vnUGEjU6OIlyRdkMd0aUdIUvKXrJfXsy8LVtXAy7DRvYVluWbMspsRhz2lcW0mQ==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/Borewit"
+ }
+ },
+ "node_modules/@boringnode/encryption": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/@boringnode/encryption/-/encryption-1.0.0.tgz",
+ "integrity": "sha512-wGGOE7ywA4W6KAVoVC7s1P4ULzFLIQA/JvthGAa41EA0CaH7kGGawkBB5t5tvWopgBNMhOpIg3uxvULxqf2rQw==",
+ "license": "MIT",
+ "dependencies": {
+ "@poppinss/utils": "^7.0.0-next.7"
+ },
+ "engines": {
+ "node": ">=20.6"
+ }
+ },
+ "node_modules/@colors/colors": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz",
+ "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==",
+ "license": "MIT",
+ "optional": true,
+ "engines": {
+ "node": ">=0.1.90"
+ }
+ },
+ "node_modules/@eslint-community/eslint-utils": {
+ "version": "4.9.1",
+ "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz",
+ "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "eslint-visitor-keys": "^3.4.3"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0"
+ }
+ },
+ "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": {
+ "version": "3.4.3",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz",
+ "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/@eslint-community/regexpp": {
+ "version": "4.12.2",
+ "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz",
+ "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^12.0.0 || ^14.0.0 || >=16.0.0"
+ }
+ },
+ "node_modules/@eslint/config-array": {
+ "version": "0.23.5",
+ "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.23.5.tgz",
+ "integrity": "sha512-Y3kKLvC1dvTOT+oGlqNQ1XLqK6D1HU2YXPc52NmAlJZbMMWDzGYXMiPRJ8TYD39muD/OTjlZmNJ4ib7dvSrMBA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@eslint/object-schema": "^3.0.5",
+ "debug": "^4.3.1",
+ "minimatch": "^10.2.4"
+ },
+ "engines": {
+ "node": "^20.19.0 || ^22.13.0 || >=24"
+ }
+ },
+ "node_modules/@eslint/config-helpers": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.6.0.tgz",
+ "integrity": "sha512-ii6Bw9jJ2zi2cWA2Z+9/QZ/+3DX6kwaV5Q986D/CdP3Lap3w/pgQZ373FV7byY/i7L4IRH/G43I5dz1ClsCbpA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@eslint/core": "^1.2.1"
+ },
+ "engines": {
+ "node": "^20.19.0 || ^22.13.0 || >=24"
+ }
+ },
+ "node_modules/@eslint/core": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/@eslint/core/-/core-1.2.1.tgz",
+ "integrity": "sha512-MwcE1P+AZ4C6DWlpin/OmOA54mmIZ/+xZuJiQd4SyB29oAJjN30UW9wkKNptW2ctp4cEsvhlLY/CsQ1uoHDloQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@types/json-schema": "^7.0.15"
+ },
+ "engines": {
+ "node": "^20.19.0 || ^22.13.0 || >=24"
+ }
+ },
+ "node_modules/@eslint/object-schema": {
+ "version": "3.0.5",
+ "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-3.0.5.tgz",
+ "integrity": "sha512-vqTaUEgxzm+YDSdElad6PiRoX4t8VGDjCtt05zn4nU810UIx/uNEV7/lZJ6KwFThKZOzOxzXy48da+No7HZaMw==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": "^20.19.0 || ^22.13.0 || >=24"
+ }
+ },
+ "node_modules/@eslint/plugin-kit": {
+ "version": "0.7.2",
+ "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.7.2.tgz",
+ "integrity": "sha512-+CNAzxglkrpNf/kKywqQfk74QjtceuOE7Qm+AF8miRvPF/wmmK5+OJOgVh3AVTT3RP2mH3+FOaxlE5v72owk0A==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@eslint/core": "^1.2.1",
+ "levn": "^0.4.1"
+ },
+ "engines": {
+ "node": "^20.19.0 || ^22.13.0 || >=24"
+ }
+ },
+ "node_modules/@faker-js/faker": {
+ "version": "10.4.0",
+ "resolved": "https://registry.npmjs.org/@faker-js/faker/-/faker-10.4.0.tgz",
+ "integrity": "sha512-sDBWI3yLy8EcDzgobvJTWq1MJYzAkQdpjXuPukga9wXonhpMRvd1Izuo2Qgwey2OiEoRIBr35RMU9HJRoOHzpw==",
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/fakerjs"
+ }
+ ],
+ "license": "MIT",
+ "engines": {
+ "node": "^20.19.0 || ^22.13.0 || ^23.5.0 || >=24.0.0",
+ "npm": ">=10"
+ }
+ },
+ "node_modules/@humanfs/core": {
+ "version": "0.19.2",
+ "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.2.tgz",
+ "integrity": "sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@humanfs/types": "^0.15.0"
+ },
+ "engines": {
+ "node": ">=18.18.0"
+ }
+ },
+ "node_modules/@humanfs/node": {
+ "version": "0.16.8",
+ "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.8.tgz",
+ "integrity": "sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@humanfs/core": "^0.19.2",
+ "@humanfs/types": "^0.15.0",
+ "@humanwhocodes/retry": "^0.4.0"
+ },
+ "engines": {
+ "node": ">=18.18.0"
+ }
+ },
+ "node_modules/@humanfs/types": {
+ "version": "0.15.0",
+ "resolved": "https://registry.npmjs.org/@humanfs/types/-/types-0.15.0.tgz",
+ "integrity": "sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=18.18.0"
+ }
+ },
+ "node_modules/@humanwhocodes/module-importer": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz",
+ "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=12.22"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/nzakas"
+ }
+ },
+ "node_modules/@humanwhocodes/retry": {
+ "version": "0.4.3",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz",
+ "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=18.18"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/nzakas"
}
},
"node_modules/@ioredis/commands": {
- "version": "1.5.1",
- "resolved": "https://registry.npmjs.org/@ioredis/commands/-/commands-1.5.1.tgz",
- "integrity": "sha512-JH8ZL/ywcJyR9MmJ5BNqZllXNZQqQbnVZOqpPQqE1vHiFgAw4NHbvE0FOduNU8IX9babitBT46571OnPTT0Zcw==",
+ "version": "1.10.0",
+ "resolved": "https://registry.npmjs.org/@ioredis/commands/-/commands-1.10.0.tgz",
+ "integrity": "sha512-UmeW7z4LfctwoQ5wkhVzgq8tXkreED2xZGpX+Bg+zA+WJFZCT6c062AfCK/Dfk81xZnnwdhJCUMkitihRaoC2Q==",
"license": "MIT"
},
- "node_modules/@isaacs/fs-minipass": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz",
- "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==",
- "license": "ISC",
+ "node_modules/@japa/api-client": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/@japa/api-client/-/api-client-3.2.1.tgz",
+ "integrity": "sha512-dICbeEkgGRpjkm3CviOpvPfYMBZddaoW2w20pgNMm3CfvD2bixWOFn6FBRZRq5L+fHYe/O/xfSNGMCQBFy7Zlw==",
+ "license": "MIT",
"dependencies": {
- "minipass": "^7.0.4"
+ "@poppinss/hooks": "^7.3.0",
+ "@poppinss/macroable": "^1.1.0",
+ "@poppinss/qs": "^6.15.0",
+ "@types/superagent": "^8.1.9",
+ "cookie-es": "^2.0.0",
+ "set-cookie-parser": "^2.7.2",
+ "superagent": "^10.3.0"
},
"engines": {
- "node": ">=18.0.0"
+ "node": ">=18.16.0"
+ },
+ "peerDependencies": {
+ "@japa/assert": "^2.0.0 || ^3.0.0 || ^4.0.0",
+ "@japa/openapi-assertions": "^0.1.1",
+ "@japa/runner": "^3.1.2 || ^4.0.0 || ^5.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@japa/assert": {
+ "optional": true
+ },
+ "@japa/openapi-assertions": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@japa/api-client/node_modules/cookie-es": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/cookie-es/-/cookie-es-2.0.1.tgz",
+ "integrity": "sha512-aVf4A4hI2w70LnF7GG+7xDQUkliwiXWXFvTjkip4+b64ygDQ2sJPRSKFDHbxn8o0xu9QzPkMuuiWIXyFSE2slA==",
+ "license": "MIT"
+ },
+ "node_modules/@japa/assert": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/@japa/assert/-/assert-4.2.0.tgz",
+ "integrity": "sha512-Krgrcee01BN1StlVwK5JQP6LL5t3DE3uFNbfFoDTfW7kQuHB0xh6yfaV0hrgcoiEjsqmm2OOsVWeju9aXK4vIA==",
+ "devOptional": true,
+ "license": "MIT",
+ "dependencies": {
+ "@poppinss/macroable": "^1.1.0",
+ "@types/chai": "^5.2.3",
+ "assertion-error": "^2.0.1",
+ "chai": "^6.2.1"
+ },
+ "engines": {
+ "node": ">=18.16.0"
+ },
+ "peerDependencies": {
+ "@japa/runner": "^3.1.2 || ^4.0.0 || ^5.0.0"
+ }
+ },
+ "node_modules/@japa/core": {
+ "version": "10.4.0",
+ "resolved": "https://registry.npmjs.org/@japa/core/-/core-10.4.0.tgz",
+ "integrity": "sha512-1zvKL29i7r/4jqTNBsw91hk1tp6wbqFXvyV2p+Og4axDRhIXjSAfauRvBL9QuB80bOa+pDIMQ5kCTaCplSm0Eg==",
+ "license": "MIT",
+ "dependencies": {
+ "@poppinss/hooks": "^7.3.0",
+ "@poppinss/macroable": "^1.1.0",
+ "@poppinss/string": "^1.7.1",
+ "async-retry": "^1.3.3",
+ "emittery": "^1.2.0",
+ "string-width": "^8.1.0"
+ },
+ "engines": {
+ "node": ">=24.0.0"
+ }
+ },
+ "node_modules/@japa/errors-printer": {
+ "version": "4.1.4",
+ "resolved": "https://registry.npmjs.org/@japa/errors-printer/-/errors-printer-4.1.4.tgz",
+ "integrity": "sha512-ogPT87QLaugKyPVcq+ZypcetVeJpXZN7RfVRlRDIrSHsHBw6ILCtNXghVxD9POjqxtUM7RON3sUkgZzLnVQA5g==",
+ "license": "MIT",
+ "dependencies": {
+ "@poppinss/colors": "^4.1.6",
+ "jest-diff": "^30.2.0",
+ "supports-color": "^10.2.2",
+ "youch": "^4.1.0-beta.13"
+ },
+ "engines": {
+ "node": ">=18.16.0"
+ }
+ },
+ "node_modules/@japa/plugin-adonisjs": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/@japa/plugin-adonisjs/-/plugin-adonisjs-5.2.0.tgz",
+ "integrity": "sha512-Knk3X/UeZiEvkXmTj9+dAIOdJHMqRUJFsUMw9y8at+AR1VbPJR9T+aU5SaOn6OtejEFnUMILwJYC3ohg23+vhw==",
+ "devOptional": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18.16.0"
+ },
+ "peerDependencies": {
+ "@adonisjs/core": "^7.0.0-next.21 || ^7.0.0",
+ "@japa/api-client": "^3.1.0",
+ "@japa/browser-client": "^2.2.0",
+ "@japa/runner": "^4.0.0 || ^5.0.0",
+ "playwright": "^1.57.0"
+ },
+ "peerDependenciesMeta": {
+ "@japa/api-client": {
+ "optional": true
+ },
+ "@japa/browser-client": {
+ "optional": true
+ },
+ "playwright": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@japa/runner": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/@japa/runner/-/runner-5.3.0.tgz",
+ "integrity": "sha512-WCnTd1q2EpbKKa96NzL16kVxJXVLRj1VqbswNAn17hYSuMlNKKhPGNbAosB32QZVFcoe9fv4Ebh1HtjyAT/viw==",
+ "license": "MIT",
+ "dependencies": {
+ "@japa/core": "^10.4.0",
+ "@japa/errors-printer": "^4.1.4",
+ "@poppinss/colors": "^4.1.6",
+ "@poppinss/hooks": "^7.3.0",
+ "@poppinss/string": "^1.7.1",
+ "@poppinss/utils": "^7.0.0-next.6",
+ "error-stack-parser-es": "^1.0.5",
+ "find-cache-directory": "^6.0.0",
+ "getopts": "^2.3.0",
+ "supports-color": "^10.2.2",
+ "timekeeper": "^2.3.1"
+ },
+ "engines": {
+ "node": ">=18.16.0"
+ }
+ },
+ "node_modules/@jest/diff-sequences": {
+ "version": "30.4.0",
+ "resolved": "https://registry.npmjs.org/@jest/diff-sequences/-/diff-sequences-30.4.0.tgz",
+ "integrity": "sha512-zOpzlfUs45l6u7jm39qr87JCHUDsaeCtvL+kQe/Vn9jSnRB4/5IPXISm0h9I1vZW/o00Kn4UTJ2MOlhnUGwv3g==",
+ "license": "MIT",
+ "engines": {
+ "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
+ }
+ },
+ "node_modules/@jest/get-type": {
+ "version": "30.1.0",
+ "resolved": "https://registry.npmjs.org/@jest/get-type/-/get-type-30.1.0.tgz",
+ "integrity": "sha512-eMbZE2hUnx1WV0pmURZY9XoXPkUYjpc55mb0CrhtdWLtzMQPFvu/rZkTLZFTsdaVQa+Tr4eWAteqcUzoawq/uA==",
+ "license": "MIT",
+ "engines": {
+ "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
+ }
+ },
+ "node_modules/@jest/schemas": {
+ "version": "30.4.1",
+ "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-30.4.1.tgz",
+ "integrity": "sha512-i6b4qw5qnP8c5FEeBJg/uZQ4ddrkN6Ca8qISJh0pr7a5hfn3h3v5x60BEbOC7OYAGZNMs1LfFLwnW2CuK8F57Q==",
+ "license": "MIT",
+ "dependencies": {
+ "@sinclair/typebox": "^0.34.0"
+ },
+ "engines": {
+ "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
}
},
"node_modules/@msgpackr-extract/msgpackr-extract-darwin-arm64": {
@@ -119,71 +1412,1262 @@
"win32"
]
},
- "node_modules/@oozcitak/dom": {
- "version": "1.15.10",
- "resolved": "https://registry.npmjs.org/@oozcitak/dom/-/dom-1.15.10.tgz",
- "integrity": "sha512-0JT29/LaxVgRcGKvHmSrUTEvZ8BXvZhGl2LASRUgHqDTC1M5g1pLmVv56IYNyt3bG2CUjDkc67wnyZC14pbQrQ==",
+ "node_modules/@noble/hashes": {
+ "version": "1.8.0",
+ "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.8.0.tgz",
+ "integrity": "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==",
+ "license": "MIT",
+ "engines": {
+ "node": "^14.21.3 || >=16"
+ },
+ "funding": {
+ "url": "https://paulmillr.com/funding/"
+ }
+ },
+ "node_modules/@nodelib/fs.scandir": {
+ "version": "2.1.5",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
+ "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
+ "devOptional": true,
"license": "MIT",
"dependencies": {
- "@oozcitak/infra": "1.0.8",
- "@oozcitak/url": "1.0.4",
- "@oozcitak/util": "8.3.8"
+ "@nodelib/fs.stat": "2.0.5",
+ "run-parallel": "^1.1.9"
},
"engines": {
- "node": ">=8.0"
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@nodelib/fs.stat": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
+ "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
+ "devOptional": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@nodelib/fs.walk": {
+ "version": "1.2.8",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
+ "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
+ "devOptional": true,
+ "license": "MIT",
+ "dependencies": {
+ "@nodelib/fs.scandir": "2.1.5",
+ "fastq": "^1.6.0"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@oozcitak/dom": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/@oozcitak/dom/-/dom-2.0.2.tgz",
+ "integrity": "sha512-GjpKhkSYC3Mj4+lfwEyI1dqnsKTgwGy48ytZEhm4A/xnH/8z9M3ZVXKr/YGQi3uCLs1AEBS+x5T2JPiueEDW8w==",
+ "license": "MIT",
+ "dependencies": {
+ "@oozcitak/infra": "^2.0.2",
+ "@oozcitak/url": "^3.0.0",
+ "@oozcitak/util": "^10.0.0"
+ },
+ "engines": {
+ "node": ">=20.0"
}
},
"node_modules/@oozcitak/infra": {
- "version": "1.0.8",
- "resolved": "https://registry.npmjs.org/@oozcitak/infra/-/infra-1.0.8.tgz",
- "integrity": "sha512-JRAUc9VR6IGHOL7OGF+yrvs0LO8SlqGnPAMqyzOuFZPSZSXI7Xf2O9+awQPSMXgIWGtgUf/dA6Hs6X6ySEaWTg==",
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/@oozcitak/infra/-/infra-2.0.2.tgz",
+ "integrity": "sha512-2g+E7hoE2dgCz/APPOEK5s3rMhJvNxSMBrP+U+j1OWsIbtSpWxxlUjq1lU8RIsFJNYv7NMlnVsCuHcUzJW+8vA==",
"license": "MIT",
"dependencies": {
- "@oozcitak/util": "8.3.8"
+ "@oozcitak/util": "^10.0.0"
},
"engines": {
- "node": ">=6.0"
+ "node": ">=20.0"
}
},
"node_modules/@oozcitak/url": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/@oozcitak/url/-/url-1.0.4.tgz",
- "integrity": "sha512-kDcD8y+y3FCSOvnBI6HJgl00viO/nGbQoCINmQ0h98OhnGITrWR3bOGfwYCthgcrV8AnTJz8MzslTQbC3SOAmw==",
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/@oozcitak/url/-/url-3.0.0.tgz",
+ "integrity": "sha512-ZKfET8Ak1wsLAiLWNfFkZc/BraDccuTJKR6svTYc7sVjbR+Iu0vtXdiDMY4o6jaFl5TW2TlS7jbLl4VovtAJWQ==",
"license": "MIT",
"dependencies": {
- "@oozcitak/infra": "1.0.8",
- "@oozcitak/util": "8.3.8"
+ "@oozcitak/infra": "^2.0.2",
+ "@oozcitak/util": "^10.0.0"
},
"engines": {
- "node": ">=8.0"
+ "node": ">=20.0"
}
},
"node_modules/@oozcitak/util": {
- "version": "8.3.8",
- "resolved": "https://registry.npmjs.org/@oozcitak/util/-/util-8.3.8.tgz",
- "integrity": "sha512-T8TbSnGsxo6TDBJx/Sgv/BlVJL3tshxZP7Aq5R1mSnM5OcHY2dQaxLMu2+E8u3gN0MLOzdjurqN4ZRVuzQycOQ==",
+ "version": "10.0.0",
+ "resolved": "https://registry.npmjs.org/@oozcitak/util/-/util-10.0.0.tgz",
+ "integrity": "sha512-hAX0pT/73190NLqBPPWSdBVGtbY6VOhWYK3qqHqtXQ1gK7kS2yz4+ivsN07hpJ6I3aeMtKP6J6npsEKOAzuTLA==",
"license": "MIT",
"engines": {
- "node": ">=8.0"
+ "node": ">=20.0"
}
},
- "node_modules/abbrev": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-4.0.0.tgz",
- "integrity": "sha512-a1wflyaL0tHtJSmLSOVybYhy22vRih4eduhhrkcjgrWGnRfrZtovJ2FRjxuTtkkj47O/baf0R86QU5OuYpz8fA==",
- "license": "ISC",
- "optional": true,
+ "node_modules/@paralleldrive/cuid2": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/@paralleldrive/cuid2/-/cuid2-2.3.1.tgz",
+ "integrity": "sha512-XO7cAxhnTZl0Yggq6jOgjiOHhbgcO4NqFqwSmQpjK3b6TEE6Uj/jfSk6wzYyemh3+I0sHirKSetjQwn5cZktFw==",
+ "license": "MIT",
+ "dependencies": {
+ "@noble/hashes": "^1.1.5"
+ }
+ },
+ "node_modules/@phc/format": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/@phc/format/-/format-1.0.0.tgz",
+ "integrity": "sha512-m7X9U6BG2+J+R1lSOdCiITLLrxm+cWlNI3HUFA92oLO77ObGNzaKdh8pMLqdZcshtkKuV84olNNXDfMc4FezBQ==",
+ "license": "MIT",
"engines": {
- "node": "^20.17.0 || >=22.9.0"
+ "node": ">=10"
+ }
+ },
+ "node_modules/@pinojs/redact": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/@pinojs/redact/-/redact-0.4.0.tgz",
+ "integrity": "sha512-k2ENnmBugE/rzQfEcdWHcCY+/FM3VLzH9cYEsbdsoqrvzAKRhUZeRNhAZvB8OitQJ1TBed3yqWtdjzS6wJKBwg==",
+ "license": "MIT"
+ },
+ "node_modules/@pkgr/core": {
+ "version": "0.3.6",
+ "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.3.6.tgz",
+ "integrity": "sha512-SEeaJLb3qBNF/OaXnaR1NmmBbFYk1zC0ZH/52fATcRPLFg/p791YrcyFFy44Bo9sLaGuSuLp5Q6axbb/O+v/RA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^14.18.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/pkgr"
+ }
+ },
+ "node_modules/@poppinss/cliui": {
+ "version": "6.8.1",
+ "resolved": "https://registry.npmjs.org/@poppinss/cliui/-/cliui-6.8.1.tgz",
+ "integrity": "sha512-o/ssbwr+r6woG65rk9eFHnn9dVUphZr/Rk+4+05ENVMBWYpYhTJGdE9RobTG5JLFubvO4gWIyFeNlC+I4EM6eA==",
+ "license": "MIT",
+ "dependencies": {
+ "@poppinss/colors": "^4.1.6",
+ "cli-boxes": "^4.0.1",
+ "cli-table3": "^0.6.5",
+ "cli-truncate": "^5.2.0",
+ "log-update": "^7.2.0",
+ "pretty-hrtime": "^1.0.3",
+ "string-width": "^8.2.0",
+ "supports-color": "^10.2.2",
+ "terminal-size": "^4.0.1"
+ }
+ },
+ "node_modules/@poppinss/colors": {
+ "version": "4.1.6",
+ "resolved": "https://registry.npmjs.org/@poppinss/colors/-/colors-4.1.6.tgz",
+ "integrity": "sha512-H9xkIdFswbS8n1d6vmRd8+c10t2Qe+rZITbbDHHkQixH5+2x1FDGmi/0K+WgWiqQFKPSlIYB7jlH6Kpfn6Fleg==",
+ "license": "MIT",
+ "dependencies": {
+ "kleur": "^4.1.5"
+ }
+ },
+ "node_modules/@poppinss/dumper": {
+ "version": "0.7.0",
+ "resolved": "https://registry.npmjs.org/@poppinss/dumper/-/dumper-0.7.0.tgz",
+ "integrity": "sha512-0UTYalzk2t6S4rA2uHOz5bSSW2CHdv4vggJI6Alg90yvl0UgXs6XSXpH96OH+bRkX4J/06djv29pqXJ0lq5Kag==",
+ "license": "MIT",
+ "dependencies": {
+ "@poppinss/colors": "^4.1.5",
+ "@sindresorhus/is": "^7.0.2",
+ "supports-color": "^10.0.0"
+ }
+ },
+ "node_modules/@poppinss/dumper/node_modules/@sindresorhus/is": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-7.2.0.tgz",
+ "integrity": "sha512-P1Cz1dWaFfR4IR+U13mqqiGsLFf1KbayybWwdd2vfctdV6hDpUkgCY0nKOLLTMSoRd/jJNjtbqzf13K8DCCXQw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sindresorhus/is?sponsor=1"
+ }
+ },
+ "node_modules/@poppinss/exception": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/@poppinss/exception/-/exception-1.2.3.tgz",
+ "integrity": "sha512-dCED+QRChTVatE9ibtoaxc+WkdzOSjYTKi/+uacHWIsfodVfpsueo3+DKpgU5Px8qXjgmXkSvhXvSCz3fnP9lw==",
+ "license": "MIT"
+ },
+ "node_modules/@poppinss/hooks": {
+ "version": "7.3.0",
+ "resolved": "https://registry.npmjs.org/@poppinss/hooks/-/hooks-7.3.0.tgz",
+ "integrity": "sha512-/H35z/bWqHg7085QOxWUDYMidx6Kl6b8kIyzIXlRYzWvsk1xm9hQOlXWdWEYch+Gmn8eL7tThx59MBj8BLxDrQ==",
+ "license": "MIT"
+ },
+ "node_modules/@poppinss/macroable": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@poppinss/macroable/-/macroable-1.1.2.tgz",
+ "integrity": "sha512-FAVBRzzWhYP5mA3lCwLH1A0fKBqq5anyjGet90Z81aRK5c/+LTGUE1zJhZrErjaenBSOOI9BVUs3WVmotneFQA==",
+ "license": "MIT"
+ },
+ "node_modules/@poppinss/matchit": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/@poppinss/matchit/-/matchit-3.2.0.tgz",
+ "integrity": "sha512-9SoMICN+LMO7ZtMj2ja8N7RHlC4mmuv5WwIBXWjabMd2SyXE1dIydh29exlgm+dGMP84PjwvfJH1TmWL4qz1og==",
+ "license": "MIT",
+ "dependencies": {
+ "@arr/every": "^1.0.0"
+ }
+ },
+ "node_modules/@poppinss/middleware": {
+ "version": "3.2.7",
+ "resolved": "https://registry.npmjs.org/@poppinss/middleware/-/middleware-3.2.7.tgz",
+ "integrity": "sha512-MZC0Z97ozSz+PpfyxUPUy/ImuthpqvBbY7qku7f4Q2maHz+2uXfchfO8OggXLS6zEJ078l+jpAHZ2rDIRdjeVg==",
+ "license": "MIT"
+ },
+ "node_modules/@poppinss/multiparty": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/@poppinss/multiparty/-/multiparty-3.0.0.tgz",
+ "integrity": "sha512-z9jchUzsv7E+7sa4tWHb0+95Byx7w0ydlPGxg3nzyb7h3QlRdeW8/QkU9SexUY4lsT12do93AfNBAhSuOoVqjA==",
+ "license": "MIT",
+ "dependencies": {
+ "http-errors": "^2.0.0"
+ }
+ },
+ "node_modules/@poppinss/object-builder": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@poppinss/object-builder/-/object-builder-1.1.0.tgz",
+ "integrity": "sha512-FOrOq52l7u8goR5yncX14+k+Ewi5djnrt1JwXeS/FvnwAPOiveFhiczCDuvXdssAwamtrV2hp5Rw9v+n2T7hQg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=20.6.0"
+ }
+ },
+ "node_modules/@poppinss/prompts": {
+ "version": "3.1.6",
+ "resolved": "https://registry.npmjs.org/@poppinss/prompts/-/prompts-3.1.6.tgz",
+ "integrity": "sha512-cKHfkID6b3wl1kbHJJRC/pznQ3KnRVydyk7CE38NfTV3VS45BDYCxeZZ7bfDin71qMzITh18lKnu8iuLxBngHA==",
+ "license": "MIT",
+ "dependencies": {
+ "@poppinss/colors": "^4.1.6",
+ "@poppinss/exception": "^1.2.2",
+ "@poppinss/object-builder": "^1.1.0",
+ "enquirer": "^2.4.1"
+ }
+ },
+ "node_modules/@poppinss/qs": {
+ "version": "6.15.0",
+ "resolved": "https://registry.npmjs.org/@poppinss/qs/-/qs-6.15.0.tgz",
+ "integrity": "sha512-QzfMhxrRB5EPeGz0l8hTwKZ5dFX6ed0aETGbuD369StCO8Ad3SW4wWBYamOK5IKeM/dfOeKaCwUZPTnGcj+jKg==",
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/@poppinss/string": {
+ "version": "1.7.2",
+ "resolved": "https://registry.npmjs.org/@poppinss/string/-/string-1.7.2.tgz",
+ "integrity": "sha512-A182GLDfi36iDCbhDrHB0xzrPM1fO3GHnhCDIdadf8C6eycgct4m7zusbLwEh6GPaj2Pz5BVos7XK16w7tZ7wQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/pluralize": "^0.0.33",
+ "case-anything": "^3.1.2",
+ "pluralize": "^8.0.0",
+ "slugify": "^1.6.9"
+ }
+ },
+ "node_modules/@poppinss/ts-exec": {
+ "version": "1.4.4",
+ "resolved": "https://registry.npmjs.org/@poppinss/ts-exec/-/ts-exec-1.4.4.tgz",
+ "integrity": "sha512-jQLbeQG3n9B+hpygIAQpNaNd3y9+7sLn0Jioo9qEo84Vd3XeRMKr3Qql/u2bixzONO2+RsBbzEJ3AWb2iCPARw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@swc/core": "~1.15.11",
+ "get-tsconfig": "^4.13.0"
+ },
+ "engines": {
+ "node": ">=24.0.0"
+ }
+ },
+ "node_modules/@poppinss/types": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/@poppinss/types/-/types-1.2.1.tgz",
+ "integrity": "sha512-qUYnzl0m9HJTWsXtr8Xo7CwDx6wcjrvo14bOVbIMIlKJCzKrm3LX55dRTDr1/x4PpSvKVgmxvC6Ly2YiqXKOvQ==",
+ "license": "MIT"
+ },
+ "node_modules/@poppinss/utils": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/@poppinss/utils/-/utils-7.0.1.tgz",
+ "integrity": "sha512-mveSvLI2YPC114mK5HCuSYfUtjpClf1wHG1VCqZJCp4U2ypPhIt62Iku5urh0kPAFvnvCVHx2bXBSH14qMTOlQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@poppinss/exception": "^1.2.3",
+ "@poppinss/object-builder": "^1.1.0",
+ "@poppinss/string": "^1.7.1",
+ "@poppinss/types": "^1.2.1",
+ "flattie": "^1.1.1"
+ }
+ },
+ "node_modules/@poppinss/validator-lite": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/@poppinss/validator-lite/-/validator-lite-2.1.2.tgz",
+ "integrity": "sha512-UhSG1ouT6r67VbEFHK/8ax3EMZYHioew9PqGmEZjV41G15aPZi6cyhXtBVvF9xqkHMflA5V680k7bQzV0kfD5w==",
+ "license": "MIT"
+ },
+ "node_modules/@sec-ant/readable-stream": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/@sec-ant/readable-stream/-/readable-stream-0.4.1.tgz",
+ "integrity": "sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==",
+ "devOptional": true,
+ "license": "MIT"
+ },
+ "node_modules/@sinclair/typebox": {
+ "version": "0.34.49",
+ "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.49.tgz",
+ "integrity": "sha512-brySQQs7Jtn0joV8Xh9ZV/hZb9Ozb0pmazDIASBkYKCjXrXU3mpcFahmK/z4YDhGkQvP9mWJbVyahdtU5wQA+A==",
+ "license": "MIT"
+ },
+ "node_modules/@sindresorhus/is": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-8.1.0.tgz",
+ "integrity": "sha512-2SX/1jW6CIMAiebvVv5ZInoCEuWQmMyBoJXXGC6Vjakjp/fpxP5eHs7/V6WKuPEIbuK06+VpjH+vjLQhr98rDQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=22"
+ },
+ "funding": {
+ "url": "https://github.com/sindresorhus/is?sponsor=1"
+ }
+ },
+ "node_modules/@sindresorhus/merge-streams": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-4.0.0.tgz",
+ "integrity": "sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==",
+ "devOptional": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/@speed-highlight/core": {
+ "version": "1.2.15",
+ "resolved": "https://registry.npmjs.org/@speed-highlight/core/-/core-1.2.15.tgz",
+ "integrity": "sha512-BMq1K3DsElxDWawkX6eLg9+CKJrTVGCBAWVuHXVUV2u0s2711qiChLSId6ikYPfxhdYocLNt3wWwSvDiTvFabw==",
+ "license": "CC0-1.0"
+ },
+ "node_modules/@standard-schema/spec": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz",
+ "integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==",
+ "license": "MIT"
+ },
+ "node_modules/@stylistic/eslint-plugin": {
+ "version": "5.10.0",
+ "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin/-/eslint-plugin-5.10.0.tgz",
+ "integrity": "sha512-nPK52ZHvot8Ju/0A4ucSX1dcPV2/1clx0kLcH5wDmrE4naKso7TUC/voUyU1O9OTKTrR6MYip6LP0ogEMQ9jPQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@eslint-community/eslint-utils": "^4.9.1",
+ "@typescript-eslint/types": "^8.56.0",
+ "eslint-visitor-keys": "^4.2.1",
+ "espree": "^10.4.0",
+ "estraverse": "^5.3.0",
+ "picomatch": "^4.0.3"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "peerDependencies": {
+ "eslint": "^9.0.0 || ^10.0.0"
+ }
+ },
+ "node_modules/@swc/core": {
+ "version": "1.15.40",
+ "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.15.40.tgz",
+ "integrity": "sha512-2kwzJikRvgtNAG7MwVZY2vEzZjTxKIq5jXOihuSV/8U+Hej8Va22t65aKnJZs3P+NwojZvR8Mf8kyM7O+V8sQg==",
+ "dev": true,
+ "hasInstallScript": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@swc/counter": "^0.1.3",
+ "@swc/types": "^0.1.26"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/swc"
+ },
+ "optionalDependencies": {
+ "@swc/core-darwin-arm64": "1.15.40",
+ "@swc/core-darwin-x64": "1.15.40",
+ "@swc/core-linux-arm-gnueabihf": "1.15.40",
+ "@swc/core-linux-arm64-gnu": "1.15.40",
+ "@swc/core-linux-arm64-musl": "1.15.40",
+ "@swc/core-linux-ppc64-gnu": "1.15.40",
+ "@swc/core-linux-s390x-gnu": "1.15.40",
+ "@swc/core-linux-x64-gnu": "1.15.40",
+ "@swc/core-linux-x64-musl": "1.15.40",
+ "@swc/core-win32-arm64-msvc": "1.15.40",
+ "@swc/core-win32-ia32-msvc": "1.15.40",
+ "@swc/core-win32-x64-msvc": "1.15.40"
+ },
+ "peerDependencies": {
+ "@swc/helpers": ">=0.5.17"
+ },
+ "peerDependenciesMeta": {
+ "@swc/helpers": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@swc/core-darwin-arm64": {
+ "version": "1.15.40",
+ "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.15.40.tgz",
+ "integrity": "sha512-PaYyclfmQ++77D8ityYvmmVzHv9aG8ROwt2GfG6/ccloy4Hgf80qtOnzb9VYvPsUT7Ty1uhuDRhv3XYpf62qhQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "Apache-2.0 AND MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@swc/core-darwin-x64": {
+ "version": "1.15.40",
+ "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.15.40.tgz",
+ "integrity": "sha512-HbbPzvfLBUXjIB1Ezks+//lNUjmLjfyd63XSwprJgrZaXYdm70kohXPJUWdqKZozolFxbPaO+xtBaiUp6BoueA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "Apache-2.0 AND MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@swc/core-linux-arm-gnueabihf": {
+ "version": "1.15.40",
+ "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.15.40.tgz",
+ "integrity": "sha512-SlRZsCjOCPR2LvFs0Ri/Xrx/5o5TCt8vl4gW6mX1hEZOG0a625RxzRHpHdAQNGykmAN/7IeaFAJG+QnNmxlHcA==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@swc/core-linux-arm64-gnu": {
+ "version": "1.15.40",
+ "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.15.40.tgz",
+ "integrity": "sha512-Q8byxJt2fh8CR3EUX6snBpy47AoBVm+In/+Z3rjDHMjC38ZvR9/gtUUNCT0tfrn4EdVsO8/QPi59nxrxvqxvBQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "libc": [
+ "glibc"
+ ],
+ "license": "Apache-2.0 AND MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@swc/core-linux-arm64-musl": {
+ "version": "1.15.40",
+ "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.15.40.tgz",
+ "integrity": "sha512-4z0MgHU+7M0pZDqBN1El7mFXDI1SBwinfcUkAyA4v8QrhOIUOZltySt2aStQLZGrdXVXM4Y4ylfiTC04ED+MoQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "libc": [
+ "musl"
+ ],
+ "license": "Apache-2.0 AND MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@swc/core-linux-ppc64-gnu": {
+ "version": "1.15.40",
+ "resolved": "https://registry.npmjs.org/@swc/core-linux-ppc64-gnu/-/core-linux-ppc64-gnu-1.15.40.tgz",
+ "integrity": "sha512-fLI4iUgeSZu0eRWUXwe6YzPFx9gHbFiPkl8Rp3mJfP8OpNR3nTQCGPvHdDh9xniW7mVvgMY4ni7A4VzqI1KrpA==",
+ "cpu": [
+ "ppc64"
+ ],
+ "dev": true,
+ "libc": [
+ "glibc"
+ ],
+ "license": "Apache-2.0 AND MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@swc/core-linux-s390x-gnu": {
+ "version": "1.15.40",
+ "resolved": "https://registry.npmjs.org/@swc/core-linux-s390x-gnu/-/core-linux-s390x-gnu-1.15.40.tgz",
+ "integrity": "sha512-YqeKMAb7d4nQSGMJQ454IlaCENpzcDqhvBE9+CPfdnYpnUXxd+BSrB6Xk0YjW8UyoEhUj4p6quATCxbsp6J3jg==",
+ "cpu": [
+ "s390x"
+ ],
+ "dev": true,
+ "libc": [
+ "glibc"
+ ],
+ "license": "Apache-2.0 AND MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@swc/core-linux-x64-gnu": {
+ "version": "1.15.40",
+ "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.15.40.tgz",
+ "integrity": "sha512-7HOuS1iGcme/j/TuL1TfmmLGiMQrjv/GmjyZeydl00FKPtpGXEldwqfI56xgd1YzrzoB2svWjxbGGyQ0TEASxg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "libc": [
+ "glibc"
+ ],
+ "license": "Apache-2.0 AND MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@swc/core-linux-x64-musl": {
+ "version": "1.15.40",
+ "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.15.40.tgz",
+ "integrity": "sha512-h4kZYHc7dpc9P9u4brRJaS8Pl7tPVHAeiLSzw7T5RfIJgAoSdaCMKzI/2Uay9gFhaw8uyCDl0L5q37r0EpAfIA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "libc": [
+ "musl"
+ ],
+ "license": "Apache-2.0 AND MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@swc/core-win32-arm64-msvc": {
+ "version": "1.15.40",
+ "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.15.40.tgz",
+ "integrity": "sha512-+mQgKZXSj6mV38Zh05QaxSjUDmGP/R2JWlXZTDLSPkDzHU6p3GxN9eeSf5dfyDVU86946fmCvSzyl/ucImx8+A==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "Apache-2.0 AND MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@swc/core-win32-ia32-msvc": {
+ "version": "1.15.40",
+ "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.15.40.tgz",
+ "integrity": "sha512-yvwdPLGd25mcj/mNatjNQ0lZujtQD6psH3v9PNmMb+fSzjbNG8KIDxjFWrcV+fsFVLOkyOmdJsFmX7NAFjVyPw==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "license": "Apache-2.0 AND MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@swc/core-win32-x64-msvc": {
+ "version": "1.15.40",
+ "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.15.40.tgz",
+ "integrity": "sha512-OXtKsLU1bVtInzzDEAY2sYiF/rl4tvAnLLLpuMp3HzAOQZ5A+i69AKDhA1YLQTaMAqO3vzyYNVAYVRMPtSYD4w==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "Apache-2.0 AND MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@swc/counter": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz",
+ "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==",
+ "dev": true,
+ "license": "Apache-2.0"
+ },
+ "node_modules/@swc/types": {
+ "version": "0.1.26",
+ "resolved": "https://registry.npmjs.org/@swc/types/-/types-0.1.26.tgz",
+ "integrity": "sha512-lyMwd7WGgG79RS7EERZV3T8wMdmPq3xwyg+1nmAM64kIhx5yl+juO2PYIHb7vTiPgPCj8LYjsNV2T5wiQHUEaw==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@swc/counter": "^0.1.3"
+ }
+ },
+ "node_modules/@tokenizer/inflate": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/@tokenizer/inflate/-/inflate-0.4.1.tgz",
+ "integrity": "sha512-2mAv+8pkG6GIZiF1kNg1jAjh27IDxEPKwdGul3snfztFerfPGI1LjDezZp3i7BElXompqEtPmoPx6c2wgtWsOA==",
+ "license": "MIT",
+ "dependencies": {
+ "debug": "^4.4.3",
+ "token-types": "^6.1.1"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/Borewit"
+ }
+ },
+ "node_modules/@tokenizer/token": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/@tokenizer/token/-/token-0.3.0.tgz",
+ "integrity": "sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==",
+ "license": "MIT"
+ },
+ "node_modules/@ts-morph/common": {
+ "version": "0.28.1",
+ "resolved": "https://registry.npmjs.org/@ts-morph/common/-/common-0.28.1.tgz",
+ "integrity": "sha512-W74iWf7ILp1ZKNYXY5qbddNaml7e9Sedv5lvU1V8lftlitkc9Pq1A+jlH23ltDgWYeZFFEqGCD1Ies9hqu3O+g==",
+ "devOptional": true,
+ "license": "MIT",
+ "dependencies": {
+ "minimatch": "^10.0.1",
+ "path-browserify": "^1.0.1",
+ "tinyglobby": "^0.2.14"
+ }
+ },
+ "node_modules/@tuyau/core": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/@tuyau/core/-/core-1.2.2.tgz",
+ "integrity": "sha512-kFE+gxuWZ4F6KjMB6wXNEP44oVdBpYyuAsOxjHpGplC5d+ErSVjynh1vN0rkv9poQJI3z+r81JKqhpmJZs886Q==",
+ "license": "MIT",
+ "dependencies": {
+ "ky": "^1.14.3",
+ "object-to-formdata": "^4.5.1"
+ },
+ "engines": {
+ "node": ">=24.0.0"
+ },
+ "peerDependencies": {
+ "@adonisjs/assembler": "^8.0.0-next.27",
+ "@adonisjs/core": "^7.0.0-next.16"
+ },
+ "peerDependenciesMeta": {
+ "@adonisjs/assembler": {
+ "optional": true
+ },
+ "@adonisjs/core": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@types/chai": {
+ "version": "5.2.3",
+ "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.3.tgz",
+ "integrity": "sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==",
+ "devOptional": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/deep-eql": "*",
+ "assertion-error": "^2.0.1"
+ }
+ },
+ "node_modules/@types/cookiejar": {
+ "version": "2.1.5",
+ "resolved": "https://registry.npmjs.org/@types/cookiejar/-/cookiejar-2.1.5.tgz",
+ "integrity": "sha512-he+DHOWReW0nghN24E1WUqM0efK4kI9oTqDm6XmK8ZPe2djZ90BSNdGnIyCLzCPw7/pogPlGbzI2wHGGmi4O/Q==",
+ "license": "MIT"
+ },
+ "node_modules/@types/deep-eql": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/@types/deep-eql/-/deep-eql-4.0.2.tgz",
+ "integrity": "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==",
+ "devOptional": true,
+ "license": "MIT"
+ },
+ "node_modules/@types/esrecurse": {
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/@types/esrecurse/-/esrecurse-4.3.1.tgz",
+ "integrity": "sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@types/estree": {
+ "version": "1.0.9",
+ "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz",
+ "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@types/he": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/@types/he/-/he-1.2.3.tgz",
+ "integrity": "sha512-q67/qwlxblDzEDvzHhVkwc1gzVWxaNxeyHUBF4xElrvjL11O+Ytze+1fGpBHlr/H9myiBUaUXNnNPmBHxxfAcA==",
+ "license": "MIT"
+ },
+ "node_modules/@types/json-schema": {
+ "version": "7.0.15",
+ "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz",
+ "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@types/luxon": {
+ "version": "3.7.1",
+ "resolved": "https://registry.npmjs.org/@types/luxon/-/luxon-3.7.1.tgz",
+ "integrity": "sha512-H3iskjFIAn5SlJU7OuxUmTEpebK6TKB8rxZShDslBMZJ5u9S//KM1sbdAisiSrqwLQncVjnpi2OK2J51h+4lsg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@types/methods": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/@types/methods/-/methods-1.1.4.tgz",
+ "integrity": "sha512-ymXWVrDiCxTBE3+RIrrP533E70eA+9qu7zdWoHuOmGujkYtzf4HQF96b8nwHLqhuf4ykX61IGRIB38CC6/sImQ==",
+ "license": "MIT"
+ },
+ "node_modules/@types/node": {
+ "version": "25.9.1",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-25.9.1.tgz",
+ "integrity": "sha512-xfrlY7UD5rMJk3ZVJP8BNzS28J36YJg+xp+LPXV1TdWxr8uMH5A860QNxYDGQe/ylDSgjxE52Q9VnO7p75tJxg==",
+ "license": "MIT",
+ "dependencies": {
+ "undici-types": ">=7.24.0 <7.24.7"
+ }
+ },
+ "node_modules/@types/normalize-package-data": {
+ "version": "2.4.4",
+ "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz",
+ "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@types/pluralize": {
+ "version": "0.0.33",
+ "resolved": "https://registry.npmjs.org/@types/pluralize/-/pluralize-0.0.33.tgz",
+ "integrity": "sha512-JOqsl+ZoCpP4e8TDke9W79FDcSgPAR0l6pixx2JHkhnRjvShyYiAYw2LVsnA7K08Y6DeOnaU6ujmENO4os/cYg==",
+ "license": "MIT"
+ },
+ "node_modules/@types/superagent": {
+ "version": "8.1.10",
+ "resolved": "https://registry.npmjs.org/@types/superagent/-/superagent-8.1.10.tgz",
+ "integrity": "sha512-nbt4IWXABhW0jGmmpRzCFNlbmwCTzZ2gTUsNIr+X+ItdqPms+PAJZbWsNzpS2USqXjcoNLQcO6nXo60zcPQiIg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/cookiejar": "^2.1.5",
+ "@types/methods": "^1.1.4",
+ "@types/node": "*",
+ "form-data": "^4.0.0"
+ }
+ },
+ "node_modules/@types/validator": {
+ "version": "13.15.10",
+ "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.15.10.tgz",
+ "integrity": "sha512-T8L6i7wCuyoK8A/ZeLYt1+q0ty3Zb9+qbSSvrIVitzT3YjZqkTZ40IbRsPanlB4h1QB3JVL1SYCdR6ngtFYcuA==",
+ "license": "MIT"
+ },
+ "node_modules/@typescript-eslint/eslint-plugin": {
+ "version": "8.60.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.60.1.tgz",
+ "integrity": "sha512-JQ4S5GB0tfjO8BuJ4fcX+HodkzJjYBV+7OJ+wLygaX7OGQ7FudyHL4NSCA6ob+w3Yn+5MkKIozOwQhXeM7opVg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@eslint-community/regexpp": "^4.12.2",
+ "@typescript-eslint/scope-manager": "8.60.1",
+ "@typescript-eslint/type-utils": "8.60.1",
+ "@typescript-eslint/utils": "8.60.1",
+ "@typescript-eslint/visitor-keys": "8.60.1",
+ "ignore": "^7.0.5",
+ "natural-compare": "^1.4.0",
+ "ts-api-utils": "^2.5.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "@typescript-eslint/parser": "^8.60.1",
+ "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0",
+ "typescript": ">=4.8.4 <6.1.0"
+ }
+ },
+ "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": {
+ "version": "7.0.5",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz",
+ "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "node_modules/@typescript-eslint/parser": {
+ "version": "8.60.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.60.1.tgz",
+ "integrity": "sha512-A0M6ua6H252bVjPvvtSgl2QA4+ET9S5Mtkb2GDyTxIhH/C4qDItT7RQNO5PhMC6NXGYXOR9dIalcDDgBKT7oFA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/scope-manager": "8.60.1",
+ "@typescript-eslint/types": "8.60.1",
+ "@typescript-eslint/typescript-estree": "8.60.1",
+ "@typescript-eslint/visitor-keys": "8.60.1",
+ "debug": "^4.4.3"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0",
+ "typescript": ">=4.8.4 <6.1.0"
+ }
+ },
+ "node_modules/@typescript-eslint/project-service": {
+ "version": "8.60.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.60.1.tgz",
+ "integrity": "sha512-eXkTH2bxmXlqD1RnOPmLZ9ZM9D3VwSx04JOwBnP9RQ+yUA5a2Mu7SfW8uaV2Aon53NJzZlZYuX7tn91Izf+xaw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/tsconfig-utils": "^8.60.1",
+ "@typescript-eslint/types": "^8.60.1",
+ "debug": "^4.4.3"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.8.4 <6.1.0"
+ }
+ },
+ "node_modules/@typescript-eslint/scope-manager": {
+ "version": "8.60.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.60.1.tgz",
+ "integrity": "sha512-gvI5OQoptnxQnchOirukCuQ55svJSTuD/4k5+pC267xyBtYry748R9/c3tYUzb/iE6RZfllRz2lVulLCHkTm4w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/types": "8.60.1",
+ "@typescript-eslint/visitor-keys": "8.60.1"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/@typescript-eslint/tsconfig-utils": {
+ "version": "8.60.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.60.1.tgz",
+ "integrity": "sha512-nh8w4qAteiKuZu3pSSzG/yGKpw0OlkrKnzFmbVRenKaD4qc+7i1GrmZaLVkr8rk4uipiPGMOW4YsM6WmKZ5CvA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.8.4 <6.1.0"
+ }
+ },
+ "node_modules/@typescript-eslint/type-utils": {
+ "version": "8.60.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.60.1.tgz",
+ "integrity": "sha512-sdwTrpjosW7ANQYJ39ZBF1ZyEMEGVB2UsikrserVM/30a/F1dTLnu9bGxEdosugyu5caigjLrR2qiD11asjI1A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/types": "8.60.1",
+ "@typescript-eslint/typescript-estree": "8.60.1",
+ "@typescript-eslint/utils": "8.60.1",
+ "debug": "^4.4.3",
+ "ts-api-utils": "^2.5.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0",
+ "typescript": ">=4.8.4 <6.1.0"
+ }
+ },
+ "node_modules/@typescript-eslint/types": {
+ "version": "8.60.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.60.1.tgz",
+ "integrity": "sha512-4h0tY8ppCkdCzcrl2YM5M3my0xsE1Tf8om3owEu5oPWmXwkKRmk0j0LGDzYBGUcAlesEbxBhazqu/K4cu3Ug7w==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/@typescript-eslint/typescript-estree": {
+ "version": "8.60.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.60.1.tgz",
+ "integrity": "sha512-alpRkfG8hlVE5kdJW2GkfgDgXxold3e8e4l6EnmhRmRLbekgAPCCGDVD++sABy9FcgPFroq+uFcCSM1vR57Cew==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/project-service": "8.60.1",
+ "@typescript-eslint/tsconfig-utils": "8.60.1",
+ "@typescript-eslint/types": "8.60.1",
+ "@typescript-eslint/visitor-keys": "8.60.1",
+ "debug": "^4.4.3",
+ "minimatch": "^10.2.2",
+ "semver": "^7.7.3",
+ "tinyglobby": "^0.2.15",
+ "ts-api-utils": "^2.5.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.8.4 <6.1.0"
+ }
+ },
+ "node_modules/@typescript-eslint/utils": {
+ "version": "8.60.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.60.1.tgz",
+ "integrity": "sha512-h2MPBLoNtjc3qZWfY3Tl51yPorQ2McHn8pJfcMNTcIvrrZrr90Ykffit0yjrPFWQcRcUxzH20+6OcVdW4yHtUg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@eslint-community/eslint-utils": "^4.9.1",
+ "@typescript-eslint/scope-manager": "8.60.1",
+ "@typescript-eslint/types": "8.60.1",
+ "@typescript-eslint/typescript-estree": "8.60.1"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0",
+ "typescript": ">=4.8.4 <6.1.0"
+ }
+ },
+ "node_modules/@typescript-eslint/visitor-keys": {
+ "version": "8.60.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.60.1.tgz",
+ "integrity": "sha512-EbGRQg4FhrmwLodl+t3JNAnXHWVr9Vp+Zl1QBZVPY4ByfkzIT8cX3K6QWODHtkIZqqJVEWvhHSx3v5PDHsaQag==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/types": "8.60.1",
+ "eslint-visitor-keys": "^5.0.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz",
+ "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": "^20.19.0 || ^22.13.0 || >=24"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/@vinejs/compiler": {
+ "version": "4.1.3",
+ "resolved": "https://registry.npmjs.org/@vinejs/compiler/-/compiler-4.1.3.tgz",
+ "integrity": "sha512-UyH7Zn8dkTMLeU+PF2WjCnWkFb2qYaOxAcvp/uXW0njtKNcJOnVJaPsnWYwqewkTcHN47yvOdzosj3kj3RAP5w==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "node_modules/@vinejs/vine": {
+ "version": "4.4.0",
+ "resolved": "https://registry.npmjs.org/@vinejs/vine/-/vine-4.4.0.tgz",
+ "integrity": "sha512-cfnNXjs9+f+22d3Eb8koyg2qlCbaT394XBlL4AeEr1WM+NH1omFcXwe1zrkW4hHwPDSfUd4lFUdNO6E+YnTeWQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@poppinss/macroable": "^1.1.0",
+ "@poppinss/types": "^1.2.1",
+ "@standard-schema/spec": "^1.1.0",
+ "@types/validator": "^13.15.10",
+ "@vinejs/compiler": "^4.1.3",
+ "camelcase": "^9.0.0",
+ "dayjs": "^1.11.19",
+ "dlv": "^1.1.3",
+ "normalize-url": "^8.1.1",
+ "validator": "^13.15.26"
+ },
+ "engines": {
+ "node": ">=18.16.0"
+ }
+ },
+ "node_modules/abstract-logging": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/abstract-logging/-/abstract-logging-2.0.1.tgz",
+ "integrity": "sha512-2BjRTZxTPvheOvGbBslFSYOUkr+SjPtOnrLP33f+VIWLzezQpZcqVg7ja3L4dBXmzzgwT+a029jRx5PCi3JuiA==",
+ "license": "MIT"
+ },
+ "node_modules/acorn": {
+ "version": "8.16.0",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz",
+ "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "acorn": "bin/acorn"
+ },
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/acorn-jsx": {
+ "version": "5.3.2",
+ "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
+ "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
+ "dev": true,
+ "license": "MIT",
+ "peerDependencies": {
+ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
+ }
+ },
+ "node_modules/ajv": {
+ "version": "6.15.0",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz",
+ "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "fast-deep-equal": "^3.1.1",
+ "fast-json-stable-stringify": "^2.0.0",
+ "json-schema-traverse": "^0.4.1",
+ "uri-js": "^4.2.2"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/epoberezkin"
+ }
+ },
+ "node_modules/angular-html-parser": {
+ "version": "10.7.0",
+ "resolved": "https://registry.npmjs.org/angular-html-parser/-/angular-html-parser-10.7.0.tgz",
+ "integrity": "sha512-jGSDAzkH6hUIlDJfV+w49sjljBVOnSHbT1dWt2fwRlt6tFHVH74coRwLr5nUtNzIZEWNtr3hPdbLQ0UqTcdYlA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 14"
+ }
+ },
+ "node_modules/ansi-colors": {
+ "version": "4.1.3",
+ "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz",
+ "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/ansi-escapes": {
+ "version": "7.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.3.0.tgz",
+ "integrity": "sha512-BvU8nYgGQBxcmMuEeUEmNTvrMVjJNSH7RgW24vXexN4Ven6qCvy4TntnvlnwnMLTVlcRQQdbRY8NKnaIoeWDNg==",
+ "license": "MIT",
+ "dependencies": {
+ "environment": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/ansi-regex": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "license": "MIT",
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
}
},
"node_modules/argparse": {
- "version": "1.0.10",
- "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
- "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
+ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
+ "license": "Python-2.0"
+ },
+ "node_modules/asap": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz",
+ "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==",
+ "license": "MIT"
+ },
+ "node_modules/assertion-error": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz",
+ "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==",
+ "devOptional": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/async-retry": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/async-retry/-/async-retry-1.3.3.tgz",
+ "integrity": "sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw==",
"license": "MIT",
"dependencies": {
- "sprintf-js": "~1.0.2"
+ "retry": "0.13.1"
+ }
+ },
+ "node_modules/asynckit": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
+ "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==",
+ "license": "MIT"
+ },
+ "node_modules/atomic-sleep": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/atomic-sleep/-/atomic-sleep-1.0.0.tgz",
+ "integrity": "sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/balanced-match": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz",
+ "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==",
+ "devOptional": true,
+ "license": "MIT",
+ "engines": {
+ "node": "18 || 20 || >=22"
}
},
"node_modules/base64-js": {
@@ -206,6 +2690,45 @@
],
"license": "MIT"
},
+ "node_modules/baseline-browser-mapping": {
+ "version": "2.10.33",
+ "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.33.tgz",
+ "integrity": "sha512-bA6+tcSLpz2tIEdDXZPpPTIuxBcC4+w6SieaYyfigIa4h8GlFxbA17v22Vx3JUtuZQj9SgOsnbK+aTBzyDyEuw==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "bin": {
+ "baseline-browser-mapping": "dist/cli.cjs"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/basic-auth": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz",
+ "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==",
+ "license": "MIT",
+ "dependencies": {
+ "safe-buffer": "5.1.2"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/better-sqlite3": {
+ "version": "12.10.0",
+ "resolved": "https://registry.npmjs.org/better-sqlite3/-/better-sqlite3-12.10.0.tgz",
+ "integrity": "sha512-CyzaZRQKyHkB2ZInfTTl2nvT33EbDpjkLEbE8/Zck3Ll6O0qqvuGdrJ45HgtH+HykRg88ITY3AdreBGN70aBSQ==",
+ "hasInstallScript": true,
+ "license": "MIT",
+ "dependencies": {
+ "bindings": "^1.5.0",
+ "prebuild-install": "^7.1.1"
+ },
+ "engines": {
+ "node": "20.x || 22.x || 23.x || 24.x || 25.x || 26.x"
+ }
+ },
"node_modules/bindings": {
"version": "1.5.0",
"resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz",
@@ -226,7 +2749,67 @@
"readable-stream": "^3.4.0"
}
},
- "node_modules/bl/node_modules/buffer": {
+ "node_modules/brace-expansion": {
+ "version": "5.0.6",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.6.tgz",
+ "integrity": "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==",
+ "devOptional": true,
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^4.0.2"
+ },
+ "engines": {
+ "node": "18 || 20 || >=22"
+ }
+ },
+ "node_modules/braces": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz",
+ "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
+ "devOptional": true,
+ "license": "MIT",
+ "dependencies": {
+ "fill-range": "^7.1.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/browserslist": {
+ "version": "4.28.2",
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.2.tgz",
+ "integrity": "sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/browserslist"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "baseline-browser-mapping": "^2.10.12",
+ "caniuse-lite": "^1.0.30001782",
+ "electron-to-chromium": "^1.5.328",
+ "node-releases": "^2.0.36",
+ "update-browserslist-db": "^1.2.3"
+ },
+ "bin": {
+ "browserslist": "cli.js"
+ },
+ "engines": {
+ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
+ }
+ },
+ "node_modules/buffer": {
"version": "5.7.1",
"resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz",
"integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==",
@@ -250,41 +2833,28 @@
"ieee754": "^1.1.13"
}
},
- "node_modules/buffer": {
- "version": "6.0.3",
- "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz",
- "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==",
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/feross"
- },
- {
- "type": "patreon",
- "url": "https://www.patreon.com/feross"
- },
- {
- "type": "consulting",
- "url": "https://feross.org/support"
- }
- ],
+ "node_modules/builtin-modules": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-5.2.0.tgz",
+ "integrity": "sha512-02yxLeyxF4dNl6SlY6/5HfRSrSdZ/sCPoxy2kZNP5dZZX8LSAD9aE2gtJIUgWrsQTiMPl3mxESyrobSwvRGisQ==",
+ "dev": true,
"license": "MIT",
- "optional": true,
- "peer": true,
- "dependencies": {
- "base64-js": "^1.3.1",
- "ieee754": "^1.2.1"
+ "engines": {
+ "node": ">=18.20"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/bullmq": {
- "version": "5.77.3",
- "resolved": "https://registry.npmjs.org/bullmq/-/bullmq-5.77.3.tgz",
- "integrity": "sha512-ccGjnRF5Bbu21CfzDG7toIewoAj5W9DUHjqhFnppt8YBtoQplynzBGuSzn7yYQobpyYeHEqrYhiJ1NZInrKbyA==",
+ "version": "5.78.0",
+ "resolved": "https://registry.npmjs.org/bullmq/-/bullmq-5.78.0.tgz",
+ "integrity": "sha512-tT9jJmbobk9ueEfFc22egLmgwCcMGgOjZ5Y1cvgczBPv1JUmC7iHQVbQtqku2YBE5dE9uzdVpxIrBvL/YAjGwA==",
"license": "MIT",
"dependencies": {
"cron-parser": "4.9.0",
"ioredis": "5.10.1",
- "msgpackr": "2.0.1",
+ "msgpackr": "2.0.2",
"node-abort-controller": "3.1.1",
"semver": "7.8.0",
"tslib": "2.8.1"
@@ -301,6 +2871,36 @@
}
}
},
+ "node_modules/bullmq/node_modules/@ioredis/commands": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/@ioredis/commands/-/commands-1.5.1.tgz",
+ "integrity": "sha512-JH8ZL/ywcJyR9MmJ5BNqZllXNZQqQbnVZOqpPQqE1vHiFgAw4NHbvE0FOduNU8IX9babitBT46571OnPTT0Zcw==",
+ "license": "MIT"
+ },
+ "node_modules/bullmq/node_modules/ioredis": {
+ "version": "5.10.1",
+ "resolved": "https://registry.npmjs.org/ioredis/-/ioredis-5.10.1.tgz",
+ "integrity": "sha512-HuEDBTI70aYdx1v6U97SbNx9F1+svQKBDo30o0b9fw055LMepzpOOd0Ccg9Q6tbqmBSJaMuY0fB7yw9/vjBYCA==",
+ "license": "MIT",
+ "dependencies": {
+ "@ioredis/commands": "1.5.1",
+ "cluster-key-slot": "^1.1.0",
+ "debug": "^4.3.4",
+ "denque": "^2.1.0",
+ "lodash.defaults": "^4.2.0",
+ "lodash.isarguments": "^3.1.0",
+ "redis-errors": "^1.2.0",
+ "redis-parser": "^3.0.0",
+ "standard-as-callback": "^2.1.0"
+ },
+ "engines": {
+ "node": ">=12.22.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/ioredis"
+ }
+ },
"node_modules/bullmq/node_modules/semver": {
"version": "7.8.0",
"resolved": "https://registry.npmjs.org/semver/-/semver-7.8.0.tgz",
@@ -313,24 +2913,429 @@
"node": ">=10"
}
},
- "node_modules/chownr": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz",
- "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==",
- "license": "BlueOak-1.0.0",
+ "node_modules/bundle-name": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-4.1.0.tgz",
+ "integrity": "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==",
+ "devOptional": true,
+ "license": "MIT",
+ "dependencies": {
+ "run-applescript": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/bytes": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
+ "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/call-bind-apply-helpers": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz",
+ "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==",
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "function-bind": "^1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/call-bound": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz",
+ "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind-apply-helpers": "^1.0.2",
+ "get-intrinsic": "^1.3.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/camelcase": {
+ "version": "9.0.0",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-9.0.0.tgz",
+ "integrity": "sha512-TO9xmyXTZ9HUHI8M1OnvExxYB0eYVS/1e5s7IDMTAoIcwUd+aNcFODs6Xk83mobk0velyHFQgA1yIrvYc6wclw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=20"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/caniuse-lite": {
+ "version": "1.0.30001793",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001793.tgz",
+ "integrity": "sha512-iwSsYWaCOoh26cV8NwNRViHlrfUvYsHDfRVcbtmw0Kg6PJIZZXwMkj1442FYLBGkeUf1juAsU3DTfxW579mrPA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/caniuse-lite"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "CC-BY-4.0"
+ },
+ "node_modules/case-anything": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/case-anything/-/case-anything-3.1.2.tgz",
+ "integrity": "sha512-wljhAjDDIv/hM2FzgJnYQg90AWmZMNtESCjTeLH680qTzdo0nErlCxOmgzgX4ZsZAtIvqHyD87ES8QyriXB+BQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/mesqueeb"
+ }
+ },
+ "node_modules/chai": {
+ "version": "6.2.2",
+ "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.2.tgz",
+ "integrity": "sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==",
+ "devOptional": true,
+ "license": "MIT",
"engines": {
"node": ">=18"
}
},
+ "node_modules/chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/chalk/node_modules/supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "license": "MIT",
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/change-case": {
+ "version": "5.4.4",
+ "resolved": "https://registry.npmjs.org/change-case/-/change-case-5.4.4.tgz",
+ "integrity": "sha512-HRQyTk2/YPEkt9TnUPbOpr64Uw3KOicFWPVBb+xiHvd6eBx/qPr9xqfBFDT8P2vWsvvz4jbEkfDe71W3VyNu2w==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/check-disk-space": {
+ "version": "3.4.0",
+ "resolved": "https://registry.npmjs.org/check-disk-space/-/check-disk-space-3.4.0.tgz",
+ "integrity": "sha512-drVkSqfwA+TvuEhFipiR1OC9boEGZL5RrWvVsOthdcvQNXyCCuKkEiTOTXZ7qxSf/GLwq4GvzfrQD/Wz325hgw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=16"
+ }
+ },
+ "node_modules/chokidar": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-5.0.0.tgz",
+ "integrity": "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==",
+ "devOptional": true,
+ "license": "MIT",
+ "dependencies": {
+ "readdirp": "^5.0.0"
+ },
+ "engines": {
+ "node": ">= 20.19.0"
+ },
+ "funding": {
+ "url": "https://paulmillr.com/funding/"
+ }
+ },
+ "node_modules/chownr": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz",
+ "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==",
+ "license": "ISC"
+ },
+ "node_modules/ci-info": {
+ "version": "4.4.0",
+ "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.4.0.tgz",
+ "integrity": "sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/sibiraj-s"
+ }
+ ],
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/clean-regexp": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/clean-regexp/-/clean-regexp-1.0.0.tgz",
+ "integrity": "sha512-GfisEZEJvzKrmGWkvfhgzcz/BllN1USeqD2V6tg14OAOgaCD2Z/PUEuxnAZ/nPvmaHRG7a8y77p1T/IRQ4D1Hw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "escape-string-regexp": "^1.0.5"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/clean-regexp/node_modules/escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
+ "node_modules/cli-boxes": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-4.0.1.tgz",
+ "integrity": "sha512-5IOn+jcCEHEraYolBPs/sT4BxYCe2nHg374OPiItB1O96KZFseS2gthU4twyYzeDcFew4DaUM/xwc5BQf08JJw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=18.20 <19 || >=20.10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/cli-cursor": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz",
+ "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==",
+ "license": "MIT",
+ "dependencies": {
+ "restore-cursor": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/cli-table3": {
+ "version": "0.6.5",
+ "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.5.tgz",
+ "integrity": "sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ==",
+ "license": "MIT",
+ "dependencies": {
+ "string-width": "^4.2.0"
+ },
+ "engines": {
+ "node": "10.* || >= 12.*"
+ },
+ "optionalDependencies": {
+ "@colors/colors": "1.5.0"
+ }
+ },
+ "node_modules/cli-table3/node_modules/is-fullwidth-code-point": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/cli-table3/node_modules/string-width": {
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+ "license": "MIT",
+ "dependencies": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/cli-truncate": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-5.2.0.tgz",
+ "integrity": "sha512-xRwvIOMGrfOAnM1JYtqQImuaNtDEv9v6oIYAs4LIHwTiKee8uwvIi363igssOC0O5U04i4AlENs79LQLu9tEMw==",
+ "license": "MIT",
+ "dependencies": {
+ "slice-ansi": "^8.0.0",
+ "string-width": "^8.2.0"
+ },
+ "engines": {
+ "node": ">=20"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
"node_modules/cluster-key-slot": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/cluster-key-slot/-/cluster-key-slot-1.1.2.tgz",
- "integrity": "sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA==",
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/cluster-key-slot/-/cluster-key-slot-1.1.1.tgz",
+ "integrity": "sha512-rwHwUfXL40Chm1r08yrhU3qpUvdVlgkKNeyeGPOxnW8/SyVDvgRaed/Uz54AqWNaTCAThlj6QAs3TZcKI0xDEw==",
"license": "Apache-2.0",
"engines": {
"node": ">=0.10.0"
}
},
+ "node_modules/code-block-writer": {
+ "version": "13.0.3",
+ "resolved": "https://registry.npmjs.org/code-block-writer/-/code-block-writer-13.0.3.tgz",
+ "integrity": "sha512-Oofo0pq3IKnsFtuHqSF7TqBfr71aeyZDVJ0HpmqB7FBM2qEigL0iPONSCZSO9pE9dZTAxANe5XHG9Uy0YMv8cg==",
+ "devOptional": true,
+ "license": "MIT"
+ },
+ "node_modules/color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "license": "MIT",
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "license": "MIT"
+ },
+ "node_modules/colorette": {
+ "version": "2.0.19",
+ "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz",
+ "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==",
+ "license": "MIT"
+ },
+ "node_modules/combined-stream": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
+ "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
+ "license": "MIT",
+ "dependencies": {
+ "delayed-stream": "~1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/commander": {
+ "version": "10.0.1",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz",
+ "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/common-path-prefix": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz",
+ "integrity": "sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==",
+ "license": "ISC"
+ },
+ "node_modules/component-emitter": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.1.tgz",
+ "integrity": "sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==",
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/content-disposition": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.1.0.tgz",
+ "integrity": "sha512-5jRCH9Z/+DRP7rkvY83B+yGIGX96OYdJmzngqnw2SBSxqCFPd0w2km3s5iawpGX8krnwSGmF0FW5Nhr0Hfai3g==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/express"
+ }
+ },
+ "node_modules/content-type": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/content-type/-/content-type-2.0.0.tgz",
+ "integrity": "sha512-j/O/d7GcZCyNl7/hwZAb606rzqkyvaDctLmckbxLzHvFBzTJHuGEdodATcP3yIRoDrLHkIATJuvzbFlp/ki2cQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/express"
+ }
+ },
+ "node_modules/cookie-es": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/cookie-es/-/cookie-es-3.1.1.tgz",
+ "integrity": "sha512-UaXxwISYJPTr9hwQxMFYZ7kNhSXboMXP+Z3TRX6f1/NyaGPfuNUZOWP1pUEb75B2HjfklIYLVRfWiFZJyC6Npg==",
+ "license": "MIT"
+ },
+ "node_modules/cookiejar": {
+ "version": "2.1.4",
+ "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.4.tgz",
+ "integrity": "sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw==",
+ "license": "MIT"
+ },
+ "node_modules/core-js-compat": {
+ "version": "3.49.0",
+ "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.49.0.tgz",
+ "integrity": "sha512-VQXt1jr9cBz03b331DFDCCP90b3fanciLkgiOoy8SBHy06gNf+vQ1A3WFLqG7I8TipYIKeYK9wxd0tUrvHcOZA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "browserslist": "^4.28.1"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/core-js"
+ }
+ },
"node_modules/crc": {
"version": "4.3.2",
"resolved": "https://registry.npmjs.org/crc/-/crc-4.3.2.tgz",
@@ -360,6 +3365,35 @@
"node": ">=12.0.0"
}
},
+ "node_modules/cross-spawn": {
+ "version": "7.0.6",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
+ "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==",
+ "devOptional": true,
+ "license": "MIT",
+ "dependencies": {
+ "path-key": "^3.1.0",
+ "shebang-command": "^2.0.0",
+ "which": "^2.0.1"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/csrf": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/csrf/-/csrf-3.1.0.tgz",
+ "integrity": "sha512-uTqEnCvWRk042asU6JtapDTcJeeailFy4ydOQS28bj1hcLnYRiqi8SsD2jS412AY1I/4qdOwWZun774iqywf9w==",
+ "license": "MIT",
+ "dependencies": {
+ "rndm": "1.2.0",
+ "tsscmp": "1.0.6",
+ "uid-safe": "2.1.5"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
"node_modules/date-format": {
"version": "4.0.14",
"resolved": "https://registry.npmjs.org/date-format/-/date-format-4.0.14.tgz",
@@ -369,6 +3403,22 @@
"node": ">=4.0"
}
},
+ "node_modules/dateformat": {
+ "version": "4.6.3",
+ "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-4.6.3.tgz",
+ "integrity": "sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA==",
+ "devOptional": true,
+ "license": "MIT",
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/dayjs": {
+ "version": "1.11.21",
+ "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.21.tgz",
+ "integrity": "sha512-98IT+HOahAisibz/yjKbzuOBwYcjJ7BCLPzARyHiyEBmRz4fatF+KPJszEHXsGYjUG234aH/cOjW1wwTbKUZlA==",
+ "license": "MIT"
+ },
"node_modules/debug": {
"version": "4.4.3",
"resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz",
@@ -401,6 +3451,21 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
+ "node_modules/dedent": {
+ "version": "1.7.2",
+ "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.7.2.tgz",
+ "integrity": "sha512-WzMx3mW98SN+zn3hgemf4OzdmyNhhhKz5Ay0pUfQiMQ3e1g+xmTJWp/pKdwKVXhdSkAEGIIzqeuWrL3mV/AXbA==",
+ "devOptional": true,
+ "license": "MIT",
+ "peerDependencies": {
+ "babel-plugin-macros": "^3.1.0"
+ },
+ "peerDependenciesMeta": {
+ "babel-plugin-macros": {
+ "optional": true
+ }
+ }
+ },
"node_modules/deep-extend": {
"version": "0.6.0",
"resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz",
@@ -410,6 +3475,74 @@
"node": ">=4.0.0"
}
},
+ "node_modules/deep-is": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
+ "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/deepmerge": {
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz",
+ "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/default-browser": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.5.0.tgz",
+ "integrity": "sha512-H9LMLr5zwIbSxrmvikGuI/5KGhZ8E2zH3stkMgM5LpOWDutGM2JZaj460Udnf1a+946zc7YBgrqEWwbk7zHvGw==",
+ "devOptional": true,
+ "license": "MIT",
+ "dependencies": {
+ "bundle-name": "^4.1.0",
+ "default-browser-id": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/default-browser-id": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.1.tgz",
+ "integrity": "sha512-x1VCxdX4t+8wVfd1so/9w+vQ4vx7lKd2Qp5tDRutErwmR85OgmfX7RlLRMWafRMY7hbEiXIbudNrjOAPa/hL8Q==",
+ "devOptional": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/define-lazy-prop": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz",
+ "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==",
+ "devOptional": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/delayed-stream": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
+ "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
"node_modules/denque": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/denque/-/denque-2.1.0.tgz",
@@ -419,6 +3552,25 @@
"node": ">=0.10"
}
},
+ "node_modules/depd": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
+ "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/destroy": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz",
+ "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8",
+ "npm": "1.2.8000 || >= 1.4.16"
+ }
+ },
"node_modules/detect-libc": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz",
@@ -428,15 +3580,97 @@
"node": ">=8"
}
},
- "node_modules/dotenv": {
- "version": "16.6.1",
- "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.6.1.tgz",
- "integrity": "sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==",
+ "node_modules/dezalgo": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.4.tgz",
+ "integrity": "sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==",
+ "license": "ISC",
+ "dependencies": {
+ "asap": "^2.0.0",
+ "wrappy": "1"
+ }
+ },
+ "node_modules/dlv": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz",
+ "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==",
+ "license": "MIT"
+ },
+ "node_modules/dunder-proto": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz",
+ "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind-apply-helpers": "^1.0.1",
+ "es-errors": "^1.3.0",
+ "gopd": "^1.2.0"
+ },
"engines": {
- "node": ">=12"
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/edge-error": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/edge-error/-/edge-error-4.0.2.tgz",
+ "integrity": "sha512-jB76VYn8wapDHKHSOmP3vbKLoa77RJYsTLNmfl8+cuCD69uxZtP3h+kqV+Prw/YkYmN7yHyp4IApE15pDByk0A==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18.16.0"
+ }
+ },
+ "node_modules/edge-lexer": {
+ "version": "6.0.5",
+ "resolved": "https://registry.npmjs.org/edge-lexer/-/edge-lexer-6.0.5.tgz",
+ "integrity": "sha512-paSprHn8GRzOUWTVLapgacqDBSOpJgOY60/V5QQ8bbNLHRKUMSxp8Z2oOO0WKtcKmb5+sAlmvG3izhbFulp19A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "edge-error": "^4.0.2"
+ },
+ "engines": {
+ "node": ">=24.0.0"
+ }
+ },
+ "node_modules/ee-first": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
+ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==",
+ "license": "MIT"
+ },
+ "node_modules/electron-to-chromium": {
+ "version": "1.5.366",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.366.tgz",
+ "integrity": "sha512-OlRuhb688YTCzzU3gXPLn6nGyd+F+53INE1qaKKlu6kETErE8FYsyDh0XqXEU+uBRn0MpCzz2vfNwORhkap8qg==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/emittery": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/emittery/-/emittery-1.2.1.tgz",
+ "integrity": "sha512-sFz64DCRjirhwHLxofFqxYQm6DCp6o0Ix7jwKQvuCHPn4GMRZNuBZyLPu9Ccmk/QSCAMZt6FOUqA8JZCQvA9fw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=14.16"
},
"funding": {
- "url": "https://dotenvx.com"
+ "url": "https://github.com/sindresorhus/emittery?sponsor=1"
+ }
+ },
+ "node_modules/emoji-regex": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+ "license": "MIT"
+ },
+ "node_modules/encodeurl": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz",
+ "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
}
},
"node_modules/end-of-stream": {
@@ -448,27 +3682,420 @@
"once": "^1.4.0"
}
},
- "node_modules/env-paths": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz",
- "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==",
+ "node_modules/enquirer": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.4.1.tgz",
+ "integrity": "sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-colors": "^4.1.1",
+ "strip-ansi": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=8.6"
+ }
+ },
+ "node_modules/environment": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/environment/-/environment-1.1.0.tgz",
+ "integrity": "sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/error-stack-parser-es": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/error-stack-parser-es/-/error-stack-parser-es-1.0.5.tgz",
+ "integrity": "sha512-5qucVt2XcuGMcEGgWI7i+yZpmpByQ8J1lHhcL7PwqCwu9FPP3VUXzT4ltHe5i2z9dePwEHcDVOAfSnHsOlCXRA==",
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ }
+ },
+ "node_modules/es-define-property": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz",
+ "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-errors": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
+ "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-module-lexer": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz",
+ "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==",
+ "license": "MIT"
+ },
+ "node_modules/es-object-atoms": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.2.tgz",
+ "integrity": "sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==",
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-set-tostringtag": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz",
+ "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==",
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.6",
+ "has-tostringtag": "^1.0.2",
+ "hasown": "^2.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/escalade": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz",
+ "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==",
"license": "MIT",
- "optional": true,
"engines": {
"node": ">=6"
}
},
- "node_modules/esprima": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
- "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
- "license": "BSD-2-Clause",
+ "node_modules/escape-string-regexp": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
+ "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/eslint": {
+ "version": "10.4.1",
+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-10.4.1.tgz",
+ "integrity": "sha512-AyIKhnOBuOAdueD7RB3xB+YeAWScb9jHsJBgH2Hcde8InP5JYhqrRR6iTMHyTEwgENK54Cp44e4v8BwNhsuHuw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@eslint-community/eslint-utils": "^4.8.0",
+ "@eslint-community/regexpp": "^4.12.2",
+ "@eslint/config-array": "^0.23.5",
+ "@eslint/config-helpers": "^0.6.0",
+ "@eslint/core": "^1.2.1",
+ "@eslint/plugin-kit": "^0.7.2",
+ "@humanfs/node": "^0.16.6",
+ "@humanwhocodes/module-importer": "^1.0.1",
+ "@humanwhocodes/retry": "^0.4.2",
+ "@types/estree": "^1.0.6",
+ "ajv": "^6.14.0",
+ "cross-spawn": "^7.0.6",
+ "debug": "^4.3.2",
+ "escape-string-regexp": "^4.0.0",
+ "eslint-scope": "^9.1.2",
+ "eslint-visitor-keys": "^5.0.1",
+ "espree": "^11.2.0",
+ "esquery": "^1.7.0",
+ "esutils": "^2.0.2",
+ "fast-deep-equal": "^3.1.3",
+ "file-entry-cache": "^8.0.0",
+ "find-up": "^5.0.0",
+ "glob-parent": "^6.0.2",
+ "ignore": "^5.2.0",
+ "imurmurhash": "^0.1.4",
+ "is-glob": "^4.0.0",
+ "json-stable-stringify-without-jsonify": "^1.0.1",
+ "minimatch": "^10.2.4",
+ "natural-compare": "^1.4.0",
+ "optionator": "^0.9.3"
+ },
"bin": {
- "esparse": "bin/esparse.js",
- "esvalidate": "bin/esvalidate.js"
+ "eslint": "bin/eslint.js"
},
"engines": {
- "node": ">=4"
+ "node": "^20.19.0 || ^22.13.0 || >=24"
+ },
+ "funding": {
+ "url": "https://eslint.org/donate"
+ },
+ "peerDependencies": {
+ "jiti": "*"
+ },
+ "peerDependenciesMeta": {
+ "jiti": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/eslint-config-prettier": {
+ "version": "10.1.8",
+ "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-10.1.8.tgz",
+ "integrity": "sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "eslint-config-prettier": "bin/cli.js"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint-config-prettier"
+ },
+ "peerDependencies": {
+ "eslint": ">=7.0.0"
+ }
+ },
+ "node_modules/eslint-plugin-prettier": {
+ "version": "5.5.6",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.5.6.tgz",
+ "integrity": "sha512-ifetmTcxWfz+4qRW3pH/ujdTq2jQIj59AxJMIN26K5avYgU8dxycUETQonWiW+wPrYXA0j3Try0l1CnwVQtDqQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "prettier-linter-helpers": "^1.0.1",
+ "synckit": "^0.11.13"
+ },
+ "engines": {
+ "node": "^14.18.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint-plugin-prettier"
+ },
+ "peerDependencies": {
+ "@types/eslint": ">=8.0.0",
+ "eslint": ">=8.0.0",
+ "eslint-config-prettier": ">= 7.0.0 <10.0.0 || >=10.1.0",
+ "prettier": ">=3.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/eslint": {
+ "optional": true
+ },
+ "eslint-config-prettier": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/eslint-plugin-unicorn": {
+ "version": "64.0.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-unicorn/-/eslint-plugin-unicorn-64.0.0.tgz",
+ "integrity": "sha512-rNZwalHh8i0UfPlhNwg5BTUO1CMdKNmjqe+TgzOTZnpKoi8VBgsW7u9qCHIdpxEzZ1uwrJrPF0uRb7l//K38gA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-validator-identifier": "^7.28.5",
+ "@eslint-community/eslint-utils": "^4.9.1",
+ "change-case": "^5.4.4",
+ "ci-info": "^4.4.0",
+ "clean-regexp": "^1.0.0",
+ "core-js-compat": "^3.49.0",
+ "find-up-simple": "^1.0.1",
+ "globals": "^17.4.0",
+ "indent-string": "^5.0.0",
+ "is-builtin-module": "^5.0.0",
+ "jsesc": "^3.1.0",
+ "pluralize": "^8.0.0",
+ "regexp-tree": "^0.1.27",
+ "regjsparser": "^0.13.0",
+ "semver": "^7.7.4",
+ "strip-indent": "^4.1.1"
+ },
+ "engines": {
+ "node": "^20.10.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sindresorhus/eslint-plugin-unicorn?sponsor=1"
+ },
+ "peerDependencies": {
+ "eslint": ">=9.38.0"
+ }
+ },
+ "node_modules/eslint-scope": {
+ "version": "9.1.2",
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-9.1.2.tgz",
+ "integrity": "sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "@types/esrecurse": "^4.3.1",
+ "@types/estree": "^1.0.8",
+ "esrecurse": "^4.3.0",
+ "estraverse": "^5.2.0"
+ },
+ "engines": {
+ "node": "^20.19.0 || ^22.13.0 || >=24"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/eslint-visitor-keys": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz",
+ "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/eslint/node_modules/eslint-visitor-keys": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz",
+ "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": "^20.19.0 || ^22.13.0 || >=24"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/eslint/node_modules/espree": {
+ "version": "11.2.0",
+ "resolved": "https://registry.npmjs.org/espree/-/espree-11.2.0.tgz",
+ "integrity": "sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "acorn": "^8.16.0",
+ "acorn-jsx": "^5.3.2",
+ "eslint-visitor-keys": "^5.0.1"
+ },
+ "engines": {
+ "node": "^20.19.0 || ^22.13.0 || >=24"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/esm": {
+ "version": "3.2.25",
+ "resolved": "https://registry.npmjs.org/esm/-/esm-3.2.25.tgz",
+ "integrity": "sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/espree": {
+ "version": "10.4.0",
+ "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz",
+ "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "acorn": "^8.15.0",
+ "acorn-jsx": "^5.3.2",
+ "eslint-visitor-keys": "^4.2.1"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/esquery": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz",
+ "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "estraverse": "^5.1.0"
+ },
+ "engines": {
+ "node": ">=0.10"
+ }
+ },
+ "node_modules/esrecurse": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
+ "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "estraverse": "^5.2.0"
+ },
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/estraverse": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
+ "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/esutils": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
+ "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/etag": {
+ "version": "1.8.1",
+ "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
+ "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/execa": {
+ "version": "9.6.1",
+ "resolved": "https://registry.npmjs.org/execa/-/execa-9.6.1.tgz",
+ "integrity": "sha512-9Be3ZoN4LmYR90tUoVu2te2BsbzHfhJyfEiAVfz7N5/zv+jduIfLrV2xdQXOHbaD6KgpGdO9PRPM1Y4Q9QkPkA==",
+ "devOptional": true,
+ "license": "MIT",
+ "dependencies": {
+ "@sindresorhus/merge-streams": "^4.0.0",
+ "cross-spawn": "^7.0.6",
+ "figures": "^6.1.0",
+ "get-stream": "^9.0.0",
+ "human-signals": "^8.0.1",
+ "is-plain-obj": "^4.1.0",
+ "is-stream": "^4.0.1",
+ "npm-run-path": "^6.0.0",
+ "pretty-ms": "^9.2.0",
+ "signal-exit": "^4.1.0",
+ "strip-final-newline": "^4.0.0",
+ "yoctocolors": "^2.1.1"
+ },
+ "engines": {
+ "node": "^18.19.0 || >=20.5.0"
+ },
+ "funding": {
+ "url": "https://github.com/sindresorhus/execa?sponsor=1"
}
},
"node_modules/expand-template": {
@@ -480,19 +4107,101 @@
"node": ">=6"
}
},
- "node_modules/exponential-backoff": {
+ "node_modules/fast-copy": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/fast-copy/-/fast-copy-4.0.3.tgz",
+ "integrity": "sha512-58apWr0GUiDFM8+3afrO6eYwJBn9ZAhDOzG3L+/9llab/haCARS2UIfffmOurYLwbgDRs8n0rfr6qAAPEAuAQw==",
+ "devOptional": true,
+ "license": "MIT"
+ },
+ "node_modules/fast-deep-equal": {
"version": "3.1.3",
- "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.3.tgz",
- "integrity": "sha512-ZgEeZXj30q+I0EN+CbSSpIyPaJ5HVQD18Z1m+u1FXbAeT94mr1zw50q4q6jiiC447Nl/YTcIYSAftiGqetwXCA==",
- "license": "Apache-2.0",
- "optional": true
+ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
+ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
+ "license": "MIT"
+ },
+ "node_modules/fast-diff": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz",
+ "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==",
+ "dev": true,
+ "license": "Apache-2.0"
+ },
+ "node_modules/fast-glob": {
+ "version": "3.3.3",
+ "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz",
+ "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==",
+ "devOptional": true,
+ "license": "MIT",
+ "dependencies": {
+ "@nodelib/fs.stat": "^2.0.2",
+ "@nodelib/fs.walk": "^1.2.3",
+ "glob-parent": "^5.1.2",
+ "merge2": "^1.3.0",
+ "micromatch": "^4.0.8"
+ },
+ "engines": {
+ "node": ">=8.6.0"
+ }
+ },
+ "node_modules/fast-glob/node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "devOptional": true,
+ "license": "ISC",
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/fast-json-stable-stringify": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
+ "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/fast-levenshtein": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+ "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/fast-safe-stringify": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz",
+ "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==",
+ "license": "MIT"
+ },
+ "node_modules/fastest-levenshtein": {
+ "version": "1.0.16",
+ "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz",
+ "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 4.9.1"
+ }
+ },
+ "node_modules/fastq": {
+ "version": "1.20.1",
+ "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz",
+ "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==",
+ "devOptional": true,
+ "license": "ISC",
+ "dependencies": {
+ "reusify": "^1.0.4"
+ }
},
"node_modules/fdir": {
"version": "6.5.0",
"resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz",
"integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==",
+ "devOptional": true,
"license": "MIT",
- "optional": true,
"engines": {
"node": ">=12.0.0"
},
@@ -505,18 +4214,218 @@
}
}
},
+ "node_modules/figures": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/figures/-/figures-6.1.0.tgz",
+ "integrity": "sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg==",
+ "devOptional": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-unicode-supported": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/file-entry-cache": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz",
+ "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "flat-cache": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=16.0.0"
+ }
+ },
+ "node_modules/file-type": {
+ "version": "22.0.1",
+ "resolved": "https://registry.npmjs.org/file-type/-/file-type-22.0.1.tgz",
+ "integrity": "sha512-ww5Mhre0EE+jmBvOXTmXAbEMuZE7uX4a3+oRCQFNj8w++g3ev913N6tXQz0XTXbueQ5TWQfm6BdaViEHHn8bhA==",
+ "license": "MIT",
+ "dependencies": {
+ "@tokenizer/inflate": "^0.4.1",
+ "strtok3": "^10.3.5",
+ "token-types": "^6.1.2",
+ "uint8array-extras": "^1.5.0"
+ },
+ "engines": {
+ "node": ">=22"
+ },
+ "funding": {
+ "url": "https://github.com/sindresorhus/file-type?sponsor=1"
+ }
+ },
"node_modules/file-uri-to-path": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz",
"integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==",
"license": "MIT"
},
+ "node_modules/fill-range": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
+ "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
+ "devOptional": true,
+ "license": "MIT",
+ "dependencies": {
+ "to-regex-range": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/find-cache-directory": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/find-cache-directory/-/find-cache-directory-6.0.0.tgz",
+ "integrity": "sha512-CvFd5ivA6HcSHbD+59P7CyzINHXzwhuQK8RY7CxJZtgDSAtRlHiCaQpZQ2lMR/WRyUIEmzUvL6G2AGurMfegZA==",
+ "license": "MIT",
+ "dependencies": {
+ "common-path-prefix": "^3.0.0",
+ "pkg-dir": "^8.0.0"
+ },
+ "engines": {
+ "node": ">=20"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/find-up": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
+ "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "locate-path": "^6.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/find-up-simple": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/find-up-simple/-/find-up-simple-1.0.1.tgz",
+ "integrity": "sha512-afd4O7zpqHeRyg4PfDQsXmlDe2PfdHtJt6Akt8jOWaApLOZk5JXs6VMR29lz03pRe9mpykrRCYIYxaJYcfpncQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/flat-cache": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz",
+ "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "flatted": "^3.2.9",
+ "keyv": "^4.5.4"
+ },
+ "engines": {
+ "node": ">=16"
+ }
+ },
"node_modules/flatted": {
"version": "3.4.2",
"resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.2.tgz",
"integrity": "sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==",
"license": "ISC"
},
+ "node_modules/flattie": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/flattie/-/flattie-1.1.1.tgz",
+ "integrity": "sha512-9UbaD6XdAL97+k/n+N7JwX46K/M6Zc6KcFYskrYL8wbBV/Uyk0CTAMY0VT+qiK5PM7AIc9aTWYtq65U7T+aCNQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/form-data": {
+ "version": "4.0.5",
+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz",
+ "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==",
+ "license": "MIT",
+ "dependencies": {
+ "asynckit": "^0.4.0",
+ "combined-stream": "^1.0.8",
+ "es-set-tostringtag": "^2.1.0",
+ "hasown": "^2.0.2",
+ "mime-types": "^2.1.12"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/form-data/node_modules/mime-db": {
+ "version": "1.52.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
+ "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/form-data/node_modules/mime-types": {
+ "version": "2.1.35",
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
+ "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
+ "license": "MIT",
+ "dependencies": {
+ "mime-db": "1.52.0"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/formidable": {
+ "version": "3.5.4",
+ "resolved": "https://registry.npmjs.org/formidable/-/formidable-3.5.4.tgz",
+ "integrity": "sha512-YikH+7CUTOtP44ZTnUhR7Ic2UASBPOqmaRkRKxRbywPTe5VxF7RRCck4af9wutiZ/QKM5nME9Bie2fFaPz5Gug==",
+ "license": "MIT",
+ "dependencies": {
+ "@paralleldrive/cuid2": "^2.2.2",
+ "dezalgo": "^1.0.4",
+ "once": "^1.4.0"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ },
+ "funding": {
+ "url": "https://ko-fi.com/tunnckoCore/commissions"
+ }
+ },
+ "node_modules/forwarded": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
+ "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/fresh": {
+ "version": "0.5.2",
+ "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
+ "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
"node_modules/fs-constants": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz",
@@ -537,18 +4446,308 @@
"node": ">=6 <7 || >=8"
}
},
+ "node_modules/function-bind": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
+ "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/get-east-asian-width": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.6.0.tgz",
+ "integrity": "sha512-QRbvDIbx6YklUe6RxeTeleMR0yv3cYH6PsPZHcnVn7xv7zO1BHN8r0XETu8n6Ye3Q+ahtSarc3WgtNWmehIBfA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/get-intrinsic": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz",
+ "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind-apply-helpers": "^1.0.2",
+ "es-define-property": "^1.0.1",
+ "es-errors": "^1.3.0",
+ "es-object-atoms": "^1.1.1",
+ "function-bind": "^1.1.2",
+ "get-proto": "^1.0.1",
+ "gopd": "^1.2.0",
+ "has-symbols": "^1.1.0",
+ "hasown": "^2.0.2",
+ "math-intrinsics": "^1.1.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/get-package-type": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz",
+ "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/get-port": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/get-port/-/get-port-7.2.0.tgz",
+ "integrity": "sha512-afP4W205ONCuMoPBqcR6PSXnzX35KTcJygfJfcp+QY+uwm3p20p1YczWXhlICIzGMCxYBQcySEcOgsJcrkyobg==",
+ "devOptional": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=16"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/get-proto": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz",
+ "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==",
+ "license": "MIT",
+ "dependencies": {
+ "dunder-proto": "^1.0.1",
+ "es-object-atoms": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/get-stream": {
+ "version": "9.0.1",
+ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-9.0.1.tgz",
+ "integrity": "sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==",
+ "devOptional": true,
+ "license": "MIT",
+ "dependencies": {
+ "@sec-ant/readable-stream": "^0.4.1",
+ "is-stream": "^4.0.1"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/get-tsconfig": {
+ "version": "4.14.0",
+ "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.14.0.tgz",
+ "integrity": "sha512-yTb+8DXzDREzgvYmh6s9vHsSVCHeC0G3PI5bEXNBHtmshPnO+S5O7qgLEOn0I5QvMy6kpZN8K1NKGyilLb93wA==",
+ "devOptional": true,
+ "license": "MIT",
+ "dependencies": {
+ "resolve-pkg-maps": "^1.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1"
+ }
+ },
+ "node_modules/getopts": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/getopts/-/getopts-2.3.0.tgz",
+ "integrity": "sha512-5eDf9fuSXwxBL6q5HX+dhDj+dslFGWzU5thZ9kNKUkcPtaPdatmUFKwHFrLb/uf/WpA4BHET+AX3Scl56cAjpA==",
+ "license": "MIT"
+ },
"node_modules/github-from-package": {
"version": "0.0.0",
"resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz",
"integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==",
"license": "MIT"
},
+ "node_modules/glob-parent": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
+ "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
+ "license": "ISC",
+ "dependencies": {
+ "is-glob": "^4.0.3"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/globals": {
+ "version": "17.6.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-17.6.0.tgz",
+ "integrity": "sha512-sepffkT8stwnIYbsMBpoCHJuJM5l98FUF2AnE07hfvE0m/qp3R586hw4jF4uadbhvg1ooIdzuu7CsfD2jzCaNA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/gopd": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz",
+ "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
"node_modules/graceful-fs": {
"version": "4.2.11",
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
"integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==",
"license": "ISC"
},
+ "node_modules/has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/has-symbols": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz",
+ "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/has-tostringtag": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz",
+ "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==",
+ "license": "MIT",
+ "dependencies": {
+ "has-symbols": "^1.0.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/hasown": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz",
+ "integrity": "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==",
+ "license": "MIT",
+ "dependencies": {
+ "function-bind": "^1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/he": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz",
+ "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==",
+ "license": "MIT",
+ "bin": {
+ "he": "bin/he"
+ }
+ },
+ "node_modules/help-me": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/help-me/-/help-me-5.0.0.tgz",
+ "integrity": "sha512-7xgomUX6ADmcYzFik0HzAxh/73YlKR9bmFzf51CZwR+b6YtzU2m0u49hQCqV6SvlqIqsaxovfwdvbnsw3b/zpg==",
+ "devOptional": true,
+ "license": "MIT"
+ },
+ "node_modules/hosted-git-info": {
+ "version": "9.0.3",
+ "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-9.0.3.tgz",
+ "integrity": "sha512-Hc+ghLoSt6QaYZUv0WBiIvmMDZuZZ7oaDvdH8MbfOO4lOsxdXLEvuC6ePoGs9H1X9oCLyq6+NVN0MKqD+ydxyg==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "lru-cache": "^11.1.0"
+ },
+ "engines": {
+ "node": "^20.17.0 || >=22.9.0"
+ }
+ },
+ "node_modules/hot-hook": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/hot-hook/-/hot-hook-1.0.0.tgz",
+ "integrity": "sha512-OkZm5tTE4ej8ur8VlcQwMm8G9sFxu4D+shM+ol/h4mrUhuZvFkjk5n/nWKmLq3COmy6epLN7XIIQJ75tnqCGIw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "chokidar": "^5.0.0",
+ "fast-glob": "^3.3.3",
+ "parse-imports": "^3.0.0",
+ "picomatch": "^4.0.3",
+ "read-package-up": "^12.0.0"
+ }
+ },
+ "node_modules/http-errors": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz",
+ "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==",
+ "license": "MIT",
+ "dependencies": {
+ "depd": "~2.0.0",
+ "inherits": "~2.0.4",
+ "setprototypeof": "~1.2.0",
+ "statuses": "~2.0.2",
+ "toidentifier": "~1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/express"
+ }
+ },
+ "node_modules/human-signals": {
+ "version": "8.0.1",
+ "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-8.0.1.tgz",
+ "integrity": "sha512-eKCa6bwnJhvxj14kZk5NCPc6Hb6BdsU9DZcOnmQKSnO1VKrfV0zCvtttPZUsBvjmNDn8rpcJfpwSYnHBjc95MQ==",
+ "devOptional": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=18.18.0"
+ }
+ },
+ "node_modules/iconv-lite": {
+ "version": "0.7.2",
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.2.tgz",
+ "integrity": "sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==",
+ "license": "MIT",
+ "dependencies": {
+ "safer-buffer": ">= 2.1.2 < 3.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/express"
+ }
+ },
"node_modules/ieee754": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
@@ -569,6 +4768,81 @@
],
"license": "BSD-3-Clause"
},
+ "node_modules/igniculus": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/igniculus/-/igniculus-1.5.0.tgz",
+ "integrity": "sha512-vhj2J/cSzNg2G5tcK4Z1KZdeYmQa5keoxFULUYAxctK/zHJb1oraO7noCqnJxKe1b2eZdiiaSL1IHPOFAI8UYQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=4.0.0"
+ }
+ },
+ "node_modules/ignore": {
+ "version": "5.3.2",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz",
+ "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "node_modules/import-meta-resolve": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-4.2.0.tgz",
+ "integrity": "sha512-Iqv2fzaTQN28s/FwZAoFq0ZSs/7hMAHJVX+w8PZl3cY19Pxk6jFFalxQoIfW2826i/fDLXv8IiEZRIT0lDuWcg==",
+ "devOptional": true,
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/imurmurhash": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
+ "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.8.19"
+ }
+ },
+ "node_modules/indent-string": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz",
+ "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/index-to-position": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/index-to-position/-/index-to-position-1.2.0.tgz",
+ "integrity": "sha512-Yg7+ztRkqslMAS2iFaU+Oa4KTSidr63OsFGlOrJoW981kIYO3CGCS3wA95P1mUi/IVSJkn0D479KTJpVpvFNuw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/inflation": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/inflation/-/inflation-2.1.0.tgz",
+ "integrity": "sha512-t54PPJHG1Pp7VQvxyVCJ9mBbjG3Hqryges9bXoOO6GExCPa+//i/d5GSuFtpx3ALLd7lgIAur6zrIlBQyJuMlQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
"node_modules/inherits": {
"version": "2.0.4",
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
@@ -581,21 +4855,28 @@
"integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==",
"license": "ISC"
},
+ "node_modules/interpret": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz",
+ "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
"node_modules/ioredis": {
- "version": "5.10.1",
- "resolved": "https://registry.npmjs.org/ioredis/-/ioredis-5.10.1.tgz",
- "integrity": "sha512-HuEDBTI70aYdx1v6U97SbNx9F1+svQKBDo30o0b9fw055LMepzpOOd0Ccg9Q6tbqmBSJaMuY0fB7yw9/vjBYCA==",
+ "version": "5.11.0",
+ "resolved": "https://registry.npmjs.org/ioredis/-/ioredis-5.11.0.tgz",
+ "integrity": "sha512-EZBErytyVovD8f6pDfG3Kb37N6Y3lmDA9NNj+4+IP13CzzHGeX+OyeRM2Um13khRzoBSzzL+5lVnCX8V2RLeMg==",
"license": "MIT",
"dependencies": {
- "@ioredis/commands": "1.5.1",
- "cluster-key-slot": "^1.1.0",
- "debug": "^4.3.4",
- "denque": "^2.1.0",
- "lodash.defaults": "^4.2.0",
- "lodash.isarguments": "^3.1.0",
- "redis-errors": "^1.2.0",
- "redis-parser": "^3.0.0",
- "standard-as-callback": "^2.1.0"
+ "@ioredis/commands": "1.10.0",
+ "cluster-key-slot": "1.1.1",
+ "debug": "4.4.3",
+ "denque": "2.1.0",
+ "redis-errors": "1.2.0",
+ "redis-parser": "3.0.0",
+ "standard-as-callback": "2.1.0"
},
"engines": {
"node": ">=12.22.0"
@@ -605,29 +4886,290 @@
"url": "https://opencollective.com/ioredis"
}
},
- "node_modules/isexe": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/isexe/-/isexe-4.0.0.tgz",
- "integrity": "sha512-FFUtZMpoZ8RqHS3XeXEmHWLA4thH+ZxCv2lOiPIn1Xc7CxrqhWzNSDzD+/chS/zbYezmiwWLdQC09JdQKmthOw==",
- "license": "BlueOak-1.0.0",
- "optional": true,
+ "node_modules/ipaddr.js": {
+ "version": "1.9.1",
+ "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
+ "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==",
+ "license": "MIT",
"engines": {
- "node": ">=20"
+ "node": ">= 0.10"
}
},
- "node_modules/js-yaml": {
- "version": "3.14.1",
- "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz",
- "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==",
+ "node_modules/is-builtin-module": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-5.0.0.tgz",
+ "integrity": "sha512-f4RqJKBUe5rQkJ2eJEJBXSticB3hGbN9j0yxxMQFqIW89Jp9WYFtzfTcRlstDKVUTRzSOTLKRfO9vIztenwtxA==",
+ "dev": true,
"license": "MIT",
"dependencies": {
- "argparse": "^1.0.7",
- "esprima": "^4.0.0"
+ "builtin-modules": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=18.20"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/is-core-module": {
+ "version": "2.16.2",
+ "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.2.tgz",
+ "integrity": "sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA==",
+ "license": "MIT",
+ "dependencies": {
+ "hasown": "^2.0.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-docker": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz",
+ "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==",
+ "devOptional": true,
+ "license": "MIT",
+ "bin": {
+ "is-docker": "cli.js"
+ },
+ "engines": {
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-fullwidth-code-point": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-5.1.0.tgz",
+ "integrity": "sha512-5XHYaSyiqADb4RnZ1Bdad6cPp8Toise4TzEjcOYDHZkTCbKgiUl7WTUCpNWHuxmDt91wnsZBc9xinNzopv3JMQ==",
+ "license": "MIT",
+ "dependencies": {
+ "get-east-asian-width": "^1.3.1"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/is-glob": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
+ "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
+ "license": "MIT",
+ "dependencies": {
+ "is-extglob": "^2.1.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-in-ssh": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-in-ssh/-/is-in-ssh-1.0.0.tgz",
+ "integrity": "sha512-jYa6Q9rH90kR1vKB6NM7qqd1mge3Fx4Dhw5TVlK1MUBqhEOuCagrEHMevNuCcbECmXZ0ThXkRm+Ymr51HwEPAw==",
+ "devOptional": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=20"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/is-inside-container": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz",
+ "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==",
+ "devOptional": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-docker": "^3.0.0"
+ },
+ "bin": {
+ "is-inside-container": "cli.js"
+ },
+ "engines": {
+ "node": ">=14.16"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/is-number": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+ "devOptional": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.12.0"
+ }
+ },
+ "node_modules/is-plain-obj": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz",
+ "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==",
+ "devOptional": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/is-stream": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-4.0.1.tgz",
+ "integrity": "sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==",
+ "devOptional": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/is-unicode-supported": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.1.0.tgz",
+ "integrity": "sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==",
+ "devOptional": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/is-wsl": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.1.tgz",
+ "integrity": "sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw==",
+ "devOptional": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-inside-container": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=16"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/isexe": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
+ "devOptional": true,
+ "license": "ISC"
+ },
+ "node_modules/jest-diff": {
+ "version": "30.4.1",
+ "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-30.4.1.tgz",
+ "integrity": "sha512-CRpFK0RtLriVDGcPPAnR6HMVI8bSR2jnUIgralhauzYQZIb4RH9AtEInTuQr65LmmGggGcRT6HIASxwqsVsmlA==",
+ "license": "MIT",
+ "dependencies": {
+ "@jest/diff-sequences": "30.4.0",
+ "@jest/get-type": "30.1.0",
+ "chalk": "^4.1.2",
+ "pretty-format": "30.4.1"
+ },
+ "engines": {
+ "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
+ }
+ },
+ "node_modules/joycon": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/joycon/-/joycon-3.1.1.tgz",
+ "integrity": "sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==",
+ "devOptional": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/js-tokens": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
+ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/js-yaml": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.2.0.tgz",
+ "integrity": "sha512-ePWsvanv0DWuDRsW8dnt+R4jQ31SCRCQ7hhNcPXZPsoBZiemuZNYGf7adZdqX2D86j6rvKp3RpCxVTSb8WQlOw==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/puzrin"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/nodeca"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "argparse": "^2.0.1"
},
"bin": {
"js-yaml": "bin/js-yaml.js"
}
},
+ "node_modules/jsesc": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz",
+ "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "jsesc": "bin/jsesc"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/json-buffer": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz",
+ "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/json-schema-traverse": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/json-stable-stringify-without-jsonify": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
+ "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/jsonfile": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
@@ -637,6 +5179,268 @@
"graceful-fs": "^4.1.6"
}
},
+ "node_modules/jsonschema": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/jsonschema/-/jsonschema-1.5.0.tgz",
+ "integrity": "sha512-K+A9hhqbn0f3pJX17Q/7H6yQfD/5OXgdrR5UE12gMXCiN9D5Xq2o5mddV2QEcX/bjla99ASsAAQUyMCCRWAEhw==",
+ "license": "MIT",
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/junk": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/junk/-/junk-4.0.1.tgz",
+ "integrity": "sha512-Qush0uP+G8ZScpGMZvHUiRfI0YBWuB3gVBYlI0v0vvOJt5FLicco+IkP0a50LqTTQhmts/m6tP5SWE+USyIvcQ==",
+ "devOptional": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12.20"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/keyv": {
+ "version": "4.5.4",
+ "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz",
+ "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "json-buffer": "3.0.1"
+ }
+ },
+ "node_modules/kleur": {
+ "version": "4.1.5",
+ "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz",
+ "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/knex": {
+ "version": "3.2.10",
+ "resolved": "https://registry.npmjs.org/knex/-/knex-3.2.10.tgz",
+ "integrity": "sha512-oypTHfrc9i72iyxaUQBKHOxhcr0xM65MPf6FpN02nimsftXwzXprIkLjfXdubvhbu4PMWLp023q8o8CYvHSuZw==",
+ "license": "MIT",
+ "dependencies": {
+ "colorette": "2.0.19",
+ "commander": "^10.0.0",
+ "debug": "4.3.4",
+ "escalade": "^3.1.1",
+ "esm": "^3.2.25",
+ "get-package-type": "^0.1.0",
+ "getopts": "2.3.0",
+ "interpret": "^2.2.0",
+ "lodash": "^4.18.1",
+ "pg-connection-string": "2.6.2",
+ "rechoir": "^0.8.0",
+ "resolve-from": "^5.0.0",
+ "tarn": "^3.0.2",
+ "tildify": "2.0.0"
+ },
+ "bin": {
+ "knex": "bin/cli.js"
+ },
+ "engines": {
+ "node": ">=16"
+ },
+ "peerDependencies": {
+ "pg-query-stream": "^4.14.0"
+ },
+ "peerDependenciesMeta": {
+ "better-sqlite3": {
+ "optional": true
+ },
+ "mysql": {
+ "optional": true
+ },
+ "mysql2": {
+ "optional": true
+ },
+ "pg": {
+ "optional": true
+ },
+ "pg-native": {
+ "optional": true
+ },
+ "pg-query-stream": {
+ "optional": true
+ },
+ "sqlite3": {
+ "optional": true
+ },
+ "tedious": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/knex-dynamic-connection": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/knex-dynamic-connection/-/knex-dynamic-connection-5.1.0.tgz",
+ "integrity": "sha512-kv41rybMmUKOEAxkGytKRITAthuHFzt0l5vRT1SuTOcve4a9JMc1t/ElVOTRlBEkBexWX8A5WcO71cufrqAxkw==",
+ "license": "MIT",
+ "dependencies": {
+ "debug": "^4.4.3",
+ "knex": "3.2.7"
+ },
+ "engines": {
+ "node": ">=24.0.0"
+ }
+ },
+ "node_modules/knex-dynamic-connection/node_modules/knex": {
+ "version": "3.2.7",
+ "resolved": "https://registry.npmjs.org/knex/-/knex-3.2.7.tgz",
+ "integrity": "sha512-VxdDE72x7Tc08E5yCu8HqYoeOm0HOjAraOtYiGSAUJTYkydwfSGBOpQqYHrzM5vjLNzw2JDL2vDH8m7DjIjtgA==",
+ "license": "MIT",
+ "dependencies": {
+ "colorette": "2.0.19",
+ "commander": "^10.0.0",
+ "debug": "4.3.4",
+ "escalade": "^3.1.1",
+ "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"
+ },
+ "bin": {
+ "knex": "bin/cli.js"
+ },
+ "engines": {
+ "node": ">=16"
+ },
+ "peerDependencies": {
+ "pg-query-stream": "^4.14.0"
+ },
+ "peerDependenciesMeta": {
+ "better-sqlite3": {
+ "optional": true
+ },
+ "mysql": {
+ "optional": true
+ },
+ "mysql2": {
+ "optional": true
+ },
+ "pg": {
+ "optional": true
+ },
+ "pg-native": {
+ "optional": true
+ },
+ "pg-query-stream": {
+ "optional": true
+ },
+ "sqlite3": {
+ "optional": true
+ },
+ "tedious": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/knex-dynamic-connection/node_modules/knex/node_modules/debug": {
+ "version": "4.3.4",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
+ "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
+ "license": "MIT",
+ "dependencies": {
+ "ms": "2.1.2"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/knex-dynamic-connection/node_modules/ms": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+ "license": "MIT"
+ },
+ "node_modules/knex/node_modules/debug": {
+ "version": "4.3.4",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
+ "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
+ "license": "MIT",
+ "dependencies": {
+ "ms": "2.1.2"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/knex/node_modules/ms": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+ "license": "MIT"
+ },
+ "node_modules/ky": {
+ "version": "1.14.3",
+ "resolved": "https://registry.npmjs.org/ky/-/ky-1.14.3.tgz",
+ "integrity": "sha512-9zy9lkjac+TR1c2tG+mkNSVlyOpInnWdSMiue4F+kq8TwJSgv6o8jhLRg8Ho6SnZ9wOYUq/yozts9qQCfk7bIw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sindresorhus/ky?sponsor=1"
+ }
+ },
+ "node_modules/levn": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
+ "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "prelude-ls": "^1.2.1",
+ "type-check": "~0.4.0"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/locate-path": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
+ "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-locate": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/lodash": {
+ "version": "4.18.1",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.18.1.tgz",
+ "integrity": "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==",
+ "license": "MIT"
+ },
"node_modules/lodash.defaults": {
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz",
@@ -649,6 +5453,52 @@
"integrity": "sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg==",
"license": "MIT"
},
+ "node_modules/log-update": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/log-update/-/log-update-7.2.0.tgz",
+ "integrity": "sha512-iLs7dGSyjZiUgvrUvuD3FndAxVJk+TywBkkkwUSm9HdYoskJalWg5qVsEiXeufPvRVPbCUmNQewg798rx+sPXg==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-escapes": "^7.3.0",
+ "cli-cursor": "^5.0.0",
+ "slice-ansi": "^8.0.0",
+ "strip-ansi": "^7.2.0",
+ "wrap-ansi": "^10.0.0"
+ },
+ "engines": {
+ "node": ">=20"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/log-update/node_modules/ansi-regex": {
+ "version": "6.2.2",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz",
+ "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-regex?sponsor=1"
+ }
+ },
+ "node_modules/log-update/node_modules/strip-ansi": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz",
+ "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-regex": "^6.2.2"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/strip-ansi?sponsor=1"
+ }
+ },
"node_modules/log4js": {
"version": "6.9.1",
"resolved": "https://registry.npmjs.org/log4js/-/log4js-6.9.1.tgz",
@@ -665,6 +5515,16 @@
"node": ">=8.0"
}
},
+ "node_modules/lru-cache": {
+ "version": "11.5.1",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.5.1.tgz",
+ "integrity": "sha512-RPimw/7aMdv2oqRrxKwvZXcPfwBrn/JZ2xYcY9Hus/6LaS3VOAKVWKWgNLCFSiOm1ESXinjsDlidVU7JlnCN2A==",
+ "dev": true,
+ "license": "BlueOak-1.0.0",
+ "engines": {
+ "node": "20 || >=22"
+ }
+ },
"node_modules/luxon": {
"version": "3.7.2",
"resolved": "https://registry.npmjs.org/luxon/-/luxon-3.7.2.tgz",
@@ -674,6 +5534,119 @@
"node": ">=12"
}
},
+ "node_modules/math-intrinsics": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
+ "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/media-typer": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz",
+ "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/merge2": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
+ "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
+ "devOptional": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/methods": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
+ "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/micromatch": {
+ "version": "4.0.8",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz",
+ "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==",
+ "devOptional": true,
+ "license": "MIT",
+ "dependencies": {
+ "braces": "^3.0.3",
+ "picomatch": "^2.3.1"
+ },
+ "engines": {
+ "node": ">=8.6"
+ }
+ },
+ "node_modules/micromatch/node_modules/picomatch": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz",
+ "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==",
+ "devOptional": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/mime": {
+ "version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz",
+ "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==",
+ "license": "MIT",
+ "bin": {
+ "mime": "cli.js"
+ },
+ "engines": {
+ "node": ">=4.0.0"
+ }
+ },
+ "node_modules/mime-db": {
+ "version": "1.54.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz",
+ "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/mime-types": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz",
+ "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==",
+ "license": "MIT",
+ "dependencies": {
+ "mime-db": "^1.54.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/express"
+ }
+ },
+ "node_modules/mimic-function": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz",
+ "integrity": "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
"node_modules/mimic-response": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz",
@@ -686,6 +5659,22 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
+ "node_modules/minimatch": {
+ "version": "10.2.5",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz",
+ "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==",
+ "devOptional": true,
+ "license": "BlueOak-1.0.0",
+ "dependencies": {
+ "brace-expansion": "^5.0.5"
+ },
+ "engines": {
+ "node": "18 || 20 || >=22"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
"node_modules/minimist": {
"version": "1.2.8",
"resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz",
@@ -695,27 +5684,6 @@
"url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/minipass": {
- "version": "7.1.3",
- "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz",
- "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==",
- "license": "BlueOak-1.0.0",
- "engines": {
- "node": ">=16 || 14 >=14.17"
- }
- },
- "node_modules/minizlib": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.1.0.tgz",
- "integrity": "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==",
- "license": "MIT",
- "dependencies": {
- "minipass": "^7.1.2"
- },
- "engines": {
- "node": ">= 18"
- }
- },
"node_modules/mkdirp-classic": {
"version": "0.5.3",
"resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz",
@@ -729,12 +5697,12 @@
"license": "MIT"
},
"node_modules/msgpackr": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/msgpackr/-/msgpackr-2.0.1.tgz",
- "integrity": "sha512-9J+tqTEsbHqY8YohazYgty7LgerFIWxvMLpUjqETSmjHojtJm2WnX2kK/2a1fLI7CO7ERP1YSEUXMucz4j+yBA==",
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/msgpackr/-/msgpackr-2.0.2.tgz",
+ "integrity": "sha512-c5hYOXFbP79Slh6Dzd2wzk+jnV7mX1UxfMYtilnY1NmalXPqG8DGb5cYCMBrW4AsH3zekBBZd4QrKz9NhtvYLQ==",
"license": "MIT",
"optionalDependencies": {
- "msgpackr-extract": "^3.0.2"
+ "msgpackr-extract": "^3.0.4"
}
},
"node_modules/msgpackr-extract": {
@@ -765,10 +5733,18 @@
"integrity": "sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA==",
"license": "MIT"
},
+ "node_modules/natural-compare": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
+ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/nntp-js": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/nntp-js/-/nntp-js-1.0.4.tgz",
- "integrity": "sha512-EqtWNHyRhaV9q+sWm/EKe67Zc3MZ006HSFnn2zFs+SltspH/41IM5czFKCqvVozy9LfH238wo2i8i+cyRHoHxA=="
+ "integrity": "sha512-EqtWNHyRhaV9q+sWm/EKe67Zc3MZ006HSFnn2zFs+SltspH/41IM5czFKCqvVozy9LfH238wo2i8i+cyRHoHxA==",
+ "license": "ISC"
},
"node_modules/node-abi": {
"version": "3.92.0",
@@ -788,40 +5764,6 @@
"integrity": "sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==",
"license": "MIT"
},
- "node_modules/node-addon-api": {
- "version": "8.8.0",
- "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-8.8.0.tgz",
- "integrity": "sha512-c5Ko1fZJIJmzhFIkhRN76WTq+fC6tWnGy9CXA0fA+XygsWZmEwG8vmbkNqxMyoaa0Tin4djul49NzdVcJJcjeA==",
- "license": "MIT",
- "engines": {
- "node": "^18 || ^20 || >= 21"
- }
- },
- "node_modules/node-gyp": {
- "version": "12.3.0",
- "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-12.3.0.tgz",
- "integrity": "sha512-QNcUWM+HgJplcPzBvFBZ9VXacyGZ4+VTOb80PwWR+TlVzoHbRKULNEzpRsnaoxG3Wzr7Qh7BYxGDU3CbKib2Yg==",
- "license": "MIT",
- "optional": true,
- "dependencies": {
- "env-paths": "^2.2.0",
- "exponential-backoff": "^3.1.1",
- "graceful-fs": "^4.2.6",
- "nopt": "^9.0.0",
- "proc-log": "^6.0.0",
- "semver": "^7.3.5",
- "tar": "^7.5.4",
- "tinyglobby": "^0.2.12",
- "undici": "^6.25.0",
- "which": "^6.0.0"
- },
- "bin": {
- "node-gyp": "bin/node-gyp.js"
- },
- "engines": {
- "node": "^20.17.0 || >=22.9.0"
- }
- },
"node_modules/node-gyp-build-optional-packages": {
"version": "5.2.2",
"resolved": "https://registry.npmjs.org/node-gyp-build-optional-packages/-/node-gyp-build-optional-packages-5.2.2.tgz",
@@ -837,6 +5779,16 @@
"node-gyp-build-optional-packages-test": "build-test.js"
}
},
+ "node_modules/node-releases": {
+ "version": "2.0.47",
+ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.47.tgz",
+ "integrity": "sha512-Uzmd6LXpouKo8EUK68IjH4+E01w/hXyV3R3g/geCJo+rXLNfh1xucB+LOzYEOQPSiUK3h/xZf0cQGcSsmyL2Og==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ }
+ },
"node_modules/node-unrar-js": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/node-unrar-js/-/node-unrar-js-2.0.2.tgz",
@@ -846,22 +5798,102 @@
"node": ">=10.0.0"
}
},
- "node_modules/nopt": {
- "version": "9.0.0",
- "resolved": "https://registry.npmjs.org/nopt/-/nopt-9.0.0.tgz",
- "integrity": "sha512-Zhq3a+yFKrYwSBluL4H9XP3m3y5uvQkB/09CwDruCiRmR/UJYnn9W4R48ry0uGC70aeTPKLynBtscP9efFFcPw==",
- "license": "ISC",
- "optional": true,
+ "node_modules/normalize-package-data": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-8.0.0.tgz",
+ "integrity": "sha512-RWk+PI433eESQ7ounYxIp67CYuVsS1uYSonX3kA6ps/3LWfjVQa/ptEg6Y3T6uAMq1mWpX9PQ+qx+QaHpsc7gQ==",
+ "dev": true,
+ "license": "BSD-2-Clause",
"dependencies": {
- "abbrev": "^4.0.0"
- },
- "bin": {
- "nopt": "bin/nopt.js"
+ "hosted-git-info": "^9.0.0",
+ "semver": "^7.3.5",
+ "validate-npm-package-license": "^3.0.4"
},
"engines": {
"node": "^20.17.0 || >=22.9.0"
}
},
+ "node_modules/normalize-url": {
+ "version": "8.1.1",
+ "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.1.1.tgz",
+ "integrity": "sha512-JYc0DPlpGWB40kH5g07gGTrYuMqV653k3uBKY6uITPWds3M0ov3GaWGp9lbE3Bzngx8+XkfzgvASb9vk9JDFXQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=14.16"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/npm-run-path": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-6.0.0.tgz",
+ "integrity": "sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA==",
+ "devOptional": true,
+ "license": "MIT",
+ "dependencies": {
+ "path-key": "^4.0.0",
+ "unicorn-magic": "^0.3.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/npm-run-path/node_modules/path-key": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz",
+ "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==",
+ "devOptional": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/object-inspect": {
+ "version": "1.13.4",
+ "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz",
+ "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/object-to-formdata": {
+ "version": "4.5.1",
+ "resolved": "https://registry.npmjs.org/object-to-formdata/-/object-to-formdata-4.5.1.tgz",
+ "integrity": "sha512-QiM9D0NiU5jV6J6tjE1g7b4Z2tcUnKs1OPUi4iMb2zH+7jwlcUrASghgkFk9GtzqNNq8rTQJtT8AzjBAvLoNMw==",
+ "license": "MIT"
+ },
+ "node_modules/on-exit-leak-free": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/on-exit-leak-free/-/on-exit-leak-free-2.1.2.tgz",
+ "integrity": "sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/on-finished": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
+ "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
+ "license": "MIT",
+ "dependencies": {
+ "ee-first": "1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
"node_modules/once": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
@@ -871,12 +5903,300 @@
"wrappy": "1"
}
},
+ "node_modules/onetime": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz",
+ "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==",
+ "license": "MIT",
+ "dependencies": {
+ "mimic-function": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/open": {
+ "version": "11.0.0",
+ "resolved": "https://registry.npmjs.org/open/-/open-11.0.0.tgz",
+ "integrity": "sha512-smsWv2LzFjP03xmvFoJ331ss6h+jixfA4UUV/Bsiyuu4YJPfN+FIQGOIiv4w9/+MoHkfkJ22UIaQWRVFRfH6Vw==",
+ "devOptional": true,
+ "license": "MIT",
+ "dependencies": {
+ "default-browser": "^5.4.0",
+ "define-lazy-prop": "^3.0.0",
+ "is-in-ssh": "^1.0.0",
+ "is-inside-container": "^1.0.0",
+ "powershell-utils": "^0.1.0",
+ "wsl-utils": "^0.3.0"
+ },
+ "engines": {
+ "node": ">=20"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/optionator": {
+ "version": "0.9.4",
+ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz",
+ "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "deep-is": "^0.1.3",
+ "fast-levenshtein": "^2.0.6",
+ "levn": "^0.4.1",
+ "prelude-ls": "^1.2.1",
+ "type-check": "^0.4.0",
+ "word-wrap": "^1.2.5"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/p-limit": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
+ "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "yocto-queue": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/p-locate": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
+ "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-limit": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/package-manager-detector": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/package-manager-detector/-/package-manager-detector-1.6.0.tgz",
+ "integrity": "sha512-61A5ThoTiDG/C8s8UMZwSorAGwMJ0ERVGj2OjoW5pAalsNOg15+iQiPzrLJ4jhZ1HJzmC2PIHT2oEiH3R5fzNA==",
+ "devOptional": true,
+ "license": "MIT"
+ },
+ "node_modules/parse-imports": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/parse-imports/-/parse-imports-3.0.0.tgz",
+ "integrity": "sha512-IwiqoJANa4O6M76LBWEvoS2iPIUqBOnKG1lV3/J0oVM6V2XjED+mYAXedEMX5xUglVjfGpZOfaEyuOUjBuUE4g==",
+ "license": "Apache-2.0 AND MIT",
+ "dependencies": {
+ "es-module-lexer": "^1.7.0",
+ "slashes": "^3.0.12"
+ },
+ "engines": {
+ "node": ">= 22"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/TomerAberbach"
+ }
+ },
+ "node_modules/parse-json": {
+ "version": "8.3.0",
+ "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-8.3.0.tgz",
+ "integrity": "sha512-ybiGyvspI+fAoRQbIPRddCcSTV9/LsJbf0e/S85VLowVGzRmokfneg2kwVW/KU5rOXrPSbF1qAKPMgNTqqROQQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/code-frame": "^7.26.2",
+ "index-to-position": "^1.1.0",
+ "type-fest": "^4.39.1"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/parse-json/node_modules/type-fest": {
+ "version": "4.41.0",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz",
+ "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==",
+ "dev": true,
+ "license": "(MIT OR CC0-1.0)",
+ "engines": {
+ "node": ">=16"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/parse-ms": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-4.0.0.tgz",
+ "integrity": "sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw==",
+ "devOptional": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/path-browserify": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz",
+ "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==",
+ "devOptional": true,
+ "license": "MIT"
+ },
+ "node_modules/path-exists": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
+ "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/path-key": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+ "devOptional": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/path-parse": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
+ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
+ "license": "MIT"
+ },
+ "node_modules/pg": {
+ "version": "8.21.0",
+ "resolved": "https://registry.npmjs.org/pg/-/pg-8.21.0.tgz",
+ "integrity": "sha512-AUP1EYJuHraQGsVoCQVIcM7TEJVGtDzxWtGFZd8rds9d+CCXlU5Js1rYgfLNvxy9iJrpHjGrRjoi/3BT9fRyiA==",
+ "license": "MIT",
+ "dependencies": {
+ "pg-connection-string": "^2.13.0",
+ "pg-pool": "^3.14.0",
+ "pg-protocol": "^1.14.0",
+ "pg-types": "2.2.0",
+ "pgpass": "1.0.5"
+ },
+ "engines": {
+ "node": ">= 16.0.0"
+ },
+ "optionalDependencies": {
+ "pg-cloudflare": "^1.4.0"
+ },
+ "peerDependencies": {
+ "pg-native": ">=3.0.1"
+ },
+ "peerDependenciesMeta": {
+ "pg-native": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/pg-cloudflare": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/pg-cloudflare/-/pg-cloudflare-1.4.0.tgz",
+ "integrity": "sha512-Vo7z/6rrQYxpNRylp4Tlob2elzbh+N/MOQbxFVWCxS7oEx6jF53GTJFxK2WWpKuBRkmiin4Mt+xofFDjx09R0A==",
+ "license": "MIT",
+ "optional": true
+ },
+ "node_modules/pg-connection-string": {
+ "version": "2.6.2",
+ "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.6.2.tgz",
+ "integrity": "sha512-ch6OwaeaPYcova4kKZ15sbJ2hKb/VP48ZD2gE7i1J+L4MspCtBMAx8nMgz7bksc7IojCIIWuEhHibSMFH8m8oA==",
+ "license": "MIT"
+ },
+ "node_modules/pg-int8": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz",
+ "integrity": "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==",
+ "license": "ISC",
+ "engines": {
+ "node": ">=4.0.0"
+ }
+ },
+ "node_modules/pg-pool": {
+ "version": "3.14.0",
+ "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.14.0.tgz",
+ "integrity": "sha512-gKtPkFdQPU3DksooVLi9LsjZxrsBUZIpa+7aVx+LV5pNh0KzP4Zleud2po+ConrxbuXGBJ6Hfer6hdgpIBpBaw==",
+ "license": "MIT",
+ "peerDependencies": {
+ "pg": ">=8.0"
+ }
+ },
+ "node_modules/pg-protocol": {
+ "version": "1.14.0",
+ "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.14.0.tgz",
+ "integrity": "sha512-n5taZ1kO3s9ngDTVxsEznOqCyToTgz0FLuPq0B33COy5pPpuWJpY3/2oRBVETuOgzdqRXfWpM9HIhp2LBBT1BA==",
+ "license": "MIT"
+ },
+ "node_modules/pg-types": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz",
+ "integrity": "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==",
+ "license": "MIT",
+ "dependencies": {
+ "pg-int8": "1.0.1",
+ "postgres-array": "~2.0.0",
+ "postgres-bytea": "~1.0.0",
+ "postgres-date": "~1.0.4",
+ "postgres-interval": "^1.1.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/pg/node_modules/pg-connection-string": {
+ "version": "2.13.0",
+ "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.13.0.tgz",
+ "integrity": "sha512-EMnU9E2fSULdsbErBbMaXJvFeD9B4+nPcM3f+4lsiCR0BHLPrLVjv3DbyM2hgQQviKJaTWIRRTjKjWlHg3p2ig==",
+ "license": "MIT"
+ },
+ "node_modules/pgpass": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/pgpass/-/pgpass-1.0.5.tgz",
+ "integrity": "sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==",
+ "license": "MIT",
+ "dependencies": {
+ "split2": "^4.1.0"
+ }
+ },
+ "node_modules/picocolors": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
+ "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
+ "dev": true,
+ "license": "ISC"
+ },
"node_modules/picomatch": {
"version": "4.0.4",
"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz",
"integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==",
+ "devOptional": true,
"license": "MIT",
- "optional": true,
"engines": {
"node": ">=12"
},
@@ -884,6 +6204,144 @@
"url": "https://github.com/sponsors/jonschlinkert"
}
},
+ "node_modules/pino": {
+ "version": "10.3.1",
+ "resolved": "https://registry.npmjs.org/pino/-/pino-10.3.1.tgz",
+ "integrity": "sha512-r34yH/GlQpKZbU1BvFFqOjhISRo1MNx1tWYsYvmj6KIRHSPMT2+yHOEb1SG6NMvRoHRF0a07kCOox/9yakl1vg==",
+ "license": "MIT",
+ "dependencies": {
+ "@pinojs/redact": "^0.4.0",
+ "atomic-sleep": "^1.0.0",
+ "on-exit-leak-free": "^2.1.0",
+ "pino-abstract-transport": "^3.0.0",
+ "pino-std-serializers": "^7.0.0",
+ "process-warning": "^5.0.0",
+ "quick-format-unescaped": "^4.0.3",
+ "real-require": "^0.2.0",
+ "safe-stable-stringify": "^2.3.1",
+ "sonic-boom": "^4.0.1",
+ "thread-stream": "^4.0.0"
+ },
+ "bin": {
+ "pino": "bin.js"
+ }
+ },
+ "node_modules/pino-abstract-transport": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/pino-abstract-transport/-/pino-abstract-transport-3.0.0.tgz",
+ "integrity": "sha512-wlfUczU+n7Hy/Ha5j9a/gZNy7We5+cXp8YL+X+PG8S0KXxw7n/JXA3c46Y0zQznIJ83URJiwy7Lh56WLokNuxg==",
+ "license": "MIT",
+ "dependencies": {
+ "split2": "^4.0.0"
+ }
+ },
+ "node_modules/pino-pretty": {
+ "version": "13.1.3",
+ "resolved": "https://registry.npmjs.org/pino-pretty/-/pino-pretty-13.1.3.tgz",
+ "integrity": "sha512-ttXRkkOz6WWC95KeY9+xxWL6AtImwbyMHrL1mSwqwW9u+vLp/WIElvHvCSDg0xO/Dzrggz1zv3rN5ovTRVowKg==",
+ "devOptional": true,
+ "license": "MIT",
+ "dependencies": {
+ "colorette": "^2.0.7",
+ "dateformat": "^4.6.3",
+ "fast-copy": "^4.0.0",
+ "fast-safe-stringify": "^2.1.1",
+ "help-me": "^5.0.0",
+ "joycon": "^3.1.1",
+ "minimist": "^1.2.6",
+ "on-exit-leak-free": "^2.1.0",
+ "pino-abstract-transport": "^3.0.0",
+ "pump": "^3.0.0",
+ "secure-json-parse": "^4.0.0",
+ "sonic-boom": "^4.0.1",
+ "strip-json-comments": "^5.0.2"
+ },
+ "bin": {
+ "pino-pretty": "bin.js"
+ }
+ },
+ "node_modules/pino-std-serializers": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-7.1.0.tgz",
+ "integrity": "sha512-BndPH67/JxGExRgiX1dX0w1FvZck5Wa4aal9198SrRhZjH3GxKQUKIBnYJTdj2HDN3UQAS06HlfcSbQj2OHmaw==",
+ "license": "MIT"
+ },
+ "node_modules/pkg-dir": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-8.0.0.tgz",
+ "integrity": "sha512-4peoBq4Wks0riS0z8741NVv+/8IiTvqnZAr8QGgtdifrtpdXbNw/FxRS1l6NFqm4EMzuS0EDqNNx4XGaz8cuyQ==",
+ "license": "MIT",
+ "dependencies": {
+ "find-up-simple": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/pluralize": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz",
+ "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/postgres-array": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz",
+ "integrity": "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/postgres-bytea": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.1.tgz",
+ "integrity": "sha512-5+5HqXnsZPE65IJZSMkZtURARZelel2oXUEO8rH83VS/hxH5vv1uHquPg5wZs8yMAfdv971IU+kcPUczi7NVBQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/postgres-date": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.7.tgz",
+ "integrity": "sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/postgres-interval": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz",
+ "integrity": "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==",
+ "license": "MIT",
+ "dependencies": {
+ "xtend": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/powershell-utils": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/powershell-utils/-/powershell-utils-0.1.0.tgz",
+ "integrity": "sha512-dM0jVuXJPsDN6DvRpea484tCUaMiXWjuCn++HGTqUWzGDjv5tZkEZldAJ/UMlqRYGFrD/etByo4/xOuC/snX2A==",
+ "devOptional": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=20"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
"node_modules/prebuild-install": {
"version": "7.1.3",
"resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.3.tgz",
@@ -911,14 +6369,141 @@
"node": ">=10"
}
},
- "node_modules/proc-log": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-6.1.0.tgz",
- "integrity": "sha512-iG+GYldRf2BQ0UDUAd6JQ/RwzaQy6mXmsk/IzlYyal4A4SNFw54MeH4/tLkF4I5WoWG9SQwuqWzS99jaFQHBuQ==",
- "license": "ISC",
- "optional": true,
+ "node_modules/prelude-ls": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
+ "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
+ "dev": true,
+ "license": "MIT",
"engines": {
- "node": "^20.17.0 || >=22.9.0"
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/prettier": {
+ "version": "3.8.3",
+ "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.8.3.tgz",
+ "integrity": "sha512-7igPTM53cGHMW8xWuVTydi2KO233VFiTNyF5hLJqpilHfmn8C8gPf+PS7dUT64YcXFbiMGZxS9pCSxL/Dxm/Jw==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "prettier": "bin/prettier.cjs"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/prettier/prettier?sponsor=1"
+ }
+ },
+ "node_modules/prettier-edge": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/prettier-edge/-/prettier-edge-1.0.0.tgz",
+ "integrity": "sha512-D8DwcGGPVWhMUrrE0+R242laEezGmvOpdCdvwVZiySpebZ1H5o7xwmDYhRw//ckOz1EcLOtQyJt/eQ2UC3eXOw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "angular-html-parser": "^10.6.1",
+ "edge-lexer": "^6.0.5"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "prettier": "^3.0.0"
+ }
+ },
+ "node_modules/prettier-linter-helpers": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.1.tgz",
+ "integrity": "sha512-SxToR7P8Y2lWmv/kTzVLC1t/GDI2WGjMwNhLLE9qtH8Q13C+aEmuRlzDst4Up4s0Wc8sF2M+J57iB3cMLqftfg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "fast-diff": "^1.1.2"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/pretty-format": {
+ "version": "30.4.1",
+ "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.4.1.tgz",
+ "integrity": "sha512-K6KiKMHTL4jjX4u3Kir2EW07nRfcqVTXIImx50wbjHQTcZPgg+gjVeNTIT3l3L1Rd4UefxfogquC9J37SoFyyw==",
+ "license": "MIT",
+ "dependencies": {
+ "@jest/schemas": "30.4.1",
+ "ansi-styles": "^5.2.0",
+ "react-is-18": "npm:react-is@^18.3.1",
+ "react-is-19": "npm:react-is@^19.2.5"
+ },
+ "engines": {
+ "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
+ }
+ },
+ "node_modules/pretty-format/node_modules/ansi-styles": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz",
+ "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/pretty-hrtime": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz",
+ "integrity": "sha512-66hKPCr+72mlfiSjlEB1+45IjXSqvVAIy6mocupoww4tBFE9R9IhwwUGoI4G++Tc9Aq+2rxOt0RFU6gPcrte0A==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/pretty-ms": {
+ "version": "9.3.0",
+ "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-9.3.0.tgz",
+ "integrity": "sha512-gjVS5hOP+M3wMm5nmNOucbIrqudzs9v/57bWRHQWLYklXqoXKrVfYW2W9+glfGsqtPgpiz5WwyEEB+ksXIx3gQ==",
+ "devOptional": true,
+ "license": "MIT",
+ "dependencies": {
+ "parse-ms": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/process-warning": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-5.0.0.tgz",
+ "integrity": "sha512-a39t9ApHNx2L4+HBnQKqxxHNs1r7KF+Intd8Q/g1bUh6q0WIp9voPXJ/x0j+ZL45KF1pJd9+q2jLIRMfvEshkA==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/fastify"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/fastify"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/proxy-addr": {
+ "version": "2.0.7",
+ "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz",
+ "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==",
+ "license": "MIT",
+ "dependencies": {
+ "forwarded": "0.2.0",
+ "ipaddr.js": "1.9.1"
+ },
+ "engines": {
+ "node": ">= 0.10"
}
},
"node_modules/pump": {
@@ -931,6 +6516,82 @@
"once": "^1.3.1"
}
},
+ "node_modules/punycode": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
+ "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/qs": {
+ "version": "6.15.2",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.15.2.tgz",
+ "integrity": "sha512-Rzq0KEyX/w/tEybncDgdkZrJgVUsUMk3xjh3t5bv3S1HTAtg+uOYt72+ZfwiQwKdysThkTBdL/rTi6HDmX9Ddw==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "side-channel": "^1.1.0"
+ },
+ "engines": {
+ "node": ">=0.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/queue-microtask": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
+ "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
+ "devOptional": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/quick-format-unescaped": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/quick-format-unescaped/-/quick-format-unescaped-4.0.4.tgz",
+ "integrity": "sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==",
+ "license": "MIT"
+ },
+ "node_modules/random-bytes": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/random-bytes/-/random-bytes-1.0.0.tgz",
+ "integrity": "sha512-iv7LhNVO047HzYR3InF6pUcUsPQiHTM1Qal51DcGSuZFBil1aBBWG5eHPNek7bvILMaYJ/8RU1e8w1AMdHmLQQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/raw-body": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.2.tgz",
+ "integrity": "sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==",
+ "license": "MIT",
+ "dependencies": {
+ "bytes": "~3.1.2",
+ "http-errors": "~2.0.1",
+ "iconv-lite": "~0.7.0",
+ "unpipe": "~1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
"node_modules/rc": {
"version": "1.2.8",
"resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz",
@@ -946,6 +6607,80 @@
"rc": "cli.js"
}
},
+ "node_modules/rc/node_modules/strip-json-comments": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
+ "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/react-is-18": {
+ "name": "react-is",
+ "version": "18.3.1",
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz",
+ "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==",
+ "license": "MIT"
+ },
+ "node_modules/react-is-19": {
+ "name": "react-is",
+ "version": "19.2.7",
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-19.2.7.tgz",
+ "integrity": "sha512-kZFnouyVv7eP/Phmrlo9FK+zcAdriZJvzxXHF1Sl1P377WSGe2G/JxVolhTrB/jeV47lKImhNUsijjHAAbcl/A==",
+ "license": "MIT"
+ },
+ "node_modules/read-package-up": {
+ "version": "12.0.0",
+ "resolved": "https://registry.npmjs.org/read-package-up/-/read-package-up-12.0.0.tgz",
+ "integrity": "sha512-Q5hMVBYur/eQNWDdbF4/Wqqr9Bjvtrw2kjGxxBbKLbx8bVCL8gcArjTy8zDUuLGQicftpMuU0riQNcAsbtOVsw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "find-up-simple": "^1.0.1",
+ "read-pkg": "^10.0.0",
+ "type-fest": "^5.2.0"
+ },
+ "engines": {
+ "node": ">=20"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/read-pkg": {
+ "version": "10.1.0",
+ "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-10.1.0.tgz",
+ "integrity": "sha512-I8g2lArQiP78ll51UeMZojewtYgIRCKCWqZEgOO8c/uefTI+XDXvCSXu3+YNUaTNvZzobrL5+SqHjBrByRRTdg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/normalize-package-data": "^2.4.4",
+ "normalize-package-data": "^8.0.0",
+ "parse-json": "^8.3.0",
+ "type-fest": "^5.4.4",
+ "unicorn-magic": "^0.4.0"
+ },
+ "engines": {
+ "node": ">=20"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/read-pkg/node_modules/unicorn-magic": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.4.0.tgz",
+ "integrity": "sha512-wH590V9VNgYH9g3lH9wWjTrUoKsjLF6sGLjhR4sH1LWpLmCOH0Zf7PukhDA8BiS7KHe4oPNkcTHqYkj7SOGUOw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=20"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
"node_modules/readable-stream": {
"version": "3.6.2",
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz",
@@ -960,6 +6695,41 @@
"node": ">= 6"
}
},
+ "node_modules/readdirp": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-5.0.0.tgz",
+ "integrity": "sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==",
+ "devOptional": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 20.19.0"
+ },
+ "funding": {
+ "type": "individual",
+ "url": "https://paulmillr.com/funding/"
+ }
+ },
+ "node_modules/real-require": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/real-require/-/real-require-0.2.0.tgz",
+ "integrity": "sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 12.13.0"
+ }
+ },
+ "node_modules/rechoir": {
+ "version": "0.8.0",
+ "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.8.0.tgz",
+ "integrity": "sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==",
+ "license": "MIT",
+ "dependencies": {
+ "resolve": "^1.20.0"
+ },
+ "engines": {
+ "node": ">= 10.13.0"
+ }
+ },
"node_modules/redis-errors": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/redis-errors/-/redis-errors-1.2.0.tgz",
@@ -981,16 +6751,141 @@
"node": ">=4"
}
},
+ "node_modules/reflect-metadata": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.2.2.tgz",
+ "integrity": "sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==",
+ "license": "Apache-2.0"
+ },
+ "node_modules/regexp-tree": {
+ "version": "0.1.27",
+ "resolved": "https://registry.npmjs.org/regexp-tree/-/regexp-tree-0.1.27.tgz",
+ "integrity": "sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "regexp-tree": "bin/regexp-tree"
+ }
+ },
+ "node_modules/regjsparser": {
+ "version": "0.13.1",
+ "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.13.1.tgz",
+ "integrity": "sha512-dLsljMd9sqwRkby8zhO1gSg3PnJIBFid8f4CQj/sXx+7cKx+E7u0PKhZ+U4wmhx7EfmtvnA318oVaIkAB1lRJw==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "jsesc": "~3.1.0"
+ },
+ "bin": {
+ "regjsparser": "bin/parser"
+ }
+ },
+ "node_modules/resolve": {
+ "version": "1.22.12",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.12.tgz",
+ "integrity": "sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==",
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "is-core-module": "^2.16.1",
+ "path-parse": "^1.0.7",
+ "supports-preserve-symlinks-flag": "^1.0.0"
+ },
+ "bin": {
+ "resolve": "bin/resolve"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/resolve-from": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
+ "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/resolve-pkg-maps": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz",
+ "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==",
+ "devOptional": true,
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1"
+ }
+ },
+ "node_modules/restore-cursor": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz",
+ "integrity": "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==",
+ "license": "MIT",
+ "dependencies": {
+ "onetime": "^7.0.0",
+ "signal-exit": "^4.1.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/retry": {
+ "version": "0.13.1",
+ "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz",
+ "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "node_modules/reusify": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz",
+ "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==",
+ "devOptional": true,
+ "license": "MIT",
+ "engines": {
+ "iojs": ">=1.0.0",
+ "node": ">=0.10.0"
+ }
+ },
"node_modules/rfdc": {
"version": "1.4.1",
"resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz",
"integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==",
"license": "MIT"
},
- "node_modules/safe-buffer": {
- "version": "5.2.1",
- "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
- "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
+ "node_modules/rndm": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/rndm/-/rndm-1.2.0.tgz",
+ "integrity": "sha512-fJhQQI5tLrQvYIYFpOnFinzv9dwmR7hRnUz1XqP3OJ1jIweTNOd6aTO4jwQSgcBSFUB+/KHJxuGneime+FdzOw==",
+ "license": "MIT"
+ },
+ "node_modules/run-applescript": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-7.1.0.tgz",
+ "integrity": "sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q==",
+ "devOptional": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/run-parallel": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
+ "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
+ "devOptional": true,
"funding": [
{
"type": "github",
@@ -1005,8 +6900,49 @@
"url": "https://feross.org/support"
}
],
+ "license": "MIT",
+ "dependencies": {
+ "queue-microtask": "^1.2.2"
+ }
+ },
+ "node_modules/safe-buffer": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
+ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
"license": "MIT"
},
+ "node_modules/safe-stable-stringify": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz",
+ "integrity": "sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/safer-buffer": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
+ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
+ "license": "MIT"
+ },
+ "node_modules/secure-json-parse": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/secure-json-parse/-/secure-json-parse-4.1.0.tgz",
+ "integrity": "sha512-l4KnYfEyqYJxDwlNVyRfO2E4NTHfMKAWdUuA8J0yve2Dz/E/PdBepY03RvyJpssIpRFwJoCD55wA+mEDs6ByWA==",
+ "devOptional": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/fastify"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/fastify"
+ }
+ ],
+ "license": "BSD-3-Clause"
+ },
"node_modules/semver": {
"version": "7.8.1",
"resolved": "https://registry.npmjs.org/semver/-/semver-7.8.1.tgz",
@@ -1019,6 +6955,125 @@
"node": ">=10"
}
},
+ "node_modules/set-cookie-parser": {
+ "version": "2.7.2",
+ "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.2.tgz",
+ "integrity": "sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw==",
+ "license": "MIT"
+ },
+ "node_modules/setprototypeof": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
+ "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==",
+ "license": "ISC"
+ },
+ "node_modules/shebang-command": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+ "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+ "devOptional": true,
+ "license": "MIT",
+ "dependencies": {
+ "shebang-regex": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/shebang-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+ "devOptional": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/side-channel": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz",
+ "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==",
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "object-inspect": "^1.13.3",
+ "side-channel-list": "^1.0.0",
+ "side-channel-map": "^1.0.1",
+ "side-channel-weakmap": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/side-channel-list": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.1.tgz",
+ "integrity": "sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==",
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "object-inspect": "^1.13.4"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/side-channel-map": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz",
+ "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.5",
+ "object-inspect": "^1.13.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/side-channel-weakmap": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz",
+ "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.5",
+ "object-inspect": "^1.13.3",
+ "side-channel-map": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/signal-exit": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz",
+ "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==",
+ "license": "ISC",
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
"node_modules/simple-concat": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz",
@@ -1074,43 +7129,125 @@
"url": "https://github.com/sponsors/eshaz"
}
},
- "node_modules/sprintf-js": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
- "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==",
- "license": "BSD-3-Clause"
+ "node_modules/slash": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/slash/-/slash-5.1.0.tgz",
+ "integrity": "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=14.16"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
},
- "node_modules/sqlite": {
- "version": "5.1.1",
- "resolved": "https://registry.npmjs.org/sqlite/-/sqlite-5.1.1.tgz",
- "integrity": "sha512-oBkezXa2hnkfuJwUo44Hl9hS3er+YFtueifoajrgidvqsJRQFpc5fKoAkAor1O5ZnLoa28GBScfHXs8j0K358Q==",
- "license": "MIT"
+ "node_modules/slashes": {
+ "version": "3.0.12",
+ "resolved": "https://registry.npmjs.org/slashes/-/slashes-3.0.12.tgz",
+ "integrity": "sha512-Q9VME8WyGkc7pJf6QEkj3wE+2CnvZMI+XJhwdTPR8Z/kWQRXi7boAWLDibRPyHRTUTPx5FaU7MsyrjI3yLB4HA==",
+ "license": "ISC"
},
- "node_modules/sqlite3": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/sqlite3/-/sqlite3-6.0.1.tgz",
- "integrity": "sha512-X0czUUMG2tmSqJpEQa3tCuZSHKIx8PwM53vLZzKp/o6Rpy25fiVfjdbnZ988M8+O3ZWR1ih0K255VumCb3MAnQ==",
- "hasInstallScript": true,
- "license": "BSD-3-Clause",
+ "node_modules/slice-ansi": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-8.0.0.tgz",
+ "integrity": "sha512-stxByr12oeeOyY2BlviTNQlYV5xOj47GirPr4yA1hE9JCtxfQN0+tVbkxwCtYDQWhEKWFHsEK48ORg5jrouCAg==",
+ "license": "MIT",
"dependencies": {
- "bindings": "^1.5.0",
- "node-addon-api": "^8.0.0",
- "prebuild-install": "^7.1.3",
- "tar": "^7.5.10"
+ "ansi-styles": "^6.2.3",
+ "is-fullwidth-code-point": "^5.1.0"
},
"engines": {
- "node": ">=20.17.0"
+ "node": ">=20"
},
- "optionalDependencies": {
- "node-gyp": "12.x"
+ "funding": {
+ "url": "https://github.com/chalk/slice-ansi?sponsor=1"
+ }
+ },
+ "node_modules/slice-ansi/node_modules/ansi-styles": {
+ "version": "6.2.3",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz",
+ "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
},
- "peerDependencies": {
- "node-gyp": "12.x"
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/slugify": {
+ "version": "1.6.9",
+ "resolved": "https://registry.npmjs.org/slugify/-/slugify-1.6.9.tgz",
+ "integrity": "sha512-vZ7rfeehZui7wQs438JXBckYLkIIdfHOXsaVEUMyS5fHo1483l1bMdo0EDSWYclY0yZKFOipDy4KHuKs6ssvdg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/sonic-boom": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-4.2.1.tgz",
+ "integrity": "sha512-w6AxtubXa2wTXAUsZMMWERrsIRAdrK0Sc+FUytWvYAhBJLyuI4llrMIC1DtlNSdI99EI86KZum2MMq3EAZlF9Q==",
+ "license": "MIT",
+ "dependencies": {
+ "atomic-sleep": "^1.0.0"
+ }
+ },
+ "node_modules/spdx-correct": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz",
+ "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "spdx-expression-parse": "^3.0.0",
+ "spdx-license-ids": "^3.0.0"
+ }
+ },
+ "node_modules/spdx-exceptions": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz",
+ "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==",
+ "dev": true,
+ "license": "CC-BY-3.0"
+ },
+ "node_modules/spdx-expression-parse": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz",
+ "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "spdx-exceptions": "^2.1.0",
+ "spdx-license-ids": "^3.0.0"
+ }
+ },
+ "node_modules/spdx-license-ids": {
+ "version": "3.0.23",
+ "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.23.tgz",
+ "integrity": "sha512-CWLcCCH7VLu13TgOH+r8p1O/Znwhqv/dbb6lqWy67G+pT1kHmeD/+V36AVb/vq8QMIQwVShJ6Ssl5FPh0fuSdw==",
+ "dev": true,
+ "license": "CC0-1.0"
+ },
+ "node_modules/split-lines": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/split-lines/-/split-lines-3.0.0.tgz",
+ "integrity": "sha512-d0TpRBL/VfKDXsk8JxPF7zgF5pCUDdBMSlEL36xBgVeaX448t+yGXcJaikUyzkoKOJ0l6KpMfygzJU9naIuivw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
},
- "peerDependenciesMeta": {
- "node-gyp": {
- "optional": true
- }
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/split2": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz",
+ "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==",
+ "license": "ISC",
+ "engines": {
+ "node": ">= 10.x"
}
},
"node_modules/standard-as-callback": {
@@ -1119,6 +7256,15 @@
"integrity": "sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A==",
"license": "MIT"
},
+ "node_modules/statuses": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz",
+ "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
"node_modules/streamroller": {
"version": "3.1.5",
"resolved": "https://registry.npmjs.org/streamroller/-/streamroller-3.1.5.tgz",
@@ -1142,29 +7288,207 @@
"safe-buffer": "~5.2.0"
}
},
- "node_modules/strip-json-comments": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
- "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==",
+ "node_modules/string_decoder/node_modules/safe-buffer": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
+ "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/string-width": {
+ "version": "8.2.1",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-8.2.1.tgz",
+ "integrity": "sha512-IIaP0g3iy9Cyy18w3M9YcaDudujEAVHKt3a3QJg1+sr/oX96TbaGUubG0hJyCjCBThFH+tFpcIyoUHUn1ogaLA==",
"license": "MIT",
+ "dependencies": {
+ "get-east-asian-width": "^1.5.0",
+ "strip-ansi": "^7.1.2"
+ },
"engines": {
- "node": ">=0.10.0"
+ "node": ">=20"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/tar": {
- "version": "7.5.15",
- "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.15.tgz",
- "integrity": "sha512-dzGK0boVlC4W5QFuQN1EFSl3bIDYsk7Tj40U6eIBnK2k/8ml7TZ5agbI5j5+qnoVcAA+rNtBml8SEiLxZpNqRQ==",
- "license": "BlueOak-1.0.0",
+ "node_modules/string-width/node_modules/ansi-regex": {
+ "version": "6.2.2",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz",
+ "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-regex?sponsor=1"
+ }
+ },
+ "node_modules/string-width/node_modules/strip-ansi": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz",
+ "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==",
+ "license": "MIT",
"dependencies": {
- "@isaacs/fs-minipass": "^4.0.0",
- "chownr": "^3.0.0",
- "minipass": "^7.1.2",
- "minizlib": "^3.1.0",
- "yallist": "^5.0.0"
+ "ansi-regex": "^6.2.2"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/strip-ansi?sponsor=1"
+ }
+ },
+ "node_modules/strip-ansi": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-regex": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/strip-final-newline": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-4.0.0.tgz",
+ "integrity": "sha512-aulFJcD6YK8V1G7iRB5tigAP4TsHBZZrOV8pjV++zdUwmeV8uzbY7yn6h9MswN62adStNZFuCIx4haBnRuMDaw==",
+ "devOptional": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/strip-indent": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-4.1.1.tgz",
+ "integrity": "sha512-SlyRoSkdh1dYP0PzclLE7r0M9sgbFKKMFXpFRUMNuKhQSbC6VQIGzq3E0qsfvGJaUFJPGv6Ws1NZ/haTAjfbMA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/strip-json-comments": {
+ "version": "5.0.3",
+ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-5.0.3.tgz",
+ "integrity": "sha512-1tB5mhVo7U+ETBKNf92xT4hrQa3pm0MZ0PQvuDnWgAAGHDsfp4lPSpiS6psrSiet87wyGPh9ft6wmhOMQ0hDiw==",
+ "devOptional": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=14.16"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/strtok3": {
+ "version": "10.3.5",
+ "resolved": "https://registry.npmjs.org/strtok3/-/strtok3-10.3.5.tgz",
+ "integrity": "sha512-ki4hZQfh5rX0QDLLkOCj+h+CVNkqmp/CMf8v8kZpkNVK6jGQooMytqzLZYUVYIZcFZ6yDB70EfD8POcFXiF5oA==",
+ "license": "MIT",
+ "dependencies": {
+ "@tokenizer/token": "^0.3.0"
},
"engines": {
"node": ">=18"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/Borewit"
+ }
+ },
+ "node_modules/superagent": {
+ "version": "10.3.0",
+ "resolved": "https://registry.npmjs.org/superagent/-/superagent-10.3.0.tgz",
+ "integrity": "sha512-B+4Ik7ROgVKrQsXTV0Jwp2u+PXYLSlqtDAhYnkkD+zn3yg8s/zjA2MeGayPoY/KICrbitwneDHrjSotxKL+0XQ==",
+ "license": "MIT",
+ "dependencies": {
+ "component-emitter": "^1.3.1",
+ "cookiejar": "^2.1.4",
+ "debug": "^4.3.7",
+ "fast-safe-stringify": "^2.1.1",
+ "form-data": "^4.0.5",
+ "formidable": "^3.5.4",
+ "methods": "^1.1.2",
+ "mime": "2.6.0",
+ "qs": "^6.14.1"
+ },
+ "engines": {
+ "node": ">=14.18.0"
+ }
+ },
+ "node_modules/supports-color": {
+ "version": "10.2.2",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-10.2.2.tgz",
+ "integrity": "sha512-SS+jx45GF1QjgEXQx4NJZV9ImqmO2NPz5FNsIHrsDjh2YsHnawpan7SNQ1o8NuhrbHZy9AZhIoCUiCeaW/C80g==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/supports-color?sponsor=1"
+ }
+ },
+ "node_modules/supports-preserve-symlinks-flag": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
+ "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/synckit": {
+ "version": "0.11.13",
+ "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.11.13.tgz",
+ "integrity": "sha512-eNRKgb3z66Yp3D2CixVujOUvXLFUTij/zVnV8KRyvFdQwpz7I5DS8UfRkTeLzb64u+dkzDSdelE24izu+zSSUg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@pkgr/core": "^0.3.6"
+ },
+ "engines": {
+ "node": "^14.18.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/synckit"
+ }
+ },
+ "node_modules/tagged-tag": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/tagged-tag/-/tagged-tag-1.0.0.tgz",
+ "integrity": "sha512-yEFYrVhod+hdNyx7g5Bnkkb0G6si8HJurOoOEgC8B/O0uXLHlaey/65KRv6cuWBNhBgHKAROVpc7QyYqE5gFng==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=20"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/tar-fs": {
@@ -1179,12 +7503,6 @@
"tar-stream": "^2.1.4"
}
},
- "node_modules/tar-fs/node_modules/chownr": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz",
- "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==",
- "license": "ISC"
- },
"node_modules/tar-stream": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz",
@@ -1201,12 +7519,85 @@
"node": ">=6"
}
},
- "node_modules/tinyglobby": {
- "version": "0.2.16",
- "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.16.tgz",
- "integrity": "sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==",
+ "node_modules/tarn": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/tarn/-/tarn-3.0.2.tgz",
+ "integrity": "sha512-51LAVKUSZSVfI05vjPESNc5vwqqZpbXCsU+/+wxlOrUjk2SnFTt97v9ZgQrD4YmxYW1Px6w2KjaDitCfkvgxMQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/tempura": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/tempura/-/tempura-0.4.1.tgz",
+ "integrity": "sha512-NQ4Cs23jM6UUp3CcS5vjmyjTC6dtA5EsflBG2cyG0wZvP65AV26tJ920MGvTRYIImCY13RBpOhc7q4/pu+FG5A==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/terminal-size": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/terminal-size/-/terminal-size-4.0.1.tgz",
+ "integrity": "sha512-avMLDQpUI9I5XFrklECw1ZEUPJhqzcwSWsyyI8blhRLT+8N1jLJWLWWYQpB2q2xthq8xDvjZPISVh53T/+CLYQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/thread-stream": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/thread-stream/-/thread-stream-4.2.0.tgz",
+ "integrity": "sha512-e2zZ96wSChazBsbENf/Pcm/4swHt2cEKQ92rhUjkL9GCKiTDJIaTBenjE/m9DXi0QBmTMDkFDdOomUy20A1tDQ==",
+ "license": "MIT",
+ "dependencies": {
+ "real-require": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=20"
+ }
+ },
+ "node_modules/thread-stream/node_modules/real-require": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/real-require/-/real-require-1.0.0.tgz",
+ "integrity": "sha512-P4nbQYQfePJxRSmY+v/KINxVucm4NF3p3s7pJveMTtom52FR4YGltUQLB8idDXwDDWW+eYrWDFbuzUnjoWHF7g==",
+ "license": "MIT"
+ },
+ "node_modules/tildify": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/tildify/-/tildify-2.0.0.tgz",
+ "integrity": "sha512-Cc+OraorugtXNfs50hU9KS369rFXCfgGLpfCfvlc+Ud5u6VWmUQsOAa9HbTvheQdYnrdJqqv1e5oIqXppMYnSw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/timekeeper": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/timekeeper/-/timekeeper-2.3.1.tgz",
+ "integrity": "sha512-LeQRS7/4JcC0PgdSFnfUiStQEdiuySlCj/5SJ18D+T1n9BoY7PxKFfCwLulpHXoLUFr67HxBddQdEX47lDGx1g==",
+ "license": "MIT"
+ },
+ "node_modules/tinyexec": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.2.4.tgz",
+ "integrity": "sha512-SHf/r48b7vOrjve9PxJo3MN5v5yuyjHvdUcrQffT3WXMUfnGmHDVbC4k3sHJaJTgZCwpUplIaAo5ANtMyp3YHg==",
+ "devOptional": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/tinyglobby": {
+ "version": "0.2.17",
+ "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz",
+ "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==",
+ "devOptional": true,
"license": "MIT",
- "optional": true,
"dependencies": {
"fdir": "^6.5.0",
"picomatch": "^4.0.4"
@@ -1218,12 +7609,94 @@
"url": "https://github.com/sponsors/SuperchupuDev"
}
},
+ "node_modules/tmp-cache": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/tmp-cache/-/tmp-cache-1.1.0.tgz",
+ "integrity": "sha512-j040fkL/x+XAZQ9K3bKGEPwgYhOZNBQLa3NXEADUiuno9C+3N2JJA4bVPDREixp604G3/vTXWA3DIPpA9lu1RQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/to-regex-range": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+ "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+ "devOptional": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-number": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=8.0"
+ }
+ },
+ "node_modules/toidentifier": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
+ "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.6"
+ }
+ },
+ "node_modules/token-types": {
+ "version": "6.1.2",
+ "resolved": "https://registry.npmjs.org/token-types/-/token-types-6.1.2.tgz",
+ "integrity": "sha512-dRXchy+C0IgK8WPC6xvCHFRIWYUbqqdEIKPaKo/AcTUNzwLTK6AH7RjdLWsEZcAN/TBdtfUw3PYEgPr5VPr6ww==",
+ "license": "MIT",
+ "dependencies": {
+ "@borewit/text-codec": "^0.2.1",
+ "@tokenizer/token": "^0.3.0",
+ "ieee754": "^1.2.1"
+ },
+ "engines": {
+ "node": ">=14.16"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/Borewit"
+ }
+ },
+ "node_modules/ts-api-utils": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.5.0.tgz",
+ "integrity": "sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18.12"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.8.4"
+ }
+ },
+ "node_modules/ts-morph": {
+ "version": "27.0.2",
+ "resolved": "https://registry.npmjs.org/ts-morph/-/ts-morph-27.0.2.tgz",
+ "integrity": "sha512-fhUhgeljcrdZ+9DZND1De1029PrE+cMkIP7ooqkLRTrRLTqcki2AstsyJm0vRNbTbVCNJ0idGlbBrfqc7/nA8w==",
+ "devOptional": true,
+ "license": "MIT",
+ "dependencies": {
+ "@ts-morph/common": "~0.28.1",
+ "code-block-writer": "^13.0.3"
+ }
+ },
"node_modules/tslib": {
"version": "2.8.1",
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
"integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
"license": "0BSD"
},
+ "node_modules/tsscmp": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/tsscmp/-/tsscmp-1.0.6.tgz",
+ "integrity": "sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.6.x"
+ }
+ },
"node_modules/tunnel-agent": {
"version": "0.6.0",
"resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
@@ -1236,14 +7709,132 @@
"node": "*"
}
},
- "node_modules/undici": {
- "version": "6.26.0",
- "resolved": "https://registry.npmjs.org/undici/-/undici-6.26.0.tgz",
- "integrity": "sha512-4yqz8a3n5HmGTlsbADNtr/dJlhkh/55Rq798G6ibiULcXbDtaLpTl1pvdqcbFfeoj3iSi52lePFM7h9H21cw/A==",
+ "node_modules/type-check": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
+ "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
+ "dev": true,
"license": "MIT",
- "optional": true,
+ "dependencies": {
+ "prelude-ls": "^1.2.1"
+ },
"engines": {
- "node": ">=18.17"
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/type-fest": {
+ "version": "5.7.0",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-5.7.0.tgz",
+ "integrity": "sha512-1URUxUqfHFM1c+zfSPsa3gnkO7Aq21qyH75SIduNYz4SzY964rn1X2vCMQaHSHhktiw+0kPa2iyb6PUpXqB6Vg==",
+ "dev": true,
+ "license": "(MIT OR CC0-1.0)",
+ "dependencies": {
+ "tagged-tag": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=20"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/type-is": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.1.0.tgz",
+ "integrity": "sha512-faYHw0anBbc/kWF3zFTEnxSFOAGUX9GFbOBthvDdLsIlEoWOFOtS0zgCiQYwIskL9iGXZL3kAXD8OoZ4GmMATA==",
+ "license": "MIT",
+ "dependencies": {
+ "content-type": "^2.0.0",
+ "media-typer": "^1.1.0",
+ "mime-types": "^3.0.0"
+ },
+ "engines": {
+ "node": ">= 18"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/express"
+ }
+ },
+ "node_modules/typescript": {
+ "version": "6.0.3",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-6.0.3.tgz",
+ "integrity": "sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==",
+ "devOptional": true,
+ "license": "Apache-2.0",
+ "bin": {
+ "tsc": "bin/tsc",
+ "tsserver": "bin/tsserver"
+ },
+ "engines": {
+ "node": ">=14.17"
+ }
+ },
+ "node_modules/typescript-eslint": {
+ "version": "8.60.1",
+ "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.60.1.tgz",
+ "integrity": "sha512-6m5hkkRAp8lKvhVpcprAIn5KkehQEh+47oHH2VGnExEh7dhNxXlg6GPAOIu6TxbVQxhebrJDvjl3020ooiWCMA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/eslint-plugin": "8.60.1",
+ "@typescript-eslint/parser": "8.60.1",
+ "@typescript-eslint/typescript-estree": "8.60.1",
+ "@typescript-eslint/utils": "8.60.1"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0",
+ "typescript": ">=4.8.4 <6.1.0"
+ }
+ },
+ "node_modules/uid-safe": {
+ "version": "2.1.5",
+ "resolved": "https://registry.npmjs.org/uid-safe/-/uid-safe-2.1.5.tgz",
+ "integrity": "sha512-KPHm4VL5dDXKz01UuEd88Df+KzynaohSL9fBh096KWAxSKZQDI2uBrVqtvRM4rwrIrRRKsdLNML/lnaaVSRioA==",
+ "license": "MIT",
+ "dependencies": {
+ "random-bytes": "~1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/uint8array-extras": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/uint8array-extras/-/uint8array-extras-1.5.0.tgz",
+ "integrity": "sha512-rvKSBiC5zqCCiDZ9kAOszZcDvdAHwwIKJG33Ykj43OKcWsnmcBRL09YTU4nOeHZ8Y2a7l1MgTd08SBe9A8Qj6A==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/undici-types": {
+ "version": "7.24.6",
+ "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.24.6.tgz",
+ "integrity": "sha512-WRNW+sJgj5OBN4/0JpHFqtqzhpbnV0GuB+OozA9gCL7a993SmU+1JBZCzLNxYsbMfIeDL+lTsphD5jN5N+n0zg==",
+ "license": "MIT"
+ },
+ "node_modules/unicorn-magic": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.3.0.tgz",
+ "integrity": "sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==",
+ "devOptional": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/universalify": {
@@ -1255,26 +7846,171 @@
"node": ">= 4.0.0"
}
},
+ "node_modules/unpipe": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
+ "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/update-browserslist-db": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz",
+ "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/browserslist"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "escalade": "^3.2.0",
+ "picocolors": "^1.1.1"
+ },
+ "bin": {
+ "update-browserslist-db": "cli.js"
+ },
+ "peerDependencies": {
+ "browserslist": ">= 4.21.0"
+ }
+ },
+ "node_modules/uri-js": {
+ "version": "4.4.1",
+ "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
+ "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "punycode": "^2.1.0"
+ }
+ },
"node_modules/util-deprecate": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
"integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
"license": "MIT"
},
- "node_modules/which": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/which/-/which-6.0.1.tgz",
- "integrity": "sha512-oGLe46MIrCRqX7ytPUf66EAYvdeMIZYn3WaocqqKZAxrBpkqHfL/qvTyJ/bTk5+AqHCjXmrv3CEWgy368zhRUg==",
- "license": "ISC",
- "optional": true,
+ "node_modules/validate-npm-package-license": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz",
+ "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==",
+ "dev": true,
+ "license": "Apache-2.0",
"dependencies": {
- "isexe": "^4.0.0"
+ "spdx-correct": "^3.0.0",
+ "spdx-expression-parse": "^3.0.0"
+ }
+ },
+ "node_modules/validator": {
+ "version": "13.15.35",
+ "resolved": "https://registry.npmjs.org/validator/-/validator-13.15.35.tgz",
+ "integrity": "sha512-TQ5pAGhd5whStmqWvYF4OjQROlmv9SMFVt37qoCBdqRffuuklWYQlCNnEs2ZaIBD1kZRNnikiZOS1eqgkar0iw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
+ "node_modules/vary": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
+ "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/which": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+ "devOptional": true,
+ "license": "ISC",
+ "dependencies": {
+ "isexe": "^2.0.0"
},
"bin": {
- "node-which": "bin/which.js"
+ "node-which": "bin/node-which"
},
"engines": {
- "node": "^20.17.0 || >=22.9.0"
+ "node": ">= 8"
+ }
+ },
+ "node_modules/word-wrap": {
+ "version": "1.2.5",
+ "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz",
+ "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/wrap-ansi": {
+ "version": "10.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-10.0.0.tgz",
+ "integrity": "sha512-SGcvg80f0wUy2/fXES19feHMz8E0JoXv2uNgHOu4Dgi2OrCy1lqwFYEJz1BLbDI0exjPMe/ZdzZ/YpGECBG/aQ==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^6.2.3",
+ "string-width": "^8.2.0",
+ "strip-ansi": "^7.1.2"
+ },
+ "engines": {
+ "node": ">=20"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "node_modules/wrap-ansi/node_modules/ansi-regex": {
+ "version": "6.2.2",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz",
+ "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-regex?sponsor=1"
+ }
+ },
+ "node_modules/wrap-ansi/node_modules/ansi-styles": {
+ "version": "6.2.3",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz",
+ "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/wrap-ansi/node_modules/strip-ansi": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz",
+ "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-regex": "^6.2.2"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/strip-ansi?sponsor=1"
}
},
"node_modules/wrappy": {
@@ -1283,28 +8019,54 @@
"integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
"license": "ISC"
},
- "node_modules/xmlbuilder2": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/xmlbuilder2/-/xmlbuilder2-3.1.1.tgz",
- "integrity": "sha512-WCSfbfZnQDdLQLiMdGUQpMxxckeQ4oZNMNhLVkcekTu7xhD4tuUDyAPoY8CwXvBYE6LwBHd6QW2WZXlOWr1vCw==",
+ "node_modules/wsl-utils": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/wsl-utils/-/wsl-utils-0.3.1.tgz",
+ "integrity": "sha512-g/eziiSUNBSsdDJtCLB8bdYEUMj4jR7AGeUo96p/3dTafgjHhpF4RiCFPiRILwjQoDXx5MqkBr4fwWtR3Ky4Wg==",
+ "devOptional": true,
"license": "MIT",
"dependencies": {
- "@oozcitak/dom": "1.15.10",
- "@oozcitak/infra": "1.0.8",
- "@oozcitak/util": "8.3.8",
- "js-yaml": "3.14.1"
+ "is-wsl": "^3.1.0",
+ "powershell-utils": "^0.1.0"
},
"engines": {
- "node": ">=12.0"
+ "node": ">=20"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/yallist": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz",
- "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==",
- "license": "BlueOak-1.0.0",
+ "node_modules/xmlbuilder2": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/xmlbuilder2/-/xmlbuilder2-4.0.3.tgz",
+ "integrity": "sha512-bx8Q1STctnNaaDymWnkfQLKofs0mGNN7rLLapJlGuV3VlvegD7Ls4ggMjE3aUSWItCCzU0PEv45lI87iSigiCA==",
+ "license": "MIT",
+ "dependencies": {
+ "@oozcitak/dom": "^2.0.2",
+ "@oozcitak/infra": "^2.0.2",
+ "@oozcitak/util": "^10.0.0",
+ "js-yaml": "^4.1.1"
+ },
"engines": {
- "node": ">=18"
+ "node": ">=20.0"
+ }
+ },
+ "node_modules/xtend": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
+ "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.4"
+ }
+ },
+ "node_modules/yargs-parser": {
+ "version": "22.0.0",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-22.0.0.tgz",
+ "integrity": "sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw==",
+ "license": "ISC",
+ "engines": {
+ "node": "^20.19.0 || ^22.12.0 || >=23"
}
},
"node_modules/yencode": {
@@ -1316,6 +8078,55 @@
"engines": {
"node": ">=0.10"
}
+ },
+ "node_modules/yocto-queue": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
+ "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/yoctocolors": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/yoctocolors/-/yoctocolors-2.1.2.tgz",
+ "integrity": "sha512-CzhO+pFNo8ajLM2d2IW/R93ipy99LWjtwblvC1RsoSUMZgyLbYFr221TnSNT7GjGdYui6P459mw9JH/g/zW2ug==",
+ "devOptional": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/youch": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/youch/-/youch-4.1.1.tgz",
+ "integrity": "sha512-mxW3qiSnl+GRxXsaUMzv2Mbada1Y8CDltET9UxejDQe6DBYlSekghl5U5K0ReAikcHDi0G1vKZEmmo/NWAGKLA==",
+ "license": "MIT",
+ "dependencies": {
+ "@poppinss/colors": "^4.1.6",
+ "@poppinss/dumper": "^0.7.0",
+ "@speed-highlight/core": "^1.2.14",
+ "cookie-es": "^3.0.1",
+ "youch-core": "^0.3.3"
+ }
+ },
+ "node_modules/youch-core": {
+ "version": "0.3.3",
+ "resolved": "https://registry.npmjs.org/youch-core/-/youch-core-0.3.3.tgz",
+ "integrity": "sha512-ho7XuGjLaJ2hWHoK8yFnsUGy2Y5uDpqSTq1FkHLK4/oqKtyUU1AFbOOxY4IpC9f0fTLjwYbslUz0Po5BpD1wrA==",
+ "license": "MIT",
+ "dependencies": {
+ "@poppinss/exception": "^1.2.2",
+ "error-stack-parser-es": "^1.0.5"
+ }
}
}
}
diff --git a/package.json b/package.json
index d0e62a7..cf21df8 100644
--- a/package.json
+++ b/package.json
@@ -1,30 +1,89 @@
{
- "name": "usenet-indexer",
- "version": "1.0.0",
- "description": "",
- "main": "src/bin/start.js",
+ "name": "temp_adonis_project",
+ "version": "0.0.0",
+ "private": true,
"type": "module",
- "scripts": {
- "test": "echo \"Error: no test specified\" && exit 1",
- "start": "node src/bin/start.js",
- "download": "node src/bin/download.js",
- "nzb": "node src/bin/nzb.js"
+ "license": "MIT",
+ "exports": {
+ "./data": "./.adonisjs/client/data.d.ts",
+ "./registry": "./.adonisjs/client/registry/index.ts"
+ },
+ "scripts": {
+ "start": "node bin/server.js",
+ "build": "node ace build",
+ "dev": "node ace serve --hmr",
+ "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",
+ "#generated/*": "./.adonisjs/server/*.js",
+ "#middleware/*": "./app/middleware/*.js",
+ "#transformers/*": "./app/transformers/*.js",
+ "#validators/*": "./app/validators/*.js",
+ "#providers/*": "./providers/*.js",
+ "#policies/*": "./app/policies/*.js",
+ "#abilities/*": "./app/abilities/*.js",
+ "#database/*": "./database/*.js",
+ "#tests/*": "./tests/*.js",
+ "#start/*": "./start/*.js",
+ "#config/*": "./config/*.js"
+ },
+ "devDependencies": {
+ "@adonisjs/assembler": "^8.4.0",
+ "@adonisjs/eslint-config": "^3.1.0",
+ "@adonisjs/prettier-config": "^1.5.0",
+ "@adonisjs/tsconfig": "^2.0.0",
+ "@japa/assert": "^4.2.0",
+ "@japa/plugin-adonisjs": "^5.2.0",
+ "@japa/runner": "^5.3.0",
+ "@poppinss/ts-exec": "^1.4.4",
+ "@types/luxon": "^3.7.1",
+ "@types/node": "~25.9.1",
+ "eslint": "^10.4.0",
+ "hot-hook": "^1.0.0",
+ "pino-pretty": "^13.1.3",
+ "prettier": "^3.8.3",
+ "typescript": "~6.0.3",
+ "youch": "^4.1.1"
},
- "keywords": [],
- "author": "",
- "license": "ISC",
"dependencies": {
- "bullmq": "^5.77.3",
- "dotenv": "^16.3.1",
- "ioredis": "^5.3.2",
+ "@adonisjs/auth": "^10.1.0",
+ "@adonisjs/core": "^7.3.3",
+ "@adonisjs/cors": "^3.0.0",
+ "@adonisjs/lucid": "^22.4.2",
+ "@adonisjs/session": "^8.1.0",
+ "@adonisjs/shield": "^9.0.0",
+ "@japa/api-client": "^3.2.1",
+ "@tuyau/core": "^1.2.2",
+ "@vinejs/vine": "^4.4.0",
+ "better-sqlite3": "^12.10.0",
+ "bullmq": "^5.78.0",
+ "crc": "^4.3.2",
+ "ioredis": "5.11.0",
"log4js": "^6.9.1",
+ "luxon": "^3.7.2",
"nntp-js": "^1.0.4",
- "node-unrar-js": "^2.0.0",
+ "node-unrar-js": "^2.0.2",
+ "pg": "^8.21.0",
+ "reflect-metadata": "^0.2.2",
"simple-yenc": "^1.0.4",
- "sqlite": "^5.1.1",
- "sqlite3": "^6.0.1",
- "xmlbuilder2": "^3.1.1",
- "yencode": "^1.0.1",
- "crc": "^4.3.2"
- }
+ "xmlbuilder2": "^4.0.3",
+ "yencode": "^1.2.4"
+ },
+ "hotHook": {
+ "boundaries": [
+ "./app/controllers/**/*.ts",
+ "./app/middleware/*.ts"
+ ]
+ },
+ "prettier": "@adonisjs/prettier-config"
}
diff --git a/providers/api_provider.ts b/providers/api_provider.ts
new file mode 100644
index 0000000..8e4e00c
--- /dev/null
+++ b/providers/api_provider.ts
@@ -0,0 +1,69 @@
+import { HttpContext } from '@adonisjs/core/http'
+import { BaseSerializer } from '@adonisjs/core/transformers'
+import { type SimplePaginatorMetaKeys } from '@adonisjs/lucid/types/querybuilder'
+
+/**
+ * Custom serializer for API responses that ensures consistent JSON structure
+ * across all API endpoints. Wraps response data in a 'data' property and handles
+ * pagination metadata for Lucid ORM query results.
+ */
+class ApiSerializer extends BaseSerializer<{
+ Wrap: 'data'
+ PaginationMetaData: SimplePaginatorMetaKeys
+}> {
+ /**
+ * Wraps all serialized data under this key in the response object.
+ * Example: { data: [...] } instead of returning raw arrays/objects
+ */
+ wrap: 'data' = 'data'
+
+ /**
+ * Validates and defines pagination metadata structure for paginated responses.
+ * Ensures that pagination info from Lucid queries is properly formatted.
+ *
+ * @throws Error if metadata doesn't match Lucid's pagination structure
+ */
+ definePaginationMetaData(metaData: unknown): SimplePaginatorMetaKeys {
+ if (!this.isLucidPaginatorMetaData(metaData)) {
+ throw new Error(
+ 'Invalid pagination metadata. Expected metadata to contain Lucid pagination keys'
+ )
+ }
+ return metaData
+ }
+}
+
+/**
+ * Single instance of ApiSerializer used across the application
+ */
+const serializer = new ApiSerializer()
+const serialize = Object.assign(
+ function (this: HttpContext, ...[data, resolver]: Parameters) {
+ return serializer.serialize(data, resolver ?? this.containerResolver)
+ },
+ {
+ withoutWrapping(
+ this: HttpContext,
+ ...[data, resolver]: Parameters
+ ) {
+ return serializer.serializeWithoutWrapping(data, resolver ?? this.containerResolver)
+ },
+ }
+) as ApiSerializer['serialize'] & { withoutWrapping: ApiSerializer['serializeWithoutWrapping'] }
+
+/**
+ * Adds the serialize method to all HttpContext instances.
+ * Usage in controllers: return ctx.serialize(data)
+ * This ensures all API responses follow the same structure with data wrapping.
+ */
+HttpContext.instanceProperty('serialize', serialize)
+
+/**
+ * Module augmentation to add the serialize method to HttpContext.
+ * This allows controllers to use ctx.serialize() for consistent API responses.
+ */
+declare module '@adonisjs/core/http' {
+ export interface HttpContext {
+ serialize: typeof serialize
+ }
+}
diff --git a/src/Application.js b/src/Application.js
deleted file mode 100644
index e11f391..0000000
--- a/src/Application.js
+++ /dev/null
@@ -1,57 +0,0 @@
-import 'dotenv/config';
-import { NntpPool } from './lib/NntpPool.js';
-import { HeaderWorker } from './workers/HeaderWorker.js';
-import { FileWorker } from './workers/FileWorker.js';
-import { CollectionWorker } from './workers/CollectionWorker.js';
-import { BodyWorker } from './workers/BodyWorker.js';
-import log4js from './lib/logger.js';
-
-const logger = log4js.getLogger();
-
-export class Application {
- constructor() {
- this.pool = new NntpPool();
- const collectionWorker = new CollectionWorker();
- const fileWorker = new FileWorker(collectionWorker.queue);
- const bodyWorker = new BodyWorker(null); // HeaderWorker is not yet initialized
- this.headerWorker = new HeaderWorker(fileWorker.queue, bodyWorker.queue);
- bodyWorker.headerQueue = this.headerWorker.queue; // Now we can set it
- }
-
- async run() {
- let conn;
- try {
- conn = await this.pool.acquire();
- logger.info('NNTP connection acquired from pool.');
-
- logger.debug(`Server date: ${await conn.date()}`);
-
- const group = await conn.group('alt.binaries.test');
- logger.debug(`Group info: ${JSON.stringify(group)}`);
-
- const overview = await conn.xover(group.first, group.last);
- logger.info(`Fetched ${overview.overviews.length} headers.`);
-
- for (const [id, header] of overview.overviews) {
- await this.headerWorker.queue.add('process-header', header);
- }
-
- if (overview.overviews.length > 0) {
- const lastId = overview.overviews[overview.overviews.length - 1][0];
- logger.info(`Last header ID queued: ${lastId}`);
- }
- } catch (error) {
- logger.error('Error in main execution:', error);
- } finally {
- if (conn) {
- this.pool.release(conn);
- }
- }
- }
-
- async shutdown() {
- logger.info('Gracefully shutting down...');
- await this.pool.shutdown();
- process.exit(0);
- }
-}
diff --git a/src/bin/download.js b/src/bin/download.js
deleted file mode 100644
index 1758787..0000000
--- a/src/bin/download.js
+++ /dev/null
@@ -1,84 +0,0 @@
-import 'dotenv/config';
-import { getDb } from '../lib/database.js';
-import { NntpPool } from '../lib/NntpPool.js';
-import { YencFile } from '../lib/YencFile.js';
-import fs from 'fs/promises';
-import log4js from '../lib/logger.js';
-
-const logger = log4js.getLogger('download');
-
-async function downloadAndProcessPart(pool, partNumber, segment, yencFile) {
- let conn;
- try {
- conn = await pool.acquire();
- await conn.group('alt.binaries.test');
- logger.debug(`Downloading part ${partNumber} with message ID: ${segment.id}`);
- const bodyBuffer = (await conn.body(`<${segment.id}>`)).data;
- yencFile.processPart(bodyBuffer);
- } catch (error) {
- if (error.code === 430) {
- logger.error(`Article not found for part ${partNumber} (Message ID: ${segment.id})`);
- } else {
- throw error;
- }
- } finally {
- if (conn) {
- pool.release(conn);
- }
- }
-}
-
-async function downloadFile(fileId, numConnections) {
- const pool = new NntpPool(numConnections);
- const yencFile = new YencFile();
-
- const db = await getDb();
- const file = await db.get('SELECT * FROM files WHERE id = ?', fileId);
-
- if (!file) {
- logger.error(`File with ID ${fileId} not found.`);
- await pool.shutdown();
- return;
- }
-
- logger.info(`Downloading file: ${file.filename} with ${numConnections} connections.`);
-
- const messageIds = JSON.parse(file.message_ids);
- const sortedParts = Object.entries(messageIds).sort(([a], [b]) => parseInt(a, 10) - parseInt(b, 10));
-
- // Sequentially process the first part to initialize the YencFile
- const [firstPartNumber, firstSegment] = sortedParts[0];
- await downloadAndProcessPart(pool, firstPartNumber, firstSegment, yencFile);
-
- // Concurrently process the rest of the parts
- const remainingParts = sortedParts.slice(1);
- const downloadPromises = remainingParts.map(([partNumber, segment]) =>
- downloadAndProcessPart(pool, partNumber, segment, yencFile)
- );
-
- await Promise.all(downloadPromises);
-
- const completeFile = yencFile.getBuffer();
- if (completeFile) {
- await fs.writeFile(file.filename, completeFile);
- logger.info(`File "${file.filename}" downloaded successfully.`);
- } else {
- logger.error('Could not assemble the final file.');
- }
-
- await pool.shutdown();
-}
-
-const args = process.argv.slice(2);
-const fileIdArg = args.find(arg => !arg.startsWith('--'));
-const connectionsArg = args.find(arg => arg.startsWith('--connections='));
-
-const fileId = fileIdArg ? parseInt(fileIdArg, 10) : null;
-const numConnections = connectionsArg ? parseInt(connectionsArg.split('=')[1], 10) : 10;
-
-if (!fileId || isNaN(fileId)) {
- logger.error('Please provide a valid file ID as a command-line argument.');
- process.exit(1);
-}
-
-downloadFile(fileId, numConnections);
diff --git a/src/bin/nzb.js b/src/bin/nzb.js
deleted file mode 100644
index d399223..0000000
--- a/src/bin/nzb.js
+++ /dev/null
@@ -1,55 +0,0 @@
-import 'dotenv/config';
-import { getDb } from '../lib/database.js';
-import { create } from 'xmlbuilder2';
-import fs from 'fs/promises';
-import log4js from '../lib/logger.js';
-
-const logger = log4js.getLogger('nzb');
-
-async function createNzb(fileId) {
- const db = await getDb();
- const file = await db.get('SELECT * FROM files WHERE id = ?', fileId);
-
- if (!file) {
- logger.error(`File with ID ${fileId} not found.`);
- return;
- }
-
- logger.info(`Creating NZB for file: ${file.filename}`);
-
- const messageIds = JSON.parse(file.message_ids);
-
- const root = create({ version: '1.0', encoding: 'UTF-8' })
- .dtd({ pubID: '-//newzBin//DTD NZB 1.1//EN', sysID: 'http://www.newzbin.com/DTD/nzb/nzb-1.1.dtd' })
- .ele('nzb', { xmlns: 'http://www.newzbin.com/DTD/2003/nzb' });
-
- const nzbFile = root.ele('file', {
- poster: file.poster,
- date: file.date,
- subject: file.filename,
- });
-
- const groups = nzbFile.ele('groups');
- // This should be dynamic in a real application
- groups.ele('group').txt('alt.binaries.test');
-
- const segments = nzbFile.ele('segments');
- for (let i = 1; i <= file.parts; i++) {
- const segment = messageIds[i];
- segments.ele('segment', { 'bytes': segment.size.toString(), 'number': i.toString() }).txt(segment.id);
- }
-
- const xml = root.end({ prettyPrint: true });
- const nzbFilename = `${file.filename}.nzb`;
-
- await fs.writeFile(nzbFilename, xml);
- logger.info(`NZB file created: ${nzbFilename}`);
-}
-
-const fileId = parseInt(process.argv[2], 10);
-if (isNaN(fileId)) {
- logger.error('Please provide a valid file ID as a command-line argument.');
- process.exit(1);
-}
-
-createNzb(fileId);
diff --git a/src/bin/start.js b/src/bin/start.js
deleted file mode 100644
index f70ee33..0000000
--- a/src/bin/start.js
+++ /dev/null
@@ -1,6 +0,0 @@
-import { Application } from '../Application.js';
-
-const app = new Application();
-app.run();
-
-process.on('SIGINT', () => app.shutdown());
diff --git a/src/lib/NntpPool.js b/src/lib/NntpPool.js
deleted file mode 100644
index 3d87d5f..0000000
--- a/src/lib/NntpPool.js
+++ /dev/null
@@ -1,70 +0,0 @@
-import { NNTP } from 'nntp-js';
-import log4js from './logger.js';
-
-const logger = log4js.getLogger('pool');
-
-export class NntpPool {
- constructor(poolSize = 10) {
- this.poolSize = poolSize;
- this.allConnections = new Set();
- this.idleConnections = [];
- this.waiters = [];
- this.createdCount = 0;
- }
-
- async _createConnection() {
- const config = {
- host: process.env.NNTP_HOST,
- user: process.env.NNTP_USER,
- password: process.env.NNTP_PASS,
- port: 443,
- secure: true,
- };
-
- const conn = new NNTP(config.host, 119);
- await conn.connect();
- await conn.login(config.user, config.password);
- this.allConnections.add(conn);
- return conn;
- }
-
- async acquire() {
- if (this.idleConnections.length > 0) {
- logger.debug('Reusing existing connection from pool.');
- return this.idleConnections.pop();
- }
-
- if (this.createdCount < this.poolSize) {
- this.createdCount++;
- logger.info(`Creating new connection (${this.createdCount}/${this.poolSize}).`);
- return this._createConnection();
- }
-
- logger.info(`Pool maxed out at ${this.poolSize}. Waiting for a connection to become available.`);
- return new Promise(resolve => this.waiters.push(resolve));
- }
-
- release(conn) {
- if (this.waiters.length > 0) {
- logger.debug('Releasing connection directly to a waiting task.');
- const resolve = this.waiters.shift();
- resolve(conn);
- } else {
- logger.debug('Returning connection to the idle pool.');
- this.idleConnections.push(conn);
- }
- }
-
- async shutdown() {
- logger.info('Shutting down all connections in the pool.');
- const shutdownPromises = [];
- for (const conn of this.allConnections) {
- shutdownPromises.push(conn.quit());
- }
- await Promise.all(shutdownPromises);
- this.allConnections.clear();
- this.idleConnections.length = 0;
- this.waiters.length = 0;
- this.createdCount = 0;
- }
-}
diff --git a/src/lib/YencFile.js b/src/lib/YencFile.js
deleted file mode 100644
index 3d2f0c6..0000000
--- a/src/lib/YencFile.js
+++ /dev/null
@@ -1,67 +0,0 @@
-import yencode from 'yencode';
-import { crc32 } from 'crc';
-import log4js from './logger.js';
-import { parseYencMeta } from './yenc.util.js';
-
-const logger = log4js.getLogger('yenc');
-
-export class YencFile {
- constructor() {
- this.targetBuffer = null;
- this.totalSize = 0;
- }
-
- processPart(encodedBuffer) {
- const meta = parseYencMeta(encodedBuffer);
-
- // Initialize buffer on the first part that has total size info
- if (!this.targetBuffer && meta.header?.size) {
- this.totalSize = parseInt(meta.header.size, 10);
- if (!this.totalSize) {
- throw new Error('Could not determine total file size from yEnc metadata.');
- }
- this.targetBuffer = Buffer.alloc(this.totalSize);
- logger.info(`Allocated buffer of size ${this.totalSize} for file.`);
- }
-
- if (!this.targetBuffer) {
- throw new Error('Cannot process yEnc part: target buffer not initialized. The first part must contain total file size.');
- }
-
- const headerPartMarker = Buffer.from('=ypart');
- const headerBeginMarker = Buffer.from('=ybegin');
- const footerMarker = Buffer.from('\r\n=yend');
-
- // The content starts after the LAST header line.
- const partHeaderIndex = encodedBuffer.indexOf(headerPartMarker);
- const beginHeaderIndex = encodedBuffer.indexOf(headerBeginMarker);
- const contentHeaderIndex = partHeaderIndex !== -1 ? partHeaderIndex : beginHeaderIndex;
-
- const contentStartIndex = encodedBuffer.indexOf('\r\n', contentHeaderIndex) + 2;
- const contentEndIndex = encodedBuffer.lastIndexOf(footerMarker);
- const dataToDecode = encodedBuffer.subarray(contentStartIndex, contentEndIndex);
-
- const decoded = yencode.decode(dataToDecode);
-
- const expectedSize = parseInt(meta.footer?.size, 10);
- if (decoded.length !== expectedSize) {
- throw new Error(`Decoded size (${decoded.length}) does not match expected part size (${expectedSize}).`);
- }
- logger.debug('Part size check passed.');
-
- const calculatedCrc = crc32(decoded);
- const expectedCrc = parseInt(meta.footer?.pcrc32, 16);
- if (calculatedCrc !== expectedCrc) {
- throw new Error(`CRC32 mismatch: expected ${expectedCrc.toString(16)}, but got ${calculatedCrc.toString(16)}.`);
- }
- logger.debug('CRC32 check passed.');
-
- const offset = parseInt(meta.part.begin, 10) - 1;
- decoded.copy(this.targetBuffer, offset);
- logger.info(`Processed part ${meta.header.part}/${meta.header.total || 'N/A'} and wrote to buffer at offset ${offset}.`);
- }
-
- getBuffer() {
- return this.targetBuffer;
- }
-}
diff --git a/src/lib/database.js b/src/lib/database.js
deleted file mode 100644
index dcdcc43..0000000
--- a/src/lib/database.js
+++ /dev/null
@@ -1,26 +0,0 @@
-import { open } from 'sqlite';
-import sqlite3 from 'sqlite3';
-
-let db;
-
-export const getDb = async () => {
- if (!db) {
- db = await open({
- filename: './database.sqlite',
- driver: sqlite3.Database,
- });
-
- await db.exec(`
- CREATE TABLE IF NOT EXISTS files (
- id INTEGER PRIMARY KEY AUTOINCREMENT,
- filename TEXT NOT NULL,
- poster TEXT NOT NULL,
- date INTEGER NOT NULL,
- parts INTEGER NOT NULL,
- message_ids TEXT NOT NULL,
- created_at DATETIME DEFAULT CURRENT_TIMESTAMP
- );
- `);
- }
- return db;
-};
diff --git a/src/lib/logger.js b/src/lib/logger.js
deleted file mode 100644
index 7d8584f..0000000
--- a/src/lib/logger.js
+++ /dev/null
@@ -1,27 +0,0 @@
-import log4js from 'log4js';
-import fs from 'fs';
-
-const logsDir = './logs';
-if (!fs.existsSync(logsDir)) {
- fs.mkdirSync(logsDir);
-}
-
-const timestamp = new Date().toISOString().replace(/:/g, '-');
-
-log4js.configure({
- appenders: {
- console: { type: 'console' },
- file: { type: 'file', filename: `${logsDir}/${timestamp}.log` },
- },
- categories: {
- default: { appenders: ['console', 'file'], level: 'debug' },
- header: { appenders: ['console', 'file'], level: 'info' },
- file: { appenders: ['console', 'file'], level: 'info' },
- collection: { appenders: ['console', 'file'], level: 'info' },
- body: { appenders: ['console', 'file'], level: 'info' },
- pool: { appenders: ['console', 'file'], level: 'info' },
- yenc: { appenders: ['console', 'file'], level: 'info' },
- },
-});
-
-export default log4js;
diff --git a/src/lib/yenc.util.js b/src/lib/yenc.util.js
deleted file mode 100644
index 1b45e77..0000000
--- a/src/lib/yenc.util.js
+++ /dev/null
@@ -1,55 +0,0 @@
-/**
- * Parses a single line of yEnc metadata.
- * @param {string} line The metadata line.
- * @returns {object} A key-value map of the metadata.
- */
-function parseMetaLine(line) {
- if (!line) return {};
- const meta = {};
- line.split(' ').forEach(part => {
- const eqIndex = part.indexOf('=');
- if (eqIndex !== -1) {
- meta[part.slice(0, eqIndex)] = part.slice(eqIndex + 1);
- }
- });
- return meta;
-}
-
-/**
- * Finds a line in a buffer that starts with a specific marker.
- * @param {Buffer} buffer The buffer to search.
- * @param {string} marker The marker to find (e.g., '=ybegin').
- * @returns {string|null} The found line, or null.
- */
-function findLine(buffer, marker) {
- const markerBuffer = Buffer.from(marker);
- const index = buffer.indexOf(markerBuffer);
- if (index === -1) return null;
-
- const lineEndIndex = buffer.indexOf(Buffer.from('\r\n'), index);
- return buffer.subarray(index, (lineEndIndex !== -1) ? lineEndIndex : buffer.length).toString();
-}
-
-/**
- * Extracts and merges metadata from all yEnc headers and footers.
- * @param {Buffer} encodedBuffer The yEnc-encoded buffer.
- * @returns {object} A single, merged object of all metadata.
- */
-export function parseYencMeta(encodedBuffer) {
- const beginLine = findLine(encodedBuffer, '=ybegin');
- const partLine = findLine(encodedBuffer, '=ypart');
- const endLine = findLine(encodedBuffer, '=yend');
-
- if (!endLine || (!beginLine && !partLine)) {
- throw new Error('Invalid yEnc data: missing required headers or footers.');
- }
-
- // Merge metadata, with more specific lines overwriting general ones.
- const meta = {
- header: parseMetaLine(beginLine),
- part: parseMetaLine(partLine),
- footer: parseMetaLine(endLine),
- };
-
- return meta;
-}
diff --git a/src/workers/BodyWorker.js b/src/workers/BodyWorker.js
deleted file mode 100644
index 33ca372..0000000
--- a/src/workers/BodyWorker.js
+++ /dev/null
@@ -1,71 +0,0 @@
-import { Queue, Worker } from 'bullmq';
-import log4js from '../lib/logger.js';
-import { NntpPool } from '../lib/NntpPool.js';
-import { parseYencMeta } from '../lib/yenc.util.js';
-import fs from 'fs/promises';
-import path from 'path';
-
-const logger = log4js.getLogger('body');
-
-export class BodyWorker {
- constructor(headerQueue) {
- this.headerQueue = headerQueue;
- this.queue = new Queue('body-queue', {
- connection: {
- host: process.env.REDIS_HOST || 'localhost',
- port: process.env.REDIS_PORT || 6379,
- },
- });
- this.pool = new NntpPool();
- this.worker = new Worker(this.queue.name, this.process.bind(this), { connection: this.queue.opts.connection });
-
- this.worker.on('failed', (job, err) => {
- logger.error(`Body job ${job.id} failed with error: ${err.message}`);
- });
- }
-
- async process(job) {
- const { header } = job.data;
- const messageId = header['message-id'];
- logger.debug(`Processing header with unparsable subject: ${header.subject}`);
-
- let conn;
- try {
- conn = await this.pool.acquire();
- const bodyBuffer = (await conn.body(messageId)).data;
-
- try {
- const meta = parseYencMeta(bodyBuffer);
- if (meta.header.name) {
- const { name, part, total } = meta.header;
- const newSubject = `"${name}" yEnc (${part}/${total})`;
- header.subject = newSubject;
-
- logger.info(`Found yEnc metadata in body. New subject: ${newSubject}`);
- await this.headerQueue.add('process-header', header);
- } else {
- logger.warn(`Could not find yEnc metadata in body for header: ${header.subject}`);
- }
- } catch (parseError) {
- if (parseError.message.includes('Invalid yEnc data')) {
- logger.error(`Failed to parse yEnc data for message ID ${messageId}. Dumping buffer for inspection.`);
- const debugDir = path.join(process.cwd(), 'debug');
- await fs.mkdir(debugDir, { recursive: true });
- const timestamp = new Date().toISOString().replace(/:/g, '-');
- const dumpFile = path.join(debugDir, `body-error-${timestamp}-${messageId.replace(/[<>]/g, '')}.bin`);
- await fs.writeFile(dumpFile, bodyBuffer);
- logger.error(`Problematic body buffer saved to: ${dumpFile}`);
- }
- // Re-throw the original parsing error to fail the job
- throw parseError;
- }
- } catch (error) {
- logger.error(`Error in body worker for message ID ${messageId}:`, error);
- throw error; // Ensure the job fails if any other error occurs
- } finally {
- if (conn) {
- this.pool.release(conn);
- }
- }
- }
-}
diff --git a/src/workers/CollectionWorker.js b/src/workers/CollectionWorker.js
deleted file mode 100644
index 0157ea5..0000000
--- a/src/workers/CollectionWorker.js
+++ /dev/null
@@ -1,78 +0,0 @@
-import { Queue, Worker } from 'bullmq';
-import log4js from '../lib/logger.js';
-import { getDb } from '../lib/database.js';
-import { NntpPool } from '../lib/NntpPool.js';
-import { createExtractorFromData } from 'node-unrar-js';
-import { YencFile } from '../lib/YencFile.js';
-
-const logger = log4js.getLogger('collection');
-
-export class CollectionWorker {
- constructor() {
- this.queue = new Queue('collection-queue', {
- connection: {
- host: process.env.REDIS_HOST || 'localhost',
- port: process.env.REDIS_PORT || 6379,
- },
- });
- this.pool = new NntpPool();
- this.worker = new Worker(this.queue.name, this.process.bind(this), { connection: this.queue.opts.connection });
-
- this.worker.on('failed', (job, err) => {
- logger.error(`Collection job ${job.id} failed with error: ${err.message}`);
- });
- }
-
- async process(job) {
- const { fileId } = job.data;
- logger.debug(`Processing file ID ${fileId} for collection.`);
-
- const db = await getDb();
- const file = await db.get('SELECT * FROM files WHERE id = ?', fileId);
-
- if (!file) {
- logger.error(`File with ID ${fileId} not found in the database.`);
- return;
- }
-
- const RAR_REGEX = /\.part0*1\.rar$/;
- if (RAR_REGEX.test(file.filename)) {
- logger.info(`File "${file.filename}" is the first part of a RAR set.`);
-
- const messageIds = JSON.parse(file.message_ids);
- const firstPart = messageIds['1'];
-
- if (!firstPart || !firstPart.id) {
- logger.error(`Could not find message ID for the first part of file "${file.filename}".`);
- return;
- }
-
- let conn;
- try {
- conn = await this.pool.acquire();
- await conn.group('alt.binaries.test');
- const bodyBuffer = (await conn.body(`<${firstPart.id}>`)).data;
-
- const yencFile = new YencFile();
- yencFile.processPart(bodyBuffer);
- const decodedBuffer = yencFile.getBuffer();
-
- const extractor = await createExtractorFromData({ data: decodedBuffer });
- const fileList = extractor.getFileList();
- logger.info(`Files in "${file.filename}":`, fileList);
- } catch (error) {
- if (error.code === 430) {
- logger.error(`Article not found for first part of RAR set (Message ID: ${firstPart.id})`);
- } else {
- logger.error('Error processing RAR file:', error);
- }
- } finally {
- if (conn) {
- this.pool.release(conn);
- }
- }
- } else {
- logger.debug(`File "${file.filename}" is not the first part of a RAR set.`);
- }
- }
-}
diff --git a/src/workers/FileWorker.js b/src/workers/FileWorker.js
deleted file mode 100644
index 6dbd63e..0000000
--- a/src/workers/FileWorker.js
+++ /dev/null
@@ -1,66 +0,0 @@
-import { Queue, Worker } from 'bullmq';
-import log4js from '../lib/logger.js';
-import { getDb } from '../lib/database.js';
-
-const logger = log4js.getLogger('file');
-
-export class FileWorker {
- constructor(collectionQueue) {
- this.collectionQueue = collectionQueue;
- this.queue = new Queue('file-queue', {
- connection: {
- host: process.env.REDIS_HOST || 'localhost',
- port: process.env.REDIS_PORT || 6379,
- },
- });
- this.worker = new Worker(this.queue.name, this.process.bind(this), { connection: this.queue.opts.connection });
-
- this.worker.on('failed', (job, err) => {
- logger.error(`File job ${job.id} failed with error: ${err.message}`);
- });
- }
-
- async process(job) {
- const { filename, parts } = job.data;
- const partCount = Object.keys(parts).length;
- logger.debug(`Processing complete file: "${filename}" with ${partCount} parts.`);
-
- const firstPart = JSON.parse(Object.values(parts)[0]);
- const poster = firstPart.from;
- const date = new Date(firstPart.date).getTime();
-
- const messageIds = Object.entries(parts).reduce((acc, [partNumber, partData]) => {
- const part = JSON.parse(partData);
- const messageId = part['message-id'];
- if (messageId) {
- acc[partNumber] = {
- id: messageId.replace(/[<>]/g, ''),
- size: part[':bytes'],
- };
- } else {
- logger.warn(`Message ID not found for part ${partNumber} of file "${filename}"`);
- }
- return acc;
- }, {});
-
- if (Object.keys(messageIds).length !== partCount) {
- throw new Error(`Could not process all parts for file "${filename}" due to missing message IDs.`);
- }
-
- const db = await getDb();
- const result = await db.run(
- 'INSERT INTO files (filename, poster, date, parts, message_ids) VALUES (?, ?, ?, ?, ?)',
- filename,
- poster,
- date,
- partCount,
- JSON.stringify(messageIds)
- );
-
- const fileId = result.lastID;
- logger.debug(`Saved file "${filename}" to database with ID: ${fileId}`);
-
- await this.collectionQueue.add('process-collection', { fileId });
- logger.debug(`Added file ID ${fileId} to collection queue.`);
- }
-}
diff --git a/src/workers/HeaderWorker.js b/src/workers/HeaderWorker.js
deleted file mode 100644
index c55b83c..0000000
--- a/src/workers/HeaderWorker.js
+++ /dev/null
@@ -1,54 +0,0 @@
-import { Queue, Worker } from 'bullmq';
-import Redis from 'ioredis';
-import log4js from '../lib/logger.js';
-
-const logger = log4js.getLogger('header');
-
-export class HeaderWorker {
- constructor(fileQueue, bodyQueue) {
- this.fileQueue = fileQueue;
- this.bodyQueue = bodyQueue;
- this.queue = new Queue('header-queue', {
- connection: {
- host: process.env.REDIS_HOST || 'localhost',
- port: process.env.REDIS_PORT || 6379,
- },
- });
- this.redis = new Redis(this.queue.opts.connection);
- this.worker = new Worker(this.queue.name, this.process.bind(this), { connection: this.queue.opts.connection });
-
- this.worker.on('failed', (job, err) => {
- logger.error(`Header job ${job.id} failed with error: ${err.message}`);
- });
- }
-
- async process(job) {
- const header = job.data;
- const subject = header.subject;
- const SUBJECT_REGEX = /"(.+)"(?: yEnc)? \((\d+)\/(\d+)\)/;
- const match = subject.match(SUBJECT_REGEX);
-
- if (match) {
- const filename = match[1];
- const part = parseInt(match[2], 10);
- const total = parseInt(match[3], 10);
-
- const fileKey = `file:${filename}`;
- await this.redis.hset(fileKey, part, JSON.stringify(header));
-
- const partCount = await this.redis.hlen(fileKey);
-
- if (partCount === total) {
- const fileParts = await this.redis.hgetall(fileKey);
- await this.fileQueue.add('process-file', { filename, parts: fileParts });
- await this.redis.del(fileKey);
- logger.info(`File "${filename}" is complete and moved to file-queue.`);
- } else {
- logger.info(`Stored part ${part}/${total} for file "${filename}"`);
- }
- } else {
- logger.warn(`Could not parse subject: "${subject}". Moving to body-queue.`);
- await this.bodyQueue.add('process-body', { header });
- }
- }
-}
diff --git a/src/yenc.test.js b/src/yenc.test.js
deleted file mode 100644
index dc9ff58..0000000
--- a/src/yenc.test.js
+++ /dev/null
@@ -1,21 +0,0 @@
-import { decodeYenc } from './yenc.util.js';
-import fs from 'fs/promises';
-import { Buffer } from 'buffer';
-
-async function runTest() {
- const encodedData = await fs.readFile('files/HjVfQlWmHdUrQeQkRiLkTwEj-1779830864932@nyuu.bin');
- const correctlyDecodedData = await fs.readFile('files/Dragon.Ball.S01E119.MULTI.BDRip.REMASTERED.1080p.x264.DTS-LILAS.par2-good');
-
- const decodedBuffer = decodeYenc(encodedData);
-
- if (Buffer.compare(decodedBuffer, correctlyDecodedData) === 0) {
- console.log('Test passed: Decoded data matches the correctly decoded file.');
- } else {
- console.error('Test failed: Decoded data does not match the correctly decoded file.');
- console.error('Decoded buffer length:', decodedBuffer.length);
- console.error('Correct buffer length:', correctlyDecodedData.length);
- await fs.writeFile('files/test-decoded-output.bin', decodedBuffer);
- }
-}
-
-runTest();
diff --git a/start/env.ts b/start/env.ts
new file mode 100644
index 0000000..635bf29
--- /dev/null
+++ b/start/env.ts
@@ -0,0 +1,47 @@
+/*
+|--------------------------------------------------------------------------
+| 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
+ NODE_ENV: Env.schema.enum(['development', 'production', 'test'] as const),
+ PORT: Env.schema.number(),
+ HOST: Env.schema.string({ format: 'host' }),
+ LOG_LEVEL: Env.schema.string(),
+
+ // App
+ APP_KEY: Env.schema.secret(),
+ APP_URL: Env.schema.string({ format: 'url', tld: false }),
+
+ // Session
+ SESSION_DRIVER: Env.schema.enum(['cookie', 'memory', 'database'] as const),
+
+ // Database
+ DB_CONNECTION: Env.schema.string(),
+ DB_HOST: Env.schema.string({ format: 'host' }),
+ DB_PORT: Env.schema.number(),
+ DB_USER: Env.schema.string(),
+ DB_PASSWORD: Env.schema.secret.optional(),
+ DB_DATABASE: Env.schema.string(),
+
+ // Redis
+ REDIS_HOST: Env.schema.string({ format: 'host' }),
+ REDIS_PORT: Env.schema.number(),
+ REDIS_PASSWORD: Env.schema.secret.optional(),
+
+ // Usenet (NNTP)
+ NNTP_HOST: Env.schema.string({ format: 'host' }),
+ NNTP_PORT: Env.schema.number(),
+ NNTP_USER: Env.schema.string(),
+ NNTP_PASSWORD: Env.schema.secret(),
+ NNTP_SECURE: Env.schema.boolean(),
+})
diff --git a/start/kernel.ts b/start/kernel.ts
new file mode 100644
index 0000000..d3c18be
--- /dev/null
+++ b/start/kernel.ts
@@ -0,0 +1,49 @@
+/*
+|--------------------------------------------------------------------------
+| 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/force_json_response_middleware'),
+ () => import('#middleware/container_bindings_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'),
+ () => import('@adonisjs/session/session_middleware'),
+ () => import('@adonisjs/shield/shield_middleware'),
+ () => import('@adonisjs/auth/initialize_auth_middleware'),
+ () => import('#middleware/silent_auth_middleware'),
+])
+
+/**
+ * Named middleware collection must be explicitly assigned to
+ * the routes or the routes group.
+ */
+export const middleware = router.named({
+ auth: () => import('#middleware/auth_middleware'),
+})
diff --git a/start/routes.ts b/start/routes.ts
new file mode 100644
index 0000000..29fc17f
--- /dev/null
+++ b/start/routes.ts
@@ -0,0 +1,37 @@
+/*
+|--------------------------------------------------------------------------
+| Routes file
+|--------------------------------------------------------------------------
+|
+| The routes file is used for defining the HTTP routes.
+|
+*/
+
+import { middleware } from '#start/kernel'
+import router from '@adonisjs/core/services/router'
+import { controllers } from '#generated/controllers'
+
+router.get('/', () => {
+ return { hello: 'world' }
+})
+
+router
+ .group(() => {
+ router
+ .group(() => {
+ router.post('signup', [controllers.NewAccount, 'store'])
+ router.post('login', [controllers.AccessTokens, 'store'])
+ })
+ .prefix('auth')
+ .as('auth')
+
+ router
+ .group(() => {
+ router.get('profile', [controllers.Profile, 'show'])
+ router.post('logout', [controllers.AccessTokens, 'destroy'])
+ })
+ .prefix('account')
+ .as('profile')
+ .use(middleware.auth())
+ })
+ .prefix('/api/v1')
diff --git a/start/validator.ts b/start/validator.ts
new file mode 100644
index 0000000..6a2ca7d
--- /dev/null
+++ b/start/validator.ts
@@ -0,0 +1,23 @@
+/*
+|--------------------------------------------------------------------------
+| Validator file
+|--------------------------------------------------------------------------
+|
+| The validator file is used for configuring global transforms for VineJS.
+| The transform below converts all VineJS date outputs from JavaScript
+| Date objects to Luxon DateTime instances, so that validated dates are
+| ready to use with Lucid models and other parts of the app that expect
+| Luxon DateTime.
+|
+*/
+
+import { DateTime } from 'luxon'
+import { VineDate } from '@vinejs/vine'
+
+declare module '@vinejs/vine/types' {
+ interface VineGlobalTransforms {
+ date: DateTime
+ }
+}
+
+VineDate.transform((value) => DateTime.fromJSDate(value))
diff --git a/tests/bootstrap.ts b/tests/bootstrap.ts
new file mode 100644
index 0000000..bee79df
--- /dev/null
+++ b/tests/bootstrap.ts
@@ -0,0 +1,56 @@
+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 { dbAssertions } from '@adonisjs/lucid/plugins/db'
+import testUtils from '@adonisjs/core/services/test_utils'
+import { authApiClient } from '@adonisjs/auth/plugins/api_client'
+import { sessionApiClient } from '@adonisjs/session/plugins/api_client'
+import type { Registry } from '../.adonisjs/client/registry/schema.d.ts'
+
+/**
+ * This file is imported by the "bin/test.ts" entrypoint file
+ */
+declare module '@japa/api-client/types' {
+ interface RoutesRegistry extends Registry {}
+}
+
+/**
+ * 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(),
+ pluginAdonisJS(app),
+ dbAssertions(app),
+ apiClient(),
+ sessionApiClient(app),
+ authApiClient(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 executed 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/tsconfig.json b/tsconfig.json
new file mode 100644
index 0000000..44f8528
--- /dev/null
+++ b/tsconfig.json
@@ -0,0 +1,9 @@
+{
+ "extends": "@adonisjs/tsconfig/tsconfig.app.json",
+ "compilerOptions": {
+ "rootDir": "./",
+ "jsx": "react",
+ "outDir": "./build",
+ "esModuleInterop": true
+ }
+}
diff --git a/types/simple-yenc.d.ts b/types/simple-yenc.d.ts
new file mode 100644
index 0000000..61789ba
--- /dev/null
+++ b/types/simple-yenc.d.ts
@@ -0,0 +1 @@
+declare module 'simple-yenc';