@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.
- package/LICENSE +109 -0
- package/README.md +42 -0
- package/dist/accounting-countries.d.ts +12 -0
- package/dist/accounting-countries.d.ts.map +1 -0
- package/dist/accounting-countries.js +307 -0
- package/dist/accounting-countries.js.map +1 -0
- package/dist/accounting-regions.d.ts +103 -0
- package/dist/accounting-regions.d.ts.map +1 -0
- package/dist/accounting-regions.js +38 -0
- package/dist/accounting-regions.js.map +1 -0
- package/dist/airlines.d.ts +960 -0
- package/dist/airlines.d.ts.map +1 -0
- package/dist/airlines.js +989 -0
- package/dist/airlines.js.map +1 -0
- package/dist/analytics/api-key-events.d.ts +89 -0
- package/dist/analytics/api-key-events.d.ts.map +1 -0
- package/dist/analytics/api-key-events.js +99 -0
- package/dist/analytics/api-key-events.js.map +1 -0
- package/dist/api-keys-client.d.ts +40 -0
- package/dist/api-keys-client.d.ts.map +1 -0
- package/dist/api-keys-client.js +63 -0
- package/dist/api-keys-client.js.map +1 -0
- package/dist/api-keys.d.ts +48 -0
- package/dist/api-keys.d.ts.map +1 -0
- package/dist/api-keys.js +108 -0
- package/dist/api-keys.js.map +1 -0
- package/dist/cache.d.ts +123 -0
- package/dist/cache.d.ts.map +1 -0
- package/dist/cache.js +182 -0
- package/dist/cache.js.map +1 -0
- package/dist/checkout-signature.d.ts +15 -0
- package/dist/checkout-signature.d.ts.map +1 -0
- package/dist/checkout-signature.js +64 -0
- package/dist/checkout-signature.js.map +1 -0
- package/dist/conditions.d.ts +36 -0
- package/dist/conditions.d.ts.map +1 -0
- package/dist/conditions.js +396 -0
- package/dist/conditions.js.map +1 -0
- package/dist/countries.d.ts +5 -0
- package/dist/countries.d.ts.map +1 -0
- package/dist/countries.js +251 -0
- package/dist/countries.js.map +1 -0
- package/dist/currencies.d.ts +1011 -0
- package/dist/currencies.d.ts.map +1 -0
- package/dist/currencies.js +1011 -0
- package/dist/currencies.js.map +1 -0
- package/dist/email/send.d.ts +20 -0
- package/dist/email/send.d.ts.map +1 -0
- package/dist/email/send.js +53 -0
- package/dist/email/send.js.map +1 -0
- package/dist/form-runtime.d.ts +38 -0
- package/dist/form-runtime.d.ts.map +1 -0
- package/dist/form-runtime.js +174 -0
- package/dist/form-runtime.js.map +1 -0
- package/dist/gcs/storage.d.ts +23 -0
- package/dist/gcs/storage.d.ts.map +1 -0
- package/dist/gcs/storage.js +25 -0
- package/dist/gcs/storage.js.map +1 -0
- package/dist/geo.d.ts +85 -0
- package/dist/geo.d.ts.map +1 -0
- package/dist/geo.js +141 -0
- package/dist/geo.js.map +1 -0
- package/dist/geographic-regions.d.ts +66 -0
- package/dist/geographic-regions.d.ts.map +1 -0
- package/dist/geographic-regions.js +326 -0
- package/dist/geographic-regions.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -0
- package/dist/kms-aws.d.ts +26 -0
- package/dist/kms-aws.d.ts.map +1 -0
- package/dist/kms-aws.js +133 -0
- package/dist/kms-aws.js.map +1 -0
- package/dist/kms-crypto.d.ts +20 -0
- package/dist/kms-crypto.d.ts.map +1 -0
- package/dist/kms-crypto.js +108 -0
- package/dist/kms-crypto.js.map +1 -0
- package/dist/kms-env.d.ts +13 -0
- package/dist/kms-env.d.ts.map +1 -0
- package/dist/kms-env.js +13 -0
- package/dist/kms-env.js.map +1 -0
- package/dist/kms-gcp.d.ts +32 -0
- package/dist/kms-gcp.d.ts.map +1 -0
- package/dist/kms-gcp.js +116 -0
- package/dist/kms-gcp.js.map +1 -0
- package/dist/kms-local.d.ts +13 -0
- package/dist/kms-local.d.ts.map +1 -0
- package/dist/kms-local.js +13 -0
- package/dist/kms-local.js.map +1 -0
- package/dist/kms-symmetric.d.ts +14 -0
- package/dist/kms-symmetric.d.ts.map +1 -0
- package/dist/kms-symmetric.js +67 -0
- package/dist/kms-symmetric.js.map +1 -0
- package/dist/kms.d.ts +66 -0
- package/dist/kms.d.ts.map +1 -0
- package/dist/kms.js +169 -0
- package/dist/kms.js.map +1 -0
- package/dist/kv-codecs.d.ts +6 -0
- package/dist/kv-codecs.d.ts.map +1 -0
- package/dist/kv-codecs.js +4 -0
- package/dist/kv-codecs.js.map +1 -0
- package/dist/kv.d.ts +10 -0
- package/dist/kv.d.ts.map +1 -0
- package/dist/kv.js +18 -0
- package/dist/kv.js.map +1 -0
- package/dist/languages.d.ts +187 -0
- package/dist/languages.d.ts.map +1 -0
- package/dist/languages.js +187 -0
- package/dist/languages.js.map +1 -0
- package/dist/localized-countries-regions.d.ts +15 -0
- package/dist/localized-countries-regions.d.ts.map +1 -0
- package/dist/localized-countries-regions.js +674 -0
- package/dist/localized-countries-regions.js.map +1 -0
- package/dist/localized-regions.d.ts +33 -0
- package/dist/localized-regions.d.ts.map +1 -0
- package/dist/localized-regions.js +63 -0
- package/dist/localized-regions.js.map +1 -0
- package/dist/price/resolve.d.ts +91 -0
- package/dist/price/resolve.d.ts.map +1 -0
- package/dist/price/resolve.js +227 -0
- package/dist/price/resolve.js.map +1 -0
- package/dist/rate-limits.d.ts +39 -0
- package/dist/rate-limits.d.ts.map +1 -0
- package/dist/rate-limits.js +86 -0
- package/dist/rate-limits.js.map +1 -0
- package/dist/redis.d.ts +13 -0
- package/dist/redis.d.ts.map +1 -0
- package/dist/redis.js +16 -0
- package/dist/redis.js.map +1 -0
- package/dist/region-only.d.ts +11 -0
- package/dist/region-only.d.ts.map +1 -0
- package/dist/region-only.js +49 -0
- package/dist/region-only.js.map +1 -0
- package/dist/region.d.ts +11 -0
- package/dist/region.d.ts.map +1 -0
- package/dist/region.js +47 -0
- package/dist/region.js.map +1 -0
- package/dist/romania-bucharest-sectors.d.ts +6 -0
- package/dist/romania-bucharest-sectors.d.ts.map +1 -0
- package/dist/romania-bucharest-sectors.js +27 -0
- package/dist/romania-bucharest-sectors.js.map +1 -0
- package/dist/romania-counties.d.ts +6 -0
- package/dist/romania-counties.d.ts.map +1 -0
- package/dist/romania-counties.js +171 -0
- package/dist/romania-counties.js.map +1 -0
- package/dist/session-claims.d.ts +40 -0
- package/dist/session-claims.d.ts.map +1 -0
- package/dist/session-claims.js +184 -0
- package/dist/session-claims.js.map +1 -0
- package/dist/sms/provider.d.ts +28 -0
- package/dist/sms/provider.d.ts.map +1 -0
- package/dist/sms/provider.js +50 -0
- package/dist/sms/provider.js.map +1 -0
- package/dist/sms/segments.d.ts +3 -0
- package/dist/sms/segments.d.ts.map +1 -0
- package/dist/sms/segments.js +33 -0
- package/dist/sms/segments.js.map +1 -0
- package/dist/temporal.d.ts +2 -0
- package/dist/temporal.d.ts.map +1 -0
- package/dist/temporal.js +6 -0
- package/dist/temporal.js.map +1 -0
- package/dist/timezones.d.ts +9 -0
- package/dist/timezones.d.ts.map +1 -0
- package/dist/timezones.js +1217 -0
- package/dist/timezones.js.map +1 -0
- package/dist/twilio/client.d.ts +13 -0
- package/dist/twilio/client.d.ts.map +1 -0
- package/dist/twilio/client.js +26 -0
- package/dist/twilio/client.js.map +1 -0
- package/dist/usage/index.d.ts +34 -0
- package/dist/usage/index.d.ts.map +1 -0
- package/dist/usage/index.js +18 -0
- package/dist/usage/index.js.map +1 -0
- package/dist/usage/policy.d.ts +27 -0
- package/dist/usage/policy.d.ts.map +1 -0
- package/dist/usage/policy.js +17 -0
- package/dist/usage/policy.js.map +1 -0
- package/dist/validation/log.d.ts +10 -0
- package/dist/validation/log.d.ts.map +1 -0
- package/dist/validation/log.js +37 -0
- package/dist/validation/log.js.map +1 -0
- package/dist/with-timeout.d.ts +2 -0
- package/dist/with-timeout.d.ts.map +1 -0
- package/dist/with-timeout.js +15 -0
- package/dist/with-timeout.js.map +1 -0
- package/dist/zod-form-builder.d.ts +45 -0
- package/dist/zod-form-builder.d.ts.map +1 -0
- package/dist/zod-form-builder.js +216 -0
- package/dist/zod-form-builder.js.map +1 -0
- 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":"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"}
|
|
@@ -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"}
|