questverify-cert-sdk 1.0.1
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/README.md +122 -0
- package/dist/AuthManager.d.ts +40 -0
- package/dist/AuthManager.d.ts.map +1 -0
- package/dist/AuthManager.js +188 -0
- package/dist/AuthManager.js.map +1 -0
- package/dist/CertSDK.d.ts +93 -0
- package/dist/CertSDK.d.ts.map +1 -0
- package/dist/CertSDK.js +416 -0
- package/dist/CertSDK.js.map +1 -0
- package/dist/CryptographicSigner.d.ts +31 -0
- package/dist/CryptographicSigner.d.ts.map +1 -0
- package/dist/CryptographicSigner.js +138 -0
- package/dist/CryptographicSigner.js.map +1 -0
- package/dist/config.d.ts +10 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +55 -0
- package/dist/config.js.map +1 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +34 -0
- package/dist/index.js.map +1 -0
- package/dist/logger.d.ts +57 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +123 -0
- package/dist/logger.js.map +1 -0
- package/dist/types.d.ts +230 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +34 -0
- package/dist/types.js.map +1 -0
- package/dist/utils.d.ts +54 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +312 -0
- package/dist/utils.js.map +1 -0
- package/dist/validation.d.ts +48 -0
- package/dist/validation.d.ts.map +1 -0
- package/dist/validation.js +216 -0
- package/dist/validation.js.map +1 -0
- package/package.json +67 -0
package/dist/utils.js
ADDED
|
@@ -0,0 +1,312 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.readFileBuffer = readFileBuffer;
|
|
40
|
+
exports.validatePDF = validatePDF;
|
|
41
|
+
exports.validateCSV = validateCSV;
|
|
42
|
+
exports.canonicalizeCertificateData = canonicalizeCertificateData;
|
|
43
|
+
exports.hashData = hashData;
|
|
44
|
+
exports.buildMerkleTree = buildMerkleTree;
|
|
45
|
+
exports.retry = retry;
|
|
46
|
+
exports.parseCSV = parseCSV;
|
|
47
|
+
const fs = __importStar(require("fs"));
|
|
48
|
+
const keccak256_1 = __importDefault(require("keccak256"));
|
|
49
|
+
const types_1 = require("./types");
|
|
50
|
+
/**
|
|
51
|
+
* Read file buffer from path or return buffer directly
|
|
52
|
+
*/
|
|
53
|
+
async function readFileBuffer(input) {
|
|
54
|
+
if (Buffer.isBuffer(input)) {
|
|
55
|
+
return input;
|
|
56
|
+
}
|
|
57
|
+
try {
|
|
58
|
+
return await fs.promises.readFile(input);
|
|
59
|
+
}
|
|
60
|
+
catch (error) {
|
|
61
|
+
throw new types_1.SDKError(types_1.SDKErrorCode.VALIDATION_ERROR, `Failed to read file: ${error.message}`, error);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Validate PDF file
|
|
66
|
+
*/
|
|
67
|
+
function validatePDF(buffer) {
|
|
68
|
+
// Check minimum size
|
|
69
|
+
if (buffer.length < 100) {
|
|
70
|
+
throw new types_1.SDKError(types_1.SDKErrorCode.INVALID_PDF, 'PDF file is too small or invalid');
|
|
71
|
+
}
|
|
72
|
+
// Check PDF header (%PDF)
|
|
73
|
+
const header = buffer.slice(0, 4).toString('ascii');
|
|
74
|
+
if (header !== '%PDF') {
|
|
75
|
+
throw new types_1.SDKError(types_1.SDKErrorCode.INVALID_PDF, 'File does not appear to be a valid PDF (missing PDF header)');
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Validate CSV file
|
|
80
|
+
*/
|
|
81
|
+
function validateCSV(buffer) {
|
|
82
|
+
if (buffer.length === 0) {
|
|
83
|
+
throw new types_1.SDKError(types_1.SDKErrorCode.INVALID_CSV, 'CSV file is empty');
|
|
84
|
+
}
|
|
85
|
+
// Basic CSV validation - should contain at least one comma or newline
|
|
86
|
+
const content = buffer.toString('utf-8');
|
|
87
|
+
if (!content.includes(',') && !content.includes('\n')) {
|
|
88
|
+
throw new types_1.SDKError(types_1.SDKErrorCode.INVALID_CSV, 'File does not appear to be a valid CSV');
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Normalize Unicode strings to NFC (Canonical Decomposition, followed by Canonical Composition)
|
|
93
|
+
* Ensures consistent representation of Unicode characters
|
|
94
|
+
*/
|
|
95
|
+
function normalizeUnicode(str) {
|
|
96
|
+
// Use String.prototype.normalize if available (Node.js 0.6+)
|
|
97
|
+
if (typeof str.normalize === 'function') {
|
|
98
|
+
return str.normalize('NFC');
|
|
99
|
+
}
|
|
100
|
+
// Fallback: return as-is if normalize is not available
|
|
101
|
+
return str;
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Recursively canonicalize a value (handles nested objects and arrays)
|
|
105
|
+
*/
|
|
106
|
+
function canonicalizeValue(value, metrics) {
|
|
107
|
+
// Skip undefined
|
|
108
|
+
if (value === undefined) {
|
|
109
|
+
if (metrics)
|
|
110
|
+
metrics.nullFieldsRemoved++;
|
|
111
|
+
return undefined;
|
|
112
|
+
}
|
|
113
|
+
// Skip null and empty strings
|
|
114
|
+
if (value === null || value === '') {
|
|
115
|
+
if (metrics)
|
|
116
|
+
metrics.nullFieldsRemoved++;
|
|
117
|
+
return undefined; // Return undefined to skip in parent
|
|
118
|
+
}
|
|
119
|
+
// Handle arrays
|
|
120
|
+
if (Array.isArray(value)) {
|
|
121
|
+
if (metrics)
|
|
122
|
+
metrics.hasArrays = true;
|
|
123
|
+
// Recursively canonicalize each element, then sort
|
|
124
|
+
const canonicalized = value
|
|
125
|
+
.map(item => canonicalizeValue(item, metrics))
|
|
126
|
+
.filter(item => item !== undefined); // Remove undefined/null items
|
|
127
|
+
// Sort arrays for determinism (if all elements are comparable)
|
|
128
|
+
if (canonicalized.length > 0 && typeof canonicalized[0] === 'string') {
|
|
129
|
+
return canonicalized.sort();
|
|
130
|
+
}
|
|
131
|
+
else if (canonicalized.length > 0 && typeof canonicalized[0] === 'number') {
|
|
132
|
+
return canonicalized.sort((a, b) => a - b);
|
|
133
|
+
}
|
|
134
|
+
return canonicalized;
|
|
135
|
+
}
|
|
136
|
+
// Handle nested objects
|
|
137
|
+
if (typeof value === 'object' && value !== null && !(value instanceof Date)) {
|
|
138
|
+
if (metrics)
|
|
139
|
+
metrics.hasNestedObjects = true;
|
|
140
|
+
// Recursively canonicalize nested object and parse back to object (not string)
|
|
141
|
+
const canonicalString = canonicalizeCertificateData(value, '1.0', metrics, true);
|
|
142
|
+
return JSON.parse(canonicalString); // Return as object, not string
|
|
143
|
+
}
|
|
144
|
+
// Handle dates
|
|
145
|
+
if (value instanceof Date) {
|
|
146
|
+
if (metrics)
|
|
147
|
+
metrics.dateFieldsNormalized++;
|
|
148
|
+
return value.toISOString();
|
|
149
|
+
}
|
|
150
|
+
// Handle date strings
|
|
151
|
+
if (typeof value === 'string' && /^\d{4}-\d{2}-\d{2}/.test(value)) {
|
|
152
|
+
try {
|
|
153
|
+
const date = new Date(value);
|
|
154
|
+
if (!isNaN(date.getTime())) {
|
|
155
|
+
if (metrics)
|
|
156
|
+
metrics.dateFieldsNormalized++;
|
|
157
|
+
return date.toISOString();
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
catch (e) {
|
|
161
|
+
// Keep original if parsing fails
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
// Normalize strings (Unicode normalization)
|
|
165
|
+
if (typeof value === 'string') {
|
|
166
|
+
return normalizeUnicode(value);
|
|
167
|
+
}
|
|
168
|
+
// Normalize numbers
|
|
169
|
+
if (typeof value === 'number') {
|
|
170
|
+
if (metrics)
|
|
171
|
+
metrics.numberFieldsNormalized++;
|
|
172
|
+
return Number.isInteger(value) ? value : parseFloat(value.toFixed(10));
|
|
173
|
+
}
|
|
174
|
+
// Return other types as-is
|
|
175
|
+
return value;
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Canonicalize certificate data for deterministic hashing
|
|
179
|
+
* Ensures same data always produces same hash regardless of:
|
|
180
|
+
* - JSON key order
|
|
181
|
+
* - Date format
|
|
182
|
+
* - Null/undefined/empty string differences
|
|
183
|
+
* - Number formatting
|
|
184
|
+
* - Nested objects and arrays
|
|
185
|
+
* - Unicode variations
|
|
186
|
+
*
|
|
187
|
+
* @param data - Certificate data object
|
|
188
|
+
* @param schemaVersion - Schema version (default: '1.0')
|
|
189
|
+
* @param metrics - Optional metrics object to track normalization
|
|
190
|
+
* @param isNested - Internal flag to indicate nested call
|
|
191
|
+
* @returns Canonical JSON string (compact, sorted keys)
|
|
192
|
+
*/
|
|
193
|
+
function canonicalizeCertificateData(data, schemaVersion = '1.0', metrics, isNested = false) {
|
|
194
|
+
// Initialize metrics if not provided
|
|
195
|
+
const localMetrics = metrics || {
|
|
196
|
+
nullFieldsRemoved: 0,
|
|
197
|
+
dateFieldsNormalized: 0,
|
|
198
|
+
numberFieldsNormalized: 0,
|
|
199
|
+
hasNestedObjects: false,
|
|
200
|
+
hasArrays: false,
|
|
201
|
+
};
|
|
202
|
+
// 1. Sort keys alphabetically
|
|
203
|
+
const sortedKeys = Object.keys(data).sort();
|
|
204
|
+
const sorted = {};
|
|
205
|
+
for (const key of sortedKeys) {
|
|
206
|
+
const value = data[key];
|
|
207
|
+
const canonicalized = canonicalizeValue(value, localMetrics);
|
|
208
|
+
// Skip undefined values (they won't be in JSON anyway)
|
|
209
|
+
if (canonicalized === undefined) {
|
|
210
|
+
continue;
|
|
211
|
+
}
|
|
212
|
+
sorted[key] = canonicalized;
|
|
213
|
+
}
|
|
214
|
+
// 2. Add schema version (only for top-level)
|
|
215
|
+
const canonical = isNested ? sorted : {
|
|
216
|
+
_schema: schemaVersion,
|
|
217
|
+
...sorted
|
|
218
|
+
};
|
|
219
|
+
// 3. Return compact JSON (no whitespace, sorted keys)
|
|
220
|
+
return JSON.stringify(canonical);
|
|
221
|
+
}
|
|
222
|
+
/**
|
|
223
|
+
* Hash data deterministically (Keccak-256)
|
|
224
|
+
* Uses Keccak-256 to match the blockchain platform's hashing algorithm
|
|
225
|
+
*/
|
|
226
|
+
function hashData(data) {
|
|
227
|
+
const buffer = typeof data === 'string' ? Buffer.from(data, 'utf-8') : data;
|
|
228
|
+
return (0, keccak256_1.default)(buffer).toString('hex');
|
|
229
|
+
}
|
|
230
|
+
/**
|
|
231
|
+
* Build Merkle tree from hashes
|
|
232
|
+
* Returns merkle root
|
|
233
|
+
*/
|
|
234
|
+
function buildMerkleTree(hashes) {
|
|
235
|
+
if (hashes.length === 0) {
|
|
236
|
+
throw new types_1.SDKError(types_1.SDKErrorCode.VALIDATION_ERROR, 'Cannot build Merkle tree from empty array');
|
|
237
|
+
}
|
|
238
|
+
if (hashes.length === 1) {
|
|
239
|
+
return hashes[0];
|
|
240
|
+
}
|
|
241
|
+
// Pair up hashes and hash them together
|
|
242
|
+
const pairs = [];
|
|
243
|
+
for (let i = 0; i < hashes.length; i += 2) {
|
|
244
|
+
if (i + 1 < hashes.length) {
|
|
245
|
+
// Hash two items together
|
|
246
|
+
const combined = hashes[i] + hashes[i + 1];
|
|
247
|
+
const hash = hashData(combined);
|
|
248
|
+
pairs.push(hash);
|
|
249
|
+
}
|
|
250
|
+
else {
|
|
251
|
+
// Odd number, hash with itself
|
|
252
|
+
const combined = hashes[i] + hashes[i];
|
|
253
|
+
const hash = hashData(combined);
|
|
254
|
+
pairs.push(hash);
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
// Recursively build tree
|
|
258
|
+
return buildMerkleTree(pairs);
|
|
259
|
+
}
|
|
260
|
+
/**
|
|
261
|
+
* Retry function with exponential backoff
|
|
262
|
+
*/
|
|
263
|
+
async function retry(fn, maxAttempts = 3, delay = 1000) {
|
|
264
|
+
let lastError;
|
|
265
|
+
for (let attempt = 1; attempt <= maxAttempts; attempt++) {
|
|
266
|
+
try {
|
|
267
|
+
return await fn();
|
|
268
|
+
}
|
|
269
|
+
catch (error) {
|
|
270
|
+
lastError = error;
|
|
271
|
+
// Don't retry on client errors (4xx) except 401 (handled by AuthManager)
|
|
272
|
+
if (error.response?.status >= 400 && error.response?.status < 500 && error.response?.status !== 401) {
|
|
273
|
+
throw error;
|
|
274
|
+
}
|
|
275
|
+
// Don't retry on last attempt
|
|
276
|
+
if (attempt === maxAttempts) {
|
|
277
|
+
break;
|
|
278
|
+
}
|
|
279
|
+
// Wait before retry (exponential backoff)
|
|
280
|
+
const waitTime = delay * Math.pow(2, attempt - 1);
|
|
281
|
+
await new Promise(resolve => setTimeout(resolve, waitTime));
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
throw lastError;
|
|
285
|
+
}
|
|
286
|
+
/**
|
|
287
|
+
* Parse CSV buffer to array of objects
|
|
288
|
+
*/
|
|
289
|
+
function parseCSV(buffer) {
|
|
290
|
+
const content = buffer.toString('utf-8');
|
|
291
|
+
const lines = content.split('\n').filter(line => line.trim());
|
|
292
|
+
if (lines.length === 0) {
|
|
293
|
+
throw new types_1.SDKError(types_1.SDKErrorCode.INVALID_CSV, 'CSV file is empty');
|
|
294
|
+
}
|
|
295
|
+
// Parse header
|
|
296
|
+
const header = lines[0].split(',').map(h => h.trim());
|
|
297
|
+
if (header.length === 0) {
|
|
298
|
+
throw new types_1.SDKError(types_1.SDKErrorCode.INVALID_CSV, 'CSV file has no headers');
|
|
299
|
+
}
|
|
300
|
+
// Parse rows
|
|
301
|
+
const rows = [];
|
|
302
|
+
for (let i = 1; i < lines.length; i++) {
|
|
303
|
+
const values = lines[i].split(',').map(v => v.trim());
|
|
304
|
+
const row = {};
|
|
305
|
+
header.forEach((key, index) => {
|
|
306
|
+
row[key] = values[index] || '';
|
|
307
|
+
});
|
|
308
|
+
rows.push(row);
|
|
309
|
+
}
|
|
310
|
+
return rows;
|
|
311
|
+
}
|
|
312
|
+
//# sourceMappingURL=utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Data validation utilities for certificate data
|
|
3
|
+
* Validates required fields, data types, and formats before canonicalization
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Validation schema definition
|
|
7
|
+
*/
|
|
8
|
+
export interface ValidationSchema {
|
|
9
|
+
requiredFields?: string[];
|
|
10
|
+
optionalFields?: string[];
|
|
11
|
+
fieldTypes?: Record<string, 'string' | 'number' | 'date' | 'boolean' | 'array' | 'object'>;
|
|
12
|
+
fieldFormats?: Record<string, RegExp | ((value: any) => boolean)>;
|
|
13
|
+
fieldConstraints?: Record<string, {
|
|
14
|
+
min?: number;
|
|
15
|
+
max?: number;
|
|
16
|
+
minLength?: number;
|
|
17
|
+
maxLength?: number;
|
|
18
|
+
pattern?: RegExp;
|
|
19
|
+
custom?: (value: any) => boolean | string;
|
|
20
|
+
}>;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Validation result
|
|
24
|
+
*/
|
|
25
|
+
export interface ValidationResult {
|
|
26
|
+
valid: boolean;
|
|
27
|
+
errors: string[];
|
|
28
|
+
warnings: string[];
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Validate certificate data against schema
|
|
32
|
+
*
|
|
33
|
+
* @param data - Certificate data to validate
|
|
34
|
+
* @param schema - Validation schema (optional, uses default if not provided)
|
|
35
|
+
* @param strict - If true, treats warnings as errors
|
|
36
|
+
* @returns Validation result
|
|
37
|
+
*/
|
|
38
|
+
export declare function validateCertificateData(data: Record<string, any>, schema?: ValidationSchema, strict?: boolean): ValidationResult;
|
|
39
|
+
/**
|
|
40
|
+
* Validate and throw if invalid
|
|
41
|
+
*
|
|
42
|
+
* @param data - Certificate data to validate
|
|
43
|
+
* @param schema - Validation schema
|
|
44
|
+
* @param strict - If true, treats warnings as errors
|
|
45
|
+
* @throws SDKError if validation fails
|
|
46
|
+
*/
|
|
47
|
+
export declare function validateAndThrow(data: Record<string, any>, schema?: ValidationSchema, strict?: boolean): void;
|
|
48
|
+
//# sourceMappingURL=validation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../src/validation.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,GAAG,QAAQ,GAAG,MAAM,GAAG,SAAS,GAAG,OAAO,GAAG,QAAQ,CAAC,CAAC;IAC3F,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,CAAC,CAAC,KAAK,EAAE,GAAG,KAAK,OAAO,CAAC,CAAC,CAAC;IAClE,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE;QAChC,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,KAAK,OAAO,GAAG,MAAM,CAAC;KAC3C,CAAC,CAAC;CACJ;AAiCD;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED;;;;;;;GAOG;AACH,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACzB,MAAM,GAAE,gBAAiC,EACzC,MAAM,GAAE,OAAe,GACtB,gBAAgB,CA2JlB;AAED;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACzB,MAAM,GAAE,gBAAiC,EACzC,MAAM,GAAE,OAAe,GACtB,IAAI,CAoBN"}
|
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Data validation utilities for certificate data
|
|
4
|
+
* Validates required fields, data types, and formats before canonicalization
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.validateCertificateData = validateCertificateData;
|
|
8
|
+
exports.validateAndThrow = validateAndThrow;
|
|
9
|
+
const types_1 = require("./types");
|
|
10
|
+
/**
|
|
11
|
+
* Default validation schema for certificate data
|
|
12
|
+
*/
|
|
13
|
+
const DEFAULT_SCHEMA = {
|
|
14
|
+
requiredFields: [],
|
|
15
|
+
optionalFields: [],
|
|
16
|
+
fieldTypes: {},
|
|
17
|
+
fieldFormats: {
|
|
18
|
+
email: /^[^\s@]+@[^\s@]+\.[^\s@]+$/,
|
|
19
|
+
date: /^\d{4}-\d{2}-\d{2}(T\d{2}:\d{2}:\d{2}(\.\d{3})?Z?)?$/,
|
|
20
|
+
},
|
|
21
|
+
fieldConstraints: {
|
|
22
|
+
email: {
|
|
23
|
+
maxLength: 255,
|
|
24
|
+
pattern: /^[^\s@]+@[^\s@]+\.[^\s@]+$/,
|
|
25
|
+
},
|
|
26
|
+
grade: {
|
|
27
|
+
min: 0,
|
|
28
|
+
max: 100,
|
|
29
|
+
},
|
|
30
|
+
studentId: {
|
|
31
|
+
minLength: 1,
|
|
32
|
+
maxLength: 100,
|
|
33
|
+
},
|
|
34
|
+
name: {
|
|
35
|
+
minLength: 1,
|
|
36
|
+
maxLength: 255,
|
|
37
|
+
},
|
|
38
|
+
},
|
|
39
|
+
};
|
|
40
|
+
/**
|
|
41
|
+
* Validate certificate data against schema
|
|
42
|
+
*
|
|
43
|
+
* @param data - Certificate data to validate
|
|
44
|
+
* @param schema - Validation schema (optional, uses default if not provided)
|
|
45
|
+
* @param strict - If true, treats warnings as errors
|
|
46
|
+
* @returns Validation result
|
|
47
|
+
*/
|
|
48
|
+
function validateCertificateData(data, schema = DEFAULT_SCHEMA, strict = false) {
|
|
49
|
+
const result = {
|
|
50
|
+
valid: true,
|
|
51
|
+
errors: [],
|
|
52
|
+
warnings: [],
|
|
53
|
+
};
|
|
54
|
+
// Check if data is an object
|
|
55
|
+
if (!data || typeof data !== 'object' || Array.isArray(data)) {
|
|
56
|
+
result.valid = false;
|
|
57
|
+
result.errors.push('Data must be a non-null object');
|
|
58
|
+
return result;
|
|
59
|
+
}
|
|
60
|
+
// Validate required fields
|
|
61
|
+
if (schema.requiredFields && schema.requiredFields.length > 0) {
|
|
62
|
+
for (const field of schema.requiredFields) {
|
|
63
|
+
if (!(field in data) || data[field] === undefined || data[field] === null || data[field] === '') {
|
|
64
|
+
result.valid = false;
|
|
65
|
+
result.errors.push(`Required field '${field}' is missing or empty`);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
// Validate field types
|
|
70
|
+
if (schema.fieldTypes) {
|
|
71
|
+
for (const [field, expectedType] of Object.entries(schema.fieldTypes)) {
|
|
72
|
+
if (!(field in data) || data[field] === undefined || data[field] === null) {
|
|
73
|
+
continue; // Skip optional fields
|
|
74
|
+
}
|
|
75
|
+
const value = data[field];
|
|
76
|
+
let actualType;
|
|
77
|
+
if (value instanceof Date) {
|
|
78
|
+
actualType = 'date';
|
|
79
|
+
}
|
|
80
|
+
else if (Array.isArray(value)) {
|
|
81
|
+
actualType = 'array';
|
|
82
|
+
}
|
|
83
|
+
else if (value !== null && typeof value === 'object') {
|
|
84
|
+
actualType = 'object';
|
|
85
|
+
}
|
|
86
|
+
else {
|
|
87
|
+
actualType = typeof value;
|
|
88
|
+
}
|
|
89
|
+
if (actualType !== expectedType) {
|
|
90
|
+
const message = `Field '${field}' must be of type '${expectedType}', got '${actualType}'`;
|
|
91
|
+
if (strict) {
|
|
92
|
+
result.valid = false;
|
|
93
|
+
result.errors.push(message);
|
|
94
|
+
}
|
|
95
|
+
else {
|
|
96
|
+
result.warnings.push(message);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
// Validate field formats
|
|
102
|
+
if (schema.fieldFormats) {
|
|
103
|
+
for (const [field, format] of Object.entries(schema.fieldFormats)) {
|
|
104
|
+
if (!(field in data) || data[field] === undefined || data[field] === null) {
|
|
105
|
+
continue; // Skip optional fields
|
|
106
|
+
}
|
|
107
|
+
const value = data[field];
|
|
108
|
+
let isValid = false;
|
|
109
|
+
if (format instanceof RegExp) {
|
|
110
|
+
isValid = format.test(String(value));
|
|
111
|
+
}
|
|
112
|
+
else if (typeof format === 'function') {
|
|
113
|
+
isValid = format(value);
|
|
114
|
+
}
|
|
115
|
+
if (!isValid) {
|
|
116
|
+
const message = `Field '${field}' does not match required format`;
|
|
117
|
+
if (strict) {
|
|
118
|
+
result.valid = false;
|
|
119
|
+
result.errors.push(message);
|
|
120
|
+
}
|
|
121
|
+
else {
|
|
122
|
+
result.warnings.push(message);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
// Validate field constraints
|
|
128
|
+
if (schema.fieldConstraints) {
|
|
129
|
+
for (const [field, constraints] of Object.entries(schema.fieldConstraints)) {
|
|
130
|
+
if (!(field in data) || data[field] === undefined || data[field] === null) {
|
|
131
|
+
continue; // Skip optional fields
|
|
132
|
+
}
|
|
133
|
+
const value = data[field];
|
|
134
|
+
// Min/Max for numbers
|
|
135
|
+
if (typeof value === 'number') {
|
|
136
|
+
if (constraints.min !== undefined && value < constraints.min) {
|
|
137
|
+
result.valid = false;
|
|
138
|
+
result.errors.push(`Field '${field}' must be >= ${constraints.min}, got ${value}`);
|
|
139
|
+
}
|
|
140
|
+
if (constraints.max !== undefined && value > constraints.max) {
|
|
141
|
+
result.valid = false;
|
|
142
|
+
result.errors.push(`Field '${field}' must be <= ${constraints.max}, got ${value}`);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
// MinLength/MaxLength for strings
|
|
146
|
+
if (typeof value === 'string') {
|
|
147
|
+
if (constraints.minLength !== undefined && value.length < constraints.minLength) {
|
|
148
|
+
result.valid = false;
|
|
149
|
+
result.errors.push(`Field '${field}' must have length >= ${constraints.minLength}, got ${value.length}`);
|
|
150
|
+
}
|
|
151
|
+
if (constraints.maxLength !== undefined && value.length > constraints.maxLength) {
|
|
152
|
+
result.valid = false;
|
|
153
|
+
result.errors.push(`Field '${field}' must have length <= ${constraints.maxLength}, got ${value.length}`);
|
|
154
|
+
}
|
|
155
|
+
if (constraints.pattern && !constraints.pattern.test(value)) {
|
|
156
|
+
result.valid = false;
|
|
157
|
+
result.errors.push(`Field '${field}' does not match required pattern`);
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
// Custom validation
|
|
161
|
+
if (constraints.custom) {
|
|
162
|
+
const customResult = constraints.custom(value);
|
|
163
|
+
if (customResult !== true) {
|
|
164
|
+
const message = typeof customResult === 'string' ? customResult : `Field '${field}' failed custom validation`;
|
|
165
|
+
if (strict) {
|
|
166
|
+
result.valid = false;
|
|
167
|
+
result.errors.push(message);
|
|
168
|
+
}
|
|
169
|
+
else {
|
|
170
|
+
result.warnings.push(message);
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
// Check for unknown fields (warn only)
|
|
177
|
+
if (schema.optionalFields) {
|
|
178
|
+
const knownFields = new Set([
|
|
179
|
+
...(schema.requiredFields || []),
|
|
180
|
+
...schema.optionalFields,
|
|
181
|
+
...Object.keys(schema.fieldTypes || {}),
|
|
182
|
+
...Object.keys(schema.fieldFormats || {}),
|
|
183
|
+
...Object.keys(schema.fieldConstraints || {}),
|
|
184
|
+
]);
|
|
185
|
+
for (const field of Object.keys(data)) {
|
|
186
|
+
if (!knownFields.has(field) && field !== '_schema') {
|
|
187
|
+
result.warnings.push(`Unknown field '${field}' will be included in canonicalization`);
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
return result;
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* Validate and throw if invalid
|
|
195
|
+
*
|
|
196
|
+
* @param data - Certificate data to validate
|
|
197
|
+
* @param schema - Validation schema
|
|
198
|
+
* @param strict - If true, treats warnings as errors
|
|
199
|
+
* @throws SDKError if validation fails
|
|
200
|
+
*/
|
|
201
|
+
function validateAndThrow(data, schema = DEFAULT_SCHEMA, strict = false) {
|
|
202
|
+
const result = validateCertificateData(data, schema, strict);
|
|
203
|
+
if (!result.valid || (strict && result.warnings.length > 0)) {
|
|
204
|
+
const allErrors = [...result.errors, ...(strict ? result.warnings : [])];
|
|
205
|
+
const errorMessage = `Data validation failed: ${allErrors.join('; ')}`;
|
|
206
|
+
const error = new Error(errorMessage);
|
|
207
|
+
error.errors = allErrors;
|
|
208
|
+
error.warnings = result.warnings;
|
|
209
|
+
throw new types_1.SDKError(types_1.SDKErrorCode.VALIDATION_ERROR, errorMessage, error);
|
|
210
|
+
}
|
|
211
|
+
if (result.warnings.length > 0) {
|
|
212
|
+
// Log warnings but don't throw
|
|
213
|
+
console.warn('Validation warnings:', result.warnings);
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
//# sourceMappingURL=validation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation.js","sourceRoot":"","sources":["../src/validation.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "questverify-cert-sdk",
|
|
3
|
+
"version": "1.0.1",
|
|
4
|
+
"description": "Server-side SDK for QuestVerify blockchain certificate platform",
|
|
5
|
+
"main": "dist/index.js",
|
|
6
|
+
"types": "dist/index.d.ts",
|
|
7
|
+
"scripts": {
|
|
8
|
+
"build": "tsc",
|
|
9
|
+
"prepublishOnly": "npm run build",
|
|
10
|
+
"test": "jest",
|
|
11
|
+
"test:unit": "jest --testPathPattern=unit",
|
|
12
|
+
"test:integration": "jest --testPathPattern=integration",
|
|
13
|
+
"test:e2e": "jest --testPathPattern=e2e",
|
|
14
|
+
"test:watch": "jest --watch",
|
|
15
|
+
"test:coverage": "jest --coverage",
|
|
16
|
+
"test:quick": "ts-node --files scripts/quick-test.ts",
|
|
17
|
+
"test:pdf": "ts-node --files scripts/test-pdf-upload.ts",
|
|
18
|
+
"test:json": "ts-node --files scripts/test-json-upload.ts",
|
|
19
|
+
"get:template": "ts-node --files scripts/get-template-id.ts",
|
|
20
|
+
"create:template": "ts-node --files scripts/get-template-id.ts --create",
|
|
21
|
+
"set:template": "ts-node --files scripts/set-template-id.ts",
|
|
22
|
+
"get:template:db": "node scripts/get-template-from-db.js",
|
|
23
|
+
"setup:test": "node scripts/setup-test-env.js",
|
|
24
|
+
"list:tenants": "node scripts/get-tenant-id.js",
|
|
25
|
+
"monitor:logs": "ts-node --files scripts/monitor-worker-logs.ts",
|
|
26
|
+
"monitor:performance": "ts-node --files scripts/monitor-performance.ts",
|
|
27
|
+
"verify:batch": "ts-node --files scripts/verify-batch-hashes.ts",
|
|
28
|
+
"test:verification": "ts-node --files scripts/test-verification.ts",
|
|
29
|
+
"test:backend-canonicalization": "ts-node --files scripts/test-backend-canonicalization.ts",
|
|
30
|
+
"test:e2e-flow": "ts-node --files scripts/test-end-to-end-flow.ts",
|
|
31
|
+
"lint": "eslint src --ext .ts"
|
|
32
|
+
},
|
|
33
|
+
"keywords": [
|
|
34
|
+
"blockchain",
|
|
35
|
+
"certificates",
|
|
36
|
+
"verification",
|
|
37
|
+
"sdk"
|
|
38
|
+
],
|
|
39
|
+
"author": "QuestVerify",
|
|
40
|
+
"license": "MIT",
|
|
41
|
+
"dependencies": {
|
|
42
|
+
"axios": "^1.6.0",
|
|
43
|
+
"crypto": "^1.0.1",
|
|
44
|
+
"form-data": "^4.0.0",
|
|
45
|
+
"keccak256": "^1.0.6",
|
|
46
|
+
"secp256k1": "^5.0.0"
|
|
47
|
+
},
|
|
48
|
+
"devDependencies": {
|
|
49
|
+
"@types/jest": "^29.5.0",
|
|
50
|
+
"@types/node": "^20.0.0",
|
|
51
|
+
"@typescript-eslint/eslint-plugin": "^6.0.0",
|
|
52
|
+
"@typescript-eslint/parser": "^6.0.0",
|
|
53
|
+
"dotenv": "^16.6.1",
|
|
54
|
+
"eslint": "^8.0.0",
|
|
55
|
+
"jest": "^29.0.0",
|
|
56
|
+
"pg": "^8.11.0",
|
|
57
|
+
"sequelize": "^6.35.0",
|
|
58
|
+
"ts-jest": "^29.1.0",
|
|
59
|
+
"ts-node": "^10.9.0",
|
|
60
|
+
"typescript": "^5.0.0"
|
|
61
|
+
},
|
|
62
|
+
"files": [
|
|
63
|
+
"dist",
|
|
64
|
+
"README.md",
|
|
65
|
+
"CHANGELOG.md"
|
|
66
|
+
]
|
|
67
|
+
}
|