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/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
+ }