@voyantjs/utils 0.1.0

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 (191) hide show
  1. package/LICENSE +109 -0
  2. package/README.md +42 -0
  3. package/dist/accounting-countries.d.ts +12 -0
  4. package/dist/accounting-countries.d.ts.map +1 -0
  5. package/dist/accounting-countries.js +307 -0
  6. package/dist/accounting-countries.js.map +1 -0
  7. package/dist/accounting-regions.d.ts +103 -0
  8. package/dist/accounting-regions.d.ts.map +1 -0
  9. package/dist/accounting-regions.js +38 -0
  10. package/dist/accounting-regions.js.map +1 -0
  11. package/dist/airlines.d.ts +960 -0
  12. package/dist/airlines.d.ts.map +1 -0
  13. package/dist/airlines.js +989 -0
  14. package/dist/airlines.js.map +1 -0
  15. package/dist/analytics/api-key-events.d.ts +89 -0
  16. package/dist/analytics/api-key-events.d.ts.map +1 -0
  17. package/dist/analytics/api-key-events.js +99 -0
  18. package/dist/analytics/api-key-events.js.map +1 -0
  19. package/dist/api-keys-client.d.ts +40 -0
  20. package/dist/api-keys-client.d.ts.map +1 -0
  21. package/dist/api-keys-client.js +63 -0
  22. package/dist/api-keys-client.js.map +1 -0
  23. package/dist/api-keys.d.ts +48 -0
  24. package/dist/api-keys.d.ts.map +1 -0
  25. package/dist/api-keys.js +108 -0
  26. package/dist/api-keys.js.map +1 -0
  27. package/dist/cache.d.ts +123 -0
  28. package/dist/cache.d.ts.map +1 -0
  29. package/dist/cache.js +182 -0
  30. package/dist/cache.js.map +1 -0
  31. package/dist/checkout-signature.d.ts +15 -0
  32. package/dist/checkout-signature.d.ts.map +1 -0
  33. package/dist/checkout-signature.js +64 -0
  34. package/dist/checkout-signature.js.map +1 -0
  35. package/dist/conditions.d.ts +36 -0
  36. package/dist/conditions.d.ts.map +1 -0
  37. package/dist/conditions.js +396 -0
  38. package/dist/conditions.js.map +1 -0
  39. package/dist/countries.d.ts +5 -0
  40. package/dist/countries.d.ts.map +1 -0
  41. package/dist/countries.js +251 -0
  42. package/dist/countries.js.map +1 -0
  43. package/dist/currencies.d.ts +1011 -0
  44. package/dist/currencies.d.ts.map +1 -0
  45. package/dist/currencies.js +1011 -0
  46. package/dist/currencies.js.map +1 -0
  47. package/dist/email/send.d.ts +20 -0
  48. package/dist/email/send.d.ts.map +1 -0
  49. package/dist/email/send.js +53 -0
  50. package/dist/email/send.js.map +1 -0
  51. package/dist/form-runtime.d.ts +38 -0
  52. package/dist/form-runtime.d.ts.map +1 -0
  53. package/dist/form-runtime.js +174 -0
  54. package/dist/form-runtime.js.map +1 -0
  55. package/dist/gcs/storage.d.ts +23 -0
  56. package/dist/gcs/storage.d.ts.map +1 -0
  57. package/dist/gcs/storage.js +25 -0
  58. package/dist/gcs/storage.js.map +1 -0
  59. package/dist/geo.d.ts +85 -0
  60. package/dist/geo.d.ts.map +1 -0
  61. package/dist/geo.js +141 -0
  62. package/dist/geo.js.map +1 -0
  63. package/dist/geographic-regions.d.ts +66 -0
  64. package/dist/geographic-regions.d.ts.map +1 -0
  65. package/dist/geographic-regions.js +326 -0
  66. package/dist/geographic-regions.js.map +1 -0
  67. package/dist/index.d.ts +9 -0
  68. package/dist/index.d.ts.map +1 -0
  69. package/dist/index.js +9 -0
  70. package/dist/index.js.map +1 -0
  71. package/dist/kms-aws.d.ts +26 -0
  72. package/dist/kms-aws.d.ts.map +1 -0
  73. package/dist/kms-aws.js +133 -0
  74. package/dist/kms-aws.js.map +1 -0
  75. package/dist/kms-crypto.d.ts +20 -0
  76. package/dist/kms-crypto.d.ts.map +1 -0
  77. package/dist/kms-crypto.js +108 -0
  78. package/dist/kms-crypto.js.map +1 -0
  79. package/dist/kms-env.d.ts +13 -0
  80. package/dist/kms-env.d.ts.map +1 -0
  81. package/dist/kms-env.js +13 -0
  82. package/dist/kms-env.js.map +1 -0
  83. package/dist/kms-gcp.d.ts +32 -0
  84. package/dist/kms-gcp.d.ts.map +1 -0
  85. package/dist/kms-gcp.js +116 -0
  86. package/dist/kms-gcp.js.map +1 -0
  87. package/dist/kms-local.d.ts +13 -0
  88. package/dist/kms-local.d.ts.map +1 -0
  89. package/dist/kms-local.js +13 -0
  90. package/dist/kms-local.js.map +1 -0
  91. package/dist/kms-symmetric.d.ts +14 -0
  92. package/dist/kms-symmetric.d.ts.map +1 -0
  93. package/dist/kms-symmetric.js +67 -0
  94. package/dist/kms-symmetric.js.map +1 -0
  95. package/dist/kms.d.ts +66 -0
  96. package/dist/kms.d.ts.map +1 -0
  97. package/dist/kms.js +169 -0
  98. package/dist/kms.js.map +1 -0
  99. package/dist/kv-codecs.d.ts +6 -0
  100. package/dist/kv-codecs.d.ts.map +1 -0
  101. package/dist/kv-codecs.js +4 -0
  102. package/dist/kv-codecs.js.map +1 -0
  103. package/dist/kv.d.ts +10 -0
  104. package/dist/kv.d.ts.map +1 -0
  105. package/dist/kv.js +18 -0
  106. package/dist/kv.js.map +1 -0
  107. package/dist/languages.d.ts +187 -0
  108. package/dist/languages.d.ts.map +1 -0
  109. package/dist/languages.js +187 -0
  110. package/dist/languages.js.map +1 -0
  111. package/dist/localized-countries-regions.d.ts +15 -0
  112. package/dist/localized-countries-regions.d.ts.map +1 -0
  113. package/dist/localized-countries-regions.js +674 -0
  114. package/dist/localized-countries-regions.js.map +1 -0
  115. package/dist/localized-regions.d.ts +33 -0
  116. package/dist/localized-regions.d.ts.map +1 -0
  117. package/dist/localized-regions.js +63 -0
  118. package/dist/localized-regions.js.map +1 -0
  119. package/dist/price/resolve.d.ts +91 -0
  120. package/dist/price/resolve.d.ts.map +1 -0
  121. package/dist/price/resolve.js +227 -0
  122. package/dist/price/resolve.js.map +1 -0
  123. package/dist/rate-limits.d.ts +39 -0
  124. package/dist/rate-limits.d.ts.map +1 -0
  125. package/dist/rate-limits.js +86 -0
  126. package/dist/rate-limits.js.map +1 -0
  127. package/dist/redis.d.ts +13 -0
  128. package/dist/redis.d.ts.map +1 -0
  129. package/dist/redis.js +16 -0
  130. package/dist/redis.js.map +1 -0
  131. package/dist/region-only.d.ts +11 -0
  132. package/dist/region-only.d.ts.map +1 -0
  133. package/dist/region-only.js +49 -0
  134. package/dist/region-only.js.map +1 -0
  135. package/dist/region.d.ts +11 -0
  136. package/dist/region.d.ts.map +1 -0
  137. package/dist/region.js +47 -0
  138. package/dist/region.js.map +1 -0
  139. package/dist/romania-bucharest-sectors.d.ts +6 -0
  140. package/dist/romania-bucharest-sectors.d.ts.map +1 -0
  141. package/dist/romania-bucharest-sectors.js +27 -0
  142. package/dist/romania-bucharest-sectors.js.map +1 -0
  143. package/dist/romania-counties.d.ts +6 -0
  144. package/dist/romania-counties.d.ts.map +1 -0
  145. package/dist/romania-counties.js +171 -0
  146. package/dist/romania-counties.js.map +1 -0
  147. package/dist/session-claims.d.ts +40 -0
  148. package/dist/session-claims.d.ts.map +1 -0
  149. package/dist/session-claims.js +184 -0
  150. package/dist/session-claims.js.map +1 -0
  151. package/dist/sms/provider.d.ts +28 -0
  152. package/dist/sms/provider.d.ts.map +1 -0
  153. package/dist/sms/provider.js +50 -0
  154. package/dist/sms/provider.js.map +1 -0
  155. package/dist/sms/segments.d.ts +3 -0
  156. package/dist/sms/segments.d.ts.map +1 -0
  157. package/dist/sms/segments.js +33 -0
  158. package/dist/sms/segments.js.map +1 -0
  159. package/dist/temporal.d.ts +2 -0
  160. package/dist/temporal.d.ts.map +1 -0
  161. package/dist/temporal.js +6 -0
  162. package/dist/temporal.js.map +1 -0
  163. package/dist/timezones.d.ts +9 -0
  164. package/dist/timezones.d.ts.map +1 -0
  165. package/dist/timezones.js +1217 -0
  166. package/dist/timezones.js.map +1 -0
  167. package/dist/twilio/client.d.ts +13 -0
  168. package/dist/twilio/client.d.ts.map +1 -0
  169. package/dist/twilio/client.js +26 -0
  170. package/dist/twilio/client.js.map +1 -0
  171. package/dist/usage/index.d.ts +34 -0
  172. package/dist/usage/index.d.ts.map +1 -0
  173. package/dist/usage/index.js +18 -0
  174. package/dist/usage/index.js.map +1 -0
  175. package/dist/usage/policy.d.ts +27 -0
  176. package/dist/usage/policy.d.ts.map +1 -0
  177. package/dist/usage/policy.js +17 -0
  178. package/dist/usage/policy.js.map +1 -0
  179. package/dist/validation/log.d.ts +10 -0
  180. package/dist/validation/log.d.ts.map +1 -0
  181. package/dist/validation/log.js +37 -0
  182. package/dist/validation/log.js.map +1 -0
  183. package/dist/with-timeout.d.ts +2 -0
  184. package/dist/with-timeout.d.ts.map +1 -0
  185. package/dist/with-timeout.js +15 -0
  186. package/dist/with-timeout.js.map +1 -0
  187. package/dist/zod-form-builder.d.ts +45 -0
  188. package/dist/zod-form-builder.d.ts.map +1 -0
  189. package/dist/zod-form-builder.js +216 -0
  190. package/dist/zod-form-builder.js.map +1 -0
  191. package/package.json +92 -0
package/dist/cache.js ADDED
@@ -0,0 +1,182 @@
1
+ /**
2
+ * Unified Cache Utility
3
+ *
4
+ * Simple cache-aside pattern for all caching needs.
5
+ * Supports Cloudflare KV (primary) with graceful fallback to no-op.
6
+ *
7
+ * Usage:
8
+ * const value = await cached('my-key', 300, () => fetchExpensiveData(), kv)
9
+ *
10
+ * Or with the class for more control:
11
+ * const cache = new Cache(kv)
12
+ * const value = await cache.get('key') ?? await cache.set('key', data, 300)
13
+ *
14
+ * NOTE: Upstash Redis has been removed. Use Cloudflare KV instead.
15
+ */
16
+ /**
17
+ * Common TTL values (in seconds)
18
+ */
19
+ export const TTL = {
20
+ /** 1 minute */
21
+ SHORT: 60,
22
+ /** 5 minutes */
23
+ MEDIUM: 300,
24
+ /** 15 minutes */
25
+ DEFAULT: 900,
26
+ /** 1 hour */
27
+ LONG: 3600,
28
+ /** 24 hours */
29
+ DAY: 86400,
30
+ /** 7 days */
31
+ WEEK: 604800,
32
+ /** 30 days */
33
+ MONTH: 2592000,
34
+ };
35
+ /**
36
+ * Cache-aside helper function
37
+ *
38
+ * Tries to get value from cache, if miss, computes and caches the result.
39
+ * Gracefully falls back to compute on any cache failure.
40
+ *
41
+ * @param key - Cache key (will be used as-is, add your own prefix)
42
+ * @param ttlSeconds - Time to live in seconds
43
+ * @param compute - Function to compute the value on cache miss
44
+ * @param kv - Cloudflare KV namespace
45
+ *
46
+ * @example
47
+ * const user = await cached(
48
+ * `user:${userId}`,
49
+ * TTL.MEDIUM,
50
+ * () => db.query.users.findFirst({ where: eq(users.id, userId) }),
51
+ * env.CACHE
52
+ * )
53
+ */
54
+ export async function cached(key, ttlSeconds, compute, kv) {
55
+ // Try cache first
56
+ if (kv) {
57
+ try {
58
+ const cached = await kv.get(key, { type: "json" });
59
+ if (cached !== null && cached !== undefined) {
60
+ return cached;
61
+ }
62
+ }
63
+ catch (error) {
64
+ console.warn(`[cache] Read error for ${key}:`, error);
65
+ // Fall through to compute
66
+ }
67
+ }
68
+ // Cache miss or error - compute fresh value
69
+ const value = await compute();
70
+ // Store in cache (fire-and-forget, don't block)
71
+ if (kv && value !== null && value !== undefined) {
72
+ kv.put(key, JSON.stringify(value), { expirationTtl: ttlSeconds }).catch((error) => {
73
+ console.warn(`[cache] Write error for ${key}:`, error);
74
+ });
75
+ }
76
+ return value;
77
+ }
78
+ /**
79
+ * Cache class for more control over caching operations
80
+ */
81
+ export class Cache {
82
+ kv;
83
+ constructor(kv) {
84
+ this.kv = kv;
85
+ }
86
+ /**
87
+ * Get a value from cache
88
+ */
89
+ async get(key) {
90
+ if (!this.kv)
91
+ return null;
92
+ try {
93
+ const value = await this.kv.get(key, { type: "json" });
94
+ return value ?? null;
95
+ }
96
+ catch (error) {
97
+ console.warn(`[cache] Get error for ${key}:`, error);
98
+ return null;
99
+ }
100
+ }
101
+ /**
102
+ * Set a value in cache
103
+ */
104
+ async set(key, value, ttlSeconds) {
105
+ if (!this.kv)
106
+ return;
107
+ try {
108
+ await this.kv.put(key, JSON.stringify(value), { expirationTtl: ttlSeconds });
109
+ }
110
+ catch (error) {
111
+ console.warn(`[cache] Set error for ${key}:`, error);
112
+ }
113
+ }
114
+ /**
115
+ * Delete a value from cache
116
+ */
117
+ async del(key) {
118
+ if (!this.kv)
119
+ return;
120
+ try {
121
+ await this.kv.delete(key);
122
+ }
123
+ catch (error) {
124
+ console.warn(`[cache] Del error for ${key}:`, error);
125
+ }
126
+ }
127
+ /**
128
+ * Delete multiple keys by pattern
129
+ * Note: KV doesn't support pattern deletion natively, so we list and delete
130
+ */
131
+ async delPattern(pattern) {
132
+ if (!this.kv?.list)
133
+ return;
134
+ try {
135
+ // Extract prefix from pattern (remove wildcards)
136
+ const prefix = pattern.replace(/\*/g, "");
137
+ const { keys } = await this.kv.list({ prefix });
138
+ for (const key of keys) {
139
+ await this.kv.delete(key.name);
140
+ }
141
+ }
142
+ catch (error) {
143
+ console.warn(`[cache] DelPattern error for ${pattern}:`, error);
144
+ }
145
+ }
146
+ /**
147
+ * Cache-aside helper
148
+ */
149
+ async cached(key, ttlSeconds, compute) {
150
+ return cached(key, ttlSeconds, compute, this.kv);
151
+ }
152
+ }
153
+ /**
154
+ * Create a Cache instance from KV namespace
155
+ */
156
+ export function createCache(kv) {
157
+ return new Cache(kv ?? null);
158
+ }
159
+ /**
160
+ * Create a Cache instance from Cloudflare Workers env
161
+ */
162
+ export function createCacheFromEnv(env) {
163
+ return new Cache(env.CACHE ?? null);
164
+ }
165
+ // ============================================================================
166
+ // Legacy Redis compatibility (deprecated - will be removed)
167
+ // ============================================================================
168
+ /**
169
+ * @deprecated Use KV directly instead
170
+ */
171
+ export function getRedis() {
172
+ console.warn("[cache] Upstash Redis has been removed. Use Cloudflare KV instead.");
173
+ return null;
174
+ }
175
+ /**
176
+ * @deprecated Use KV directly instead
177
+ */
178
+ export function getRedisFromEnv(_env) {
179
+ console.warn("[cache] Upstash Redis has been removed. Use Cloudflare KV instead.");
180
+ return null;
181
+ }
182
+ //# sourceMappingURL=cache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache.js","sourceRoot":"","sources":["../src/cache.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ export interface CheckoutPricingSignaturePayload {
2
+ [key: string]: unknown;
3
+ version: number;
4
+ bookingId: string;
5
+ source: string;
6
+ amount: number;
7
+ amountMinor: number;
8
+ currency: string;
9
+ payMode: "full" | "partial";
10
+ computedAt: string;
11
+ }
12
+ export declare function signCheckoutPricingPayload(payload: CheckoutPricingSignaturePayload, secret: string): Promise<string>;
13
+ export declare function verifyCheckoutPricingPayload(payload: CheckoutPricingSignaturePayload, signature: string, secret: string): Promise<boolean>;
14
+ export declare function serializeCheckoutPricingPayload(payload: CheckoutPricingSignaturePayload): string;
15
+ //# sourceMappingURL=checkout-signature.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"checkout-signature.d.ts","sourceRoot":"","sources":["../src/checkout-signature.ts"],"names":[],"mappings":"AAkEA,MAAM,WAAW,+BAA+B;IAC9C,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;IACtB,OAAO,EAAE,MAAM,CAAA;IACf,SAAS,EAAE,MAAM,CAAA;IACjB,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,MAAM,CAAA;IACd,WAAW,EAAE,MAAM,CAAA;IACnB,QAAQ,EAAE,MAAM,CAAA;IAChB,OAAO,EAAE,MAAM,GAAG,SAAS,CAAA;IAC3B,UAAU,EAAE,MAAM,CAAA;CACnB;AAED,wBAAsB,0BAA0B,CAC9C,OAAO,EAAE,+BAA+B,EACxC,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,MAAM,CAAC,CAGjB;AAED,wBAAsB,4BAA4B,CAChD,OAAO,EAAE,+BAA+B,EACxC,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,OAAO,CAAC,CAGlB;AAED,wBAAgB,+BAA+B,CAAC,OAAO,EAAE,+BAA+B,GAAG,MAAM,CAEhG"}
@@ -0,0 +1,64 @@
1
+ let nodeCrypto = null;
2
+ try {
3
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
4
+ nodeCrypto = require("crypto");
5
+ }
6
+ catch {
7
+ nodeCrypto = null;
8
+ }
9
+ const isWebCryptoAvailable = () => typeof crypto !== "undefined" && typeof crypto.subtle !== "undefined";
10
+ function toCanonicalJson(value) {
11
+ const sortedEntries = Object.entries(value)
12
+ .map(([key, val]) => {
13
+ if (val && typeof val === "object" && !Array.isArray(val)) {
14
+ return [key, JSON.parse(toCanonicalJson(val))];
15
+ }
16
+ return [key, val];
17
+ })
18
+ .sort(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0));
19
+ const canonicalObject = {};
20
+ for (const [k, v] of sortedEntries) {
21
+ canonicalObject[k] = v;
22
+ }
23
+ return JSON.stringify(canonicalObject);
24
+ }
25
+ async function hmacSha256(message, secret) {
26
+ if (!secret || secret.length < 16) {
27
+ throw new Error("CHECKOUT_SESSION_SECRET must be at least 16 characters");
28
+ }
29
+ if (nodeCrypto) {
30
+ return nodeCrypto.createHmac("sha256", secret).update(message).digest("base64url");
31
+ }
32
+ if (isWebCryptoAvailable()) {
33
+ const encoder = new TextEncoder();
34
+ const key = await crypto.subtle.importKey("raw", encoder.encode(secret), { name: "HMAC", hash: "SHA-256" }, false, ["sign", "verify"]);
35
+ const signatureBuffer = await crypto.subtle.sign("HMAC", key, encoder.encode(message));
36
+ const signatureArray = Array.from(new Uint8Array(signatureBuffer));
37
+ return btoa(String.fromCharCode(...signatureArray))
38
+ .replace(/\+/g, "-")
39
+ .replace(/\//g, "_")
40
+ .replace(/=/g, "");
41
+ }
42
+ throw new Error("No crypto implementation available for signing checkout payload");
43
+ }
44
+ function timingSafeEqual(a, b) {
45
+ if (a.length !== b.length)
46
+ return false;
47
+ let result = 0;
48
+ for (let i = 0; i < a.length; i++) {
49
+ result |= a.charCodeAt(i) ^ b.charCodeAt(i);
50
+ }
51
+ return result === 0;
52
+ }
53
+ export async function signCheckoutPricingPayload(payload, secret) {
54
+ const canonical = toCanonicalJson(payload);
55
+ return hmacSha256(canonical, secret);
56
+ }
57
+ export async function verifyCheckoutPricingPayload(payload, signature, secret) {
58
+ const expected = await signCheckoutPricingPayload(payload, secret);
59
+ return timingSafeEqual(expected, signature);
60
+ }
61
+ export function serializeCheckoutPricingPayload(payload) {
62
+ return toCanonicalJson(payload);
63
+ }
64
+ //# sourceMappingURL=checkout-signature.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"checkout-signature.js","sourceRoot":"","sources":["../src/checkout-signature.ts"],"names":[],"mappings":"AAAA,IAAI,UAAU,GAAmC,IAAI,CAAA;AACrD,IAAI,CAAC;IACH,iEAAiE;IACjE,UAAU,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAA;AAChC,CAAC;AAAC,MAAM,CAAC;IACP,UAAU,GAAG,IAAI,CAAA;AACnB,CAAC;AAED,MAAM,oBAAoB,GAAG,GAAG,EAAE,CAAC,OAAO,MAAM,KAAK,WAAW,IAAI,OAAO,MAAM,CAAC,MAAM,KAAK,WAAW,CAAA;AAExG,SAAS,eAAe,CAAC,KAA8B;IACrD,MAAM,aAAa,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC;SACxC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,EAAE;QAClB,IAAI,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;YAC1D,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,GAA8B,CAAC,CAAC,CAAC,CAAA;QAC3E,CAAC;QACD,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAAA;IACnB,CAAC,CAAC;SACD,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IAEnD,MAAM,eAAe,GAA4B,EAAE,CAAA;IACnD,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,aAAa,EAAE,CAAC;QACnC,eAAe,CAAC,CAAC,CAAC,GAAG,CAAC,CAAA;IACxB,CAAC;IAED,OAAO,IAAI,CAAC,SAAS,CAAC,eAAe,CAAC,CAAA;AACxC,CAAC;AAED,KAAK,UAAU,UAAU,CAAC,OAAe,EAAE,MAAc;IACvD,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC;QAClC,MAAM,IAAI,KAAK,CAAC,wDAAwD,CAAC,CAAA;IAC3E,CAAC;IAED,IAAI,UAAU,EAAE,CAAC;QACf,OAAO,UAAU,CAAC,UAAU,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,CAAA;IACpF,CAAC;IAED,IAAI,oBAAoB,EAAE,EAAE,CAAC;QAC3B,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAA;QACjC,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,SAAS,CACvC,KAAK,EACL,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,EACtB,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,EACjC,KAAK,EACL,CAAC,MAAM,EAAE,QAAQ,CAAC,CACnB,CAAA;QACD,MAAM,eAAe,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAA;QACtF,MAAM,cAAc,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,eAAe,CAAC,CAAC,CAAA;QAClE,OAAO,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,GAAG,cAAc,CAAC,CAAC;aAChD,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC;aACnB,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC;aACnB,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAA;IACtB,CAAC;IAED,MAAM,IAAI,KAAK,CAAC,iEAAiE,CAAC,CAAA;AACpF,CAAC;AAED,SAAS,eAAe,CAAC,CAAS,EAAE,CAAS;IAC3C,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM;QAAE,OAAO,KAAK,CAAA;IACvC,IAAI,MAAM,GAAG,CAAC,CAAA;IACd,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAClC,MAAM,IAAI,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAA;IAC7C,CAAC;IACD,OAAO,MAAM,KAAK,CAAC,CAAA;AACrB,CAAC;AAcD,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAC9C,OAAwC,EACxC,MAAc;IAEd,MAAM,SAAS,GAAG,eAAe,CAAC,OAAO,CAAC,CAAA;IAC1C,OAAO,UAAU,CAAC,SAAS,EAAE,MAAM,CAAC,CAAA;AACtC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,4BAA4B,CAChD,OAAwC,EACxC,SAAiB,EACjB,MAAc;IAEd,MAAM,QAAQ,GAAG,MAAM,0BAA0B,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;IAClE,OAAO,eAAe,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAA;AAC7C,CAAC;AAED,MAAM,UAAU,+BAA+B,CAAC,OAAwC;IACtF,OAAO,eAAe,CAAC,OAAO,CAAC,CAAA;AACjC,CAAC"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * Predicate Evaluator for Form Conditions
3
+ *
4
+ * Provides a safe, deterministic evaluator for condition expressions
5
+ * used in booking form visibility and requirement rules.
6
+ */
7
+ import type { Predicate, PredicateContext } from "@pxmstudio/voyant-types";
8
+ /**
9
+ * Error thrown when predicate evaluation fails
10
+ */
11
+ export declare class PredicateEvaluationError extends Error {
12
+ readonly field?: string | undefined;
13
+ constructor(message: string, field?: string | undefined);
14
+ }
15
+ /**
16
+ * Evaluate a predicate expression
17
+ *
18
+ * @param predicate - The predicate to evaluate
19
+ * @param context - The evaluation context
20
+ * @returns boolean result
21
+ */
22
+ export declare function evaluatePredicate(predicate: Predicate, context: PredicateContext): boolean;
23
+ /**
24
+ * Validate a predicate structure without evaluating it
25
+ * Useful for configuration validation
26
+ *
27
+ * @param predicate - The predicate to validate
28
+ * @returns true if valid, throws PredicateEvaluationError if invalid
29
+ */
30
+ export declare function validatePredicate(predicate: Predicate): boolean;
31
+ /**
32
+ * Safe evaluation that catches errors and returns false
33
+ * Useful for non-critical conditional logic
34
+ */
35
+ export declare function safeEvaluatePredicate(predicate: Predicate, context: PredicateContext): boolean;
36
+ //# sourceMappingURL=conditions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conditions.d.ts","sourceRoot":"","sources":["../src/conditions.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EACV,SAAS,EACT,gBAAgB,EACjB,MAAM,yBAAyB,CAAA;AAwBhC;;GAEG;AACH,qBAAa,wBAAyB,SAAQ,KAAK;aAG/B,KAAK,CAAC,EAAE,MAAM;gBAD9B,OAAO,EAAE,MAAM,EACC,KAAK,CAAC,EAAE,MAAM,YAAA;CAKjC;AAkPD;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,SAAS,EAAE,OAAO,EAAE,gBAAgB,GAAG,OAAO,CA0F1F;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,SAAS,GAAG,OAAO,CAsC/D;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,SAAS,EAAE,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAO9F"}