diff --git a/.npmignore b/.npmignore index 243080d..dd784f7 100644 --- a/.npmignore +++ b/.npmignore @@ -113,3 +113,4 @@ tsconfig-cjs.json tsconfig-esm.json renovate.json +fortnite diff --git a/package.json b/package.json index 8da8116..83075b1 100644 --- a/package.json +++ b/package.json @@ -1,25 +1,23 @@ { "name": "@sern/handler", "packageManager": "yarn@3.5.0", - "version": "3.3.4", + "version": "4.0.0", "description": "A complete, customizable, typesafe, & reactive framework for discord bots.", "main": "./dist/index.js", - "module": "./dist/index.mjs", - "types": "./dist/index.d.ts", + "module": "./dist/index.js", "exports": { ".": { - "import": "./dist/index.mjs", - "require": "./dist/index.js", - "types": "./dist/index.d.ts" + "import": "./dist/index.js", + "require": "./dist/index.js" } }, "scripts": { - "watch": "tsup --watch", + "watch": "tsc --watch", "lint": "eslint src/**/*.ts", "format": "eslint src/**/*.ts --fix", - "build:dev": "tsup --metafile", - "build:prod": "tsup ", - "prepare": "npm run build:prod", + "build:dev": "tsc", + "build:prod": "tsc", + "prepare": "tsc", "pretty": "prettier --write .", "tdd": "vitest", "test": "vitest --run", @@ -37,30 +35,23 @@ "author": "SernDevs", "license": "MIT", "dependencies": { + "@sern/ioc": "^1.1.0", "callsites": "^3.1.0", - "iti": "^0.6.0", + "cron": "^3.1.7", + "deepmerge": "^4.3.1", "rxjs": "^7.8.0", "ts-results-es": "^4.1.0" }, "devDependencies": { "@faker-js/faker": "^8.0.1", - "@types/node": "^18.15.11", + "@types/node": "^20.0.0", + "@types/node-cron": "^3.0.11", "@typescript-eslint/eslint-plugin": "5.58.0", "@typescript-eslint/parser": "5.59.1", - "discord.js": "^14.11.0", + "discord.js": "^14.15.3", "eslint": "8.39.0", - "prettier": "2.8.8", - "tsup": "^6.7.0", "typescript": "5.0.2", - "vitest": "latest" - }, - "prettier": { - "semi": true, - "trailingComma": "all", - "singleQuote": true, - "printWidth": 100, - "tabWidth": 4, - "arrowParens": "avoid" + "vitest": "^1.6.0" }, "eslintConfig": { "parser": "@typescript-eslint/parser", @@ -95,7 +86,13 @@ "url": "git+https://github.com/sern-handler/handler.git" }, "engines": { - "node": ">= 18.16.x" + "node": ">= 20.0.x" }, - "homepage": "https://sern.dev" + "homepage": "https://sern.dev", + "overrides": { + "ws": "8.17.1" + }, + "resolutions": { + "ws": "8.17.1" + } } diff --git a/src/core/_internal.ts b/src/core/_internal.ts deleted file mode 100644 index 1b2f35c..0000000 --- a/src/core/_internal.ts +++ /dev/null @@ -1,10 +0,0 @@ -export * as Id from './id'; -export * from './operators'; -export * as Files from './module-loading'; -export * from './functions'; -export type { VoidResult } from '../types/core-plugin'; -export { SernError } from './structures/enums'; -export { ModuleStore } from './structures/module-store'; -export * as __Services from './structures/services'; -export { useContainerRaw } from './ioc/base'; - diff --git a/src/core/contracts/emitter.ts b/src/core/contracts/emitter.ts deleted file mode 100644 index 11bbc28..0000000 --- a/src/core/contracts/emitter.ts +++ /dev/null @@ -1,9 +0,0 @@ -//i deleted it, hmm so how should we allow users to enable localization? -// a -import type { AnyFunction } from '../../types/utility'; - -export interface Emitter { - addListener(eventName: string | symbol, listener: AnyFunction): this; - removeListener(eventName: string | symbol, listener: AnyFunction): this; - emit(eventName: string | symbol, ...payload: any[]): boolean; -} diff --git a/src/core/contracts/error-handling.ts b/src/core/contracts/error-handling.ts deleted file mode 100644 index d5e9455..0000000 --- a/src/core/contracts/error-handling.ts +++ /dev/null @@ -1,16 +0,0 @@ -/** - * @since 2.0.0 - */ -export interface ErrorHandling { - /** - * @deprecated - * Version 4 will remove this method - */ - crash(err: Error): never; - /** - * A function that is called on every throw. - * @param error - */ - updateAlive(error: Error): void; - -} diff --git a/src/core/contracts/hooks.ts b/src/core/contracts/hooks.ts deleted file mode 100644 index ee329dd..0000000 --- a/src/core/contracts/hooks.ts +++ /dev/null @@ -1,16 +0,0 @@ - -/** - * Represents an initialization contract. - * Let dependencies implement this to initiate some logic. - */ -export interface Init { - init(): unknown; -} - -/** - * Represents a Disposable contract. - * Let dependencies implement this to dispose and cleanup. - */ -export interface Disposable { - dispose(): unknown; -} diff --git a/src/core/contracts/index.ts b/src/core/contracts/index.ts deleted file mode 100644 index f0eb130..0000000 --- a/src/core/contracts/index.ts +++ /dev/null @@ -1,6 +0,0 @@ -export * from './error-handling'; -export * from './logging'; -export * from './module-manager'; -export * from './module-store'; -export * from './hooks'; -export * from './emitter'; diff --git a/src/core/contracts/logging.ts b/src/core/contracts/logging.ts deleted file mode 100644 index 9ceb761..0000000 --- a/src/core/contracts/logging.ts +++ /dev/null @@ -1,11 +0,0 @@ -/** - * @since 2.0.0 - */ -export interface Logging { - error(payload: LogPayload): void; - warning(payload: LogPayload): void; - info(payload: LogPayload): void; - debug(payload: LogPayload): void; -} - -export type LogPayload = { message: T }; diff --git a/src/core/contracts/module-manager.ts b/src/core/contracts/module-manager.ts deleted file mode 100644 index 5dbeaee..0000000 --- a/src/core/contracts/module-manager.ts +++ /dev/null @@ -1,34 +0,0 @@ -import type { - CommandMeta, - CommandModule, - CommandModuleDefs, - Module, -} from '../../types/core-modules'; -import { CommandType } from '../structures'; - -interface MetadataAccess { - getMetadata(m: Module): CommandMeta | undefined; - setMetadata(m: Module, c: CommandMeta): void; -} - -/** - * @since 2.0.0 - * @internal - direct access to the module manager will be removed in version 4 - */ -export interface ModuleManager extends MetadataAccess { - get(id: string): Module | undefined; - - set(id: string, path: Module): void; - /** - * @deprecated - */ - getPublishableCommands(): CommandModule[]; - - /* - * @deprecated - */ - getByNameCommandType( - name: string, - commandType: T, - ): CommandModuleDefs[T] | undefined; -} diff --git a/src/core/contracts/module-store.ts b/src/core/contracts/module-store.ts deleted file mode 100644 index 90818f8..0000000 --- a/src/core/contracts/module-store.ts +++ /dev/null @@ -1,9 +0,0 @@ -import type { CommandMeta, Module } from '../../types/core-modules'; - -/** - * Represents a core module store that stores IDs mapped to file paths. - */ -export interface CoreModuleStore { - commands: Map; - metadata: WeakMap; -} diff --git a/src/core/create-plugins.ts b/src/core/create-plugins.ts deleted file mode 100644 index 7f1b8bf..0000000 --- a/src/core/create-plugins.ts +++ /dev/null @@ -1,72 +0,0 @@ -import { CommandType, EventType, PluginType } from './structures'; -import type { Plugin, PluginResult, EventArgs, CommandArgs } from '../types/core-plugin'; -import type { ClientEvents } from 'discord.js'; -import { err, ok } from './functions'; - -export function makePlugin( - type: PluginType, - execute: (...args: any[]) => any, -): Plugin { - return { - type, - execute, - } as Plugin; -} -/** - * @since 2.5.0 - * @__PURE__ - */ -export function EventInitPlugin( - execute: (...args: EventArgs) => PluginResult, -) { - return makePlugin(PluginType.Init, execute); -} -/** - * @since 2.5.0 - * @__PURE__ - */ -export function CommandInitPlugin( - execute: (...args: CommandArgs) => PluginResult, -) { - return makePlugin(PluginType.Init, execute); -} -/** - * @since 2.5.0 - * @__PURE__ - */ -export function CommandControlPlugin( - execute: (...args: CommandArgs) => PluginResult, -) { - return makePlugin(PluginType.Control, execute); -} -/** - * @since 2.5.0 - * @__PURE__ - */ -export function EventControlPlugin( - execute: (...args: EventArgs) => PluginResult, -) { - return makePlugin(PluginType.Control, execute); -} - -/** - * @since 2.5.0 - * @Experimental - * A specialized function for creating control plugins with discord.js ClientEvents. - * Will probably be moved one day! - */ -export function DiscordEventControlPlugin( - name: T, - execute: (...args: ClientEvents[T]) => PluginResult, -) { - return makePlugin(PluginType.Control, execute); -} - -/** - * @since 1.0.0 - * The object passed into every plugin to control a command's behavior - */ -export const controller = { - next: ok, - stop: err, -}; diff --git a/src/core/functions.ts b/src/core/functions.ts index 878151b..1e65d38 100644 --- a/src/core/functions.ts +++ b/src/core/functions.ts @@ -1,6 +1,4 @@ -import { Err, Ok } from 'ts-results-es'; import type { Module, SernAutocompleteData, SernOptionsData } from '../types/core-modules'; -import type { AnyCommandPlugin, AnyEventPlugin, Plugin } from '../types/core-plugin'; import type { AnySelectMenuInteraction, ButtonInteraction, @@ -11,31 +9,37 @@ import type { AutocompleteInteraction } from 'discord.js'; import { ApplicationCommandOptionType, InteractionType } from 'discord.js'; -import { PayloadType, PluginType } from './structures'; +import { PluginType } from './structures/enums'; import assert from 'assert'; import type { Payload } from '../types/utility'; -//function wrappers for empty ok / err -export const ok = /* @__PURE__*/ () => Ok.EMPTY; -export const err = /* @__PURE__*/ () => Err.EMPTY; +/** + * Removes the first character(s) _[depending on prefix length]_ of the message + * @param msg + * @param prefix The prefix to remove + * @returns The message without the prefix + * @example + * message.content = '!ping'; + * console.log(fmt(message.content, '!')); + * // [ 'ping' ] + */ +export function fmt(msg: string, prefix?: string): string[] { + if(!prefix) throw Error("Unable to parse message without prefix"); + return msg.slice(prefix.length).trim().split(/\s+/g); +} -export function partitionPlugins( - arr: (AnyEventPlugin | AnyCommandPlugin)[] = [], -): [Plugin[], Plugin[]] { + +export function partitionPlugins +(arr: Array<{ type: PluginType }> = []): [T[], V[]] { const controlPlugins = []; const initPlugins = []; - for (const el of arr) { switch (el.type) { - case PluginType.Control: - controlPlugins.push(el); - break; - case PluginType.Init: - initPlugins.push(el); - break; + case PluginType.Control: controlPlugins.push(el); break; + case PluginType.Init: initPlugins.push(el); break; } } - return [controlPlugins, initPlugins]; + return [controlPlugins, initPlugins] as [T[], V[]]; } /** @@ -54,40 +58,31 @@ export function treeSearch( while (_options.length > 0) { const cur = _options.pop()!; switch (cur.type) { - case ApplicationCommandOptionType.Subcommand: - { + case ApplicationCommandOptionType.Subcommand: { subcommands.add(cur.name); for (const option of cur.options ?? []) _options.push(option); - } - break; - case ApplicationCommandOptionType.SubcommandGroup: - { + } break; + case ApplicationCommandOptionType.SubcommandGroup: { for (const command of cur.options ?? []) _options.push(command); - } - break; - default: - { - if ('autocomplete' in cur && cur.autocomplete) { - const choice = iAutocomplete.options.getFocused(true); - assert( - 'command' in cur, - 'No `command` property found for autocomplete option', - ); - if (subcommands.size > 0) { - const parent = iAutocomplete.options.getSubcommand(); - const parentAndOptionMatches = - subcommands.has(parent) && cur.name === choice.name; - if (parentAndOptionMatches) { - return { ...cur, parent }; - } - } else { - if (cur.name === choice.name) { - return { ...cur, parent: undefined }; - } + } break; + default: { + if ('autocomplete' in cur && cur.autocomplete) { + const choice = iAutocomplete.options.getFocused(true); + assert( 'command' in cur, 'No `command` property found for option ' + cur.name); + if (subcommands.size > 0) { + const parent = iAutocomplete.options.getSubcommand(); + const parentAndOptionMatches = + subcommands.has(parent) && cur.name === choice.name; + if (parentAndOptionMatches) { + return { ...cur, parent }; + } + } else { + if (cur.name === choice.name) { + return { ...cur, parent: undefined }; } } } - break; + } break; } } } @@ -117,7 +112,15 @@ export function isModal(i: InteractionTypable): i is ModalSubmitInteraction { return i.type === InteractionType.ModalSubmit; } -export function resultPayload +export function resultPayload (type: T, module?: Module, reason?: unknown) { return { type, module, reason } as Payload & { type : T }; } + +export function pipe(arg: unknown, firstFn: Function, ...fns: Function[]): T { + let result = firstFn(arg); + for (let fn of fns) { + result = fn(result); + } + return result; +} diff --git a/src/core/id.ts b/src/core/id.ts index 50a781e..f759ef4 100644 --- a/src/core/id.ts +++ b/src/core/id.ts @@ -1,6 +1,15 @@ -import { ApplicationCommandType, ComponentType, Interaction, InteractionType } from 'discord.js'; -import { CommandType, EventType } from './structures'; +import { ApplicationCommandType, ComponentType, type Interaction, InteractionType } from 'discord.js'; +import { CommandType, EventType } from './structures/enums'; +const parseParams = (event: { customId: string }, append: string) => { + const hasSlash = event.customId.indexOf('/') + if(hasSlash === -1) { + return { id:event.customId+append }; + } + const baseid = event.customId.substring(0, hasSlash); + const params = event.customId.substring(hasSlash+1); + return { id: baseid+append, params } +} /** * Construct unique ID for a given interaction object. * @param event The interaction object for which to create an ID. @@ -9,15 +18,16 @@ import { CommandType, EventType } from './structures'; export function reconstruct(event: T) { switch (event.type) { case InteractionType.MessageComponent: { - return [`${event.customId}_C${event.componentType}`]; + const data = parseParams(event, `_C${event.componentType}`) + return [data]; } case InteractionType.ApplicationCommand: - case InteractionType.ApplicationCommandAutocomplete: { - return [`${event.commandName}_A${event.commandType}`, `${event.commandName}_B`]; - } + case InteractionType.ApplicationCommandAutocomplete: + return [{ id: `${event.commandName}_A${event.commandType}` }, { id: `${event.commandName}_B` }]; //Modal interactions are classified as components for sern case InteractionType.ModalSubmit: { - return [`${event.customId}_M`]; + const data = parseParams(event, '_M'); + return [data]; } } } @@ -25,22 +35,21 @@ export function reconstruct(event: T) { * * A magic number to represent any commandtype that is an ApplicationCommand. */ -const appBitField = 0b000000001111; +const PUBLISHABLE = 0b000000001111; -const TypeMap = new Map([ - [CommandType.Text, 0], - [CommandType.Both, 0], - [CommandType.Slash, ApplicationCommandType.ChatInput], - [CommandType.CtxUser, ApplicationCommandType.User], - [CommandType.CtxMsg, ApplicationCommandType.Message], - [CommandType.Button, ComponentType.Button], - [CommandType.Modal, InteractionType.ModalSubmit], - [CommandType.StringSelect, ComponentType.StringSelect], - [CommandType.UserSelect, ComponentType.UserSelect], - [CommandType.MentionableSelect, ComponentType.MentionableSelect], - [CommandType.RoleSelect, ComponentType.RoleSelect], - [CommandType.ChannelSelect, ComponentType.ChannelSelect]]); +const TypeMap = new Map([[CommandType.Text, 0], + [CommandType.Both, 0], + [CommandType.Slash, ApplicationCommandType.ChatInput], + [CommandType.CtxUser, ApplicationCommandType.User], + [CommandType.CtxMsg, ApplicationCommandType.Message], + [CommandType.Button, ComponentType.Button], + [CommandType.StringSelect, ComponentType.StringSelect], + [CommandType.Modal, InteractionType.ModalSubmit], + [CommandType.UserSelect, ComponentType.UserSelect], + [CommandType.MentionableSelect, ComponentType.MentionableSelect], + [CommandType.RoleSelect, ComponentType.RoleSelect], + [CommandType.ChannelSelect, ComponentType.ChannelSelect]]); /* * Generates an id based on name and CommandType. @@ -57,7 +66,7 @@ export function create(name: string, type: CommandType | EventType) { if(type == CommandType.Modal) { return `${name}_M`; } - const am = (appBitField & type) !== 0 ? 'A' : 'C'; + const am = (PUBLISHABLE & type) !== 0 ? 'A' : 'C'; return `${name}_${am}${TypeMap.get(type)!}` } diff --git a/src/core/index.ts b/src/core/index.ts deleted file mode 100644 index ef0881d..0000000 --- a/src/core/index.ts +++ /dev/null @@ -1,4 +0,0 @@ -export * from './contracts'; -export * from './create-plugins'; -export * from './structures'; -export * from './ioc'; diff --git a/src/core/interfaces.ts b/src/core/interfaces.ts new file mode 100644 index 0000000..cf682da --- /dev/null +++ b/src/core/interfaces.ts @@ -0,0 +1,55 @@ +import type { AnyFunction } from '../types/utility'; + + +/** + * Represents an initialization contract. + * Let dependencies implement this to initiate some logic. + */ +export interface Init { + init(): unknown; +} + +/** + * Represents a Disposable contract. + * Let dependencies implement this to dispose and cleanup. + */ +export interface Disposable { + dispose(): unknown; +} + + +export interface Emitter { + addListener(eventName: string | symbol, listener: AnyFunction): this; + removeListener(eventName: string | symbol, listener: AnyFunction): this; + emit(eventName: string | symbol, ...payload: any[]): boolean; +} + + +/** + * @since 2.0.0 + */ +export interface ErrorHandling { + /** + * @deprecated + * Version 4 will remove this method + */ + crash(err: Error): never; + /** + * A function that is called on every throw. + * @param error + */ + updateAlive(error: Error): void; + +} + +/** + * @since 2.0.0 + */ +export interface Logging { + error(payload: LogPayload): void; + warning(payload: LogPayload): void; + info(payload: LogPayload): void; + debug(payload: LogPayload): void; +} + +export type LogPayload = { message: T }; diff --git a/src/core/ioc.ts b/src/core/ioc.ts new file mode 100644 index 0000000..ebd4dea --- /dev/null +++ b/src/core/ioc.ts @@ -0,0 +1,163 @@ +import { Service as $Service, Services as $Services } from '@sern/ioc/global' +import { Container } from '@sern/ioc'; +import * as Contracts from './interfaces'; +import * as __Services from './structures/default-services'; +import type { Logging } from './interfaces'; +import { __init_container, useContainerRaw } from '@sern/ioc/global'; +import { EventEmitter } from 'node:events'; +import { Client } from 'discord.js'; +import { Module } from '../types/core-modules'; +import { UnpackFunction } from '../types/utility'; + +export function disposeAll(logger: Logging|undefined) { + useContainerRaw() + ?.disposeAll() + .then(() => logger?.info({ message: 'Cleaning container and crashing' })); +} + +type Insertable = | ((container: Dependencies) => object) + | object + +const dependencyBuilder = (container: Container) => { + return { + /** + * Insert a dependency into your container. + * Supply the correct key and dependency + */ + add(key: keyof Dependencies, v: Insertable) { + if(typeof v !== 'function') { + container.addSingleton(key, v) + } else { + //@ts-ignore + container.addWiredSingleton(key, (cntr) => v(cntr)) + } + }, + /** + * @param key the key of the dependency + * @param v The dependency to swap out. + * Swap out a preexisting dependency. + */ + swap(key: keyof Dependencies, v: Insertable) { + if(typeof v !== 'function') { + container.swap(key, v); + } else { + container.swap(key, v(container.deps())); + } + }, + }; +}; + +type ValidDependencyConfig = + (c: ReturnType) => any + +/** + * makeDependencies constructs a dependency injection container for sern handler to use. + * This is required to start the handler, and is to be called before Sern.init. + * @example + * ```ts + * await makeDependencies(({ add }) => { + * add('@sern/client', new Client({ intents, partials }) + * }) + * ``` + */ +export async function makeDependencies (conf: ValidDependencyConfig) { + const container = await __init_container({ autowire: false }); + //We only include logger if it does not exist + const includeLogger = !container.hasKey('@sern/logger'); + + if(includeLogger) { + container.addSingleton('@sern/logger', new __Services.DefaultLogging); + } + container.addSingleton('@sern/errors', new __Services.DefaultErrorHandling); + container.addSingleton('@sern/modules', new Map); + container.addSingleton('@sern/emitter', new EventEmitter) + container.addSingleton('@sern/scheduler', new __Services.TaskScheduler) + conf(dependencyBuilder(container)); + await container.ready(); +} + + +/** + * The Service api, which allows users to access dependencies in places IOC cannot reach. + * To obtain intellisense, ensure a .d.ts file exists in the root of compilation. + * Our scaffolding tool takes care of this. + * Note: this method only works AFTER your container has been initiated + * @since 3.0.0 + * @example + * ```ts + * const client = Service('@sern/client'); + * ``` + * @param key a key that corresponds to a dependency registered. + * @throws if container is absent or not present + */ +export function Service(key: T) { + return $Service(key) as Dependencies[T] +} +/** + * @since 3.0.0 + * The plural version of {@link Service} + * @throws if container is absent or not present + * @returns array of dependencies, in the same order of keys provided + * + */ +export function Services(...keys: [...T]) { + return $Services>(...keys) +} + +/** + * @deprecated + * Creates a singleton object. + * @param cb + */ +export function single(cb: () => T) { + console.log('The `single` function is deprecated and has no effect') + return cb(); +} + +/** + * @deprecated + * @since 2.0.0 + * Creates a transient object + * @param cb + */ +export function transient(cb: () => () => T) { + console.log('The `transient` function is deprecated and has no effect') + return cb()(); +} + +export type DependencyFromKey = Dependencies[T]; + + + +export type IntoDependencies = { + [Index in keyof Tuple]: UnpackFunction>>; //Unpack and make NonNullable +} & { length: Tuple['length'] }; + +export interface CoreDependencies { + /** + * discord.js client. + */ + '@sern/client': Client; + /** + * sern emitter listens to events that happen throughout + * the handler. some include module.register, module.activate. + */ + '@sern/emitter': Contracts.Emitter; + /** + * An error handler which is the final step before + * the sern process actually crashes. + */ + '@sern/errors': Contracts.ErrorHandling; + /** + * Optional logger. Performs ... logging + */ + '@sern/logger'?: Contracts.Logging; + /** + * Readonly module store. sern stores these + * by module.meta.id -> Module + */ + '@sern/modules': Map; + + '@sern/scheduler': __Services.TaskScheduler +} + diff --git a/src/core/ioc/base.ts b/src/core/ioc/base.ts deleted file mode 100644 index 5994783..0000000 --- a/src/core/ioc/base.ts +++ /dev/null @@ -1,166 +0,0 @@ -import * as assert from 'assert'; -import { useContainer } from './dependency-injection'; -import type { CoreDependencies, DependencyConfiguration } from '../../types/ioc'; -import { CoreContainer } from './container'; -import { Result } from 'ts-results-es'; -import { __Services } from '../_internal'; -import { AnyFunction } from '../../types/utility'; -import type { Logging } from '../contracts/logging'; -import type { UnpackFunction } from 'iti'; -//SIDE EFFECT: GLOBAL DI -let containerSubject: CoreContainer>; - -/** - * @internal - * Don't use this unless you know what you're doing. Destroys old containerSubject if it exists and disposes everything - * then it will swap - */ -export async function __swap_container(c: CoreContainer>) { - if(containerSubject) { - await containerSubject.disposeAll() - } - containerSubject = c; -} - -/** - * @internal - * Don't use this unless you know what you're doing. Destroys old containerSubject if it exists and disposes everything - * then it will swap - */ -export function __add_container(key: string,v : Insertable) { - containerSubject.add({ [key]: v }); -} - -/** - * Returns the underlying data structure holding all dependencies. - * Exposes methods from iti - * Use the Service API. The container should be readonly from the consumer side - */ -export function useContainerRaw() { - assert.ok( - containerSubject && containerSubject.isReady(), - "Could not find container or container wasn't ready. Did you call makeDependencies?", - ); - return containerSubject; -} - -export function disposeAll(logger: Logging|undefined) { - containerSubject - ?.disposeAll() - .then(() => logger?.info({ message: 'Cleaning container and crashing' })); -} -type UnpackedDependencies = { - [K in keyof Dependencies]: UnpackFunction -} -type Insertable = - | ((container: UnpackedDependencies) => unknown) - | object -const dependencyBuilder = (container: any, excluded: string[] ) => { - return { - /** - * Insert a dependency into your container. - * Supply the correct key and dependency - */ - add(key: keyof Dependencies, v: Insertable) { - if(typeof v !== 'function') { - Result.wrap(() => container.add({ [key]: v})) - .expect("Failed to add " + key); - } else { - Result.wrap(() => - container.add((cntr: UnpackedDependencies) => ({ [key]: v(cntr)} ))) - .expect("Failed to add " + key); - } - }, - /** - * Exclude any dependencies from being added. - * Warning: this could lead to bad errors if not used correctly - */ - exclude(...keys: (keyof Dependencies)[]) { - keys.forEach(key => excluded.push(key)); - }, - - /** - * @param key the key of the dependency - * @param v The dependency to swap out. - * Swap out a preexisting dependency. - */ - swap(key: keyof Dependencies, v: Insertable) { - if(typeof v !== 'function') { - Result.wrap(() => container.upsert({ [key]: v})) - .expect("Failed to update " + key); - } else { - Result.wrap(() => - container.upsert((cntr: UnpackedDependencies) => ({ [key]: v(cntr)}))) - .expect("Failed to update " + key); - } - }, - /** - * @param key the key of the dependency - * @param cleanup Provide cleanup for the dependency at key. First parameter is the dependency itself - * @example - * ```ts - * addDisposer('dbConnection', (dbConnection) => dbConnection.end()) - * ``` - * Swap out a preexisting dependency. - */ - addDisposer(key: keyof Dependencies, cleanup: AnyFunction) { - Result.wrap(() => container.addDisposer({ [key] : cleanup })) - .expect("Failed to addDisposer for" + key); - } - }; -}; - - -type ValidDependencyConfig = - | ((c: ReturnType) => any) - | DependencyConfiguration; - - -/** - * Given the user's conf, check for any excluded/included dependency keys. - * Then, call conf.build to get the rest of the users' dependencies. - * Finally, update the containerSubject with the new container state - * @param conf - */ -function composeRoot( - container: CoreContainer>, - conf: DependencyConfiguration, -) { - //container should have no client or logger yet. - const hasLogger = conf.exclude?.has('@sern/logger'); - if (!hasLogger) { - __add_container('@sern/logger', new __Services.DefaultLogging); - } - //Build the container based on the callback provided by the user - conf.build(container as CoreContainer>); - - if (!hasLogger) { - container.get('@sern/logger')?.info({ message: 'All dependencies loaded successfully.' }); - } - - container.ready(); -} - -export async function makeDependencies -(conf: ValidDependencyConfig) { - containerSubject = new CoreContainer(); - if(typeof conf === 'function') { - const excluded: string[] = []; - conf(dependencyBuilder(containerSubject, excluded)); - //We only include logger if it does not exist - const includeLogger = - !excluded.includes('@sern/logger') - && !containerSubject.hasKey('@sern/logger'); - - if(includeLogger) { - __add_container('@sern/logger', new __Services.DefaultLogging); - } - - containerSubject.ready(); - } else { - composeRoot(containerSubject, conf); - } - - return useContainer(); -} - diff --git a/src/core/ioc/container.ts b/src/core/ioc/container.ts deleted file mode 100644 index e8c4970..0000000 --- a/src/core/ioc/container.ts +++ /dev/null @@ -1,58 +0,0 @@ -import { Container } from 'iti'; -import { Disposable } from '../'; -import * as assert from 'node:assert'; -import { Subject } from 'rxjs'; -import { __Services, ModuleStore } from '../_internal'; -import * as Hooks from './hooks'; -import { EventEmitter } from 'node:events'; - - -/** - * A semi-generic container that provides error handling, emitter, and module store. - * For the handler to operate correctly, The only user provided dependency needs to be @sern/client - */ -export class CoreContainer> extends Container { - private ready$ = new Subject(); - constructor() { - super(); - assert.ok(!this.isReady(), 'Listening for dispose & init should occur prior to sern being ready.'); - - const { unsubscribe } = Hooks.createInitListener(this); - - this.ready$ - .subscribe({ complete: unsubscribe }); - - (this as Container<{}, {}>) - .add({ '@sern/errors': () => new __Services.DefaultErrorHandling, - '@sern/emitter': () => new EventEmitter({ captureRejections: true }), - '@sern/store': () => new ModuleStore }) - .add(ctx => { - return { '@sern/modules': new __Services.DefaultModuleManager(ctx['@sern/store'])}; - }); - } - - isReady() { - return this.ready$.closed; - } - - hasKey(key: string): boolean { - return Boolean((this as Container)._context[key]); - } - - override async disposeAll() { - const otherDisposables = Object - .entries(this._context) - .flatMap(([key, value]) => - 'dispose' in value ? [key] : []); - otherDisposables.forEach(key => { - //possible source of bug: dispose is a property. - this.addDisposer({ [key]: (dep: Disposable) => dep.dispose() } as never); - }) - await super.disposeAll(); - } - - ready() { - this.ready$.complete(); - this.ready$.unsubscribe(); - } -} diff --git a/src/core/ioc/dependency-injection.ts b/src/core/ioc/dependency-injection.ts deleted file mode 100644 index f792b8a..0000000 --- a/src/core/ioc/dependency-injection.ts +++ /dev/null @@ -1,57 +0,0 @@ -import assert from 'node:assert'; -import type { IntoDependencies } from '../../types/ioc'; -import { useContainerRaw } from './base'; - -/** - * @__PURE__ - * @since 2.0.0. - * Creates a singleton object. - * @param cb - */ -export function single(cb: () => T) { - return cb; -} - -/** - * @__PURE__ - * @since 2.0.0 - * Creates a transient object - * @param cb - */ -export function transient(cb: () => () => T) { - return cb; -} -/** - * The new Service api, a cleaner alternative to useContainer - * To obtain intellisense, ensure a .d.ts file exists in the root of compilation. - * Usually our scaffolding tool takes care of this. - * Note: this method only works AFTER your container has been initiated - * @since 3.0.0 - * @example - * ```ts - * const client = Service('@sern/client'); - * ``` - * @param key a key that corresponds to a dependency registered. - * - */ -export function Service(key: T) { - const dep = useContainerRaw().get(key)!; - assert(dep, "Requested key " + key + " returned undefined"); - return dep; -} -/** - * @since 3.0.0 - * The plural version of {@link Service} - * @returns array of dependencies, in the same order of keys provided - */ -export function Services(...keys: [...T]) { - const container = useContainerRaw(); - return keys.map(k => container.get(k)!) as IntoDependencies; -} - - -export function useContainer() { - return (...keys: [...V]) => - keys.map(key => useContainerRaw().get(key as keyof Dependencies)) as IntoDependencies; -} - diff --git a/src/core/ioc/hooks.ts b/src/core/ioc/hooks.ts deleted file mode 100644 index 0a32557..0000000 --- a/src/core/ioc/hooks.ts +++ /dev/null @@ -1,41 +0,0 @@ -import type { CoreContainer } from "./container" - -interface HookEvent { - key : PropertyKey - newContainer: any -} -type HookName = 'init'; - -export const createInitListener = (coreContainer : CoreContainer) => { - const initCalled = new Set(); - const hasCallableMethod = createPredicate(initCalled); - const unsubscribe = coreContainer.on('containerUpserted', async event => { - - if(isNotHookable(event)) { - return; - } - - if(hasCallableMethod('init', event)) { - await event.newContainer?.init(); - initCalled.add(event.key); - } - - }); - - return { unsubscribe }; -} - -const isNotHookable = (hk: HookEvent) => { - return typeof hk.newContainer !== 'object' - || Array.isArray(hk.newContainer) - || hk.newContainer === null; -} - -const createPredicate = (called: Set) => { - return (hookName: HookName, event: T) => { - const hasMethod = Reflect.has(event.newContainer!, hookName); - const beenCalledOnce = !called.has(event.key) - - return hasMethod && beenCalledOnce - } -} diff --git a/src/core/ioc/index.ts b/src/core/ioc/index.ts deleted file mode 100644 index e89f8b6..0000000 --- a/src/core/ioc/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export { makeDependencies } from './base'; -export { Service, Services, single, transient } from './dependency-injection'; diff --git a/src/core/module-loading.ts b/src/core/module-loading.ts index 0833672..e4875c5 100644 --- a/src/core/module-loading.ts +++ b/src/core/module-loading.ts @@ -1,23 +1,26 @@ -import { type Observable, from, mergeMap, ObservableInput } from 'rxjs'; -import { readdir, stat } from 'fs/promises'; -import { basename, extname, join, resolve, parse, dirname } from 'path'; -import assert from 'assert'; -import { createRequire } from 'node:module'; -import type { ImportPayload, Wrapper } from '../types/core'; -import type { Module } from '../types/core-modules'; -import { existsSync } from 'fs'; -import type { Logging } from './contracts/logging'; +import path from 'node:path'; +import { existsSync } from 'node:fs'; +import { readdir } from 'fs/promises'; +import assert from 'node:assert'; +import * as Id from './id' +import { Module } from '../types/core-modules'; -export const shouldHandle = (path: string, fpath: string) => { - const file_name = fpath+extname(path); - let newPath = join(dirname(path), file_name) - .replace(/file:\\?/, ""); - return { exists: existsSync(newPath), - path: 'file:///'+newPath }; +export const parseCallsite = (site: string) => { + const pathobj = path.posix.parse(site.replace(/file:\\?/, "") + .split(path.sep) + .join(path.posix.sep)) + return { name: pathobj.name, + absPath : path.posix.format(pathobj) } } +export const shouldHandle = (pth: string, filenam: string) => { + const file_name = filenam+path.extname(pth); + let newPath = path.join(path.dirname(pth), file_name) + .replace(/file:\\?/, ""); + return { exists: existsSync(newPath), + path: 'file://'+newPath }; +} -export type ModuleResult = Promise>; /** * Import any module based on the absolute path. @@ -25,7 +28,6 @@ export type ModuleResult = Promise>; * commonjs, javascript : * ```js * exports = commandModule({ }) - * * //or * exports.default = commandModule({ }) * ``` @@ -35,100 +37,34 @@ export type ModuleResult = Promise>; export async function importModule(absPath: string) { let fileModule = await import(absPath); - let commandModule = fileModule.default; + let commandModule: Module = fileModule.default; - assert(commandModule , `Found no export @ ${absPath}. Forgot to ignore with "!"? (!${basename(absPath)})?`); - if ('default' in commandModule ) { - commandModule = commandModule.default; + assert(commandModule , `No default export @ ${absPath}`); + if ('default' in commandModule) { + commandModule = commandModule.default as Module; } - return { module: commandModule } as T; + const p = path.parse(absPath) + commandModule.name ??= p.name; commandModule.description ??= "..."; + commandModule.meta = { + id: Id.create(commandModule.name, commandModule.type), + absPath, + }; + return { module: commandModule as T }; } -export async function defaultModuleLoader(absPath: string): ModuleResult { - let { module } = await importModule<{ module: T }>(absPath); - assert(module, `Found an undefined module: ${absPath}`); - return { module, absPath }; -} -export const fmtFileName = (fileName: string) => parse(fileName).name; - -/** - * a directory string is converted into a stream of modules. - * starts the stream of modules that sern needs to process on init - * @returns {Observable<{ mod: Module; absPath: string; }[]>} data from command files - * @param commandDir - */ -export function buildModuleStream( - input: ObservableInput, -): Observable> { - return from(input) - .pipe(mergeMap(defaultModuleLoader)); -} - -export const getFullPathTree = (dir: string) => readPaths(resolve(dir)); - -export const filename = (path: string) => fmtFileName(basename(path)); - -const isSkippable = (filename: string) => { - //empty string is for non extension files (directories) - const validExtensions = ['.js', '.cjs', '.mts', '.mjs', '.cts', '.ts', '']; - return filename[0] === '!' || !validExtensions.includes(extname(filename)); -}; - -async function deriveFileInfo(dir: string, file: string) { - const fullPath = join(dir, file); - return { fullPath, - fileStats: await stat(fullPath), - base: basename(file) }; -} - -async function* readPaths(dir: string): AsyncGenerator { - try { - const files = await readdir(dir); - for (const file of files) { - const { fullPath, fileStats, base } = await deriveFileInfo(dir, file); - if (fileStats.isDirectory()) { - //Todo: refactor so that i dont repeat myself for files (line 71) - if (!isSkippable(base)) { - yield* readPaths(fullPath); - } - } else { - if (!isSkippable(base)) { - yield 'file:///' + fullPath; - } +export async function* readRecursive(dir: string): AsyncGenerator { + const files = await readdir(dir, { withFileTypes: true }); + for (const file of files) { + const fullPath = path.posix.join(dir, file.name); + if (file.isDirectory()) { + if (!file.name.startsWith('!')) { + yield* readRecursive(fullPath); } + } else if (!file.name.startsWith('!')) { + yield "file:///"+path.resolve(fullPath); } - } catch (err) { - throw err; } } -const requir = createRequire(import.meta.url); -export function loadConfig(wrapper: Wrapper | 'file', log: Logging | undefined): Wrapper { - if (wrapper !== 'file') { - return wrapper; - } - log?.info({ message: 'Experimental loading of sern.config.json'}); - const config = requir(resolve('sern.config.json')); - - const makePath = (dir: PropertyKey) => - config.language === 'typescript' - ? join('dist', config.paths[dir]!) - : join(config.paths[dir]!); - - log?.info({ message: 'Loading config: ' + JSON.stringify(config, null, 4) }); - const commandsPath = makePath('commands'); - - log?.info({ message: `Commands path is set to ${commandsPath}` }); - let eventsPath: string | undefined; - if (config.paths.events) { - eventsPath = makePath('events'); - log?.info({ message: `Events path is set to ${eventsPath} `}); - } - - return { defaultPrefix: config.defaultPrefix, - commands: commandsPath, - events: eventsPath }; - -} diff --git a/src/core/modules.ts b/src/core/modules.ts index 5b1e541..4de590a 100644 --- a/src/core/modules.ts +++ b/src/core/modules.ts @@ -1,57 +1,51 @@ -import { ClientEvents } from 'discord.js'; -import { EventType } from '../core/structures'; +import type { ClientEvents } from 'discord.js'; +import { EventType } from '../core/structures/enums'; import type { - AnyEventPlugin, -} from '../types/core-plugin'; -import type { - CommandModule, - EventModule, InputCommand, InputEvent, + Module, + ScheduledTask, } from '../types/core-modules'; -import { partitionPlugins } from './_internal'; +import { partitionPlugins } from './functions' import type { Awaitable } from '../types/utility'; /** * @since 1.0.0 The wrapper function to define command modules for sern * @param mod */ -export function commandModule(mod: InputCommand): CommandModule { +export function commandModule(mod: InputCommand): Module { const [onEvent, plugins] = partitionPlugins(mod.plugins); - return { - ...mod, - onEvent, - plugins, - } as CommandModule; + return { ...mod, + onEvent, + plugins, + locals: {} } as Module; } + /** * @since 1.0.0 * The wrapper function to define event modules for sern * @param mod */ -export function eventModule(mod: InputEvent): EventModule { +export function eventModule(mod: InputEvent): Module { const [onEvent, plugins] = partitionPlugins(mod.plugins); - return { - ...mod, - plugins, - onEvent, - } as EventModule; + if(onEvent.length !== 0) throw Error("Event modules cannot have ControlPlugins"); + return { ...mod, + plugins, + locals: {} } as Module; } /** Create event modules from discord.js client events, * This is an {@link eventModule} for discord events, * where typings can be very bad. - * @Experimental * @param mod */ export function discordEvent(mod: { name: T; - plugins?: AnyEventPlugin[]; + once?: boolean; execute: (...args: ClientEvents[T]) => Awaitable; }) { - return eventModule({ - type: EventType.Discord, - ...mod, - }); + return eventModule({ type: EventType.Discord, ...mod, }); } +export function scheduledTask(ism: ScheduledTask) { return ism } + diff --git a/src/core/operators.ts b/src/core/operators.ts deleted file mode 100644 index 4c5ff72..0000000 --- a/src/core/operators.ts +++ /dev/null @@ -1,83 +0,0 @@ -/** - * This file holds sern's rxjs operators used for processing data. - * Each function should be modular and testable, not bound to discord / sern - * and independent of each other. - */ -import { - concatMap, - defaultIfEmpty, - EMPTY, - every, - fromEvent, - map, - Observable, - of, - OperatorFunction, - pipe, - share, -} from 'rxjs'; -import { Emitter, ErrorHandling, Logging } from './contracts'; -import util from 'node:util'; -import type { PluginResult, VoidResult } from '../types/core-plugin'; -import type { Result } from 'ts-results-es' -/** - * if {src} is true, mapTo V, else ignore - * @param item - */ -export function filterMapTo(item: () => V): OperatorFunction { - return concatMap(shouldKeep => (shouldKeep ? of(item()) : EMPTY)); -} - -interface PluginExecutable { - execute: (...args: unknown[]) => PluginResult; -}; -/** - * Calls any plugin with {args}. - * @param args if an array, its spread and plugin called. - */ -export function callPlugin(args: unknown): OperatorFunction -{ - return concatMap(async plugin => { - if (Array.isArray(args)) { - return plugin.execute(...args); - } - return plugin.execute(args); - }); -} - -export const arrayifySource = map(src => (Array.isArray(src) ? (src as unknown[]) : [src])); - -/** - * Checks if the stream of results is all ok. - */ -export const everyPluginOk: OperatorFunction = pipe( - every(result => result.isOk()), - defaultIfEmpty(true), -); - -export const sharedEventStream = (e: Emitter, eventName: string) => { - return (fromEvent(e, eventName) as Observable).pipe(share()); -}; - -export function handleError(crashHandler: ErrorHandling, emitter: Emitter, logging?: Logging) { - return (pload: unknown, caught: Observable) => { - // This is done to fit the ErrorHandling contract - if(!emitter.emit('error', pload)) { - const err = pload instanceof Error ? pload : Error(util.inspect(pload, { colors: true })); - logging?.error({ message: util.inspect(pload) }); - crashHandler.updateAlive(err); - } - return caught; - }; -} -// Temporary until i get rxjs operators working on ts-results-es -export const filterTap = (onErr: (e: R) => void): OperatorFunction, K> => - pipe(concatMap(result => { - if(result.isOk()) { - return of(result.value) - } - onErr(result.error); - return EMPTY - })) - - diff --git a/src/core/plugin.ts b/src/core/plugin.ts new file mode 100644 index 0000000..65c49cf --- /dev/null +++ b/src/core/plugin.ts @@ -0,0 +1,45 @@ +import { CommandType, PluginType } from './structures/enums'; +import type { Plugin, PluginResult, CommandArgs, InitArgs } from '../types/core-plugin'; +import { Err, Ok } from 'ts-results-es'; + +export function makePlugin( + type: PluginType, + execute: (...args: any[]) => any, +): Plugin { + return { type, execute } as Plugin; +} +/** + * @since 2.5.0 + */ +export function EventInitPlugin(execute: (args: InitArgs) => PluginResult) { + return makePlugin(PluginType.Init, execute); +} +/** + * @since 2.5.0 + */ +export function CommandInitPlugin( + execute: (args: InitArgs) => PluginResult +) { + return makePlugin(PluginType.Init, execute); +} +/** + * @since 2.5.0 + */ +export function CommandControlPlugin( + execute: (...args: CommandArgs) => PluginResult, +) { + return makePlugin(PluginType.Control, execute); +} + + +/** + * @since 1.0.0 + * The object passed into every plugin to control a command's behavior + */ +export const controller = { + next: (val?: Record) => Ok(val), + stop: (val?: string) => Err(val), +}; + + +export type Controller = typeof controller; diff --git a/src/core/presences.ts b/src/core/presences.ts index 594c836..3dbc9d6 100644 --- a/src/core/presences.ts +++ b/src/core/presences.ts @@ -1,68 +1,66 @@ import type { ActivitiesOptions } from "discord.js"; -import type { IntoDependencies } from "../types/ioc"; -import type { Emitter } from "./contracts/emitter"; +import type { IntoDependencies } from "./ioc"; +import type { Emitter } from "./interfaces"; type Status = 'online' | 'idle' | 'invisible' | 'dnd' -type PresenceReduce = (previous: Result) => Result; +type PresenceReduce = (previous: Presence.Result) => Presence.Result; -export interface Result { - status?: Status; - afk?: boolean; - activities?: ActivitiesOptions[]; - shardId?: number[]; - repeat?: number | [Emitter, string]; - onRepeat?: (previous: Result) => Result; -} - -export type Config = -{ - inject?: [...T] - execute: (...v: IntoDependencies) => Result; -}; - -/** - * A small wrapper to provide type inference. - * Create a Presence module which **MUST** be put in a file called presence.(language-extension) - * adjacent to the file where **Sern.init** is CALLED. - */ -export function module(conf: Config) -{ return conf; } - - -/** - * Create a Presence body which can be either: - * - once, the presence is activated only once. - * - repeated, per cycle or event, the presence can be changed. - */ -export function of(root: Omit) { - return { - /** - * @example - * Presence - * .of({ - * activities: [{ name: "deez nuts" }] - * }) //starts the presence with "deez nuts". - * .repeated(prev => { - * return { - * afk: true, - * activities: prev.activities?.map(s => ({ ...s, name: s.name+"s" })) - * }; - * }, 10000)) //every 10 s, the callback sets the presence to the returned one. - */ - repeated: (onRepeat: PresenceReduce, repeat: number | [Emitter, string]) => { - return { repeat, onRepeat, ...root } - }, - /** - * @example - * Presence - * .of({ - * activities: [ - * { name: "Chilling out" } - * ] - * }) - * .once() // Sets the presence once, with what's provided in '.of()' - */ - once: () => root - }; + + +export const Presence = { + /** + * A small wrapper to provide type inference. + * Create a Presence module which **MUST** be put in a file called presence.(language-extension) + * adjacent to the file where **Sern.init** is CALLED. + */ + module : (conf: Presence.Config) => conf, + /** + * Create a Presence body which can be either: + * - once, the presence is activated only once. + * - repeated, per cycle or event, the presence can be changed. + */ + of : (root: Omit) => { + return { + /** + * @example + * Presence + * .of({ activities: [{ name: "deez nuts" }] }) //starts presence with "deez nuts". + * .repeated(prev => { + * return { + * afk: true, + * activities: prev.activities?.map(s => ({ ...s, name: s.name+"s" })) + * }; + * }, 10000)) //every 10 s, the callback sets the presence to the value returned. + */ + repeated: (onRepeat: PresenceReduce, repeat: number | [Emitter, string]) => { + return { repeat, onRepeat, ...root } + }, + /** + * @example + * ```ts + * Presence.of({ + * activities: [{ name: "Chilling out" }] + * }).once() // Sets the presence once, with what's provided in '.of()' + * ``` + */ + once: () => root + }; + } +} +export declare namespace Presence { + export type Config = { + inject?: [...T] + execute: (...v: IntoDependencies) => Presence.Result; + + } + + export interface Result { + status?: Status; + afk?: boolean; + activities?: ActivitiesOptions[]; + shardId?: number[]; + repeat?: number | [Emitter, string]; + onRepeat?: (previous: Result) => Result; + } } diff --git a/src/core/structures/context.ts b/src/core/structures/context.ts index fb37c05..69b460c 100644 --- a/src/core/structures/context.ts +++ b/src/core/structures/context.ts @@ -11,7 +11,9 @@ import type { import { CoreContext } from '../structures/core-context'; import { Result, Ok, Err } from 'ts-results-es'; import * as assert from 'assert'; -import { ReplyOptions } from '../../types/utility'; +import type { ReplyOptions } from '../../types/utility'; +import { fmt } from '../functions' +import { SernError } from './enums'; /** @@ -20,16 +22,24 @@ import { ReplyOptions } from '../../types/utility'; * Message and ChatInputCommandInteraction */ export class Context extends CoreContext { - /* - * @Experimental - */ + get options() { - return this.interaction.options; + if(this.isMessage()) { + const [, ...rest] = fmt(this.message.content, this.prefix); + return rest; + } else { + return this.interaction.options; + } } - protected constructor(protected ctx: Result) { + + + protected constructor(protected ctx: Result, + private __prefix?: string) { super(ctx); } - + public get prefix() { + return this.__prefix; + } public get id(): Snowflake { return safeUnwrap(this.ctx .map(m => m.id) @@ -37,9 +47,7 @@ export class Context extends CoreContext { } public get channel() { - return safeUnwrap(this.ctx - .map(m => m.channel) - .mapErr(i => i.channel)); + return safeUnwrap(this.ctx.map(m => m.channel).mapErr(i => i.channel)); } public get channelId(): Snowflake { @@ -88,6 +96,15 @@ export class Context extends CoreContext { .mapErr(i => i.member)); } + get message(): Message { + return this.ctx.expect(SernError.MismatchEvent); + } + + get interaction(): ChatInputCommandInteraction { + return this.ctx.expectErr(SernError.MismatchEvent); + } + + public get client(): Client { return safeUnwrap(this.ctx .map(m => m.client) @@ -105,17 +122,16 @@ export class Context extends CoreContext { this.ctx .map(m => m.reply(content as MessageReplyOptions)) .mapErr(i => - i.reply(content as InteractionReplyOptions).then(() => i.fetchReply()), - ), + i.reply(content as InteractionReplyOptions).then(() => i.fetchReply())), ); } - static override wrap(wrappable: BaseInteraction | Message): Context { + static wrap(wrappable: BaseInteraction | Message, prefix?: string): Context { if ('interaction' in wrappable) { - return new Context(Ok(wrappable)); + return new Context(Ok(wrappable), prefix); } assert.ok(wrappable.isChatInputCommand(), "Context created with bad interaction."); - return new Context(Err(wrappable)); + return new Context(Err(wrappable), prefix); } } diff --git a/src/core/structures/core-context.ts b/src/core/structures/core-context.ts index acff87b..73a92d5 100644 --- a/src/core/structures/core-context.ts +++ b/src/core/structures/core-context.ts @@ -1,5 +1,4 @@ import { Result as Either } from 'ts-results-es'; -import { SernError } from '../_internal'; import * as assert from 'node:assert'; /** @@ -9,13 +8,6 @@ export abstract class CoreContext { protected constructor(protected ctx: Either) { assert.ok(typeof ctx === 'object' && ctx != null, "Context was nonobject or null"); } - get message(): M { - return this.ctx.expect(SernError.MismatchEvent); - } - get interaction(): I { - return this.ctx.expectErr(SernError.MismatchEvent); - } - public isMessage(): this is CoreContext { return this.ctx.isOk(); } @@ -23,10 +15,4 @@ export abstract class CoreContext { public isSlash(): this is CoreContext { return !this.isMessage(); } - //todo: add agnostic options resolver for Context - abstract get options(): unknown; - - static wrap(_: unknown): unknown { - throw Error('You need to override this method; cannot wrap an abstract class'); - } } diff --git a/src/core/structures/default-services.ts b/src/core/structures/default-services.ts new file mode 100644 index 0000000..a958196 --- /dev/null +++ b/src/core/structures/default-services.ts @@ -0,0 +1,89 @@ +import { ScheduledTask } from '../../types/core-modules'; +import type { LogPayload, Logging, ErrorHandling, Disposable } from '../interfaces'; +import { CronJob } from 'cron'; + +/** + * @internal + * @since 2.0.0 + * Version 4.0.0 will internalize this api. Please refrain from using the defaults! + */ +export class DefaultErrorHandling implements ErrorHandling { + crash(err: Error): never { + throw err; + } + updateAlive(err: Error) { + throw err; + } +} + + +/** + * @internal + * @since 2.0.0 + * Version 4.0.0 will internalize this api. Please refrain from using ModuleStore! + */ +export class DefaultLogging implements Logging { + private date() { return new Date() } + debug(payload: LogPayload): void { + console.debug(`DEBUG: ${this.date().toISOString()} -> ${payload.message}`); + } + + error(payload: LogPayload): void { + console.error(`ERROR: ${this.date().toISOString()} -> ${payload.message}`); + } + + info(payload: LogPayload): void { + console.info(`INFO: ${this.date().toISOString()} -> ${payload.message}`); + } + + warning(payload: LogPayload): void { + console.warn(`WARN: ${this.date().toISOString()} -> ${payload.message}`); + } +} + + +export class TaskScheduler implements Disposable { + private __tasks: Map> = new Map(); + + schedule(uuid: string, task: ScheduledTask, deps: Dependencies) { + if (this.__tasks.has(uuid)) { + throw Error("while scheduling a task \ + found another task of same name. Not scheduling " + + uuid + "again." ); + } + try { + const onTick = async function(this: CronJob) { + task.execute({ id: uuid, + lastTimeExecution: this.lastExecution, + nextTimeExecution: this.nextDate().toJSDate() }, { deps }) + } + const job = CronJob.from({ cronTime: task.trigger, onTick, timeZone: task.timezone }); + job.start(); + this.__tasks.set(uuid, job); + } catch (error) { + throw Error(`while scheduling a task ${uuid} ` + error); + } + } + + kill(taskName: string): boolean { + const job = this.__tasks.get(taskName); + if (job) { + job.stop(); + this.__tasks.delete(taskName); + return true; + } + return false; + } + + get tasks(): string[] { + return Array.from(this.__tasks.keys()); + } + + dispose() { + this.__tasks.forEach((_, id) => { + this.kill(id); + this.__tasks.delete(id); + }) + } + +} diff --git a/src/core/structures/enums.ts b/src/core/structures/enums.ts index 663785e..83675a7 100644 --- a/src/core/structures/enums.ts +++ b/src/core/structures/enums.ts @@ -48,16 +48,16 @@ export enum EventType { /** * The EventType for handling discord events */ - Discord = 1, + Discord, /** * The EventType for handling sern events */ - Sern = 2, + Sern, /** * The EventType for handling external events. * Could be for example, `process` events, database events */ - External = 3, + External, } /** @@ -85,20 +85,12 @@ export enum PluginType { Control = 2, } /** + * @deprecated - Use strings 'success' | 'failure' | 'warning' * @enum { string } */ export enum PayloadType { - /** - * The PayloadType for a SernEmitter success event - */ Success = 'success', - /** - * The PayloadType for a SernEmitter failure event - */ Failure = 'failure', - /** - * The PayloadType for a SernEmitter warning event - */ Warning = 'warning', } diff --git a/src/core/structures/index.ts b/src/core/structures/index.ts deleted file mode 100644 index 8eeb6f9..0000000 --- a/src/core/structures/index.ts +++ /dev/null @@ -1,5 +0,0 @@ -export { CommandType, PluginType, PayloadType, EventType } from './enums'; -export * from './context'; -export * from './services'; -export * from './module-store'; - diff --git a/src/core/structures/module-store.ts b/src/core/structures/module-store.ts deleted file mode 100644 index 49b22c5..0000000 --- a/src/core/structures/module-store.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { CommandMeta, Module } from '../../types/core-modules'; - -/* - * @deprecated - * Version 4.0.0 will internalize this api. Please refrain from using ModuleStore! - * For interacting with modules, use the ModuleManager instead. - */ -export class ModuleStore { - metadata = new WeakMap(); - commands = new Map(); -} diff --git a/src/core/structures/services/error-handling.ts b/src/core/structures/services/error-handling.ts deleted file mode 100644 index 143639c..0000000 --- a/src/core/structures/services/error-handling.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { ErrorHandling } from '../../contracts'; - -/** - * @internal - * @since 2.0.0 - * Version 4.0.0 will internalize this api. Please refrain from using the defaults! - */ -export class DefaultErrorHandling implements ErrorHandling { - crash(err: Error): never { - throw err; - } - - #keepAlive = 1; - - updateAlive(err: Error) { - this.#keepAlive--; - if (this.#keepAlive === 0) { - throw err; - } - } -} diff --git a/src/core/structures/services/index.ts b/src/core/structures/services/index.ts deleted file mode 100644 index 3f1d4ab..0000000 --- a/src/core/structures/services/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -export * from './error-handling'; -export * from './logger'; -export * from './module-manager'; diff --git a/src/core/structures/services/logger.ts b/src/core/structures/services/logger.ts deleted file mode 100644 index 5de19c7..0000000 --- a/src/core/structures/services/logger.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { LogPayload, Logging } from '../../contracts'; - -/** - * @internal - * @since 2.0.0 - * Version 4.0.0 will internalize this api. Please refrain from using ModuleStore! - */ -export class DefaultLogging implements Logging { - private date = () => new Date(); - debug(payload: LogPayload): void { - console.debug(`DEBUG: ${this.date().toISOString()} -> ${payload.message}`); - } - - error(payload: LogPayload): void { - console.error(`ERROR: ${this.date().toISOString()} -> ${payload.message}`); - } - - info(payload: LogPayload): void { - console.info(`INFO: ${this.date().toISOString()} -> ${payload.message}`); - } - - warning(payload: LogPayload): void { - console.warn(`WARN: ${this.date().toISOString()} -> ${payload.message}`); - } -} diff --git a/src/core/structures/services/module-manager.ts b/src/core/structures/services/module-manager.ts deleted file mode 100644 index dad2888..0000000 --- a/src/core/structures/services/module-manager.ts +++ /dev/null @@ -1,51 +0,0 @@ -import * as Id from '../../../core/id'; -import { CoreModuleStore, ModuleManager } from '../../contracts'; -import { CommandMeta, CommandModule, CommandModuleDefs, Module } from '../../../types/core-modules'; -import { CommandType } from '../enums'; -/** - * @internal - * @since 2.0.0 - * Version 4.0.0 will internalize this api. Please refrain from using DefaultModuleManager! - */ -export class DefaultModuleManager implements ModuleManager { - constructor(private moduleStore: CoreModuleStore) {} - - - getByNameCommandType(name: string, commandType: T) { - const module = this.get(Id.create(name, commandType)); - if (!module) { - return undefined; - } - return module as CommandModuleDefs[T]; - } - - setMetadata(m: Module, c: CommandMeta): void { - this.moduleStore.metadata.set(m, c); - } - - getMetadata(m: Module): CommandMeta { - const maybeModule = this.moduleStore.metadata.get(m); - if (!maybeModule) { - throw Error('Could not find metadata in store for ' + m); - } - return maybeModule; - } - - get(id: string) { - return this.moduleStore.commands.get(id); - } - set(id: string, path: CommandModule): void { - this.moduleStore.commands.set(id, path); - } - //not tested - getPublishableCommands(): CommandModule[] { - const entries = this.moduleStore.commands.entries(); - const publishable = 0b000000110; - return Array.from(entries) - .filter(([id]) => { - const last_entry = id.at(-1); - return last_entry == 'B' || !(publishable & Number.parseInt(last_entry!)); - }) - .map(([, path]) => path as CommandModule); - } -} diff --git a/src/handlers/_internal.ts b/src/handlers/_internal.ts deleted file mode 100644 index 4813218..0000000 --- a/src/handlers/_internal.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from './dispatchers'; -export * from './event-utils'; diff --git a/src/handlers/dispatchers.ts b/src/handlers/dispatchers.ts deleted file mode 100644 index 8e4eb10..0000000 --- a/src/handlers/dispatchers.ts +++ /dev/null @@ -1,89 +0,0 @@ -import { EventEmitter } from 'node:events'; -import * as assert from 'node:assert'; -import { concatMap, from, fromEvent, map, OperatorFunction, pipe } from 'rxjs'; -import { - arrayifySource, - callPlugin, - isAutocomplete, - treeSearch, - SernError, -} from '../core/_internal'; -import { createResultResolver } from './event-utils'; -import { BaseInteraction, Message } from 'discord.js'; -import { CommandType, Context } from '../core'; -import type { Args } from '../types/utility'; -import { inspect } from 'node:util' -import type { CommandModule, Module, Processed } from '../types/core-modules'; - -//TODO: refactor dispatchers so that it implements a strategy for each different type of payload? -export function dispatchMessage(module: Processed, args: [Context, Args]) { - return { module, args }; -} - -export function contextArgs(wrappable: Message | BaseInteraction, messageArgs?: string[]) { - const ctx = Context.wrap(wrappable); - const args = ctx.isMessage() ? ['text', messageArgs!] : ['slash', ctx.options]; - return [ctx, args] as [Context, Args]; -} - - -function intoPayload(module: Processed, ) { - return pipe( - arrayifySource, - map(args => ({ module, args, })), - ); -} - -const createResult = createResultResolver< - Processed, - { module: Processed; args: unknown[] }, - unknown[] ->({ - createStream: ({ module, args }) => from(module.onEvent).pipe(callPlugin(args)), - onNext: ({ args }) => args, -}); -/** - * Creates an observable from { source } - * @param module - * @param source - */ -export function eventDispatcher(module: Processed, source: unknown) { - assert.ok(source instanceof EventEmitter, `${source} is not an EventEmitter`); - - const execute: OperatorFunction = concatMap(async args => - module.execute(...args), - ); - return fromEvent(source, module.name).pipe( - intoPayload(module), - concatMap(createResult), - execute, - ); -} - -export function createDispatcher(payload: { - module: Processed; - event: BaseInteraction; -}) { - assert.ok( - CommandType.Text !== payload.module.type, - SernError.MismatchEvent + 'Found text command in interaction stream', - ); - switch (payload.module.type) { - case CommandType.Slash: - case CommandType.Both: { - if (isAutocomplete(payload.event)) { - const option = treeSearch(payload.event, payload.module.options); - assert.ok(option, SernError.NotSupportedInteraction + ` There is no autocomplete tag for ` + inspect(payload.module)); - const { command } = option; - - return { - ...payload, - module: command as Processed, //autocomplete is not a true "module" warning cast! - args: [payload.event], - }; - } - return { module: payload.module, args: contextArgs(payload.event) }; - } - default: return { module: payload.module, args: [payload.event] }; - } -} diff --git a/src/handlers/event-utils.ts b/src/handlers/event-utils.ts index fc7a16c..fbe2565 100644 --- a/src/handlers/event-utils.ts +++ b/src/handlers/event-utils.ts @@ -1,60 +1,125 @@ -import { Interaction, Message } from 'discord.js'; +import type { Interaction, Message, BaseInteraction } from 'discord.js'; +import util from 'node:util'; import { - EMPTY, - Observable, - concatMap, - filter, - from, - of, - throwError, - tap, - catchError, - finalize, - map, + EMPTY, type Observable, concatMap, filter, + throwError, fromEvent, map, type OperatorFunction, + catchError, finalize, pipe, from, take, share, of, } from 'rxjs'; -import { - Files, - Id, - callPlugin, - everyPluginOk, - filterMapTo, - handleError, - SernError, - VoidResult, - resultPayload, -} from '../core/_internal'; -import { Emitter, ErrorHandling, Logging, ModuleManager, PayloadType } from '../core'; -import { contextArgs, createDispatcher } from './dispatchers'; -import { ObservableInput, pipe } from 'rxjs'; +import * as Id from '../core/id' +import type { Emitter, ErrorHandling, Logging } from '../core/interfaces'; +import { SernError } from '../core/structures/enums' import { Err, Ok, Result } from 'ts-results-es'; -import type { Awaitable } from '../types/utility'; -import type { ControlPlugin } from '../types/core-plugin'; -import type { AnyModule, CommandMeta, CommandModule, Module, Processed } from '../types/core-modules'; -import { disposeAll } from '../core/ioc/base'; +import type { UnpackedDependencies } from '../types/utility'; +import type { CommandModule, Module, Processed } from '../types/core-modules'; +import * as assert from 'node:assert'; +import { Context } from '../core/structures/context'; +import { CommandType } from '../core/structures/enums' +import { inspect } from 'node:util' +import { disposeAll } from '../core/ioc'; +import { resultPayload, isAutocomplete, treeSearch, fmt } from '../core/functions' +import merge from 'deepmerge' +function handleError(crashHandler: ErrorHandling, emitter: Emitter, logging?: Logging) { + return (pload: unknown, caught: Observable) => { + // This is done to fit the ErrorHandling contract + if(!emitter.emit('error', pload)) { + const err = pload instanceof Error ? pload : Error(util.inspect(pload, { colors: true })); + logging?.error({ message: util.inspect(pload) }); + crashHandler.updateAlive(err); + } + return caught; + }; +} +const arrayify= (src: T) => + Array.isArray(src) ? src : [src]; + +interface ExecutePayload { + module: Module; + args: unknown[]; + deps: Dependencies; + params?: string; + [key: string]: unknown +} + +export const filterTap = (onErr: (e: R) => void): OperatorFunction, K> => + concatMap(result => { + if(result.isOk()) { + return of(result.value) + } + onErr(result.error); + return EMPTY; + }) + +export const sharedEventStream = (e: Emitter, eventName: string) => + (fromEvent(e, eventName) as Observable).pipe(share()); + +function intoPayload(module: Module, deps: Dependencies) { + return pipe(map(arrayify), + map(args => ({ module, args, deps })), + map(p => p.args)); +} +/** + * Creates an observable from { source } + * @param module + * @param source + */ +export function eventDispatcher(deps: Dependencies, module: Module, source: unknown) { + assert.ok(source && typeof source === 'object', + `${source} cannot be constructed into an event listener`); + const execute: OperatorFunction = + concatMap(async args => { + if(args) return Reflect.apply(module.execute, null, args); + }); + + //@ts-ignore + let ev = fromEvent(source ,module.name!); + //@ts-ignore + if(module['once']) { + ev = ev.pipe(take(1)) + } + return ev.pipe(intoPayload(module, deps), + execute); +} + +interface DispatchPayload { + module: Processed; + event: BaseInteraction; + defaultPrefix?: string; + deps: Dependencies; + params?: string +}; +export function createDispatcher({ module, event, defaultPrefix, deps, params }: DispatchPayload): ExecutePayload { + assert.ok(CommandType.Text !== module.type, + SernError.MismatchEvent + 'Found text command in interaction stream'); + + if(isAutocomplete(event)) { + assert.ok(module.type === CommandType.Slash + || module.type === CommandType.Both, "Autocomplete option on non command interaction"); + const option = treeSearch(event, module.options); + assert.ok(option, SernError.NotSupportedInteraction + ` There is no autocomplete tag for ` + inspect(module)); + const { command } = option; + return { module: command as Processed, //autocomplete is not a true "module" warning cast! + args: [event], + deps }; + } + switch (module.type) { + case CommandType.Slash: + case CommandType.Both: { + return { module, args: [Context.wrap(event, defaultPrefix)], deps }; + } + default: return { module, args: [event], deps, params }; + } +} function createGenericHandler( source: Observable, makeModule: (event: Narrowed) => Promise, ) { return (pred: (i: Source) => i is Narrowed) => source.pipe( - filter(pred), - concatMap(makeModule)); + filter(pred), // only handle this stream if it passes pred + concatMap(makeModule)); // create a payload, preparing to execute } -/** - * Removes the first character(s) _[depending on prefix length]_ of the message - * @param msg - * @param prefix The prefix to remove - * @returns The message without the prefix - * @example - * message.content = '!ping'; - * console.log(fmt(message, '!')); - * // [ 'ping' ] - */ -export function fmt(msg: string, prefix: string): string[] { - return msg.slice(prefix.length).trim().split(/\s+/g); -} /** * @@ -65,193 +130,141 @@ export function fmt(msg: string, prefix: string): string[] { */ export function createInteractionHandler( source: Observable, - mg: ModuleManager, + deps: Dependencies, + defaultPrefix?: string ) { + const mg = deps['@sern/modules']; return createGenericHandler, void>>( source, async event => { const possibleIds = Id.reconstruct(event); - let fullPaths= possibleIds - .map(id => mg.get(id)) - .filter((id): id is Module => id !== undefined); - - if(fullPaths.length == 0) { + let modules = possibleIds + .map(({ id, params }) => ({ module: mg.get(id), params })) + .filter(({ module }) => module !== undefined); + if(modules.length == 0) { return Err.EMPTY; } - const [ path ] = fullPaths; - return Ok(createDispatcher({ module: path as Processed, event })); + const [{module, params}] = modules; + return Ok(createDispatcher({ + module: module as Processed, + event, defaultPrefix, deps, params + })); }); } export function createMessageHandler( source: Observable, defaultPrefix: string, - mg: ModuleManager, + deps: Dependencies, ) { + const mg = deps['@sern/modules']; return createGenericHandler(source, async event => { - const [prefix, ...rest] = fmt(event.content, defaultPrefix); - let fullPath = mg.get(`${prefix}_T`); - if(!fullPath) { - fullPath = mg.get(`${prefix}_B`); - if(!fullPath) { - return Err('Possibly undefined behavior: could not find a static id to resolve'); - } - } - return Ok({ args: contextArgs(event, rest), module: fullPath as Processed }) - }); -} -/** - * This function assigns remaining, incomplete data to each imported module. - */ -function assignDefaults() { - return map(({ module, absPath }) => { - const processed = { - name: module.name ?? Files.filename(absPath), - description: module.description ?? '...', - ...module - } - return { - module: processed, - absPath, - metadata: { - isClass: module.constructor.name === 'Function', - fullPath: absPath, - id: Id.create(processed.name, module.type), - } + const [prefix] = fmt(event.content, defaultPrefix); + let module= mg.get(`${prefix}_T`) ?? mg.get(`${prefix}_B`) as Module; + if(!module) { + return Err('Possibly undefined behavior: could not find a static id to resolve'); } + return Ok({ args: [Context.wrap(event, defaultPrefix)], module, deps }) }); } -export function buildModules( - input: ObservableInput, -) { - return Files - .buildModuleStream>(input) - .pipe(assignDefaults()); -} - -interface ExecutePayload { - module: Processed; - task: () => Awaitable; - args: unknown[] -} /** * Wraps the task in a Result as a try / catch. * if the task is ok, an event is emitted and the stream becomes empty * if the task is an error, throw an error down the stream which will be handled by catchError + * thank u kingomes * @param emitter reference to SernEmitter that will emit a successful execution of module * @param module the module that will be executed with task * @param task the deferred execution which will be called */ -export function executeModule( - emitter: Emitter, - logger: Logging|undefined, - errHandler: ErrorHandling, - { - module, - task, - args - }: ExecutePayload, -) { - return of(module).pipe( - //converting the task into a promise so rxjs can resolve the Awaitable properly - concatMap(() => Result.wrapAsync(async () => task())), - concatMap(result => { +export function executeModule(emitter: Emitter, { module, args }: ExecutePayload) { + return from(Result.wrapAsync(async () => module.execute(...args))) + .pipe(concatMap(result => { if (result.isOk()) { - emitter.emit('module.activate', resultPayload(PayloadType.Success, module)); + emitter.emit('module.activate', resultPayload('success', module)); return EMPTY; - } - return throwError(() => resultPayload(PayloadType.Failure, module, result.error)); - - }), - ); -} - - + } + return throwError(() => resultPayload('failure', module, result.error)); + })) +}; /** * A higher order function that - * - creates a stream of {@link VoidResult} { config.createStream } - * - any failures results to { config.onFailure } being called + * - calls all control plugins. + * - any failures results to { config.onStop } being called * - if all results are ok, the stream is converted to { config.onNext } - * emit config.onSuccess Observable + * config.onNext will be returned if everything is okay. * @param config - * @returns receiver function for flattening a stream of data + * @returns function which calls all plugins and returns onNext or fail */ -export function createResultResolver< - T extends { execute: (...args: any[]) => any; onEvent: ControlPlugin[] }, - Args extends { module: T; [key: string]: unknown }, - Output, ->(config: { - onStop?: (module: T) => unknown; - onNext: (args: Args) => Output; - createStream: (args: Args) => Observable; +export function createResultResolver(config: { + onStop?: (module: Module, err?: string) => unknown; + onNext: (args: ExecutePayload, map: Record) => Output; }) { - return (args: Args) => { - const task$ = config.createStream(args); - return task$.pipe( - tap(result => { - result.isErr() && config.onStop?.(args.module); - }), - everyPluginOk, - filterMapTo(() => config.onNext(args)), - ); + const { onStop, onNext } = config; + return async (payload: ExecutePayload) => { + const task = await callPlugins(payload); + if (!task) throw Error("Plugin did not return anything."); + if(task.isOk()) { + return onNext(payload, task.value) as Output; + } else { + onStop?.(payload.module, String(task.error)); + } }; +}; + +function isObject(item: unknown) { + return (item && typeof item === 'object' && !Array.isArray(item)); } -/** - * Calls a module's init plugins and checks for Err. If so, call { onStop } and - * ignore the module - */ -export function callInitPlugins>(sernEmitter: Emitter) { - return concatMap( - createResultResolver({ - createStream: args => from(args.module.plugins).pipe(callPlugin(args)), - onStop: (module: T) => { - sernEmitter.emit('module.register', resultPayload(PayloadType.Failure, module, SernError.PluginFailure)); - }, - onNext: (payload) => { - sernEmitter.emit('module.register', resultPayload(PayloadType.Success, payload.module)); - return payload as { module: T; metadata: CommandMeta }; - }, - }), - ); +//_module is frozen, preventing from mutations +export async function callInitPlugins(_module: Module, deps: Dependencies, emit?: boolean) { + let module = _module; + const emitter = deps['@sern/emitter']; + for(const plugin of module.plugins ?? []) { + const result = await plugin.execute({ module, absPath: module.meta.absPath, deps }); + if (!result) throw Error("Plugin did not return anything. " + inspect(plugin, false, Infinity, true)); + if(result.isErr()) { + if(emit) { + emitter?.emit('module.register', + resultPayload('failure', module, result.error ?? SernError.PluginFailure)); + } + throw Error(result.error ?? SernError.PluginFailure); + } + } + return module } +export async function callPlugins({ args, module, deps, params }: ExecutePayload) { + let state = {}; + for(const plugin of module.onEvent??[]) { + const result = await plugin.execute(...args, { state, deps, params, type: module.type }); + if(result.isErr()) { + return result; + } + if(isObject(result.value)) { + state = merge(state, result.value!); + } + } + return Ok(state); +} /** - * Creates an executable task ( execute the command ) if all control plugins are successful + * Creates an executable task ( execute the command ) if all control plugins are successful * @param onStop emits a failure response to the SernEmitter */ -export function makeModuleExecutor< - M extends Processed, - Args extends { - module: M; - args: unknown[]; - }, ->(onStop: (m: M) => unknown) { - const onNext = ({ args, module }: Args) => ({ - task: () => module.execute(...args), +export function intoTask(onStop: (m: Module) => unknown) { + const onNext = ({ args, module, deps, params }: ExecutePayload, state: Record) => ({ module, - args + args: [...args, { state, deps, params, type: module.type }], + deps }); - return concatMap( - createResultResolver({ - onStop, - createStream: ({ args, module }) => - from(module.onEvent) - .pipe(callPlugin(args)), - onNext, - }), - ); + return createResultResolver({ onStop, onNext }); } -export const handleCrash = (err: ErrorHandling,sernemitter: Emitter, log?: Logging) => - pipe( - catchError(handleError(err, sernemitter, log)), - finalize(() => { - log?.info({ - message: 'A stream closed or reached end of lifetime', - }); +export const handleCrash = ({ "@sern/errors": err, '@sern/emitter': sem, '@sern/logger': log } : UnpackedDependencies, metadata: string) => + pipe(catchError(handleError(err, sem, log)), + finalize(() => { + log?.info({ message: 'A stream closed: ' + metadata }); disposeAll(log); - })); + })) diff --git a/src/handlers/interaction-event.ts b/src/handlers/interaction-event.ts deleted file mode 100644 index 0652341..0000000 --- a/src/handlers/interaction-event.ts +++ /dev/null @@ -1,33 +0,0 @@ -import { Interaction } from 'discord.js'; -import { mergeMap, merge } from 'rxjs'; -import { PayloadType } from '../core'; -import { - isAutocomplete, - isCommand, - isMessageComponent, - isModal, - sharedEventStream, - SernError, - filterTap, - resultPayload, -} from '../core/_internal'; -import { createInteractionHandler, executeModule, makeModuleExecutor } from './_internal'; -import type { DependencyList } from '../types/ioc'; - -export function interactionHandler([emitter, err, log, modules, client]: DependencyList) { - const interactionStream$ = sharedEventStream(client, 'interactionCreate'); - const handle = createInteractionHandler(interactionStream$, modules); - - const interactionHandler$ = merge( - handle(isMessageComponent), - handle(isAutocomplete), - handle(isCommand), - handle(isModal), - ); - return interactionHandler$ - .pipe( - filterTap(e => emitter.emit('warning', resultPayload(PayloadType.Warning, undefined, e))), - makeModuleExecutor(module => - emitter.emit('module.activate', resultPayload(PayloadType.Failure, module, SernError.PluginFailure))), - mergeMap(payload => executeModule(emitter, log, err, payload))); -} diff --git a/src/handlers/interaction.ts b/src/handlers/interaction.ts new file mode 100644 index 0000000..6b57e41 --- /dev/null +++ b/src/handlers/interaction.ts @@ -0,0 +1,30 @@ +import type { Interaction } from 'discord.js'; +import { mergeMap, merge, concatMap, EMPTY } from 'rxjs'; +import { createInteractionHandler, executeModule, intoTask, sharedEventStream, filterTap, handleCrash } from './event-utils'; +import { SernError } from '../core/structures/enums' +import { isAutocomplete, isCommand, isMessageComponent, isModal, resultPayload } from '../core/functions' +import { UnpackedDependencies } from '../types/utility'; + +export default function interactionHandler(deps: UnpackedDependencies, defaultPrefix?: string) { + //i wish javascript had clojure destructuring + const { '@sern/client': client, + '@sern/emitter': emitter } = deps + const interactionStream$ = sharedEventStream(client, 'interactionCreate'); + const handle = createInteractionHandler(interactionStream$, deps, defaultPrefix); + + const interactionHandler$ = merge(handle(isMessageComponent), + handle(isAutocomplete), + handle(isCommand), + handle(isModal)); + return interactionHandler$ + .pipe(filterTap(e => emitter.emit('warning', resultPayload('warning', undefined, e))), + concatMap(intoTask(module => { + emitter.emit('module.activate', resultPayload('failure', module, SernError.PluginFailure)) + })), + mergeMap(payload => { + if(payload) + return executeModule(emitter, payload) + return EMPTY; + }), + handleCrash(deps, "interaction handling")); +} diff --git a/src/handlers/message-event.ts b/src/handlers/message-event.ts deleted file mode 100644 index 86b1446..0000000 --- a/src/handlers/message-event.ts +++ /dev/null @@ -1,47 +0,0 @@ -import { mergeMap, EMPTY } from 'rxjs'; -import type { Message } from 'discord.js'; -import { PayloadType } from '../core'; -import { sharedEventStream, SernError, filterTap, resultPayload } from '../core/_internal'; -import { createMessageHandler, executeModule, makeModuleExecutor } from './_internal'; -import type { DependencyList } from '../types/ioc'; - -/** - * Ignores messages from any person / bot except itself - * @param prefix - */ -function isNonBot(prefix: string) { - return (msg: Message): msg is Message => !msg.author.bot && hasPrefix(prefix, msg.content); -} - -function hasPrefix(prefix: string, content: string) { - const prefixInContent = content.slice(0, prefix.length); - return ( - prefixInContent.localeCompare(prefix, undefined, { - sensitivity: 'accent', - }) === 0 - ); -} - -export function messageHandler( - [emitter, err, log, modules, client]: DependencyList, - defaultPrefix: string | undefined, -) { - if (!defaultPrefix) { - log?.debug({ - message: 'No prefix found. message handler shutting down', - }); - return EMPTY; - } - const messageStream$ = sharedEventStream(client, 'messageCreate'); - const handle = createMessageHandler(messageStream$, defaultPrefix, modules); - - const msgCommands$ = handle(isNonBot(defaultPrefix)); - - return msgCommands$.pipe( - filterTap((e) => emitter.emit('warning', resultPayload(PayloadType.Warning, undefined, e))), - makeModuleExecutor(module => { - const result = resultPayload(PayloadType.Failure, module, SernError.PluginFailure); - emitter.emit('module.activate', result); - }), - mergeMap(payload => executeModule(emitter, log, err, payload))); -} diff --git a/src/handlers/message.ts b/src/handlers/message.ts new file mode 100644 index 0000000..4fac7d2 --- /dev/null +++ b/src/handlers/message.ts @@ -0,0 +1,50 @@ +import { EMPTY, mergeMap, concatMap } from 'rxjs'; +import type { Message } from 'discord.js'; +import { createMessageHandler, executeModule, intoTask, sharedEventStream, filterTap, handleCrash} from './event-utils'; +import { SernError } from '../core/structures/enums' +import { resultPayload } from '../core/functions' +import { UnpackedDependencies } from '../types/utility'; +import type { Emitter } from '../core/interfaces'; + +/** + * Ignores messages from any person / bot except itself + * @param prefix + */ +function isNonBot(prefix: string) { + return (msg: Message): msg is Message => !msg.author.bot && hasPrefix(prefix, msg.content); +} + +function hasPrefix(prefix: string, content: string) { + const prefixInContent = content.slice(0, prefix.length); + return prefixInContent.localeCompare(prefix, undefined, { sensitivity: 'accent' }) === 0; +} + +export default +function (deps: UnpackedDependencies, defaultPrefix?: string) { + const {"@sern/emitter": emitter, + '@sern/logger': log, + '@sern/client': client} = deps + + if (!defaultPrefix) { + log?.debug({ message: 'No prefix found. message handler shutting down' }); + return EMPTY; + } + const messageStream$ = sharedEventStream(client as unknown as Emitter, 'messageCreate'); + const handle = createMessageHandler(messageStream$, defaultPrefix, deps); + + const msgCommands$ = handle(isNonBot(defaultPrefix)); + + return msgCommands$.pipe( + filterTap(e => emitter.emit('warning', resultPayload('warning', undefined, e))), + concatMap(intoTask(module => { + const result = resultPayload('failure', module, SernError.PluginFailure); + emitter.emit('module.activate', result); + })), + mergeMap(payload => { + if(payload) + return executeModule(emitter, payload) + return EMPTY; + }), + handleCrash(deps, "message handling") + ) +} diff --git a/src/handlers/presence.ts b/src/handlers/presence.ts index 761fbb1..2282e3d 100644 --- a/src/handlers/presence.ts +++ b/src/handlers/presence.ts @@ -1,9 +1,8 @@ import { concatMap, from, interval, of, map, scan, startWith, fromEvent, take } from "rxjs" -import { Files } from "../core/_internal"; -import * as Presence from "../core/presences"; +import { Presence } from "../core/presences"; import { Services } from "../core/ioc"; import assert from "node:assert"; - +import * as Files from "../core/module-loading"; type SetPresence = (conf: Presence.Result) => Promise const parseConfig = async (conf: Promise) => { @@ -15,20 +14,16 @@ const parseConfig = async (conf: Promise) => { const src$ = typeof repeat === 'number' ? interval(repeat) : fromEvent(...repeat); - return src$ - .pipe(scan(onRepeat, s), - startWith(s)); + return src$.pipe(scan(onRepeat, s), + startWith(s)); } return of(s).pipe(take(1)); }) }; export const presenceHandler = (path: string, setPresence: SetPresence) => { - interface PresenceModule { - module: Presence.Config<(keyof Dependencies)[]> - } const presence = Files - .importModule(path) + .importModule>(path) .then(({ module }) => { //fetch services with the order preserved, passing it to the execute fn const fetchedServices = Services(...module.inject ?? []); diff --git a/src/handlers/ready-event.ts b/src/handlers/ready-event.ts deleted file mode 100644 index e1ddb8e..0000000 --- a/src/handlers/ready-event.ts +++ /dev/null @@ -1,54 +0,0 @@ -import { ObservableInput, concat, first, fromEvent, ignoreElements, pipe, tap } from 'rxjs'; -import { CommandType } from '../core/structures'; -import { SernError } from '../core/_internal'; -import { Result } from 'ts-results-es'; -import { Logging, ModuleManager } from '../core/contracts'; -import { buildModules, callInitPlugins } from './_internal'; -import * as assert from 'node:assert'; -import * as util from 'node:util'; -import type { DependencyList } from '../types/ioc'; -import type { AnyModule, CommandMeta, Processed } from '../types/core-modules'; - -export function readyHandler( - [sEmitter, , log , moduleManager, client]: DependencyList, - allPaths: ObservableInput, -) { - //Todo: add module manager on on ready - const ready$ = fromEvent(client!, 'ready').pipe(once(log)); - - return concat(ready$, buildModules(allPaths)) - .pipe(callInitPlugins(sEmitter)) - .subscribe(({ module, metadata }) => { - register(moduleManager, module, metadata) - .expect(SernError.InvalidModuleType + ' ' + util.inspect(module)); - }); -} - -const once = (log: Logging | undefined) => pipe( - tap(() => { log?.info({ message: "Waiting on discord client to be ready..." }) }), - first(), - ignoreElements()) - - -function register>( - manager: ModuleManager, - module: T, - metadata:CommandMeta -): Result { - manager.setMetadata(module, metadata)!; - - const validModuleType = module.type >= 0 && module.type <= 1 << 10; - assert.ok( - validModuleType, - //@ts-ignore - `Found ${module.name} at ${metadata.fullPath}, which does not have a valid type`, - ); - if (module.type === CommandType.Both) { - module.alias?.forEach(a => manager.set(`${a}_B`, module)); - } else { - if(module.type === CommandType.Text){ - module.alias?.forEach(a => manager.set(`${a}_T`, module)); - } - } - return Result.wrap(() => manager.set(metadata.id, module)); -} diff --git a/src/handlers/ready.ts b/src/handlers/ready.ts new file mode 100644 index 0000000..662b1bd --- /dev/null +++ b/src/handlers/ready.ts @@ -0,0 +1,32 @@ +import * as Files from '../core/module-loading' +import { once } from 'node:events'; +import { resultPayload } from '../core/functions'; +import { CommandType } from '../core/structures/enums'; +import { Module } from '../types/core-modules'; +import { UnpackedDependencies } from '../types/utility'; +import { callInitPlugins } from './event-utils'; + +export default async function(dir: string, deps : UnpackedDependencies) { + const { '@sern/client': client, + '@sern/logger': log, + '@sern/emitter': sEmitter, + '@sern/modules': commands } = deps; + log?.info({ message: "Waiting on discord client to be ready..." }) + await once(client, "ready"); + log?.info({ message: "Client signaled ready, registering modules" }); + + // https://observablehq.com/@ehouais/multiple-promises-as-an-async-generator + // possibly optimize to concurrently import modules + for await (const path of Files.readRecursive(dir)) { + let { module } = await Files.importModule(path); + const validType = module.type >= CommandType.Text && module.type <= CommandType.ChannelSelect; + if(!validType) { + throw Error(`Found ${module.name} at ${module.meta.absPath}, which has incorrect \`type\``); + } + const resultModule = await callInitPlugins(module, deps, true); + // FREEZE! no more writing!! + commands.set(resultModule.meta.id, Object.freeze(resultModule)); + sEmitter.emit('module.register', resultPayload('success', resultModule)); + } + sEmitter.emit('modulesLoaded'); +} diff --git a/src/handlers/tasks.ts b/src/handlers/tasks.ts new file mode 100644 index 0000000..a204fc5 --- /dev/null +++ b/src/handlers/tasks.ts @@ -0,0 +1,16 @@ +import * as Files from '../core/module-loading' +import { UnpackedDependencies } from "../types/utility"; +import type { ScheduledTask } from "../types/core-modules"; +import { relative } from "path"; +import { fileURLToPath } from "url"; + +export const registerTasks = async (tasksPath: string, deps: UnpackedDependencies) => { + const taskManager = deps['@sern/scheduler'] + for await (const f of Files.readRecursive(tasksPath)) { + let { module } = await Files.importModule(f); + //module.name is assigned by Files.importModule<> + // the id created for the task is unique + const uuid = module.name+"/"+relative(tasksPath,fileURLToPath(f)) + taskManager.schedule(uuid, module, deps) + } +} diff --git a/src/handlers/user-defined-events.ts b/src/handlers/user-defined-events.ts index 66e7dfb..aea565a 100644 --- a/src/handlers/user-defined-events.ts +++ b/src/handlers/user-defined-events.ts @@ -1,36 +1,33 @@ -import { ObservableInput, map, mergeAll } from 'rxjs'; -import { EventType } from '../core/structures'; -import { SernError } from '../core/_internal'; -import { buildModules, callInitPlugins, handleCrash, eventDispatcher } from './_internal'; -import { Service } from '../core/ioc'; -import type { DependencyList } from '../types/ioc'; -import type { EventModule, Processed } from '../types/core-modules'; +import { EventType, SernError } from '../core/structures/enums'; +import { callInitPlugins, eventDispatcher, handleCrash } from './event-utils' +import { EventModule, Module } from '../types/core-modules'; +import * as Files from '../core/module-loading' +import type { UnpackedDependencies } from '../types/utility'; +import { from, map, mergeAll } from 'rxjs'; -export function eventsHandler( - [emitter, err, log, moduleManager, client]: DependencyList, - allPaths: ObservableInput, -) { - //code smell - const intoDispatcher = (e: { module: Processed }) => { - switch (e.module.type) { +const intoDispatcher = (deps: UnpackedDependencies) => + (module : EventModule) => { + switch (module.type) { case EventType.Sern: - return eventDispatcher(e.module, emitter); + return eventDispatcher(deps, module, deps['@sern/emitter']); case EventType.Discord: - return eventDispatcher(e.module, client); + return eventDispatcher(deps, module, deps['@sern/client']); case EventType.External: - return eventDispatcher(e.module, Service(e.module.emitter)); - default: - throw Error(SernError.InvalidModuleType + ' while creating event handler'); + return eventDispatcher(deps, module, deps[module.emitter]); + default: throw Error(SernError.InvalidModuleType + ' while creating event handler'); } - }; - buildModules(allPaths) - .pipe( - callInitPlugins(emitter), - map(intoDispatcher), - /** - * Where all events are turned on - */ - mergeAll(), - handleCrash(err, emitter, log)) - .subscribe(); +}; + +export default async function(deps: UnpackedDependencies, eventDir: string) { + const eventModules: EventModule[] = []; + for await (const path of Files.readRecursive(eventDir)) { + let { module } = await Files.importModule(path); + await callInitPlugins(module, deps) + eventModules.push(module as EventModule); + } + from(eventModules) + .pipe(map(intoDispatcher(deps)), + mergeAll(), // all eventListeners are turned on + handleCrash(deps, "event modules")) + .subscribe(); } diff --git a/src/index.ts b/src/index.ts index 1f0af39..7de8cdc 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,6 +1,7 @@ export * as Sern from './sern'; -export * from './core'; + export type { + Module, CommandModule, EventModule, BothCommand, @@ -24,30 +25,48 @@ export type { SernOptionsData, SernSubCommandData, SernSubCommandGroupData, + SDT, + ScheduledTask } from './types/core-modules'; export type { - Controller, PluginResult, InitPlugin, ControlPlugin, Plugin, - AnyEventPlugin, - AnyCommandPlugin, + AnyPlugin, } from './types/core-plugin'; -export type { Wrapper } from './types/core'; -export type { Args, SlashOptions, Payload, SernEventsMapping } from './types/utility'; - -export type { Singleton, Transient, CoreDependencies, Initializable } from './types/ioc'; +export type { Payload, SernEventsMapping } from './types/utility'; export { commandModule, eventModule, discordEvent, + scheduledTask } from './core/modules'; -export * as Presence from './core/presences' +export * from './core/presences' +export * from './core/interfaces' +export * from './core/plugin'; +export { CommandType, PluginType, PayloadType, EventType } from './core/structures/enums'; +export { Context } from './core/structures/context'; +export { type CoreDependencies, makeDependencies, single, transient, Service, Services } from './core/ioc'; +import type { Container } from '@sern/ioc'; + +/** + * @deprecated This old signature will be incompatible with future versions of sern >= 4.0.0. See {@link makeDependencies} + * @example + * ```ts + * To switch your old code: + await makeDependencies(({ add }) => { + add('@sern/client', new Client()) + }) + * ``` + */ +export interface DependencyConfiguration { + build: (root: Container) => Container; +} diff --git a/src/sern.ts b/src/sern.ts index 229da89..4f8faf4 100644 --- a/src/sern.ts +++ b/src/sern.ts @@ -1,16 +1,24 @@ -import { handleCrash } from './handlers/_internal'; -import callsites from 'callsites'; -import { Files } from './core/_internal'; -import { merge } from 'rxjs'; -import { Services } from './core/ioc'; -import { Wrapper } from './types/core'; -import { eventsHandler } from './handlers/user-defined-events'; -import { readyHandler } from './handlers/ready-event'; -import { messageHandler } from './handlers/message-event'; -import { interactionHandler } from './handlers/interaction-event'; -import { presenceHandler } from './handlers/presence'; -import { Client } from 'discord.js'; +//side effect: global container +import { useContainerRaw } from '@sern/ioc/global'; +import callsites from 'callsites'; +import * as Files from './core/module-loading'; +import { merge } from 'rxjs'; +import eventsHandler from './handlers/user-defined-events'; +import ready from './handlers/ready'; +import messageHandler from './handlers/message'; +import interactionHandler from './handlers/interaction'; +import { presenceHandler } from './handlers/presence'; +import { UnpackedDependencies } from './types/utility'; +import type { Presence} from './core/presences'; +import { registerTasks } from './handlers/tasks'; + +interface Wrapper { + commands: string; + defaultPrefix?: string; + events?: string; + tasks?: string; +} /** * @since 1.0.0 * @param maybeWrapper Options to pass into sern. @@ -23,40 +31,41 @@ import { Client } from 'discord.js'; * }) * ``` */ -export function init(maybeWrapper: Wrapper | 'file') { - const startTime = performance.now(); - const dependencies = Services('@sern/emitter', - '@sern/errors', - '@sern/logger', - '@sern/modules', - '@sern/client'); - const logger = dependencies[2], - errorHandler = dependencies[1]; - const wrapper = Files.loadConfig(maybeWrapper, logger); - if (wrapper.events !== undefined) { - eventsHandler(dependencies, Files.getFullPathTree(wrapper.events)); +export function init(maybeWrapper: Wrapper = { commands: "./dist/commands" }) { + const startTime = performance.now(); + const deps = useContainerRaw().deps(); + + if (maybeWrapper.events !== undefined) { + eventsHandler(deps, maybeWrapper.events) + .then(() => { + deps['@sern/logger']?.info({ message: "Events registered" }); + }); + } else { + deps['@sern/logger']?.info({ message: "No events registered" }); } const initCallsite = callsites()[1].getFileName(); const presencePath = Files.shouldHandle(initCallsite!, "presence"); //Ready event: load all modules and when finished, time should be taken and logged - readyHandler(dependencies, Files.getFullPathTree(wrapper.commands)) - .add(() => { - logger?.info({ message: "Client signaled ready, registering modules" }); + ready(maybeWrapper.commands, deps) + .then(() => { const time = ((performance.now() - startTime) / 1000).toFixed(2); - dependencies[0].emit('modulesLoaded'); - logger?.info({ message: `sern: registered in ${time} s`, }); + deps['@sern/logger']?.info({ message: `sern: registered in ${time} s` }); if(presencePath.exists) { - const setPresence = async (p: any) => { - return (dependencies[4] as Client).user?.setPresence(p); + const setPresence = async (p: Presence.Result) => { + return deps['@sern/client'].user?.setPresence(p); } presenceHandler(presencePath.path, setPresence).subscribe(); } - }); + if(maybeWrapper.tasks) { + registerTasks(maybeWrapper.tasks, deps); + } + }) + .catch(err => { throw err }); - const messages$ = messageHandler(dependencies, wrapper.defaultPrefix); - const interactions$ = interactionHandler(dependencies); + const messages$ = messageHandler(deps, maybeWrapper.defaultPrefix); + const interactions$ = interactionHandler(deps, maybeWrapper.defaultPrefix); // listening to the message stream and interaction stream - merge(messages$, interactions$).pipe(handleCrash(errorHandler, dependencies[0], logger)).subscribe(); + merge(messages$, interactions$).subscribe(); } diff --git a/src/types/core-modules.ts b/src/types/core-modules.ts index d0f9834..a4dc926 100644 --- a/src/types/core-modules.ts +++ b/src/types/core-modules.ts @@ -14,17 +14,20 @@ import type { StringSelectMenuInteraction, UserContextMenuCommandInteraction, UserSelectMenuInteraction, + ChatInputCommandInteraction, } from 'discord.js'; -import { CommandType, Context, EventType } from '../../src/core'; -import { AnyCommandPlugin, AnyEventPlugin, ControlPlugin, InitPlugin } from './core-plugin'; -import { Awaitable, Args, SlashOptions, SernEventsMapping } from './utility'; +import type { CommandType, EventType } from '../core/structures/enums'; +import { Context } from '../core/structures/context' +import { ControlPlugin, InitPlugin, Plugin } from './core-plugin'; +import { Awaitable, SernEventsMapping, UnpackedDependencies } from './utility'; - -export interface CommandMeta { - fullPath: string; - id: string; - isClass: boolean; -} +//state, deps, type (very original) +export type SDT = { + state: Record; + deps: Dependencies; + type: CommandType, + params?: string +}; export type Processed = T & { name: string; description: string }; @@ -34,6 +37,11 @@ export interface Module { onEvent: ControlPlugin[]; plugins: InitPlugin[]; description?: string; + meta: { + id: string; + absPath: string; + } + locals: Record execute(...args: any[]): Awaitable; } @@ -43,6 +51,7 @@ export interface SernEventCommand; } + export interface ExternalEventCommand extends Module { name?: string; emitter: keyof Dependencies; @@ -50,54 +59,54 @@ export interface ExternalEventCommand extends Module { execute(...args: unknown[]): Awaitable; } + export interface ContextMenuUser extends Module { type: CommandType.CtxUser; - execute: (ctx: UserContextMenuCommandInteraction) => Awaitable; + execute: (ctx: UserContextMenuCommandInteraction, tbd: SDT) => Awaitable; } export interface ContextMenuMsg extends Module { type: CommandType.CtxMsg; - execute: (ctx: MessageContextMenuCommandInteraction) => Awaitable; + execute: (ctx: MessageContextMenuCommandInteraction, tbd: SDT) => Awaitable; } export interface ButtonCommand extends Module { type: CommandType.Button; - execute: (ctx: ButtonInteraction) => Awaitable; + execute: (ctx: ButtonInteraction, tbd: SDT) => Awaitable; } export interface StringSelectCommand extends Module { type: CommandType.StringSelect; - execute: (ctx: StringSelectMenuInteraction) => Awaitable; + execute: (ctx: StringSelectMenuInteraction, tbd: SDT) => Awaitable; } export interface ChannelSelectCommand extends Module { type: CommandType.ChannelSelect; - execute: (ctx: ChannelSelectMenuInteraction) => Awaitable; + execute: (ctx: ChannelSelectMenuInteraction, tbd: SDT) => Awaitable; } export interface RoleSelectCommand extends Module { type: CommandType.RoleSelect; - execute: (ctx: RoleSelectMenuInteraction) => Awaitable; + execute: (ctx: RoleSelectMenuInteraction, tbd: SDT) => Awaitable; } export interface MentionableSelectCommand extends Module { type: CommandType.MentionableSelect; - execute: (ctx: MentionableSelectMenuInteraction) => Awaitable; + execute: (ctx: MentionableSelectMenuInteraction, tbd: SDT) => Awaitable; } export interface UserSelectCommand extends Module { type: CommandType.UserSelect; - execute: (ctx: UserSelectMenuInteraction) => Awaitable; + execute: (ctx: UserSelectMenuInteraction, tbd: SDT) => Awaitable; } export interface ModalSubmitCommand extends Module { type: CommandType.Modal; - execute: (ctx: ModalSubmitInteraction) => Awaitable; + execute: (ctx: ModalSubmitInteraction, tbd: SDT) => Awaitable; } -export interface AutocompleteCommand - extends Omit { - onEvent: ControlPlugin[]; +export interface AutocompleteCommand { + onEvent?: ControlPlugin[]; execute: (ctx: AutocompleteInteraction) => Awaitable; } @@ -109,26 +118,24 @@ export interface DiscordEventCommand Awaitable; + execute: (ctx: Context & { get options(): string[] }, tbd: SDT) => Awaitable; } export interface SlashCommand extends Module { type: CommandType.Slash; description: string; options?: SernOptionsData[]; - execute: (ctx: Context, args: ['slash', SlashOptions]) => Awaitable; + execute: (ctx: Context & { get options(): ChatInputCommandInteraction['options']}, tbd: SDT) => Awaitable; } export interface BothCommand extends Module { type: CommandType.Both; - alias?: string[]; description: string; options?: SernOptionsData[]; - execute: (ctx: Context, args: Args) => Awaitable; + execute: (ctx: Context, tbd: SDT) => Awaitable; } -export type EventModule = DiscordEventCommand | SernEventCommand | ExternalEventCommand; +export type EventModule = DiscordEventCommand | SernEventCommand | ExternalEventCommand; export type CommandModule = | TextCommand | SlashCommand @@ -143,7 +150,6 @@ export type CommandModule = | RoleSelectCommand | ModalSubmitCommand; -export type AnyModule = CommandModule | EventModule; //https://stackoverflow.com/questions/64092736/alternative-to-switch-statement-for-typescript-discriminated-union // Explicit Module Definitions for mapping export interface CommandModuleDefs { @@ -178,19 +184,22 @@ export interface SernAutocompleteData } type CommandModuleNoPlugins = { - [T in CommandType]: Omit; + [T in CommandType]: Omit; }; type EventModulesNoPlugins = { - [T in EventType]: Omit; + [T in EventType]: Omit ; }; export type InputEvent = { - [T in EventType]: EventModulesNoPlugins[T] & { plugins?: AnyEventPlugin[] }; + [T in EventType]: EventModulesNoPlugins[T] & { + once?: boolean; + plugins?: InitPlugin[] + }; }[EventType]; export type InputCommand = { [T in CommandType]: CommandModuleNoPlugins[T] & { - plugins?: AnyCommandPlugin[]; + plugins?: Plugin[]; }; }[CommandType]; @@ -213,3 +222,37 @@ export interface SernSubCommandGroupData extends BaseApplicationCommandOptionsDa type: ApplicationCommandOptionType.SubcommandGroup; options?: SernSubCommandData[]; } + + +export interface ScheduledTaskContext { + + /** + * the uuid of the current task being run + */ + id: string; + /** + * the last time this task was executed. If this is the first time, it is null. + */ + lastTimeExecution: Date | null; + /** + * The next time this task will be executed. + */ + nextTimeExecution: Date | null; +} + +//name subject to change +interface TaskAttrs { + /** + * An object of dependencies configured in `makeDependencies` + */ + deps: UnpackedDependencies +} + +export interface ScheduledTask { + name?: string; + trigger: string | Date; + timezone?: string; + execute(tasks: ScheduledTaskContext, sdt: TaskAttrs): Awaitable +} + + diff --git a/src/types/core-plugin.ts b/src/types/core-plugin.ts index 8ece7c3..b63e23b 100644 --- a/src/types/core-plugin.ts +++ b/src/types/core-plugin.ts @@ -11,34 +11,18 @@ * Plugins are reminiscent of middleware in express. */ -import type { Err, Ok, Result } from 'ts-results-es'; +import type { Result } from 'ts-results-es'; import type { - BothCommand, - ButtonCommand, - ChannelSelectCommand, - CommandModule, - ContextMenuMsg, - ContextMenuUser, - DiscordEventCommand, - EventModule, - ExternalEventCommand, - MentionableSelectCommand, - ModalSubmitCommand, Module, Processed, - RoleSelectCommand, - SernEventCommand, - SlashCommand, - StringSelectCommand, - TextCommand, - UserSelectCommand, + SDT, } from './core-modules'; -import type { Args, Awaitable, Payload, SlashOptions } from './utility'; -import type { CommandType, Context, EventType, PluginType } from '../core'; +import type { Awaitable } from './utility'; +import type { CommandType, PluginType } from '../core/structures/enums' +import type { Context } from '../core/structures/context' import type { ButtonInteraction, ChannelSelectMenuInteraction, - ClientEvents, MentionableSelectMenuInteraction, MessageContextMenuCommandInteraction, ModalSubmitInteraction, @@ -48,106 +32,40 @@ import type { UserSelectMenuInteraction, } from 'discord.js'; -export type PluginResult = Awaitable; -export type VoidResult = Result; - -export interface InitArgs> { +export type PluginResult = Awaitable|undefined, string|undefined>>; +export interface InitArgs = Processed> { module: T; absPath: string; -} -export interface Controller { - next: () => Ok; - stop: () => Err; + deps: Dependencies } export interface Plugin { type: PluginType; execute: (...args: Args) => PluginResult; } -export interface InitPlugin { +export interface InitPlugin extends Plugin { type: PluginType.Init; execute: (...args: Args) => PluginResult; } -export interface ControlPlugin { +export interface ControlPlugin extends Plugin { type: PluginType.Control; - execute: (...args: Args) => PluginResult; } -export type AnyCommandPlugin = ControlPlugin | InitPlugin<[InitArgs>]>; -export type AnyEventPlugin = ControlPlugin | InitPlugin<[InitArgs>]>; +export type AnyPlugin = ControlPlugin | InitPlugin<[InitArgs>]>; -export type CommandArgs< - I extends CommandType = CommandType, - J extends PluginType = PluginType, -> = CommandArgsMatrix[I][J]; - -export type EventArgs< - I extends EventType = EventType, - J extends PluginType = PluginType, -> = EventArgsMatrix[I][J]; +export type CommandArgs = CommandArgsMatrix[I] interface CommandArgsMatrix { - [CommandType.Text]: { - [PluginType.Control]: [Context, ['text', string[]]]; - [PluginType.Init]: [InitArgs>]; - }; - [CommandType.Slash]: { - [PluginType.Control]: [Context, ['slash', /* library coupled */ SlashOptions]]; - [PluginType.Init]: [InitArgs>]; - }; - [CommandType.Both]: { - [PluginType.Control]: [Context, Args]; - [PluginType.Init]: [InitArgs>]; - }; - [CommandType.CtxMsg]: { - [PluginType.Control]: [/* library coupled */ MessageContextMenuCommandInteraction]; - [PluginType.Init]: [InitArgs>]; - }; - [CommandType.CtxUser]: { - [PluginType.Control]: [/* library coupled */ UserContextMenuCommandInteraction]; - [PluginType.Init]: [InitArgs>]; - }; - [CommandType.Button]: { - [PluginType.Control]: [/* library coupled */ ButtonInteraction]; - [PluginType.Init]: [InitArgs>]; - }; - [CommandType.StringSelect]: { - [PluginType.Control]: [/* library coupled */ StringSelectMenuInteraction]; - [PluginType.Init]: [InitArgs>]; - }; - [CommandType.RoleSelect]: { - [PluginType.Control]: [/* library coupled */ RoleSelectMenuInteraction]; - [PluginType.Init]: [InitArgs>]; - }; - [CommandType.ChannelSelect]: { - [PluginType.Control]: [/* library coupled */ ChannelSelectMenuInteraction]; - [PluginType.Init]: [InitArgs>]; - }; - [CommandType.MentionableSelect]: { - [PluginType.Control]: [/* library coupled */ MentionableSelectMenuInteraction]; - [PluginType.Init]: [InitArgs>]; - }; - [CommandType.UserSelect]: { - [PluginType.Control]: [/* library coupled */ UserSelectMenuInteraction]; - [PluginType.Init]: [InitArgs>]; - }; - [CommandType.Modal]: { - [PluginType.Control]: [/* library coupled */ ModalSubmitInteraction]; - [PluginType.Init]: [InitArgs>]; - }; -} - -interface EventArgsMatrix { - [EventType.Discord]: { - [PluginType.Control]: /* library coupled */ ClientEvents[keyof ClientEvents]; - [PluginType.Init]: [InitArgs>]; - }; - [EventType.Sern]: { - [PluginType.Control]: [Payload]; - [PluginType.Init]: [InitArgs>]; - }; - [EventType.External]: { - [PluginType.Control]: unknown[]; - [PluginType.Init]: [InitArgs>]; - }; + [CommandType.Text]: [Context, SDT]; + [CommandType.Slash]: [Context, SDT]; + [CommandType.Both]: [Context, SDT]; + [CommandType.CtxMsg]: [MessageContextMenuCommandInteraction, SDT]; + [CommandType.CtxUser]: [UserContextMenuCommandInteraction, SDT]; + [CommandType.Button]: [ButtonInteraction, SDT]; + [CommandType.StringSelect]: [StringSelectMenuInteraction, SDT]; + [CommandType.RoleSelect]: [RoleSelectMenuInteraction, SDT]; + [CommandType.ChannelSelect]: [ChannelSelectMenuInteraction, SDT]; + [CommandType.MentionableSelect]: [MentionableSelectMenuInteraction, SDT]; + [CommandType.UserSelect]: [UserSelectMenuInteraction, SDT]; + [CommandType.Modal]: [ModalSubmitInteraction, SDT]; } diff --git a/src/types/core.ts b/src/types/core.ts deleted file mode 100644 index 0985d60..0000000 --- a/src/types/core.ts +++ /dev/null @@ -1,23 +0,0 @@ - -export interface ImportPayload { - module: T; - absPath: string; - [key: string]: unknown; -} - -export interface Wrapper { - commands: string; - defaultPrefix?: string; - events?: string; - /** - * Overload to enable mode in case developer does not use a .env file. - * @deprecated - https://github.com/sern-handler/handler/pull/325 - */ - mode?: string - /* - * @deprecated - */ - containerConfig?: { - get: (...keys: (keyof Dependencies)[]) => unknown[]; - }; -} diff --git a/src/types/dependencies.d.ts b/src/types/dependencies.d.ts index 2290f37..55db727 100644 --- a/src/types/dependencies.d.ts +++ b/src/types/dependencies.d.ts @@ -4,9 +4,24 @@ /* eslint-disable @typescript-eslint/consistent-type-imports */ -import { CoreDependencies } from './ioc'; +import { CoreDependencies } from '../core/ioc'; declare global { + /** + * discord.js client. + * '@sern/client': Client + * sern emitter listens to events that happen throughout + * the handler. some include module.register, module.activate. + * '@sern/emitter': Contracts.Emitter; + * An error handler which is the final step before + * the sern process actually crashes. + '@sern/errors': Contracts.ErrorHandling; + * Optional logger. Performs ... logging + * '@sern/logger'?: Contracts.Logging; + * Readonly module store. sern stores these + * by module.meta.id -> Module + * '@sern/modules': Map; + */ interface Dependencies extends CoreDependencies {} - } + diff --git a/src/types/ioc.ts b/src/types/ioc.ts deleted file mode 100644 index be5278a..0000000 --- a/src/types/ioc.ts +++ /dev/null @@ -1,57 +0,0 @@ -import { Container, UnpackFunction } from 'iti'; -import * as Contracts from '../core/contracts'; -/** - * Type to annotate that something is a singleton. - * T is created once and lazily. - */ -export type Singleton = () => T; -/** - * Type to annotate that something is transient. - * Every time this is called, a new object is created - */ -export type Transient = () => () => T; -/** - * Type to annotate that something is initializable. - * If T has an init method, this will be called. - */ -export type Initializable = T - -export type DependencyList = [ - Contracts.Emitter, - Contracts.ErrorHandling, - Contracts.Logging | undefined, - Contracts.ModuleManager, - Contracts.Emitter, -]; - -export interface CoreDependencies { - '@sern/client': () => Contracts.Emitter; - '@sern/emitter': () => Contracts.Emitter; - /** - * @deprecated - * Will be removed and turned internal - */ - '@sern/store': () => Contracts.CoreModuleStore; - '@sern/modules': () => Contracts.ModuleManager; - '@sern/errors': () => Contracts.ErrorHandling; - '@sern/logger'?: () => Contracts.Logging; -} - -export type DependencyFromKey = Dependencies[T]; - -export type IntoDependencies = { - [Index in keyof Tuple]: UnpackFunction>>; //Unpack and make NonNullable -} & { length: Tuple['length'] }; - -/** - * @deprecated This old signature will be incompatible with future versions of sern. - */ -export interface DependencyConfiguration { - /* - * @deprecated. Loggers will be opt-in the future - */ - exclude?: Set<'@sern/logger'>; - build: ( - root: Container, {}>, - ) => Container; -} diff --git a/src/types/utility.ts b/src/types/utility.ts index 90339e4..dcbe3b2 100644 --- a/src/types/utility.ts +++ b/src/types/utility.ts @@ -1,32 +1,27 @@ -import type { CommandInteractionOptionResolver, InteractionReplyOptions, MessageReplyOptions } from 'discord.js'; -import type { PayloadType } from '../core'; -import type { AnyModule } from './core-modules'; +import type { InteractionReplyOptions, MessageReplyOptions } from 'discord.js'; +import type { Module } from './core-modules'; +import type { Result } from 'ts-results-es'; export type Awaitable = PromiseLike | T; -export type AnyFunction = (...args: unknown[]) => unknown; - -// Thanks to @kelsny -type ParseType = { - [K in keyof T]: T[K] extends unknown ? [k: K, args: T[K]] : never; -}[keyof T]; - -export type SlashOptions = Omit; - -export type Args = ParseType<{ text: string[]; slash: SlashOptions }>; +export type VoidResult = Result; +export type AnyFunction = (...args: any[]) => unknown; export interface SernEventsMapping { 'module.register': [Payload]; 'module.activate': [Payload]; - error: [{ type: PayloadType.Failure; module?: AnyModule; reason: string | Error }]; + error: [{ type: 'failure'; module?: Module; reason: string | Error }]; warning: [Payload]; modulesLoaded: [never?]; } export type Payload = - | { type: PayloadType.Success; module: AnyModule } - | { type: PayloadType.Failure; module?: AnyModule; reason: string | Error } - | { type: PayloadType.Warning; module: undefined; reason: string }; - + | { type: 'success'; module: Module } + | { type: 'failure'; module?: Module; reason: string | Error } + | { type: 'warning'; module: undefined; reason: string }; +export type UnpackFunction = T extends (...args: any) => infer U ? U : T +export type UnpackedDependencies = { + [K in keyof Dependencies]: UnpackFunction +} export type ReplyOptions = string | Omit | MessageReplyOptions; diff --git a/test/core/contracts.test.ts b/test/core/contracts.test.ts index 6d84284..1ecb461 100644 --- a/test/core/contracts.test.ts +++ b/test/core/contracts.test.ts @@ -1,16 +1,11 @@ import { assertType, describe, it } from 'vitest'; -import { ModuleStore } from '../../src'; -import * as DefaultContracts from '../../src/core/structures/services'; -import * as Contracts from '../../src/core/contracts/index.js'; +import * as __Services from '../../src/core/structures/default-services'; +import * as Contracts from '../../src/core/interfaces'; describe('default contracts', () => { it('should satisfy contracts', () => { - assertType(new DefaultContracts.DefaultLogging()); - assertType(new DefaultContracts.DefaultErrorHandling()); - assertType( - new DefaultContracts.DefaultModuleManager(new ModuleStore()), - ); - assertType(new ModuleStore()); + assertType(new __Services.DefaultLogging()); + assertType(new __Services.DefaultErrorHandling()); }); }); diff --git a/test/core/create-plugin.test.ts b/test/core/create-plugin.test.ts index 37199e8..3aaa806 100644 --- a/test/core/create-plugin.test.ts +++ b/test/core/create-plugin.test.ts @@ -2,17 +2,12 @@ import { describe, it, expect } from 'vitest'; import { CommandControlPlugin, CommandInitPlugin, - EventControlPlugin, EventInitPlugin, -} from '../../src/core/create-plugins'; +} from '../../src'; import { PluginType, controller } from '../../src'; describe('create-plugins', () => { it('should make proper control plugins', () => { - const pl = EventControlPlugin(() => controller.next()); - expect(pl).to.have.all.keys(['type', 'execute']); - expect(pl.type).toBe(PluginType.Control); - expect(pl.execute).an('function'); const pl2 = CommandControlPlugin(() => controller.next()); expect(pl2).to.have.all.keys(['type', 'execute']); expect(pl2.type).toBe(PluginType.Control); diff --git a/test/core/functions.test.ts b/test/core/functions.test.ts index 512d34a..8a54ec7 100644 --- a/test/core/functions.test.ts +++ b/test/core/functions.test.ts @@ -1,11 +1,13 @@ +//@ts-nocheck + import { afterEach, describe, expect, it, vi } from 'vitest'; import { PluginType, SernOptionsData, controller } from '../../src/index'; import { partitionPlugins, treeSearch } from '../../src/core/functions'; import { faker } from '@faker-js/faker'; import { ApplicationCommandOptionType, AutocompleteInteraction } from 'discord.js'; -vi.mock('discord.js', () => { - const Collection = Map; +vi.mock('discord.js', async (importOriginal) => { + const mod = await importOriginal() const ModalSubmitInteraction = class { customId; type = 5; @@ -36,35 +38,11 @@ vi.mock('discord.js', () => { }; return { - Collection, - ComponentType: { - Button: 2, - }, - InteractionType: { - Ping: 1, - ApplicationCommand: 2, - MessageComponent: 3, - ApplicationCommandAutocomplete: 4, - ModalSubmit: 5, - }, - ApplicationCommandOptionType: { - Subcommand: 1, - SubcommandGroup: 2, - String: 3, - Integer: 4, - Boolean: 5, - User: 6, - Channel: 7, - Role: 8, - Mentionable: 9, - Number: 10, - Attachment: 11, - }, - ApplicationCommandType: { - ChatInput: 1, - User: 2, - Message: 3, - }, + Collection: mod.Collection, + ComponentType: mod.ComponentType, + InteractionType: mod.InteractionType, + ApplicationCommandOptionType: mod.ApplicationCommandOptionType, + ApplicationCommandType: mod.ApplicationCommandType, ModalSubmitInteraction, ButtonInteraction, AutocompleteInteraction, diff --git a/test/core/id.test.ts b/test/core/id.test.ts index 9d130a0..25925c4 100644 --- a/test/core/id.test.ts +++ b/test/core/id.test.ts @@ -1,58 +1,91 @@ -import { CommandType } from '../../src/core'; -import * as Id from '../../src/core/id' -import { expect, test } from 'vitest' +//@ts-nocheck +import { expect, test, vi } from 'vitest' +import { CommandType } from '../../src/core/structures/enums'; +import * as Id from '../../src/core/id' +import { ButtonInteraction, ModalSubmitInteraction } from 'discord.js'; +vi.mock('discord.js', async (importOriginal) => { + const mod = await importOriginal() + const ModalSubmitInteraction = class { + customId; + type = 5; + isModalSubmit = vi.fn(); + constructor(customId) { + this.customId = customId; + } + }; + const ButtonInteraction = class { + customId; + type = 3; + componentType = 2; + isButton = vi.fn(); + constructor(customId) { + this.customId = customId; + } + }; + const AutocompleteInteraction = class { + type = 4; + option: string; + constructor(s: string) { + this.option = s; + } + options = { + getFocused: vi.fn(), + getSubcommand: vi.fn(), + }; + }; + + return { + Collection: mod.Collection, + ComponentType: mod.ComponentType, + InteractionType: mod.InteractionType, + ApplicationCommandOptionType: mod.ApplicationCommandOptionType, + ApplicationCommandType: mod.ApplicationCommandType, + ModalSubmitInteraction, + ButtonInteraction, + AutocompleteInteraction, + }; +}); test('id -> Text', () => { - const bothCmdId = Id.create("ping", CommandType.Text) - expect(bothCmdId).toBe("ping_T") + expect(Id.create("ping", CommandType.Text)).toBe("ping_T") }) test('id -> Both', () => { - const bothCmdId = Id.create("ping", CommandType.Both) - expect(bothCmdId).toBe("ping_B") + expect(Id.create("ping", CommandType.Both)).toBe("ping_B") }) test('id -> CtxMsg', () => { - const bothCmdId = Id.create("ping", CommandType.CtxMsg) - expect(bothCmdId).toBe("ping_A3") + expect(Id.create("ping", CommandType.CtxMsg)).toBe("ping_A3") }) test('id -> CtxUsr', () => { - const bothCmdId = Id.create("ping", CommandType.CtxUser) - expect(bothCmdId).toBe("ping_A2") + expect(Id.create("ping", CommandType.CtxUser)).toBe("ping_A2") }) test('id -> Modal', () => { - const modal = Id.create("my-modal", CommandType.Modal) - expect(modal).toBe("my-modal_M"); + expect(Id.create("my-modal", CommandType.Modal)).toBe("my-modal_M"); }) test('id -> Button', () => { - const modal = Id.create("my-button", CommandType.Button) - expect(modal).toBe("my-button_C2"); + expect(Id.create("my-button", CommandType.Button)).toBe("my-button_C2"); }) test('id -> Slash', () => { - const modal = Id.create("myslash", CommandType.Slash) - expect(modal).toBe("myslash_A1"); + expect(Id.create("myslash", CommandType.Slash)).toBe("myslash_A1"); }) test('id -> StringSelect', () => { - const modal = Id.create("mystringselect", CommandType.StringSelect) - expect(modal).toBe("mystringselect_C3"); + expect(Id.create("mystringselect", CommandType.StringSelect)).toBe("mystringselect_C3"); }) test('id -> UserSelect', () => { - const modal = Id.create("myuserselect", CommandType.UserSelect) - expect(modal).toBe("myuserselect_C5"); + expect(Id.create("myuserselect", CommandType.UserSelect)).toBe("myuserselect_C5"); }) test('id -> RoleSelect', () => { - const modal = Id.create("myroleselect", CommandType.RoleSelect) - expect(modal).toBe("myroleselect_C6"); + expect(Id.create("myroleselect", CommandType.RoleSelect)).toBe("myroleselect_C6"); }) test('id -> MentionSelect', () => { - const modal = Id.create("mymentionselect", CommandType.MentionableSelect) - expect(modal).toBe("mymentionselect_C7"); + expect(Id.create("mymentionselect", CommandType.MentionableSelect)).toBe("mymentionselect_C7"); }) test('id -> ChannelSelect', () => { @@ -60,5 +93,43 @@ test('id -> ChannelSelect', () => { expect(modal).toBe("mychannelselect_C8"); }) +test('id reconstruct button', () => { + const idload = Id.reconstruct(new ButtonInteraction("btn")) + expect(idload[0].id).toBe("btn_C2") +}) + +test('id reconstruct button with params', () => { + const idload = Id.reconstruct(new ButtonInteraction("btn/asdf")) + expect(idload[0].id).toBe("btn_C2") + expect(idload[0].params).toBe("asdf") +}) +test('id reconstruct modal with params', () => { + const idload = Id.reconstruct(new ModalSubmitInteraction("btn/asdf")) + expect(idload[0].id).toBe("btn_M") + expect(idload[0].params).toBe("asdf") +}) +test('id reconstruct modal', () => { + const idload = Id.reconstruct(new ModalSubmitInteraction("btn")) + expect(idload[0].id).toBe("btn_M") + expect(idload[0].params).toBe(undefined) +}) +test('id reconstruct button with empty params', () => { + const idload = Id.reconstruct(new ButtonInteraction("btn/")) + expect(idload[0].id).toBe("btn_C2") + expect(idload[0].params).toBe("") +}) +test('id reconstruct with multiple slashes', () => { + const idload = Id.reconstruct(new ButtonInteraction("btn//")) + expect(idload[0].id).toBe("btn_C2") + expect(idload[0].params).toBe("/") +}) + + +test('id reconstruct button', () => { + const idload = Id.reconstruct(new ButtonInteraction("btn")) + expect(idload[0].id).toBe("btn_C2") + expect(idload[0].params).toBe(undefined) +}) + diff --git a/test/core/ioc.test.ts b/test/core/ioc.test.ts deleted file mode 100644 index e790307..0000000 --- a/test/core/ioc.test.ts +++ /dev/null @@ -1,113 +0,0 @@ -import { beforeEach, describe, expect, it, vi } from 'vitest'; -import { CoreContainer } from '../../src/core/ioc/container'; -import { EventEmitter } from 'events'; -import { DefaultLogging, Disposable, Emitter, Init, Logging } from '../../src/core'; -import { CoreDependencies } from '../../src/types/ioc'; - -describe('ioc container', () => { - let container: CoreContainer<{}> = new CoreContainer(); - let dependency: Logging & Init & Disposable; - let dependency2: Emitter - beforeEach(() => { - dependency = { - init: vi.fn(), - error(): void {}, - warning(): void {}, - info(): void {}, - debug(): void {}, - dispose: vi.fn() - }; - dependency2 = { - addListener: vi.fn(), - removeListener: vi.fn(), - emit: vi.fn() - }; - container = new CoreContainer(); - }); - const wait = (seconds: number) => new Promise((resolve) => setTimeout(resolve, seconds)); - class DB implements Init, Disposable { - public connected = false - constructor() {} - async init() { - this.connected = true - await wait(10) - } - async dispose() { - await wait(20) - this.connected = false - } - } - it('should be ready after calling container.ready()', () => { - container.ready(); - expect(container.isReady()).toBe(true); - }); - it('should container all core dependencies', async () => { - const keys = [ - '@sern/modules', - '@sern/emitter', - '@sern/logger', - '@sern/errors', - ] satisfies (keyof CoreDependencies)[]; - container.add({ - '@sern/logger': () => new DefaultLogging(), - '@sern/client': () => new EventEmitter(), - }); - for (const k of keys) { - //@ts-expect-error typings for iti are strict - expect(() => container.get(k)).not.toThrow(); - } - }); - it('should init modules', () => { - container.upsert({ '@sern/logger': dependency }); - container.ready(); - expect(dependency.init).to.toHaveBeenCalledOnce(); - }); - it('should dispose modules', async () => { - - container.upsert({ '@sern/logger': dependency }) - - container.ready(); - // We need to access the dependency at least once to be able to dispose of it. - container.get('@sern/logger' as never); - await container.disposeAll(); - expect(dependency.dispose).toHaveBeenCalledOnce(); - }); - - it('should init and dispose', async () => { - container.add({ db: new DB() }) - container.ready() - const db = container.get('db' as never) as DB - expect(db.connected).toBeTruthy() - - await container.disposeAll(); - - expect(db.connected).toBeFalsy() - }) - - it('should not lazy module', () => { - container.upsert({ '@sern/logger': () => dependency }); - container.ready(); - expect(dependency.init).toHaveBeenCalledTimes(0); - }); - - it('should init dependency depending on something else', () => { - container.add({ '@sern/client': dependency2 }); - container.upsert((cntr) => ({ - '@sern/logger': dependency - })); - container.ready(); - expect(dependency.init).toHaveBeenCalledTimes(1); - }) - - it('should detect a key already exists', () => { - container.add({ '@sern/client': dependency2 }); - expect(container.hasKey('@sern/client')).toBeTruthy() - }) - - - it('should detect a key already exists', () => { - container.add({ '@sern/client': () => dependency2 }); - expect(container.hasKey('@sern/client')).toBeTruthy() - }) - -}); diff --git a/test/core/module-loading.test.ts b/test/core/module-loading.test.ts index dc4e9a8..2ec5633 100644 --- a/test/core/module-loading.test.ts +++ b/test/core/module-loading.test.ts @@ -1,22 +1,64 @@ import { describe, it, expect } from 'vitest' -import { faker } from '@faker-js/faker' +import path from 'node:path' import * as Files from '../../src/core/module-loading' +import { Module } from '../../src/types/core-modules' +import { AssertionError } from 'node:assert' +//TODO: mock fs? describe('module-loading', () => { - it('should properly extract filename from file, nested once', () => { - const extension = faker.system.fileExt() - const name = faker.system.fileName({ extensionCount: 0 }) - const filename = Files.fmtFileName(name+'.'+extension); - expect(filename).toBe(name) + it('should get the filename of the commandmodule (linux, esm)', () => { + const fname = "///home/pooba/Projects/sern/halibu/dist/commands/ping.js" + const callsiteinfo = Files.parseCallsite(fname) + expect(callsiteinfo.name).toBe("ping") }) - -// todo: handle commands with multiple extensions -// it('should properly extract filename from file, nested multiple', () => { -// const extension = faker.system.fileExt() -// const extension2 = faker.system.fileExt() -// const name = faker.system.fileName({ extensionCount: 0 }) -// const filename = Files.fmtFileName(name+'.'+extension+'.'+extension2); -// console.log(filename, name) -// expect(filename).toBe(name) -// -// }) + it('should get filename of commandmodule (linux, cjs)', () => { + const fname = "file:///home/pooba/Projects/sern/halibu/dist/commands/ping.js" + const callsiteinfo = Files.parseCallsite(fname) + expect(callsiteinfo.name).toBe("ping") + + }) + it('should get the filename of the commandmodule (windows, cjs)', () => { + //this test case is impossible on linux. + if(process.platform == 'win32') { + const fname = "C:\\pooba\\Projects\\sern\\halibu\\dist\\commands\\ping.js" + const callsiteinfo = Files.parseCallsite(fname) + expect(callsiteinfo.name).toEqual("ping"); + } + }) + it('should get filename of commandmodule (windows, esm)', () => { + //this test case is impossible on linux. + if(process.platform == 'win32') { + const fname = "file:///C:\\pooba\\Projects\\sern\\halibu\\dist\\commands\\ping.js" + const callsiteinfo = Files.parseCallsite(fname) + expect(callsiteinfo.name).toEqual("ping"); + } + + }) + + it('should import a commandModule properly', async () => { + const { module } = await Files.importModule(path.resolve("test", 'mockules', "module.ts")); + expect(module.name).toBe('module') + }) + it('should throw when failed commandModule import', async () => { + try { + await Files.importModule(path.resolve('test', 'mockules', 'failed.ts')) + } catch(e) { + expect(e instanceof AssertionError) + } + }) + it('should throw when failed commandModule import', async () => { + try { + await Files.importModule(path.resolve('test', 'mockules', 'failed.ts')) + } catch(e) { + expect(e instanceof AssertionError) + } + }) + + it('reads all modules in mockules', async () => { + const ps = [] as string[] + for await (const fpath of Files.readRecursive(path.resolve('test', 'mockules'))) { + ps.push(fpath) + } + expect(ps.length === 4) + }) + }) diff --git a/test/core/presence.test.ts b/test/core/presence.test.ts index 904b863..f9a590b 100644 --- a/test/core/presence.test.ts +++ b/test/core/presence.test.ts @@ -5,7 +5,7 @@ import { Presence } from '../../src'; // Example test suite for the module function describe('module function', () => { it('should return a valid configuration', () => { - const config: Presence.Config<['dependency1', 'dependency2']> = Presence.module({ + const config = Presence.module({ inject: ['dependency1', 'dependency2'], execute: vi.fn(), }); diff --git a/test/core/services.test.ts b/test/core/services.test.ts deleted file mode 100644 index 479adef..0000000 --- a/test/core/services.test.ts +++ /dev/null @@ -1,80 +0,0 @@ -import { SpyInstance, afterAll, beforeEach, describe, expect, it, vi } from 'vitest'; -import { CoreContainer } from '../../src/core/ioc/container'; -import { DefaultLogging } from '../../src/core'; -import { faker } from '@faker-js/faker'; -import { commandModule } from '../../src'; -import * as Id from '../../src/core/id'; -import { CommandMeta } from '../../src/types/core-modules'; - -describe('services', () => { - //@ts-ignore - let container: CoreContainer; - let consoleMock: SpyInstance; - beforeEach(() => { - container = new CoreContainer(); - container.add({ '@sern/logger': () => new DefaultLogging() }); - container.ready(); - consoleMock = vi.spyOn(container.get('@sern/logger'), 'error').mockImplementation(() => {}); - }); - - afterAll(() => { - consoleMock.mockReset(); - }); - it('module-store.ts', async () => { - function createRandomCommandModules() { - return commandModule({ - type: faker.number.int({ min: 1 << 0, max: 1 << 10 }), - description: faker.string.alpha(), - name: faker.string.alpha(), - execute: () => {}, - }); - } - - const modules = faker.helpers.multiple(createRandomCommandModules, { - count: 40, - }); - - const paths = faker.helpers - .multiple(faker.system.directoryPath, { count: 40 }) - .map((path, i) => `${path}/${modules[i]}.js`); - - const metadata: CommandMeta[] = modules.map((cm, i) => ({ - id: Id.create(cm.name!, cm.type), - isClass: false, - fullPath: `${paths[i]}/${cm.name}.js`, - })); - const moduleManager = container.get('@sern/modules'); - let i = 0; - for (const m of modules) { - moduleManager.set(Id.create(m.name!, m.type), paths[i]); - moduleManager.setMetadata(m, metadata[i]); - i++; - } - for (const m of modules) { - expect(moduleManager.getMetadata(m), 'module references do not exist').toBeDefined(); - } - }); - - //todo add more - it('error-handling', () => { - const errorHandler = container.get('@sern/errors'); - const lifetime = errorHandler.keepAlive; - for (let i = 0; i < lifetime; i++) { - if (i == lifetime - 1) { - expect(() => errorHandler.updateAlive(new Error('poo'))).toThrowError(); - } else { - expect(() => errorHandler.updateAlive(new Error('poo'))).not.toThrowError(); - } - } - }); - //todo add more, spy on every instance? - it('logger', () => { - container.get('@sern/logger').error({ message: 'error' }); - - expect(consoleMock).toHaveBeenCalledOnce(); - expect(consoleMock).toHaveBeenLastCalledWith({ message: 'error' }); - }); - - - -}); diff --git a/test/handlers.test.ts b/test/handlers.test.ts new file mode 100644 index 0000000..e066ec9 --- /dev/null +++ b/test/handlers.test.ts @@ -0,0 +1,151 @@ +//@ts-nocheck +import { beforeEach, describe, expect, vi, it, test } from 'vitest'; +import { callInitPlugins, eventDispatcher } from '../src/handlers/event-utils'; + +import { Client, ChatInputCommandInteraction } from 'discord.js' +import { faker } from '@faker-js/faker'; +import { Module } from '../src/types/core-modules'; +import { Processed } from '../src/types/core-modules'; +import { EventEmitter } from 'events'; +import { EventType } from '../src/core/structures/enums'; +import { CommandControlPlugin, CommandInitPlugin, CommandType, controller } from '../src'; + +vi.mock('discord.js', async (importOriginal) => { + const mod = await importOriginal() + const ModalSubmitInteraction = class { + customId; + type = 5; + isModalSubmit = vi.fn(); + constructor(customId) { + this.customId = customId; + } + }; + const ButtonInteraction = class { + customId; + type = 3; + componentType = 2; + isButton = vi.fn(); + constructor(customId) { + this.customId = customId; + } + }; + const AutocompleteInteraction = class { + type = 4; + option: string; + constructor(s: string) { + this.option = s; + } + options = { + getFocused: vi.fn(), + getSubcommand: vi.fn(), + }; + }; + + return { + Client : vi.fn(), + Collection: mod.Collection, + ComponentType: mod.ComponentType, + InteractionType: mod.InteractionType, + ApplicationCommandOptionType: mod.ApplicationCommandOptionType, + ApplicationCommandType: mod.ApplicationCommandType, + ModalSubmitInteraction, + ButtonInteraction, + AutocompleteInteraction, + ChatInputCommandInteraction: vi.fn() + }; +}); + +function createRandomPlugin (s: 'go', mut?: Partial) { + return CommandInitPlugin(({ module }) => { + if(mut) { + Object.entries(mut).forEach(([k, v]) => { + module[k] = v + }) + } + return s == 'go' + ? controller.next() + : controller.stop() + }) +} +function createRandomModule(plugins: any[]): Processed { + return { + type: EventType.Discord, + meta: { id:"", absPath: "" }, + description: faker.string.alpha(), + plugins, + name: "cheese", + onEvent: [], + execute: vi.fn(), + }; +} + +function mockDeps() { + return { + '@sern/client': new Client(), + '@sern/emitter': new EventEmitter() + } +} + +describe('eventDispatcher standard', () => { + let m: Processed; + let ee: EventEmitter; + beforeEach(() => { + ee = new EventEmitter(); + m = createRandomModule(); + }); + + it('should throw', () => { + expect(() => eventDispatcher(mockDeps(), m, 'not event emitter')).toThrowError(); + }); + + it("Shouldn't throw", () => { + expect(() => eventDispatcher(mockDeps(), m, ee)).not.toThrowError(); + }); +}); + +test ('call init plugins', async () => { + const deps = mockDeps() + const plugins = createRandomPlugin('go', { name: "abc" }) + const mod = createRandomModule([plugins]) + const s = await callInitPlugins(mod, deps, false) + expect("abc").equal(s.name) +}) + +test('init plugins replace array', async () => { + const deps = mockDeps() + const plugins = createRandomPlugin('go', { opts: [] }) + const plugins2 = createRandomPlugin('go', { opts: ['a'] }) + const mod = createRandomModule([plugins, plugins2]) + const s = await callInitPlugins(mod, deps, false) + expect(['a']).deep.equal(s.opts) +}) + +test('call control plugin ', async () => { + const plugin = CommandControlPlugin((ctx,sdt) => { + return controller.next(); + }); + const res = await plugin.execute(new ChatInputCommandInteraction(), {}) + expect(res.isOk()).toBe(true) +}) + +test('form sdt', async () => { + + const expectedObject = { + "plugin/abc": faker.person.jobArea(), + "plugin2/abc": faker.git.branch(), + "plugin3/cheese": faker.person.jobArea() + } + + const plugin = CommandControlPlugin((ctx,sdt) => { + return controller.next({ "plugin/abc": expectedObject['plugin/abc'] }); + }); + const plugin2 = CommandControlPlugin((ctx,sdt) => { + return controller.next({ "plugin2/abc": expectedObject['plugin2/abc'] }); + }); + const plugin3 = CommandControlPlugin((ctx,sdt) => { + return controller.next({ "plugin3/cheese": expectedObject['plugin3/cheese'] }); + }); + +}) + + diff --git a/test/handlers/dispatchers.test.ts b/test/handlers/dispatchers.test.ts deleted file mode 100644 index 0f100d2..0000000 --- a/test/handlers/dispatchers.test.ts +++ /dev/null @@ -1,45 +0,0 @@ -import { beforeEach, describe, expect, vi, it } from 'vitest'; -import { createResultResolver, eventDispatcher } from '../../src/handlers/_internal'; -import { faker } from '@faker-js/faker'; -import { Module } from '../../src/core/types/modules'; -import { Processed } from '../../src/handlers/types'; -import { CommandType } from '../../src/core'; -import { EventEmitter } from 'events'; - -function createRandomModule(): Processed { - return { - type: faker.number.int({ - min: CommandType.Text, - max: CommandType.ChannelSelect, - }), - description: faker.string.alpha(), - name: faker.string.alpha(), - onEvent: [], - plugins: [], - execute: vi.fn(), - }; -} - -describe('eventDispatcher standard', () => { - let m: Processed; - let ee: EventEmitter; - beforeEach(() => { - ee = new EventEmitter(); - m = createRandomModule(); - }); - - it('should throw', () => { - expect(() => eventDispatcher(m, 'not event emitter')).toThrowError(); - }); - it("Shouldn't throw", () => { - expect(() => eventDispatcher(m, ee)).not.toThrowError(); - }); - - it('Should be called once', () => { - const s = eventDispatcher(m, ee); - s.subscribe(); - ee.emit(m.name, faker.string.alpha()); - - expect(m.execute).toHaveBeenCalledOnce(); - }); -}); diff --git a/test/handlers/id.test.ts b/test/handlers/id.test.ts deleted file mode 100644 index d830690..0000000 --- a/test/handlers/id.test.ts +++ /dev/null @@ -1,47 +0,0 @@ -import { describe, expect, it, vi } from 'vitest'; -import * as Id from '../../src/core/id'; -import { faker } from '@faker-js/faker'; -import { CommandModule, CommandType, commandModule } from '../../src'; - -function createRandomCommandModules() { - const randomCommandType = [ - CommandType.Text, - CommandType.Both, - CommandType.CtxMsg, - CommandType.CtxUser, - CommandType.Modal, - CommandType.ChannelSelect, - CommandType.RoleSelect, - CommandType.UserSelect, - CommandType.StringSelect, - CommandType.Button, - ]; - return commandModule({ - type: faker.helpers.uniqueArray(randomCommandType, 1)[0], - description: faker.string.alpha(), - name: faker.string.alpha(), - execute: () => {}, - }); -} -function createMetadata(c: CommandModule) { - return { - fullPath: faker.system.filePath(), - id: Id.create(c.name, c.type), - isClass: Boolean(Math.floor(Math.random())), - }; -} -const appBitField = 0b000000001111; - -describe('id resolution', () => { - it('should resolve application commands correctly', () => { - const modules = faker.helpers.multiple(createRandomCommandModules, { - count: 20, - }); - const metadata = modules.map(createMetadata); - metadata.forEach((meta, idx) => { - const associatedModule = modules[idx]; - const uid = Id.create(associatedModule.name!, associatedModule.type!); - expect(meta.id).toBe(uid); - }); - }); -}); diff --git a/test/mockules/!ignd.ts b/test/mockules/!ignd.ts new file mode 100644 index 0000000..e69de29 diff --git a/test/mockules/!ignored/ignored.ts b/test/mockules/!ignored/ignored.ts new file mode 100644 index 0000000..e69de29 diff --git a/test/mockules/failed.ts b/test/mockules/failed.ts new file mode 100644 index 0000000..e69de29 diff --git a/test/mockules/module.ts b/test/mockules/module.ts new file mode 100644 index 0000000..7a422b5 --- /dev/null +++ b/test/mockules/module.ts @@ -0,0 +1,6 @@ +import { CommandType, commandModule } from '../../src/' +export default commandModule({ + type: CommandType.Both, + description: "", + execute: (Ctx, args) => {} +}) diff --git a/test/mockules/ug/pass.ts b/test/mockules/ug/pass.ts new file mode 100644 index 0000000..9cdadf0 --- /dev/null +++ b/test/mockules/ug/pass.ts @@ -0,0 +1,6 @@ +import { CommandType, commandModule } from '../../../src/' +export default commandModule({ + type: CommandType.Both, + description: "", + execute: (Ctx, args) => {} +}) diff --git a/tsconfig.json b/tsconfig.json index bbb5bc2..61d0910 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -4,15 +4,17 @@ "strict": true, "esModuleInterop": true, "strictNullChecks": true, - "moduleResolution": "node", + "moduleResolution": "node16", "skipLibCheck": true, "declaration": true, "preserveSymlinks": true, "allowSyntheticDefaultImports": true, "forceConsistentCasingInFileNames": true, "isolatedModules": true, - "module": "esnext", - "target": "esnext" + "outDir": "dist", + "module": "node16", + "target": "esnext", + "sourceMap": true }, "exclude": ["node_modules", "dist"], "include": ["./src", "./src/**/*.d.ts"] diff --git a/tsup.config.js b/tsup.config.js deleted file mode 100644 index 812c2a6..0000000 --- a/tsup.config.js +++ /dev/null @@ -1,24 +0,0 @@ -import { defineConfig } from 'tsup'; -const shared = { - entry: ['src/index.ts'], - external: ['discord.js', 'iti'], - platform: 'node', - clean: true, - sourcemap: true, - treeshake: { - moduleSideEffects: false, - correctVarValueBeforeDeclaration: true, //need this to treeshake esm discord.js empty import - annotations: true, - }, -}; -export default defineConfig([ - { - format: ['esm', 'cjs'], - target: 'node18', - tsconfig: './tsconfig.json', - outDir: './dist', - minify: false, - dts: true, - ...shared, - }, - ]); diff --git a/yarn.lock b/yarn.lock index 1bd0fca..177077c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5,25 +5,18 @@ __metadata: version: 6 cacheKey: 8 -"@aashutoshrathi/word-wrap@npm:^1.2.3": - version: 1.2.6 - resolution: "@aashutoshrathi/word-wrap@npm:1.2.6" - checksum: ada901b9e7c680d190f1d012c84217ce0063d8f5c5a7725bb91ec3c5ed99bb7572680eb2d2938a531ccbaec39a95422fcd8a6b4a13110c7d98dd75402f66a0cd - languageName: node - linkType: hard - -"@discordjs/builders@npm:^1.7.0": - version: 1.7.0 - resolution: "@discordjs/builders@npm:1.7.0" +"@discordjs/builders@npm:^1.8.2": + version: 1.8.2 + resolution: "@discordjs/builders@npm:1.8.2" dependencies: - "@discordjs/formatters": ^0.3.3 - "@discordjs/util": ^1.0.2 - "@sapphire/shapeshift": ^3.9.3 - discord-api-types: 0.37.61 + "@discordjs/formatters": ^0.4.0 + "@discordjs/util": ^1.1.0 + "@sapphire/shapeshift": ^3.9.7 + discord-api-types: 0.37.83 fast-deep-equal: ^3.1.3 - ts-mixer: ^6.0.3 + ts-mixer: ^6.0.4 tslib: ^2.6.2 - checksum: 837e7643fc8396e4914bbbfbbfa1232ab7109c931884e8df45cd7356944633590f710a18513d30a10de1b6686ed5166df702bde0c4511fb0cbcac897edd9e56a + checksum: 65c707f28fb40b2875ebc08d580b6902eaf988c0e70ad674e33893abfdde74b52fc491476336a312c4f18de2fc599e1299341af152265d84864c907a12749a8e languageName: node linkType: hard @@ -34,367 +27,220 @@ __metadata: languageName: node linkType: hard -"@discordjs/collection@npm:^2.0.0": - version: 2.0.0 - resolution: "@discordjs/collection@npm:2.0.0" - checksum: c2d05fa2b9a27bb64e93e2836bbe44c835d21f85e28cd934f6e2a81fef423ab0415968cca9d066b83347539edc8ea9afa8075d80bd62594e39f09eb881052c49 +"@discordjs/collection@npm:^2.1.0": + version: 2.1.0 + resolution: "@discordjs/collection@npm:2.1.0" + checksum: ebe1a32769296f14a38b2c718c7e0d00830e37e68e59a3683aa0f7c25adf9487ebaca3ac3f78fd60e2c89cf314b7891312cac36e3b0885cceb4d2a677ae7d19b languageName: node linkType: hard -"@discordjs/formatters@npm:^0.3.3": - version: 0.3.3 - resolution: "@discordjs/formatters@npm:0.3.3" +"@discordjs/formatters@npm:^0.4.0": + version: 0.4.0 + resolution: "@discordjs/formatters@npm:0.4.0" dependencies: - discord-api-types: 0.37.61 - checksum: a844628094a6effa8ac4e4a4ea9082d5c89e6cae6bbd18e60abd410769e5ea18f64aa2db8623aa3c8c572084368f6c2e27cc2d72af640aff5e4ee7fc42132c60 + discord-api-types: 0.37.83 + checksum: 130ab7ba104635d7d0f92f4c3de67dbc60cdab004e9db605e0f2c7f410a9808df8776e4d5d45632597dc7257713dc77bb616ee25bb0827117247b6bebfe35921 languageName: node linkType: hard -"@discordjs/rest@npm:^2.1.0": - version: 2.2.0 - resolution: "@discordjs/rest@npm:2.2.0" +"@discordjs/rest@npm:^2.3.0": + version: 2.3.0 + resolution: "@discordjs/rest@npm:2.3.0" dependencies: - "@discordjs/collection": ^2.0.0 - "@discordjs/util": ^1.0.2 - "@sapphire/async-queue": ^1.5.0 - "@sapphire/snowflake": ^3.5.1 - "@vladfrangu/async_event_emitter": ^2.2.2 - discord-api-types: 0.37.61 - magic-bytes.js: ^1.5.0 + "@discordjs/collection": ^2.1.0 + "@discordjs/util": ^1.1.0 + "@sapphire/async-queue": ^1.5.2 + "@sapphire/snowflake": ^3.5.3 + "@vladfrangu/async_event_emitter": ^2.2.4 + discord-api-types: 0.37.83 + magic-bytes.js: ^1.10.0 tslib: ^2.6.2 - undici: 5.27.2 - checksum: 29a14ecf3282ae3306883f1f6c870693d0ecacd080c5b66a72e31487a8070655807a80a8bf09bebea4f73e631439abc5121dfa38016ca0ccbe3f68c0f7ffc80e + undici: 6.13.0 + checksum: 01564bf108c359f5650318ccadc51bf762c99df56de865192b25adef4331c0729886e84b4ebd10dfc57818b97ff891f1857873811e7a2326d24fd0bf892a0201 languageName: node linkType: hard -"@discordjs/util@npm:^1.0.2": - version: 1.0.2 - resolution: "@discordjs/util@npm:1.0.2" - checksum: 320d7e125981001160d413ae56e76e60447dce102010b80e3b1b16d885be765df5ae2551aa79fdc4d435a82361ed72246b44251f0c1f7a8fef7056a4481d5609 +"@discordjs/util@npm:^1.1.0": + version: 1.1.0 + resolution: "@discordjs/util@npm:1.1.0" + checksum: b4db3fc6017986cd0e7fd6aa50e890e1259e79c6e0ff9c07685a86b2c22409a42f146f282d907885444f37ca596220c166d8be11851fab7f9e2c1ee932fd524e languageName: node linkType: hard -"@discordjs/ws@npm:^1.0.2": - version: 1.0.2 - resolution: "@discordjs/ws@npm:1.0.2" +"@discordjs/ws@npm:^1.1.1": + version: 1.1.1 + resolution: "@discordjs/ws@npm:1.1.1" dependencies: - "@discordjs/collection": ^2.0.0 - "@discordjs/rest": ^2.1.0 - "@discordjs/util": ^1.0.2 - "@sapphire/async-queue": ^1.5.0 - "@types/ws": ^8.5.9 - "@vladfrangu/async_event_emitter": ^2.2.2 - discord-api-types: 0.37.61 + "@discordjs/collection": ^2.1.0 + "@discordjs/rest": ^2.3.0 + "@discordjs/util": ^1.1.0 + "@sapphire/async-queue": ^1.5.2 + "@types/ws": ^8.5.10 + "@vladfrangu/async_event_emitter": ^2.2.4 + discord-api-types: 0.37.83 tslib: ^2.6.2 - ws: ^8.14.2 - checksum: 2564d3ff00d04d7638955c8c9a9f6234c50168fbe8243140bc458dc9ffa39ad5063e7d5762cdce71bb8bcf70b6353c28b8531e40f54568706898e92bc8748590 + ws: ^8.16.0 + checksum: 42ba6dad56d6d340b34e400144cb6cd0433c963b16c51e24496b43a1a23cc01c663cb24c492b9fc8c1f7dd528ce32f7d34e2ed379dbc57352468f5505fe21486 languageName: node linkType: hard -"@esbuild/android-arm64@npm:0.17.19": - version: 0.17.19 - resolution: "@esbuild/android-arm64@npm:0.17.19" +"@esbuild/aix-ppc64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/aix-ppc64@npm:0.21.5" + conditions: os=aix & cpu=ppc64 + languageName: node + linkType: hard + +"@esbuild/android-arm64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/android-arm64@npm:0.21.5" conditions: os=android & cpu=arm64 languageName: node linkType: hard -"@esbuild/android-arm64@npm:0.18.20": - version: 0.18.20 - resolution: "@esbuild/android-arm64@npm:0.18.20" - conditions: os=android & cpu=arm64 - languageName: node - linkType: hard - -"@esbuild/android-arm@npm:0.17.19": - version: 0.17.19 - resolution: "@esbuild/android-arm@npm:0.17.19" +"@esbuild/android-arm@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/android-arm@npm:0.21.5" conditions: os=android & cpu=arm languageName: node linkType: hard -"@esbuild/android-arm@npm:0.18.20": - version: 0.18.20 - resolution: "@esbuild/android-arm@npm:0.18.20" - conditions: os=android & cpu=arm - languageName: node - linkType: hard - -"@esbuild/android-x64@npm:0.17.19": - version: 0.17.19 - resolution: "@esbuild/android-x64@npm:0.17.19" +"@esbuild/android-x64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/android-x64@npm:0.21.5" conditions: os=android & cpu=x64 languageName: node linkType: hard -"@esbuild/android-x64@npm:0.18.20": - version: 0.18.20 - resolution: "@esbuild/android-x64@npm:0.18.20" - conditions: os=android & cpu=x64 - languageName: node - linkType: hard - -"@esbuild/darwin-arm64@npm:0.17.19": - version: 0.17.19 - resolution: "@esbuild/darwin-arm64@npm:0.17.19" +"@esbuild/darwin-arm64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/darwin-arm64@npm:0.21.5" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@esbuild/darwin-arm64@npm:0.18.20": - version: 0.18.20 - resolution: "@esbuild/darwin-arm64@npm:0.18.20" - conditions: os=darwin & cpu=arm64 - languageName: node - linkType: hard - -"@esbuild/darwin-x64@npm:0.17.19": - version: 0.17.19 - resolution: "@esbuild/darwin-x64@npm:0.17.19" +"@esbuild/darwin-x64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/darwin-x64@npm:0.21.5" conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"@esbuild/darwin-x64@npm:0.18.20": - version: 0.18.20 - resolution: "@esbuild/darwin-x64@npm:0.18.20" - conditions: os=darwin & cpu=x64 - languageName: node - linkType: hard - -"@esbuild/freebsd-arm64@npm:0.17.19": - version: 0.17.19 - resolution: "@esbuild/freebsd-arm64@npm:0.17.19" +"@esbuild/freebsd-arm64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/freebsd-arm64@npm:0.21.5" conditions: os=freebsd & cpu=arm64 languageName: node linkType: hard -"@esbuild/freebsd-arm64@npm:0.18.20": - version: 0.18.20 - resolution: "@esbuild/freebsd-arm64@npm:0.18.20" - conditions: os=freebsd & cpu=arm64 - languageName: node - linkType: hard - -"@esbuild/freebsd-x64@npm:0.17.19": - version: 0.17.19 - resolution: "@esbuild/freebsd-x64@npm:0.17.19" +"@esbuild/freebsd-x64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/freebsd-x64@npm:0.21.5" conditions: os=freebsd & cpu=x64 languageName: node linkType: hard -"@esbuild/freebsd-x64@npm:0.18.20": - version: 0.18.20 - resolution: "@esbuild/freebsd-x64@npm:0.18.20" - conditions: os=freebsd & cpu=x64 - languageName: node - linkType: hard - -"@esbuild/linux-arm64@npm:0.17.19": - version: 0.17.19 - resolution: "@esbuild/linux-arm64@npm:0.17.19" +"@esbuild/linux-arm64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/linux-arm64@npm:0.21.5" conditions: os=linux & cpu=arm64 languageName: node linkType: hard -"@esbuild/linux-arm64@npm:0.18.20": - version: 0.18.20 - resolution: "@esbuild/linux-arm64@npm:0.18.20" - conditions: os=linux & cpu=arm64 - languageName: node - linkType: hard - -"@esbuild/linux-arm@npm:0.17.19": - version: 0.17.19 - resolution: "@esbuild/linux-arm@npm:0.17.19" +"@esbuild/linux-arm@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/linux-arm@npm:0.21.5" conditions: os=linux & cpu=arm languageName: node linkType: hard -"@esbuild/linux-arm@npm:0.18.20": - version: 0.18.20 - resolution: "@esbuild/linux-arm@npm:0.18.20" - conditions: os=linux & cpu=arm - languageName: node - linkType: hard - -"@esbuild/linux-ia32@npm:0.17.19": - version: 0.17.19 - resolution: "@esbuild/linux-ia32@npm:0.17.19" +"@esbuild/linux-ia32@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/linux-ia32@npm:0.21.5" conditions: os=linux & cpu=ia32 languageName: node linkType: hard -"@esbuild/linux-ia32@npm:0.18.20": - version: 0.18.20 - resolution: "@esbuild/linux-ia32@npm:0.18.20" - conditions: os=linux & cpu=ia32 - languageName: node - linkType: hard - -"@esbuild/linux-loong64@npm:0.17.19": - version: 0.17.19 - resolution: "@esbuild/linux-loong64@npm:0.17.19" +"@esbuild/linux-loong64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/linux-loong64@npm:0.21.5" conditions: os=linux & cpu=loong64 languageName: node linkType: hard -"@esbuild/linux-loong64@npm:0.18.20": - version: 0.18.20 - resolution: "@esbuild/linux-loong64@npm:0.18.20" - conditions: os=linux & cpu=loong64 - languageName: node - linkType: hard - -"@esbuild/linux-mips64el@npm:0.17.19": - version: 0.17.19 - resolution: "@esbuild/linux-mips64el@npm:0.17.19" +"@esbuild/linux-mips64el@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/linux-mips64el@npm:0.21.5" conditions: os=linux & cpu=mips64el languageName: node linkType: hard -"@esbuild/linux-mips64el@npm:0.18.20": - version: 0.18.20 - resolution: "@esbuild/linux-mips64el@npm:0.18.20" - conditions: os=linux & cpu=mips64el - languageName: node - linkType: hard - -"@esbuild/linux-ppc64@npm:0.17.19": - version: 0.17.19 - resolution: "@esbuild/linux-ppc64@npm:0.17.19" +"@esbuild/linux-ppc64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/linux-ppc64@npm:0.21.5" conditions: os=linux & cpu=ppc64 languageName: node linkType: hard -"@esbuild/linux-ppc64@npm:0.18.20": - version: 0.18.20 - resolution: "@esbuild/linux-ppc64@npm:0.18.20" - conditions: os=linux & cpu=ppc64 - languageName: node - linkType: hard - -"@esbuild/linux-riscv64@npm:0.17.19": - version: 0.17.19 - resolution: "@esbuild/linux-riscv64@npm:0.17.19" +"@esbuild/linux-riscv64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/linux-riscv64@npm:0.21.5" conditions: os=linux & cpu=riscv64 languageName: node linkType: hard -"@esbuild/linux-riscv64@npm:0.18.20": - version: 0.18.20 - resolution: "@esbuild/linux-riscv64@npm:0.18.20" - conditions: os=linux & cpu=riscv64 - languageName: node - linkType: hard - -"@esbuild/linux-s390x@npm:0.17.19": - version: 0.17.19 - resolution: "@esbuild/linux-s390x@npm:0.17.19" +"@esbuild/linux-s390x@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/linux-s390x@npm:0.21.5" conditions: os=linux & cpu=s390x languageName: node linkType: hard -"@esbuild/linux-s390x@npm:0.18.20": - version: 0.18.20 - resolution: "@esbuild/linux-s390x@npm:0.18.20" - conditions: os=linux & cpu=s390x - languageName: node - linkType: hard - -"@esbuild/linux-x64@npm:0.17.19": - version: 0.17.19 - resolution: "@esbuild/linux-x64@npm:0.17.19" +"@esbuild/linux-x64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/linux-x64@npm:0.21.5" conditions: os=linux & cpu=x64 languageName: node linkType: hard -"@esbuild/linux-x64@npm:0.18.20": - version: 0.18.20 - resolution: "@esbuild/linux-x64@npm:0.18.20" - conditions: os=linux & cpu=x64 - languageName: node - linkType: hard - -"@esbuild/netbsd-x64@npm:0.17.19": - version: 0.17.19 - resolution: "@esbuild/netbsd-x64@npm:0.17.19" +"@esbuild/netbsd-x64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/netbsd-x64@npm:0.21.5" conditions: os=netbsd & cpu=x64 languageName: node linkType: hard -"@esbuild/netbsd-x64@npm:0.18.20": - version: 0.18.20 - resolution: "@esbuild/netbsd-x64@npm:0.18.20" - conditions: os=netbsd & cpu=x64 - languageName: node - linkType: hard - -"@esbuild/openbsd-x64@npm:0.17.19": - version: 0.17.19 - resolution: "@esbuild/openbsd-x64@npm:0.17.19" +"@esbuild/openbsd-x64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/openbsd-x64@npm:0.21.5" conditions: os=openbsd & cpu=x64 languageName: node linkType: hard -"@esbuild/openbsd-x64@npm:0.18.20": - version: 0.18.20 - resolution: "@esbuild/openbsd-x64@npm:0.18.20" - conditions: os=openbsd & cpu=x64 - languageName: node - linkType: hard - -"@esbuild/sunos-x64@npm:0.17.19": - version: 0.17.19 - resolution: "@esbuild/sunos-x64@npm:0.17.19" +"@esbuild/sunos-x64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/sunos-x64@npm:0.21.5" conditions: os=sunos & cpu=x64 languageName: node linkType: hard -"@esbuild/sunos-x64@npm:0.18.20": - version: 0.18.20 - resolution: "@esbuild/sunos-x64@npm:0.18.20" - conditions: os=sunos & cpu=x64 - languageName: node - linkType: hard - -"@esbuild/win32-arm64@npm:0.17.19": - version: 0.17.19 - resolution: "@esbuild/win32-arm64@npm:0.17.19" +"@esbuild/win32-arm64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/win32-arm64@npm:0.21.5" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"@esbuild/win32-arm64@npm:0.18.20": - version: 0.18.20 - resolution: "@esbuild/win32-arm64@npm:0.18.20" - conditions: os=win32 & cpu=arm64 - languageName: node - linkType: hard - -"@esbuild/win32-ia32@npm:0.17.19": - version: 0.17.19 - resolution: "@esbuild/win32-ia32@npm:0.17.19" +"@esbuild/win32-ia32@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/win32-ia32@npm:0.21.5" conditions: os=win32 & cpu=ia32 languageName: node linkType: hard -"@esbuild/win32-ia32@npm:0.18.20": - version: 0.18.20 - resolution: "@esbuild/win32-ia32@npm:0.18.20" - conditions: os=win32 & cpu=ia32 - languageName: node - linkType: hard - -"@esbuild/win32-x64@npm:0.17.19": - version: 0.17.19 - resolution: "@esbuild/win32-x64@npm:0.17.19" - conditions: os=win32 & cpu=x64 - languageName: node - linkType: hard - -"@esbuild/win32-x64@npm:0.18.20": - version: 0.18.20 - resolution: "@esbuild/win32-x64@npm:0.18.20" +"@esbuild/win32-x64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/win32-x64@npm:0.21.5" conditions: os=win32 & cpu=x64 languageName: node linkType: hard @@ -411,15 +257,15 @@ __metadata: linkType: hard "@eslint-community/regexpp@npm:^4.4.0": - version: 4.8.0 - resolution: "@eslint-community/regexpp@npm:4.8.0" - checksum: 601e6d033d556e98e8c929905bef335f20d7389762812df4d0f709d9b4d2631610dda975fb272e23b5b68e24a163b3851b114c8080a0a19fb4c141a1eff6305b + version: 4.11.0 + resolution: "@eslint-community/regexpp@npm:4.11.0" + checksum: 97d2fe46690b69417a551bd19a3dc53b6d9590d2295c43cc4c4e44e64131af541e2f4a44d5c12e87de990403654d3dae9d33600081f3a2f0386b368abc9111ec languageName: node linkType: hard "@eslint/eslintrc@npm:^2.0.2": - version: 2.1.2 - resolution: "@eslint/eslintrc@npm:2.1.2" + version: 2.1.4 + resolution: "@eslint/eslintrc@npm:2.1.4" dependencies: ajv: ^6.12.4 debug: ^4.3.2 @@ -430,7 +276,7 @@ __metadata: js-yaml: ^4.1.0 minimatch: ^3.1.2 strip-json-comments: ^3.1.1 - checksum: bc742a1e3b361f06fedb4afb6bf32cbd27171292ef7924f61c62f2aed73048367bcc7ac68f98c06d4245cd3fabc43270f844e3c1699936d4734b3ac5398814a7 + checksum: 10957c7592b20ca0089262d8c2a8accbad14b4f6507e35416c32ee6b4dbf9cad67dfb77096bbd405405e9ada2b107f3797fe94362e1c55e0b09d6e90dd149127 languageName: node linkType: hard @@ -442,27 +288,20 @@ __metadata: linkType: hard "@faker-js/faker@npm:^8.0.1": - version: 8.0.2 - resolution: "@faker-js/faker@npm:8.0.2" - checksum: cf73daf9a50397eb0b3f04a7ef3fbb6f54acc026b167707136a7e58a517fd805a46c9e8c5f017f3022f104a4ff984765daaeee2cb98b3c34646db05c2acad441 - languageName: node - linkType: hard - -"@fastify/busboy@npm:^2.0.0": - version: 2.1.0 - resolution: "@fastify/busboy@npm:2.1.0" - checksum: 3233abd10f73e50668cb4bb278a79b7b3fadd30215ac6458299b0e5a09a29c3586ec07597aae6bd93f5cbedfcef43a8aeea51829cd28fc13850cdbcd324c28d5 + version: 8.4.1 + resolution: "@faker-js/faker@npm:8.4.1" + checksum: d802d531f8929562715adc279cfec763c9a4bc596ec67b0ce43fd0ae61b285d2b0eec6f1f4aa852452a63721a842fe7e81926dce7bd92acca94b01e2a1f55f5a languageName: node linkType: hard "@humanwhocodes/config-array@npm:^0.11.8": - version: 0.11.11 - resolution: "@humanwhocodes/config-array@npm:0.11.11" + version: 0.11.14 + resolution: "@humanwhocodes/config-array@npm:0.11.14" dependencies: - "@humanwhocodes/object-schema": ^1.2.1 - debug: ^4.1.1 + "@humanwhocodes/object-schema": ^2.0.2 + debug: ^4.3.1 minimatch: ^3.0.5 - checksum: db84507375ab77b8ffdd24f498a5b49ad6b64391d30dd2ac56885501d03964d29637e05b1ed5aefa09d57ac667e28028bc22d2da872bfcd619652fbdb5f4ca19 + checksum: 861ccce9eaea5de19546653bccf75bf09fe878bc39c3aab00aeee2d2a0e654516adad38dd1098aab5e3af0145bbcbf3f309bdf4d964f8dab9dcd5834ae4c02f2 languageName: node linkType: hard @@ -473,10 +312,10 @@ __metadata: languageName: node linkType: hard -"@humanwhocodes/object-schema@npm:^1.2.1": - version: 1.2.1 - resolution: "@humanwhocodes/object-schema@npm:1.2.1" - checksum: a824a1ec31591231e4bad5787641f59e9633827d0a2eaae131a288d33c9ef0290bd16fda8da6f7c0fcb014147865d12118df10db57f27f41e20da92369fcb3f1 +"@humanwhocodes/object-schema@npm:^2.0.2": + version: 2.0.3 + resolution: "@humanwhocodes/object-schema@npm:2.0.3" + checksum: d3b78f6c5831888c6ecc899df0d03bcc25d46f3ad26a11d7ea52944dc36a35ef543fad965322174238d677a43d5c694434f6607532cff7077062513ad7022631 languageName: node linkType: hard @@ -503,48 +342,13 @@ __metadata: languageName: node linkType: hard -"@jridgewell/gen-mapping@npm:^0.3.2": - version: 0.3.3 - resolution: "@jridgewell/gen-mapping@npm:0.3.3" - dependencies: - "@jridgewell/set-array": ^1.0.1 - "@jridgewell/sourcemap-codec": ^1.4.10 - "@jridgewell/trace-mapping": ^0.3.9 - checksum: 4a74944bd31f22354fc01c3da32e83c19e519e3bbadafa114f6da4522ea77dd0c2842607e923a591d60a76699d819a2fbb6f3552e277efdb9b58b081390b60ab - languageName: node - linkType: hard - -"@jridgewell/resolve-uri@npm:^3.1.0": - version: 3.1.1 - resolution: "@jridgewell/resolve-uri@npm:3.1.1" - checksum: f5b441fe7900eab4f9155b3b93f9800a916257f4e8563afbcd3b5a5337b55e52bd8ae6735453b1b745457d9f6cdb16d74cd6220bbdd98cf153239e13f6cbb653 - languageName: node - linkType: hard - -"@jridgewell/set-array@npm:^1.0.1": - version: 1.1.2 - resolution: "@jridgewell/set-array@npm:1.1.2" - checksum: 69a84d5980385f396ff60a175f7177af0b8da4ddb81824cb7016a9ef914eee9806c72b6b65942003c63f7983d4f39a5c6c27185bbca88eb4690b62075602e28e - languageName: node - linkType: hard - -"@jridgewell/sourcemap-codec@npm:^1.4.10, @jridgewell/sourcemap-codec@npm:^1.4.14, @jridgewell/sourcemap-codec@npm:^1.4.15": +"@jridgewell/sourcemap-codec@npm:^1.4.15": version: 1.4.15 resolution: "@jridgewell/sourcemap-codec@npm:1.4.15" checksum: b881c7e503db3fc7f3c1f35a1dd2655a188cc51a3612d76efc8a6eb74728bef5606e6758ee77423e564092b4a518aba569bbb21c9bac5ab7a35b0c6ae7e344c8 languageName: node linkType: hard -"@jridgewell/trace-mapping@npm:^0.3.9": - version: 0.3.19 - resolution: "@jridgewell/trace-mapping@npm:0.3.19" - dependencies: - "@jridgewell/resolve-uri": ^3.1.0 - "@jridgewell/sourcemap-codec": ^1.4.14 - checksum: 956a6f0f6fec060fb48c6bf1f5ec2064e13cd38c8be3873877d4b92b4a27ba58289a34071752671262a3e3c202abcc3fa2aac64d8447b4b0fa1ba3c9047f1c20 - languageName: node - linkType: hard - "@nodelib/fs.scandir@npm:2.1.5": version: 2.1.5 resolution: "@nodelib/fs.scandir@npm:2.1.5" @@ -572,12 +376,25 @@ __metadata: languageName: node linkType: hard +"@npmcli/agent@npm:^2.0.0": + version: 2.2.2 + resolution: "@npmcli/agent@npm:2.2.2" + dependencies: + agent-base: ^7.1.0 + http-proxy-agent: ^7.0.0 + https-proxy-agent: ^7.0.1 + lru-cache: ^10.0.1 + socks-proxy-agent: ^8.0.3 + checksum: 67de7b88cc627a79743c88bab35e023e23daf13831a8aa4e15f998b92f5507b644d8ffc3788afc8e64423c612e0785a6a92b74782ce368f49a6746084b50d874 + languageName: node + linkType: hard + "@npmcli/fs@npm:^3.1.0": - version: 3.1.0 - resolution: "@npmcli/fs@npm:3.1.0" + version: 3.1.1 + resolution: "@npmcli/fs@npm:3.1.1" dependencies: semver: ^7.3.5 - checksum: a50a6818de5fc557d0b0e6f50ec780a7a02ab8ad07e5ac8b16bf519e0ad60a144ac64f97d05c443c3367235d337182e1d012bbac0eb8dbae8dc7b40b193efd0e + checksum: d960cab4b93adcb31ce223bfb75c5714edbd55747342efb67dcc2f25e023d930a7af6ece3e75f2f459b6f38fc14d031c766f116cd124fdc937fd33112579e820 languageName: node linkType: hard @@ -588,34 +405,139 @@ __metadata: languageName: node linkType: hard -"@sapphire/async-queue@npm:^1.5.0": - version: 1.5.0 - resolution: "@sapphire/async-queue@npm:1.5.0" - checksum: 983dbd1fd1b1798496e5edb6a0db7e4d90015160e1028f20475eab0a92625513f1e8d938bc0305811a9cec461c94e01b1e4191615ff03ba49356f568f3255250 +"@rollup/rollup-android-arm-eabi@npm:4.18.0": + version: 4.18.0 + resolution: "@rollup/rollup-android-arm-eabi@npm:4.18.0" + conditions: os=android & cpu=arm languageName: node linkType: hard -"@sapphire/shapeshift@npm:^3.9.3": - version: 3.9.4 - resolution: "@sapphire/shapeshift@npm:3.9.4" +"@rollup/rollup-android-arm64@npm:4.18.0": + version: 4.18.0 + resolution: "@rollup/rollup-android-arm64@npm:4.18.0" + conditions: os=android & cpu=arm64 + languageName: node + linkType: hard + +"@rollup/rollup-darwin-arm64@npm:4.18.0": + version: 4.18.0 + resolution: "@rollup/rollup-darwin-arm64@npm:4.18.0" + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + +"@rollup/rollup-darwin-x64@npm:4.18.0": + version: 4.18.0 + resolution: "@rollup/rollup-darwin-x64@npm:4.18.0" + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + +"@rollup/rollup-linux-arm-gnueabihf@npm:4.18.0": + version: 4.18.0 + resolution: "@rollup/rollup-linux-arm-gnueabihf@npm:4.18.0" + conditions: os=linux & cpu=arm & libc=glibc + languageName: node + linkType: hard + +"@rollup/rollup-linux-arm-musleabihf@npm:4.18.0": + version: 4.18.0 + resolution: "@rollup/rollup-linux-arm-musleabihf@npm:4.18.0" + conditions: os=linux & cpu=arm & libc=musl + languageName: node + linkType: hard + +"@rollup/rollup-linux-arm64-gnu@npm:4.18.0": + version: 4.18.0 + resolution: "@rollup/rollup-linux-arm64-gnu@npm:4.18.0" + conditions: os=linux & cpu=arm64 & libc=glibc + languageName: node + linkType: hard + +"@rollup/rollup-linux-arm64-musl@npm:4.18.0": + version: 4.18.0 + resolution: "@rollup/rollup-linux-arm64-musl@npm:4.18.0" + conditions: os=linux & cpu=arm64 & libc=musl + languageName: node + linkType: hard + +"@rollup/rollup-linux-powerpc64le-gnu@npm:4.18.0": + version: 4.18.0 + resolution: "@rollup/rollup-linux-powerpc64le-gnu@npm:4.18.0" + conditions: os=linux & cpu=ppc64 & libc=glibc + languageName: node + linkType: hard + +"@rollup/rollup-linux-riscv64-gnu@npm:4.18.0": + version: 4.18.0 + resolution: "@rollup/rollup-linux-riscv64-gnu@npm:4.18.0" + conditions: os=linux & cpu=riscv64 & libc=glibc + languageName: node + linkType: hard + +"@rollup/rollup-linux-s390x-gnu@npm:4.18.0": + version: 4.18.0 + resolution: "@rollup/rollup-linux-s390x-gnu@npm:4.18.0" + conditions: os=linux & cpu=s390x & libc=glibc + languageName: node + linkType: hard + +"@rollup/rollup-linux-x64-gnu@npm:4.18.0": + version: 4.18.0 + resolution: "@rollup/rollup-linux-x64-gnu@npm:4.18.0" + conditions: os=linux & cpu=x64 & libc=glibc + languageName: node + linkType: hard + +"@rollup/rollup-linux-x64-musl@npm:4.18.0": + version: 4.18.0 + resolution: "@rollup/rollup-linux-x64-musl@npm:4.18.0" + conditions: os=linux & cpu=x64 & libc=musl + languageName: node + linkType: hard + +"@rollup/rollup-win32-arm64-msvc@npm:4.18.0": + version: 4.18.0 + resolution: "@rollup/rollup-win32-arm64-msvc@npm:4.18.0" + conditions: os=win32 & cpu=arm64 + languageName: node + linkType: hard + +"@rollup/rollup-win32-ia32-msvc@npm:4.18.0": + version: 4.18.0 + resolution: "@rollup/rollup-win32-ia32-msvc@npm:4.18.0" + conditions: os=win32 & cpu=ia32 + languageName: node + linkType: hard + +"@rollup/rollup-win32-x64-msvc@npm:4.18.0": + version: 4.18.0 + resolution: "@rollup/rollup-win32-x64-msvc@npm:4.18.0" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + +"@sapphire/async-queue@npm:^1.5.2": + version: 1.5.2 + resolution: "@sapphire/async-queue@npm:1.5.2" + checksum: 6252e72254f33c91da4887e324f17b59708b12c603216cc45f001460fd33265844301de47ab67c8caf8383ee280b39c8427ede242bd3b50b6ccdf13a386a5f1b + languageName: node + linkType: hard + +"@sapphire/shapeshift@npm:^3.9.7": + version: 3.9.7 + resolution: "@sapphire/shapeshift@npm:3.9.7" dependencies: fast-deep-equal: ^3.1.3 lodash: ^4.17.21 - checksum: 680a06823f899753c230d676a0c4c4b45e5575329d3598fb243dd5777c491955a62dcba94aac35770327a5a1103ddee6ceb8fa99c6b88de3cdd313fe3bafb2d3 + checksum: a36032ff8fc54056ea21e0cdbbea84c3d80c0c0fb19b2685e14e29111ab9c1172c9273e1e54d49e2a62ba5a393f18b3dab9330d34b97d3519d572e32dd64913d languageName: node linkType: hard -"@sapphire/snowflake@npm:3.5.1": - version: 3.5.1 - resolution: "@sapphire/snowflake@npm:3.5.1" - checksum: 8fc025020adab1a7a1a5d2cf07704d598cc1977b50e5fcd3a5dd239f00934dc936d3a4d5ae336e71d8bf1d88ec27aa814b34de79e38ff097b7b9ba5a7977a683 - languageName: node - linkType: hard - -"@sapphire/snowflake@npm:^3.5.1": - version: 3.5.2 - resolution: "@sapphire/snowflake@npm:3.5.2" - checksum: f88ee6b167abd83868092b71d68ad36599e922948d1b77ba694c1e13afafc46d4b07914d86ad5af6841cb4b95ceaffd940affe56576362a1c7a5d28a4344f3e4 +"@sapphire/snowflake@npm:3.5.3, @sapphire/snowflake@npm:^3.5.3": + version: 3.5.3 + resolution: "@sapphire/snowflake@npm:3.5.3" + checksum: 821add76877e2786ddb1b5cd3ee5de130610b82014972d91a99b4b7ce5475839b9a26f94de322f48a66f9ba2e2c578ffe46a60d06cbb9a36fd8fb96ef78be248 languageName: node linkType: hard @@ -624,22 +546,30 @@ __metadata: resolution: "@sern/handler@workspace:." dependencies: "@faker-js/faker": ^8.0.1 - "@types/node": ^18.15.11 + "@sern/ioc": ^1.1.0 + "@types/node": ^20.0.0 + "@types/node-cron": ^3.0.11 "@typescript-eslint/eslint-plugin": 5.58.0 "@typescript-eslint/parser": 5.59.1 callsites: ^3.1.0 - discord.js: ^14.11.0 + cron: ^3.1.7 + deepmerge: ^4.3.1 + discord.js: ^14.15.3 eslint: 8.39.0 - iti: ^0.6.0 - prettier: 2.8.8 rxjs: ^7.8.0 ts-results-es: ^4.1.0 - tsup: ^6.7.0 typescript: 5.0.2 - vitest: latest + vitest: ^1.6.0 languageName: unknown linkType: soft +"@sern/ioc@npm:^1.1.0": + version: 1.1.0 + resolution: "@sern/ioc@npm:1.1.0" + checksum: 0882ef51c3fcd28e7fe803762f2a8d7eb3dca4e494d3475ef7d4a43158d3b24243bda3679c3d58485c89bdc820719d22351007503e44b5cf8e6f2d0efe342921 + languageName: node + linkType: hard + "@sinclair/typebox@npm:^0.27.8": version: 0.27.8 resolution: "@sinclair/typebox@npm:0.27.8" @@ -647,67 +577,51 @@ __metadata: languageName: node linkType: hard -"@tootallnate/once@npm:2": - version: 2.0.0 - resolution: "@tootallnate/once@npm:2.0.0" - checksum: ad87447820dd3f24825d2d947ebc03072b20a42bfc96cbafec16bff8bbda6c1a81fcb0be56d5b21968560c5359a0af4038a68ba150c3e1694fe4c109a063bed8 - languageName: node - linkType: hard - -"@types/chai-subset@npm:^1.3.3": - version: 1.3.3 - resolution: "@types/chai-subset@npm:1.3.3" - dependencies: - "@types/chai": "*" - checksum: 4481da7345022995f5a105e6683744f7203d2c3d19cfe88d8e17274d045722948abf55e0adfd97709e0f043dade37a4d4e98cd4c660e2e8a14f23e6ecf79418f - languageName: node - linkType: hard - -"@types/chai@npm:*, @types/chai@npm:^4.3.5": - version: 4.3.6 - resolution: "@types/chai@npm:4.3.6" - checksum: 32a6c18bf53fb3dbd89d1bfcadb1c6fd45cc0007c34e436393cc37a0a5a556f9e6a21d1e8dd71674c40cc36589d2f30bf4d9369d7787021e54d6e997b0d7300a +"@types/estree@npm:1.0.5, @types/estree@npm:^1.0.0": + version: 1.0.5 + resolution: "@types/estree@npm:1.0.5" + checksum: dd8b5bed28e6213b7acd0fb665a84e693554d850b0df423ac8076cc3ad5823a6bc26b0251d080bdc545af83179ede51dd3f6fa78cad2c46ed1f29624ddf3e41a languageName: node linkType: hard "@types/json-schema@npm:^7.0.9": - version: 7.0.12 - resolution: "@types/json-schema@npm:7.0.12" - checksum: 00239e97234eeb5ceefb0c1875d98ade6e922bfec39dd365ec6bd360b5c2f825e612ac4f6e5f1d13601b8b30f378f15e6faa805a3a732f4a1bbe61915163d293 + version: 7.0.15 + resolution: "@types/json-schema@npm:7.0.15" + checksum: 97ed0cb44d4070aecea772b7b2e2ed971e10c81ec87dd4ecc160322ffa55ff330dace1793489540e3e318d90942064bb697cc0f8989391797792d919737b3b98 languageName: node linkType: hard -"@types/node@npm:*": - version: 20.5.9 - resolution: "@types/node@npm:20.5.9" - checksum: 717490e94131722144878b4ca1a963ede1673bb8f2ef78c2f5b50b918df6dc9b35e7f8283e5c2a7a9f137730f7c08dc6228e53d4494a94c9ee16881e6ce6caed +"@types/luxon@npm:~3.4.0": + version: 3.4.2 + resolution: "@types/luxon@npm:3.4.2" + checksum: 6f92d5bd02e89f310395753506bcd9cef3a56f5940f7a50db2a2b9822bce753553ac767d143cb5b4f9ed5ddd4a84e64f89ff538082ceb4d18739af7781b56925 languageName: node linkType: hard -"@types/node@npm:^18.15.11": - version: 18.17.14 - resolution: "@types/node@npm:18.17.14" - checksum: f96ce1e588426a26cf82440193084f8bbab47bfb3c2e668cf174095f99ce808a20654b2137448c7e88cfd7b6c2b8521ffb6f714f521b3502ac595a0df0bff679 +"@types/node-cron@npm:^3.0.11": + version: 3.0.11 + resolution: "@types/node-cron@npm:3.0.11" + checksum: a73f69bcca52a5f3b1671cfb00a8e4a1d150d0aef36a611564a2f94e66b6981bade577e267ceeeca6fcee241768902d55eb8cf3a81f9ef4ed767a23112fdb16d + languageName: node + linkType: hard + +"@types/node@npm:*, @types/node@npm:^20.0.0": + version: 20.14.9 + resolution: "@types/node@npm:20.14.9" + dependencies: + undici-types: ~5.26.4 + checksum: 5e9eda1ac8c6cc6bcd1063903ae195eaede9aad1bdad00408a919409cfbcdd2d6535aa3d50346f0d385528f9e03dafc7d1b3bad25aedb1dcd79a6ad39d06c35d languageName: node linkType: hard "@types/semver@npm:^7.3.12": - version: 7.5.1 - resolution: "@types/semver@npm:7.5.1" - checksum: 2fffe938c7ac168711f245a16e1856a3578d77161ca17e29a05c3e02c7be3e9c5beefa29a3350f6c1bd982fb70aa28cc52e4845eb7d36246bcdc0377170d584d + version: 7.5.8 + resolution: "@types/semver@npm:7.5.8" + checksum: ea6f5276f5b84c55921785a3a27a3cd37afee0111dfe2bcb3e03c31819c197c782598f17f0b150a69d453c9584cd14c4c4d7b9a55d2c5e6cacd4d66fdb3b3663 languageName: node linkType: hard -"@types/ws@npm:8.5.9": - version: 8.5.9 - resolution: "@types/ws@npm:8.5.9" - dependencies: - "@types/node": "*" - checksum: 83f436b731d2cdc49a45ced31a0a65cdd2e39c24d7b882776c26efa190dad6553e266d624c7a7089f36ad3ed471e02e729f3219282c80689b435f665df4a2b0b - languageName: node - linkType: hard - -"@types/ws@npm:^8.5.9": +"@types/ws@npm:^8.5.10": version: 8.5.10 resolution: "@types/ws@npm:8.5.10" dependencies: @@ -882,70 +796,71 @@ __metadata: languageName: node linkType: hard -"@vitest/expect@npm:0.34.3": - version: 0.34.3 - resolution: "@vitest/expect@npm:0.34.3" +"@vitest/expect@npm:1.6.0": + version: 1.6.0 + resolution: "@vitest/expect@npm:1.6.0" dependencies: - "@vitest/spy": 0.34.3 - "@vitest/utils": 0.34.3 - chai: ^4.3.7 - checksum: 79afaa37d2efb7bb5503332caf389860b2261f198dbe61557e8061262b628d18658e59eb51d1808ecd35fc59f4bb4d04c0e0f97a27c7db02584ab5b424147b8d + "@vitest/spy": 1.6.0 + "@vitest/utils": 1.6.0 + chai: ^4.3.10 + checksum: f3a9959ea387622297efed9e3689fd405044a813df5d5923302eaaea831e250d8d6a0ccd44fb387a95c19963242695ed803afc7c46ae06c48a8e06f194951984 languageName: node linkType: hard -"@vitest/runner@npm:0.34.3": - version: 0.34.3 - resolution: "@vitest/runner@npm:0.34.3" +"@vitest/runner@npm:1.6.0": + version: 1.6.0 + resolution: "@vitest/runner@npm:1.6.0" dependencies: - "@vitest/utils": 0.34.3 - p-limit: ^4.0.0 + "@vitest/utils": 1.6.0 + p-limit: ^5.0.0 pathe: ^1.1.1 - checksum: 945580eaa58e8edbe29a64059bc2a524a9e85117b6d600fdb457cfe84cbfb81bf6d7e98e1227e7cb4e7399992c8fe8d83d0791d0385ff005dc1a4d9da125443b + checksum: 2dcd953477d5effc051376e35a7f2c2b28abbe07c54e61157c9a6d6f01c880e079592c959397b3a55471423256ab91709c150881a33632558b81b1e251a0bf9c languageName: node linkType: hard -"@vitest/snapshot@npm:0.34.3": - version: 0.34.3 - resolution: "@vitest/snapshot@npm:0.34.3" +"@vitest/snapshot@npm:1.6.0": + version: 1.6.0 + resolution: "@vitest/snapshot@npm:1.6.0" dependencies: - magic-string: ^0.30.1 + magic-string: ^0.30.5 pathe: ^1.1.1 - pretty-format: ^29.5.0 - checksum: 234893e91a1efd4bdbbde047a68de40975e02ead8407724ce8ca4a24edf0fb2d725f8a3efceb104965388407b598faf22407aadfbf4164cc74b3cf1e0e9f4543 + pretty-format: ^29.7.0 + checksum: c4249fbf3ce310de86a19529a0a5c10b1bde4d8d8a678029c632335969b86cbdbf51cedc20d5e9c9328afee834d13cec1b8de5d0fd58139bf8e2dd8dcd0797f4 languageName: node linkType: hard -"@vitest/spy@npm:0.34.3": - version: 0.34.3 - resolution: "@vitest/spy@npm:0.34.3" +"@vitest/spy@npm:1.6.0": + version: 1.6.0 + resolution: "@vitest/spy@npm:1.6.0" dependencies: - tinyspy: ^2.1.1 - checksum: a2b64b9c357a56ad2f2340ecd225ffe787e61afba4ffb24a6670aad3fc90ea2606ed48daa188ed62b3ef67d55c0259fda6b101143d6c91b58c9ac4298d8be4f9 + tinyspy: ^2.2.0 + checksum: 0201975232255e1197f70fc6b23a1ff5e606138a5b96598fff06077d5b747705391013ee98f951affcfd8f54322e4ae1416200393248bb6a9c794f4ef663a066 languageName: node linkType: hard -"@vitest/utils@npm:0.34.3": - version: 0.34.3 - resolution: "@vitest/utils@npm:0.34.3" +"@vitest/utils@npm:1.6.0": + version: 1.6.0 + resolution: "@vitest/utils@npm:1.6.0" dependencies: - diff-sequences: ^29.4.3 - loupe: ^2.3.6 - pretty-format: ^29.5.0 - checksum: aeb8ef7fd98b32cb6c403796880d0aa8f5411bbdb249bb23b3301a70e1b7d1ee025ddb204aae8c1db5756f6ac428c49ebbb8e2ed23ce185c8a659b67413efa85 + diff-sequences: ^29.6.3 + estree-walker: ^3.0.3 + loupe: ^2.3.7 + pretty-format: ^29.7.0 + checksum: a4749533a48e7e4bbc8eafee0fee0e9a0d4eaa4910fbdb490d34e16f8ebcce59a2b38529b9e6b4578e3b4510ea67b29384c93165712b0a19f2e71946922d2c56 languageName: node linkType: hard -"@vladfrangu/async_event_emitter@npm:^2.2.2": - version: 2.2.4 - resolution: "@vladfrangu/async_event_emitter@npm:2.2.4" - checksum: ff65ebc4d89639adecd249e24e4f6f97b7696404f2a4461160efdff628d91de543e982727c18de62a4edada3f66381b5a3cd1d4f4f33098075d839c1b4f46979 +"@vladfrangu/async_event_emitter@npm:^2.2.4": + version: 2.4.0 + resolution: "@vladfrangu/async_event_emitter@npm:2.4.0" + checksum: dc22762fb3a46cd96fc0062974abc08a6f457c64890dcb4c431f82e4ba9155d2c2745cd331763d7d652f69a167ea4f4e2faa5be5c7fa8e56b6e2deeea9850da8 languageName: node linkType: hard -"abbrev@npm:^1.0.0": - version: 1.1.1 - resolution: "abbrev@npm:1.1.1" - checksum: a4a97ec07d7ea112c517036882b2ac22f3109b7b19077dc656316d07d308438aac28e4d9746dc4d84bf6b1e75b4a7b0a5f3cb30592419f128ca9a8cee3bcfa17 +"abbrev@npm:^2.0.0": + version: 2.0.0 + resolution: "abbrev@npm:2.0.0" + checksum: 0e994ad2aa6575f94670d8a2149afe94465de9cedaaaac364e7fb43a40c3691c980ff74899f682f4ca58fa96b4cbd7421a015d3a6defe43a442117d7821a2f36 languageName: node linkType: hard @@ -958,37 +873,30 @@ __metadata: languageName: node linkType: hard -"acorn-walk@npm:^8.2.0": - version: 8.2.0 - resolution: "acorn-walk@npm:8.2.0" - checksum: 1715e76c01dd7b2d4ca472f9c58968516a4899378a63ad5b6c2d668bba8da21a71976c14ec5f5b75f887b6317c4ae0b897ab141c831d741dc76024d8745f1ad1 +"acorn-walk@npm:^8.3.2": + version: 8.3.3 + resolution: "acorn-walk@npm:8.3.3" + dependencies: + acorn: ^8.11.0 + checksum: 0f09d351fc30b69b2b9982bf33dc30f3d35a34e030e5f1ed3c49fc4e3814a192bf3101e4c30912a0595410f5e91bb70ddba011ea73398b3ecbfe41c7334c6dd0 languageName: node linkType: hard -"acorn@npm:^8.10.0, acorn@npm:^8.9.0": - version: 8.10.0 - resolution: "acorn@npm:8.10.0" +"acorn@npm:^8.11.0, acorn@npm:^8.11.3, acorn@npm:^8.9.0": + version: 8.12.0 + resolution: "acorn@npm:8.12.0" bin: acorn: bin/acorn - checksum: 538ba38af0cc9e5ef983aee196c4b8b4d87c0c94532334fa7e065b2c8a1f85863467bb774231aae91613fcda5e68740c15d97b1967ae3394d20faddddd8af61d + checksum: ae142de8739ef15a5d936c550c1d267fc4dedcdbe62ad1aa2c0009afed1de84dd0a584684a5d200bb55d8db14f3e09a95c6e92a5303973c04b9a7413c36d1df0 languageName: node linkType: hard -"agent-base@npm:6, agent-base@npm:^6.0.2": - version: 6.0.2 - resolution: "agent-base@npm:6.0.2" +"agent-base@npm:^7.0.2, agent-base@npm:^7.1.0, agent-base@npm:^7.1.1": + version: 7.1.1 + resolution: "agent-base@npm:7.1.1" dependencies: - debug: 4 - checksum: f52b6872cc96fd5f622071b71ef200e01c7c4c454ee68bc9accca90c98cfb39f2810e3e9aa330435835eedc8c23f4f8a15267f67c6e245d2b33757575bdac49d - languageName: node - linkType: hard - -"agentkeepalive@npm:^4.2.1": - version: 4.5.0 - resolution: "agentkeepalive@npm:4.5.0" - dependencies: - humanize-ms: ^1.2.1 - checksum: 13278cd5b125e51eddd5079f04d6fe0914ac1b8b91c1f3db2c1822f99ac1a7457869068997784342fe455d59daaff22e14fb7b8c3da4e741896e7e31faf92481 + debug: ^4.3.4 + checksum: 51c158769c5c051482f9ca2e6e1ec085ac72b5a418a9b31b4e82fe6c0a6699adb94c1c42d246699a587b3335215037091c79e0de512c516f73b6ea844202f037 languageName: node linkType: hard @@ -1051,40 +959,6 @@ __metadata: languageName: node linkType: hard -"any-promise@npm:^1.0.0": - version: 1.3.0 - resolution: "any-promise@npm:1.3.0" - checksum: 0ee8a9bdbe882c90464d75d1f55cf027f5458650c4bd1f0467e65aec38ccccda07ca5844969ee77ed46d04e7dded3eaceb027e8d32f385688523fe305fa7e1de - languageName: node - linkType: hard - -"anymatch@npm:~3.1.2": - version: 3.1.3 - resolution: "anymatch@npm:3.1.3" - dependencies: - normalize-path: ^3.0.0 - picomatch: ^2.0.4 - checksum: 3e044fd6d1d26545f235a9fe4d7a534e2029d8e59fa7fd9f2a6eb21230f6b5380ea1eaf55136e60cbf8e613544b3b766e7a6fa2102e2a3a117505466e3025dc2 - languageName: node - linkType: hard - -"aproba@npm:^1.0.3 || ^2.0.0": - version: 2.0.0 - resolution: "aproba@npm:2.0.0" - checksum: 5615cadcfb45289eea63f8afd064ab656006361020e1735112e346593856f87435e02d8dcc7ff0d11928bc7d425f27bc7c2a84f6c0b35ab0ff659c814c138a24 - languageName: node - linkType: hard - -"are-we-there-yet@npm:^3.0.0": - version: 3.0.1 - resolution: "are-we-there-yet@npm:3.0.1" - dependencies: - delegates: ^1.0.0 - readable-stream: ^3.6.0 - checksum: 52590c24860fa7173bedeb69a4c05fb573473e860197f618b9a28432ee4379049336727ae3a1f9c4cb083114601c1140cee578376164d0e651217a9843f9fe83 - languageName: node - linkType: hard - "argparse@npm:^2.0.1": version: 2.0.1 resolution: "argparse@npm:2.0.1" @@ -1113,13 +987,6 @@ __metadata: languageName: node linkType: hard -"binary-extensions@npm:^2.0.0": - version: 2.2.0 - resolution: "binary-extensions@npm:2.2.0" - checksum: ccd267956c58d2315f5d3ea6757cf09863c5fc703e50fbeb13a7dc849b812ef76e3cf9ca8f35a0c48498776a7478d7b4a0418e1e2b8cb9cb9731f2922aaad7f8 - languageName: node - linkType: hard - "brace-expansion@npm:^1.1.7": version: 1.1.11 resolution: "brace-expansion@npm:1.1.11" @@ -1139,50 +1006,39 @@ __metadata: languageName: node linkType: hard -"braces@npm:^3.0.2, braces@npm:~3.0.2": - version: 3.0.2 - resolution: "braces@npm:3.0.2" +"braces@npm:^3.0.3": + version: 3.0.3 + resolution: "braces@npm:3.0.3" dependencies: - fill-range: ^7.0.1 - checksum: e2a8e769a863f3d4ee887b5fe21f63193a891c68b612ddb4b68d82d1b5f3ff9073af066c343e9867a393fe4c2555dcb33e89b937195feb9c1613d259edfcd459 + fill-range: ^7.1.1 + checksum: b95aa0b3bd909f6cd1720ffcf031aeaf46154dd88b4da01f9a1d3f7ea866a79eba76a6d01cbc3c422b2ee5cdc39a4f02491058d5df0d7bf6e6a162a832df1f69 languageName: node linkType: hard -"bundle-require@npm:^4.0.0": - version: 4.0.1 - resolution: "bundle-require@npm:4.0.1" - dependencies: - load-tsconfig: ^0.2.3 - peerDependencies: - esbuild: ">=0.17" - checksum: 737217e37b72d7bee431b5d839b86ba604430f3ec346f073071de2ce65f0915189d4394ddd4685e0366b2930f38c95742b58c7101b8c53d9a8381d453f0b3b8a - languageName: node - linkType: hard - -"cac@npm:^6.7.12, cac@npm:^6.7.14": +"cac@npm:^6.7.14": version: 6.7.14 resolution: "cac@npm:6.7.14" checksum: 45a2496a9443abbe7f52a49b22fbe51b1905eff46e03fd5e6c98e3f85077be3f8949685a1849b1a9cd2bc3e5567dfebcf64f01ce01847baf918f1b37c839791a languageName: node linkType: hard -"cacache@npm:^17.0.0": - version: 17.1.4 - resolution: "cacache@npm:17.1.4" +"cacache@npm:^18.0.0": + version: 18.0.3 + resolution: "cacache@npm:18.0.3" dependencies: "@npmcli/fs": ^3.1.0 fs-minipass: ^3.0.0 glob: ^10.2.2 - lru-cache: ^7.7.1 + lru-cache: ^10.0.1 minipass: ^7.0.3 - minipass-collect: ^1.0.2 + minipass-collect: ^2.0.1 minipass-flush: ^1.0.5 minipass-pipeline: ^1.2.4 p-map: ^4.0.0 ssri: ^10.0.0 tar: ^6.1.11 unique-filename: ^3.0.0 - checksum: b7751df756656954a51201335addced8f63fc53266fa56392c9f5ae83c8d27debffb4458ac2d168a744a4517ec3f2163af05c20097f93d17bdc2dc8a385e14a6 + checksum: b717fd9b36e9c3279bfde4545c3a8f6d5a539b084ee26a9504d48f83694beb724057d26e090b97540f9cc62bea18b9f6cf671c50e18fb7dac60eda9db691714f languageName: node linkType: hard @@ -1193,18 +1049,18 @@ __metadata: languageName: node linkType: hard -"chai@npm:^4.3.7": - version: 4.3.8 - resolution: "chai@npm:4.3.8" +"chai@npm:^4.3.10": + version: 4.4.1 + resolution: "chai@npm:4.4.1" dependencies: assertion-error: ^1.1.0 - check-error: ^1.0.2 - deep-eql: ^4.1.2 - get-func-name: ^2.0.0 - loupe: ^2.3.1 + check-error: ^1.0.3 + deep-eql: ^4.1.3 + get-func-name: ^2.0.2 + loupe: ^2.3.6 pathval: ^1.1.1 - type-detect: ^4.0.5 - checksum: 29e0984ed13308319cadc35437c8ef0a3e271544d226c991bf7e3b6d771bf89707321669e11d05e362bc0ad0bd26585079b989d1032f3c106e3bb95d7f079cce + type-detect: ^4.0.8 + checksum: 9ab84f36eb8e0b280c56c6c21ca4da5933132cd8a0c89c384f1497f77953640db0bc151edd47f81748240a9fab57b78f7d925edfeedc8e8fc98016d71f40c36e languageName: node linkType: hard @@ -1218,29 +1074,12 @@ __metadata: languageName: node linkType: hard -"check-error@npm:^1.0.2": - version: 1.0.2 - resolution: "check-error@npm:1.0.2" - checksum: d9d106504404b8addd1ee3f63f8c0eaa7cd962a1a28eb9c519b1c4a1dc7098be38007fc0060f045ee00f075fbb7a2a4f42abcf61d68323677e11ab98dc16042e - languageName: node - linkType: hard - -"chokidar@npm:^3.5.1": - version: 3.5.3 - resolution: "chokidar@npm:3.5.3" +"check-error@npm:^1.0.3": + version: 1.0.3 + resolution: "check-error@npm:1.0.3" dependencies: - anymatch: ~3.1.2 - braces: ~3.0.2 - fsevents: ~2.3.2 - glob-parent: ~5.1.2 - is-binary-path: ~2.1.0 - is-glob: ~4.0.1 - normalize-path: ~3.0.0 - readdirp: ~3.6.0 - dependenciesMeta: - fsevents: - optional: true - checksum: b49fcde40176ba007ff361b198a2d35df60d9bb2a5aab228279eb810feae9294a6b4649ab15981304447afe1e6ffbf4788ad5db77235dc770ab777c6e771980c + get-func-name: ^2.0.2 + checksum: e2131025cf059b21080f4813e55b3c480419256914601750b0fee3bd9b2b8315b531e551ef12560419b8b6d92a3636511322752b1ce905703239e7cc451b6399 languageName: node linkType: hard @@ -1274,22 +1113,6 @@ __metadata: languageName: node linkType: hard -"color-support@npm:^1.1.3": - version: 1.1.3 - resolution: "color-support@npm:1.1.3" - bin: - color-support: bin.js - checksum: 9b7356817670b9a13a26ca5af1c21615463b500783b739b7634a0c2047c16cef4b2865d7576875c31c3cddf9dd621fa19285e628f20198b233a5cfdda6d0793b - languageName: node - linkType: hard - -"commander@npm:^4.0.0": - version: 4.1.1 - resolution: "commander@npm:4.1.1" - checksum: d7b9913ff92cae20cb577a4ac6fcc121bd6223319e54a40f51a14740a681ad5c574fd29a57da478a5f234a6fa6c52cbf0b7c641353e03c648b1ae85ba670b977 - languageName: node - linkType: hard - "concat-map@npm:0.0.1": version: 0.0.1 resolution: "concat-map@npm:0.0.1" @@ -1297,10 +1120,20 @@ __metadata: languageName: node linkType: hard -"console-control-strings@npm:^1.1.0": - version: 1.1.0 - resolution: "console-control-strings@npm:1.1.0" - checksum: 8755d76787f94e6cf79ce4666f0c5519906d7f5b02d4b884cf41e11dcd759ed69c57da0670afd9236d229a46e0f9cf519db0cd829c6dca820bb5a5c3def584ed +"confbox@npm:^0.1.7": + version: 0.1.7 + resolution: "confbox@npm:0.1.7" + checksum: bde836c26f5154a348b0c0a757f8a0138929e5737e0553be3c4f07a056abca618b861aa63ac3b22d344789b56be99a1382928933e08cd500df00213bf4d8fb43 + languageName: node + linkType: hard + +"cron@npm:^3.1.7": + version: 3.1.7 + resolution: "cron@npm:3.1.7" + dependencies: + "@types/luxon": ~3.4.0 + luxon: ~3.4.0 + checksum: d98ee5297543c138221d96dd49270bf6576db80134e6041f4ce4a3c0cb6060863d76910209b34fee66fbf134461449ec3bd283d6a76d1c50da220cde7fc10c65 languageName: node linkType: hard @@ -1315,24 +1148,24 @@ __metadata: languageName: node linkType: hard -"debug@npm:4, debug@npm:^4.1.1, debug@npm:^4.3.1, debug@npm:^4.3.2, debug@npm:^4.3.3, debug@npm:^4.3.4": - version: 4.3.4 - resolution: "debug@npm:4.3.4" +"debug@npm:4, debug@npm:^4.3.1, debug@npm:^4.3.2, debug@npm:^4.3.4": + version: 4.3.5 + resolution: "debug@npm:4.3.5" dependencies: ms: 2.1.2 peerDependenciesMeta: supports-color: optional: true - checksum: 3dbad3f94ea64f34431a9cbf0bafb61853eda57bff2880036153438f50fb5a84f27683ba0d8e5426bf41a8c6ff03879488120cf5b3a761e77953169c0600a708 + checksum: 7c002b51e256257f936dda09eb37167df952758c57badf6bf44bdc40b89a4bcb8e5a0a2e4c7b53f97c69e2970dd5272d33a757378a12c8f8e64ea7bf99e8e86e languageName: node linkType: hard -"deep-eql@npm:^4.1.2": - version: 4.1.3 - resolution: "deep-eql@npm:4.1.3" +"deep-eql@npm:^4.1.3": + version: 4.1.4 + resolution: "deep-eql@npm:4.1.4" dependencies: type-detect: ^4.0.0 - checksum: 7f6d30cb41c713973dc07eaadded848b2ab0b835e518a88b91bea72f34e08c4c71d167a722a6f302d3a6108f05afd8e6d7650689a84d5d29ec7fe6220420397f + checksum: 01c3ca78ff40d79003621b157054871411f94228ceb9b2cab78da913c606631c46e8aa79efc4aa0faf3ace3092acd5221255aab3ef0e8e7b438834f0ca9a16c7 languageName: node linkType: hard @@ -1343,14 +1176,14 @@ __metadata: languageName: node linkType: hard -"delegates@npm:^1.0.0": - version: 1.0.0 - resolution: "delegates@npm:1.0.0" - checksum: a51744d9b53c164ba9c0492471a1a2ffa0b6727451bdc89e31627fdf4adda9d51277cfcbfb20f0a6f08ccb3c436f341df3e92631a3440226d93a8971724771fd +"deepmerge@npm:^4.3.1": + version: 4.3.1 + resolution: "deepmerge@npm:4.3.1" + checksum: 2024c6a980a1b7128084170c4cf56b0fd58a63f2da1660dcfe977415f27b17dbe5888668b59d0b063753f3220719d5e400b7f113609489c90160bb9a5518d052 languageName: node linkType: hard -"diff-sequences@npm:^29.4.3": +"diff-sequences@npm:^29.6.3": version: 29.6.3 resolution: "diff-sequences@npm:29.6.3" checksum: f4914158e1f2276343d98ff5b31fc004e7304f5470bf0f1adb2ac6955d85a531a6458d33e87667f98f6ae52ebd3891bb47d420bb48a5bd8b7a27ee25b20e33aa @@ -1366,32 +1199,30 @@ __metadata: languageName: node linkType: hard -"discord-api-types@npm:0.37.61": - version: 0.37.61 - resolution: "discord-api-types@npm:0.37.61" - checksum: fe33d528e31a6de0bab2afb43d0e058957a6da6cfc4d797943fac83aeb8d07543dc0f85cad3c4e6789cbbac0c7ca49dae5ac465224b129c7acb716097fa0b081 +"discord-api-types@npm:0.37.83": + version: 0.37.83 + resolution: "discord-api-types@npm:0.37.83" + checksum: ab2a31188352d9c742f09a114a95322e7f7de90199cb9f5571f7f5ac25765e7abc9b83c15c14d513ffc5e1d63d9e3ea5ff088fa8a1c5d9c1e1f395b27027cef0 languageName: node linkType: hard -"discord.js@npm:^14.11.0": - version: 14.14.1 - resolution: "discord.js@npm:14.14.1" +"discord.js@npm:^14.15.3": + version: 14.15.3 + resolution: "discord.js@npm:14.15.3" dependencies: - "@discordjs/builders": ^1.7.0 + "@discordjs/builders": ^1.8.2 "@discordjs/collection": 1.5.3 - "@discordjs/formatters": ^0.3.3 - "@discordjs/rest": ^2.1.0 - "@discordjs/util": ^1.0.2 - "@discordjs/ws": ^1.0.2 - "@sapphire/snowflake": 3.5.1 - "@types/ws": 8.5.9 - discord-api-types: 0.37.61 + "@discordjs/formatters": ^0.4.0 + "@discordjs/rest": ^2.3.0 + "@discordjs/util": ^1.1.0 + "@discordjs/ws": ^1.1.1 + "@sapphire/snowflake": 3.5.3 + discord-api-types: 0.37.83 fast-deep-equal: 3.1.3 lodash.snakecase: 4.1.1 tslib: 2.6.2 - undici: 5.27.2 - ws: 8.14.2 - checksum: 651e61861ae33e6ec3903e72a8bf229caae5dab73f8d409c3673430cafd9c438a0dd59983242bdcff47bab50da39f7a04da5b586c35b396c102e8e87637076e5 + undici: 6.13.0 + checksum: 0b521caee9040c3a39200e6bf01b60230e9abd89b13e632054be2a2e08b74708b0776dd61ccf5e737968c33907e824c7fca9aeb62a293700cd5d517ce82f795d languageName: node linkType: hard @@ -1448,33 +1279,36 @@ __metadata: languageName: node linkType: hard -"esbuild@npm:^0.17.6": - version: 0.17.19 - resolution: "esbuild@npm:0.17.19" +"esbuild@npm:^0.21.3": + version: 0.21.5 + resolution: "esbuild@npm:0.21.5" dependencies: - "@esbuild/android-arm": 0.17.19 - "@esbuild/android-arm64": 0.17.19 - "@esbuild/android-x64": 0.17.19 - "@esbuild/darwin-arm64": 0.17.19 - "@esbuild/darwin-x64": 0.17.19 - "@esbuild/freebsd-arm64": 0.17.19 - "@esbuild/freebsd-x64": 0.17.19 - "@esbuild/linux-arm": 0.17.19 - "@esbuild/linux-arm64": 0.17.19 - "@esbuild/linux-ia32": 0.17.19 - "@esbuild/linux-loong64": 0.17.19 - "@esbuild/linux-mips64el": 0.17.19 - "@esbuild/linux-ppc64": 0.17.19 - "@esbuild/linux-riscv64": 0.17.19 - "@esbuild/linux-s390x": 0.17.19 - "@esbuild/linux-x64": 0.17.19 - "@esbuild/netbsd-x64": 0.17.19 - "@esbuild/openbsd-x64": 0.17.19 - "@esbuild/sunos-x64": 0.17.19 - "@esbuild/win32-arm64": 0.17.19 - "@esbuild/win32-ia32": 0.17.19 - "@esbuild/win32-x64": 0.17.19 + "@esbuild/aix-ppc64": 0.21.5 + "@esbuild/android-arm": 0.21.5 + "@esbuild/android-arm64": 0.21.5 + "@esbuild/android-x64": 0.21.5 + "@esbuild/darwin-arm64": 0.21.5 + "@esbuild/darwin-x64": 0.21.5 + "@esbuild/freebsd-arm64": 0.21.5 + "@esbuild/freebsd-x64": 0.21.5 + "@esbuild/linux-arm": 0.21.5 + "@esbuild/linux-arm64": 0.21.5 + "@esbuild/linux-ia32": 0.21.5 + "@esbuild/linux-loong64": 0.21.5 + "@esbuild/linux-mips64el": 0.21.5 + "@esbuild/linux-ppc64": 0.21.5 + "@esbuild/linux-riscv64": 0.21.5 + "@esbuild/linux-s390x": 0.21.5 + "@esbuild/linux-x64": 0.21.5 + "@esbuild/netbsd-x64": 0.21.5 + "@esbuild/openbsd-x64": 0.21.5 + "@esbuild/sunos-x64": 0.21.5 + "@esbuild/win32-arm64": 0.21.5 + "@esbuild/win32-ia32": 0.21.5 + "@esbuild/win32-x64": 0.21.5 dependenciesMeta: + "@esbuild/aix-ppc64": + optional: true "@esbuild/android-arm": optional: true "@esbuild/android-arm64": @@ -1521,84 +1355,7 @@ __metadata: optional: true bin: esbuild: bin/esbuild - checksum: ac11b1a5a6008e4e37ccffbd6c2c054746fc58d0ed4a2f9ee643bd030cfcea9a33a235087bc777def8420f2eaafb3486e76adb7bdb7241a9143b43a69a10afd8 - languageName: node - linkType: hard - -"esbuild@npm:^0.18.10": - version: 0.18.20 - resolution: "esbuild@npm:0.18.20" - dependencies: - "@esbuild/android-arm": 0.18.20 - "@esbuild/android-arm64": 0.18.20 - "@esbuild/android-x64": 0.18.20 - "@esbuild/darwin-arm64": 0.18.20 - "@esbuild/darwin-x64": 0.18.20 - "@esbuild/freebsd-arm64": 0.18.20 - "@esbuild/freebsd-x64": 0.18.20 - "@esbuild/linux-arm": 0.18.20 - "@esbuild/linux-arm64": 0.18.20 - "@esbuild/linux-ia32": 0.18.20 - "@esbuild/linux-loong64": 0.18.20 - "@esbuild/linux-mips64el": 0.18.20 - "@esbuild/linux-ppc64": 0.18.20 - "@esbuild/linux-riscv64": 0.18.20 - "@esbuild/linux-s390x": 0.18.20 - "@esbuild/linux-x64": 0.18.20 - "@esbuild/netbsd-x64": 0.18.20 - "@esbuild/openbsd-x64": 0.18.20 - "@esbuild/sunos-x64": 0.18.20 - "@esbuild/win32-arm64": 0.18.20 - "@esbuild/win32-ia32": 0.18.20 - "@esbuild/win32-x64": 0.18.20 - dependenciesMeta: - "@esbuild/android-arm": - optional: true - "@esbuild/android-arm64": - optional: true - "@esbuild/android-x64": - optional: true - "@esbuild/darwin-arm64": - optional: true - "@esbuild/darwin-x64": - optional: true - "@esbuild/freebsd-arm64": - optional: true - "@esbuild/freebsd-x64": - optional: true - "@esbuild/linux-arm": - optional: true - "@esbuild/linux-arm64": - optional: true - "@esbuild/linux-ia32": - optional: true - "@esbuild/linux-loong64": - optional: true - "@esbuild/linux-mips64el": - optional: true - "@esbuild/linux-ppc64": - optional: true - "@esbuild/linux-riscv64": - optional: true - "@esbuild/linux-s390x": - optional: true - "@esbuild/linux-x64": - optional: true - "@esbuild/netbsd-x64": - optional: true - "@esbuild/openbsd-x64": - optional: true - "@esbuild/sunos-x64": - optional: true - "@esbuild/win32-arm64": - optional: true - "@esbuild/win32-ia32": - optional: true - "@esbuild/win32-x64": - optional: true - bin: - esbuild: bin/esbuild - checksum: 5d253614e50cdb6ec22095afd0c414f15688e7278a7eb4f3720a6dd1306b0909cf431e7b9437a90d065a31b1c57be60130f63fe3e8d0083b588571f31ee6ec7b + checksum: 2911c7b50b23a9df59a7d6d4cdd3a4f85855787f374dce751148dbb13305e0ce7e880dde1608c2ab7a927fc6cec3587b80995f7fc87a64b455f8b70b55fd8ec1 languageName: node linkType: hard @@ -1729,6 +1486,15 @@ __metadata: languageName: node linkType: hard +"estree-walker@npm:^3.0.3": + version: 3.0.3 + resolution: "estree-walker@npm:3.0.3" + dependencies: + "@types/estree": ^1.0.0 + checksum: a65728d5727b71de172c5df323385755a16c0fdab8234dc756c3854cfee343261ddfbb72a809a5660fac8c75d960bb3e21aa898c2d7e9b19bb298482ca58a3af + languageName: node + linkType: hard + "esutils@npm:^2.0.2": version: 2.0.3 resolution: "esutils@npm:2.0.3" @@ -1736,20 +1502,20 @@ __metadata: languageName: node linkType: hard -"execa@npm:^5.0.0": - version: 5.1.1 - resolution: "execa@npm:5.1.1" +"execa@npm:^8.0.1": + version: 8.0.1 + resolution: "execa@npm:8.0.1" dependencies: cross-spawn: ^7.0.3 - get-stream: ^6.0.0 - human-signals: ^2.1.0 - is-stream: ^2.0.0 + get-stream: ^8.0.1 + human-signals: ^5.0.0 + is-stream: ^3.0.0 merge-stream: ^2.0.0 - npm-run-path: ^4.0.1 - onetime: ^5.1.2 - signal-exit: ^3.0.3 - strip-final-newline: ^2.0.0 - checksum: fba9022c8c8c15ed862847e94c252b3d946036d7547af310e344a527e59021fd8b6bb0723883ea87044dc4f0201f949046993124a42ccb0855cae5bf8c786343 + npm-run-path: ^5.1.0 + onetime: ^6.0.0 + signal-exit: ^4.1.0 + strip-final-newline: ^3.0.0 + checksum: cac1bf86589d1d9b73bdc5dda65c52012d1a9619c44c526891956745f7b366ca2603d29fe3f7460bacc2b48c6eab5d6a4f7afe0534b31473d3708d1265545e1f languageName: node linkType: hard @@ -1768,15 +1534,15 @@ __metadata: linkType: hard "fast-glob@npm:^3.2.9": - version: 3.3.1 - resolution: "fast-glob@npm:3.3.1" + version: 3.3.2 + resolution: "fast-glob@npm:3.3.2" 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.4 - checksum: b6f3add6403e02cf3a798bfbb1183d0f6da2afd368f27456010c0bc1f9640aea308243d4cb2c0ab142f618276e65ecb8be1661d7c62a7b4e5ba774b9ce5432e5 + checksum: 900e4979f4dbc3313840078419245621259f349950411ca2fa445a2f9a1a6d98c3b5e7e0660c5ccd563aa61abe133a21765c6c0dec8e57da1ba71d8000b05ec1 languageName: node linkType: hard @@ -1795,11 +1561,11 @@ __metadata: linkType: hard "fastq@npm:^1.6.0": - version: 1.15.0 - resolution: "fastq@npm:1.15.0" + version: 1.17.1 + resolution: "fastq@npm:1.17.1" dependencies: reusify: ^1.0.4 - checksum: 0170e6bfcd5d57a70412440b8ef600da6de3b2a6c5966aeaf0a852d542daff506a0ee92d6de7679d1de82e644bce69d7a574a6c93f0b03964b5337eed75ada1a + checksum: a8c5b26788d5a1763f88bae56a8ddeee579f935a831c5fe7a8268cea5b0a91fbfe705f612209e02d639b881d7b48e461a50da4a10cfaa40da5ca7cc9da098d88 languageName: node linkType: hard @@ -1812,12 +1578,12 @@ __metadata: languageName: node linkType: hard -"fill-range@npm:^7.0.1": - version: 7.0.1 - resolution: "fill-range@npm:7.0.1" +"fill-range@npm:^7.1.1": + version: 7.1.1 + resolution: "fill-range@npm:7.1.1" dependencies: to-regex-range: ^5.0.1 - checksum: cc283f4e65b504259e64fd969bcf4def4eb08d85565e906b7d36516e87819db52029a76b6363d0f02d0d532f0033c9603b9e2d943d56ee3b0d4f7ad3328ff917 + checksum: b4abfbca3839a3d55e4ae5ec62e131e2e356bf4859ce8480c64c4876100f4df292a63e5bb1618e1d7460282ca2b305653064f01654474aa35c68000980f17798 languageName: node linkType: hard @@ -1832,30 +1598,30 @@ __metadata: linkType: hard "flat-cache@npm:^3.0.4": - version: 3.1.0 - resolution: "flat-cache@npm:3.1.0" + version: 3.2.0 + resolution: "flat-cache@npm:3.2.0" dependencies: - flatted: ^3.2.7 + flatted: ^3.2.9 keyv: ^4.5.3 rimraf: ^3.0.2 - checksum: 99312601d5b90f44aef403f17f056dc09be7e437703740b166cdc9386d99e681f74e6b6e8bd7d010bda66904ea643c9527276b1b80308a2119741d94108a4d8f + checksum: e7e0f59801e288b54bee5cb9681e9ee21ee28ef309f886b312c9d08415b79fc0f24ac842f84356ce80f47d6a53de62197ce0e6e148dc42d5db005992e2a756ec languageName: node linkType: hard -"flatted@npm:^3.2.7": - version: 3.2.7 - resolution: "flatted@npm:3.2.7" - checksum: 427633049d55bdb80201c68f7eb1cbd533e03eac541f97d3aecab8c5526f12a20ccecaeede08b57503e772c769e7f8680b37e8d482d1e5f8d7e2194687f9ea35 +"flatted@npm:^3.2.9": + version: 3.3.1 + resolution: "flatted@npm:3.3.1" + checksum: 85ae7181650bb728c221e7644cbc9f4bf28bc556f2fc89bb21266962bdf0ce1029cc7acc44bb646cd469d9baac7c317f64e841c4c4c00516afa97320cdac7f94 languageName: node linkType: hard "foreground-child@npm:^3.1.0": - version: 3.1.1 - resolution: "foreground-child@npm:3.1.1" + version: 3.2.1 + resolution: "foreground-child@npm:3.2.1" dependencies: cross-spawn: ^7.0.0 signal-exit: ^4.0.1 - checksum: 139d270bc82dc9e6f8bc045fe2aae4001dc2472157044fdfad376d0a3457f77857fa883c1c8b21b491c6caade9a926a4bed3d3d2e8d3c9202b151a4cbbd0bcd5 + checksum: 3e2e844d6003c96d70affe8ae98d7eaaba269a868c14d997620c088340a8775cd5d2d9043e6ceebae1928d8d9a874911c4d664b9a267e8995945df20337aebc0 languageName: node linkType: hard @@ -1884,7 +1650,7 @@ __metadata: languageName: node linkType: hard -"fsevents@npm:~2.3.2": +"fsevents@npm:~2.3.2, fsevents@npm:~2.3.3": version: 2.3.3 resolution: "fsevents@npm:2.3.3" dependencies: @@ -1894,7 +1660,7 @@ __metadata: languageName: node linkType: hard -"fsevents@patch:fsevents@~2.3.2#~builtin": +"fsevents@patch:fsevents@~2.3.2#~builtin, fsevents@patch:fsevents@~2.3.3#~builtin": version: 2.3.3 resolution: "fsevents@patch:fsevents@npm%3A2.3.3#~builtin::version=2.3.3&hash=df0bf1" dependencies: @@ -1903,37 +1669,21 @@ __metadata: languageName: node linkType: hard -"gauge@npm:^4.0.3": - version: 4.0.4 - resolution: "gauge@npm:4.0.4" - dependencies: - aproba: ^1.0.3 || ^2.0.0 - color-support: ^1.1.3 - console-control-strings: ^1.1.0 - has-unicode: ^2.0.1 - signal-exit: ^3.0.7 - string-width: ^4.2.3 - strip-ansi: ^6.0.1 - wide-align: ^1.1.5 - checksum: 788b6bfe52f1dd8e263cda800c26ac0ca2ff6de0b6eee2fe0d9e3abf15e149b651bd27bf5226be10e6e3edb5c4e5d5985a5a1a98137e7a892f75eff76467ad2d +"get-func-name@npm:^2.0.1, get-func-name@npm:^2.0.2": + version: 2.0.2 + resolution: "get-func-name@npm:2.0.2" + checksum: 3f62f4c23647de9d46e6f76d2b3eafe58933a9b3830c60669e4180d6c601ce1b4aa310ba8366143f55e52b139f992087a9f0647274e8745621fa2af7e0acf13b languageName: node linkType: hard -"get-func-name@npm:^2.0.0": - version: 2.0.0 - resolution: "get-func-name@npm:2.0.0" - checksum: 8d82e69f3e7fab9e27c547945dfe5cc0c57fc0adf08ce135dddb01081d75684a03e7a0487466f478872b341d52ac763ae49e660d01ab83741f74932085f693c3 +"get-stream@npm:^8.0.1": + version: 8.0.1 + resolution: "get-stream@npm:8.0.1" + checksum: 01e3d3cf29e1393f05f44d2f00445c5f9ec3d1c49e8179b31795484b9c117f4c695e5e07b88b50785d5c8248a788c85d9913a79266fc77e3ef11f78f10f1b974 languageName: node linkType: hard -"get-stream@npm:^6.0.0": - version: 6.0.1 - resolution: "get-stream@npm:6.0.1" - checksum: e04ecece32c92eebf5b8c940f51468cd53554dcbb0ea725b2748be583c9523d00128137966afce410b9b051eb2ef16d657cd2b120ca8edafcf5a65e81af63cad - languageName: node - linkType: hard - -"glob-parent@npm:^5.1.2, glob-parent@npm:~5.1.2": +"glob-parent@npm:^5.1.2": version: 5.1.2 resolution: "glob-parent@npm:5.1.2" dependencies: @@ -1951,36 +1701,23 @@ __metadata: languageName: node linkType: hard -"glob@npm:7.1.6": - version: 7.1.6 - resolution: "glob@npm:7.1.6" - dependencies: - fs.realpath: ^1.0.0 - inflight: ^1.0.4 - inherits: 2 - minimatch: ^3.0.4 - once: ^1.3.0 - path-is-absolute: ^1.0.0 - checksum: 351d549dd90553b87c2d3f90ce11aed9e1093c74130440e7ae0592e11bbcd2ce7f0ebb8ba6bfe63aaf9b62166a7f4c80cb84490ae5d78408bb2572bf7d4ee0a6 - languageName: node - linkType: hard - -"glob@npm:^10.2.2": - version: 10.3.4 - resolution: "glob@npm:10.3.4" +"glob@npm:^10.2.2, glob@npm:^10.3.10": + version: 10.4.2 + resolution: "glob@npm:10.4.2" dependencies: foreground-child: ^3.1.0 - jackspeak: ^2.0.3 - minimatch: ^9.0.1 - minipass: ^5.0.0 || ^6.0.2 || ^7.0.0 - path-scurry: ^1.10.1 + jackspeak: ^3.1.2 + minimatch: ^9.0.4 + minipass: ^7.1.2 + package-json-from-dist: ^1.0.0 + path-scurry: ^1.11.1 bin: - glob: dist/cjs/src/bin.js - checksum: 176b97c124414401cb51329a93d2ba112cef8814adbed10348481916b9521b677773eee2691cb6b24d66632d8c8bb8913533f5ac4bfb2d0ef5454a1856082361 + glob: dist/esm/bin.mjs + checksum: bd7c0e30701136e936f414e5f6f82c7f04503f01df77408f177aa584927412f0bde0338e6ec541618cd21eacc57dde33e7b3c6c0a779cc1c6e6a0e14f3d15d9b languageName: node linkType: hard -"glob@npm:^7.1.3, glob@npm:^7.1.4": +"glob@npm:^7.1.3": version: 7.2.3 resolution: "glob@npm:7.2.3" dependencies: @@ -1995,15 +1732,15 @@ __metadata: linkType: hard "globals@npm:^13.19.0": - version: 13.21.0 - resolution: "globals@npm:13.21.0" + version: 13.24.0 + resolution: "globals@npm:13.24.0" dependencies: type-fest: ^0.20.2 - checksum: 86c92ca8a04efd864c10852cd9abb1ebe6d447dcc72936783e66eaba1087d7dba5c9c3421a48d6ca722c319378754dbcc3f3f732dbe47592d7de908edf58a773 + checksum: 56066ef058f6867c04ff203b8a44c15b038346a62efbc3060052a1016be9f56f4cf0b2cd45b74b22b81e521a889fc7786c73691b0549c2f3a6e825b3d394f43c languageName: node linkType: hard -"globby@npm:^11.0.3, globby@npm:^11.1.0": +"globby@npm:^11.1.0": version: 11.1.0 resolution: "globby@npm:11.1.0" dependencies: @@ -2038,13 +1775,6 @@ __metadata: languageName: node linkType: hard -"has-unicode@npm:^2.0.1": - version: 2.0.1 - resolution: "has-unicode@npm:2.0.1" - checksum: 1eab07a7436512db0be40a710b29b5dc21fa04880b7f63c9980b706683127e3c1b57cb80ea96d47991bdae2dfe479604f6a1ba410106ee1046a41d1bd0814400 - languageName: node - linkType: hard - "http-cache-semantics@npm:^4.1.1": version: 4.1.1 resolution: "http-cache-semantics@npm:4.1.1" @@ -2052,40 +1782,30 @@ __metadata: languageName: node linkType: hard -"http-proxy-agent@npm:^5.0.0": +"http-proxy-agent@npm:^7.0.0": + version: 7.0.2 + resolution: "http-proxy-agent@npm:7.0.2" + dependencies: + agent-base: ^7.1.0 + debug: ^4.3.4 + checksum: 670858c8f8f3146db5889e1fa117630910101db601fff7d5a8aa637da0abedf68c899f03d3451cac2f83bcc4c3d2dabf339b3aa00ff8080571cceb02c3ce02f3 + languageName: node + linkType: hard + +"https-proxy-agent@npm:^7.0.1": + version: 7.0.5 + resolution: "https-proxy-agent@npm:7.0.5" + dependencies: + agent-base: ^7.0.2 + debug: 4 + checksum: 2e1a28960f13b041a50702ee74f240add8e75146a5c37fc98f1960f0496710f6918b3a9fe1e5aba41e50f58e6df48d107edd9c405c5f0d73ac260dabf2210857 + languageName: node + linkType: hard + +"human-signals@npm:^5.0.0": version: 5.0.0 - resolution: "http-proxy-agent@npm:5.0.0" - dependencies: - "@tootallnate/once": 2 - agent-base: 6 - debug: 4 - checksum: e2ee1ff1656a131953839b2a19cd1f3a52d97c25ba87bd2559af6ae87114abf60971e498021f9b73f9fd78aea8876d1fb0d4656aac8a03c6caa9fc175f22b786 - languageName: node - linkType: hard - -"https-proxy-agent@npm:^5.0.0": - version: 5.0.1 - resolution: "https-proxy-agent@npm:5.0.1" - dependencies: - agent-base: 6 - debug: 4 - checksum: 571fccdf38184f05943e12d37d6ce38197becdd69e58d03f43637f7fa1269cf303a7d228aa27e5b27bbd3af8f09fd938e1c91dcfefff2df7ba77c20ed8dfc765 - languageName: node - linkType: hard - -"human-signals@npm:^2.1.0": - version: 2.1.0 - resolution: "human-signals@npm:2.1.0" - checksum: b87fd89fce72391625271454e70f67fe405277415b48bcc0117ca73d31fa23a4241787afdc8d67f5a116cf37258c052f59ea82daffa72364d61351423848e3b8 - languageName: node - linkType: hard - -"humanize-ms@npm:^1.2.1": - version: 1.2.1 - resolution: "humanize-ms@npm:1.2.1" - dependencies: - ms: ^2.0.0 - checksum: 9c7a74a2827f9294c009266c82031030eae811ca87b0da3dceb8d6071b9bde22c9f3daef0469c3c533cc67a97d8a167cd9fc0389350e5f415f61a79b171ded16 + resolution: "human-signals@npm:5.0.0" + checksum: 6504560d5ed91444f16bea3bd9dfc66110a339442084e56c3e7fa7bbdf3f406426d6563d662bdce67064b165eac31eeabfc0857ed170aaa612cf14ec9f9a464c languageName: node linkType: hard @@ -2099,9 +1819,9 @@ __metadata: linkType: hard "ignore@npm:^5.2.0": - version: 5.2.4 - resolution: "ignore@npm:5.2.4" - checksum: 3d4c309c6006e2621659311783eaea7ebcd41fe4ca1d78c91c473157ad6666a57a2df790fe0d07a12300d9aac2888204d7be8d59f9aaf665b1c7fcdb432517ef + version: 5.3.1 + resolution: "ignore@npm:5.3.1" + checksum: 71d7bb4c1dbe020f915fd881108cbe85a0db3d636a0ea3ba911393c53946711d13a9b1143c7e70db06d571a5822c0a324a6bcde5c9904e7ca5047f01f1bf8cd3 languageName: node linkType: hard @@ -2139,26 +1859,20 @@ __metadata: languageName: node linkType: hard -"inherits@npm:2, inherits@npm:^2.0.3": +"inherits@npm:2": version: 2.0.4 resolution: "inherits@npm:2.0.4" checksum: 4a48a733847879d6cf6691860a6b1e3f0f4754176e4d71494c41f3475553768b10f84b5ce1d40fbd0e34e6bfbb864ee35858ad4dd2cf31e02fc4a154b724d7f1 languageName: node linkType: hard -"ip@npm:^2.0.0": - version: 2.0.0 - resolution: "ip@npm:2.0.0" - checksum: cfcfac6b873b701996d71ec82a7dd27ba92450afdb421e356f44044ed688df04567344c36cbacea7d01b1c39a4c732dc012570ebe9bebfb06f27314bca625349 - languageName: node - linkType: hard - -"is-binary-path@npm:~2.1.0": - version: 2.1.0 - resolution: "is-binary-path@npm:2.1.0" +"ip-address@npm:^9.0.5": + version: 9.0.5 + resolution: "ip-address@npm:9.0.5" dependencies: - binary-extensions: ^2.0.0 - checksum: 84192eb88cff70d320426f35ecd63c3d6d495da9d805b19bc65b518984b7c0760280e57dbf119b7e9be6b161784a5a673ab2c6abe83abb5198a432232ad5b35c + jsbn: 1.1.0 + sprintf-js: ^1.1.3 + checksum: aa15f12cfd0ef5e38349744e3654bae649a34c3b10c77a674a167e99925d1549486c5b14730eebce9fea26f6db9d5e42097b00aa4f9f612e68c79121c71652dc languageName: node linkType: hard @@ -2176,7 +1890,7 @@ __metadata: languageName: node linkType: hard -"is-glob@npm:^4.0.0, is-glob@npm:^4.0.1, is-glob@npm:^4.0.3, is-glob@npm:~4.0.1": +"is-glob@npm:^4.0.0, is-glob@npm:^4.0.1, is-glob@npm:^4.0.3": version: 4.0.3 resolution: "is-glob@npm:4.0.3" dependencies: @@ -2206,10 +1920,10 @@ __metadata: languageName: node linkType: hard -"is-stream@npm:^2.0.0": - version: 2.0.1 - resolution: "is-stream@npm:2.0.1" - checksum: b8e05ccdf96ac330ea83c12450304d4a591f9958c11fd17bed240af8d5ffe08aedafa4c0f4cfccd4d28dc9d4d129daca1023633d5c11601a6cbc77521f6fae66 +"is-stream@npm:^3.0.0": + version: 3.0.0 + resolution: "is-stream@npm:3.0.0" + checksum: 172093fe99119ffd07611ab6d1bcccfe8bc4aa80d864b15f43e63e54b7abc71e779acd69afdb854c4e2a67fdc16ae710e370eda40088d1cfc956a50ed82d8f16 languageName: node linkType: hard @@ -2220,32 +1934,23 @@ __metadata: languageName: node linkType: hard -"iti@npm:^0.6.0": - version: 0.6.0 - resolution: "iti@npm:0.6.0" - dependencies: - utility-types: ^3.10.0 - checksum: 19e484aa8b00bf57642c73c56b658d06d70d7b5acf5725a6aca9948c6b3c8d1fab18d71fb25f482a13d8c6acac137799fa80e7dbdc97cc24ed5afc94f03811e3 +"isexe@npm:^3.1.1": + version: 3.1.1 + resolution: "isexe@npm:3.1.1" + checksum: 7fe1931ee4e88eb5aa524cd3ceb8c882537bc3a81b02e438b240e47012eef49c86904d0f0e593ea7c3a9996d18d0f1f3be8d3eaa92333977b0c3a9d353d5563e languageName: node linkType: hard -"jackspeak@npm:^2.0.3": - version: 2.3.3 - resolution: "jackspeak@npm:2.3.3" +"jackspeak@npm:^3.1.2": + version: 3.4.0 + resolution: "jackspeak@npm:3.4.0" dependencies: "@isaacs/cliui": ^8.0.2 "@pkgjs/parseargs": ^0.11.0 dependenciesMeta: "@pkgjs/parseargs": optional: true - checksum: 4313a7c0cc44c7753c4cb9869935f0b06f4cf96827515f63f58ff46b3d2f6e29aba6b3b5151778397c3f5ae67ef8bfc48871967bd10343c27e90cff198ec7808 - languageName: node - linkType: hard - -"joycon@npm:^3.0.1": - version: 3.1.1 - resolution: "joycon@npm:3.1.1" - checksum: 8003c9c3fc79c5c7602b1c7e9f7a2df2e9916f046b0dbad862aa589be78c15734d11beb9fe846f5e06138df22cb2ad29961b6a986ba81c4920ce2b15a7f11067 + checksum: 350f6f311018bb175ffbe736b19c26ac0b134bb5a17a638169e89594eb0c24ab1c658ab3a2fda24ff63b3b19292e1a5ec19d2255bc526df704e8168d392bef85 languageName: node linkType: hard @@ -2256,6 +1961,13 @@ __metadata: languageName: node linkType: hard +"js-tokens@npm:^9.0.0": + version: 9.0.0 + resolution: "js-tokens@npm:9.0.0" + checksum: 427d0db681caab0c906cfc78a0235bbe7b41712cee83f3f14785c1de079a1b1a85693cc8f99a3f71685d0d76acaa5b9c8920850b67f93d3eeb7ef186987d186c + languageName: node + linkType: hard + "js-yaml@npm:^4.1.0": version: 4.1.0 resolution: "js-yaml@npm:4.1.0" @@ -2267,6 +1979,13 @@ __metadata: languageName: node linkType: hard +"jsbn@npm:1.1.0": + version: 1.1.0 + resolution: "jsbn@npm:1.1.0" + checksum: 944f924f2bd67ad533b3850eee47603eed0f6ae425fd1ee8c760f477e8c34a05f144c1bd4f5a5dd1963141dc79a2c55f89ccc5ab77d039e7077f3ad196b64965 + languageName: node + linkType: hard + "json-buffer@npm:3.0.1": version: 3.0.1 resolution: "json-buffer@npm:3.0.1" @@ -2288,19 +2007,12 @@ __metadata: languageName: node linkType: hard -"jsonc-parser@npm:^3.2.0": - version: 3.2.0 - resolution: "jsonc-parser@npm:3.2.0" - checksum: 946dd9a5f326b745aa326d48a7257e3f4a4b62c5e98ec8e49fa2bdd8d96cef7e6febf1399f5c7016114fd1f68a1c62c6138826d5d90bc650448e3cf0951c53c7 - languageName: node - linkType: hard - "keyv@npm:^4.5.3": - version: 4.5.3 - resolution: "keyv@npm:4.5.3" + version: 4.5.4 + resolution: "keyv@npm:4.5.4" dependencies: json-buffer: 3.0.1 - checksum: 3ffb4d5b72b6b4b4af443bbb75ca2526b23c750fccb5ac4c267c6116888b4b65681015c2833cb20d26cf3e6e32dac6b988c77f7f022e1a571b7d90f1442257da + checksum: 74a24395b1c34bd44ad5cb2b49140d087553e170625240b86755a6604cd65aa16efdbdeae5cdb17ba1284a0fbb25ad06263755dbc71b8d8b06f74232ce3cdd72 languageName: node linkType: hard @@ -2314,31 +2026,13 @@ __metadata: languageName: node linkType: hard -"lilconfig@npm:^2.0.5": - version: 2.1.0 - resolution: "lilconfig@npm:2.1.0" - checksum: 8549bb352b8192375fed4a74694cd61ad293904eee33f9d4866c2192865c44c4eb35d10782966242634e0cbc1e91fe62b1247f148dc5514918e3a966da7ea117 - languageName: node - linkType: hard - -"lines-and-columns@npm:^1.1.6": - version: 1.2.4 - resolution: "lines-and-columns@npm:1.2.4" - checksum: 0c37f9f7fa212b38912b7145e1cd16a5f3cd34d782441c3e6ca653485d326f58b3caccda66efce1c5812bde4961bbde3374fae4b0d11bf1226152337f3894aa5 - languageName: node - linkType: hard - -"load-tsconfig@npm:^0.2.3": - version: 0.2.5 - resolution: "load-tsconfig@npm:0.2.5" - checksum: 631740833c4a7157bb7b6eeae6e1afb6a6fac7416b7ba91bd0944d5c5198270af2d68bf8347af3cc2ba821adc4d83ef98f66278bd263bc284c863a09ec441503 - languageName: node - linkType: hard - -"local-pkg@npm:^0.4.3": - version: 0.4.3 - resolution: "local-pkg@npm:0.4.3" - checksum: 7825aca531dd6afa3a3712a0208697aa4a5cd009065f32e3fb732aafcc42ed11f277b5ac67229222e96f4def55197171cdf3d5522d0381b489d2e5547b407d55 +"local-pkg@npm:^0.5.0": + version: 0.5.0 + resolution: "local-pkg@npm:0.5.0" + dependencies: + mlly: ^1.4.2 + pkg-types: ^1.0.3 + checksum: b0a6931e588ad4f7bf4ab49faacf49e07fc4d05030f895aa055d46727a15b99300d39491cf2c3e3f05284aec65565fb760debb74c32e64109f4a101f9300d81a languageName: node linkType: hard @@ -2365,13 +2059,6 @@ __metadata: languageName: node linkType: hard -"lodash.sortby@npm:^4.7.0": - version: 4.7.0 - resolution: "lodash.sortby@npm:4.7.0" - checksum: db170c9396d29d11fe9a9f25668c4993e0c1331bcb941ddbd48fb76f492e732add7f2a47cfdf8e9d740fa59ac41bbfaf931d268bc72aab3ab49e9f89354d718c - languageName: node - linkType: hard - "lodash@npm:^4.17.21": version: 4.17.21 resolution: "lodash@npm:4.17.21" @@ -2379,74 +2066,62 @@ __metadata: languageName: node linkType: hard -"loupe@npm:^2.3.1, loupe@npm:^2.3.6": - version: 2.3.6 - resolution: "loupe@npm:2.3.6" +"loupe@npm:^2.3.6, loupe@npm:^2.3.7": + version: 2.3.7 + resolution: "loupe@npm:2.3.7" dependencies: - get-func-name: ^2.0.0 - checksum: cc83f1b124a1df7384601d72d8d1f5fe95fd7a8185469fec48bb2e4027e45243949e7a013e8d91051a138451ff0552310c32aa9786e60b6a30d1e801bdc2163f + get-func-name: ^2.0.1 + checksum: 96c058ec7167598e238bb7fb9def2f9339215e97d6685d9c1e3e4bdb33d14600e11fe7a812cf0c003dfb73ca2df374f146280b2287cae9e8d989e9d7a69a203b languageName: node linkType: hard -"lru-cache@npm:^6.0.0": - version: 6.0.0 - resolution: "lru-cache@npm:6.0.0" - dependencies: - yallist: ^4.0.0 - checksum: f97f499f898f23e4585742138a22f22526254fdba6d75d41a1c2526b3b6cc5747ef59c5612ba7375f42aca4f8461950e925ba08c991ead0651b4918b7c978297 +"lru-cache@npm:^10.0.1, lru-cache@npm:^10.2.0": + version: 10.3.0 + resolution: "lru-cache@npm:10.3.0" + checksum: f2289639bd94cf3c87bfd8a77ac991f9afe3af004ddca3548c3dae63ead1c73bba449a60a4e270992e16cf3261b3d4130943234d52ca3a4d4de2fc074a3cc7b5 languageName: node linkType: hard -"lru-cache@npm:^7.7.1": - version: 7.18.3 - resolution: "lru-cache@npm:7.18.3" - checksum: e550d772384709deea3f141af34b6d4fa392e2e418c1498c078de0ee63670f1f46f5eee746e8ef7e69e1c895af0d4224e62ee33e66a543a14763b0f2e74c1356 +"luxon@npm:~3.4.0": + version: 3.4.4 + resolution: "luxon@npm:3.4.4" + checksum: 36c1f99c4796ee4bfddf7dc94fa87815add43ebc44c8934c924946260a58512f0fd2743a629302885df7f35ccbd2d13f178c15df046d0e3b6eb71db178f1c60c languageName: node linkType: hard -"lru-cache@npm:^9.1.1 || ^10.0.0": - version: 10.0.1 - resolution: "lru-cache@npm:10.0.1" - checksum: 06f8d0e1ceabd76bb6f644a26dbb0b4c471b79c7b514c13c6856113879b3bf369eb7b497dad4ff2b7e2636db202412394865b33c332100876d838ad1372f0181 +"magic-bytes.js@npm:^1.10.0": + version: 1.10.0 + resolution: "magic-bytes.js@npm:1.10.0" + checksum: c10e7fc3fe584e4b0767554fb6a12dfc4a9db0782d5005cbdd46bc9b36a8bb420f5266a4b02e089ea4db587937fde289ea467a7a379ad969fb906bf4a0ec3f38 languageName: node linkType: hard -"magic-bytes.js@npm:^1.5.0": - version: 1.7.0 - resolution: "magic-bytes.js@npm:1.7.0" - checksum: c36cc3fa828ff27fc752998593dde7be8083b3608e0acec3b5091221fdea2d43b16c13ed368d5c406a120eb3812bcfe060d0aec5919e711ea780088c5b379050 - languageName: node - linkType: hard - -"magic-string@npm:^0.30.1": - version: 0.30.3 - resolution: "magic-string@npm:0.30.3" +"magic-string@npm:^0.30.5": + version: 0.30.10 + resolution: "magic-string@npm:0.30.10" dependencies: "@jridgewell/sourcemap-codec": ^1.4.15 - checksum: a5a9ddf9bd3bf49a2de1048bf358464f1bda7b3cc1311550f4a0ba8f81a4070e25445d53a5ee28850161336f1bff3cf28aa3320c6b4aeff45ce3e689f300b2f3 + checksum: 456fd47c39b296c47dff967e1965121ace35417eab7f45a99e681e725b8661b48e1573c366ee67a27715025b3740773c46b088f115421c7365ea4ea6fa10d399 languageName: node linkType: hard -"make-fetch-happen@npm:^11.0.3": - version: 11.1.1 - resolution: "make-fetch-happen@npm:11.1.1" +"make-fetch-happen@npm:^13.0.0": + version: 13.0.1 + resolution: "make-fetch-happen@npm:13.0.1" dependencies: - agentkeepalive: ^4.2.1 - cacache: ^17.0.0 + "@npmcli/agent": ^2.0.0 + cacache: ^18.0.0 http-cache-semantics: ^4.1.1 - http-proxy-agent: ^5.0.0 - https-proxy-agent: ^5.0.0 is-lambda: ^1.0.1 - lru-cache: ^7.7.1 - minipass: ^5.0.0 + minipass: ^7.0.2 minipass-fetch: ^3.0.0 minipass-flush: ^1.0.5 minipass-pipeline: ^1.2.4 negotiator: ^0.6.3 + proc-log: ^4.2.0 promise-retry: ^2.0.1 - socks-proxy-agent: ^7.0.0 ssri: ^10.0.0 - checksum: 7268bf274a0f6dcf0343829489a4506603ff34bd0649c12058753900b0eb29191dce5dba12680719a5d0a983d3e57810f594a12f3c18494e93a1fbc6348a4540 + checksum: 5c9fad695579b79488fa100da05777213dd9365222f85e4757630f8dd2a21a79ddd3206c78cfd6f9b37346819681782b67900ac847a57cf04190f52dda5343fd languageName: node linkType: hard @@ -2465,23 +2140,23 @@ __metadata: linkType: hard "micromatch@npm:^4.0.4": - version: 4.0.5 - resolution: "micromatch@npm:4.0.5" + version: 4.0.7 + resolution: "micromatch@npm:4.0.7" dependencies: - braces: ^3.0.2 + braces: ^3.0.3 picomatch: ^2.3.1 - checksum: 02a17b671c06e8fefeeb6ef996119c1e597c942e632a21ef589154f23898c9c6a9858526246abb14f8bca6e77734aa9dcf65476fca47cedfb80d9577d52843fc + checksum: 3cde047d70ad80cf60c787b77198d680db3b8c25b23feb01de5e2652205d9c19f43bd81882f69a0fd1f0cde6a7a122d774998aad3271ddb1b8accf8a0f480cf7 languageName: node linkType: hard -"mimic-fn@npm:^2.1.0": - version: 2.1.0 - resolution: "mimic-fn@npm:2.1.0" - checksum: d2421a3444848ce7f84bd49115ddacff29c15745db73f54041edc906c14b131a38d05298dae3081667627a59b2eb1ca4b436ff2e1b80f69679522410418b478a +"mimic-fn@npm:^4.0.0": + version: 4.0.0 + resolution: "mimic-fn@npm:4.0.0" + checksum: 995dcece15ee29aa16e188de6633d43a3db4611bcf93620e7e62109ec41c79c0f34277165b8ce5e361205049766e371851264c21ac64ca35499acb5421c2ba56 languageName: node linkType: hard -"minimatch@npm:^3.0.4, minimatch@npm:^3.0.5, minimatch@npm:^3.1.1, minimatch@npm:^3.1.2": +"minimatch@npm:^3.0.5, minimatch@npm:^3.1.1, minimatch@npm:^3.1.2": version: 3.1.2 resolution: "minimatch@npm:3.1.2" dependencies: @@ -2490,27 +2165,27 @@ __metadata: languageName: node linkType: hard -"minimatch@npm:^9.0.1": - version: 9.0.3 - resolution: "minimatch@npm:9.0.3" +"minimatch@npm:^9.0.4": + version: 9.0.5 + resolution: "minimatch@npm:9.0.5" dependencies: brace-expansion: ^2.0.1 - checksum: 253487976bf485b612f16bf57463520a14f512662e592e95c571afdab1442a6a6864b6c88f248ce6fc4ff0b6de04ac7aa6c8bb51e868e99d1d65eb0658a708b5 + checksum: 2c035575eda1e50623c731ec6c14f65a85296268f749b9337005210bb2b34e2705f8ef1a358b188f69892286ab99dc42c8fb98a57bde55c8d81b3023c19cea28 languageName: node linkType: hard -"minipass-collect@npm:^1.0.2": - version: 1.0.2 - resolution: "minipass-collect@npm:1.0.2" +"minipass-collect@npm:^2.0.1": + version: 2.0.1 + resolution: "minipass-collect@npm:2.0.1" dependencies: - minipass: ^3.0.0 - checksum: 14df761028f3e47293aee72888f2657695ec66bd7d09cae7ad558da30415fdc4752bbfee66287dcc6fd5e6a2fa3466d6c484dc1cbd986525d9393b9523d97f10 + minipass: ^7.0.3 + checksum: b251bceea62090f67a6cced7a446a36f4cd61ee2d5cea9aee7fff79ba8030e416327a1c5aa2908dc22629d06214b46d88fdab8c51ac76bacbf5703851b5ad342 languageName: node linkType: hard "minipass-fetch@npm:^3.0.0": - version: 3.0.4 - resolution: "minipass-fetch@npm:3.0.4" + version: 3.0.5 + resolution: "minipass-fetch@npm:3.0.5" dependencies: encoding: ^0.1.13 minipass: ^7.0.3 @@ -2519,7 +2194,7 @@ __metadata: dependenciesMeta: encoding: optional: true - checksum: af7aad15d5c128ab1ebe52e043bdf7d62c3c6f0cecb9285b40d7b395e1375b45dcdfd40e63e93d26a0e8249c9efd5c325c65575aceee192883970ff8cb11364a + checksum: 8047d273236157aab27ab7cd8eab7ea79e6ecd63e8f80c3366ec076cb9a0fed550a6935bab51764369027c414647fd8256c2a20c5445fb250c483de43350de83 languageName: node linkType: hard @@ -2566,10 +2241,10 @@ __metadata: languageName: node linkType: hard -"minipass@npm:^5.0.0 || ^6.0.2 || ^7.0.0, minipass@npm:^7.0.3": - version: 7.0.3 - resolution: "minipass@npm:7.0.3" - checksum: 6f1614f5b5b55568a46bca5fec0e7c46dac027691db27d0e1923a8192866903144cd962ac772c0e9f89b608ea818b702709c042bce98e190d258847d85461531 +"minipass@npm:^5.0.0 || ^6.0.2 || ^7.0.0, minipass@npm:^7.0.2, minipass@npm:^7.0.3, minipass@npm:^7.1.2": + version: 7.1.2 + resolution: "minipass@npm:7.1.2" + checksum: 2bfd325b95c555f2b4d2814d49325691c7bee937d753814861b0b49d5edcda55cbbf22b6b6a60bb91eddac8668771f03c5ff647dcd9d0f798e9548b9cdc46ee3 languageName: node linkType: hard @@ -2592,15 +2267,15 @@ __metadata: languageName: node linkType: hard -"mlly@npm:^1.2.0, mlly@npm:^1.4.0": - version: 1.4.2 - resolution: "mlly@npm:1.4.2" +"mlly@npm:^1.4.2, mlly@npm:^1.7.0": + version: 1.7.1 + resolution: "mlly@npm:1.7.1" dependencies: - acorn: ^8.10.0 - pathe: ^1.1.1 - pkg-types: ^1.0.3 - ufo: ^1.3.0 - checksum: ad0813eca133e59ac03b356b87deea57da96083dce7dda58a8eeb2dce92b7cc2315bedd9268f3ff8e98effe1867ddb1307486d4c5cd8be162daa8e0fa0a98ed4 + acorn: ^8.11.3 + pathe: ^1.1.2 + pkg-types: ^1.1.1 + ufo: ^1.5.3 + checksum: 956a6d54119eef782f302580f63a9800654e588cd70015b4218a00069c6ef11b87984e8ffe140a4668b0100ad4022b11d1f9b11ac2c6dbafa4d8bc33ae3a08a8 languageName: node linkType: hard @@ -2611,30 +2286,12 @@ __metadata: languageName: node linkType: hard -"ms@npm:^2.0.0": - version: 2.1.3 - resolution: "ms@npm:2.1.3" - checksum: aa92de608021b242401676e35cfa5aa42dd70cbdc082b916da7fb925c542173e36bce97ea3e804923fe92c0ad991434e4a38327e15a1b5b5f945d66df615ae6d - languageName: node - linkType: hard - -"mz@npm:^2.7.0": - version: 2.7.0 - resolution: "mz@npm:2.7.0" - dependencies: - any-promise: ^1.0.0 - object-assign: ^4.0.1 - thenify-all: ^1.0.0 - checksum: 8427de0ece99a07e9faed3c0c6778820d7543e3776f9a84d22cf0ec0a8eb65f6e9aee9c9d353ff9a105ff62d33a9463c6ca638974cc652ee8140cd1e35951c87 - languageName: node - linkType: hard - -"nanoid@npm:^3.3.6": - version: 3.3.6 - resolution: "nanoid@npm:3.3.6" +"nanoid@npm:^3.3.7": + version: 3.3.7 + resolution: "nanoid@npm:3.3.7" bin: nanoid: bin/nanoid.cjs - checksum: 7d0eda657002738aa5206107bd0580aead6c95c460ef1bdd0b1a87a9c7ae6277ac2e9b945306aaa5b32c6dcb7feaf462d0f552e7f8b5718abfc6ead5c94a71b3 + checksum: d36c427e530713e4ac6567d488b489a36582ef89da1d6d4e3b87eded11eb10d7042a877958c6f104929809b2ab0bafa17652b076cdf84324aa75b30b722204f2 languageName: node linkType: hard @@ -2660,69 +2317,42 @@ __metadata: linkType: hard "node-gyp@npm:latest": - version: 9.4.0 - resolution: "node-gyp@npm:9.4.0" + version: 10.1.0 + resolution: "node-gyp@npm:10.1.0" dependencies: env-paths: ^2.2.0 exponential-backoff: ^3.1.1 - glob: ^7.1.4 + glob: ^10.3.10 graceful-fs: ^4.2.6 - make-fetch-happen: ^11.0.3 - nopt: ^6.0.0 - npmlog: ^6.0.0 - rimraf: ^3.0.2 + make-fetch-happen: ^13.0.0 + nopt: ^7.0.0 + proc-log: ^3.0.0 semver: ^7.3.5 tar: ^6.1.2 - which: ^2.0.2 + which: ^4.0.0 bin: node-gyp: bin/node-gyp.js - checksum: 78b404e2e0639d64e145845f7f5a3cb20c0520cdaf6dda2f6e025e9b644077202ea7de1232396ba5bde3fee84cdc79604feebe6ba3ec84d464c85d407bb5da99 + checksum: 72e2ab4b23fc32007a763da94018f58069fc0694bf36115d49a2b195c8831e12cf5dd1e7a3718fa85c06969aedf8fc126722d3b672ec1cb27e06ed33caee3c60 languageName: node linkType: hard -"nopt@npm:^6.0.0": - version: 6.0.0 - resolution: "nopt@npm:6.0.0" +"nopt@npm:^7.0.0": + version: 7.2.1 + resolution: "nopt@npm:7.2.1" dependencies: - abbrev: ^1.0.0 + abbrev: ^2.0.0 bin: nopt: bin/nopt.js - checksum: 82149371f8be0c4b9ec2f863cc6509a7fd0fa729929c009f3a58e4eb0c9e4cae9920e8f1f8eb46e7d032fec8fb01bede7f0f41a67eb3553b7b8e14fa53de1dac + checksum: 6fa729cc77ce4162cfad8abbc9ba31d4a0ff6850c3af61d59b505653bef4781ec059f8890ecfe93ee8aa0c511093369cca88bfc998101616a2904e715bbbb7c9 languageName: node linkType: hard -"normalize-path@npm:^3.0.0, normalize-path@npm:~3.0.0": - version: 3.0.0 - resolution: "normalize-path@npm:3.0.0" - checksum: 88eeb4da891e10b1318c4b2476b6e2ecbeb5ff97d946815ffea7794c31a89017c70d7f34b3c2ebf23ef4e9fc9fb99f7dffe36da22011b5b5c6ffa34f4873ec20 - languageName: node - linkType: hard - -"npm-run-path@npm:^4.0.1": - version: 4.0.1 - resolution: "npm-run-path@npm:4.0.1" +"npm-run-path@npm:^5.1.0": + version: 5.3.0 + resolution: "npm-run-path@npm:5.3.0" dependencies: - path-key: ^3.0.0 - checksum: 5374c0cea4b0bbfdfae62da7bbdf1e1558d338335f4cacf2515c282ff358ff27b2ecb91ffa5330a8b14390ac66a1e146e10700440c1ab868208430f56b5f4d23 - languageName: node - linkType: hard - -"npmlog@npm:^6.0.0": - version: 6.0.2 - resolution: "npmlog@npm:6.0.2" - dependencies: - are-we-there-yet: ^3.0.0 - console-control-strings: ^1.1.0 - gauge: ^4.0.3 - set-blocking: ^2.0.0 - checksum: ae238cd264a1c3f22091cdd9e2b106f684297d3c184f1146984ecbe18aaa86343953f26b9520dedd1b1372bc0316905b736c1932d778dbeb1fcf5a1001390e2a - languageName: node - linkType: hard - -"object-assign@npm:^4.0.1": - version: 4.1.1 - resolution: "object-assign@npm:4.1.1" - checksum: fcc6e4ea8c7fe48abfbb552578b1c53e0d194086e2e6bbbf59e0a536381a292f39943c6e9628af05b5528aa5e3318bb30d6b2e53cadaf5b8fe9e12c4b69af23f + path-key: ^4.0.0 + checksum: ae8e7a89da9594fb9c308f6555c73f618152340dcaae423e5fb3620026fefbec463618a8b761920382d666fa7a2d8d240b6fe320e8a6cdd54dc3687e2b659d25 languageName: node linkType: hard @@ -2735,26 +2365,26 @@ __metadata: languageName: node linkType: hard -"onetime@npm:^5.1.2": - version: 5.1.2 - resolution: "onetime@npm:5.1.2" +"onetime@npm:^6.0.0": + version: 6.0.0 + resolution: "onetime@npm:6.0.0" dependencies: - mimic-fn: ^2.1.0 - checksum: 2478859ef817fc5d4e9c2f9e5728512ddd1dbc9fb7829ad263765bb6d3b91ce699d6e2332eef6b7dff183c2f490bd3349f1666427eaba4469fba0ac38dfd0d34 + mimic-fn: ^4.0.0 + checksum: 0846ce78e440841335d4e9182ef69d5762e9f38aa7499b19f42ea1c4cd40f0b4446094c455c713f9adac3f4ae86f613bb5e30c99e52652764d06a89f709b3788 languageName: node linkType: hard "optionator@npm:^0.9.1": - version: 0.9.3 - resolution: "optionator@npm:0.9.3" + version: 0.9.4 + resolution: "optionator@npm:0.9.4" dependencies: - "@aashutoshrathi/word-wrap": ^1.2.3 deep-is: ^0.1.3 fast-levenshtein: ^2.0.6 levn: ^0.4.1 prelude-ls: ^1.2.1 type-check: ^0.4.0 - checksum: 09281999441f2fe9c33a5eeab76700795365a061563d66b098923eb719251a42bdbe432790d35064d0816ead9296dbeb1ad51a733edf4167c96bd5d0882e428a + word-wrap: ^1.2.5 + checksum: ecbd010e3dc73e05d239976422d9ef54a82a13f37c11ca5911dff41c98a6c7f0f163b27f922c37e7f8340af9d36febd3b6e9cef508f3339d4c393d7276d716bb languageName: node linkType: hard @@ -2767,12 +2397,12 @@ __metadata: languageName: node linkType: hard -"p-limit@npm:^4.0.0": - version: 4.0.0 - resolution: "p-limit@npm:4.0.0" +"p-limit@npm:^5.0.0": + version: 5.0.0 + resolution: "p-limit@npm:5.0.0" dependencies: yocto-queue: ^1.0.0 - checksum: 01d9d70695187788f984226e16c903475ec6a947ee7b21948d6f597bed788e3112cc7ec2e171c1d37125057a5f45f3da21d8653e04a3a793589e12e9e80e756b + checksum: 87bf5837dee6942f0dbeff318436179931d9a97848d1b07dbd86140a477a5d2e6b90d9701b210b4e21fe7beaea2979dfde366e4f576fa644a59bd4d6a6371da7 languageName: node linkType: hard @@ -2794,6 +2424,13 @@ __metadata: languageName: node linkType: hard +"package-json-from-dist@npm:^1.0.0": + version: 1.0.0 + resolution: "package-json-from-dist@npm:1.0.0" + checksum: ac706ec856a5a03f5261e4e48fa974f24feb044d51f84f8332e2af0af04fbdbdd5bbbfb9cbbe354190409bc8307c83a9e38c6672c3c8855f709afb0006a009ea + languageName: node + linkType: hard + "parent-module@npm:^1.0.0": version: 1.0.1 resolution: "parent-module@npm:1.0.1" @@ -2817,20 +2454,27 @@ __metadata: languageName: node linkType: hard -"path-key@npm:^3.0.0, path-key@npm:^3.1.0": +"path-key@npm:^3.1.0": version: 3.1.1 resolution: "path-key@npm:3.1.1" checksum: 55cd7a9dd4b343412a8386a743f9c746ef196e57c823d90ca3ab917f90ab9f13dd0ded27252ba49dbdfcab2b091d998bc446f6220cd3cea65db407502a740020 languageName: node linkType: hard -"path-scurry@npm:^1.10.1": - version: 1.10.1 - resolution: "path-scurry@npm:1.10.1" +"path-key@npm:^4.0.0": + version: 4.0.0 + resolution: "path-key@npm:4.0.0" + checksum: 8e6c314ae6d16b83e93032c61020129f6f4484590a777eed709c4a01b50e498822b00f76ceaf94bc64dbd90b327df56ceadce27da3d83393790f1219e07721d7 + languageName: node + linkType: hard + +"path-scurry@npm:^1.11.1": + version: 1.11.1 + resolution: "path-scurry@npm:1.11.1" dependencies: - lru-cache: ^9.1.1 || ^10.0.0 + lru-cache: ^10.2.0 minipass: ^5.0.0 || ^6.0.2 || ^7.0.0 - checksum: e2557cff3a8fb8bc07afdd6ab163a92587884f9969b05bbbaf6fe7379348bfb09af9ed292af12ed32398b15fb443e81692047b786d1eeb6d898a51eb17ed7d90 + checksum: 890d5abcd593a7912dcce7cf7c6bf7a0b5648e3dee6caf0712c126ca0a65c7f3d7b9d769072a4d1baf370f61ce493ab5b038d59988688e0c5f3f646ee3c69023 languageName: node linkType: hard @@ -2841,10 +2485,10 @@ __metadata: languageName: node linkType: hard -"pathe@npm:^1.1.0, pathe@npm:^1.1.1": - version: 1.1.1 - resolution: "pathe@npm:1.1.1" - checksum: 34ab3da2e5aa832ebc6a330ffe3f73d7ba8aec6e899b53b8ec4f4018de08e40742802deb12cf5add9c73b7bf719b62c0778246bd376ca62b0fb23e0dde44b759 +"pathe@npm:^1.1.1, pathe@npm:^1.1.2": + version: 1.1.2 + resolution: "pathe@npm:1.1.2" + checksum: ec5f778d9790e7b9ffc3e4c1df39a5bb1ce94657a4e3ad830c1276491ca9d79f189f47609884671db173400256b005f4955f7952f52a2aeb5834ad5fb4faf134 languageName: node linkType: hard @@ -2855,64 +2499,39 @@ __metadata: languageName: node linkType: hard -"picocolors@npm:^1.0.0": - version: 1.0.0 - resolution: "picocolors@npm:1.0.0" - checksum: a2e8092dd86c8396bdba9f2b5481032848525b3dc295ce9b57896f931e63fc16f79805144321f72976383fc249584672a75cc18d6777c6b757603f372f745981 +"picocolors@npm:^1.0.0, picocolors@npm:^1.0.1": + version: 1.0.1 + resolution: "picocolors@npm:1.0.1" + checksum: fa68166d1f56009fc02a34cdfd112b0dd3cf1ef57667ac57281f714065558c01828cdf4f18600ad6851cbe0093952ed0660b1e0156bddf2184b6aaf5817553a5 languageName: node linkType: hard -"picomatch@npm:^2.0.4, picomatch@npm:^2.2.1, picomatch@npm:^2.3.1": +"picomatch@npm:^2.3.1": version: 2.3.1 resolution: "picomatch@npm:2.3.1" checksum: 050c865ce81119c4822c45d3c84f1ced46f93a0126febae20737bd05ca20589c564d6e9226977df859ed5e03dc73f02584a2b0faad36e896936238238b0446cf languageName: node linkType: hard -"pirates@npm:^4.0.1": - version: 4.0.6 - resolution: "pirates@npm:4.0.6" - checksum: 46a65fefaf19c6f57460388a5af9ab81e3d7fd0e7bc44ca59d753cb5c4d0df97c6c6e583674869762101836d68675f027d60f841c105d72734df9dfca97cbcc6 +"pkg-types@npm:^1.0.3, pkg-types@npm:^1.1.1": + version: 1.1.1 + resolution: "pkg-types@npm:1.1.1" + dependencies: + confbox: ^0.1.7 + mlly: ^1.7.0 + pathe: ^1.1.2 + checksum: 78ee49eea8c03802ffbdc79dfb6a741f905a4053453280cd2f1149850523fdaf46d39ecb88c2c2f757cceb9883f234bb0e56371084b5895632bdb00ef0f7298f languageName: node linkType: hard -"pkg-types@npm:^1.0.3": - version: 1.0.3 - resolution: "pkg-types@npm:1.0.3" +"postcss@npm:^8.4.38": + version: 8.4.39 + resolution: "postcss@npm:8.4.39" dependencies: - jsonc-parser: ^3.2.0 - mlly: ^1.2.0 - pathe: ^1.1.0 - checksum: 4b305c834b912ddcc8a0fe77530c0b0321fe340396f84cbb87aecdbc126606f47f2178f23b8639e71a4870f9631c7217aef52ffed0ae17ea2dbbe7e43d116a6e - languageName: node - linkType: hard - -"postcss-load-config@npm:^3.0.1": - version: 3.1.4 - resolution: "postcss-load-config@npm:3.1.4" - dependencies: - lilconfig: ^2.0.5 - yaml: ^1.10.2 - peerDependencies: - postcss: ">=8.0.9" - ts-node: ">=9.0.0" - peerDependenciesMeta: - postcss: - optional: true - ts-node: - optional: true - checksum: 1c589504c2d90b1568aecae8238ab993c17dba2c44f848a8f13619ba556d26a1c09644d5e6361b5784e721e94af37b604992f9f3dc0483e687a0cc1cc5029a34 - languageName: node - linkType: hard - -"postcss@npm:^8.4.27": - version: 8.4.29 - resolution: "postcss@npm:8.4.29" - dependencies: - nanoid: ^3.3.6 - picocolors: ^1.0.0 - source-map-js: ^1.0.2 - checksum: dd6daa25e781db9ae5b651d9b7bfde0ec6e60e86a37da69a18eb4773d5ddd51e28fc4ff054fbdc04636a31462e6bf09a1e50986f69ac52b10d46b7457cd36d12 + nanoid: ^3.3.7 + picocolors: ^1.0.1 + source-map-js: ^1.2.0 + checksum: 14b130c90f165961772bdaf99c67f907f3d16494adf0868e57ef68baa67e0d1f6762db9d41ab0f4d09bab6fb7888588dba3596afd1a235fd5c2d43fba7006ac6 languageName: node linkType: hard @@ -2923,23 +2542,28 @@ __metadata: languageName: node linkType: hard -"prettier@npm:2.8.8": - version: 2.8.8 - resolution: "prettier@npm:2.8.8" - bin: - prettier: bin-prettier.js - checksum: b49e409431bf129dd89238d64299ba80717b57ff5a6d1c1a8b1a28b590d998a34e083fa13573bc732bb8d2305becb4c9a4407f8486c81fa7d55100eb08263cf8 - languageName: node - linkType: hard - -"pretty-format@npm:^29.5.0": - version: 29.6.3 - resolution: "pretty-format@npm:29.6.3" +"pretty-format@npm:^29.7.0": + version: 29.7.0 + resolution: "pretty-format@npm:29.7.0" dependencies: "@jest/schemas": ^29.6.3 ansi-styles: ^5.0.0 react-is: ^18.0.0 - checksum: 4e1c0db48e65571c22e80ff92123925ff8b3a2a89b71c3a1683cfde711004d492de32fe60c6bc10eea8bf6c678e5cbe544ac6c56cb8096e1eb7caf856928b1c4 + checksum: 032c1602383e71e9c0c02a01bbd25d6759d60e9c7cf21937dde8357aa753da348fcec5def5d1002c9678a8524d5fe099ad98861286550ef44de8808cc61e43b6 + languageName: node + linkType: hard + +"proc-log@npm:^3.0.0": + version: 3.0.0 + resolution: "proc-log@npm:3.0.0" + checksum: 02b64e1b3919e63df06f836b98d3af002b5cd92655cab18b5746e37374bfb73e03b84fe305454614b34c25b485cc687a9eebdccf0242cda8fda2475dd2c97e02 + languageName: node + linkType: hard + +"proc-log@npm:^4.2.0": + version: 4.2.0 + resolution: "proc-log@npm:4.2.0" + checksum: 98f6cd012d54b5334144c5255ecb941ee171744f45fca8b43b58ae5a0c1af07352475f481cadd9848e7f0250376ee584f6aa0951a856ff8f021bdfbff4eb33fc languageName: node linkType: hard @@ -2954,9 +2578,9 @@ __metadata: linkType: hard "punycode@npm:^2.1.0": - version: 2.3.0 - resolution: "punycode@npm:2.3.0" - checksum: 39f760e09a2a3bbfe8f5287cf733ecdad69d6af2fe6f97ca95f24b8921858b91e9ea3c9eeec6e08cede96181b3bb33f95c6ffd8c77e63986508aa2e8159fa200 + version: 2.3.1 + resolution: "punycode@npm:2.3.1" + checksum: bb0a0ceedca4c3c57a9b981b90601579058903c62be23c5e8e843d2c2d4148a3ecf029d5133486fb0e1822b098ba8bba09e89d6b21742d02fa26bda6441a6fb2 languageName: node linkType: hard @@ -2968,29 +2592,9 @@ __metadata: linkType: hard "react-is@npm:^18.0.0": - version: 18.2.0 - resolution: "react-is@npm:18.2.0" - checksum: e72d0ba81b5922759e4aff17e0252bd29988f9642ed817f56b25a3e217e13eea8a7f2322af99a06edb779da12d5d636e9fda473d620df9a3da0df2a74141d53e - languageName: node - linkType: hard - -"readable-stream@npm:^3.6.0": - version: 3.6.2 - resolution: "readable-stream@npm:3.6.2" - dependencies: - inherits: ^2.0.3 - string_decoder: ^1.1.1 - util-deprecate: ^1.0.1 - checksum: bdcbe6c22e846b6af075e32cf8f4751c2576238c5043169a1c221c92ee2878458a816a4ea33f4c67623c0b6827c8a400409bfb3cf0bf3381392d0b1dfb52ac8d - languageName: node - linkType: hard - -"readdirp@npm:~3.6.0": - version: 3.6.0 - resolution: "readdirp@npm:3.6.0" - dependencies: - picomatch: ^2.2.1 - checksum: 1ced032e6e45670b6d7352d71d21ce7edf7b9b928494dcaba6f11fba63180d9da6cd7061ebc34175ffda6ff529f481818c962952004d273178acd70f7059b320 + version: 18.3.1 + resolution: "react-is@npm:18.3.1" + checksum: e20fe84c86ff172fc8d898251b7cc2c43645d108bf96d0b8edf39b98f9a2cae97b40520ee7ed8ee0085ccc94736c4886294456033304151c3f94978cec03df21 languageName: node linkType: hard @@ -3001,13 +2605,6 @@ __metadata: languageName: node linkType: hard -"resolve-from@npm:^5.0.0": - version: 5.0.0 - resolution: "resolve-from@npm:5.0.0" - checksum: 4ceeb9113e1b1372d0cd969f3468fa042daa1dd9527b1b6bb88acb6ab55d8b9cd65dbf18819f9f9ddf0db804990901dcdaade80a215e7b2c23daae38e64f5bdf - languageName: node - linkType: hard - "retry@npm:^0.12.0": version: 0.12.0 resolution: "retry@npm:0.12.0" @@ -3033,17 +2630,66 @@ __metadata: languageName: node linkType: hard -"rollup@npm:^3.2.5, rollup@npm:^3.27.1": - version: 3.28.1 - resolution: "rollup@npm:3.28.1" +"rollup@npm:^4.13.0": + version: 4.18.0 + resolution: "rollup@npm:4.18.0" dependencies: + "@rollup/rollup-android-arm-eabi": 4.18.0 + "@rollup/rollup-android-arm64": 4.18.0 + "@rollup/rollup-darwin-arm64": 4.18.0 + "@rollup/rollup-darwin-x64": 4.18.0 + "@rollup/rollup-linux-arm-gnueabihf": 4.18.0 + "@rollup/rollup-linux-arm-musleabihf": 4.18.0 + "@rollup/rollup-linux-arm64-gnu": 4.18.0 + "@rollup/rollup-linux-arm64-musl": 4.18.0 + "@rollup/rollup-linux-powerpc64le-gnu": 4.18.0 + "@rollup/rollup-linux-riscv64-gnu": 4.18.0 + "@rollup/rollup-linux-s390x-gnu": 4.18.0 + "@rollup/rollup-linux-x64-gnu": 4.18.0 + "@rollup/rollup-linux-x64-musl": 4.18.0 + "@rollup/rollup-win32-arm64-msvc": 4.18.0 + "@rollup/rollup-win32-ia32-msvc": 4.18.0 + "@rollup/rollup-win32-x64-msvc": 4.18.0 + "@types/estree": 1.0.5 fsevents: ~2.3.2 dependenciesMeta: + "@rollup/rollup-android-arm-eabi": + optional: true + "@rollup/rollup-android-arm64": + optional: true + "@rollup/rollup-darwin-arm64": + optional: true + "@rollup/rollup-darwin-x64": + optional: true + "@rollup/rollup-linux-arm-gnueabihf": + optional: true + "@rollup/rollup-linux-arm-musleabihf": + optional: true + "@rollup/rollup-linux-arm64-gnu": + optional: true + "@rollup/rollup-linux-arm64-musl": + optional: true + "@rollup/rollup-linux-powerpc64le-gnu": + optional: true + "@rollup/rollup-linux-riscv64-gnu": + optional: true + "@rollup/rollup-linux-s390x-gnu": + optional: true + "@rollup/rollup-linux-x64-gnu": + optional: true + "@rollup/rollup-linux-x64-musl": + optional: true + "@rollup/rollup-win32-arm64-msvc": + optional: true + "@rollup/rollup-win32-ia32-msvc": + optional: true + "@rollup/rollup-win32-x64-msvc": + optional: true fsevents: optional: true bin: rollup: dist/bin/rollup - checksum: 1fcab0929c16130218447c76c19b56ccc0e677110552462297e3679188fc70185a6ec418cef8ce138ec9fb78fd5188537a3f5d28762788e8c88b12a7fb8ba0fb + checksum: 54cde921e763017ce952ba76ec77d58dd9c01e3536c3be628d4af8c59d9b2f0e1e6a11b30fda44845c7b74098646cd972feb3bcd2f4a35d3293366f2eeb0a39e languageName: node linkType: hard @@ -3065,13 +2711,6 @@ __metadata: languageName: node linkType: hard -"safe-buffer@npm:~5.2.0": - version: 5.2.1 - resolution: "safe-buffer@npm:5.2.1" - checksum: b99c4b41fdd67a6aaf280fcd05e9ffb0813654894223afb78a31f14a19ad220bba8aba1cb14eddce1fcfb037155fe6de4e861784eb434f7d11ed58d1e70dd491 - languageName: node - linkType: hard - "safer-buffer@npm:>= 2.1.2 < 3.0.0": version: 2.1.2 resolution: "safer-buffer@npm:2.1.2" @@ -3080,20 +2719,11 @@ __metadata: linkType: hard "semver@npm:^7.3.5, semver@npm:^7.3.7": - version: 7.5.4 - resolution: "semver@npm:7.5.4" - dependencies: - lru-cache: ^6.0.0 + version: 7.6.2 + resolution: "semver@npm:7.6.2" bin: semver: bin/semver.js - checksum: 12d8ad952fa353b0995bf180cdac205a4068b759a140e5d3c608317098b3575ac2f1e09182206bf2eb26120e1c0ed8fb92c48c592f6099680de56bb071423ca3 - languageName: node - linkType: hard - -"set-blocking@npm:^2.0.0": - version: 2.0.0 - resolution: "set-blocking@npm:2.0.0" - checksum: 6e65a05f7cf7ebdf8b7c75b101e18c0b7e3dff4940d480efed8aad3a36a4005140b660fa1d804cb8bce911cac290441dc728084a30504d3516ac2ff7ad607b02 + checksum: 40f6a95101e8d854357a644da1b8dd9d93ce786d5c6a77227bc69dbb17bea83d0d1d1d7c4cd5920a6df909f48e8bd8a5909869535007f90278289f2451d0292d languageName: node linkType: hard @@ -3120,14 +2750,7 @@ __metadata: languageName: node linkType: hard -"signal-exit@npm:^3.0.3, signal-exit@npm:^3.0.7": - version: 3.0.7 - resolution: "signal-exit@npm:3.0.7" - checksum: a2f098f247adc367dffc27845853e9959b9e88b01cb301658cfe4194352d8d2bb32e18467c786a7fe15f1d44b233ea35633d076d5e737870b7139949d1ab6318 - languageName: node - linkType: hard - -"signal-exit@npm:^4.0.1": +"signal-exit@npm:^4.0.1, signal-exit@npm:^4.1.0": version: 4.1.0 resolution: "signal-exit@npm:4.1.0" checksum: 64c757b498cb8629ffa5f75485340594d2f8189e9b08700e69199069c8e3070fb3e255f7ab873c05dc0b3cec412aea7402e10a5990cb6a050bd33ba062a6c549 @@ -3148,49 +2771,47 @@ __metadata: languageName: node linkType: hard -"socks-proxy-agent@npm:^7.0.0": - version: 7.0.0 - resolution: "socks-proxy-agent@npm:7.0.0" +"socks-proxy-agent@npm:^8.0.3": + version: 8.0.4 + resolution: "socks-proxy-agent@npm:8.0.4" dependencies: - agent-base: ^6.0.2 - debug: ^4.3.3 - socks: ^2.6.2 - checksum: 720554370154cbc979e2e9ce6a6ec6ced205d02757d8f5d93fe95adae454fc187a5cbfc6b022afab850a5ce9b4c7d73e0f98e381879cf45f66317a4895953846 + agent-base: ^7.1.1 + debug: ^4.3.4 + socks: ^2.8.3 + checksum: b2ec5051d85fe49072f9a250c427e0e9571fd09d5db133819192d078fd291276e1f0f50f6dbc04329b207738b1071314cee8bdbb4b12e27de42dbcf1d4233c67 languageName: node linkType: hard -"socks@npm:^2.6.2": - version: 2.7.1 - resolution: "socks@npm:2.7.1" +"socks@npm:^2.8.3": + version: 2.8.3 + resolution: "socks@npm:2.8.3" dependencies: - ip: ^2.0.0 + ip-address: ^9.0.5 smart-buffer: ^4.2.0 - checksum: 259d9e3e8e1c9809a7f5c32238c3d4d2a36b39b83851d0f573bfde5f21c4b1288417ce1af06af1452569cd1eb0841169afd4998f0e04ba04656f6b7f0e46d748 + checksum: 7a6b7f6eedf7482b9e4597d9a20e09505824208006ea8f2c49b71657427f3c137ca2ae662089baa73e1971c62322d535d9d0cf1c9235cf6f55e315c18203eadd languageName: node linkType: hard -"source-map-js@npm:^1.0.2": - version: 1.0.2 - resolution: "source-map-js@npm:1.0.2" - checksum: c049a7fc4deb9a7e9b481ae3d424cc793cb4845daa690bc5a05d428bf41bf231ced49b4cf0c9e77f9d42fdb3d20d6187619fc586605f5eabe995a316da8d377c +"source-map-js@npm:^1.2.0": + version: 1.2.0 + resolution: "source-map-js@npm:1.2.0" + checksum: 791a43306d9223792e84293b00458bf102a8946e7188f3db0e4e22d8d530b5f80a4ce468eb5ec0bf585443ad55ebbd630bf379c98db0b1f317fd902500217f97 languageName: node linkType: hard -"source-map@npm:0.8.0-beta.0": - version: 0.8.0-beta.0 - resolution: "source-map@npm:0.8.0-beta.0" - dependencies: - whatwg-url: ^7.0.0 - checksum: e94169be6461ab0ac0913313ad1719a14c60d402bd22b0ad96f4a6cffd79130d91ab5df0a5336a326b04d2df131c1409f563c9dc0d21a6ca6239a44b6c8dbd92 +"sprintf-js@npm:^1.1.3": + version: 1.1.3 + resolution: "sprintf-js@npm:1.1.3" + checksum: a3fdac7b49643875b70864a9d9b469d87a40dfeaf5d34d9d0c5b1cda5fd7d065531fcb43c76357d62254c57184a7b151954156563a4d6a747015cfb41021cad0 languageName: node linkType: hard "ssri@npm:^10.0.0": - version: 10.0.5 - resolution: "ssri@npm:10.0.5" + version: 10.0.6 + resolution: "ssri@npm:10.0.6" dependencies: minipass: ^7.0.3 - checksum: 0a31b65f21872dea1ed3f7c200d7bc1c1b91c15e419deca14f282508ba917cbb342c08a6814c7f68ca4ca4116dd1a85da2bbf39227480e50125a1ceffeecb750 + checksum: 4603d53a05bcd44188747d38f1cc43833b9951b5a1ee43ba50535bdfc5fe4a0897472dbe69837570a5417c3c073377ef4f8c1a272683b401857f72738ee57299 languageName: node linkType: hard @@ -3201,14 +2822,14 @@ __metadata: languageName: node linkType: hard -"std-env@npm:^3.3.3": - version: 3.4.3 - resolution: "std-env@npm:3.4.3" - checksum: bef186fb2baddda31911234b1e58fa18f181eb6930616aaec3b54f6d5db65f2da5daaa5f3b326b98445a7d50ca81d6fe8809ab4ebab85ecbe4a802f1b40921bf +"std-env@npm:^3.5.0": + version: 3.7.0 + resolution: "std-env@npm:3.7.0" + checksum: 4f489d13ff2ab838c9acd4ed6b786b51aa52ecacdfeaefe9275fcb220ff2ac80c6e95674723508fd29850a694569563a8caaaea738eb82ca16429b3a0b50e510 languageName: node linkType: hard -"string-width-cjs@npm:string-width@^4.2.0, string-width@npm:^1.0.2 || 2 || 3 || 4, string-width@npm:^4.1.0, string-width@npm:^4.2.3": +"string-width-cjs@npm:string-width@^4.2.0, string-width@npm:^4.1.0": version: 4.2.3 resolution: "string-width@npm:4.2.3" dependencies: @@ -3230,15 +2851,6 @@ __metadata: languageName: node linkType: hard -"string_decoder@npm:^1.1.1": - version: 1.3.0 - resolution: "string_decoder@npm:1.3.0" - dependencies: - safe-buffer: ~5.2.0 - checksum: 8417646695a66e73aefc4420eb3b84cc9ffd89572861fe004e6aeb13c7bc00e2f616247505d2dbbef24247c372f70268f594af7126f43548565c68c117bdeb56 - languageName: node - linkType: hard - "strip-ansi-cjs@npm:strip-ansi@^6.0.1, strip-ansi@npm:^6.0.0, strip-ansi@npm:^6.0.1": version: 6.0.1 resolution: "strip-ansi@npm:6.0.1" @@ -3257,10 +2869,10 @@ __metadata: languageName: node linkType: hard -"strip-final-newline@npm:^2.0.0": - version: 2.0.0 - resolution: "strip-final-newline@npm:2.0.0" - checksum: 69412b5e25731e1938184b5d489c32e340605bb611d6140344abc3421b7f3c6f9984b21dff296dfcf056681b82caa3bb4cc996a965ce37bcfad663e92eae9c64 +"strip-final-newline@npm:^3.0.0": + version: 3.0.0 + resolution: "strip-final-newline@npm:3.0.0" + checksum: 23ee263adfa2070cd0f23d1ac14e2ed2f000c9b44229aec9c799f1367ec001478469560abefd00c5c99ee6f0b31c137d53ec6029c53e9f32a93804e18c201050 languageName: node linkType: hard @@ -3271,30 +2883,12 @@ __metadata: languageName: node linkType: hard -"strip-literal@npm:^1.0.1": - version: 1.3.0 - resolution: "strip-literal@npm:1.3.0" +"strip-literal@npm:^2.0.0": + version: 2.1.0 + resolution: "strip-literal@npm:2.1.0" dependencies: - acorn: ^8.10.0 - checksum: f5fa7e289df8ebe82e90091fd393974faf8871be087ca50114327506519323cf15f2f8fee6ebe68b5e58bfc795269cae8bdc7cb5a83e27b02b3fe953f37b0a89 - languageName: node - linkType: hard - -"sucrase@npm:^3.20.3": - version: 3.34.0 - resolution: "sucrase@npm:3.34.0" - dependencies: - "@jridgewell/gen-mapping": ^0.3.2 - commander: ^4.0.0 - glob: 7.1.6 - lines-and-columns: ^1.1.6 - mz: ^2.7.0 - pirates: ^4.0.1 - ts-interface-checker: ^0.1.9 - bin: - sucrase: bin/sucrase - sucrase-node: bin/sucrase-node - checksum: 61860063bdf6103413698e13247a3074d25843e91170825a9752e4af7668ffadd331b6e99e92fc32ee5b3c484ee134936f926fa9039d5711fafff29d017a2110 + js-tokens: ^9.0.0 + checksum: 37c2072634d2de11a3644fe1bcf4abd566d85e89f0d8e8b10d35d04e7bef962e7c112fbe5b805ce63e59dfacedc240356eeef57976351502966b7c64b742c6ac languageName: node linkType: hard @@ -3308,8 +2902,8 @@ __metadata: linkType: hard "tar@npm:^6.1.11, tar@npm:^6.1.2": - version: 6.1.15 - resolution: "tar@npm:6.1.15" + version: 6.2.1 + resolution: "tar@npm:6.2.1" dependencies: chownr: ^2.0.0 fs-minipass: ^2.0.0 @@ -3317,7 +2911,7 @@ __metadata: minizlib: ^2.1.1 mkdirp: ^1.0.3 yallist: ^4.0.0 - checksum: f23832fceeba7578bf31907aac744ae21e74a66f4a17a9e94507acf460e48f6db598c7023882db33bab75b80e027c21f276d405e4a0322d58f51c7088d428268 + checksum: f1322768c9741a25356c11373bce918483f40fa9a25c69c59410c8a1247632487edef5fe76c5f12ac51a6356d2f1829e96d2bc34098668a2fc34d76050ac2b6c languageName: node linkType: hard @@ -3328,42 +2922,24 @@ __metadata: languageName: node linkType: hard -"thenify-all@npm:^1.0.0": - version: 1.6.0 - resolution: "thenify-all@npm:1.6.0" - dependencies: - thenify: ">= 3.1.0 < 4" - checksum: dba7cc8a23a154cdcb6acb7f51d61511c37a6b077ec5ab5da6e8b874272015937788402fd271fdfc5f187f8cb0948e38d0a42dcc89d554d731652ab458f5343e +"tinybench@npm:^2.5.1": + version: 2.8.0 + resolution: "tinybench@npm:2.8.0" + checksum: 024a307c6a71f6e2903e110952457ee3dfa606093b45d7f49efcfd01d452650e099474080677ff650b0fd76b49074425ac68ff2a70561699a78515a278bf0862 languageName: node linkType: hard -"thenify@npm:>= 3.1.0 < 4": - version: 3.3.1 - resolution: "thenify@npm:3.3.1" - dependencies: - any-promise: ^1.0.0 - checksum: 84e1b804bfec49f3531215f17b4a6e50fd4397b5f7c1bccc427b9c656e1ecfb13ea79d899930184f78bc2f57285c54d9a50a590c8868f4f0cef5c1d9f898b05e +"tinypool@npm:^0.8.3": + version: 0.8.4 + resolution: "tinypool@npm:0.8.4" + checksum: d40c40e062d5eeae85dadc39294dde6bc7b9a7a7cf0c972acbbe5a2b42491dfd4c48381c1e48bbe02aff4890e63de73d115b2e7de2ce4c81356aa5e654a43caf languageName: node linkType: hard -"tinybench@npm:^2.5.0": - version: 2.5.0 - resolution: "tinybench@npm:2.5.0" - checksum: 284bb9428f197ec8b869c543181315e65e41ccfdad3c4b6c916bb1fdae1b5c6785661b0d90cf135b48d833b03cb84dc5357b2d33ec65a1f5971fae0ab2023821 - languageName: node - linkType: hard - -"tinypool@npm:^0.7.0": - version: 0.7.0 - resolution: "tinypool@npm:0.7.0" - checksum: fdcccd5c750574fce51f8801a877f8284e145d12b79cd5f2d72bfbddfe20c895e915555bc848e122bb6aa968098e7ac4fe1e8e88104904d518dc01cccd18a510 - languageName: node - linkType: hard - -"tinyspy@npm:^2.1.1": - version: 2.1.1 - resolution: "tinyspy@npm:2.1.1" - checksum: cfe669803a7f11ca912742b84c18dcc4ceecaa7661c69bc5eb608a8a802d541c48aba220df8929f6c8cd09892ad37cb5ba5958ddbbb57940e91d04681d3cee73 +"tinyspy@npm:^2.2.0": + version: 2.2.1 + resolution: "tinyspy@npm:2.2.1" + checksum: 170d6232e87f9044f537b50b406a38fbfd6f79a261cd12b92879947bd340939a833a678632ce4f5c4a6feab4477e9c21cd43faac3b90b68b77dd0536c4149736 languageName: node linkType: hard @@ -3376,46 +2952,21 @@ __metadata: languageName: node linkType: hard -"tr46@npm:^1.0.1": - version: 1.0.1 - resolution: "tr46@npm:1.0.1" - dependencies: - punycode: ^2.1.0 - checksum: 96d4ed46bc161db75dbf9247a236ea0bfcaf5758baae6749e92afab0bc5a09cb59af21788ede7e55080f2bf02dce3e4a8f2a484cc45164e29f4b5e68f7cbcc1a - languageName: node - linkType: hard - -"tree-kill@npm:^1.2.2": - version: 1.2.2 - resolution: "tree-kill@npm:1.2.2" - bin: - tree-kill: cli.js - checksum: 49117f5f410d19c84b0464d29afb9642c863bc5ba40fcb9a245d474c6d5cc64d1b177a6e6713129eb346b40aebb9d4631d967517f9fbe8251c35b21b13cd96c7 - languageName: node - linkType: hard - -"ts-interface-checker@npm:^0.1.9": - version: 0.1.13 - resolution: "ts-interface-checker@npm:0.1.13" - checksum: 20c29189c2dd6067a8775e07823ddf8d59a33e2ffc47a1bd59a5cb28bb0121a2969a816d5e77eda2ed85b18171aa5d1c4005a6b88ae8499ec7cc49f78571cb5e - languageName: node - linkType: hard - -"ts-mixer@npm:^6.0.3": - version: 6.0.3 - resolution: "ts-mixer@npm:6.0.3" - checksum: 7fbaba0a413bf817835a6a23d46bccf4192dd4d7345b6bae9d594c88acffac35bf4995ef3cce753090c8abcdf2afd16dba8899365584a1f960ccc2a15bf2e2d6 +"ts-mixer@npm:^6.0.4": + version: 6.0.4 + resolution: "ts-mixer@npm:6.0.4" + checksum: 36b1af526befd74345e736e9aa16f5c28876ebcea07784da14d929149fd7e6028cfd2fe9304c8efe8cb91b588443a9cc9e991df58e4c6e602326edbaae2af3ab languageName: node linkType: hard "ts-results-es@npm:^4.1.0": - version: 4.1.0 - resolution: "ts-results-es@npm:4.1.0" - checksum: c04fd553a37930d234b7d7d31a4c3ea4396e47986a34e528f572af93d070db5cc64f6fcf0587f3c2f9b7061132427e89033572706bfdda112a29929439c5ec46 + version: 4.2.0 + resolution: "ts-results-es@npm:4.2.0" + checksum: ff475c2f6d44377e0204211e6eafdbcabddf3ad09d40540ad5dee3d817eefbd48c07a21f5ad86864ef82cd8a5542a266af9dd8dd4d58d4766fdd6e79370519bb languageName: node linkType: hard -"tslib@npm:2.6.2, tslib@npm:^2.1.0, tslib@npm:^2.6.2": +"tslib@npm:2.6.2": version: 2.6.2 resolution: "tslib@npm:2.6.2" checksum: 329ea56123005922f39642318e3d1f0f8265d1e7fcb92c633e0809521da75eeaca28d2cf96d7248229deb40e5c19adf408259f4b9640afd20d13aecc1430f3ad @@ -3429,39 +2980,10 @@ __metadata: languageName: node linkType: hard -"tsup@npm:^6.7.0": - version: 6.7.0 - resolution: "tsup@npm:6.7.0" - dependencies: - bundle-require: ^4.0.0 - cac: ^6.7.12 - chokidar: ^3.5.1 - debug: ^4.3.1 - esbuild: ^0.17.6 - execa: ^5.0.0 - globby: ^11.0.3 - joycon: ^3.0.1 - postcss-load-config: ^3.0.1 - resolve-from: ^5.0.0 - rollup: ^3.2.5 - source-map: 0.8.0-beta.0 - sucrase: ^3.20.3 - tree-kill: ^1.2.2 - peerDependencies: - "@swc/core": ^1 - postcss: ^8.4.12 - typescript: ">=4.1.0" - peerDependenciesMeta: - "@swc/core": - optional: true - postcss: - optional: true - typescript: - optional: true - bin: - tsup: dist/cli-default.js - tsup-node: dist/cli-node.js - checksum: 91ff179f0b9828a6880b6decaa8603fd7af0311f46a38d3a93647a2497298750d676810aeff533a335443a01a7b340dbba7c76523bcd7a87d7b05b7677742901 +"tslib@npm:^2.1.0, tslib@npm:^2.6.2": + version: 2.6.3 + resolution: "tslib@npm:2.6.3" + checksum: 74fce0e100f1ebd95b8995fbbd0e6c91bdd8f4c35c00d4da62e285a3363aaa534de40a80db30ecfd388ed7c313c42d930ee0eaf108e8114214b180eec3dbe6f5 languageName: node linkType: hard @@ -3485,7 +3007,7 @@ __metadata: languageName: node linkType: hard -"type-detect@npm:^4.0.0, type-detect@npm:^4.0.5": +"type-detect@npm:^4.0.0, type-detect@npm:^4.0.8": version: 4.0.8 resolution: "type-detect@npm:4.0.8" checksum: 62b5628bff67c0eb0b66afa371bd73e230399a8d2ad30d852716efcc4656a7516904570cd8631a49a3ce57c10225adf5d0cbdcb47f6b0255fe6557c453925a15 @@ -3519,19 +3041,24 @@ __metadata: languageName: node linkType: hard -"ufo@npm:^1.3.0": - version: 1.3.0 - resolution: "ufo@npm:1.3.0" - checksum: 01f0be86cd5c205ad1b49ebea985e000a4542c503ee75398302b0f5e4b9a6d9cd8e77af2dc614ab7bea08805fdfd9a85191fb3b5ee3df383cb936cf65e9db30d +"ufo@npm:^1.5.3": + version: 1.5.3 + resolution: "ufo@npm:1.5.3" + checksum: 2f54fa543b2e689cc4ab341fe2194937afe37c5ee43cd782e6ecc184e36859e84d4197a43ae4cd6e9a56f793ca7c5b950dfff3f16fadaeef9b6b88b05c88c8ef languageName: node linkType: hard -"undici@npm:5.27.2": - version: 5.27.2 - resolution: "undici@npm:5.27.2" - dependencies: - "@fastify/busboy": ^2.0.0 - checksum: 22bbdd763798700979986546d70072b67223189353d2a811efa9c6e44476161a0d1781ffe24115221f69a1b344b95d5926bd39a6eb760a2cd8804781cec0c5eb +"undici-types@npm:~5.26.4": + version: 5.26.5 + resolution: "undici-types@npm:5.26.5" + checksum: 3192ef6f3fd5df652f2dc1cd782b49d6ff14dc98e5dced492aa8a8c65425227da5da6aafe22523c67f035a272c599bb89cfe803c1db6311e44bed3042fc25487 + languageName: node + linkType: hard + +"undici@npm:6.13.0": + version: 6.13.0 + resolution: "undici@npm:6.13.0" + checksum: 47495e93aceeab18664678b6fb0ea2395b7c13a33d2ed4f7f36eb9be9ec5cd6f8e3a4ddaec18127da5e2012e5d7666ca824c7dc70af606dcfe6fdb8441ee3a7a languageName: node linkType: hard @@ -3562,46 +3089,31 @@ __metadata: languageName: node linkType: hard -"util-deprecate@npm:^1.0.1": - version: 1.0.2 - resolution: "util-deprecate@npm:1.0.2" - checksum: 474acf1146cb2701fe3b074892217553dfcf9a031280919ba1b8d651a068c9b15d863b7303cb15bd00a862b498e6cf4ad7b4a08fb134edd5a6f7641681cb54a2 - languageName: node - linkType: hard - -"utility-types@npm:^3.10.0": - version: 3.10.0 - resolution: "utility-types@npm:3.10.0" - checksum: 8f274415c6196ab62883b8bd98c9d2f8829b58016e4269aaa1ebd84184ac5dda7dc2ca45800c0d5e0e0650966ba063bf9a412aaeaea6850ca4440a391283d5c8 - languageName: node - linkType: hard - -"vite-node@npm:0.34.3": - version: 0.34.3 - resolution: "vite-node@npm:0.34.3" +"vite-node@npm:1.6.0": + version: 1.6.0 + resolution: "vite-node@npm:1.6.0" dependencies: cac: ^6.7.14 debug: ^4.3.4 - mlly: ^1.4.0 pathe: ^1.1.1 picocolors: ^1.0.0 - vite: ^3.0.0 || ^4.0.0 + vite: ^5.0.0 bin: vite-node: vite-node.mjs - checksum: 366c4f3fb7c038e2180abc6b18cfbac3b8684cd878eaf7ebf1ffb07d95d2ea325713fc575a7949a13bb00cfe264acbc28c02e2836b8647e1f443fe631c17805a + checksum: ce111c5c7a4cf65b722baa15cbc065b7bfdbf1b65576dd6372995f6a72b2b93773ec5df59f6c5f08cfe1284806597b44b832efcea50d5971102428159ff4379f languageName: node linkType: hard -"vite@npm:^3.0.0 || ^4.0.0": - version: 4.4.9 - resolution: "vite@npm:4.4.9" +"vite@npm:^5.0.0": + version: 5.3.2 + resolution: "vite@npm:5.3.2" dependencies: - esbuild: ^0.18.10 - fsevents: ~2.3.2 - postcss: ^8.4.27 - rollup: ^3.27.1 + esbuild: ^0.21.3 + fsevents: ~2.3.3 + postcss: ^8.4.38 + rollup: ^4.13.0 peerDependencies: - "@types/node": ">= 14" + "@types/node": ^18.0.0 || >=20.0.0 less: "*" lightningcss: ^1.21.0 sass: "*" @@ -3628,50 +3140,46 @@ __metadata: optional: true bin: vite: bin/vite.js - checksum: c511024ceae39c68c7dbf2ac4381ee655cd7bb62cf43867a14798bc835d3320b8fa7867a336143c30825c191c1fb4e9aa3348fce831ab617e96203080d3d2908 + checksum: d6872cb72701ec4b8d8dbccc5deacb5af03c3f247df02750787d6dcf4e49e207effed7a06e4f103008a918188cdf0789ff7348db451ebd0d59ef1a22ae4a267d languageName: node linkType: hard -"vitest@npm:latest": - version: 0.34.3 - resolution: "vitest@npm:0.34.3" +"vitest@npm:^1.6.0": + version: 1.6.0 + resolution: "vitest@npm:1.6.0" dependencies: - "@types/chai": ^4.3.5 - "@types/chai-subset": ^1.3.3 - "@types/node": "*" - "@vitest/expect": 0.34.3 - "@vitest/runner": 0.34.3 - "@vitest/snapshot": 0.34.3 - "@vitest/spy": 0.34.3 - "@vitest/utils": 0.34.3 - acorn: ^8.9.0 - acorn-walk: ^8.2.0 - cac: ^6.7.14 - chai: ^4.3.7 + "@vitest/expect": 1.6.0 + "@vitest/runner": 1.6.0 + "@vitest/snapshot": 1.6.0 + "@vitest/spy": 1.6.0 + "@vitest/utils": 1.6.0 + acorn-walk: ^8.3.2 + chai: ^4.3.10 debug: ^4.3.4 - local-pkg: ^0.4.3 - magic-string: ^0.30.1 + execa: ^8.0.1 + local-pkg: ^0.5.0 + magic-string: ^0.30.5 pathe: ^1.1.1 picocolors: ^1.0.0 - std-env: ^3.3.3 - strip-literal: ^1.0.1 - tinybench: ^2.5.0 - tinypool: ^0.7.0 - vite: ^3.0.0 || ^4.0.0 - vite-node: 0.34.3 + std-env: ^3.5.0 + strip-literal: ^2.0.0 + tinybench: ^2.5.1 + tinypool: ^0.8.3 + vite: ^5.0.0 + vite-node: 1.6.0 why-is-node-running: ^2.2.2 peerDependencies: "@edge-runtime/vm": "*" - "@vitest/browser": "*" - "@vitest/ui": "*" + "@types/node": ^18.0.0 || >=20.0.0 + "@vitest/browser": 1.6.0 + "@vitest/ui": 1.6.0 happy-dom: "*" jsdom: "*" - playwright: "*" - safaridriver: "*" - webdriverio: "*" peerDependenciesMeta: "@edge-runtime/vm": optional: true + "@types/node": + optional: true "@vitest/browser": optional: true "@vitest/ui": @@ -3680,37 +3188,13 @@ __metadata: optional: true jsdom: optional: true - playwright: - optional: true - safaridriver: - optional: true - webdriverio: - optional: true bin: vitest: vitest.mjs - checksum: 4535d080feede94db5015eb60c6ed5f7b0d8cd67f12072de5ae1faded133cc640043c0c2646ef51ab9b61c2f885589da57458a65e82cf91a25cf954470018a40 + checksum: a9b9b97e5685d630e5d8d221e6d6cd2e1e9b5b2dd61e82042839ef11549c8d2d780cf696307de406dce804bf41c1219398cb20b4df570b3b47ad1e53af6bfe51 languageName: node linkType: hard -"webidl-conversions@npm:^4.0.2": - version: 4.0.2 - resolution: "webidl-conversions@npm:4.0.2" - checksum: c93d8dfe908a0140a4ae9c0ebc87a33805b416a33ee638a605b551523eec94a9632165e54632f6d57a39c5f948c4bab10e0e066525e9a4b87a79f0d04fbca374 - languageName: node - linkType: hard - -"whatwg-url@npm:^7.0.0": - version: 7.1.0 - resolution: "whatwg-url@npm:7.1.0" - dependencies: - lodash.sortby: ^4.7.0 - tr46: ^1.0.1 - webidl-conversions: ^4.0.2 - checksum: fecb07c87290b47d2ec2fb6d6ca26daad3c9e211e0e531dd7566e7ff95b5b3525a57d4f32640ad4adf057717e0c215731db842ad761e61d947e81010e05cf5fd - languageName: node - linkType: hard - -"which@npm:^2.0.1, which@npm:^2.0.2": +"which@npm:^2.0.1": version: 2.0.2 resolution: "which@npm:2.0.2" dependencies: @@ -3721,6 +3205,17 @@ __metadata: languageName: node linkType: hard +"which@npm:^4.0.0": + version: 4.0.0 + resolution: "which@npm:4.0.0" + dependencies: + isexe: ^3.1.1 + bin: + node-which: bin/which.js + checksum: f17e84c042592c21e23c8195108cff18c64050b9efb8459589116999ea9da6dd1509e6a1bac3aeebefd137be00fabbb61b5c2bc0aa0f8526f32b58ee2f545651 + languageName: node + linkType: hard + "why-is-node-running@npm:^2.2.2": version: 2.2.2 resolution: "why-is-node-running@npm:2.2.2" @@ -3733,12 +3228,10 @@ __metadata: languageName: node linkType: hard -"wide-align@npm:^1.1.5": - version: 1.1.5 - resolution: "wide-align@npm:1.1.5" - dependencies: - string-width: ^1.0.2 || 2 || 3 || 4 - checksum: d5fc37cd561f9daee3c80e03b92ed3e84d80dde3365a8767263d03dacfc8fa06b065ffe1df00d8c2a09f731482fcacae745abfbb478d4af36d0a891fad4834d3 +"word-wrap@npm:^1.2.5": + version: 1.2.5 + resolution: "word-wrap@npm:1.2.5" + checksum: f93ba3586fc181f94afdaff3a6fef27920b4b6d9eaefed0f428f8e07adea2a7f54a5f2830ce59406c8416f033f86902b91eb824072354645eea687dff3691ccb languageName: node linkType: hard @@ -3771,9 +3264,9 @@ __metadata: languageName: node linkType: hard -"ws@npm:8.14.2": - version: 8.14.2 - resolution: "ws@npm:8.14.2" +"ws@npm:8.17.1": + version: 8.17.1 + resolution: "ws@npm:8.17.1" peerDependencies: bufferutil: ^4.0.1 utf-8-validate: ">=5.0.2" @@ -3782,22 +3275,7 @@ __metadata: optional: true utf-8-validate: optional: true - checksum: 3ca0dad26e8cc6515ff392b622a1467430814c463b3368b0258e33696b1d4bed7510bc7030f7b72838b9fdeb8dbd8839cbf808367d6aae2e1d668ce741d4308b - languageName: node - linkType: hard - -"ws@npm:^8.14.2": - version: 8.15.1 - resolution: "ws@npm:8.15.1" - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ">=5.0.2" - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - checksum: 8c67365f6e6134278ad635d558bfce466d7ef7543a043baea333aaa430429f0af8a130c0c36e7dd78f918d68167a659ba9b5067330b77c4b279e91533395952b + checksum: 442badcce1f1178ec87a0b5372ae2e9771e07c4929a3180321901f226127f252441e8689d765aa5cfba5f50ac60dd830954afc5aeae81609aefa11d3ddf5cecf languageName: node linkType: hard @@ -3808,13 +3286,6 @@ __metadata: languageName: node linkType: hard -"yaml@npm:^1.10.2": - version: 1.10.2 - resolution: "yaml@npm:1.10.2" - checksum: ce4ada136e8a78a0b08dc10b4b900936912d15de59905b2bf415b4d33c63df1d555d23acb2a41b23cf9fb5da41c256441afca3d6509de7247daa062fd2c5ea5f - languageName: node - linkType: hard - "yocto-queue@npm:^0.1.0": version: 0.1.0 resolution: "yocto-queue@npm:0.1.0" @@ -3823,8 +3294,8 @@ __metadata: linkType: hard "yocto-queue@npm:^1.0.0": - version: 1.0.0 - resolution: "yocto-queue@npm:1.0.0" - checksum: 2cac84540f65c64ccc1683c267edce396b26b1e931aa429660aefac8fbe0188167b7aee815a3c22fa59a28a58d898d1a2b1825048f834d8d629f4c2a5d443801 + version: 1.1.1 + resolution: "yocto-queue@npm:1.1.1" + checksum: f2e05b767ed3141e6372a80af9caa4715d60969227f38b1a4370d60bffe153c9c5b33a862905609afc9b375ec57cd40999810d20e5e10229a204e8bde7ef255c languageName: node linkType: hard