@xanots/sdk 0.0.10 → 0.0.12
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 +33 -0
- package/README.md +48 -5
- package/dist/.build-fingerprint +1 -1
- package/dist/{agent-file-refresh-QNKN5RYD.js → agent-file-refresh-GQWAAOBV.js} +4 -4
- package/dist/bin.js +12 -11
- package/dist/{branch-commands-2BLOC2GR.js → branch-commands-5KMPAAZV.js} +7 -7
- package/dist/bundle.d.ts +218 -0
- package/dist/bundle.js +143 -0
- package/dist/{capture-4WVJY4DQ.js → capture-YLUVAITI.js} +2 -2
- package/dist/chunk-2VTJSI6X.js +192 -0
- package/dist/{chunk-5XZ744TS.js → chunk-2ZCUO2UG.js} +1 -1
- package/dist/{chunk-OYMR5AMJ.js → chunk-3LQGF2WS.js} +2 -2
- package/dist/{chunk-WP4OZZV4.js → chunk-3VFCKHOB.js} +2 -2
- package/dist/{chunk-XHEXOES3.js → chunk-5YDINUAP.js} +1 -1
- package/dist/{chunk-LU7TRWMC.js → chunk-6VNRMKFJ.js} +2 -2
- package/dist/{chunk-CTD5ZCV6.js → chunk-7WRJPKGK.js} +2 -2
- package/dist/{chunk-3INK4Y4E.js → chunk-AE3PDSDS.js} +1 -1
- package/dist/{chunk-5YCQ2QHH.js → chunk-AG5GCZDD.js} +2 -2
- package/dist/{chunk-DBFU47BJ.js → chunk-AOFFKSJC.js} +2 -2
- package/dist/{chunk-TCFIPDB3.js → chunk-AVGDL6RB.js} +1 -1
- package/dist/{chunk-4BXJGVZ3.js → chunk-DCMANKMX.js} +2 -69
- package/dist/{chunk-WHOJWOSV.js → chunk-EETVJZAZ.js} +1 -1
- package/dist/chunk-EHP3WPEG.js +21 -0
- package/dist/{chunk-W24FJHPD.js → chunk-ELK7UALJ.js} +3 -3
- package/dist/{chunk-VNQM3V2C.js → chunk-EXENFOWE.js} +2 -2
- package/dist/{chunk-P6TAVLOX.js → chunk-GSP2BY4F.js} +17 -10
- package/dist/{chunk-AIZKXUNP.js → chunk-IMLYGQK6.js} +2 -2
- package/dist/{chunk-LBYWGMOA.js → chunk-N74KDCBD.js} +176 -42
- package/dist/{chunk-3IGNIP6R.js → chunk-NDP7OUPS.js} +1 -1
- package/dist/chunk-OHX6MIUZ.js +184 -0
- package/dist/{chunk-EQW3YT5U.js → chunk-P6PVBQL6.js} +2 -2
- package/dist/{chunk-I7DQDJAM.js → chunk-PLE5QQOZ.js} +55 -56
- package/dist/chunk-PR7OXHGZ.js +70 -0
- package/dist/{chunk-VKSOTZK3.js → chunk-QYSQ3UDO.js} +160 -8
- package/dist/{chunk-ZQ2PKR6R.js → chunk-RQ3FXV4K.js} +2 -2
- package/dist/{chunk-Q77KNEUL.js → chunk-RQNMTDXD.js} +1703 -2
- package/dist/{chunk-QKM4U5UK.js → chunk-TJS2AF5Y.js} +2 -2
- package/dist/{chunk-DIA7CT7J.js → chunk-V5Y7D4LH.js} +11 -2
- package/dist/{chunk-KA6G2L7U.js → chunk-VK26K7AY.js} +3 -3
- package/dist/{chunk-YYFXVYPX.js → chunk-VPAWRBK5.js} +12 -16
- package/dist/{chunk-5R73LFWK.js → chunk-VRNZ2NVV.js} +7 -7
- package/dist/{chunk-ACCBOMCB.js → chunk-XT3XQ4PF.js} +32 -27
- package/dist/{chunk-7JDT4PBU.js → chunk-XWFRNJMQ.js} +5 -179
- package/dist/{chunk-7ZYW652H.js → chunk-YHS6VVLJ.js} +2 -2
- package/dist/{chunk-75Z74TA7.js → chunk-YX22LKQE.js} +2 -2
- package/dist/{chunk-F6CYJ7TN.js → chunk-Z2ZIE5CO.js} +2 -2
- package/dist/cli.d.ts +13 -6
- package/dist/cli.js +11 -10
- package/dist/codegen-command-Y2SPMAUW.js +47 -0
- package/dist/codegen.d.ts +5 -4
- package/dist/codegen.js +2 -2
- package/dist/{completion-WF46272M.js → completion-HJU5QEFB.js} +2 -2
- package/dist/{deploy-command-QTIVA22A.js → deploy-command-XHS5PKPV.js} +20 -19
- package/dist/{ephemeral-command-U4AQ3TXX.js → ephemeral-command-2NKPEXUU.js} +8 -8
- package/dist/index.d.ts +88 -102
- package/dist/index.js +13 -12
- package/dist/init-command-23FFNUFT.js +32 -0
- package/dist/internal.d.ts +10 -16
- package/dist/internal.js +76 -54
- package/dist/io-UBDMMDH6.js +12 -0
- package/dist/{live-diff-IXKBVG4K.js → live-diff-HCOTN5WC.js} +3 -3
- package/dist/{lock-GFXD6G2E.js → lock-HQ4KARU2.js} +3 -2
- package/dist/{lock-commands-DQ7CUMIV.js → lock-commands-WCRC56ME.js} +12 -11
- package/dist/{login-command-Z6CHTA57.js → login-command-P7LXD5TE.js} +6 -6
- package/dist/{loop-D5NPL4VH.js → loop-IC5ISSYB.js} +3 -3
- package/dist/{marketplace-command-P4IPLJ6J.js → marketplace-command-T6JCHW7J.js} +4 -4
- package/dist/{meta-client-K2J4XH64.js → meta-client-LKRKR3L2.js} +4 -4
- package/dist/node.d.ts +6 -5
- package/dist/node.js +18 -17
- package/dist/{preflight-command-GZ2GE5RN.js → preflight-command-TZWPHBXY.js} +17 -16
- package/dist/{profile-command-LJSBDV2L.js → profile-command-WBNSMQSI.js} +3 -3
- package/dist/{release-command-YUBTNHVX.js → release-command-WEFYRTCI.js} +27 -26
- package/dist/response-D6xGLEIn.d.ts +839 -0
- package/dist/{routes-manifest-PWZHDOI5.js → routes-manifest-5ZFKUQWA.js} +2 -2
- package/dist/{runtime-V4C3AC3A.js → runtime-LSLIDALK.js} +1 -1
- package/dist/scaffold.d.ts +16 -8
- package/dist/scaffold.js +7 -11
- package/dist/{static-host-3WMV7IZO.js → static-host-4JDQCHUW.js} +1 -1
- package/dist/{status-command-AL47VG7H.js → status-command-VARULAR5.js} +4 -4
- package/dist/{store-BG1UPZ3Z.d.ts → store-DAnUIi1T.d.ts} +95 -87
- package/dist/{test-command-YAZLKLGQ.js → test-command-YCAR4O35.js} +7 -7
- package/dist/{upgrade-command-FB5QJ363.js → upgrade-command-GYEIMJBG.js} +16 -16
- package/dist/{workspace-2COHDBM3.js → workspace-33KHFLX3.js} +2 -2
- package/dist/{workspace-command-43P42FBP.js → workspace-command-2ZTGT26W.js} +28 -27
- package/dist/{workspace-export-DURY5WYL.js → workspace-export-MLYTYZS5.js} +3 -3
- package/dist/{response-CVAE2kMj.d.ts → xdo-ODuJklk6.d.ts} +28 -860
- package/guides/authoring.md +11 -2
- package/guides/typed-frontend.md +5 -5
- package/llms/filters.md +11 -10
- package/llms/kinds-core.md +1 -1
- package/llms/statements-data.md +6 -3
- package/llms/values.md +1 -1
- package/llms-full.txt +53 -42
- package/llms.txt +34 -27
- package/manifest.json +6 -2
- package/package.json +7 -2
- package/dist/chunk-ANUDXFEX.js +0 -881
- package/dist/chunk-JGCWTCA7.js +0 -95
- package/dist/chunk-YBC3IKMF.js +0 -845
- package/dist/codegen-command-GB3H2KQ7.js +0 -46
- package/dist/init-command-MAXULNAD.js +0 -33
- package/dist/io-M7XZEMK7.js +0 -11
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import { V as Value,
|
|
1
|
+
import { V as Value, g as FieldXdo, d as ExprNode, S as StackItemXdo, p as TestDef, C as CacheXdo, h as FilterXdo, I as InputXdo, k as ResultItemXdo, s as TestXdo } from './xdo-ODuJklk6.js';
|
|
2
|
+
import { W as FieldOptions, h as FieldMap, Y as Prettify, x as RowFromFieldMap, l as FromFieldMap, Z as ReadonlyMethods, M as MethodArg, C as TextMethod, G as TypeBrand, I as IntMethod, D as DecimalMethod, E as EmailMethod, P as PasswordMethod, _ as XanoFileUpload, v as ObjectRef, $ as XanoDbLink, a0 as ConstMethodOpts, f as FieldDescriptor, X as XanoFileRef, K as XanoGeoValue, H as VectorMethod, T as TableRefMethod, b as BrandValue, S as Statement, w as ResponseDef, p as MockMap } from './response-D6xGLEIn.js';
|
|
2
3
|
|
|
3
4
|
/**
|
|
4
5
|
* The single boolean-expression algebra shared by every SDK surface that emits
|
|
@@ -17,8 +18,7 @@ import { V as Value, aG as FieldOptions, q as FieldMap, aH as Prettify, $ as Row
|
|
|
17
18
|
*
|
|
18
19
|
* Operands pass their tag/filters straight through — a filtered operand
|
|
19
20
|
* (`withFilters(...)`) is valid inline in every condition/`where` surface
|
|
20
|
-
* (conditional, while, db.query/addon, …), verified against a live engine
|
|
21
|
-
* (the old #118 db-search rejection no longer reproduces).
|
|
21
|
+
* (conditional, while, db.query/addon, …), verified against a live engine.
|
|
22
22
|
*/
|
|
23
23
|
|
|
24
24
|
/**
|
|
@@ -124,7 +124,7 @@ type Condition = SearchNode | SearchNode[];
|
|
|
124
124
|
* `cmp(col("owner"), "in", ids)` with an empty `ids` matches nothing, and the
|
|
125
125
|
* same clause with `{ ignoreEmpty: true }` returns the UNFILTERED table. Never
|
|
126
126
|
* put it on a clause that scopes rows to a permitted set — an empty permission
|
|
127
|
-
* list then returns everything
|
|
127
|
+
* list then returns everything. It is for an OPTIONAL search filter,
|
|
128
128
|
* where "the caller left this box blank" really does mean "do not filter".
|
|
129
129
|
*/
|
|
130
130
|
declare function cmp(left: Value, op: SearchOp, right: Value, opts?: {
|
|
@@ -172,8 +172,8 @@ declare function encodeObject<Xdo = unknown>(name: string, def: unknown): Xdo;
|
|
|
172
172
|
declare function registeredKinds(): ObjectKind[];
|
|
173
173
|
|
|
174
174
|
/**
|
|
175
|
-
* Table (database) kind
|
|
176
|
-
* field encoder
|
|
175
|
+
* Table (database) kind → payload key `dbo`. Columns reuse the shared
|
|
176
|
+
* field encoder with the column context; indexes, views, and
|
|
177
177
|
* autocomplete have their own small shapes. Validated against the Xano engine's
|
|
178
178
|
* persisted table shape (the full rich field-type corpus).
|
|
179
179
|
*/
|
|
@@ -305,7 +305,7 @@ type SeedRow<Row = unknown> = [Row] extends [never] ? Record<string, unknown> :
|
|
|
305
305
|
*
|
|
306
306
|
* Distinct from {@link RowOf}, the READ shape, where every declared column is
|
|
307
307
|
* present. Using the read shape here demanded every column on every seed row —
|
|
308
|
-
* stricter than both the runtime validator and the engine
|
|
308
|
+
* stricter than both the runtime validator and the engine.
|
|
309
309
|
*/
|
|
310
310
|
type SeedRowOf<S extends FieldMap, IdT extends "int" | "uuid" = "int", Sys extends boolean = true> = Prettify<([Sys] extends [false] ? Record<never, never> : Partial<Omit<SystemRow<IdT>, keyof S>>) & FromFieldMap<S>>;
|
|
311
311
|
/**
|
|
@@ -315,7 +315,7 @@ type SeedRowOf<S extends FieldMap, IdT extends "int" | "uuid" = "int", Sys exten
|
|
|
315
315
|
* deferred source keeps large or sensitive seed data out of any frontend bundle
|
|
316
316
|
* that value-imports the table def, and is erased entirely under `import type`.
|
|
317
317
|
* Prefer the thunk form for anything beyond a handful of inline rows — it costs
|
|
318
|
-
* no typing (row and column inference survive every form
|
|
318
|
+
* no typing (row and column inference survive every form).
|
|
319
319
|
*
|
|
320
320
|
* A JSON `import()` resolves to a module namespace at runtime, not the array
|
|
321
321
|
* TypeScript types the specifier as; the deploy path unwraps `.default`, so
|
|
@@ -328,7 +328,7 @@ type SeedSource<Row = unknown> = ReadonlyArray<SeedRow<Row>> | SeedFileSource |
|
|
|
328
328
|
*/
|
|
329
329
|
type WidenSeedValue<T> = T extends string ? string : T extends number ? number : T extends boolean ? boolean : T extends ReadonlyArray<infer E> ? ReadonlyArray<WidenSeedValue<E>> : T;
|
|
330
330
|
/**
|
|
331
|
-
* A seed row as a DEFERRED source can actually be typed
|
|
331
|
+
* A seed row as a DEFERRED source can actually be typed.
|
|
332
332
|
*
|
|
333
333
|
* A `.json` module's strings infer as `string`, never as the literal union an
|
|
334
334
|
* `f.enum` column brands — so `seed: () => import("./rows.json")` matched no
|
|
@@ -376,7 +376,7 @@ interface SeedFileSource {
|
|
|
376
376
|
* module, not in `@xanots/sdk`, so a bundler sees an ordinary dynamic import
|
|
377
377
|
* and emits the JSON as a served chunk. Nothing the SDK does to its own code can
|
|
378
378
|
* prevent that. A frontend that value-imports any def whose module graph reaches
|
|
379
|
-
* the table then ships the seed to the browser
|
|
379
|
+
* the table then ships the seed to the browser.
|
|
380
380
|
*
|
|
381
381
|
* A path is a plain string, so there is nothing for a bundler to follow. The
|
|
382
382
|
* file is read with `node:fs` in the deploy pipeline only.
|
|
@@ -549,7 +549,7 @@ declare function table<S extends FieldMap, IdT extends "int" | "uuid" = "int", S
|
|
|
549
549
|
* too, and TypeScript's overload resolution silently falls through to a later
|
|
550
550
|
* candidate whenever the generic one does not resolve on the first pass — which
|
|
551
551
|
* a function-form `seed` triggers. The result was a table whose `Cols` and `Row`
|
|
552
|
-
* both collapsed with no error reported at the `table()` call
|
|
552
|
+
* both collapsed with no error reported at the `table()` call. With
|
|
553
553
|
* this overload unable to match a `FieldMap`, the generic signature is the only
|
|
554
554
|
* candidate and resolves, or reports a real error.
|
|
555
555
|
*/
|
|
@@ -603,7 +603,7 @@ declare const input: {
|
|
|
603
603
|
* password on **both** signup and login, let the `f.password` *column* hash on write,
|
|
604
604
|
* and pass the plaintext straight to `check_password`. See the auth recipe in the
|
|
605
605
|
* README. Reach for `input.password` only when you specifically want bind-time hashing
|
|
606
|
-
* and are not also comparing it with `check_password
|
|
606
|
+
* and are not also comparing it with `check_password`.
|
|
607
607
|
*/
|
|
608
608
|
password: <const O extends ConstInputOpts<PasswordMethod> = Record<string, never>>(options?: O) => InputDescriptor & TypeBrand<string, O>;
|
|
609
609
|
/**
|
|
@@ -863,14 +863,14 @@ declare function encodeContainerHistory<P extends ContainerPrefix>(prefix: P, in
|
|
|
863
863
|
* Workspace-tier flat map (terminal fallback — no `inherit`). Wholesale: every
|
|
864
864
|
* object type is emitted; a type absent from `map` falls back to its engine
|
|
865
865
|
* default (`enabled` per the kind rule, `limit:100`). Matches the 14-key stored
|
|
866
|
-
* shape
|
|
866
|
+
* shape.
|
|
867
867
|
*/
|
|
868
868
|
declare function buildWorkspaceHistory(map: WorkspaceHistoryDef): WorkspaceHistoryXdo;
|
|
869
869
|
|
|
870
870
|
/**
|
|
871
|
-
* `defineFunction` + the in-memory `FunctionDef` model
|
|
871
|
+
* `defineFunction` + the in-memory `FunctionDef` model.
|
|
872
872
|
*
|
|
873
|
-
* The authoring API is a flat declarative factory
|
|
873
|
+
* The authoring API is a flat declarative factory: data in → JSON out,
|
|
874
874
|
* no hidden control-flow inference.
|
|
875
875
|
*/
|
|
876
876
|
|
|
@@ -955,10 +955,10 @@ declare function defineFunction<const I extends Record<string, InputDescriptor>
|
|
|
955
955
|
/** A surface that takes a JavaScript body: the lambda statement, or a filter. */
|
|
956
956
|
type LambdaSurface = "s.lambda" | "fl.lambda" | "map" | "filter" | "some" | "every" | "find" | "findIndex" | "reduce";
|
|
957
957
|
/**
|
|
958
|
-
* Surface → the identifiers a body may reference. Live-probed
|
|
959
|
-
*
|
|
960
|
-
*
|
|
961
|
-
*
|
|
958
|
+
* Surface → the identifiers a body may reference. Live-probed rather than read
|
|
959
|
+
* off any documentation, and asserted against the recorded probe output in the
|
|
960
|
+
* tests, so the guard, the types, and the docs cannot disagree with the engine
|
|
961
|
+
* or with each other.
|
|
962
962
|
*
|
|
963
963
|
* `console` and `crypto` are globals inside the body rather than destructured
|
|
964
964
|
* bindings, so they are legal to reference but are not part of the parameter
|
|
@@ -970,7 +970,7 @@ declare const LAMBDA_BINDINGS: Readonly<Record<LambdaSurface, readonly string[]>
|
|
|
970
970
|
declare const LAMBDA_GLOBALS: readonly string[];
|
|
971
971
|
/**
|
|
972
972
|
* The libraries the engine preloads as GLOBALS in a lambda body — the only
|
|
973
|
-
* dependency route that works on every instance
|
|
973
|
+
* dependency route that works on every instance.
|
|
974
974
|
*
|
|
975
975
|
* A body is prepared for execution in one of two ways depending on the
|
|
976
976
|
* instance's executor generation, and the two disagree about `import()`:
|
|
@@ -999,14 +999,15 @@ declare const LAMBDA_MODULE_GLOBALS: readonly string[];
|
|
|
999
999
|
*
|
|
1000
1000
|
* The slot is fixed rather than looked up because it is what the guard has to
|
|
1001
1001
|
* key on: `filter()` sees positions, not argument names. `reduce`'s body is the
|
|
1002
|
-
* SECOND argument (the accumulator's initial value comes first, and
|
|
1003
|
-
*
|
|
1002
|
+
* SECOND argument (the accumulator's initial value comes first, and that slot
|
|
1003
|
+
* being invisible is the other half of the same failure); every other lambda
|
|
1004
|
+
* filter's is the
|
|
1004
1005
|
* first.
|
|
1005
1006
|
*
|
|
1006
1007
|
* `fl.transform` is deliberately absent. It takes Xano Expression Engine source,
|
|
1007
1008
|
* not a JavaScript body, and binds the operand as `$0` rather than `$this` — so
|
|
1008
1009
|
* validating it against THIS contract would reject correct code. It has its own
|
|
1009
|
-
* guard, on its own probed contract, in `./expression-arg.ts
|
|
1010
|
+
* guard, on its own probed contract, in `./expression-arg.ts`; a
|
|
1010
1011
|
* `return` there is not merely refused but sometimes silently mis-evaluated.
|
|
1011
1012
|
* `test/values/filters.test.ts` enumerates the `code`-taking filters from
|
|
1012
1013
|
* `FILTER_SPECS` and fails if one is missing here.
|
|
@@ -1055,7 +1056,7 @@ interface IteratingBindings extends AmbientBindings {
|
|
|
1055
1056
|
}
|
|
1056
1057
|
/** The bindings in scope in a body at `S` — the type of a {@link lam.fn} parameter. */
|
|
1057
1058
|
type LambdaBindings<S extends LambdaSurface = "reduce"> = S extends "reduce" ? IteratingBindings & {
|
|
1058
|
-
/** The accumulator.
|
|
1059
|
+
/** The accumulator. Commonly mis-typed as `$acc`. */
|
|
1059
1060
|
$result: any;
|
|
1060
1061
|
} : S extends "s.lambda" ? AmbientBindings : S extends "fl.lambda" ? AmbientBindings & {
|
|
1061
1062
|
/** The piped value the filter is applied to. */
|
|
@@ -1087,7 +1088,7 @@ type CaptureValue = string | number | boolean | null | {
|
|
|
1087
1088
|
* stays open to declaration merging. So `capture: { band }` compiled when `band`
|
|
1088
1089
|
* was a `type` and failed when the identical shape was an `interface`, with the
|
|
1089
1090
|
* error naming `CaptureValue` rather than the one keyword that differed, and the
|
|
1090
|
-
* body's second parameter then degrading to the constraint
|
|
1091
|
+
* body's second parameter then degrading to the constraint.
|
|
1091
1092
|
*
|
|
1092
1093
|
* A homomorphic mapped type is the way through: `keyof` an interface is the same
|
|
1093
1094
|
* as `keyof` the alias, so this accepts both and still rejects what genuinely
|
|
@@ -2006,7 +2007,7 @@ declare const fl: {
|
|
|
2006
2007
|
* statement the database runs, so they are reachable only from a query's own
|
|
2007
2008
|
* expression surfaces — and, being absent from the runtime catalog, every one of
|
|
2008
2009
|
* them used to be reported by `findUnresolvableFilters` as "will 500 at runtime"
|
|
2009
|
-
|
|
2010
|
+
*. That warning steered authors off the only spelling that works.
|
|
2010
2011
|
*
|
|
2011
2012
|
* The distinction is worth stating because it is what makes vector search
|
|
2012
2013
|
* possible at all: `f.vector` columns and their pgvector indexes had no query
|
|
@@ -2091,7 +2092,7 @@ type OutputPath<C extends string> = QualifiedCol<C> | PagingEnvelopeField;
|
|
|
2091
2092
|
* ⚠ `comments.id` is only the bound table's own alias WHEN THE QUERY DECLARES ONE
|
|
2092
2093
|
* (`tableAlias`) — that is why Xano's editor can write it and a hand-authored
|
|
2093
2094
|
* query cannot. Without `tableAlias`, qualifying the bound table by its NAME does
|
|
2094
|
-
* not resolve, and the query fails at runtime
|
|
2095
|
+
* not resolve, and the query fails at runtime; `db.query` checks the
|
|
2095
2096
|
* `where`/`sort`/`eval` paths for it at export. Bare is the form to reach for.
|
|
2096
2097
|
*/
|
|
2097
2098
|
type QualifiedCol<C extends string> = C | `${string}.${string}`;
|
|
@@ -2113,7 +2114,7 @@ type OutputRoot<P extends string> = P extends `${infer Head}.${string}` ? Head :
|
|
|
2113
2114
|
* The boolean-expression algebra (`cmp`/`and`/`or`, the node types, the tree
|
|
2114
2115
|
* walk) now lives in {@link ../expression.js}; this module keeps the db-specific
|
|
2115
2116
|
* pieces — `where`/`additionalWhere` merge, sort, eval — and supplies the
|
|
2116
|
-
* filter-rejecting operand encoder
|
|
2117
|
+
* filter-rejecting operand encoder to the shared walk.
|
|
2117
2118
|
*/
|
|
2118
2119
|
|
|
2119
2120
|
/** Sort direction for a {@link SortDirective} — the engine's `orderBy` values. */
|
|
@@ -2232,7 +2233,7 @@ declare function resolveAuthRef(hostLabel: string, host: string, auth: AuthRef |
|
|
|
2232
2233
|
* spec/tags/tool-refs). Verified against the Xano engine's stored mcp_server and
|
|
2233
2234
|
* agent formats.
|
|
2234
2235
|
*
|
|
2235
|
-
* Notes from that verification
|
|
2236
|
+
* Notes from that verification:
|
|
2236
2237
|
* - Xano's MCP server has **no** server-level `authentication` field — auth is
|
|
2237
2238
|
* per-tool (`tool[].auth`, a stored `json`, engine default `false`).
|
|
2238
2239
|
* - Toolset-level middleware is **not** an engine feature: neither transform
|
|
@@ -2245,7 +2246,7 @@ declare function resolveAuthRef(hostLabel: string, host: string, auth: AuthRef |
|
|
|
2245
2246
|
/**
|
|
2246
2247
|
* Generic over its input map `I`, branded stack tuple `S`, literal response
|
|
2247
2248
|
* `Resp`, and declared `Res` — the same carriers `QueryDef` holds, so
|
|
2248
|
-
* `InferInput`/`InferResponse` work identically here
|
|
2249
|
+
* `InferInput`/`InferResponse` work identically here. All default,
|
|
2249
2250
|
* so a bare `ToolDef` is unchanged.
|
|
2250
2251
|
*
|
|
2251
2252
|
* A tool's response is the value an AGENT reads back, which makes it as
|
|
@@ -2328,7 +2329,7 @@ declare const toolKind: ObjectKind<AnyToolDef$1, ToolXdo>;
|
|
|
2328
2329
|
/**
|
|
2329
2330
|
* Authoring factory for a `tool` — a function-like operation a toolset
|
|
2330
2331
|
* references. The exact input map, stack tuple, and response are preserved on
|
|
2331
|
-
* the return type, so `InferInput`/`InferResponse` recover them
|
|
2332
|
+
* the return type, so `InferInput`/`InferResponse` recover them.
|
|
2332
2333
|
*/
|
|
2333
2334
|
declare function tool<const I extends Record<string, InputDescriptor>, Res = never, Resp extends ResponseDef = ResponseDef, const S extends readonly Statement[] = readonly []>(def: ToolDef<I, Res, Resp, S>): ToolDef<I, Res, Resp, S>;
|
|
2334
2335
|
/**
|
|
@@ -2364,7 +2365,7 @@ interface ToolsetToolRef {
|
|
|
2364
2365
|
* directly (`registerTools([saveNote])`, `bind: [{ table: users }]`), so
|
|
2365
2366
|
* `tools: [saveNote]` is the spelling authors reach for by analogy — and the
|
|
2366
2367
|
* wrapper's fields are all optional, so TypeScript's weak-type check let a bare
|
|
2367
|
-
* handle through and the export emitted `id: 0`, a null reference
|
|
2368
|
+
* handle through and the export emitted `id: 0`, a null reference.
|
|
2368
2369
|
* Normalizing here removes the failure mode rather than documenting around it.
|
|
2369
2370
|
*/
|
|
2370
2371
|
type ToolsetToolEntry = ToolsetToolRef | ToolDef | string;
|
|
@@ -2555,7 +2556,7 @@ interface XanoFreeProvider extends LlmCommon {
|
|
|
2555
2556
|
dynamicRetrieval?: string;
|
|
2556
2557
|
}
|
|
2557
2558
|
/**
|
|
2558
|
-
* The run prompt, in exactly one of its two spellings
|
|
2559
|
+
* The run prompt, in exactly one of its two spellings.
|
|
2559
2560
|
*
|
|
2560
2561
|
* The engine stores ONE prompt behind a `prompt_type` discriminator: either a
|
|
2561
2562
|
* `prompt` string or a `prompt_messages` template, never both. Authoring both
|
|
@@ -2596,7 +2597,7 @@ type LlmSettings = AnthropicLlm | OpenAiLlm | GoogleGenAiLlm | XanoFreeLlm;
|
|
|
2596
2597
|
* stored `structuredOutputsSchema` is the same wire shape as function inputs, so
|
|
2597
2598
|
* `encodeInput` produces it verbatim (no parallel encoder). e.g.
|
|
2598
2599
|
* `output: { schema: { priority: input.enum(["low","high"]), summary: input.text() } }`.
|
|
2599
|
-
* The item shape is byte-verified against a captured live-engine golden
|
|
2600
|
+
* The item shape is byte-verified against a captured live-engine golden.
|
|
2600
2601
|
*/
|
|
2601
2602
|
interface AgentOutput {
|
|
2602
2603
|
schema: Record<string, InputDescriptor>;
|
|
@@ -2610,7 +2611,7 @@ interface AgentOutput {
|
|
|
2610
2611
|
* `A` is whatever `s.ai.agent.run({ agent })` was handed: an {@link AgentHandle}
|
|
2611
2612
|
* (or {@link AgentDef}) carries a precise, branded `output.schema`, so this reads
|
|
2612
2613
|
* the shape the agent already declares once — no second `resultShape` witness at
|
|
2613
|
-
* the call site
|
|
2614
|
+
* the call site. A bare name/ref carries no schema → `string`.
|
|
2614
2615
|
*
|
|
2615
2616
|
* The schema is a *response* shape (the object the model returns), so every
|
|
2616
2617
|
* declared field is treated as present — {@link RowFromFieldMap}, not the
|
|
@@ -2700,12 +2701,12 @@ type AgentHandle<D extends AgentDef = AgentDef> = D & {
|
|
|
2700
2701
|
* branded `output.schema`. That lets `s.ai.agent.run({ agent })` read the
|
|
2701
2702
|
* completion shape straight off the handle via {@link AgentResultOf} — the
|
|
2702
2703
|
* structured-output type is declared once here, not re-stated as a `resultShape`
|
|
2703
|
-
* witness at every call site
|
|
2704
|
+
* witness at every call site.
|
|
2704
2705
|
*/
|
|
2705
2706
|
declare function agent<const D extends AgentDef>(def: D): AgentHandle<D>;
|
|
2706
2707
|
|
|
2707
2708
|
/**
|
|
2708
|
-
* Addon kind
|
|
2709
|
+
* Addon kind → payload key `addon`. An addon is a single table-bound db
|
|
2709
2710
|
* query (an `input` block + an `output` selection + a `context` that carries the
|
|
2710
2711
|
* dbo binding and `return`), *not* a statement stack — the engine runs it
|
|
2711
2712
|
* straight off `context`. The MVP models the common shape;
|
|
@@ -2717,7 +2718,7 @@ declare function agent<const D extends AgentDef>(def: D): AgentHandle<D>;
|
|
|
2717
2718
|
* matches on) and brands the returned handle with the addon's **graft shape** —
|
|
2718
2719
|
* `Pick<InferRow<table>, output>`, wrapped per {@link AddonDef.cardinality} — so
|
|
2719
2720
|
* a `db.query`/`db.get` attaching the addon can type the grafted row field
|
|
2720
|
-
* instead of falling back to `unknown
|
|
2721
|
+
* instead of falling back to `unknown`.
|
|
2721
2722
|
*/
|
|
2722
2723
|
|
|
2723
2724
|
/** An addon's `output` selection: a typed column-name list, or the raw customize block. */
|
|
@@ -2860,7 +2861,7 @@ interface AddonArgs<Tbl extends ObjectRef | null, Out extends readonly string[],
|
|
|
2860
2861
|
declare function addon<const Out extends readonly string[] = readonly [], Tbl extends ObjectRef | null = ObjectRef, Card extends AddonCardinality = "list", const Grp extends readonly DbEval[] = readonly [], const Ev extends readonly DbEval[] = readonly []>(def: AddonArgs<Tbl, Out, Card, Grp, Ev>): AddonDef<AddonGraft<Tbl, Out, Card, Grp, Ev>>;
|
|
2861
2862
|
|
|
2862
2863
|
/**
|
|
2863
|
-
* Schema-DSL interpreter
|
|
2864
|
+
* Schema-DSL interpreter. Turns a declarative statement schema's
|
|
2864
2865
|
* `transform` rules into a runtime encoder, so the ~169 declarative statements
|
|
2865
2866
|
* are driven by data (a `StatementSpec`) rather than hand-written per statement.
|
|
2866
2867
|
*
|
|
@@ -2878,11 +2879,11 @@ declare function addon<const Out extends readonly string[] = readonly [], Tbl ex
|
|
|
2878
2879
|
* `output` (whether the stored item carries `output:{filters:[]}`) is NOT
|
|
2879
2880
|
* derivable from the transform schema — it is engine statement-class metadata
|
|
2880
2881
|
* (e.g. `uuid4` has an `as` but no `output`; `return` has a value block but no
|
|
2881
|
-
* `output`). The codegen pins it from the persisted golden fixture
|
|
2882
|
+
* `output`). The codegen pins it from the persisted golden fixture,
|
|
2882
2883
|
* never guessing.
|
|
2883
2884
|
*
|
|
2884
2885
|
* Validated against real persisted fixtures (math_add, bitwise_and, object_keys,
|
|
2885
|
-
* array_push, array_pop). The codegen pipeline
|
|
2886
|
+
* array_push, array_pop). The codegen pipeline populates the
|
|
2886
2887
|
* spec catalog from the Xano engine's schema definitions; uninterpretable schemas are
|
|
2887
2888
|
* logged, never guessed.
|
|
2888
2889
|
*/
|
|
@@ -2914,7 +2915,7 @@ type Route = {
|
|
|
2914
2915
|
name: string;
|
|
2915
2916
|
};
|
|
2916
2917
|
/**
|
|
2917
|
-
* Per-statement envelope shape, pinned from the persisted fixture
|
|
2918
|
+
* Per-statement envelope shape, pinned from the persisted fixture — the
|
|
2918
2919
|
* engine-class metadata that isn't in the transform schema. "Full" statements
|
|
2919
2920
|
* (api_request, db ops, file ops) carry richer `input[]` entries and extra
|
|
2920
2921
|
* top-level keys; lean statements (math, array, object) carry none of these.
|
|
@@ -3280,14 +3281,11 @@ declare function microservice<const D extends MicroserviceDef>(def: D): D;
|
|
|
3280
3281
|
declare const microserviceKind: ObjectKind<MicroserviceDef, MicroserviceXdo>;
|
|
3281
3282
|
|
|
3282
3283
|
/**
|
|
3283
|
-
*
|
|
3284
|
-
*
|
|
3285
|
-
* Typed, namespaced factories for the declarative statement catalog (U9): every
|
|
3284
|
+
* Typed, namespaced factories for the declarative statement catalog: every
|
|
3286
3285
|
* generated statement is reachable + autocomplete-discoverable as
|
|
3287
3286
|
* `generated.<namespace>.<method>({…})` (e.g. `generated.math.add`,
|
|
3288
3287
|
* `generated.db.get`). The unified public surface is `s` in ../s.ts, which
|
|
3289
|
-
* merges these with the hand-authored control-flow specials.
|
|
3290
|
-
* `npm run codegen`.
|
|
3288
|
+
* merges these with the hand-authored control-flow specials.
|
|
3291
3289
|
*/
|
|
3292
3290
|
|
|
3293
3291
|
declare const generated: {
|
|
@@ -4676,7 +4674,7 @@ declare const generated: {
|
|
|
4676
4674
|
};
|
|
4677
4675
|
|
|
4678
4676
|
/**
|
|
4679
|
-
* Implied-input catalog per trigger `obj_type
|
|
4677
|
+
* Implied-input catalog per trigger `obj_type`. Xano trigger inputs are
|
|
4680
4678
|
* **fixed by type** — they are generated by `mvp:trigger_update_defaults` and
|
|
4681
4679
|
* cannot be edited in the UI. This module is the XanoTS mirror of that
|
|
4682
4680
|
* generator: `impliedInputs(objType)` returns the exact input array Xano stores
|
|
@@ -4689,9 +4687,7 @@ declare const generated: {
|
|
|
4689
4687
|
* Fields are built through the canonical `input.*` / `f.*` constructors + shared
|
|
4690
4688
|
* `encodeInput`, so they carry the same stored shape and defaults as every other
|
|
4691
4689
|
* XanoTS input (`customize:{}`, `_xsid:""`, numeric `market_item`) and cannot
|
|
4692
|
-
* drift from the field encoder.
|
|
4693
|
-
* the older `customize:""` parser-generation format; conformance compares
|
|
4694
|
-
* structurally, normalizing that legacy drift and the engine-assigned `_xsid`.
|
|
4690
|
+
* drift from the field encoder.
|
|
4695
4691
|
*/
|
|
4696
4692
|
|
|
4697
4693
|
/**
|
|
@@ -4712,7 +4708,7 @@ type TriggerInputObjType = "database" | "toolset" | "workspace" | "workspace_rea
|
|
|
4712
4708
|
* factories pass a typed handle `t` to `stack: (t) => [...]` (and `response:
|
|
4713
4709
|
* (t) => ...` on response-bearing types). Each member is a {@link FieldAccessor}:
|
|
4714
4710
|
* it is a {@link Value} referencing the whole input **and** callable for typed
|
|
4715
|
-
* column/child access — `t.new("email")` → `inp("new.email")
|
|
4711
|
+
* column/child access — `t.new("email")` → `inp("new.email")`. This
|
|
4716
4712
|
* mirrors the `auth("id")` callable-value precedent and keeps the
|
|
4717
4713
|
* `{value,tag,filters}` shape so it composes with `withFilters`.
|
|
4718
4714
|
*
|
|
@@ -5049,7 +5045,7 @@ type RealtimeServerHandle = RealtimeServerDef & {
|
|
|
5049
5045
|
* connection hash — so pass `{ tenant }` explicitly there.
|
|
5050
5046
|
*
|
|
5051
5047
|
* IN A BROWSER BUNDLE, prefer the generated manifest: importing this def for
|
|
5052
|
-
* its `getUrl()` pulls the SDK runtime in with it (the same ~
|
|
5048
|
+
* its `getUrl()` pulls the SDK runtime in with it (the same ~267 kB floor a
|
|
5053
5049
|
* query def costs — the factory CALLS that build the def run at module load).
|
|
5054
5050
|
* `xanots routes <entry> --emit xano/routes.gen.ts` writes the identical
|
|
5055
5051
|
* address, tenant lift included, as `socketUrl("<server>", baseUrl)` in a file
|
|
@@ -5372,7 +5368,7 @@ declare function realtimeChannel<const I extends Record<string, InputDescriptor>
|
|
|
5372
5368
|
declare function realtimeChannelGuid(def: Pick<RealtimeChannelDef, "name" | "server" | "guid">): string;
|
|
5373
5369
|
|
|
5374
5370
|
/**
|
|
5375
|
-
* Trigger kinds
|
|
5371
|
+
* Trigger kinds. All 6 trigger types share ONE stored envelope
|
|
5376
5372
|
* discriminated by `obj_type` + a per-type `meta` block —
|
|
5377
5373
|
* confirmed against the Xano engine's stored trigger shape. The canonical `meta`
|
|
5378
5374
|
* carries all four action groups (database / toolset / workspace /
|
|
@@ -5931,7 +5927,7 @@ declare const apiGroupKind: ObjectKind<ApiGroupDef, ApiGroupXdo>;
|
|
|
5931
5927
|
declare function apiGroup(def: ApiGroupDef): ApiGroupDef;
|
|
5932
5928
|
|
|
5933
5929
|
/**
|
|
5934
|
-
* Query (API endpoint) kind
|
|
5930
|
+
* Query (API endpoint) kind → payload key `query`. Function-like
|
|
5935
5931
|
* (input/run/result) plus HTTP fields: `verb`, `app` (api_group binding),
|
|
5936
5932
|
* `auth`, `response_type`, `cache`, `output`. Validated against
|
|
5937
5933
|
* the Xano engine's persisted shape.
|
|
@@ -5977,8 +5973,20 @@ interface QueryDef<I extends Record<string, InputDescriptor> = Record<string, In
|
|
|
5977
5973
|
* input deploys as a permanently-broken route. `required: true` is NOT
|
|
5978
5974
|
* demanded, because Xano's own editor leaves path-param inputs unmarked. A
|
|
5979
5975
|
* marker need not be a whole segment: `"blog/post-{slug}"` routes fine.
|
|
5980
|
-
*
|
|
5981
|
-
*
|
|
5976
|
+
*
|
|
5977
|
+
* The CONVERSE is warned rather than enforced. An input that a `GET`/`DELETE`/
|
|
5978
|
+
* `HEAD` looks ONE ROW up by — the match argument of `s.db.get`,
|
|
5979
|
+
* `get_by_id`, `has`, or the by-field edit/patch/delete family — is
|
|
5980
|
+
* ADDRESSING a resource and belongs in the path; `export()` reports
|
|
5981
|
+
* `query.path-segment-candidate` when the path does not bind it. The endpoint
|
|
5982
|
+
* still serves `?blog_id=1`, which is why it is a warning: what it costs is
|
|
5983
|
+
* that the route is not addressable the way a REST client, cache key, or
|
|
5984
|
+
* access log expects, and `getPath()` types as STATIC, so a caller cannot
|
|
5985
|
+
* pass the value positionally. A segment is any value that names WHICH
|
|
5986
|
+
* resource is wanted, not merely one named like a key — `"shop/{country}"`
|
|
5987
|
+
* and `"blog/{category}"` are this shape too. An input that NARROWS A LIST
|
|
5988
|
+
* (an `s.db.query` filter) is the opposite case and correctly stays a
|
|
5989
|
+
* query-string param; inputs that are not in the path need nothing special.
|
|
5982
5990
|
*
|
|
5983
5991
|
* Captured as a literal so `getPath({ params })` types its keys from it.
|
|
5984
5992
|
*/
|
|
@@ -6084,7 +6092,7 @@ interface QueryDef<I extends Record<string, InputDescriptor> = Record<string, In
|
|
|
6084
6092
|
/**
|
|
6085
6093
|
* The endpoint's statement stack. Captured as the literal tuple `S` (via
|
|
6086
6094
|
* `query()`'s `const` inference) so `InferResponse` can trace a single-variable
|
|
6087
|
-
* response back to the branded `db.get`/`db.query` that bound it
|
|
6095
|
+
* response back to the branded `db.get`/`db.query` that bound it. A
|
|
6088
6096
|
* dynamically-built `Statement[]` widens `S` and the trace degrades to
|
|
6089
6097
|
* `unknown` — the override (`responseShape`) remains the escape hatch.
|
|
6090
6098
|
*/
|
|
@@ -6092,8 +6100,8 @@ interface QueryDef<I extends Record<string, InputDescriptor> = Record<string, In
|
|
|
6092
6100
|
/**
|
|
6093
6101
|
* The response assignment: a single {@link Value} (returned directly) or a
|
|
6094
6102
|
* record of named values (an object with those keys). Captured as the literal
|
|
6095
|
-
* `Resp` so `InferResponse` can auto-derive object-literal keys
|
|
6096
|
-
* the branded stack, trace a single-variable response
|
|
6103
|
+
* `Resp` so `InferResponse` can auto-derive object-literal keys and, with
|
|
6104
|
+
* the branded stack, trace a single-variable response.
|
|
6097
6105
|
*/
|
|
6098
6106
|
response?: Resp;
|
|
6099
6107
|
/**
|
|
@@ -6238,7 +6246,7 @@ declare const query: typeof queryImpl & {
|
|
|
6238
6246
|
};
|
|
6239
6247
|
|
|
6240
6248
|
/**
|
|
6241
|
-
* Task (scheduled/background job) kind
|
|
6249
|
+
* Task (scheduled/background job) kind → payload key `task`. Function-like
|
|
6242
6250
|
* `run[]` plus a `schedule[]` of cron-like entries. Validated against
|
|
6243
6251
|
* the Xano engine's persisted shape.
|
|
6244
6252
|
*/
|
|
@@ -6390,7 +6398,7 @@ declare const workflowTestKind: ObjectKind<WorkflowTestDef, WorkflowTestXdo>;
|
|
|
6390
6398
|
declare function workflowTest(def: WorkflowTestDef): WorkflowTestDef;
|
|
6391
6399
|
|
|
6392
6400
|
/**
|
|
6393
|
-
* Middleware kind
|
|
6401
|
+
* Middleware kind → payload key `middleware`. Function-like
|
|
6394
6402
|
* (input/run/result) plus `result_type` (merge|replace) and `exception`
|
|
6395
6403
|
* (silent|rethrow|critical). Validated against the Xano engine's persisted shape.
|
|
6396
6404
|
*/
|
|
@@ -6429,13 +6437,13 @@ type ResultStrategy = "merge" | "replace";
|
|
|
6429
6437
|
* author who writes a rate limiter and does not think about this field gets, by
|
|
6430
6438
|
* default, a limiter that does nothing and says nothing. An inert guard is
|
|
6431
6439
|
* worse than a loud one, so the safe reading is the default and the permissive
|
|
6432
|
-
* one is opt-in
|
|
6440
|
+
* one is opt-in.
|
|
6433
6441
|
*/
|
|
6434
6442
|
type ExceptionPolicy = "silent" | "rethrow" | "critical";
|
|
6435
6443
|
/**
|
|
6436
6444
|
* Generic over its branded stack tuple `S`, literal response `Resp`, and
|
|
6437
6445
|
* declared `Res`, so `InferResponse` can trace a response ref back to the
|
|
6438
|
-
* statement that bound it
|
|
6446
|
+
* statement that bound it. All default, so a bare `MiddlewareDef`
|
|
6439
6447
|
* is unchanged.
|
|
6440
6448
|
*
|
|
6441
6449
|
* No input generic, deliberately: a middleware's declared `input` is NEVER bound
|
|
@@ -6618,9 +6626,9 @@ type MessageDeliverTo = "channel" | "sender" | "others" | "explicit";
|
|
|
6618
6626
|
* a declared `Res` (the `responseShape` override). All default, so every existing
|
|
6619
6627
|
* use — a bare `RealtimeMessageDef` — works unchanged.
|
|
6620
6628
|
*
|
|
6621
|
-
*
|
|
6622
|
-
* non-tuple, so no `as` binding in it
|
|
6623
|
-
* handler's response
|
|
6629
|
+
* Carrying `I` alone is not enough. A `Statement[]` stack is a widened
|
|
6630
|
+
* non-tuple, so no `as` binding in it is visible and every `ref()` in a
|
|
6631
|
+
* handler's response bottoms out — and with no `responseShape` field there is
|
|
6624
6632
|
* no override either. That gap costs more here than on an HTTP kind: a realtime
|
|
6625
6633
|
* client's whole data path is the socket (the transcript hydrates a joiner, so
|
|
6626
6634
|
* there is deliberately no hydration endpoint to derive a shape from), which
|
|
@@ -6758,7 +6766,7 @@ declare const realtimeMessageKind: ObjectKind<AnyRealtimeMessageDef$1, RealtimeM
|
|
|
6758
6766
|
*
|
|
6759
6767
|
* The exact input map, stack tuple, and response are preserved on the return
|
|
6760
6768
|
* type, so `InferInput<typeof msg>` types what a client SENDS and
|
|
6761
|
-
* `InferResponse<typeof msg>` types what it RECEIVES
|
|
6769
|
+
* `InferResponse<typeof msg>` types what it RECEIVES.
|
|
6762
6770
|
*/
|
|
6763
6771
|
declare function realtimeMessage<const I extends Record<string, InputDescriptor>, Res = never, Resp extends ResponseDef = ResponseDef, const S extends readonly Statement[] = readonly []>(def: RealtimeMessageDef<I, Res, Resp, S>): RealtimeMessageDef<I, Res, Resp, S>;
|
|
6764
6772
|
|
|
@@ -6890,9 +6898,9 @@ declare function knowledge(def: KnowledgeDef): KnowledgeDef;
|
|
|
6890
6898
|
declare const knowledgeKind: ObjectKind<KnowledgeDef, KnowledgeXdo>;
|
|
6891
6899
|
|
|
6892
6900
|
/**
|
|
6893
|
-
* Workspace config kind
|
|
6901
|
+
* Workspace config kind → payload key `workspace` (singleton object, not
|
|
6894
6902
|
* an array). Emits the author-provided settings subset; the engine fills the
|
|
6895
|
-
* remaining server-managed fields on import
|
|
6903
|
+
* remaining server-managed fields on import. Authoring shape validated
|
|
6896
6904
|
* against the Xano engine's persisted workspace shape.
|
|
6897
6905
|
*
|
|
6898
6906
|
* Two blocks — `preferences` and `settings` — merge over a named engine default
|
|
@@ -6965,7 +6973,7 @@ interface WorkspaceDefaultsDef {
|
|
|
6965
6973
|
interface WorkspaceConfigDef {
|
|
6966
6974
|
/**
|
|
6967
6975
|
* OPTIONAL — omit it and the workspace inherits the name `workspace("…")`
|
|
6968
|
-
* already gave it
|
|
6976
|
+
* already gave it.
|
|
6969
6977
|
*
|
|
6970
6978
|
* There is exactly one config per workspace and the entry point names it, so
|
|
6971
6979
|
* restating it here was pure duplication that every documented example got
|
|
@@ -7052,7 +7060,7 @@ interface WorkspaceConfigDef {
|
|
|
7052
7060
|
* dropped, and an empty value is written as an empty string.
|
|
7053
7061
|
* - `release` (merge) is ADD-ONLY. It creates keys that do not yet exist and
|
|
7054
7062
|
* does NOT update or remove ones that do. Changing a value in code and
|
|
7055
|
-
* releasing leaves the live value as it was
|
|
7063
|
+
* releasing leaves the live value as it was.
|
|
7056
7064
|
* - `release --replace` replaces, but it rebuilds the whole workspace to do it.
|
|
7057
7065
|
*
|
|
7058
7066
|
* So a value you need to CHANGE on an instance workspace cannot be changed by
|
|
@@ -7296,7 +7304,7 @@ interface ManifestFilter {
|
|
|
7296
7304
|
/**
|
|
7297
7305
|
* Named, typed args (richly-specified filters only). `enum` carries the exact
|
|
7298
7306
|
* accepted spellings where the arg has a closed set — printed in place of the
|
|
7299
|
-
* bare word "enum", which told a reader nothing
|
|
7307
|
+
* bare word "enum", which told a reader nothing.
|
|
7300
7308
|
*/
|
|
7301
7309
|
args?: Array<{
|
|
7302
7310
|
name: string;
|
|
@@ -7453,7 +7461,7 @@ interface LockFile {
|
|
|
7453
7461
|
declare function emptyLock(): LockFile;
|
|
7454
7462
|
/**
|
|
7455
7463
|
* Parse + strictly validate lock file text. Every failure is a hard error
|
|
7456
|
-
*
|
|
7464
|
+
* — the caller must never fall back to an unlocked export when a lock
|
|
7457
7465
|
* file exists but is broken.
|
|
7458
7466
|
*/
|
|
7459
7467
|
declare function parseLock(text: string, path?: string): LockFile;
|
|
@@ -7495,7 +7503,7 @@ interface LockExportContext {
|
|
|
7495
7503
|
declare function createLockContext(lock?: LockFile): LockExportContext;
|
|
7496
7504
|
/**
|
|
7497
7505
|
* Record one emitted identity into `ctx.observed`, hard-erroring on an
|
|
7498
|
-
* explicit-vs-lock guid split
|
|
7506
|
+
* explicit-vs-lock guid split: within one bundle every reference resolves
|
|
7499
7507
|
* through the seeded lock, so an object whose payload guid disagrees with its
|
|
7500
7508
|
* lock entry would ship a bundle where references point at a guid the target
|
|
7501
7509
|
* no longer carries — never emit that silently.
|
|
@@ -7508,7 +7516,7 @@ interface RenameResult {
|
|
|
7508
7516
|
discardedNewcomer?: LockEntry;
|
|
7509
7517
|
}
|
|
7510
7518
|
/**
|
|
7511
|
-
* Move a lock entry to a new name keeping its identity values
|
|
7519
|
+
* Move a lock entry to a new name keeping its identity values, so the
|
|
7512
7520
|
* next export emits the ORIGINAL guid under the new name and the engine
|
|
7513
7521
|
* renames in place.
|
|
7514
7522
|
*
|
|
@@ -7540,7 +7548,7 @@ interface AdoptResult {
|
|
|
7540
7548
|
vaultCount: number;
|
|
7541
7549
|
}
|
|
7542
7550
|
/**
|
|
7543
|
-
* Seed/update the lock from a live engine `packageExport` bundle
|
|
7551
|
+
* Seed/update the lock from a live engine `packageExport` bundle —
|
|
7544
7552
|
* capturing the workspace's random guids and canonicals by `(type, name)` so
|
|
7545
7553
|
* an existing workspace can be adopted into code without a delete+create sync.
|
|
7546
7554
|
*
|
|
@@ -7567,7 +7575,7 @@ interface MergeResult {
|
|
|
7567
7575
|
*
|
|
7568
7576
|
* Observed values win field-by-field (an explicit in-code value updates the
|
|
7569
7577
|
* recorded one, per R2). Entries nothing matched are kept as orphans and
|
|
7570
|
-
* reported — renames are never guessed
|
|
7578
|
+
* reported — renames are never guessed — with one exception: an orphan
|
|
7571
7579
|
* whose GUID now belongs to a LIVE entry is dropped. That happens when a
|
|
7572
7580
|
* rename is reverted after a `lock rename` fix-up (the old name re-derives the
|
|
7573
7581
|
* pinned guid): keeping the orphan would wedge the lock on its own
|
|
@@ -7603,7 +7611,7 @@ interface Bundle {
|
|
|
7603
7611
|
sig: string;
|
|
7604
7612
|
}
|
|
7605
7613
|
/**
|
|
7606
|
-
* Iterative, like the guards' walkers
|
|
7614
|
+
* Iterative, like the guards' walkers, and for the same reason: what
|
|
7607
7615
|
* is being crossed here is the author's own structure — a deep expression tree,
|
|
7608
7616
|
* or a `raw()` envelope carrying whatever the engine handed back on a pull — and
|
|
7609
7617
|
* a recursive encoder turns that into a bare `RangeError` at `export()`. Depth
|
|
@@ -7645,7 +7653,7 @@ interface ResolvedKnowledge {
|
|
|
7645
7653
|
|
|
7646
7654
|
/**
|
|
7647
7655
|
* The register methods take the WIDEST instantiation of each def type, not the
|
|
7648
|
-
* bare name
|
|
7656
|
+
* bare name.
|
|
7649
7657
|
*
|
|
7650
7658
|
* A def's `Res` parameter surfaces as `responseShape?: Res` and defaults to
|
|
7651
7659
|
* `never`, so the bare `FunctionDef` — the spelling the issue proposed —
|
|
@@ -7654,7 +7662,7 @@ interface ResolvedKnowledge {
|
|
|
7654
7662
|
* never` and the registration they were already making stops compiling. Pinning
|
|
7655
7663
|
* `Res` to `unknown` (and every other parameter to its own constraint) accepts
|
|
7656
7664
|
* every instantiation while still rejecting an object that is not that kind of
|
|
7657
|
-
* def at all
|
|
7665
|
+
* def at all.
|
|
7658
7666
|
*/
|
|
7659
7667
|
type AnyInputs = Record<string, InputDescriptor>;
|
|
7660
7668
|
type AnyStack = readonly Statement[];
|
|
@@ -7694,7 +7702,7 @@ declare class Xano {
|
|
|
7694
7702
|
register(kindName: string, defOrDefs: unknown): this;
|
|
7695
7703
|
/**
|
|
7696
7704
|
* Every def object handed to {@link register}, by identity, so the SAME one
|
|
7697
|
-
* registered twice is caught at the call that did it
|
|
7705
|
+
* registered twice is caught at the call that did it.
|
|
7698
7706
|
*
|
|
7699
7707
|
* Identity, not structure. Two separately constructed defs sharing a name are
|
|
7700
7708
|
* a genuine collision, and the guid check at export already diagnoses that
|
|
@@ -7720,7 +7728,7 @@ declare class Xano {
|
|
|
7720
7728
|
* what `workspace("my-app")` set — so the natural chain
|
|
7721
7729
|
* `workspace("my-app").registerWorkspace(workspaceConfig({ history }))` no
|
|
7722
7730
|
* longer makes an author restate a name this registry has held since its
|
|
7723
|
-
* first call
|
|
7731
|
+
* first call. An explicit `name` still wins, and a rename this way is
|
|
7724
7732
|
* a rename of the workspace.
|
|
7725
7733
|
*/
|
|
7726
7734
|
registerWorkspace(def: WorkspaceConfigDef): this;
|
|
@@ -7782,7 +7790,7 @@ declare class Xano {
|
|
|
7782
7790
|
* With `options.strict`, every build WARNING fails the export instead of
|
|
7783
7791
|
* printing — the shapes that deploy clean and then lose data or return the
|
|
7784
7792
|
* wrong rows. Nothing about the emitted bundle changes; it either exports or
|
|
7785
|
-
* it does not
|
|
7793
|
+
* it does not.
|
|
7786
7794
|
*/
|
|
7787
7795
|
export(options?: {
|
|
7788
7796
|
lock?: LockExportContext;
|
|
@@ -7815,7 +7823,7 @@ declare class Xano {
|
|
|
7815
7823
|
private validateQueryAuth;
|
|
7816
7824
|
/**
|
|
7817
7825
|
* Warn about an `auth()`-keyed middleware **directly attached** to a host where
|
|
7818
|
-
* `auth()` may resolve to `null
|
|
7826
|
+
* `auth()` may resolve to `null`.
|
|
7819
7827
|
*
|
|
7820
7828
|
* The footgun: a rate limiter keyed by `auth("id")` is the canonical middleware,
|
|
7821
7829
|
* but attach it to a host with no authenticated caller and `auth()` silently
|
|
@@ -7830,7 +7838,7 @@ declare class Xano {
|
|
|
7830
7838
|
* false positives on legitimate use. The warning names the host and reason so
|
|
7831
7839
|
* the author can confirm intent, vary the key, or move to an authenticated host.
|
|
7832
7840
|
*
|
|
7833
|
-
* Scope: the host's EFFECTIVE chain, across all three tiers
|
|
7841
|
+
* Scope: the host's EFFECTIVE chain, across all three tiers. The
|
|
7834
7842
|
* guard used to see only a host's own `middleware.pre`/`post`, so an author who
|
|
7835
7843
|
* DRY'd a per-user limiter up to `apiGroup({ middleware })` or to the workspace
|
|
7836
7844
|
* tier silently reintroduced the shared bucket — the same collapse, attached
|
|
@@ -7917,7 +7925,7 @@ declare function emitBundle(xano: Xano, opts?: {
|
|
|
7917
7925
|
* choke point instead makes reference and target agree everywhere by
|
|
7918
7926
|
* construction, with zero changes at call sites.
|
|
7919
7927
|
*
|
|
7920
|
-
* That yields the seeding contract
|
|
7928
|
+
* That yields the seeding contract: **seed once per process, BEFORE any
|
|
7921
7929
|
* def module is evaluated.** Node's module cache means seeding after defs have
|
|
7922
7930
|
* loaded is a silent no-op for already-baked references. The CLI honors this
|
|
7923
7931
|
* automatically (it seeds before importing the workspace entry); programmatic
|