@wener/common 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.
Files changed (64) hide show
  1. package/LICENSE +21 -0
  2. package/lib/index.js +3 -0
  3. package/lib/index.js.map +1 -0
  4. package/lib/jsonschema/JsonSchema.js +180 -0
  5. package/lib/jsonschema/JsonSchema.js.map +1 -0
  6. package/lib/jsonschema/index.js +2 -0
  7. package/lib/jsonschema/index.js.map +1 -0
  8. package/lib/jsonschema/types.d.js +3 -0
  9. package/lib/jsonschema/types.d.js.map +1 -0
  10. package/lib/meta/defineInit.js +42 -0
  11. package/lib/meta/defineInit.js.map +1 -0
  12. package/lib/meta/defineMetadata.js +30 -0
  13. package/lib/meta/defineMetadata.js.map +1 -0
  14. package/lib/meta/index.js +3 -0
  15. package/lib/meta/index.js.map +1 -0
  16. package/lib/normalizePagination.js +14 -0
  17. package/lib/normalizePagination.js.map +1 -0
  18. package/lib/parseSort.js +91 -0
  19. package/lib/parseSort.js.map +1 -0
  20. package/lib/password/PHC.js +200 -0
  21. package/lib/password/PHC.js.map +1 -0
  22. package/lib/password/Password.js +83 -0
  23. package/lib/password/Password.js.map +1 -0
  24. package/lib/password/createArgon2PasswordAlgorithm.js +53 -0
  25. package/lib/password/createArgon2PasswordAlgorithm.js.map +1 -0
  26. package/lib/password/createBase64PasswordAlgorithm.js +14 -0
  27. package/lib/password/createBase64PasswordAlgorithm.js.map +1 -0
  28. package/lib/password/createBcryptPasswordAlgorithm.js +20 -0
  29. package/lib/password/createBcryptPasswordAlgorithm.js.map +1 -0
  30. package/lib/password/createPBKDF2PasswordAlgorithm.js +54 -0
  31. package/lib/password/createPBKDF2PasswordAlgorithm.js.map +1 -0
  32. package/lib/password/createScryptPasswordAlgorithm.js +66 -0
  33. package/lib/password/createScryptPasswordAlgorithm.js.map +1 -0
  34. package/lib/password/index.js +6 -0
  35. package/lib/password/index.js.map +1 -0
  36. package/lib/password/server/index.js +2 -0
  37. package/lib/password/server/index.js.map +1 -0
  38. package/lib/tools/renderJsonSchemaToMarkdownDoc.js +85 -0
  39. package/lib/tools/renderJsonSchemaToMarkdownDoc.js.map +1 -0
  40. package/package.json +56 -0
  41. package/src/index.ts +2 -0
  42. package/src/jsonschema/JsonSchema.test.ts +27 -0
  43. package/src/jsonschema/JsonSchema.ts +197 -0
  44. package/src/jsonschema/index.ts +2 -0
  45. package/src/jsonschema/types.d.ts +173 -0
  46. package/src/meta/defineInit.ts +68 -0
  47. package/src/meta/defineMetadata.test.ts +15 -0
  48. package/src/meta/defineMetadata.ts +57 -0
  49. package/src/meta/index.ts +3 -0
  50. package/src/normalizePagination.ts +25 -0
  51. package/src/parseSort.test.ts +41 -0
  52. package/src/parseSort.ts +115 -0
  53. package/src/password/PHC.test.ts +317 -0
  54. package/src/password/PHC.ts +247 -0
  55. package/src/password/Password.test.ts +58 -0
  56. package/src/password/Password.ts +113 -0
  57. package/src/password/createArgon2PasswordAlgorithm.ts +80 -0
  58. package/src/password/createBase64PasswordAlgorithm.ts +14 -0
  59. package/src/password/createBcryptPasswordAlgorithm.ts +30 -0
  60. package/src/password/createPBKDF2PasswordAlgorithm.ts +73 -0
  61. package/src/password/createScryptPasswordAlgorithm.ts +72 -0
  62. package/src/password/index.ts +5 -0
  63. package/src/password/server/index.ts +1 -0
  64. package/src/tools/renderJsonSchemaToMarkdownDoc.ts +93 -0
@@ -0,0 +1,3 @@
1
+ export { createMetadataKey, defineMetadata, getMetadata } from './defineMetadata';
2
+
3
+ export { defineInit, type InitDef, runInit } from './defineInit';
@@ -0,0 +1,25 @@
1
+ export function normalizePagination(page: {
2
+ pageSize?: number;
3
+ pageIndex?: number;
4
+ pageNumber?: number;
5
+ limit?: number;
6
+ offset?: number;
7
+ }) {
8
+ let {
9
+ pageSize = normalizePagination.defaultPageSize,
10
+ pageNumber = 1,
11
+ pageIndex = pageNumber - 1,
12
+ limit,
13
+ offset,
14
+ } = page;
15
+ if (normalizePagination.maxPageSize) {
16
+ pageSize = Math.min(pageSize, normalizePagination.maxPageSize);
17
+ }
18
+ return {
19
+ limit: limit || pageSize,
20
+ offset: Math.min(0, offset ?? pageIndex * pageSize),
21
+ };
22
+ }
23
+
24
+ normalizePagination.defaultPageSize = 20;
25
+ normalizePagination.maxPageSize = undefined as number | undefined;
@@ -0,0 +1,41 @@
1
+ import { assert, test } from 'vitest';
2
+ import { parseSort } from './parseSort';
3
+
4
+ test('parseSort', () => {
5
+ for (const [o, e] of [
6
+ //
7
+ ['', []],
8
+ [[], []],
9
+ [null, []],
10
+ // invalid
11
+ [[{ order: 'asc' }], []],
12
+ // partial invalid
13
+ [['a,,', { field: '', order: 'asc' }], [{ field: 'a', order: 'asc' }]],
14
+ [[',,', { field: 'a', order: 'asc' }], [{ field: 'a', order: 'asc' }]],
15
+ //
16
+ ['a', [{ field: 'a', order: 'asc' }]],
17
+ [['a'], [{ field: 'a', order: 'asc' }]],
18
+ [[{ field: 'a', order: 'asc' }], [{ field: 'a', order: 'asc' }]],
19
+ [[{ field: 'a', order: 'asc', nulls: 'last' }], [{ field: 'a', order: 'asc', nulls: 'last' }]],
20
+ [
21
+ '-a,+b',
22
+ [
23
+ { field: 'a', order: 'desc' },
24
+ { field: 'b', order: 'asc' },
25
+ ],
26
+ ],
27
+ ['a asc', [{ field: 'a', order: 'asc' }]],
28
+ ['a desc', [{ field: 'a', order: 'desc' }]],
29
+ ['a asc last', [{ field: 'a', order: 'asc', nulls: 'last' }]],
30
+ ['a asc nulls last', [{ field: 'a', order: 'asc', nulls: 'last' }]],
31
+ ['a asc nulls first', [{ field: 'a', order: 'asc', nulls: 'first' }]],
32
+ ['a asc first', [{ field: 'a', order: 'asc', nulls: 'first' }]],
33
+ ['a desc nulls last', [{ field: 'a', order: 'desc', nulls: 'last' }]],
34
+ ['a desc nulls first', [{ field: 'a', order: 'desc', nulls: 'first' }]],
35
+ ['a nulls first', [{ field: 'a', order: 'asc', nulls: 'first' }]],
36
+ ['-a nulls first', [{ field: 'a', order: 'desc', nulls: 'first' }]],
37
+ ['a.b', [{ field: 'a.b', order: 'asc' }]],
38
+ ]) {
39
+ assert.deepEqual(parseSort(o as any), e as any, `parseOrder: ${JSON.stringify(o)}`);
40
+ }
41
+ });
@@ -0,0 +1,115 @@
1
+ import { arrayOfMaybeArray, type MaybeArray } from '@wener/utils';
2
+
3
+ export type SortRule = {
4
+ field: string;
5
+ order: 'asc' | 'desc';
6
+ nulls?: 'last' | 'first';
7
+ };
8
+
9
+ /**
10
+ * parsing order string
11
+ *
12
+ * e.g.
13
+ * ```
14
+ * a desc
15
+ * +a,-b
16
+ * a asc nulls last
17
+ * a desc first
18
+ * ```
19
+ */
20
+ export function parseSort(
21
+ order:
22
+ | MaybeArray<
23
+ | {
24
+ field?: string;
25
+ order?: string;
26
+ nulls?: string;
27
+ }
28
+ | string
29
+ >
30
+ | undefined
31
+ | null,
32
+ ): SortRule[] {
33
+ if (!order) {
34
+ return [];
35
+ }
36
+
37
+ return arrayOfMaybeArray(order).flatMap((v): MaybeArray<SortRule> => {
38
+ if (!v) return [];
39
+ if (typeof v === 'object') {
40
+ // invalid
41
+ if (!v.field) {
42
+ return [];
43
+ }
44
+ let rule: SortRule = {
45
+ field: v.field,
46
+ order: v.order?.toLowerCase() === 'asc' ? 'asc' : 'desc',
47
+ };
48
+ if (v.nulls) {
49
+ rule.nulls = v.nulls.toLowerCase() === 'last' ? 'last' : 'first';
50
+ }
51
+ return rule;
52
+ }
53
+ return v
54
+ .split(',')
55
+ .map((v) => v.trim())
56
+ .filter(Boolean)
57
+ .map(_parse);
58
+ });
59
+ }
60
+
61
+ function _parse(v: string) {
62
+ // const sp = v.match(/^(?<field>[a-z0-9_]+)(\s+(?<order>asc|desc))?(\s+(?<nulls>nulls\s+(?<nulls_order>last|first)))?$/i);
63
+ const sp = v.split(/\s+/);
64
+ let field = '';
65
+ let order: SortRule['order'];
66
+ let nulls: SortRule['nulls'];
67
+
68
+ const f = sp.shift()!;
69
+ if (f.startsWith('-') || f.startsWith('+')) {
70
+ // (order = f.slice(1).trim()), f.startsWith('-') ? 'desc' : 'asc';
71
+ field = f.slice(1).trim();
72
+ order = f.startsWith('-') ? 'desc' : 'asc';
73
+ } else {
74
+ field = f.trim();
75
+ }
76
+
77
+ while (true) {
78
+ const v = sp.shift()?.trim()?.toLowerCase();
79
+ if (!v) {
80
+ break;
81
+ }
82
+
83
+ switch (v) {
84
+ case 'asc':
85
+ case 'desc': {
86
+ order = v;
87
+ break;
88
+ }
89
+
90
+ case 'nulls': {
91
+ nulls = sp.shift()?.trim()?.toLowerCase() === 'last' ? 'last' : 'first';
92
+ break;
93
+ }
94
+
95
+ case 'last':
96
+ case 'first': {
97
+ nulls = v;
98
+ break;
99
+ }
100
+ }
101
+ }
102
+
103
+ order ||= 'asc';
104
+ // avoid undefined
105
+ // NOTE pg default nulls first for desc, last for asc
106
+ // https://www.postgresql.org/docs/current/queries-order.html
107
+ if (!nulls) {
108
+ return { field, order };
109
+ }
110
+ return {
111
+ field,
112
+ order,
113
+ nulls,
114
+ };
115
+ }
@@ -0,0 +1,317 @@
1
+ import { ArrayBuffers } from '@wener/utils';
2
+ import { describe, expect, it } from 'vitest';
3
+ import { PHC } from './PHC';
4
+
5
+ const { deserialize, serialize } = PHC;
6
+
7
+ describe('deserialize', () => {
8
+ it('should deserialize correct phc strings', () => {
9
+ sdData.serialized.forEach((serialized: string, i: number) => {
10
+ expect(deserialize(serialized), `Failed to deserialize ${serialized}`).toEqual(sdData.deserialized[i]);
11
+ });
12
+ });
13
+
14
+ it('should throw errors if trying to deserialize an invalid phc string', async () => {
15
+ expect(() => deserialize(null as any)).toThrow('pchstr must be a non-empty string');
16
+
17
+ expect(() => deserialize('a$invalid')).toThrow('pchstr must contain a $ as first char');
18
+
19
+ expect(() => deserialize('$b$c$d$e$f')).toThrow('pchstr contains too many fileds: 5/4');
20
+
21
+ expect(() => deserialize('invalid')).toThrow('pchstr must contain a $ as first char');
22
+
23
+ expect(() => deserialize('$i_n_v_a_l_i_d')).toThrowError(/id must satisfy/);
24
+
25
+ expect(() => deserialize('$pbkdf2$rounds_=1000')).toThrowError(/params names must satisfy/);
26
+
27
+ expect(() => deserialize('$pbkdf2$rounds=1000@')).toThrowError(/params values must satisfy/);
28
+
29
+ expect(() => deserialize('$pbkdf2$rounds:1000')).toThrowError(/params must be in the format name=value/);
30
+
31
+ expect(() => deserialize('$argon2i$unrecognized$m=120,t=5000,p=2$EkCWX6pSTqWruiR0')).toThrowError(
32
+ /pchstr contains unrecognized fileds/,
33
+ );
34
+
35
+ expect(() => deserialize('$argon2i$unrecognized$v=19$m=120,t=5000,p=2$EkCWX6pSTqWruiR0')).toThrow(
36
+ 'pchstr contains too many fileds: 5/4',
37
+ );
38
+
39
+ expect(() => deserialize('$argon2i$v=19$unrecognized$m=120,t=5000,p=2$EkCWX6pSTqWruiR0')).toThrowError(
40
+ /pchstr contains unrecognized fileds/,
41
+ );
42
+ });
43
+ });
44
+
45
+ describe('serialize', () => {
46
+ it('should serialize correct phc objects', () => {
47
+ sdData.deserialized.forEach((_, i) => {
48
+ expect(serialize(sdData.deserialized[i] as any)).toEqual(sdData.serialized[i]);
49
+ });
50
+ sData.deserialized.forEach((_, i) => {
51
+ expect(serialize(sData.deserialized[i])).toEqual(sData.serialized[i]);
52
+ });
53
+ });
54
+
55
+ it('should throw errors if trying to serialize with invalid arguments', async () => {
56
+ expect(() => serialize(null as any)).toThrow('opts must be an object');
57
+
58
+ expect(() => serialize({} as any)).toThrow('id must be a string');
59
+
60
+ expect(() => serialize({ id: 'i_n_v_a_l_i_d' } as any)).toThrowError(/id must satisfy/);
61
+
62
+ expect(() => serialize({ id: 'pbkdf2', params: null } as any)).toThrow('params must be an object');
63
+
64
+ expect(() =>
65
+ serialize({
66
+ id: 'pbkdf2',
67
+ params: { i: {} },
68
+ } as any),
69
+ ).toThrow('params values must be strings');
70
+
71
+ expect(() => serialize({ id: 'pbkdf2', params: { rounds_: '1000' } } as any)).toThrowError(
72
+ /params names must satisfy/,
73
+ );
74
+
75
+ expect(() => serialize({ id: 'pbkdf2', params: { rounds: '1000@' } } as any)).toThrowError(
76
+ /params values must satisfy/,
77
+ );
78
+
79
+ expect(() => serialize({ id: 'pbkdf2', params: { rounds: '1000' }, salt: 'string' } as any)).toThrow(
80
+ 'salt must be a Buffer',
81
+ );
82
+
83
+ expect(() =>
84
+ serialize({
85
+ id: 'argon2id',
86
+ version: -10,
87
+ } as any),
88
+ ).toThrow('version must be a positive integer number');
89
+
90
+ expect(() =>
91
+ serialize({
92
+ id: 'pbkdf2',
93
+ params: { rounds: '1000' },
94
+ salt: bufferFrom('string'),
95
+ hash: 'string',
96
+ } as any),
97
+ ).toThrow('hash must be a Buffer');
98
+ });
99
+ });
100
+
101
+ const bufferFrom = (a: string, b?: any): Uint8Array => {
102
+ return ArrayBuffers.from(a, b, Uint8Array);
103
+ };
104
+
105
+ const sdData = {
106
+ serialized: [
107
+ '$argon2i$m=120,t=5000,p=2',
108
+ '$argon2i$m=120,t=4294967295,p=2',
109
+ '$argon2i$m=2040,t=5000,p=255',
110
+ '$argon2i$m=120,t=5000,p=2,keyid=Hj5+dsK0',
111
+ '$argon2i$m=120,t=5000,p=2,keyid=Hj5+dsK0ZQ',
112
+ '$argon2i$m=120,t=5000,p=2,keyid=Hj5+dsK0ZQA',
113
+ '$argon2i$m=120,t=5000,p=2,data=sRlHhRmKUGzdOmXn01XmXygd5Kc',
114
+ '$argon2i$m=120,t=5000,p=2,keyid=Hj5+dsK0,data=sRlHhRmKUGzdOmXn01XmXygd5Kc',
115
+
116
+ '$argon2i$m=120,t=5000,p=2$/LtFjH5rVL8',
117
+ '$argon2i$m=120,t=5000,p=2$4fXXG0spB92WPB1NitT8/OH0VKI',
118
+ '$argon2i$m=120,t=5000,p=2$BwUgJHHQaynE+a4nZrYRzOllGSjjxuxNXxyNRUtI6Dlw/zlbt6PzOL8Onfqs6TcG',
119
+ '$argon2i$m=120,t=5000,p=2,keyid=Hj5+dsK0$4fXXG0spB92WPB1NitT8/OH0VKI',
120
+ '$argon2i$m=120,t=5000,p=2,data=sRlHhRmKUGzdOmXn01XmXygd5Kc$4fXXG0spB92WPB1NitT8/OH0VKI',
121
+ '$argon2i$m=120,t=5000,p=2,keyid=Hj5+dsK0,data=sRlHhRmKUGzdOmXn01XmXygd5Kc$4fXXG0spB92WPB1NitT8/OH0VKI',
122
+
123
+ '$argon2i$m=120,t=5000,p=2$4fXXG0spB92WPB1NitT8/OH0VKI$iPBVuORECm5biUsjq33hn9/7BKqy9aPWKhFfK2haEsM',
124
+ '$argon2i$m=120,t=5000,p=2,keyid=Hj5+dsK0$4fXXG0spB92WPB1NitT8/OH0VKI$iPBVuORECm5biUsjq33hn9/7BKqy9aPWKhFfK2haEsM',
125
+ '$argon2i$m=120,t=5000,p=2,data=sRlHhRmKUGzdOmXn01XmXygd5Kc$4fXXG0spB92WPB1NitT8/OH0VKI$iPBVuORECm5biUsjq33hn9/7BKqy9aPWKhFfK2haEsM',
126
+ '$argon2i$m=120,t=5000,p=2,keyid=Hj5+dsK0,data=sRlHhRmKUGzdOmXn01XmXygd5Kc$4fXXG0spB92WPB1NitT8/OH0VKI$iPBVuORECm5biUsjq33hn9/7BKqy9aPWKhFfK2haEsM',
127
+ '$argon2i$m=120,t=5000,p=2,keyid=Hj5+dsK0,data=sRlHhRmKUGzdOmXn01XmXygd5Kc$iHSDPHzUhPzK7rCcJgOFfg$EkCWX6pSTqWruiR0',
128
+ '$argon2i$m=120,t=5000,p=2,keyid=Hj5+dsK0,data=sRlHhRmKUGzdOmXn01XmXygd5Kc$iHSDPHzUhPzK7rCcJgOFfg$J4moa2MM0/6uf3HbY2Tf5Fux8JIBTwIhmhxGRbsY14qhTltQt+Vw3b7tcJNEbk8ium8AQfZeD4tabCnNqfkD1g',
129
+ '$scrypt$ln=1,r=16,p=1$$d9ZXYjhleyA7GcpCwYoEl/FrSETjB0ro39/6P+3iFEL80Aad7QlI+DJqdToPyB8X6NPg+y4NNijPNeIMONGJBg',
130
+ '$argon2i$v=19$m=120,t=5000,p=2,keyid=Hj5+dsK0,data=sRlHhRmKUGzdOmXn01XmXygd5Kc$iHSDPHzUhPzK7rCcJgOFfg$J4moa2MM0/6uf3HbY2Tf5Fux8JIBTwIhmhxGRbsY14qhTltQt+Vw3b7tcJNEbk8ium8AQfZeD4tabCnNqfkD1g',
131
+ ],
132
+ deserialized: [
133
+ {
134
+ id: 'argon2i',
135
+ params: { m: 120, t: 5000, p: 2 },
136
+ },
137
+ {
138
+ id: 'argon2i',
139
+ params: { m: 120, t: 4294967295, p: 2 },
140
+ },
141
+ {
142
+ id: 'argon2i',
143
+ params: { m: 2040, t: 5000, p: 255 },
144
+ },
145
+ {
146
+ id: 'argon2i',
147
+ params: { m: 120, t: 5000, p: 2, keyid: 'Hj5+dsK0' },
148
+ },
149
+ {
150
+ id: 'argon2i',
151
+ params: { m: 120, t: 5000, p: 2, keyid: 'Hj5+dsK0ZQ' },
152
+ },
153
+ {
154
+ id: 'argon2i',
155
+ params: { m: 120, t: 5000, p: 2, keyid: 'Hj5+dsK0ZQA' },
156
+ },
157
+ {
158
+ id: 'argon2i',
159
+ params: { m: 120, t: 5000, p: 2, data: 'sRlHhRmKUGzdOmXn01XmXygd5Kc' },
160
+ },
161
+ {
162
+ id: 'argon2i',
163
+ params: {
164
+ m: 120,
165
+ t: 5000,
166
+ p: 2,
167
+ keyid: 'Hj5+dsK0',
168
+ data: 'sRlHhRmKUGzdOmXn01XmXygd5Kc',
169
+ },
170
+ },
171
+ {
172
+ id: 'argon2i',
173
+ params: { m: 120, t: 5000, p: 2 },
174
+ salt: bufferFrom('/LtFjH5rVL8', 'base64'),
175
+ },
176
+ {
177
+ id: 'argon2i',
178
+ params: { m: 120, t: 5000, p: 2 },
179
+ salt: bufferFrom('4fXXG0spB92WPB1NitT8/OH0VKI', 'base64'),
180
+ },
181
+ {
182
+ id: 'argon2i',
183
+ params: { m: 120, t: 5000, p: 2 },
184
+ salt: bufferFrom('BwUgJHHQaynE+a4nZrYRzOllGSjjxuxNXxyNRUtI6Dlw/zlbt6PzOL8Onfqs6TcG', 'base64'),
185
+ },
186
+ {
187
+ id: 'argon2i',
188
+ params: { m: 120, t: 5000, p: 2, keyid: 'Hj5+dsK0' },
189
+ salt: bufferFrom('4fXXG0spB92WPB1NitT8/OH0VKI', 'base64'),
190
+ },
191
+ {
192
+ id: 'argon2i',
193
+ params: { m: 120, t: 5000, p: 2, data: 'sRlHhRmKUGzdOmXn01XmXygd5Kc' },
194
+ salt: bufferFrom('4fXXG0spB92WPB1NitT8/OH0VKI', 'base64'),
195
+ },
196
+ {
197
+ id: 'argon2i',
198
+ params: {
199
+ m: 120,
200
+ t: 5000,
201
+ p: 2,
202
+ keyid: 'Hj5+dsK0',
203
+ data: 'sRlHhRmKUGzdOmXn01XmXygd5Kc',
204
+ },
205
+ salt: bufferFrom('4fXXG0spB92WPB1NitT8/OH0VKI', 'base64'),
206
+ },
207
+ {
208
+ id: 'argon2i',
209
+ params: { m: 120, t: 5000, p: 2 },
210
+ salt: bufferFrom('4fXXG0spB92WPB1NitT8/OH0VKI', 'base64'),
211
+ hash: bufferFrom('iPBVuORECm5biUsjq33hn9/7BKqy9aPWKhFfK2haEsM', 'base64'),
212
+ },
213
+ {
214
+ id: 'argon2i',
215
+ params: { m: 120, t: 5000, p: 2, keyid: 'Hj5+dsK0' },
216
+ salt: bufferFrom('4fXXG0spB92WPB1NitT8/OH0VKI', 'base64'),
217
+ hash: bufferFrom('iPBVuORECm5biUsjq33hn9/7BKqy9aPWKhFfK2haEsM', 'base64'),
218
+ },
219
+ {
220
+ id: 'argon2i',
221
+ params: { m: 120, t: 5000, p: 2, data: 'sRlHhRmKUGzdOmXn01XmXygd5Kc' },
222
+ salt: bufferFrom('4fXXG0spB92WPB1NitT8/OH0VKI', 'base64'),
223
+ hash: bufferFrom('iPBVuORECm5biUsjq33hn9/7BKqy9aPWKhFfK2haEsM', 'base64'),
224
+ },
225
+ {
226
+ id: 'argon2i',
227
+ params: {
228
+ m: 120,
229
+ t: 5000,
230
+ p: 2,
231
+ keyid: 'Hj5+dsK0',
232
+ data: 'sRlHhRmKUGzdOmXn01XmXygd5Kc',
233
+ },
234
+ salt: bufferFrom('4fXXG0spB92WPB1NitT8/OH0VKI', 'base64'),
235
+ hash: bufferFrom('iPBVuORECm5biUsjq33hn9/7BKqy9aPWKhFfK2haEsM', 'base64'),
236
+ },
237
+ {
238
+ id: 'argon2i',
239
+ params: {
240
+ m: 120,
241
+ t: 5000,
242
+ p: 2,
243
+ keyid: 'Hj5+dsK0',
244
+ data: 'sRlHhRmKUGzdOmXn01XmXygd5Kc',
245
+ },
246
+ salt: bufferFrom('iHSDPHzUhPzK7rCcJgOFfg', 'base64'),
247
+ hash: bufferFrom('EkCWX6pSTqWruiR0', 'base64'),
248
+ },
249
+ {
250
+ id: 'argon2i',
251
+ params: {
252
+ m: 120,
253
+ t: 5000,
254
+ p: 2,
255
+ keyid: 'Hj5+dsK0',
256
+ data: 'sRlHhRmKUGzdOmXn01XmXygd5Kc',
257
+ },
258
+ salt: bufferFrom('iHSDPHzUhPzK7rCcJgOFfg', 'base64'),
259
+ hash: bufferFrom(
260
+ 'J4moa2MM0/6uf3HbY2Tf5Fux8JIBTwIhmhxGRbsY14qhTltQt+Vw3b7tcJNEbk8ium8AQfZeD4tabCnNqfkD1g',
261
+ 'base64',
262
+ ),
263
+ },
264
+ {
265
+ id: 'scrypt',
266
+ params: {
267
+ ln: 1,
268
+ r: 16,
269
+ p: 1,
270
+ },
271
+ salt: bufferFrom('', 'hex'),
272
+ hash: bufferFrom(
273
+ 'd9ZXYjhleyA7GcpCwYoEl/FrSETjB0ro39/6P+3iFEL80Aad7QlI+DJqdToPyB8X6NPg+y4NNijPNeIMONGJBg',
274
+ 'base64',
275
+ ),
276
+ },
277
+ {
278
+ id: 'argon2i',
279
+ version: 19,
280
+ params: {
281
+ m: 120,
282
+ t: 5000,
283
+ p: 2,
284
+ keyid: 'Hj5+dsK0',
285
+ data: 'sRlHhRmKUGzdOmXn01XmXygd5Kc',
286
+ },
287
+ salt: bufferFrom('iHSDPHzUhPzK7rCcJgOFfg', 'base64'),
288
+ hash: bufferFrom(
289
+ 'J4moa2MM0/6uf3HbY2Tf5Fux8JIBTwIhmhxGRbsY14qhTltQt+Vw3b7tcJNEbk8ium8AQfZeD4tabCnNqfkD1g',
290
+ 'base64',
291
+ ),
292
+ },
293
+ ],
294
+ };
295
+ const sData = {
296
+ serialized: [
297
+ '$argon2i$v=19$m=120,t=5000,p=2,keyid=Hj5+dsK0,data=sRlHhRmKUGzdOmXn01XmXygd5Kc$iHSDPHzUhPzK7rCcJgOFfg$J4moa2MM0/6uf3HbY2Tf5Fux8JIBTwIhmhxGRbsY14qhTltQt+Vw3b7tcJNEbk8ium8AQfZeD4tabCnNqfkD1g',
298
+ ],
299
+ deserialized: [
300
+ {
301
+ id: 'argon2i',
302
+ version: 19,
303
+ params: {
304
+ m: 120,
305
+ t: 5000,
306
+ p: 2,
307
+ keyid: 'Hj5+dsK0',
308
+ data: bufferFrom('sRlHhRmKUGzdOmXn01XmXygd5Kc', 'base64'),
309
+ },
310
+ salt: bufferFrom('iHSDPHzUhPzK7rCcJgOFfg', 'base64'),
311
+ hash: bufferFrom(
312
+ 'J4moa2MM0/6uf3HbY2Tf5Fux8JIBTwIhmhxGRbsY14qhTltQt+Vw3b7tcJNEbk8ium8AQfZeD4tabCnNqfkD1g',
313
+ 'base64',
314
+ ),
315
+ },
316
+ ],
317
+ };