@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.
@@ -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 : never;
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,GAAG,MAAM,CAAC,GAAG,KAAK,CAAA;AAEjE,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,KAAK,CAAA;AAE1C,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"}
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"}
@@ -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 does not have exactly one key
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
- * Variants in Candid are represented as objects with a single key-value pair.
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;AAEjB;;;;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;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAC9D,OAAO,EAAE,CAAC,GACT,cAAc,CAAC,CAAC,CAAC,CAUnB;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACzD,OAAO,EAAE,CAAC,GACT,gBAAgB,CAAC,CAAC,CAAC,CAQrB;AAED;;;;GAIG;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,CAO9C;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"}
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"}
@@ -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 does not have exactly one key
61
+ * @throws Error if the variant object is malformed
36
62
  */
37
63
  export function getVariantKeyValue(variant) {
38
- const keys = Object.keys(variant);
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
- * Variants in Candid are represented as objects with a single key-value pair.
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
- const keys = Object.keys(variant);
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 variant[getVariantKey(variant)];
83
+ return getVariantKeyValue(variant)[1];
67
84
  }
68
85
  export function getVariantValueByKey(variant, key) {
69
- if (getVariantKey(variant) !== key) {
70
- throw new Error(`Variant key mismatch: expected ${key}, got ${getVariantKey(variant)}`);
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 variant[key];
90
+ return value;
73
91
  }
74
92
  export function isKeyMatchVariant(variant, key) {
75
93
  return getVariantKey(variant) === key;
@@ -1 +1 @@
1
- {"version":3,"file":"candid.js","sourceRoot":"","sources":["../../src/utils/candid.ts"],"names":[],"mappings":"AAOA;;;;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;;;;;;;;GAQG;AACH,MAAM,UAAU,kBAAkB,CAChC,OAAU;IAEV,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;IACjC,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;IACD,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;;;;;GAKG;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,CACb,wDAAwD,IAAI,EAAE,CAC/D,CAAA;IACH,CAAC;IACD,OAAO,IAAI,CAAC,CAAC,CAAwB,CAAA;AACvC,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAG7B,OAAU;IACV,OAAO,OAAO,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAA;AACxC,CAAC;AAED,MAAM,UAAU,oBAAoB,CAGlC,OAAU,EAAE,GAAM;IAClB,IAAI,aAAa,CAAC,OAAO,CAAC,KAAK,GAAG,EAAE,CAAC;QACnC,MAAM,IAAI,KAAK,CACb,kCAAkC,GAAG,SAAS,aAAa,CAAC,OAAO,CAAC,EAAE,CACvE,CAAA;IACH,CAAC;IACD,OAAO,OAAO,CAAC,GAAG,CAAC,CAAA;AACrB,CAAC;AAED,MAAM,UAAU,iBAAiB,CAG/B,OAAU,EAAE,GAAM;IAClB,OAAO,aAAa,CAAC,OAAO,CAAC,KAAK,GAAG,CAAA;AACvC,CAAC"}
1
+ {"version":3,"file":"candid.js","sourceRoot":"","sources":["../../src/utils/candid.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ic-reactor/core",
3
- "version": "3.1.3",
3
+ "version": "3.1.4",
4
4
  "description": "IC Reactor Core Library",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.js",
@@ -8,10 +8,12 @@ export type CandidVariantToIntersection<U> = (
8
8
  ? I
9
9
  : never
10
10
 
11
- export type CandidVariantKey<T> = T extends any ? keyof T : never
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
@@ -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 does not have exactly one key
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
- const keys = Object.keys(variant)
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
- * Variants in Candid are represented as objects with a single key-value pair.
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
- const keys = Object.keys(variant)
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 variant[getVariantKey(variant)]
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
- if (getVariantKey(variant) !== key) {
100
- throw new Error(
101
- `Variant key mismatch: expected ${key}, got ${getVariantKey(variant)}`
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
- return variant[key]
136
+
137
+ return value as CandidVariantValue<T, K>
105
138
  }
106
139
 
107
140
  export function isKeyMatchVariant<