{"version":3,"file":"main.cjs","sources":["../transpiled/router-options.js","../transpiled/utils/string.js","../transpiled/route-node.js","../transpiled/template.js","../transpiled/router.js"],"sourcesContent":["/**\n * @description\n * Default options to be passed to the router\n */\nexport const defaultRouterOptions = {\n    /**\n     * @description\n     * Default encoding function to use, this is the encodeUriComponent function by default\n     *\n     * @param decodedValue value to be encoded\n     * @returns encoded value\n     */\n    parameterValueEncoder: (decodedValue) => encodeURIComponent(decodedValue),\n    /**\n     * @description\n     * Default decoding function to use, this is the decodeURIComponent function by default\n     *\n     * @param encodedValue value to be decoded\n     * @returns decoded value\n     */\n    parameterValueDecoder: (encodedValue) => decodeURIComponent(encodedValue),\n    /**\n     * Use `{` and `}` as a default for matching placeholders in the route templates.\n     */\n    parameterPlaceholderRE: /\\{(.*?)\\}/gu,\n    /**\n     * Assume a maximum parameter value length of 50\n     */\n    maximumParameterValueLength: 50,\n};\n//# sourceMappingURL=router-options.js.map","export function findCommonPrefixLength(stringLeft, stringRight) {\n    const length = Math.min(stringLeft.length, stringRight.length);\n    let index;\n    for (index = 0; index < length; index++) {\n        const charLeft = stringLeft.charAt(index);\n        const charRight = stringRight.charAt(index);\n        if (charLeft !== charRight) {\n            break;\n        }\n    }\n    return index;\n}\n//# sourceMappingURL=string.js.map","import { findCommonPrefixLength } from \"./utils/string.js\";\n/**\n * @description\n * This interface represents a node in the tree structure that holds all the node\n * for the routes\n */\nexport class RouteNode {\n    anchor;\n    hasParameter;\n    routeKey;\n    children;\n    constructor(\n    /**\n     * @description\n     * suffix that comes after the parameter value (if any!) of the path\n     */\n    anchor = \"\", \n    /**\n     * @description\n     * does this node have a parameter value\n     */\n    hasParameter = false, \n    /**\n     * @description\n     * key that identifies the route, if this is a leaf node for the route\n     */\n    routeKey = null, \n    /**\n     * @description\n     * children that represent the rest of the path that needs to be matched\n     */\n    children = new Array()) {\n        this.anchor = anchor;\n        this.hasParameter = hasParameter;\n        this.routeKey = routeKey;\n        this.children = children;\n    }\n    addChild(childNode) {\n        this.children.push(childNode);\n    }\n    removeChild(childNode) {\n        const childIndex = this.children.indexOf(childNode);\n        this.children.splice(childIndex, 1);\n    }\n    countChildren() {\n        return this.children.length;\n    }\n    insert(routeKey, templatePairs) {\n        const routeParameterNames = templatePairs\n            .map(([, parameterName]) => parameterName)\n            .filter((parameterName) => parameterName);\n        // eslint-disable-next-line @typescript-eslint/no-this-alias\n        let currentNode = this;\n        for (let index = 0; index < templatePairs.length; index++) {\n            const [anchor, parameterName] = templatePairs[index];\n            const hasParameter = parameterName != null;\n            const [commonPrefixLength, childNode] = currentNode.findSimilarChild(anchor, hasParameter);\n            currentNode = currentNode.merge(childNode, anchor, hasParameter, index === templatePairs.length - 1 ? routeKey : null, routeParameterNames, commonPrefixLength);\n        }\n        return currentNode;\n    }\n    parse(path, maximumParameterValueLength) {\n        const parameterValues = new Array();\n        if (this.hasParameter) {\n            // we are matching a parameter value! If the path's length is 0, there is no match, because a parameter value should have at least length 1\n            if (path.length === 0) {\n                return [null, []];\n            }\n            // look for the anchor in the path (note: indexOf is probably the most expensive operation!) If the anchor is empty, match the remainder of the path\n            const index = this.anchor.length === 0\n                ? path.length\n                : path\n                    .substring(0, maximumParameterValueLength + this.anchor.length)\n                    .indexOf(this.anchor);\n            if (index < 0) {\n                return [null, []];\n            }\n            // get the parameter value\n            const value = path.substring(0, index);\n            // remove the matches part from the path\n            path = path.substring(index + this.anchor.length);\n            // add value to parameters\n            parameterValues.push(value);\n        }\n        else {\n            // if this node does not represent a parameter we expect the path to start with the `anchor`\n            if (!path.startsWith(this.anchor)) {\n                // this node does not match the path\n                return [null, []];\n            }\n            // we successfully matches the node to the path, now remove the matched part from the path\n            path = path.substring(this.anchor.length);\n        }\n        for (const childNode of this.children) {\n            // find a route in every child node\n            const [childRouteKey, childParameterValues] = childNode.parse(path, maximumParameterValueLength);\n            // if a child node is matched, return that node instead of the current! So child nodes are matched first!\n            if (childRouteKey != null) {\n                return [childRouteKey, [...parameterValues, ...childParameterValues]];\n            }\n        }\n        // if the node had a route name and there is no path left to match against then we found a route\n        if (this.routeKey != null && path.length === 0) {\n            return [this.routeKey, parameterValues];\n        }\n        // we did not found a route :-(\n        return [null, []];\n    }\n    merge(childNode, anchor, hasParameter, routeKey, routeParameterNames, commonPrefixLength) {\n        if (childNode == null) {\n            return this.mergeNew(anchor, hasParameter, routeKey);\n        }\n        const commonPrefix = childNode.anchor.substring(0, commonPrefixLength);\n        if (childNode.anchor === anchor) {\n            return this.mergeJoin(childNode, routeKey);\n        }\n        else if (childNode.anchor === commonPrefix) {\n            return this.mergeAddToChild(childNode, anchor, hasParameter, routeKey, routeParameterNames, commonPrefixLength);\n        }\n        else if (anchor === commonPrefix) {\n            return this.mergeAddToNew(childNode, anchor, hasParameter, routeKey, routeParameterNames, commonPrefixLength);\n        }\n        else {\n            return this.mergeIntermediate(childNode, anchor, hasParameter, routeKey, routeParameterNames, commonPrefixLength);\n        }\n    }\n    mergeNew(anchor, hasParameter, routeKey) {\n        const newNode = new RouteNode(anchor, hasParameter, routeKey);\n        this.addChild(newNode);\n        this.children.sort((a, b) => a.compare(b));\n        return newNode;\n    }\n    mergeJoin(childNode, routeKey) {\n        if (childNode.routeKey != null && routeKey != null) {\n            throw new Error(\"ambiguous route\");\n        }\n        if (childNode.routeKey == null) {\n            childNode.routeKey = routeKey;\n        }\n        return childNode;\n    }\n    mergeIntermediate(childNode, anchor, hasParameter, routeKey, routeParameterNames, commonPrefixLength) {\n        this.removeChild(childNode);\n        const newNode = new RouteNode(anchor.substring(commonPrefixLength), false, routeKey);\n        childNode.anchor = childNode.anchor.substring(commonPrefixLength);\n        childNode.hasParameter = false;\n        const intermediateNode = new RouteNode(anchor.substring(0, commonPrefixLength), hasParameter);\n        intermediateNode.addChild(childNode);\n        intermediateNode.addChild(newNode);\n        this.addChild(intermediateNode);\n        this.children.sort((a, b) => a.compare(b));\n        intermediateNode.children.sort((a, b) => a.compare(b));\n        return newNode;\n    }\n    mergeAddToChild(childNode, anchor, hasParameter, routeKey, routeParameterNames, commonPrefixLength) {\n        anchor = anchor.substring(commonPrefixLength);\n        hasParameter = false;\n        const [commonPrefixLength2, childNode2] = childNode.findSimilarChild(anchor, hasParameter);\n        return childNode.merge(childNode2, anchor, hasParameter, routeKey, routeParameterNames, commonPrefixLength2);\n    }\n    mergeAddToNew(childNode, anchor, hasParameter, routeKey, routeParameterNames, commonPrefixLength) {\n        const newNode = new RouteNode(anchor, hasParameter, routeKey);\n        this.addChild(newNode);\n        this.removeChild(childNode);\n        childNode.anchor = childNode.anchor.substring(commonPrefixLength);\n        childNode.hasParameter = false;\n        newNode.addChild(childNode);\n        this.children.sort((a, b) => a.compare(b));\n        newNode.children.sort((a, b) => a.compare(b));\n        return newNode;\n    }\n    findSimilarChild(anchor, hasParameter) {\n        for (const childNode of this.children) {\n            if (childNode.hasParameter !== hasParameter) {\n                continue;\n            }\n            const commonPrefixLength = findCommonPrefixLength(anchor, childNode.anchor);\n            if (commonPrefixLength === 0) {\n                continue;\n            }\n            return [commonPrefixLength, childNode];\n        }\n        return [0, null];\n    }\n    compare(other) {\n        if (!this.hasParameter && other.hasParameter)\n            return -1;\n        if (this.hasParameter && !other.hasParameter)\n            return 1;\n        if (this.anchor.length < other.anchor.length)\n            return 1;\n        if (this.anchor.length > other.anchor.length)\n            return -1;\n        if (this.anchor < other.anchor)\n            return -1;\n        if (this.anchor > other.anchor)\n            return 1;\n        return 0;\n    }\n    toJSON() {\n        const json = {\n            anchor: this.anchor,\n            hasParameter: this.hasParameter,\n            routeKey: this.routeKey,\n            children: this.children.map((child) => child.toJSON()),\n        };\n        return json;\n    }\n    static fromJSON(json) {\n        const node = new RouteNode(json.anchor, json.hasParameter, json.routeKey, json.children.map((child) => RouteNode.fromJSON(child)));\n        return node;\n    }\n}\n//# sourceMappingURL=route-node.js.map","/**\n * Take a route template and chops is in pieces! The first piece is a literal part of\n * the template. Then the name of a placeholder. Then a literal parts of the template again.\n * The first and the last elements are always literal strings taken from the template,\n * therefore the number of elements in the resulting iterable is always uneven!\n *\n * @param routeTemplate template to chop up\n * @param parameterPlaceholderRE regular expression to use when searching for parameter placeholders\n * @returns Iterable of strings, always an uneven number of elements.\n */\nexport function* parseTemplateParts(routeTemplate, parameterPlaceholderRE) {\n    if (!parameterPlaceholderRE.global) {\n        throw new Error(\"regular expression needs to be global\");\n    }\n    let match;\n    let offsetIndex = 0;\n    while ((match = parameterPlaceholderRE.exec(routeTemplate)) != null) {\n        yield routeTemplate.substring(offsetIndex, parameterPlaceholderRE.lastIndex - match[0].length);\n        yield match[1];\n        offsetIndex = parameterPlaceholderRE.lastIndex;\n    }\n    yield routeTemplate.substring(offsetIndex);\n}\nexport function* parseTemplatePairs(routeTemplate, parameterPlaceholderRE) {\n    const parts = parseTemplateParts(routeTemplate, parameterPlaceholderRE);\n    let index = 0;\n    let parameter = null;\n    for (const part of parts) {\n        if (index % 2 === 0) {\n            yield [part, parameter];\n        }\n        else {\n            parameter = part;\n        }\n        index++;\n    }\n}\n//# sourceMappingURL=template.js.map","import { RouteNode } from \"./route-node.js\";\nimport { defaultRouterOptions } from \"./router-options.js\";\nimport { parseTemplatePairs } from \"./template.js\";\nexport var RouterMode;\n(function (RouterMode) {\n    RouterMode[RouterMode[\"Client\"] = 2] = \"Client\";\n    RouterMode[RouterMode[\"Server\"] = 4] = \"Server\";\n    RouterMode[RouterMode[\"Bidirectional\"] = 6] = \"Bidirectional\";\n})(RouterMode || (RouterMode = {}));\n/**\n * @description\n * This is the actual router that contains all routes and does the actual routing\n *\n * @example\n * ```typescript\n * const router = new Router<string>();\n *\n * router.insertRoute(\"all-products\", \"/product/all\");\n * router.insertRoute(\"product-detail\", \"/product/{id}\");\n *\n * // And now we can parse routes!\n *\n * {\n *   const [routeKey, routeParameters] = router.parseRoute(\"/not-found\");\n *   assert.equal(routeKey, null);\n *   assert.deepEqual(routeParameters, {});\n * }\n *\n * {\n *   const [routeKey, routeParameters] = router.parseRoute(\"/product/all\");\n *   assert.equal(routeKey, \"all-products\");\n *   assert.deepEqual(routeParameters, {});\n * }\n *\n * {\n *   const [routeKey, routeParameters] = router.parseRoute(\"/product/1\");\n *   assert.equal(routeKey, \"product-detail\");\n *   assert.deepEqual(routeParameters, { id: \"1\" });\n * }\n *\n * // And we can stringify routes\n *\n * {\n *   const path = router.stringifyRoute(\n *     \"all-products\",\n *   });\n *   assert.equal(path, \"/product/all\");\n * }\n *\n * {\n *   const path = router.stringifyRoute(\n *     \"product-detail\",\n *     { id: \"2\" },\n *   );\n *   assert.equal(path, \"/product/2\");\n * }\n * ```\n */\nexport class Router {\n    mode;\n    constructor(options = {}, mode = RouterMode.Bidirectional) {\n        this.mode = mode;\n        this.options = {\n            ...defaultRouterOptions,\n            ...options,\n        };\n    }\n    options;\n    rootNode = new RouteNode();\n    templatePairs = new Map();\n    /**\n     * @description\n     * Adds a new route\n     *\n     * @param routeKey name of the route\n     * @param routeTemplate template for the route, als defines parameters\n     */\n    insertRoute(routeKey, routeTemplate) {\n        const templatePairs = [\n            ...parseTemplatePairs(routeTemplate, this.options.parameterPlaceholderRE),\n        ];\n        if ((this.mode & RouterMode.Client) > 0) {\n            this.templatePairs.set(routeKey, templatePairs);\n        }\n        if ((this.mode & RouterMode.Server) > 0) {\n            this.rootNode.insert(routeKey, templatePairs);\n        }\n        return this;\n    }\n    /**\n     * @description\n     * Match the path against a known routes and parse the parameters in it\n     *\n     * @param path path to match\n     * @returns tuple with the route name or null if no route found. Then the parameters\n     */\n    parseRoute(path) {\n        if ((this.mode & RouterMode.Server) === 0) {\n            throw new TypeError(\"Router needs to be in server mode to parse\");\n        }\n        const parameters = {};\n        const [routeKey, parameterValues] = this.rootNode.parse(path, this.options.maximumParameterValueLength);\n        if (routeKey == null) {\n            return [null, {}];\n        }\n        const templatePairs = this.templatePairs.get(routeKey);\n        if (templatePairs == null) {\n            // this never happens\n            return [null, {}];\n        }\n        for (let index = 0; index < parameterValues.length; index++) {\n            const [, parameterName] = templatePairs[index + 1];\n            if (parameterName == null) {\n                // this never happens\n                return [null, {}];\n            }\n            const parameterValue = parameterValues[index];\n            parameters[parameterName] = this.options.parameterValueDecoder(parameterValue);\n        }\n        return [routeKey, parameters];\n    }\n    /**\n     * @description\n     * Convert a route to a path string.\n     *\n     * @param routeKey route to stringify\n     * @param routeParameters parameters to include in the path\n     * @returns string representing the route or null if the route is not found by name\n     */\n    stringifyRoute(routeKey, routeParameters = {}) {\n        if ((this.mode & RouterMode.Client) === 0) {\n            throw new TypeError(\"Router needs to be in client mode to stringify\");\n        }\n        let result = \"\";\n        const templatePairs = this.templatePairs.get(routeKey);\n        if (templatePairs == null) {\n            return null;\n        }\n        for (let index = 0; index < templatePairs.length; index++) {\n            const [parameterAnchor, parameterName] = templatePairs[index];\n            if (parameterName != null) {\n                const parameterValue = routeParameters[parameterName];\n                result += this.options.parameterValueEncoder(parameterValue);\n            }\n            result += parameterAnchor;\n        }\n        return result;\n    }\n    saveToJson(mode = this.mode) {\n        const rootNode = (this.mode & mode & RouterMode.Server) > 0 ? this.rootNode.toJSON() : undefined;\n        const templatePairs = (this.mode & mode & RouterMode.Client) > 0 ? [...this.templatePairs] : undefined;\n        return {\n            rootNode,\n            templatePairs,\n        };\n    }\n    loadFromJson(json) {\n        this.mode = RouterMode.Bidirectional;\n        if (json.rootNode == null) {\n            this.mode &= ~RouterMode.Server;\n        }\n        else {\n            this.rootNode = RouteNode.fromJSON(json.rootNode);\n        }\n        if (json.templatePairs == null) {\n            this.mode &= ~RouterMode.Client;\n        }\n        else {\n            this.templatePairs = new Map(json.templatePairs);\n        }\n        return this;\n    }\n}\n//# sourceMappingURL=router.js.map"],"names":["RouterMode"],"mappings":"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"}