@bananapus/nana-sdk-core 3.5.2 → 5.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 (304) hide show
  1. package/bin/wallet-check.mjs +495 -0
  2. package/dist/cjs/actions/suckerPairs.d.ts +5 -3
  3. package/dist/cjs/actions/suckerPairs.d.ts.map +1 -1
  4. package/dist/cjs/actions/suckerPairs.js +6 -26
  5. package/dist/cjs/actions/suckerPairs.js.map +1 -1
  6. package/dist/cjs/pause.d.ts +2 -0
  7. package/dist/cjs/pause.d.ts.map +1 -1
  8. package/dist/cjs/pause.js +17 -0
  9. package/dist/cjs/pause.js.map +1 -1
  10. package/dist/cjs/review/confirm.d.ts +56 -0
  11. package/dist/cjs/review/confirm.d.ts.map +1 -0
  12. package/dist/cjs/review/confirm.js +99 -0
  13. package/dist/cjs/review/confirm.js.map +1 -0
  14. package/dist/cjs/review/contractWrite.d.ts +5 -3
  15. package/dist/cjs/review/contractWrite.d.ts.map +1 -1
  16. package/dist/cjs/review/contractWrite.js +10 -8
  17. package/dist/cjs/review/contractWrite.js.map +1 -1
  18. package/dist/cjs/review/decode.d.ts +19 -1
  19. package/dist/cjs/review/decode.d.ts.map +1 -1
  20. package/dist/cjs/review/decode.js +30 -11
  21. package/dist/cjs/review/decode.js.map +1 -1
  22. package/dist/cjs/review/decodeCall.d.ts +21 -0
  23. package/dist/cjs/review/decodeCall.d.ts.map +1 -0
  24. package/dist/cjs/review/decodeCall.js +183 -0
  25. package/dist/cjs/review/decodeCall.js.map +1 -0
  26. package/dist/cjs/review/heldWrite.d.ts +4 -0
  27. package/dist/cjs/review/heldWrite.d.ts.map +1 -1
  28. package/dist/cjs/review/heldWrite.js +35 -31
  29. package/dist/cjs/review/heldWrite.js.map +1 -1
  30. package/dist/cjs/review/index.d.ts +12 -1
  31. package/dist/cjs/review/index.d.ts.map +1 -1
  32. package/dist/cjs/review/index.js +29 -1
  33. package/dist/cjs/review/index.js.map +1 -1
  34. package/dist/cjs/review/intents.d.ts +10 -0
  35. package/dist/cjs/review/intents.d.ts.map +1 -1
  36. package/dist/cjs/review/intents.js +13 -0
  37. package/dist/cjs/review/intents.js.map +1 -1
  38. package/dist/cjs/review/lineError.d.ts +72 -0
  39. package/dist/cjs/review/lineError.d.ts.map +1 -0
  40. package/dist/cjs/review/lineError.js +76 -0
  41. package/dist/cjs/review/lineError.js.map +1 -0
  42. package/dist/cjs/review/messages.d.ts +15 -3
  43. package/dist/cjs/review/messages.d.ts.map +1 -1
  44. package/dist/cjs/review/messages.js +16 -4
  45. package/dist/cjs/review/messages.js.map +1 -1
  46. package/dist/cjs/review/model.d.ts +149 -0
  47. package/dist/cjs/review/model.d.ts.map +1 -0
  48. package/dist/cjs/review/model.js +750 -0
  49. package/dist/cjs/review/model.js.map +1 -0
  50. package/dist/cjs/review/plan.d.ts +61 -0
  51. package/dist/cjs/review/plan.d.ts.map +1 -0
  52. package/dist/cjs/review/plan.js +143 -0
  53. package/dist/cjs/review/plan.js.map +1 -0
  54. package/dist/cjs/review/react/index.d.ts +1 -0
  55. package/dist/cjs/review/react/index.d.ts.map +1 -1
  56. package/dist/cjs/review/react/index.js +1 -0
  57. package/dist/cjs/review/react/index.js.map +1 -1
  58. package/dist/cjs/review/react/useHeldSend.js +3 -4
  59. package/dist/cjs/review/react/useHeldSend.js.map +1 -1
  60. package/dist/cjs/review/react/useHeldWrite.d.ts.map +1 -1
  61. package/dist/cjs/review/react/useHeldWrite.js +2 -1
  62. package/dist/cjs/review/react/useHeldWrite.js.map +1 -1
  63. package/dist/cjs/review/react/useReviewedRun.d.ts +122 -0
  64. package/dist/cjs/review/react/useReviewedRun.d.ts.map +1 -0
  65. package/dist/cjs/review/react/useReviewedRun.js +443 -0
  66. package/dist/cjs/review/react/useReviewedRun.js.map +1 -0
  67. package/dist/cjs/review/receipt.d.ts +37 -1
  68. package/dist/cjs/review/receipt.d.ts.map +1 -1
  69. package/dist/cjs/review/receipt.js +76 -3
  70. package/dist/cjs/review/receipt.js.map +1 -1
  71. package/dist/cjs/review/relayr.d.ts +13 -4
  72. package/dist/cjs/review/relayr.d.ts.map +1 -1
  73. package/dist/cjs/review/relayr.js +52 -8
  74. package/dist/cjs/review/relayr.js.map +1 -1
  75. package/dist/cjs/review/relayrSend.d.ts +106 -0
  76. package/dist/cjs/review/relayrSend.d.ts.map +1 -0
  77. package/dist/cjs/review/relayrSend.js +795 -0
  78. package/dist/cjs/review/relayrSend.js.map +1 -0
  79. package/dist/cjs/review/reviewQueue.d.ts +10 -9
  80. package/dist/cjs/review/reviewQueue.d.ts.map +1 -1
  81. package/dist/cjs/review/reviewQueue.js +19 -29
  82. package/dist/cjs/review/reviewQueue.js.map +1 -1
  83. package/dist/cjs/review/reviewRequests.d.ts +86 -0
  84. package/dist/cjs/review/reviewRequests.d.ts.map +1 -0
  85. package/dist/cjs/review/reviewRequests.js +266 -0
  86. package/dist/cjs/review/reviewRequests.js.map +1 -0
  87. package/dist/cjs/review/safeRelayr.d.ts +3 -1
  88. package/dist/cjs/review/safeRelayr.d.ts.map +1 -1
  89. package/dist/cjs/review/safeRelayr.js +9 -9
  90. package/dist/cjs/review/safeRelayr.js.map +1 -1
  91. package/dist/cjs/review/safeSend.d.ts +69 -0
  92. package/dist/cjs/review/safeSend.d.ts.map +1 -0
  93. package/dist/cjs/review/safeSend.js +306 -0
  94. package/dist/cjs/review/safeSend.js.map +1 -0
  95. package/dist/cjs/review/send.d.ts +272 -0
  96. package/dist/cjs/review/send.d.ts.map +1 -0
  97. package/dist/cjs/review/send.js +1163 -0
  98. package/dist/cjs/review/send.js.map +1 -0
  99. package/dist/cjs/review/sequence.d.ts +77 -0
  100. package/dist/cjs/review/sequence.d.ts.map +1 -0
  101. package/dist/cjs/review/sequence.js +232 -0
  102. package/dist/cjs/review/sequence.js.map +1 -0
  103. package/dist/cjs/review/sign.d.ts +111 -0
  104. package/dist/cjs/review/sign.d.ts.map +1 -0
  105. package/dist/cjs/review/sign.js +378 -0
  106. package/dist/cjs/review/sign.js.map +1 -0
  107. package/dist/cjs/review/simulation.d.ts +41 -2
  108. package/dist/cjs/review/simulation.d.ts.map +1 -1
  109. package/dist/cjs/review/simulation.js +99 -29
  110. package/dist/cjs/review/simulation.js.map +1 -1
  111. package/dist/cjs/review/transaction-message.d.ts +13 -0
  112. package/dist/cjs/review/transaction-message.d.ts.map +1 -1
  113. package/dist/cjs/review/transaction-message.js +25 -0
  114. package/dist/cjs/review/transaction-message.js.map +1 -1
  115. package/dist/cjs/review/transactionReview.d.ts +27 -19
  116. package/dist/cjs/review/transactionReview.d.ts.map +1 -1
  117. package/dist/cjs/review/transactionReview.js +22 -63
  118. package/dist/cjs/review/transactionReview.js.map +1 -1
  119. package/dist/cjs/review/wallet.d.ts +98 -0
  120. package/dist/cjs/review/wallet.d.ts.map +1 -0
  121. package/dist/cjs/review/wallet.js +234 -0
  122. package/dist/cjs/review/wallet.js.map +1 -0
  123. package/dist/cjs/review/writeHold.d.ts +138 -13
  124. package/dist/cjs/review/writeHold.d.ts.map +1 -1
  125. package/dist/cjs/review/writeHold.js +98 -18
  126. package/dist/cjs/review/writeHold.js.map +1 -1
  127. package/dist/cjs/review/writeRecovery.d.ts +17 -1
  128. package/dist/cjs/review/writeRecovery.d.ts.map +1 -1
  129. package/dist/cjs/review/writeRecovery.js +146 -45
  130. package/dist/cjs/review/writeRecovery.js.map +1 -1
  131. package/dist/cjs/safeService.d.ts +27 -4
  132. package/dist/cjs/safeService.d.ts.map +1 -1
  133. package/dist/cjs/safeService.js +120 -3
  134. package/dist/cjs/safeService.js.map +1 -1
  135. package/dist/cjs/testing.d.ts +24 -0
  136. package/dist/cjs/testing.d.ts.map +1 -1
  137. package/dist/cjs/testing.js +26 -1
  138. package/dist/cjs/testing.js.map +1 -1
  139. package/dist/cjs/v6/defifa.d.ts.map +1 -1
  140. package/dist/cjs/v6/defifa.js +24 -23
  141. package/dist/cjs/v6/defifa.js.map +1 -1
  142. package/dist/cjs/v6/executionErrors.d.ts.map +1 -1
  143. package/dist/cjs/v6/executionErrors.js +3 -2
  144. package/dist/cjs/v6/executionErrors.js.map +1 -1
  145. package/dist/cjs/v6/pay.d.ts +25 -8
  146. package/dist/cjs/v6/pay.d.ts.map +1 -1
  147. package/dist/cjs/v6/pay.js +117 -23
  148. package/dist/cjs/v6/pay.js.map +1 -1
  149. package/dist/cjs/v6/suckers.d.ts +30 -0
  150. package/dist/cjs/v6/suckers.d.ts.map +1 -1
  151. package/dist/cjs/v6/suckers.js +69 -5
  152. package/dist/cjs/v6/suckers.js.map +1 -1
  153. package/dist/esm/actions/suckerPairs.d.ts +5 -3
  154. package/dist/esm/actions/suckerPairs.d.ts.map +1 -1
  155. package/dist/esm/actions/suckerPairs.js +7 -27
  156. package/dist/esm/actions/suckerPairs.js.map +1 -1
  157. package/dist/esm/pause.d.ts +2 -0
  158. package/dist/esm/pause.d.ts.map +1 -1
  159. package/dist/esm/pause.js +16 -0
  160. package/dist/esm/pause.js.map +1 -1
  161. package/dist/esm/review/confirm.d.ts +56 -0
  162. package/dist/esm/review/confirm.d.ts.map +1 -0
  163. package/dist/esm/review/confirm.js +93 -0
  164. package/dist/esm/review/confirm.js.map +1 -0
  165. package/dist/esm/review/contractWrite.d.ts +5 -3
  166. package/dist/esm/review/contractWrite.d.ts.map +1 -1
  167. package/dist/esm/review/contractWrite.js +10 -8
  168. package/dist/esm/review/contractWrite.js.map +1 -1
  169. package/dist/esm/review/decode.d.ts +19 -1
  170. package/dist/esm/review/decode.d.ts.map +1 -1
  171. package/dist/esm/review/decode.js +29 -14
  172. package/dist/esm/review/decode.js.map +1 -1
  173. package/dist/esm/review/decodeCall.d.ts +21 -0
  174. package/dist/esm/review/decodeCall.d.ts.map +1 -0
  175. package/dist/esm/review/decodeCall.js +180 -0
  176. package/dist/esm/review/decodeCall.js.map +1 -0
  177. package/dist/esm/review/heldWrite.d.ts +4 -0
  178. package/dist/esm/review/heldWrite.d.ts.map +1 -1
  179. package/dist/esm/review/heldWrite.js +34 -30
  180. package/dist/esm/review/heldWrite.js.map +1 -1
  181. package/dist/esm/review/index.d.ts +12 -1
  182. package/dist/esm/review/index.d.ts.map +1 -1
  183. package/dist/esm/review/index.js +12 -1
  184. package/dist/esm/review/index.js.map +1 -1
  185. package/dist/esm/review/intents.d.ts +10 -0
  186. package/dist/esm/review/intents.d.ts.map +1 -1
  187. package/dist/esm/review/intents.js +12 -0
  188. package/dist/esm/review/intents.js.map +1 -1
  189. package/dist/esm/review/lineError.d.ts +72 -0
  190. package/dist/esm/review/lineError.d.ts.map +1 -0
  191. package/dist/esm/review/lineError.js +68 -0
  192. package/dist/esm/review/lineError.js.map +1 -0
  193. package/dist/esm/review/messages.d.ts +15 -3
  194. package/dist/esm/review/messages.d.ts.map +1 -1
  195. package/dist/esm/review/messages.js +15 -3
  196. package/dist/esm/review/messages.js.map +1 -1
  197. package/dist/esm/review/model.d.ts +149 -0
  198. package/dist/esm/review/model.d.ts.map +1 -0
  199. package/dist/esm/review/model.js +746 -0
  200. package/dist/esm/review/model.js.map +1 -0
  201. package/dist/esm/review/plan.d.ts +61 -0
  202. package/dist/esm/review/plan.d.ts.map +1 -0
  203. package/dist/esm/review/plan.js +136 -0
  204. package/dist/esm/review/plan.js.map +1 -0
  205. package/dist/esm/review/react/index.d.ts +1 -0
  206. package/dist/esm/review/react/index.d.ts.map +1 -1
  207. package/dist/esm/review/react/index.js +1 -0
  208. package/dist/esm/review/react/index.js.map +1 -1
  209. package/dist/esm/review/react/useHeldSend.js +3 -4
  210. package/dist/esm/review/react/useHeldSend.js.map +1 -1
  211. package/dist/esm/review/react/useHeldWrite.d.ts.map +1 -1
  212. package/dist/esm/review/react/useHeldWrite.js +2 -1
  213. package/dist/esm/review/react/useHeldWrite.js.map +1 -1
  214. package/dist/esm/review/react/useReviewedRun.d.ts +122 -0
  215. package/dist/esm/review/react/useReviewedRun.d.ts.map +1 -0
  216. package/dist/esm/review/react/useReviewedRun.js +439 -0
  217. package/dist/esm/review/react/useReviewedRun.js.map +1 -0
  218. package/dist/esm/review/receipt.d.ts +37 -1
  219. package/dist/esm/review/receipt.d.ts.map +1 -1
  220. package/dist/esm/review/receipt.js +72 -2
  221. package/dist/esm/review/receipt.js.map +1 -1
  222. package/dist/esm/review/relayr.d.ts +13 -4
  223. package/dist/esm/review/relayr.d.ts.map +1 -1
  224. package/dist/esm/review/relayr.js +51 -8
  225. package/dist/esm/review/relayr.js.map +1 -1
  226. package/dist/esm/review/relayrSend.d.ts +106 -0
  227. package/dist/esm/review/relayrSend.d.ts.map +1 -0
  228. package/dist/esm/review/relayrSend.js +787 -0
  229. package/dist/esm/review/relayrSend.js.map +1 -0
  230. package/dist/esm/review/reviewQueue.d.ts +10 -9
  231. package/dist/esm/review/reviewQueue.d.ts.map +1 -1
  232. package/dist/esm/review/reviewQueue.js +17 -26
  233. package/dist/esm/review/reviewQueue.js.map +1 -1
  234. package/dist/esm/review/reviewRequests.d.ts +86 -0
  235. package/dist/esm/review/reviewRequests.d.ts.map +1 -0
  236. package/dist/esm/review/reviewRequests.js +263 -0
  237. package/dist/esm/review/reviewRequests.js.map +1 -0
  238. package/dist/esm/review/safeRelayr.d.ts +3 -1
  239. package/dist/esm/review/safeRelayr.d.ts.map +1 -1
  240. package/dist/esm/review/safeRelayr.js +9 -9
  241. package/dist/esm/review/safeRelayr.js.map +1 -1
  242. package/dist/esm/review/safeSend.d.ts +69 -0
  243. package/dist/esm/review/safeSend.d.ts.map +1 -0
  244. package/dist/esm/review/safeSend.js +301 -0
  245. package/dist/esm/review/safeSend.js.map +1 -0
  246. package/dist/esm/review/send.d.ts +272 -0
  247. package/dist/esm/review/send.d.ts.map +1 -0
  248. package/dist/esm/review/send.js +1156 -0
  249. package/dist/esm/review/send.js.map +1 -0
  250. package/dist/esm/review/sequence.d.ts +77 -0
  251. package/dist/esm/review/sequence.d.ts.map +1 -0
  252. package/dist/esm/review/sequence.js +223 -0
  253. package/dist/esm/review/sequence.js.map +1 -0
  254. package/dist/esm/review/sign.d.ts +111 -0
  255. package/dist/esm/review/sign.d.ts.map +1 -0
  256. package/dist/esm/review/sign.js +372 -0
  257. package/dist/esm/review/sign.js.map +1 -0
  258. package/dist/esm/review/simulation.d.ts +41 -2
  259. package/dist/esm/review/simulation.d.ts.map +1 -1
  260. package/dist/esm/review/simulation.js +95 -29
  261. package/dist/esm/review/simulation.js.map +1 -1
  262. package/dist/esm/review/transaction-message.d.ts +13 -0
  263. package/dist/esm/review/transaction-message.d.ts.map +1 -1
  264. package/dist/esm/review/transaction-message.js +23 -0
  265. package/dist/esm/review/transaction-message.js.map +1 -1
  266. package/dist/esm/review/transactionReview.d.ts +27 -19
  267. package/dist/esm/review/transactionReview.d.ts.map +1 -1
  268. package/dist/esm/review/transactionReview.js +19 -56
  269. package/dist/esm/review/transactionReview.js.map +1 -1
  270. package/dist/esm/review/wallet.d.ts +98 -0
  271. package/dist/esm/review/wallet.d.ts.map +1 -0
  272. package/dist/esm/review/wallet.js +227 -0
  273. package/dist/esm/review/wallet.js.map +1 -0
  274. package/dist/esm/review/writeHold.d.ts +138 -13
  275. package/dist/esm/review/writeHold.d.ts.map +1 -1
  276. package/dist/esm/review/writeHold.js +96 -19
  277. package/dist/esm/review/writeHold.js.map +1 -1
  278. package/dist/esm/review/writeRecovery.d.ts +17 -1
  279. package/dist/esm/review/writeRecovery.d.ts.map +1 -1
  280. package/dist/esm/review/writeRecovery.js +149 -48
  281. package/dist/esm/review/writeRecovery.js.map +1 -1
  282. package/dist/esm/safeService.d.ts +27 -4
  283. package/dist/esm/safeService.d.ts.map +1 -1
  284. package/dist/esm/safeService.js +119 -4
  285. package/dist/esm/safeService.js.map +1 -1
  286. package/dist/esm/testing.d.ts +24 -0
  287. package/dist/esm/testing.d.ts.map +1 -1
  288. package/dist/esm/testing.js +23 -1
  289. package/dist/esm/testing.js.map +1 -1
  290. package/dist/esm/v6/defifa.d.ts.map +1 -1
  291. package/dist/esm/v6/defifa.js +24 -23
  292. package/dist/esm/v6/defifa.js.map +1 -1
  293. package/dist/esm/v6/executionErrors.d.ts.map +1 -1
  294. package/dist/esm/v6/executionErrors.js +3 -2
  295. package/dist/esm/v6/executionErrors.js.map +1 -1
  296. package/dist/esm/v6/pay.d.ts +25 -8
  297. package/dist/esm/v6/pay.d.ts.map +1 -1
  298. package/dist/esm/v6/pay.js +115 -22
  299. package/dist/esm/v6/pay.js.map +1 -1
  300. package/dist/esm/v6/suckers.d.ts +30 -0
  301. package/dist/esm/v6/suckers.d.ts.map +1 -1
  302. package/dist/esm/v6/suckers.js +67 -5
  303. package/dist/esm/v6/suckers.js.map +1 -1
  304. package/package.json +11 -2
@@ -0,0 +1,495 @@
1
+ #!/usr/bin/env node
2
+ // A lint for mistaken wallet calls, not a security boundary: it does not follow every alias.
3
+ import {
4
+ existsSync,
5
+ readFileSync,
6
+ readdirSync,
7
+ realpathSync,
8
+ statSync,
9
+ } from "node:fs";
10
+ import { createRequire } from "node:module";
11
+ import { relative, resolve } from "node:path";
12
+
13
+ const require = createRequire(resolve("package.json"));
14
+ let ts;
15
+ try {
16
+ ts = require("typescript");
17
+ } catch {
18
+ process.stderr.write(
19
+ "nana-wallet-check needs typescript (>=5.4) installed in the project it runs from.\n",
20
+ );
21
+ process.exit(1);
22
+ }
23
+
24
+ const usage =
25
+ "Usage: nana-wallet-check --root <dir>... --inventory <json> [--forbid-import <spec>]... [--exclude <glob>]...";
26
+ const productionRoots = [];
27
+ const forbiddenImports = [];
28
+ /** Paths (relative to the working directory) left out by `--exclude`: `**` spans directories, `*` and `?` stay within one. */
29
+ const excluded = [];
30
+ const globPattern = (glob) =>
31
+ new RegExp(
32
+ `^${glob
33
+ .replaceAll("\\", "/")
34
+ .replace(/^(?:\.\/)+/, "")
35
+ .split(/(\*\*\/|\*\*|\*|\?)/)
36
+ .map((part) =>
37
+ part === "**/"
38
+ ? "(?:.*/)?"
39
+ : part === "**"
40
+ ? ".*"
41
+ : part === "*"
42
+ ? "[^/]*"
43
+ : part === "?"
44
+ ? "[^/]"
45
+ : part.replace(/[.+^${}()|[\]\\]/g, "\\$&"),
46
+ )
47
+ .join("")}$`,
48
+ );
49
+ let inventoryArg;
50
+ const args = process.argv.slice(2);
51
+ for (let index = 0; index < args.length; index += 2) {
52
+ const value = args[index + 1];
53
+ if (value === undefined || value.startsWith("--")) {
54
+ process.stderr.write(`${usage}\n`);
55
+ process.exit(1);
56
+ }
57
+ if (args[index] === "--root") productionRoots.push(resolve(value));
58
+ else if (args[index] === "--forbid-import") forbiddenImports.push(value);
59
+ else if (args[index] === "--inventory") inventoryArg = value;
60
+ else if (args[index] === "--exclude") excluded.push(globPattern(value));
61
+ else {
62
+ process.stderr.write(`${usage}\n`);
63
+ process.exit(1);
64
+ }
65
+ }
66
+ if (productionRoots.length === 0 || !inventoryArg) {
67
+ process.stderr.write(`${usage}\n`);
68
+ process.exit(1);
69
+ }
70
+ const inventory = JSON.parse(readFileSync(resolve(inventoryArg), "utf8"));
71
+
72
+ const directApis = new Set([
73
+ "deployContract",
74
+ "deployContractAsync",
75
+ "useDeployContract",
76
+ "sendCalls",
77
+ "sendCallsAsync",
78
+ "sendRawTransaction",
79
+ "sendRawTransactionAsync",
80
+ "sendTransaction",
81
+ "sendTransactionAsync",
82
+ "signMessage",
83
+ "signMessageAsync",
84
+ "signTransaction",
85
+ "signTransactionAsync",
86
+ "signTypedData",
87
+ "signTypedDataAsync",
88
+ "useSendCalls",
89
+ "useSendRawTransaction",
90
+ "useSendTransaction",
91
+ "useSignMessage",
92
+ "useSignTransaction",
93
+ "useSignTypedData",
94
+ "useWalletClient",
95
+ "useWriteContract",
96
+ "useWriteContracts",
97
+ "writeContract",
98
+ "writeContractAsync",
99
+ "writeContracts",
100
+ "writeContractsAsync",
101
+ ]);
102
+ const memberApis = new Set([...directApis, "request"]);
103
+ const selfReviewingApis = new Set([
104
+ "selfReviewingAdapter",
105
+ "signaWalletAdapter",
106
+ ]);
107
+ const guardedNames = new Set([
108
+ "registerReviewHandler",
109
+ ...selfReviewingApis,
110
+ ]);
111
+ const signingRpcMethods = new Set([
112
+ "eth_sendTransaction",
113
+ "eth_sendRawTransaction",
114
+ "eth_sign",
115
+ "eth_signTransaction",
116
+ "eth_signTypedData",
117
+ "eth_signTypedData_v1",
118
+ "eth_signTypedData_v3",
119
+ "eth_signTypedData_v4",
120
+ "personal_sign",
121
+ "wallet_sendCalls",
122
+ "wallet_sendTransaction",
123
+ ]);
124
+
125
+ function invariant(condition, message) {
126
+ if (condition) return;
127
+ process.stderr.write(`${message}\n`);
128
+ process.exit(1);
129
+ }
130
+
131
+ const sourceExtension = /\.(?:ts|tsx|mts|cts|js|jsx|mjs|cjs)$/;
132
+ const sourceKinds = {
133
+ ".tsx": ts.ScriptKind.TSX,
134
+ ".jsx": ts.ScriptKind.JSX,
135
+ ".js": ts.ScriptKind.JS,
136
+ ".mjs": ts.ScriptKind.JS,
137
+ ".cjs": ts.ScriptKind.JS,
138
+ };
139
+
140
+ function productionFiles(directory, ancestors = []) {
141
+ const real = realpathSync(directory);
142
+ if (ancestors.includes(real)) return [];
143
+ return readdirSync(directory).flatMap((name) => {
144
+ const path = resolve(directory, name);
145
+ const stat = statSync(path);
146
+ if (stat.isDirectory()) {
147
+ if (name === "node_modules") return [];
148
+ return productionFiles(path, [...ancestors, real]);
149
+ }
150
+ if (!stat.isFile() || !sourceExtension.test(name)) return [];
151
+ if (/\.d\.[cm]?ts$/.test(name)) return [];
152
+ // Every other file under a root is scanned unless the caller excludes it.
153
+ const shown = relative(resolve("."), path).split("\\").join("/");
154
+ if (excluded.some((pattern) => pattern.test(shown))) return [];
155
+ return [path];
156
+ });
157
+ }
158
+
159
+ function unwrap(expression) {
160
+ let current = expression;
161
+ while (
162
+ ts.isParenthesizedExpression(current) ||
163
+ ts.isAsExpression(current) ||
164
+ ts.isNonNullExpression(current) ||
165
+ ts.isTypeAssertionExpression(current) ||
166
+ ts.isSatisfiesExpression(current)
167
+ ) {
168
+ current = current.expression;
169
+ }
170
+ return current;
171
+ }
172
+
173
+ function memberNameOf(expression) {
174
+ if (ts.isPropertyAccessExpression(expression)) return expression.name.text;
175
+ if (
176
+ ts.isElementAccessExpression(expression) &&
177
+ ts.isStringLiteralLike(unwrap(expression.argumentExpression))
178
+ ) {
179
+ return unwrap(expression.argumentExpression).text;
180
+ }
181
+ return null;
182
+ }
183
+
184
+ // The name a callee resolves to: a bare identifier (through import and
185
+ // destructuring aliases) or a member, including a quoted member and one reached
186
+ // through call, apply or bind.
187
+ function calleeOf(expression, aliases) {
188
+ const callee = unwrap(expression);
189
+ if (ts.isIdentifier(callee)) {
190
+ return { name: aliases.get(callee.text) ?? callee.text, member: false };
191
+ }
192
+ const member = memberNameOf(callee);
193
+ if (member === null) return null;
194
+ if (["call", "apply", "bind"].includes(member)) {
195
+ const inner = calleeOf(callee.expression, aliases);
196
+ if (
197
+ inner &&
198
+ (inner.member ||
199
+ directApis.has(inner.name) ||
200
+ guardedNames.has(inner.name))
201
+ )
202
+ return inner;
203
+ }
204
+ return { name: member, member: true };
205
+ }
206
+
207
+ /**
208
+ * The method a `.request(...)` call names when it is written out: the first
209
+ * argument's string, or its object's `method` string. Null when the code does
210
+ * not say (a variable, a spread, a call through call/apply/bind).
211
+ */
212
+ function requestMethodOf(call) {
213
+ if (memberNameOf(unwrap(call.expression)) !== "request") return null;
214
+ const first = call.arguments[0] && unwrap(call.arguments[0]);
215
+ if (!first) return null;
216
+ if (ts.isStringLiteralLike(first)) return first.text;
217
+ if (!ts.isObjectLiteralExpression(first)) return null;
218
+ // Only plain, written-out keys: a spread, shorthand, accessor or computed
219
+ // key could name the method another way.
220
+ if (
221
+ first.properties.some(
222
+ (property) =>
223
+ !ts.isPropertyAssignment(property) ||
224
+ !(
225
+ ts.isIdentifier(property.name) ||
226
+ ts.isStringLiteralLike(property.name)
227
+ ),
228
+ )
229
+ )
230
+ return null;
231
+ const methods = first.properties.filter(
232
+ (property) => property.name.text === "method",
233
+ );
234
+ if (methods.length !== 1) return null;
235
+ const value = unwrap(methods[0].initializer);
236
+ return ts.isStringLiteralLike(value) ? value.text : null;
237
+ }
238
+
239
+ function apiOf(call, aliases) {
240
+ const callee = calleeOf(call.expression, aliases);
241
+ if (!callee) return null;
242
+ if (callee.member && callee.name === "request") {
243
+ // A request whose method is written out and signs nothing is a read.
244
+ const method = requestMethodOf(call);
245
+ return method === null || signingRpcMethods.has(method) ? "request" : null;
246
+ }
247
+ return (callee.member ? memberApis : directApis).has(callee.name)
248
+ ? callee.name
249
+ : null;
250
+ }
251
+
252
+ const discovered = [];
253
+ const forbidden = [];
254
+ const selfReviewing = new Set(
255
+ (Array.isArray(inventory.selfReviewing) ? inventory.selfReviewing : []).map(
256
+ (file) =>
257
+ typeof file === "string" ? relative(resolve("."), resolve(file)) : file,
258
+ ),
259
+ );
260
+ for (const filePath of new Set(
261
+ productionRoots.flatMap((root) => productionFiles(root)),
262
+ )) {
263
+ const sourceText = readFileSync(filePath, "utf8");
264
+ const source = ts.createSourceFile(
265
+ filePath,
266
+ sourceText,
267
+ ts.ScriptTarget.Latest,
268
+ true,
269
+ sourceKinds[filePath.slice(filePath.lastIndexOf("."))] ?? ts.ScriptKind.TS,
270
+ );
271
+ const aliases = new Map();
272
+
273
+ for (const statement of source.statements) {
274
+ if (!ts.isImportDeclaration(statement) || !statement.importClause) continue;
275
+ const bindings = statement.importClause.namedBindings;
276
+ if (!bindings || !ts.isNamedImports(bindings)) continue;
277
+ for (const specifier of bindings.elements) {
278
+ const imported = (specifier.propertyName ?? specifier.name).text;
279
+ if (
280
+ directApis.has(imported) ||
281
+ selfReviewingApis.has(imported) ||
282
+ imported === "registerReviewHandler"
283
+ )
284
+ aliases.set(specifier.name.text, imported);
285
+ }
286
+ }
287
+
288
+ function aliasPattern(pattern) {
289
+ for (const element of pattern.elements) {
290
+ if (!ts.isIdentifier(element.name)) continue;
291
+ const key = element.propertyName;
292
+ const exposed = !key
293
+ ? element.name.text
294
+ : ts.isComputedPropertyName(key)
295
+ ? ts.isStringLiteralLike(key.expression)
296
+ ? key.expression.text
297
+ : null
298
+ : key.text;
299
+ if (directApis.has(exposed)) aliases.set(element.name.text, exposed);
300
+ }
301
+ }
302
+
303
+ function collectAliases(node) {
304
+ if (
305
+ (ts.isVariableDeclaration(node) || ts.isParameter(node)) &&
306
+ ts.isObjectBindingPattern(node.name)
307
+ ) {
308
+ aliasPattern(node.name);
309
+ } else if (
310
+ ts.isVariableDeclaration(node) &&
311
+ ts.isIdentifier(node.name) &&
312
+ node.initializer
313
+ ) {
314
+ const initializer = unwrap(node.initializer);
315
+ const name = memberNameOf(initializer);
316
+ if (name !== null && (directApis.has(name) || guardedNames.has(name))) {
317
+ aliases.set(node.name.text, name);
318
+ } else if (
319
+ ts.isIdentifier(initializer) &&
320
+ aliases.has(initializer.text)
321
+ ) {
322
+ aliases.set(node.name.text, aliases.get(initializer.text));
323
+ }
324
+ }
325
+ ts.forEachChild(node, collectAliases);
326
+ }
327
+ collectAliases(source);
328
+
329
+ const here = relative(resolve("."), filePath);
330
+ function lineOf(node) {
331
+ return source.getLineAndCharacterOfPosition(node.getStart(source)).line + 1;
332
+ }
333
+ function moduleSpecifierOf(node) {
334
+ if (
335
+ (ts.isImportDeclaration(node) || ts.isExportDeclaration(node)) &&
336
+ node.moduleSpecifier &&
337
+ ts.isStringLiteral(node.moduleSpecifier)
338
+ ) {
339
+ const typeOnly = ts.isImportDeclaration(node)
340
+ ? node.importClause?.isTypeOnly
341
+ : node.isTypeOnly;
342
+ const named = ts.isImportDeclaration(node)
343
+ ? node.importClause?.namedBindings
344
+ : node.exportClause;
345
+ const allTypeOnly =
346
+ named &&
347
+ (ts.isNamedImports(named) || ts.isNamedExports(named)) &&
348
+ named.elements.length > 0 &&
349
+ !node.importClause?.name &&
350
+ named.elements.every((element) => element.isTypeOnly);
351
+ return typeOnly || allTypeOnly ? null : node.moduleSpecifier;
352
+ }
353
+ if (
354
+ ts.isImportEqualsDeclaration(node) &&
355
+ !node.isTypeOnly &&
356
+ ts.isExternalModuleReference(node.moduleReference) &&
357
+ ts.isStringLiteralLike(node.moduleReference.expression)
358
+ ) {
359
+ return node.moduleReference.expression;
360
+ }
361
+ if (
362
+ ts.isCallExpression(node) &&
363
+ (node.expression.kind === ts.SyntaxKind.ImportKeyword ||
364
+ (ts.isIdentifier(node.expression) &&
365
+ node.expression.text === "require")) &&
366
+ node.arguments[0] &&
367
+ ts.isStringLiteralLike(node.arguments[0])
368
+ ) {
369
+ return node.arguments[0];
370
+ }
371
+ return null;
372
+ }
373
+ function visit(node) {
374
+ const nameNode =
375
+ ts.isIdentifier(node) &&
376
+ !ts.isImportSpecifier(node.parent) &&
377
+ !ts.isExportSpecifier(node.parent) &&
378
+ !ts.isPropertySignature(node.parent)
379
+ ? node
380
+ : ts.isStringLiteralLike(node) &&
381
+ ((ts.isPropertyAssignment(node.parent) &&
382
+ node.parent.name === node) ||
383
+ ts.isComputedPropertyName(node.parent) ||
384
+ ts.isElementAccessExpression(node.parent))
385
+ ? node
386
+ : null;
387
+ if (nameNode && nameNode.text === "reviewedInParent") {
388
+ discovered.push({ file: here, line: lineOf(node), api: nameNode.text });
389
+ }
390
+ const specifier = moduleSpecifierOf(node);
391
+ if (
392
+ specifier &&
393
+ forbiddenImports.some(
394
+ (spec) =>
395
+ specifier.text === spec || specifier.text.startsWith(`${spec}/`),
396
+ )
397
+ ) {
398
+ forbidden.push(`${here}:${lineOf(specifier)}:import ${specifier.text}`);
399
+ }
400
+ if (ts.isCallExpression(node)) {
401
+ const callee = calleeOf(node.expression, aliases)?.name;
402
+ if (callee === "registerReviewHandler") {
403
+ discovered.push({ file: here, line: lineOf(node), api: callee });
404
+ }
405
+ if (selfReviewingApis.has(callee) && !selfReviewing.has(here)) {
406
+ forbidden.push(
407
+ `${here}:${lineOf(node)}:${callee} outside selfReviewing`,
408
+ );
409
+ }
410
+ const api = apiOf(node, aliases);
411
+ if (api) discovered.push({ file: here, line: lineOf(node), api });
412
+ }
413
+ if (ts.isStringLiteralLike(node) && signingRpcMethods.has(node.text)) {
414
+ discovered.push({
415
+ file: here,
416
+ line: lineOf(node),
417
+ api: `rpc:${node.text}`,
418
+ });
419
+ }
420
+ ts.forEachChild(node, visit);
421
+ }
422
+ visit(source);
423
+ }
424
+
425
+ function siteKey(site) {
426
+ return `${site.file}:${site.line}:${site.api}`;
427
+ }
428
+
429
+ invariant(
430
+ inventory.format === "juice-sdk-wallet-boundaries-1",
431
+ "Unsupported wallet inventory format",
432
+ );
433
+ invariant(
434
+ Array.isArray(inventory.sites),
435
+ "Wallet inventory sites must be an array",
436
+ );
437
+ const reviewed = new Map();
438
+ for (const site of inventory.sites) {
439
+ invariant(
440
+ typeof site.file === "string" &&
441
+ Number.isInteger(site.line) &&
442
+ typeof site.api === "string" &&
443
+ typeof site.boundary === "string" &&
444
+ site.boundary.length > 0 &&
445
+ typeof site.test === "string",
446
+ `Invalid reviewed wallet site ${JSON.stringify(site)}`,
447
+ );
448
+ invariant(
449
+ existsSync(resolve(site.file)),
450
+ `Missing wallet-boundary source ${site.file}`,
451
+ );
452
+ invariant(
453
+ statSync(resolve(site.test)).isFile(),
454
+ `Missing wallet-boundary test ${site.test}`,
455
+ );
456
+ site.file = relative(resolve("."), resolve(site.file));
457
+ const key = siteKey(site);
458
+ invariant(!reviewed.has(key), `Duplicate reviewed wallet site ${key}`);
459
+ reviewed.set(key, site);
460
+ }
461
+
462
+ const discoveredKeys = new Set(discovered.map(siteKey));
463
+ const sameLine = discovered.filter(
464
+ (site, index) =>
465
+ discovered.findIndex((other) => siteKey(other) === siteKey(site)) !== index,
466
+ );
467
+ invariant(
468
+ sameLine.length === 0,
469
+ `Several wallet boundary sites share one line, so one inventory row cannot review each; split the line:\n${sameLine.map((site) => `- ${siteKey(site)}`).join("\n")}`,
470
+ );
471
+ const unreviewed = discovered.filter((site) => !reviewed.has(siteKey(site)));
472
+ const stale = [...reviewed.keys()].filter((key) => !discoveredKeys.has(key));
473
+ invariant(
474
+ Array.isArray(inventory.selfReviewing ?? []) &&
475
+ [...selfReviewing].every(
476
+ (file) => typeof file === "string" && existsSync(resolve(file)),
477
+ ),
478
+ "Wallet inventory selfReviewing must list existing files",
479
+ );
480
+ invariant(
481
+ forbidden.length === 0,
482
+ `Forbidden wallet boundary uses:\n${forbidden.map((line) => `- ${line}`).join("\n")}`,
483
+ );
484
+ invariant(
485
+ unreviewed.length === 0,
486
+ `Unreviewed wallet boundary sites:\n${unreviewed.map((site) => `- ${siteKey(site)}`).join("\n")}`,
487
+ );
488
+ invariant(
489
+ stale.length === 0,
490
+ `Stale wallet boundary inventory sites:\n${stale.map((key) => `- ${key}`).join("\n")}`,
491
+ );
492
+
493
+ process.stdout.write(
494
+ `Reviewed ${discovered.length} production wallet signing/submission sites; 0 unreviewed residuals.\n`,
495
+ );
@@ -1,4 +1,4 @@
1
- import { JBChainId, JBVersion } from "../types.js";
1
+ import { JBChainId } from "../types.js";
2
2
  import { useConfig } from "wagmi";
3
3
  export type SuckerPair = {
4
4
  peerChainId: JBChainId;
@@ -17,12 +17,14 @@ export type SuckerPair = {
17
17
  *
18
18
  * Rejects rather than dropping a pair — a silently short group is
19
19
  * indistinguishable from a project with fewer chains.
20
+ *
21
+ * Reads Juicebox V6 only, so a page loads the v6 address table and no other.
20
22
  */
21
23
  export declare function getSuckerPairs({ config, chainId, projectId, version, }: {
22
24
  config: ReturnType<typeof useConfig>;
23
25
  chainId: JBChainId;
24
26
  projectId: bigint;
25
- version: JBVersion;
27
+ version?: 6;
26
28
  }): Promise<SuckerPair[]>;
27
29
  /**
28
30
  * Resolve the full sucker group for a project: the local `(chainId, projectId)`
@@ -40,6 +42,6 @@ export declare function resolveSuckers({ config, chainId, projectId, version, }:
40
42
  config: ReturnType<typeof useConfig>;
41
43
  chainId: JBChainId;
42
44
  projectId: bigint;
43
- version: JBVersion;
45
+ version?: 6;
44
46
  }): Promise<SuckerPair[]>;
45
47
  //# sourceMappingURL=suckerPairs.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"suckerPairs.d.ts","sourceRoot":"","sources":["../../../src/actions/suckerPairs.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,SAAS,EAAqB,SAAS,EAAE,MAAM,aAAa,CAAC;AAGtE,OAAO,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAElC,MAAM,MAAM,UAAU,GAAG;IACvB,WAAW,EAAE,SAAS,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF;;;;;;;;;;;;;GAaG;AACH,wBAAsB,cAAc,CAAC,EACnC,MAAM,EACN,OAAO,EACP,SAAS,EACT,OAAO,GACR,EAAE;IACD,MAAM,EAAE,UAAU,CAAC,OAAO,SAAS,CAAC,CAAC;IACrC,OAAO,EAAE,SAAS,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,SAAS,CAAC;CACpB,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CAiExB;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,cAAc,CAAC,EACnC,MAAM,EACN,OAAO,EACP,SAAS,EACT,OAAO,GACR,EAAE;IACD,MAAM,EAAE,UAAU,CAAC,OAAO,SAAS,CAAC,CAAC;IACrC,OAAO,EAAE,SAAS,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,SAAS,CAAC;CACpB,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CAgCxB"}
1
+ {"version":3,"file":"suckerPairs.d.ts","sourceRoot":"","sources":["../../../src/actions/suckerPairs.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAExC,OAAO,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAElC,MAAM,MAAM,UAAU,GAAG;IACvB,WAAW,EAAE,SAAS,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF;;;;;;;;;;;;;;;GAeG;AACH,wBAAsB,cAAc,CAAC,EACnC,MAAM,EACN,OAAO,EACP,SAAS,EACT,OAAO,GACR,EAAE;IACD,MAAM,EAAE,UAAU,CAAC,OAAO,SAAS,CAAC,CAAC;IACrC,OAAO,EAAE,SAAS,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,CAAC,CAAC;CACb,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CAuCxB;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,cAAc,CAAC,EACnC,MAAM,EACN,OAAO,EACP,SAAS,EACT,OAAO,GACR,EAAE;IACD,MAAM,EAAE,UAAU,CAAC,OAAO,SAAS,CAAC,CAAC;IACrC,OAAO,EAAE,SAAS,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,CAAC,CAAC;CACb,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CA+BxB"}
@@ -3,10 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.getSuckerPairs = getSuckerPairs;
4
4
  exports.resolveSuckers = resolveSuckers;
5
5
  const viem_1 = require("viem");
6
- const juicebox_js_1 = require("../generated/juicebox.js");
7
6
  const JBSuckerAbi_js_1 = require("./JBSuckerAbi.js");
8
- const types_js_1 = require("../types.js");
9
- const contracts_js_1 = require("../utils/contracts.js");
10
7
  const suckers_js_1 = require("../v6/suckers.js");
11
8
  /**
12
9
  * Read a project's directly-paired suckers from the JBSuckerRegistry on `chainId`.
@@ -21,31 +18,15 @@ const suckers_js_1 = require("../v6/suckers.js");
21
18
  *
22
19
  * Rejects rather than dropping a pair — a silently short group is
23
20
  * indistinguishable from a project with fewer chains.
21
+ *
22
+ * Reads Juicebox V6 only, so a page loads the v6 address table and no other.
24
23
  */
25
24
  async function getSuckerPairs({ config, chainId, projectId, version, }) {
26
- const jbSuckerRegistry = (0, contracts_js_1.getJBContractAddress)(types_js_1.JBSuckerContracts.JBSuckerRegistry, version, chainId);
25
+ if (version !== undefined && version !== 6) {
26
+ throw new Error(`Sucker groups are read for Juicebox V6 only, not V${version}.`);
27
+ }
27
28
  const client = config.getClient({ chainId: Number(chainId) });
28
- // v6 identifies remote suckers as bytes32 (for cross-VM compatibility); for EVM peers
29
- // the address is in the low 20 bytes, which `suckerBytes32ToAddress` validates.
30
- const suckers = version === 6
31
- ? (await (0, viem_1.getContract)({
32
- address: jbSuckerRegistry,
33
- abi: juicebox_js_1.jbSuckerRegistryAbi,
34
- client,
35
- }).read.suckerPairsOf([projectId])).map((sucker) => ({
36
- local: sucker.local,
37
- remote: (0, suckers_js_1.suckerBytes32ToAddress)(sucker.remote),
38
- remoteChainId: sucker.remoteChainId,
39
- }))
40
- : (await (0, viem_1.getContract)({
41
- address: jbSuckerRegistry,
42
- abi: juicebox_js_1.jbSuckerRegistryV5Abi,
43
- client,
44
- }).read.suckerPairsOf([projectId])).map((sucker) => ({
45
- local: sucker.local,
46
- remote: sucker.remote,
47
- remoteChainId: sucker.remoteChainId,
48
- }));
29
+ const suckers = await (0, suckers_js_1.getV6SuckerPairs)(client, { chainId, projectId });
49
30
  return Promise.all(suckers.map(async (sucker) => {
50
31
  const remoteClient = config.getClient({
51
32
  chainId: Number(sucker.remoteChainId),
@@ -101,7 +82,6 @@ async function resolveSuckers({ config, chainId, projectId, version, }) {
101
82
  config,
102
83
  chainId: pair.peerChainId,
103
84
  projectId: pair.projectId,
104
- version,
105
85
  })));
106
86
  transitivePairs.flat().forEach(add);
107
87
  return pairs;
@@ -1 +1 @@
1
- {"version":3,"file":"suckerPairs.js","sourceRoot":"","sources":["../../../src/actions/suckerPairs.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"suckerPairs.js","sourceRoot":"","sources":["../../../src/actions/suckerPairs.ts"],"names":[],"mappings":"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"}
@@ -3,4 +3,6 @@
3
3
  * `signal` aborts: at once when it already has.
4
4
  */
5
5
  export declare function pause(ms: number, signal: AbortSignal | undefined, aborted: () => unknown): Promise<void>;
6
+ /** `promise`, or a rejection once `ms` passes first. */
7
+ export declare function timeout<T>(promise: Promise<T>, ms: number): Promise<T>;
6
8
  //# sourceMappingURL=pause.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"pause.d.ts","sourceRoot":"","sources":["../../src/pause.ts"],"names":[],"mappings":"AAGA;;;GAGG;AACH,wBAAgB,KAAK,CACnB,EAAE,EAAE,MAAM,EACV,MAAM,EAAE,WAAW,GAAG,SAAS,EAC/B,OAAO,EAAE,MAAM,OAAO,GACrB,OAAO,CAAC,IAAI,CAAC,CAgBf"}
1
+ {"version":3,"file":"pause.d.ts","sourceRoot":"","sources":["../../src/pause.ts"],"names":[],"mappings":"AAIA;;;GAGG;AACH,wBAAgB,KAAK,CACnB,EAAE,EAAE,MAAM,EACV,MAAM,EAAE,WAAW,GAAG,SAAS,EAC/B,OAAO,EAAE,MAAM,OAAO,GACrB,OAAO,CAAC,IAAI,CAAC,CAgBf;AAED,wDAAwD;AACxD,wBAAsB,OAAO,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAY5E"}
package/dist/cjs/pause.js CHANGED
@@ -1,6 +1,8 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.pause = pause;
4
+ exports.timeout = timeout;
5
+ const lineError_js_1 = require("./review/lineError.js");
4
6
  /** The longest delay setTimeout holds (about 24.8 days): a longer one fires at once. */
5
7
  const MAX_TIMER_MS = 2_147_483_647;
6
8
  /**
@@ -22,4 +24,19 @@ function pause(ms, signal, aborted) {
22
24
  onAbort();
23
25
  });
24
26
  }
27
+ /** `promise`, or a rejection once `ms` passes first. */
28
+ async function timeout(promise, ms) {
29
+ let timer;
30
+ try {
31
+ return await Promise.race([
32
+ promise,
33
+ new Promise((_, reject) => {
34
+ timer = setTimeout(() => reject(new lineError_js_1.ReviewLineError("timed out")), ms);
35
+ }),
36
+ ]);
37
+ }
38
+ finally {
39
+ clearTimeout(timer);
40
+ }
41
+ }
25
42
  //# sourceMappingURL=pause.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"pause.js","sourceRoot":"","sources":["../../src/pause.ts"],"names":[],"mappings":";;AAOA,sBAoBC;AA3BD,wFAAwF;AACxF,MAAM,YAAY,GAAG,aAAa,CAAC;AAEnC;;;GAGG;AACH,SAAgB,KAAK,CACnB,EAAU,EACV,MAA+B,EAC/B,OAAsB;IAEtB,OAAO,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QAC3C,SAAS,OAAO;YACd,YAAY,CAAC,KAAK,CAAC,CAAC;YACpB,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;QACpB,CAAC;QACD,MAAM,KAAK,GAAG,UAAU,CACtB,GAAG,EAAE;YACH,MAAM,EAAE,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YAC9C,OAAO,EAAE,CAAC;QACZ,CAAC,EACD,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,YAAY,CAAC,CAC3B,CAAC;QACF,MAAM,EAAE,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QAC3D,IAAI,MAAM,EAAE,OAAO;YAAE,OAAO,EAAE,CAAC;IACjC,CAAC,CAAC,CAAC;AACL,CAAC"}
1
+ {"version":3,"file":"pause.js","sourceRoot":"","sources":["../../src/pause.ts"],"names":[],"mappings":";;AAQA,sBAoBC;AAGD,0BAYC;AA3CD,wDAAwD;AACxD,wFAAwF;AACxF,MAAM,YAAY,GAAG,aAAa,CAAC;AAEnC;;;GAGG;AACH,SAAgB,KAAK,CACnB,EAAU,EACV,MAA+B,EAC/B,OAAsB;IAEtB,OAAO,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QAC3C,SAAS,OAAO;YACd,YAAY,CAAC,KAAK,CAAC,CAAC;YACpB,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;QACpB,CAAC;QACD,MAAM,KAAK,GAAG,UAAU,CACtB,GAAG,EAAE;YACH,MAAM,EAAE,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YAC9C,OAAO,EAAE,CAAC;QACZ,CAAC,EACD,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,YAAY,CAAC,CAC3B,CAAC;QACF,MAAM,EAAE,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QAC3D,IAAI,MAAM,EAAE,OAAO;YAAE,OAAO,EAAE,CAAC;IACjC,CAAC,CAAC,CAAC;AACL,CAAC;AAED,wDAAwD;AACjD,KAAK,UAAU,OAAO,CAAI,OAAmB,EAAE,EAAU;IAC9D,IAAI,KAAgD,CAAC;IACrD,IAAI,CAAC;QACH,OAAO,MAAM,OAAO,CAAC,IAAI,CAAC;YACxB,OAAO;YACP,IAAI,OAAO,CAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE;gBAC/B,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,8BAAe,CAAC,WAAW,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACzE,CAAC,CAAC;SACH,CAAC,CAAC;IACL,CAAC;YAAS,CAAC;QACT,YAAY,CAAC,KAAK,CAAC,CAAC;IACtB,CAAC;AACH,CAAC"}