@interop/ecdsa-multikey 2.0.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.
Files changed (44) hide show
  1. package/CHANGELOG.md +146 -0
  2. package/LICENSE +29 -0
  3. package/README.md +163 -0
  4. package/dist/baseX.d.ts +7 -0
  5. package/dist/baseX.d.ts.map +1 -0
  6. package/dist/baseX.js +11 -0
  7. package/dist/baseX.js.map +1 -0
  8. package/dist/constants.d.ts +29 -0
  9. package/dist/constants.d.ts.map +1 -0
  10. package/dist/constants.js +43 -0
  11. package/dist/constants.js.map +1 -0
  12. package/dist/crypto-browser.d.ts +9 -0
  13. package/dist/crypto-browser.d.ts.map +1 -0
  14. package/dist/crypto-browser.js +7 -0
  15. package/dist/crypto-browser.js.map +1 -0
  16. package/dist/crypto.d.ts +7 -0
  17. package/dist/crypto.d.ts.map +1 -0
  18. package/dist/crypto.js +12 -0
  19. package/dist/crypto.js.map +1 -0
  20. package/dist/factory.d.ts +10 -0
  21. package/dist/factory.d.ts.map +1 -0
  22. package/dist/factory.js +55 -0
  23. package/dist/factory.js.map +1 -0
  24. package/dist/helpers.d.ts +18 -0
  25. package/dist/helpers.d.ts.map +1 -0
  26. package/dist/helpers.js +82 -0
  27. package/dist/helpers.js.map +1 -0
  28. package/dist/index.d.ts +29 -0
  29. package/dist/index.d.ts.map +1 -0
  30. package/dist/index.js +221 -0
  31. package/dist/index.js.map +1 -0
  32. package/dist/serialize.d.ts +44 -0
  33. package/dist/serialize.d.ts.map +1 -0
  34. package/dist/serialize.js +302 -0
  35. package/dist/serialize.js.map +1 -0
  36. package/dist/translators.d.ts +5 -0
  37. package/dist/translators.d.ts.map +1 -0
  38. package/dist/translators.js +40 -0
  39. package/dist/translators.js.map +1 -0
  40. package/dist/types.d.ts +69 -0
  41. package/dist/types.d.ts.map +1 -0
  42. package/dist/types.js +5 -0
  43. package/dist/types.js.map +1 -0
  44. package/package.json +72 -0
@@ -0,0 +1,82 @@
1
+ /*!
2
+ * Copyright (c) 2022-2023 Digital Bazaar, Inc. All rights reserved.
3
+ */
4
+ import { ECDSA_CURVE, MULTICODEC_P256_PUBLIC_KEY_HEADER, MULTICODEC_P256_SECRET_KEY_HEADER, MULTICODEC_P384_PUBLIC_KEY_HEADER, MULTICODEC_P384_SECRET_KEY_HEADER, MULTICODEC_P521_PUBLIC_KEY_HEADER, MULTICODEC_P521_SECRET_KEY_HEADER } from './constants.js';
5
+ // retrieves name of appropriate ECDSA curve from public Multikey
6
+ export function getNamedCurveFromPublicMultikey({ publicMultikey }) {
7
+ if (publicMultikey[0] === MULTICODEC_P256_PUBLIC_KEY_HEADER[0] &&
8
+ publicMultikey[1] === MULTICODEC_P256_PUBLIC_KEY_HEADER[1]) {
9
+ return ECDSA_CURVE.P256;
10
+ }
11
+ if (publicMultikey[0] === MULTICODEC_P384_PUBLIC_KEY_HEADER[0] &&
12
+ publicMultikey[1] === MULTICODEC_P384_PUBLIC_KEY_HEADER[1]) {
13
+ return ECDSA_CURVE.P384;
14
+ }
15
+ if (publicMultikey[0] === MULTICODEC_P521_PUBLIC_KEY_HEADER[0] &&
16
+ publicMultikey[1] === MULTICODEC_P521_PUBLIC_KEY_HEADER[1]) {
17
+ return ECDSA_CURVE.P521;
18
+ }
19
+ // FIXME; also support P-256K/secp256k1
20
+ throw new TypeError('Unsupported public multikey header.');
21
+ }
22
+ // retrieves name of appropriate ECDSA curve from secret Multikey
23
+ export function getNamedCurveFromSecretMultikey({ secretMultikey }) {
24
+ if (secretMultikey[0] === MULTICODEC_P256_SECRET_KEY_HEADER[0] &&
25
+ secretMultikey[1] === MULTICODEC_P256_SECRET_KEY_HEADER[1]) {
26
+ return ECDSA_CURVE.P256;
27
+ }
28
+ if (secretMultikey[0] === MULTICODEC_P384_SECRET_KEY_HEADER[0] &&
29
+ secretMultikey[1] === MULTICODEC_P384_SECRET_KEY_HEADER[1]) {
30
+ return ECDSA_CURVE.P384;
31
+ }
32
+ if (secretMultikey[0] === MULTICODEC_P521_SECRET_KEY_HEADER[0] &&
33
+ secretMultikey[1] === MULTICODEC_P521_SECRET_KEY_HEADER[1]) {
34
+ return ECDSA_CURVE.P521;
35
+ }
36
+ // FIXME; also support P-256K/secp256k1
37
+ throw new TypeError('Unsupported secret multikey header.');
38
+ }
39
+ // retrieves byte size of secret key
40
+ export function getSecretKeySize({ curve }) {
41
+ if (curve === ECDSA_CURVE.P256) {
42
+ return 32;
43
+ }
44
+ if (curve === ECDSA_CURVE.P384) {
45
+ return 48;
46
+ }
47
+ if (curve === ECDSA_CURVE.P521) {
48
+ return 66;
49
+ }
50
+ throw new TypeError(`Unsupported curve "${curve}".`);
51
+ }
52
+ // sets secret key header bytes on key pair
53
+ export function setSecretKeyHeader({ curve, buffer }) {
54
+ if (curve === ECDSA_CURVE.P256) {
55
+ buffer.set(MULTICODEC_P256_SECRET_KEY_HEADER);
56
+ }
57
+ else if (curve === ECDSA_CURVE.P384) {
58
+ buffer.set(MULTICODEC_P384_SECRET_KEY_HEADER);
59
+ }
60
+ else if (curve === ECDSA_CURVE.P521) {
61
+ buffer.set(MULTICODEC_P521_SECRET_KEY_HEADER);
62
+ }
63
+ else {
64
+ throw new TypeError(`Unsupported curve "${curve}".`);
65
+ }
66
+ }
67
+ // sets public key header bytes on key pair
68
+ export function setPublicKeyHeader({ curve, buffer }) {
69
+ if (curve === ECDSA_CURVE.P256) {
70
+ buffer.set(MULTICODEC_P256_PUBLIC_KEY_HEADER);
71
+ }
72
+ else if (curve === ECDSA_CURVE.P384) {
73
+ buffer.set(MULTICODEC_P384_PUBLIC_KEY_HEADER);
74
+ }
75
+ else if (curve === ECDSA_CURVE.P521) {
76
+ buffer.set(MULTICODEC_P521_PUBLIC_KEY_HEADER);
77
+ }
78
+ else {
79
+ throw new TypeError(`Unsupported curve "${curve}".`);
80
+ }
81
+ }
82
+ //# sourceMappingURL=helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"helpers.js","sourceRoot":"","sources":["../src/helpers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ import type { Jwk, KeyPairInterface, Multikey } from './types.js';
2
+ export type { DeriveSecretOptions, ExportOptions, ExportedKeyPair, Jwk, KeyPairInterface, Multikey, Signer, Verifier } from './types.js';
3
+ export declare function generate({ id, controller, curve, keyAgreement }?: {
4
+ id?: string;
5
+ controller?: string;
6
+ curve?: string;
7
+ keyAgreement?: boolean;
8
+ }): Promise<KeyPairInterface>;
9
+ export declare function from(key: Multikey, options?: {
10
+ keyAgreement?: boolean;
11
+ } | boolean): Promise<KeyPairInterface>;
12
+ export declare function fromJwk({ jwk, secretKey, id, controller }?: {
13
+ jwk: Jwk;
14
+ secretKey?: boolean;
15
+ id?: string;
16
+ controller?: string;
17
+ keyAgreement?: boolean;
18
+ }): Promise<KeyPairInterface>;
19
+ export declare function toJwk({ keyPair, secretKey }?: {
20
+ keyPair: any;
21
+ secretKey?: boolean;
22
+ }): Promise<Jwk>;
23
+ export declare function fromRaw({ curve, secretKey, publicKey, keyAgreement }?: {
24
+ curve: string;
25
+ secretKey?: Uint8Array;
26
+ publicKey: Uint8Array;
27
+ keyAgreement?: boolean;
28
+ }): Promise<KeyPairInterface>;
29
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAsBA,OAAO,KAAK,EAIV,GAAG,EACH,gBAAgB,EAChB,QAAQ,EACT,MAAM,YAAY,CAAA;AAEnB,YAAY,EACV,mBAAmB,EACnB,aAAa,EACb,eAAe,EACf,GAAG,EACH,gBAAgB,EAChB,QAAQ,EACR,MAAM,EACN,QAAQ,EACT,MAAM,YAAY,CAAA;AAInB,wBAAsB,QAAQ,CAAC,EAC7B,EAAE,EACF,UAAU,EACV,KAAK,EACL,YAAoB,EACrB,GAAE;IACD,EAAE,CAAC,EAAE,MAAM,CAAA;IACX,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,YAAY,CAAC,EAAE,OAAO,CAAA;CAClB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAgCjC;AAGD,wBAAsB,IAAI,CACxB,GAAG,EAAE,QAAQ,EACb,OAAO,GAAE;IAAE,YAAY,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,OAAY,GACjD,OAAO,CAAC,gBAAgB,CAAC,CA2C3B;AAGD,wBAAsB,OAAO,CAC3B,EACE,GAAG,EACH,SAAiB,EACjB,EAAE,EACF,UAAU,EACX,GAAE;IACD,GAAG,EAAE,GAAG,CAAA;IACR,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,EAAE,CAAC,EAAE,MAAM,CAAA;IACX,UAAU,CAAC,EAAE,MAAM,CAAA;IAGnB,YAAY,CAAC,EAAE,OAAO,CAAA;CACF,GACrB,OAAO,CAAC,gBAAgB,CAAC,CAiB3B;AAGD,wBAAsB,KAAK,CACzB,EACE,OAAO,EACP,SAAiB,EAClB,GAAE;IACD,OAAO,EAAE,GAAG,CAAA;IACZ,SAAS,CAAC,EAAE,OAAO,CAAA;CACK,GACzB,OAAO,CAAC,GAAG,CAAC,CAQd;AAGD,wBAAsB,OAAO,CAC3B,EACE,KAAK,EACL,SAAS,EACT,SAAS,EACT,YAAoB,EACrB,GAAE;IACD,KAAK,EAAE,MAAM,CAAA;IACb,SAAS,CAAC,EAAE,UAAU,CAAA;IACtB,SAAS,EAAE,UAAU,CAAA;IACrB,YAAY,CAAC,EAAE,OAAO,CAAA;CAC0B,GACjD,OAAO,CAAC,gBAAgB,CAAC,CAkB3B"}
package/dist/index.js ADDED
@@ -0,0 +1,221 @@
1
+ /*!
2
+ * Copyright (c) 2022-2023 Digital Bazaar, Inc. All rights reserved.
3
+ */
4
+ import { ALGORITHM, ECDSA_CURVE, EXTRACTABLE, MULTIKEY_CONTEXT_V1_URL } from './constants.js';
5
+ import { CryptoKey, webcrypto } from './crypto.js';
6
+ import { createSigner, createVerifier } from './factory.js';
7
+ import { cryptoKeyfromRaw, exportKeyPair, importKeyPair, toPublicKeyBytes, toSecretKeyBytes, toPublicKeyMultibase, toSecretKeyMultibase } from './serialize.js';
8
+ import { getSecretKeySize } from './helpers.js';
9
+ import { toMultikey } from './translators.js';
10
+ // FIXME: support `P-256K` via `@noble/secp256k1`
11
+ // generates ECDSA key pair
12
+ export async function generate({ id, controller, curve, keyAgreement = false } = {}) {
13
+ if (!curve) {
14
+ throw new TypeError('"curve" must be one of the following values: ' +
15
+ `${Object.values(ECDSA_CURVE)
16
+ .map(v => `'${v}'`)
17
+ .join(', ')}.`);
18
+ }
19
+ const algorithm = keyAgreement
20
+ ? { name: 'ECDH', namedCurve: curve }
21
+ : { name: ALGORITHM, namedCurve: curve };
22
+ const usage = keyAgreement ? ['deriveBits'] : ['sign', 'verify'];
23
+ const keyPair = await webcrypto.subtle.generateKey(algorithm, EXTRACTABLE, usage);
24
+ keyPair.secretKey = keyPair.privateKey;
25
+ delete keyPair.privateKey;
26
+ const keyPairInterface = await _createKeyPairInterface({
27
+ keyPair,
28
+ keyAgreement
29
+ });
30
+ const exportedKeyPair = await keyPairInterface.export({ publicKey: true });
31
+ const { publicKeyMultibase } = exportedKeyPair;
32
+ if (controller && !id) {
33
+ id = `${controller}#${publicKeyMultibase}`;
34
+ }
35
+ keyPairInterface.id = id;
36
+ keyPairInterface.controller = controller;
37
+ return keyPairInterface;
38
+ }
39
+ // imports P-256 key pair from JSON Multikey
40
+ export async function from(key, options = {}) {
41
+ // backwards compatibility
42
+ if (typeof options === 'boolean') {
43
+ options = { keyAgreement: options };
44
+ }
45
+ const { keyAgreement } = options;
46
+ let multikey = { ...key };
47
+ if (multikey.type !== 'Multikey') {
48
+ // attempt loading from JWK if `publicKeyJwk` is present
49
+ if (multikey.publicKeyJwk) {
50
+ let id;
51
+ let controller;
52
+ if (multikey.type === 'JsonWebKey' ||
53
+ multikey.type === 'JsonWebKey2020') {
54
+ ;
55
+ ({ id, controller } = multikey);
56
+ }
57
+ return fromJwk({
58
+ jwk: multikey.publicKeyJwk,
59
+ secretKey: false,
60
+ id,
61
+ controller
62
+ });
63
+ }
64
+ if (multikey.type) {
65
+ multikey = await toMultikey({ keyPair: multikey });
66
+ return _createKeyPairInterface({ keyPair: multikey, keyAgreement });
67
+ }
68
+ }
69
+ if (!multikey.type) {
70
+ multikey.type = 'Multikey';
71
+ }
72
+ if (!multikey['@context']) {
73
+ multikey['@context'] = MULTIKEY_CONTEXT_V1_URL;
74
+ }
75
+ if (multikey.controller && !multikey.id) {
76
+ multikey.id = `${key.controller}#${key.publicKeyMultibase}`;
77
+ }
78
+ _assertMultikey(multikey);
79
+ return _createKeyPairInterface({ keyPair: multikey, keyAgreement });
80
+ }
81
+ // imports key pair from JWK
82
+ export async function fromJwk({ jwk, secretKey = false, id, controller } = {}) {
83
+ const multikey = {
84
+ '@context': MULTIKEY_CONTEXT_V1_URL,
85
+ type: 'Multikey',
86
+ publicKeyMultibase: toPublicKeyMultibase({ jwk })
87
+ };
88
+ if (typeof id === 'string') {
89
+ multikey.id = id;
90
+ }
91
+ if (typeof controller === 'string') {
92
+ multikey.controller = controller;
93
+ }
94
+ if (secretKey && jwk.d) {
95
+ multikey.secretKeyMultibase = toSecretKeyMultibase({ jwk });
96
+ }
97
+ const keyAgreement = !jwk.key_ops || jwk.key_ops.includes('deriveBits');
98
+ return from(multikey, keyAgreement);
99
+ }
100
+ // converts key pair to JWK
101
+ export async function toJwk({ keyPair, secretKey = false } = {}) {
102
+ if (!(keyPair?.publicKey instanceof CryptoKey)) {
103
+ keyPair = await importKeyPair(keyPair);
104
+ }
105
+ const useSecretKey = secretKey && !!keyPair.secretKey;
106
+ const cryptoKey = useSecretKey ? keyPair.secretKey : keyPair.publicKey;
107
+ const jwk = (await webcrypto.subtle.exportKey('jwk', cryptoKey));
108
+ return jwk;
109
+ }
110
+ // raw import from secretKey and publicKey bytes
111
+ export async function fromRaw({ curve, secretKey, publicKey, keyAgreement = false } = {}) {
112
+ if (typeof curve !== 'string') {
113
+ throw new TypeError('"curve" must be a string.');
114
+ }
115
+ if (secretKey && !(secretKey instanceof Uint8Array)) {
116
+ throw new TypeError('"secretKey" must be a Uint8Array.');
117
+ }
118
+ if (!(publicKey instanceof Uint8Array)) {
119
+ throw new TypeError('"publicKey" must be a Uint8Array.');
120
+ }
121
+ const cryptoKey = await cryptoKeyfromRaw({
122
+ curve,
123
+ secretKey,
124
+ publicKey,
125
+ keyAgreement
126
+ });
127
+ const jwk = (await webcrypto.subtle.exportKey('jwk', cryptoKey));
128
+ return fromJwk({ jwk, secretKey: !!secretKey, keyAgreement });
129
+ }
130
+ // augments key pair with useful metadata and utilities
131
+ async function _createKeyPairInterface({ keyPair, keyAgreement = false }) {
132
+ if (!(keyPair?.publicKey instanceof CryptoKey)) {
133
+ keyPair = await importKeyPair(keyPair);
134
+ }
135
+ const exportFn = async ({ publicKey = true, secretKey = false, includeContext = true, raw = false } = {}) => {
136
+ if (raw) {
137
+ const jwk = await toJwk({ keyPair, secretKey });
138
+ const result = {};
139
+ if (publicKey) {
140
+ result.publicKey = toPublicKeyBytes({ jwk });
141
+ }
142
+ if (secretKey) {
143
+ result.secretKey = toSecretKeyBytes({ jwk });
144
+ }
145
+ return result;
146
+ }
147
+ return exportKeyPair({ keyPair, publicKey, secretKey, includeContext });
148
+ };
149
+ const { publicKeyMultibase, secretKeyMultibase } = await exportFn({
150
+ publicKey: true,
151
+ secretKey: true,
152
+ includeContext: true
153
+ });
154
+ keyPair = {
155
+ ...keyPair,
156
+ publicKeyMultibase,
157
+ secretKeyMultibase,
158
+ keyAgreement,
159
+ export: exportFn,
160
+ signer() {
161
+ const { id, secretKey } = keyPair;
162
+ return createSigner({ id, secretKey });
163
+ },
164
+ verifier() {
165
+ const { id, publicKey } = keyPair;
166
+ return createVerifier({ id, publicKey });
167
+ },
168
+ // pass `publicKey`, as `remotePublicKey` is just a backwards compatible
169
+ // alias
170
+ async deriveSecret({ publicKey, remotePublicKey } = {}) {
171
+ if (remotePublicKey && publicKey) {
172
+ throw new Error('Only one of "remotePublicKey" and "publicKey" must be given.');
173
+ }
174
+ if (!keyPair.keyAgreement) {
175
+ const error = Error('"keyAgreement" is not supported by this keypair.');
176
+ error.name = 'NotSupportedError';
177
+ throw error;
178
+ }
179
+ return _deriveSecret({
180
+ localKeyPair: keyPair,
181
+ remoteKeyPair: remotePublicKey || publicKey
182
+ });
183
+ }
184
+ };
185
+ return keyPair;
186
+ }
187
+ // checks if key pair is in Multikey format
188
+ function _assertMultikey(key) {
189
+ if (!(key && typeof key === 'object')) {
190
+ throw new TypeError('"key" must be an object.');
191
+ }
192
+ if (key.type !== 'Multikey') {
193
+ throw new TypeError('"key" must be a Multikey with type "Multikey".');
194
+ }
195
+ if (!(key['@context'] === MULTIKEY_CONTEXT_V1_URL ||
196
+ (Array.isArray(key['@context']) &&
197
+ key['@context'].includes(MULTIKEY_CONTEXT_V1_URL)))) {
198
+ throw new TypeError('"key" must be a Multikey with context ' + `"${MULTIKEY_CONTEXT_V1_URL}".`);
199
+ }
200
+ }
201
+ async function _deriveSecret({ localKeyPair, remoteKeyPair }) {
202
+ if (!localKeyPair.secretKey) {
203
+ const error = Error('"secretKey" required to derive secret.');
204
+ error.name = 'NotSupportedError';
205
+ throw error;
206
+ }
207
+ // import keys with `keyAgreement` key usage
208
+ localKeyPair = await importKeyPair({ ...localKeyPair, keyAgreement: true });
209
+ remoteKeyPair = await importKeyPair({ ...remoteKeyPair, keyAgreement: true });
210
+ // produce shared secret that is the same size as a secret key, the
211
+ // shared secret should be used as just one input to a KDF
212
+ const { namedCurve: curve } = localKeyPair.secretKey.algorithm;
213
+ const secretSize = getSecretKeySize({ curve });
214
+ const arrayBuffer = await webcrypto.subtle.deriveBits({
215
+ name: 'ECDH',
216
+ namedCurve: curve,
217
+ public: remoteKeyPair.publicKey
218
+ }, localKeyPair.secretKey, secretSize * 8);
219
+ return new Uint8Array(arrayBuffer, 0, secretSize);
220
+ }
221
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ import type { Jwk, Multikey, WebCryptoKey } from './types.js';
2
+ export interface ImportedKeyPair {
3
+ id?: string;
4
+ controller?: string;
5
+ publicKey: WebCryptoKey;
6
+ secretKey?: WebCryptoKey;
7
+ }
8
+ export declare function cryptoKeyfromRaw({ curve, secretKey, publicKey, keyAgreement }: {
9
+ curve: string;
10
+ secretKey?: Uint8Array;
11
+ publicKey: Uint8Array;
12
+ keyAgreement?: boolean;
13
+ }): Promise<WebCryptoKey>;
14
+ export declare function exportKeyPair({ keyPair, secretKey, publicKey, includeContext }: {
15
+ keyPair: ImportedKeyPair;
16
+ secretKey?: boolean;
17
+ publicKey?: boolean;
18
+ includeContext?: boolean;
19
+ }): Promise<Multikey>;
20
+ export declare function importKeyPair({ id, controller, secretKeyMultibase, publicKeyMultibase, keyAgreement }: {
21
+ id?: string;
22
+ controller?: string;
23
+ secretKeyMultibase?: string;
24
+ publicKeyMultibase?: string;
25
+ keyAgreement?: boolean;
26
+ }): Promise<ImportedKeyPair>;
27
+ export declare function toPublicKeyBytes({ jwk }: {
28
+ jwk: Jwk;
29
+ }): Uint8Array;
30
+ export declare function toPublicKeyMultibase({ jwk }: {
31
+ jwk: Jwk;
32
+ }): string;
33
+ export declare function toSecretKeyBytes({ jwk }: {
34
+ jwk: Jwk;
35
+ }): Uint8Array;
36
+ export declare function toSecretKeyMultibase({ jwk }: {
37
+ jwk: Jwk;
38
+ }): string;
39
+ export declare function _rawToPkcs8({ curve, secretKey, publicKey }: {
40
+ curve: string;
41
+ secretKey: Uint8Array;
42
+ publicKey: Uint8Array;
43
+ }): Uint8Array<ArrayBuffer>;
44
+ //# sourceMappingURL=serialize.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serialize.d.ts","sourceRoot":"","sources":["../src/serialize.ts"],"names":[],"mappings":"AAmBA,OAAO,KAAK,EAAE,GAAG,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAG7D,MAAM,WAAW,eAAe;IAC9B,EAAE,CAAC,EAAE,MAAM,CAAA;IACX,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,SAAS,EAAE,YAAY,CAAA;IACvB,SAAS,CAAC,EAAE,YAAY,CAAA;CACzB;AAiED,wBAAsB,gBAAgB,CAAC,EACrC,KAAK,EACL,SAAS,EACT,SAAS,EACT,YAAY,EACb,EAAE;IACD,KAAK,EAAE,MAAM,CAAA;IACb,SAAS,CAAC,EAAE,UAAU,CAAA;IACtB,SAAS,EAAE,UAAU,CAAA;IACrB,YAAY,CAAC,EAAE,OAAO,CAAA;CACvB,GAAG,OAAO,CAAC,YAAY,CAAC,CA8BxB;AAGD,wBAAsB,aAAa,CAAC,EAClC,OAAO,EACP,SAAS,EACT,SAAS,EACT,cAAc,EACf,EAAE;IACD,OAAO,EAAE,eAAe,CAAA;IACxB,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,cAAc,CAAC,EAAE,OAAO,CAAA;CACzB,GAAG,OAAO,CAAC,QAAQ,CAAC,CA8BpB;AAGD,wBAAsB,aAAa,CAAC,EAClC,EAAE,EACF,UAAU,EACV,kBAAkB,EAClB,kBAAkB,EAClB,YAAoB,EACrB,EAAE;IACD,EAAE,CAAC,EAAE,MAAM,CAAA;IACX,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,kBAAkB,CAAC,EAAE,MAAM,CAAA;IAC3B,kBAAkB,CAAC,EAAE,MAAM,CAAA;IAC3B,YAAY,CAAC,EAAE,OAAO,CAAA;CACvB,GAAG,OAAO,CAAC,eAAe,CAAC,CA4E3B;AAED,wBAAgB,gBAAgB,CAAC,EAAE,GAAG,EAAE,EAAE;IAAE,GAAG,EAAE,GAAG,CAAA;CAAE,GAAG,UAAU,CAmBlE;AAED,wBAAgB,oBAAoB,CAAC,EAAE,GAAG,EAAE,EAAE;IAAE,GAAG,EAAE,GAAG,CAAA;CAAE,GAAG,MAAM,CAsBlE;AAED,wBAAgB,gBAAgB,CAAC,EAAE,GAAG,EAAE,EAAE;IAAE,GAAG,EAAE,GAAG,CAAA;CAAE,GAAG,UAAU,CAWlE;AAED,wBAAgB,oBAAoB,CAAC,EAAE,GAAG,EAAE,EAAE;IAAE,GAAG,EAAE,GAAG,CAAA;CAAE,GAAG,MAAM,CAclE;AA+CD,wBAAgB,WAAW,CAAC,EAC1B,KAAK,EACL,SAAS,EACT,SAAS,EACV,EAAE;IACD,KAAK,EAAE,MAAM,CAAA;IACb,SAAS,EAAE,UAAU,CAAA;IACrB,SAAS,EAAE,UAAU,CAAA;CACtB,GAAG,UAAU,CAAC,WAAW,CAAC,CAwC1B"}