@mastra/server 1.67.0-alpha.1 → 1.67.0-alpha.4

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 (229) hide show
  1. package/dist/_types/@internal_voice/dist/_types/@internal_core/dist/request-context/index.d.ts +21 -0
  2. package/dist/_types/@mastra_schema-compat/dist/schema.types.d.ts +20 -1
  3. package/dist/{a2a-CW4FVjHx.cjs → a2a-DQ8GeDz4.cjs} +3 -3
  4. package/dist/{a2a-CW4FVjHx.cjs.map → a2a-DQ8GeDz4.cjs.map} +1 -1
  5. package/dist/{a2a-Di7S6YaM.js → a2a-DUBjstWk.js} +3 -3
  6. package/dist/{a2a-Di7S6YaM.js.map → a2a-DUBjstWk.js.map} +1 -1
  7. package/dist/{api-schema-manifest-BkKHbFJi.js → api-schema-manifest-B8uyCfJp.js} +3 -3
  8. package/dist/{api-schema-manifest-BkKHbFJi.js.map → api-schema-manifest-B8uyCfJp.js.map} +1 -1
  9. package/dist/{api-schema-manifest-Cpw4nIVv.cjs → api-schema-manifest-nIt4xi1r.cjs} +3 -3
  10. package/dist/{api-schema-manifest-Cpw4nIVv.cjs.map → api-schema-manifest-nIt4xi1r.cjs.map} +1 -1
  11. package/dist/{background-tasks-Bl7Hn8h9.js → background-tasks-B4yoNDY_.js} +2 -2
  12. package/dist/{background-tasks-Bl7Hn8h9.js.map → background-tasks-B4yoNDY_.js.map} +1 -1
  13. package/dist/{background-tasks-BJhziawt.cjs → background-tasks-BarPeyNJ.cjs} +2 -2
  14. package/dist/{background-tasks-BJhziawt.cjs.map → background-tasks-BarPeyNJ.cjs.map} +1 -1
  15. package/dist/{builder-registry-Bcpr74BB.js → builder-registry-DI3Ysclf.js} +3 -3
  16. package/dist/{builder-registry-Bcpr74BB.js.map → builder-registry-DI3Ysclf.js.map} +1 -1
  17. package/dist/{builder-registry-BINitddV.cjs → builder-registry-r71f11_E.cjs} +3 -3
  18. package/dist/{builder-registry-BINitddV.cjs.map → builder-registry-r71f11_E.cjs.map} +1 -1
  19. package/dist/{channels-CnEljW9e.js → channels-B_K1oJ7S.js} +2 -2
  20. package/dist/{channels-CnEljW9e.js.map → channels-B_K1oJ7S.js.map} +1 -1
  21. package/dist/{channels-D8e5YDTn.cjs → channels-CGDo0Prv.cjs} +2 -2
  22. package/dist/{channels-D8e5YDTn.cjs.map → channels-CGDo0Prv.cjs.map} +1 -1
  23. package/dist/{conversations-D89Io31L.js → conversations-Bs-k9f9N.js} +2 -2
  24. package/dist/{conversations-D89Io31L.js.map → conversations-Bs-k9f9N.js.map} +1 -1
  25. package/dist/{conversations-DJybpnE5.cjs → conversations-o3AEJjRo.cjs} +2 -2
  26. package/dist/{conversations-DJybpnE5.cjs.map → conversations-o3AEJjRo.cjs.map} +1 -1
  27. package/dist/{datasets-C-_ZWnxR.cjs → datasets-BqCRJLYH.cjs} +25 -2
  28. package/dist/datasets-BqCRJLYH.cjs.map +1 -0
  29. package/dist/{datasets-B4qPHzEy.js → datasets-Dhk4CUat.js} +20 -3
  30. package/dist/datasets-Dhk4CUat.js.map +1 -0
  31. package/dist/{dist-B8gYiHIX.js → dist-8iDh9UbP.js} +185 -30
  32. package/dist/dist-8iDh9UbP.js.map +1 -0
  33. package/dist/{dist-CaVro31X.cjs → dist-CBDJtAr5.cjs} +189 -34
  34. package/dist/dist-CBDJtAr5.cjs.map +1 -0
  35. package/dist/docs/SKILL.md +1 -1
  36. package/dist/docs/assets/SOURCE_MAP.json +1 -1
  37. package/dist/{dynamic-workflows-Cn9MXevC.js → dynamic-workflows-C3DXgmSP.js} +2 -2
  38. package/dist/{dynamic-workflows-Cn9MXevC.js.map → dynamic-workflows-C3DXgmSP.js.map} +1 -1
  39. package/dist/{dynamic-workflows-DSg9_yec.cjs → dynamic-workflows-DeUG3lA2.cjs} +2 -2
  40. package/dist/{dynamic-workflows-DSg9_yec.cjs.map → dynamic-workflows-DeUG3lA2.cjs.map} +1 -1
  41. package/dist/{editor-builder-DeFo8Kl5.cjs → editor-builder-DFh_-7Id.cjs} +2 -2
  42. package/dist/{editor-builder-DeFo8Kl5.cjs.map → editor-builder-DFh_-7Id.cjs.map} +1 -1
  43. package/dist/{editor-builder-DzpPA6dp.js → editor-builder-QRcP8-SQ.js} +2 -2
  44. package/dist/{editor-builder-DzpPA6dp.js.map → editor-builder-QRcP8-SQ.js.map} +1 -1
  45. package/dist/{memory-CVODqy7m.cjs → memory-CE6rUGmo.cjs} +22 -1
  46. package/dist/memory-CE6rUGmo.cjs.map +1 -0
  47. package/dist/{memory-CjWJYFVI.js → memory-Cp3Yo-OX.js} +11 -2
  48. package/dist/{memory-CjWJYFVI.js.map → memory-Cp3Yo-OX.js.map} +1 -1
  49. package/dist/{observability-new-endpoints-BNPjbEXf.cjs → observability-new-endpoints-I2OxQzfY.cjs} +2 -2
  50. package/dist/{observability-new-endpoints-BNPjbEXf.cjs.map → observability-new-endpoints-I2OxQzfY.cjs.map} +1 -1
  51. package/dist/{observability-new-endpoints-CSiMF_Kf.js → observability-new-endpoints-pIq_OWa8.js} +2 -2
  52. package/dist/{observability-new-endpoints-CSiMF_Kf.js.map → observability-new-endpoints-pIq_OWa8.js.map} +1 -1
  53. package/dist/{route-builder-BveLN9LU.js → route-builder-BukcT_Kp.js} +2 -2
  54. package/dist/{route-builder-BveLN9LU.js.map → route-builder-BukcT_Kp.js.map} +1 -1
  55. package/dist/{route-builder-C8n4ugUf.cjs → route-builder-DupY8fkI.cjs} +4 -4
  56. package/dist/{route-builder-C8n4ugUf.cjs.map → route-builder-DupY8fkI.cjs.map} +1 -1
  57. package/dist/{routes-DCwOOz84.js → routes-BSAA4PVg.js} +15 -11
  58. package/dist/routes-BSAA4PVg.js.map +1 -0
  59. package/dist/{routes-Dgd2S9av.cjs → routes-D5r7qWgZ.cjs} +14 -10
  60. package/dist/routes-D5r7qWgZ.cjs.map +1 -0
  61. package/dist/{schedules-BcEUUuX_.js → schedules-BzymFGR_.js} +2 -2
  62. package/dist/{schedules-BcEUUuX_.js.map → schedules-BzymFGR_.js.map} +1 -1
  63. package/dist/{schedules-fj9U0_tA.cjs → schedules-DaEv0Usj.cjs} +2 -2
  64. package/dist/{schedules-fj9U0_tA.cjs.map → schedules-DaEv0Usj.cjs.map} +1 -1
  65. package/dist/schema-BF_cZG0Y.js +2 -0
  66. package/dist/schema-C7CvwM1d.cjs +1 -0
  67. package/dist/{schema-Bv9OdW1f-DLSJSqQv.js → schema-D_ikovK6-BzTeMhWf.js} +467 -131
  68. package/dist/schema-D_ikovK6-BzTeMhWf.js.map +1 -0
  69. package/dist/{schema-Bv9OdW1f-CxTiW8RD.cjs → schema-D_ikovK6-DQrOVw5N.cjs} +467 -131
  70. package/dist/schema-D_ikovK6-DQrOVw5N.cjs.map +1 -0
  71. package/dist/server/handlers/a2a.cjs +1 -1
  72. package/dist/server/handlers/a2a.js +1 -1
  73. package/dist/server/handlers/agent-builder.cjs +3 -3
  74. package/dist/server/handlers/agent-builder.js +3 -3
  75. package/dist/server/handlers/agent-controller.cjs +3 -3
  76. package/dist/server/handlers/agent-controller.js +3 -3
  77. package/dist/server/handlers/agent-versions.cjs +2 -2
  78. package/dist/server/handlers/agent-versions.js +2 -2
  79. package/dist/server/handlers/agents.cjs +14 -21
  80. package/dist/server/handlers/agents.cjs.map +1 -1
  81. package/dist/server/handlers/agents.d.ts.map +1 -1
  82. package/dist/server/handlers/agents.js +6 -13
  83. package/dist/server/handlers/agents.js.map +1 -1
  84. package/dist/server/handlers/auth.cjs +1 -1
  85. package/dist/server/handlers/auth.js +1 -1
  86. package/dist/server/handlers/background-tasks.cjs +1 -1
  87. package/dist/server/handlers/background-tasks.js +1 -1
  88. package/dist/server/handlers/builder-registry.cjs +1 -1
  89. package/dist/server/handlers/builder-registry.js +1 -1
  90. package/dist/server/handlers/channels.cjs +1 -1
  91. package/dist/server/handlers/channels.js +1 -1
  92. package/dist/server/handlers/conversations.cjs +3 -3
  93. package/dist/server/handlers/conversations.js +3 -3
  94. package/dist/server/handlers/datasets.cjs +18 -9
  95. package/dist/server/handlers/datasets.cjs.map +1 -1
  96. package/dist/server/handlers/datasets.d.ts +27 -0
  97. package/dist/server/handlers/datasets.d.ts.map +1 -1
  98. package/dist/server/handlers/datasets.js +18 -9
  99. package/dist/server/handlers/datasets.js.map +1 -1
  100. package/dist/server/handlers/dynamic-workflows.cjs +1 -1
  101. package/dist/server/handlers/dynamic-workflows.js +1 -1
  102. package/dist/server/handlers/editor-builder.cjs +1 -1
  103. package/dist/server/handlers/editor-builder.js +1 -1
  104. package/dist/server/handlers/favorites-enrichment.cjs +1 -1
  105. package/dist/server/handlers/favorites-enrichment.js +1 -1
  106. package/dist/server/handlers/logs.cjs +2 -2
  107. package/dist/server/handlers/logs.js +2 -2
  108. package/dist/server/handlers/mcp-client-versions.cjs +2 -2
  109. package/dist/server/handlers/mcp-client-versions.js +2 -2
  110. package/dist/server/handlers/mcp.cjs +1 -1
  111. package/dist/server/handlers/mcp.js +1 -1
  112. package/dist/server/handlers/memory.cjs +64 -3
  113. package/dist/server/handlers/memory.cjs.map +1 -1
  114. package/dist/server/handlers/memory.d.ts +47 -0
  115. package/dist/server/handlers/memory.d.ts.map +1 -1
  116. package/dist/server/handlers/memory.js +64 -4
  117. package/dist/server/handlers/memory.js.map +1 -1
  118. package/dist/server/handlers/observability-new-endpoints.cjs +1 -1
  119. package/dist/server/handlers/observability-new-endpoints.js +1 -1
  120. package/dist/server/handlers/observability-shared.cjs +1 -1
  121. package/dist/server/handlers/observability-shared.js +1 -1
  122. package/dist/server/handlers/observability.cjs +2 -2
  123. package/dist/server/handlers/observability.js +2 -2
  124. package/dist/server/handlers/plans.cjs +2 -2
  125. package/dist/server/handlers/plans.js +2 -2
  126. package/dist/server/handlers/processor-providers.cjs +1 -1
  127. package/dist/server/handlers/processor-providers.js +1 -1
  128. package/dist/server/handlers/processors.cjs +1 -1
  129. package/dist/server/handlers/processors.js +1 -1
  130. package/dist/server/handlers/prompt-block-versions.cjs +2 -2
  131. package/dist/server/handlers/prompt-block-versions.js +2 -2
  132. package/dist/server/handlers/responses.cjs +2 -2
  133. package/dist/server/handlers/responses.d.ts +11 -11
  134. package/dist/server/handlers/responses.js +2 -2
  135. package/dist/server/handlers/responses.storage.cjs +1 -1
  136. package/dist/server/handlers/responses.storage.js +1 -1
  137. package/dist/server/handlers/schedules.cjs +1 -1
  138. package/dist/server/handlers/schedules.js +1 -1
  139. package/dist/server/handlers/scorer-versions.cjs +2 -2
  140. package/dist/server/handlers/scorer-versions.js +2 -2
  141. package/dist/server/handlers/scores.cjs +1 -1
  142. package/dist/server/handlers/scores.js +1 -1
  143. package/dist/server/handlers/stored-agent-favorites.cjs +3 -3
  144. package/dist/server/handlers/stored-agent-favorites.js +3 -3
  145. package/dist/server/handlers/stored-agents.cjs +3 -3
  146. package/dist/server/handlers/stored-agents.js +3 -3
  147. package/dist/server/handlers/stored-mcp-clients.cjs +2 -2
  148. package/dist/server/handlers/stored-mcp-clients.js +2 -2
  149. package/dist/server/handlers/stored-prompt-blocks.cjs +2 -2
  150. package/dist/server/handlers/stored-prompt-blocks.js +2 -2
  151. package/dist/server/handlers/stored-scorers.cjs +2 -2
  152. package/dist/server/handlers/stored-scorers.js +2 -2
  153. package/dist/server/handlers/stored-skill-favorites.cjs +3 -3
  154. package/dist/server/handlers/stored-skill-favorites.js +3 -3
  155. package/dist/server/handlers/stored-skills.cjs +3 -3
  156. package/dist/server/handlers/stored-skills.js +3 -3
  157. package/dist/server/handlers/stored-workspaces.cjs +2 -2
  158. package/dist/server/handlers/stored-workspaces.js +2 -2
  159. package/dist/server/handlers/system.cjs +2 -2
  160. package/dist/server/handlers/system.js +2 -2
  161. package/dist/server/handlers/tool-providers.cjs +1 -1
  162. package/dist/server/handlers/tool-providers.js +1 -1
  163. package/dist/server/handlers/tools.cjs +6 -6
  164. package/dist/server/handlers/tools.js +5 -5
  165. package/dist/server/handlers/utils.cjs +3 -1
  166. package/dist/server/handlers/utils.d.ts +13 -0
  167. package/dist/server/handlers/utils.d.ts.map +1 -1
  168. package/dist/server/handlers/utils.js +2 -2
  169. package/dist/server/handlers/validate-agent-instructions.cjs +1 -1
  170. package/dist/server/handlers/validate-agent-instructions.js +1 -1
  171. package/dist/server/handlers/vector.cjs +1 -1
  172. package/dist/server/handlers/vector.js +1 -1
  173. package/dist/server/handlers/workflow-builder.cjs +5 -0
  174. package/dist/server/handlers/workflow-builder.d.ts +322 -0
  175. package/dist/server/handlers/workflow-builder.d.ts.map +1 -0
  176. package/dist/server/handlers/workflow-builder.js +2 -0
  177. package/dist/server/handlers/workflows.cjs +3 -3
  178. package/dist/server/handlers/workflows.js +3 -3
  179. package/dist/server/handlers/workspace.cjs +1 -1
  180. package/dist/server/handlers/workspace.js +1 -1
  181. package/dist/server/handlers.cjs +2 -2
  182. package/dist/server/handlers.js +2 -2
  183. package/dist/server/schemas/datasets.d.ts +18 -0
  184. package/dist/server/schemas/datasets.d.ts.map +1 -1
  185. package/dist/server/schemas/index.cjs +6 -3
  186. package/dist/server/schemas/index.js +4 -4
  187. package/dist/server/schemas/memory.d.ts +18 -0
  188. package/dist/server/schemas/memory.d.ts.map +1 -1
  189. package/dist/server/schemas/workflow-builder.d.ts +26 -0
  190. package/dist/server/schemas/workflow-builder.d.ts.map +1 -0
  191. package/dist/server/server-adapter/index.cjs +13 -3
  192. package/dist/server/server-adapter/index.cjs.map +1 -1
  193. package/dist/server/server-adapter/index.d.ts.map +1 -1
  194. package/dist/server/server-adapter/index.js +13 -3
  195. package/dist/server/server-adapter/index.js.map +1 -1
  196. package/dist/server/server-adapter/routes/conversations.d.ts +3 -3
  197. package/dist/server/server-adapter/routes/datasets.d.ts +27 -0
  198. package/dist/server/server-adapter/routes/datasets.d.ts.map +1 -1
  199. package/dist/server/server-adapter/routes/editor-builder.d.ts +319 -0
  200. package/dist/server/server-adapter/routes/editor-builder.d.ts.map +1 -1
  201. package/dist/server/server-adapter/routes/memory.d.ts +46 -0
  202. package/dist/server/server-adapter/routes/memory.d.ts.map +1 -1
  203. package/dist/server/server-adapter/routes/workspace.d.ts +23 -23
  204. package/dist/{utils-B2vd77Fi.js → utils-Duk4hfT_.js} +3 -3
  205. package/dist/{utils-B2vd77Fi.js.map → utils-Duk4hfT_.js.map} +1 -1
  206. package/dist/{utils-Hz8Hc2cd.js → utils-KsERfbhc.js} +24 -3
  207. package/dist/utils-KsERfbhc.js.map +1 -0
  208. package/dist/{utils-CmYnjLcY.cjs → utils-WcR0QSUB.cjs} +5 -5
  209. package/dist/{utils-CmYnjLcY.cjs.map → utils-WcR0QSUB.cjs.map} +1 -1
  210. package/dist/{utils-DJMUhfvY.cjs → utils-aIu3gkhJ.cjs} +35 -2
  211. package/dist/utils-aIu3gkhJ.cjs.map +1 -0
  212. package/dist/workflow-builder-C9DVk9Tw.js +102 -0
  213. package/dist/workflow-builder-C9DVk9Tw.js.map +1 -0
  214. package/dist/workflow-builder-_rQWs1B6.cjs +115 -0
  215. package/dist/workflow-builder-_rQWs1B6.cjs.map +1 -0
  216. package/package.json +6 -6
  217. package/dist/datasets-B4qPHzEy.js.map +0 -1
  218. package/dist/datasets-C-_ZWnxR.cjs.map +0 -1
  219. package/dist/dist-B8gYiHIX.js.map +0 -1
  220. package/dist/dist-CaVro31X.cjs.map +0 -1
  221. package/dist/memory-CVODqy7m.cjs.map +0 -1
  222. package/dist/routes-DCwOOz84.js.map +0 -1
  223. package/dist/routes-Dgd2S9av.cjs.map +0 -1
  224. package/dist/schema-Bv9OdW1f-CxTiW8RD.cjs.map +0 -1
  225. package/dist/schema-Bv9OdW1f-DLSJSqQv.js.map +0 -1
  226. package/dist/schema-CGeYTFwm.js +0 -2
  227. package/dist/schema-CNKnRmv1.cjs +0 -1
  228. package/dist/utils-DJMUhfvY.cjs.map +0 -1
  229. package/dist/utils-Hz8Hc2cd.js.map +0 -1
@@ -1320,7 +1320,7 @@ function toStandardSchema$4(schema) {
1320
1320
  return new AiSdkSchemaWrapper(schema);
1321
1321
  }
1322
1322
  //#endregion
1323
- //#region ../schema-compat/dist/json-schema-BstKYbJi.js
1323
+ //#region ../schema-compat/dist/json-schema-BKit3LVN.js
1324
1324
  var require_code$1 = /* @__PURE__ */ __commonJSMin(((exports) => {
1325
1325
  Object.defineProperty(exports, "__esModule", { value: true });
1326
1326
  exports.regexpCode = exports.getEsmExportName = exports.getProperty = exports.safeStringify = exports.stringify = exports.strConcat = exports.addCodeArg = exports.str = exports._ = exports.nil = exports._Code = exports.Name = exports.IDENTIFIER = exports._CodeOrName = void 0;
@@ -3926,11 +3926,27 @@ var require_utils = /* @__PURE__ */ __commonJSMin(((exports, module) => {
3926
3926
  /** @type {(value: string) => boolean} */
3927
3927
  const isIPv4 = RegExp.prototype.test.bind(/^(?:(?:25[0-5]|2[0-4]\d|1\d{2}|[1-9]\d|\d)\.){3}(?:25[0-5]|2[0-4]\d|1\d{2}|[1-9]\d|\d)$/u);
3928
3928
  /** @type {(value: string) => boolean} */
3929
+ const isPort = RegExp.prototype.test.bind(/^\d*$/u);
3930
+ /** @type {(value: string) => boolean} */
3929
3931
  const isHexPair = RegExp.prototype.test.bind(/^[\da-f]{2}$/iu);
3930
3932
  /** @type {(value: string) => boolean} */
3931
3933
  const isUnreserved = RegExp.prototype.test.bind(/^[\da-z\-._~]$/iu);
3932
3934
  /** @type {(value: string) => boolean} */
3933
- const isPathCharacter = RegExp.prototype.test.bind(/^[\da-z\-._~!$&'()*+,;=:@/]$/iu);
3935
+ const isPathCharacter = RegExp.prototype.test.bind(/^[A-Za-z0-9\-._~!$&'()*+,;=:@/]$/u);
3936
+ /** @type {(value: string) => boolean} */
3937
+ const isQueryFragmentCharacter = RegExp.prototype.test.bind(/^[A-Za-z0-9\-._~!$&'()*+,;=:@/?]$/u);
3938
+ /** @type {(value: string) => boolean} */
3939
+ const isUserinfoCharacter = RegExp.prototype.test.bind(/^[A-Za-z0-9\-._~!$&'()*+,;=:]$/u);
3940
+ const BYTE_HEX = new Array(256);
3941
+ {
3942
+ const HEX_DIGITS = "0123456789ABCDEF";
3943
+ for (let i = 0; i < 256; i++) BYTE_HEX[i] = "%" + HEX_DIGITS[i >> 4] + HEX_DIGITS[i & 15];
3944
+ }
3945
+ function percentEncodeNonAscii(cp) {
3946
+ if (cp < 2048) return BYTE_HEX[192 | cp >> 6] + BYTE_HEX[128 | cp & 63];
3947
+ if (cp < 65536) return BYTE_HEX[224 | cp >> 12] + BYTE_HEX[128 | cp >> 6 & 63] + BYTE_HEX[128 | cp & 63];
3948
+ return BYTE_HEX[240 | cp >> 18] + BYTE_HEX[128 | cp >> 12 & 63] + BYTE_HEX[128 | cp >> 6 & 63] + BYTE_HEX[128 | cp & 63];
3949
+ }
3934
3950
  /**
3935
3951
  * @param {Array<string>} input
3936
3952
  * @returns {string}
@@ -3953,119 +3969,162 @@ var require_utils = /* @__PURE__ */ __commonJSMin(((exports, module) => {
3953
3969
  }
3954
3970
  return acc;
3955
3971
  }
3956
- /**
3957
- * @typedef {Object} GetIPV6Result
3958
- * @property {boolean} error - Indicates if there was an error parsing the IPv6 address.
3959
- * @property {string} address - The parsed IPv6 address.
3960
- * @property {string} [zone] - The zone identifier, if present.
3961
- */
3972
+ /** @type {(value: string) => boolean} */
3973
+ const isHextet = RegExp.prototype.test.bind(/^[\dA-Fa-f]{1,4}$/);
3974
+ /** @type {(value: string) => boolean} */
3975
+ const isIPvFuture = RegExp.prototype.test.bind(/^[vV][\dA-Fa-f]+\.[A-Za-z\d\-._~!$&'()*+,;=:]+$/);
3976
+ /** @type {(value: string) => boolean} */
3977
+ const isZoneCharacter = RegExp.prototype.test.bind(/^[A-Za-z\d\-._~]$/);
3962
3978
  /**
3963
3979
  * @param {string} value
3964
3980
  * @returns {boolean}
3965
3981
  */
3966
3982
  const nonSimpleDomain = RegExp.prototype.test.bind(/[^!"$&'()*+,\-.;=_`a-z{}~]/u);
3967
3983
  /**
3968
- * @param {Array<string>} buffer
3984
+ * @param {string} zone
3969
3985
  * @returns {boolean}
3970
3986
  */
3971
- function consumeIsZone(buffer) {
3972
- buffer.length = 0;
3987
+ function isZoneIdentifier(zone) {
3988
+ if (zone.length === 0) return false;
3989
+ for (let i = 0; i < zone.length; i++) {
3990
+ if (isZoneCharacter(zone[i])) continue;
3991
+ if (zone[i] === "%" && i + 2 < zone.length && isHexPair(zone.slice(i + 1, i + 3))) {
3992
+ i += 2;
3993
+ continue;
3994
+ }
3995
+ return false;
3996
+ }
3973
3997
  return true;
3974
3998
  }
3975
3999
  /**
3976
- * @param {Array<string>} buffer
3977
- * @param {Array<string>} address
3978
- * @param {GetIPV6Result} output
3979
- * @returns {boolean}
4000
+ * Compresses the longest run of zero hextets to "::" per RFC 5952. A run of a
4001
+ * single zero hextet is left uncompressed. On ties the leftmost run wins.
4002
+ *
4003
+ * @param {string[]} hextets
4004
+ * @returns {string}
3980
4005
  */
3981
- function consumeHextets(buffer, address, output) {
3982
- if (buffer.length) {
3983
- const hex = stringArrayToHexStripped(buffer);
3984
- if (hex !== "") address.push(hex);
3985
- else {
3986
- output.error = true;
3987
- return false;
4006
+ function compressIPv6ZeroRun(hextets) {
4007
+ let bestStart = -1;
4008
+ let bestLength = 0;
4009
+ let runStart = -1;
4010
+ let runLength = 0;
4011
+ for (let i = 0; i < hextets.length; i++) if (hextets[i] === "0") {
4012
+ if (runStart === -1) runStart = i;
4013
+ runLength++;
4014
+ if (runLength > bestLength) {
4015
+ bestLength = runLength;
4016
+ bestStart = runStart;
3988
4017
  }
3989
- buffer.length = 0;
4018
+ } else {
4019
+ runStart = -1;
4020
+ runLength = 0;
3990
4021
  }
3991
- return true;
4022
+ if (bestLength < 2) return hextets.join(":");
4023
+ const head = hextets.slice(0, bestStart).join(":");
4024
+ const tail = hextets.slice(bestStart + bestLength).join(":");
4025
+ return head + "::" + tail;
3992
4026
  }
3993
4027
  /**
4028
+ * Validates an IPv6 address against the alternatives in RFC 3986 section
4029
+ * 3.2.2 and returns the same address with leading hextet zeroes removed.
4030
+ * An embedded IPv4 address counts as two hextets and is only valid at the end.
4031
+ *
3994
4032
  * @param {string} input
3995
- * @returns {GetIPV6Result}
4033
+ * @returns {string|undefined}
3996
4034
  */
3997
- function getIPV6(input) {
3998
- let tokenCount = 0;
3999
- const output = {
4000
- error: false,
4001
- address: "",
4002
- zone: ""
4003
- };
4004
- /** @type {Array<string>} */
4005
- const address = [];
4006
- /** @type {Array<string>} */
4007
- const buffer = [];
4008
- let endipv6Encountered = false;
4009
- let endIpv6 = false;
4010
- let consume = consumeHextets;
4011
- for (let i = 0; i < input.length; i++) {
4012
- const cursor = input[i];
4013
- if (cursor === "[" || cursor === "]") continue;
4014
- if (cursor === ":") {
4015
- if (endipv6Encountered === true) endIpv6 = true;
4016
- if (!consume(buffer, address, output)) break;
4017
- if (++tokenCount > 7) {
4018
- output.error = true;
4019
- break;
4020
- }
4021
- if (i > 0 && input[i - 1] === ":") endipv6Encountered = true;
4022
- address.push(":");
4023
- continue;
4024
- } else if (cursor === "%") {
4025
- if (!consume(buffer, address, output)) break;
4026
- consume = consumeIsZone;
4027
- } else {
4028
- buffer.push(cursor);
4035
+ function normalizeIPv6Address(input) {
4036
+ const compression = input.indexOf("::");
4037
+ if (compression !== -1 && input.indexOf("::", compression + 1) !== -1) return void 0;
4038
+ const left = compression === -1 ? input.split(":") : input.slice(0, compression).split(":");
4039
+ const right = compression === -1 ? [] : input.slice(compression + 2).split(":");
4040
+ if (compression !== -1) {
4041
+ if (left.length === 1 && left[0] === "") left.length = 0;
4042
+ if (right.length === 1 && right[0] === "") right.length = 0;
4043
+ }
4044
+ const parts = left.concat(right);
4045
+ let hextetCount = 0;
4046
+ for (let i = 0; i < parts.length; i++) {
4047
+ const part = parts[i];
4048
+ if (part === "") return void 0;
4049
+ if (part.indexOf(".") !== -1) {
4050
+ if (i !== parts.length - 1 || compression !== -1 && right.length === 0 || !isIPv4(part)) return void 0;
4051
+ hextetCount += 2;
4029
4052
  continue;
4030
4053
  }
4054
+ if (!isHextet(part)) return void 0;
4055
+ parts[i] = parseInt(part, 16).toString(16);
4056
+ hextetCount++;
4031
4057
  }
4032
- if (buffer.length) if (consume === consumeIsZone) output.zone = buffer.join("");
4033
- else if (endIpv6) address.push(buffer.join(""));
4034
- else address.push(stringArrayToHexStripped(buffer));
4035
- output.address = address.join("");
4036
- return output;
4058
+ if (compression === -1) {
4059
+ if (hextetCount !== 8) return void 0;
4060
+ return compressIPv6ZeroRun(parts);
4061
+ }
4062
+ if (hextetCount >= 8) return void 0;
4063
+ const expanded = parts.slice(0, left.length);
4064
+ for (let i = hextetCount; i < 8; i++) expanded.push("0");
4065
+ for (let i = left.length; i < parts.length; i++) expanded.push(parts[i]);
4066
+ return compressIPv6ZeroRun(expanded);
4037
4067
  }
4038
4068
  /**
4039
4069
  * @typedef {Object} NormalizeIPv6Result
4040
4070
  * @property {string} host - The normalized host.
4041
4071
  * @property {string} [escapedHost] - The escaped host.
4042
4072
  * @property {boolean} isIPV6 - Indicates if the host is an IPv6 address.
4073
+ * @property {boolean} [isIPVFuture] - Indicates if the host is an IPvFuture literal.
4074
+ * @property {boolean} [error] - Indicates if a bracketed IP literal is malformed.
4043
4075
  */
4044
4076
  /**
4077
+ * Validates and normalizes a bracketed IP literal. Raw zone separators remain
4078
+ * accepted for backwards compatibility, while encoded separators and zone
4079
+ * contents follow RFC 6874.
4080
+ *
4045
4081
  * @param {string} host
4046
4082
  * @returns {NormalizeIPv6Result}
4047
4083
  */
4048
4084
  function normalizeIPv6(host) {
4049
- if (findToken(host, ":") < 2) return {
4085
+ const bracketed = host[0] === "[" && host[host.length - 1] === "]";
4086
+ if ((host[0] === "[" || host[host.length - 1] === "]") && !bracketed) return {
4050
4087
  host,
4051
- isIPV6: false
4088
+ isIPV6: false,
4089
+ error: true
4052
4090
  };
4053
- const ipv6 = getIPV6(host);
4054
- if (!ipv6.error) {
4055
- let newHost = ipv6.address;
4056
- let escapedHost = ipv6.address;
4057
- if (ipv6.zone) {
4058
- newHost += "%" + ipv6.zone;
4059
- escapedHost += "%25" + ipv6.zone;
4060
- }
4091
+ let input = bracketed ? host.slice(1, -1) : host;
4092
+ if (bracketed && isIPvFuture(input)) {
4093
+ input = input.toLowerCase();
4061
4094
  return {
4062
- host: newHost,
4063
- isIPV6: true,
4064
- escapedHost
4095
+ host: `[${input}]`,
4096
+ escapedHost: input,
4097
+ isIPV6: false,
4098
+ isIPVFuture: true
4065
4099
  };
4066
- } else return {
4100
+ }
4101
+ if (findToken(input, ":") < 2) return {
4102
+ host,
4103
+ isIPV6: false,
4104
+ error: bracketed
4105
+ };
4106
+ let zoneIdentifier = "";
4107
+ const zoneSeparator = input.indexOf("%");
4108
+ if (zoneSeparator !== -1) {
4109
+ const separatorLength = input.slice(zoneSeparator, zoneSeparator + 3).toLowerCase() === "%25" ? 3 : 1;
4110
+ zoneIdentifier = input.slice(zoneSeparator + separatorLength);
4111
+ if (!isZoneIdentifier(zoneIdentifier)) return {
4112
+ host,
4113
+ isIPV6: false,
4114
+ error: true
4115
+ };
4116
+ input = input.slice(0, zoneSeparator);
4117
+ }
4118
+ const address = normalizeIPv6Address(input);
4119
+ if (address === void 0) return {
4067
4120
  host,
4068
- isIPV6: false
4121
+ isIPV6: false,
4122
+ error: true
4123
+ };
4124
+ return {
4125
+ host: address + (zoneIdentifier ? "%" + zoneIdentifier : ""),
4126
+ escapedHost: address + (zoneIdentifier ? "%25" + zoneIdentifier : ""),
4127
+ isIPV6: true
4069
4128
  };
4070
4129
  }
4071
4130
  /**
@@ -4178,7 +4237,7 @@ var require_utils = /* @__PURE__ */ __commonJSMin(((exports, module) => {
4178
4237
  }
4179
4238
  /**
4180
4239
  * Normalizes percent escapes and optionally decodes only unreserved ASCII bytes.
4181
- * Reserved delimiters such as `%2F` and `%2E` stay escaped.
4240
+ * Reserved delimiters such as `%2F` stay escaped; `%2E` is unreserved.
4182
4241
  *
4183
4242
  * @param {string} input
4184
4243
  * @param {boolean} [decodeUnreserved=false]
@@ -4214,7 +4273,8 @@ var require_utils = /* @__PURE__ */ __commonJSMin(((exports, module) => {
4214
4273
  function normalizePathEncoding(input) {
4215
4274
  let output = "";
4216
4275
  for (let i = 0; i < input.length; i++) {
4217
- if (input[i] === "%" && i + 2 < input.length) {
4276
+ const ch = input[i];
4277
+ if (ch === "%" && i + 2 < input.length) {
4218
4278
  const hex = input.slice(i + 1, i + 3);
4219
4279
  if (isHexPair(hex)) {
4220
4280
  const normalizedHex = hex.toUpperCase();
@@ -4225,8 +4285,168 @@ var require_utils = /* @__PURE__ */ __commonJSMin(((exports, module) => {
4225
4285
  continue;
4226
4286
  }
4227
4287
  }
4228
- if (isPathCharacter(input[i])) output += input[i];
4229
- else output += escape(input[i]);
4288
+ if (isPathCharacter(ch)) output += ch;
4289
+ else {
4290
+ const code = input.charCodeAt(i);
4291
+ if (code < 128) output += isEscapeSafe(code) ? ch : BYTE_HEX[code];
4292
+ else if (code < 55296 || code > 57343) output += percentEncodeNonAscii(code);
4293
+ else if (code <= 56319 && i + 1 < input.length) {
4294
+ const low = input.charCodeAt(i + 1);
4295
+ if (low >= 56320 && low <= 57343) {
4296
+ output += percentEncodeNonAscii(65536 + (code - 55296 << 10) + (low - 56320));
4297
+ i++;
4298
+ } else output += percentEncodeNonAscii(65533);
4299
+ } else output += percentEncodeNonAscii(65533);
4300
+ }
4301
+ }
4302
+ return output;
4303
+ }
4304
+ /**
4305
+ * Serializes a path without rewriting reserved data. Raw RFC 3986 path
4306
+ * characters remain literal, valid escapes are preserved and uppercased, and
4307
+ * everything else is UTF-8 percent-encoded. In a path-noscheme, a colon in the
4308
+ * first segment must be escaped so the result cannot be parsed as a scheme.
4309
+ *
4310
+ * @param {string} input
4311
+ * @param {boolean} [pathNoScheme=false]
4312
+ * @returns {string}
4313
+ */
4314
+ function serializePathEncoding(input, pathNoScheme = false) {
4315
+ let output = "";
4316
+ let firstSegment = pathNoScheme && input[0] !== "/";
4317
+ for (let i = 0; i < input.length; i++) {
4318
+ const ch = input[i];
4319
+ if (ch === "%" && i + 2 < input.length) {
4320
+ const hex = input.slice(i + 1, i + 3);
4321
+ if (isHexPair(hex)) {
4322
+ output += "%" + hex.toUpperCase();
4323
+ i += 2;
4324
+ continue;
4325
+ }
4326
+ }
4327
+ if (ch === "/") firstSegment = false;
4328
+ if (isPathCharacter(ch) && (ch !== ":" || !firstSegment)) output += ch;
4329
+ else {
4330
+ const code = input.charCodeAt(i);
4331
+ if (code < 128) output += BYTE_HEX[code];
4332
+ else if (code < 55296 || code > 57343) output += percentEncodeNonAscii(code);
4333
+ else if (code <= 56319 && i + 1 < input.length) {
4334
+ const low = input.charCodeAt(i + 1);
4335
+ if (low >= 56320 && low <= 57343) {
4336
+ output += percentEncodeNonAscii(65536 + (code - 55296 << 10) + (low - 56320));
4337
+ i++;
4338
+ } else output += percentEncodeNonAscii(65533);
4339
+ } else output += percentEncodeNonAscii(65533);
4340
+ }
4341
+ }
4342
+ return output;
4343
+ }
4344
+ /**
4345
+ * Percent-encodes a URI component using its RFC 3986 literal character set.
4346
+ * Existing valid escapes are preserved and normalized to uppercase hex.
4347
+ *
4348
+ * @param {string} input
4349
+ * @param {(value: string) => boolean} isAllowed
4350
+ * @returns {string}
4351
+ */
4352
+ function encodeComponent(input, isAllowed) {
4353
+ let output = "";
4354
+ for (let i = 0; i < input.length; i++) {
4355
+ const ch = input[i];
4356
+ if (ch === "%" && i + 2 < input.length) {
4357
+ const hex = input.slice(i + 1, i + 3);
4358
+ if (isHexPair(hex)) {
4359
+ output += "%" + hex.toUpperCase();
4360
+ i += 2;
4361
+ continue;
4362
+ }
4363
+ }
4364
+ if (isAllowed(ch)) output += ch;
4365
+ else {
4366
+ const code = input.charCodeAt(i);
4367
+ if (code < 128) output += BYTE_HEX[code];
4368
+ else if (code < 55296 || code > 57343) output += percentEncodeNonAscii(code);
4369
+ else if (code <= 56319 && i + 1 < input.length) {
4370
+ const low = input.charCodeAt(i + 1);
4371
+ if (low >= 56320 && low <= 57343) {
4372
+ output += percentEncodeNonAscii(65536 + (code - 55296 << 10) + (low - 56320));
4373
+ i++;
4374
+ } else output += percentEncodeNonAscii(65533);
4375
+ } else output += percentEncodeNonAscii(65533);
4376
+ }
4377
+ }
4378
+ return output;
4379
+ }
4380
+ /**
4381
+ * Encodes userinfo while preserving its RFC 3986 §3.2.1 literal characters.
4382
+ * In particular, authority delimiters such as `@`, `/`, `?`, and `#` are data.
4383
+ *
4384
+ * @param {string} input
4385
+ * @returns {string}
4386
+ */
4387
+ function encodeUserinfo(input) {
4388
+ return encodeComponent(input, isUserinfoCharacter);
4389
+ }
4390
+ /**
4391
+ * Encodes query data using the RFC 3986 §3.4 grammar. A literal `#` must be
4392
+ * escaped because it would otherwise begin the fragment component.
4393
+ *
4394
+ * @param {string} input
4395
+ * @returns {string}
4396
+ */
4397
+ function encodeQuery(input) {
4398
+ return encodeComponent(input, isQueryFragmentCharacter);
4399
+ }
4400
+ /**
4401
+ * Encodes fragment data using the RFC 3986 §3.5 grammar.
4402
+ *
4403
+ * @param {string} input
4404
+ * @returns {string}
4405
+ */
4406
+ function encodeFragment(input) {
4407
+ return encodeComponent(input, isQueryFragmentCharacter);
4408
+ }
4409
+ function isEscapeSafe(cp) {
4410
+ return cp >= 48 && cp <= 57 || cp >= 65 && cp <= 90 || cp >= 97 && cp <= 122 || cp === 42 || cp === 43 || cp === 45 || cp === 46 || cp === 47 || cp === 64 || cp === 95;
4411
+ }
4412
+ /**
4413
+ * Normalizes the percent-encoding of a query or fragment component.
4414
+ *
4415
+ * Like `normalizePathEncoding`, but uses the query/fragment character set
4416
+ * (which additionally allows `?`) and decodes `.` since it has no dot-segment
4417
+ * meaning outside of a path.
4418
+ *
4419
+ * @param {string} input
4420
+ * @returns {string}
4421
+ */
4422
+ function normalizeQueryFragmentEncoding(input) {
4423
+ let output = "";
4424
+ for (let i = 0; i < input.length; i++) {
4425
+ const ch = input[i];
4426
+ if (ch === "%" && i + 2 < input.length) {
4427
+ const hex = input.slice(i + 1, i + 3);
4428
+ if (isHexPair(hex)) {
4429
+ const normalizedHex = hex.toUpperCase();
4430
+ const decoded = String.fromCharCode(parseInt(normalizedHex, 16));
4431
+ if (isUnreserved(decoded)) output += decoded;
4432
+ else output += "%" + normalizedHex;
4433
+ i += 2;
4434
+ continue;
4435
+ }
4436
+ }
4437
+ if (isQueryFragmentCharacter(ch)) output += ch;
4438
+ else {
4439
+ const code = input.charCodeAt(i);
4440
+ if (code < 128) output += isEscapeSafe(code) ? ch : BYTE_HEX[code];
4441
+ else if (code < 55296 || code > 57343) output += percentEncodeNonAscii(code);
4442
+ else if (code <= 56319 && i + 1 < input.length) {
4443
+ const low = input.charCodeAt(i + 1);
4444
+ if (low >= 56320 && low <= 57343) {
4445
+ output += percentEncodeNonAscii(65536 + (code - 55296 << 10) + (low - 56320));
4446
+ i++;
4447
+ } else output += percentEncodeNonAscii(65533);
4448
+ } else output += percentEncodeNonAscii(65533);
4449
+ }
4230
4450
  }
4231
4451
  return output;
4232
4452
  }
@@ -4258,21 +4478,27 @@ var require_utils = /* @__PURE__ */ __commonJSMin(((exports, module) => {
4258
4478
  function recomposeAuthority(component) {
4259
4479
  const uriTokens = [];
4260
4480
  if (component.userinfo !== void 0) {
4261
- uriTokens.push(component.userinfo);
4481
+ uriTokens.push(encodeUserinfo(component.userinfo));
4262
4482
  uriTokens.push("@");
4263
4483
  }
4264
4484
  if (component.host !== void 0) {
4265
- let host = unescape(component.host);
4485
+ let host = component.host;
4266
4486
  if (!isIPv4(host)) {
4267
- const ipV6res = normalizeIPv6(host);
4268
- if (ipV6res.isIPV6 === true) host = `[${ipV6res.escapedHost}]`;
4487
+ let ipV6res = normalizeIPv6(host);
4488
+ if (ipV6res.isIPV6 !== true && ipV6res.isIPVFuture !== true) {
4489
+ host = normalizePercentEncoding(host, true);
4490
+ ipV6res = normalizeIPv6(host);
4491
+ }
4492
+ if (ipV6res.isIPV6 === true || ipV6res.isIPVFuture === true) host = `[${ipV6res.escapedHost}]`;
4269
4493
  else host = reescapeHostDelimiters(host, false);
4270
4494
  }
4271
4495
  uriTokens.push(host);
4272
4496
  }
4273
4497
  if (typeof component.port === "number" || typeof component.port === "string") {
4498
+ const port = String(component.port);
4499
+ if (!isPort(port)) throw new TypeError("URI port is malformed.");
4274
4500
  uriTokens.push(":");
4275
- uriTokens.push(String(component.port));
4501
+ uriTokens.push(port);
4276
4502
  }
4277
4503
  return uriTokens.length ? uriTokens.join("") : void 0;
4278
4504
  }
@@ -4282,6 +4508,11 @@ var require_utils = /* @__PURE__ */ __commonJSMin(((exports, module) => {
4282
4508
  reescapeHostDelimiters,
4283
4509
  normalizePercentEncoding,
4284
4510
  normalizePathEncoding,
4511
+ serializePathEncoding,
4512
+ normalizeQueryFragmentEncoding,
4513
+ encodeUserinfo,
4514
+ encodeQuery,
4515
+ encodeFragment,
4285
4516
  escapePreservingEscapes,
4286
4517
  removeDotSegments,
4287
4518
  isIPv4,
@@ -4292,7 +4523,7 @@ var require_utils = /* @__PURE__ */ __commonJSMin(((exports, module) => {
4292
4523
  }));
4293
4524
  var require_schemes = /* @__PURE__ */ __commonJSMin(((exports, module) => {
4294
4525
  const { isUUID } = require_utils();
4295
- const URN_REG = /([\da-z][\d\-a-z]{0,31}):((?:[\w!$'()*+,\-.:;=@]|%[\da-f]{2})+)/iu;
4526
+ const URN_REG = /^([\da-z][\d\-a-z]{0,31}):((?:[\w!$'()*+,\-./:;=@]|%[\da-f]{2})+)$/iu;
4296
4527
  const supportedSchemeNames = [
4297
4528
  "http",
4298
4529
  "https",
@@ -4363,9 +4594,10 @@ var require_schemes = /* @__PURE__ */ __commonJSMin(((exports, module) => {
4363
4594
  wsComponent.secure = void 0;
4364
4595
  }
4365
4596
  if (wsComponent.resourceName) {
4366
- const [path, query] = wsComponent.resourceName.split("?");
4597
+ const queryIndex = wsComponent.resourceName.indexOf("?");
4598
+ const path = queryIndex === -1 ? wsComponent.resourceName : wsComponent.resourceName.slice(0, queryIndex);
4367
4599
  wsComponent.path = path && path !== "/" ? path : void 0;
4368
- wsComponent.query = query;
4600
+ wsComponent.query = queryIndex === -1 ? void 0 : wsComponent.resourceName.slice(queryIndex + 1);
4369
4601
  wsComponent.resourceName = void 0;
4370
4602
  }
4371
4603
  wsComponent.fragment = void 0;
@@ -4378,7 +4610,7 @@ var require_schemes = /* @__PURE__ */ __commonJSMin(((exports, module) => {
4378
4610
  return urnComponent;
4379
4611
  }
4380
4612
  const matches = urnComponent.path.match(URN_REG);
4381
- if (matches) {
4613
+ if (matches && matches[0] === urnComponent.path) {
4382
4614
  const scheme = options.scheme || urnComponent.scheme || "urn";
4383
4615
  urnComponent.nid = matches[1].toLowerCase();
4384
4616
  urnComponent.nss = matches[2];
@@ -4472,8 +4704,19 @@ var require_schemes = /* @__PURE__ */ __commonJSMin(((exports, module) => {
4472
4704
  };
4473
4705
  }));
4474
4706
  var require_fast_uri = /* @__PURE__ */ __commonJSMin(((exports, module) => {
4475
- const { normalizeIPv6, removeDotSegments, recomposeAuthority, normalizePercentEncoding, normalizePathEncoding, escapePreservingEscapes, reescapeHostDelimiters, isIPv4, nonSimpleDomain } = require_utils();
4707
+ const { normalizeIPv6, removeDotSegments, recomposeAuthority, normalizePercentEncoding, normalizePathEncoding, serializePathEncoding, normalizeQueryFragmentEncoding, encodeQuery, encodeFragment, reescapeHostDelimiters, isIPv4, nonSimpleDomain } = require_utils();
4476
4708
  const { SCHEMES, getSchemeHandler } = require_schemes();
4709
+ const VALID_SCHEME = /^[A-Za-z][A-Za-z0-9+.-]*$/u;
4710
+ const MALFORMED_SCHEME_ERROR = "URI scheme is malformed.";
4711
+ /**
4712
+ * @param {string} scheme
4713
+ * @returns {string}
4714
+ */
4715
+ function decodeValidScheme(scheme) {
4716
+ const decodedScheme = unescape(String(scheme));
4717
+ if (!VALID_SCHEME.test(decodedScheme)) throw new TypeError(MALFORMED_SCHEME_ERROR);
4718
+ return decodedScheme;
4719
+ }
4477
4720
  /**
4478
4721
  * @template {import('./types/index').URIComponent|string} T
4479
4722
  * @param {T} uri
@@ -4493,10 +4736,16 @@ var require_fast_uri = /* @__PURE__ */ __commonJSMin(((exports, module) => {
4493
4736
  */
4494
4737
  function resolve(baseURI, relativeURI, options) {
4495
4738
  const schemelessOptions = options ? Object.assign({ scheme: "null" }, options) : { scheme: "null" };
4496
- const { parsed: baseParsed, malformedAuthorityOrPort: baseMalformed } = parseWithStatus(baseURI, schemelessOptions);
4497
- const { parsed: relativeParsed, malformedAuthorityOrPort: relativeMalformed } = parseWithStatus(relativeURI, schemelessOptions);
4498
- if (baseMalformed || relativeMalformed) throw new Error(baseParsed.error || relativeParsed.error || "URI is malformed.");
4739
+ const { parsed: baseParsed, malformedAuthorityOrPort: baseMalformed, malformedPercentEncoding: baseMalformedPercentEncoding, malformedSchemeSpecific: baseMalformedSchemeSpecific, malformedHost: baseMalformedHost, malformedScheme: baseMalformedScheme } = parseWithStatus(baseURI, schemelessOptions);
4740
+ const { parsed: relativeParsed, malformedAuthorityOrPort: relativeMalformed, malformedPercentEncoding: relativeMalformedPercentEncoding, malformedSchemeSpecific: relativeMalformedSchemeSpecific, malformedHost: relativeMalformedHost, malformedScheme: relativeMalformedScheme } = parseWithStatus(relativeURI, schemelessOptions);
4741
+ if (baseMalformed || relativeMalformed || baseMalformedPercentEncoding || relativeMalformedPercentEncoding || baseMalformedSchemeSpecific || relativeMalformedSchemeSpecific || baseMalformedHost || relativeMalformedHost || baseMalformedScheme || relativeMalformedScheme) throw new Error(baseParsed.error || relativeParsed.error || "URI is malformed.");
4499
4742
  const resolved = resolveComponent(baseParsed, relativeParsed, schemelessOptions, true);
4743
+ const resolvedSchemeHandler = getSchemeHandler(options && options.scheme || resolved.scheme);
4744
+ const resolvedHost = resolved.host;
4745
+ const resolvedHostIsIP = resolvedHost !== void 0 && resolvedHost !== "" && (isIPv4(resolvedHost) || normalizeIPv6(resolvedHost).isIPV6);
4746
+ canonicalizeHost(resolved, options || {}, resolvedSchemeHandler, resolvedHostIsIP);
4747
+ const encodedASCIIHost = resolvedHost && resolvedHost.indexOf("%") !== -1 && !/\P{ASCII}/u.test(resolvedHost);
4748
+ if (resolved.error && !encodedASCIIHost) throw new Error(resolved.error);
4500
4749
  schemelessOptions.skipEscape = true;
4501
4750
  return serialize(resolved, schemelessOptions);
4502
4751
  }
@@ -4562,7 +4811,7 @@ var require_fast_uri = /* @__PURE__ */ __commonJSMin(((exports, module) => {
4562
4811
  function equal(uriA, uriB, options) {
4563
4812
  const normalizedA = normalizeComparableURI(uriA, options);
4564
4813
  const normalizedB = normalizeComparableURI(uriB, options);
4565
- return normalizedA !== void 0 && normalizedB !== void 0 && normalizedA.toLowerCase() === normalizedB.toLowerCase();
4814
+ return normalizedA !== void 0 && normalizedB !== void 0 && normalizedA === normalizedB;
4566
4815
  }
4567
4816
  /**
4568
4817
  * @param {Readonly<import('./types/index').URIComponent>} cmpts
@@ -4588,13 +4837,17 @@ var require_fast_uri = /* @__PURE__ */ __commonJSMin(((exports, module) => {
4588
4837
  };
4589
4838
  const options = Object.assign({}, opts);
4590
4839
  const uriTokens = [];
4840
+ if (component.scheme) component.scheme = decodeValidScheme(component.scheme);
4591
4841
  const schemeHandler = getSchemeHandler(options.scheme || component.scheme);
4592
4842
  if (schemeHandler && schemeHandler.serialize) schemeHandler.serialize(component, options);
4593
- if (component.path !== void 0) if (!options.skipEscape) {
4594
- component.path = escapePreservingEscapes(component.path);
4595
- if (component.scheme !== void 0) component.path = component.path.split("%3A").join(":");
4596
- } else component.path = normalizePercentEncoding(component.path);
4597
- if (options.reference !== "suffix" && component.scheme) uriTokens.push(component.scheme, ":");
4843
+ const hasAuthority = component.userinfo !== void 0 || component.host !== void 0 || component.port !== void 0;
4844
+ const pathNoScheme = !options.skipEscape && component.scheme === void 0 && !hasAuthority;
4845
+ if (component.path !== void 0) if (!options.skipEscape) component.path = serializePathEncoding(component.path, pathNoScheme);
4846
+ else component.path = normalizePercentEncoding(component.path);
4847
+ if (options.reference !== "suffix" && component.scheme) {
4848
+ component.scheme = decodeValidScheme(component.scheme);
4849
+ uriTokens.push(component.scheme, ":");
4850
+ }
4598
4851
  const authority = recomposeAuthority(component);
4599
4852
  if (authority !== void 0) {
4600
4853
  if (options.reference !== "suffix") uriTokens.push("//");
@@ -4604,11 +4857,12 @@ var require_fast_uri = /* @__PURE__ */ __commonJSMin(((exports, module) => {
4604
4857
  if (component.path !== void 0) {
4605
4858
  let s = component.path;
4606
4859
  if (!options.absolutePath && (!schemeHandler || !schemeHandler.absolutePath)) s = removeDotSegments(s);
4860
+ if (pathNoScheme) s = serializePathEncoding(s, true);
4607
4861
  if (authority === void 0 && s[0] === "/" && s[1] === "/") s = "/%2F" + s.slice(2);
4608
4862
  uriTokens.push(s);
4609
4863
  }
4610
- if (component.query !== void 0) uriTokens.push("?", component.query);
4611
- if (component.fragment !== void 0) uriTokens.push("#", component.fragment);
4864
+ if (component.query !== void 0) uriTokens.push("?", encodeQuery(component.query));
4865
+ if (component.fragment !== void 0) uriTokens.push("#", encodeFragment(component.fragment));
4612
4866
  return uriTokens.join("");
4613
4867
  }
4614
4868
  const URI_PARSE = /^(?:([^#/:?]+):)?(?:\/\/((?:([^#/?@]*)@)?(\[[^#/?\]]+\]|[^#/:?]*)(?::(\d*))?))?([^#?]*)(?:\?([^#]*))?(?:#((?:.|[\n\r])*))?/u;
@@ -4624,9 +4878,61 @@ var require_fast_uri = /* @__PURE__ */ __commonJSMin(((exports, module) => {
4624
4878
  if (typeof parsed.port === "number" && (parsed.port < 0 || parsed.port > 65535)) return "URI port is malformed.";
4625
4879
  }
4626
4880
  /**
4881
+ * Checks percent syntax without decoding the represented octets. RFC 3986
4882
+ * percent-encoding is byte-oriented, so sequences such as `%FF` are valid even
4883
+ * though they are not independently valid UTF-8.
4884
+ *
4885
+ * @param {string|undefined} component
4886
+ * @returns {boolean}
4887
+ */
4888
+ function hasMalformedPercentEncoding(component) {
4889
+ if (component === void 0) return false;
4890
+ let percent = component.indexOf("%");
4891
+ while (percent !== -1) {
4892
+ if (percent + 2 >= component.length || !/^[\da-f]{2}$/iu.test(component.slice(percent + 1, percent + 3))) return true;
4893
+ percent = component.indexOf("%", percent + 3);
4894
+ }
4895
+ return false;
4896
+ }
4897
+ /**
4898
+ * Whether the host is a bracketed IP literal (RFC 3986 `IP-literal`).
4899
+ * An unterminated `[` is not a literal, so it must still be validated as a
4900
+ * reg-name instead of being waved through as an IP.
4901
+ *
4902
+ * @param {string} host
4903
+ * @returns {boolean}
4904
+ */
4905
+ function isIPLiteral(host) {
4906
+ return host[0] === "[" && host[host.length - 1] === "]";
4907
+ }
4908
+ /**
4909
+ * @param {RegExpMatchArray} matches
4910
+ * @returns {boolean}
4911
+ */
4912
+ function hasMalformedComponentPercentEncoding(matches) {
4913
+ const host = matches[4];
4914
+ return hasMalformedPercentEncoding(matches[3]) || host !== void 0 && !isIPLiteral(host) && hasMalformedPercentEncoding(host) || hasMalformedPercentEncoding(matches[6]) || hasMalformedPercentEncoding(matches[7]) || hasMalformedPercentEncoding(matches[8]);
4915
+ }
4916
+ /**
4917
+ * @param {import('./types/index').URIComponent} parsed
4918
+ * @param {import('./types/index').Options} options
4919
+ * @param {{ domainHost?: boolean, unicodeSupport?: boolean }|undefined} schemeHandler
4920
+ * @param {boolean} isIP
4921
+ * @returns {boolean} whether host conversion failed
4922
+ */
4923
+ function canonicalizeHost(parsed, options, schemeHandler, isIP) {
4924
+ if (!options.unicodeSupport && (!schemeHandler || !schemeHandler.unicodeSupport) && parsed.host && !isIPLiteral(parsed.host) && (options.domainHost || schemeHandler && schemeHandler.domainHost) && isIP === false && nonSimpleDomain(parsed.host)) try {
4925
+ parsed.host = new URL("http://" + parsed.host).hostname;
4926
+ } catch (e) {
4927
+ parsed.error = parsed.error || "Host's domain name can not be converted to ASCII: " + e;
4928
+ return true;
4929
+ }
4930
+ return false;
4931
+ }
4932
+ /**
4627
4933
  * @param {string} uri
4628
4934
  * @param {import('./types/index').Options} [opts]
4629
- * @returns {{ parsed: import('./types/index').URIComponent, malformedAuthorityOrPort: boolean }}
4935
+ * @returns {{ parsed: import('./types/index').URIComponent, malformedAuthorityOrPort: boolean, malformedPercentEncoding: boolean, malformedSchemeSpecific: boolean, malformedHost: boolean, malformedScheme: boolean }}
4630
4936
  */
4631
4937
  function parseWithStatus(uri, opts) {
4632
4938
  const options = Object.assign({}, opts);
@@ -4641,6 +4947,11 @@ var require_fast_uri = /* @__PURE__ */ __commonJSMin(((exports, module) => {
4641
4947
  fragment: void 0
4642
4948
  };
4643
4949
  let malformedAuthorityOrPort = false;
4950
+ let malformedPercentEncoding = false;
4951
+ let malformedSchemeSpecific = false;
4952
+ let malformedHost = false;
4953
+ let malformedIPLiteral = false;
4954
+ let malformedScheme = false;
4644
4955
  let isIP = false;
4645
4956
  if (options.reference === "suffix") if (options.scheme) uri = options.scheme + ":" + uri;
4646
4957
  else uri = "//" + uri;
@@ -4672,6 +4983,16 @@ var require_fast_uri = /* @__PURE__ */ __commonJSMin(((exports, module) => {
4672
4983
  parsed.path = matches[6] || "";
4673
4984
  parsed.query = matches[7];
4674
4985
  parsed.fragment = matches[8];
4986
+ if (parsed.scheme !== void 0) {
4987
+ const decodedScheme = unescape(parsed.scheme);
4988
+ if (VALID_SCHEME.test(decodedScheme)) parsed.scheme = decodedScheme.toLowerCase();
4989
+ else {
4990
+ parsed.error = parsed.error || MALFORMED_SCHEME_ERROR;
4991
+ malformedScheme = true;
4992
+ }
4993
+ }
4994
+ malformedPercentEncoding = hasMalformedComponentPercentEncoding(matches);
4995
+ if (malformedPercentEncoding) parsed.error = parsed.error || "URI contains malformed percent-encoding.";
4675
4996
  if (isNaN(parsed.port)) parsed.port = matches[5];
4676
4997
  const parseError = getParseError(parsed, matches);
4677
4998
  if (parseError !== void 0) {
@@ -4679,9 +5000,16 @@ var require_fast_uri = /* @__PURE__ */ __commonJSMin(((exports, module) => {
4679
5000
  malformedAuthorityOrPort = true;
4680
5001
  }
4681
5002
  if (parsed.host) if (isIPv4(parsed.host) === false) {
5003
+ const bracketedIPLiteral = isIPLiteral(parsed.host);
5004
+ const hasIPLiteralBracket = parsed.host.indexOf("[") !== -1 || parsed.host.indexOf("]") !== -1;
4682
5005
  const ipv6result = normalizeIPv6(parsed.host);
4683
- parsed.host = ipv6result.host.toLowerCase();
4684
- isIP = ipv6result.isIPV6;
5006
+ isIP = ipv6result.isIPV6 || ipv6result.isIPVFuture === true;
5007
+ malformedIPLiteral = hasIPLiteralBracket && (!bracketedIPLiteral || ipv6result.error === true);
5008
+ parsed.host = isIP ? ipv6result.host : ipv6result.host.toLowerCase();
5009
+ if (malformedIPLiteral) {
5010
+ parsed.error = parsed.error || "URI host is malformed.";
5011
+ malformedAuthorityOrPort = true;
5012
+ }
4685
5013
  } else isIP = true;
4686
5014
  if (parsed.scheme === void 0 && parsed.userinfo === void 0 && parsed.host === void 0 && parsed.port === void 0 && parsed.query === void 0 && !parsed.path) parsed.reference = "same-document";
4687
5015
  else if (parsed.scheme === void 0) parsed.reference = "relative";
@@ -4689,30 +5017,30 @@ var require_fast_uri = /* @__PURE__ */ __commonJSMin(((exports, module) => {
4689
5017
  else parsed.reference = "uri";
4690
5018
  if (options.reference && options.reference !== "suffix" && options.reference !== parsed.reference) parsed.error = parsed.error || "URI is not a " + options.reference + " reference.";
4691
5019
  const schemeHandler = getSchemeHandler(options.scheme || parsed.scheme);
4692
- if (!options.unicodeSupport && (!schemeHandler || !schemeHandler.unicodeSupport)) {
4693
- if (parsed.host && (options.domainHost || schemeHandler && schemeHandler.domainHost) && isIP === false && nonSimpleDomain(parsed.host)) try {
4694
- parsed.host = new URL("http://" + parsed.host).hostname;
4695
- } catch (e) {
4696
- parsed.error = parsed.error || "Host's domain name can not be converted to ASCII: " + e;
4697
- }
4698
- }
5020
+ if (!malformedIPLiteral) malformedHost = canonicalizeHost(parsed, options, schemeHandler, isIP);
4699
5021
  if (!schemeHandler || schemeHandler && !schemeHandler.skipNormalize) {
4700
5022
  if (uri.indexOf("%") !== -1) {
4701
- if (parsed.scheme !== void 0) parsed.scheme = unescape(parsed.scheme);
4702
- if (parsed.host !== void 0) parsed.host = reescapeHostDelimiters(unescape(parsed.host), isIP);
5023
+ if (parsed.host !== void 0 && !malformedIPLiteral) {
5024
+ const host = isIP ? parsed.host : normalizePercentEncoding(parsed.host, true);
5025
+ parsed.host = reescapeHostDelimiters(host, isIP);
5026
+ }
4703
5027
  }
4704
5028
  if (parsed.path) parsed.path = normalizePathEncoding(parsed.path);
4705
- if (parsed.fragment) try {
4706
- parsed.fragment = encodeURI(decodeURIComponent(parsed.fragment));
4707
- } catch {
4708
- parsed.error = parsed.error || "URI malformed";
4709
- }
5029
+ if (parsed.query) parsed.query = normalizeQueryFragmentEncoding(parsed.query);
5030
+ if (parsed.fragment) parsed.fragment = normalizeQueryFragmentEncoding(parsed.fragment);
5031
+ }
5032
+ if (schemeHandler && schemeHandler.parse) {
5033
+ schemeHandler.parse(parsed, options);
5034
+ if (schemeHandler === SCHEMES.urn && parsed.nid === void 0) malformedSchemeSpecific = true;
4710
5035
  }
4711
- if (schemeHandler && schemeHandler.parse) schemeHandler.parse(parsed, options);
4712
5036
  } else parsed.error = parsed.error || "URI can not be parsed.";
4713
5037
  return {
4714
5038
  parsed,
4715
- malformedAuthorityOrPort
5039
+ malformedAuthorityOrPort,
5040
+ malformedPercentEncoding,
5041
+ malformedSchemeSpecific,
5042
+ malformedHost,
5043
+ malformedScheme
4716
5044
  };
4717
5045
  }
4718
5046
  /**
@@ -4734,13 +5062,17 @@ var require_fast_uri = /* @__PURE__ */ __commonJSMin(((exports, module) => {
4734
5062
  /**
4735
5063
  * @param {string} uri
4736
5064
  * @param {import('./types/index').Options} [opts]
4737
- * @returns {{ normalized: string, malformedAuthorityOrPort: boolean }}
5065
+ * @returns {{ normalized: string, malformedAuthorityOrPort: boolean, malformedPercentEncoding: boolean, malformedSchemeSpecific: boolean, malformedHost: boolean, malformedScheme: boolean }}
4738
5066
  */
4739
5067
  function normalizeStringWithStatus(uri, opts) {
4740
- const { parsed, malformedAuthorityOrPort } = parseWithStatus(uri, opts);
5068
+ const { parsed, malformedAuthorityOrPort, malformedPercentEncoding, malformedSchemeSpecific, malformedHost, malformedScheme } = parseWithStatus(uri, opts);
4741
5069
  return {
4742
- normalized: malformedAuthorityOrPort ? uri : serialize(parsed, opts),
4743
- malformedAuthorityOrPort
5070
+ normalized: malformedAuthorityOrPort || malformedPercentEncoding || malformedSchemeSpecific || malformedHost || malformedScheme ? uri : serialize(parsed, opts),
5071
+ malformedAuthorityOrPort,
5072
+ malformedPercentEncoding,
5073
+ malformedSchemeSpecific,
5074
+ malformedHost,
5075
+ malformedScheme
4744
5076
  };
4745
5077
  }
4746
5078
  /**
@@ -4749,11 +5081,15 @@ var require_fast_uri = /* @__PURE__ */ __commonJSMin(((exports, module) => {
4749
5081
  * @returns {string|undefined}
4750
5082
  */
4751
5083
  function normalizeComparableURI(uri, opts) {
4752
- if (typeof uri === "string") {
4753
- const { normalized, malformedAuthorityOrPort } = normalizeStringWithStatus(uri, opts);
4754
- return malformedAuthorityOrPort ? void 0 : normalized;
5084
+ if (typeof uri !== "string" && typeof uri !== "object") return;
5085
+ let value;
5086
+ try {
5087
+ value = typeof uri === "string" ? uri : serialize(uri, opts);
5088
+ } catch {
5089
+ return;
4755
5090
  }
4756
- if (typeof uri === "object") return serialize(uri, opts);
5091
+ const { normalized, malformedAuthorityOrPort, malformedPercentEncoding, malformedSchemeSpecific, malformedHost, malformedScheme } = normalizeStringWithStatus(value, opts);
5092
+ return malformedAuthorityOrPort || malformedPercentEncoding || malformedSchemeSpecific || malformedHost || malformedScheme ? void 0 : normalized;
4757
5093
  }
4758
5094
  const fastUri = {
4759
5095
  SCHEMES,
@@ -8028,7 +8364,7 @@ function toStandardSchema$2(zodSchema) {
8028
8364
  return wrapper;
8029
8365
  }
8030
8366
  //#endregion
8031
- //#region ../schema-compat/dist/schema-Bv9OdW1f.js
8367
+ //#region ../schema-compat/dist/schema-D_ikovK6.js
8032
8368
  /**
8033
8369
  * Supported JSON Schema targets for z.toJSONSchema().
8034
8370
  * Works with both real Zod v4 and Zod 3.25's v4 compat layer.
@@ -8306,4 +8642,4 @@ Object.defineProperty(exports, "toStandardSchema", {
8306
8642
  }
8307
8643
  });
8308
8644
 
8309
- //# sourceMappingURL=schema-Bv9OdW1f-CxTiW8RD.cjs.map
8645
+ //# sourceMappingURL=schema-D_ikovK6-DQrOVw5N.cjs.map