@xano/sdk 1.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 (336) hide show
  1. package/CHANGELOG.md +788 -0
  2. package/LICENSE +21 -0
  3. package/README.md +541 -0
  4. package/dist/.build-fingerprint +1 -0
  5. package/dist/agent-file-refresh-ZEMK33AX.js +38 -0
  6. package/dist/answer-shape-K67TAAPY.js +33 -0
  7. package/dist/backend-dir-2U53CIAL.js +39 -0
  8. package/dist/backend-slot-7QXW2QYC.js +28 -0
  9. package/dist/bin.d.ts +1 -0
  10. package/dist/bin.js +255 -0
  11. package/dist/branch-NCRNWQBQ.js +61 -0
  12. package/dist/branch-commands-ACIRCEQJ.js +79 -0
  13. package/dist/bundle.d.ts +223 -0
  14. package/dist/bundle.js +153 -0
  15. package/dist/capture-WAXPD7DR.js +41 -0
  16. package/dist/chunk-27GWNP2I.js +23 -0
  17. package/dist/chunk-2CMJZDCL.js +177 -0
  18. package/dist/chunk-2EZ3ZJZZ.js +302 -0
  19. package/dist/chunk-2GNFDZA2.js +390 -0
  20. package/dist/chunk-2MNLRIOX.js +11 -0
  21. package/dist/chunk-2TFRR6JV.js +104 -0
  22. package/dist/chunk-2ZUEE4EK.js +408 -0
  23. package/dist/chunk-36JUQZVQ.js +22 -0
  24. package/dist/chunk-3DRXWLJ5.js +83 -0
  25. package/dist/chunk-3JDU4VRL.js +137 -0
  26. package/dist/chunk-3KZCLN4Z.js +241 -0
  27. package/dist/chunk-3LDULPRE.js +168 -0
  28. package/dist/chunk-3M4LFYNQ.js +111 -0
  29. package/dist/chunk-3XI5CTUE.js +22 -0
  30. package/dist/chunk-3YW23UFH.js +50 -0
  31. package/dist/chunk-45UIT5T2.js +862 -0
  32. package/dist/chunk-4BW2SG2N.js +46 -0
  33. package/dist/chunk-4KHEMC32.js +79 -0
  34. package/dist/chunk-4POWHT2K.js +321 -0
  35. package/dist/chunk-4Q2GN7NW.js +192 -0
  36. package/dist/chunk-5A2PLKZB.js +70 -0
  37. package/dist/chunk-5FBYXK5P.js +159 -0
  38. package/dist/chunk-5HVXPTU4.js +323 -0
  39. package/dist/chunk-5QU2P5CA.js +304 -0
  40. package/dist/chunk-5V5XU32D.js +191 -0
  41. package/dist/chunk-5ZSO4T2G.js +10 -0
  42. package/dist/chunk-622HUCZT.js +10 -0
  43. package/dist/chunk-65HWOMGV.js +177 -0
  44. package/dist/chunk-6ELFRN3P.js +365 -0
  45. package/dist/chunk-6HO3NCSJ.js +1055 -0
  46. package/dist/chunk-6IUMKYWI.js +457 -0
  47. package/dist/chunk-6KEB3C3U.js +65 -0
  48. package/dist/chunk-6MR5TI5V.js +987 -0
  49. package/dist/chunk-6NNTNXN7.js +157 -0
  50. package/dist/chunk-6PBR37LN.js +97 -0
  51. package/dist/chunk-6QXLMMT3.js +155 -0
  52. package/dist/chunk-6ZGJCBZS.js +224 -0
  53. package/dist/chunk-73IVBKMA.js +250 -0
  54. package/dist/chunk-7G3CTU7I.js +286 -0
  55. package/dist/chunk-A3UDOZB6.js +222 -0
  56. package/dist/chunk-A6E77GDW.js +85 -0
  57. package/dist/chunk-AHJWCYQO.js +660 -0
  58. package/dist/chunk-AKNCFVKZ.js +36 -0
  59. package/dist/chunk-AM4FKL4J.js +237 -0
  60. package/dist/chunk-AN6BL47T.js +26 -0
  61. package/dist/chunk-AOSYVMUS.js +147 -0
  62. package/dist/chunk-APWXY5SL.js +182 -0
  63. package/dist/chunk-AWEIIR2U.js +218 -0
  64. package/dist/chunk-AWQ7BQTQ.js +73 -0
  65. package/dist/chunk-BAUZOWGX.js +393 -0
  66. package/dist/chunk-BHACRS6R.js +940 -0
  67. package/dist/chunk-BWPNT55T.js +680 -0
  68. package/dist/chunk-C6RIMRU4.js +187 -0
  69. package/dist/chunk-CGVQZXYG.js +263 -0
  70. package/dist/chunk-CIMQZRRE.js +162 -0
  71. package/dist/chunk-CJHQKJU4.js +113 -0
  72. package/dist/chunk-CTMO46PK.js +1897 -0
  73. package/dist/chunk-D53J55C5.js +106 -0
  74. package/dist/chunk-D7VGG3WS.js +90 -0
  75. package/dist/chunk-DAD3ONIS.js +245 -0
  76. package/dist/chunk-DGWHAVRG.js +162 -0
  77. package/dist/chunk-DX4QR4B2.js +483 -0
  78. package/dist/chunk-EHP3WPEG.js +21 -0
  79. package/dist/chunk-ELP2HMXC.js +432 -0
  80. package/dist/chunk-ERVIASGL.js +21 -0
  81. package/dist/chunk-ET4Y4XCB.js +865 -0
  82. package/dist/chunk-ETO6LGLD.js +4750 -0
  83. package/dist/chunk-EUUUMY7J.js +24 -0
  84. package/dist/chunk-FQJ2TTHP.js +218 -0
  85. package/dist/chunk-FQOF7E2E.js +133 -0
  86. package/dist/chunk-FWD7AL6N.js +21 -0
  87. package/dist/chunk-FXFV3KU6.js +138 -0
  88. package/dist/chunk-FXRQOWTE.js +171 -0
  89. package/dist/chunk-G554NZNI.js +210 -0
  90. package/dist/chunk-GSGDWJB5.js +13 -0
  91. package/dist/chunk-H2V3N23D.js +66 -0
  92. package/dist/chunk-H5C7MBCR.js +159 -0
  93. package/dist/chunk-HHN734BU.js +371 -0
  94. package/dist/chunk-HRVBLCVJ.js +243 -0
  95. package/dist/chunk-HVRUQXGD.js +1264 -0
  96. package/dist/chunk-I4F5TCJH.js +130 -0
  97. package/dist/chunk-IDOTCMDV.js +57 -0
  98. package/dist/chunk-IGOLHKWF.js +427 -0
  99. package/dist/chunk-JGE7CAWB.js +148 -0
  100. package/dist/chunk-JTUKLCXS.js +92 -0
  101. package/dist/chunk-JZGVVJSI.js +66 -0
  102. package/dist/chunk-K4WX6UUU.js +923 -0
  103. package/dist/chunk-K5BBGTYZ.js +217 -0
  104. package/dist/chunk-K6RXBGUB.js +427 -0
  105. package/dist/chunk-KTSDSD36.js +165 -0
  106. package/dist/chunk-L5JYN3NM.js +1038 -0
  107. package/dist/chunk-LIEOKXKD.js +354 -0
  108. package/dist/chunk-LLNZGEFK.js +51 -0
  109. package/dist/chunk-LPECSJ2J.js +55 -0
  110. package/dist/chunk-LQCMKAJ7.js +413 -0
  111. package/dist/chunk-LRN4ZJCQ.js +1145 -0
  112. package/dist/chunk-MJ4ZVHKN.js +17 -0
  113. package/dist/chunk-MXHSQOC4.js +3061 -0
  114. package/dist/chunk-N5GKCWE5.js +367 -0
  115. package/dist/chunk-NA3PXMEF.js +10 -0
  116. package/dist/chunk-NAQDMEHV.js +76 -0
  117. package/dist/chunk-NWKXM5RD.js +109 -0
  118. package/dist/chunk-NZOWWHU5.js +196 -0
  119. package/dist/chunk-OHX6MIUZ.js +184 -0
  120. package/dist/chunk-OOXWYAA4.js +15 -0
  121. package/dist/chunk-OPHB5ORL.js +1990 -0
  122. package/dist/chunk-OXA6PSZT.js +1725 -0
  123. package/dist/chunk-P2HAGF6H.js +73 -0
  124. package/dist/chunk-PTHVMXZI.js +3036 -0
  125. package/dist/chunk-PZ5AY32C.js +10 -0
  126. package/dist/chunk-Q325JKYB.js +189 -0
  127. package/dist/chunk-Q7DGTQ5G.js +255 -0
  128. package/dist/chunk-QCNYHBL7.js +601 -0
  129. package/dist/chunk-QO6BVGS5.js +145 -0
  130. package/dist/chunk-QXTKSOFI.js +76 -0
  131. package/dist/chunk-ROY4YAEQ.js +66 -0
  132. package/dist/chunk-RTJRZFFY.js +447 -0
  133. package/dist/chunk-SAVJUS2X.js +128 -0
  134. package/dist/chunk-SFLHVCKX.js +173 -0
  135. package/dist/chunk-STSFNCY4.js +127 -0
  136. package/dist/chunk-SWBF2LTK.js +170 -0
  137. package/dist/chunk-T5KELPAR.js +109 -0
  138. package/dist/chunk-TFFGOFVZ.js +1481 -0
  139. package/dist/chunk-TLHIFK4M.js +256 -0
  140. package/dist/chunk-TLQE7ZN3.js +156 -0
  141. package/dist/chunk-TPHWJ7UG.js +1981 -0
  142. package/dist/chunk-TRJCALW3.js +291 -0
  143. package/dist/chunk-TTEIYD5P.js +133 -0
  144. package/dist/chunk-U64O2MXY.js +407 -0
  145. package/dist/chunk-UCQ2VUTG.js +630 -0
  146. package/dist/chunk-UTI5G6OJ.js +44 -0
  147. package/dist/chunk-UVHDMMIP.js +188 -0
  148. package/dist/chunk-UZ6QQWJT.js +120 -0
  149. package/dist/chunk-VAX3UZOY.js +686 -0
  150. package/dist/chunk-W3HBUKFO.js +57 -0
  151. package/dist/chunk-WKQLGKCL.js +2823 -0
  152. package/dist/chunk-WQFNASK4.js +560 -0
  153. package/dist/chunk-WRBKLYSJ.js +224 -0
  154. package/dist/chunk-WTPZRR4I.js +17 -0
  155. package/dist/chunk-WZDJ2LLX.js +2385 -0
  156. package/dist/chunk-X2NL4KUO.js +14 -0
  157. package/dist/chunk-X4DVXBFY.js +38 -0
  158. package/dist/chunk-X677DMZM.js +7050 -0
  159. package/dist/chunk-XBKMWY7F.js +612 -0
  160. package/dist/chunk-XNCP4KYO.js +78 -0
  161. package/dist/chunk-XVBGLISP.js +35 -0
  162. package/dist/chunk-XW6KISBB.js +1192 -0
  163. package/dist/chunk-YGZHHAAB.js +8156 -0
  164. package/dist/chunk-YHEFQUQB.js +186 -0
  165. package/dist/chunk-YLDALTWZ.js +653 -0
  166. package/dist/chunk-YU4HSQW7.js +229 -0
  167. package/dist/chunk-ZDPP6RKB.js +27 -0
  168. package/dist/chunk-ZFDZKNGG.js +194 -0
  169. package/dist/chunk-ZIY7RNUT.js +49 -0
  170. package/dist/chunk-ZYJP6BOO.js +30 -0
  171. package/dist/cli.d.ts +1111 -0
  172. package/dist/cli.js +165 -0
  173. package/dist/codegen-command-VR2GWR6C.js +173 -0
  174. package/dist/codegen.d.ts +115 -0
  175. package/dist/codegen.js +19 -0
  176. package/dist/commands-GJMJ4XYZ.js +76 -0
  177. package/dist/completion-ZQLO6PB6.js +738 -0
  178. package/dist/config-MBYGCAFK.js +136 -0
  179. package/dist/deploy-command-JVZPWHMK.js +180 -0
  180. package/dist/deploy-source-3W45CXMP.js +81 -0
  181. package/dist/dev-env-sync-HN44K4D5.js +188 -0
  182. package/dist/diagnostics-UEAAHWVF.js +30 -0
  183. package/dist/display-name-hint-ABBPVQIR.js +46 -0
  184. package/dist/emit-CyhBDxli.d.ts +7007 -0
  185. package/dist/env-example-refresh-ET5HMMDW.js +126 -0
  186. package/dist/env-pull-command-TNMNB3CV.js +323 -0
  187. package/dist/env-target-O4HRKTGZ.js +40 -0
  188. package/dist/env-var-command-ZIRDCAZA.js +427 -0
  189. package/dist/ephemeral-P7F3PMAD.js +54 -0
  190. package/dist/ephemeral-command-CLJJKOFT.js +592 -0
  191. package/dist/ephemeral-state-PYCBSOGX.js +61 -0
  192. package/dist/file-lock-PT74GWYW.js +10 -0
  193. package/dist/generate-command-AYEOLA26.js +510 -0
  194. package/dist/gitignore-3SJ3WNRG.js +51 -0
  195. package/dist/guards-4EBNCZDC.js +162 -0
  196. package/dist/hosted-file-PSHJB3HX.js +28 -0
  197. package/dist/impersonate-command-5JAS3WSV.js +152 -0
  198. package/dist/import-EQSFU6JC.js +19 -0
  199. package/dist/index.d.ts +5470 -0
  200. package/dist/index.js +371 -0
  201. package/dist/init-command-X2FR4UAK.js +125 -0
  202. package/dist/init-modules-RY7UHAOL.js +50 -0
  203. package/dist/init-web-M4YZSZK6.js +42 -0
  204. package/dist/internal.d.ts +179 -0
  205. package/dist/internal.js +2634 -0
  206. package/dist/io-RC56QSN5.js +26 -0
  207. package/dist/keep-data-merge-7MPLVAVI.js +1119 -0
  208. package/dist/lambda-config-reconcile-OUZ4OYAB.js +116 -0
  209. package/dist/landed-753YLJ5H.js +40 -0
  210. package/dist/landing-record-SU52SKXU.js +61 -0
  211. package/dist/live-diff-YONW2VI3.js +65 -0
  212. package/dist/local-engine-choice-CH5X3W7E.js +79 -0
  213. package/dist/local-engine-command-Z3OL7VOD.js +766 -0
  214. package/dist/local-engine-config-5U3SC434.js +39 -0
  215. package/dist/local-engine-deploy-PCQ4SNPB.js +39 -0
  216. package/dist/local-engine-process-EHTE5LLU.js +63 -0
  217. package/dist/local-engine-state-A4FTRFAF.js +32 -0
  218. package/dist/local-engine-update-check-6L645VBL.js +162 -0
  219. package/dist/lock-MRRHW5GS.js +87 -0
  220. package/dist/lock-commands-2QG25HL7.js +963 -0
  221. package/dist/login-command-QPYRWOXZ.js +538 -0
  222. package/dist/logout-command-WOIQLDP6.js +56 -0
  223. package/dist/loop-ALIZLOSX.js +191 -0
  224. package/dist/marketplace-command-K5YL42NO.js +977 -0
  225. package/dist/marketplace-resolve-LY32JES5.js +40 -0
  226. package/dist/meta-client-YXGPW53C.js +244 -0
  227. package/dist/module-manifest-JFGHU2TC.js +38 -0
  228. package/dist/near-key.d.ts +13 -0
  229. package/dist/near-key.js +8 -0
  230. package/dist/node.d.ts +95 -0
  231. package/dist/node.js +969 -0
  232. package/dist/operation-outcome-TZSESNC7.js +51 -0
  233. package/dist/output-target-AL3I44GG.js +47 -0
  234. package/dist/package-manager-PRAHUSCN.js +34 -0
  235. package/dist/plan-disclosure-6G4MLZKD.js +114 -0
  236. package/dist/plugin-contributions-WRNY5ABG.js +28 -0
  237. package/dist/plugin-prompt-4VA3B4FF.js +20 -0
  238. package/dist/plugin-questions-JTSYA74Q.js +24 -0
  239. package/dist/plugin.d.ts +396 -0
  240. package/dist/plugin.js +1 -0
  241. package/dist/preflight-command-2T5Z36MI.js +321 -0
  242. package/dist/profile-command-AH3PIM4X.js +800 -0
  243. package/dist/profile-pointer-GRWJU3YD.js +31 -0
  244. package/dist/profile-select-74TRDEPD.js +23 -0
  245. package/dist/project-dependency-KSH63ODT.js +35 -0
  246. package/dist/project-sdk-REPPOIBD.js +24 -0
  247. package/dist/promote-command-PCWT5N6S.js +140 -0
  248. package/dist/prompt-II3F3LND.js +27 -0
  249. package/dist/publish-command-TTDUUJI5.js +414 -0
  250. package/dist/pull-command-VBO7C4S3.js +161 -0
  251. package/dist/pull-superseded-GJWLG7XO.js +20 -0
  252. package/dist/release-command-N4ZPKMHR.js +146 -0
  253. package/dist/release-ns-command-3KFDMZ6G.js +1745 -0
  254. package/dist/response-HlXahv4K.d.ts +925 -0
  255. package/dist/retry-command-AS5EVREX.js +34 -0
  256. package/dist/routes-manifest-SNWUVBT6.js +43 -0
  257. package/dist/runtime-XETHVF33.js +14 -0
  258. package/dist/scaffold.d.ts +1911 -0
  259. package/dist/scaffold.js +107 -0
  260. package/dist/secrets-file-LVZD6IIM.js +56 -0
  261. package/dist/secrets-fill-command-TTCPSVXN.js +218 -0
  262. package/dist/seed-VU7C3QYS.js +46 -0
  263. package/dist/sent-writes-N7X4OVXT.js +22 -0
  264. package/dist/source-resolve-S2XA3XZF.js +83 -0
  265. package/dist/static-host-B2Y6AG3W.js +352 -0
  266. package/dist/status-command-RUDXTF7I.js +554 -0
  267. package/dist/store-6VNCD4D7.js +20 -0
  268. package/dist/store-ARM6VMO5.js +98 -0
  269. package/dist/store-DuYfzKlW.d.ts +3144 -0
  270. package/dist/suggest-6FOOYKHG.js +12 -0
  271. package/dist/sveltekit.d.ts +154 -0
  272. package/dist/sveltekit.js +109 -0
  273. package/dist/sync-contributions-UCEROO26.js +415 -0
  274. package/dist/table-ENAVMITR.js +42 -0
  275. package/dist/tables-command-GUPXXSB5.js +156 -0
  276. package/dist/tenant-IIHPOHGP.js +42 -0
  277. package/dist/tenant-command-D5HGI2X4.js +965 -0
  278. package/dist/test-command-TIKZMDPZ.js +476 -0
  279. package/dist/tests-BGGIOK3L.js +26 -0
  280. package/dist/token-NICJUTMT.js +72 -0
  281. package/dist/toolchain-hooks-GHKLUJOH.js +96 -0
  282. package/dist/toolchain-modules-5EAZUONB.js +24 -0
  283. package/dist/tracked-backend-EIBUMDZA.js +80 -0
  284. package/dist/update-check-2W2NLDTC.js +136 -0
  285. package/dist/upgrade-command-QHNFWM7O.js +531 -0
  286. package/dist/verify-rollout-DRCK5TDD.js +61 -0
  287. package/dist/whoami-command-STGINTXH.js +51 -0
  288. package/dist/workspace-2CLHU2LK.js +93 -0
  289. package/dist/workspace-binding-56PIIPCP.js +54 -0
  290. package/dist/workspace-command-JEXQETJD.js +535 -0
  291. package/dist/workspace-env-F2RFMSC5.js +70 -0
  292. package/dist/workspace-export-OJSH2HIW.js +21 -0
  293. package/dist/writable-VA7OISSK.js +25 -0
  294. package/dist/xano-ICFUSPFR.js +42 -0
  295. package/dist/xanosdk-import-GN42TO2B.js +56 -0
  296. package/dist/xanosdk-project-S6DXJONQ.js +41 -0
  297. package/dist/xdo-CxDr2Q1C.d.ts +1371 -0
  298. package/guides/README.md +33 -0
  299. package/guides/authoring.md +921 -0
  300. package/guides/cli.md +401 -0
  301. package/guides/codegen.md +177 -0
  302. package/guides/codes.md +404 -0
  303. package/guides/coverage.md +74 -0
  304. package/guides/deploying.md +1525 -0
  305. package/guides/environment.md +400 -0
  306. package/guides/marketplace.md +415 -0
  307. package/guides/module-contract.md +558 -0
  308. package/guides/object-kinds.md +433 -0
  309. package/guides/project-structure.md +43 -0
  310. package/guides/scaffold.md +351 -0
  311. package/guides/typed-frontend.md +242 -0
  312. package/llms/client.md +63 -0
  313. package/llms/errors.md +56 -0
  314. package/llms/fields.md +176 -0
  315. package/llms/filters.md +183 -0
  316. package/llms/kinds-agent-mcp.md +30 -0
  317. package/llms/kinds-core.md +100 -0
  318. package/llms/kinds-knowledge.md +20 -0
  319. package/llms/kinds-realtime.md +76 -0
  320. package/llms/lambda.md +94 -0
  321. package/llms/legacy.md +44 -0
  322. package/llms/lock.md +40 -0
  323. package/llms/object-kinds.md +34 -0
  324. package/llms/statements-calls.md +62 -0
  325. package/llms/statements-catalog.md +320 -0
  326. package/llms/statements-data.md +66 -0
  327. package/llms/statements-runtime.md +68 -0
  328. package/llms/tests.md +59 -0
  329. package/llms/toolchain.md +16 -0
  330. package/llms/triggers.md +36 -0
  331. package/llms/values.md +29 -0
  332. package/llms-full.txt +2085 -0
  333. package/llms.txt +493 -0
  334. package/manifest.json +11224 -0
  335. package/package.json +162 -0
  336. package/types/lambda-globals.d.ts +129 -0
@@ -0,0 +1,46 @@
1
+ // src/lock/store.ts
2
+ var STORE_KEY = /* @__PURE__ */ Symbol.for("xanosdk.lock.overrides");
3
+ var SOURCE_KEY = /* @__PURE__ */ Symbol.for("xanosdk.lock.source");
4
+ function getStore() {
5
+ return globalThis[STORE_KEY];
6
+ }
7
+ function seedLockOverrides(lock) {
8
+ const entries = /* @__PURE__ */ new Map();
9
+ for (const [key, entry] of Object.entries(lock.objects)) {
10
+ entries.set(key, { ...entry });
11
+ }
12
+ const source = lock[SOURCE_KEY];
13
+ globalThis[STORE_KEY] = {
14
+ entries,
15
+ ...typeof source === "string" ? { source } : {}
16
+ };
17
+ }
18
+ function tagLockSource(lock, path) {
19
+ Object.defineProperty(lock, SOURCE_KEY, { value: path, enumerable: false, configurable: true });
20
+ }
21
+ function seededLockSource() {
22
+ return getStore()?.source;
23
+ }
24
+ function resetLockOverrides() {
25
+ delete globalThis[STORE_KEY];
26
+ }
27
+ function isLockSeeded() {
28
+ return getStore() !== void 0;
29
+ }
30
+ function getLockedGuid(key) {
31
+ return getStore()?.entries.get(key)?.guid;
32
+ }
33
+ function getLockedCanonical(key) {
34
+ return getStore()?.entries.get(key)?.canonical;
35
+ }
36
+
37
+ export {
38
+ seedLockOverrides,
39
+ tagLockSource,
40
+ seededLockSource,
41
+ resetLockOverrides,
42
+ isLockSeeded,
43
+ getLockedGuid,
44
+ getLockedCanonical
45
+ };
46
+ //# sourceMappingURL=chunk-4BW2SG2N.js.map
@@ -0,0 +1,79 @@
1
+ // src/util/sent-writes.ts
2
+ import { AsyncLocalStorage } from "async_hooks";
3
+ var described = new AsyncLocalStorage();
4
+ var inFlight = /* @__PURE__ */ new Set();
5
+ function describeWrite(description, fn) {
6
+ const outer = described.getStore();
7
+ const merged = { ...outer };
8
+ for (const key of ["what", "resolveWith", "check"]) {
9
+ if (description[key] !== void 0) merged[key] = description[key];
10
+ }
11
+ return described.run(merged, fn);
12
+ }
13
+ var READ_POST = /\/(export|run)$/;
14
+ function isWriteRequest(method, url) {
15
+ const verb = method.toUpperCase();
16
+ if (verb === "GET" || verb === "HEAD" || verb === "OPTIONS") return false;
17
+ let parsed;
18
+ try {
19
+ parsed = new URL(url);
20
+ } catch {
21
+ return false;
22
+ }
23
+ if (!parsed.pathname.includes("/api:meta/")) return false;
24
+ if (parsed.searchParams.get("dry_run") === "true") return false;
25
+ return !READ_POST.test(parsed.pathname.replace(/\/$/, ""));
26
+ }
27
+ function pendingWrite() {
28
+ let last;
29
+ for (const write of inFlight) last = write;
30
+ return last;
31
+ }
32
+ function trackingFetch(fetchImpl) {
33
+ return async (input, init) => {
34
+ const url = typeof input === "string" ? input : input instanceof URL ? input.href : input.url;
35
+ const method = init?.method ?? (typeof input === "object" && "method" in input ? input.method : "GET");
36
+ if (!isWriteRequest(method, url)) return fetchImpl(input, init);
37
+ const write = { host: new URL(url).origin, ...described.getStore() };
38
+ inFlight.add(write);
39
+ try {
40
+ return await fetchImpl(input, init);
41
+ } finally {
42
+ inFlight.delete(write);
43
+ }
44
+ };
45
+ }
46
+ var installed = false;
47
+ function installSentWriteTracking() {
48
+ if (installed) return;
49
+ installed = true;
50
+ globalThis.fetch = trackingFetch(globalThis.fetch.bind(globalThis));
51
+ }
52
+ async function trackLocalWrite(description, fn) {
53
+ const write = { host: "this project", local: true, ...description };
54
+ inFlight.add(write);
55
+ try {
56
+ return await fn();
57
+ } finally {
58
+ inFlight.delete(write);
59
+ }
60
+ }
61
+ var landed;
62
+ function noteLanded(step) {
63
+ landed = step;
64
+ }
65
+ function landedStep() {
66
+ return landed;
67
+ }
68
+
69
+ export {
70
+ describeWrite,
71
+ isWriteRequest,
72
+ pendingWrite,
73
+ trackingFetch,
74
+ installSentWriteTracking,
75
+ trackLocalWrite,
76
+ noteLanded,
77
+ landedStep
78
+ };
79
+ //# sourceMappingURL=chunk-4KHEMC32.js.map
@@ -0,0 +1,321 @@
1
+ import {
2
+ statementLabel
3
+ } from "./chunk-YU4HSQW7.js";
4
+ import {
5
+ PROTO_KEY,
6
+ describeEntry,
7
+ protoKeyed
8
+ } from "./chunk-CIMQZRRE.js";
9
+ import {
10
+ withArticle
11
+ } from "./chunk-36JUQZVQ.js";
12
+
13
+ // src/kinds/def-shape.ts
14
+ var COMMON = {
15
+ name: "string",
16
+ guid: "string",
17
+ description: "string",
18
+ docs: "string",
19
+ tags: "string[]",
20
+ active: "boolean",
21
+ tests: "object[]",
22
+ input: "record",
23
+ middleware: "attach"
24
+ };
25
+ var BY_KIND = {
26
+ task: { schedule: "object[]", datasource: "string" },
27
+ query: { cache: "object" },
28
+ function: { cache: "object" },
29
+ table: { schema: "schema", index: "object[]", views: "object[]", autocomplete: "string[]" },
30
+ api_group: { canonical: "string", swagger: "boolean", cors: "object", documentation: "object" },
31
+ agent: { tools: "list", llm: "object" },
32
+ trigger: { datasources: "string[]", actions: "object" },
33
+ mcp_server: { tools: "list", canonical: "string" },
34
+ microservice: { configs: "object[]", volumes: "object[]", ingresses: "object[]", deployment: "object" },
35
+ workspace: {
36
+ env: "object",
37
+ history: "object",
38
+ realtime: "object",
39
+ documentation: "object",
40
+ defaults: "object",
41
+ preferences: "object",
42
+ settings: "object"
43
+ }
44
+ };
45
+ var AUTHOR_KIND_NAME = {
46
+ api_group: "apiGroup",
47
+ mcp_server: "mcpServer",
48
+ realtime_server: "realtimeServer",
49
+ channel: "realtimeChannel",
50
+ message: "realtimeMessage",
51
+ workflow_test: "workflowTest",
52
+ workspace: "workspaceConfig"
53
+ };
54
+ var EXPECTED = {
55
+ string: "a string",
56
+ boolean: "true or false",
57
+ "string[]": "a list of strings",
58
+ "object[]": "a list of objects",
59
+ list: "a list",
60
+ object: "a { \u2026 } object",
61
+ record: "a { name: descriptor } record",
62
+ schema: "a { column: f.*() } record (or a list of columns)",
63
+ attach: "a { pre?: [...], post?: [...] } object"
64
+ };
65
+ function isPlainObject(v) {
66
+ return typeof v === "object" && v !== null && !Array.isArray(v);
67
+ }
68
+ function assertDefShape(kindName, def) {
69
+ const label = AUTHOR_KIND_NAME[kindName] ?? kindName;
70
+ const owner = typeof def.name === "string" ? `${label} "${def.name}"` : label;
71
+ assertNoProtoKeys(owner, def);
72
+ if (kindName === "table" && (def.schema === void 0 || def.schema === null)) {
73
+ throw new Error(`${owner}: \`schema\` is required \u2014 a { column: f.*() } record (or a list of columns).`);
74
+ }
75
+ const fields = { ...COMMON, ...BY_KIND[kindName] };
76
+ for (const [field, shape] of Object.entries(fields)) {
77
+ const v = def[field];
78
+ if (v === void 0 || v === null) continue;
79
+ const bad = shapeProblem(shape, v, field);
80
+ if (bad !== void 0) {
81
+ throw new Error(`${owner}: \`${bad.at}\` must be ${bad.expected} \u2014 got ${describeEntry(bad.got)}.`);
82
+ }
83
+ }
84
+ if (kindName === "table" && Array.isArray(def.views)) {
85
+ def.views.forEach((view, i) => {
86
+ for (const key of ["name", "id"]) {
87
+ if (typeof view[key] === "string") continue;
88
+ throw new Error(
89
+ `${owner}: \`views[${i}].${key}\` is required \u2014 ` + (key === "id" ? "the view's stable uuid (`crypto.randomUUID()` once, then keep it)" : "the view's label") + ` \u2014 got ${describeEntry(view[key])}.`
90
+ );
91
+ }
92
+ });
93
+ }
94
+ }
95
+ function shapeProblem(shape, v, field) {
96
+ const whole = { at: field, expected: EXPECTED[shape], got: v };
97
+ switch (shape) {
98
+ case "string":
99
+ return typeof v === "string" ? void 0 : whole;
100
+ case "boolean":
101
+ return typeof v === "boolean" ? void 0 : whole;
102
+ case "object":
103
+ return isPlainObject(v) ? void 0 : whole;
104
+ case "list":
105
+ return Array.isArray(v) ? void 0 : whole;
106
+ case "string[]":
107
+ case "object[]": {
108
+ if (!Array.isArray(v)) return whole;
109
+ const want = shape === "string[]" ? "a string" : "an object";
110
+ const i = v.findIndex((e) => shape === "string[]" ? typeof e !== "string" : !isPlainObject(e));
111
+ return i === -1 ? void 0 : { at: `${field}[${i}]`, expected: want, got: v[i] };
112
+ }
113
+ case "record": {
114
+ if (!isPlainObject(v)) return whole;
115
+ const bad = Object.entries(v).find(([, d]) => !isPlainObject(d) && typeof d !== "function");
116
+ return bad === void 0 ? void 0 : { at: `${field}.${bad[0]}`, expected: "a descriptor object", got: bad[1] };
117
+ }
118
+ case "attach": {
119
+ if (!isPlainObject(v)) return whole;
120
+ for (const side of ["pre", "post"]) {
121
+ const list = v[side];
122
+ if (list !== void 0 && list !== null && !Array.isArray(list)) {
123
+ return { at: `${field}.${side}`, expected: "a list of middleware", got: list };
124
+ }
125
+ }
126
+ return void 0;
127
+ }
128
+ case "schema": {
129
+ if (Array.isArray(v)) {
130
+ const i = v.findIndex((e) => !isPlainObject(e) || typeof e.name !== "string" || typeof e.type !== "string");
131
+ return i === -1 ? void 0 : { at: `${field}[${i}]`, expected: "a column ({ name, type })", got: v[i] };
132
+ }
133
+ if (!isPlainObject(v)) return whole;
134
+ const bad = Object.entries(v).find(([, d]) => !isPlainObject(d) || typeof d.type !== "string");
135
+ return bad === void 0 ? void 0 : { at: `${field}.${bad[0]}`, expected: "a field (f.text(), f.int(), \u2026)", got: bad[1] };
136
+ }
137
+ }
138
+ }
139
+ function findProtoKeyed(root) {
140
+ const stack = [[root, ""]];
141
+ const seen = /* @__PURE__ */ new Set();
142
+ while (stack.length > 0) {
143
+ const [node, path] = stack.pop();
144
+ if (node === null || typeof node !== "object" || seen.has(node)) continue;
145
+ seen.add(node);
146
+ if (protoKeyed(node)) return path;
147
+ if (Array.isArray(node)) {
148
+ for (let i = node.length - 1; i >= 0; i--) stack.push([node[i], `${path}[${i}]`]);
149
+ continue;
150
+ }
151
+ const proto = Object.getPrototypeOf(node);
152
+ if (proto !== Object.prototype && proto !== null) continue;
153
+ const keys = Object.keys(node);
154
+ for (let i = keys.length - 1; i >= 0; i--) {
155
+ const key = keys[i];
156
+ stack.push([node[key], path === "" ? key : `${path}.${key}`]);
157
+ }
158
+ }
159
+ return void 0;
160
+ }
161
+ function assertNoProtoKeys(owner, def) {
162
+ const at = findProtoKeyed(def);
163
+ if (at === void 0) return;
164
+ throw new Error(
165
+ `${owner}: ${at === "" ? "the def" : `\`${at}\``} has a \`__proto__\` key that is not a member \u2014 ${PROTO_KEY}.`
166
+ );
167
+ }
168
+
169
+ // src/kinds/test-mocks.ts
170
+ function mockBearingItem(node) {
171
+ if (node === null || typeof node !== "object" || Array.isArray(node)) return null;
172
+ const rec = node;
173
+ if (typeof rec.name !== "string") return null;
174
+ const mocks = rec.mocks;
175
+ if (mocks === null || typeof mocks !== "object" || Array.isArray(mocks)) return null;
176
+ if (Object.keys(mocks).length === 0) return null;
177
+ return rec;
178
+ }
179
+ function resolveMockKeys(run, tests, ownerKind, ownerName) {
180
+ const byName = new Map(tests.map((t) => [t.name, t.id]));
181
+ const rewrite = (item) => {
182
+ const resolved = {};
183
+ for (const [testName, entry] of Object.entries(item.mocks)) {
184
+ const id = byName.get(testName);
185
+ if (id === void 0) {
186
+ if (/^[0-9a-f]{32}$/.test(testName)) {
187
+ resolved[testName] = entry;
188
+ continue;
189
+ }
190
+ throw new Error(
191
+ `${ownerKind} "${ownerName}": a statement mocks a test named "${testName}", which this object does not declare. ` + (tests.length === 0 ? `It declares no tests at all \u2014 add one to \`tests\`, or drop the mock. ` : `Declared tests: ${tests.map((t) => `"${t.name}"`).join(", ")}. `) + `A mock is stored against a test's id, so a name that matches nothing would deploy clean and then never apply.`
192
+ );
193
+ }
194
+ resolved[id] = entry;
195
+ }
196
+ item.mocks = resolved;
197
+ };
198
+ const pending = [run];
199
+ while (pending.length > 0) {
200
+ const node = pending.pop();
201
+ if (Array.isArray(node)) {
202
+ for (const child of node) pending.push(child);
203
+ continue;
204
+ }
205
+ if (node === null || typeof node !== "object") continue;
206
+ const item = mockBearingItem(node);
207
+ if (item) rewrite(item);
208
+ for (const [key, child] of Object.entries(node)) {
209
+ if (key === "mocks") continue;
210
+ pending.push(child);
211
+ }
212
+ }
213
+ }
214
+ function assertMockKeysResolved(xdo, kindName) {
215
+ const kind = AUTHOR_KIND_NAME[kindName] ?? kindName;
216
+ const objectName = xdo?.name;
217
+ const owner = typeof objectName === "string" ? `${kind} "${objectName}"` : kind;
218
+ const pending = [xdo];
219
+ while (pending.length > 0) {
220
+ const node = pending.pop();
221
+ if (Array.isArray(node)) {
222
+ for (const child of node) pending.push(child);
223
+ continue;
224
+ }
225
+ if (node === null || typeof node !== "object") continue;
226
+ const item = mockBearingItem(node);
227
+ if (item) {
228
+ for (const key of Object.keys(item.mocks)) {
229
+ if (/^[0-9a-f]{32}$/.test(key)) continue;
230
+ const stored = node.name;
231
+ const step = typeof stored === "string" ? `\`${statementLabel(stored)}\`` : "a statement";
232
+ throw new Error(
233
+ `${owner}: ${step} carries \`mock: { "${key}": \u2026 }\`, but ${withArticle(kind)} does not store unit tests \u2014 only a query, function, or middleware does. A mock is stored against a test's id, so this one would deploy clean and never apply. Move the step into a function that declares the test, or drop the mock.`
234
+ );
235
+ }
236
+ }
237
+ for (const [key, child] of Object.entries(node)) {
238
+ if (key === "mocks") continue;
239
+ pending.push(child);
240
+ }
241
+ }
242
+ }
243
+ function assertTestIds(xdo, kindName) {
244
+ const tests = xdo?.test;
245
+ if (!Array.isArray(tests)) return;
246
+ const kind = AUTHOR_KIND_NAME[kindName] ?? kindName;
247
+ const owner = `${kind} "${String(xdo.name)}"`;
248
+ const byId = /* @__PURE__ */ new Map();
249
+ for (const t of tests) {
250
+ if (typeof t?.id !== "string" || !/^[0-9a-f]{32}$/.test(t.id)) {
251
+ throw new Error(
252
+ `${owner}: test "${String(t?.name)}" has \`id: ${JSON.stringify(t?.id)}\` \u2014 a test id is 32 lowercase hex characters, the form the engine stores. Omit \`id\` to derive one from the test name, or copy the stored id.`
253
+ );
254
+ }
255
+ if (byId.has(t.id)) {
256
+ throw new Error(`${owner}: tests "${String(byId.get(t.id))}" and "${String(t.name)}" share \`id: "${t.id}"\` \u2014 each test needs its own.`);
257
+ }
258
+ byId.set(t.id, t.name);
259
+ }
260
+ }
261
+
262
+ // src/kinds/kind.ts
263
+ var kindRegistry = /* @__PURE__ */ new Map();
264
+ function registerKind(kind) {
265
+ kindRegistry.set(kind.name, kind);
266
+ }
267
+ function isRegisteredKind(name) {
268
+ return kindRegistry.has(name);
269
+ }
270
+ function getKind(name) {
271
+ const kind = kindRegistry.get(name);
272
+ if (!kind) {
273
+ throw new Error(
274
+ `Unknown object kind "${name}". Registered: ${[...kindRegistry.keys()].join(", ") || "(none)"}`
275
+ );
276
+ }
277
+ return kind;
278
+ }
279
+ function encodeObject(name, def) {
280
+ const xdo = getKind(name).encode(def);
281
+ assertTestIds(xdo, name);
282
+ assertMockKeysResolved(xdo, name);
283
+ return xdo;
284
+ }
285
+ function registeredKinds() {
286
+ return [...kindRegistry.values()];
287
+ }
288
+
289
+ // src/kinds/common.ts
290
+ function emptyMiddleware() {
291
+ return { pre_customize: false, post_customize: false, pre: [], post: [] };
292
+ }
293
+ function encodeTags(tags) {
294
+ return (tags ?? []).map((tag) => ({ tag }));
295
+ }
296
+ var HISTORY_DEFAULT_OFF = /* @__PURE__ */ new Set(["function", "middleware", "trigger", "message"]);
297
+ function defaultHistory(objType, override) {
298
+ return {
299
+ inherit: override?.inherit ?? true,
300
+ enabled: override?.enabled ?? !HISTORY_DEFAULT_OFF.has(objType),
301
+ limit: override?.limit ?? 100
302
+ };
303
+ }
304
+
305
+ export {
306
+ AUTHOR_KIND_NAME,
307
+ assertDefShape,
308
+ assertNoProtoKeys,
309
+ resolveMockKeys,
310
+ assertMockKeysResolved,
311
+ assertTestIds,
312
+ registerKind,
313
+ isRegisteredKind,
314
+ getKind,
315
+ encodeObject,
316
+ registeredKinds,
317
+ emptyMiddleware,
318
+ encodeTags,
319
+ defaultHistory
320
+ };
321
+ //# sourceMappingURL=chunk-4POWHT2K.js.map
@@ -0,0 +1,192 @@
1
+ import {
2
+ satisfiesRange
3
+ } from "./chunk-2TFRR6JV.js";
4
+ import {
5
+ configuredPackages,
6
+ declaredDependencies,
7
+ readProjectManifest,
8
+ readToolchainConfig
9
+ } from "./chunk-JTUKLCXS.js";
10
+ import {
11
+ fileInPackage,
12
+ loadFile,
13
+ moduleKind,
14
+ readInstalledManifestState
15
+ } from "./chunk-3LDULPRE.js";
16
+ import {
17
+ UsageError,
18
+ warn
19
+ } from "./chunk-PTHVMXZI.js";
20
+
21
+ // src/emit/toolchain-modules.ts
22
+ var UNKNOWN_MODULE_VERSION = "unknown";
23
+ function isEnabled(config) {
24
+ return config?.["enabled"] !== false;
25
+ }
26
+ function declaredToolchainPlugins(projectDir) {
27
+ const projectManifest = readProjectManifest(projectDir);
28
+ if (projectManifest === null) return [];
29
+ const declared = [];
30
+ const configured = new Set(configuredPackages(projectDir, projectManifest));
31
+ for (const pkg of declaredDependencies(projectManifest)) {
32
+ const state = readInstalledManifestState(projectDir, pkg);
33
+ if (state.kind === "absent") {
34
+ if (configured.has(pkg)) {
35
+ declared.push({
36
+ pkg,
37
+ version: UNKNOWN_MODULE_VERSION,
38
+ config: null,
39
+ pluginFile: null,
40
+ sdkPeerRange: null,
41
+ unreadable: `it is configured in this project's package.json but is not installed`
42
+ });
43
+ }
44
+ continue;
45
+ }
46
+ if (state.kind === "unreadable") {
47
+ declared.push({
48
+ pkg,
49
+ version: UNKNOWN_MODULE_VERSION,
50
+ config: null,
51
+ pluginFile: null,
52
+ sdkPeerRange: null,
53
+ unreadable: state.why
54
+ });
55
+ continue;
56
+ }
57
+ const manifest = state.manifest;
58
+ let kind;
59
+ try {
60
+ kind = moduleKind(pkg, manifest);
61
+ } catch (error) {
62
+ warn(
63
+ `${pkg} does not declare a module kind we recognize, so it is read as an ordinary package.`,
64
+ "module.kind-unknown",
65
+ [error instanceof Error ? error.message : String(error)]
66
+ );
67
+ continue;
68
+ }
69
+ if (kind !== "toolchain") continue;
70
+ const field = manifest["xanosdk"];
71
+ const declaredPath = field["plugin"];
72
+ const config = readToolchainConfig(projectDir, pkg, projectManifest);
73
+ declared.push({
74
+ pkg,
75
+ version: manifestVersion(manifest),
76
+ config,
77
+ pluginFile: typeof declaredPath === "string" && declaredPath !== "" ? fileInPackage(projectDir, pkg, declaredPath) : null,
78
+ sdkPeerRange: declaredSdkPeerRange(manifest)
79
+ });
80
+ }
81
+ return declared;
82
+ }
83
+ function declaredSdkPeerRange(manifest) {
84
+ const peers = manifest["peerDependencies"];
85
+ if (typeof peers !== "object" || peers === null) return null;
86
+ const range = peers["@xano/sdk"];
87
+ return typeof range === "string" && range.trim() !== "" ? range : null;
88
+ }
89
+ function sdkPeerSkew(manifest, sdkVersion) {
90
+ const range = declaredSdkPeerRange(manifest);
91
+ if (range === null) return null;
92
+ return satisfiesRange(sdkVersion, range) === false ? range : null;
93
+ }
94
+ function manifestVersion(manifest) {
95
+ const version = manifest["version"];
96
+ return typeof version === "string" && version !== "" ? version : UNKNOWN_MODULE_VERSION;
97
+ }
98
+ function assertSdkInPeerRange(declared, sdkVersion) {
99
+ const range = declared.sdkPeerRange;
100
+ if (range === null) return;
101
+ if (satisfiesRange(sdkVersion, range) !== false) return;
102
+ throw new UsageError(
103
+ `${declared.pkg} requires \`@xano/sdk\` ${range}, and this is ${sdkVersion} \u2014 so it would load, register, and apply nothing, which reads exactly like a module that had nothing to add.`,
104
+ {
105
+ suggestion: `Upgrade the SDK with \`npm install @xano/sdk@latest\`, or install a ${declared.pkg} built for this one. To carry on without it, set \`"${declared.pkg}": { "enabled": false }\` in this project's package.json "xanosdk" block, or run \`xanosdk marketplace remove ${declared.pkg}\` to drop it and its settings together.`
106
+ }
107
+ );
108
+ }
109
+ async function discoverToolchainPlugins(projectDir, opts) {
110
+ const loaded = [];
111
+ const skipped = [];
112
+ const unconfigured = [];
113
+ let sdkVersion = opts.sdkVersion;
114
+ const runningSdkVersion = async () => sdkVersion ??= (await import("./cli.js")).readVersion();
115
+ for (const declared of declaredToolchainPlugins(projectDir)) {
116
+ const override = opts.configOverride?.[declared.pkg];
117
+ const config = override === void 0 ? declared.config : { ...declared.config ?? {}, ...override };
118
+ if (!isEnabled(config)) continue;
119
+ if (declared.unreadable !== void 0) {
120
+ skipped.push({ pkg: declared.pkg, why: declared.unreadable });
121
+ continue;
122
+ }
123
+ if (declared.sdkPeerRange !== null) {
124
+ assertSdkInPeerRange(declared, await runningSdkVersion());
125
+ }
126
+ if (declared.pluginFile === null) {
127
+ skipped.push({
128
+ pkg: declared.pkg,
129
+ why: `its package.json names no "xanosdk": { "plugin": \u2026 } file we could find on disk`
130
+ });
131
+ continue;
132
+ }
133
+ const entry = await loadFile(declared.pluginFile);
134
+ if (entry.kind !== "loaded") {
135
+ skipped.push({ pkg: declared.pkg, why: entry.why });
136
+ continue;
137
+ }
138
+ const candidate = entry.exports["default"];
139
+ if (typeof candidate !== "object" || candidate === null) {
140
+ skipped.push({ pkg: declared.pkg, why: "its plugin file has no default export" });
141
+ continue;
142
+ }
143
+ if (candidate.kind !== "toolchain") {
144
+ skipped.push({
145
+ pkg: declared.pkg,
146
+ why: `its default export does not declare kind: "toolchain", but its package.json does`
147
+ });
148
+ continue;
149
+ }
150
+ if (declared.config === null) unconfigured.push(declared.pkg);
151
+ loaded.push({
152
+ pkg: declared.pkg,
153
+ version: declared.version,
154
+ plugin: candidate,
155
+ config: config ?? {}
156
+ });
157
+ }
158
+ if (skipped.length > 0) reportSkipped(skipped, opts.frozen);
159
+ if (opts.configuring !== true) reportUnconfigured(unconfigured);
160
+ return { loaded, skipped, unconfigured };
161
+ }
162
+ function reportUnconfigured(unconfigured) {
163
+ if (unconfigured.length === 0) return;
164
+ warn(
165
+ `${unconfigured.length === 1 ? "A toolchain module is" : `${unconfigured.length} toolchain modules are`} installed but never configured, so ${unconfigured.length === 1 ? "it runs on its" : "they run on their"} own defaults with nothing this project chose.`,
166
+ "module.unconfigured",
167
+ unconfigured.map((pkg) => `${pkg} \u2014 configure it with \`xanosdk marketplace install ${pkg}\``)
168
+ );
169
+ }
170
+ function reportSkipped(skipped, frozen) {
171
+ if (frozen) {
172
+ throw new UsageError(
173
+ `${skipped.length === 1 ? "A toolchain module" : `${skipped.length} toolchain modules`} could not be loaded, so whatever ${skipped.length === 1 ? "it checks was" : "they check were"} not checked \u2014 and this run was asked to verify, not to write:
174
+ ` + skipped.map((s) => ` ${s.pkg} \u2014 ${s.why}`).join("\n") + `
175
+
176
+ Run \`xanosdk marketplace reinstall <package>\` to repair one that should still be here, or \`xanosdk marketplace remove <package>\` to drop it and its settings together. A plain \`npm uninstall\` leaves the settings behind, and a module this project still configures but no longer has installed is exactly what fails a frozen run.`
177
+ );
178
+ }
179
+ warn(
180
+ `${skipped.length === 1 ? "A toolchain module" : `${skipped.length} toolchain modules`} could not be loaded and ${skipped.length === 1 ? "was" : "were"} skipped.`,
181
+ "toolchain.load-failed",
182
+ skipped.map((s) => `${s.pkg} \u2014 ${s.why}`)
183
+ );
184
+ }
185
+
186
+ export {
187
+ UNKNOWN_MODULE_VERSION,
188
+ declaredToolchainPlugins,
189
+ sdkPeerSkew,
190
+ discoverToolchainPlugins
191
+ };
192
+ //# sourceMappingURL=chunk-4Q2GN7NW.js.map