UNPKG

@sapphire/plugin-api

Version:

Plugin for @sapphire/framework to expose a REST API

1 lines • 10.8 kB
{"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"]}