@seamapi/cli 0.18.1 → 0.19.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 (364) hide show
  1. package/README.md +55 -1
  2. package/bin/cli.js +73 -249
  3. package/bin/cli.js.map +1 -1
  4. package/lib/args/coerce.d.ts +28 -0
  5. package/lib/args/coerce.js +131 -0
  6. package/lib/args/coerce.js.map +1 -0
  7. package/lib/{util/cli-args.d.ts → args/parse.d.ts} +12 -15
  8. package/lib/{util/cli-args.js → args/parse.js} +21 -24
  9. package/lib/args/parse.js.map +1 -0
  10. package/lib/args/validate.d.ts +23 -0
  11. package/lib/args/validate.js +42 -0
  12. package/lib/args/validate.js.map +1 -0
  13. package/lib/auth/operations.d.ts +54 -0
  14. package/lib/auth/operations.js +115 -0
  15. package/lib/auth/operations.js.map +1 -0
  16. package/lib/{validate-token.js → auth/validate-token.js} +2 -2
  17. package/lib/auth/validate-token.js.map +1 -0
  18. package/lib/blueprint/cache.d.ts +16 -0
  19. package/lib/blueprint/cache.js +73 -0
  20. package/lib/blueprint/cache.js.map +1 -0
  21. package/lib/blueprint/endpoint.d.ts +14 -0
  22. package/lib/{get-response-key.js → blueprint/endpoint.js} +11 -2
  23. package/lib/blueprint/endpoint.js.map +1 -0
  24. package/lib/blueprint/index.d.ts +12 -0
  25. package/lib/blueprint/index.js +10 -0
  26. package/lib/blueprint/index.js.map +1 -0
  27. package/lib/blueprint/source-npm.d.ts +10 -0
  28. package/lib/{blueprint.js → blueprint/source-npm.js} +20 -74
  29. package/lib/blueprint/source-npm.js.map +1 -0
  30. package/lib/blueprint/source-remote.d.ts +6 -0
  31. package/lib/blueprint/source-remote.js +14 -0
  32. package/lib/blueprint/source-remote.js.map +1 -0
  33. package/lib/commands/api-command.d.ts +8 -0
  34. package/lib/commands/api-command.js +71 -0
  35. package/lib/commands/api-command.js.map +1 -0
  36. package/lib/commands/local/completion.d.ts +18 -0
  37. package/lib/commands/local/completion.js +35 -0
  38. package/lib/commands/local/completion.js.map +1 -0
  39. package/lib/commands/local/config-reveal-location.d.ts +2 -0
  40. package/lib/commands/local/config-reveal-location.js +15 -0
  41. package/lib/commands/local/config-reveal-location.js.map +1 -0
  42. package/lib/commands/local/config-set-fake-server.d.ts +3 -0
  43. package/lib/commands/local/config-set-fake-server.js +20 -0
  44. package/lib/commands/local/config-set-fake-server.js.map +1 -0
  45. package/lib/commands/local/config-use-remote-api-defs.d.ts +2 -0
  46. package/lib/commands/local/config-use-remote-api-defs.js +20 -0
  47. package/lib/commands/local/config-use-remote-api-defs.js.map +1 -0
  48. package/lib/commands/local/health.d.ts +2 -0
  49. package/lib/commands/local/health.js +18 -0
  50. package/lib/commands/local/health.js.map +1 -0
  51. package/lib/commands/local/login.d.ts +2 -0
  52. package/lib/commands/local/login.js +35 -0
  53. package/lib/commands/local/login.js.map +1 -0
  54. package/lib/commands/local/logout.d.ts +2 -0
  55. package/lib/commands/local/logout.js +17 -0
  56. package/lib/commands/local/logout.js.map +1 -0
  57. package/lib/commands/local/select-server.d.ts +2 -0
  58. package/lib/commands/local/select-server.js +27 -0
  59. package/lib/commands/local/select-server.js.map +1 -0
  60. package/lib/commands/local/select-workspace.d.ts +2 -0
  61. package/lib/commands/local/select-workspace.js +22 -0
  62. package/lib/commands/local/select-workspace.js.map +1 -0
  63. package/lib/commands/local/wizard.d.ts +9 -0
  64. package/lib/commands/local/wizard.js +28 -0
  65. package/lib/commands/local/wizard.js.map +1 -0
  66. package/lib/commands/registry.d.ts +54 -0
  67. package/lib/commands/registry.js +64 -0
  68. package/lib/commands/registry.js.map +1 -0
  69. package/lib/{command-spec.d.ts → commands/spec.d.ts} +8 -12
  70. package/lib/{command-spec.js → commands/spec.js} +27 -120
  71. package/lib/commands/spec.js.map +1 -0
  72. package/lib/config/config-store.d.ts +23 -8
  73. package/lib/config/config-store.js +16 -42
  74. package/lib/config/config-store.js.map +1 -1
  75. package/lib/config/index.d.ts +2 -1
  76. package/lib/config/index.js +2 -1
  77. package/lib/config/index.js.map +1 -1
  78. package/lib/config/memory-config-store.d.ts +21 -0
  79. package/lib/config/memory-config-store.js +48 -0
  80. package/lib/config/memory-config-store.js.map +1 -0
  81. package/lib/config/migrate.js +1 -1
  82. package/lib/config/migrate.js.map +1 -1
  83. package/lib/config/values.d.ts +12 -0
  84. package/lib/config/values.js +50 -0
  85. package/lib/config/values.js.map +1 -0
  86. package/lib/context.d.ts +37 -0
  87. package/lib/context.js +31 -0
  88. package/lib/context.js.map +1 -0
  89. package/lib/env.d.ts +5 -0
  90. package/lib/env.js +5 -0
  91. package/lib/env.js.map +1 -1
  92. package/lib/errors.d.ts +31 -0
  93. package/lib/errors.js +58 -0
  94. package/lib/errors.js.map +1 -0
  95. package/lib/http/api.d.ts +37 -0
  96. package/lib/http/api.js +20 -0
  97. package/lib/http/api.js.map +1 -0
  98. package/lib/http/client.d.ts +4 -0
  99. package/lib/{get-seam.js → http/client.js} +16 -17
  100. package/lib/http/client.js.map +1 -0
  101. package/lib/http/follow-ups.d.ts +6 -0
  102. package/lib/http/follow-ups.js +30 -0
  103. package/lib/http/follow-ups.js.map +1 -0
  104. package/lib/http/memory-seam-api.d.ts +22 -0
  105. package/lib/http/memory-seam-api.js +41 -0
  106. package/lib/http/memory-seam-api.js.map +1 -0
  107. package/lib/http/request.d.ts +19 -0
  108. package/lib/http/request.js +39 -0
  109. package/lib/http/request.js.map +1 -0
  110. package/lib/{interact-for-access-code.js → interactions/access-code.js} +4 -4
  111. package/lib/interactions/access-code.js.map +1 -0
  112. package/lib/{interact-for-acs-entrance.js → interactions/acs-entrance.js} +3 -3
  113. package/lib/interactions/acs-entrance.js.map +1 -0
  114. package/lib/{interact-for-acs-system.js → interactions/acs-system.js} +3 -3
  115. package/lib/interactions/acs-system.js.map +1 -0
  116. package/lib/{interact-for-acs-user.js → interactions/acs-user.js} +4 -4
  117. package/lib/interactions/acs-user.js.map +1 -0
  118. package/lib/{interact-for-action-attempt-poll.js → interactions/action-attempt-poll.js} +5 -5
  119. package/lib/interactions/action-attempt-poll.js.map +1 -0
  120. package/lib/{interact-for-array.js → interactions/array.js} +4 -3
  121. package/lib/interactions/array.js.map +1 -0
  122. package/lib/{interact-for-blueprint-object.d.ts → interactions/blueprint-object.d.ts} +3 -2
  123. package/lib/{interact-for-blueprint-object.js → interactions/blueprint-object.js} +49 -20
  124. package/lib/interactions/blueprint-object.js.map +1 -0
  125. package/lib/{interact-for-command-params.d.ts → interactions/command-params.d.ts} +2 -2
  126. package/lib/{interact-for-command-params.js → interactions/command-params.js} +4 -3
  127. package/lib/interactions/command-params.js.map +1 -0
  128. package/lib/interactions/command-selection.d.ts +10 -0
  129. package/lib/{interact-for-command-selection.js → interactions/command-selection.js} +9 -15
  130. package/lib/interactions/command-selection.js.map +1 -0
  131. package/lib/{interact-for-connected-account.js → interactions/connected-account.js} +3 -3
  132. package/lib/interactions/connected-account.js.map +1 -0
  133. package/lib/{interact-for-custom-metadata.js → interactions/custom-metadata.js} +4 -3
  134. package/lib/interactions/custom-metadata.js.map +1 -0
  135. package/lib/{interact-for-device.js → interactions/device.js} +3 -3
  136. package/lib/interactions/device.js.map +1 -0
  137. package/lib/interactions/index.d.ts +19 -0
  138. package/lib/interactions/index.js +20 -0
  139. package/lib/interactions/index.js.map +1 -0
  140. package/lib/{interact-for-login.js → interactions/login.js} +16 -14
  141. package/lib/interactions/login.js.map +1 -0
  142. package/lib/{interact-for-resource.js → interactions/resource.js} +3 -3
  143. package/lib/interactions/resource.js.map +1 -0
  144. package/lib/{interact-for-server-selection.js → interactions/server-selection.js} +10 -13
  145. package/lib/interactions/server-selection.js.map +1 -0
  146. package/lib/{interact-for-timestamp.js → interactions/timestamp.js} +2 -2
  147. package/lib/interactions/timestamp.js.map +1 -0
  148. package/lib/{interact-for-use-remote-api-defs.js → interactions/use-remote-api-defs.js} +5 -6
  149. package/lib/interactions/use-remote-api-defs.js.map +1 -0
  150. package/lib/{interact-for-user-identity.js → interactions/user-identity.js} +3 -3
  151. package/lib/interactions/user-identity.js.map +1 -0
  152. package/lib/{interact-for-workspace-id.js → interactions/workspace-id.js} +11 -10
  153. package/lib/interactions/workspace-id.js.map +1 -0
  154. package/lib/memory-prompt.d.ts +32 -0
  155. package/lib/memory-prompt.js +41 -0
  156. package/lib/memory-prompt.js.map +1 -0
  157. package/lib/output/get-output.d.ts +1 -1
  158. package/lib/output/get-output.js +1 -1
  159. package/lib/output/get-output.js.map +1 -1
  160. package/lib/output/{create-memory-output.d.ts → memory-output.d.ts} +1 -1
  161. package/lib/output/{create-memory-output.js → memory-output.js} +2 -2
  162. package/lib/output/memory-output.js.map +1 -0
  163. package/lib/output/{create-output.d.ts → output.d.ts} +18 -1
  164. package/lib/output/output.js +46 -0
  165. package/lib/output/output.js.map +1 -0
  166. package/lib/output/read-stdin-json.js.map +1 -0
  167. package/lib/output/resolve-output-format.d.ts +1 -1
  168. package/lib/{util → output}/with-loading.js +1 -1
  169. package/lib/output/with-loading.js.map +1 -0
  170. package/lib/prompt.d.ts +101 -0
  171. package/lib/{util/prompt.js → prompt.js} +83 -56
  172. package/lib/prompt.js.map +1 -0
  173. package/lib/{completion → render/completion}/describe.js +1 -2
  174. package/lib/render/completion/describe.js.map +1 -0
  175. package/lib/{completion → render/completion}/index.d.ts +2 -2
  176. package/lib/{completion → render/completion}/index.js +1 -2
  177. package/lib/render/completion/index.js.map +1 -0
  178. package/lib/{completion → render/completion}/render-bash.d.ts +1 -1
  179. package/lib/{completion → render/completion}/render-bash.js +1 -1
  180. package/lib/render/completion/render-bash.js.map +1 -0
  181. package/lib/{completion → render/completion}/render-fish.d.ts +1 -1
  182. package/lib/render/completion/render-fish.js.map +1 -0
  183. package/lib/{completion → render/completion}/render-zsh.d.ts +1 -1
  184. package/lib/{completion → render/completion}/render-zsh.js +1 -1
  185. package/lib/render/completion/render-zsh.js.map +1 -0
  186. package/lib/{render-help.d.ts → render/help.d.ts} +1 -1
  187. package/lib/{render-help.js → render/help.js} +2 -2
  188. package/lib/render/help.js.map +1 -0
  189. package/lib/render/text.d.ts +4 -0
  190. package/lib/render/text.js +16 -0
  191. package/lib/render/text.js.map +1 -0
  192. package/lib/version.d.ts +2 -2
  193. package/lib/version.js +2 -2
  194. package/package.json +4 -3
  195. package/src/bin/cli.ts +91 -332
  196. package/src/lib/args/coerce.ts +164 -0
  197. package/src/lib/{util/cli-args.ts → args/parse.ts} +30 -25
  198. package/src/lib/args/validate.ts +73 -0
  199. package/src/lib/auth/operations.ts +169 -0
  200. package/src/lib/{validate-token.ts → auth/validate-token.ts} +2 -2
  201. package/src/lib/blueprint/cache.ts +97 -0
  202. package/src/lib/{get-response-key.ts → blueprint/endpoint.ts} +17 -3
  203. package/src/lib/blueprint/index.ts +27 -0
  204. package/src/lib/{blueprint.ts → blueprint/source-npm.ts} +27 -99
  205. package/src/lib/blueprint/source-remote.ts +17 -0
  206. package/src/lib/commands/api-command.ts +109 -0
  207. package/src/lib/commands/local/completion.ts +51 -0
  208. package/src/lib/commands/local/config-reveal-location.ts +16 -0
  209. package/src/lib/commands/local/config-set-fake-server.ts +21 -0
  210. package/src/lib/commands/local/config-use-remote-api-defs.ts +23 -0
  211. package/src/lib/commands/local/health.ts +22 -0
  212. package/src/lib/commands/local/login.ts +42 -0
  213. package/src/lib/commands/local/logout.ts +18 -0
  214. package/src/lib/commands/local/select-server.ts +30 -0
  215. package/src/lib/commands/local/select-workspace.ts +25 -0
  216. package/src/lib/commands/local/wizard.ts +31 -0
  217. package/src/lib/commands/registry.ts +127 -0
  218. package/src/lib/{command-spec.ts → commands/spec.ts} +30 -131
  219. package/src/lib/config/config-store.ts +39 -64
  220. package/src/lib/config/index.ts +8 -1
  221. package/src/lib/config/memory-config-store.ts +62 -0
  222. package/src/lib/config/migrate.ts +1 -1
  223. package/src/lib/config/values.ts +72 -0
  224. package/src/lib/context.ts +84 -0
  225. package/src/lib/env.ts +9 -2
  226. package/src/lib/errors.ts +67 -0
  227. package/src/lib/http/api.ts +61 -0
  228. package/src/lib/{get-seam.ts → http/client.ts} +19 -18
  229. package/src/lib/http/follow-ups.ts +42 -0
  230. package/src/lib/http/memory-seam-api.ts +57 -0
  231. package/src/lib/http/request.ts +69 -0
  232. package/src/lib/{interact-for-access-code.ts → interactions/access-code.ts} +4 -3
  233. package/src/lib/{interact-for-acs-entrance.ts → interactions/acs-entrance.ts} +3 -2
  234. package/src/lib/{interact-for-acs-system.ts → interactions/acs-system.ts} +3 -2
  235. package/src/lib/{interact-for-acs-user.ts → interactions/acs-user.ts} +4 -3
  236. package/src/lib/{interact-for-action-attempt-poll.ts → interactions/action-attempt-poll.ts} +4 -4
  237. package/src/lib/{interact-for-array.ts → interactions/array.ts} +3 -3
  238. package/src/lib/{interact-for-blueprint-object.ts → interactions/blueprint-object.ts} +57 -24
  239. package/src/lib/{interact-for-command-params.ts → interactions/command-params.ts} +6 -4
  240. package/src/lib/{interact-for-command-selection.ts → interactions/command-selection.ts} +11 -23
  241. package/src/lib/{interact-for-connected-account.ts → interactions/connected-account.ts} +3 -2
  242. package/src/lib/{interact-for-custom-metadata.ts → interactions/custom-metadata.ts} +3 -7
  243. package/src/lib/{interact-for-device.ts → interactions/device.ts} +3 -2
  244. package/src/lib/interactions/index.ts +19 -0
  245. package/src/lib/{interact-for-login.ts → interactions/login.ts} +16 -13
  246. package/src/lib/{interact-for-resource.ts → interactions/resource.ts} +2 -2
  247. package/src/lib/{interact-for-server-selection.ts → interactions/server-selection.ts} +12 -17
  248. package/src/lib/{interact-for-timestamp.ts → interactions/timestamp.ts} +1 -1
  249. package/src/lib/{interact-for-use-remote-api-defs.ts → interactions/use-remote-api-defs.ts} +4 -5
  250. package/src/lib/{interact-for-user-identity.ts → interactions/user-identity.ts} +3 -2
  251. package/src/lib/{interact-for-workspace-id.ts → interactions/workspace-id.ts} +10 -17
  252. package/src/lib/memory-prompt.ts +89 -0
  253. package/src/lib/output/get-output.ts +1 -1
  254. package/src/lib/output/{create-memory-output.ts → memory-output.ts} +1 -1
  255. package/src/lib/output/{create-output.ts → output.ts} +47 -32
  256. package/src/lib/output/resolve-output-format.ts +1 -1
  257. package/src/lib/{util → output}/with-loading.ts +1 -1
  258. package/src/lib/prompt.ts +306 -0
  259. package/src/lib/{completion → render/completion}/describe.ts +1 -2
  260. package/src/lib/{completion → render/completion}/index.ts +3 -4
  261. package/src/lib/{completion → render/completion}/render-bash.ts +1 -1
  262. package/src/lib/{completion → render/completion}/render-fish.ts +2 -1
  263. package/src/lib/{completion → render/completion}/render-zsh.ts +2 -1
  264. package/src/lib/{render-help.ts → render/help.ts} +1 -1
  265. package/src/lib/render/text.ts +17 -0
  266. package/src/lib/version.ts +2 -2
  267. package/lib/blueprint.d.ts +0 -7
  268. package/lib/blueprint.js.map +0 -1
  269. package/lib/command-spec.js.map +0 -1
  270. package/lib/completion/describe.js.map +0 -1
  271. package/lib/completion/index.js.map +0 -1
  272. package/lib/completion/render-bash.js.map +0 -1
  273. package/lib/completion/render-fish.js.map +0 -1
  274. package/lib/completion/render-zsh.js.map +0 -1
  275. package/lib/get-api-blueprint.d.ts +0 -6
  276. package/lib/get-api-blueprint.js +0 -18
  277. package/lib/get-api-blueprint.js.map +0 -1
  278. package/lib/get-command-blueprint-def.d.ts +0 -2
  279. package/lib/get-command-blueprint-def.js +0 -11
  280. package/lib/get-command-blueprint-def.js.map +0 -1
  281. package/lib/get-credentials.d.ts +0 -15
  282. package/lib/get-credentials.js +0 -35
  283. package/lib/get-credentials.js.map +0 -1
  284. package/lib/get-current-workspace-id.d.ts +0 -1
  285. package/lib/get-current-workspace-id.js +0 -9
  286. package/lib/get-current-workspace-id.js.map +0 -1
  287. package/lib/get-response-key.d.ts +0 -9
  288. package/lib/get-response-key.js.map +0 -1
  289. package/lib/get-seam.d.ts +0 -3
  290. package/lib/get-seam.js.map +0 -1
  291. package/lib/get-server.d.ts +0 -6
  292. package/lib/get-server.js +0 -17
  293. package/lib/get-server.js.map +0 -1
  294. package/lib/interact-for-access-code.js.map +0 -1
  295. package/lib/interact-for-acs-entrance.js.map +0 -1
  296. package/lib/interact-for-acs-system.js.map +0 -1
  297. package/lib/interact-for-acs-user.js.map +0 -1
  298. package/lib/interact-for-action-attempt-poll.js.map +0 -1
  299. package/lib/interact-for-array.js.map +0 -1
  300. package/lib/interact-for-blueprint-object.js.map +0 -1
  301. package/lib/interact-for-command-params.js.map +0 -1
  302. package/lib/interact-for-command-selection.d.ts +0 -2
  303. package/lib/interact-for-command-selection.js.map +0 -1
  304. package/lib/interact-for-connected-account.js.map +0 -1
  305. package/lib/interact-for-custom-metadata.js.map +0 -1
  306. package/lib/interact-for-device.js.map +0 -1
  307. package/lib/interact-for-login.js.map +0 -1
  308. package/lib/interact-for-resource.js.map +0 -1
  309. package/lib/interact-for-server-selection.js.map +0 -1
  310. package/lib/interact-for-timestamp.js.map +0 -1
  311. package/lib/interact-for-use-remote-api-defs.js.map +0 -1
  312. package/lib/interact-for-user-identity.js.map +0 -1
  313. package/lib/interact-for-workspace-id.js.map +0 -1
  314. package/lib/output/create-memory-output.js.map +0 -1
  315. package/lib/output/create-output.js +0 -34
  316. package/lib/output/create-output.js.map +0 -1
  317. package/lib/render-help.js.map +0 -1
  318. package/lib/types.d.ts +0 -6
  319. package/lib/types.js +0 -2
  320. package/lib/types.js.map +0 -1
  321. package/lib/util/cli-args.js.map +0 -1
  322. package/lib/util/ellipsis.d.ts +0 -1
  323. package/lib/util/ellipsis.js +0 -6
  324. package/lib/util/ellipsis.js.map +0 -1
  325. package/lib/util/prompt.d.ts +0 -80
  326. package/lib/util/prompt.js.map +0 -1
  327. package/lib/util/read-stdin-json.js.map +0 -1
  328. package/lib/util/request-seam-api.d.ts +0 -7
  329. package/lib/util/request-seam-api.js +0 -26
  330. package/lib/util/request-seam-api.js.map +0 -1
  331. package/lib/util/with-loading.js.map +0 -1
  332. package/lib/validate-token.js.map +0 -1
  333. package/src/lib/get-api-blueprint.ts +0 -31
  334. package/src/lib/get-command-blueprint-def.ts +0 -15
  335. package/src/lib/get-credentials.ts +0 -38
  336. package/src/lib/get-current-workspace-id.ts +0 -9
  337. package/src/lib/get-server.ts +0 -20
  338. package/src/lib/types.ts +0 -7
  339. package/src/lib/util/ellipsis.ts +0 -4
  340. package/src/lib/util/prompt.ts +0 -229
  341. package/src/lib/util/request-seam-api.ts +0 -47
  342. /package/lib/{validate-token.d.ts → auth/validate-token.d.ts} +0 -0
  343. /package/lib/{interact-for-access-code.d.ts → interactions/access-code.d.ts} +0 -0
  344. /package/lib/{interact-for-acs-entrance.d.ts → interactions/acs-entrance.d.ts} +0 -0
  345. /package/lib/{interact-for-acs-system.d.ts → interactions/acs-system.d.ts} +0 -0
  346. /package/lib/{interact-for-acs-user.d.ts → interactions/acs-user.d.ts} +0 -0
  347. /package/lib/{interact-for-action-attempt-poll.d.ts → interactions/action-attempt-poll.d.ts} +0 -0
  348. /package/lib/{interact-for-array.d.ts → interactions/array.d.ts} +0 -0
  349. /package/lib/{interact-for-connected-account.d.ts → interactions/connected-account.d.ts} +0 -0
  350. /package/lib/{interact-for-custom-metadata.d.ts → interactions/custom-metadata.d.ts} +0 -0
  351. /package/lib/{interact-for-device.d.ts → interactions/device.d.ts} +0 -0
  352. /package/lib/{interact-for-login.d.ts → interactions/login.d.ts} +0 -0
  353. /package/lib/{interact-for-resource.d.ts → interactions/resource.d.ts} +0 -0
  354. /package/lib/{interact-for-server-selection.d.ts → interactions/server-selection.d.ts} +0 -0
  355. /package/lib/{interact-for-timestamp.d.ts → interactions/timestamp.d.ts} +0 -0
  356. /package/lib/{interact-for-use-remote-api-defs.d.ts → interactions/use-remote-api-defs.d.ts} +0 -0
  357. /package/lib/{interact-for-user-identity.d.ts → interactions/user-identity.d.ts} +0 -0
  358. /package/lib/{interact-for-workspace-id.d.ts → interactions/workspace-id.d.ts} +0 -0
  359. /package/lib/{util → output}/read-stdin-json.d.ts +0 -0
  360. /package/lib/{util → output}/read-stdin-json.js +0 -0
  361. /package/lib/{util → output}/with-loading.d.ts +0 -0
  362. /package/lib/{completion → render/completion}/describe.d.ts +0 -0
  363. /package/lib/{completion → render/completion}/render-fish.js +0 -0
  364. /package/src/lib/{util → output}/read-stdin-json.ts +0 -0
@@ -0,0 +1,54 @@
1
+ import type { ParsedArgs } from 'minimist';
2
+ import type { ApiBlueprint } from '../blueprint/index.js';
3
+ import type { CliContext } from '../context.js';
4
+ import { type CommandDefinition, type CommandSpec } from './spec.js';
5
+ /**
6
+ * One invocable command: what it looks like to help, completion, and the
7
+ * interactive picker, whether it needs a login, and how to run it. Declaring
8
+ * the metadata and the executor together is what keeps them from drifting.
9
+ */
10
+ export interface Command {
11
+ definition: CommandDefinition;
12
+ /** Whether the command needs a token before it can do anything. */
13
+ requiresAuth: boolean;
14
+ /** Kept out of the spec, so out of help, completion, and the picker. */
15
+ hidden?: boolean;
16
+ execute: (invocation: Invocation, ctx: CliContext) => Promise<CommandResult>;
17
+ }
18
+ /** Everything a single run of a command was given. */
19
+ export interface Invocation {
20
+ path: string[];
21
+ /** Params given as arguments, held to what the command accepts. */
22
+ argParams: Record<string, unknown>;
23
+ /** Params piped in as JSON, passed through as given. */
24
+ stdinParams: Record<string, unknown>;
25
+ /** The full parsed arguments, for commands that read their own flags. */
26
+ args: ParsedArgs;
27
+ /** The raw argv, for commands that re-read arguments with their own types. */
28
+ argv: string[];
29
+ }
30
+ export type CommandResult = {
31
+ kind: 'done';
32
+ }
33
+ /** Navigate back to selecting a command under `toPath`. */
34
+ | {
35
+ kind: 'back';
36
+ toPath: string[];
37
+ };
38
+ export interface CommandRegistry {
39
+ /** The spec help, completion, and the interactive picker render. */
40
+ spec: CommandSpec;
41
+ find: (path: string[]) => Command | undefined;
42
+ }
43
+ export declare const localCommands: Command[];
44
+ /** Definitions shown in help, completion, and the picker. */
45
+ export declare const localCommandDefinitions: CommandDefinition[];
46
+ /**
47
+ * The local command going by a path, or `undefined` when the path is an
48
+ * endpoint or no command at all. Needs no blueprint, so the entry may check
49
+ * commands before any definitions are loaded.
50
+ */
51
+ export declare const findLocalCommand: (path: string[]) => Command | undefined;
52
+ /** Parameter names a command accepts as arguments. */
53
+ export declare const acceptedParamsOf: (definition: CommandDefinition) => Set<string>;
54
+ export declare const buildRegistry: (blueprint: ApiBlueprint) => CommandRegistry;
@@ -0,0 +1,64 @@
1
+ import { toParameterName } from '../args/parse.js';
2
+ import { executeApiCommand } from './api-command.js';
3
+ import { createCompletionCommands } from './local/completion.js';
4
+ import { configRevealLocationCommand } from './local/config-reveal-location.js';
5
+ import { configSetFakeServerCommand } from './local/config-set-fake-server.js';
6
+ import { configUseRemoteApiDefsCommand } from './local/config-use-remote-api-defs.js';
7
+ import { healthCommand } from './local/health.js';
8
+ import { loginCommand } from './local/login.js';
9
+ import { logoutCommand } from './local/logout.js';
10
+ import { selectServerCommand } from './local/select-server.js';
11
+ import { selectWorkspaceCommand } from './local/select-workspace.js';
12
+ import { wizardCommand } from './local/wizard.js';
13
+ import { getCommandSpec, isSamePath, } from './spec.js';
14
+ /**
15
+ * Commands handled by the CLI itself, which have no endpoint in the
16
+ * blueprint. The single source of truth: the spec, the picker, and the
17
+ * dispatcher all consume this list.
18
+ */
19
+ const completionCommands = createCompletionCommands((blueprint) => buildRegistry(blueprint).spec);
20
+ export const localCommands = [
21
+ ...completionCommands,
22
+ configRevealLocationCommand,
23
+ configSetFakeServerCommand,
24
+ configUseRemoteApiDefsCommand,
25
+ healthCommand,
26
+ loginCommand,
27
+ logoutCommand,
28
+ selectServerCommand,
29
+ selectWorkspaceCommand,
30
+ wizardCommand,
31
+ ];
32
+ /** Definitions shown in help, completion, and the picker. */
33
+ export const localCommandDefinitions = localCommands
34
+ .filter((command) => command.hidden !== true)
35
+ .map((command) => command.definition);
36
+ /**
37
+ * The local command going by a path, or `undefined` when the path is an
38
+ * endpoint or no command at all. Needs no blueprint, so the entry may check
39
+ * commands before any definitions are loaded.
40
+ */
41
+ export const findLocalCommand = (path) => localCommands.find((command) => isSamePath(command.definition.path, path));
42
+ /** Parameter names a command accepts as arguments. */
43
+ export const acceptedParamsOf = (definition) => new Set(definition.flags.flatMap(({ long }) => long == null ? [] : [toParameterName(long)]));
44
+ export const buildRegistry = (blueprint) => {
45
+ const spec = getCommandSpec(blueprint, localCommandDefinitions);
46
+ const commands = new Map();
47
+ for (const definition of spec.commands) {
48
+ commands.set(definition.path.join(' '), {
49
+ definition,
50
+ requiresAuth: true,
51
+ execute: executeApiCommand,
52
+ });
53
+ }
54
+ // Local commands win over a same-named endpoint, as the spec's dedupe does,
55
+ // and hidden ones are findable without being in the spec.
56
+ for (const command of localCommands) {
57
+ commands.set(command.definition.path.join(' '), command);
58
+ }
59
+ return {
60
+ spec,
61
+ find: (path) => commands.get(path.join(' ')),
62
+ };
63
+ };
64
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/lib/commands/registry.ts"],"names":[],"mappings":"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"}
@@ -45,17 +45,13 @@ export interface CommandSpec {
45
45
  }
46
46
  export declare const globalFlags: CommandFlag[];
47
47
  export declare const flagTokens: (flag: CommandFlag) => string[];
48
- export declare const getCommandSpec: (blueprint: Blueprint) => CommandSpec;
49
- export declare const findCommand: (spec: CommandSpec, path: string[]) => CommandDefinition | undefined;
50
- export declare const findGroup: (spec: CommandSpec, path: string[]) => CommandGroup | undefined;
51
48
  /**
52
- * The definition of a command the CLI handles itself, or `undefined` when the
53
- * path is an endpoint or no command at all.
54
- *
55
- * Unlike {@link findCommand} this needs no blueprint, since these commands are
56
- * declared by the CLI rather than derived from the API definitions.
49
+ * Derive the command spec from the API definitions, merged with the commands
50
+ * the CLI declares itself (see `commands/registry.ts`, the single source of
51
+ * those declarations).
57
52
  */
58
- export declare const findLocalCommand: (path: string[]) => CommandDefinition | undefined;
59
- /** Reduce documentation markdown to a single line of prose. */
60
- export declare const toPlainText: (markdown: string) => string;
61
- export declare const firstSentence: (text: string) => string;
53
+ export declare const getCommandSpec: (blueprint: Blueprint, localCommands?: CommandDefinition[]) => CommandSpec;
54
+ export declare const findCommand: (spec: CommandSpec, path: string[]) => CommandDefinition | undefined;
55
+ export declare const findGroup: (spec: CommandSpec, path: string[]) => CommandGroup | undefined;
56
+ export declare const isSamePath: (a: string[], b: string[]) => boolean;
57
+ export declare const stringFlag: (long: string, description: string) => CommandFlag;
@@ -1,3 +1,4 @@
1
+ import { firstSentence, toPlainText } from '../render/text.js';
1
2
  export const globalFlags = [
2
3
  {
3
4
  long: 'help',
@@ -64,7 +65,12 @@ export const flagTokens = (flag) => {
64
65
  tokens.push(`-${flag.short}`);
65
66
  return tokens;
66
67
  };
67
- export const getCommandSpec = (blueprint) => {
68
+ /**
69
+ * Derive the command spec from the API definitions, merged with the commands
70
+ * the CLI declares itself (see `commands/registry.ts`, the single source of
71
+ * those declarations).
72
+ */
73
+ export const getCommandSpec = (blueprint, localCommands = []) => {
68
74
  const commands = sortByPath(dedupeByPath([
69
75
  ...blueprint.routes
70
76
  .flatMap((route) => route.endpoints)
@@ -79,16 +85,8 @@ export const getCommandSpec = (blueprint) => {
79
85
  };
80
86
  export const findCommand = (spec, path) => spec.commands.find((command) => isSamePath(command.path, path));
81
87
  export const findGroup = (spec, path) => spec.groups.find((group) => isSamePath(group.path, path));
82
- /**
83
- * The definition of a command the CLI handles itself, or `undefined` when the
84
- * path is an endpoint or no command at all.
85
- *
86
- * Unlike {@link findCommand} this needs no blueprint, since these commands are
87
- * declared by the CLI rather than derived from the API definitions.
88
- */
89
- export const findLocalCommand = (path) => localCommands.find((command) => isSamePath(command.path, path));
90
- const isSamePath = (a, b) => a.length === b.length && a.every((word, index) => word === b[index]);
91
- const stringFlag = (long, description) => ({
88
+ export const isSamePath = (a, b) => a.length === b.length && a.every((word, index) => word === b[index]);
89
+ export const stringFlag = (long, description) => ({
92
90
  long,
93
91
  short: null,
94
92
  description,
@@ -96,95 +94,6 @@ const stringFlag = (long, description) => ({
96
94
  takesValue: true,
97
95
  isRequired: false,
98
96
  });
99
- /**
100
- * Commands handled by the CLI itself, which have no endpoint in the blueprint.
101
- *
102
- * Keep in sync with the command handling in `src/bin/cli.ts` and the extra
103
- * commands offered by `interactForCommandSelection`.
104
- */
105
- const localCommands = [
106
- {
107
- path: ['completion', 'bash'],
108
- kind: 'cli',
109
- title: 'Print the bash completion script.',
110
- description: '',
111
- flags: [],
112
- },
113
- {
114
- path: ['completion', 'fish'],
115
- kind: 'cli',
116
- title: 'Print the fish completion script.',
117
- description: '',
118
- flags: [],
119
- },
120
- {
121
- path: ['completion', 'zsh'],
122
- kind: 'cli',
123
- title: 'Print the zsh completion script.',
124
- description: '',
125
- flags: [],
126
- },
127
- {
128
- path: ['config', 'reveal-location'],
129
- kind: 'cli',
130
- title: 'Print the path to the CLI configuration file.',
131
- description: '',
132
- flags: [],
133
- },
134
- {
135
- path: ['config', 'use-remote-api-defs'],
136
- kind: 'cli',
137
- title: 'Choose whether to use the API definitions served by Seam.',
138
- description: '',
139
- flags: [],
140
- },
141
- {
142
- path: ['health', 'get-health'],
143
- kind: 'api',
144
- title: 'Report the health of the Seam API.',
145
- description: '',
146
- flags: [],
147
- },
148
- {
149
- path: ['login'],
150
- kind: 'cli',
151
- title: 'Log in to Seam.',
152
- description: 'Prompts for a personal access token unless one is passed with --token.',
153
- flags: [
154
- stringFlag('server', 'Seam API server to log in to.'),
155
- stringFlag('token', 'Personal access token to log in with.'),
156
- stringFlag('workspace-id', 'Workspace to select after logging in.'),
157
- ],
158
- },
159
- {
160
- path: ['logout'],
161
- kind: 'cli',
162
- title: 'Log out of Seam.',
163
- description: '',
164
- flags: [],
165
- },
166
- {
167
- path: ['select', 'server'],
168
- kind: 'cli',
169
- title: 'Select the Seam API server.',
170
- description: '',
171
- flags: [stringFlag('server', 'Seam API server to select.')],
172
- },
173
- {
174
- path: ['select', 'workspace'],
175
- kind: 'cli',
176
- title: 'Select the current workspace.',
177
- description: '',
178
- flags: [],
179
- },
180
- {
181
- path: ['wizard'],
182
- kind: 'cli',
183
- title: 'Set up Seam in the current project.',
184
- description: 'Takes a project from zero to a working Seam integration. Run seam wizard --help for its own options.',
185
- flags: [],
186
- },
187
- ];
188
97
  const toCommandDefinition = (endpoint) => {
189
98
  const description = toPlainText(endpoint.description);
190
99
  return {
@@ -209,17 +118,21 @@ const toCommandFlag = (parameter) => ({
209
118
  isRequired: parameter.isRequired,
210
119
  });
211
120
  const toFlagValues = (parameter) => {
121
+ let values = [];
212
122
  if (parameter.format === 'enum') {
213
- return parameter.values.map(({ name }) => name).filter(isSafeToken);
123
+ values = parameter.values.map(({ name }) => name).filter(isSafeToken);
214
124
  }
215
- if (parameter.format === 'list' && parameter.itemFormat === 'enum') {
216
- return parameter.itemEnumValues.map(({ name }) => name).filter(isSafeToken);
125
+ else if (parameter.format === 'list' && parameter.itemFormat === 'enum') {
126
+ values = parameter.itemEnumValues
127
+ .map(({ name }) => name)
128
+ .filter(isSafeToken);
217
129
  }
218
- // Nothing marks parameters as boolean-only flags, so minimist reads the next
219
- // argument as the value.
220
- if (parameter.format === 'boolean')
221
- return ['true', 'false'];
222
- return [];
130
+ else if (parameter.format === 'boolean') {
131
+ // Nothing marks parameters as boolean-only flags, so minimist reads the
132
+ // next argument as the value.
133
+ values = ['true', 'false'];
134
+ }
135
+ return parameter.isNullable ? [...values, 'null'] : values;
223
136
  };
224
137
  /**
225
138
  * Whether a word is safe to write into a shell script. Command, flag, and
@@ -241,7 +154,11 @@ const toCommandGroups = (commands) => {
241
154
  // `seam devices` alongside `seam devices list`. Prefer the command
242
155
  // title, since it describes what running the name does.
243
156
  if (depth === command.path.length - 1) {
244
- entries.set(name, { isCommand: true, kind, description: command.title });
157
+ entries.set(name, {
158
+ isCommand: true,
159
+ kind,
160
+ description: command.title,
161
+ });
245
162
  continue;
246
163
  }
247
164
  const entry = entries.get(name);
@@ -285,14 +202,4 @@ const sortByPath = (commands) => [...commands].sort((a, b) => compare(a.path.joi
285
202
  const compare = (a, b) => (a ?? '') < (b ?? '') ? -1 : (a ?? '') > (b ?? '') ? 1 : 0;
286
203
  const toCommandPath = (path) => path.replace(/^\//, '').split('/').map(toFlagName);
287
204
  const toFlagName = (name) => name.replace(/_/g, '-');
288
- /** Reduce documentation markdown to a single line of prose. */
289
- export const toPlainText = (markdown) => markdown
290
- .replace(/\[([^\]]*)\]\([^)]*\)/g, '$1')
291
- .replace(/[`*]/g, '')
292
- .replace(/\s+/g, ' ')
293
- .trim();
294
- export const firstSentence = (text) => {
295
- const [sentence] = text.split(/(?<=\.)\s/);
296
- return sentence ?? text;
297
- };
298
- //# sourceMappingURL=command-spec.js.map
205
+ //# sourceMappingURL=spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spec.js","sourceRoot":"","sources":["../../src/lib/commands/spec.ts"],"names":[],"mappings":"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"}
@@ -1,11 +1,27 @@
1
1
  import Configstore from 'configstore';
2
- export declare const getConfigStore: () => SeamConfigStore;
3
- export declare const mergeConfig: (baseConfig: Record<string, unknown>, overrideConfig: Record<string, unknown>) => Record<string, unknown>;
4
- export declare const splitConfig: (config: Record<string, unknown>) => {
5
- settings: Record<string, unknown>;
6
- state: Record<string, unknown>;
7
- };
8
- declare class SeamConfigStore {
2
+ /**
3
+ * What a config store can do, regardless of where it keeps the values.
4
+ *
5
+ * The CLI reads and writes through this interface so a test may hand code an
6
+ * in-memory store (see `memory-config-store.ts`) instead of the real
7
+ * file-backed one.
8
+ */
9
+ export interface ConfigStore {
10
+ readonly path: string;
11
+ all: Record<string, unknown>;
12
+ readonly size: number;
13
+ get: (key: string) => unknown;
14
+ set: (key: string | Record<string, unknown>, value?: unknown) => void;
15
+ has: (key: string) => boolean;
16
+ delete: (key: string) => void;
17
+ clear: () => void;
18
+ }
19
+ export declare const getConfigStore: () => ConfigStore;
20
+ /** Replace the store, e.g., with an in-memory one for a test. */
21
+ export declare const setConfigStore: (store: ConfigStore) => void;
22
+ /** Drop the current store so the next read builds the real one. */
23
+ export declare const resetConfigStore: () => void;
24
+ export declare class PersistentConfigStore implements ConfigStore {
9
25
  private readonly settingsStore;
10
26
  private readonly stateStore;
11
27
  readonly path: string;
@@ -20,4 +36,3 @@ declare class SeamConfigStore {
20
36
  clear(): void;
21
37
  private getStore;
22
38
  }
23
- export {};
@@ -2,12 +2,24 @@ import { join } from 'node:path';
2
2
  import Configstore from 'configstore';
3
3
  import envPaths from 'env-paths';
4
4
  import { migrateConfigStore } from './migrate.js';
5
+ import { isStateKey, mergeConfig, splitConfig } from './values.js';
5
6
  const configFileName = 'cli.json';
6
7
  const legacyConfigStoreId = 'seam-cli';
7
- const currentWorkspaceIdKey = 'current_workspace_id';
8
- const patKey = 'pat';
9
8
  const paths = envPaths('seam', { suffix: '' });
9
+ let configStore = null;
10
10
  export const getConfigStore = () => {
11
+ configStore ??= createConfigStore();
12
+ return configStore;
13
+ };
14
+ /** Replace the store, e.g., with an in-memory one for a test. */
15
+ export const setConfigStore = (store) => {
16
+ configStore = store;
17
+ };
18
+ /** Drop the current store so the next read builds the real one. */
19
+ export const resetConfigStore = () => {
20
+ configStore = null;
21
+ };
22
+ const createConfigStore = () => {
11
23
  const settingsStore = new Configstore(legacyConfigStoreId, undefined, {
12
24
  configPath: getConfigPath(),
13
25
  });
@@ -15,42 +27,9 @@ export const getConfigStore = () => {
15
27
  configPath: getStateConfigPath(),
16
28
  });
17
29
  migrateConfigStore(settingsStore, stateStore, new Configstore(legacyConfigStoreId));
18
- return new SeamConfigStore(settingsStore, stateStore);
19
- };
20
- export const mergeConfig = (baseConfig, overrideConfig) => {
21
- const mergedConfig = { ...baseConfig };
22
- for (const [key, value] of Object.entries(overrideConfig)) {
23
- const baseValue = mergedConfig[key];
24
- mergedConfig[key] =
25
- isRecord(baseValue) && isRecord(value)
26
- ? mergeConfig(baseValue, value)
27
- : value;
28
- }
29
- return mergedConfig;
30
- };
31
- export const splitConfig = (config) => {
32
- const settings = {};
33
- const state = {};
34
- for (const [key, value] of Object.entries(config)) {
35
- if (isStateKey(key)) {
36
- state[key] = value;
37
- continue;
38
- }
39
- if (isRecord(value)) {
40
- const splitValue = splitConfig(value);
41
- if (Object.keys(splitValue.settings).length > 0) {
42
- settings[key] = splitValue.settings;
43
- }
44
- if (Object.keys(splitValue.state).length > 0) {
45
- state[key] = splitValue.state;
46
- }
47
- continue;
48
- }
49
- settings[key] = value;
50
- }
51
- return { settings, state };
30
+ return new PersistentConfigStore(settingsStore, stateStore);
52
31
  };
53
- class SeamConfigStore {
32
+ export class PersistentConfigStore {
54
33
  settingsStore;
55
34
  stateStore;
56
35
  path;
@@ -102,11 +81,6 @@ const getConfigPath = () => {
102
81
  const getStateConfigPath = () => {
103
82
  return join(paths.log, configFileName);
104
83
  };
105
- const isStateKey = (key) => {
106
- return (key === currentWorkspaceIdKey ||
107
- key === patKey ||
108
- key.endsWith(`.${patKey}`));
109
- };
110
84
  const isRecord = (value) => {
111
85
  return value != null && typeof value === 'object' && !Array.isArray(value);
112
86
  };
@@ -1 +1 @@
1
- {"version":3,"file":"config-store.js","sourceRoot":"","sources":["../../src/lib/config/config-store.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config-store.js","sourceRoot":"","sources":["../../src/lib/config/config-store.ts"],"names":[],"mappings":"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"}
@@ -1 +1,2 @@
1
- export { getConfigStore } from './config-store.js';
1
+ export { type ConfigStore, getConfigStore, type PersistentConfigStore, resetConfigStore, setConfigStore, } from './config-store.js';
2
+ export { createMemoryConfigStore } from './memory-config-store.js';
@@ -1,2 +1,3 @@
1
- export { getConfigStore } from './config-store.js';
1
+ export { getConfigStore, resetConfigStore, setConfigStore, } from './config-store.js';
2
+ export { createMemoryConfigStore } from './memory-config-store.js';
2
3
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/lib/config/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/lib/config/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,cAAc,EAEd,gBAAgB,EAChB,cAAc,GACf,MAAM,mBAAmB,CAAA;AAC1B,OAAO,EAAE,uBAAuB,EAAE,MAAM,0BAA0B,CAAA"}
@@ -0,0 +1,21 @@
1
+ import type { ConfigStore } from './config-store.js';
2
+ /**
3
+ * A real {@link ConfigStore} held in memory, for tests.
4
+ *
5
+ * Keys are flat: the file-backed store nests dotted keys, but nothing reads
6
+ * a value back by a different spelling than it was written with.
7
+ */
8
+ export declare class MemoryConfigStore implements ConfigStore {
9
+ readonly path = "/memory/cli.json";
10
+ private readonly values;
11
+ constructor(initialValues?: Record<string, unknown>);
12
+ get all(): Record<string, unknown>;
13
+ set all(newValues: Record<string, unknown>);
14
+ get size(): number;
15
+ get(key: string): unknown;
16
+ set(key: string | Record<string, unknown>, value?: unknown): void;
17
+ has(key: string): boolean;
18
+ delete(key: string): void;
19
+ clear(): void;
20
+ }
21
+ export declare const createMemoryConfigStore: (initialValues?: Record<string, unknown>) => ConfigStore;
@@ -0,0 +1,48 @@
1
+ /**
2
+ * A real {@link ConfigStore} held in memory, for tests.
3
+ *
4
+ * Keys are flat: the file-backed store nests dotted keys, but nothing reads
5
+ * a value back by a different spelling than it was written with.
6
+ */
7
+ export class MemoryConfigStore {
8
+ path = '/memory/cli.json';
9
+ values;
10
+ constructor(initialValues = {}) {
11
+ this.values = new Map(Object.entries(initialValues));
12
+ }
13
+ get all() {
14
+ return Object.fromEntries(this.values);
15
+ }
16
+ set all(newValues) {
17
+ this.values.clear();
18
+ for (const [key, value] of Object.entries(newValues)) {
19
+ this.values.set(key, value);
20
+ }
21
+ }
22
+ get size() {
23
+ return this.values.size;
24
+ }
25
+ get(key) {
26
+ return this.values.get(key);
27
+ }
28
+ set(key, value) {
29
+ if (typeof key === 'string') {
30
+ this.values.set(key, value);
31
+ return;
32
+ }
33
+ for (const [configKey, configValue] of Object.entries(key)) {
34
+ this.values.set(configKey, configValue);
35
+ }
36
+ }
37
+ has(key) {
38
+ return this.values.has(key);
39
+ }
40
+ delete(key) {
41
+ this.values.delete(key);
42
+ }
43
+ clear() {
44
+ this.values.clear();
45
+ }
46
+ }
47
+ export const createMemoryConfigStore = (initialValues = {}) => new MemoryConfigStore(initialValues);
48
+ //# sourceMappingURL=memory-config-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-config-store.js","sourceRoot":"","sources":["../../src/lib/config/memory-config-store.ts"],"names":[],"mappings":"AAEA;;;;;GAKG;AACH,MAAM,OAAO,iBAAiB;IACnB,IAAI,GAAG,kBAAkB,CAAA;IAEjB,MAAM,CAAsB;IAE7C,YAAY,gBAAyC,EAAE;QACrD,IAAI,CAAC,MAAM,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,CAAA;IACtD,CAAC;IAED,IAAI,GAAG;QACL,OAAO,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;IACxC,CAAC;IAED,IAAI,GAAG,CAAC,SAAkC;QACxC,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAA;QACnB,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;YACrD,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAA;QAC7B,CAAC;IACH,CAAC;IAED,IAAI,IAAI;QACN,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,CAAA;IACzB,CAAC;IAED,GAAG,CAAC,GAAW;QACb,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;IAC7B,CAAC;IAED,GAAG,CAAC,GAAqC,EAAE,KAAe;QACxD,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;YAC5B,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAA;YAC3B,OAAM;QACR,CAAC;QACD,KAAK,MAAM,CAAC,SAAS,EAAE,WAAW,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;YAC3D,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,EAAE,WAAW,CAAC,CAAA;QACzC,CAAC;IACH,CAAC;IAED,GAAG,CAAC,GAAW;QACb,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;IAC7B,CAAC;IAED,MAAM,CAAC,GAAW;QAChB,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;IACzB,CAAC;IAED,KAAK;QACH,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAA;IACrB,CAAC;CACF;AAED,MAAM,CAAC,MAAM,uBAAuB,GAAG,CACrC,gBAAyC,EAAE,EAC9B,EAAE,CAAC,IAAI,iBAAiB,CAAC,aAAa,CAAC,CAAA"}
@@ -1,5 +1,5 @@
1
1
  import { existsSync, rmSync } from 'node:fs';
2
- import { mergeConfig, splitConfig } from './config-store.js';
2
+ import { mergeConfig, splitConfig } from './values.js';
3
3
  export const migrateConfigStore = (settingsStore, stateStore, legacyStore) => {
4
4
  if (!existsSync(legacyStore.path))
5
5
  return;
@@ -1 +1 @@
1
- {"version":3,"file":"migrate.js","sourceRoot":"","sources":["../../src/lib/config/migrate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,SAAS,CAAA;AAI5C,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAE5D,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAChC,aAA0B,EAC1B,UAAuB,EACvB,WAAwB,EAClB,EAAE;IACR,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,IAAI,CAAC;QAAE,OAAM;IAEzC,mBAAmB,CAAC,aAAa,EAAE,UAAU,EAAE,WAAW,CAAC,GAAG,CAAC,CAAA;IAE/D,MAAM,CAAC,WAAW,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAA;AAC3C,CAAC,CAAA;AAED,MAAM,mBAAmB,GAAG,CAC1B,aAA0B,EAC1B,UAAuB,EACvB,YAAqC,EAC/B,EAAE;IACR,IAAI,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,MAAM,KAAK,CAAC;QAAE,OAAM;IAElD,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,WAAW,CAAC,YAAY,CAAC,CAAA;IAErD,cAAc,CAAC,aAAa,EAAE,WAAW,CAAC,QAAQ,EAAE,aAAa,CAAC,GAAG,CAAC,CAAC,CAAA;IACvE,cAAc,CAAC,UAAU,EAAE,WAAW,CAAC,KAAK,EAAE,UAAU,CAAC,GAAG,CAAC,CAAC,CAAA;AAChE,CAAC,CAAA;AAED,MAAM,cAAc,GAAG,CACrB,KAAkB,EAClB,UAAmC,EAC7B,EAAE;IACR,IAAI,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,EAAE,CAAC;QAC7D,KAAK,CAAC,GAAG,GAAG,UAAU,CAAA;IACxB,CAAC;AACH,CAAC,CAAA"}
1
+ {"version":3,"file":"migrate.js","sourceRoot":"","sources":["../../src/lib/config/migrate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,SAAS,CAAA;AAI5C,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAEtD,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAChC,aAA0B,EAC1B,UAAuB,EACvB,WAAwB,EAClB,EAAE;IACR,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,IAAI,CAAC;QAAE,OAAM;IAEzC,mBAAmB,CAAC,aAAa,EAAE,UAAU,EAAE,WAAW,CAAC,GAAG,CAAC,CAAA;IAE/D,MAAM,CAAC,WAAW,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAA;AAC3C,CAAC,CAAA;AAED,MAAM,mBAAmB,GAAG,CAC1B,aAA0B,EAC1B,UAAuB,EACvB,YAAqC,EAC/B,EAAE;IACR,IAAI,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,MAAM,KAAK,CAAC;QAAE,OAAM;IAElD,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,WAAW,CAAC,YAAY,CAAC,CAAA;IAErD,cAAc,CAAC,aAAa,EAAE,WAAW,CAAC,QAAQ,EAAE,aAAa,CAAC,GAAG,CAAC,CAAC,CAAA;IACvE,cAAc,CAAC,UAAU,EAAE,WAAW,CAAC,KAAK,EAAE,UAAU,CAAC,GAAG,CAAC,CAAC,CAAA;AAChE,CAAC,CAAA;AAED,MAAM,cAAc,GAAG,CACrB,KAAkB,EAClB,UAAmC,EAC7B,EAAE;IACR,IAAI,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,EAAE,CAAC;QAC7D,KAAK,CAAC,GAAG,GAAG,UAAU,CAAA;IACxB,CAAC;AACH,CAAC,CAAA"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Config values as whole trees: merging two trees into one view, and
3
+ * splitting one tree into the settings file and the state file by key.
4
+ * Pure transforms shared by the persistent store and the legacy migration.
5
+ */
6
+ /** Whether a key holds auth state rather than a setting. */
7
+ export declare const isStateKey: (key: string) => boolean;
8
+ export declare const mergeConfig: (baseConfig: Record<string, unknown>, overrideConfig: Record<string, unknown>) => Record<string, unknown>;
9
+ export declare const splitConfig: (config: Record<string, unknown>) => {
10
+ settings: Record<string, unknown>;
11
+ state: Record<string, unknown>;
12
+ };