@xano/sdk 1.0.4 → 1.0.6
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.
- package/CHANGELOG.md +32 -5
- package/README.md +250 -342
- package/dist/.build-fingerprint +1 -1
- package/dist/agent-file-refresh-67QIX45H.js +39 -0
- package/dist/{answer-shape-LVV2SVBK.js → answer-shape-UCDUKPAN.js} +6 -6
- package/dist/{backend-dir-WZADOK3L.js → backend-dir-3LIL6SCT.js} +16 -15
- package/dist/{backend-slot-NSCTWCUX.js → backend-slot-JREP27UD.js} +4 -4
- package/dist/bin.js +59 -58
- package/dist/{branch-ONWPJ4V6.js → branch-2IPHOAYS.js} +10 -10
- package/dist/{branch-commands-ZT2MJIRS.js → branch-commands-KTKAXBAN.js} +31 -32
- package/dist/bundle.js +9 -39
- package/dist/{capture-3JNUA6C2.js → capture-GW5KNKMB.js} +4 -4
- package/dist/{chunk-FPBGAT5D.js → chunk-26MOFAJT.js} +3 -3
- package/dist/{chunk-O7QOWS6M.js → chunk-2FLIJGBZ.js} +12 -12
- package/dist/{chunk-QAEQGT5I.js → chunk-2WBH5HUY.js} +7 -7
- package/dist/{chunk-37AHZ7JX.js → chunk-3BBIDW3Y.js} +6 -6
- package/dist/{chunk-DGWHAVRG.js → chunk-3EDSPMXN.js} +12 -1
- package/dist/{chunk-2AUV6NXK.js → chunk-3II44CUJ.js} +36 -36
- package/dist/{chunk-7GX445AE.js → chunk-4XHAT7C5.js} +2 -2
- package/dist/{chunk-OOXWYAA4.js → chunk-57A5ZKPO.js} +1 -1
- package/dist/{chunk-OOGXZL7Z.js → chunk-5KJBWIDZ.js} +84 -6
- package/dist/{chunk-5YL5OC2G.js → chunk-5QMJOE2K.js} +6 -6
- package/dist/{chunk-3H3EPMFY.js → chunk-5TVFLG3C.js} +2 -2
- package/dist/{chunk-WFMVKY7I.js → chunk-5YQV35C2.js} +9 -9
- package/dist/{chunk-NA3PXMEF.js → chunk-64WWE3EF.js} +1 -1
- package/dist/{chunk-FMOEVAGT.js → chunk-6X3MY2JP.js} +3 -3
- package/dist/{chunk-2LVTBPW2.js → chunk-6X6BJN6Y.js} +3 -3
- package/dist/{chunk-DYG5D3FD.js → chunk-763M6LX3.js} +16 -2
- package/dist/{chunk-EESV6NU2.js → chunk-7FIMUFBP.js} +2 -2
- package/dist/{chunk-CFSFBKHP.js → chunk-7GAIJW62.js} +2 -2
- package/dist/{chunk-6R7S775T.js → chunk-7REDHC4N.js} +2 -2
- package/dist/chunk-7VR4IO5B.js +44 -0
- package/dist/chunk-A7MRZ4GF.js +78 -0
- package/dist/{chunk-D5ZEAF4G.js → chunk-ATJ2W7DC.js} +81 -58
- package/dist/{chunk-BUJRS7XB.js → chunk-AVS4WPPY.js} +2 -2
- package/dist/{chunk-MEE5RZ6G.js → chunk-BL3AZ3AP.js} +2 -2
- package/dist/chunk-BTVUYHWV.js +111 -0
- package/dist/{chunk-T4DUFQ2S.js → chunk-CCU5CCRX.js} +5 -5
- package/dist/{chunk-5T2CTWTB.js → chunk-CHINR7WD.js} +6 -6
- package/dist/{chunk-VD32O6KZ.js → chunk-CJDPSCMX.js} +45 -5
- package/dist/{chunk-3HOGFGKG.js → chunk-D3KEPRRN.js} +2 -2
- package/dist/{chunk-SBR2WZXG.js → chunk-D7BUMOKU.js} +60 -53
- package/dist/{chunk-WRBKLYSJ.js → chunk-DNBP4GJN.js} +4 -3
- package/dist/{chunk-JTUKLCXS.js → chunk-DXUICABI.js} +1 -1
- package/dist/{chunk-XMDDBEEM.js → chunk-E763QI3G.js} +2 -2
- package/dist/{chunk-KTGRGWZW.js → chunk-EADVVTDK.js} +7 -7
- package/dist/{chunk-FJWZ5OVV.js → chunk-ENMBEXOP.js} +3 -3
- package/dist/{chunk-OPHB5ORL.js → chunk-EQFYOOO6.js} +171 -92
- package/dist/{chunk-WOGJB2F6.js → chunk-FNLTFOUD.js} +4 -9
- package/dist/{chunk-II747OWE.js → chunk-FQ53GTII.js} +10 -10
- package/dist/{chunk-JP7M7OU7.js → chunk-FU3VCE5A.js} +46 -27
- package/dist/{chunk-OGBMUST4.js → chunk-GHQ4BVI4.js} +14 -14
- package/dist/{chunk-45YPFB7B.js → chunk-GLY552SI.js} +84 -57
- package/dist/{chunk-QV3GXQRE.js → chunk-GOLFAEUV.js} +2 -2
- package/dist/{chunk-L2GLOJAO.js → chunk-GW5RHGOB.js} +22 -22
- package/dist/{chunk-A6QTTJUI.js → chunk-GWTFI3GA.js} +2 -2
- package/dist/{chunk-MCTIKRMN.js → chunk-GZHLCUZ6.js} +8 -8
- package/dist/{chunk-664LSWE5.js → chunk-HCG7NDIL.js} +4 -4
- package/dist/{chunk-7PMVIHB3.js → chunk-I3H3HCPY.js} +50 -29
- package/dist/{chunk-LIVN53UV.js → chunk-I3VHW6XM.js} +31 -31
- package/dist/{chunk-C4FHQA7R.js → chunk-IF4PEGVD.js} +8 -8
- package/dist/{chunk-WFG67AYS.js → chunk-IMELQ2I6.js} +3 -3
- package/dist/{chunk-3P3HXN76.js → chunk-ITC2R2OT.js} +11 -11
- package/dist/{chunk-W5ONYLOP.js → chunk-IXFJORNH.js} +4 -4
- package/dist/{chunk-HMLGM2MW.js → chunk-IYXL5NYU.js} +260 -32
- package/dist/{chunk-2B22WWKL.js → chunk-JFBRXRJD.js} +59 -35
- package/dist/chunk-JI3BLXWQ.js +107 -0
- package/dist/{chunk-4DJTQ6W4.js → chunk-JIKGT7DO.js} +2 -1
- package/dist/{chunk-O5V3YH5P.js → chunk-JRVQ7M7W.js} +8 -8
- package/dist/{chunk-4APOHK7Y.js → chunk-JXVJGF3Y.js} +2 -2
- package/dist/chunk-KPFS3RGM.js +257 -0
- package/dist/{chunk-PML67X22.js → chunk-LAOMN6QQ.js} +3 -3
- package/dist/{chunk-TTVAHCWP.js → chunk-LBJA7IEM.js} +370 -45
- package/dist/{chunk-KUTFFHUM.js → chunk-LD6ARK3A.js} +2 -2
- package/dist/{chunk-HUSH7LRI.js → chunk-LL7SGTRC.js} +36 -33
- package/dist/{chunk-I2BGYNHD.js → chunk-M5CSVB23.js} +7 -7
- package/dist/{chunk-UCQ2VUTG.js → chunk-M6ZFSTIZ.js} +2 -2
- package/dist/{chunk-MNVDVR3M.js → chunk-MBDFH7XB.js} +4 -4
- package/dist/{chunk-QXTKSOFI.js → chunk-MF4W6FHU.js} +1 -1
- package/dist/{chunk-RX3EMQGN.js → chunk-MFWF2NZJ.js} +12 -5
- package/dist/{chunk-SEUCZZCP.js → chunk-N5I37JFB.js} +3 -3
- package/dist/{chunk-IJ3SXSZM.js → chunk-ND43ZOS3.js} +6 -6
- package/dist/chunk-NDWVJ2QZ.js +67 -0
- package/dist/{chunk-E65QIWOO.js → chunk-NPODGBVJ.js} +4 -4
- package/dist/{chunk-CYB7UQA2.js → chunk-OIKLDDYC.js} +5 -5
- package/dist/{chunk-MLGI2SRQ.js → chunk-PFBXSVZF.js} +4 -4
- package/dist/{chunk-AM4FKL4J.js → chunk-PL7AIAWS.js} +12 -12
- package/dist/{chunk-S7E2AHV3.js → chunk-PMMHSX4H.js} +26 -9
- package/dist/{chunk-WL2DSNJV.js → chunk-Q22BMRPF.js} +2 -2
- package/dist/{chunk-3FN2BIGB.js → chunk-QJM5XZ4K.js} +6 -6
- package/dist/{chunk-EWCDPFW5.js → chunk-QXYMDARD.js} +4 -4
- package/dist/{chunk-MLPDSGJQ.js → chunk-QZEAANWP.js} +5 -5
- package/dist/{chunk-ESZ2FF57.js → chunk-RIN4YY34.js} +88 -74
- package/dist/{chunk-37FBPMNE.js → chunk-S56YBYMN.js} +5 -2
- package/dist/{chunk-CBYQ2ZN3.js → chunk-SKEG3V2V.js} +2 -2
- package/dist/{chunk-4PQHO74B.js → chunk-SLGJIWCY.js} +4 -4
- package/dist/{chunk-IVKRT476.js → chunk-SPITRSOF.js} +2 -2
- package/dist/{chunk-BUECLQXK.js → chunk-SPKA2LV6.js} +4 -4
- package/dist/{chunk-HHW5AWVD.js → chunk-SSITMX7I.js} +30 -30
- package/dist/{chunk-OPG4DYX2.js → chunk-T4LJ5UR2.js} +29 -7
- package/dist/{chunk-LXNQWHZM.js → chunk-TECTL2NU.js} +4 -4
- package/dist/{chunk-E6H5ZEV3.js → chunk-TTEIDD5Q.js} +3 -3
- package/dist/{chunk-6VBTPV2Y.js → chunk-U35MTOXQ.js} +3 -3
- package/dist/{chunk-UKUIUS3E.js → chunk-U6MTGB46.js} +5 -5
- package/dist/{chunk-Y2ZLKBM6.js → chunk-UD2Z7K6W.js} +4 -4
- package/dist/{chunk-IXUPUFCG.js → chunk-UIVMR7UK.js} +2 -2
- package/dist/{chunk-UDE5C2XN.js → chunk-VDHA5SSQ.js} +3 -3
- package/dist/{chunk-5W7DOMIU.js → chunk-VJFMUJWZ.js} +4 -4
- package/dist/{chunk-XNCP4KYO.js → chunk-VQPDATQT.js} +1 -1
- package/dist/{chunk-KCAL4QYP.js → chunk-VW4CWVYX.js} +4 -4
- package/dist/chunk-WAVNUTMT.js +9 -0
- package/dist/{chunk-DIG3NITC.js → chunk-WBH4KJWM.js} +3 -3
- package/dist/{chunk-HSEQYBDO.js → chunk-WZHLMU6T.js} +3 -3
- package/dist/{chunk-WYEQFD6A.js → chunk-XFBGXB7X.js} +173 -105
- package/dist/{chunk-UI4OPTYR.js → chunk-Y453TW6J.js} +2 -2
- package/dist/{chunk-LUTMOHOW.js → chunk-YGLMRH5U.js} +9 -9
- package/dist/{chunk-GPI3OWRE.js → chunk-YHB34BN6.js} +2 -1
- package/dist/{chunk-5WGVIXMD.js → chunk-YKP4ZKVO.js} +14 -10
- package/dist/{chunk-MN2PB6WB.js → chunk-YR2I5HGE.js} +3 -3
- package/dist/{chunk-ZG7E72VI.js → chunk-YYC2DZMG.js} +7 -7
- package/dist/{chunk-D64XUF5Q.js → chunk-YYLUBYXM.js} +16 -16
- package/dist/{chunk-VRVKNY4A.js → chunk-Z4ZGTCCD.js} +8 -8
- package/dist/{chunk-44B4V2LR.js → chunk-ZDP6GDAB.js} +142 -142
- package/dist/{chunk-ET5DSBAC.js → chunk-ZJSTUD6D.js} +8 -8
- package/dist/cli.d.ts +36 -26
- package/dist/cli.js +57 -56
- package/dist/{codegen-command-HTWIW56U.js → codegen-command-R5IASBFC.js} +78 -72
- package/dist/codegen.d.ts +2 -2
- package/dist/codegen.js +2 -2
- package/dist/{commands-CVFYC4GK.js → commands-H7CPMMHH.js} +3 -3
- package/dist/{completion-AUEQC4XJ.js → completion-W5ZAI6TN.js} +12 -12
- package/dist/{config-JU6OQC77.js → config-MZ5KG4EP.js} +5 -5
- package/dist/{deploy-command-5WTFHMBT.js → deploy-command-34T2LKQ5.js} +64 -63
- package/dist/deploy-source-YLQ7WMYR.js +82 -0
- package/dist/{dev-env-sync-X636HLMK.js → dev-env-sync-TMJTNU3U.js} +58 -57
- package/dist/{diagnostics-LSMGB4TY.js → diagnostics-OMN5Y2AH.js} +2 -2
- package/dist/{display-name-hint-DMORHANO.js → display-name-hint-ZJGFNJKQ.js} +12 -12
- package/dist/{emit-hOFbgzde.d.ts → emit-D125xxty.d.ts} +67 -21
- package/dist/env-example-refresh-CQP3ZMKM.js +133 -0
- package/dist/{env-pull-command-WZZ7RL2E.js → env-pull-command-UTG6IC2K.js} +53 -53
- package/dist/{env-target-PO3MOLH5.js → env-target-FZROWYFS.js} +14 -14
- package/dist/{env-var-command-YKTJZFJN.js → env-var-command-VYDBQJJW.js} +51 -50
- package/dist/{ephemeral-BMFY55BQ.js → ephemeral-BIE6FMJV.js} +10 -10
- package/dist/{ephemeral-command-VDSQCOYL.js → ephemeral-command-OZ26RGXF.js} +54 -54
- package/dist/{ephemeral-state-6TY4JIPA.js → ephemeral-state-SNZOX2YK.js} +12 -12
- package/dist/{generate-command-3NTNRQRS.js → generate-command-4HR7MR36.js} +87 -79
- package/dist/{gitignore-FWPEDX6C.js → gitignore-EWQBXNX2.js} +20 -19
- package/dist/{guards-EJU2ONAX.js → guards-KYEOCVHN.js} +7 -7
- package/dist/{hosted-file-PSHJB3HX.js → hosted-file-S7YUQAH6.js} +2 -2
- package/dist/{impersonate-command-QEJA72Q2.js → impersonate-command-WC7OGKUM.js} +44 -43
- package/dist/{import-TBTOTU52.js → import-7Z4GCCPO.js} +6 -6
- package/dist/index.d.ts +14 -20
- package/dist/index.js +14 -14
- package/dist/init-command-HAO3WXH3.js +128 -0
- package/dist/{init-modules-HZRQFRLE.js → init-modules-NSKD4ASY.js} +12 -11
- package/dist/{init-web-Y2PBNJTQ.js → init-web-MKFFOQUU.js} +3 -3
- package/dist/internal.d.ts +5 -5
- package/dist/internal.js +61 -35
- package/dist/{io-ZUKAGFVE.js → io-PGTCBSIQ.js} +7 -5
- package/dist/{keep-data-merge-X5LDDCI3.js → keep-data-merge-QR2TMKEO.js} +33 -34
- package/dist/{lambda-config-reconcile-OUZ4OYAB.js → lambda-config-reconcile-7FJXXV6V.js} +4 -4
- package/dist/{landed-6VO7CX5P.js → landed-F7PCHGCK.js} +4 -4
- package/dist/{landing-record-QYECWLQ5.js → landing-record-MWXFIRCP.js} +26 -25
- package/dist/{live-diff-2S7E3SBZ.js → live-diff-5E2BQWQ7.js} +10 -9
- package/dist/local-engine-choice-VD5LNXJU.js +80 -0
- package/dist/{local-engine-command-HMTQK7MN.js → local-engine-command-RYLGMQ2O.js} +96 -95
- package/dist/{local-engine-config-5U3SC434.js → local-engine-config-W3KB7RWM.js} +2 -2
- package/dist/{local-engine-deploy-TXAOYRGF.js → local-engine-deploy-6O7NKZCA.js} +17 -17
- package/dist/{local-engine-process-6VZ7JJBP.js → local-engine-process-ZLLZEIRF.js} +12 -12
- package/dist/{local-engine-state-TJWPWCC4.js → local-engine-state-OCW5YDD7.js} +3 -3
- package/dist/{local-engine-update-check-R5SPDVEJ.js → local-engine-update-check-LVX4HBBI.js} +8 -8
- package/dist/{lock-TS465GVY.js → lock-HDCHD2ON.js} +5 -3
- package/dist/{lock-commands-4VT3L5W5.js → lock-commands-X2OECR4R.js} +62 -61
- package/dist/{login-command-O6WA4FYL.js → login-command-RLLKD565.js} +31 -30
- package/dist/{logout-command-6CPWGFY2.js → logout-command-XDMSXCDO.js} +17 -17
- package/dist/{loop-UFHKSOQ4.js → loop-SUB6C2LK.js} +9 -10
- package/dist/{marketplace-command-HKACSYKS.js → marketplace-command-2NHHY2X3.js} +89 -53
- package/dist/{marketplace-resolve-KLFYVRWS.js → marketplace-resolve-OTZYT4FG.js} +9 -8
- package/dist/{meta-client-73PX6UGJ.js → meta-client-TMHVBZFY.js} +15 -15
- package/dist/{module-manifest-GIKFNXPE.js → module-manifest-FNMW23IX.js} +7 -4
- package/dist/node.d.ts +5 -5
- package/dist/node.js +63 -63
- package/dist/operation-outcome-RN62735X.js +51 -0
- package/dist/{output-target-SZMBNYF4.js → output-target-MOLCTPBP.js} +21 -20
- package/dist/{package-manager-PRAHUSCN.js → package-manager-K762W7XT.js} +2 -2
- package/dist/{plan-disclosure-BHYG7TZ7.js → plan-disclosure-CY7AF6KP.js} +21 -22
- package/dist/{plugin-contributions-X4V22PJQ.js → plugin-contributions-WR26U7NT.js} +6 -6
- package/dist/{plugin-prompt-DKNQHW6Y.js → plugin-prompt-ZUYQQIX4.js} +5 -5
- package/dist/{plugin-questions-CQRVOWFK.js → plugin-questions-HAZOQ67R.js} +4 -4
- package/dist/plugin.d.ts +254 -10
- package/dist/{preflight-command-EBQ6XQF3.js → preflight-command-OHJXYND3.js} +70 -70
- package/dist/{profile-command-NPKBJYPM.js → profile-command-6JWT2BTL.js} +33 -32
- package/dist/{profile-pointer-UOO7JNFG.js → profile-pointer-PDA5XBIB.js} +5 -5
- package/dist/{profile-select-74TRDEPD.js → profile-select-45G5VPJK.js} +2 -2
- package/dist/{project-dependency-RRMTWOPC.js → project-dependency-GZWWGWEW.js} +13 -10
- package/dist/{project-sdk-FOR4IOXL.js → project-sdk-3W72H5QO.js} +4 -4
- package/dist/promote-command-UYAMUXKB.js +146 -0
- package/dist/{prompt-5GUQTCSP.js → prompt-U37K5RPQ.js} +4 -4
- package/dist/{publish-command-LGLZBOCB.js → publish-command-BUS27HGB.js} +138 -66
- package/dist/pull-command-ZGUNP27P.js +168 -0
- package/dist/{pull-superseded-GGURV5J3.js → pull-superseded-EZBGYRZF.js} +4 -4
- package/dist/{raw-where-EoWl5fqY.d.ts → raw-where-ZMLND6AG.d.ts} +20 -3
- package/dist/release-command-BQ6OHS3P.js +150 -0
- package/dist/{release-ns-command-EIBN3JVM.js → release-ns-command-ATGVBVIU.js} +94 -94
- package/dist/{retry-command-Y5YJGOH3.js → retry-command-QJ57WVW7.js} +9 -9
- package/dist/{routes-manifest-3BNZIVST.js → routes-manifest-YR4ZIMLM.js} +16 -8
- package/dist/routes-manifest-file-UALYSZLY.js +41 -0
- package/dist/scaffold.js +3 -3
- package/dist/{secrets-file-FUG7WCES.js → secrets-file-LMS7KX3E.js} +20 -19
- package/dist/{secrets-fill-command-QEOCUOAY.js → secrets-fill-command-QNBDGCGM.js} +61 -60
- package/dist/{seed-GJHJSEUE.js → seed-SZ6OS5DQ.js} +9 -9
- package/dist/{source-resolve-DMDZVPMM.js → source-resolve-MKLNYFWG.js} +24 -24
- package/dist/{static-host-WM24RG25.js → static-host-ONEHA4LI.js} +10 -10
- package/dist/{status-command-XUH5OGQX.js → status-command-XKIFKBGM.js} +57 -56
- package/dist/{store-CfgPaVPO.d.ts → store-Bg4Na6Sm.d.ts} +4 -4
- package/dist/{store-MR7IKXKK.js → store-X6ZH7EC3.js} +7 -7
- package/dist/sveltekit.d.ts +5 -5
- package/dist/sveltekit.js +1 -1
- package/dist/sync-baseline-DOV5AGIO.js +36 -0
- package/dist/{sync-contributions-DHP7XSTX.js → sync-contributions-HNVHDIQW.js} +21 -13
- package/dist/sync-record-PRXHLK4S.js +42 -0
- package/dist/{table-ZBDPKMNH.js → table-DC36QA4Y.js} +10 -10
- package/dist/{tables-command-X3JK7VSK.js → tables-command-UQLKTELN.js} +44 -43
- package/dist/{tenant-GKXMOYLK.js → tenant-EKNQGG5A.js} +11 -11
- package/dist/{tenant-command-P27EQHBU.js → tenant-command-2LWP2MPB.js} +105 -100
- package/dist/{test-command-A4G2FP7G.js → test-command-IU5MBBXY.js} +44 -43
- package/dist/{tests-C55M5EQS.js → tests-RG2Y5EQ4.js} +7 -7
- package/dist/{token-CMAB35GD.js → token-7AWSJLKO.js} +13 -13
- package/dist/toolchain-hooks-4ZMQLBPQ.js +46 -0
- package/dist/{toolchain-modules-3M7QDJBV.js → toolchain-modules-VU7SURVJ.js} +9 -6
- package/dist/toolchain-peers-CIDNEEQV.js +28 -0
- package/dist/tracked-backend-4BHSV7NC.js +81 -0
- package/dist/{update-check-LNNKIMML.js → update-check-A7FXIINW.js} +60 -59
- package/dist/{upgrade-command-7EUXML3P.js → upgrade-command-C5KBITFI.js} +64 -63
- package/dist/{whoami-command-KNWFWAX6.js → whoami-command-7WQII2H4.js} +16 -16
- package/dist/{workspace-TGPYOODG.js → workspace-Z46PUZNI.js} +6 -6
- package/dist/{workspace-binding-2TWZBHQY.js → workspace-binding-JE6YNDZJ.js} +15 -15
- package/dist/{workspace-command-T7Z2BDHD.js → workspace-command-FC4IMLAE.js} +119 -88
- package/dist/{workspace-env-VA7XN3UX.js → workspace-env-N4ZPFT6A.js} +17 -16
- package/dist/{workspace-export-AIGM6LC7.js → workspace-export-3A5BZTPS.js} +6 -6
- package/dist/{writable-FYJBTJOU.js → writable-D7KCZI5N.js} +4 -4
- package/dist/{xano-BSHYVFSE.js → xano-LCI7VWPS.js} +9 -9
- package/dist/{xanosdk-import-J6SRBZHW.js → xanosdk-import-P2A2KSXM.js} +10 -10
- package/dist/xanosdk-project-6AGMW2SL.js +42 -0
- package/guides/README.md +1 -0
- package/guides/authoring.md +3 -5
- package/guides/bundle.md +45 -0
- package/guides/cli.md +36 -34
- package/guides/codegen.md +5 -4
- package/guides/codes.md +16 -11
- package/guides/deploying.md +115 -58
- package/guides/environment.md +13 -13
- package/guides/marketplace.md +21 -0
- package/guides/module-contract.md +80 -4
- package/guides/project-structure.md +14 -0
- package/guides/typed-frontend.md +37 -0
- package/llms/client.md +14 -5
- package/llms/errors.md +1 -1
- package/llms/filters.md +4 -0
- package/llms/kinds-core.md +1 -1
- package/llms/statements-data.md +3 -2
- package/llms/tests.md +2 -2
- package/llms/toolchain.md +12 -0
- package/llms-full.txt +47 -21
- package/llms.txt +10 -10
- package/manifest.json +110 -107
- package/package.json +4 -4
- package/dist/agent-file-refresh-LB6KIMFY.js +0 -38
- package/dist/chunk-XXZZGXW2.js +0 -243
- package/dist/deploy-source-5CET3A5D.js +0 -81
- package/dist/env-example-refresh-ZO6XAV44.js +0 -127
- package/dist/init-command-27SFBW2F.js +0 -126
- package/dist/local-engine-choice-6BSPEG3E.js +0 -79
- package/dist/operation-outcome-2P4BVSEV.js +0 -51
- package/dist/promote-command-4F2NAE6P.js +0 -141
- package/dist/pull-command-WQFPLITW.js +0 -162
- package/dist/release-command-2OTNVMIL.js +0 -147
- package/dist/toolchain-hooks-BGZBDFAT.js +0 -96
- package/dist/tracked-backend-PZGUWD5J.js +0 -80
- package/dist/xanosdk-project-6KTCO47O.js +0 -41
package/guides/deploying.md
CHANGED
|
@@ -89,15 +89,15 @@ processes at once.
|
|
|
89
89
|
> **Upgrading:** a file written before profiles is read as the `default` profile with no
|
|
90
90
|
> action needed. It is rewritten in the new shape the next time something writes to it.
|
|
91
91
|
|
|
92
|
-
**Project-local credentials** — pass `--local` to `login` to cache tokens in a
|
|
92
|
+
**Project-local credentials** — pass `--local-auth` to `login` to cache tokens in a
|
|
93
93
|
**project-local** `./.xano/auth.json` instead (which `login` **auto-adds to `.gitignore`**),
|
|
94
94
|
scoping the sign-in to that directory. Every command that **reads** credentials
|
|
95
95
|
(`deploy`/`details`, `whoami`, token refresh) resolves them **project-local first, global
|
|
96
96
|
as a fallback**: it uses `./.xano/auth.json` when present, otherwise `~/.xanosdk/auth.json` —
|
|
97
|
-
so a `--local` project keeps working without repeating the flag. `login` and `logout` do
|
|
98
|
-
**not** fall back: they target the shared global cache unless you pass `--local`. A `logout`
|
|
97
|
+
so a `--local-auth` project keeps working without repeating the flag. `login` and `logout` do
|
|
98
|
+
**not** fall back: they target the shared global cache unless you pass `--local-auth`. A `logout`
|
|
99
99
|
naming a profile that only `./.xano/auth.json` holds exits 8 (not found in the shared file)
|
|
100
|
-
and names `xanosdk logout --local -p <name>` — it does not report the session as gone. A
|
|
100
|
+
and names `xanosdk logout --local-auth -p <name>` — it does not report the session as gone. A
|
|
101
101
|
logout clears stored profiles only: with the `XANO_*` credential variables still set, it
|
|
102
102
|
says so, and commands keep authenticating with them. An explicit
|
|
103
103
|
`--config`/`$XANO_CONFIG` wins over both default file locations; only the three-variable
|
|
@@ -113,7 +113,7 @@ as JSON, while the human-readable progress (and the live URLs) echoes to stderr:
|
|
|
113
113
|
|
|
114
114
|
```jsonc
|
|
115
115
|
{
|
|
116
|
-
"kind": "ephemeral", // or "local
|
|
116
|
+
"kind": "ephemeral", // or "local"
|
|
117
117
|
"destination": { // the PARENT it was created under, then the environment itself
|
|
118
118
|
"instance": "https://x.xano.io", "workspaceId": 1, "kind": "ephemeral",
|
|
119
119
|
"label": "ezm0-xkdq-6564", "url": "https://x.xano.io/tenant/ezm0-xkdq-6564",
|
|
@@ -144,7 +144,7 @@ again, when the suite could not be run — exit 6 — and `unreachable`, the tes
|
|
|
144
144
|
(as `test run` takes them), when it stopped answering part-way; the same `N passed, M failed,
|
|
145
145
|
K not run` line `test run-all` prints closes the run), `landingRecord` (`{ destination, file,
|
|
146
146
|
recorded, changed, cleared }`: what this deploy recorded as landed, the scope of a later
|
|
147
|
-
`--prune`; `null` for a
|
|
147
|
+
`--prune`; `null` for a Xano Engine), `staticRemoved` (`{ urls, verified }`: the frontends a replace took down, below),
|
|
148
148
|
`notApplied` (flags accepted and not acted on — `--expires-hours` on an ephemeral that already
|
|
149
149
|
exists), `unconfigured`, and `passwordHashesUnverifiable` (below). The raw
|
|
150
150
|
workspace blob is deliberately never dumped: it carries per-tenant secrets that must not land
|
|
@@ -152,8 +152,8 @@ in shell history or CI logs.
|
|
|
152
152
|
|
|
153
153
|
`xanosdk test run-all --json` (and `test run`, `test list`) writes the same per-test entries at
|
|
154
154
|
the top level, beside the backend they ran on: `kind`, `env` (the ephemeral's or tenant's handle;
|
|
155
|
-
`null` for a
|
|
156
|
-
same handle on an ephemeral or tenant, the engine's name on a
|
|
155
|
+
`null` for a Xano Engine or a workspace), `name` (the backend's own name whatever its kind — the
|
|
156
|
+
same handle on an ephemeral or tenant, the engine's name on a Xano Engine) and `display` (its display
|
|
157
157
|
name), each always present, `null` where the backend has none. When the suite stops answering
|
|
158
158
|
part-way, the rest are not started and the run exits 6 with a failure document whose
|
|
159
159
|
`details.results` is that document — `total` the whole suite, `notRun` and `unreachable` the tests
|
|
@@ -169,8 +169,8 @@ out and named (`--env-var GREETING`) — pass them again, or keep them in `xano/
|
|
|
169
169
|
`xano/.secrets.json`, which a deploy reads. The same text is the `--json` error's `message`.
|
|
170
170
|
|
|
171
171
|
**Where it goes** — the instance your **token is bound to** (the token's `aud`), never a
|
|
172
|
-
flag. `xanosdk deploy` create-or-refreshes an **ephemeral
|
|
173
|
-
|
|
172
|
+
flag. `xanosdk deploy --ephemeral` create-or-refreshes an **ephemeral**; a bare `xanosdk deploy`
|
|
173
|
+
runs the code on the Xano Engine on this machine instead ([below](#deploying-locally)). Reaching your real workspace is the separate release flow: cut a release from
|
|
174
174
|
what ran, then `xanosdk promote <release>` lands it there as a new branch, leaving live
|
|
175
175
|
untouched until you say otherwise.
|
|
176
176
|
|
|
@@ -250,10 +250,10 @@ step, without re-importing the backend.
|
|
|
250
250
|
directory and nothing else: no compile, no backend import. `--to` picks the destination —
|
|
251
251
|
`ephemeral[:<name>]`, `workspace`, or `tenant:<name>`; left off, the backend this project last
|
|
252
252
|
deployed to — and a workspace or tenant asks before replacing what its users are served
|
|
253
|
-
(`--yes` in CI).
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
which rebuilds first.
|
|
253
|
+
(`--yes` in CI). After a local deploy it publishes to that engine (`--to local`
|
|
254
|
+
names it), server half included — the upload `xanosdk deploy --local --static <dir>`
|
|
255
|
+
makes, without re-importing the backend (below). Scaffolded projects carry it as
|
|
256
|
+
`npm run xano:deploy:frontend`, which rebuilds first.
|
|
257
257
|
|
|
258
258
|
```bash
|
|
259
259
|
xanosdk promote v2 --set-live # the backend, landed and live
|
|
@@ -402,6 +402,12 @@ Add your own public config (base URLs, *publishable* keys) with `--static-env KE
|
|
|
402
402
|
verbatim to the browser, so everything injected is **public** — never put secrets here;
|
|
403
403
|
those belong in backend env, read server-side via `env(name)`.
|
|
404
404
|
|
|
405
|
+
**Your dev server follows the deploy.** In a scaffolded project, a deploy that publishes no static site writes the backend
|
|
406
|
+
URL into the project's gitignored `.env.local` as `VITE_XANO_HOST`, in a marked block that leaves your own values alone and
|
|
407
|
+
is replaced rather than repeated next time. **Restart the dev server to pick it up.** `--no-dev-env` turns it off, and so
|
|
408
|
+
do `--static <dir>` and a site an earlier deploy published there that still serves — a frontend reads the URL at runtime. A `.env.local` your repo does not ignore is
|
|
409
|
+
reported, never written.
|
|
410
|
+
|
|
405
411
|
**Showing a stored file.** A file column comes back as `{ path, name, type, size, meta,
|
|
406
412
|
access, url }`. Don't use its `url`: on a tenant-scoped environment that field addresses the
|
|
407
413
|
instance host *without* the `/tenant/<name>` segment and 404s — as a broken `<img>`, while
|
|
@@ -425,20 +431,20 @@ retrying the bare URL.
|
|
|
425
431
|
|
|
426
432
|
## Deploy targets, and what a release changes
|
|
427
433
|
|
|
428
|
-
**
|
|
434
|
+
**Disposable targets and real ones**, so the dev loop and the production step stay distinct:
|
|
429
435
|
|
|
430
436
|
| Command | Where it goes |
|
|
431
437
|
|---|---|
|
|
432
|
-
| `xanosdk deploy` |
|
|
438
|
+
| `xanosdk deploy` | The **Xano Engine** on this machine — the default, with no flag and no Xano account needed ([below](#deploying-locally)). `--local` spells it out. |
|
|
439
|
+
| `xanosdk deploy --ephemeral` | A disposable **ephemeral** environment on Xano's cloud — create-or-refreshed each run, auto-expiring, with its own URL. |
|
|
433
440
|
| `xanosdk promote <release>` | Your **main Xano instance** workspace — the production target. Lands a release on a branch named for it (`--set-live` serves it). Its table changes reach live as it lands — see [what a landing does to tables](#what-a-landing-does-to-tables). |
|
|
434
441
|
| `xanosdk tenant deploy <tenant> <release>` | A **customer tenant** — the same release, landed on someone else's deployment. It **replaces** what the tenant serves: anything the release does not carry is removed. Static hosting is kept. |
|
|
435
442
|
| `xanosdk deploy --to <dest>` | The **escape hatch**: merges a local build straight into `workspace` or `tenant:<name>`, skipping the release record. |
|
|
436
|
-
| `xanosdk
|
|
437
|
-
| `xanosdk test` | Nothing — it only reads. Runs the tests an already-deployed backend carries; `--on` picks which one, `local-engine` and `workspace` included. |
|
|
443
|
+
| `xanosdk test` | Nothing — it only reads. Runs the tests an already-deployed backend carries; `--on` picks which one, `local` and `workspace` included. |
|
|
438
444
|
|
|
439
|
-
Not every instance has ephemeral environments enabled. Where they are off, `deploy`
|
|
440
|
-
and names who can turn them on
|
|
441
|
-
|
|
445
|
+
Not every instance has ephemeral environments enabled. Where they are off, `deploy --ephemeral`
|
|
446
|
+
says so and names who can turn them on. A bare `deploy` (the Xano Engine), `xanosdk export` and
|
|
447
|
+
`xanosdk preflight` still work meanwhile.
|
|
442
448
|
|
|
443
449
|
Every `deploy` is a **full replace** of the disposable environment — always fresh — unless
|
|
444
450
|
you pass `--keep-data`. Landing somewhere real is the opposite by design: it changes what
|
|
@@ -454,7 +460,7 @@ object in `details.outOfScope`, and the rerun with `--yes` printed).
|
|
|
454
460
|
|
|
455
461
|
### Keeping your data between deploys
|
|
456
462
|
|
|
457
|
-
`xanosdk deploy --keep-data` redeploys to your ephemeral or
|
|
463
|
+
`xanosdk deploy --keep-data` redeploys to your ephemeral or Xano Engine by **merging** into
|
|
458
464
|
what an earlier deploy put there, instead of replacing it. Code and schema changes land,
|
|
459
465
|
objects removed from the project are deleted, and the rows already in the tables stay. Seed
|
|
460
466
|
rows are not written again.
|
|
@@ -469,7 +475,7 @@ and exits 0, as any declined confirmation does). Without one the
|
|
|
469
475
|
merge is refused before it writes, as `--prune` refuses the same deletion:
|
|
470
476
|
`SDK_PRUNE_OUT_OF_SCOPE`, exit 2, each object in `details.outOfScope` as `{ type, name, label }`
|
|
471
477
|
(the shape `deploy --to --prune` uses), and the rerun with `--yes` printed. A merge that goes ahead names them in `--json`'s `notLanded`. The scaffolded
|
|
472
|
-
`npm run xano:deploy
|
|
478
|
+
`npm run xano:deploy` passes it, so the rows you enter through your app survive
|
|
473
479
|
every code change.
|
|
474
480
|
|
|
475
481
|
It merges only into an environment an earlier deploy **finished** filling. Otherwise it
|
|
@@ -535,7 +541,7 @@ the name back restores them. Columns are named
|
|
|
535
541
|
The limits, in one place: rows survive only in tables and columns that keep their identity
|
|
536
542
|
(a table renamed through `xanosdk lock rename` keeps its rows; an unrecorded rename is refused,
|
|
537
543
|
below); changed env values and a new table's seeds need `--reset`;
|
|
538
|
-
a
|
|
544
|
+
a Xano Engine's rows last as long as its process (an engine update restarts it empty, and the
|
|
539
545
|
next run seeds); and a test whose `datasource` is `"live"`
|
|
540
546
|
sees the kept rows, not only the seed fixtures.
|
|
541
547
|
|
|
@@ -602,24 +608,24 @@ Another import already running on the instance is not a refusal of the project:
|
|
|
602
608
|
`--to` already merges, so `--keep-data --to` is refused; the flags that only mean something
|
|
603
609
|
with `--to` (`--seed`, `--prune`, `--dry-run`, …) stay refused alongside it.
|
|
604
610
|
|
|
605
|
-
### Deploying
|
|
611
|
+
### Deploying locally
|
|
606
612
|
|
|
607
|
-
`xanosdk deploy --local
|
|
613
|
+
`xanosdk deploy --local` deploys to an engine running on this machine instead of an
|
|
608
614
|
ephemeral — no network round-trip per deploy. It needs nothing configured:
|
|
609
615
|
|
|
610
616
|
- **The first run** resolves the latest published engine for this machine's platform,
|
|
611
617
|
downloads it, checks it against the sha256 its release recorded, and **pins** that version in
|
|
612
|
-
your `package.json` under `"xanosdk": { "@xano/sdk": { "
|
|
618
|
+
your `package.json` under `"xanosdk": { "@xano/sdk": { "engine": "vX.Y.Z" } }` —
|
|
613
619
|
creating a `package.json` holding only that pin when the project has none. Commit that change —
|
|
614
620
|
every checkout of the project then runs the same engine.
|
|
615
621
|
- **Every later run** uses the pinned version, whatever is newest. Each version downloads once
|
|
616
622
|
per machine and is shared by every project on it (`~/.xanosdk/local-engine`, or
|
|
617
|
-
`
|
|
623
|
+
`XANOSDK_ENGINE_HOME`); a cached pin deploys with no network access.
|
|
618
624
|
- **A newer engine** is announced on each deploy (checked at most once an hour; opt out with
|
|
619
625
|
`XANOSDK_NO_UPDATE_CHECK=1`). In an interactive terminal the deploy asks whether to update,
|
|
620
626
|
defaulting to no — a version you declined is only noted afterwards, not asked again. In CI,
|
|
621
627
|
piped output or `--json` it prints a one-line notice and keeps the pin. The pin never moves
|
|
622
|
-
without a yes or an explicit `xanosdk local
|
|
628
|
+
without a yes or an explicit `xanosdk local update`.
|
|
623
629
|
- **A running engine on a different version** than the one the project now resolves to — after
|
|
624
630
|
an update, or after a teammate moved the pin — is stopped and replaced, and the deploy says
|
|
625
631
|
so.
|
|
@@ -629,33 +635,32 @@ ephemeral — no network round-trip per deploy. It needs nothing configured:
|
|
|
629
635
|
keeps the one-hour default; its `--ttl <duration>` flag changes it.
|
|
630
636
|
|
|
631
637
|
An engine update restarts the engine, and a restarted engine starts **empty**: the next
|
|
632
|
-
`--keep-data` run (which the scaffolded `npm run xano:deploy
|
|
638
|
+
`--keep-data` run (which the scaffolded `npm run xano:deploy` passes) seeds it
|
|
633
639
|
rather than merging, so rows entered through your app do not survive the upgrade.
|
|
634
640
|
|
|
635
|
-
**Operating on it.** After a local
|
|
641
|
+
**Operating on it.** After a local deploy, the engine is the backend this project
|
|
636
642
|
tracks, so bare `xanosdk test run-all`, `env set`, `env pull`, `tables`, `impersonate` and
|
|
637
|
-
`status` reach it — none of them needs a Xano account. Name it explicitly as `local
|
|
638
|
-
or `local
|
|
639
|
-
[the CLI guide](cli.md#naming-a-backend)).
|
|
640
|
-
|
|
641
|
-
`--to ephemeral`) and `release create`
|
|
643
|
+
`status` reach it — none of them needs a Xano account. Name it explicitly as `local`,
|
|
644
|
+
or `local:<name>` for another one from `xanosdk local list` (the full grammar is in
|
|
645
|
+
[the CLI guide](cli.md#naming-a-backend)). `publish` puts a built frontend on it without
|
|
646
|
+
re-importing the backend. One command cannot serve it and refuses it by name: `release create`
|
|
642
647
|
(the cut runs on the instance — pass `--from ephemeral`).
|
|
643
648
|
|
|
644
649
|
| Command | What it does |
|
|
645
650
|
|---|---|
|
|
646
|
-
| `xanosdk local
|
|
647
|
-
| `xanosdk local
|
|
648
|
-
| `xanosdk local
|
|
651
|
+
| `xanosdk local update` | Moves the pin to the latest engine (`--version <v>`: that one, downgrades included), downloads it, and restarts the project's running engine on it. Commit `package.json`. |
|
|
652
|
+
| `xanosdk local cache list` | Each cached engine version, its size on disk, and the engines running on it. |
|
|
653
|
+
| `xanosdk local cache clear` | Removes every cached engine (`--version <v>`: just that one). An engine running on a removed version is stopped first; the next deploy fetches it again. |
|
|
649
654
|
|
|
650
|
-
#### A frontend on the
|
|
655
|
+
#### A frontend on the Xano Engine, and server rendering
|
|
651
656
|
|
|
652
|
-
`xanosdk deploy <entry> --local
|
|
657
|
+
`xanosdk deploy <entry> --local --static <dir>` publishes a built frontend to the
|
|
653
658
|
engine's own static host after the import, as on an ephemeral, and reports it as `static.url`:
|
|
654
659
|
`http://<prefix>.localhost:<port>`. Chrome, Firefox and Safari 26 resolve `*.localhost` to this
|
|
655
660
|
machine by themselves (Safari on macOS 15 and earlier does not); a tool that does not resolve it
|
|
656
661
|
can call the engine's own URL with a `Host: <prefix>.localhost:<port>` header. The engine needs a release
|
|
657
662
|
that hosts static sites: an older one answers the upload with a 501, which the deploy reports
|
|
658
|
-
without failing the backend (exit `3`), and `xanosdk local
|
|
663
|
+
without failing the backend (exit `3`), and `xanosdk local update` moves the pin on.
|
|
659
664
|
|
|
660
665
|
The engine hosts built output only, and refuses a build of more than 20,000 files or 256 MB unpacked.
|
|
661
666
|
The deploy checks both before the import, so an oversize directory stops the run with nothing
|
|
@@ -681,7 +686,7 @@ that keeps a `svelte.config.js`.
|
|
|
681
686
|
|
|
682
687
|
`vite build` then writes the client assets and prerendered pages at the output's root, a
|
|
683
688
|
`404.html` fallback shell, and the server half in `.xano-ssr/`. Deployed with
|
|
684
|
-
`--local
|
|
689
|
+
`--local --static <that directory>`, the engine serves the files as files and renders every other
|
|
685
690
|
path (a dynamic route, `__data.json`, a form action) through the server half, so a crawler that
|
|
686
691
|
fetches `/products/lamp` gets that product's own `<title>` and meta tags. A server `load` reads
|
|
687
692
|
the engine's own URL as `XANO_HOST` from `$env/dynamic/private`:
|
|
@@ -718,20 +723,20 @@ there instead (and says so in the build log), so that route boots — an unknown
|
|
|
718
723
|
|
|
719
724
|
The cache above holds the engine **binaries**. A running engine keeps its own **runtime data** —
|
|
720
725
|
its unpacked runtime files, its logs, and the records of running engines — beside them, under
|
|
721
|
-
`engine/` in the same directory (`~/.xanosdk/local-engine`, or `
|
|
726
|
+
`engine/` in the same directory (`~/.xanosdk/local-engine`, or `XANOSDK_ENGINE_HOME`): in
|
|
722
727
|
`engine/Library/Caches` on macOS and `engine/.cache` on Linux, the directory holding `dist`,
|
|
723
728
|
`instances` and `logs` folders. Its `logs` folder holds one file per engine start; a start that
|
|
724
729
|
fails names it.
|
|
725
730
|
|
|
726
731
|
Expect it to reach roughly 600 MB after the first deploy, and to grow by a similar amount for
|
|
727
|
-
each engine version you run, since every version unpacks its own copy. `xanosdk local
|
|
728
|
-
list` shows its size, and `xanosdk local
|
|
732
|
+
each engine version you run, since every version unpacks its own copy. `xanosdk local cache
|
|
733
|
+
list` shows its size, and `xanosdk local cache clear` (with no `--version`) removes it with the
|
|
729
734
|
engines once none is running — it names any engine still up; stop it and clear again. The next
|
|
730
735
|
deploy recreates what it needs.
|
|
731
736
|
|
|
732
737
|
Versions before this layout unpacked the same runtime into your own per-user cache directory.
|
|
733
738
|
Nothing runs from that copy now; `cache list` shows it when it is there, and
|
|
734
|
-
`xanosdk local
|
|
739
|
+
`xanosdk local cache clear --legacy-runtime` removes it after asking (`--yes` without a
|
|
735
740
|
terminal).
|
|
736
741
|
|
|
737
742
|
#### Running a different engine without moving the pin
|
|
@@ -739,9 +744,9 @@ terminal).
|
|
|
739
744
|
To try an experimental build, or a published version the project hasn't moved to, override the
|
|
740
745
|
pin for your own runs instead of editing `package.json`:
|
|
741
746
|
|
|
742
|
-
- `--local
|
|
743
|
-
- `
|
|
744
|
-
`npm run xano:deploy
|
|
747
|
+
- `--local=<value>` for one deploy;
|
|
748
|
+
- `XANOSDK_ENGINE_OVERRIDE=<value>` for every deploy in this shell, including
|
|
749
|
+
`npm run xano:deploy`, which passes a bare flag.
|
|
745
750
|
|
|
746
751
|
Both take a **version** (`v0.1.8`, or `0.1.8`: that release from the release manager), an
|
|
747
752
|
**`https` URL** to an engine archive, or the **path** to an engine archive on this machine. A
|
|
@@ -758,24 +763,24 @@ next `--keep-data` run seeds it); unset the variable and the next deploy goes ba
|
|
|
758
763
|
engine the same way.
|
|
759
764
|
|
|
760
765
|
```bash
|
|
761
|
-
export
|
|
762
|
-
npm run xano:deploy
|
|
763
|
-
unset
|
|
766
|
+
export XANOSDK_ENGINE_OVERRIDE=~/Downloads/engine-experimental.tar.gz
|
|
767
|
+
npm run xano:deploy # runs the experimental build; package.json untouched
|
|
768
|
+
unset XANOSDK_ENGINE_OVERRIDE # next deploy is back on the pinned version
|
|
764
769
|
```
|
|
765
770
|
|
|
766
|
-
`
|
|
771
|
+
`XANOSDK_ENGINE_TOKEN`, when set, is sent only to an override URL's host.
|
|
767
772
|
`XANOSDK_ENGINE_RELEASES_URL` points version lookups at a different engine release service. Its
|
|
768
773
|
engines are downloaded fresh on every deploy and kept apart from the version cache, and the
|
|
769
774
|
deploy runs its latest without reading or writing the pin or checking for updates;
|
|
770
|
-
`xanosdk local
|
|
775
|
+
`xanosdk local update` refuses while it is set.
|
|
771
776
|
|
|
772
777
|
### The release flow
|
|
773
778
|
|
|
774
779
|
This is the path to a real destination. Each step leaves something the next one can name:
|
|
775
780
|
|
|
776
781
|
```bash
|
|
777
|
-
xanosdk deploy ./xano/index.ts --test # 1. stand it up on an ephemeral, run its tests
|
|
778
|
-
xanosdk release create v1 # 2. cut a release from what just ran (after a local
|
|
782
|
+
xanosdk deploy ./xano/index.ts --ephemeral --test # 1. stand it up on an ephemeral, run its tests
|
|
783
|
+
xanosdk release create v1 # 2. cut a release from what just ran (after a local deploy: --from ephemeral)
|
|
779
784
|
xanosdk promote v1 # 3. land it in your workspace, on a branch named for it
|
|
780
785
|
xanosdk tenant deploy acme v1 # …or on a customer tenant
|
|
781
786
|
```
|
|
@@ -982,7 +987,7 @@ instead, so stdout is never empty. Branch on `code`, not on the message:
|
|
|
982
987
|
| `SDK_EXPORT_INVALID` | The workspace failed an export check, or `--strict` promoted a warning. | `details.diagnostics`: `{ severity, code, message }` per failed check; under `--strict`, every warning that fails it; `code` names the check, e.g. `seed.public-seed`; `details.warnings` beside it, empty when the run printed none |
|
|
983
988
|
| `SDK_CREDENTIAL_REJECTED` | The instance, or its sign-in server, refused the credential this run used: exit 1. The message names the sign-in that fixes it. | `details`: `{ profile, credentialType, instance, workspaceId, signIn }` (`profile` is `null` for an environment credential; `instance` and `workspaceId` are `null` for a refused `XANO_REFRESH_TOKEN`; `signIn` is `null` when the fix is a variable or an upgrade rather than a command) |
|
|
984
989
|
| `SDK_USAGE` | The command line was mistyped or incomplete — an unknown flag, a value on a flag that takes none, a flag without the one it needs (`--dry-run` without `--to`), a missing argument, a confirmation with no terminal to ask on, a local file or directory it names that does not exist: exit 1. | `suggestion`: the closest match, when one is close enough |
|
|
985
|
-
| `SDK_ERROR` | Any failure without a code of its own yet — including a NAMED thing that cannot be found (a backend, release, branch, static host, test, profile or
|
|
990
|
+
| `SDK_ERROR` | Any failure without a code of its own yet — including a NAMED thing that cannot be found (a backend, release, branch, static host, test, profile or Xano Engine version: exit 8). A network failure or a server error (5xx) is exit 8 before anything is written — the backend's lookup, a read-only command's read (`tables`, `test list`, `env pull`, `status`, `whoami`, `workspace details`, `workspace branch`'s list), a Xano Engine's release lookup or download, and `--keep-data`'s reads ahead of its merge (whether the environment can merge, its live read, the merge preview) got no answer or a 5xx; rerun as printed — and exit 1 at a later step that never reached it (an import that was not sent: nothing was written — retry). A `501` on `--keep-data`'s check is an answer, not an outage: that backend cannot merge, so it is exit 1 with the deploy that replaces instead. | `suggestion`: the near name a not-found one is one slip from, when there is one (`suggestions`: every one, when a command missed several) |
|
|
986
991
|
|
|
987
992
|
A piped stdout gets the document too, without `--json`, so a script reading the pipe never gets
|
|
988
993
|
an empty stdout. The exception is a command whose stdout is the data itself (`export` to stdout,
|
|
@@ -1238,6 +1243,58 @@ object with the same key *and* the same identity, so a lock cannot pin a guid th
|
|
|
1238
1243
|
never had. If none of the lock's identities appear in the source, that is what pointing a
|
|
1239
1244
|
project at an unrelated backend looks like, and the pull is refused unless you pass `--yes`.
|
|
1240
1245
|
|
|
1246
|
+
### Which side changed: the sync baseline
|
|
1247
|
+
|
|
1248
|
+
When a workspace and this project differ, `workspace diff` also says **which side moved** since
|
|
1249
|
+
they last matched. Every command that makes them match records a baseline in `xano.lock`, under
|
|
1250
|
+
`synced`. A baseline is one content digest per object, kept per workspace and per branch. The
|
|
1251
|
+
commands that record one are `deploy --to workspace`, a verified `promote`, `pull workspace`
|
|
1252
|
+
and `init --from workspace`. Commit it with the rest of the lock.
|
|
1253
|
+
|
|
1254
|
+
```bash
|
|
1255
|
+
xanosdk workspace diff ./xano/index.ts --json
|
|
1256
|
+
```
|
|
1257
|
+
|
|
1258
|
+
```jsonc
|
|
1259
|
+
{
|
|
1260
|
+
"matched": false,
|
|
1261
|
+
"differing": ["query:GET list (apiGroup orders)", "table:order"],
|
|
1262
|
+
"baseline": { "at": "2026-10-05T13:36:31.000Z", "by": "pull" },
|
|
1263
|
+
"changedThere": ["query:GET list (apiGroup orders)"], // edited in Xano since the baseline
|
|
1264
|
+
"changedHere": ["table:order"], // edited in this project since
|
|
1265
|
+
"changedBoth": [], // edited on both sides: a conflict
|
|
1266
|
+
"unclassified": [] // differs, direction unknown
|
|
1267
|
+
}
|
|
1268
|
+
```
|
|
1269
|
+
|
|
1270
|
+
- `changedThere`: pull before you deploy, or the deploy overwrites that edit.
|
|
1271
|
+
- `changedHere`: deploy it.
|
|
1272
|
+
- `changedBoth`: reconcile by hand.
|
|
1273
|
+
- `unclassified`: the baseline cannot tell. The object has no baseline entry, both sides
|
|
1274
|
+
already differed when it was taken, or it is the workspace's own settings row, which is
|
|
1275
|
+
never digested. A changed slug also shows only here, because digests leave slugs out.
|
|
1276
|
+
|
|
1277
|
+
Additions and deletions are classified as well. The baseline keeps this project's objects apart
|
|
1278
|
+
from the rest of the branch, so an object the project never held (another source's, or a section
|
|
1279
|
+
a pull does not write into `xano/`) is never reported as deleted here; it shows up only when it
|
|
1280
|
+
changes in Xano. An object that is new in Xano counts as `changedThere` only when the baseline is
|
|
1281
|
+
**complete**: a pull, an `init --from`, a verified
|
|
1282
|
+
`promote` and a `--replace` record every object on the branch, and so does a merge deploy
|
|
1283
|
+
that read the branch first. With no baseline for the branch, `baseline` is `null` and the
|
|
1284
|
+
four lists are empty. A run that finds the branch exactly as recorded leaves the lock alone.
|
|
1285
|
+
|
|
1286
|
+
A few things to know about the baseline:
|
|
1287
|
+
|
|
1288
|
+
- It records what the branch holds after the sync, read back from the branch where the command
|
|
1289
|
+
can do so, so an object stored differently from how it compiles is not reported as changed in
|
|
1290
|
+
Xano. It is recorded whoever's objects landed (a `--bundle` from elsewhere, a release another
|
|
1291
|
+
project cut), because it describes the branch, not ownership.
|
|
1292
|
+
- A baseline taken by a different SDK version under an older digest scheme is set aside
|
|
1293
|
+
(`baseline: null`) and replaced by the next sync, rather than read as every object changed.
|
|
1294
|
+
- An SDK older than this feature drops `synced` when it rewrites `xano.lock`. Nothing breaks: the
|
|
1295
|
+
next sync records a new baseline.
|
|
1296
|
+
- On a merge conflict in `xano.lock`, keep either side's baseline for a branch, or delete it.
|
|
1297
|
+
|
|
1241
1298
|
### Deploying to a branch
|
|
1242
1299
|
|
|
1243
1300
|
`--branch <label>` stages on a Xano branch instead of the live one, which is the safer shape
|
package/guides/environment.md
CHANGED
|
@@ -16,7 +16,7 @@ are what you get when the variable is unset.
|
|
|
16
16
|
| `XANO_META_TOKEN` | Meta API bearer token. With the two above it forms a complete credential that outranks every other source, reads no file, and never rotates. |
|
|
17
17
|
| `XANO_REFRESH_TOKEN` | OAuth refresh token for non-interactive runs (CI, agents). Paired with `XANO_CLIENT_ID`; the target instance comes from the token's own `aud` claim. Rotates on use — prefer the meta credential above. |
|
|
18
18
|
| `XANO_CLIENT_ID` | OAuth client id that goes with `XANO_REFRESH_TOKEN`. Both are copied once out of the profile in `auth.json` after a local `xanosdk login`. |
|
|
19
|
-
| `XANO_CONFIG` | Explicit path to the credential file. Wins over both default locations — the same thing `--config <path>` does. Refused beside `--local`, which names a different file. |
|
|
19
|
+
| `XANO_CONFIG` | Explicit path to the credential file. Wins over both default locations — the same thing `--config <path>` does. Refused beside `--local-auth`, which names a different file. |
|
|
20
20
|
| `XANO_PROFILE` | Which stored credential profile to act as, when no `--profile` names one. Outranked by the flag, by the project's `xano.profile.json` pin, and by an environment credential (which displaces it with a note on stderr). |
|
|
21
21
|
| `XANO_GLOBAL_CONFIG` | Moves the **shared** credential cache off `~/.xanosdk/auth.json`. Only changes where the global cache lives; the project-local `./.xano/auth.json` and the `XANO_CONFIG`/`--config` override are unaffected. |
|
|
22
22
|
| `XANO_CLIENT_FILE` | Moves the OAuth **client-registration** cache off `~/.xano/xanosdk-clients.json`. That file holds the `client_id` minted per auth host + redirect URI, not a credential. |
|
|
@@ -49,14 +49,14 @@ are what you get when the variable is unset.
|
|
|
49
49
|
| `XANOSDK_UPDATE_REGISTRY` | Registry URL the check reads, instead of the npm endpoint for `@xano/sdk`. |
|
|
50
50
|
| `XANOSDK_UPDATE_CACHE` | Moves the check's cache file off `~/.xanosdk/update-check.json`. |
|
|
51
51
|
|
|
52
|
-
**
|
|
52
|
+
**Xano Engine** (see [Deploying locally](deploying.md#deploying-locally))
|
|
53
53
|
|
|
54
54
|
| Variable | What it does |
|
|
55
55
|
|---|---|
|
|
56
|
-
| `
|
|
57
|
-
| `
|
|
58
|
-
| `
|
|
59
|
-
| `XANOSDK_ENGINE_RELEASES_URL` | A different engine release service for version lookups. Its engines are fetched fresh each deploy, the pin is not read or written, and `xanosdk local
|
|
56
|
+
| `XANOSDK_ENGINE_OVERRIDE` | An engine to run instead of the project's pinned one, for every `deploy --local` in this shell: a version (`v0.1.8`), an `https://` URL to an engine archive (plain `http://` only from this machine), or an archive path. A value on `--local=` beats it; it never reads or moves the pin. |
|
|
57
|
+
| `XANOSDK_ENGINE_TOKEN` | Bearer credential sent with an override URL's download — only to that URL's own origin, never to another host a redirect leads to. |
|
|
58
|
+
| `XANOSDK_ENGINE_HOME` | Moves everything the Xano Engine writes off `~/.xanosdk/local-engine`: the engine cache, the running-engine records, and the engine's own logs and runtime data — see [where the engine keeps its data](deploying.md#where-the-engine-keeps-its-data). |
|
|
59
|
+
| `XANOSDK_ENGINE_RELEASES_URL` | A different engine release service for version lookups. Its engines are fetched fresh each deploy, the pin is not read or written, and `xanosdk local update` refuses while it is set. |
|
|
60
60
|
|
|
61
61
|
**Escape hatches**
|
|
62
62
|
|
|
@@ -113,8 +113,8 @@ xanosdk env pull --from workspace --yes # and skip the confirmation
|
|
|
113
113
|
```
|
|
114
114
|
|
|
115
115
|
The source is a backend that is running: `workspace`, `ephemeral[:<name>]`,
|
|
116
|
-
`local
|
|
117
|
-
every command shares. Left off, it is the ephemeral or
|
|
116
|
+
`local[:<name>]`, or `tenant:<name>` — the [backend grammar](cli.md#naming-a-backend)
|
|
117
|
+
every command shares. Left off, it is the ephemeral or Xano Engine this project last
|
|
118
118
|
deployed to. A bundle path is refused, because its env is whatever it was built with,
|
|
119
119
|
which is the stale set this command exists to replace.
|
|
120
120
|
|
|
@@ -132,7 +132,7 @@ resolved env values in cleartext (see the `--bundle` note below).
|
|
|
132
132
|
|
|
133
133
|
```bash
|
|
134
134
|
printf %s "$STRIPE_KEY" | xanosdk env set STRIPE_KEY --to workspace --yes # value on stdin
|
|
135
|
-
xanosdk env set FEATURE_FLAG on --to local
|
|
135
|
+
xanosdk env set FEATURE_FLAG on --to local # or as the second argument
|
|
136
136
|
xanosdk env unset STRIPE_KEY --to tenant:prod-eu # remove it
|
|
137
137
|
```
|
|
138
138
|
|
|
@@ -142,12 +142,12 @@ a deploy can't do that job. A merge deploy only adds names that aren't there yet
|
|
|
142
142
|
`--replace` rewrites the whole workspace.
|
|
143
143
|
|
|
144
144
|
The destination is `--to workspace`, `--to ephemeral[:<name>]`, `--to tenant:<name>`, or
|
|
145
|
-
`--to local
|
|
146
|
-
the ephemeral or
|
|
147
|
-
workspace or a tenant, and a
|
|
145
|
+
`--to local[:<name>]` for a Xano Engine. With none of these, the command writes to
|
|
146
|
+
the ephemeral or Xano Engine this project last deployed to. It never falls back to your
|
|
147
|
+
workspace or a tenant, and a Xano Engine needs no Xano account. A write to
|
|
148
148
|
the workspace or a tenant asks for confirmation first, and `--yes` skips it; that flag is
|
|
149
149
|
required when there is no terminal, including when the value is piped in. Ephemerals and the
|
|
150
|
-
|
|
150
|
+
Xano Engine are throwaway, so the command doesn't ask.
|
|
151
151
|
|
|
152
152
|
The value is never printed. Pipe it on stdin to keep it out of shell history. One trailing
|
|
153
153
|
newline is dropped, so `echo` works too. An empty value is refused unless
|
package/guides/marketplace.md
CHANGED
|
@@ -169,6 +169,23 @@ that arrived some other way is configured by this run too: a plain `npm install`
|
|
|
169
169
|
pull request, a `git pull` that changed `package.json`. It also means nothing has to recover
|
|
170
170
|
a package name out of a `file:` or tarball specifier in order to configure it.
|
|
171
171
|
|
|
172
|
+
A **toolchain module** gets two more steps, and `reinstall` runs both as well. Its peers other
|
|
173
|
+
than `@xano/sdk` (`zod`, say) are added as direct dependencies through the project's package
|
|
174
|
+
manager: yarn never installs peers, and pnpm does not link them where `routes.gen.ts` can import
|
|
175
|
+
them. Then, when the project keeps a `routes.gen.ts` beside its entry, the file is regenerated,
|
|
176
|
+
so the module's section lands with the module rather than at the next `xano:routes`. Under
|
|
177
|
+
`--json`, `peers` lists the specs that were added (`["zod@^4.0.0"]`, or `[]`), and `routes` says
|
|
178
|
+
what happened to the file:
|
|
179
|
+
|
|
180
|
+
| `routes` | Meaning |
|
|
181
|
+
|---|---|
|
|
182
|
+
| `written` | Regenerated. |
|
|
183
|
+
| `unchanged` | Already up to date. |
|
|
184
|
+
| `absent` | The project has no `routes.gen.ts` to refresh. |
|
|
185
|
+
| `skipped` | It could not be regenerated here. The warning says why; run `npm run xano:routes`. |
|
|
186
|
+
|
|
187
|
+
`remove` reports `routes` the same way, for the file it regenerates without the removed module.
|
|
188
|
+
|
|
172
189
|
`init` takes the same names and resolves them the same way — `--marketplace auth` is
|
|
173
190
|
`@xano-sdk/auth`, and an unlisted name exits 8 before anything is written — so a project can be
|
|
174
191
|
scaffolded with its add-ons already installed and registered:
|
|
@@ -207,6 +224,10 @@ What happens then depends on whether the module predates the command:
|
|
|
207
224
|
| `install` re-run over a module already in `dependencies`, or `reinstall` | Refused and **left alone**, settings included, because deleting a module you already had over a version mismatch is not a repair. Upgrade the SDK, or `marketplace remove` it. |
|
|
208
225
|
| `init --marketplace` | Reported as a module that was not added and taken back off disk. The scaffold itself completes and works. |
|
|
209
226
|
|
|
227
|
+
A *different* installed module that is out of range does not stop the verb. `install`, `reinstall`
|
|
228
|
+
and `remove` skip it with a warning naming its range and the fix, and leave its settings and its
|
|
229
|
+
`routes.gen.ts` block exactly as they were. `export`, `deploy` and `preflight` still refuse it.
|
|
230
|
+
|
|
210
231
|
The point of undoing the install is that the alternative is worse: a module whose hooks were
|
|
211
232
|
built against a contract this SDK does not have registers and applies **nothing**, so
|
|
212
233
|
`Installed` would be followed by a project where every command that loads modules refuses it.
|
|
@@ -163,6 +163,7 @@ const plugin: ToolchainPlugin = {
|
|
|
163
163
|
answersFromConfig: (config) => ({ ... }),
|
|
164
164
|
onBundle: async (ctx) => ({ ... }),
|
|
165
165
|
onPreflight: async (ctx) => ({ ... }),
|
|
166
|
+
routesManifest: (ctx) => ({ imports: [...], source: "..." }),
|
|
166
167
|
};
|
|
167
168
|
|
|
168
169
|
export default plugin;
|
|
@@ -175,10 +176,11 @@ guessing which would run code the manifest did not describe.
|
|
|
175
176
|
Every hook is optional. A module that only adds a `.gitattributes` line declares
|
|
176
177
|
`contributes` alone.
|
|
177
178
|
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
179
|
+
Six hooks, and deliberately no more. The first five were designed from one example (a module
|
|
180
|
+
that renders the workspace to a committed tree) and cover exactly what it needed. The sixth,
|
|
181
|
+
`routesManifest`, was added when a second module, `@xano-sdk/zod`, brought a second real set
|
|
182
|
+
of requirements: writing into a file the SDK generates rather than a tree of its own. A hook
|
|
183
|
+
is added when a module needs it, not in anticipation.
|
|
182
184
|
|
|
183
185
|
## Questions
|
|
184
186
|
|
|
@@ -452,6 +454,78 @@ reason to blank.
|
|
|
452
454
|
A project whose plugins declare no `onPreflight` never pays for the engine's rendering at all,
|
|
453
455
|
so declaring the hook is what turns that fetch on.
|
|
454
456
|
|
|
457
|
+
## `routesManifest`
|
|
458
|
+
|
|
459
|
+
```ts
|
|
460
|
+
import type { ToolchainPlugin } from "@xano/sdk/plugin";
|
|
461
|
+
|
|
462
|
+
const plugin: ToolchainPlugin = {
|
|
463
|
+
kind: "toolchain",
|
|
464
|
+
routesManifest: (ctx) => ({
|
|
465
|
+
imports: [{ from: "zod", names: ["z"] }],
|
|
466
|
+
source: `export const ROUTE_SCHEMAS = ...;`,
|
|
467
|
+
}),
|
|
468
|
+
};
|
|
469
|
+
```
|
|
470
|
+
|
|
471
|
+
Your module's section of the route manifest, `xano/routes.gen.ts`. It runs wherever that file
|
|
472
|
+
is written: `xanosdk routes ./xano/index.ts --emit xano/routes.gen.ts` (the scaffold's
|
|
473
|
+
`xano:routes`), `pull`, `generate`, and the refresh `marketplace install`, `reinstall` and
|
|
474
|
+
`remove` make, so your block lands with your module.
|
|
475
|
+
|
|
476
|
+
| `RoutesManifestContext` | What it carries |
|
|
477
|
+
|---|---|
|
|
478
|
+
| `inputs` | Every endpoint's, channel's and message's request inputs, under the manifest's final keys (`routes`, `channels`, `messages`), in a fixed order. |
|
|
479
|
+
| `config` | Your block from the project's `package.json` `"xanosdk"` object. |
|
|
480
|
+
| `sdkVersion` | The running `@xano/sdk` version. |
|
|
481
|
+
|
|
482
|
+
`inputs` is a validator-neutral description (type `RouteInputs` in `@xano/sdk/plugin`, not
|
|
483
|
+
the generated map of the same name): each input's name, type, `required`, `nullable`, list
|
|
484
|
+
bounds, enum values, methods, and children. A database link is one `dbLink` entry carrying the
|
|
485
|
+
linked table's expanded `columns`, to spread into the surrounding object; `columns` is
|
|
486
|
+
`undefined` when the payload does not carry that table, which is not "no columns". Walk this
|
|
487
|
+
rather than the payload: it is the same description the SDK renders its own `RouteInputs`,
|
|
488
|
+
`ChannelInputs` and `MessageInputs` types from, so a validator built from it cannot disagree
|
|
489
|
+
with them.
|
|
490
|
+
|
|
491
|
+
**Where the section lands.** The SDK composes the file: the merged imports of every module at
|
|
492
|
+
the top, then the core sections, then each module's `source` in a marked block, blocks ordered
|
|
493
|
+
by package name:
|
|
494
|
+
|
|
495
|
+
```ts
|
|
496
|
+
// xanosdk:begin @xano-sdk/zod
|
|
497
|
+
// xanosdk:version 1.0.3 - generated; edits inside this block are overwritten
|
|
498
|
+
...
|
|
499
|
+
// xanosdk:end @xano-sdk/zod
|
|
500
|
+
```
|
|
501
|
+
|
|
502
|
+
Your source is in the same file as the core sections, so it names `RouteInputs`,
|
|
503
|
+
`ChannelInputs`, `MessageInputs` and `MessageName` directly, without importing them; all four
|
|
504
|
+
are always emitted, as `{}` when empty. Anything you export is exported from `routes.gen.ts`.
|
|
505
|
+
Your names share one scope with the core sections and every other module's, so a collision
|
|
506
|
+
fails the user's typecheck rather than being renamed. A blank `source` writes no block, and its
|
|
507
|
+
imports are dropped with it: that is how a config that turns the section off removes it.
|
|
508
|
+
|
|
509
|
+
**Imports are declared, never written.** The core sections import nothing, which is what keeps
|
|
510
|
+
the file free of the SDK runtime in a frontend bundle. Declare yours in `imports`; never put an
|
|
511
|
+
`import` line in `source`. Each `from` must be a bare package name: `@xano/sdk` and its
|
|
512
|
+
subpaths, a relative or absolute path, and a protocol (`node:`) are all refused, naming your
|
|
513
|
+
module. Each name must be a plain identifier, with no `as` rename. A package you import must
|
|
514
|
+
resolve from the user's project, so declare it in your `peerDependencies`:
|
|
515
|
+
`xanosdk marketplace install` adds each peer other than `@xano/sdk` that the project does not
|
|
516
|
+
already declare as a direct dependency, with your range, through the project's package manager.
|
|
517
|
+
|
|
518
|
+
**Synchronous and pure.** No filesystem, network, clock or randomness: the same context must
|
|
519
|
+
return the same section every time. Every writer of the file must produce the same bytes for
|
|
520
|
+
the same workspace and installed modules, or `routes --emit --strict` passes or fails depending
|
|
521
|
+
on which command last wrote it. A Promise, or any value that is not `{ imports?, source }`, is
|
|
522
|
+
refused, and `source` must not spell a block marker (`// xanosdk:begin`, `// xanosdk:end`).
|
|
523
|
+
|
|
524
|
+
**A throw is your module failing, not the manifest.** The core sections are still refreshed,
|
|
525
|
+
your previous block is kept exactly as it was, and a warning names your module. On
|
|
526
|
+
`routes --emit --strict` it is fatal instead, because a check that did not run must not read
|
|
527
|
+
as one that passed.
|
|
528
|
+
|
|
455
529
|
## `HookResult`: `failed` is not a throw
|
|
456
530
|
|
|
457
531
|
```ts
|
|
@@ -544,6 +618,8 @@ Things worth proving about your own module:
|
|
|
544
618
|
- Your `onBundle` writes nothing when `ctx.frozen` is true.
|
|
545
619
|
- Your `onBundle` handles `ctx.entry === undefined`.
|
|
546
620
|
- Your hooks never read `payload.env` values, because they are blanked.
|
|
621
|
+
- `routesManifest` returns the same section for the same context, called twice, and what it
|
|
622
|
+
writes typechecks beside the core sections of a real `routes.gen.ts`.
|
|
547
623
|
|
|
548
624
|
## Publishing
|
|
549
625
|
|
|
@@ -41,3 +41,17 @@ free to use any other layout; only `index.ts` registering the objects matters.
|
|
|
41
41
|
Authoring is **declarative def-objects** passed to factories; there is no callback/chaining
|
|
42
42
|
builder. `xano.export()` returns the importable `packageExport` bundle, and
|
|
43
43
|
`xanosdk export`/`deploy` read the module's default export.
|
|
44
|
+
|
|
45
|
+
## Wiring a project by hand
|
|
46
|
+
|
|
47
|
+
`xanosdk init` writes all of this for you. Without it, two lines set a project up:
|
|
48
|
+
|
|
49
|
+
```bash
|
|
50
|
+
npm init -y && npm pkg set type=module && npm install -D @xano/sdk
|
|
51
|
+
npx xanosdk upgrade # rewrites npm's caret to the range init writes
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
Write your workspace in `xano/index.ts`; `login` and `deploy` are unchanged. `type=module`
|
|
55
|
+
matters: Xano SDK defs are ESM-only, and `npm init` writes `"type": "commonjs"`. A TypeScript
|
|
56
|
+
entry wants [`tsx`](https://tsx.is) (`npm i -D tsx`), which the CLI picks up — Node's type
|
|
57
|
+
stripping does not remap a workspace's `./x.js` imports.
|