Merge branch 'renovate/all-minor-patch' into 'main'
[ProtonMail-WebClient.git] / packages / pass / lib / items / item.builder.ts
bloba146230191f50ec6a21ad1c52761a56c03698651
1 import type {
2     Item,
3     ItemType,
4     MaybeNull,
5     Metadata,
6     UnsafeItem,
7     UnsafeItemContent,
8     UnsafeItemExtraField,
9 } from '@proton/pass/types';
10 import { CardType, type PlatformSpecific } from '@proton/pass/types/protobuf/item-v1';
11 import { type ObjectHandler, objectHandler } from '@proton/pass/utils/object/handler';
12 import { uniqueId } from '@proton/pass/utils/string/unique-id';
14 import { deobfuscateItem, obfuscateItem } from './item.obfuscation';
16 export const itemMetaFactory = (): ObjectHandler<Metadata> =>
17     objectHandler({ name: '', note: '', itemUuid: uniqueId() });
19 export const itemContentBuilder = <T extends ItemType, R = ObjectHandler<UnsafeItemContent<T>>>(type: T): R => {
20     switch (type) {
21         case 'alias': {
22             return objectHandler<UnsafeItemContent<'alias'>>({}) as R;
23         }
24         case 'creditCard': {
25             return objectHandler<UnsafeItemContent<'creditCard'>>({
26                 cardholderName: '',
27                 cardType: CardType.Unspecified,
28                 number: '',
29                 verificationNumber: '',
30                 expirationDate: '',
31                 pin: '',
32             }) as R;
33         }
34         case 'login': {
35             return objectHandler<UnsafeItemContent<'login'>>({
36                 urls: [],
37                 passkeys: [],
38                 itemEmail: '',
39                 itemUsername: '',
40                 password: '',
41                 totpUri: '',
42             }) as R;
43         }
44         case 'note': {
45             return objectHandler<UnsafeItemContent<'note'>>({}) as R;
46         }
47         case 'identity': {
48             return objectHandler<UnsafeItemContent<'identity'>>({
49                 fullName: '',
50                 email: '',
51                 phoneNumber: '',
52                 firstName: '',
53                 middleName: '',
54                 lastName: '',
55                 birthdate: '',
56                 gender: '',
57                 organization: '',
58                 streetAddress: '',
59                 zipOrPostalCode: '',
60                 city: '',
61                 stateOrProvince: '',
62                 countryOrRegion: '',
63                 floor: '',
64                 county: '',
65                 socialSecurityNumber: '',
66                 passportNumber: '',
67                 licenseNumber: '',
68                 website: '',
69                 xHandle: '',
70                 linkedin: '',
71                 reddit: '',
72                 facebook: '',
73                 yahoo: '',
74                 instagram: '',
75                 secondPhoneNumber: '',
76                 company: '',
77                 jobTitle: '',
78                 personalWebsite: '',
79                 workPhoneNumber: '',
80                 workEmail: '',
81                 extraAddressDetails: [],
82                 extraSections: [],
83                 extraContactDetails: [],
84                 extraWorkDetails: [],
85                 extraPersonalDetails: [],
86             }) as R;
87         }
88     }
90     throw new Error('unsupported item type');
93 type ItemBuilderInterface<T extends ItemType = ItemType> = {
94     [K in T]: {
95         type: K;
96         content: ObjectHandler<UnsafeItemContent<K>>;
97         metadata: ObjectHandler<Metadata>;
98         extraFields: UnsafeItemExtraField[];
99         platformSpecific?: PlatformSpecific;
100     };
101 }[T];
103 export const itemBuilder = <T extends ItemType>(type: T, from?: Item<T>) => {
104     const init = (from ? deobfuscateItem(from as Item) : null) as MaybeNull<UnsafeItem>;
106     return objectHandler<ItemBuilderInterface<T>, Item<T>>(
107         {
108             type,
109             content: itemContentBuilder<T>(type).merge(init?.content ?? {}),
110             extraFields: init?.extraFields ?? [],
111             metadata: itemMetaFactory().merge(init?.metadata ?? {}),
112             platformSpecific: init?.platformSpecific,
113         },
114         (item) =>
115             obfuscateItem<T>({
116                 ...item,
117                 content: item.content.data,
118                 metadata: item.metadata.data,
119             } as UnsafeItem)
120     );
123 export type ItemBuilder<T extends ItemType> = ObjectHandler<ItemBuilderInterface<T>, Item<T>>;