@sapphire/plugin-api 8.1.0-next.aa2ed66 → 8.1.0-next.adf9c85

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (29) hide show
  1. package/dist/cjs/index.cjs +1 -1
  2. package/dist/cjs/index.cjs.map +1 -1
  3. package/dist/cjs/index.d.cts +1 -1
  4. package/dist/cjs/lib/structures/MiddlewareStore.cjs.map +1 -1
  5. package/dist/cjs/lib/structures/api/CookieStore.cjs +2 -2
  6. package/dist/cjs/lib/structures/api/CookieStore.cjs.map +1 -1
  7. package/dist/cjs/lib/structures/http/Auth.cjs +1 -1
  8. package/dist/cjs/lib/structures/http/Auth.cjs.map +1 -1
  9. package/dist/cjs/lib/structures/router/RouterBranch.cjs.map +1 -1
  10. package/dist/cjs/lib/structures/router/RouterRoot.cjs.map +1 -1
  11. package/dist/cjs/lib/utils/_body/RequestHeadersProxy.cjs +1 -1
  12. package/dist/cjs/lib/utils/_body/RequestHeadersProxy.cjs.map +1 -1
  13. package/dist/cjs/lib/utils/_body/RequestURLProxy.cjs.map +1 -1
  14. package/dist/cjs/listeners/PluginServerRequest.cjs.map +1 -1
  15. package/dist/esm/index.d.mts +1 -1
  16. package/dist/esm/index.mjs +1 -1
  17. package/dist/esm/index.mjs.map +1 -1
  18. package/dist/esm/lib/structures/MiddlewareStore.mjs.map +1 -1
  19. package/dist/esm/lib/structures/api/CookieStore.mjs +2 -2
  20. package/dist/esm/lib/structures/api/CookieStore.mjs.map +1 -1
  21. package/dist/esm/lib/structures/http/Auth.mjs +1 -1
  22. package/dist/esm/lib/structures/http/Auth.mjs.map +1 -1
  23. package/dist/esm/lib/structures/router/RouterBranch.mjs.map +1 -1
  24. package/dist/esm/lib/structures/router/RouterRoot.mjs.map +1 -1
  25. package/dist/esm/lib/utils/_body/RequestHeadersProxy.mjs +1 -1
  26. package/dist/esm/lib/utils/_body/RequestHeadersProxy.mjs.map +1 -1
  27. package/dist/esm/lib/utils/_body/RequestURLProxy.mjs.map +1 -1
  28. package/dist/esm/listeners/PluginServerRequest.mjs.map +1 -1
  29. package/package.json +4 -4
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../src/lib/structures/http/Auth.ts"],"names":[],"mappings":"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","file":"Auth.mjs","sourcesContent":["import { isThenable, type Awaitable } from '@sapphire/utilities';\nimport { createCipheriv, createDecipheriv, randomBytes } from 'crypto';\nimport {\n\tOAuth2Scopes,\n\tRouteBases,\n\tRoutes,\n\ttype RESTGetAPICurrentUserConnectionsResult,\n\ttype RESTGetAPICurrentUserGuildsResult,\n\ttype RESTGetAPICurrentUserResult,\n\ttype Snowflake\n} from 'discord.js';\nimport { fetch } from 'undici';\n\nexport class Auth {\n\t/**\n\t * The client's application id, this can be retrieved in Discord Developer Portal at https://discord.com/developers/applications.\n\t * @since 1.0.0\n\t */\n\tpublic id: Snowflake;\n\n\t/**\n\t * The name for the cookie, this will be used to identify a Secure HttpOnly cookie.\n\t * @since 1.0.0\n\t */\n\tpublic cookie: string;\n\n\t/**\n\t * The scopes defined at https://discord.com/developers/docs/topics/oauth2#shared-resources-oauth2-scopes.\n\t * @since 1.0.0\n\t */\n\tpublic scopes: readonly OAuth2Scopes[];\n\n\t/**\n\t * The redirect uri.\n\t * @since 1.0.0\n\t */\n\tpublic redirect: string | undefined;\n\n\t/**\n\t * The transformers used for {@link Auth.fetchData}.\n\t * @since 1.4.0\n\t */\n\tpublic transformers: LoginDataTransformer[];\n\n\tpublic domainOverwrite: string | null = null;\n\n\t#secret: string;\n\n\tprivate constructor(options: ServerOptionsAuth) {\n\t\tthis.id = options.id;\n\t\tthis.cookie = options.cookie ?? 'SAPPHIRE_AUTH';\n\t\tthis.scopes = options.scopes ?? [OAuth2Scopes.Identify];\n\t\tthis.redirect = options.redirect;\n\t\tthis.#secret = options.secret;\n\t\tthis.transformers = options.transformers ?? [];\n\t\tthis.domainOverwrite = options.domainOverwrite ?? null;\n\t}\n\n\t/**\n\t * The client secret, this can be retrieved in Discord Developer Portal at https://discord.com/developers/applications.\n\t * @since 1.0.0\n\t */\n\tpublic get secret() {\n\t\treturn this.#secret;\n\t}\n\n\t/**\n\t * Encrypts an object with aes-256-cbc to use as a token.\n\t * @since 1.0.0\n\t * @param data An object to encrypt\n\t */\n\tpublic encrypt(data: AuthData): string {\n\t\tconst iv = randomBytes(16);\n\t\tconst cipher = createCipheriv('aes-256-cbc', this.#secret, iv);\n\t\treturn `${cipher.update(JSON.stringify(data), 'utf8', 'base64') + cipher.final('base64')}.${iv.toString('base64')}`;\n\t}\n\n\t/**\n\t * Decrypts an object with aes-256-cbc to use as a token.\n\t * @since 1.0.0\n\t * @param token An data to decrypt\n\t */\n\tpublic decrypt(token: string): AuthData | null {\n\t\tconst [data, iv] = token.split('.');\n\t\tconst decipher = createDecipheriv('aes-256-cbc', this.#secret, Buffer.from(iv, 'base64'));\n\n\t\ttry {\n\t\t\tconst parsed = JSON.parse(decipher.update(data, 'base64', 'utf8') + decipher.final('utf8')) as AuthData;\n\t\t\t// If the token expired, return null:\n\t\t\treturn parsed.expires >= Date.now() ? parsed : null;\n\t\t} catch {\n\t\t\treturn null;\n\t\t}\n\t}\n\n\t/**\n\t * Retrieves the data for a specific user.\n\t * @since 1.4.0\n\t * @param token The access token from the user.\n\t */\n\tpublic async fetchData(token: string): Promise<LoginData> {\n\t\t// Fetch the information:\n\t\tconst [user, guilds, connections] = await Promise.all([\n\t\t\tthis.fetchInformation<RESTGetAPICurrentUserResult>(OAuth2Scopes.Identify, token, `${RouteBases.api}${Routes.user()}`),\n\t\t\tthis.fetchInformation<RESTGetAPICurrentUserGuildsResult>(OAuth2Scopes.Guilds, token, `${RouteBases.api}${Routes.userGuilds()}`),\n\t\t\tthis.fetchInformation<RESTGetAPICurrentUserConnectionsResult>(\n\t\t\t\tOAuth2Scopes.Connections,\n\t\t\t\ttoken,\n\t\t\t\t`${RouteBases.api}${Routes.userConnections()}`\n\t\t\t)\n\t\t]);\n\n\t\t// Transform the information:\n\t\tlet data: LoginData = { user, guilds, connections };\n\t\tfor (const transformer of this.transformers) {\n\t\t\tconst result = transformer(data);\n\t\t\tif (isThenable(result)) data = await result;\n\t\t\telse data = result as LoginData;\n\t\t}\n\n\t\treturn data;\n\t}\n\n\tprivate async fetchInformation<T>(scope: OAuth2Scopes, token: string, url: string): Promise<T | null | undefined> {\n\t\tif (!this.scopes.includes(scope)) return undefined;\n\n\t\tconst result = await fetch(url, {\n\t\t\theaders: {\n\t\t\t\tauthorization: `Bearer ${token}`\n\t\t\t}\n\t\t});\n\n\t\treturn result.ok ? ((await result.json()) as T) : null;\n\t}\n\n\tpublic static create(options?: ServerOptionsAuth): Auth | null {\n\t\tif (!options?.secret || !options.id) return null;\n\t\treturn new Auth(options);\n\t}\n}\n\n/**\n * Defines the authentication data, this is to be encrypted and decrypted by the server.\n * @since 1.0.0\n */\nexport interface AuthData {\n\t/**\n\t * The user ID.\n\t * @since 1.0.0\n\t */\n\tid: string;\n\n\t/**\n\t * The timestamp at which the token expires.\n\t * @since 1.0.0\n\t */\n\texpires: number;\n\n\t/**\n\t * The refresh token.\n\t * @since 1.0.0\n\t */\n\trefresh: string;\n\n\t/**\n\t * The access token.\n\t * @since 1.0.0\n\t */\n\ttoken: string;\n}\n\n/**\n * Defines the authentication options.\n * @since 1.0.0\n */\nexport interface ServerOptionsAuth {\n\t/**\n\t * The client's application id, this can be retrieved in Discord Developer Portal at https://discord.com/developers/applications.\n\t * @since 1.0.0\n\t */\n\tid: Snowflake;\n\n\t/**\n\t * The name for the cookie, this will be used to identify a Secure HttpOnly cookie.\n\t * @since 1.0.0\n\t * @default 'SAPPHIRE_AUTH'\n\t */\n\tcookie?: string;\n\n\t/**\n\t * The client secret, this can be retrieved in Discord Developer Portal at https://discord.com/developers/applications.\n\t * @since 1.0.0\n\t */\n\tsecret: string;\n\n\t/**\n\t * The scopes defined at https://discord.com/developers/docs/topics/oauth2#shared-resources-oauth2-scopes.\n\t * @since 1.0.0\n\t * @default [OAuth2Scopes.Identify]\n\t */\n\tscopes?: OAuth2Scopes[];\n\n\t/**\n\t * The redirect uri. This will default to {@link OAuth2BodyData.redirectUri} if missing.\n\t * @since 1.0.0\n\t */\n\tredirect?: string;\n\n\t/**\n\t * The login data transformers used for {@link Auth.fetchData}.\n\t * @since 1.4.0\n\t * @default []\n\t */\n\ttransformers?: LoginDataTransformer[];\n\t/**\n\t * The domain that should be used for the cookie. This overwrites the automatic detection of the domain.\n\t * @remark if you want to support subdomains (`one.example.two` and `two.example.com`) then you need to use prefix your domain with a `.`, for example `.example.com`\n\t * @since 2.1.0\n\t * @default undefined\n\t */\n\tdomainOverwrite?: string;\n}\n\n/**\n * The login data sent when fetching data from a user.\n * @since 1.4.0\n */\nexport interface LoginData {\n\t/**\n\t * The user data, defined when the `'identify'` scope is defined.\n\t * @since 1.4.0\n\t */\n\tuser?: RESTGetAPICurrentUserResult | null;\n\n\t/**\n\t * The guilds data, defined when the `'guilds'` scope is defined.\n\t * @since 1.4.0\n\t */\n\tguilds?: RESTGetAPICurrentUserGuildsResult | null;\n\n\t/**\n\t * The connections data, defined when the `'connections'` scope is defined.\n\t * @since 1.4.0\n\t */\n\tconnections?: RESTGetAPICurrentUserConnectionsResult | null;\n}\n\n/**\n * A login data transformer.\n * @since 1.4.0\n */\nexport interface LoginDataTransformer<T extends LoginData = LoginData> {\n\t/**\n\t * Transforms the object by mutating its properties or adding new ones.\n\t * @since 1.4.0\n\t */\n\t(data: LoginData): Awaitable<T>;\n}\n"]}
1
+ {"version":3,"sources":["../../../../../src/lib/structures/http/Auth.ts"],"names":[],"mappings":"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","file":"Auth.mjs","sourcesContent":["import { isThenable, type Awaitable } from '@sapphire/utilities';\nimport { createCipheriv, createDecipheriv, randomBytes } from 'crypto';\nimport {\n\tOAuth2Scopes,\n\tRouteBases,\n\tRoutes,\n\ttype RESTGetAPICurrentUserConnectionsResult,\n\ttype RESTGetAPICurrentUserGuildsResult,\n\ttype RESTGetAPICurrentUserResult,\n\ttype Snowflake\n} from 'discord.js';\nimport { fetch } from 'undici';\n\nexport class Auth {\n\t/**\n\t * The client's application id, this can be retrieved in Discord Developer Portal at https://discord.com/developers/applications.\n\t * @since 1.0.0\n\t */\n\tpublic id: Snowflake;\n\n\t/**\n\t * The name for the cookie, this will be used to identify a Secure HttpOnly cookie.\n\t * @since 1.0.0\n\t */\n\tpublic cookie: string;\n\n\t/**\n\t * The scopes defined at https://discord.com/developers/docs/topics/oauth2#shared-resources-oauth2-scopes.\n\t * @since 1.0.0\n\t */\n\tpublic scopes: readonly OAuth2Scopes[];\n\n\t/**\n\t * The redirect uri.\n\t * @since 1.0.0\n\t */\n\tpublic redirect: string | undefined;\n\n\t/**\n\t * The transformers used for {@link Auth.fetchData}.\n\t * @since 1.4.0\n\t */\n\tpublic transformers: LoginDataTransformer[];\n\n\tpublic domainOverwrite: string | null = null;\n\n\t#secret: string;\n\n\tprivate constructor(options: ServerOptionsAuth) {\n\t\tthis.id = options.id;\n\t\tthis.cookie = options.cookie ?? 'SAPPHIRE_AUTH';\n\t\tthis.scopes = options.scopes ?? [OAuth2Scopes.Identify];\n\t\tthis.redirect = options.redirect;\n\t\tthis.#secret = options.secret;\n\t\tthis.transformers = options.transformers ?? [];\n\t\tthis.domainOverwrite = options.domainOverwrite ?? null;\n\t}\n\n\t/**\n\t * The client secret, this can be retrieved in Discord Developer Portal at https://discord.com/developers/applications.\n\t * @since 1.0.0\n\t */\n\tpublic get secret() {\n\t\treturn this.#secret;\n\t}\n\n\t/**\n\t * Encrypts an object with aes-256-cbc to use as a token.\n\t * @since 1.0.0\n\t * @param data An object to encrypt\n\t */\n\tpublic encrypt(data: AuthData): string {\n\t\tconst iv = randomBytes(16);\n\t\tconst cipher = createCipheriv('aes-256-cbc', this.#secret, iv);\n\t\treturn `${cipher.update(JSON.stringify(data), 'utf8', 'base64') + cipher.final('base64')}.${iv.toString('base64')}`;\n\t}\n\n\t/**\n\t * Decrypts an object with aes-256-cbc to use as a token.\n\t * @since 1.0.0\n\t * @param token An data to decrypt\n\t */\n\tpublic decrypt(token: string): AuthData | null {\n\t\tconst [data, iv] = token.split('.');\n\t\tconst decipher = createDecipheriv('aes-256-cbc', this.#secret, Buffer.from(iv, 'base64'));\n\n\t\ttry {\n\t\t\tconst parsed = JSON.parse(decipher.update(data, 'base64', 'utf8') + decipher.final('utf8')) as AuthData;\n\t\t\t// If the token expired, return null:\n\t\t\treturn parsed.expires >= Date.now() ? parsed : null;\n\t\t} catch {\n\t\t\treturn null;\n\t\t}\n\t}\n\n\t/**\n\t * Retrieves the data for a specific user.\n\t * @since 1.4.0\n\t * @param token The access token from the user.\n\t */\n\tpublic async fetchData(token: string): Promise<LoginData> {\n\t\t// Fetch the information:\n\t\tconst [user, guilds, connections] = await Promise.all([\n\t\t\tthis.fetchInformation<RESTGetAPICurrentUserResult>(OAuth2Scopes.Identify, token, `${RouteBases.api}${Routes.user()}`),\n\t\t\tthis.fetchInformation<RESTGetAPICurrentUserGuildsResult>(OAuth2Scopes.Guilds, token, `${RouteBases.api}${Routes.userGuilds()}`),\n\t\t\tthis.fetchInformation<RESTGetAPICurrentUserConnectionsResult>(\n\t\t\t\tOAuth2Scopes.Connections,\n\t\t\t\ttoken,\n\t\t\t\t`${RouteBases.api}${Routes.userConnections()}`\n\t\t\t)\n\t\t]);\n\n\t\t// Transform the information:\n\t\tlet data: LoginData = { user, guilds, connections };\n\t\tfor (const transformer of this.transformers) {\n\t\t\tconst result = transformer(data);\n\t\t\tif (isThenable(result)) data = await result;\n\t\t\telse data = result as LoginData;\n\t\t}\n\n\t\treturn data;\n\t}\n\n\tprivate async fetchInformation<T>(scope: OAuth2Scopes, token: string, url: string): Promise<T | null | undefined> {\n\t\tif (!this.scopes.includes(scope)) return undefined;\n\n\t\tconst result = await fetch(url, {\n\t\t\theaders: {\n\t\t\t\tauthorization: `Bearer ${token}`\n\t\t\t}\n\t\t});\n\n\t\treturn result.ok ? ((await result.json()) as T) : null;\n\t}\n\n\tpublic static create(options?: ServerOptionsAuth): Auth | null {\n\t\tif (!options?.secret || !options.id) return null;\n\t\treturn new Auth(options);\n\t}\n}\n\n/**\n * Defines the authentication data, this is to be encrypted and decrypted by the server.\n * @since 1.0.0\n */\nexport interface AuthData {\n\t/**\n\t * The user ID.\n\t * @since 1.0.0\n\t */\n\tid: string;\n\n\t/**\n\t * The timestamp at which the token expires.\n\t * @since 1.0.0\n\t */\n\texpires: number;\n\n\t/**\n\t * The refresh token.\n\t * @since 1.0.0\n\t */\n\trefresh: string;\n\n\t/**\n\t * The access token.\n\t * @since 1.0.0\n\t */\n\ttoken: string;\n}\n\n/**\n * Defines the authentication options.\n * @since 1.0.0\n */\nexport interface ServerOptionsAuth {\n\t/**\n\t * The client's application id, this can be retrieved in Discord Developer Portal at https://discord.com/developers/applications.\n\t * @since 1.0.0\n\t */\n\tid: Snowflake;\n\n\t/**\n\t * The name for the cookie, this will be used to identify a Secure HttpOnly cookie.\n\t * @since 1.0.0\n\t * @default 'SAPPHIRE_AUTH'\n\t */\n\tcookie?: string;\n\n\t/**\n\t * The client secret, this can be retrieved in Discord Developer Portal at https://discord.com/developers/applications.\n\t * @since 1.0.0\n\t */\n\tsecret: string;\n\n\t/**\n\t * The scopes defined at https://discord.com/developers/docs/topics/oauth2#shared-resources-oauth2-scopes.\n\t * @since 1.0.0\n\t * @default [OAuth2Scopes.Identify]\n\t */\n\tscopes?: OAuth2Scopes[];\n\n\t/**\n\t * The redirect uri. This will default to {@link OAuth2BodyData.redirectUri} if missing.\n\t * @since 1.0.0\n\t */\n\tredirect?: string;\n\n\t/**\n\t * The login data transformers used for {@link Auth.fetchData}.\n\t * @since 1.4.0\n\t * @default []\n\t */\n\ttransformers?: LoginDataTransformer[];\n\t/**\n\t * The domain that should be used for the cookie. This overwrites the automatic detection of the domain.\n\t * @remark if you want to support subdomains (`one.example.two` and `two.example.com`) then you need to use prefix your domain with a `.`, for example `.example.com`\n\t * @since 2.1.0\n\t * @default undefined\n\t */\n\tdomainOverwrite?: string;\n}\n\n/**\n * The login data sent when fetching data from a user.\n * @since 1.4.0\n */\nexport interface LoginData {\n\t/**\n\t * The user data, defined when the `'identify'` scope is defined.\n\t * @since 1.4.0\n\t */\n\tuser?: RESTGetAPICurrentUserResult | null;\n\n\t/**\n\t * The guilds data, defined when the `'guilds'` scope is defined.\n\t * @since 1.4.0\n\t */\n\tguilds?: RESTGetAPICurrentUserGuildsResult | null;\n\n\t/**\n\t * The connections data, defined when the `'connections'` scope is defined.\n\t * @since 1.4.0\n\t */\n\tconnections?: RESTGetAPICurrentUserConnectionsResult | null;\n}\n\n/**\n * A login data transformer.\n * @since 1.4.0\n */\nexport interface LoginDataTransformer<T extends LoginData = LoginData> {\n\t/**\n\t * Transforms the object by mutating its properties or adding new ones.\n\t * @since 1.4.0\n\t */\n\t(data: LoginData): Awaitable<T>;\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../src/lib/structures/router/RouterBranch.ts"],"names":["branch"],"mappings":"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","file":"RouterBranch.mjs","sourcesContent":["import { isNullish } from '@sapphire/utilities';\nimport type { Route } from '../Route';\nimport { RouterNode } from './RouterNode';\n\nexport class RouterBranch {\n\t/**\n\t * The name of the branch.\n\t */\n\tpublic readonly name: string;\n\n\t/**\n\t * Whether or not the branch is dynamic.\n\t */\n\tpublic readonly dynamic: boolean;\n\n\t/**\n\t * The parent branch, if any.\n\t */\n\tpublic readonly parent: RouterBranch | null;\n\n\t/**\n\t * The node this branch is associated with.\n\t */\n\tpublic readonly node = new RouterNode(this);\n\n\t/**\n\t * The methods supported by the branch's node or any of its children.\n\t */\n\tpublic supportedMethods: readonly string[] = [];\n\n\tprivate _staticChildren: RouterBranch[] = [];\n\tprivate _dynamicChild: RouterBranch | null = null;\n\n\tpublic constructor(name: string, dynamic: boolean, parent: RouterBranch | null) {\n\t\tthis.name = name;\n\t\tthis.dynamic = dynamic;\n\t\tthis.parent = parent;\n\t}\n\n\t/**\n\t * The path representing this branch\n\t * @version 7.0.0\n\t */\n\tpublic get path(): string {\n\t\treturn this.parent ? `${this.parent}/${this}` : `${this}`;\n\t}\n\n\t/**\n\t * The branches the branch is associated with\n\t * @version 7.0.0\n\t */\n\tpublic get children(): RouterBranch[] {\n\t\treturn this._staticChildren.concat(this._dynamicChild ?? []);\n\t}\n\n\t/**\n\t * Whether or not the branch is empty\n\t * @version 7.0.0\n\t */\n\tpublic get empty(): boolean {\n\t\treturn this._staticChildren.length === 0 && this._dynamicChild === null;\n\t}\n\n\t/**\n\t * Tries to find a branch given a path\n\t * @version 7.0.0\n\t *\n\t * @param parts The parts of a path to find a node from\n\t * @returns The branch found, or null if not found\n\t */\n\tpublic find(parts: readonly string[]): RouterBranch | null {\n\t\treturn this._find(parts, 0);\n\t}\n\n\t/**\n\t * Checks if the given name matches the branch\n\t * @version 7.0.0\n\t *\n\t * @param name The name to match\n\t * @returns Whether or not the branch matches the name\n\t */\n\tpublic matches(name: string): boolean {\n\t\treturn this.dynamic || this.name === name;\n\t}\n\n\t/**\n\t * Returns the string representation of the branch\n\t * @version 7.0.0\n\t *\n\t * @returns The string representation of the branch\n\t */\n\tpublic toString(): string {\n\t\treturn this.dynamic ? `[${this.name}]` : this.name;\n\t}\n\n\tpublic *nodes(): IterableIterator<RouterNode> {\n\t\tyield this.node;\n\t\tfor (const child of this._staticChildren) {\n\t\t\tyield* child.nodes();\n\t\t}\n\n\t\tif (this._dynamicChild) {\n\t\t\tyield* this._dynamicChild.nodes();\n\t\t}\n\t}\n\n\tprotected _add(parts: readonly string[], index: number, route: Route): RouterNode {\n\t\tconst result = this._performAdd(parts, index, route);\n\t\tthis._updateSupportedChildrenMethods();\n\t\treturn result;\n\t}\n\n\tprotected _remove(parts: readonly string[], index: number, route: Route): boolean {\n\t\tconst result = this._performRemove(parts, index, route);\n\t\tif (result) this._updateSupportedChildrenMethods();\n\t\treturn result;\n\t}\n\n\tprotected _performAdd(parts: readonly string[], index: number, route: Route): RouterNode {\n\t\tif (index >= parts.length) {\n\t\t\tfor (const method of route.methods) {\n\t\t\t\tthis.node.set(method, route);\n\t\t\t}\n\n\t\t\treturn this.node;\n\t\t}\n\n\t\tconst part = parts[index];\n\t\tconst child = this._staticChildren.find((branch) => branch.matches(part));\n\t\tif (child) {\n\t\t\treturn child._add(parts, index + 1, route);\n\t\t}\n\n\t\tif (this._dynamicChild) {\n\t\t\treturn this._dynamicChild._add(parts, index + 1, route);\n\t\t}\n\n\t\tconst dynamic = part.startsWith('[') && part.endsWith(']');\n\t\tlet branch: RouterBranch;\n\t\tif (dynamic) {\n\t\t\tbranch = new RouterBranch(part.slice(1, -1), true, this);\n\t\t\tthis._dynamicChild = branch;\n\t\t} else {\n\t\t\tbranch = new RouterBranch(part, false, this);\n\t\t\tthis._staticChildren.push(branch);\n\t\t}\n\n\t\treturn branch._add(parts, index + 1, route);\n\t}\n\n\tprotected _performRemove(parts: readonly string[], index: number, route: Route): boolean {\n\t\tif (index >= parts.length) {\n\t\t\tlet success = false;\n\t\t\tfor (const method of route.methods) {\n\t\t\t\tif (this.node.delete(method, route)) {\n\t\t\t\t\tsuccess = true;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn success;\n\t\t}\n\n\t\tconst part = parts[index];\n\t\tconst staticChildIndex = this._staticChildren.findIndex((branch) => branch.matches(part));\n\t\tif (staticChildIndex === -1) {\n\t\t\tconst child = this._staticChildren[index];\n\t\t\tconst removed = child._remove(parts, index + 1, route);\n\t\t\tif (removed && child.empty) {\n\t\t\t\tthis._staticChildren = this._staticChildren.filter((branch) => branch !== child);\n\t\t\t}\n\n\t\t\treturn removed;\n\t\t}\n\n\t\tif (this._dynamicChild) {\n\t\t\tconst removed = this._dynamicChild._remove(parts, index + 1, route);\n\t\t\tif (removed && this._dynamicChild.empty) {\n\t\t\t\tthis._dynamicChild = null;\n\t\t\t}\n\n\t\t\treturn removed;\n\t\t}\n\n\t\treturn false;\n\t}\n\n\tprotected _find(parts: readonly string[], index: number): RouterBranch | null {\n\t\tif (index >= parts.length) return this;\n\n\t\tconst part = parts[index];\n\t\tconst child = this._staticChildren.find((branch) => branch.matches(part)) ?? this._dynamicChild;\n\n\t\t// If a child is not found, return null:\n\t\tif (isNullish(child)) return null;\n\n\t\t// Continue the search:\n\t\treturn child._find(parts, index + 1);\n\t}\n\n\tprotected _updateSupportedChildrenMethods(): void {\n\t\tconst methods = new Set(this.node.methods());\n\t\tfor (const child of this.children) {\n\t\t\tfor (const method of child.node.methods()) {\n\t\t\t\tmethods.add(method);\n\t\t\t}\n\t\t}\n\n\t\tthis.supportedMethods = [...methods];\n\t}\n}\n"]}
1
+ {"version":3,"sources":["../../../../../src/lib/structures/router/RouterBranch.ts"],"names":["branch"],"mappings":";;;;AAIO,IAAM,aAAA,GAAN,MAAM,aAAa,CAAA;AAAA,EA6BlB,WAAA,CAAY,IAAc,EAAA,OAAA,EAAkB,MAA6B,EAAA;AAzBhF;AAAA;AAAA;AAAA,IAAgB,aAAA,CAAA,IAAA,EAAA,MAAA,CAAA;AAKhB;AAAA;AAAA;AAAA,IAAgB,aAAA,CAAA,IAAA,EAAA,SAAA,CAAA;AAKhB;AAAA;AAAA;AAAA,IAAgB,aAAA,CAAA,IAAA,EAAA,QAAA,CAAA;AAKhB;AAAA;AAAA;AAAA,IAAgB,aAAA,CAAA,IAAA,EAAA,MAAA,EAAO,IAAI,UAAA,CAAW,IAAI,CAAA,CAAA;AAK1C;AAAA;AAAA;AAAA,IAAA,aAAA,CAAA,IAAA,EAAO,oBAAsC,EAAC,CAAA;AAE9C,IAAA,aAAA,CAAA,IAAA,EAAQ,mBAAkC,EAAC,CAAA;AAC3C,IAAA,aAAA,CAAA,IAAA,EAAQ,eAAqC,EAAA,IAAA,CAAA;AAG5C,IAAA,IAAA,CAAK,IAAO,GAAA,IAAA;AACZ,IAAA,IAAA,CAAK,OAAU,GAAA,OAAA;AACf,IAAA,IAAA,CAAK,MAAS,GAAA,MAAA;AAAA;AACf;AAAA;AAAA;AAAA;AAAA,EAMA,IAAW,IAAe,GAAA;AACzB,IAAO,OAAA,IAAA,CAAK,SAAS,CAAG,EAAA,IAAA,CAAK,MAAM,CAAI,CAAA,EAAA,IAAI,CAAK,CAAA,GAAA,CAAA,EAAG,IAAI,CAAA,CAAA;AAAA;AACxD;AAAA;AAAA;AAAA;AAAA,EAMA,IAAW,QAA2B,GAAA;AACrC,IAAA,OAAO,KAAK,eAAgB,CAAA,MAAA,CAAO,IAAK,CAAA,aAAA,IAAiB,EAAE,CAAA;AAAA;AAC5D;AAAA;AAAA;AAAA;AAAA,EAMA,IAAW,KAAiB,GAAA;AAC3B,IAAA,OAAO,IAAK,CAAA,eAAA,CAAgB,MAAW,KAAA,CAAA,IAAK,KAAK,aAAkB,KAAA,IAAA;AAAA;AACpE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASO,KAAK,KAA+C,EAAA;AAC1D,IAAO,OAAA,IAAA,CAAK,KAAM,CAAA,KAAA,EAAO,CAAC,CAAA;AAAA;AAC3B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASO,QAAQ,IAAuB,EAAA;AACrC,IAAO,OAAA,IAAA,CAAK,OAAW,IAAA,IAAA,CAAK,IAAS,KAAA,IAAA;AAAA;AACtC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQO,QAAmB,GAAA;AACzB,IAAA,OAAO,KAAK,OAAU,GAAA,CAAA,CAAA,EAAI,IAAK,CAAA,IAAI,MAAM,IAAK,CAAA,IAAA;AAAA;AAC/C,EAEA,CAAQ,KAAsC,GAAA;AAC7C,IAAA,MAAM,IAAK,CAAA,IAAA;AACX,IAAW,KAAA,MAAA,KAAA,IAAS,KAAK,eAAiB,EAAA;AACzC,MAAA,OAAO,MAAM,KAAM,EAAA;AAAA;AAGpB,IAAA,IAAI,KAAK,aAAe,EAAA;AACvB,MAAO,OAAA,IAAA,CAAK,cAAc,KAAM,EAAA;AAAA;AACjC;AACD,EAEU,IAAA,CAAK,KAA0B,EAAA,KAAA,EAAe,KAA0B,EAAA;AACjF,IAAA,MAAM,MAAS,GAAA,IAAA,CAAK,WAAY,CAAA,KAAA,EAAO,OAAO,KAAK,CAAA;AACnD,IAAA,IAAA,CAAK,+BAAgC,EAAA;AACrC,IAAO,OAAA,MAAA;AAAA;AACR,EAEU,OAAA,CAAQ,KAA0B,EAAA,KAAA,EAAe,KAAuB,EAAA;AACjF,IAAA,MAAM,MAAS,GAAA,IAAA,CAAK,cAAe,CAAA,KAAA,EAAO,OAAO,KAAK,CAAA;AACtD,IAAI,IAAA,MAAA,OAAa,+BAAgC,EAAA;AACjD,IAAO,OAAA,MAAA;AAAA;AACR,EAEU,WAAA,CAAY,KAA0B,EAAA,KAAA,EAAe,KAA0B,EAAA;AACxF,IAAI,IAAA,KAAA,IAAS,MAAM,MAAQ,EAAA;AAC1B,MAAW,KAAA,MAAA,MAAA,IAAU,MAAM,OAAS,EAAA;AACnC,QAAK,IAAA,CAAA,IAAA,CAAK,GAAI,CAAA,MAAA,EAAQ,KAAK,CAAA;AAAA;AAG5B,MAAA,OAAO,IAAK,CAAA,IAAA;AAAA;AAGb,IAAM,MAAA,IAAA,GAAO,MAAM,KAAK,CAAA;AACxB,IAAM,MAAA,KAAA,GAAQ,KAAK,eAAgB,CAAA,IAAA,CAAK,CAACA,OAAWA,KAAAA,OAAAA,CAAO,OAAQ,CAAA,IAAI,CAAC,CAAA;AACxE,IAAA,IAAI,KAAO,EAAA;AACV,MAAA,OAAO,KAAM,CAAA,IAAA,CAAK,KAAO,EAAA,KAAA,GAAQ,GAAG,KAAK,CAAA;AAAA;AAG1C,IAAA,IAAI,KAAK,aAAe,EAAA;AACvB,MAAA,OAAO,KAAK,aAAc,CAAA,IAAA,CAAK,KAAO,EAAA,KAAA,GAAQ,GAAG,KAAK,CAAA;AAAA;AAGvD,IAAA,MAAM,UAAU,IAAK,CAAA,UAAA,CAAW,GAAG,CAAK,IAAA,IAAA,CAAK,SAAS,GAAG,CAAA;AACzD,IAAI,IAAA,MAAA;AACJ,IAAA,IAAI,OAAS,EAAA;AACZ,MAAS,MAAA,GAAA,IAAI,cAAa,IAAK,CAAA,KAAA,CAAM,GAAG,EAAE,CAAA,EAAG,MAAM,IAAI,CAAA;AACvD,MAAA,IAAA,CAAK,aAAgB,GAAA,MAAA;AAAA,KACf,MAAA;AACN,MAAA,MAAA,GAAS,IAAI,aAAA,CAAa,IAAM,EAAA,KAAA,EAAO,IAAI,CAAA;AAC3C,MAAK,IAAA,CAAA,eAAA,CAAgB,KAAK,MAAM,CAAA;AAAA;AAGjC,IAAA,OAAO,MAAO,CAAA,IAAA,CAAK,KAAO,EAAA,KAAA,GAAQ,GAAG,KAAK,CAAA;AAAA;AAC3C,EAEU,cAAA,CAAe,KAA0B,EAAA,KAAA,EAAe,KAAuB,EAAA;AACxF,IAAI,IAAA,KAAA,IAAS,MAAM,MAAQ,EAAA;AAC1B,MAAA,IAAI,OAAU,GAAA,KAAA;AACd,MAAW,KAAA,MAAA,MAAA,IAAU,MAAM,OAAS,EAAA;AACnC,QAAA,IAAI,IAAK,CAAA,IAAA,CAAK,MAAO,CAAA,MAAA,EAAQ,KAAK,CAAG,EAAA;AACpC,UAAU,OAAA,GAAA,IAAA;AAAA;AACX;AAGD,MAAO,OAAA,OAAA;AAAA;AAGR,IAAM,MAAA,IAAA,GAAO,MAAM,KAAK,CAAA;AACxB,IAAM,MAAA,gBAAA,GAAmB,KAAK,eAAgB,CAAA,SAAA,CAAU,CAAC,MAAW,KAAA,MAAA,CAAO,OAAQ,CAAA,IAAI,CAAC,CAAA;AACxF,IAAA,IAAI,qBAAqB,EAAI,EAAA;AAC5B,MAAM,MAAA,KAAA,GAAQ,IAAK,CAAA,eAAA,CAAgB,KAAK,CAAA;AACxC,MAAA,MAAM,UAAU,KAAM,CAAA,OAAA,CAAQ,KAAO,EAAA,KAAA,GAAQ,GAAG,KAAK,CAAA;AACrD,MAAI,IAAA,OAAA,IAAW,MAAM,KAAO,EAAA;AAC3B,QAAA,IAAA,CAAK,kBAAkB,IAAK,CAAA,eAAA,CAAgB,OAAO,CAAC,MAAA,KAAW,WAAW,KAAK,CAAA;AAAA;AAGhF,MAAO,OAAA,OAAA;AAAA;AAGR,IAAA,IAAI,KAAK,aAAe,EAAA;AACvB,MAAA,MAAM,UAAU,IAAK,CAAA,aAAA,CAAc,QAAQ,KAAO,EAAA,KAAA,GAAQ,GAAG,KAAK,CAAA;AAClE,MAAI,IAAA,OAAA,IAAW,IAAK,CAAA,aAAA,CAAc,KAAO,EAAA;AACxC,QAAA,IAAA,CAAK,aAAgB,GAAA,IAAA;AAAA;AAGtB,MAAO,OAAA,OAAA;AAAA;AAGR,IAAO,OAAA,KAAA;AAAA;AACR,EAEU,KAAA,CAAM,OAA0B,KAAoC,EAAA;AAC7E,IAAI,IAAA,KAAA,IAAS,KAAM,CAAA,MAAA,EAAe,OAAA,IAAA;AAElC,IAAM,MAAA,IAAA,GAAO,MAAM,KAAK,CAAA;AACxB,IAAM,MAAA,KAAA,GAAQ,IAAK,CAAA,eAAA,CAAgB,IAAK,CAAA,CAAC,MAAW,KAAA,MAAA,CAAO,OAAQ,CAAA,IAAI,CAAC,CAAA,IAAK,IAAK,CAAA,aAAA;AAGlF,IAAI,IAAA,SAAA,CAAU,KAAK,CAAA,EAAU,OAAA,IAAA;AAG7B,IAAA,OAAO,KAAM,CAAA,KAAA,CAAM,KAAO,EAAA,KAAA,GAAQ,CAAC,CAAA;AAAA;AACpC,EAEU,+BAAwC,GAAA;AACjD,IAAA,MAAM,UAAU,IAAI,GAAA,CAAI,IAAK,CAAA,IAAA,CAAK,SAAS,CAAA;AAC3C,IAAW,KAAA,MAAA,KAAA,IAAS,KAAK,QAAU,EAAA;AAClC,MAAA,KAAA,MAAW,MAAU,IAAA,KAAA,CAAM,IAAK,CAAA,OAAA,EAAW,EAAA;AAC1C,QAAA,OAAA,CAAQ,IAAI,MAAM,CAAA;AAAA;AACnB;AAGD,IAAK,IAAA,CAAA,gBAAA,GAAmB,CAAC,GAAG,OAAO,CAAA;AAAA;AAErC,CAAA;AA7M0B,MAAA,CAAA,aAAA,EAAA,cAAA,CAAA;AAAnB,IAAM,YAAN,GAAA","file":"RouterBranch.mjs","sourcesContent":["import { isNullish } from '@sapphire/utilities';\nimport type { Route } from '../Route';\nimport { RouterNode } from './RouterNode';\n\nexport class RouterBranch {\n\t/**\n\t * The name of the branch.\n\t */\n\tpublic readonly name: string;\n\n\t/**\n\t * Whether or not the branch is dynamic.\n\t */\n\tpublic readonly dynamic: boolean;\n\n\t/**\n\t * The parent branch, if any.\n\t */\n\tpublic readonly parent: RouterBranch | null;\n\n\t/**\n\t * The node this branch is associated with.\n\t */\n\tpublic readonly node = new RouterNode(this);\n\n\t/**\n\t * The methods supported by the branch's node or any of its children.\n\t */\n\tpublic supportedMethods: readonly string[] = [];\n\n\tprivate _staticChildren: RouterBranch[] = [];\n\tprivate _dynamicChild: RouterBranch | null = null;\n\n\tpublic constructor(name: string, dynamic: boolean, parent: RouterBranch | null) {\n\t\tthis.name = name;\n\t\tthis.dynamic = dynamic;\n\t\tthis.parent = parent;\n\t}\n\n\t/**\n\t * The path representing this branch\n\t * @version 7.0.0\n\t */\n\tpublic get path(): string {\n\t\treturn this.parent ? `${this.parent}/${this}` : `${this}`;\n\t}\n\n\t/**\n\t * The branches the branch is associated with\n\t * @version 7.0.0\n\t */\n\tpublic get children(): RouterBranch[] {\n\t\treturn this._staticChildren.concat(this._dynamicChild ?? []);\n\t}\n\n\t/**\n\t * Whether or not the branch is empty\n\t * @version 7.0.0\n\t */\n\tpublic get empty(): boolean {\n\t\treturn this._staticChildren.length === 0 && this._dynamicChild === null;\n\t}\n\n\t/**\n\t * Tries to find a branch given a path\n\t * @version 7.0.0\n\t *\n\t * @param parts The parts of a path to find a node from\n\t * @returns The branch found, or null if not found\n\t */\n\tpublic find(parts: readonly string[]): RouterBranch | null {\n\t\treturn this._find(parts, 0);\n\t}\n\n\t/**\n\t * Checks if the given name matches the branch\n\t * @version 7.0.0\n\t *\n\t * @param name The name to match\n\t * @returns Whether or not the branch matches the name\n\t */\n\tpublic matches(name: string): boolean {\n\t\treturn this.dynamic || this.name === name;\n\t}\n\n\t/**\n\t * Returns the string representation of the branch\n\t * @version 7.0.0\n\t *\n\t * @returns The string representation of the branch\n\t */\n\tpublic toString(): string {\n\t\treturn this.dynamic ? `[${this.name}]` : this.name;\n\t}\n\n\tpublic *nodes(): IterableIterator<RouterNode> {\n\t\tyield this.node;\n\t\tfor (const child of this._staticChildren) {\n\t\t\tyield* child.nodes();\n\t\t}\n\n\t\tif (this._dynamicChild) {\n\t\t\tyield* this._dynamicChild.nodes();\n\t\t}\n\t}\n\n\tprotected _add(parts: readonly string[], index: number, route: Route): RouterNode {\n\t\tconst result = this._performAdd(parts, index, route);\n\t\tthis._updateSupportedChildrenMethods();\n\t\treturn result;\n\t}\n\n\tprotected _remove(parts: readonly string[], index: number, route: Route): boolean {\n\t\tconst result = this._performRemove(parts, index, route);\n\t\tif (result) this._updateSupportedChildrenMethods();\n\t\treturn result;\n\t}\n\n\tprotected _performAdd(parts: readonly string[], index: number, route: Route): RouterNode {\n\t\tif (index >= parts.length) {\n\t\t\tfor (const method of route.methods) {\n\t\t\t\tthis.node.set(method, route);\n\t\t\t}\n\n\t\t\treturn this.node;\n\t\t}\n\n\t\tconst part = parts[index];\n\t\tconst child = this._staticChildren.find((branch) => branch.matches(part));\n\t\tif (child) {\n\t\t\treturn child._add(parts, index + 1, route);\n\t\t}\n\n\t\tif (this._dynamicChild) {\n\t\t\treturn this._dynamicChild._add(parts, index + 1, route);\n\t\t}\n\n\t\tconst dynamic = part.startsWith('[') && part.endsWith(']');\n\t\tlet branch: RouterBranch;\n\t\tif (dynamic) {\n\t\t\tbranch = new RouterBranch(part.slice(1, -1), true, this);\n\t\t\tthis._dynamicChild = branch;\n\t\t} else {\n\t\t\tbranch = new RouterBranch(part, false, this);\n\t\t\tthis._staticChildren.push(branch);\n\t\t}\n\n\t\treturn branch._add(parts, index + 1, route);\n\t}\n\n\tprotected _performRemove(parts: readonly string[], index: number, route: Route): boolean {\n\t\tif (index >= parts.length) {\n\t\t\tlet success = false;\n\t\t\tfor (const method of route.methods) {\n\t\t\t\tif (this.node.delete(method, route)) {\n\t\t\t\t\tsuccess = true;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn success;\n\t\t}\n\n\t\tconst part = parts[index];\n\t\tconst staticChildIndex = this._staticChildren.findIndex((branch) => branch.matches(part));\n\t\tif (staticChildIndex === -1) {\n\t\t\tconst child = this._staticChildren[index];\n\t\t\tconst removed = child._remove(parts, index + 1, route);\n\t\t\tif (removed && child.empty) {\n\t\t\t\tthis._staticChildren = this._staticChildren.filter((branch) => branch !== child);\n\t\t\t}\n\n\t\t\treturn removed;\n\t\t}\n\n\t\tif (this._dynamicChild) {\n\t\t\tconst removed = this._dynamicChild._remove(parts, index + 1, route);\n\t\t\tif (removed && this._dynamicChild.empty) {\n\t\t\t\tthis._dynamicChild = null;\n\t\t\t}\n\n\t\t\treturn removed;\n\t\t}\n\n\t\treturn false;\n\t}\n\n\tprotected _find(parts: readonly string[], index: number): RouterBranch | null {\n\t\tif (index >= parts.length) return this;\n\n\t\tconst part = parts[index];\n\t\tconst child = this._staticChildren.find((branch) => branch.matches(part)) ?? this._dynamicChild;\n\n\t\t// If a child is not found, return null:\n\t\tif (isNullish(child)) return null;\n\n\t\t// Continue the search:\n\t\treturn child._find(parts, index + 1);\n\t}\n\n\tprotected _updateSupportedChildrenMethods(): void {\n\t\tconst methods = new Set(this.node.methods());\n\t\tfor (const child of this.children) {\n\t\t\tfor (const method of child.node.methods()) {\n\t\t\t\tmethods.add(method);\n\t\t\t}\n\t\t}\n\n\t\tthis.supportedMethods = [...methods];\n\t}\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../src/lib/structures/router/RouterRoot.ts"],"names":[],"mappings":";;;;AAMO,IAAM,WAAA,GAAN,MAAM,WAAA,SAAmB,YAAa,CAAA;AAAA,EACrC,WAAc,GAAA;AACpB,IAAM,KAAA,CAAA,UAAA,EAAY,OAAO,IAAI,CAAA;AAAA;AAC9B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQO,IAAI,KAA0B,EAAA;AACpC,IAAA,OAAO,IAAK,CAAA,IAAA,CAAK,KAAM,CAAA,IAAA,EAAM,GAAG,KAAK,CAAA;AAAA;AACtC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQO,OAAO,KAAuB,EAAA;AACpC,IAAA,OAAO,IAAK,CAAA,OAAA,CAAQ,KAAM,CAAA,IAAA,EAAM,GAAG,KAAK,CAAA;AAAA;AACzC;AAAA,EAGA,IAAoB,IAAe,GAAA;AAClC,IAAO,OAAA,EAAA;AAAA;AACR,EAEgB,QAAmB,GAAA;AAClC,IAAO,OAAA,EAAA;AAAA;AACR,EAEA,OAAc,qBAAsB,CAAA,WAAA,EAAgC,IAAsB,EAAA;AACzF,IAAA,MAAM,QAAkB,EAAC;AACzB,IAAA,KAAA,MAAW,aAAa,WAAa,EAAA;AACpC,MAAM,MAAA,OAAA,GAAU,UAAU,IAAK,EAAA;AAG/B,MAAI,IAAA,gBAAA,CAAiB,OAAO,CAAG,EAAA;AAE/B,MAAA,IAAI,QAAQ,UAAW,CAAA,GAAG,KAAK,OAAQ,CAAA,QAAA,CAAS,GAAG,CAAG,EAAA;AAEtD,MAAA,KAAA,CAAM,KAAK,OAAO,CAAA;AAAA;AAGnB,IAAA,IAAI,SAAS,OAAS,EAAA;AACrB,MAAM,KAAA,CAAA,IAAA,CAAK,IAAK,CAAA,IAAA,EAAM,CAAA;AAAA;AAGvB,IAAO,OAAA,KAAA,CAAM,KAAK,GAAG,CAAA;AAAA;AACtB,EAEA,OAAc,UAAU,IAA2C,EAAA;AAClE,IAAA,MAAM,QAAQ,EAAC;AACf,IAAI,IAAA,gBAAA,CAAiB,IAAI,CAAA,EAAU,OAAA,KAAA;AAEnC,IAAA,IAAI,IAAO,GAAA,EAAA;AACX,IAAA,KAAA,MAAW,QAAQ,IAAM,EAAA;AACxB,MAAA,IAAI,SAAS,GAAK,EAAA;AACjB,QAAA,IAAI,KAAK,MAAQ,EAAA;AAChB,UAAA,KAAA,CAAM,KAAK,IAAI,CAAA;AACf,UAAO,IAAA,GAAA,EAAA;AAAA;AACR,OACM,MAAA;AACN,QAAQ,IAAA,IAAA,IAAA;AAAA;AACT;AAGD,IAAA,IAAI,KAAK,MAAQ,EAAA;AAChB,MAAA,KAAA,CAAM,KAAK,IAAI,CAAA;AAAA;AAGhB,IAAO,OAAA,KAAA;AAAA;AACR,EAEA,OAAc,cAAc,IAAqD,EAAA;AAChF,IAAI,IAAA,IAAA,CAAK,MAAW,KAAA,CAAA,EAAU,OAAA,IAAA;AAC9B,IAAI,IAAA,OAAO,SAAS,QAAU,EAAA;AAC7B,MAAM,MAAA,4BAAA,GAA+B,IAAK,CAAA,WAAA,CAAY,GAAG,CAAA;AACzD,MAAA,IAAI,iCAAiC,CAAM,CAAA,IAAA,4BAAA,KAAiC,IAAK,CAAA,MAAA,GAAS,GAAU,OAAA,IAAA;AAEpG,MAAA,OAAO,IAAK,CAAA,KAAA,CAAM,4BAA+B,GAAA,CAAC,EAAE,WAAY,EAAA;AAAA;AAGjE,IAAM,MAAA,SAAA,GAAY,KAAK,MAAS,GAAA,CAAA;AAChC,IAAA,OAAO,WAAW,CAAA,aAAA,CAAc,IAAK,CAAA,SAAS,CAAC,CAAA;AAAA;AAEjD,CAAA;AAzF6C,MAAA,CAAA,WAAA,EAAA,YAAA,CAAA;AAAtC,IAAM,UAAN,GAAA","file":"RouterRoot.mjs","sourcesContent":["import { isNullishOrEmpty } from '@sapphire/utilities';\nimport type { Route } from '../Route';\nimport type { MethodName } from '../http/HttpMethods';\nimport { RouterBranch } from './RouterBranch';\nimport type { RouterNode } from './RouterNode';\n\nexport class RouterRoot extends RouterBranch {\n\tpublic constructor() {\n\t\tsuper('::ROOT::', false, null);\n\t}\n\n\t/**\n\t * Adds a route to the branch\n\t *\n\t * @param route The route to add\n\t * @returns The node the route was added to\n\t */\n\tpublic add(route: Route): RouterNode {\n\t\treturn this._add(route.path, 0, route);\n\t}\n\n\t/**\n\t * Removes a route from the branch\n\t *\n\t * @param route The route to remove\n\t * @returns Whether or not the route was removed\n\t */\n\tpublic remove(route: Route): boolean {\n\t\treturn this._remove(route.path, 0, route);\n\t}\n\n\t// eslint-disable-next-line @typescript-eslint/class-literal-property-style\n\tpublic override get path(): string {\n\t\treturn '';\n\t}\n\n\tpublic override toString(): string {\n\t\treturn '';\n\t}\n\n\tpublic static makeRoutePathForPiece(directories: readonly string[], name: string): string {\n\t\tconst parts: string[] = [];\n\t\tfor (const directory of directories) {\n\t\t\tconst trimmed = directory.trim();\n\n\t\t\t// If empty, skip:\n\t\t\tif (isNullishOrEmpty(trimmed)) continue;\n\t\t\t// If it's a group, skip:\n\t\t\tif (trimmed.startsWith('(') && trimmed.endsWith(')')) continue;\n\n\t\t\tparts.push(trimmed);\n\t\t}\n\n\t\tif (name !== 'index') {\n\t\t\tparts.push(name.trim());\n\t\t}\n\n\t\treturn parts.join('/');\n\t}\n\n\tpublic static normalize(path: string | null | undefined): string[] {\n\t\tconst parts = [] as string[];\n\t\tif (isNullishOrEmpty(path)) return parts;\n\n\t\tlet part = '';\n\t\tfor (const char of path) {\n\t\t\tif (char === '/') {\n\t\t\t\tif (part.length) {\n\t\t\t\t\tparts.push(part);\n\t\t\t\t\tpart = '';\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tpart += char;\n\t\t\t}\n\t\t}\n\n\t\tif (part.length) {\n\t\t\tparts.push(part);\n\t\t}\n\n\t\treturn parts;\n\t}\n\n\tpublic static extractMethod(path: string | readonly string[]): MethodName | null {\n\t\tif (path.length === 0) return null;\n\t\tif (typeof path === 'string') {\n\t\t\tconst methodSeparatorPositionIndex = path.lastIndexOf('.');\n\t\t\tif (methodSeparatorPositionIndex === -1 || methodSeparatorPositionIndex === path.length - 1) return null;\n\n\t\t\treturn path.slice(methodSeparatorPositionIndex + 1).toUpperCase() as MethodName;\n\t\t}\n\n\t\tconst lastIndex = path.length - 1;\n\t\treturn RouterRoot.extractMethod(path[lastIndex]);\n\t}\n}\n"]}
1
+ {"version":3,"sources":["../../../../../src/lib/structures/router/RouterRoot.ts"],"names":[],"mappings":";;;;AAMO,IAAM,WAAA,GAAN,MAAM,WAAA,SAAmB,YAAa,CAAA;AAAA,EACrC,WAAc,GAAA;AACpB,IAAM,KAAA,CAAA,UAAA,EAAY,OAAO,IAAI,CAAA;AAAA;AAC9B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQO,IAAI,KAA0B,EAAA;AACpC,IAAA,OAAO,IAAK,CAAA,IAAA,CAAK,KAAM,CAAA,IAAA,EAAM,GAAG,KAAK,CAAA;AAAA;AACtC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQO,OAAO,KAAuB,EAAA;AACpC,IAAA,OAAO,IAAK,CAAA,OAAA,CAAQ,KAAM,CAAA,IAAA,EAAM,GAAG,KAAK,CAAA;AAAA;AACzC;AAAA,EAGA,IAAoB,IAAe,GAAA;AAClC,IAAO,OAAA,EAAA;AAAA;AACR,EAEgB,QAAmB,GAAA;AAClC,IAAO,OAAA,EAAA;AAAA;AACR,EAEA,OAAc,qBAAsB,CAAA,WAAA,EAAgC,IAAsB,EAAA;AACzF,IAAA,MAAM,QAAkB,EAAC;AACzB,IAAA,KAAA,MAAW,aAAa,WAAa,EAAA;AACpC,MAAM,MAAA,OAAA,GAAU,UAAU,IAAK,EAAA;AAG/B,MAAI,IAAA,gBAAA,CAAiB,OAAO,CAAG,EAAA;AAE/B,MAAA,IAAI,QAAQ,UAAW,CAAA,GAAG,KAAK,OAAQ,CAAA,QAAA,CAAS,GAAG,CAAG,EAAA;AAEtD,MAAA,KAAA,CAAM,KAAK,OAAO,CAAA;AAAA;AAGnB,IAAA,IAAI,SAAS,OAAS,EAAA;AACrB,MAAM,KAAA,CAAA,IAAA,CAAK,IAAK,CAAA,IAAA,EAAM,CAAA;AAAA;AAGvB,IAAO,OAAA,KAAA,CAAM,KAAK,GAAG,CAAA;AAAA;AACtB,EAEA,OAAc,UAAU,IAA2C,EAAA;AAClE,IAAA,MAAM,QAAQ,EAAC;AACf,IAAI,IAAA,gBAAA,CAAiB,IAAI,CAAA,EAAU,OAAA,KAAA;AAEnC,IAAA,IAAI,IAAO,GAAA,EAAA;AACX,IAAA,KAAA,MAAW,QAAQ,IAAM,EAAA;AACxB,MAAA,IAAI,SAAS,GAAK,EAAA;AACjB,QAAA,IAAI,KAAK,MAAQ,EAAA;AAChB,UAAA,KAAA,CAAM,KAAK,IAAI,CAAA;AACf,UAAO,IAAA,GAAA,EAAA;AAAA;AACR,OACM,MAAA;AACN,QAAQ,IAAA,IAAA,IAAA;AAAA;AACT;AAGD,IAAA,IAAI,KAAK,MAAQ,EAAA;AAChB,MAAA,KAAA,CAAM,KAAK,IAAI,CAAA;AAAA;AAGhB,IAAO,OAAA,KAAA;AAAA;AACR,EAEA,OAAc,cAAc,IAAqD,EAAA;AAChF,IAAI,IAAA,IAAA,CAAK,MAAW,KAAA,CAAA,EAAU,OAAA,IAAA;AAC9B,IAAI,IAAA,OAAO,SAAS,QAAU,EAAA;AAC7B,MAAM,MAAA,4BAAA,GAA+B,IAAK,CAAA,WAAA,CAAY,GAAG,CAAA;AACzD,MAAA,IAAI,iCAAiC,EAAM,IAAA,4BAAA,KAAiC,IAAK,CAAA,MAAA,GAAS,GAAU,OAAA,IAAA;AAEpG,MAAA,OAAO,IAAK,CAAA,KAAA,CAAM,4BAA+B,GAAA,CAAC,EAAE,WAAY,EAAA;AAAA;AAGjE,IAAM,MAAA,SAAA,GAAY,KAAK,MAAS,GAAA,CAAA;AAChC,IAAA,OAAO,WAAW,CAAA,aAAA,CAAc,IAAK,CAAA,SAAS,CAAC,CAAA;AAAA;AAEjD,CAAA;AAzF6C,MAAA,CAAA,WAAA,EAAA,YAAA,CAAA;AAAtC,IAAM,UAAN,GAAA","file":"RouterRoot.mjs","sourcesContent":["import { isNullishOrEmpty } from '@sapphire/utilities';\nimport type { Route } from '../Route';\nimport type { MethodName } from '../http/HttpMethods';\nimport { RouterBranch } from './RouterBranch';\nimport type { RouterNode } from './RouterNode';\n\nexport class RouterRoot extends RouterBranch {\n\tpublic constructor() {\n\t\tsuper('::ROOT::', false, null);\n\t}\n\n\t/**\n\t * Adds a route to the branch\n\t *\n\t * @param route The route to add\n\t * @returns The node the route was added to\n\t */\n\tpublic add(route: Route): RouterNode {\n\t\treturn this._add(route.path, 0, route);\n\t}\n\n\t/**\n\t * Removes a route from the branch\n\t *\n\t * @param route The route to remove\n\t * @returns Whether or not the route was removed\n\t */\n\tpublic remove(route: Route): boolean {\n\t\treturn this._remove(route.path, 0, route);\n\t}\n\n\t// eslint-disable-next-line @typescript-eslint/class-literal-property-style\n\tpublic override get path(): string {\n\t\treturn '';\n\t}\n\n\tpublic override toString(): string {\n\t\treturn '';\n\t}\n\n\tpublic static makeRoutePathForPiece(directories: readonly string[], name: string): string {\n\t\tconst parts: string[] = [];\n\t\tfor (const directory of directories) {\n\t\t\tconst trimmed = directory.trim();\n\n\t\t\t// If empty, skip:\n\t\t\tif (isNullishOrEmpty(trimmed)) continue;\n\t\t\t// If it's a group, skip:\n\t\t\tif (trimmed.startsWith('(') && trimmed.endsWith(')')) continue;\n\n\t\t\tparts.push(trimmed);\n\t\t}\n\n\t\tif (name !== 'index') {\n\t\t\tparts.push(name.trim());\n\t\t}\n\n\t\treturn parts.join('/');\n\t}\n\n\tpublic static normalize(path: string | null | undefined): string[] {\n\t\tconst parts = [] as string[];\n\t\tif (isNullishOrEmpty(path)) return parts;\n\n\t\tlet part = '';\n\t\tfor (const char of path) {\n\t\t\tif (char === '/') {\n\t\t\t\tif (part.length) {\n\t\t\t\t\tparts.push(part);\n\t\t\t\t\tpart = '';\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tpart += char;\n\t\t\t}\n\t\t}\n\n\t\tif (part.length) {\n\t\t\tparts.push(part);\n\t\t}\n\n\t\treturn parts;\n\t}\n\n\tpublic static extractMethod(path: string | readonly string[]): MethodName | null {\n\t\tif (path.length === 0) return null;\n\t\tif (typeof path === 'string') {\n\t\t\tconst methodSeparatorPositionIndex = path.lastIndexOf('.');\n\t\t\tif (methodSeparatorPositionIndex === -1 || methodSeparatorPositionIndex === path.length - 1) return null;\n\n\t\t\treturn path.slice(methodSeparatorPositionIndex + 1).toUpperCase() as MethodName;\n\t\t}\n\n\t\tconst lastIndex = path.length - 1;\n\t\treturn RouterRoot.extractMethod(path[lastIndex]);\n\t}\n}\n"]}
@@ -22,7 +22,7 @@ var _RequestHeadersProxy = class _RequestHeadersProxy {
22
22
  }
23
23
  }
24
24
  delete(name) {
25
- this.request.headers[name] = void 0;
25
+ this.request.headers[name] = undefined;
26
26
  }
27
27
  get(name) {
28
28
  return normalizeValue(this.request.headers[name]);
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../src/lib/utils/_body/RequestHeadersProxy.ts"],"names":[],"mappings":"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","file":"RequestHeadersProxy.mjs","sourcesContent":["import { isNullishOrEmpty } from '@sapphire/utilities';\nimport { splitSetCookieString } from 'cookie-es';\nimport type { Headers, SpecIterableIterator } from 'undici';\nimport type { ApiRequest } from '../../structures/api/ApiRequest';\nimport { NodeUtilInspectSymbol } from '../constants';\n\nexport class RequestHeadersProxy implements Headers {\n\tprivate readonly request: ApiRequest;\n\n\tpublic constructor(request: ApiRequest) {\n\t\tthis.request = request;\n\t}\n\n\tpublic append(name: string, value: string): void {\n\t\tconst { headers } = this.request;\n\t\tconst current = headers[name];\n\t\tif (current) {\n\t\t\tif (Array.isArray(current)) {\n\t\t\t\tcurrent.push(value);\n\t\t\t} else {\n\t\t\t\theaders[name] = [current, value];\n\t\t\t}\n\t\t} else {\n\t\t\theaders[name] = value;\n\t\t}\n\t}\n\n\tpublic delete(name: string): void {\n\t\tthis.request.headers[name] = undefined;\n\t}\n\n\tpublic get(name: string): string | null {\n\t\treturn normalizeValue(this.request.headers[name]);\n\t}\n\n\tpublic has(name: string): boolean {\n\t\treturn !isNullishOrEmpty(this.request.headers[name]);\n\t}\n\n\tpublic set(name: string, value: string): void {\n\t\tthis.request.headers[name] = value;\n\t}\n\n\tpublic getSetCookie(): string[] {\n\t\tconst setCookie = this.get('set-cookie');\n\t\treturn setCookie === null ? [] : splitSetCookieString(setCookie);\n\t}\n\n\tpublic forEach(callbackfn: (value: string, key: string, iterable: Headers) => void, thisArg?: unknown): void {\n\t\tfor (const [key, value] of this.entries()) {\n\t\t\tcallbackfn.call(thisArg, value, key, this);\n\t\t}\n\t}\n\n\tpublic *keys(): SpecIterableIterator<string> {\n\t\tconst { headers } = this.request;\n\t\tfor (const key of Object.keys(headers)) {\n\t\t\tconst value = headers[key];\n\n\t\t\tif (!isNullishOrEmpty(value)) {\n\t\t\t\tyield key;\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic *values(): SpecIterableIterator<string> {\n\t\tconst { headers } = this.request;\n\t\tfor (const key of Object.keys(headers)) {\n\t\t\tconst value = headers[key];\n\n\t\t\tif (!isNullishOrEmpty(value)) {\n\t\t\t\tyield normalizeValue(value);\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic *entries(): SpecIterableIterator<[string, string]> {\n\t\tconst { headers } = this.request;\n\t\tfor (const key of Object.keys(headers)) {\n\t\t\tconst value = headers[key];\n\n\t\t\tif (!isNullishOrEmpty(value)) {\n\t\t\t\tyield [key, normalizeValue(value)];\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic [Symbol.iterator](): SpecIterableIterator<[string, string]> {\n\t\treturn this.entries();\n\t}\n\n\t// eslint-disable-next-line @typescript-eslint/class-literal-property-style\n\tpublic get [Symbol.toStringTag]() {\n\t\treturn 'Headers';\n\t}\n\n\tpublic [NodeUtilInspectSymbol]() {\n\t\treturn Object.fromEntries(this.entries());\n\t}\n}\n\nfunction normalizeValue(value: string | string[] | undefined): string {\n\tif (Array.isArray(value)) {\n\t\treturn value.join(', ');\n\t}\n\n\treturn String(value ?? '');\n}\n"]}
1
+ {"version":3,"sources":["../../../../../src/lib/utils/_body/RequestHeadersProxy.ts"],"names":[],"mappings":"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","file":"RequestHeadersProxy.mjs","sourcesContent":["import { isNullishOrEmpty } from '@sapphire/utilities';\nimport { splitSetCookieString } from 'cookie-es';\nimport type { Headers, SpecIterableIterator } from 'undici';\nimport type { ApiRequest } from '../../structures/api/ApiRequest';\nimport { NodeUtilInspectSymbol } from '../constants';\n\nexport class RequestHeadersProxy implements Headers {\n\tprivate readonly request: ApiRequest;\n\n\tpublic constructor(request: ApiRequest) {\n\t\tthis.request = request;\n\t}\n\n\tpublic append(name: string, value: string): void {\n\t\tconst { headers } = this.request;\n\t\tconst current = headers[name];\n\t\tif (current) {\n\t\t\tif (Array.isArray(current)) {\n\t\t\t\tcurrent.push(value);\n\t\t\t} else {\n\t\t\t\theaders[name] = [current, value];\n\t\t\t}\n\t\t} else {\n\t\t\theaders[name] = value;\n\t\t}\n\t}\n\n\tpublic delete(name: string): void {\n\t\tthis.request.headers[name] = undefined;\n\t}\n\n\tpublic get(name: string): string | null {\n\t\treturn normalizeValue(this.request.headers[name]);\n\t}\n\n\tpublic has(name: string): boolean {\n\t\treturn !isNullishOrEmpty(this.request.headers[name]);\n\t}\n\n\tpublic set(name: string, value: string): void {\n\t\tthis.request.headers[name] = value;\n\t}\n\n\tpublic getSetCookie(): string[] {\n\t\tconst setCookie = this.get('set-cookie');\n\t\treturn setCookie === null ? [] : splitSetCookieString(setCookie);\n\t}\n\n\tpublic forEach(callbackfn: (value: string, key: string, iterable: Headers) => void, thisArg?: unknown): void {\n\t\tfor (const [key, value] of this.entries()) {\n\t\t\tcallbackfn.call(thisArg, value, key, this);\n\t\t}\n\t}\n\n\tpublic *keys(): SpecIterableIterator<string> {\n\t\tconst { headers } = this.request;\n\t\tfor (const key of Object.keys(headers)) {\n\t\t\tconst value = headers[key];\n\n\t\t\tif (!isNullishOrEmpty(value)) {\n\t\t\t\tyield key;\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic *values(): SpecIterableIterator<string> {\n\t\tconst { headers } = this.request;\n\t\tfor (const key of Object.keys(headers)) {\n\t\t\tconst value = headers[key];\n\n\t\t\tif (!isNullishOrEmpty(value)) {\n\t\t\t\tyield normalizeValue(value);\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic *entries(): SpecIterableIterator<[string, string]> {\n\t\tconst { headers } = this.request;\n\t\tfor (const key of Object.keys(headers)) {\n\t\t\tconst value = headers[key];\n\n\t\t\tif (!isNullishOrEmpty(value)) {\n\t\t\t\tyield [key, normalizeValue(value)];\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic [Symbol.iterator](): SpecIterableIterator<[string, string]> {\n\t\treturn this.entries();\n\t}\n\n\t// eslint-disable-next-line @typescript-eslint/class-literal-property-style\n\tpublic get [Symbol.toStringTag]() {\n\t\treturn 'Headers';\n\t}\n\n\tpublic [NodeUtilInspectSymbol]() {\n\t\treturn Object.fromEntries(this.entries());\n\t}\n}\n\nfunction normalizeValue(value: string | string[] | undefined): string {\n\tif (Array.isArray(value)) {\n\t\treturn value.join(', ');\n\t}\n\n\treturn String(value ?? '');\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../src/lib/utils/_body/RequestURLProxy.ts"],"names":[],"mappings":"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","file":"RequestURLProxy.mjs","sourcesContent":["import { isNullishOrEmpty } from '@sapphire/utilities';\nimport type { ApiRequest } from '../../structures/api/ApiRequest';\nimport { NodeUtilInspectSymbol } from '../constants';\n\nexport class RequestURLProxy implements URL {\n\tpublic hash: string = '';\n\tpublic password: string = '';\n\tpublic username: string = '';\n\n\t#protocol: URLProtocol | null = null;\n\t#hostname: string | null = null;\n\t#port: string | null = null;\n\n\t#pathname: string | null = null;\n\t#search: string | null = null;\n\t#searchParams: URLSearchParams | null = null;\n\n\treadonly #request: ApiRequest;\n\n\tpublic constructor(request: ApiRequest) {\n\t\tthis.#request = request;\n\t}\n\n\tpublic get host(): string {\n\t\treturn this.#request.headers.host ?? '';\n\t}\n\n\tpublic set host(value: string) {\n\t\tthis.#hostname = null;\n\t\tthis.#port = null;\n\t\tthis.#request.headers.host = value;\n\t}\n\n\tpublic get hostname(): string {\n\t\tif (this.#hostname === null) {\n\t\t\tconst [hostname, port] = parseHost(this.#request.headers.host);\n\t\t\tthis.#hostname = hostname;\n\t\t\tthis.#port = port === -1 ? '' : String(port);\n\t\t}\n\n\t\treturn this.#hostname;\n\t}\n\n\tpublic set hostname(value: string) {\n\t\tthis.#hostname = value;\n\t}\n\n\tpublic get port(): string {\n\t\tif (this.#port === null) {\n\t\t\tconst [hostname, port] = parseHost(this.#request.headers.host);\n\t\t\tthis.#hostname = hostname;\n\t\t\tthis.#port = port === -1 ? String(this.#request.socket.localPort ?? '') : String(port);\n\t\t}\n\n\t\treturn this.#port;\n\t}\n\n\tpublic set port(value: string) {\n\t\tthis.#port = String(Number(value || ''));\n\t}\n\n\tpublic get pathname(): string {\n\t\tif (this.#pathname === null) {\n\t\t\tconst [pathname, search] = parsePath(this.#request.url);\n\t\t\tthis.#pathname = pathname;\n\t\t\tthis.#search ??= search;\n\t\t}\n\n\t\treturn this.#pathname;\n\t}\n\n\tpublic set pathname(value: string) {\n\t\tconst normalized = value.startsWith('/') ? value : `/${value}`;\n\t\tif (normalized === this.#pathname) return;\n\n\t\tthis.#pathname = normalized;\n\t\tthis.#request.url = normalized + this.search;\n\t}\n\n\tpublic get search(): string {\n\t\tif (this.#search === null) {\n\t\t\tconst [pathname, search] = parsePath(this.#request.url);\n\t\t\tthis.#pathname ??= pathname;\n\t\t\tthis.#search = search;\n\t\t}\n\n\t\treturn this.#search;\n\t}\n\n\tpublic set search(value: string) {\n\t\tlet normalized: string;\n\t\tif (value === '?') {\n\t\t\tnormalized = '';\n\t\t} else if (value && !value.startsWith('?')) {\n\t\t\tnormalized = `?${value}`;\n\t\t} else {\n\t\t\tnormalized = value;\n\t\t}\n\n\t\tif (normalized === this.#search) return;\n\n\t\tthis.#search = normalized;\n\t\tthis.#searchParams = null;\n\t\tthis.#request.url = this.pathname + normalized;\n\t}\n\n\tpublic get searchParams(): URLSearchParams {\n\t\tthis.#searchParams ??= new URLSearchParams(this.search);\n\t\treturn this.#searchParams;\n\t}\n\n\tpublic set searchParams(value: URLSearchParams) {\n\t\tthis.#searchParams = value;\n\t\tthis.search = value.toString();\n\t}\n\n\tpublic get protocol(): URLProtocol {\n\t\tthis.#protocol ??= (this.#request.socket as any).encrypted || this.#request.headers['x-forwarded-proto'] === 'https' ? 'https:' : 'http:';\n\t\treturn this.#protocol;\n\t}\n\n\tpublic set protocol(value: URLProtocol) {\n\t\tthis.#protocol = value;\n\t}\n\n\tpublic get origin(): string {\n\t\treturn `${this.protocol}//${this.host}`;\n\t}\n\n\tpublic set origin(_value: string) {\n\t\t// No-op\n\t}\n\n\tpublic get href(): string {\n\t\treturn `${this.protocol}//${this.host}${this.pathname}${this.search}`;\n\t}\n\n\tpublic set href(value: string) {\n\t\tconst url = new URL(value);\n\t\tthis.#protocol = url.protocol as URLProtocol;\n\t\tthis.username = url.username;\n\t\tthis.password = url.password;\n\t\tthis.#hostname = url.hostname;\n\t\tthis.#port = url.port;\n\t\tthis.#pathname = url.pathname;\n\t\tthis.#search = url.search;\n\t\tthis.hash = url.hash;\n\t}\n\n\tpublic toString(): string {\n\t\treturn this.href;\n\t}\n\n\tpublic toJSON(): string {\n\t\treturn this.href;\n\t}\n\n\t// eslint-disable-next-line @typescript-eslint/class-literal-property-style\n\tpublic get [Symbol.toStringTag]() {\n\t\treturn 'URL';\n\t}\n\n\tpublic [NodeUtilInspectSymbol]() {\n\t\treturn this.href;\n\t}\n}\n\nexport type URLProtocol = 'https:' | 'http:';\n\nfunction parsePath(input: string | undefined): [pathname: string, search: string] {\n\tconst url = (input ?? '/').replaceAll('\\\\', '/');\n\tconst index = url.indexOf('?');\n\tif (index === -1) {\n\t\treturn [url, ''];\n\t}\n\n\treturn [url.slice(0, index), url.slice(index)];\n}\n\nfunction parseHost(host: string | undefined): [hostname: string, port: number] {\n\tif (isNullishOrEmpty(host)) {\n\t\treturn ['localhost', -1];\n\t}\n\n\tconst index = host.indexOf(':');\n\tif (index === -1) {\n\t\treturn [host, -1];\n\t}\n\n\tconst port = Number(host.slice(index));\n\treturn [host.slice(0, index), Number.isSafeInteger(port) ? port : -1];\n}\n"]}
1
+ {"version":3,"sources":["../../../../../src/lib/utils/_body/RequestURLProxy.ts"],"names":[],"mappings":"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","file":"RequestURLProxy.mjs","sourcesContent":["import { isNullishOrEmpty } from '@sapphire/utilities';\nimport type { ApiRequest } from '../../structures/api/ApiRequest';\nimport { NodeUtilInspectSymbol } from '../constants';\n\nexport class RequestURLProxy implements URL {\n\tpublic hash: string = '';\n\tpublic password: string = '';\n\tpublic username: string = '';\n\n\t#protocol: URLProtocol | null = null;\n\t#hostname: string | null = null;\n\t#port: string | null = null;\n\n\t#pathname: string | null = null;\n\t#search: string | null = null;\n\t#searchParams: URLSearchParams | null = null;\n\n\treadonly #request: ApiRequest;\n\n\tpublic constructor(request: ApiRequest) {\n\t\tthis.#request = request;\n\t}\n\n\tpublic get host(): string {\n\t\treturn this.#request.headers.host ?? '';\n\t}\n\n\tpublic set host(value: string) {\n\t\tthis.#hostname = null;\n\t\tthis.#port = null;\n\t\tthis.#request.headers.host = value;\n\t}\n\n\tpublic get hostname(): string {\n\t\tif (this.#hostname === null) {\n\t\t\tconst [hostname, port] = parseHost(this.#request.headers.host);\n\t\t\tthis.#hostname = hostname;\n\t\t\tthis.#port = port === -1 ? '' : String(port);\n\t\t}\n\n\t\treturn this.#hostname;\n\t}\n\n\tpublic set hostname(value: string) {\n\t\tthis.#hostname = value;\n\t}\n\n\tpublic get port(): string {\n\t\tif (this.#port === null) {\n\t\t\tconst [hostname, port] = parseHost(this.#request.headers.host);\n\t\t\tthis.#hostname = hostname;\n\t\t\tthis.#port = port === -1 ? String(this.#request.socket.localPort ?? '') : String(port);\n\t\t}\n\n\t\treturn this.#port;\n\t}\n\n\tpublic set port(value: string) {\n\t\tthis.#port = String(Number(value || ''));\n\t}\n\n\tpublic get pathname(): string {\n\t\tif (this.#pathname === null) {\n\t\t\tconst [pathname, search] = parsePath(this.#request.url);\n\t\t\tthis.#pathname = pathname;\n\t\t\tthis.#search ??= search;\n\t\t}\n\n\t\treturn this.#pathname;\n\t}\n\n\tpublic set pathname(value: string) {\n\t\tconst normalized = value.startsWith('/') ? value : `/${value}`;\n\t\tif (normalized === this.#pathname) return;\n\n\t\tthis.#pathname = normalized;\n\t\tthis.#request.url = normalized + this.search;\n\t}\n\n\tpublic get search(): string {\n\t\tif (this.#search === null) {\n\t\t\tconst [pathname, search] = parsePath(this.#request.url);\n\t\t\tthis.#pathname ??= pathname;\n\t\t\tthis.#search = search;\n\t\t}\n\n\t\treturn this.#search;\n\t}\n\n\tpublic set search(value: string) {\n\t\tlet normalized: string;\n\t\tif (value === '?') {\n\t\t\tnormalized = '';\n\t\t} else if (value && !value.startsWith('?')) {\n\t\t\tnormalized = `?${value}`;\n\t\t} else {\n\t\t\tnormalized = value;\n\t\t}\n\n\t\tif (normalized === this.#search) return;\n\n\t\tthis.#search = normalized;\n\t\tthis.#searchParams = null;\n\t\tthis.#request.url = this.pathname + normalized;\n\t}\n\n\tpublic get searchParams(): URLSearchParams {\n\t\tthis.#searchParams ??= new URLSearchParams(this.search);\n\t\treturn this.#searchParams;\n\t}\n\n\tpublic set searchParams(value: URLSearchParams) {\n\t\tthis.#searchParams = value;\n\t\tthis.search = value.toString();\n\t}\n\n\tpublic get protocol(): URLProtocol {\n\t\tthis.#protocol ??= (this.#request.socket as any).encrypted || this.#request.headers['x-forwarded-proto'] === 'https' ? 'https:' : 'http:';\n\t\treturn this.#protocol;\n\t}\n\n\tpublic set protocol(value: URLProtocol) {\n\t\tthis.#protocol = value;\n\t}\n\n\tpublic get origin(): string {\n\t\treturn `${this.protocol}//${this.host}`;\n\t}\n\n\tpublic set origin(_value: string) {\n\t\t// No-op\n\t}\n\n\tpublic get href(): string {\n\t\treturn `${this.protocol}//${this.host}${this.pathname}${this.search}`;\n\t}\n\n\tpublic set href(value: string) {\n\t\tconst url = new URL(value);\n\t\tthis.#protocol = url.protocol as URLProtocol;\n\t\tthis.username = url.username;\n\t\tthis.password = url.password;\n\t\tthis.#hostname = url.hostname;\n\t\tthis.#port = url.port;\n\t\tthis.#pathname = url.pathname;\n\t\tthis.#search = url.search;\n\t\tthis.hash = url.hash;\n\t}\n\n\tpublic toString(): string {\n\t\treturn this.href;\n\t}\n\n\tpublic toJSON(): string {\n\t\treturn this.href;\n\t}\n\n\t// eslint-disable-next-line @typescript-eslint/class-literal-property-style\n\tpublic get [Symbol.toStringTag]() {\n\t\treturn 'URL';\n\t}\n\n\tpublic [NodeUtilInspectSymbol]() {\n\t\treturn this.href;\n\t}\n}\n\nexport type URLProtocol = 'https:' | 'http:';\n\nfunction parsePath(input: string | undefined): [pathname: string, search: string] {\n\tconst url = (input ?? '/').replaceAll('\\\\', '/');\n\tconst index = url.indexOf('?');\n\tif (index === -1) {\n\t\treturn [url, ''];\n\t}\n\n\treturn [url.slice(0, index), url.slice(index)];\n}\n\nfunction parseHost(host: string | undefined): [hostname: string, port: number] {\n\tif (isNullishOrEmpty(host)) {\n\t\treturn ['localhost', -1];\n\t}\n\n\tconst index = host.indexOf(':');\n\tif (index === -1) {\n\t\treturn [host, -1];\n\t}\n\n\tconst port = Number(host.slice(index));\n\treturn [host.slice(0, index), Number.isSafeInteger(port) ? port : -1];\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/listeners/PluginServerRequest.ts"],"names":[],"mappings":";;;;;AAAA,IAAA,yBAAA,EAAA,WAAA;AAOO,IAAM,eAAA,GAAN,MAAM,eAAA,SAAuB,QAAS,CAAA;AAAA,EACrC,YAAY,OAAiC,EAAA;AACnD,IAAA,KAAA,CAAM,SAAS,EAAE,OAAA,EAAS,UAAU,KAAO,EAAA,WAAA,CAAY,SAAS,CAAA;AAF3D,IAAA,YAAA,CAAA,IAAA,EAAA,yBAAA,CAAA;AAAA;AAGN,EAEA,MAAsB,GAAI,CAAA,OAAA,EAAqB,QAAuB,EAAA;AACrE,IAAA,MAAM,EAAE,KAAO,EAAA,WAAA,KAAgB,eAAK,CAAA,IAAA,EAAA,yBAAA,EAAA,WAAA,CAAA,CAAL,WAAe,OAAQ,CAAA,GAAA,CAAA;AACtD,IAAQ,OAAA,CAAA,KAAA,GAAQ,OAAO,WAAY,CAAA,IAAI,gBAAgB,WAAW,CAAA,CAAE,SAAS,CAAA;AAE7E,IAAA,MAAM,SAAS,IAAK,CAAA,SAAA,CAAU,OAAO,MAAO,CAAA,MAAA,CAAO,KAAK,KAAK,CAAA;AAC7D,IAAM,MAAA,IAAA,GAAO,MAAS,GAAA,MAAA,CAAO,IAAO,GAAA,IAAA;AACpC,IAAA,MAAM,QAAQ,IAAO,GAAA,IAAA,CAAK,IAAK,OAAQ,CAAA,MAAA,IAAU,KAAoB,CAAI,GAAA,IAAA;AAEzE,IAAA,IAAI,SAAS,IAAM,EAAA;AAClB,MAAQ,OAAA,CAAA,MAAA,GAAS,IAAM,CAAA,iBAAA,CAAkB,KAAK,CAAA;AAAA;AAG/C,IAAA,OAAA,CAAQ,UAAa,GAAA,IAAA;AACrB,IAAA,OAAA,CAAQ,KAAQ,GAAA,KAAA;AAEhB,IAAI,IAAA;AAEH,MAAA,MAAM,KAAK,SAAU,CAAA,MAAA,CAAO,WAAY,CAAA,GAAA,CAAI,SAAS,QAAQ,CAAA;AAAA,aACrD,KAAO,EAAA;AACf,MAAA,IAAA,CAAK,UAAU,MAAO,CAAA,IAAA,CAAK,YAAY,eAAiB,EAAA,KAAA,EAAgB,SAAS,QAAQ,CAAA;AAGzF,MAAA;AAAA;AAGD,IAAA,IAAI,WAAW,IAAM,EAAA;AACpB,MAAA,IAAA,CAAK,UAAU,MAAO,CAAA,IAAA,CAAK,WAAY,CAAA,oBAAA,EAAsB,SAAS,QAAQ,CAAA;AAAA,KAC/E,MAAA,IAAW,UAAU,IAAM,EAAA;AAC1B,MAAA,IAAA,CAAK,UAAU,MAAO,CAAA,IAAA,CAAK,YAAY,4BAA8B,EAAA,OAAA,EAAS,UAAU,MAAM,CAAA;AAAA,KACxF,MAAA;AACN,MAAA,IAAA,CAAK,UAAU,MAAO,CAAA,IAAA,CAAK,WAAY,CAAA,WAAA,EAAa,SAAS,QAAQ,CAAA;AAAA;AACtE;AAkBF,CAAA;AAtDO,yBAAA,GAAA,IAAA,OAAA,EAAA;AAuCN,WAAS,mBAAA,MAAA,CAAA,SAAC,MAAM,EAAI,EAAA;AACnB,EAAM,MAAA,KAAA,GAAQ,GAAI,CAAA,OAAA,CAAQ,GAAG,CAAA;AAE7B,EAAI,IAAA,QAAA;AACJ,EAAI,IAAA,WAAA;AACJ,EAAA,IAAI,UAAU,CAAI,CAAA,EAAA;AACjB,IAAW,QAAA,GAAA,GAAA;AACX,IAAc,WAAA,GAAA,EAAA;AAAA,GACR,MAAA;AACN,IAAW,QAAA,GAAA,GAAA,CAAI,SAAU,CAAA,CAAA,EAAG,KAAK,CAAA;AACjC,IAAc,WAAA,GAAA,GAAA,CAAI,SAAU,CAAA,KAAA,GAAQ,CAAC,CAAA;AAAA;AAGtC,EAAA,OAAO,EAAE,KAAO,EAAA,UAAA,CAAW,SAAU,CAAA,QAAQ,GAAG,WAAY,EAAA;AAC7D,CAdS,EAAA,WAAA,CAAA;AAvCmC,MAAA,CAAA,eAAA,EAAA,gBAAA,CAAA;AAAtC,IAAM,cAAN,GAAA","file":"PluginServerRequest.mjs","sourcesContent":["import { Listener } from '@sapphire/framework';\nimport type { ApiRequest } from '../lib/structures/api/ApiRequest';\nimport type { ApiResponse } from '../lib/structures/api/ApiResponse';\nimport type { MethodName } from '../lib/structures/http/HttpMethods';\nimport { ServerEvent } from '../lib/structures/http/Server';\nimport { RouterRoot } from '../lib/structures/router/RouterRoot';\n\nexport class PluginListener extends Listener {\n\tpublic constructor(context: Listener.LoaderContext) {\n\t\tsuper(context, { emitter: 'server', event: ServerEvent.Request });\n\t}\n\n\tpublic override async run(request: ApiRequest, response: ApiResponse) {\n\t\tconst { parts, querystring } = this.#parseURL(request.url);\n\t\trequest.query = Object.fromEntries(new URLSearchParams(querystring).entries());\n\n\t\tconst branch = this.container.server.routes.router.find(parts);\n\t\tconst node = branch ? branch.node : null;\n\t\tconst route = node ? node.get((request.method ?? 'GET') as MethodName) : null;\n\n\t\tif (node !== null) {\n\t\t\trequest.params = node!.extractParameters(parts);\n\t\t}\n\n\t\trequest.routerNode = node;\n\t\trequest.route = route;\n\n\t\ttry {\n\t\t\t// Middlewares need to be run regardless of the match, specially since browsers do an OPTIONS request first.\n\t\t\tawait this.container.server.middlewares.run(request, response);\n\t\t} catch (error) {\n\t\t\tthis.container.server.emit(ServerEvent.MiddlewareError, error as Error, request, response);\n\n\t\t\t// If a middleware errored, it might cause undefined behavior in the routes, so we will return early.\n\t\t\treturn;\n\t\t}\n\n\t\tif (branch === null) {\n\t\t\tthis.container.server.emit(ServerEvent.RouterBranchNotFound, request, response);\n\t\t} else if (route === null) {\n\t\t\tthis.container.server.emit(ServerEvent.RouterBranchMethodNotAllowed, request, response, branch);\n\t\t} else {\n\t\t\tthis.container.server.emit(ServerEvent.RouterFound, request, response);\n\t\t}\n\t}\n\n\t#parseURL(url = '') {\n\t\tconst index = url.indexOf('?');\n\n\t\tlet pathname: string;\n\t\tlet querystring: string;\n\t\tif (index === -1) {\n\t\t\tpathname = url;\n\t\t\tquerystring = '';\n\t\t} else {\n\t\t\tpathname = url.substring(0, index);\n\t\t\tquerystring = url.substring(index + 1);\n\t\t}\n\n\t\treturn { parts: RouterRoot.normalize(pathname), querystring };\n\t}\n}\n"]}
1
+ {"version":3,"sources":["../../../src/listeners/PluginServerRequest.ts"],"names":[],"mappings":";;;;;AAAA,IAAA,yBAAA,EAAA,WAAA;AAOO,IAAM,eAAA,GAAN,MAAM,eAAA,SAAuB,QAAS,CAAA;AAAA,EACrC,YAAY,OAAiC,EAAA;AACnD,IAAA,KAAA,CAAM,SAAS,EAAE,OAAA,EAAS,UAAU,KAAO,EAAA,WAAA,CAAY,SAAS,CAAA;AAF3D,IAAA,YAAA,CAAA,IAAA,EAAA,yBAAA,CAAA;AAAA;AAGN,EAEA,MAAsB,GAAI,CAAA,OAAA,EAAqB,QAAuB,EAAA;AACrE,IAAA,MAAM,EAAE,KAAO,EAAA,WAAA,KAAgB,eAAK,CAAA,IAAA,EAAA,yBAAA,EAAA,WAAA,CAAA,CAAL,WAAe,OAAQ,CAAA,GAAA,CAAA;AACtD,IAAQ,OAAA,CAAA,KAAA,GAAQ,OAAO,WAAY,CAAA,IAAI,gBAAgB,WAAW,CAAA,CAAE,SAAS,CAAA;AAE7E,IAAA,MAAM,SAAS,IAAK,CAAA,SAAA,CAAU,OAAO,MAAO,CAAA,MAAA,CAAO,KAAK,KAAK,CAAA;AAC7D,IAAM,MAAA,IAAA,GAAO,MAAS,GAAA,MAAA,CAAO,IAAO,GAAA,IAAA;AACpC,IAAA,MAAM,QAAQ,IAAO,GAAA,IAAA,CAAK,IAAK,OAAQ,CAAA,MAAA,IAAU,KAAoB,CAAI,GAAA,IAAA;AAEzE,IAAA,IAAI,SAAS,IAAM,EAAA;AAClB,MAAQ,OAAA,CAAA,MAAA,GAAS,IAAM,CAAA,iBAAA,CAAkB,KAAK,CAAA;AAAA;AAG/C,IAAA,OAAA,CAAQ,UAAa,GAAA,IAAA;AACrB,IAAA,OAAA,CAAQ,KAAQ,GAAA,KAAA;AAEhB,IAAI,IAAA;AAEH,MAAA,MAAM,KAAK,SAAU,CAAA,MAAA,CAAO,WAAY,CAAA,GAAA,CAAI,SAAS,QAAQ,CAAA;AAAA,aACrD,KAAO,EAAA;AACf,MAAA,IAAA,CAAK,UAAU,MAAO,CAAA,IAAA,CAAK,YAAY,eAAiB,EAAA,KAAA,EAAgB,SAAS,QAAQ,CAAA;AAGzF,MAAA;AAAA;AAGD,IAAA,IAAI,WAAW,IAAM,EAAA;AACpB,MAAA,IAAA,CAAK,UAAU,MAAO,CAAA,IAAA,CAAK,WAAY,CAAA,oBAAA,EAAsB,SAAS,QAAQ,CAAA;AAAA,KAC/E,MAAA,IAAW,UAAU,IAAM,EAAA;AAC1B,MAAA,IAAA,CAAK,UAAU,MAAO,CAAA,IAAA,CAAK,YAAY,4BAA8B,EAAA,OAAA,EAAS,UAAU,MAAM,CAAA;AAAA,KACxF,MAAA;AACN,MAAA,IAAA,CAAK,UAAU,MAAO,CAAA,IAAA,CAAK,WAAY,CAAA,WAAA,EAAa,SAAS,QAAQ,CAAA;AAAA;AACtE;AAkBF,CAAA;AAtDO,yBAAA,GAAA,IAAA,OAAA,EAAA;AAuCN,WAAS,mBAAA,MAAA,CAAA,SAAC,MAAM,EAAI,EAAA;AACnB,EAAM,MAAA,KAAA,GAAQ,GAAI,CAAA,OAAA,CAAQ,GAAG,CAAA;AAE7B,EAAI,IAAA,QAAA;AACJ,EAAI,IAAA,WAAA;AACJ,EAAA,IAAI,UAAU,EAAI,EAAA;AACjB,IAAW,QAAA,GAAA,GAAA;AACX,IAAc,WAAA,GAAA,EAAA;AAAA,GACR,MAAA;AACN,IAAW,QAAA,GAAA,GAAA,CAAI,SAAU,CAAA,CAAA,EAAG,KAAK,CAAA;AACjC,IAAc,WAAA,GAAA,GAAA,CAAI,SAAU,CAAA,KAAA,GAAQ,CAAC,CAAA;AAAA;AAGtC,EAAA,OAAO,EAAE,KAAO,EAAA,UAAA,CAAW,SAAU,CAAA,QAAQ,GAAG,WAAY,EAAA;AAC7D,CAdS,EAAA,WAAA,CAAA;AAvCmC,MAAA,CAAA,eAAA,EAAA,gBAAA,CAAA;AAAtC,IAAM,cAAN,GAAA","file":"PluginServerRequest.mjs","sourcesContent":["import { Listener } from '@sapphire/framework';\nimport type { ApiRequest } from '../lib/structures/api/ApiRequest';\nimport type { ApiResponse } from '../lib/structures/api/ApiResponse';\nimport type { MethodName } from '../lib/structures/http/HttpMethods';\nimport { ServerEvent } from '../lib/structures/http/Server';\nimport { RouterRoot } from '../lib/structures/router/RouterRoot';\n\nexport class PluginListener extends Listener {\n\tpublic constructor(context: Listener.LoaderContext) {\n\t\tsuper(context, { emitter: 'server', event: ServerEvent.Request });\n\t}\n\n\tpublic override async run(request: ApiRequest, response: ApiResponse) {\n\t\tconst { parts, querystring } = this.#parseURL(request.url);\n\t\trequest.query = Object.fromEntries(new URLSearchParams(querystring).entries());\n\n\t\tconst branch = this.container.server.routes.router.find(parts);\n\t\tconst node = branch ? branch.node : null;\n\t\tconst route = node ? node.get((request.method ?? 'GET') as MethodName) : null;\n\n\t\tif (node !== null) {\n\t\t\trequest.params = node!.extractParameters(parts);\n\t\t}\n\n\t\trequest.routerNode = node;\n\t\trequest.route = route;\n\n\t\ttry {\n\t\t\t// Middlewares need to be run regardless of the match, specially since browsers do an OPTIONS request first.\n\t\t\tawait this.container.server.middlewares.run(request, response);\n\t\t} catch (error) {\n\t\t\tthis.container.server.emit(ServerEvent.MiddlewareError, error as Error, request, response);\n\n\t\t\t// If a middleware errored, it might cause undefined behavior in the routes, so we will return early.\n\t\t\treturn;\n\t\t}\n\n\t\tif (branch === null) {\n\t\t\tthis.container.server.emit(ServerEvent.RouterBranchNotFound, request, response);\n\t\t} else if (route === null) {\n\t\t\tthis.container.server.emit(ServerEvent.RouterBranchMethodNotAllowed, request, response, branch);\n\t\t} else {\n\t\t\tthis.container.server.emit(ServerEvent.RouterFound, request, response);\n\t\t}\n\t}\n\n\t#parseURL(url = '') {\n\t\tconst index = url.indexOf('?');\n\n\t\tlet pathname: string;\n\t\tlet querystring: string;\n\t\tif (index === -1) {\n\t\t\tpathname = url;\n\t\t\tquerystring = '';\n\t\t} else {\n\t\t\tpathname = url.substring(0, index);\n\t\t\tquerystring = url.substring(index + 1);\n\t\t}\n\n\t\treturn { parts: RouterRoot.normalize(pathname), querystring };\n\t}\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sapphire/plugin-api",
3
- "version": "8.1.0-next.aa2ed66",
3
+ "version": "8.1.0-next.adf9c85",
4
4
  "description": "Plugin for @sapphire/framework to expose a REST API",
5
5
  "author": "@sapphire",
6
6
  "license": "MIT",
@@ -39,7 +39,7 @@
39
39
  "lint": "eslint src tests --ext ts --fix",
40
40
  "build": "tsup && yarn build:types && yarn build:rename-cjs-register",
41
41
  "build:types": "concurrently \"yarn:build:types:*\"",
42
- "build:types:cjs": "rollup-type-bundler -d dist/cjs -ot .cts",
42
+ "build:types:cjs": "rollup-type-bundler -d dist/cjs --output-typings-file-extension .cts",
43
43
  "build:types:esm": "rollup-type-bundler -d dist/esm -t .mts",
44
44
  "build:types:cleanup": "tsx ../../scripts/clean-register-imports.mts",
45
45
  "build:rename-cjs-register": "tsx ../../scripts/rename-cjs-register.mts",
@@ -86,8 +86,8 @@
86
86
  "access": "public"
87
87
  },
88
88
  "devDependencies": {
89
- "@favware/cliff-jumper": "^5.0.0",
90
- "@favware/rollup-type-bundler": "^3.3.0",
89
+ "@favware/cliff-jumper": "^6.0.0",
90
+ "@favware/rollup-type-bundler": "^4.0.0",
91
91
  "concurrently": "^9.1.2",
92
92
  "tsup": "^8.3.5",
93
93
  "tsx": "^4.19.2",