valyrian.js 7.2.12 → 8.0.1

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 (168) hide show
  1. package/README.md +6 -6
  2. package/dist/flux-store/index.d.ts +32 -0
  3. package/dist/flux-store/index.d.ts.map +1 -0
  4. package/dist/flux-store/index.js +267 -0
  5. package/dist/flux-store/index.js.map +7 -0
  6. package/dist/flux-store/index.min.js +1 -0
  7. package/dist/flux-store/index.min.js.map +1 -0
  8. package/dist/flux-store/index.mjs +246 -0
  9. package/dist/flux-store/index.mjs.map +7 -0
  10. package/dist/hooks/index.d.ts.map +1 -1
  11. package/dist/hooks/index.js +35 -51
  12. package/dist/hooks/index.js.map +3 -3
  13. package/dist/hooks/index.min.js +1 -0
  14. package/dist/hooks/index.min.js.map +1 -0
  15. package/dist/hooks/index.mjs +36 -52
  16. package/dist/hooks/index.mjs.map +3 -3
  17. package/dist/index.d.ts +18 -14
  18. package/dist/index.d.ts.map +1 -1
  19. package/dist/index.js +107 -88
  20. package/dist/index.js.map +3 -3
  21. package/dist/index.min.js +1 -1
  22. package/dist/index.min.js.map +1 -1
  23. package/dist/index.mjs +107 -88
  24. package/dist/index.mjs.map +3 -3
  25. package/dist/native-store/index.d.ts +14 -0
  26. package/dist/native-store/index.d.ts.map +1 -0
  27. package/dist/native-store/index.js +103 -0
  28. package/dist/native-store/index.js.map +7 -0
  29. package/dist/native-store/index.min.js +1 -0
  30. package/dist/native-store/index.min.js.map +1 -0
  31. package/dist/native-store/index.mjs +82 -0
  32. package/dist/native-store/index.mjs.map +7 -0
  33. package/dist/node/index.d.ts +1 -1
  34. package/dist/node/index.d.ts.map +1 -1
  35. package/dist/node/index.js +125 -10
  36. package/dist/node/index.js.map +4 -4
  37. package/dist/node/index.mjs +125 -10
  38. package/dist/node/index.mjs.map +4 -4
  39. package/dist/node/node.sw.js +152 -0
  40. package/dist/node/utils/icons.d.ts +4 -5
  41. package/dist/node/utils/icons.d.ts.map +1 -1
  42. package/dist/node/utils/inline.d.ts +1 -1
  43. package/dist/node/utils/inline.d.ts.map +1 -1
  44. package/dist/node/utils/node.sw.js +152 -0
  45. package/dist/node/utils/session-storage.d.ts +22 -0
  46. package/dist/node/utils/session-storage.d.ts.map +1 -0
  47. package/dist/node/utils/sw.d.ts.map +1 -1
  48. package/dist/node/utils/tree-adapter.d.ts +5 -1
  49. package/dist/node/utils/tree-adapter.d.ts.map +1 -1
  50. package/dist/pulse-store/index.d.ts +16 -0
  51. package/dist/pulse-store/index.d.ts.map +1 -0
  52. package/dist/pulse-store/index.js +143 -0
  53. package/dist/pulse-store/index.js.map +7 -0
  54. package/dist/pulse-store/index.min.js +1 -0
  55. package/dist/pulse-store/index.min.js.map +1 -0
  56. package/dist/pulse-store/index.mjs +122 -0
  57. package/dist/pulse-store/index.mjs.map +7 -0
  58. package/dist/request/index.d.ts +11 -11
  59. package/dist/request/index.d.ts.map +1 -1
  60. package/dist/request/index.js +63 -84
  61. package/dist/request/index.js.map +2 -2
  62. package/dist/request/index.min.js +1 -0
  63. package/dist/request/index.min.js.map +1 -0
  64. package/dist/request/index.mjs +63 -84
  65. package/dist/request/index.mjs.map +2 -2
  66. package/dist/router/index.d.ts +36 -33
  67. package/dist/router/index.d.ts.map +1 -1
  68. package/dist/router/index.js +247 -96
  69. package/dist/router/index.js.map +3 -3
  70. package/dist/router/index.min.js +1 -0
  71. package/dist/router/index.min.js.map +1 -0
  72. package/dist/router/index.mjs +247 -96
  73. package/dist/router/index.mjs.map +3 -3
  74. package/dist/signals/index.d.ts +6 -0
  75. package/dist/signals/index.d.ts.map +1 -0
  76. package/dist/signals/index.js +92 -0
  77. package/dist/signals/index.js.map +7 -0
  78. package/dist/signals/index.min.js +1 -0
  79. package/dist/signals/index.min.js.map +1 -0
  80. package/dist/signals/index.mjs +71 -0
  81. package/dist/signals/index.mjs.map +7 -0
  82. package/dist/suspense/index.d.ts +6 -0
  83. package/dist/suspense/index.d.ts.map +1 -0
  84. package/dist/suspense/index.js +67 -0
  85. package/dist/suspense/index.js.map +7 -0
  86. package/dist/suspense/index.min.js +1 -0
  87. package/dist/suspense/index.min.js.map +1 -0
  88. package/dist/suspense/index.mjs +46 -0
  89. package/dist/suspense/index.mjs.map +7 -0
  90. package/dist/sw/index.min.js +1 -0
  91. package/dist/sw/index.min.js.map +1 -0
  92. package/dist/translate/index.d.ts +19 -0
  93. package/dist/translate/index.d.ts.map +1 -0
  94. package/dist/translate/index.js +150 -0
  95. package/dist/translate/index.js.map +7 -0
  96. package/dist/translate/index.min.js +1 -0
  97. package/dist/translate/index.min.js.map +1 -0
  98. package/dist/translate/index.mjs +129 -0
  99. package/dist/translate/index.mjs.map +7 -0
  100. package/dist/tsconfig.tsbuildinfo +1 -1
  101. package/dist/utils/deep-freeze.d.ts +3 -0
  102. package/dist/utils/deep-freeze.d.ts.map +1 -0
  103. package/dist/utils/getter-setter.d.ts +3 -0
  104. package/dist/utils/getter-setter.d.ts.map +1 -0
  105. package/dist/utils/has-changed.d.ts +2 -0
  106. package/dist/utils/has-changed.d.ts.map +1 -0
  107. package/dist/utils/index.d.ts +4 -0
  108. package/dist/utils/index.d.ts.map +1 -0
  109. package/dist/utils/index.js +138 -0
  110. package/dist/utils/index.js.map +7 -0
  111. package/dist/utils/index.min.js +1 -0
  112. package/dist/utils/index.min.js.map +1 -0
  113. package/dist/utils/index.mjs +115 -0
  114. package/dist/utils/index.mjs.map +7 -0
  115. package/lib/flux-store/index.ts +312 -0
  116. package/lib/hooks/index.ts +39 -57
  117. package/lib/index.ts +135 -118
  118. package/lib/native-store/index.ts +106 -0
  119. package/lib/node/index.ts +3 -1
  120. package/lib/node/utils/icons.ts +4 -4
  121. package/lib/node/utils/inline.ts +2 -0
  122. package/lib/node/utils/node.sw.js +152 -0
  123. package/lib/node/utils/session-storage.ts +117 -0
  124. package/lib/node/utils/sw.ts +34 -10
  125. package/lib/node/utils/tree-adapter.ts +19 -1
  126. package/lib/pulse-store/index.ts +188 -0
  127. package/lib/request/index.ts +92 -122
  128. package/lib/router/index.ts +353 -164
  129. package/lib/signals/index.ts +98 -0
  130. package/lib/suspense/index.ts +57 -0
  131. package/lib/translate/index.ts +156 -0
  132. package/lib/utils/deep-freeze.ts +54 -0
  133. package/lib/utils/getter-setter.ts +40 -0
  134. package/lib/utils/has-changed.ts +43 -0
  135. package/lib/utils/index.ts +3 -0
  136. package/package.json +40 -57
  137. package/tsconfig.json +5 -4
  138. package/dist/dataset/index.d.ts +0 -24
  139. package/dist/dataset/index.d.ts.map +0 -1
  140. package/dist/dataset/index.js +0 -178
  141. package/dist/dataset/index.js.map +0 -7
  142. package/dist/dataset/index.mjs +0 -157
  143. package/dist/dataset/index.mjs.map +0 -7
  144. package/dist/node/node.sw.tpl +0 -133
  145. package/dist/node/utils/node.sw.tpl +0 -133
  146. package/dist/proxy-signal/index.d.ts +0 -23
  147. package/dist/proxy-signal/index.d.ts.map +0 -1
  148. package/dist/proxy-signal/index.js +0 -138
  149. package/dist/proxy-signal/index.js.map +0 -7
  150. package/dist/proxy-signal/index.mjs +0 -117
  151. package/dist/proxy-signal/index.mjs.map +0 -7
  152. package/dist/signal/index.d.ts +0 -9
  153. package/dist/signal/index.d.ts.map +0 -1
  154. package/dist/signal/index.js +0 -76
  155. package/dist/signal/index.js.map +0 -7
  156. package/dist/signal/index.mjs +0 -55
  157. package/dist/signal/index.mjs.map +0 -7
  158. package/dist/store/index.d.ts +0 -16
  159. package/dist/store/index.d.ts.map +0 -1
  160. package/dist/store/index.js +0 -93
  161. package/dist/store/index.js.map +0 -7
  162. package/dist/store/index.mjs +0 -72
  163. package/dist/store/index.mjs.map +0 -7
  164. package/lib/dataset/index.ts +0 -193
  165. package/lib/node/utils/node.sw.tpl +0 -133
  166. package/lib/proxy-signal/index.ts +0 -187
  167. package/lib/signal/index.ts +0 -86
  168. package/lib/store/index.ts +0 -101
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../lib/request/index.ts"],
4
- "sourcesContent": ["import { isNodeJs } from \"valyrian.js\";\n\ninterface UrlOptions {\n base: string; // Used to prefix the url for scoped requests.\n node: string | null; // Used to redirect local requests to node server for server side rendering.\n api: string | null; // Used to redirect api requests to node server for server side rendering.\n}\n\ninterface RequestOptions {\n allowedMethods?: string[];\n urls?: UrlOptions;\n [key: string | number | symbol]: any;\n}\n\ninterface RequestOptionsWithUrls extends RequestOptions {\n urls: UrlOptions;\n allowedMethods: string[];\n}\n\ninterface SendOptions extends RequestOptionsWithUrls, RequestInit {\n allowedMethods: string[];\n method: string;\n headers: Record<string, string>;\n resolveWithFullResponse?: boolean;\n}\n\nexport interface RequestInterface {\n // eslint-disable-next-line no-unused-vars\n (method: string, url: string, data?: Record<string, any>, options?: Partial<SendOptions>): any | Response;\n // eslint-disable-next-line no-unused-vars\n new: (baseUrl: string, options?: RequestOptions) => RequestInterface;\n // eslint-disable-next-line no-unused-vars\n setOptions: (key: string, value: any) => void;\n // eslint-disable-next-line no-unused-vars\n getOptions: (key?: string) => RequestOptions | void;\n // eslint-disable-next-line no-unused-vars\n get: (url: string, data?: Record<string, any>, options?: Record<string, any>) => any | Response;\n // eslint-disable-next-line no-unused-vars\n post: (url: string, data?: Record<string, any>, options?: Record<string, any>) => any | Response;\n // eslint-disable-next-line no-unused-vars\n put: (url: string, data?: Record<string, any>, options?: Record<string, any>) => any | Response;\n // eslint-disable-next-line no-unused-vars\n patch: (url: string, data?: Record<string, any>, options?: Record<string, any>) => any | Response;\n // eslint-disable-next-line no-unused-vars\n delete: (url: string, data?: Record<string, any>, options?: Record<string, any>) => any | Response;\n // eslint-disable-next-line no-unused-vars\n head: (url: string, data?: Record<string, any>, options?: Record<string, any>) => any | Response;\n // eslint-disable-next-line no-unused-vars\n options: (url: string, data?: Record<string, any>, options?: Record<string, any>) => any | Response;\n [key: string | number | symbol]: any;\n}\n\n// This method is used to serialize an object into a query string.\nfunction serialize(obj: Record<string, any>, prefix: string = \"\"): string {\n return Object.keys(obj)\n .map((prop: string) => {\n const k = prefix ? `${prefix}[${prop}]` : prop;\n return typeof obj[prop] === \"object\"\n ? serialize(obj[prop], k)\n : `${encodeURIComponent(k)}=${encodeURIComponent(obj[prop])}`;\n })\n .join(\"&\");\n}\n\nfunction parseUrl(url: string, options: RequestOptionsWithUrls) {\n let u = /^https?/gi.test(url) ? url : options.urls.base + url;\n\n const parts = u.split(\"?\");\n u = parts[0].trim().replace(/^\\/\\//, \"/\").replace(/\\/$/, \"\").trim();\n\n if (parts[1]) {\n u += `?${parts[1]}`;\n }\n\n if (isNodeJs && typeof options.urls.node === \"string\") {\n options.urls.node = options.urls.node;\n\n if (typeof options.urls.api === \"string\") {\n options.urls.api = options.urls.api.replace(/\\/$/gi, \"\").trim();\n u = u.replace(options.urls.api, options.urls.node);\n }\n\n if (!/^https?/gi.test(u)) {\n u = options.urls.node + u;\n }\n }\n\n return u;\n}\n\nconst defaultOptions: RequestOptions = { allowedMethods: [\"get\", \"post\", \"put\", \"patch\", \"delete\", \"head\", \"options\"] };\n\n// eslint-disable-next-line sonarjs/cognitive-complexity\nfunction Requester(baseUrl = \"\", options: RequestOptions = defaultOptions) {\n const url = baseUrl.replace(/\\/$/gi, \"\").trim();\n if (!options.urls) {\n options.urls = {\n base: \"\",\n node: null,\n api: null\n };\n }\n\n if (!options.allowedMethods) {\n options.allowedMethods = defaultOptions.allowedMethods;\n }\n\n const opts: RequestOptionsWithUrls = {\n ...(options as RequestOptionsWithUrls),\n urls: {\n node: options.urls.node || null,\n api: options.urls.api || null,\n base: options.urls.base ? options.urls.base + url : url\n }\n };\n\n const request = async function request(method: string, url: string, data?: Record<string, any>, options = {}) {\n const innerOptions: SendOptions = {\n method: method.toUpperCase(),\n headers: {},\n resolveWithFullResponse: false,\n ...opts,\n ...options\n } as SendOptions;\n\n if (!innerOptions.headers.Accept) {\n innerOptions.headers.Accept = \"application/json\";\n }\n\n const acceptType = innerOptions.headers.Accept;\n const contentType = innerOptions.headers[\"Content-Type\"] || innerOptions.headers[\"content-type\"] || \"\";\n\n if (innerOptions.allowedMethods.indexOf(method) === -1) {\n throw new Error(\"Method not allowed\");\n }\n\n if (data) {\n if (innerOptions.method === \"GET\" && typeof data === \"object\") {\n url += `?${serialize(data)}`;\n }\n\n if (innerOptions.method !== \"GET\") {\n if (/json/gi.test(contentType)) {\n innerOptions.body = JSON.stringify(data);\n } else {\n let formData;\n if (data instanceof FormData) {\n formData = data;\n } else {\n formData = new FormData();\n for (const i in data) {\n formData.append(i, data[i]);\n }\n }\n innerOptions.body = formData;\n }\n }\n }\n\n const response = await fetch(parseUrl(url, opts), innerOptions);\n let body = null;\n if (!response.ok) {\n const err = new Error(response.statusText) as Error & { response?: any; body?: any };\n err.response = response;\n if (/text/gi.test(acceptType)) {\n err.body = await response.text();\n }\n\n if (/json/gi.test(acceptType)) {\n try {\n err.body = await response.json();\n } catch (error) {\n // ignore\n }\n }\n\n throw err;\n }\n\n if (innerOptions.resolveWithFullResponse) {\n return response;\n }\n\n if (/text/gi.test(acceptType)) {\n body = await response.text();\n return body;\n }\n\n if (/json/gi.test(acceptType)) {\n try {\n body = await response.json();\n return body;\n } catch (error) {\n // ignore\n }\n }\n\n return response;\n } as unknown as RequestInterface;\n\n request.new = (baseUrl: string, options?: RequestOptions) => Requester(baseUrl, { ...opts, ...(options || {}) });\n\n request.setOption = (key: string, value: any) => {\n let result = opts;\n\n const parsed = key.split(\".\");\n let next;\n\n while (parsed.length) {\n next = parsed.shift() as string;\n\n const nextIsArray = next.indexOf(\"[\") > -1;\n if (nextIsArray) {\n const idx = next.replace(/\\D/gi, \"\");\n next = next.split(\"[\")[0];\n parsed.unshift(idx);\n }\n\n if (parsed.length > 0 && typeof result[next] !== \"object\") {\n result[next] = nextIsArray ? [] : {};\n }\n\n if (parsed.length === 0 && typeof value !== \"undefined\") {\n result[next] = value;\n }\n\n result = result[next];\n }\n\n return result;\n };\n\n request.getOptions = (key?: string) => {\n if (!key) {\n return opts;\n }\n\n let result = opts;\n const parsed = key.split(\".\");\n let next;\n\n while (parsed.length) {\n next = parsed.shift() as string;\n\n const nextIsArray = next.indexOf(\"[\") > -1;\n if (nextIsArray) {\n const idx = next.replace(/\\D/gi, \"\");\n next = next.split(\"[\")[0];\n parsed.unshift(idx);\n }\n\n if (parsed.length > 0 && typeof result[next] !== \"object\") {\n return null;\n }\n\n if (parsed.length === 0) {\n return result[next];\n }\n\n result = result[next];\n }\n };\n\n opts.allowedMethods.forEach(\n (method) =>\n (request[method] = (url: string, data?: Record<string, any>, options?: Record<string, any>) =>\n request(method, url, data, options))\n );\n\n return request;\n}\n\nexport const request = Requester();\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import { isNodeJs } from \"valyrian.js\";\nimport { get, set } from \"valyrian.js/utils\";\n\ninterface UrlOptions {\n base?: string; // Used to prefix the url for scoped requests.\n node?: string | null; // Used to redirect local requests to node server for server side rendering.\n api?: string | null; // Used to redirect api requests to node server for server side rendering.\n}\n\ninterface RequestOptions {\n allowedMethods?: string[];\n urls?: UrlOptions;\n [key: string | number | symbol]: any;\n}\n\ninterface RequestOptionsWithUrls extends RequestOptions {\n urls: UrlOptions;\n allowedMethods: string[];\n}\n\ninterface SendOptions extends RequestOptionsWithUrls, RequestInit {\n allowedMethods: string[];\n method: string;\n headers: Record<string, string>;\n resolveWithFullResponse?: boolean;\n}\n\nexport interface RequestInterface {\n // eslint-disable-next-line no-unused-vars\n (method: string, url: string, data?: Record<string, any> | null, options?: Partial<SendOptions>): any | Response;\n // eslint-disable-next-line no-unused-vars\n new: (baseUrl: string, options?: RequestOptions) => RequestInterface;\n // eslint-disable-next-line no-unused-vars\n setOptions: (key: string, value: any) => void;\n // eslint-disable-next-line no-unused-vars\n getOptions: (key?: string) => RequestOptions | void;\n // eslint-disable-next-line no-unused-vars\n get: (url: string, data?: Record<string, any> | null, options?: Record<string, any>) => any | Response;\n // eslint-disable-next-line no-unused-vars\n post: (url: string, data?: Record<string, any> | null, options?: Record<string, any>) => any | Response;\n // eslint-disable-next-line no-unused-vars\n put: (url: string, data?: Record<string, any> | null, options?: Record<string, any>) => any | Response;\n // eslint-disable-next-line no-unused-vars\n patch: (url: string, data?: Record<string, any> | null, options?: Record<string, any>) => any | Response;\n // eslint-disable-next-line no-unused-vars\n delete: (url: string, data?: Record<string, any> | null, options?: Record<string, any>) => any | Response;\n // eslint-disable-next-line no-unused-vars\n head: (url: string, data?: Record<string, any> | null, options?: Record<string, any>) => any | Response;\n // eslint-disable-next-line no-unused-vars\n options: (url: string, data?: Record<string, any> | null, options?: Record<string, any>) => any | Response;\n [key: string | number | symbol]: any;\n}\n\n// This method is used to serialize an object into a query string.\nfunction serialize(obj: Record<string, any>, prefix: string = \"\"): URLSearchParams {\n const params = new URLSearchParams();\n\n Object.keys(obj).forEach((prop: string) => {\n const key = prefix ? `${prefix}[${prop}]` : prop;\n if (typeof obj[prop] === \"object\") {\n params.append(key, serialize(obj[prop], key).toString());\n } else {\n params.append(key, obj[prop]);\n }\n });\n\n return params;\n}\n\nfunction serializeFormData(data: Record<string, any>): FormData {\n return Object.entries(data).reduce((fd, [key, value]) => {\n fd.append(key, value);\n return fd;\n }, new FormData());\n}\n\nfunction parseUrl(url: string, options: RequestOptionsWithUrls) {\n const urlWithoutSlash = url.replace(/\\/+$/, \"\").trim();\n const u = /^https?/gi.test(urlWithoutSlash) ? urlWithoutSlash : `${options.urls.base}${urlWithoutSlash}`;\n\n if (isNodeJs && typeof options.urls.node === \"string\") {\n if (typeof options.urls.api === \"string\") {\n return new URL(u.replace(options.urls.api, options.urls.node));\n }\n\n if (!/^https?/gi.test(u)) {\n return new URL(u, options.urls.node);\n }\n }\n\n if (/^https?/gi.test(u)) {\n return new URL(u);\n }\n\n return new URL(u, options.urls.base);\n}\n\nconst defaultOptions: RequestOptions = { allowedMethods: [\"get\", \"post\", \"put\", \"patch\", \"delete\", \"head\", \"options\"] };\n\n// eslint-disable-next-line sonarjs/cognitive-complexity\nfunction Requester(baseUrl = \"\", options: RequestOptions = defaultOptions) {\n const url = baseUrl.replace(/\\/$/gi, \"\").trim();\n if (!options.urls) {\n options.urls = {\n base: \"\",\n node: null,\n api: null\n };\n }\n\n if (!options.allowedMethods) {\n options.allowedMethods = defaultOptions.allowedMethods;\n }\n\n const opts: RequestOptionsWithUrls = {\n ...(options as RequestOptionsWithUrls),\n urls: {\n node: options.urls.node || null,\n api: options.urls.api || null,\n base: options.urls.base ? options.urls.base + url : url\n }\n };\n\n // eslint-disable-next-line complexity\n const request = async function request(\n method: string,\n url: string,\n data?: Record<string, any> | null,\n options: Record<string, any> = {}\n ) {\n const innerOptions: SendOptions = {\n method: method.toUpperCase(),\n headers: {},\n resolveWithFullResponse: false,\n ...opts,\n ...options\n } as SendOptions;\n\n innerOptions.headers = { ...innerOptions.headers, ...opts.headers, ...options.headers };\n\n if (!innerOptions.headers.Accept) {\n innerOptions.headers.Accept = \"application/json\";\n }\n\n const acceptType = innerOptions.headers.Accept;\n const contentType = innerOptions.headers[\"Content-Type\"] || innerOptions.headers[\"content-type\"] || \"\";\n\n if (!innerOptions.allowedMethods.includes(method)) {\n throw new Error(`Method ${method} not allowed. Allowed methods: ${innerOptions.allowedMethods.join(\", \")}`);\n }\n\n let finalUrl: URL;\n try {\n finalUrl = parseUrl(url, opts);\n } catch (error) {\n throw new Error(`Failed to parse URL: ${url}`);\n }\n\n if (data) {\n const isJson = /json/gi.test(contentType);\n\n if (innerOptions.method === \"GET\" && typeof data === \"object\") {\n finalUrl.search = serialize(data).toString();\n } else if (innerOptions.method !== \"GET\") {\n innerOptions.body = isJson ? JSON.stringify(data) : serializeFormData(data);\n }\n }\n\n const response = await fetch(finalUrl.toString(), innerOptions);\n let body = null;\n if (!response.ok) {\n const err = new Error(`${response.status}: ${response.statusText}`) as Error & { response?: any; body?: any };\n err.response = response;\n if (/text/gi.test(acceptType)) {\n err.body = await response.text();\n }\n\n if (/json/gi.test(acceptType)) {\n try {\n err.body = await response.json();\n } catch (error) {\n err.body = null;\n // eslint-disable-next-line no-console\n console.warn(\"Failed to parse JSON response:\", error);\n }\n }\n\n throw err;\n }\n\n if (innerOptions.resolveWithFullResponse) {\n return response;\n }\n\n if (/text/gi.test(acceptType)) {\n body = await response.text();\n } else if (/json/gi.test(acceptType)) {\n try {\n body = await response.json();\n } catch (error) {\n // eslint-disable-next-line no-console\n console.warn(\"Failed to parse JSON response:\", error);\n body = null;\n }\n } else if (/blob/gi.test(acceptType)) {\n body = await response.blob();\n } else if (/arraybuffer/gi.test(acceptType)) {\n body = await response.arrayBuffer();\n } else {\n body = response;\n }\n\n return body || response;\n } as unknown as RequestInterface;\n\n request.new = (baseUrl: string, options?: RequestOptions) => Requester(baseUrl, { ...opts, ...(options || {}) });\n\n request.setOption = (key: string, value: any) => {\n set(opts, key, value);\n return opts;\n };\n\n request.getOptions = (key?: string) => {\n if (key) {\n return get(opts, key);\n }\n\n return opts;\n };\n\n Object.assign(\n request,\n opts.allowedMethods.reduce((acc: Record<string, any>, method) => {\n acc[method] = (url: string, data?: Record<string, any> | null, options?: Record<string, any>) =>\n request(method, url, data, options);\n return acc;\n }, {})\n );\n\n return request;\n}\n\nexport const request = Requester();\n"],
5
+ "mappings": "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",
6
6
  "names": ["request", "url", "options", "baseUrl"]
7
7
  }
@@ -1,41 +1,38 @@
1
1
  import { Component, POJOComponent, VnodeComponentInterface } from "valyrian.js";
2
- interface Request {
2
+ export interface Request {
3
3
  params: Record<string, any>;
4
4
  query: Record<string, any>;
5
5
  url: string;
6
6
  path: string;
7
7
  matches: string[];
8
- redirect: (path: string, parentComponent?: Component | POJOComponent | VnodeComponentInterface) => false;
8
+ redirect: (path: string) => Promise<string | void>;
9
9
  }
10
- interface Middleware {
11
- (req: Request, res?: any): Promise<any | Component | POJOComponent | VnodeComponentInterface> | any | Component | POJOComponent | VnodeComponentInterface;
10
+ export interface Middleware {
11
+ (req: Request, err?: any): Promise<any | Component | POJOComponent | VnodeComponentInterface> | any | Component | POJOComponent | VnodeComponentInterface;
12
12
  }
13
- interface Middlewares extends Array<Middleware> {
14
- }
15
- interface Path {
16
- method: string;
17
- path: string;
18
- middlewares: Middlewares;
19
- params: string[];
20
- regexp: RegExp;
21
- }
22
- interface RouterInterface {
23
- paths: Path[];
24
- container: Element | string | null;
25
- query: Record<string, string | number>;
26
- options: Record<string, any>;
27
- url: string;
28
- path: string;
29
- params: Record<string, string | number | any>;
30
- matches: string[];
31
- pathPrefix: string;
32
- add(method: string, ...args: Middlewares): Router;
33
- use(...args: (string | Middleware | Router)[]): Router;
34
- routes(): string[];
35
- go(path: string, parentComponent?: Component | POJOComponent | VnodeComponentInterface): Promise<string | void>;
36
- }
37
- export declare class Router implements RouterInterface {
38
- paths: Path[];
13
+ export declare const RouterError: {
14
+ new (message?: string): {
15
+ status: number | undefined;
16
+ name: string;
17
+ message: string;
18
+ stack?: string;
19
+ cause?: unknown;
20
+ };
21
+ new (message?: string, options?: ErrorOptions): {
22
+ status: number | undefined;
23
+ name: string;
24
+ message: string;
25
+ stack?: string;
26
+ cause?: unknown;
27
+ };
28
+ captureStackTrace(targetObject: object, constructorOpt?: Function): void;
29
+ captureStackTrace(targetObject: object, constructorOpt?: Function): void;
30
+ prepareStackTrace?: ((err: Error, stackTraces: NodeJS.CallSite[]) => any) | undefined;
31
+ stackTraceLimit: number;
32
+ };
33
+ type RouteParams = string | Middleware | Router | (string | Middleware | Router | RouteParams)[];
34
+ export declare class Router {
35
+ private routeTree;
39
36
  container: Element | string | null;
40
37
  query: Record<string, string | number>;
41
38
  options: Record<string, any>;
@@ -44,12 +41,18 @@ export declare class Router implements RouterInterface {
44
41
  params: Record<string, string | number | any>;
45
42
  matches: string[];
46
43
  pathPrefix: string;
44
+ private errorHandlers;
47
45
  constructor(pathPrefix?: string);
48
- add(path: string, ...middlewares: Middlewares): Router;
49
- use(...middlewares: Middlewares | Router[] | string[]): Router;
46
+ add(...args: RouteParams[]): Router;
47
+ catch(...args: (number | string | Error | typeof Error | Middleware)[]): Router;
50
48
  routes(): string[];
51
- go(path: string, parentComponent?: Component | POJOComponent | VnodeComponentInterface, preventPushState?: boolean): Promise<string | void>;
49
+ go(path: string, parentComponent?: Component | POJOComponent | VnodeComponentInterface): Promise<string | void>;
52
50
  getOnClickHandler(url: string): (e: MouseEvent) => void;
51
+ private getAllRoutes;
52
+ private createRequest;
53
+ private getErrorConditionMiddlewares;
54
+ private handleError;
55
+ private searchComponent;
53
56
  }
54
57
  export declare function redirect(url: string, parentComponent?: Component | POJOComponent | VnodeComponentInterface, preventPushState?: boolean): Promise<string | void>;
55
58
  export declare function mountRouter(elementContainer: string | any, router: Router): void;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../lib/router/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../lib/router/index.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,SAAS,EACT,aAAa,EACb,uBAAuB,EASxB,MAAM,aAAa,CAAC;AAErB,MAAM,WAAW,OAAO;IACtB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC5B,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC3B,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,EAAE,CAAC;IAElB,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;CACpD;AAED,MAAM,WAAW,UAAU;IAEzB,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,CAAC,EAAE,GAAG,GACpB,OAAO,CAAC,GAAG,GAAG,SAAS,GAAG,aAAa,GAAG,uBAAuB,CAAC,GAClE,GAAG,GACH,SAAS,GACT,aAAa,GACb,uBAAuB,CAAC;CAC7B;AA4ID,eAAO,MAAM,WAAW;;gBACd,MAAM,GAAG,SAAS;;;;;;;gBAAlB,MAAM,GAAG,SAAS;;;;;;;;mDA6BxB,OAAK,QAAQ;;CA5BhB,CAAC;AAEF,KAAK,WAAW,GAAG,MAAM,GAAG,UAAU,GAAG,MAAM,GAAG,CAAC,MAAM,GAAG,UAAU,GAAG,MAAM,GAAG,WAAW,CAAC,EAAE,CAAC;AAEjG,qBAAa,MAAM;IACjB,OAAO,CAAC,SAAS,CAAmB;IACpC,SAAS,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAAQ;IAC1C,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,CAAM;IAC5C,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAM;IAClC,GAAG,EAAE,MAAM,CAAM;IACjB,IAAI,EAAE,MAAM,CAAM;IAClB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,GAAG,CAAC,CAAM;IACnD,OAAO,EAAE,MAAM,EAAE,CAAM;IACvB,UAAU,EAAE,MAAM,CAAM;IAExB,OAAO,CAAC,aAAa,CAAoE;gBAE7E,UAAU,GAAE,MAAW;IAInC,GAAG,CAAC,GAAG,IAAI,EAAE,WAAW,EAAE,GAAG,MAAM;IA8BnC,KAAK,CAAC,GAAG,IAAI,EAAE,CAAC,MAAM,GAAG,MAAM,GAAG,KAAK,GAAG,OAAO,KAAK,GAAG,UAAU,CAAC,EAAE,GAAG,MAAM;IAyB/E,MAAM,IAAI,MAAM,EAAE;IAKZ,EAAE,CACN,IAAI,EAAE,MAAM,EACZ,eAAe,CAAC,EAAE,SAAS,GAAG,aAAa,GAAG,uBAAuB,GACpE,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IA2EzB,iBAAiB,CAAC,GAAG,EAAE,MAAM,OAChB,UAAU;IAYvB,OAAO,CAAC,YAAY;IAepB,OAAO,CAAC,aAAa;IAWrB,OAAO,CAAC,4BAA4B;YAgCtB,WAAW;YAwEX,eAAe;CA4B9B;AAID,wBAAsB,QAAQ,CAC5B,GAAG,EAAE,MAAM,EACX,eAAe,CAAC,EAAE,SAAS,GAAG,aAAa,GAAG,uBAAuB,EACrE,gBAAgB,UAAQ,GACvB,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAOxB;AAED,wBAAgB,WAAW,CAAC,gBAAgB,EAAE,MAAM,GAAG,GAAG,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAiBhF"}
@@ -21,6 +21,7 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
21
21
  var router_exports = {};
22
22
  __export(router_exports, {
23
23
  Router: () => Router,
24
+ RouterError: () => RouterError,
24
25
  mountRouter: () => mountRouter,
25
26
  redirect: () => redirect
26
27
  });
@@ -39,83 +40,85 @@ function getPathWithoutLastSlash(path) {
39
40
  }
40
41
  return pathWithoutLastSlash;
41
42
  }
42
- var addPath = ({
43
- router,
44
- method,
45
- path,
46
- middlewares
47
- }) => {
48
- if (!method || !path || !Array.isArray(middlewares) || middlewares.length === 0) {
49
- throw new Error(`Invalid route input: ${method} ${path} ${middlewares}`);
50
- }
51
- const realpath = path.replace(/(\S)(\/+)$/, "$1");
52
- const params = (realpath.match(/:(\w+)?/gi) || []).map((param) => param.slice(1));
53
- const regexpPath = "^" + realpath.replace(/:(\w+)/gi, "([^\\/\\s]+)") + "$";
54
- router.paths.push({
55
- method,
56
- path: realpath,
57
- middlewares: flat(middlewares),
58
- params,
59
- regexp: new RegExp(regexpPath, "i")
60
- });
61
- };
62
43
  function parseQuery(queryParts) {
63
44
  const parts = queryParts ? queryParts.split("&") : [];
64
45
  const query = {};
65
46
  for (const nameValue of parts) {
66
47
  const [name, value] = nameValue.split("=", 2);
67
- query[name] = value || "";
48
+ query[name] = isNaN(Number(value)) === false ? Number(value) : value === "true" ? true : value === "false" ? false : value;
68
49
  }
69
50
  return query;
70
51
  }
71
- function searchMiddlewares(router, path) {
72
- const middlewares = [];
73
- const params = {};
74
- const matches = [];
75
- for (const item of router.paths) {
76
- const match = item.regexp.exec(path);
77
- if (Array.isArray(match)) {
78
- middlewares.push(...item.middlewares);
79
- match.shift();
80
- for (const [index, key] of item.params.entries()) {
81
- params[key] = match[index];
82
- }
83
- matches.push(...match);
84
- if (item.method === "add") {
85
- router.path = getPathWithoutPrefix(item.path, router.pathPrefix);
86
- break;
52
+ var RouteTree = class {
53
+ root = { segment: "", children: /* @__PURE__ */ new Map(), isDynamic: false };
54
+ addRoute(path, middlewares) {
55
+ const segments = path === "/" ? [path] : path.split("/").filter(Boolean);
56
+ let currentNode = this.root;
57
+ for (const segment of segments) {
58
+ const isDynamic = segment.startsWith(":");
59
+ const key = isDynamic ? ":" : segment;
60
+ if (!currentNode.children.has(key)) {
61
+ currentNode.children.set(key, {
62
+ segment,
63
+ children: /* @__PURE__ */ new Map(),
64
+ isDynamic,
65
+ paramKey: isDynamic ? segment.slice(1) : void 0
66
+ });
87
67
  }
68
+ currentNode = currentNode.children.get(key);
88
69
  }
70
+ currentNode.middlewares = middlewares;
89
71
  }
90
- router.params = params;
91
- router.matches = matches;
92
- return middlewares;
93
- }
94
- async function searchComponent(router, middlewares) {
95
- const request = {
96
- params: router.params,
97
- query: router.query,
98
- url: router.url,
99
- path: router.path,
100
- matches: router.matches,
101
- redirect: (path, parentComponent) => {
102
- router.go(path, parentComponent);
103
- return false;
104
- }
105
- };
106
- let response;
107
- for (const middleware of middlewares) {
108
- response = await middleware(request, response);
109
- if (response !== void 0 && ((0, import_valyrian.isComponent)(response) || (0, import_valyrian.isVnodeComponent)(response))) {
110
- return response;
111
- }
112
- if (response === false) {
113
- return false;
72
+ // Search for a route in the tree
73
+ // eslint-disable-next-line sonarjs/cognitive-complexity
74
+ findRoute(path) {
75
+ const pathWithoutLastSlash = getPathWithoutLastSlash(path);
76
+ const segments = pathWithoutLastSlash === "/" ? [pathWithoutLastSlash] : pathWithoutLastSlash.split("/").filter(Boolean);
77
+ let currentNode = this.root;
78
+ const params = {};
79
+ const wildcardMiddlewares = [];
80
+ const segmentsLength = segments.length;
81
+ for (let i = 0; i < segmentsLength; i++) {
82
+ if (!currentNode) {
83
+ break;
84
+ }
85
+ const segment = segments[i];
86
+ let found = false;
87
+ for (const [key, child] of currentNode.children) {
88
+ if (key === segment) {
89
+ currentNode = child;
90
+ found = true;
91
+ break;
92
+ }
93
+ if (segment !== ".*" && key === ":") {
94
+ currentNode = child;
95
+ params[child.paramKey] = segment;
96
+ found = true;
97
+ break;
98
+ }
99
+ if (key === ".*" && !found) {
100
+ wildcardMiddlewares.push(...child.middlewares || []);
101
+ }
102
+ }
103
+ if (!found) {
104
+ if (currentNode.children.has(".*")) {
105
+ return { middlewares: wildcardMiddlewares, params };
106
+ }
107
+ return null;
108
+ }
114
109
  }
110
+ const allMiddlewares = [...wildcardMiddlewares, ...currentNode.middlewares || []];
111
+ if (allMiddlewares.length === 0) {
112
+ return null;
113
+ }
114
+ return { middlewares: allMiddlewares, params };
115
115
  }
116
- }
116
+ };
117
+ var RouterError = class RouterError2 extends Error {
118
+ status = 500;
119
+ };
117
120
  var Router = class _Router {
118
- paths = [];
121
+ routeTree = new RouteTree();
119
122
  container = null;
120
123
  query = {};
121
124
  options = {};
@@ -124,55 +127,93 @@ var Router = class _Router {
124
127
  params = {};
125
128
  matches = [];
126
129
  pathPrefix = "";
130
+ errorHandlers = /* @__PURE__ */ new Map();
127
131
  constructor(pathPrefix = "") {
128
132
  this.pathPrefix = pathPrefix;
129
133
  }
130
- add(path, ...middlewares) {
131
- const pathWithoutLastSlash = getPathWithoutLastSlash(`${this.pathPrefix}${path}`);
132
- addPath({ router: this, method: "add", path: pathWithoutLastSlash, middlewares });
133
- return this;
134
- }
135
- use(...middlewares) {
134
+ add(...args) {
135
+ const flatArgs = flat(args);
136
136
  const path = getPathWithoutLastSlash(
137
- `${this.pathPrefix}${typeof middlewares[0] === "string" ? middlewares.shift() : "/"}`
137
+ `${this.pathPrefix}${typeof flatArgs[0] === "string" ? flatArgs.shift() : "/.*"}`
138
138
  );
139
- for (const item of middlewares) {
140
- if (item instanceof _Router) {
141
- const subrouter = item;
142
- for (const subpath of subrouter.paths) {
143
- addPath({
144
- router: this,
145
- method: subpath.method,
146
- path: `${path}${subpath.path}`.replace(/^\/\//, "/"),
147
- middlewares: subpath.middlewares
148
- });
149
- }
150
- continue;
139
+ if (flatArgs.length === 1 && flatArgs[0] instanceof _Router) {
140
+ const subrouter = flatArgs[0];
141
+ for (const subroute of subrouter.routes()) {
142
+ const subroutePath = `${path}${subroute}`;
143
+ this.routeTree.addRoute(subroutePath, subrouter.routeTree.findRoute(subroute).middlewares || []);
144
+ }
145
+ } else {
146
+ if (flatArgs.some((item) => item instanceof _Router)) {
147
+ throw new RouterError("You cannot add middlewares when adding a subrouter.");
151
148
  }
152
- if (typeof item === "function") {
153
- addPath({ router: this, method: "use", path: `${path}.*`, middlewares: [item] });
149
+ if (flatArgs.some((item) => typeof item !== "function")) {
150
+ throw new RouterError("All middlewares must be functions.");
154
151
  }
152
+ this.routeTree.addRoute(path, flatArgs);
155
153
  }
156
154
  return this;
157
155
  }
156
+ catch(...args) {
157
+ const condition = typeof args[0] === "number" || typeof args[0] === "string" || args[0].name.includes("Error") ? args.shift() : "generic";
158
+ if (typeof condition !== "number" && typeof condition !== "string" && !condition.name.includes("Error")) {
159
+ throw new RouterError("The condition must be a number, string or an instance of Error.");
160
+ }
161
+ if (args.some((item) => typeof item !== "function")) {
162
+ throw new RouterError("All middlewares must be functions.");
163
+ }
164
+ let handlers = this.errorHandlers.get(condition);
165
+ if (!handlers) {
166
+ handlers = [];
167
+ this.errorHandlers.set(condition, handlers);
168
+ }
169
+ handlers.push(...args);
170
+ return this;
171
+ }
158
172
  routes() {
159
- return this.paths.filter((path) => path.method === "add").map((path) => path.path);
173
+ return this.getAllRoutes(this.routeTree.root, "");
160
174
  }
161
- async go(path, parentComponent, preventPushState = false) {
175
+ // eslint-disable-next-line sonarjs/cognitive-complexity
176
+ async go(path, parentComponent) {
162
177
  if (!path) {
163
- throw new Error("router.url.required");
178
+ return this.handleError(new RouterError("The URL is empty."), parentComponent);
179
+ }
180
+ if (/%[^0-9A-Fa-f]{2}/.test(path)) {
181
+ return this.handleError(new RouterError(`The URL ${path} is malformed.`));
164
182
  }
165
183
  const constructedPath = getPathWithoutLastSlash(`${this.pathPrefix}${path}`);
166
184
  const parts = constructedPath.split("?", 2);
167
185
  this.url = constructedPath;
168
186
  this.query = parseQuery(parts[1]);
169
- const middlewares = searchMiddlewares(this, parts[0].replace(/(.+)\/$/, "$1").split("#")[0]);
170
- let component = await searchComponent(this, middlewares);
187
+ const finalPath = parts[0].replace(/(.+)\/$/, "$1").split("#")[0];
188
+ this.path = path;
189
+ let route = this.routeTree.findRoute(finalPath);
190
+ if (!route || !route.middlewares) {
191
+ const finalPathParts = finalPath.split("/");
192
+ while (finalPathParts.length > 0) {
193
+ finalPathParts.pop();
194
+ const wildcardRoute = this.routeTree.findRoute(finalPathParts.join("/") + "/.*");
195
+ if (wildcardRoute) {
196
+ route = wildcardRoute;
197
+ break;
198
+ }
199
+ }
200
+ if (!route || !route.middlewares) {
201
+ const error = new RouterError(`The URL ${constructedPath} was not found in the router's registered paths.`);
202
+ error.status = 404;
203
+ return this.handleError(error, parentComponent);
204
+ }
205
+ }
206
+ const { middlewares, params } = route;
207
+ this.params = params;
208
+ let component = await this.searchComponent(middlewares, parentComponent);
171
209
  if (component === false) {
172
210
  return;
173
211
  }
174
212
  if (!component) {
175
- throw new Error(`The url ${constructedPath} requested wasn't found`);
213
+ return this.handleError(
214
+ new RouterError(`The URL ${constructedPath} did not return a valid component.`),
215
+ parentComponent
216
+ );
176
217
  }
177
218
  if ((0, import_valyrian.isComponent)(parentComponent) || (0, import_valyrian.isVnodeComponent)(parentComponent)) {
178
219
  const childComponent = (0, import_valyrian.isVnodeComponent)(component) ? component : (0, import_valyrian.v)(component, {});
@@ -183,7 +224,7 @@ var Router = class _Router {
183
224
  component = (0, import_valyrian.v)(parentComponent, {}, childComponent);
184
225
  }
185
226
  }
186
- if (!import_valyrian.isNodeJs && !preventPushState) {
227
+ if (!import_valyrian.isNodeJs && window.location.pathname + window.location.search !== constructedPath) {
187
228
  window.history.pushState(null, "", constructedPath);
188
229
  }
189
230
  if (this.container) {
@@ -192,17 +233,128 @@ var Router = class _Router {
192
233
  }
193
234
  getOnClickHandler(url) {
194
235
  return (e) => {
236
+ if (e.button !== 0 || e.ctrlKey || e.metaKey || e.shiftKey || e.altKey || e.defaultPrevented) {
237
+ return;
238
+ }
195
239
  if (typeof url === "string" && url.length > 0) {
196
240
  this.go(url);
197
241
  }
198
242
  e.preventDefault();
199
243
  };
200
244
  }
245
+ getAllRoutes(node, prefix) {
246
+ const routes = [];
247
+ for (const [key, child] of node.children) {
248
+ const newPrefix = `${prefix}/${child.isDynamic ? `:${child.paramKey}` : key}`.replace(/\/$/, "");
249
+ if (child.middlewares) {
250
+ routes.push(newPrefix);
251
+ }
252
+ routes.push(...this.getAllRoutes(child, newPrefix));
253
+ }
254
+ return routes;
255
+ }
256
+ createRequest() {
257
+ return {
258
+ params: this.params,
259
+ query: this.query,
260
+ url: this.url,
261
+ path: this.path,
262
+ matches: this.matches,
263
+ redirect: (path) => this.go(path)
264
+ };
265
+ }
266
+ getErrorConditionMiddlewares(error) {
267
+ for (const [condition, middlewares] of this.errorHandlers) {
268
+ if (typeof condition !== "number" && typeof condition !== "string" && error instanceof condition && error.name === condition.name) {
269
+ return middlewares;
270
+ }
271
+ }
272
+ for (const [condition, middlewares] of this.errorHandlers) {
273
+ if (typeof condition === "number" && (error.status === condition || error.code === condition)) {
274
+ return middlewares;
275
+ }
276
+ }
277
+ for (const [condition, middlewares] of this.errorHandlers) {
278
+ if (typeof condition === "string" && (error.name === condition || error.message.includes(condition))) {
279
+ return middlewares;
280
+ }
281
+ }
282
+ return this.errorHandlers.get("generic") || false;
283
+ }
284
+ // eslint-disable-next-line sonarjs/cognitive-complexity
285
+ async handleError(error, parentComponent) {
286
+ const request = this.createRequest();
287
+ let component = null;
288
+ const middlewares = this.getErrorConditionMiddlewares(error);
289
+ if (middlewares === false) {
290
+ throw error;
291
+ }
292
+ let response;
293
+ try {
294
+ for (const middleware of middlewares) {
295
+ response = await middleware(request, error);
296
+ if (response !== void 0 && ((0, import_valyrian.isComponent)(response) || (0, import_valyrian.isVnodeComponent)(response))) {
297
+ component = response;
298
+ break;
299
+ }
300
+ if (response === false) {
301
+ return;
302
+ }
303
+ }
304
+ } catch (err) {
305
+ err.cause = error;
306
+ let errorCauseCount = 0;
307
+ while (err.cause) {
308
+ errorCauseCount++;
309
+ }
310
+ if (errorCauseCount > 20) {
311
+ throw new RouterError("Too many error causes. Possible circular error handling.");
312
+ }
313
+ return this.handleError(err, parentComponent);
314
+ }
315
+ if (component) {
316
+ if ((0, import_valyrian.isComponent)(parentComponent) || (0, import_valyrian.isVnodeComponent)(parentComponent)) {
317
+ const childComponent = (0, import_valyrian.isVnodeComponent)(component) ? component : (0, import_valyrian.v)(component, {});
318
+ if ((0, import_valyrian.isVnodeComponent)(parentComponent)) {
319
+ parentComponent.children.push(childComponent);
320
+ component = parentComponent;
321
+ } else {
322
+ component = (0, import_valyrian.v)(parentComponent, {}, childComponent);
323
+ }
324
+ }
325
+ if (!import_valyrian.isNodeJs && window.location.pathname + window.location.search !== this.url) {
326
+ window.history.pushState(null, "", this.url);
327
+ }
328
+ if (this.container) {
329
+ return (0, import_valyrian.mount)(this.container, component);
330
+ }
331
+ }
332
+ throw error;
333
+ }
334
+ async searchComponent(middlewares, parentComponent) {
335
+ const request = this.createRequest();
336
+ let response;
337
+ for (const middleware of middlewares) {
338
+ try {
339
+ response = await middleware(request);
340
+ } catch (error) {
341
+ return this.handleError(error, parentComponent);
342
+ }
343
+ if (response !== void 0 && ((0, import_valyrian.isComponent)(response) || (0, import_valyrian.isVnodeComponent)(response))) {
344
+ return response;
345
+ }
346
+ if (response === false) {
347
+ return false;
348
+ }
349
+ }
350
+ return response;
351
+ }
201
352
  };
202
353
  var localRedirect;
203
- function redirect(url, parentComponent, preventPushState = false) {
354
+ async function redirect(url, parentComponent, preventPushState = false) {
204
355
  if (!localRedirect) {
205
- throw new Error("router.redirect.not.found");
356
+ console.warn("Redirect function is not initialized. Please mount the router first.");
357
+ return;
206
358
  }
207
359
  return localRedirect(url, parentComponent, preventPushState);
208
360
  }
@@ -212,14 +364,13 @@ function mountRouter(elementContainer, router) {
212
364
  if (!import_valyrian.isNodeJs) {
213
365
  let onPopStateGoToRoute2 = function() {
214
366
  const pathWithoutPrefix = getPathWithoutPrefix(document.location.pathname, router.pathPrefix);
215
- router.go(pathWithoutPrefix, void 0, true);
367
+ router.go(pathWithoutPrefix);
216
368
  };
217
369
  var onPopStateGoToRoute = onPopStateGoToRoute2;
218
370
  window.addEventListener("popstate", onPopStateGoToRoute2, false);
219
371
  onPopStateGoToRoute2();
220
372
  }
221
- (0, import_valyrian.directive)("route", (vnode) => {
222
- const url = vnode.props["v-route"];
373
+ (0, import_valyrian.directive)("route", (url, vnode) => {
223
374
  (0, import_valyrian.setAttribute)("href", url, vnode);
224
375
  (0, import_valyrian.setAttribute)("onclick", router.getOnClickHandler(url), vnode);
225
376
  });