@peac/adapter-core 0.10.9 → 0.10.10
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 +1 -1
- package/dist/index.cjs +176 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.mjs +154 -0
- package/dist/index.mjs.map +1 -0
- package/package.json +15 -10
- package/dist/index.js +0 -37
- package/dist/index.js.map +0 -1
- package/dist/payment-proof.js +0 -13
- package/dist/payment-proof.js.map +0 -1
- package/dist/result.js +0 -105
- package/dist/result.js.map +0 -1
- package/dist/types.js +0 -6
- package/dist/types.js.map +0 -1
- package/dist/validators.js +0 -192
- package/dist/validators.js.map +0 -1
package/LICENSE
CHANGED
|
@@ -175,7 +175,7 @@ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
|
|
175
175
|
|
|
176
176
|
END OF TERMS AND CONDITIONS
|
|
177
177
|
|
|
178
|
-
Copyright 2025 PEAC Protocol Contributors
|
|
178
|
+
Copyright 2025-2026 PEAC Protocol Contributors
|
|
179
179
|
|
|
180
180
|
Licensed under the Apache License, Version 2.0 (the "License");
|
|
181
181
|
you may not use this file except in compliance with the License.
|
package/dist/index.cjs
ADDED
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
// src/result.ts
|
|
4
|
+
function ok(value) {
|
|
5
|
+
return { ok: true, value };
|
|
6
|
+
}
|
|
7
|
+
function err(error) {
|
|
8
|
+
return { ok: false, error };
|
|
9
|
+
}
|
|
10
|
+
function adapterErr(message, code, field) {
|
|
11
|
+
return err({ code, message, field });
|
|
12
|
+
}
|
|
13
|
+
function isOk(result) {
|
|
14
|
+
return result.ok;
|
|
15
|
+
}
|
|
16
|
+
function isErr(result) {
|
|
17
|
+
return !result.ok;
|
|
18
|
+
}
|
|
19
|
+
function map(result, fn) {
|
|
20
|
+
return result.ok ? ok(fn(result.value)) : result;
|
|
21
|
+
}
|
|
22
|
+
function mapErr(result, fn) {
|
|
23
|
+
return result.ok ? result : err(fn(result.error));
|
|
24
|
+
}
|
|
25
|
+
function chain(result, fn) {
|
|
26
|
+
return result.ok ? fn(result.value) : result;
|
|
27
|
+
}
|
|
28
|
+
function unwrap(result) {
|
|
29
|
+
if (result.ok) {
|
|
30
|
+
return result.value;
|
|
31
|
+
}
|
|
32
|
+
throw result.error;
|
|
33
|
+
}
|
|
34
|
+
function unwrapOr(result, defaultValue) {
|
|
35
|
+
return result.ok ? result.value : defaultValue;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
// src/validators.ts
|
|
39
|
+
function requireString(value, fieldName) {
|
|
40
|
+
if (typeof value !== "string" || value.trim() === "") {
|
|
41
|
+
return adapterErr(
|
|
42
|
+
`${fieldName} is required and must be a non-empty string`,
|
|
43
|
+
"missing_required_field",
|
|
44
|
+
fieldName
|
|
45
|
+
);
|
|
46
|
+
}
|
|
47
|
+
return ok(value);
|
|
48
|
+
}
|
|
49
|
+
function optionalString(value, fieldName) {
|
|
50
|
+
if (value === void 0 || value === null) {
|
|
51
|
+
return ok(void 0);
|
|
52
|
+
}
|
|
53
|
+
if (typeof value !== "string") {
|
|
54
|
+
return adapterErr(`${fieldName} must be a string if provided`, "validation_error", fieldName);
|
|
55
|
+
}
|
|
56
|
+
return ok(value);
|
|
57
|
+
}
|
|
58
|
+
function requireNumber(value, fieldName) {
|
|
59
|
+
if (typeof value !== "number" || !Number.isFinite(value)) {
|
|
60
|
+
return adapterErr(`${fieldName} must be a finite number`, "validation_error", fieldName);
|
|
61
|
+
}
|
|
62
|
+
return ok(value);
|
|
63
|
+
}
|
|
64
|
+
function requireAmount(value) {
|
|
65
|
+
if (typeof value !== "number") {
|
|
66
|
+
return adapterErr("amount must be a number", "invalid_amount", "amount");
|
|
67
|
+
}
|
|
68
|
+
if (!Number.isSafeInteger(value)) {
|
|
69
|
+
return adapterErr("amount must be a safe integer", "invalid_amount", "amount");
|
|
70
|
+
}
|
|
71
|
+
if (value < 0) {
|
|
72
|
+
return adapterErr("amount must be non-negative", "invalid_amount", "amount");
|
|
73
|
+
}
|
|
74
|
+
return ok(value);
|
|
75
|
+
}
|
|
76
|
+
function requireCurrency(value) {
|
|
77
|
+
if (typeof value !== "string") {
|
|
78
|
+
return adapterErr("currency must be a string", "invalid_currency", "currency");
|
|
79
|
+
}
|
|
80
|
+
const normalized = value.toUpperCase();
|
|
81
|
+
if (!/^[A-Z]{3}$/.test(normalized)) {
|
|
82
|
+
return adapterErr(
|
|
83
|
+
"currency must be a valid ISO 4217 code (3 uppercase letters)",
|
|
84
|
+
"invalid_currency",
|
|
85
|
+
"currency"
|
|
86
|
+
);
|
|
87
|
+
}
|
|
88
|
+
return ok(normalized);
|
|
89
|
+
}
|
|
90
|
+
function optionalNetwork(value) {
|
|
91
|
+
if (value === void 0 || value === null) {
|
|
92
|
+
return ok(void 0);
|
|
93
|
+
}
|
|
94
|
+
if (typeof value !== "string" || value.trim() === "") {
|
|
95
|
+
return adapterErr(
|
|
96
|
+
"network must be a non-empty string if provided",
|
|
97
|
+
"invalid_network",
|
|
98
|
+
"network"
|
|
99
|
+
);
|
|
100
|
+
}
|
|
101
|
+
return ok(value);
|
|
102
|
+
}
|
|
103
|
+
function requireObject(value, fieldName = "input") {
|
|
104
|
+
if (!value || typeof value !== "object" || Array.isArray(value)) {
|
|
105
|
+
return adapterErr(`${fieldName} must be a non-null object`, "parse_error", fieldName);
|
|
106
|
+
}
|
|
107
|
+
return ok(value);
|
|
108
|
+
}
|
|
109
|
+
function optionalTimestamp(value) {
|
|
110
|
+
if (value === void 0 || value === null) {
|
|
111
|
+
return ok(void 0);
|
|
112
|
+
}
|
|
113
|
+
if (typeof value === "string") {
|
|
114
|
+
return ok(value);
|
|
115
|
+
}
|
|
116
|
+
if (typeof value === "number" && Number.isSafeInteger(value) && value > 0) {
|
|
117
|
+
return ok(new Date(value * 1e3).toISOString());
|
|
118
|
+
}
|
|
119
|
+
return adapterErr(
|
|
120
|
+
"timestamp must be an ISO 8601 string or Unix seconds",
|
|
121
|
+
"validation_error",
|
|
122
|
+
"timestamp"
|
|
123
|
+
);
|
|
124
|
+
}
|
|
125
|
+
function optionalBoolean(value, fieldName) {
|
|
126
|
+
if (value === void 0 || value === null) {
|
|
127
|
+
return ok(void 0);
|
|
128
|
+
}
|
|
129
|
+
if (typeof value !== "boolean") {
|
|
130
|
+
return adapterErr(`${fieldName} must be a boolean if provided`, "validation_error", fieldName);
|
|
131
|
+
}
|
|
132
|
+
return ok(value);
|
|
133
|
+
}
|
|
134
|
+
function requireEnum(value, allowed, fieldName) {
|
|
135
|
+
if (typeof value !== "string") {
|
|
136
|
+
return adapterErr(`${fieldName} must be a string`, "validation_error", fieldName);
|
|
137
|
+
}
|
|
138
|
+
if (!allowed.includes(value)) {
|
|
139
|
+
return adapterErr(
|
|
140
|
+
`${fieldName} must be one of: ${allowed.join(", ")}`,
|
|
141
|
+
"validation_error",
|
|
142
|
+
fieldName
|
|
143
|
+
);
|
|
144
|
+
}
|
|
145
|
+
return ok(value);
|
|
146
|
+
}
|
|
147
|
+
function optionalEnum(value, allowed, fieldName) {
|
|
148
|
+
if (value === void 0 || value === null) {
|
|
149
|
+
return ok(void 0);
|
|
150
|
+
}
|
|
151
|
+
return requireEnum(value, allowed, fieldName);
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
exports.adapterErr = adapterErr;
|
|
155
|
+
exports.chain = chain;
|
|
156
|
+
exports.err = err;
|
|
157
|
+
exports.isErr = isErr;
|
|
158
|
+
exports.isOk = isOk;
|
|
159
|
+
exports.map = map;
|
|
160
|
+
exports.mapErr = mapErr;
|
|
161
|
+
exports.ok = ok;
|
|
162
|
+
exports.optionalBoolean = optionalBoolean;
|
|
163
|
+
exports.optionalEnum = optionalEnum;
|
|
164
|
+
exports.optionalNetwork = optionalNetwork;
|
|
165
|
+
exports.optionalString = optionalString;
|
|
166
|
+
exports.optionalTimestamp = optionalTimestamp;
|
|
167
|
+
exports.requireAmount = requireAmount;
|
|
168
|
+
exports.requireCurrency = requireCurrency;
|
|
169
|
+
exports.requireEnum = requireEnum;
|
|
170
|
+
exports.requireNumber = requireNumber;
|
|
171
|
+
exports.requireObject = requireObject;
|
|
172
|
+
exports.requireString = requireString;
|
|
173
|
+
exports.unwrap = unwrap;
|
|
174
|
+
exports.unwrapOr = unwrapOr;
|
|
175
|
+
//# sourceMappingURL=index.cjs.map
|
|
176
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/result.ts","../src/validators.ts"],"names":[],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Result type utilities for adapter operations\n *\n * Enforces \"never throws\" invariant - all adapter functions return Result<T>.\n */\n\nimport type { AdapterError, AdapterErrorCode } from './types.js';\n\n/**\n * Result type for adapter operations\n *\n * All adapter parsing/validation functions should return this type\n * instead of throwing exceptions. This makes error handling explicit\n * and predictable.\n *\n * @example\n * function parseEvent(input: unknown): Result<Event, AdapterError> {\n * if (!input) {\n * return adapterErr('input is required', 'missing_required_field');\n * }\n * return ok({ ... });\n * }\n */\nexport type Result<T, E = AdapterError> = { ok: true; value: T } | { ok: false; error: E };\n\n/**\n * Create a success result\n */\nexport function ok<T>(value: T): Result<T, never> {\n return { ok: true, value };\n}\n\n/**\n * Create a generic error result\n */\nexport function err<E>(error: E): Result<never, E> {\n return { ok: false, error };\n}\n\n/**\n * Create an adapter error result (convenience helper)\n *\n * @param message - Human-readable error message\n * @param code - Machine-readable error code\n * @param field - Optional field name that caused the error\n */\nexport function adapterErr(\n message: string,\n code: AdapterErrorCode,\n field?: string\n): Result<never, AdapterError> {\n return err({ code, message, field });\n}\n\n/**\n * Check if result is ok (type guard)\n */\nexport function isOk<T, E>(result: Result<T, E>): result is { ok: true; value: T } {\n return result.ok;\n}\n\n/**\n * Check if result is error (type guard)\n */\nexport function isErr<T, E>(result: Result<T, E>): result is { ok: false; error: E } {\n return !result.ok;\n}\n\n/**\n * Map over a successful result\n *\n * @example\n * const result = ok(5);\n * const doubled = map(result, x => x * 2); // ok(10)\n */\nexport function map<T, U, E>(result: Result<T, E>, fn: (value: T) => U): Result<U, E> {\n return result.ok ? ok(fn(result.value)) : result;\n}\n\n/**\n * Map over an error result\n *\n * @example\n * const result = err({ message: 'oops' });\n * const mapped = mapErr(result, e => ({ ...e, prefix: 'Error: ' }));\n */\nexport function mapErr<T, E, F>(result: Result<T, E>, fn: (error: E) => F): Result<T, F> {\n return result.ok ? result : err(fn(result.error));\n}\n\n/**\n * Chain results (flatMap/bind)\n *\n * @example\n * const parseNumber = (s: string): Result<number, string> => {\n * const n = parseInt(s);\n * return isNaN(n) ? err('not a number') : ok(n);\n * };\n *\n * const result = chain(ok('42'), parseNumber); // ok(42)\n */\nexport function chain<T, U, E>(result: Result<T, E>, fn: (value: T) => Result<U, E>): Result<U, E> {\n return result.ok ? fn(result.value) : result;\n}\n\n/**\n * Unwrap a result, throwing if it's an error\n *\n * Use sparingly - prefer explicit error handling.\n *\n * @throws The error value if result is an error\n */\nexport function unwrap<T, E>(result: Result<T, E>): T {\n if (result.ok) {\n return result.value;\n }\n throw result.error;\n}\n\n/**\n * Unwrap a result with a default value for errors\n */\nexport function unwrapOr<T, E>(result: Result<T, E>, defaultValue: T): T {\n return result.ok ? result.value : defaultValue;\n}\n","/**\n * Shared validators for PEAC payment rail adapters\n *\n * These validators enforce consistent validation logic across all adapters.\n * They follow the \"never throws\" pattern using Result types.\n */\n\nimport { adapterErr, ok, type Result } from './result.js';\nimport type { AdapterError } from './types.js';\n\n/**\n * Validate required string field\n *\n * @param value - Value to validate\n * @param fieldName - Field name for error messages\n * @returns Result with string value or error\n */\nexport function requireString(value: unknown, fieldName: string): Result<string, AdapterError> {\n if (typeof value !== 'string' || value.trim() === '') {\n return adapterErr(\n `${fieldName} is required and must be a non-empty string`,\n 'missing_required_field',\n fieldName\n );\n }\n return ok(value);\n}\n\n/**\n * Validate optional string field\n *\n * @param value - Value to validate\n * @param fieldName - Field name for error messages\n * @returns Result with string value, undefined, or error\n */\nexport function optionalString(\n value: unknown,\n fieldName: string\n): Result<string | undefined, AdapterError> {\n if (value === undefined || value === null) {\n return ok(undefined);\n }\n if (typeof value !== 'string') {\n return adapterErr(`${fieldName} must be a string if provided`, 'validation_error', fieldName);\n }\n return ok(value);\n}\n\n/**\n * Validate required number field\n *\n * @param value - Value to validate\n * @param fieldName - Field name for error messages\n * @returns Result with number value or error\n */\nexport function requireNumber(value: unknown, fieldName: string): Result<number, AdapterError> {\n if (typeof value !== 'number' || !Number.isFinite(value)) {\n return adapterErr(`${fieldName} must be a finite number`, 'validation_error', fieldName);\n }\n return ok(value);\n}\n\n/**\n * Validate amount (must be safe non-negative integer in minor units)\n *\n * @param value - Value to validate\n * @returns Result with amount or error\n */\nexport function requireAmount(value: unknown): Result<number, AdapterError> {\n if (typeof value !== 'number') {\n return adapterErr('amount must be a number', 'invalid_amount', 'amount');\n }\n if (!Number.isSafeInteger(value)) {\n return adapterErr('amount must be a safe integer', 'invalid_amount', 'amount');\n }\n if (value < 0) {\n return adapterErr('amount must be non-negative', 'invalid_amount', 'amount');\n }\n return ok(value);\n}\n\n/**\n * Validate currency code (ISO 4217, uppercase)\n *\n * @param value - Value to validate\n * @returns Result with normalized currency code or error\n */\nexport function requireCurrency(value: unknown): Result<string, AdapterError> {\n if (typeof value !== 'string') {\n return adapterErr('currency must be a string', 'invalid_currency', 'currency');\n }\n const normalized = value.toUpperCase();\n if (!/^[A-Z]{3}$/.test(normalized)) {\n return adapterErr(\n 'currency must be a valid ISO 4217 code (3 uppercase letters)',\n 'invalid_currency',\n 'currency'\n );\n }\n return ok(normalized);\n}\n\n/**\n * Validate optional network identifier (CAIP-2 format preferred)\n *\n * @param value - Value to validate\n * @returns Result with network string, undefined, or error\n */\nexport function optionalNetwork(value: unknown): Result<string | undefined, AdapterError> {\n if (value === undefined || value === null) {\n return ok(undefined);\n }\n if (typeof value !== 'string' || value.trim() === '') {\n return adapterErr(\n 'network must be a non-empty string if provided',\n 'invalid_network',\n 'network'\n );\n }\n return ok(value);\n}\n\n/**\n * Parse object safely (for webhook payloads)\n *\n * @param value - Value to validate\n * @param fieldName - Field name for error messages\n * @returns Result with object or error\n */\nexport function requireObject(\n value: unknown,\n fieldName: string = 'input'\n): Result<Record<string, unknown>, AdapterError> {\n if (!value || typeof value !== 'object' || Array.isArray(value)) {\n return adapterErr(`${fieldName} must be a non-null object`, 'parse_error', fieldName);\n }\n return ok(value as Record<string, unknown>);\n}\n\n/**\n * Validate optional timestamp (ISO 8601 string or Unix seconds)\n *\n * @param value - Value to validate\n * @returns Result with ISO 8601 string, undefined, or error\n */\nexport function optionalTimestamp(value: unknown): Result<string | undefined, AdapterError> {\n if (value === undefined || value === null) {\n return ok(undefined);\n }\n if (typeof value === 'string') {\n // Accept ISO 8601 strings as-is\n return ok(value);\n }\n if (typeof value === 'number' && Number.isSafeInteger(value) && value > 0) {\n // Convert Unix seconds to ISO string\n return ok(new Date(value * 1000).toISOString());\n }\n return adapterErr(\n 'timestamp must be an ISO 8601 string or Unix seconds',\n 'validation_error',\n 'timestamp'\n );\n}\n\n/**\n * Validate optional boolean field\n *\n * @param value - Value to validate\n * @param fieldName - Field name for error messages\n * @returns Result with boolean value, undefined, or error\n */\nexport function optionalBoolean(\n value: unknown,\n fieldName: string\n): Result<boolean | undefined, AdapterError> {\n if (value === undefined || value === null) {\n return ok(undefined);\n }\n if (typeof value !== 'boolean') {\n return adapterErr(`${fieldName} must be a boolean if provided`, 'validation_error', fieldName);\n }\n return ok(value);\n}\n\n/**\n * Validate enum value\n *\n * @param value - Value to validate\n * @param allowed - Array of allowed values\n * @param fieldName - Field name for error messages\n * @returns Result with validated value or error\n */\nexport function requireEnum<T extends string>(\n value: unknown,\n allowed: readonly T[],\n fieldName: string\n): Result<T, AdapterError> {\n if (typeof value !== 'string') {\n return adapterErr(`${fieldName} must be a string`, 'validation_error', fieldName);\n }\n if (!allowed.includes(value as T)) {\n return adapterErr(\n `${fieldName} must be one of: ${allowed.join(', ')}`,\n 'validation_error',\n fieldName\n );\n }\n return ok(value as T);\n}\n\n/**\n * Validate optional enum value\n *\n * @param value - Value to validate\n * @param allowed - Array of allowed values\n * @param fieldName - Field name for error messages\n * @returns Result with validated value, undefined, or error\n */\nexport function optionalEnum<T extends string>(\n value: unknown,\n allowed: readonly T[],\n fieldName: string\n): Result<T | undefined, AdapterError> {\n if (value === undefined || value === null) {\n return ok(undefined);\n }\n return requireEnum(value, allowed, fieldName);\n}\n"]}
|
package/dist/index.mjs
ADDED
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
// src/result.ts
|
|
2
|
+
function ok(value) {
|
|
3
|
+
return { ok: true, value };
|
|
4
|
+
}
|
|
5
|
+
function err(error) {
|
|
6
|
+
return { ok: false, error };
|
|
7
|
+
}
|
|
8
|
+
function adapterErr(message, code, field) {
|
|
9
|
+
return err({ code, message, field });
|
|
10
|
+
}
|
|
11
|
+
function isOk(result) {
|
|
12
|
+
return result.ok;
|
|
13
|
+
}
|
|
14
|
+
function isErr(result) {
|
|
15
|
+
return !result.ok;
|
|
16
|
+
}
|
|
17
|
+
function map(result, fn) {
|
|
18
|
+
return result.ok ? ok(fn(result.value)) : result;
|
|
19
|
+
}
|
|
20
|
+
function mapErr(result, fn) {
|
|
21
|
+
return result.ok ? result : err(fn(result.error));
|
|
22
|
+
}
|
|
23
|
+
function chain(result, fn) {
|
|
24
|
+
return result.ok ? fn(result.value) : result;
|
|
25
|
+
}
|
|
26
|
+
function unwrap(result) {
|
|
27
|
+
if (result.ok) {
|
|
28
|
+
return result.value;
|
|
29
|
+
}
|
|
30
|
+
throw result.error;
|
|
31
|
+
}
|
|
32
|
+
function unwrapOr(result, defaultValue) {
|
|
33
|
+
return result.ok ? result.value : defaultValue;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
// src/validators.ts
|
|
37
|
+
function requireString(value, fieldName) {
|
|
38
|
+
if (typeof value !== "string" || value.trim() === "") {
|
|
39
|
+
return adapterErr(
|
|
40
|
+
`${fieldName} is required and must be a non-empty string`,
|
|
41
|
+
"missing_required_field",
|
|
42
|
+
fieldName
|
|
43
|
+
);
|
|
44
|
+
}
|
|
45
|
+
return ok(value);
|
|
46
|
+
}
|
|
47
|
+
function optionalString(value, fieldName) {
|
|
48
|
+
if (value === void 0 || value === null) {
|
|
49
|
+
return ok(void 0);
|
|
50
|
+
}
|
|
51
|
+
if (typeof value !== "string") {
|
|
52
|
+
return adapterErr(`${fieldName} must be a string if provided`, "validation_error", fieldName);
|
|
53
|
+
}
|
|
54
|
+
return ok(value);
|
|
55
|
+
}
|
|
56
|
+
function requireNumber(value, fieldName) {
|
|
57
|
+
if (typeof value !== "number" || !Number.isFinite(value)) {
|
|
58
|
+
return adapterErr(`${fieldName} must be a finite number`, "validation_error", fieldName);
|
|
59
|
+
}
|
|
60
|
+
return ok(value);
|
|
61
|
+
}
|
|
62
|
+
function requireAmount(value) {
|
|
63
|
+
if (typeof value !== "number") {
|
|
64
|
+
return adapterErr("amount must be a number", "invalid_amount", "amount");
|
|
65
|
+
}
|
|
66
|
+
if (!Number.isSafeInteger(value)) {
|
|
67
|
+
return adapterErr("amount must be a safe integer", "invalid_amount", "amount");
|
|
68
|
+
}
|
|
69
|
+
if (value < 0) {
|
|
70
|
+
return adapterErr("amount must be non-negative", "invalid_amount", "amount");
|
|
71
|
+
}
|
|
72
|
+
return ok(value);
|
|
73
|
+
}
|
|
74
|
+
function requireCurrency(value) {
|
|
75
|
+
if (typeof value !== "string") {
|
|
76
|
+
return adapterErr("currency must be a string", "invalid_currency", "currency");
|
|
77
|
+
}
|
|
78
|
+
const normalized = value.toUpperCase();
|
|
79
|
+
if (!/^[A-Z]{3}$/.test(normalized)) {
|
|
80
|
+
return adapterErr(
|
|
81
|
+
"currency must be a valid ISO 4217 code (3 uppercase letters)",
|
|
82
|
+
"invalid_currency",
|
|
83
|
+
"currency"
|
|
84
|
+
);
|
|
85
|
+
}
|
|
86
|
+
return ok(normalized);
|
|
87
|
+
}
|
|
88
|
+
function optionalNetwork(value) {
|
|
89
|
+
if (value === void 0 || value === null) {
|
|
90
|
+
return ok(void 0);
|
|
91
|
+
}
|
|
92
|
+
if (typeof value !== "string" || value.trim() === "") {
|
|
93
|
+
return adapterErr(
|
|
94
|
+
"network must be a non-empty string if provided",
|
|
95
|
+
"invalid_network",
|
|
96
|
+
"network"
|
|
97
|
+
);
|
|
98
|
+
}
|
|
99
|
+
return ok(value);
|
|
100
|
+
}
|
|
101
|
+
function requireObject(value, fieldName = "input") {
|
|
102
|
+
if (!value || typeof value !== "object" || Array.isArray(value)) {
|
|
103
|
+
return adapterErr(`${fieldName} must be a non-null object`, "parse_error", fieldName);
|
|
104
|
+
}
|
|
105
|
+
return ok(value);
|
|
106
|
+
}
|
|
107
|
+
function optionalTimestamp(value) {
|
|
108
|
+
if (value === void 0 || value === null) {
|
|
109
|
+
return ok(void 0);
|
|
110
|
+
}
|
|
111
|
+
if (typeof value === "string") {
|
|
112
|
+
return ok(value);
|
|
113
|
+
}
|
|
114
|
+
if (typeof value === "number" && Number.isSafeInteger(value) && value > 0) {
|
|
115
|
+
return ok(new Date(value * 1e3).toISOString());
|
|
116
|
+
}
|
|
117
|
+
return adapterErr(
|
|
118
|
+
"timestamp must be an ISO 8601 string or Unix seconds",
|
|
119
|
+
"validation_error",
|
|
120
|
+
"timestamp"
|
|
121
|
+
);
|
|
122
|
+
}
|
|
123
|
+
function optionalBoolean(value, fieldName) {
|
|
124
|
+
if (value === void 0 || value === null) {
|
|
125
|
+
return ok(void 0);
|
|
126
|
+
}
|
|
127
|
+
if (typeof value !== "boolean") {
|
|
128
|
+
return adapterErr(`${fieldName} must be a boolean if provided`, "validation_error", fieldName);
|
|
129
|
+
}
|
|
130
|
+
return ok(value);
|
|
131
|
+
}
|
|
132
|
+
function requireEnum(value, allowed, fieldName) {
|
|
133
|
+
if (typeof value !== "string") {
|
|
134
|
+
return adapterErr(`${fieldName} must be a string`, "validation_error", fieldName);
|
|
135
|
+
}
|
|
136
|
+
if (!allowed.includes(value)) {
|
|
137
|
+
return adapterErr(
|
|
138
|
+
`${fieldName} must be one of: ${allowed.join(", ")}`,
|
|
139
|
+
"validation_error",
|
|
140
|
+
fieldName
|
|
141
|
+
);
|
|
142
|
+
}
|
|
143
|
+
return ok(value);
|
|
144
|
+
}
|
|
145
|
+
function optionalEnum(value, allowed, fieldName) {
|
|
146
|
+
if (value === void 0 || value === null) {
|
|
147
|
+
return ok(void 0);
|
|
148
|
+
}
|
|
149
|
+
return requireEnum(value, allowed, fieldName);
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
export { adapterErr, chain, err, isErr, isOk, map, mapErr, ok, optionalBoolean, optionalEnum, optionalNetwork, optionalString, optionalTimestamp, requireAmount, requireCurrency, requireEnum, requireNumber, requireObject, requireString, unwrap, unwrapOr };
|
|
153
|
+
//# sourceMappingURL=index.mjs.map
|
|
154
|
+
//# sourceMappingURL=index.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/result.ts","../src/validators.ts"],"names":[],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * Result type utilities for adapter operations\n *\n * Enforces \"never throws\" invariant - all adapter functions return Result<T>.\n */\n\nimport type { AdapterError, AdapterErrorCode } from './types.js';\n\n/**\n * Result type for adapter operations\n *\n * All adapter parsing/validation functions should return this type\n * instead of throwing exceptions. This makes error handling explicit\n * and predictable.\n *\n * @example\n * function parseEvent(input: unknown): Result<Event, AdapterError> {\n * if (!input) {\n * return adapterErr('input is required', 'missing_required_field');\n * }\n * return ok({ ... });\n * }\n */\nexport type Result<T, E = AdapterError> = { ok: true; value: T } | { ok: false; error: E };\n\n/**\n * Create a success result\n */\nexport function ok<T>(value: T): Result<T, never> {\n return { ok: true, value };\n}\n\n/**\n * Create a generic error result\n */\nexport function err<E>(error: E): Result<never, E> {\n return { ok: false, error };\n}\n\n/**\n * Create an adapter error result (convenience helper)\n *\n * @param message - Human-readable error message\n * @param code - Machine-readable error code\n * @param field - Optional field name that caused the error\n */\nexport function adapterErr(\n message: string,\n code: AdapterErrorCode,\n field?: string\n): Result<never, AdapterError> {\n return err({ code, message, field });\n}\n\n/**\n * Check if result is ok (type guard)\n */\nexport function isOk<T, E>(result: Result<T, E>): result is { ok: true; value: T } {\n return result.ok;\n}\n\n/**\n * Check if result is error (type guard)\n */\nexport function isErr<T, E>(result: Result<T, E>): result is { ok: false; error: E } {\n return !result.ok;\n}\n\n/**\n * Map over a successful result\n *\n * @example\n * const result = ok(5);\n * const doubled = map(result, x => x * 2); // ok(10)\n */\nexport function map<T, U, E>(result: Result<T, E>, fn: (value: T) => U): Result<U, E> {\n return result.ok ? ok(fn(result.value)) : result;\n}\n\n/**\n * Map over an error result\n *\n * @example\n * const result = err({ message: 'oops' });\n * const mapped = mapErr(result, e => ({ ...e, prefix: 'Error: ' }));\n */\nexport function mapErr<T, E, F>(result: Result<T, E>, fn: (error: E) => F): Result<T, F> {\n return result.ok ? result : err(fn(result.error));\n}\n\n/**\n * Chain results (flatMap/bind)\n *\n * @example\n * const parseNumber = (s: string): Result<number, string> => {\n * const n = parseInt(s);\n * return isNaN(n) ? err('not a number') : ok(n);\n * };\n *\n * const result = chain(ok('42'), parseNumber); // ok(42)\n */\nexport function chain<T, U, E>(result: Result<T, E>, fn: (value: T) => Result<U, E>): Result<U, E> {\n return result.ok ? fn(result.value) : result;\n}\n\n/**\n * Unwrap a result, throwing if it's an error\n *\n * Use sparingly - prefer explicit error handling.\n *\n * @throws The error value if result is an error\n */\nexport function unwrap<T, E>(result: Result<T, E>): T {\n if (result.ok) {\n return result.value;\n }\n throw result.error;\n}\n\n/**\n * Unwrap a result with a default value for errors\n */\nexport function unwrapOr<T, E>(result: Result<T, E>, defaultValue: T): T {\n return result.ok ? result.value : defaultValue;\n}\n","/**\n * Shared validators for PEAC payment rail adapters\n *\n * These validators enforce consistent validation logic across all adapters.\n * They follow the \"never throws\" pattern using Result types.\n */\n\nimport { adapterErr, ok, type Result } from './result.js';\nimport type { AdapterError } from './types.js';\n\n/**\n * Validate required string field\n *\n * @param value - Value to validate\n * @param fieldName - Field name for error messages\n * @returns Result with string value or error\n */\nexport function requireString(value: unknown, fieldName: string): Result<string, AdapterError> {\n if (typeof value !== 'string' || value.trim() === '') {\n return adapterErr(\n `${fieldName} is required and must be a non-empty string`,\n 'missing_required_field',\n fieldName\n );\n }\n return ok(value);\n}\n\n/**\n * Validate optional string field\n *\n * @param value - Value to validate\n * @param fieldName - Field name for error messages\n * @returns Result with string value, undefined, or error\n */\nexport function optionalString(\n value: unknown,\n fieldName: string\n): Result<string | undefined, AdapterError> {\n if (value === undefined || value === null) {\n return ok(undefined);\n }\n if (typeof value !== 'string') {\n return adapterErr(`${fieldName} must be a string if provided`, 'validation_error', fieldName);\n }\n return ok(value);\n}\n\n/**\n * Validate required number field\n *\n * @param value - Value to validate\n * @param fieldName - Field name for error messages\n * @returns Result with number value or error\n */\nexport function requireNumber(value: unknown, fieldName: string): Result<number, AdapterError> {\n if (typeof value !== 'number' || !Number.isFinite(value)) {\n return adapterErr(`${fieldName} must be a finite number`, 'validation_error', fieldName);\n }\n return ok(value);\n}\n\n/**\n * Validate amount (must be safe non-negative integer in minor units)\n *\n * @param value - Value to validate\n * @returns Result with amount or error\n */\nexport function requireAmount(value: unknown): Result<number, AdapterError> {\n if (typeof value !== 'number') {\n return adapterErr('amount must be a number', 'invalid_amount', 'amount');\n }\n if (!Number.isSafeInteger(value)) {\n return adapterErr('amount must be a safe integer', 'invalid_amount', 'amount');\n }\n if (value < 0) {\n return adapterErr('amount must be non-negative', 'invalid_amount', 'amount');\n }\n return ok(value);\n}\n\n/**\n * Validate currency code (ISO 4217, uppercase)\n *\n * @param value - Value to validate\n * @returns Result with normalized currency code or error\n */\nexport function requireCurrency(value: unknown): Result<string, AdapterError> {\n if (typeof value !== 'string') {\n return adapterErr('currency must be a string', 'invalid_currency', 'currency');\n }\n const normalized = value.toUpperCase();\n if (!/^[A-Z]{3}$/.test(normalized)) {\n return adapterErr(\n 'currency must be a valid ISO 4217 code (3 uppercase letters)',\n 'invalid_currency',\n 'currency'\n );\n }\n return ok(normalized);\n}\n\n/**\n * Validate optional network identifier (CAIP-2 format preferred)\n *\n * @param value - Value to validate\n * @returns Result with network string, undefined, or error\n */\nexport function optionalNetwork(value: unknown): Result<string | undefined, AdapterError> {\n if (value === undefined || value === null) {\n return ok(undefined);\n }\n if (typeof value !== 'string' || value.trim() === '') {\n return adapterErr(\n 'network must be a non-empty string if provided',\n 'invalid_network',\n 'network'\n );\n }\n return ok(value);\n}\n\n/**\n * Parse object safely (for webhook payloads)\n *\n * @param value - Value to validate\n * @param fieldName - Field name for error messages\n * @returns Result with object or error\n */\nexport function requireObject(\n value: unknown,\n fieldName: string = 'input'\n): Result<Record<string, unknown>, AdapterError> {\n if (!value || typeof value !== 'object' || Array.isArray(value)) {\n return adapterErr(`${fieldName} must be a non-null object`, 'parse_error', fieldName);\n }\n return ok(value as Record<string, unknown>);\n}\n\n/**\n * Validate optional timestamp (ISO 8601 string or Unix seconds)\n *\n * @param value - Value to validate\n * @returns Result with ISO 8601 string, undefined, or error\n */\nexport function optionalTimestamp(value: unknown): Result<string | undefined, AdapterError> {\n if (value === undefined || value === null) {\n return ok(undefined);\n }\n if (typeof value === 'string') {\n // Accept ISO 8601 strings as-is\n return ok(value);\n }\n if (typeof value === 'number' && Number.isSafeInteger(value) && value > 0) {\n // Convert Unix seconds to ISO string\n return ok(new Date(value * 1000).toISOString());\n }\n return adapterErr(\n 'timestamp must be an ISO 8601 string or Unix seconds',\n 'validation_error',\n 'timestamp'\n );\n}\n\n/**\n * Validate optional boolean field\n *\n * @param value - Value to validate\n * @param fieldName - Field name for error messages\n * @returns Result with boolean value, undefined, or error\n */\nexport function optionalBoolean(\n value: unknown,\n fieldName: string\n): Result<boolean | undefined, AdapterError> {\n if (value === undefined || value === null) {\n return ok(undefined);\n }\n if (typeof value !== 'boolean') {\n return adapterErr(`${fieldName} must be a boolean if provided`, 'validation_error', fieldName);\n }\n return ok(value);\n}\n\n/**\n * Validate enum value\n *\n * @param value - Value to validate\n * @param allowed - Array of allowed values\n * @param fieldName - Field name for error messages\n * @returns Result with validated value or error\n */\nexport function requireEnum<T extends string>(\n value: unknown,\n allowed: readonly T[],\n fieldName: string\n): Result<T, AdapterError> {\n if (typeof value !== 'string') {\n return adapterErr(`${fieldName} must be a string`, 'validation_error', fieldName);\n }\n if (!allowed.includes(value as T)) {\n return adapterErr(\n `${fieldName} must be one of: ${allowed.join(', ')}`,\n 'validation_error',\n fieldName\n );\n }\n return ok(value as T);\n}\n\n/**\n * Validate optional enum value\n *\n * @param value - Value to validate\n * @param allowed - Array of allowed values\n * @param fieldName - Field name for error messages\n * @returns Result with validated value, undefined, or error\n */\nexport function optionalEnum<T extends string>(\n value: unknown,\n allowed: readonly T[],\n fieldName: string\n): Result<T | undefined, AdapterError> {\n if (value === undefined || value === null) {\n return ok(undefined);\n }\n return requireEnum(value, allowed, fieldName);\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,16 +1,17 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@peac/adapter-core",
|
|
3
|
-
"version": "0.10.
|
|
3
|
+
"version": "0.10.10",
|
|
4
4
|
"description": "Shared utilities for PEAC payment rail adapters",
|
|
5
|
-
"main": "dist/index.
|
|
5
|
+
"main": "dist/index.cjs",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
7
7
|
"exports": {
|
|
8
8
|
".": {
|
|
9
9
|
"types": "./dist/index.d.ts",
|
|
10
|
-
"import": "./dist/index.
|
|
11
|
-
"require": "./dist/index.
|
|
12
|
-
"default": "./dist/index.
|
|
13
|
-
}
|
|
10
|
+
"import": "./dist/index.mjs",
|
|
11
|
+
"require": "./dist/index.cjs",
|
|
12
|
+
"default": "./dist/index.mjs"
|
|
13
|
+
},
|
|
14
|
+
"./package.json": "./package.json"
|
|
14
15
|
},
|
|
15
16
|
"repository": {
|
|
16
17
|
"type": "git",
|
|
@@ -27,17 +28,21 @@
|
|
|
27
28
|
"access": "public"
|
|
28
29
|
},
|
|
29
30
|
"dependencies": {
|
|
30
|
-
"@peac/kernel": "0.10.
|
|
31
|
+
"@peac/kernel": "0.10.10"
|
|
31
32
|
},
|
|
32
33
|
"devDependencies": {
|
|
33
34
|
"@types/node": "^20.10.0",
|
|
34
35
|
"typescript": "^5.3.3",
|
|
35
|
-
"vitest": "^
|
|
36
|
+
"vitest": "^4.0.0",
|
|
37
|
+
"tsup": "^8.0.0"
|
|
36
38
|
},
|
|
37
39
|
"scripts": {
|
|
38
|
-
"
|
|
40
|
+
"prebuild": "rm -rf dist",
|
|
41
|
+
"build": "pnpm run build:js && pnpm run build:types",
|
|
39
42
|
"test": "vitest run",
|
|
40
43
|
"test:watch": "vitest",
|
|
41
|
-
"clean": "rm -rf dist"
|
|
44
|
+
"clean": "rm -rf dist",
|
|
45
|
+
"build:js": "tsup",
|
|
46
|
+
"build:types": "rm -f dist/.tsbuildinfo && tsc && rm -f dist/.tsbuildinfo"
|
|
42
47
|
}
|
|
43
48
|
}
|
package/dist/index.js
DELETED
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
/**
|
|
3
|
-
* PEAC Adapter Core
|
|
4
|
-
*
|
|
5
|
-
* Shared utilities for PEAC payment rail adapters.
|
|
6
|
-
* Provides Result types and validators for consistent adapter implementation.
|
|
7
|
-
*
|
|
8
|
-
* @packageDocumentation
|
|
9
|
-
*/
|
|
10
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
11
|
-
exports.optionalEnum = exports.requireEnum = exports.optionalBoolean = exports.optionalTimestamp = exports.requireObject = exports.optionalNetwork = exports.requireCurrency = exports.requireAmount = exports.requireNumber = exports.optionalString = exports.requireString = exports.unwrapOr = exports.unwrap = exports.chain = exports.mapErr = exports.map = exports.isErr = exports.isOk = exports.adapterErr = exports.err = exports.ok = void 0;
|
|
12
|
-
// Result utilities
|
|
13
|
-
var result_js_1 = require("./result.js");
|
|
14
|
-
Object.defineProperty(exports, "ok", { enumerable: true, get: function () { return result_js_1.ok; } });
|
|
15
|
-
Object.defineProperty(exports, "err", { enumerable: true, get: function () { return result_js_1.err; } });
|
|
16
|
-
Object.defineProperty(exports, "adapterErr", { enumerable: true, get: function () { return result_js_1.adapterErr; } });
|
|
17
|
-
Object.defineProperty(exports, "isOk", { enumerable: true, get: function () { return result_js_1.isOk; } });
|
|
18
|
-
Object.defineProperty(exports, "isErr", { enumerable: true, get: function () { return result_js_1.isErr; } });
|
|
19
|
-
Object.defineProperty(exports, "map", { enumerable: true, get: function () { return result_js_1.map; } });
|
|
20
|
-
Object.defineProperty(exports, "mapErr", { enumerable: true, get: function () { return result_js_1.mapErr; } });
|
|
21
|
-
Object.defineProperty(exports, "chain", { enumerable: true, get: function () { return result_js_1.chain; } });
|
|
22
|
-
Object.defineProperty(exports, "unwrap", { enumerable: true, get: function () { return result_js_1.unwrap; } });
|
|
23
|
-
Object.defineProperty(exports, "unwrapOr", { enumerable: true, get: function () { return result_js_1.unwrapOr; } });
|
|
24
|
-
// Validators
|
|
25
|
-
var validators_js_1 = require("./validators.js");
|
|
26
|
-
Object.defineProperty(exports, "requireString", { enumerable: true, get: function () { return validators_js_1.requireString; } });
|
|
27
|
-
Object.defineProperty(exports, "optionalString", { enumerable: true, get: function () { return validators_js_1.optionalString; } });
|
|
28
|
-
Object.defineProperty(exports, "requireNumber", { enumerable: true, get: function () { return validators_js_1.requireNumber; } });
|
|
29
|
-
Object.defineProperty(exports, "requireAmount", { enumerable: true, get: function () { return validators_js_1.requireAmount; } });
|
|
30
|
-
Object.defineProperty(exports, "requireCurrency", { enumerable: true, get: function () { return validators_js_1.requireCurrency; } });
|
|
31
|
-
Object.defineProperty(exports, "optionalNetwork", { enumerable: true, get: function () { return validators_js_1.optionalNetwork; } });
|
|
32
|
-
Object.defineProperty(exports, "requireObject", { enumerable: true, get: function () { return validators_js_1.requireObject; } });
|
|
33
|
-
Object.defineProperty(exports, "optionalTimestamp", { enumerable: true, get: function () { return validators_js_1.optionalTimestamp; } });
|
|
34
|
-
Object.defineProperty(exports, "optionalBoolean", { enumerable: true, get: function () { return validators_js_1.optionalBoolean; } });
|
|
35
|
-
Object.defineProperty(exports, "requireEnum", { enumerable: true, get: function () { return validators_js_1.requireEnum; } });
|
|
36
|
-
Object.defineProperty(exports, "optionalEnum", { enumerable: true, get: function () { return validators_js_1.optionalEnum; } });
|
|
37
|
-
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA;;;;;;;GAOG;;;AAKH,mBAAmB;AACnB,yCAYqB;AAVnB,+FAAA,EAAE,OAAA;AACF,gGAAA,GAAG,OAAA;AACH,uGAAA,UAAU,OAAA;AACV,iGAAA,IAAI,OAAA;AACJ,kGAAA,KAAK,OAAA;AACL,gGAAA,GAAG,OAAA;AACH,mGAAA,MAAM,OAAA;AACN,kGAAA,KAAK,OAAA;AACL,mGAAA,MAAM,OAAA;AACN,qGAAA,QAAQ,OAAA;AAMV,aAAa;AACb,iDAYyB;AAXvB,8GAAA,aAAa,OAAA;AACb,+GAAA,cAAc,OAAA;AACd,8GAAA,aAAa,OAAA;AACb,8GAAA,aAAa,OAAA;AACb,gHAAA,eAAe,OAAA;AACf,gHAAA,eAAe,OAAA;AACf,8GAAA,aAAa,OAAA;AACb,kHAAA,iBAAiB,OAAA;AACjB,gHAAA,eAAe,OAAA;AACf,4GAAA,WAAW,OAAA;AACX,6GAAA,YAAY,OAAA"}
|
package/dist/payment-proof.js
DELETED
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
/**
|
|
3
|
-
* Payment Proof Adapter Interface
|
|
4
|
-
*
|
|
5
|
-
* Defines the contract that all payment proof adapters must implement.
|
|
6
|
-
* This interface ensures consistency across different payment protocols
|
|
7
|
-
* (x402, Stripe, UPI, Lightning, etc.) while allowing protocol-specific
|
|
8
|
-
* implementations.
|
|
9
|
-
*
|
|
10
|
-
* @packageDocumentation
|
|
11
|
-
*/
|
|
12
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
|
-
//# sourceMappingURL=payment-proof.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"payment-proof.js","sourceRoot":"","sources":["../src/payment-proof.ts"],"names":[],"mappings":";AAAA;;;;;;;;;GASG"}
|
package/dist/result.js
DELETED
|
@@ -1,105 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
/**
|
|
3
|
-
* Result type utilities for adapter operations
|
|
4
|
-
*
|
|
5
|
-
* Enforces "never throws" invariant - all adapter functions return Result<T>.
|
|
6
|
-
*/
|
|
7
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
-
exports.ok = ok;
|
|
9
|
-
exports.err = err;
|
|
10
|
-
exports.adapterErr = adapterErr;
|
|
11
|
-
exports.isOk = isOk;
|
|
12
|
-
exports.isErr = isErr;
|
|
13
|
-
exports.map = map;
|
|
14
|
-
exports.mapErr = mapErr;
|
|
15
|
-
exports.chain = chain;
|
|
16
|
-
exports.unwrap = unwrap;
|
|
17
|
-
exports.unwrapOr = unwrapOr;
|
|
18
|
-
/**
|
|
19
|
-
* Create a success result
|
|
20
|
-
*/
|
|
21
|
-
function ok(value) {
|
|
22
|
-
return { ok: true, value };
|
|
23
|
-
}
|
|
24
|
-
/**
|
|
25
|
-
* Create a generic error result
|
|
26
|
-
*/
|
|
27
|
-
function err(error) {
|
|
28
|
-
return { ok: false, error };
|
|
29
|
-
}
|
|
30
|
-
/**
|
|
31
|
-
* Create an adapter error result (convenience helper)
|
|
32
|
-
*
|
|
33
|
-
* @param message - Human-readable error message
|
|
34
|
-
* @param code - Machine-readable error code
|
|
35
|
-
* @param field - Optional field name that caused the error
|
|
36
|
-
*/
|
|
37
|
-
function adapterErr(message, code, field) {
|
|
38
|
-
return err({ code, message, field });
|
|
39
|
-
}
|
|
40
|
-
/**
|
|
41
|
-
* Check if result is ok (type guard)
|
|
42
|
-
*/
|
|
43
|
-
function isOk(result) {
|
|
44
|
-
return result.ok;
|
|
45
|
-
}
|
|
46
|
-
/**
|
|
47
|
-
* Check if result is error (type guard)
|
|
48
|
-
*/
|
|
49
|
-
function isErr(result) {
|
|
50
|
-
return !result.ok;
|
|
51
|
-
}
|
|
52
|
-
/**
|
|
53
|
-
* Map over a successful result
|
|
54
|
-
*
|
|
55
|
-
* @example
|
|
56
|
-
* const result = ok(5);
|
|
57
|
-
* const doubled = map(result, x => x * 2); // ok(10)
|
|
58
|
-
*/
|
|
59
|
-
function map(result, fn) {
|
|
60
|
-
return result.ok ? ok(fn(result.value)) : result;
|
|
61
|
-
}
|
|
62
|
-
/**
|
|
63
|
-
* Map over an error result
|
|
64
|
-
*
|
|
65
|
-
* @example
|
|
66
|
-
* const result = err({ message: 'oops' });
|
|
67
|
-
* const mapped = mapErr(result, e => ({ ...e, prefix: 'Error: ' }));
|
|
68
|
-
*/
|
|
69
|
-
function mapErr(result, fn) {
|
|
70
|
-
return result.ok ? result : err(fn(result.error));
|
|
71
|
-
}
|
|
72
|
-
/**
|
|
73
|
-
* Chain results (flatMap/bind)
|
|
74
|
-
*
|
|
75
|
-
* @example
|
|
76
|
-
* const parseNumber = (s: string): Result<number, string> => {
|
|
77
|
-
* const n = parseInt(s);
|
|
78
|
-
* return isNaN(n) ? err('not a number') : ok(n);
|
|
79
|
-
* };
|
|
80
|
-
*
|
|
81
|
-
* const result = chain(ok('42'), parseNumber); // ok(42)
|
|
82
|
-
*/
|
|
83
|
-
function chain(result, fn) {
|
|
84
|
-
return result.ok ? fn(result.value) : result;
|
|
85
|
-
}
|
|
86
|
-
/**
|
|
87
|
-
* Unwrap a result, throwing if it's an error
|
|
88
|
-
*
|
|
89
|
-
* Use sparingly - prefer explicit error handling.
|
|
90
|
-
*
|
|
91
|
-
* @throws The error value if result is an error
|
|
92
|
-
*/
|
|
93
|
-
function unwrap(result) {
|
|
94
|
-
if (result.ok) {
|
|
95
|
-
return result.value;
|
|
96
|
-
}
|
|
97
|
-
throw result.error;
|
|
98
|
-
}
|
|
99
|
-
/**
|
|
100
|
-
* Unwrap a result with a default value for errors
|
|
101
|
-
*/
|
|
102
|
-
function unwrapOr(result, defaultValue) {
|
|
103
|
-
return result.ok ? result.value : defaultValue;
|
|
104
|
-
}
|
|
105
|
-
//# sourceMappingURL=result.js.map
|
package/dist/result.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"result.js","sourceRoot":"","sources":["../src/result.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;AAwBH,gBAEC;AAKD,kBAEC;AASD,gCAMC;AAKD,oBAEC;AAKD,sBAEC;AASD,kBAEC;AASD,wBAEC;AAaD,sBAEC;AASD,wBAKC;AAKD,4BAEC;AAnGD;;GAEG;AACH,SAAgB,EAAE,CAAI,KAAQ;IAC5B,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;AAC7B,CAAC;AAED;;GAEG;AACH,SAAgB,GAAG,CAAI,KAAQ;IAC7B,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;AAC9B,CAAC;AAED;;;;;;GAMG;AACH,SAAgB,UAAU,CACxB,OAAe,EACf,IAAsB,EACtB,KAAc;IAEd,OAAO,GAAG,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;AACvC,CAAC;AAED;;GAEG;AACH,SAAgB,IAAI,CAAO,MAAoB;IAC7C,OAAO,MAAM,CAAC,EAAE,CAAC;AACnB,CAAC;AAED;;GAEG;AACH,SAAgB,KAAK,CAAO,MAAoB;IAC9C,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;AACpB,CAAC;AAED;;;;;;GAMG;AACH,SAAgB,GAAG,CAAU,MAAoB,EAAE,EAAmB;IACpE,OAAO,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;AACnD,CAAC;AAED;;;;;;GAMG;AACH,SAAgB,MAAM,CAAU,MAAoB,EAAE,EAAmB;IACvE,OAAO,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;AACpD,CAAC;AAED;;;;;;;;;;GAUG;AACH,SAAgB,KAAK,CAAU,MAAoB,EAAE,EAA8B;IACjF,OAAO,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;AAC/C,CAAC;AAED;;;;;;GAMG;AACH,SAAgB,MAAM,CAAO,MAAoB;IAC/C,IAAI,MAAM,CAAC,EAAE,EAAE,CAAC;QACd,OAAO,MAAM,CAAC,KAAK,CAAC;IACtB,CAAC;IACD,MAAM,MAAM,CAAC,KAAK,CAAC;AACrB,CAAC;AAED;;GAEG;AACH,SAAgB,QAAQ,CAAO,MAAoB,EAAE,YAAe;IAClE,OAAO,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,YAAY,CAAC;AACjD,CAAC"}
|
package/dist/types.js
DELETED
package/dist/types.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":";AAAA;;GAEG"}
|
package/dist/validators.js
DELETED
|
@@ -1,192 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
/**
|
|
3
|
-
* Shared validators for PEAC payment rail adapters
|
|
4
|
-
*
|
|
5
|
-
* These validators enforce consistent validation logic across all adapters.
|
|
6
|
-
* They follow the "never throws" pattern using Result types.
|
|
7
|
-
*/
|
|
8
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
-
exports.requireString = requireString;
|
|
10
|
-
exports.optionalString = optionalString;
|
|
11
|
-
exports.requireNumber = requireNumber;
|
|
12
|
-
exports.requireAmount = requireAmount;
|
|
13
|
-
exports.requireCurrency = requireCurrency;
|
|
14
|
-
exports.optionalNetwork = optionalNetwork;
|
|
15
|
-
exports.requireObject = requireObject;
|
|
16
|
-
exports.optionalTimestamp = optionalTimestamp;
|
|
17
|
-
exports.optionalBoolean = optionalBoolean;
|
|
18
|
-
exports.requireEnum = requireEnum;
|
|
19
|
-
exports.optionalEnum = optionalEnum;
|
|
20
|
-
const result_js_1 = require("./result.js");
|
|
21
|
-
/**
|
|
22
|
-
* Validate required string field
|
|
23
|
-
*
|
|
24
|
-
* @param value - Value to validate
|
|
25
|
-
* @param fieldName - Field name for error messages
|
|
26
|
-
* @returns Result with string value or error
|
|
27
|
-
*/
|
|
28
|
-
function requireString(value, fieldName) {
|
|
29
|
-
if (typeof value !== 'string' || value.trim() === '') {
|
|
30
|
-
return (0, result_js_1.adapterErr)(`${fieldName} is required and must be a non-empty string`, 'missing_required_field', fieldName);
|
|
31
|
-
}
|
|
32
|
-
return (0, result_js_1.ok)(value);
|
|
33
|
-
}
|
|
34
|
-
/**
|
|
35
|
-
* Validate optional string field
|
|
36
|
-
*
|
|
37
|
-
* @param value - Value to validate
|
|
38
|
-
* @param fieldName - Field name for error messages
|
|
39
|
-
* @returns Result with string value, undefined, or error
|
|
40
|
-
*/
|
|
41
|
-
function optionalString(value, fieldName) {
|
|
42
|
-
if (value === undefined || value === null) {
|
|
43
|
-
return (0, result_js_1.ok)(undefined);
|
|
44
|
-
}
|
|
45
|
-
if (typeof value !== 'string') {
|
|
46
|
-
return (0, result_js_1.adapterErr)(`${fieldName} must be a string if provided`, 'validation_error', fieldName);
|
|
47
|
-
}
|
|
48
|
-
return (0, result_js_1.ok)(value);
|
|
49
|
-
}
|
|
50
|
-
/**
|
|
51
|
-
* Validate required number field
|
|
52
|
-
*
|
|
53
|
-
* @param value - Value to validate
|
|
54
|
-
* @param fieldName - Field name for error messages
|
|
55
|
-
* @returns Result with number value or error
|
|
56
|
-
*/
|
|
57
|
-
function requireNumber(value, fieldName) {
|
|
58
|
-
if (typeof value !== 'number' || !Number.isFinite(value)) {
|
|
59
|
-
return (0, result_js_1.adapterErr)(`${fieldName} must be a finite number`, 'validation_error', fieldName);
|
|
60
|
-
}
|
|
61
|
-
return (0, result_js_1.ok)(value);
|
|
62
|
-
}
|
|
63
|
-
/**
|
|
64
|
-
* Validate amount (must be safe non-negative integer in minor units)
|
|
65
|
-
*
|
|
66
|
-
* @param value - Value to validate
|
|
67
|
-
* @returns Result with amount or error
|
|
68
|
-
*/
|
|
69
|
-
function requireAmount(value) {
|
|
70
|
-
if (typeof value !== 'number') {
|
|
71
|
-
return (0, result_js_1.adapterErr)('amount must be a number', 'invalid_amount', 'amount');
|
|
72
|
-
}
|
|
73
|
-
if (!Number.isSafeInteger(value)) {
|
|
74
|
-
return (0, result_js_1.adapterErr)('amount must be a safe integer', 'invalid_amount', 'amount');
|
|
75
|
-
}
|
|
76
|
-
if (value < 0) {
|
|
77
|
-
return (0, result_js_1.adapterErr)('amount must be non-negative', 'invalid_amount', 'amount');
|
|
78
|
-
}
|
|
79
|
-
return (0, result_js_1.ok)(value);
|
|
80
|
-
}
|
|
81
|
-
/**
|
|
82
|
-
* Validate currency code (ISO 4217, uppercase)
|
|
83
|
-
*
|
|
84
|
-
* @param value - Value to validate
|
|
85
|
-
* @returns Result with normalized currency code or error
|
|
86
|
-
*/
|
|
87
|
-
function requireCurrency(value) {
|
|
88
|
-
if (typeof value !== 'string') {
|
|
89
|
-
return (0, result_js_1.adapterErr)('currency must be a string', 'invalid_currency', 'currency');
|
|
90
|
-
}
|
|
91
|
-
const normalized = value.toUpperCase();
|
|
92
|
-
if (!/^[A-Z]{3}$/.test(normalized)) {
|
|
93
|
-
return (0, result_js_1.adapterErr)('currency must be a valid ISO 4217 code (3 uppercase letters)', 'invalid_currency', 'currency');
|
|
94
|
-
}
|
|
95
|
-
return (0, result_js_1.ok)(normalized);
|
|
96
|
-
}
|
|
97
|
-
/**
|
|
98
|
-
* Validate optional network identifier (CAIP-2 format preferred)
|
|
99
|
-
*
|
|
100
|
-
* @param value - Value to validate
|
|
101
|
-
* @returns Result with network string, undefined, or error
|
|
102
|
-
*/
|
|
103
|
-
function optionalNetwork(value) {
|
|
104
|
-
if (value === undefined || value === null) {
|
|
105
|
-
return (0, result_js_1.ok)(undefined);
|
|
106
|
-
}
|
|
107
|
-
if (typeof value !== 'string' || value.trim() === '') {
|
|
108
|
-
return (0, result_js_1.adapterErr)('network must be a non-empty string if provided', 'invalid_network', 'network');
|
|
109
|
-
}
|
|
110
|
-
return (0, result_js_1.ok)(value);
|
|
111
|
-
}
|
|
112
|
-
/**
|
|
113
|
-
* Parse object safely (for webhook payloads)
|
|
114
|
-
*
|
|
115
|
-
* @param value - Value to validate
|
|
116
|
-
* @param fieldName - Field name for error messages
|
|
117
|
-
* @returns Result with object or error
|
|
118
|
-
*/
|
|
119
|
-
function requireObject(value, fieldName = 'input') {
|
|
120
|
-
if (!value || typeof value !== 'object' || Array.isArray(value)) {
|
|
121
|
-
return (0, result_js_1.adapterErr)(`${fieldName} must be a non-null object`, 'parse_error', fieldName);
|
|
122
|
-
}
|
|
123
|
-
return (0, result_js_1.ok)(value);
|
|
124
|
-
}
|
|
125
|
-
/**
|
|
126
|
-
* Validate optional timestamp (ISO 8601 string or Unix seconds)
|
|
127
|
-
*
|
|
128
|
-
* @param value - Value to validate
|
|
129
|
-
* @returns Result with ISO 8601 string, undefined, or error
|
|
130
|
-
*/
|
|
131
|
-
function optionalTimestamp(value) {
|
|
132
|
-
if (value === undefined || value === null) {
|
|
133
|
-
return (0, result_js_1.ok)(undefined);
|
|
134
|
-
}
|
|
135
|
-
if (typeof value === 'string') {
|
|
136
|
-
// Accept ISO 8601 strings as-is
|
|
137
|
-
return (0, result_js_1.ok)(value);
|
|
138
|
-
}
|
|
139
|
-
if (typeof value === 'number' && Number.isSafeInteger(value) && value > 0) {
|
|
140
|
-
// Convert Unix seconds to ISO string
|
|
141
|
-
return (0, result_js_1.ok)(new Date(value * 1000).toISOString());
|
|
142
|
-
}
|
|
143
|
-
return (0, result_js_1.adapterErr)('timestamp must be an ISO 8601 string or Unix seconds', 'validation_error', 'timestamp');
|
|
144
|
-
}
|
|
145
|
-
/**
|
|
146
|
-
* Validate optional boolean field
|
|
147
|
-
*
|
|
148
|
-
* @param value - Value to validate
|
|
149
|
-
* @param fieldName - Field name for error messages
|
|
150
|
-
* @returns Result with boolean value, undefined, or error
|
|
151
|
-
*/
|
|
152
|
-
function optionalBoolean(value, fieldName) {
|
|
153
|
-
if (value === undefined || value === null) {
|
|
154
|
-
return (0, result_js_1.ok)(undefined);
|
|
155
|
-
}
|
|
156
|
-
if (typeof value !== 'boolean') {
|
|
157
|
-
return (0, result_js_1.adapterErr)(`${fieldName} must be a boolean if provided`, 'validation_error', fieldName);
|
|
158
|
-
}
|
|
159
|
-
return (0, result_js_1.ok)(value);
|
|
160
|
-
}
|
|
161
|
-
/**
|
|
162
|
-
* Validate enum value
|
|
163
|
-
*
|
|
164
|
-
* @param value - Value to validate
|
|
165
|
-
* @param allowed - Array of allowed values
|
|
166
|
-
* @param fieldName - Field name for error messages
|
|
167
|
-
* @returns Result with validated value or error
|
|
168
|
-
*/
|
|
169
|
-
function requireEnum(value, allowed, fieldName) {
|
|
170
|
-
if (typeof value !== 'string') {
|
|
171
|
-
return (0, result_js_1.adapterErr)(`${fieldName} must be a string`, 'validation_error', fieldName);
|
|
172
|
-
}
|
|
173
|
-
if (!allowed.includes(value)) {
|
|
174
|
-
return (0, result_js_1.adapterErr)(`${fieldName} must be one of: ${allowed.join(', ')}`, 'validation_error', fieldName);
|
|
175
|
-
}
|
|
176
|
-
return (0, result_js_1.ok)(value);
|
|
177
|
-
}
|
|
178
|
-
/**
|
|
179
|
-
* Validate optional enum value
|
|
180
|
-
*
|
|
181
|
-
* @param value - Value to validate
|
|
182
|
-
* @param allowed - Array of allowed values
|
|
183
|
-
* @param fieldName - Field name for error messages
|
|
184
|
-
* @returns Result with validated value, undefined, or error
|
|
185
|
-
*/
|
|
186
|
-
function optionalEnum(value, allowed, fieldName) {
|
|
187
|
-
if (value === undefined || value === null) {
|
|
188
|
-
return (0, result_js_1.ok)(undefined);
|
|
189
|
-
}
|
|
190
|
-
return requireEnum(value, allowed, fieldName);
|
|
191
|
-
}
|
|
192
|
-
//# sourceMappingURL=validators.js.map
|
package/dist/validators.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"validators.js","sourceRoot":"","sources":["../src/validators.ts"],"names":[],"mappings":"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"}
|