@memberjunction/credentials 5.0.0 → 5.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@memberjunction/credentials",
3
- "version": "5.0.0",
3
+ "version": "5.2.0",
4
4
  "description": "MemberJunction: Credential Engine - secure credential management with caching, encryption, and audit logging.",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -16,9 +16,9 @@
16
16
  "author": "MemberJunction.com",
17
17
  "license": "ISC",
18
18
  "dependencies": {
19
- "@memberjunction/core": "5.0.0",
20
- "@memberjunction/global": "5.0.0",
21
- "@memberjunction/core-entities": "5.0.0",
19
+ "@memberjunction/core": "5.2.0",
20
+ "@memberjunction/global": "5.2.0",
21
+ "@memberjunction/core-entities": "5.2.0",
22
22
  "ajv": "^8.17.1",
23
23
  "ajv-formats": "^3.0.1",
24
24
  "rxjs": "^7.8.2"
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=credential-validation.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"credential-validation.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/credential-validation.test.ts"],"names":[],"mappings":""}
@@ -1,440 +0,0 @@
1
- import { describe, test, expect, beforeEach } from '@jest/globals';
2
- import Ajv from 'ajv';
3
- import addFormats from 'ajv-formats';
4
- describe('Credential Validation with Ajv', () => {
5
- let ajv;
6
- beforeEach(() => {
7
- ajv = new Ajv({
8
- allErrors: true,
9
- strict: false,
10
- coerceTypes: false
11
- });
12
- addFormats(ajv);
13
- });
14
- describe('Required Field Validation', () => {
15
- test('should reject when required field is missing', () => {
16
- const schema = {
17
- type: 'object',
18
- properties: {
19
- apiKey: { type: 'string' }
20
- },
21
- required: ['apiKey']
22
- };
23
- const validator = ajv.compile(schema);
24
- const result = validator({});
25
- expect(result).toBe(false);
26
- expect(validator.errors).toBeDefined();
27
- expect(validator.errors?.[0].keyword).toBe('required');
28
- expect(validator.errors?.[0].params.missingProperty).toBe('apiKey');
29
- });
30
- test('should pass when all required fields are present', () => {
31
- const schema = {
32
- type: 'object',
33
- properties: {
34
- apiKey: { type: 'string' },
35
- endpoint: { type: 'string' }
36
- },
37
- required: ['apiKey', 'endpoint']
38
- };
39
- const validator = ajv.compile(schema);
40
- const result = validator({
41
- apiKey: 'sk-test123',
42
- endpoint: 'https://api.example.com'
43
- });
44
- expect(result).toBe(true);
45
- expect(validator.errors).toBeNull();
46
- });
47
- });
48
- describe('Const Field Validation', () => {
49
- test('should reject when const field has wrong value', () => {
50
- const schema = {
51
- type: 'object',
52
- properties: {
53
- tokenUrl: {
54
- type: 'string',
55
- const: 'https://api.box.com/oauth2/token'
56
- }
57
- }
58
- };
59
- const validator = ajv.compile(schema);
60
- const result = validator({ tokenUrl: 'https://wrong.url.com' });
61
- expect(result).toBe(false);
62
- expect(validator.errors?.[0].keyword).toBe('const');
63
- expect(validator.errors?.[0].params.allowedValue).toBe('https://api.box.com/oauth2/token');
64
- });
65
- test('should pass when const field matches exactly', () => {
66
- const schema = {
67
- type: 'object',
68
- properties: {
69
- tokenUrl: {
70
- type: 'string',
71
- const: 'https://api.box.com/oauth2/token'
72
- }
73
- }
74
- };
75
- const validator = ajv.compile(schema);
76
- const result = validator({ tokenUrl: 'https://api.box.com/oauth2/token' });
77
- expect(result).toBe(true);
78
- });
79
- });
80
- describe('Enum Field Validation', () => {
81
- test('should reject when value is not in enum', () => {
82
- const schema = {
83
- type: 'object',
84
- properties: {
85
- boxSubjectType: {
86
- type: 'string',
87
- enum: ['enterprise', 'user']
88
- }
89
- }
90
- };
91
- const validator = ajv.compile(schema);
92
- const result = validator({ boxSubjectType: 'invalid' });
93
- expect(result).toBe(false);
94
- expect(validator.errors?.[0].keyword).toBe('enum');
95
- expect(validator.errors?.[0].params.allowedValues).toEqual(['enterprise', 'user']);
96
- });
97
- test('should pass when value is in enum', () => {
98
- const schema = {
99
- type: 'object',
100
- properties: {
101
- boxSubjectType: {
102
- type: 'string',
103
- enum: ['enterprise', 'user']
104
- }
105
- }
106
- };
107
- const validator = ajv.compile(schema);
108
- const result = validator({ boxSubjectType: 'enterprise' });
109
- expect(result).toBe(true);
110
- });
111
- });
112
- describe('Format Validation', () => {
113
- test('should reject invalid URI format', () => {
114
- const schema = {
115
- type: 'object',
116
- properties: {
117
- endpoint: {
118
- type: 'string',
119
- format: 'uri'
120
- }
121
- }
122
- };
123
- const validator = ajv.compile(schema);
124
- const result = validator({ endpoint: 'not-a-valid-url' });
125
- expect(result).toBe(false);
126
- expect(validator.errors?.[0].keyword).toBe('format');
127
- expect(validator.errors?.[0].params.format).toBe('uri');
128
- });
129
- test('should pass valid URI format', () => {
130
- const schema = {
131
- type: 'object',
132
- properties: {
133
- endpoint: {
134
- type: 'string',
135
- format: 'uri'
136
- }
137
- }
138
- };
139
- const validator = ajv.compile(schema);
140
- const result = validator({ endpoint: 'https://api.example.com/v1' });
141
- expect(result).toBe(true);
142
- });
143
- test('should reject invalid email format', () => {
144
- const schema = {
145
- type: 'object',
146
- properties: {
147
- email: {
148
- type: 'string',
149
- format: 'email'
150
- }
151
- }
152
- };
153
- const validator = ajv.compile(schema);
154
- const result = validator({ email: 'not-an-email' });
155
- expect(result).toBe(false);
156
- expect(validator.errors?.[0].params.format).toBe('email');
157
- });
158
- test('should pass valid email format', () => {
159
- const schema = {
160
- type: 'object',
161
- properties: {
162
- email: {
163
- type: 'string',
164
- format: 'email'
165
- }
166
- }
167
- };
168
- const validator = ajv.compile(schema);
169
- const result = validator({ email: 'test@example.com' });
170
- expect(result).toBe(true);
171
- });
172
- test('should reject invalid uuid format', () => {
173
- const schema = {
174
- type: 'object',
175
- properties: {
176
- id: {
177
- type: 'string',
178
- format: 'uuid'
179
- }
180
- }
181
- };
182
- const validator = ajv.compile(schema);
183
- const result = validator({ id: 'not-a-uuid' });
184
- expect(result).toBe(false);
185
- });
186
- test('should pass valid uuid format', () => {
187
- const schema = {
188
- type: 'object',
189
- properties: {
190
- id: {
191
- type: 'string',
192
- format: 'uuid'
193
- }
194
- }
195
- };
196
- const validator = ajv.compile(schema);
197
- const result = validator({ id: '550e8400-e29b-41d4-a716-446655440000' });
198
- expect(result).toBe(true);
199
- });
200
- });
201
- describe('Pattern Validation', () => {
202
- test('should reject value not matching pattern', () => {
203
- const schema = {
204
- type: 'object',
205
- properties: {
206
- apiKey: {
207
- type: 'string',
208
- pattern: '^sk-[a-zA-Z0-9]{32}$'
209
- }
210
- }
211
- };
212
- const validator = ajv.compile(schema);
213
- const result = validator({ apiKey: 'invalid-key' });
214
- expect(result).toBe(false);
215
- expect(validator.errors?.[0].keyword).toBe('pattern');
216
- });
217
- test('should pass value matching pattern', () => {
218
- const schema = {
219
- type: 'object',
220
- properties: {
221
- apiKey: {
222
- type: 'string',
223
- pattern: '^sk-[a-zA-Z0-9]{32}$'
224
- }
225
- }
226
- };
227
- const validator = ajv.compile(schema);
228
- const result = validator({ apiKey: 'sk-abcdefghijklmnopqrstuvwxyz123456' });
229
- expect(result).toBe(true);
230
- });
231
- });
232
- describe('Length Validation', () => {
233
- test('should reject value shorter than minLength', () => {
234
- const schema = {
235
- type: 'object',
236
- properties: {
237
- password: {
238
- type: 'string',
239
- minLength: 8
240
- }
241
- }
242
- };
243
- const validator = ajv.compile(schema);
244
- const result = validator({ password: 'short' });
245
- expect(result).toBe(false);
246
- expect(validator.errors?.[0].keyword).toBe('minLength');
247
- expect(validator.errors?.[0].params.limit).toBe(8);
248
- });
249
- test('should reject value longer than maxLength', () => {
250
- const schema = {
251
- type: 'object',
252
- properties: {
253
- name: {
254
- type: 'string',
255
- maxLength: 10
256
- }
257
- }
258
- };
259
- const validator = ajv.compile(schema);
260
- const result = validator({ name: 'this-is-too-long' });
261
- expect(result).toBe(false);
262
- expect(validator.errors?.[0].keyword).toBe('maxLength');
263
- expect(validator.errors?.[0].params.limit).toBe(10);
264
- });
265
- test('should pass value within length bounds', () => {
266
- const schema = {
267
- type: 'object',
268
- properties: {
269
- password: {
270
- type: 'string',
271
- minLength: 8,
272
- maxLength: 20
273
- }
274
- }
275
- };
276
- const validator = ajv.compile(schema);
277
- const result = validator({ password: 'goodpassword' });
278
- expect(result).toBe(true);
279
- });
280
- });
281
- describe('Numeric Range Validation', () => {
282
- test('should reject value below minimum', () => {
283
- const schema = {
284
- type: 'object',
285
- properties: {
286
- port: {
287
- type: 'number',
288
- minimum: 1024
289
- }
290
- }
291
- };
292
- const validator = ajv.compile(schema);
293
- const result = validator({ port: 80 });
294
- expect(result).toBe(false);
295
- expect(validator.errors?.[0].keyword).toBe('minimum');
296
- });
297
- test('should reject value above maximum', () => {
298
- const schema = {
299
- type: 'object',
300
- properties: {
301
- port: {
302
- type: 'number',
303
- maximum: 65535
304
- }
305
- }
306
- };
307
- const validator = ajv.compile(schema);
308
- const result = validator({ port: 70000 });
309
- expect(result).toBe(false);
310
- expect(validator.errors?.[0].keyword).toBe('maximum');
311
- });
312
- test('should pass value within numeric bounds', () => {
313
- const schema = {
314
- type: 'object',
315
- properties: {
316
- port: {
317
- type: 'number',
318
- minimum: 1024,
319
- maximum: 65535
320
- }
321
- }
322
- };
323
- const validator = ajv.compile(schema);
324
- const result = validator({ port: 8080 });
325
- expect(result).toBe(true);
326
- });
327
- });
328
- describe('Combined Constraints', () => {
329
- test('should validate Box.com OAuth schema', () => {
330
- const schema = {
331
- type: 'object',
332
- properties: {
333
- clientId: { type: 'string' },
334
- clientSecret: { type: 'string' },
335
- tokenUrl: {
336
- type: 'string',
337
- const: 'https://api.box.com/oauth2/token'
338
- },
339
- boxSubjectType: {
340
- type: 'string',
341
- enum: ['enterprise', 'user']
342
- }
343
- },
344
- required: ['clientId', 'clientSecret', 'tokenUrl', 'boxSubjectType']
345
- };
346
- const validator = ajv.compile(schema);
347
- expect(validator({
348
- clientId: 'test-client',
349
- clientSecret: 'test-secret',
350
- tokenUrl: 'https://api.box.com/oauth2/token',
351
- boxSubjectType: 'enterprise'
352
- })).toBe(true);
353
- expect(validator({
354
- clientId: 'test-client',
355
- clientSecret: 'test-secret',
356
- tokenUrl: 'https://wrong.url.com',
357
- boxSubjectType: 'enterprise'
358
- })).toBe(false);
359
- expect(validator({
360
- clientId: 'test-client',
361
- clientSecret: 'test-secret',
362
- tokenUrl: 'https://api.box.com/oauth2/token',
363
- boxSubjectType: 'invalid'
364
- })).toBe(false);
365
- });
366
- test('should validate GCP credential schema with defaults', () => {
367
- const schema = {
368
- type: 'object',
369
- properties: {
370
- projectId: { type: 'string' },
371
- location: {
372
- type: 'string',
373
- default: 'us-central1'
374
- },
375
- endpoint: {
376
- type: 'string',
377
- format: 'uri'
378
- }
379
- },
380
- required: ['projectId']
381
- };
382
- const validator = ajv.compile(schema);
383
- expect(validator({
384
- projectId: 'my-project',
385
- endpoint: 'https://api.example.com'
386
- })).toBe(true);
387
- expect(validator({
388
- projectId: 'my-project',
389
- endpoint: 'not-a-uri'
390
- })).toBe(false);
391
- });
392
- });
393
- describe('Error Message Formatting', () => {
394
- test('should format required error message', () => {
395
- const schema = {
396
- type: 'object',
397
- properties: {
398
- apiKey: { type: 'string' }
399
- },
400
- required: ['apiKey']
401
- };
402
- const validator = ajv.compile(schema);
403
- validator({});
404
- const error = validator.errors?.[0];
405
- expect(error?.keyword).toBe('required');
406
- expect(error?.params.missingProperty).toBe('apiKey');
407
- const message = `Missing required field: ${error?.params.missingProperty}`;
408
- expect(message).toBe('Missing required field: apiKey');
409
- });
410
- test('should format const error message', () => {
411
- const schema = {
412
- type: 'object',
413
- properties: {
414
- tokenUrl: { const: 'https://api.box.com/oauth2/token' }
415
- }
416
- };
417
- const validator = ajv.compile(schema);
418
- validator({ tokenUrl: 'wrong' });
419
- const error = validator.errors?.[0];
420
- const field = error?.instancePath.replace(/^\//, '') || 'credential';
421
- const message = `Field "${field}" must be "${error?.params.allowedValue}"`;
422
- expect(message).toContain('must be "https://api.box.com/oauth2/token"');
423
- });
424
- test('should format enum error message', () => {
425
- const schema = {
426
- type: 'object',
427
- properties: {
428
- type: { enum: ['enterprise', 'user'] }
429
- }
430
- };
431
- const validator = ajv.compile(schema);
432
- validator({ type: 'invalid' });
433
- const error = validator.errors?.[0];
434
- const allowed = error?.params.allowedValues.join(', ');
435
- const message = `Field "type" must be one of: ${allowed}`;
436
- expect(message).toBe('Field "type" must be one of: enterprise, user');
437
- });
438
- });
439
- });
440
- //# sourceMappingURL=credential-validation.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"credential-validation.test.js","sourceRoot":"","sources":["../../src/__tests__/credential-validation.test.ts"],"names":[],"mappings":"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"}