@ic-reactor/candid 3.0.16-beta.0 → 3.0.16-beta.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.
|
@@ -21,10 +21,10 @@ export declare function isQuery(func: IDL.FuncClass): boolean;
|
|
|
21
21
|
export declare function isUrl(str: string): boolean;
|
|
22
22
|
export declare function isImage(str: string): boolean;
|
|
23
23
|
export declare function isUuid(str: string): boolean;
|
|
24
|
+
export declare function isPrincipalId(str: string): boolean;
|
|
24
25
|
export declare function isCanisterId(str: string): boolean;
|
|
25
26
|
export declare function isBtcAddress(str: string): boolean;
|
|
26
27
|
export declare function isEthAddress(str: string): boolean;
|
|
27
28
|
export declare function isAccountIdentifier(str: string): boolean;
|
|
28
29
|
export declare function isIsoDate(str: string): boolean;
|
|
29
|
-
export declare function uint8ArrayToHexString(bytes: Uint8Array | number[]): string;
|
|
30
30
|
//# sourceMappingURL=helpers.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../src/visitor/helpers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,sBAAsB,CAAA;
|
|
1
|
+
{"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../src/visitor/helpers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,sBAAsB,CAAA;AAG1C,eAAO,MAAM,kBAAkB,GAAI,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAClE,YAAY,CAAC,KACZ,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAYlB,CAAA;AAED;;;;;;;;;;GAUG;AACH,eAAO,MAAM,kBAAkB,GAAI,CAAC,EAAE,OAAO,CAAC,KAAG,CAgDhD,CAAA;AAED,eAAO,MAAM,iBAAiB,GAAI,MAAM,MAAM,SAE7C,CAAA;AAED,eAAO,MAAM,cAAc,GAAI,QAAQ,MAAM,WAO5C,CAAA;AAED,eAAO,MAAM,qBAAqB,GAAI,OAAO,MAAM,oBAOlD,CAAA;AAED,eAAO,MAAM,mBAAmB,GAAI,GAAG,GAAG,CAAC,IAAI,MACpB,OAAO,MAAM,kBAwBvC,CAAA;AAED,eAAO,MAAM,aAAa,GAAI,GAAG,GAAG,CAAC,IAAI,MACd,OAAO,OAAO,kBAQxC,CAAA;AAED,wBAAgB,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,SAAS,GAAG,OAAO,CAKpD;AAED,wBAAgB,KAAK,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAG1C;AAED,wBAAgB,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAgB5C;AAED,wBAAgB,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAK3C;AAED,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAQlD;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAMjD;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAOjD;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAGjD;AAED,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAIxD;AAED,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAO9C"}
|
package/dist/visitor/helpers.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { Principal } from "@icp-sdk/core/principal";
|
|
1
2
|
export const extractAndSortArgs = (argsObject) => {
|
|
2
3
|
if (!argsObject || typeof argsObject !== "object")
|
|
3
4
|
return [];
|
|
@@ -150,9 +151,22 @@ export function isUuid(str) {
|
|
|
150
151
|
return false;
|
|
151
152
|
return /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(str);
|
|
152
153
|
}
|
|
154
|
+
export function isPrincipalId(str) {
|
|
155
|
+
if (typeof str !== "string")
|
|
156
|
+
return false;
|
|
157
|
+
try {
|
|
158
|
+
Principal.fromText(str);
|
|
159
|
+
return true;
|
|
160
|
+
}
|
|
161
|
+
catch {
|
|
162
|
+
return false;
|
|
163
|
+
}
|
|
164
|
+
}
|
|
153
165
|
export function isCanisterId(str) {
|
|
154
166
|
if (typeof str !== "string")
|
|
155
167
|
return false;
|
|
168
|
+
if (!isPrincipalId(str))
|
|
169
|
+
return false;
|
|
156
170
|
if (str.length !== 27)
|
|
157
171
|
return false;
|
|
158
172
|
// All canister IDs end with "-cai"
|
|
@@ -187,14 +201,4 @@ export function isIsoDate(str) {
|
|
|
187
201
|
// YYYY-MM-DDTHH:mm:ss.sssZ (optional milliseconds/nanoseconds and timezone)
|
|
188
202
|
return /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d+)?(?:Z|[+-]\d{2}:?\d{2})$/.test(str);
|
|
189
203
|
}
|
|
190
|
-
export function uint8ArrayToHexString(bytes) {
|
|
191
|
-
if (!bytes)
|
|
192
|
-
return "";
|
|
193
|
-
if (Array.isArray(bytes)) {
|
|
194
|
-
return bytes.map((b) => b.toString(16).padStart(2, "0")).join("");
|
|
195
|
-
}
|
|
196
|
-
return Array.from(bytes)
|
|
197
|
-
.map((b) => b.toString(16).padStart(2, "0"))
|
|
198
|
-
.join("");
|
|
199
|
-
}
|
|
200
204
|
//# sourceMappingURL=helpers.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../src/visitor/helpers.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../src/visitor/helpers.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ic-reactor/candid",
|
|
3
|
-
"version": "3.0.16-beta.
|
|
3
|
+
"version": "3.0.16-beta.1",
|
|
4
4
|
"description": "IC Reactor Candid Adapter - Fetch and parse Candid definitions from Internet Computer canisters",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"module": "dist/index.js",
|
|
@@ -44,7 +44,7 @@
|
|
|
44
44
|
"dependencies": {
|
|
45
45
|
"@noble/hashes": "^2.0.1",
|
|
46
46
|
"zod": "^4.3.5",
|
|
47
|
-
"@ic-reactor/core": "^3.0.16-beta.
|
|
47
|
+
"@ic-reactor/core": "^3.0.16-beta.1"
|
|
48
48
|
},
|
|
49
49
|
"peerDependencies": {
|
|
50
50
|
"zod": "^4.3.5",
|
|
@@ -55,7 +55,7 @@
|
|
|
55
55
|
"devDependencies": {
|
|
56
56
|
"@icp-sdk/core": "^5.0.0",
|
|
57
57
|
"@size-limit/preset-small-lib": "^12.0.0",
|
|
58
|
-
"@types/node": "^25.0
|
|
58
|
+
"@types/node": "^25.2.0",
|
|
59
59
|
"size-limit": "^12.0.0",
|
|
60
60
|
"vitest": "^4.0.17"
|
|
61
61
|
},
|
|
@@ -0,0 +1,274 @@
|
|
|
1
|
+
import { describe, it, expect } from "vitest"
|
|
2
|
+
import {
|
|
3
|
+
isPrincipalId,
|
|
4
|
+
isCanisterId,
|
|
5
|
+
isBtcAddress,
|
|
6
|
+
isEthAddress,
|
|
7
|
+
isAccountIdentifier,
|
|
8
|
+
isIsoDate,
|
|
9
|
+
isUrl,
|
|
10
|
+
isImage,
|
|
11
|
+
isUuid,
|
|
12
|
+
} from "./helpers"
|
|
13
|
+
|
|
14
|
+
describe("Helpers", () => {
|
|
15
|
+
describe("isPrincipalId", () => {
|
|
16
|
+
it("should return true for valid principal IDs", () => {
|
|
17
|
+
expect(isPrincipalId("aaaaa-aa")).toBe(true)
|
|
18
|
+
expect(isPrincipalId("2vxsx-fae")).toBe(true)
|
|
19
|
+
expect(isPrincipalId("rrkah-fqaaa-aaaaa-aaaaq-cai")).toBe(true)
|
|
20
|
+
})
|
|
21
|
+
|
|
22
|
+
it("should return false for invalid principal IDs", () => {
|
|
23
|
+
expect(isPrincipalId("")).toBe(false) // empty string
|
|
24
|
+
expect(isPrincipalId("invalid-principal")).toBe(false) // contains invalid characters
|
|
25
|
+
expect(isPrincipalId("123456")).toBe(false) // numbers only
|
|
26
|
+
expect(
|
|
27
|
+
isPrincipalId("a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6q7r8s9t0u1v2w3x4y5z")
|
|
28
|
+
).toBe(false) // too long
|
|
29
|
+
expect(isPrincipalId("not-a-valid-principal")).toBe(false) // malformed
|
|
30
|
+
})
|
|
31
|
+
|
|
32
|
+
it("should return false for non-string inputs", () => {
|
|
33
|
+
expect(isPrincipalId(123 as any)).toBe(false)
|
|
34
|
+
expect(isPrincipalId(null as any)).toBe(false)
|
|
35
|
+
expect(isPrincipalId(undefined as any)).toBe(false)
|
|
36
|
+
expect(isPrincipalId({} as any)).toBe(false)
|
|
37
|
+
})
|
|
38
|
+
})
|
|
39
|
+
|
|
40
|
+
describe("isCanisterId", () => {
|
|
41
|
+
it("should return true for valid canister IDs", () => {
|
|
42
|
+
expect(isCanisterId("rrkah-fqaaa-aaaaa-aaaaq-cai")).toBe(true)
|
|
43
|
+
expect(isCanisterId("ryjl3-tyaaa-aaaaa-aaaba-cai")).toBe(true)
|
|
44
|
+
})
|
|
45
|
+
|
|
46
|
+
it("should return false for principal IDs that are not canister IDs", () => {
|
|
47
|
+
expect(isCanisterId("aaaaa-aa")).toBe(false) // too short
|
|
48
|
+
expect(isCanisterId("2vxsx-fae")).toBe(false) // too short
|
|
49
|
+
})
|
|
50
|
+
|
|
51
|
+
it("should return false for invalid strings", () => {
|
|
52
|
+
expect(isCanisterId("invalid-canister-id")).toBe(false)
|
|
53
|
+
expect(isCanisterId("rrkah-fqaaa-aaaaa-aaaaq")).toBe(false) // missing -cai
|
|
54
|
+
expect(isCanisterId("rrkah-fqaaa-aaaaa-aaaaq-ca")).toBe(false) // wrong ending
|
|
55
|
+
expect(isCanisterId("")).toBe(false)
|
|
56
|
+
})
|
|
57
|
+
|
|
58
|
+
it("should return false for non-string inputs", () => {
|
|
59
|
+
expect(isCanisterId(123 as any)).toBe(false)
|
|
60
|
+
expect(isCanisterId(null as any)).toBe(false)
|
|
61
|
+
})
|
|
62
|
+
})
|
|
63
|
+
|
|
64
|
+
describe("isBtcAddress", () => {
|
|
65
|
+
it("should return true for valid Bitcoin addresses", () => {
|
|
66
|
+
// Bech32 mainnet
|
|
67
|
+
expect(isBtcAddress("bc1qw508d6qejxtdg4y5r3zarvary0c5xw7kv8f3t4")).toBe(
|
|
68
|
+
true
|
|
69
|
+
)
|
|
70
|
+
// Bech32 testnet
|
|
71
|
+
expect(isBtcAddress("tb1qw508d6qejxtdg4y5r3zarvary0c5xw7kxpjzsx")).toBe(
|
|
72
|
+
true
|
|
73
|
+
)
|
|
74
|
+
// Base58 mainnet
|
|
75
|
+
expect(isBtcAddress("1BvBMSEYstWetqTFn5Au4m4GFg7xJaNVN2")).toBe(true)
|
|
76
|
+
// Base58 testnet
|
|
77
|
+
expect(isBtcAddress("mipcBbFg9gMiCh81Kj8tqqdgoZub1ZJRfn")).toBe(true)
|
|
78
|
+
})
|
|
79
|
+
|
|
80
|
+
it("should return false for invalid Bitcoin addresses", () => {
|
|
81
|
+
expect(isBtcAddress("")).toBe(false)
|
|
82
|
+
expect(isBtcAddress("invalid")).toBe(false)
|
|
83
|
+
expect(isBtcAddress("bc1short")).toBe(false) // too short
|
|
84
|
+
expect(
|
|
85
|
+
isBtcAddress(
|
|
86
|
+
"bc1qw508d6qejxtdg4y5r3zarvary0c5xw7kv8f3t4qw508d6qejxtdg4y5r3zarvary0c5xw7kv8f3t4"
|
|
87
|
+
)
|
|
88
|
+
).toBe(false) // too long
|
|
89
|
+
})
|
|
90
|
+
|
|
91
|
+
it("should return false for non-string inputs", () => {
|
|
92
|
+
expect(isBtcAddress(123 as any)).toBe(false)
|
|
93
|
+
expect(isBtcAddress(null as any)).toBe(false)
|
|
94
|
+
})
|
|
95
|
+
})
|
|
96
|
+
|
|
97
|
+
describe("isEthAddress", () => {
|
|
98
|
+
it("should return true for valid Ethereum addresses", () => {
|
|
99
|
+
expect(isEthAddress("0x742d35Cc6634C0532925a3b844Bc454e4438f44e")).toBe(
|
|
100
|
+
true
|
|
101
|
+
)
|
|
102
|
+
expect(isEthAddress("0x742d35cc6634c0532925a3b844bc454e4438f44e")).toBe(
|
|
103
|
+
true
|
|
104
|
+
) // lowercase
|
|
105
|
+
expect(isEthAddress("0x742D35CC6634C0532925A3B844BC454E4438F44E")).toBe(
|
|
106
|
+
true
|
|
107
|
+
) // uppercase
|
|
108
|
+
})
|
|
109
|
+
|
|
110
|
+
it("should return false for invalid Ethereum addresses", () => {
|
|
111
|
+
expect(isEthAddress("")).toBe(false)
|
|
112
|
+
expect(isEthAddress("0x742d35Cc6634C0532925a3b844Bc454e4438f44")).toBe(
|
|
113
|
+
false
|
|
114
|
+
) // too short
|
|
115
|
+
expect(isEthAddress("0x742d35Cc6634C0532925a3b844Bc454e4438f44ee")).toBe(
|
|
116
|
+
false
|
|
117
|
+
) // too long
|
|
118
|
+
expect(isEthAddress("742d35Cc6634C0532925a3b844Bc454e4438f44e")).toBe(
|
|
119
|
+
false
|
|
120
|
+
) // missing 0x
|
|
121
|
+
expect(isEthAddress("0x742d35Cc6634C0532925a3b844Bc454e4438f44g")).toBe(
|
|
122
|
+
false
|
|
123
|
+
) // invalid char
|
|
124
|
+
})
|
|
125
|
+
|
|
126
|
+
it("should return false for non-string inputs", () => {
|
|
127
|
+
expect(isEthAddress(123 as any)).toBe(false)
|
|
128
|
+
expect(isEthAddress(null as any)).toBe(false)
|
|
129
|
+
})
|
|
130
|
+
})
|
|
131
|
+
|
|
132
|
+
describe("isAccountIdentifier", () => {
|
|
133
|
+
it("should return true for valid account identifiers", () => {
|
|
134
|
+
expect(
|
|
135
|
+
isAccountIdentifier(
|
|
136
|
+
"a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1"
|
|
137
|
+
)
|
|
138
|
+
).toBe(true)
|
|
139
|
+
expect(
|
|
140
|
+
isAccountIdentifier(
|
|
141
|
+
"0000000000000000000000000000000000000000000000000000000000000000"
|
|
142
|
+
)
|
|
143
|
+
).toBe(true)
|
|
144
|
+
expect(
|
|
145
|
+
isAccountIdentifier(
|
|
146
|
+
"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"
|
|
147
|
+
)
|
|
148
|
+
).toBe(true)
|
|
149
|
+
})
|
|
150
|
+
|
|
151
|
+
it("should return false for invalid account identifiers", () => {
|
|
152
|
+
expect(isAccountIdentifier("")).toBe(false)
|
|
153
|
+
expect(
|
|
154
|
+
isAccountIdentifier(
|
|
155
|
+
"a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1"
|
|
156
|
+
)
|
|
157
|
+
).toBe(false) // 63 chars
|
|
158
|
+
expect(
|
|
159
|
+
isAccountIdentifier(
|
|
160
|
+
"a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a"
|
|
161
|
+
)
|
|
162
|
+
).toBe(false) // 65 chars
|
|
163
|
+
expect(
|
|
164
|
+
isAccountIdentifier(
|
|
165
|
+
"gggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggg"
|
|
166
|
+
)
|
|
167
|
+
).toBe(false) // invalid chars
|
|
168
|
+
})
|
|
169
|
+
|
|
170
|
+
it("should return false for non-string inputs", () => {
|
|
171
|
+
expect(isAccountIdentifier(123 as any)).toBe(false)
|
|
172
|
+
expect(isAccountIdentifier(null as any)).toBe(false)
|
|
173
|
+
})
|
|
174
|
+
})
|
|
175
|
+
|
|
176
|
+
describe("isIsoDate", () => {
|
|
177
|
+
it("should return true for valid ISO dates", () => {
|
|
178
|
+
expect(isIsoDate("2023-12-25T10:30:00Z")).toBe(true)
|
|
179
|
+
expect(isIsoDate("2023-12-25T10:30:00.123Z")).toBe(true)
|
|
180
|
+
expect(isIsoDate("2023-12-25T10:30:00+05:30")).toBe(true)
|
|
181
|
+
expect(isIsoDate("2023-12-25T10:30:00-08:00")).toBe(true)
|
|
182
|
+
})
|
|
183
|
+
|
|
184
|
+
it("should return false for invalid ISO dates", () => {
|
|
185
|
+
expect(isIsoDate("")).toBe(false)
|
|
186
|
+
expect(isIsoDate("2023-12-25")).toBe(false) // missing time
|
|
187
|
+
expect(isIsoDate("2023-12-25T10:30:00")).toBe(false) // missing timezone
|
|
188
|
+
expect(isIsoDate("invalid-date")).toBe(false)
|
|
189
|
+
expect(isIsoDate("2023-12-25T10:30:00Zextra")).toBe(false) // extra characters
|
|
190
|
+
})
|
|
191
|
+
|
|
192
|
+
it("should return false for non-string inputs", () => {
|
|
193
|
+
expect(isIsoDate(123 as any)).toBe(false)
|
|
194
|
+
expect(isIsoDate(null as any)).toBe(false)
|
|
195
|
+
})
|
|
196
|
+
})
|
|
197
|
+
|
|
198
|
+
describe("isUrl", () => {
|
|
199
|
+
it("should return true for valid URLs", () => {
|
|
200
|
+
expect(isUrl("http://example.com")).toBe(true)
|
|
201
|
+
expect(isUrl("https://example.com")).toBe(true)
|
|
202
|
+
expect(isUrl("https://example.com/path")).toBe(true)
|
|
203
|
+
expect(isUrl("https://example.com/path?query=value")).toBe(true)
|
|
204
|
+
})
|
|
205
|
+
|
|
206
|
+
it("should return false for invalid URLs", () => {
|
|
207
|
+
expect(isUrl("")).toBe(false)
|
|
208
|
+
expect(isUrl("example.com")).toBe(false) // missing protocol
|
|
209
|
+
expect(isUrl("ftp://example.com")).toBe(false) // unsupported protocol
|
|
210
|
+
expect(isUrl("not-a-url")).toBe(false)
|
|
211
|
+
})
|
|
212
|
+
|
|
213
|
+
it("should return false for non-string inputs", () => {
|
|
214
|
+
expect(isUrl(123 as any)).toBe(false)
|
|
215
|
+
expect(isUrl(null as any)).toBe(false)
|
|
216
|
+
})
|
|
217
|
+
})
|
|
218
|
+
|
|
219
|
+
describe("isImage", () => {
|
|
220
|
+
it("should return true for valid image URLs", () => {
|
|
221
|
+
expect(isImage("https://example.com/image.jpg")).toBe(true)
|
|
222
|
+
expect(isImage("https://example.com/image.jpeg")).toBe(true)
|
|
223
|
+
expect(isImage("https://example.com/image.png")).toBe(true)
|
|
224
|
+
expect(isImage("https://example.com/image.gif")).toBe(true)
|
|
225
|
+
expect(isImage("https://example.com/image.svg")).toBe(true)
|
|
226
|
+
})
|
|
227
|
+
|
|
228
|
+
it("should return true for base64 image data", () => {
|
|
229
|
+
expect(
|
|
230
|
+
isImage(
|
|
231
|
+
"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNkYPhfDwAChwGA60e6kgAAAABJRU5ErkJggg=="
|
|
232
|
+
)
|
|
233
|
+
).toBe(true)
|
|
234
|
+
expect(
|
|
235
|
+
isImage(
|
|
236
|
+
"data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAABAAEDASIAAhEBAxEB/8QAFQABAQAAAAAAAAAAAAAAAAAAAAv/xAAUEAEAAAAAAAAAAAAAAAAAAAAA/8QAFQEBAQAAAAAAAAAAAAAAAAAAAAX/xAAUEQEAAAAAAAAAAAAAAAAAAAAA/9oADAMBAAIRAxEAPwA/vAA="
|
|
237
|
+
)
|
|
238
|
+
).toBe(true)
|
|
239
|
+
})
|
|
240
|
+
|
|
241
|
+
it("should return false for non-image URLs", () => {
|
|
242
|
+
expect(isImage("https://example.com/document.pdf")).toBe(false)
|
|
243
|
+
expect(isImage("https://example.com/video.mp4")).toBe(false)
|
|
244
|
+
expect(isImage("not-an-image")).toBe(false)
|
|
245
|
+
expect(isImage("")).toBe(false)
|
|
246
|
+
})
|
|
247
|
+
|
|
248
|
+
it("should return false for non-string inputs", () => {
|
|
249
|
+
expect(isImage(123 as any)).toBe(false)
|
|
250
|
+
expect(isImage(null as any)).toBe(false)
|
|
251
|
+
})
|
|
252
|
+
})
|
|
253
|
+
|
|
254
|
+
describe("isUuid", () => {
|
|
255
|
+
it("should return true for valid UUIDs", () => {
|
|
256
|
+
expect(isUuid("123e4567-e89b-12d3-a456-426614174000")).toBe(true)
|
|
257
|
+
expect(isUuid("123E4567-E89B-12D3-A456-426614174000")).toBe(true) // uppercase
|
|
258
|
+
expect(isUuid("123e4567-e89b-12d3-a456-426614174000")).toBe(true) // lowercase
|
|
259
|
+
})
|
|
260
|
+
|
|
261
|
+
it("should return false for invalid UUIDs", () => {
|
|
262
|
+
expect(isUuid("")).toBe(false)
|
|
263
|
+
expect(isUuid("123e4567-e89b-12d3-a456-42661417400")).toBe(false) // too short
|
|
264
|
+
expect(isUuid("123e4567-e89b-12d3-a456-4266141740000")).toBe(false) // too long
|
|
265
|
+
expect(isUuid("123e4567-e89b-12d3-a456-42661417400g")).toBe(false) // invalid char
|
|
266
|
+
expect(isUuid("not-a-uuid")).toBe(false)
|
|
267
|
+
})
|
|
268
|
+
|
|
269
|
+
it("should return false for non-string inputs", () => {
|
|
270
|
+
expect(isUuid(123 as any)).toBe(false)
|
|
271
|
+
expect(isUuid(null as any)).toBe(false)
|
|
272
|
+
})
|
|
273
|
+
})
|
|
274
|
+
})
|
package/src/visitor/helpers.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { IDL } from "@icp-sdk/core/candid"
|
|
2
|
+
import { Principal } from "@icp-sdk/core/principal"
|
|
2
3
|
|
|
3
4
|
export const extractAndSortArgs = <T extends Record<string, unknown>>(
|
|
4
5
|
argsObject: T
|
|
@@ -174,8 +175,19 @@ export function isUuid(str: string): boolean {
|
|
|
174
175
|
)
|
|
175
176
|
}
|
|
176
177
|
|
|
178
|
+
export function isPrincipalId(str: string): boolean {
|
|
179
|
+
if (typeof str !== "string") return false
|
|
180
|
+
try {
|
|
181
|
+
Principal.fromText(str)
|
|
182
|
+
return true
|
|
183
|
+
} catch {
|
|
184
|
+
return false
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
|
|
177
188
|
export function isCanisterId(str: string): boolean {
|
|
178
189
|
if (typeof str !== "string") return false
|
|
190
|
+
if (!isPrincipalId(str)) return false
|
|
179
191
|
if (str.length !== 27) return false
|
|
180
192
|
// All canister IDs end with "-cai"
|
|
181
193
|
return str.endsWith("-cai")
|
|
@@ -209,13 +221,3 @@ export function isIsoDate(str: string): boolean {
|
|
|
209
221
|
str
|
|
210
222
|
)
|
|
211
223
|
}
|
|
212
|
-
|
|
213
|
-
export function uint8ArrayToHexString(bytes: Uint8Array | number[]): string {
|
|
214
|
-
if (!bytes) return ""
|
|
215
|
-
if (Array.isArray(bytes)) {
|
|
216
|
-
return bytes.map((b) => b.toString(16).padStart(2, "0")).join("")
|
|
217
|
-
}
|
|
218
|
-
return Array.from(bytes)
|
|
219
|
-
.map((b) => b.toString(16).padStart(2, "0"))
|
|
220
|
-
.join("")
|
|
221
|
-
}
|