Skip to content

Commit a6c3b0c

Browse files
authored
Merge b327c79 into 0608e28
2 parents 0608e28 + b327c79 commit a6c3b0c

14 files changed

Lines changed: 764 additions & 70 deletions

.changeset/tired-melons-wish.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'@forgerock/davinci-client': minor
3+
---
4+
5+
Added WebAuthn/FIDO2 collectors

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -107,8 +107,8 @@
107107
"shx": "^0.4.0",
108108
"swc-loader": "0.2.6",
109109
"ts-node": "10.9.2",
110-
"tslib": "^2.5.0",
111110
"ts-patch": "3.3.0",
111+
"tslib": "^2.5.0",
112112
"typedoc": "^0.27.4",
113113
"typedoc-github-theme": "0.2.1",
114114
"typedoc-plugin-rename-defaults": "^0.7.2",

packages/davinci-client/src/lib/client.store.ts

Lines changed: 23 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,8 @@ import type {
3434
PhoneNumberInputValue,
3535
AutoCollectors,
3636
MultiValueCollectors,
37+
FidoRegistrationInputValue,
38+
FidoAuthenticationInputValue,
3739
} from './collector.types.js';
3840
import type {
3941
InitFlow,
@@ -266,16 +268,25 @@ export async function davinci<ActionType extends ActionTypes = ActionTypes>({
266268
collectorToUpdate.category !== 'SingleValueCollector' &&
267269
collectorToUpdate.category !== 'ValidatedSingleValueCollector' &&
268270
collectorToUpdate.category !== 'ObjectValueCollector' &&
269-
collectorToUpdate.category !== 'SingleValueAutoCollector'
271+
collectorToUpdate.category !== 'SingleValueAutoCollector' &&
272+
collectorToUpdate.category !== 'ObjectValueAutoCollector'
270273
) {
271274
return handleUpdateValidateError(
272-
'Collector is not a MultiValueCollector, SingleValueCollector, ValidatedSingleValueCollector, ObjectValueCollector, or SingleValueAutoCollector and cannot be updated',
275+
'Collector does not fall into a category that can be updated',
273276
'state_error',
274277
log.error,
275278
);
276279
}
277280

278-
return function (value: string | string[] | PhoneNumberInputValue, index?: number) {
281+
return function (
282+
value:
283+
| string
284+
| string[]
285+
| PhoneNumberInputValue
286+
| FidoRegistrationInputValue
287+
| FidoAuthenticationInputValue,
288+
index?: number,
289+
) {
279290
try {
280291
store.dispatch(nodeSlice.actions.update({ id, value, index }));
281292
return null;
@@ -291,12 +302,16 @@ export async function davinci<ActionType extends ActionTypes = ActionTypes>({
291302

292303
/**
293304
* @method validate - Method for validating the value against validation rules
294-
* @param {SingleValueCollectors | ObjectValueCollectors | MultiValueCollectors} collector - the collector to validate
305+
* @param {SingleValueCollectors | ObjectValueCollectors | MultiValueCollectors | AutoCollectors} collector - the collector to validate
295306
* @returns {function} - a function to call for validating collector value
296307
* @throws {Error} - if the collector cannot be validated
297308
*/
298309
validate: (
299-
collector: SingleValueCollectors | ObjectValueCollectors | MultiValueCollectors,
310+
collector:
311+
| SingleValueCollectors
312+
| ObjectValueCollectors
313+
| MultiValueCollectors
314+
| AutoCollectors,
300315
): Validator => {
301316
if (!collector.id) {
302317
return handleUpdateValidateError(
@@ -323,10 +338,11 @@ export async function davinci<ActionType extends ActionTypes = ActionTypes>({
323338
if (
324339
collectorToUpdate.category !== 'ValidatedSingleValueCollector' &&
325340
collectorToUpdate.category !== 'ObjectValueCollector' &&
326-
collectorToUpdate.category !== 'MultiValueCollector'
341+
collectorToUpdate.category !== 'MultiValueCollector' &&
342+
collectorToUpdate.category !== 'ObjectValueAutoCollector'
327343
) {
328344
return handleUpdateValidateError(
329-
'Collector is not a SingleValueCollector, ObjectValueCollector, or MultiValueCollector and cannot be validated',
345+
'Collector does not fall into a category that can be validated',
330346
'state_error',
331347
log.error,
332348
);

packages/davinci-client/src/lib/collector.types.test-d.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -302,6 +302,7 @@ describe('Collector Types', () => {
302302
key: '',
303303
value: [''],
304304
type: '',
305+
validation: null,
305306
},
306307
output: {
307308
key: '',

packages/davinci-client/src/lib/collector.types.ts

Lines changed: 55 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -202,7 +202,7 @@ export interface MultiValueCollectorWithValue<T extends MultiValueCollectorTypes
202202
key: string;
203203
value: string[];
204204
type: string;
205-
validation?: ValidationRequired[];
205+
validation: ValidationRequired[] | null;
206206
};
207207
output: {
208208
key: string;
@@ -223,7 +223,7 @@ export interface MultiValueCollectorNoValue<T extends MultiValueCollectorTypes>
223223
key: string;
224224
value: string[];
225225
type: string;
226-
validation?: ValidationRequired[];
226+
validation: ValidationRequired[] | null;
227227
};
228228
output: {
229229
key: string;
@@ -302,6 +302,14 @@ export interface PhoneNumberOutputValue {
302302
phoneNumber?: string;
303303
}
304304

305+
export interface FidoRegistrationInputValue {
306+
attestationValue?: PublicKeyCredential;
307+
}
308+
309+
export interface FidoAuthenticationInputValue {
310+
assertionValue?: PublicKeyCredential;
311+
}
312+
305313
export interface ObjectOptionsCollectorWithStringValue<
306314
T extends ObjectValueCollectorTypes,
307315
V = string,
@@ -315,7 +323,7 @@ export interface ObjectOptionsCollectorWithStringValue<
315323
key: string;
316324
value: V;
317325
type: string;
318-
validation?: ValidationRequired[];
326+
validation: ValidationRequired[] | null;
319327
};
320328
output: {
321329
key: string;
@@ -339,7 +347,7 @@ export interface ObjectOptionsCollectorWithObjectValue<
339347
key: string;
340348
value: V;
341349
type: string;
342-
validation?: ValidationRequired[];
350+
validation: ValidationRequired[] | null;
343351
};
344352
output: {
345353
key: string;
@@ -364,7 +372,7 @@ export interface ObjectValueCollectorWithObjectValue<
364372
key: string;
365373
value: IV;
366374
type: string;
367-
validation?: (ValidationRequired | ValidationPhoneNumber)[];
375+
validation: (ValidationRequired | ValidationPhoneNumber)[] | null;
368376
};
369377
output: {
370378
key: string;
@@ -536,13 +544,18 @@ export type UnknownCollector = {
536544
* @interface AutoCollector - Represents a collector that collects a value programmatically without user intervention.
537545
*/
538546

539-
export type AutoCollectorCategories = 'SingleValueAutoCollector';
540-
export type AutoCollectorTypes = AutoCollectorCategories | 'ProtectCollector';
547+
export type AutoCollectorCategories = 'SingleValueAutoCollector' | 'ObjectValueAutoCollector';
548+
export type SingleValueAutoCollectorTypes = 'SingleValueAutoCollector' | 'ProtectCollector';
549+
export type ObjectValueAutoCollectorTypes =
550+
| 'ObjectValueAutoCollector'
551+
| 'FidoRegistrationCollector'
552+
| 'FidoAuthenticationCollector';
553+
export type AutoCollectorTypes = SingleValueAutoCollectorTypes | ObjectValueAutoCollectorTypes;
541554

542555
export interface AutoCollector<
543556
C extends AutoCollectorCategories,
544557
T extends AutoCollectorTypes,
545-
V = string,
558+
IV = string,
546559
> {
547560
category: C;
548561
error: string | null;
@@ -551,8 +564,9 @@ export interface AutoCollector<
551564
name: string;
552565
input: {
553566
key: string;
554-
value: V;
567+
value: IV;
555568
type: string;
569+
validation?: ValidationRequired[] | null;
556570
};
557571
output: {
558572
key: string;
@@ -566,13 +580,33 @@ export type ProtectCollector = AutoCollector<
566580
'ProtectCollector',
567581
string
568582
>;
583+
export type FidoRegistrationCollector = AutoCollector<
584+
'ObjectValueAutoCollector',
585+
'FidoRegistrationCollector',
586+
FidoRegistrationInputValue
587+
>;
588+
export type FidoAuthenticationCollector = AutoCollector<
589+
'ObjectValueAutoCollector',
590+
'FidoAuthenticationCollector',
591+
FidoAuthenticationInputValue
592+
>;
569593
export type SingleValueAutoCollector = AutoCollector<
570594
'SingleValueAutoCollector',
571595
'SingleValueAutoCollector',
572596
string
573597
>;
598+
export type ObjectValueAutoCollector = AutoCollector<
599+
'ObjectValueAutoCollector',
600+
'ObjectValueAutoCollector',
601+
Record<string, unknown>
602+
>;
574603

575-
export type AutoCollectors = ProtectCollector | SingleValueAutoCollector;
604+
export type AutoCollectors =
605+
| ProtectCollector
606+
| FidoRegistrationCollector
607+
| FidoAuthenticationCollector
608+
| SingleValueAutoCollector
609+
| ObjectValueAutoCollector;
576610

577611
/**
578612
* Type to help infer the collector based on the collector type
@@ -583,8 +617,14 @@ export type AutoCollectors = ProtectCollector | SingleValueAutoCollector;
583617
*/
584618
export type InferAutoCollectorType<T extends AutoCollectorTypes> = T extends 'ProtectCollector'
585619
? ProtectCollector
586-
: /**
587-
* At this point, we have not passed in a collector type
588-
* so we can return a SingleValueAutoCollector
589-
**/
590-
SingleValueAutoCollector;
620+
: T extends 'FidoRegistrationCollector'
621+
? FidoRegistrationCollector
622+
: T extends 'FidoAuthenticationCollector'
623+
? FidoAuthenticationCollector
624+
: T extends 'ObjectValueAutoCollector'
625+
? ObjectValueAutoCollector
626+
: /**
627+
* At this point, we have not passed in a collector type
628+
* so we can return a SingleValueAutoCollector
629+
**/
630+
SingleValueAutoCollector;

0 commit comments

Comments
 (0)