@procedures/client 0.2.3 → 0.4.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 (369) hide show
  1. package/CHANGELOG.md +94 -0
  2. package/README.md +77 -44
  3. package/dist/.tsbuildinfo +1 -1
  4. package/dist/adapters/http/client/transport.d.ts.map +1 -1
  5. package/dist/adapters/http/client/transport.js +35 -3
  6. package/dist/adapters/http/client/transport.js.map +1 -1
  7. package/dist/adapters/http/client/types.d.ts +3 -2
  8. package/dist/adapters/http/client/types.d.ts.map +1 -1
  9. package/dist/adapters/http/server/transport.d.ts +2 -2
  10. package/dist/adapters/http/server/transport.d.ts.map +1 -1
  11. package/dist/adapters/http/server/transport.js +54 -22
  12. package/dist/adapters/http/server/transport.js.map +1 -1
  13. package/dist/adapters/http/shared/headers.d.ts +1 -1
  14. package/dist/adapters/http/shared/headers.d.ts.map +1 -1
  15. package/dist/adapters/http/shared/headers.js +7 -6
  16. package/dist/adapters/http/shared/headers.js.map +1 -1
  17. package/dist/adapters/local/client/transport.d.ts +3 -0
  18. package/dist/adapters/local/client/transport.d.ts.map +1 -1
  19. package/dist/adapters/local/client/transport.js +67 -6
  20. package/dist/adapters/local/client/transport.js.map +1 -1
  21. package/dist/adapters/local/client/types.d.ts +15 -0
  22. package/dist/adapters/local/client/types.d.ts.map +1 -1
  23. package/dist/adapters/local/client/types.js.map +1 -1
  24. package/dist/adapters/mock/client/transport.d.ts +3 -2
  25. package/dist/adapters/mock/client/transport.d.ts.map +1 -1
  26. package/dist/adapters/mock/client/transport.js +8 -5
  27. package/dist/adapters/mock/client/transport.js.map +1 -1
  28. package/dist/adapters/mock/client/types.d.ts +7 -6
  29. package/dist/adapters/mock/client/types.d.ts.map +1 -1
  30. package/dist/adapters/port/transport.d.ts +62 -0
  31. package/dist/adapters/port/transport.d.ts.map +1 -0
  32. package/dist/adapters/port/transport.js +94 -0
  33. package/dist/adapters/port/transport.js.map +1 -0
  34. package/dist/adapters/websocket/client/index.d.ts +1 -1
  35. package/dist/adapters/websocket/client/index.d.ts.map +1 -1
  36. package/dist/adapters/websocket/client/index.js.map +1 -1
  37. package/dist/adapters/websocket/client/node.d.ts +30 -0
  38. package/dist/adapters/websocket/client/node.d.ts.map +1 -0
  39. package/dist/adapters/websocket/client/node.js +32 -0
  40. package/dist/adapters/websocket/client/node.js.map +1 -0
  41. package/dist/adapters/websocket/client/transport.d.ts +47 -7
  42. package/dist/adapters/websocket/client/transport.d.ts.map +1 -1
  43. package/dist/adapters/websocket/client/transport.js +229 -75
  44. package/dist/adapters/websocket/client/transport.js.map +1 -1
  45. package/dist/adapters/websocket/client/types.d.ts +71 -21
  46. package/dist/adapters/websocket/client/types.d.ts.map +1 -1
  47. package/dist/adapters/websocket/client/types.js.map +1 -1
  48. package/dist/adapters/websocket/server/transport.d.ts +65 -24
  49. package/dist/adapters/websocket/server/transport.d.ts.map +1 -1
  50. package/dist/adapters/websocket/server/transport.js +192 -263
  51. package/dist/adapters/websocket/server/transport.js.map +1 -1
  52. package/dist/adapters/websocket/server/types.d.ts +20 -1
  53. package/dist/adapters/websocket/server/types.d.ts.map +1 -1
  54. package/dist/adapters/websocket/shared/rpc.d.ts +129 -0
  55. package/dist/adapters/websocket/shared/rpc.d.ts.map +1 -0
  56. package/dist/adapters/websocket/shared/rpc.js +425 -0
  57. package/dist/adapters/websocket/shared/rpc.js.map +1 -0
  58. package/dist/browser.d.ts +29 -7
  59. package/dist/browser.d.ts.map +1 -1
  60. package/dist/browser.js +26 -3
  61. package/dist/browser.js.map +1 -1
  62. package/dist/client/call-types.d.ts +10 -10
  63. package/dist/client/call-types.d.ts.map +1 -1
  64. package/dist/client/call-types.js +1 -6
  65. package/dist/client/call-types.js.map +1 -1
  66. package/dist/client/client.d.ts +6 -1
  67. package/dist/client/client.d.ts.map +1 -1
  68. package/dist/client/client.js +23 -9
  69. package/dist/client/client.js.map +1 -1
  70. package/dist/client/deadline.d.ts +38 -0
  71. package/dist/client/deadline.d.ts.map +1 -0
  72. package/dist/client/deadline.js +60 -0
  73. package/dist/client/deadline.js.map +1 -0
  74. package/dist/client/errors/factory.d.ts.map +1 -1
  75. package/dist/client/errors/factory.js +11 -7
  76. package/dist/client/errors/factory.js.map +1 -1
  77. package/dist/client/errors/http-errors.d.ts.map +1 -1
  78. package/dist/client/errors/http-errors.js +6 -0
  79. package/dist/client/errors/http-errors.js.map +1 -1
  80. package/dist/client/errors/index.d.ts +1 -1
  81. package/dist/client/errors/index.js +1 -1
  82. package/dist/client/errors/registry.d.ts +2 -1
  83. package/dist/client/errors/registry.d.ts.map +1 -1
  84. package/dist/client/errors/registry.js +72 -22
  85. package/dist/client/errors/registry.js.map +1 -1
  86. package/dist/client/index.d.ts +9 -2
  87. package/dist/client/index.d.ts.map +1 -1
  88. package/dist/client/index.js +8 -2
  89. package/dist/client/index.js.map +1 -1
  90. package/dist/client/middleware/cache.d.ts +19 -5
  91. package/dist/client/middleware/cache.d.ts.map +1 -1
  92. package/dist/client/middleware/cache.js +106 -18
  93. package/dist/client/middleware/cache.js.map +1 -1
  94. package/dist/client/middleware/circuit-breaker.d.ts +28 -10
  95. package/dist/client/middleware/circuit-breaker.d.ts.map +1 -1
  96. package/dist/client/middleware/circuit-breaker.js +35 -24
  97. package/dist/client/middleware/circuit-breaker.js.map +1 -1
  98. package/dist/client/middleware/contexts.d.ts +16 -10
  99. package/dist/client/middleware/contexts.d.ts.map +1 -1
  100. package/dist/client/middleware/contexts.js.map +1 -1
  101. package/dist/client/middleware/items.d.ts +31 -2
  102. package/dist/client/middleware/items.d.ts.map +1 -1
  103. package/dist/client/middleware/items.js +86 -6
  104. package/dist/client/middleware/items.js.map +1 -1
  105. package/dist/client/middleware/lru.d.ts +2 -0
  106. package/dist/client/middleware/lru.d.ts.map +1 -1
  107. package/dist/client/middleware/lru.js +11 -0
  108. package/dist/client/middleware/lru.js.map +1 -1
  109. package/dist/client/middleware/rate-limit.d.ts +7 -6
  110. package/dist/client/middleware/rate-limit.d.ts.map +1 -1
  111. package/dist/client/middleware/rate-limit.js +9 -7
  112. package/dist/client/middleware/rate-limit.js.map +1 -1
  113. package/dist/client/middleware/resilience.d.ts +61 -0
  114. package/dist/client/middleware/resilience.d.ts.map +1 -0
  115. package/dist/client/middleware/resilience.js +59 -0
  116. package/dist/client/middleware/resilience.js.map +1 -0
  117. package/dist/client/middleware/retry.d.ts +45 -11
  118. package/dist/client/middleware/retry.d.ts.map +1 -1
  119. package/dist/client/middleware/retry.js +102 -22
  120. package/dist/client/middleware/retry.js.map +1 -1
  121. package/dist/client/middleware/timeout.d.ts +15 -12
  122. package/dist/client/middleware/timeout.d.ts.map +1 -1
  123. package/dist/client/middleware/timeout.js +48 -46
  124. package/dist/client/middleware/timeout.js.map +1 -1
  125. package/dist/client/middleware/tracing.d.ts.map +1 -1
  126. package/dist/client/middleware/tracing.js +11 -3
  127. package/dist/client/middleware/tracing.js.map +1 -1
  128. package/dist/client/types.d.ts +9 -1
  129. package/dist/client/types.d.ts.map +1 -1
  130. package/dist/client/types.js.map +1 -1
  131. package/dist/clock.d.ts +19 -0
  132. package/dist/clock.d.ts.map +1 -0
  133. package/dist/clock.js +18 -0
  134. package/dist/clock.js.map +1 -0
  135. package/dist/duration.d.ts +37 -0
  136. package/dist/duration.d.ts.map +1 -0
  137. package/dist/duration.js +44 -0
  138. package/dist/duration.js.map +1 -0
  139. package/dist/index.d.ts +4 -0
  140. package/dist/index.d.ts.map +1 -1
  141. package/dist/index.js +4 -0
  142. package/dist/index.js.map +1 -1
  143. package/dist/machines.d.ts +90 -0
  144. package/dist/machines.d.ts.map +1 -0
  145. package/dist/machines.js +127 -0
  146. package/dist/machines.js.map +1 -0
  147. package/dist/node.d.ts +11 -0
  148. package/dist/node.d.ts.map +1 -0
  149. package/dist/node.js +10 -0
  150. package/dist/node.js.map +1 -0
  151. package/dist/procedures/capability.d.ts +3 -6
  152. package/dist/procedures/capability.d.ts.map +1 -1
  153. package/dist/procedures/capability.js +7 -8
  154. package/dist/procedures/capability.js.map +1 -1
  155. package/dist/procedures/collection/index.d.ts +3 -3
  156. package/dist/procedures/collection/index.d.ts.map +1 -1
  157. package/dist/procedures/collection/index.js +1 -1
  158. package/dist/procedures/collection/index.js.map +1 -1
  159. package/dist/procedures/collection/procedures.d.ts.map +1 -1
  160. package/dist/procedures/collection/procedures.js +49 -1
  161. package/dist/procedures/collection/procedures.js.map +1 -1
  162. package/dist/procedures/collection/schemas.d.ts +33 -0
  163. package/dist/procedures/collection/schemas.d.ts.map +1 -1
  164. package/dist/procedures/collection/schemas.js +68 -0
  165. package/dist/procedures/collection/schemas.js.map +1 -1
  166. package/dist/procedures/collection/storage.d.ts +37 -0
  167. package/dist/procedures/collection/storage.d.ts.map +1 -1
  168. package/dist/procedures/core/array.d.ts +1 -1
  169. package/dist/procedures/core/array.d.ts.map +1 -1
  170. package/dist/procedures/core/array.js +81 -29
  171. package/dist/procedures/core/array.js.map +1 -1
  172. package/dist/procedures/core/index.d.ts.map +1 -1
  173. package/dist/procedures/core/index.js +17 -2
  174. package/dist/procedures/core/index.js.map +1 -1
  175. package/dist/procedures/core/logic.js +1 -1
  176. package/dist/procedures/core/logic.js.map +1 -1
  177. package/dist/procedures/core/math.d.ts.map +1 -1
  178. package/dist/procedures/core/math.js +5 -1
  179. package/dist/procedures/core/math.js.map +1 -1
  180. package/dist/procedures/core/meta.d.ts.map +1 -1
  181. package/dist/procedures/core/meta.js +43 -8
  182. package/dist/procedures/core/meta.js.map +1 -1
  183. package/dist/procedures/core/object.d.ts.map +1 -1
  184. package/dist/procedures/core/object.js +42 -13
  185. package/dist/procedures/core/object.js.map +1 -1
  186. package/dist/procedures/core/operands.d.ts.map +1 -1
  187. package/dist/procedures/core/operands.js +6 -1
  188. package/dist/procedures/core/operands.js.map +1 -1
  189. package/dist/procedures/core/string.d.ts.map +1 -1
  190. package/dist/procedures/core/string.js +4 -2
  191. package/dist/procedures/core/string.js.map +1 -1
  192. package/dist/procedures/core/type.d.ts.map +1 -1
  193. package/dist/procedures/core/type.js +4 -2
  194. package/dist/procedures/core/type.js.map +1 -1
  195. package/dist/procedures/define-procedure.d.ts +19 -7
  196. package/dist/procedures/define-procedure.d.ts.map +1 -1
  197. package/dist/procedures/define-procedure.js +57 -17
  198. package/dist/procedures/define-procedure.js.map +1 -1
  199. package/dist/procedures/discovery.d.ts +4 -6
  200. package/dist/procedures/discovery.d.ts.map +1 -1
  201. package/dist/procedures/discovery.js +4 -6
  202. package/dist/procedures/discovery.js.map +1 -1
  203. package/dist/procedures/effects.d.ts +16 -0
  204. package/dist/procedures/effects.d.ts.map +1 -1
  205. package/dist/procedures/effects.js +33 -0
  206. package/dist/procedures/effects.js.map +1 -1
  207. package/dist/procedures/idempotency.d.ts +73 -0
  208. package/dist/procedures/idempotency.d.ts.map +1 -0
  209. package/dist/procedures/idempotency.js +131 -0
  210. package/dist/procedures/idempotency.js.map +1 -0
  211. package/dist/procedures/index.d.ts +7 -3
  212. package/dist/procedures/index.d.ts.map +1 -1
  213. package/dist/procedures/index.js +6 -2
  214. package/dist/procedures/index.js.map +1 -1
  215. package/dist/procedures/interceptors.d.ts +17 -4
  216. package/dist/procedures/interceptors.d.ts.map +1 -1
  217. package/dist/procedures/interceptors.js +18 -7
  218. package/dist/procedures/interceptors.js.map +1 -1
  219. package/dist/procedures/invoke.d.ts +15 -3
  220. package/dist/procedures/invoke.d.ts.map +1 -1
  221. package/dist/procedures/invoke.js +8 -3
  222. package/dist/procedures/invoke.js.map +1 -1
  223. package/dist/procedures/manifest.d.ts +83 -0
  224. package/dist/procedures/manifest.d.ts.map +1 -0
  225. package/dist/procedures/manifest.js +90 -0
  226. package/dist/procedures/manifest.js.map +1 -0
  227. package/dist/procedures/ref.d.ts +4 -2
  228. package/dist/procedures/ref.d.ts.map +1 -1
  229. package/dist/procedures/ref.js +2 -1
  230. package/dist/procedures/ref.js.map +1 -1
  231. package/dist/procedures/runtime-programs.d.ts +19 -0
  232. package/dist/procedures/runtime-programs.d.ts.map +1 -0
  233. package/dist/procedures/runtime-programs.js +24 -0
  234. package/dist/procedures/runtime-programs.js.map +1 -0
  235. package/dist/procedures/types.d.ts +16 -0
  236. package/dist/procedures/types.d.ts.map +1 -1
  237. package/dist/procedures/types.js.map +1 -1
  238. package/dist/protocol.d.ts +47 -0
  239. package/dist/protocol.d.ts.map +1 -0
  240. package/dist/protocol.js +68 -0
  241. package/dist/protocol.js.map +1 -0
  242. package/dist/server/host-policy.d.ts +4 -3
  243. package/dist/server/host-policy.d.ts.map +1 -1
  244. package/dist/server/host-policy.js +6 -3
  245. package/dist/server/host-policy.js.map +1 -1
  246. package/dist/server/host-procedures.d.ts +31 -0
  247. package/dist/server/host-procedures.d.ts.map +1 -0
  248. package/dist/server/host-procedures.js +75 -0
  249. package/dist/server/host-procedures.js.map +1 -0
  250. package/dist/server/index.d.ts +3 -3
  251. package/dist/server/index.d.ts.map +1 -1
  252. package/dist/server/index.js +1 -1
  253. package/dist/server/index.js.map +1 -1
  254. package/dist/server/procedure-server.d.ts +112 -5
  255. package/dist/server/procedure-server.d.ts.map +1 -1
  256. package/dist/server/procedure-server.js +273 -19
  257. package/dist/server/procedure-server.js.map +1 -1
  258. package/dist/server/request-auth.d.ts +19 -0
  259. package/dist/server/request-auth.d.ts.map +1 -0
  260. package/dist/server/request-auth.js +32 -0
  261. package/dist/server/request-auth.js.map +1 -0
  262. package/dist/server/types.d.ts +32 -0
  263. package/dist/server/types.d.ts.map +1 -1
  264. package/dist/server/types.js.map +1 -1
  265. package/dist/timers.d.ts +60 -0
  266. package/dist/timers.d.ts.map +1 -0
  267. package/dist/timers.js +33 -0
  268. package/dist/timers.js.map +1 -0
  269. package/dist/tracing/traceparent.d.ts +26 -0
  270. package/dist/tracing/traceparent.d.ts.map +1 -0
  271. package/dist/tracing/traceparent.js +53 -0
  272. package/dist/tracing/traceparent.js.map +1 -0
  273. package/package.json +11 -4
  274. package/src/adapters/http/client/transport.ts +31 -3
  275. package/src/adapters/http/client/types.ts +3 -2
  276. package/src/adapters/http/server/transport.ts +61 -26
  277. package/src/adapters/http/shared/headers.ts +7 -6
  278. package/src/adapters/local/client/transport.ts +74 -7
  279. package/src/adapters/local/client/types.ts +18 -0
  280. package/src/adapters/mock/client/transport.ts +9 -6
  281. package/src/adapters/mock/client/types.ts +7 -6
  282. package/src/adapters/port/transport.ts +124 -0
  283. package/src/adapters/websocket/client/index.ts +1 -0
  284. package/src/adapters/websocket/client/node.ts +34 -0
  285. package/src/adapters/websocket/client/transport.ts +251 -81
  286. package/src/adapters/websocket/client/types.ts +81 -21
  287. package/src/adapters/websocket/server/transport.ts +199 -301
  288. package/src/adapters/websocket/server/types.ts +20 -1
  289. package/src/adapters/websocket/shared/rpc.ts +453 -0
  290. package/src/browser.ts +51 -3
  291. package/src/client/call-types.ts +10 -14
  292. package/src/client/client.ts +28 -9
  293. package/src/client/deadline.ts +64 -0
  294. package/src/client/errors/README.md +2 -0
  295. package/src/client/errors/factory.ts +12 -8
  296. package/src/client/errors/http-errors.ts +5 -0
  297. package/src/client/errors/index.ts +1 -1
  298. package/src/client/errors/registry.ts +79 -22
  299. package/src/client/index.ts +21 -3
  300. package/src/client/middleware/cache.ts +120 -23
  301. package/src/client/middleware/circuit-breaker.ts +65 -35
  302. package/src/client/middleware/contexts.ts +17 -10
  303. package/src/client/middleware/items.ts +101 -6
  304. package/src/client/middleware/lru.ts +12 -0
  305. package/src/client/middleware/rate-limit.ts +9 -9
  306. package/src/client/middleware/resilience.ts +81 -0
  307. package/src/client/middleware/retry.ts +146 -34
  308. package/src/client/middleware/timeout.ts +57 -55
  309. package/src/client/middleware/tracing.ts +13 -4
  310. package/src/client/types.ts +9 -1
  311. package/src/clock.ts +21 -0
  312. package/src/duration.ts +56 -0
  313. package/src/index.ts +4 -0
  314. package/src/machines.ts +186 -0
  315. package/src/node.ts +11 -0
  316. package/src/procedures/capability.ts +7 -8
  317. package/src/procedures/collection/index.ts +9 -1
  318. package/src/procedures/collection/procedures.ts +57 -0
  319. package/src/procedures/collection/schemas.ts +110 -0
  320. package/src/procedures/collection/storage.ts +38 -0
  321. package/src/procedures/core/array.ts +79 -31
  322. package/src/procedures/core/index.ts +17 -2
  323. package/src/procedures/core/logic.ts +1 -1
  324. package/src/procedures/core/math.ts +5 -1
  325. package/src/procedures/core/meta.ts +45 -8
  326. package/src/procedures/core/object.ts +48 -14
  327. package/src/procedures/core/operands.ts +7 -0
  328. package/src/procedures/core/string.ts +4 -2
  329. package/src/procedures/core/type.ts +4 -2
  330. package/src/procedures/define-procedure.ts +73 -20
  331. package/src/procedures/discovery.ts +4 -6
  332. package/src/procedures/effects.ts +35 -0
  333. package/src/procedures/idempotency.ts +152 -0
  334. package/src/procedures/index.ts +18 -2
  335. package/src/procedures/interceptors.ts +28 -11
  336. package/src/procedures/invoke.ts +19 -5
  337. package/src/procedures/manifest.ts +158 -0
  338. package/src/procedures/ref.ts +4 -2
  339. package/src/procedures/runtime-programs.ts +27 -0
  340. package/src/procedures/types.ts +16 -0
  341. package/src/protocol.ts +108 -0
  342. package/src/server/host-policy.ts +8 -5
  343. package/src/server/host-procedures.ts +102 -0
  344. package/src/server/index.ts +5 -2
  345. package/src/server/procedure-server.ts +328 -12
  346. package/src/server/request-auth.ts +35 -0
  347. package/src/server/types.ts +37 -0
  348. package/src/timers.ts +82 -0
  349. package/src/tracing/traceparent.ts +61 -0
  350. package/dist/procedures/cli/announce.d.ts +0 -67
  351. package/dist/procedures/cli/announce.d.ts.map +0 -1
  352. package/dist/procedures/cli/announce.js +0 -392
  353. package/dist/procedures/cli/announce.js.map +0 -1
  354. package/dist/procedures/cli/discover.d.ts +0 -66
  355. package/dist/procedures/cli/discover.d.ts.map +0 -1
  356. package/dist/procedures/cli/discover.js +0 -310
  357. package/dist/procedures/cli/discover.js.map +0 -1
  358. package/dist/procedures/cli/index.d.ts +0 -13
  359. package/dist/procedures/cli/index.d.ts.map +0 -1
  360. package/dist/procedures/cli/index.js +0 -203
  361. package/dist/procedures/cli/index.js.map +0 -1
  362. package/dist/procedures/cli/init.d.ts +0 -17
  363. package/dist/procedures/cli/init.d.ts.map +0 -1
  364. package/dist/procedures/cli/init.js +0 -336
  365. package/dist/procedures/cli/init.js.map +0 -1
  366. package/src/procedures/cli/announce.ts +0 -470
  367. package/src/procedures/cli/discover.ts +0 -390
  368. package/src/procedures/cli/index.ts +0 -231
  369. package/src/procedures/cli/init.ts +0 -370
@@ -1,310 +0,0 @@
1
- /**
2
- * Procedure Discovery
3
- *
4
- * Generates a TypeScript file with static imports for all discovered procedures.
5
- *
6
- * Fast path: Reads from .client-registry.json (populated by `client-registry announce`)
7
- * Fallback: Scans node_modules for packages with `client.procedures`
8
- *
9
- * This is compile-time discovery - the generated file contains static imports
10
- * that get compiled/bundled with your application.
11
- */
12
- import * as fs from "node:fs/promises";
13
- import * as path from "node:path";
14
- import { watch } from "node:fs";
15
- import { getRegistry, REGISTRY_FILENAME } from "./announce.js";
16
- /** The string targets of an exports value: a string, an array, or the leaves of conditions. */
17
- function exportTargets(value) {
18
- if (typeof value === "string")
19
- return [value];
20
- if (Array.isArray(value))
21
- return value.flatMap(exportTargets);
22
- if (value && typeof value === "object")
23
- return Object.values(value).flatMap(exportTargets);
24
- return [];
25
- }
26
- /**
27
- * The specifier that imports the procedures file of a package. With an `exports` map, a bare
28
- * `pkg/dist/register.js` import fails unless the map exports that path: the function looks for
29
- * the subpath (also a `./*` pattern) whose target is the file: for the packages of this
30
- * repository, `./register`. When the map has none, it imports the package root. (Before, the
31
- * generated import ignored the map, and failed: deep dive CORE-17.)
32
- *
33
- * @param name - Package name
34
- * @param manifest - The package.json of the package
35
- * @param proceduresPath - The `client.procedures` field
36
- * @returns The module specifier for the generated import
37
- */
38
- export function procedureImportPath(name, manifest, proceduresPath) {
39
- const file = "./" + proceduresPath.replace(/^\.\//, "");
40
- if (manifest.exports === undefined) {
41
- return `${name}/${file.slice(2)}`;
42
- }
43
- const exportsMap = typeof manifest.exports === "string" || Array.isArray(manifest.exports) ||
44
- !Object.keys(manifest.exports).some((key) => key.startsWith("."))
45
- ? { ".": manifest.exports }
46
- : manifest.exports;
47
- for (const [subpath, value] of Object.entries(exportsMap)) {
48
- for (const target of exportTargets(value)) {
49
- if (!subpath.includes("*")) {
50
- if (target === file)
51
- return subpath === "." ? name : `${name}/${subpath.slice(2)}`;
52
- continue;
53
- }
54
- // A pattern: "./*" -> "./dist/*.js"
55
- const [before, after] = target.split("*");
56
- if (after === undefined || !file.startsWith(before) || !file.endsWith(after))
57
- continue;
58
- const star = file.slice(before.length, file.length - after.length);
59
- return `${name}/${subpath.replace("*", star).slice(2)}`;
60
- }
61
- }
62
- return name;
63
- }
64
- // =============================================================================
65
- // Discovery
66
- // =============================================================================
67
- /**
68
- * Discover packages with procedure declarations: the dependencies of the root package and
69
- * their dependencies, in `node_modules`.
70
- *
71
- * @param rootDir - The folder of the root package.json
72
- * @param verbose - Log each package
73
- * @returns The packages that declare procedures, sorted by name
74
- */
75
- export async function discoverPackages(rootDir, verbose) {
76
- const discovered = [];
77
- const scanned = new Set();
78
- // Read root package.json
79
- const rootPkgPath = path.join(rootDir, "package.json");
80
- let rootPkg;
81
- try {
82
- const content = await fs.readFile(rootPkgPath, "utf-8");
83
- rootPkg = JSON.parse(content);
84
- }
85
- catch {
86
- throw new Error(`Could not read package.json at ${rootPkgPath}`);
87
- }
88
- // Get all dependencies to scan
89
- const depsToScan = [
90
- ...Object.keys(rootPkg.dependencies ?? {}),
91
- ...Object.keys(rootPkg.devDependencies ?? {}),
92
- ];
93
- if (verbose) {
94
- console.log(`Scanning ${depsToScan.length} dependencies...`);
95
- }
96
- // Scan each dependency
97
- async function scanPackage(packageName, nodeModulesPath) {
98
- if (scanned.has(packageName))
99
- return;
100
- const pkgDir = path.join(nodeModulesPath, packageName);
101
- const pkgJsonPath = path.join(pkgDir, "package.json");
102
- let pkg;
103
- try {
104
- const content = await fs.readFile(pkgJsonPath, "utf-8");
105
- pkg = JSON.parse(content);
106
- }
107
- catch {
108
- // Package doesn't exist at this path (might be hoisted differently). It is not scanned
109
- // yet: the next location can have it. (Before, the name was marked as scanned before
110
- // the read, so a hoisted transitive package was skipped: deep dive CORE-17.)
111
- return;
112
- }
113
- scanned.add(packageName);
114
- // Check if this package declares procedures
115
- if (pkg.client?.procedures) {
116
- const proceduresPath = pkg.client.procedures;
117
- // Verify the file exists
118
- const fullPath = path.join(pkgDir, proceduresPath);
119
- try {
120
- await fs.access(fullPath);
121
- discovered.push({
122
- name: packageName,
123
- proceduresPath,
124
- importPath: procedureImportPath(packageName, pkg, proceduresPath),
125
- });
126
- if (verbose) {
127
- console.log(` Found: ${packageName} -> ${proceduresPath}`);
128
- }
129
- }
130
- catch {
131
- console.warn(` Warning: ${packageName} declares procedures at ${proceduresPath} but file not found`);
132
- }
133
- }
134
- // Recursively scan this package's dependencies
135
- const subDeps = Object.keys(pkg.dependencies ?? {});
136
- for (const subDep of subDeps) {
137
- // Try local node_modules first, then parent
138
- await scanPackage(subDep, path.join(pkgDir, "node_modules"));
139
- await scanPackage(subDep, nodeModulesPath);
140
- }
141
- }
142
- // Scan all dependencies
143
- const nodeModulesPath = path.join(rootDir, "node_modules");
144
- for (const dep of depsToScan) {
145
- await scanPackage(dep, nodeModulesPath);
146
- }
147
- // Sort for deterministic output
148
- discovered.sort((a, b) => a.name.localeCompare(b.name));
149
- return discovered;
150
- }
151
- // =============================================================================
152
- // Code Generation
153
- // =============================================================================
154
- /**
155
- * Generate the TypeScript file content.
156
- *
157
- * @param packages - The discovered packages
158
- * @returns The file content: one side-effect import for each package
159
- */
160
- export function generateCode(packages) {
161
- const timestamp = new Date().toISOString();
162
- const imports = packages
163
- .map((p) => `import "${p.importPath}";`)
164
- .join("\n");
165
- const packageList = packages.map((p) => ` "${p.name}",`).join("\n");
166
- return `/**
167
- * Auto-generated procedure imports
168
- *
169
- * DO NOT EDIT - This file is generated by \`npx client-registry discover\`
170
- * Generated at: ${timestamp}
171
- *
172
- * Import this file at your app's entry point to register all procedures
173
- * from your dependencies.
174
- */
175
-
176
- // Side-effect imports that register procedures
177
- ${imports || "// No packages with procedures found"}
178
-
179
- /**
180
- * List of packages that were discovered and imported.
181
- */
182
- export const discoveredPackages = [
183
- ${packageList || " // No packages with procedures found"}
184
- ] as const;
185
-
186
- /**
187
- * Number of packages with procedures.
188
- */
189
- export const packageCount = ${packages.length};
190
- `;
191
- }
192
- // =============================================================================
193
- // Main
194
- // =============================================================================
195
- /**
196
- * Try to load packages from registry (fast path).
197
- * Returns null if registry doesn't exist or is empty.
198
- */
199
- async function loadFromRegistry(rootDir, verbose) {
200
- try {
201
- const registry = await getRegistry(rootDir);
202
- if (Object.keys(registry.packages).length === 0) {
203
- return null;
204
- }
205
- const packages = [];
206
- for (const [name, entry] of Object.entries(registry.packages)) {
207
- // The exports map of the installed package decides the import path
208
- let manifest = {};
209
- try {
210
- manifest = JSON.parse(await fs.readFile(path.join(rootDir, "node_modules", name, "package.json"), "utf-8"));
211
- }
212
- catch {
213
- // Not installed at the root: import the declared file
214
- }
215
- packages.push({
216
- name,
217
- proceduresPath: entry.proceduresPath,
218
- importPath: procedureImportPath(name, manifest, entry.proceduresPath),
219
- });
220
- }
221
- // Sort for deterministic output
222
- packages.sort((a, b) => a.name.localeCompare(b.name));
223
- if (verbose) {
224
- console.log(`Loaded ${packages.length} package(s) from ${REGISTRY_FILENAME}`);
225
- }
226
- return packages;
227
- }
228
- catch {
229
- return null;
230
- }
231
- }
232
- /**
233
- * Run procedure discovery.
234
- */
235
- export async function discover(options) {
236
- const { output, root, watch: watchMode, check, verbose } = options;
237
- async function runDiscovery() {
238
- if (verbose) {
239
- console.log(`Discovering procedures in ${root}...`);
240
- }
241
- // Try registry first (fast path)
242
- let packages = await loadFromRegistry(root, verbose);
243
- if (packages === null) {
244
- // Fallback to scanning
245
- if (verbose) {
246
- console.log(`No registry found, scanning node_modules...`);
247
- }
248
- packages = await discoverPackages(root, verbose);
249
- }
250
- const code = generateCode(packages);
251
- console.log(`Discovered ${packages.length} package(s) with procedures`);
252
- return code;
253
- }
254
- // Run initial discovery
255
- const code = await runDiscovery();
256
- // Resolve output path
257
- const outputPath = path.isAbsolute(output) ? output : path.join(root, output);
258
- const outputDir = path.dirname(outputPath);
259
- if (check) {
260
- // Check mode: verify the file is up-to-date
261
- try {
262
- const existing = await fs.readFile(outputPath, "utf-8");
263
- // Compare ignoring the timestamp line
264
- const normalizeForCompare = (s) => s.replace(/Generated at: .+/, "Generated at: <timestamp>");
265
- if (normalizeForCompare(existing) !== normalizeForCompare(code)) {
266
- console.error("Generated file is out of date!");
267
- console.error(`Run \`npx client-registry discover\` to update ${output}`);
268
- process.exit(1);
269
- }
270
- console.log("Generated file is up-to-date");
271
- return;
272
- }
273
- catch {
274
- console.error(`Generated file does not exist: ${output}`);
275
- console.error(`Run \`npx client-registry discover\` to generate it`);
276
- process.exit(1);
277
- }
278
- }
279
- // Write the file
280
- await fs.mkdir(outputDir, { recursive: true });
281
- await fs.writeFile(outputPath, code, "utf-8");
282
- console.log(`Generated: ${output}`);
283
- if (watchMode) {
284
- // Watch mode: re-run on package.json changes
285
- console.log("\nWatching for changes...");
286
- console.log("Press Ctrl+C to stop\n");
287
- const pkgJsonPath = path.join(root, "package.json");
288
- const nodeModulesPath = path.join(root, "node_modules");
289
- // Watch package.json
290
- watch(pkgJsonPath, async () => {
291
- console.log("\npackage.json changed, re-discovering...");
292
- const newCode = await runDiscovery();
293
- await fs.writeFile(outputPath, newCode, "utf-8");
294
- console.log(`Updated: ${output}`);
295
- });
296
- // Watch node_modules (for package.json files inside)
297
- // This is a simplified watch - in production you might use chokidar
298
- watch(nodeModulesPath, { recursive: true }, async (_, filename) => {
299
- if (filename?.endsWith("package.json")) {
300
- console.log("\nDependency changed, re-discovering...");
301
- const newCode = await runDiscovery();
302
- await fs.writeFile(outputPath, newCode, "utf-8");
303
- console.log(`Updated: ${output}`);
304
- }
305
- });
306
- // Keep process alive
307
- await new Promise(() => { });
308
- }
309
- }
310
- //# sourceMappingURL=discover.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"discover.js","sourceRoot":"","sources":["../../../src/procedures/cli/discover.ts"],"names":[],"mappings":"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"}
@@ -1,13 +0,0 @@
1
- #!/usr/bin/env node
2
- /**
3
- * Client CLI
4
- *
5
- * Command-line interface for procedure discovery and library scaffolding.
6
- *
7
- * Commands:
8
- * - discover: Generate procedure imports (reads from registry or scans)
9
- * - announce: Register this package's procedures (called from postinstall)
10
- * - init: Initialize a new library with procedure support
11
- */
12
- export {};
13
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/procedures/cli/index.ts"],"names":[],"mappings":";AACA;;;;;;;;;GASG"}
@@ -1,203 +0,0 @@
1
- #!/usr/bin/env node
2
- /**
3
- * Client CLI
4
- *
5
- * Command-line interface for procedure discovery and library scaffolding.
6
- *
7
- * Commands:
8
- * - discover: Generate procedure imports (reads from registry or scans)
9
- * - announce: Register this package's procedures (called from postinstall)
10
- * - init: Initialize a new library with procedure support
11
- */
12
- import { readFileSync } from "node:fs";
13
- import { parseArgs } from "node:util";
14
- import { discover } from "./discover.js";
15
- import { init } from "./init.js";
16
- import { announce, unannounce } from "./announce.js";
17
- function parseCliArgs() {
18
- const args = process.argv.slice(2);
19
- const command = args[0] ?? "help";
20
- const rest = args.slice(1);
21
- // Parse based on command
22
- switch (command) {
23
- case "discover": {
24
- const { values } = parseArgs({
25
- args: rest,
26
- options: {
27
- output: { type: "string", short: "o", default: "./__generated__/procedures.ts" },
28
- root: { type: "string", short: "r", default: process.cwd() },
29
- watch: { type: "boolean", short: "w", default: false },
30
- check: { type: "boolean", short: "c", default: false },
31
- verbose: { type: "boolean", short: "v", default: false },
32
- },
33
- allowPositionals: false,
34
- });
35
- return { command, options: values, positionals: [] };
36
- }
37
- case "init": {
38
- const { values, positionals } = parseArgs({
39
- args: rest,
40
- options: {
41
- force: { type: "boolean", short: "f", default: false },
42
- },
43
- allowPositionals: true,
44
- });
45
- return { command, options: values, positionals };
46
- }
47
- case "announce": {
48
- const { values } = parseArgs({
49
- args: rest,
50
- options: {
51
- verbose: { type: "boolean", short: "v", default: false },
52
- propagate: { type: "boolean", default: false },
53
- },
54
- allowPositionals: false,
55
- });
56
- return { command, options: values, positionals: [] };
57
- }
58
- case "unannounce": {
59
- const { values } = parseArgs({
60
- args: rest,
61
- options: {
62
- verbose: { type: "boolean", short: "v", default: false },
63
- },
64
- allowPositionals: false,
65
- });
66
- return { command, options: values, positionals: [] };
67
- }
68
- case "help":
69
- case "--help":
70
- case "-h":
71
- return { command: "help", options: {}, positionals: [] };
72
- case "version":
73
- case "--version":
74
- case "-V":
75
- return { command: "version", options: {}, positionals: [] };
76
- default:
77
- console.error(`Unknown command: ${command}`);
78
- return { command: "help", options: {}, positionals: [] };
79
- }
80
- }
81
- // =============================================================================
82
- // Help Text
83
- // =============================================================================
84
- function printHelp() {
85
- console.log(`
86
- client - Procedure discovery and library scaffolding CLI
87
-
88
- Usage:
89
- client <command> [options]
90
-
91
- Commands:
92
- discover Generate procedure imports (from registry or by scanning)
93
- announce Register this package's procedures (used in postinstall)
94
- init Initialize a new library with procedure support
95
- help Show this help message
96
- version Show version
97
-
98
- Examples:
99
- # Generate procedure imports from dependencies
100
- client-registry discover
101
-
102
- # Generate to custom output path
103
- client-registry discover --output ./src/generated/procedures.ts
104
-
105
- # Watch for changes (dev mode)
106
- client-registry discover --watch
107
-
108
- # Check if generated file is up-to-date (CI)
109
- client-registry discover --check
110
-
111
- # Initialize a new library
112
- client-registry init my-new-lib
113
-
114
- # Initialize in current directory
115
- client-registry init .
116
-
117
- # Register procedures (called automatically via postinstall)
118
- client-registry announce
119
-
120
- # Also add "client-registry announce" to the postinstall script of the package that depends on this one
121
- client-registry announce --propagate
122
-
123
- How it works:
124
- 1. Libraries with procedures add to package.json:
125
- { "client": { "procedures": "./dist/register.js" } }
126
-
127
- 2. Libraries add postinstall hook:
128
- { "scripts": { "postinstall": "client-registry announce" } }
129
-
130
- 3. When installed, each library announces itself to .client-registry.json
131
-
132
- 4. App runs "client-registry discover" to generate imports from the registry
133
-
134
- For more information, visit: https://mark1russell7.github.io/client/
135
- `);
136
- }
137
- function printVersion() {
138
- // This file is dist/procedures/cli/index.js: the package.json is three folders up
139
- const manifest = JSON.parse(readFileSync(new URL("../../../package.json", import.meta.url), "utf8"));
140
- console.log(`client-registry v${manifest.version}`);
141
- }
142
- // =============================================================================
143
- // Main
144
- // =============================================================================
145
- async function main() {
146
- const { command, options, positionals } = parseCliArgs();
147
- try {
148
- switch (command) {
149
- case "discover":
150
- await discover({
151
- output: options["output"],
152
- root: options["root"],
153
- watch: options["watch"],
154
- check: options["check"],
155
- verbose: options["verbose"],
156
- });
157
- break;
158
- case "init": {
159
- const name = positionals[0];
160
- if (!name) {
161
- console.error("Error: Please provide a library name");
162
- console.error("Usage: client-registry init <name>");
163
- process.exit(1);
164
- }
165
- await init({
166
- name,
167
- force: options["force"],
168
- });
169
- break;
170
- }
171
- case "announce":
172
- // announce is best-effort for postinstall - never fail
173
- try {
174
- await announce({
175
- verbose: options["verbose"],
176
- propagate: options["propagate"],
177
- });
178
- }
179
- catch {
180
- // Silently ignore errors - this runs in postinstall
181
- // and should never block package installation
182
- }
183
- break;
184
- case "unannounce":
185
- await unannounce({
186
- verbose: options["verbose"],
187
- });
188
- break;
189
- case "help":
190
- printHelp();
191
- break;
192
- case "version":
193
- printVersion();
194
- break;
195
- }
196
- }
197
- catch (error) {
198
- console.error("Error:", error instanceof Error ? error.message : error);
199
- process.exit(1);
200
- }
201
- }
202
- main();
203
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/procedures/cli/index.ts"],"names":[],"mappings":"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"}
@@ -1,17 +0,0 @@
1
- /**
2
- * Library Initialization
3
- *
4
- * Scaffolds a new library with procedure support.
5
- * Creates the necessary file structure and configuration.
6
- */
7
- export interface InitOptions {
8
- /** Library name or "." for current directory */
9
- name: string;
10
- /** Overwrite existing files */
11
- force: boolean;
12
- }
13
- /**
14
- * Initialize a new library with procedure support.
15
- */
16
- export declare function init(options: InitOptions): Promise<void>;
17
- //# sourceMappingURL=init.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../../src/procedures/cli/init.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AASH,MAAM,WAAW,WAAW;IAC1B,gDAAgD;IAChD,IAAI,EAAE,MAAM,CAAC;IACb,+BAA+B;IAC/B,KAAK,EAAE,OAAO,CAAC;CAChB;AA2SD;;GAEG;AACH,wBAAsB,IAAI,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAgD9D"}