@ic-reactor/core 3.1.3 → 3.1.4
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/dist/types/variant.d.ts +4 -2
- package/dist/types/variant.d.ts.map +1 -1
- package/dist/utils/candid.d.ts +6 -2
- package/dist/utils/candid.d.ts.map +1 -1
- package/dist/utils/candid.js +37 -19
- package/dist/utils/candid.js.map +1 -1
- package/package.json +1 -1
- package/src/types/variant.ts +4 -2
- package/src/utils/candid.ts +57 -24
package/dist/types/variant.d.ts
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
export type IsCandidVariant<T> = [T] extends [CandidVariantToIntersection<T>] ? false : true;
|
|
2
2
|
export type CandidVariantToIntersection<U> = (U extends object ? (k: U) => void : never) extends (k: infer I) => void ? I : never;
|
|
3
|
-
export type CandidVariantKey<T> = T extends any ? keyof T : never;
|
|
4
|
-
export type CandidVariantValue<T, K extends CandidVariantKey<T>> = T extends Record<K, infer U> ? U :
|
|
3
|
+
export type CandidVariantKey<T> = T extends any ? Exclude<keyof T, "_type"> : never;
|
|
4
|
+
export type CandidVariantValue<T, K extends CandidVariantKey<T>> = T extends Record<K, infer U> ? U : T extends {
|
|
5
|
+
_type: K;
|
|
6
|
+
} ? null : never;
|
|
5
7
|
export type CandidVariant<T> = IsCandidVariant<T> extends true ? {
|
|
6
8
|
_type: CandidVariantKey<T> & string;
|
|
7
9
|
} & {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"variant.d.ts","sourceRoot":"","sources":["../../src/types/variant.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,eAAe,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,2BAA2B,CAAC,CAAC,CAAC,CAAC,GACzE,KAAK,GACL,IAAI,CAAA;AAER,MAAM,MAAM,2BAA2B,CAAC,CAAC,IAAI,CAC3C,CAAC,SAAS,MAAM,GAAG,CAAC,CAAC,EAAE,CAAC,KAAK,IAAI,GAAG,KAAK,CAC1C,SAAS,CAAC,CAAC,EAAE,MAAM,CAAC,KAAK,IAAI,GAC1B,CAAC,GACD,KAAK,CAAA;AAET,MAAM,MAAM,gBAAgB,CAAC,CAAC,IAAI,CAAC,SAAS,GAAG,
|
|
1
|
+
{"version":3,"file":"variant.d.ts","sourceRoot":"","sources":["../../src/types/variant.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,eAAe,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,2BAA2B,CAAC,CAAC,CAAC,CAAC,GACzE,KAAK,GACL,IAAI,CAAA;AAER,MAAM,MAAM,2BAA2B,CAAC,CAAC,IAAI,CAC3C,CAAC,SAAS,MAAM,GAAG,CAAC,CAAC,EAAE,CAAC,KAAK,IAAI,GAAG,KAAK,CAC1C,SAAS,CAAC,CAAC,EAAE,MAAM,CAAC,KAAK,IAAI,GAC1B,CAAC,GACD,KAAK,CAAA;AAET,MAAM,MAAM,gBAAgB,CAAC,CAAC,IAAI,CAAC,SAAS,GAAG,GAC3C,OAAO,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,GACzB,KAAK,CAAA;AAET,MAAM,MAAM,kBAAkB,CAAC,CAAC,EAAE,CAAC,SAAS,gBAAgB,CAAC,CAAC,CAAC,IAC7D,CAAC,SAAS,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,SAAS;IAAE,KAAK,EAAE,CAAC,CAAA;CAAE,GAAG,IAAI,GAAG,KAAK,CAAA;AAE1E,MAAM,MAAM,aAAa,CAAC,CAAC,IACzB,eAAe,CAAC,CAAC,CAAC,SAAS,IAAI,GAC3B;IACE,KAAK,EAAE,gBAAgB,CAAC,CAAC,CAAC,GAAG,MAAM,CAAA;CACpC,GAAG;KACD,CAAC,IAAI,gBAAgB,CAAC,CAAC,CAAC,GAAG,MAAM,IAAI,kBAAkB,CACtD,CAAC,EACD,CAAC,CACF,SAAS,IAAI,GACV,KAAK,GACL,CAAC,GAAG,kBAAkB,CAAC,CAAC,EAAE,CAAC,CAAC;CACjC,GACD,CAAC,CAAA;AAEP;;;GAGG;AACH,MAAM,MAAM,cAAc,CAAC,CAAC,IAAI,CAAC,SAAS,MAAM,CAAC,GAC7C;IACE,gBAAgB,CAAC,CAAC,CAAC,GAAG,MAAM;IAC5B,kBAAkB,CAAC,CAAC,EAAE,gBAAgB,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC;CACpD,GACD,KAAK,CAAA"}
|
package/dist/utils/candid.d.ts
CHANGED
|
@@ -15,21 +15,25 @@ export declare function createVariant<T extends Record<string, any>>(variant: T)
|
|
|
15
15
|
* Extract variant key and value from a variant type
|
|
16
16
|
* Works with types like:
|
|
17
17
|
* type User = { 'Business': BusinessUser } | { 'Individual': IndividualUser }
|
|
18
|
+
* Also supports display variants shaped like:
|
|
19
|
+
* { _type: "Business", Business: value } or { _type: "Individual" }
|
|
18
20
|
*
|
|
19
21
|
* @template T - The variant type
|
|
20
22
|
* @returns A tuple containing the key and value of the variant
|
|
21
|
-
* @throws Error if the variant object
|
|
23
|
+
* @throws Error if the variant object is malformed
|
|
22
24
|
*/
|
|
23
25
|
export declare function getVariantKeyValue<T extends Record<string, any>>(variant: T): CandidKeyValue<T>;
|
|
24
26
|
/**
|
|
25
27
|
* Extracts the key from a Candid variant type.
|
|
26
|
-
*
|
|
28
|
+
* Supports both raw Candid variants ({ Ok: value }) and display variants
|
|
29
|
+
* ({ _type: "Ok", Ok: value }).
|
|
27
30
|
* @param variant - The variant object
|
|
28
31
|
* @returns The key of the variant
|
|
29
32
|
*/
|
|
30
33
|
export declare function getVariantKey<T extends Record<string, any>>(variant: T): CandidVariantKey<T>;
|
|
31
34
|
/**
|
|
32
35
|
* Extracts the value from a Candid variant type.
|
|
36
|
+
* Supports both raw Candid variants and display variants.
|
|
33
37
|
* @param variant - The variant object
|
|
34
38
|
* @returns The value associated with the variant's key
|
|
35
39
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"candid.d.ts","sourceRoot":"","sources":["../../src/utils/candid.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,aAAa,EACb,gBAAgB,EAChB,kBAAkB,EAClB,cAAc,EACf,MAAM,UAAU,CAAA;
|
|
1
|
+
{"version":3,"file":"candid.d.ts","sourceRoot":"","sources":["../../src/utils/candid.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,aAAa,EACb,gBAAgB,EAChB,kBAAkB,EAClB,cAAc,EACf,MAAM,UAAU,CAAA;AA4CjB;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,SAAS,MAAM,EAAE,GAAG,EAAE,CAAC,GAAG,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,CAE3E;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACzD,OAAO,EAAE,CAAC,GACT,aAAa,CAAC,CAAC,CAAC,CAgBlB;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,kBAAkB,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAC9D,OAAO,EAAE,CAAC,GACT,cAAc,CAAC,CAAC,CAAC,CAEnB;AAED;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACzD,OAAO,EAAE,CAAC,GACT,gBAAgB,CAAC,CAAC,CAAC,CAErB;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAC7B,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAC7B,CAAC,SAAS,gBAAgB,CAAC,CAAC,CAAC,GAAG,gBAAgB,CAAC,CAAC,CAAC,EACnD,OAAO,EAAE,CAAC,GAAG,kBAAkB,CAAC,CAAC,EAAE,CAAC,CAAC,CAEtC;AAED,wBAAgB,oBAAoB,CAClC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAC7B,CAAC,SAAS,gBAAgB,CAAC,CAAC,CAAC,EAC7B,OAAO,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,kBAAkB,CAAC,CAAC,EAAE,CAAC,CAAC,CAQ9C;AAED,wBAAgB,iBAAiB,CAC/B,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAC7B,CAAC,SAAS,gBAAgB,CAAC,CAAC,CAAC,EAC7B,OAAO,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,OAAO,IAAI,CAAC,GAAG,MAAM,CAAC,CAAC,EAAE,OAAO,CAAC,CAEvD"}
|
package/dist/utils/candid.js
CHANGED
|
@@ -1,3 +1,27 @@
|
|
|
1
|
+
const VARIANT_DISCRIMINATOR = "_type";
|
|
2
|
+
function extractVariantDetails(variant) {
|
|
3
|
+
const keys = Object.keys(variant);
|
|
4
|
+
if (VARIANT_DISCRIMINATOR in variant &&
|
|
5
|
+
typeof variant[VARIANT_DISCRIMINATOR] === "string") {
|
|
6
|
+
const key = variant[VARIANT_DISCRIMINATOR];
|
|
7
|
+
const payloadKeys = keys.filter((item) => item !== VARIANT_DISCRIMINATOR);
|
|
8
|
+
if (payloadKeys.length > 1) {
|
|
9
|
+
throw new Error(`Invalid variant: must have at most one payload key when using ${VARIANT_DISCRIMINATOR}, found ${payloadKeys}`);
|
|
10
|
+
}
|
|
11
|
+
if (payloadKeys.length === 1 && payloadKeys[0] !== key) {
|
|
12
|
+
throw new Error(`Invalid variant: discriminator ${VARIANT_DISCRIMINATOR}=${key} does not match payload key ${payloadKeys[0]}`);
|
|
13
|
+
}
|
|
14
|
+
const value = (key in variant ? variant[key] : null);
|
|
15
|
+
return [key, value];
|
|
16
|
+
}
|
|
17
|
+
if (keys.length !== 1) {
|
|
18
|
+
const msg = `Invalid variant: must have exactly one key but found ${keys.length} keys: ${keys}`;
|
|
19
|
+
throw new Error(msg);
|
|
20
|
+
}
|
|
21
|
+
const key = keys[0];
|
|
22
|
+
const value = variant[key];
|
|
23
|
+
return [key, value];
|
|
24
|
+
}
|
|
1
25
|
/**
|
|
2
26
|
* Creates a Candid variant from a string value.
|
|
3
27
|
* @param str - The string to convert into a variant
|
|
@@ -29,47 +53,41 @@ export function createVariant(variant) {
|
|
|
29
53
|
* Extract variant key and value from a variant type
|
|
30
54
|
* Works with types like:
|
|
31
55
|
* type User = { 'Business': BusinessUser } | { 'Individual': IndividualUser }
|
|
56
|
+
* Also supports display variants shaped like:
|
|
57
|
+
* { _type: "Business", Business: value } or { _type: "Individual" }
|
|
32
58
|
*
|
|
33
59
|
* @template T - The variant type
|
|
34
60
|
* @returns A tuple containing the key and value of the variant
|
|
35
|
-
* @throws Error if the variant object
|
|
61
|
+
* @throws Error if the variant object is malformed
|
|
36
62
|
*/
|
|
37
63
|
export function getVariantKeyValue(variant) {
|
|
38
|
-
|
|
39
|
-
if (keys.length !== 1) {
|
|
40
|
-
const msg = `Invalid variant: must have exactly one key but found ${keys.length} keys: ${keys}`;
|
|
41
|
-
throw new Error(msg);
|
|
42
|
-
}
|
|
43
|
-
const key = keys[0];
|
|
44
|
-
const value = variant[key];
|
|
45
|
-
return [key, value];
|
|
64
|
+
return extractVariantDetails(variant);
|
|
46
65
|
}
|
|
47
66
|
/**
|
|
48
67
|
* Extracts the key from a Candid variant type.
|
|
49
|
-
*
|
|
68
|
+
* Supports both raw Candid variants ({ Ok: value }) and display variants
|
|
69
|
+
* ({ _type: "Ok", Ok: value }).
|
|
50
70
|
* @param variant - The variant object
|
|
51
71
|
* @returns The key of the variant
|
|
52
72
|
*/
|
|
53
73
|
export function getVariantKey(variant) {
|
|
54
|
-
|
|
55
|
-
if (keys.length !== 1) {
|
|
56
|
-
throw new Error(`Invalid variant: must have exactly one key but found ${keys}`);
|
|
57
|
-
}
|
|
58
|
-
return keys[0];
|
|
74
|
+
return extractVariantDetails(variant)[0];
|
|
59
75
|
}
|
|
60
76
|
/**
|
|
61
77
|
* Extracts the value from a Candid variant type.
|
|
78
|
+
* Supports both raw Candid variants and display variants.
|
|
62
79
|
* @param variant - The variant object
|
|
63
80
|
* @returns The value associated with the variant's key
|
|
64
81
|
*/
|
|
65
82
|
export function getVariantValue(variant) {
|
|
66
|
-
return
|
|
83
|
+
return getVariantKeyValue(variant)[1];
|
|
67
84
|
}
|
|
68
85
|
export function getVariantValueByKey(variant, key) {
|
|
69
|
-
|
|
70
|
-
|
|
86
|
+
const [actualKey, value] = getVariantKeyValue(variant);
|
|
87
|
+
if (actualKey !== key) {
|
|
88
|
+
throw new Error(`Variant key mismatch: expected ${key}, got ${actualKey}`);
|
|
71
89
|
}
|
|
72
|
-
return
|
|
90
|
+
return value;
|
|
73
91
|
}
|
|
74
92
|
export function isKeyMatchVariant(variant, key) {
|
|
75
93
|
return getVariantKey(variant) === key;
|
package/dist/utils/candid.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"candid.js","sourceRoot":"","sources":["../../src/utils/candid.ts"],"names":[],"mappings":"AAOA
|
|
1
|
+
{"version":3,"file":"candid.js","sourceRoot":"","sources":["../../src/utils/candid.ts"],"names":[],"mappings":"AAOA,MAAM,qBAAqB,GAAG,OAAO,CAAA;AAErC,SAAS,qBAAqB,CAC5B,OAAU;IAEV,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;IAEjC,IACE,qBAAqB,IAAI,OAAO;QAChC,OAAO,OAAO,CAAC,qBAAqB,CAAC,KAAK,QAAQ,EAClD,CAAC;QACD,MAAM,GAAG,GAAG,OAAO,CAAC,qBAAqB,CAAyB,CAAA;QAClE,MAAM,WAAW,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,KAAK,qBAAqB,CAAC,CAAA;QAEzE,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC3B,MAAM,IAAI,KAAK,CACb,iEAAiE,qBAAqB,WAAW,WAAW,EAAE,CAC/G,CAAA;QACH,CAAC;QAED,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,IAAI,WAAW,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;YACvD,MAAM,IAAI,KAAK,CACb,kCAAkC,qBAAqB,IAAI,GAAG,+BAA+B,WAAW,CAAC,CAAC,CAAC,EAAE,CAC9G,CAAA;QACH,CAAC;QAED,MAAM,KAAK,GAAG,CAAC,GAAG,IAAI,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAyB,CAAA;QAE5E,OAAO,CAAC,GAAG,EAAE,KAAK,CAAsB,CAAA;IAC1C,CAAC;IAED,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtB,MAAM,GAAG,GAAG,wDAAwD,IAAI,CAAC,MAAM,UAAU,IAAI,EAAE,CAAA;QAC/F,MAAM,IAAI,KAAK,CAAC,GAAG,CAAC,CAAA;IACtB,CAAC;IAED,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAyB,CAAA;IAC3C,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAyB,CAAA;IAElD,OAAO,CAAC,GAAG,EAAE,KAAK,CAAsB,CAAA;AAC1C,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAAmB,GAAM;IACxD,OAAO,EAAE,CAAC,GAAG,CAAC,EAAE,IAAI,EAAqB,CAAA;AAC3C,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,aAAa,CAC3B,OAAU;IAEV,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;IACjC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtB,MAAM,IAAI,KAAK,CAAC;6DACyC,IAAI,CAAC,MAAM,UAAU,IAAI,CAAC,GAAG,CAClF,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG,KAAK,OAAO,CAAC,GAAG,CAAC,EAAE,CACnC;KACF,CAAC,CAAA;IACJ,CAAC;IACD,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAY,CAAA;IAC9B,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,CAAA;IAE1B,OAAO;QACL,KAAK,EAAE,GAAG;QACV,GAAG,CAAC,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACxB,CAAA;AACvB,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,kBAAkB,CAChC,OAAU;IAEV,OAAO,qBAAqB,CAAC,OAAO,CAAC,CAAA;AACvC,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,aAAa,CAC3B,OAAU;IAEV,OAAO,qBAAqB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAwB,CAAA;AACjE,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,eAAe,CAG7B,OAAU;IACV,OAAO,kBAAkB,CAAC,OAAO,CAAC,CAAC,CAAC,CAA6B,CAAA;AACnE,CAAC;AAED,MAAM,UAAU,oBAAoB,CAGlC,OAAU,EAAE,GAAM;IAClB,MAAM,CAAC,SAAS,EAAE,KAAK,CAAC,GAAG,kBAAkB,CAAC,OAAO,CAAC,CAAA;IAEtD,IAAI,SAAS,KAAK,GAAG,EAAE,CAAC;QACtB,MAAM,IAAI,KAAK,CAAC,kCAAkC,GAAG,SAAS,SAAS,EAAE,CAAC,CAAA;IAC5E,CAAC;IAED,OAAO,KAAiC,CAAA;AAC1C,CAAC;AAED,MAAM,UAAU,iBAAiB,CAG/B,OAAU,EAAE,GAAM;IAClB,OAAO,aAAa,CAAC,OAAO,CAAC,KAAK,GAAG,CAAA;AACvC,CAAC"}
|
package/package.json
CHANGED
package/src/types/variant.ts
CHANGED
|
@@ -8,10 +8,12 @@ export type CandidVariantToIntersection<U> = (
|
|
|
8
8
|
? I
|
|
9
9
|
: never
|
|
10
10
|
|
|
11
|
-
export type CandidVariantKey<T> = T extends any
|
|
11
|
+
export type CandidVariantKey<T> = T extends any
|
|
12
|
+
? Exclude<keyof T, "_type">
|
|
13
|
+
: never
|
|
12
14
|
|
|
13
15
|
export type CandidVariantValue<T, K extends CandidVariantKey<T>> =
|
|
14
|
-
T extends Record<K, infer U> ? U : never
|
|
16
|
+
T extends Record<K, infer U> ? U : T extends { _type: K } ? null : never
|
|
15
17
|
|
|
16
18
|
export type CandidVariant<T> =
|
|
17
19
|
IsCandidVariant<T> extends true
|
package/src/utils/candid.ts
CHANGED
|
@@ -5,6 +5,48 @@ import {
|
|
|
5
5
|
CandidKeyValue,
|
|
6
6
|
} from "../types"
|
|
7
7
|
|
|
8
|
+
const VARIANT_DISCRIMINATOR = "_type"
|
|
9
|
+
|
|
10
|
+
function extractVariantDetails<T extends Record<string, any>>(
|
|
11
|
+
variant: T
|
|
12
|
+
): CandidKeyValue<T> {
|
|
13
|
+
const keys = Object.keys(variant)
|
|
14
|
+
|
|
15
|
+
if (
|
|
16
|
+
VARIANT_DISCRIMINATOR in variant &&
|
|
17
|
+
typeof variant[VARIANT_DISCRIMINATOR] === "string"
|
|
18
|
+
) {
|
|
19
|
+
const key = variant[VARIANT_DISCRIMINATOR] as CandidKeyValue<T>[0]
|
|
20
|
+
const payloadKeys = keys.filter((item) => item !== VARIANT_DISCRIMINATOR)
|
|
21
|
+
|
|
22
|
+
if (payloadKeys.length > 1) {
|
|
23
|
+
throw new Error(
|
|
24
|
+
`Invalid variant: must have at most one payload key when using ${VARIANT_DISCRIMINATOR}, found ${payloadKeys}`
|
|
25
|
+
)
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
if (payloadKeys.length === 1 && payloadKeys[0] !== key) {
|
|
29
|
+
throw new Error(
|
|
30
|
+
`Invalid variant: discriminator ${VARIANT_DISCRIMINATOR}=${key} does not match payload key ${payloadKeys[0]}`
|
|
31
|
+
)
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
const value = (key in variant ? variant[key] : null) as CandidKeyValue<T>[1]
|
|
35
|
+
|
|
36
|
+
return [key, value] as CandidKeyValue<T>
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
if (keys.length !== 1) {
|
|
40
|
+
const msg = `Invalid variant: must have exactly one key but found ${keys.length} keys: ${keys}`
|
|
41
|
+
throw new Error(msg)
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
const key = keys[0] as CandidKeyValue<T>[0]
|
|
45
|
+
const value = variant[key] as CandidKeyValue<T>[1]
|
|
46
|
+
|
|
47
|
+
return [key, value] as CandidKeyValue<T>
|
|
48
|
+
}
|
|
49
|
+
|
|
8
50
|
/**
|
|
9
51
|
* Creates a Candid variant from a string value.
|
|
10
52
|
* @param str - The string to convert into a variant
|
|
@@ -43,45 +85,35 @@ export function createVariant<T extends Record<string, any>>(
|
|
|
43
85
|
* Extract variant key and value from a variant type
|
|
44
86
|
* Works with types like:
|
|
45
87
|
* type User = { 'Business': BusinessUser } | { 'Individual': IndividualUser }
|
|
88
|
+
* Also supports display variants shaped like:
|
|
89
|
+
* { _type: "Business", Business: value } or { _type: "Individual" }
|
|
46
90
|
*
|
|
47
91
|
* @template T - The variant type
|
|
48
92
|
* @returns A tuple containing the key and value of the variant
|
|
49
|
-
* @throws Error if the variant object
|
|
93
|
+
* @throws Error if the variant object is malformed
|
|
50
94
|
*/
|
|
51
95
|
export function getVariantKeyValue<T extends Record<string, any>>(
|
|
52
96
|
variant: T
|
|
53
97
|
): CandidKeyValue<T> {
|
|
54
|
-
|
|
55
|
-
if (keys.length !== 1) {
|
|
56
|
-
const msg = `Invalid variant: must have exactly one key but found ${keys.length} keys: ${keys}`
|
|
57
|
-
throw new Error(msg)
|
|
58
|
-
}
|
|
59
|
-
const key = keys[0] as CandidKeyValue<T>[0]
|
|
60
|
-
const value = variant[key] as CandidKeyValue<T>[1]
|
|
61
|
-
|
|
62
|
-
return [key, value] as CandidKeyValue<T>
|
|
98
|
+
return extractVariantDetails(variant)
|
|
63
99
|
}
|
|
64
100
|
|
|
65
101
|
/**
|
|
66
102
|
* Extracts the key from a Candid variant type.
|
|
67
|
-
*
|
|
103
|
+
* Supports both raw Candid variants ({ Ok: value }) and display variants
|
|
104
|
+
* ({ _type: "Ok", Ok: value }).
|
|
68
105
|
* @param variant - The variant object
|
|
69
106
|
* @returns The key of the variant
|
|
70
107
|
*/
|
|
71
108
|
export function getVariantKey<T extends Record<string, any>>(
|
|
72
109
|
variant: T
|
|
73
110
|
): CandidVariantKey<T> {
|
|
74
|
-
|
|
75
|
-
if (keys.length !== 1) {
|
|
76
|
-
throw new Error(
|
|
77
|
-
`Invalid variant: must have exactly one key but found ${keys}`
|
|
78
|
-
)
|
|
79
|
-
}
|
|
80
|
-
return keys[0] as CandidVariantKey<T>
|
|
111
|
+
return extractVariantDetails(variant)[0] as CandidVariantKey<T>
|
|
81
112
|
}
|
|
82
113
|
|
|
83
114
|
/**
|
|
84
115
|
* Extracts the value from a Candid variant type.
|
|
116
|
+
* Supports both raw Candid variants and display variants.
|
|
85
117
|
* @param variant - The variant object
|
|
86
118
|
* @returns The value associated with the variant's key
|
|
87
119
|
*/
|
|
@@ -89,19 +121,20 @@ export function getVariantValue<
|
|
|
89
121
|
T extends Record<string, any>,
|
|
90
122
|
K extends CandidVariantKey<T> = CandidVariantKey<T>,
|
|
91
123
|
>(variant: T): CandidVariantValue<T, K> {
|
|
92
|
-
return
|
|
124
|
+
return getVariantKeyValue(variant)[1] as CandidVariantValue<T, K>
|
|
93
125
|
}
|
|
94
126
|
|
|
95
127
|
export function getVariantValueByKey<
|
|
96
128
|
T extends Record<string, any>,
|
|
97
129
|
K extends CandidVariantKey<T>,
|
|
98
130
|
>(variant: T, key: K): CandidVariantValue<T, K> {
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
)
|
|
131
|
+
const [actualKey, value] = getVariantKeyValue(variant)
|
|
132
|
+
|
|
133
|
+
if (actualKey !== key) {
|
|
134
|
+
throw new Error(`Variant key mismatch: expected ${key}, got ${actualKey}`)
|
|
103
135
|
}
|
|
104
|
-
|
|
136
|
+
|
|
137
|
+
return value as CandidVariantValue<T, K>
|
|
105
138
|
}
|
|
106
139
|
|
|
107
140
|
export function isKeyMatchVariant<
|