@maroonedog/luq 0.1.0-alpha

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 (312) hide show
  1. package/LICENSE +9 -0
  2. package/README.md +879 -0
  3. package/dist/constants.d.ts +27 -0
  4. package/dist/core/async.experimental/async-context.d.ts +60 -0
  5. package/dist/core/builder/array-batch-optimizer.d.ts +66 -0
  6. package/dist/core/builder/context/field-context.d.ts +31 -0
  7. package/dist/core/builder/context/field-type-detector.d.ts +19 -0
  8. package/dist/core/builder/core/builder.d.ts +10 -0
  9. package/dist/core/builder/core/field-builder.d.ts +13 -0
  10. package/dist/core/builder/core/index.d.ts +17 -0
  11. package/dist/core/builder/index.d.ts +24 -0
  12. package/dist/core/builder/nested-array-processor.d.ts +52 -0
  13. package/dist/core/builder/plugins/composable-conditional-plugin.d.ts +32 -0
  14. package/dist/core/builder/plugins/composable-directly-plugin.d.ts +32 -0
  15. package/dist/core/builder/plugins/composable-plugin.d.ts +242 -0
  16. package/dist/core/builder/plugins/plugin-creator.d.ts +38 -0
  17. package/dist/core/builder/plugins/plugin-interfaces.d.ts +343 -0
  18. package/dist/core/builder/plugins/plugin-types.d.ts +441 -0
  19. package/dist/core/builder/raw-validator.d.ts +22 -0
  20. package/dist/core/builder/types/field-options.d.ts +46 -0
  21. package/dist/core/builder/types/types.d.ts +318 -0
  22. package/dist/core/builder/ultra-fast-validator.d.ts +30 -0
  23. package/dist/core/builder/validator-factory.d.ts +29 -0
  24. package/dist/core/global-config.d.ts +27 -0
  25. package/dist/core/index.d.ts +36 -0
  26. package/dist/core/optimization/array-batch-validator.d.ts +68 -0
  27. package/dist/core/optimization/core/field-utils.d.ts +103 -0
  28. package/dist/core/optimization/core/strategy-factory.d.ts +84 -0
  29. package/dist/core/optimization/core/validation-engine.d.ts +107 -0
  30. package/dist/core/optimization/execution-strategy-selector.d.ts +23 -0
  31. package/dist/core/optimization/unified-validator.d.ts +45 -0
  32. package/dist/core/plugin/__tests__/test-utils.d.ts +1 -0
  33. package/dist/core/plugin/arrayContains.d.ts +37 -0
  34. package/dist/core/plugin/arrayIncludes.d.ts +42 -0
  35. package/dist/core/plugin/arrayMaxLength.d.ts +43 -0
  36. package/dist/core/plugin/arrayMinLength.d.ts +43 -0
  37. package/dist/core/plugin/arrayUnique.d.ts +41 -0
  38. package/dist/core/plugin/booleanFalsy.d.ts +41 -0
  39. package/dist/core/plugin/booleanTruthy.d.ts +38 -0
  40. package/dist/core/plugin/compareField.d.ts +58 -0
  41. package/dist/core/plugin/conditionalSchema.d.ts +24 -0
  42. package/dist/core/plugin/custom.d.ts +60 -0
  43. package/dist/core/plugin/fromContext.d.ts +150 -0
  44. package/dist/core/plugin/index.d.ts +71 -0
  45. package/dist/core/plugin/jsonSchema/dsl-converter.d.ts +22 -0
  46. package/dist/core/plugin/jsonSchema/error-generation.d.ts +14 -0
  47. package/dist/core/plugin/jsonSchema/format-validators.d.ts +20 -0
  48. package/dist/core/plugin/jsonSchema/index.d.ts +11 -0
  49. package/dist/core/plugin/jsonSchema/plugin.d.ts +35 -0
  50. package/dist/core/plugin/jsonSchema/ref-resolver.d.ts +14 -0
  51. package/dist/core/plugin/jsonSchema/types.d.ts +69 -0
  52. package/dist/core/plugin/jsonSchema/validation-core.d.ts +29 -0
  53. package/dist/core/plugin/jsonSchemaFullFeature.d.ts +31 -0
  54. package/dist/core/plugin/literal.d.ts +40 -0
  55. package/dist/core/plugin/message-factories.d.ts +9 -0
  56. package/dist/core/plugin/nullable.d.ts +34 -0
  57. package/dist/core/plugin/numberFinite.d.ts +41 -0
  58. package/dist/core/plugin/numberInteger.d.ts +41 -0
  59. package/dist/core/plugin/numberMax.d.ts +49 -0
  60. package/dist/core/plugin/numberMin.d.ts +49 -0
  61. package/dist/core/plugin/numberMultipleOf.d.ts +42 -0
  62. package/dist/core/plugin/numberNegative.d.ts +41 -0
  63. package/dist/core/plugin/numberPositive.d.ts +41 -0
  64. package/dist/core/plugin/numberRange.d.ts +48 -0
  65. package/dist/core/plugin/object.d.ts +43 -0
  66. package/dist/core/plugin/objectAdditionalProperties.d.ts +51 -0
  67. package/dist/core/plugin/objectDependentRequired.d.ts +42 -0
  68. package/dist/core/plugin/objectDependentSchemas.d.ts +40 -0
  69. package/dist/core/plugin/objectMaxProperties.d.ts +42 -0
  70. package/dist/core/plugin/objectMinProperties.d.ts +42 -0
  71. package/dist/core/plugin/objectPatternProperties.d.ts +46 -0
  72. package/dist/core/plugin/objectPropertyNames.d.ts +36 -0
  73. package/dist/core/plugin/objectRecursively.d.ts +81 -0
  74. package/dist/core/plugin/oneOf.d.ts +44 -0
  75. package/dist/core/plugin/optional.d.ts +35 -0
  76. package/dist/core/plugin/optionalIf.d.ts +42 -0
  77. package/dist/core/plugin/orFail.d.ts +132 -0
  78. package/dist/core/plugin/readOnlyWriteOnly.d.ts +48 -0
  79. package/dist/core/plugin/required.d.ts +45 -0
  80. package/dist/core/plugin/requiredIf.d.ts +66 -0
  81. package/dist/core/plugin/shared-constants.d.ts +45 -0
  82. package/dist/core/plugin/shared.d.ts +3 -0
  83. package/dist/core/plugin/skip.d.ts +57 -0
  84. package/dist/core/plugin/stitch-typed.d.ts +15 -0
  85. package/dist/core/plugin/stitch.d.ts +1 -0
  86. package/dist/core/plugin/stitchSimple.d.ts +4 -0
  87. package/dist/core/plugin/stringAlphanumeric.d.ts +42 -0
  88. package/dist/core/plugin/stringBase64.d.ts +119 -0
  89. package/dist/core/plugin/stringContentEncoding.d.ts +43 -0
  90. package/dist/core/plugin/stringContentMediaType.d.ts +47 -0
  91. package/dist/core/plugin/stringDate.d.ts +48 -0
  92. package/dist/core/plugin/stringDatetime.d.ts +108 -0
  93. package/dist/core/plugin/stringDuration.d.ts +41 -0
  94. package/dist/core/plugin/stringEmail.d.ts +81 -0
  95. package/dist/core/plugin/stringEndsWith.d.ts +42 -0
  96. package/dist/core/plugin/stringExactLength.d.ts +46 -0
  97. package/dist/core/plugin/stringHostname.d.ts +104 -0
  98. package/dist/core/plugin/stringIpv4.d.ts +85 -0
  99. package/dist/core/plugin/stringIpv6.d.ts +104 -0
  100. package/dist/core/plugin/stringIri.d.ts +117 -0
  101. package/dist/core/plugin/stringIriReference.d.ts +43 -0
  102. package/dist/core/plugin/stringJsonPointer.d.ts +107 -0
  103. package/dist/core/plugin/stringMax.d.ts +43 -0
  104. package/dist/core/plugin/stringMin.d.ts +43 -0
  105. package/dist/core/plugin/stringPattern.d.ts +40 -0
  106. package/dist/core/plugin/stringRelativeJsonPointer.d.ts +42 -0
  107. package/dist/core/plugin/stringStartsWith.d.ts +42 -0
  108. package/dist/core/plugin/stringTime.d.ts +39 -0
  109. package/dist/core/plugin/stringUriTemplate.d.ts +43 -0
  110. package/dist/core/plugin/stringUrl.d.ts +97 -0
  111. package/dist/core/plugin/testUtils.d.ts +15 -0
  112. package/dist/core/plugin/transform-type-restrictions.d.ts +61 -0
  113. package/dist/core/plugin/transform.d.ts +35 -0
  114. package/dist/core/plugin/tupleBuilder.d.ts +66 -0
  115. package/dist/core/plugin/types.d.ts +143 -0
  116. package/dist/core/plugin/unionGuard.d.ts +50 -0
  117. package/dist/core/plugin/utils/field-accessor-optimized.d.ts +50 -0
  118. package/dist/core/plugin/utils/field-accessor.d.ts +107 -0
  119. package/dist/core/plugin/uuid.d.ts +95 -0
  120. package/dist/core/plugin/validateIf.d.ts +57 -0
  121. package/dist/core/registry/plugin-registry.d.ts +116 -0
  122. package/dist/core/registry.d.ts +6 -0
  123. package/dist/core/transform/index.d.ts +1 -0
  124. package/dist/core/transform/string/defaultValue.d.ts +6 -0
  125. package/dist/core/transform/string/index.d.ts +3 -0
  126. package/dist/core/transform/string/replace.d.ts +14 -0
  127. package/dist/core/transform/string/sanitize.d.ts +6 -0
  128. package/dist/core/utils/type-guards.d.ts +68 -0
  129. package/dist/index.d.ts +72 -0
  130. package/dist/index.js +2 -0
  131. package/dist/index.js.map +7 -0
  132. package/dist/index.mjs +2 -0
  133. package/dist/index.mjs.map +7 -0
  134. package/dist/plugins/arrayContains.d.ts +37 -0
  135. package/dist/plugins/arrayContains.js +1 -0
  136. package/dist/plugins/arrayContains.mjs +1 -0
  137. package/dist/plugins/arrayIncludes.d.ts +42 -0
  138. package/dist/plugins/arrayIncludes.js +1 -0
  139. package/dist/plugins/arrayIncludes.mjs +1 -0
  140. package/dist/plugins/arrayMaxLength.d.ts +43 -0
  141. package/dist/plugins/arrayMaxLength.js +1 -0
  142. package/dist/plugins/arrayMaxLength.mjs +1 -0
  143. package/dist/plugins/arrayMinLength.d.ts +43 -0
  144. package/dist/plugins/arrayMinLength.js +1 -0
  145. package/dist/plugins/arrayMinLength.mjs +1 -0
  146. package/dist/plugins/arrayUnique.d.ts +41 -0
  147. package/dist/plugins/arrayUnique.js +1 -0
  148. package/dist/plugins/arrayUnique.mjs +1 -0
  149. package/dist/plugins/booleanFalsy.d.ts +41 -0
  150. package/dist/plugins/booleanFalsy.js +1 -0
  151. package/dist/plugins/booleanFalsy.mjs +1 -0
  152. package/dist/plugins/booleanTruthy.d.ts +38 -0
  153. package/dist/plugins/booleanTruthy.js +1 -0
  154. package/dist/plugins/booleanTruthy.mjs +1 -0
  155. package/dist/plugins/compareField.d.ts +58 -0
  156. package/dist/plugins/compareField.js +1 -0
  157. package/dist/plugins/compareField.mjs +1 -0
  158. package/dist/plugins/custom.d.ts +60 -0
  159. package/dist/plugins/custom.js +1 -0
  160. package/dist/plugins/custom.mjs +1 -0
  161. package/dist/plugins/jsonSchema.d.ts +11 -0
  162. package/dist/plugins/jsonSchema.js +1 -0
  163. package/dist/plugins/jsonSchema.mjs +1 -0
  164. package/dist/plugins/jsonSchemaFullFeature.d.ts +31 -0
  165. package/dist/plugins/jsonSchemaFullFeature.js +1 -0
  166. package/dist/plugins/jsonSchemaFullFeature.mjs +1 -0
  167. package/dist/plugins/literal.d.ts +40 -0
  168. package/dist/plugins/literal.js +1 -0
  169. package/dist/plugins/literal.mjs +1 -0
  170. package/dist/plugins/nullable.d.ts +34 -0
  171. package/dist/plugins/nullable.js +1 -0
  172. package/dist/plugins/nullable.mjs +1 -0
  173. package/dist/plugins/numberInteger.d.ts +41 -0
  174. package/dist/plugins/numberInteger.js +1 -0
  175. package/dist/plugins/numberInteger.mjs +1 -0
  176. package/dist/plugins/numberMax.d.ts +49 -0
  177. package/dist/plugins/numberMax.js +1 -0
  178. package/dist/plugins/numberMax.mjs +1 -0
  179. package/dist/plugins/numberMin.d.ts +49 -0
  180. package/dist/plugins/numberMin.js +1 -0
  181. package/dist/plugins/numberMin.mjs +1 -0
  182. package/dist/plugins/numberMultipleOf.d.ts +42 -0
  183. package/dist/plugins/numberMultipleOf.js +1 -0
  184. package/dist/plugins/numberMultipleOf.mjs +1 -0
  185. package/dist/plugins/numberNegative.d.ts +41 -0
  186. package/dist/plugins/numberNegative.js +1 -0
  187. package/dist/plugins/numberNegative.mjs +1 -0
  188. package/dist/plugins/numberPositive.d.ts +41 -0
  189. package/dist/plugins/numberPositive.js +1 -0
  190. package/dist/plugins/numberPositive.mjs +1 -0
  191. package/dist/plugins/object.d.ts +43 -0
  192. package/dist/plugins/object.js +1 -0
  193. package/dist/plugins/object.mjs +1 -0
  194. package/dist/plugins/objectAdditionalProperties.d.ts +51 -0
  195. package/dist/plugins/objectAdditionalProperties.js +1 -0
  196. package/dist/plugins/objectAdditionalProperties.mjs +1 -0
  197. package/dist/plugins/objectDependentRequired.d.ts +42 -0
  198. package/dist/plugins/objectDependentRequired.js +1 -0
  199. package/dist/plugins/objectDependentRequired.mjs +1 -0
  200. package/dist/plugins/objectDependentSchemas.d.ts +40 -0
  201. package/dist/plugins/objectDependentSchemas.js +1 -0
  202. package/dist/plugins/objectDependentSchemas.mjs +1 -0
  203. package/dist/plugins/objectMaxProperties.d.ts +42 -0
  204. package/dist/plugins/objectMaxProperties.js +1 -0
  205. package/dist/plugins/objectMaxProperties.mjs +1 -0
  206. package/dist/plugins/objectMinProperties.d.ts +42 -0
  207. package/dist/plugins/objectMinProperties.js +1 -0
  208. package/dist/plugins/objectMinProperties.mjs +1 -0
  209. package/dist/plugins/objectPatternProperties.d.ts +46 -0
  210. package/dist/plugins/objectPatternProperties.js +1 -0
  211. package/dist/plugins/objectPatternProperties.mjs +1 -0
  212. package/dist/plugins/objectPropertyNames.d.ts +36 -0
  213. package/dist/plugins/objectPropertyNames.js +1 -0
  214. package/dist/plugins/objectPropertyNames.mjs +1 -0
  215. package/dist/plugins/oneOf.d.ts +44 -0
  216. package/dist/plugins/oneOf.js +1 -0
  217. package/dist/plugins/oneOf.mjs +1 -0
  218. package/dist/plugins/optional.d.ts +35 -0
  219. package/dist/plugins/optional.js +1 -0
  220. package/dist/plugins/optional.mjs +1 -0
  221. package/dist/plugins/readOnlyWriteOnly.d.ts +48 -0
  222. package/dist/plugins/readOnlyWriteOnly.js +1 -0
  223. package/dist/plugins/readOnlyWriteOnly.mjs +1 -0
  224. package/dist/plugins/required.d.ts +45 -0
  225. package/dist/plugins/required.js +1 -0
  226. package/dist/plugins/required.mjs +1 -0
  227. package/dist/plugins/requiredIf.d.ts +66 -0
  228. package/dist/plugins/requiredIf.js +1 -0
  229. package/dist/plugins/requiredIf.mjs +1 -0
  230. package/dist/plugins/skip.d.ts +57 -0
  231. package/dist/plugins/skip.js +1 -0
  232. package/dist/plugins/skip.mjs +1 -0
  233. package/dist/plugins/stringBase64.d.ts +119 -0
  234. package/dist/plugins/stringBase64.js +1 -0
  235. package/dist/plugins/stringBase64.mjs +1 -0
  236. package/dist/plugins/stringContentEncoding.d.ts +43 -0
  237. package/dist/plugins/stringContentEncoding.js +1 -0
  238. package/dist/plugins/stringContentEncoding.mjs +1 -0
  239. package/dist/plugins/stringContentMediaType.d.ts +47 -0
  240. package/dist/plugins/stringContentMediaType.js +1 -0
  241. package/dist/plugins/stringContentMediaType.mjs +1 -0
  242. package/dist/plugins/stringDate.d.ts +48 -0
  243. package/dist/plugins/stringDate.js +1 -0
  244. package/dist/plugins/stringDate.mjs +1 -0
  245. package/dist/plugins/stringDatetime.d.ts +108 -0
  246. package/dist/plugins/stringDatetime.js +1 -0
  247. package/dist/plugins/stringDatetime.mjs +1 -0
  248. package/dist/plugins/stringDuration.d.ts +41 -0
  249. package/dist/plugins/stringDuration.js +1 -0
  250. package/dist/plugins/stringDuration.mjs +1 -0
  251. package/dist/plugins/stringEmail.d.ts +81 -0
  252. package/dist/plugins/stringEmail.js +1 -0
  253. package/dist/plugins/stringEmail.mjs +1 -0
  254. package/dist/plugins/stringHostname.d.ts +104 -0
  255. package/dist/plugins/stringHostname.js +1 -0
  256. package/dist/plugins/stringHostname.mjs +1 -0
  257. package/dist/plugins/stringIpv4.d.ts +85 -0
  258. package/dist/plugins/stringIpv4.js +1 -0
  259. package/dist/plugins/stringIpv4.mjs +1 -0
  260. package/dist/plugins/stringIpv6.d.ts +104 -0
  261. package/dist/plugins/stringIpv6.js +1 -0
  262. package/dist/plugins/stringIpv6.mjs +1 -0
  263. package/dist/plugins/stringIri.d.ts +117 -0
  264. package/dist/plugins/stringIri.js +1 -0
  265. package/dist/plugins/stringIri.mjs +1 -0
  266. package/dist/plugins/stringIriReference.d.ts +43 -0
  267. package/dist/plugins/stringIriReference.js +1 -0
  268. package/dist/plugins/stringIriReference.mjs +1 -0
  269. package/dist/plugins/stringJsonPointer.d.ts +107 -0
  270. package/dist/plugins/stringJsonPointer.js +1 -0
  271. package/dist/plugins/stringJsonPointer.mjs +1 -0
  272. package/dist/plugins/stringMax.d.ts +43 -0
  273. package/dist/plugins/stringMax.js +1 -0
  274. package/dist/plugins/stringMax.mjs +1 -0
  275. package/dist/plugins/stringMin.d.ts +43 -0
  276. package/dist/plugins/stringMin.js +1 -0
  277. package/dist/plugins/stringMin.mjs +1 -0
  278. package/dist/plugins/stringPattern.d.ts +40 -0
  279. package/dist/plugins/stringPattern.js +1 -0
  280. package/dist/plugins/stringPattern.mjs +1 -0
  281. package/dist/plugins/stringRelativeJsonPointer.d.ts +42 -0
  282. package/dist/plugins/stringRelativeJsonPointer.js +1 -0
  283. package/dist/plugins/stringRelativeJsonPointer.mjs +1 -0
  284. package/dist/plugins/stringTime.d.ts +39 -0
  285. package/dist/plugins/stringTime.js +1 -0
  286. package/dist/plugins/stringTime.mjs +1 -0
  287. package/dist/plugins/stringUriTemplate.d.ts +43 -0
  288. package/dist/plugins/stringUriTemplate.js +1 -0
  289. package/dist/plugins/stringUriTemplate.mjs +1 -0
  290. package/dist/plugins/stringUrl.d.ts +97 -0
  291. package/dist/plugins/stringUrl.js +1 -0
  292. package/dist/plugins/stringUrl.mjs +1 -0
  293. package/dist/plugins/transform.d.ts +35 -0
  294. package/dist/plugins/transform.js +1 -0
  295. package/dist/plugins/transform.mjs +1 -0
  296. package/dist/plugins/tupleBuilder.d.ts +66 -0
  297. package/dist/plugins/tupleBuilder.js +1 -0
  298. package/dist/plugins/tupleBuilder.mjs +1 -0
  299. package/dist/plugins/uuid.d.ts +95 -0
  300. package/dist/plugins/uuid.js +1 -0
  301. package/dist/plugins/uuid.mjs +1 -0
  302. package/dist/plugins/validateIf.d.ts +57 -0
  303. package/dist/plugins/validateIf.js +1 -0
  304. package/dist/plugins/validateIf.mjs +1 -0
  305. package/dist/types/array-type-analysis.d.ts +115 -0
  306. package/dist/types/index.d.ts +74 -0
  307. package/dist/types/indexed-result.d.ts +44 -0
  308. package/dist/types/result.d.ts +159 -0
  309. package/dist/types/stitch-types.d.ts +118 -0
  310. package/dist/types/util.d.ts +19 -0
  311. package/dist/types/valitator.d.ts +10 -0
  312. package/package.json +353 -0
@@ -0,0 +1 @@
1
+ var u=(r,i,o,s)=>{let a=(e=>(...t)=>{let m=e(...t);return m&&typeof m=="object"&&"check"in m?{...m,pluginName:s}:m})(o);switch(r){case"conditional":return(e,...t)=>a(e,...t);case"fieldReference":return(e,...t)=>a(e,...t);case"multiFieldReference":return a;case"transform":return e=>a(e);case"arrayElement":return(e,...t)=>a(e,...t);case"context":return e=>a(e);default:return a}};function l(r){let{name:i,methodName:o,allowedTypes:s,category:n,impl:a}=r;return{name:i,methodName:o,allowedTypes:s,category:n,create:()=>u(n,o,a,i)}}var T="string",p="stringMin",g=[T],c=l({name:"stringMin",methodName:"min",allowedTypes:g,category:"standard",impl:(r,i)=>{let o=i?.code||p,s=i?.messageFactory||(n=>`String must have at least ${n.min} characters, but got ${n.actual}`);return{check:n=>typeof n!="string"?!0:n.length>=r,code:o,getErrorMessage:(n,a)=>{let e=typeof n=="string"?n.length:0;if(typeof s=="function"){let t=s;return t.length===0?t():t.length===2?t(o,{path:a,value:n,min:r,actual:e}):t({path:a,value:n,code:o,min:r,actual:e})}return`String must have at least ${r} characters, but got ${e}`},params:[r,i]}}});export{c as stringMinPlugin};
@@ -0,0 +1,40 @@
1
+ import { ValidationOptions } from "../core/plugin/types";
2
+ /**
3
+ * @luq-plugin
4
+ * @name stringPattern
5
+ * @category standard
6
+ * @description Validates that a string matches a regular expression pattern
7
+ * @allowedTypes ["string"]
8
+ * @example
9
+ * ```typescript
10
+ * // Basic usage - validate against regex pattern
11
+ * const validator = Builder()
12
+ * .use(stringPatternPlugin)
13
+ * .for<UserData>()
14
+ * .v("phone", (b) => b.string.pattern(/^\d{3}-\d{3}-\d{4}$/))
15
+ * .v("zipCode", (b) => b.string.pattern(/^\d{5}(-\d{4})?$/))
16
+ * .build();
17
+ *
18
+ * // Common patterns
19
+ * builder.v("hexColor", b => b.string.pattern(/^#[0-9A-Fa-f]{6}$/))
20
+ * builder.v("slug", b => b.string.pattern(/^[a-z0-9-]+$/))
21
+ * ```
22
+ * @params
23
+ * - pattern: RegExp - Regular expression to match against
24
+ * - options?: { messageFactory?: (context: MessageContext) => string } - Optional configuration
25
+ * @returns Validation function that returns true if string matches the pattern
26
+ * @customError
27
+ * ```typescript
28
+ * .pattern(/^[A-Z]{2}\d{4}$/, {
29
+ * messageFactory: ({ path, value, params }) =>
30
+ * `${path} must match pattern ${params.pattern} (received: ${value})`
31
+ * })
32
+ * ```
33
+ * @since 0.1.0-alpha
34
+ */
35
+ export declare const stringPatternPlugin: import("../index").TypedPlugin<"stringPattern", "pattern", (regex: RegExp | string, options?: ValidationOptions) => {
36
+ check: (value: any) => boolean;
37
+ code: string;
38
+ getErrorMessage: (value: any, path: string) => string;
39
+ params: (string | RegExp | ValidationOptions<{}>)[];
40
+ }, readonly ["string"], "validator", "standard">;
@@ -0,0 +1 @@
1
+ "use strict";var l=Object.defineProperty;var T=Object.getOwnPropertyDescriptor;var u=Object.getOwnPropertyNames;var g=Object.prototype.hasOwnProperty;var d=(e,n)=>{for(var a in n)l(e,a,{get:n[a],enumerable:!0})},y=(e,n,a,s)=>{if(n&&typeof n=="object"||typeof n=="function")for(let r of u(n))!g.call(e,r)&&r!==a&&l(e,r,{get:()=>n[r],enumerable:!(s=T(n,r))||s.enumerable});return e};var c=e=>y(l({},"__esModule",{value:!0}),e);var h={};d(h,{stringPatternPlugin:()=>I});module.exports=c(h);var f=(e,n,a,s)=>{let o=(t=>(...i)=>{let m=t(...i);return m&&typeof m=="object"&&"check"in m?{...m,pluginName:s}:m})(a);switch(e){case"conditional":return(t,...i)=>o(t,...i);case"fieldReference":return(t,...i)=>o(t,...i);case"multiFieldReference":return o;case"transform":return t=>o(t);case"arrayElement":return(t,...i)=>o(t,...i);case"context":return t=>o(t);default:return o}};function p(e){let{name:n,methodName:a,allowedTypes:s,category:r,impl:o}=e;return{name:n,methodName:a,allowedTypes:s,category:r,create:()=>f(r,a,o,n)}}var N="stringPattern",x=["string"],I=p({name:"stringPattern",methodName:"pattern",allowedTypes:x,category:"standard",impl:(e,n)=>{let a=n?.code||N,s=n?.messageFactory||(t=>"Invalid format"),r=e.toString(),o=typeof e=="string"?new RegExp(e):e;return{check:t=>typeof t!="string"?!0:o.test(t),code:a,getErrorMessage:(t,i)=>s({path:i,value:t,code:a,pattern:r}),params:[e,n]}}});0&&(module.exports={stringPatternPlugin});
@@ -0,0 +1 @@
1
+ var p=(t,r,o,s)=>{let n=(e=>(...a)=>{let i=e(...a);return i&&typeof i=="object"&&"check"in i?{...i,pluginName:s}:i})(o);switch(t){case"conditional":return(e,...a)=>n(e,...a);case"fieldReference":return(e,...a)=>n(e,...a);case"multiFieldReference":return n;case"transform":return e=>n(e);case"arrayElement":return(e,...a)=>n(e,...a);case"context":return e=>n(e);default:return n}};function l(t){let{name:r,methodName:o,allowedTypes:s,category:m,impl:n}=t;return{name:r,methodName:o,allowedTypes:s,category:m,create:()=>p(m,o,n,r)}}var T="stringPattern",u=["string"],y=l({name:"stringPattern",methodName:"pattern",allowedTypes:u,category:"standard",impl:(t,r)=>{let o=r?.code||T,s=r?.messageFactory||(e=>"Invalid format"),m=t.toString(),n=typeof t=="string"?new RegExp(t):t;return{check:e=>typeof e!="string"?!0:n.test(e),code:o,getErrorMessage:(e,a)=>s({path:a,value:e,code:o,pattern:m}),params:[t,r]}}});export{y as stringPatternPlugin};
@@ -0,0 +1,42 @@
1
+ /**
2
+ * @luq-plugin
3
+ * @name stringRelativeJsonPointer
4
+ * @category string
5
+ * @description Validates Relative JSON Pointer format (draft-handrews-relative-json-pointer)
6
+ * @allowedTypes ["string"]
7
+ * @example
8
+ * ```typescript
9
+ * const validator = Builder()
10
+ * .use(stringRelativeJsonPointerPlugin)
11
+ * .for<{ pointer: string }>()
12
+ * .v("pointer", (b) => b.string.relativeJsonPointer())
13
+ * .build();
14
+ *
15
+ * // Valid: 0 (current location)
16
+ * // Valid: 1/foo/bar (up 1 level, then to /foo/bar)
17
+ * // Valid: 2/0 (up 2 levels, then to index 0)
18
+ * // Valid: 0# (current location's key/index)
19
+ * ```
20
+ * @params
21
+ * - options?: { messageFactory?: (context: MessageContext) => string } - Optional custom error message factory
22
+ * @returns Validation function that checks Relative JSON Pointer format
23
+ * @customError
24
+ * ```typescript
25
+ * .relativeJsonPointer({
26
+ * messageFactory: ({ path, value }) =>
27
+ * `${path} must be valid Relative JSON Pointer format, received: ${value}`
28
+ * })
29
+ * ```
30
+ * @since 0.1.0-alpha
31
+ */
32
+ import type { MessageContext } from "../core/plugin/types";
33
+ export declare const stringRelativeJsonPointerPlugin: import("../index").TypedPlugin<"stringRelativeJsonPointer", "relativeJsonPointer", (options?: {
34
+ messageFactory?: (context: MessageContext) => string;
35
+ }) => {
36
+ check: (value: string) => boolean;
37
+ code: string;
38
+ getErrorMessage: (value: string, path: string) => string;
39
+ params: {
40
+ messageFactory?: (context: MessageContext) => string;
41
+ }[];
42
+ }, readonly ["string"], "validator", "standard">;
@@ -0,0 +1 @@
1
+ "use strict";var l=Object.defineProperty;var u=Object.getOwnPropertyDescriptor;var p=Object.getOwnPropertyNames;var g=Object.prototype.hasOwnProperty;var d=(t,e)=>{for(var a in e)l(t,a,{get:e[a],enumerable:!0})},y=(t,e,a,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of p(e))!g.call(t,r)&&r!==a&&l(t,r,{get:()=>e[r],enumerable:!(n=u(e,r))||n.enumerable});return t};var c=t=>y(l({},"__esModule",{value:!0}),t);var P={};d(P,{stringRelativeJsonPointerPlugin:()=>x});module.exports=c(P);var f=(t,e,a,n)=>{let s=(o=>(...i)=>{let m=o(...i);return m&&typeof m=="object"&&"check"in m?{...m,pluginName:n}:m})(a);switch(t){case"conditional":return(o,...i)=>s(o,...i);case"fieldReference":return(o,...i)=>s(o,...i);case"multiFieldReference":return s;case"transform":return o=>s(o);case"arrayElement":return(o,...i)=>s(o,...i);case"context":return o=>s(o);default:return s}};function T(t){let{name:e,methodName:a,allowedTypes:n,category:r,impl:s}=t;return{name:e,methodName:a,allowedTypes:n,category:r,create:()=>f(r,a,s,e)}}function N(t){let e=t.match(/^(\d+)(.*)$/);if(!e)return!1;let[,a,n]=e;return a.length>1&&a[0]==="0"?!1:n===""||n==="#"?!0:n.startsWith("/")?/^(\/([^~]|(~[01]))*)*$/.test(n):!1}var x=T({name:"stringRelativeJsonPointer",methodName:"relativeJsonPointer",allowedTypes:["string"],category:"standard",impl:t=>{let e=()=>"must be a valid Relative JSON Pointer",a=t?.messageFactory||(n=>`${n.path} ${e()}`);return{check:n=>typeof n!="string"?!1:N(n),code:"FORMAT_RELATIVE_JSON_POINTER",getErrorMessage:(n,r)=>a({path:r,value:n,code:"FORMAT_RELATIVE_JSON_POINTER"}),params:[t]}}});0&&(module.exports={stringRelativeJsonPointerPlugin});
@@ -0,0 +1 @@
1
+ var T=(r,o,t,e)=>{let a=(n=>(...s)=>{let m=n(...s);return m&&typeof m=="object"&&"check"in m?{...m,pluginName:e}:m})(t);switch(r){case"conditional":return(n,...s)=>a(n,...s);case"fieldReference":return(n,...s)=>a(n,...s);case"multiFieldReference":return a;case"transform":return n=>a(n);case"arrayElement":return(n,...s)=>a(n,...s);case"context":return n=>a(n);default:return a}};function l(r){let{name:o,methodName:t,allowedTypes:e,category:i,impl:a}=r;return{name:o,methodName:t,allowedTypes:e,category:i,create:()=>T(i,t,a,o)}}function u(r){let o=r.match(/^(\d+)(.*)$/);if(!o)return!1;let[,t,e]=o;return t.length>1&&t[0]==="0"?!1:e===""||e==="#"?!0:e.startsWith("/")?/^(\/([^~]|(~[01]))*)*$/.test(e):!1}var d=l({name:"stringRelativeJsonPointer",methodName:"relativeJsonPointer",allowedTypes:["string"],category:"standard",impl:r=>{let o=()=>"must be a valid Relative JSON Pointer",t=r?.messageFactory||(e=>`${e.path} ${o()}`);return{check:e=>typeof e!="string"?!1:u(e),code:"FORMAT_RELATIVE_JSON_POINTER",getErrorMessage:(e,i)=>t({path:i,value:e,code:"FORMAT_RELATIVE_JSON_POINTER"}),params:[r]}}});export{d as stringRelativeJsonPointerPlugin};
@@ -0,0 +1,39 @@
1
+ /**
2
+ * @luq-plugin
3
+ * @name stringTime
4
+ * @category string
5
+ * @description Validates time format (HH:MM:SS or HH:MM:SS.mmm)
6
+ * @allowedTypes ["string"]
7
+ * @example
8
+ * ```typescript
9
+ * const validator = Builder()
10
+ * .use(stringTimePlugin)
11
+ * .for<{ startTime: string }>()
12
+ * .v("startTime", (b) => b.string.time())
13
+ * .build();
14
+ * ```
15
+ * @params
16
+ * - options?: { messageFactory?: (context: MessageContext) => string; allowMilliseconds?: boolean } - Optional configuration
17
+ * @returns Validation function that checks time format
18
+ * @customError
19
+ * ```typescript
20
+ * .time({
21
+ * messageFactory: ({ path, value }) =>
22
+ * `${path} must be a valid time format, received: ${value}`
23
+ * })
24
+ * ```
25
+ * @since 0.1.0-alpha
26
+ */
27
+ import type { MessageContext } from "../core/plugin/types";
28
+ export declare const stringTimePlugin: import("../index").TypedPlugin<"stringTime", "time", (options?: {
29
+ messageFactory?: (context: MessageContext) => string;
30
+ allowMilliseconds?: boolean;
31
+ }) => {
32
+ check: (value: string) => boolean;
33
+ code: string;
34
+ getErrorMessage: (value: string, path: string) => string;
35
+ params: {
36
+ messageFactory?: (context: MessageContext) => string;
37
+ allowMilliseconds?: boolean;
38
+ }[];
39
+ }, readonly ["string"], "validator", "standard">;
@@ -0,0 +1 @@
1
+ "use strict";var l=Object.defineProperty;var p=Object.getOwnPropertyDescriptor;var u=Object.getOwnPropertyNames;var g=Object.prototype.hasOwnProperty;var d=(e,n)=>{for(var r in n)l(e,r,{get:n[r],enumerable:!0})},y=(e,n,r,t)=>{if(n&&typeof n=="object"||typeof n=="function")for(let a of u(n))!g.call(e,a)&&a!==r&&l(e,a,{get:()=>n[a],enumerable:!(t=p(n,a))||t.enumerable});return e};var c=e=>y(l({},"__esModule",{value:!0}),e);var h={};d(h,{stringTimePlugin:()=>I});module.exports=c(h);var f=(e,n,r,t)=>{let s=(o=>(...i)=>{let m=o(...i);return m&&typeof m=="object"&&"check"in m?{...m,pluginName:t}:m})(r);switch(e){case"conditional":return(o,...i)=>s(o,...i);case"fieldReference":return(o,...i)=>s(o,...i);case"multiFieldReference":return s;case"transform":return o=>s(o);case"arrayElement":return(o,...i)=>s(o,...i);case"context":return o=>s(o);default:return s}};function T(e){let{name:n,methodName:r,allowedTypes:t,category:a,impl:s}=e;return{name:n,methodName:r,allowedTypes:t,category:a,create:()=>f(a,r,s,n)}}var N=/^([01][0-9]|2[0-3]):([0-5][0-9]):([0-5][0-9])(\.[0-9]{1,3})?$/,x=/^([01][0-9]|2[0-3]):([0-5][0-9]):([0-5][0-9])$/,I=T({name:"stringTime",methodName:"time",allowedTypes:["string"],category:"standard",impl:e=>{let n=()=>"must be a valid time format (HH:MM:SS)",r=e?.messageFactory||(t=>`${t.path} ${n()}`);return{check:t=>typeof t!="string"?!1:(e?.allowMilliseconds===!1?x:N).test(t),code:"FORMAT_TIME",getErrorMessage:(t,a)=>r({path:a,value:t,code:"FORMAT_TIME"}),params:[e]}}});0&&(module.exports={stringTimePlugin});
@@ -0,0 +1 @@
1
+ var T=(a,i,o,n)=>{let t=(e=>(...r)=>{let m=e(...r);return m&&typeof m=="object"&&"check"in m?{...m,pluginName:n}:m})(o);switch(a){case"conditional":return(e,...r)=>t(e,...r);case"fieldReference":return(e,...r)=>t(e,...r);case"multiFieldReference":return t;case"transform":return e=>t(e);case"arrayElement":return(e,...r)=>t(e,...r);case"context":return e=>t(e);default:return t}};function l(a){let{name:i,methodName:o,allowedTypes:n,category:s,impl:t}=a;return{name:i,methodName:o,allowedTypes:n,category:s,create:()=>T(s,o,t,i)}}var p=/^([01][0-9]|2[0-3]):([0-5][0-9]):([0-5][0-9])(\.[0-9]{1,3})?$/,u=/^([01][0-9]|2[0-3]):([0-5][0-9]):([0-5][0-9])$/,y=l({name:"stringTime",methodName:"time",allowedTypes:["string"],category:"standard",impl:a=>{let i=()=>"must be a valid time format (HH:MM:SS)",o=a?.messageFactory||(n=>`${n.path} ${i()}`);return{check:n=>typeof n!="string"?!1:(a?.allowMilliseconds===!1?u:p).test(n),code:"FORMAT_TIME",getErrorMessage:(n,s)=>o({path:s,value:n,code:"FORMAT_TIME"}),params:[a]}}});export{y as stringTimePlugin};
@@ -0,0 +1,43 @@
1
+ /**
2
+ * @luq-plugin
3
+ * @name stringUriTemplate
4
+ * @category string
5
+ * @description Validates URI Template format (RFC 6570)
6
+ * @allowedTypes ["string"]
7
+ * @example
8
+ * ```typescript
9
+ * const validator = Builder()
10
+ * .use(stringUriTemplatePlugin)
11
+ * .for<{ template: string }>()
12
+ * .v("template", (b) => b.string.uriTemplate())
13
+ * .build();
14
+ *
15
+ * // Valid: https://api.example.com/users/{id}
16
+ * // Valid: /search{?q,lang}
17
+ * // Valid: /path{/segments*}
18
+ * // Valid: {+path}/here
19
+ * // Valid: {#section}
20
+ * ```
21
+ * @params
22
+ * - options?: { messageFactory?: (context: MessageContext) => string } - Optional custom error message factory
23
+ * @returns Validation function that checks URI Template format
24
+ * @customError
25
+ * ```typescript
26
+ * .uriTemplate({
27
+ * messageFactory: ({ path, value }) =>
28
+ * `${path} must be a valid URI Template, received: ${value}`
29
+ * })
30
+ * ```
31
+ * @since 0.1.0-alpha
32
+ */
33
+ import type { MessageContext } from "../core/plugin/types";
34
+ export declare const stringUriTemplatePlugin: import("../index").TypedPlugin<"stringUriTemplate", "uriTemplate", (options?: {
35
+ messageFactory?: (context: MessageContext) => string;
36
+ }) => {
37
+ check: (value: string) => boolean;
38
+ code: string;
39
+ getErrorMessage: (value: string, path: string) => string;
40
+ params: {
41
+ messageFactory?: (context: MessageContext) => string;
42
+ }[];
43
+ }, readonly ["string"], "validator", "standard">;
@@ -0,0 +1 @@
1
+ "use strict";var m=Object.defineProperty;var p=Object.getOwnPropertyDescriptor;var u=Object.getOwnPropertyNames;var g=Object.prototype.hasOwnProperty;var d=(n,t)=>{for(var e in t)m(n,e,{get:t[e],enumerable:!0})},f=(n,t,e,a)=>{if(t&&typeof t=="object"||typeof t=="function")for(let s of u(t))!g.call(n,s)&&s!==e&&m(n,s,{get:()=>t[s],enumerable:!(a=p(t,s))||a.enumerable});return n};var y=n=>f(m({},"__esModule",{value:!0}),n);var x={};d(x,{stringUriTemplatePlugin:()=>N});module.exports=y(x);var c=(n,t,e,a)=>{let i=(r=>(...o)=>{let l=r(...o);return l&&typeof l=="object"&&"check"in l?{...l,pluginName:a}:l})(e);switch(n){case"conditional":return(r,...o)=>i(r,...o);case"fieldReference":return(r,...o)=>i(r,...o);case"multiFieldReference":return i;case"transform":return r=>i(r);case"arrayElement":return(r,...o)=>i(r,...o);case"context":return r=>i(r);default:return i}};function T(n){let{name:t,methodName:e,allowedTypes:a,category:s,impl:i}=n;return{name:t,methodName:e,allowedTypes:a,category:s,create:()=>c(s,e,i,t)}}function h(n){let t=!1,e=0;for(;e<n.length;){let a=n[e];if(a==="{"){if(t)return!1;if(t=!0,e++,e<n.length){let r=n[e];"+#/;?&=,!@|".includes(r)&&e++}let s=!1,i=e;for(;e<n.length&&n[e]!=="}";){let r=n[e];if(/[a-zA-Z0-9_%]/.test(r))s=!0;else if(r==="."){if(e===i)return!1}else if(r===":"){e++;let o=0;for(;e<n.length&&/\d/.test(n[e])&&o<4;)e++,o++;if(o===0)return!1;continue}else if(r==="*"){if(e++,e<n.length&&n[e]!=="}"&&n[e]!==",")return!1;continue}else if(r===","){if(!s)return!1;s=!1,i=e+1}else return!1;e++}if(e>=n.length||!s)return!1;if(n[e]==="}")t=!1;else return!1}else if(a==="}"){if(!t)return!1;t=!1}else if(a==="{"||a==="}")return!1;e++}return!t}var N=T({name:"stringUriTemplate",methodName:"uriTemplate",allowedTypes:["string"],category:"standard",impl:n=>{let t=()=>"must be a valid URI Template (RFC 6570)",e=n?.messageFactory||(a=>`${a.path} ${t()}`);return{check:a=>typeof a!="string"?!1:h(a),code:"FORMAT_URI_TEMPLATE",getErrorMessage:(a,s)=>e({path:s,value:a,code:"FORMAT_URI_TEMPLATE"}),params:[n]}}});0&&(module.exports={stringUriTemplatePlugin});
@@ -0,0 +1 @@
1
+ var T=(n,a,e,r)=>{let s=(t=>(...i)=>{let l=t(...i);return l&&typeof l=="object"&&"check"in l?{...l,pluginName:r}:l})(e);switch(n){case"conditional":return(t,...i)=>s(t,...i);case"fieldReference":return(t,...i)=>s(t,...i);case"multiFieldReference":return s;case"transform":return t=>s(t);case"arrayElement":return(t,...i)=>s(t,...i);case"context":return t=>s(t);default:return s}};function m(n){let{name:a,methodName:e,allowedTypes:r,category:o,impl:s}=n;return{name:a,methodName:e,allowedTypes:r,category:o,create:()=>T(o,e,s,a)}}function p(n){let a=!1,e=0;for(;e<n.length;){let r=n[e];if(r==="{"){if(a)return!1;if(a=!0,e++,e<n.length){let t=n[e];"+#/;?&=,!@|".includes(t)&&e++}let o=!1,s=e;for(;e<n.length&&n[e]!=="}";){let t=n[e];if(/[a-zA-Z0-9_%]/.test(t))o=!0;else if(t==="."){if(e===s)return!1}else if(t===":"){e++;let i=0;for(;e<n.length&&/\d/.test(n[e])&&i<4;)e++,i++;if(i===0)return!1;continue}else if(t==="*"){if(e++,e<n.length&&n[e]!=="}"&&n[e]!==",")return!1;continue}else if(t===","){if(!o)return!1;o=!1,s=e+1}else return!1;e++}if(e>=n.length||!o)return!1;if(n[e]==="}")a=!1;else return!1}else if(r==="}"){if(!a)return!1;a=!1}else if(r==="{"||r==="}")return!1;e++}return!a}var d=m({name:"stringUriTemplate",methodName:"uriTemplate",allowedTypes:["string"],category:"standard",impl:n=>{let a=()=>"must be a valid URI Template (RFC 6570)",e=n?.messageFactory||(r=>`${r.path} ${a()}`);return{check:r=>typeof r!="string"?!1:p(r),code:"FORMAT_URI_TEMPLATE",getErrorMessage:(r,o)=>e({path:o,value:r,code:"FORMAT_URI_TEMPLATE"}),params:[n]}}});export{d as stringUriTemplatePlugin};
@@ -0,0 +1,97 @@
1
+ import { ValidationOptions } from "../core/plugin/types";
2
+ /**
3
+ * @luq-plugin
4
+ * @name stringUrl
5
+ * @category standard
6
+ * @description Validates that a string is a valid URL format
7
+ * @allowedTypes ["string"]
8
+ * @see https://developer.mozilla.org/en-US/docs/Web/API/URL - MDN URL API Reference
9
+ * @see https://tools.ietf.org/html/rfc3986 - RFC 3986: Uniform Resource Identifier (URI) Generic Syntax
10
+ * @example
11
+ * ```typescript
12
+ * // Basic usage - validates all URL formats (RFC 3986 compliant)
13
+ * const validator = Builder()
14
+ * .use(stringUrlPlugin)
15
+ * .for<UserProfile>()
16
+ * .v("website", (b) => b.string.url())
17
+ * .v("profileUrl", (b) => b.string.required().url())
18
+ * .build();
19
+ *
20
+ * // Custom protocols (e.g., allow ftp://)
21
+ * builder.v("ftpServer", b => b.string.url({
22
+ * protocols: ['ftp:', 'ftps:']
23
+ * }))
24
+ *
25
+ * // Allow URLs without protocol (assumes https://)
26
+ * builder.v("domain", b => b.string.url({
27
+ * allowWithoutProtocol: true
28
+ * }))
29
+ *
30
+ * // ✅ VALID URL formats (RFC 3986)
31
+ * validator.parse({ website: "https://example.com" }); // Standard HTTPS
32
+ * validator.parse({ website: "http://www.test.co.uk/path?q=value#frag" }); // Full URL with query and fragment
33
+ * validator.parse({ website: "ftp://files.domain.com/file.txt" }); // FTP protocol
34
+ * validator.parse({ website: "ws://localhost:3000" }); // WebSocket protocol
35
+ * validator.parse({ website: "https://subdomain.example.com:8080/api" }); // With port and path
36
+ * validator.parse({ website: "https://127.0.0.1:3000" }); // IP address
37
+ * validator.parse({ website: "https://[::1]:8080" }); // IPv6 address
38
+ * validator.parse({ website: "mailto:user@example.com" }); // mailto protocol
39
+ * validator.parse({ website: "tel:+1-555-123-4567" }); // tel protocol
40
+ * validator.parse({ website: "https://user:pass@example.com" }); // With credentials
41
+ *
42
+ * // With allowWithoutProtocol: true
43
+ * const flexValidator = builder.v("site", b => b.string.url({ allowWithoutProtocol: true }));
44
+ * flexValidator.parse({ site: "example.com" }); // Assumes https://
45
+ * flexValidator.parse({ site: "www.domain.co.uk/path" }); // Assumes https://
46
+ *
47
+ * // ❌ INVALID URL formats
48
+ * validator.parse({ website: "not-a-url" }); // Plain text
49
+ * validator.parse({ website: "http://" }); // Missing host
50
+ * validator.parse({ website: "://missing-protocol" }); // Missing protocol
51
+ * validator.parse({ website: "https://" }); // Missing host after protocol
52
+ * validator.parse({ website: "http://.com" }); // Invalid host
53
+ * validator.parse({ website: "https://example." }); // Incomplete domain
54
+ * validator.parse({ website: "just text with spaces" }); // Contains spaces
55
+ * validator.parse({ website: "ftp://[invalid-ipv6]" }); // Invalid IPv6
56
+ * validator.parse({ website: "https://exam ple.com" }); // Space in domain
57
+ * validator.parse({ website: "" }); // Empty string
58
+ * ```
59
+ * @params
60
+ * - options?: StringUrlOptions - URL validation configuration
61
+ * - protocols?: string[] - Allowed protocols (default: all protocols allowed)
62
+ * - allowWithoutProtocol?: boolean - Allow URLs without protocol (default: false)
63
+ * - messageFactory?: (context: MessageContext) => string - Custom error message factory
64
+ * @returns Validation function that returns true if string is a valid URL
65
+ * @customError
66
+ * ```typescript
67
+ * .url({
68
+ * messageFactory: ({ path, value }) =>
69
+ * `${path} must be a valid URL (received: ${value})`
70
+ * })
71
+ *
72
+ * // Restrict to specific protocols
73
+ * .url({
74
+ * protocols: ['https:'],
75
+ * messageFactory: ({ path }) => `${path} must be a secure HTTPS URL`
76
+ * })
77
+ * ```
78
+ * @since 0.1.0-alpha
79
+ */
80
+ export interface StringUrlOptions extends ValidationOptions {
81
+ /**
82
+ * Array of allowed protocols. Default: null (allow all protocols)
83
+ * @example ['http:', 'https:', 'ftp:', 'ws:', 'wss:']
84
+ */
85
+ protocols?: string[];
86
+ /**
87
+ * Whether to allow URLs without protocol (will default to https://)
88
+ * @default false
89
+ */
90
+ allowWithoutProtocol?: boolean;
91
+ }
92
+ export declare const stringUrlPlugin: import("../index").TypedPlugin<"stringUrl", "url", (options?: StringUrlOptions) => {
93
+ check: (value: any) => boolean;
94
+ code: string;
95
+ getErrorMessage: (value: any, path: string) => string;
96
+ params: StringUrlOptions[];
97
+ }, readonly ["string"], "validator", "standard">;
@@ -0,0 +1 @@
1
+ "use strict";var m=Object.defineProperty;var T=Object.getOwnPropertyDescriptor;var p=Object.getOwnPropertyNames;var d=Object.prototype.hasOwnProperty;var g=(e,t)=>{for(var r in t)m(e,r,{get:t[r],enumerable:!0})},c=(e,t,r,s)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of p(t))!d.call(e,o)&&o!==r&&m(e,o,{get:()=>t[o],enumerable:!(s=T(t,o))||s.enumerable});return e};var y=e=>c(m({},"__esModule",{value:!0}),e);var P={};g(P,{stringUrlPlugin:()=>h});module.exports=y(P);var f=(e,t,r,s)=>{let n=(a=>(...i)=>{let l=a(...i);return l&&typeof l=="object"&&"check"in l?{...l,pluginName:s}:l})(r);switch(e){case"conditional":return(a,...i)=>n(a,...i);case"fieldReference":return(a,...i)=>n(a,...i);case"multiFieldReference":return n;case"transform":return a=>n(a);case"arrayElement":return(a,...i)=>n(a,...i);case"context":return a=>n(a);default:return n}};function u(e){let{name:t,methodName:r,allowedTypes:s,category:o,impl:n}=e;return{name:t,methodName:r,allowedTypes:s,category:o,create:()=>f(o,r,n,t)}}var N="stringUrl",x=["string"],h=u({name:"stringUrl",methodName:"url",allowedTypes:x,category:"standard",impl:e=>{let t=e?.code||N,r=e?.protocols||null,s=e?.allowWithoutProtocol||!1,o=e?.messageFactory||(n=>"Invalid URL format");return{check:n=>{if(typeof n!="string")return!0;try{let a=n;s&&!n.includes("://")&&(a=`https://${n}`);let i=new URL(a);return!(r&&!r.includes(i.protocol))}catch{return!1}},code:t,getErrorMessage:(n,a)=>o({path:a,value:n,code:t}),params:e?[e]:[]}}});0&&(module.exports={stringUrlPlugin});
@@ -0,0 +1 @@
1
+ var u=(t,o,r,i)=>{let e=(n=>(...a)=>{let l=n(...a);return l&&typeof l=="object"&&"check"in l?{...l,pluginName:i}:l})(r);switch(t){case"conditional":return(n,...a)=>e(n,...a);case"fieldReference":return(n,...a)=>e(n,...a);case"multiFieldReference":return e;case"transform":return n=>e(n);case"arrayElement":return(n,...a)=>e(n,...a);case"context":return n=>e(n);default:return e}};function m(t){let{name:o,methodName:r,allowedTypes:i,category:s,impl:e}=t;return{name:o,methodName:r,allowedTypes:i,category:s,create:()=>u(s,r,e,o)}}var T="stringUrl",p=["string"],c=m({name:"stringUrl",methodName:"url",allowedTypes:p,category:"standard",impl:t=>{let o=t?.code||T,r=t?.protocols||null,i=t?.allowWithoutProtocol||!1,s=t?.messageFactory||(e=>"Invalid URL format");return{check:e=>{if(typeof e!="string")return!0;try{let n=e;i&&!e.includes("://")&&(n=`https://${e}`);let a=new URL(n);return!(r&&!r.includes(a.protocol))}catch{return!1}},code:o,getErrorMessage:(e,n)=>s({path:n,value:e,code:o}),params:t?[t]:[]}}});export{c as stringUrlPlugin};
@@ -0,0 +1,35 @@
1
+ /**
2
+ * @luq-plugin
3
+ * @name transform
4
+ * @category transform
5
+ * @description Transforms values after successful validation (type conversion, normalization, computed values)
6
+ * @allowedTypes ["string", "number", "boolean", "array", "object", "date", "union"]
7
+ * @example
8
+ * ```typescript
9
+ * // String transformation (lowercase)
10
+ * const validator = Builder()
11
+ * .use(transformPlugin)
12
+ * .for<UserData>()
13
+ * .v("email", (b) =>
14
+ * b.string.required().email().transform(v => v.toLowerCase())
15
+ * )
16
+ * .build();
17
+ *
18
+ * // Number to string conversion
19
+ * builder.v("age", b =>
20
+ * b.number.required().min(0).transform(v => String(v))
21
+ * )
22
+ *
23
+ * // Array element transformation
24
+ * builder.v("tags", b =>
25
+ * b.array.transform(tags => tags.map(t => t.trim().toLowerCase()))
26
+ * )
27
+ * ```
28
+ * @params
29
+ * - transformFn: (value: T) => U - Transform function that takes input value and returns transformed value
30
+ * @returns Validation function with transformation
31
+ * @customError
32
+ * Transform plugin does not generate errors. Errors in transform function are treated as exceptions.
33
+ * @since 0.1.0-alpha
34
+ */
35
+ export declare const transformPlugin: import("../index").TypedPlugin<"transform", "transform", import("../builder/plugins/plugin-interfaces").TransformPluginImplementation<any, any>, readonly ["string", "number", "boolean", "array", "object", "date", "union"], "validator", "transform">;
@@ -0,0 +1 @@
1
+ "use strict";var l=Object.defineProperty;var p=Object.getOwnPropertyDescriptor;var T=Object.getOwnPropertyNames;var d=Object.prototype.hasOwnProperty;var g=(n,e)=>{for(var t in e)l(n,t,{get:e[t],enumerable:!0})},y=(n,e,t,i)=>{if(e&&typeof e=="object"||typeof e=="function")for(let a of T(e))!d.call(n,a)&&a!==t&&l(n,a,{get:()=>e[a],enumerable:!(i=p(e,a))||i.enumerable});return n};var c=n=>y(l({},"__esModule",{value:!0}),n);var x={};g(x,{transformPlugin:()=>h});module.exports=c(x);var f=(n,e,t,i)=>{let o=(r=>(...m)=>{let s=r(...m);return s&&typeof s=="object"&&"check"in s?{...s,pluginName:i}:s})(t);switch(n){case"conditional":return(r,...m)=>o(r,...m);case"fieldReference":return(r,...m)=>o(r,...m);case"multiFieldReference":return o;case"transform":return r=>o(r);case"arrayElement":return(r,...m)=>o(r,...m);case"context":return r=>o(r);default:return o}};function u(n){let{name:e,methodName:t,allowedTypes:i,category:a,impl:o}=n;return{name:e,methodName:t,allowedTypes:i,category:a,create:()=>f(a,t,o,e)}}var N=["string","number","boolean","array","object","date","union"],h=u({name:"transform",methodName:"transform",allowedTypes:N,category:"transform",impl:(n,e)=>{let t=e?.code||"transform";return{check:a=>!0,code:t,getErrorMessage:(a,o)=>"Transform operation failed",params:[n,e],__isTransform:!0,__transformFn:n}}});0&&(module.exports={transformPlugin});
@@ -0,0 +1 @@
1
+ var u=(a,r,o,s)=>{let n=(e=>(...t)=>{let m=e(...t);return m&&typeof m=="object"&&"check"in m?{...m,pluginName:s}:m})(o);switch(a){case"conditional":return(e,...t)=>n(e,...t);case"fieldReference":return(e,...t)=>n(e,...t);case"multiFieldReference":return n;case"transform":return e=>n(e);case"arrayElement":return(e,...t)=>n(e,...t);case"context":return e=>n(e);default:return n}};function l(a){let{name:r,methodName:o,allowedTypes:s,category:i,impl:n}=a;return{name:r,methodName:o,allowedTypes:s,category:i,create:()=>u(i,o,n,r)}}var p=["string","number","boolean","array","object","date","union"],g=l({name:"transform",methodName:"transform",allowedTypes:p,category:"transform",impl:(a,r)=>{let o=r?.code||"transform";return{check:i=>!0,code:o,getErrorMessage:(i,n)=>"Transform operation failed",params:[a,r],__isTransform:!0,__transformFn:a}}});export{g as transformPlugin};
@@ -0,0 +1,66 @@
1
+ /**
2
+ * @luq-plugin
3
+ * @name tupleBuilder
4
+ * @category composable-directly
5
+ * @description Validates tuple types (fixed-length arrays with different types for each element)
6
+ * @allowedTypes ["tuple"]
7
+ * @example
8
+ * ```typescript
9
+ * // Fixed-length tuple - no options needed
10
+ * type Coordinates = [number, number];
11
+ *
12
+ * const validator = Builder()
13
+ * .use(tupleBuilderPlugin)
14
+ * .for<{ location: Coordinates }>()
15
+ * .v("location", (b) => b.tuple
16
+ * .required()
17
+ * .builder(
18
+ * (a) => a.number.required().min(0),
19
+ * (b) => b.number.required().min(0)
20
+ * )
21
+ * )
22
+ * .build();
23
+ *
24
+ * // Variable-length tuple with rest elements
25
+ * type UserData = [string, number, boolean, ...string[]];
26
+ *
27
+ * const userValidator = Builder()
28
+ * .use(tupleBuilderPlugin)
29
+ * .for<{ data: UserData }>()
30
+ * .v("data", (b) => b.tuple
31
+ * .required()
32
+ * .builder(
33
+ * (a) => a.string.required().min(3), // name
34
+ * (b) => b.number.required().min(0), // age
35
+ * (c) => c.boolean.required(), // isActive
36
+ * { rest: (r) => r.string.optional() } // rest elements
37
+ * )
38
+ * )
39
+ * .build();
40
+ * ```
41
+ * @params
42
+ * - ...builderFns: Array<(context: FieldBuilderContext) => any> - Builder functions for each tuple element
43
+ * - options?: { rest?: (context: FieldBuilderContext) => any } - Optional configuration (automatically defaults to {} when omitted)
44
+ * @returns Composable validation function
45
+ * @customError
46
+ * - Returns false if value is not an array
47
+ * - Returns false if array length doesn't match tuple definition (without rest)
48
+ * - Returns false if any element validation fails
49
+ * @since 0.1.0-alpha
50
+ */
51
+ import type { FieldBuilderContext } from "../core/builder/plugins/plugin-types";
52
+ export interface TupleBuilderFunction<TObject extends object, TPlugins> {
53
+ (context: FieldBuilderContext<TObject, TPlugins, any>): any;
54
+ }
55
+ export interface RestBuilderFunction<TObject extends object, TPlugins> {
56
+ (context: FieldBuilderContext<TObject, TPlugins, any>): any;
57
+ }
58
+ export interface TupleBuilderOptions<TObject extends object, TPlugins> {
59
+ rest?: RestBuilderFunction<TObject, TPlugins>;
60
+ messageFactory?: {
61
+ notArray?: (value: unknown) => string;
62
+ lengthMismatch?: (expected: number, actual: number) => string;
63
+ tooShort?: (minimum: number, actual: number) => string;
64
+ };
65
+ }
66
+ export declare const tupleBuilderPlugin: import("../builder/plugins/composable-directly-plugin").ComposableDirectlyPlugin<"tupleBuilder", "builder", readonly ["tuple"]>;
@@ -0,0 +1 @@
1
+ "use strict";var j=Object.defineProperty;var W=Object.getOwnPropertyDescriptor;var U=Object.getOwnPropertyNames;var I=Object.prototype.hasOwnProperty;var z=(n,e)=>{for(var o in e)j(n,o,{get:e[o],enumerable:!0})},H=(n,e,o,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let t of U(e))!I.call(n,t)&&t!==o&&j(n,t,{get:()=>e[t],enumerable:!(r=W(e,t))||r.enumerable});return n};var G=n=>H(j({},"__esModule",{value:!0}),n);var Z={};z(Z,{tupleBuilderPlugin:()=>X});module.exports=G(Z);var V=Object.freeze({valid:!0}),x=Object.freeze({valid:!1});function O(n,e=[],o){return{_validators:n,_transforms:e,validate:o||(r=>{for(let t=0;t<e.length;t++)if(!n[t].check(r,r))return x;return V})}}function P(n,e,o){return{check:e,name:n,inputType:o?.inputType,outputType:o?.outputType,metadata:o?{severity:o.severity||"error",async:o.async||!1}:void 0}}function R(n,e,o,r){return{name:n,methodName:e,allowedTypes:o,category:"composable",createComposer(t,a){let i=[],d={add(s){return i.push(s),d},build(){return r(i,t,a)}},y=d;return y[e]=function(...s){return y.add(s)},y}}}function E(n,e,o,r){let t=e.methodName,a=null,i=null;n[t]=function(...d){if(a||(a=e.createComposer(o,r)),a.add(d),n[t]=a[t],a){i=a.build();let y=n._executionPlan;if(!(y&&i&&typeof i.validate=="function")){if(i&&i._validators)for(let s of i._validators)y.addValidator(s.name,(l,g)=>{let f=s.check(l,l);return{valid:f,message:f?void 0:`Validation failed for ${s.name}`}})}}return n}}function L(n,e,o,r){return{...R(n,e,o,r),category:"composable-directly"}}function Y(n){switch(n){case"string":return{check:e=>e==null?!0:typeof e=="string",name:"stringType",messageFactory:()=>"Expected string",inputType:"string",outputType:"string",metadata:{severity:"error",async:!1}};case"number":return{check:e=>e==null?!0:typeof e=="number"&&!isNaN(e),name:"numberType",messageFactory:()=>"Expected number",inputType:"number",outputType:"number",metadata:{severity:"error",async:!1}};case"boolean":return{check:e=>e==null?!0:typeof e=="boolean",name:"booleanType",messageFactory:()=>"Expected boolean",inputType:"boolean",outputType:"boolean",metadata:{severity:"error",async:!1}};case"array":return{check:e=>e==null?!0:Array.isArray(e),name:"arrayType",messageFactory:()=>"Expected array",inputType:"array",outputType:"array",metadata:{severity:"error",async:!1}};case"object":return{check:e=>e==null?!0:typeof e=="object"&&e!==null&&!Array.isArray(e),name:"objectType",messageFactory:()=>"Expected object",inputType:"object",outputType:"object",metadata:{severity:"error",async:!1}};case"date":return{check:e=>e==null?!0:e instanceof Date,name:"dateType",messageFactory:()=>"Expected Date",inputType:"date",outputType:"date",metadata:{severity:"error",async:!1}};case"null":return{check:e=>e===null,name:"nullType",messageFactory:()=>"Expected null",inputType:"null",outputType:"null",metadata:{severity:"error",async:!1}};case"any":return{check:()=>!0,name:"anyType",messageFactory:()=>"",inputType:"any",outputType:"any",metadata:{severity:"error",async:!1}};default:return null}}function m(n,e,o,r){let t=r?.validators?[...r.validators]:[];if(!r&&n!=="union"){let d=Y(n);d&&t.push(d)}let a=r?.transforms?[...r.transforms]:[],i={_type:n,_fieldPath:e,_validators:t,_transforms:a,build(){return n==="union"&&t.length===0&&t.push({check:()=>!1,name:"unionGuard",messageFactory:()=>"No union type guards defined",inputType:"union",outputType:"union",metadata:{severity:"error",async:!1}}),{_validators:t,_transforms:a}}};return K(i,n,e,o,t,a),i.refineString=()=>m("string",e,o,{validators:t,transforms:a}),i.refineNumber=()=>m("number",e,o,{validators:t,transforms:a}),i.refineBoolean=()=>m("boolean",e,o,{validators:t,transforms:a}),i.refineArray=()=>m("array",e,o,{validators:t,transforms:a}),i.refineObject=()=>m("object",e,o,{validators:t,transforms:a}),i.refineTuple=()=>m("tuple",e,o,{validators:t,transforms:a}),i.refineUnion=()=>m("union",e,o,{validators:t,transforms:a}),i.refineDate=()=>m("date",e,o,{validators:t,transforms:a}),i.refineAny=()=>m("any",e,o,{validators:t,transforms:a}),i}function K(n,e,o,r,t,a){let i=Object.entries(r),d=i.length;for(let y=0;y<d;y++){let[,s]=i[y];if(!s||typeof s!="object")continue;if(s.category?.startsWith("composable")){if(s.allowedTypes&&!s.allowedTypes.includes(e))continue;E(n,s,o,r);continue}if(typeof s.create!="function"||s.allowedTypes&&!s.allowedTypes.includes(e))continue;let{methodName:l,category:g="standard",name:f}=s,b=s.create();n[l]=function(...w){try{let h=b(...w);if(g==="transform"){let N=q(h,w[0]);a.push(N)}else{let N=J(h,o),M=Q(N,f||l,e,w,h);t.push(M)}}catch{}return n}}}function q(n,e){return typeof n=="function"?e:n?.__isTransform?n.__transformFn:n?.__isCoerce?o=>n.coerce.coerceFn(o):n?.__isDefault?(o,r)=>n.default.applyDefault(o,r):n?.__isPreprocess?(o,r)=>n.preprocess.applyPreprocess(o,r):e||(o=>o)}function J(n,e){return typeof n=="function"?(o,r)=>n(o,{path:e,allValues:r}).valid:n?.check?(o,r)=>n.check(o,r):()=>!1}function Q(n,e,o,r,t){let a={check:n,name:e,code:t?.code||e,pluginName:t?.pluginName||e,getErrorMessage:t?.getErrorMessage,messageFactory:r[r.length-1]?.messageFactory||t?.messageFactory||(()=>"Validation failed"),inputType:o,outputType:o,metadata:t?.metadata||{severity:"error",async:!1}};return t&&(t.shouldSkipAllValidation&&(a.shouldSkipAllValidation=t.shouldSkipAllValidation),t.shouldSkipValidation&&(a.shouldSkipValidation=t.shouldSkipValidation),t.shouldSkipFurtherValidation&&(a.shouldSkipFurtherValidation=t.shouldSkipFurtherValidation),t.skipForNull!==void 0&&(a.skipForNull=t.skipForNull),t.skipForUndefined!==void 0&&(a.skipForUndefined=t.skipForUndefined),t.__isRecursive&&(a.__isRecursive=t.__isRecursive),t.recursive&&(a.recursive=t.recursive)),a}function v(n,e){let o=m("string",n,e),r=m("number",n,e),t=m("boolean",n,e),a=m("array",n,e),i=m("object",n,e),d=m("union",n,e),y=m("tuple",n,e),s=m("date",n,e),l=m("any",n,e);return{string:o,number:r,boolean:t,date:s,array:a,tuple:y,union:d,object:i,any:l}}var D=Array.isArray,S=Object.freeze({code:"TUPLE_NOT_ARRAY",message:"Value must be an array"}),_=Object.freeze({code:"TUPLE_LENGTH_MISMATCH",prefix:"Tuple must have exactly",suffix:"elements, got"}),B=Object.freeze({code:"TUPLE_TOO_SHORT",prefix:"Tuple must have at least",suffix:"elements, got"}),X=L("tupleBuilder","builder",["tuple"],(n,e,o)=>{let r=n[0]||[];if(r.length===0)return O([P("tupleBuilder",()=>!1,{inputType:"tuple",outputType:"tuple"})]);let t=[],a,i=r.length,d=r[i-1],y=d&&typeof d=="object"&&typeof d!="function"&&(Object.prototype.hasOwnProperty.call(d,"rest")||Object.keys(d).length===0),s={};y?(t=r.slice(0,-1),s=d,a=s.rest):t=r;let l=t.length,g=!!a,f=new Array(l);for(let u=0;u<l;u++){let c=v(`${e}[${u}]`,o),p=t[u](c);p&&typeof p.build=="function"?f[u]=p.build():f[u]=null}let b=null;if(a){let u=v(`${e}[rest]`,o),c=a(u);c&&typeof c.build=="function"&&(b=c.build())}let w=u=>{if(u.length!==l)return!1;for(let c=0;c<l;c++){let p=f[c];if(p&&!p.validate(u[c]).valid)return!1}return!0},h=u=>{let c=u.length;if(c<l)return!1;for(let p=0;p<l;p++){let T=f[p];if(T&&!T.validate(u[p]).valid)return!1}if(b&&c>l){for(let p=l;p<c;p++)if(!b.validate(u[p]).valid)return!1}return!0},N=P("tupleBuilder",u=>D(u)?g?h(u):w(u):!1,{inputType:"tuple",outputType:"tuple",severity:"error",async:!1});return O([N],[],u=>{if(!D(u))return{...x,errors:[{path:e,message:s.messageFactory?.notArray?s.messageFactory.notArray(u):S.message,code:S.code}]};let c=u.length;if(!g&&c!==l)return{...x,errors:[{path:e,message:s.messageFactory?.lengthMismatch?s.messageFactory.lengthMismatch(l,c):`${_.prefix} ${l} ${_.suffix} ${c}`,code:_.code}]};if(g&&c<l)return{...x,errors:[{path:e,message:s.messageFactory?.tooShort?s.messageFactory.tooShort(l,c):`${B.prefix} ${l} ${B.suffix} ${c}`,code:B.code}]};let p=[];for(let T=0;T<l;T++){let C=f[T];if(C){let F=u[T],k=C.validate(F,u);if(!k.isValid()){let A=`${e}[${T}]`;if(k.errors&&k.errors.length>0)for(let $ of k.errors)p.push({...$,path:A});else p.push({path:A,message:`Validation failed for element ${T}`,code:"ELEMENT_INVALID"})}}}if(b&&c>l)for(let T=l;T<c;T++){let C=b.validate(u[T]);if(!C.valid&&C.errors){let F=`${e}[${T}]`;for(let k of C.errors)p.push({...k,path:F})}}return p.length>0?{...x,errors:p}:V})});0&&(module.exports={tupleBuilderPlugin});
@@ -0,0 +1 @@
1
+ var j=Object.freeze({valid:!0}),x=Object.freeze({valid:!1});function V(t,e=[],o){return{_validators:t,_transforms:e,validate:o||(a=>{for(let n=0;n<e.length;n++)if(!t[n].check(a,a))return x;return j})}}function O(t,e,o){return{check:e,name:t,inputType:o?.inputType,outputType:o?.outputType,metadata:o?{severity:o.severity||"error",async:o.async||!1}:void 0}}function A(t,e,o,a){return{name:t,methodName:e,allowedTypes:o,category:"composable",createComposer(n,r){let i=[],d={add(s){return i.push(s),d},build(){return a(i,n,r)}},y=d;return y[e]=function(...s){return y.add(s)},y}}}function R(t,e,o,a){let n=e.methodName,r=null,i=null;t[n]=function(...d){if(r||(r=e.createComposer(o,a)),r.add(d),t[n]=r[n],r){i=r.build();let y=t._executionPlan;if(!(y&&i&&typeof i.validate=="function")){if(i&&i._validators)for(let s of i._validators)y.addValidator(s.name,(l,g)=>{let f=s.check(l,l);return{valid:f,message:f?void 0:`Validation failed for ${s.name}`}})}}return t}}function E(t,e,o,a){return{...A(t,e,o,a),category:"composable-directly"}}function $(t){switch(t){case"string":return{check:e=>e==null?!0:typeof e=="string",name:"stringType",messageFactory:()=>"Expected string",inputType:"string",outputType:"string",metadata:{severity:"error",async:!1}};case"number":return{check:e=>e==null?!0:typeof e=="number"&&!isNaN(e),name:"numberType",messageFactory:()=>"Expected number",inputType:"number",outputType:"number",metadata:{severity:"error",async:!1}};case"boolean":return{check:e=>e==null?!0:typeof e=="boolean",name:"booleanType",messageFactory:()=>"Expected boolean",inputType:"boolean",outputType:"boolean",metadata:{severity:"error",async:!1}};case"array":return{check:e=>e==null?!0:Array.isArray(e),name:"arrayType",messageFactory:()=>"Expected array",inputType:"array",outputType:"array",metadata:{severity:"error",async:!1}};case"object":return{check:e=>e==null?!0:typeof e=="object"&&e!==null&&!Array.isArray(e),name:"objectType",messageFactory:()=>"Expected object",inputType:"object",outputType:"object",metadata:{severity:"error",async:!1}};case"date":return{check:e=>e==null?!0:e instanceof Date,name:"dateType",messageFactory:()=>"Expected Date",inputType:"date",outputType:"date",metadata:{severity:"error",async:!1}};case"null":return{check:e=>e===null,name:"nullType",messageFactory:()=>"Expected null",inputType:"null",outputType:"null",metadata:{severity:"error",async:!1}};case"any":return{check:()=>!0,name:"anyType",messageFactory:()=>"",inputType:"any",outputType:"any",metadata:{severity:"error",async:!1}};default:return null}}function m(t,e,o,a){let n=a?.validators?[...a.validators]:[];if(!a&&t!=="union"){let d=$(t);d&&n.push(d)}let r=a?.transforms?[...a.transforms]:[],i={_type:t,_fieldPath:e,_validators:n,_transforms:r,build(){return t==="union"&&n.length===0&&n.push({check:()=>!1,name:"unionGuard",messageFactory:()=>"No union type guards defined",inputType:"union",outputType:"union",metadata:{severity:"error",async:!1}}),{_validators:n,_transforms:r}}};return W(i,t,e,o,n,r),i.refineString=()=>m("string",e,o,{validators:n,transforms:r}),i.refineNumber=()=>m("number",e,o,{validators:n,transforms:r}),i.refineBoolean=()=>m("boolean",e,o,{validators:n,transforms:r}),i.refineArray=()=>m("array",e,o,{validators:n,transforms:r}),i.refineObject=()=>m("object",e,o,{validators:n,transforms:r}),i.refineTuple=()=>m("tuple",e,o,{validators:n,transforms:r}),i.refineUnion=()=>m("union",e,o,{validators:n,transforms:r}),i.refineDate=()=>m("date",e,o,{validators:n,transforms:r}),i.refineAny=()=>m("any",e,o,{validators:n,transforms:r}),i}function W(t,e,o,a,n,r){let i=Object.entries(a),d=i.length;for(let y=0;y<d;y++){let[,s]=i[y];if(!s||typeof s!="object")continue;if(s.category?.startsWith("composable")){if(s.allowedTypes&&!s.allowedTypes.includes(e))continue;R(t,s,o,a);continue}if(typeof s.create!="function"||s.allowedTypes&&!s.allowedTypes.includes(e))continue;let{methodName:l,category:g="standard",name:f}=s,b=s.create();t[l]=function(...w){try{let h=b(...w);if(g==="transform"){let N=U(h,w[0]);r.push(N)}else{let N=I(h,o),B=z(N,f||l,e,w,h);n.push(B)}}catch{}return t}}}function U(t,e){return typeof t=="function"?e:t?.__isTransform?t.__transformFn:t?.__isCoerce?o=>t.coerce.coerceFn(o):t?.__isDefault?(o,a)=>t.default.applyDefault(o,a):t?.__isPreprocess?(o,a)=>t.preprocess.applyPreprocess(o,a):e||(o=>o)}function I(t,e){return typeof t=="function"?(o,a)=>t(o,{path:e,allValues:a}).valid:t?.check?(o,a)=>t.check(o,a):()=>!1}function z(t,e,o,a,n){let r={check:t,name:e,code:n?.code||e,pluginName:n?.pluginName||e,getErrorMessage:n?.getErrorMessage,messageFactory:a[a.length-1]?.messageFactory||n?.messageFactory||(()=>"Validation failed"),inputType:o,outputType:o,metadata:n?.metadata||{severity:"error",async:!1}};return n&&(n.shouldSkipAllValidation&&(r.shouldSkipAllValidation=n.shouldSkipAllValidation),n.shouldSkipValidation&&(r.shouldSkipValidation=n.shouldSkipValidation),n.shouldSkipFurtherValidation&&(r.shouldSkipFurtherValidation=n.shouldSkipFurtherValidation),n.skipForNull!==void 0&&(r.skipForNull=n.skipForNull),n.skipForUndefined!==void 0&&(r.skipForUndefined=n.skipForUndefined),n.__isRecursive&&(r.__isRecursive=n.__isRecursive),n.recursive&&(r.recursive=n.recursive)),r}function P(t,e){let o=m("string",t,e),a=m("number",t,e),n=m("boolean",t,e),r=m("array",t,e),i=m("object",t,e),d=m("union",t,e),y=m("tuple",t,e),s=m("date",t,e),l=m("any",t,e);return{string:o,number:a,boolean:n,date:s,array:r,tuple:y,union:d,object:i,any:l}}var L=Array.isArray,D=Object.freeze({code:"TUPLE_NOT_ARRAY",message:"Value must be an array"}),v=Object.freeze({code:"TUPLE_LENGTH_MISMATCH",prefix:"Tuple must have exactly",suffix:"elements, got"}),_=Object.freeze({code:"TUPLE_TOO_SHORT",prefix:"Tuple must have at least",suffix:"elements, got"}),Z=E("tupleBuilder","builder",["tuple"],(t,e,o)=>{let a=t[0]||[];if(a.length===0)return V([O("tupleBuilder",()=>!1,{inputType:"tuple",outputType:"tuple"})]);let n=[],r,i=a.length,d=a[i-1],y=d&&typeof d=="object"&&typeof d!="function"&&(Object.prototype.hasOwnProperty.call(d,"rest")||Object.keys(d).length===0),s={};y?(n=a.slice(0,-1),s=d,r=s.rest):n=a;let l=n.length,g=!!r,f=new Array(l);for(let u=0;u<l;u++){let c=P(`${e}[${u}]`,o),p=n[u](c);p&&typeof p.build=="function"?f[u]=p.build():f[u]=null}let b=null;if(r){let u=P(`${e}[rest]`,o),c=r(u);c&&typeof c.build=="function"&&(b=c.build())}let w=u=>{if(u.length!==l)return!1;for(let c=0;c<l;c++){let p=f[c];if(p&&!p.validate(u[c]).valid)return!1}return!0},h=u=>{let c=u.length;if(c<l)return!1;for(let p=0;p<l;p++){let T=f[p];if(T&&!T.validate(u[p]).valid)return!1}if(b&&c>l){for(let p=l;p<c;p++)if(!b.validate(u[p]).valid)return!1}return!0},N=O("tupleBuilder",u=>L(u)?g?h(u):w(u):!1,{inputType:"tuple",outputType:"tuple",severity:"error",async:!1});return V([N],[],u=>{if(!L(u))return{...x,errors:[{path:e,message:s.messageFactory?.notArray?s.messageFactory.notArray(u):D.message,code:D.code}]};let c=u.length;if(!g&&c!==l)return{...x,errors:[{path:e,message:s.messageFactory?.lengthMismatch?s.messageFactory.lengthMismatch(l,c):`${v.prefix} ${l} ${v.suffix} ${c}`,code:v.code}]};if(g&&c<l)return{...x,errors:[{path:e,message:s.messageFactory?.tooShort?s.messageFactory.tooShort(l,c):`${_.prefix} ${l} ${_.suffix} ${c}`,code:_.code}]};let p=[];for(let T=0;T<l;T++){let C=f[T];if(C){let F=u[T],k=C.validate(F,u);if(!k.isValid()){let M=`${e}[${T}]`;if(k.errors&&k.errors.length>0)for(let S of k.errors)p.push({...S,path:M});else p.push({path:M,message:`Validation failed for element ${T}`,code:"ELEMENT_INVALID"})}}}if(b&&c>l)for(let T=l;T<c;T++){let C=b.validate(u[T]);if(!C.valid&&C.errors){let F=`${e}[${T}]`;for(let k of C.errors)p.push({...k,path:F})}}return p.length>0?{...x,errors:p}:j})});export{Z as tupleBuilderPlugin};
@@ -0,0 +1,95 @@
1
+ import { ValidationOptions } from "../core/plugin/types";
2
+ declare const SUPPORTED_VERSIONS: readonly [1, 3, 4, 5, 6, 7, 8];
3
+ type UUIDVersion = (typeof SUPPORTED_VERSIONS)[number];
4
+ /**
5
+ * @luq-plugin
6
+ * @name uuid
7
+ * @category standard
8
+ * @description Validates that a string is a valid UUID (Universally Unique Identifier)
9
+ * @allowedTypes ["string"]
10
+ * @see https://tools.ietf.org/html/rfc4122 - RFC 4122: A Universally Unique IDentifier (UUID) URN Namespace
11
+ * @see https://developer.mozilla.org/en-US/docs/Glossary/UUID - MDN UUID Reference
12
+ * @example
13
+ * ```typescript
14
+ * // Basic usage - validate any UUID version (RFC 4122 compliant)
15
+ * const validator = Builder()
16
+ * .use(uuidPlugin)
17
+ * .for<Entity>()
18
+ * .v("id", (b) => b.string.uuid())
19
+ * .v("correlationId", (b) => b.string.required().uuid())
20
+ * .build();
21
+ *
22
+ * // Validate specific UUID version
23
+ * builder.v("userId", b => b.string.uuid(4)) // UUID v4 only
24
+ * builder.v("namespaceId", b => b.string.uuid(5)) // UUID v5 only
25
+ * builder.v("timestamp", b => b.string.uuid(7)) // UUID v7 only (time-based)
26
+ *
27
+ * // ✅ VALID UUID formats (RFC 4122)
28
+ * // UUID v1 (MAC address + timestamp based)
29
+ * validator.parse({ id: "12345678-1234-1234-8123-123456789abc" });
30
+ * validator.parse({ id: "f47ac10b-58cc-4372-a567-0e02b2c3d479" });
31
+ *
32
+ * // UUID v3 (MD5 hash based)
33
+ * validator.parse({ id: "6ba7b810-9dad-11d1-80b4-00c04fd430c8" });
34
+ * validator.parse({ id: "12345678-1234-3234-8123-123456789abc" });
35
+ *
36
+ * // UUID v4 (random)
37
+ * validator.parse({ id: "550e8400-e29b-41d4-a716-446655440000" });
38
+ * validator.parse({ id: "f47ac10b-58cc-4372-a567-0e02b2c3d479" });
39
+ * validator.parse({ id: "12345678-1234-4234-9123-123456789abc" });
40
+ *
41
+ * // UUID v5 (SHA-1 hash based)
42
+ * validator.parse({ id: "6ba7b811-9dad-11d1-80b4-00c04fd430c8" });
43
+ * validator.parse({ id: "12345678-1234-5234-8123-123456789abc" });
44
+ *
45
+ * // UUID v6 (reordered timestamp)
46
+ * validator.parse({ id: "1EC9414C-232A-6B00-B3C8-9E6BDECED846" });
47
+ * validator.parse({ id: "12345678-1234-6234-9123-123456789abc" });
48
+ *
49
+ * // UUID v7 (Unix timestamp based)
50
+ * validator.parse({ id: "017F22E2-79B0-7CC3-98C4-DC0C0C07398F" });
51
+ * validator.parse({ id: "12345678-1234-7234-8123-123456789abc" });
52
+ *
53
+ * // UUID v8 (custom/application-specific)
54
+ * validator.parse({ id: "12345678-1234-8234-9123-123456789abc" });
55
+ *
56
+ * // Case insensitive
57
+ * validator.parse({ id: "F47AC10B-58CC-4372-A567-0E02B2C3D479" });
58
+ * validator.parse({ id: "f47ac10b-58cc-4372-a567-0e02b2c3d479" });
59
+ *
60
+ * // ❌ INVALID UUID formats
61
+ * validator.parse({ id: "not-a-uuid" }); // Plain text
62
+ * validator.parse({ id: "12345678-1234-1234-1234-123456789" }); // Too short
63
+ * validator.parse({ id: "12345678-1234-1234-1234-123456789abcd" }); // Too long
64
+ * validator.parse({ id: "12345678-1234-0234-8123-123456789abc" }); // Invalid version (0)
65
+ * validator.parse({ id: "12345678-1234-9234-8123-123456789abc" }); // Invalid version (9)
66
+ * validator.parse({ id: "12345678-1234-4234-0123-123456789abc" }); // Invalid variant (0)
67
+ * validator.parse({ id: "12345678-1234-4234-c123-123456789abc" }); // Invalid variant (c)
68
+ * validator.parse({ id: "12345678-1234-4234-g123-123456789abc" }); // Invalid hex char (g)
69
+ * validator.parse({ id: "12345678123412348123123456789abc" }); // Missing hyphens
70
+ * validator.parse({ id: "12345678-1234-4234-8123-123456789ab" }); // Missing last char
71
+ * validator.parse({ id: "12345678-1234-4234-8123-123456789abcX" }); // Extra char
72
+ * validator.parse({ id: "" }); // Empty string
73
+ * validator.parse({ id: "12345678-1234-4234-8123-123456789ab " }); // Trailing space
74
+ * validator.parse({ id: " 12345678-1234-4234-8123-123456789abc" }); // Leading space
75
+ * ```
76
+ * @params
77
+ * - version?: 1 | 3 | 4 | 5 | 6 | 7 | 8 - Specific UUID version to validate (optional)
78
+ * - options?: { messageFactory?: (context: MessageContext) => string } - Optional configuration
79
+ * @returns Validation function that returns true if string is a valid UUID
80
+ * @customError
81
+ * ```typescript
82
+ * .uuid(4, {
83
+ * messageFactory: ({ path, value, params }) =>
84
+ * `${path} must be a valid UUID v${params.version} (received: ${value})`
85
+ * })
86
+ * ```
87
+ * @since 0.1.0-alpha
88
+ */
89
+ export declare const uuidPlugin: import("../index").TypedPlugin<"stringUuid", "uuid", (version?: UUIDVersion | readonly UUIDVersion[], options?: ValidationOptions) => {
90
+ check: (value: any) => boolean;
91
+ code: string;
92
+ getErrorMessage: (value: any, path: string) => string;
93
+ params: (1 | 5 | 7 | 3 | 4 | ValidationOptions<{}> | 6 | 8 | readonly (1 | 5 | 7 | 3 | 4 | 6 | 8)[])[];
94
+ }, readonly ["string"], "validator", "standard">;
95
+ export {};
@@ -0,0 +1 @@
1
+ "use strict";var u=Object.defineProperty;var d=Object.getOwnPropertyDescriptor;var g=Object.getOwnPropertyNames;var y=Object.prototype.hasOwnProperty;var c=(e,n)=>{for(var r in n)u(e,r,{get:n[r],enumerable:!0})},f=(e,n,r,m)=>{if(n&&typeof n=="object"||typeof n=="function")for(let i of g(n))!y.call(e,i)&&i!==r&&u(e,i,{get:()=>n[i],enumerable:!(m=d(n,i))||m.enumerable});return e};var I=e=>f(u({},"__esModule",{value:!0}),e);var C={};c(C,{uuidPlugin:()=>R});module.exports=I(C);var N=(e,n,r,m)=>{let o=(t=>(...a)=>{let s=t(...a);return s&&typeof s=="object"&&"check"in s?{...s,pluginName:m}:s})(r);switch(e){case"conditional":return(t,...a)=>o(t,...a);case"fieldReference":return(t,...a)=>o(t,...a);case"multiFieldReference":return o;case"transform":return t=>o(t);case"arrayElement":return(t,...a)=>o(t,...a);case"context":return t=>o(t);default:return o}};function p(e){let{name:n,methodName:r,allowedTypes:m,category:i,impl:o}=e;return{name:n,methodName:r,allowedTypes:m,category:i,create:()=>N(i,r,o,n)}}function x(e){return e.version?`Value must be a valid UUID ${e.version} format`:"Value must be a valid UUID format"}var P=["string"],h=[1,3,4,5,6,7,8];function U(e){return new RegExp(`^[0-9a-f]{8}-[0-9a-f]{4}-${e}[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$`,"i")}var T={};for(let e of h)T[e]=U(e);var E=/^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i,R=p({name:"stringUuid",methodName:"uuid",allowedTypes:P,category:"standard",impl:(e,n)=>{let r=n?.messageFactory||x;if(!e){let t=n?.code||"uuid";return{check:a=>typeof a!="string"?!0:E.test(a),code:t,getErrorMessage:(a,s)=>r({path:s,value:a,code:t}),params:[e,n]}}let m=Array.isArray(e)?e:[e],i=Array.isArray(e)?`v${e.join(", v")}`:`v${e}`,o=n?.code||"uuidVersion";return{check:t=>{if(typeof t!="string")return!0;let a=m.length;for(let s=0;s<a;s++){let l=m[s];if(T[l]&&T[l].test(t))return!0}return!1},code:o,getErrorMessage:(t,a)=>r({path:a,value:t,code:o,version:i}),params:[e,n]}}});0&&(module.exports={uuidPlugin});
@@ -0,0 +1 @@
1
+ var p=(e,o,s,i)=>{let a=(n=>(...t)=>{let r=n(...t);return r&&typeof r=="object"&&"check"in r?{...r,pluginName:i}:r})(s);switch(e){case"conditional":return(n,...t)=>a(n,...t);case"fieldReference":return(n,...t)=>a(n,...t);case"multiFieldReference":return a;case"transform":return n=>a(n);case"arrayElement":return(n,...t)=>a(n,...t);case"context":return n=>a(n);default:return a}};function T(e){let{name:o,methodName:s,allowedTypes:i,category:m,impl:a}=e;return{name:o,methodName:s,allowedTypes:i,category:m,create:()=>p(m,s,a,o)}}function d(e){return e.version?`Value must be a valid UUID ${e.version} format`:"Value must be a valid UUID format"}var g=["string"],y=[1,3,4,5,6,7,8];function c(e){return new RegExp(`^[0-9a-f]{8}-[0-9a-f]{4}-${e}[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$`,"i")}var u={};for(let e of y)u[e]=c(e);var f=/^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i,x=T({name:"stringUuid",methodName:"uuid",allowedTypes:g,category:"standard",impl:(e,o)=>{let s=o?.messageFactory||d;if(!e){let n=o?.code||"uuid";return{check:t=>typeof t!="string"?!0:f.test(t),code:n,getErrorMessage:(t,r)=>s({path:r,value:t,code:n}),params:[e,o]}}let i=Array.isArray(e)?e:[e],m=Array.isArray(e)?`v${e.join(", v")}`:`v${e}`,a=o?.code||"uuidVersion";return{check:n=>{if(typeof n!="string")return!0;let t=i.length;for(let r=0;r<t;r++){let l=i[r];if(u[l]&&u[l].test(n))return!0}return!1},code:a,getErrorMessage:(n,t)=>s({path:t,value:n,code:a,version:m}),params:[e,o]}}});export{x as uuidPlugin};