@lunora/codegen 1.0.0-alpha.147 → 1.0.0-alpha.149
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/dist/index.d.mts +64 -12
- package/dist/index.d.ts +64 -12
- package/dist/index.mjs +1 -1
- package/dist/packem_shared/DEFAULT_TARGET-lPq34YeN.mjs +1 -0
- package/dist/packem_shared/{GENERATED_HEADER-Dfc3qlLQ.mjs → GENERATED_HEADER--PCtJMQc.mjs} +1 -1
- package/dist/packem_shared/{MUTATORS_FILENAME-BKSzaCkq.mjs → MUTATORS_FILENAME-DHX1qUP5.mjs} +1 -1
- package/dist/packem_shared/{OPENRPC_VERSION-CdKqq_QT.mjs → OPENRPC_VERSION-C4UXIUyy.mjs} +1 -1
- package/dist/packem_shared/SCHEMA_SNAPSHOT_FILENAME-DazENDSB.mjs +9 -0
- package/dist/packem_shared/SCHEMA_SNAPSHOT_VERSION-B1BUjuG5.mjs +2 -0
- package/dist/packem_shared/{SHAPES_FILENAME-D3N7xcEk.mjs → SHAPES_FILENAME-DhZ3JkkH.mjs} +1 -1
- package/dist/packem_shared/SchemaSnapshotParseError-yZc-1mxR.mjs +18 -0
- package/dist/packem_shared/{buildOpenApiDocument-D40ZeYsu.mjs → buildOpenApiDocument-D5xOB07T.mjs} +1 -1
- package/dist/packem_shared/{discoverFunctions-C29Tvxas.mjs → discoverFunctions-CXURzTDU.mjs} +1 -1
- package/dist/packem_shared/{discoverHttpRoutes-CFIXlUy4.mjs → discoverHttpRoutes-2XhMbeh5.mjs} +1 -1
- package/dist/packem_shared/{discoverSchema-CubSTjtY.mjs → discoverSchema-D5XGH2wu.mjs} +1 -1
- package/dist/packem_shared/{emit-BcAkLUfn.mjs → emit-CXfWb_pY.mjs} +235 -235
- package/dist/packem_shared/{emitApp-DoR55vKV.mjs → emitApp-DcrQNgaz.mjs} +43 -8
- package/dist/packem_shared/parse-validator-CMV0eq2a.mjs +1 -0
- package/package.json +10 -10
- package/dist/packem_shared/DEFAULT_TARGET-BvzxeWRZ.mjs +0 -1
- package/dist/packem_shared/SCHEMA_SNAPSHOT_FILENAME-CeOctEWC.mjs +0 -9
- package/dist/packem_shared/SCHEMA_SNAPSHOT_VERSION-CTWRkAF5.mjs +0 -2
- package/dist/packem_shared/SchemaSnapshotParseError-qXCOA7dD.mjs +0 -18
- package/dist/packem_shared/parse-validator-Q58kladC.mjs +0 -1
package/dist/index.d.mts
CHANGED
|
@@ -9,12 +9,50 @@ import { JsonSchema } from '@lunora/values';
|
|
|
9
9
|
import { LanguageName } from 'quicktype-core';
|
|
10
10
|
/** Current snapshot format version. Bumped if the structural shape below changes. */
|
|
11
11
|
declare const SCHEMA_SNAPSHOT_VERSION: 1;
|
|
12
|
-
/**
|
|
12
|
+
/**
|
|
13
|
+
* A single field's structural shape.
|
|
14
|
+
*
|
|
15
|
+
* `kind` + `optional` were once the whole record, which made every change INSIDE
|
|
16
|
+
* a validator invisible to the diff, to the serialized baseline, and to the
|
|
17
|
+
* content hash — `v.id("users")` → `v.id("orgs")`, `v.array(v.string())` →
|
|
18
|
+
* `v.array(v.bigint())` (which changes the storage projection), a swapped union
|
|
19
|
+
* member, an added `.unique()`. Zero drift, byte-identical snapshot, same hash,
|
|
20
|
+
* so `recordSchemaVersion` did not even append a ledger row.
|
|
21
|
+
*
|
|
22
|
+
* Everything past `optional` is therefore recorded too. All of it is declared
|
|
23
|
+
* OPTIONAL so a baseline written before the deepening still parses (no
|
|
24
|
+
* {@link SCHEMA_SNAPSHOT_VERSION} bump, which `parseSnapshotJson` would turn into
|
|
25
|
+
* a hard reject with no upgrade path) — see {@link recordsFieldDetail} for how the
|
|
26
|
+
* differ tells "this baseline predates the detail" from "this field has none".
|
|
27
|
+
*/
|
|
13
28
|
interface FieldSnapshot {
|
|
29
|
+
/** `v.object({…})` member shapes, key-sorted. */
|
|
30
|
+
fields?: Record<string, FieldSnapshot>;
|
|
31
|
+
/** `v.record(key, …)` key shape. */
|
|
32
|
+
key?: FieldSnapshot;
|
|
14
33
|
/** The validator kind (`string`, `number`, `id`, `object`, …) after unwrapping `v.optional`. */
|
|
15
34
|
kind: string;
|
|
35
|
+
/** `v.literal(value)` — the literal as source text. */
|
|
36
|
+
literal?: string;
|
|
37
|
+
/** `v.union(…)` members, in canonical (not declaration) order — a union is a set. */
|
|
38
|
+
members?: ReadonlyArray<FieldSnapshot>;
|
|
39
|
+
/** `.nullable()` — the column accepts SQL NULL. Always written by a current snapshot. */
|
|
40
|
+
nullable?: boolean;
|
|
41
|
+
/** `v.array(inner)` element / `v.record(…, value)` value shape. */
|
|
42
|
+
of?: FieldSnapshot;
|
|
16
43
|
/** True when declared `v.optional(...)` — accepts `undefined` / absent on insert. */
|
|
17
44
|
optional: boolean;
|
|
45
|
+
/** `v.id("table")` — the referenced table. */
|
|
46
|
+
ref?: string;
|
|
47
|
+
/**
|
|
48
|
+
* A `.check()`/`.max()`/`.email()`/… predicate is declared on the column. Only
|
|
49
|
+
* its PRESENCE is knowable — the IR cannot represent the closure — so
|
|
50
|
+
* `.max(200)` → `.max(500)` stays invisible; adding the first refinement to a
|
|
51
|
+
* populated column does not.
|
|
52
|
+
*/
|
|
53
|
+
refined?: boolean;
|
|
54
|
+
/** `.unique()`. Always written by a current snapshot — see {@link recordsFieldDetail}. */
|
|
55
|
+
unique?: boolean;
|
|
18
56
|
}
|
|
19
57
|
/** A single secondary index's structural shape. */
|
|
20
58
|
interface IndexSnapshot {
|
|
@@ -113,7 +151,7 @@ interface DriftChange {
|
|
|
113
151
|
/** The table this change belongs to. Always set when `scope` is `"table"`. */
|
|
114
152
|
table?: string;
|
|
115
153
|
/** A machine-readable change discriminator. */
|
|
116
|
-
type: "addedIndex" | "addedOptionalField" | "addedRelation" | "addedRequiredField" | "addedTable" | "changedFieldKind" | "changedIndex" | "changedJurisdiction" | "changedShardMode" | "fieldOptionalToRequired" | "fieldRequiredToOptional" | "removedField" | "removedIndex" | "removedRelation" | "removedTable";
|
|
154
|
+
type: "addedFieldConstraint" | "addedIndex" | "addedOptionalField" | "addedRelation" | "addedRequiredField" | "addedTable" | "changedFieldKind" | "changedFieldShape" | "changedIndex" | "changedJurisdiction" | "changedShardMode" | "fieldOptionalToRequired" | "fieldRequiredToOptional" | "relaxedFieldConstraint" | "removedField" | "removedIndex" | "removedRelation" | "removedTable" | "widenedFieldShape";
|
|
117
155
|
}
|
|
118
156
|
/** The result of diffing two snapshots: every classified change. */
|
|
119
157
|
interface SchemaDrift {
|
|
@@ -151,12 +189,11 @@ interface ValidatorIR {
|
|
|
151
189
|
/** Column modifiers (`.unique()`, `.default()`, `.nullable()`, …) when present. */
|
|
152
190
|
column?: ColumnMetaIR;
|
|
153
191
|
/**
|
|
154
|
-
* `true` when this validator carries a `.check(...)
|
|
155
|
-
*
|
|
156
|
-
*
|
|
157
|
-
*
|
|
158
|
-
*
|
|
159
|
-
* NOT set this.
|
|
192
|
+
* `true` when this validator carries a refinement (`.check(...)`, `.max(n)`,
|
|
193
|
+
* `.email()`, …) — anything that narrows the accepted values without changing
|
|
194
|
+
* the kind. `schema-drift` hashes this, so a bound counts here even when it is
|
|
195
|
+
* modelled below. `.meta(...)` is pure metadata with no parse effect and does
|
|
196
|
+
* NOT set it.
|
|
160
197
|
*/
|
|
161
198
|
hasRefinement?: boolean;
|
|
162
199
|
/** For `v.optional(inner)` / `v.array(inner)`. */
|
|
@@ -173,6 +210,13 @@ interface ValidatorIR {
|
|
|
173
210
|
shape?: Record<string, ValidatorIR>;
|
|
174
211
|
/** Verbatim source text — used in emitted code when we can't reconstruct from AST. */
|
|
175
212
|
sourceText?: string;
|
|
213
|
+
/**
|
|
214
|
+
* The `n` of a `v.string().max(n)` written with a numeric literal — the one
|
|
215
|
+
* refinement predicate the IR can represent exactly (`value.length <= n`).
|
|
216
|
+
* The AOT compiler emits it as a guard instead of declining the node, which
|
|
217
|
+
* is what keeps a length-bounded public argument on the fast path.
|
|
218
|
+
*/
|
|
219
|
+
stringMaxLength?: number;
|
|
176
220
|
/** For `v.id("table")` — the table name. */
|
|
177
221
|
tableName?: string;
|
|
178
222
|
/**
|
|
@@ -183,6 +227,13 @@ interface ValidatorIR {
|
|
|
183
227
|
* type falls back to `unknown`.
|
|
184
228
|
*/
|
|
185
229
|
tsType?: string;
|
|
230
|
+
/**
|
|
231
|
+
* `true` when this validator carries a refinement the IR could NOT model — a
|
|
232
|
+
* `.check(...)` closure, `.email()`, `.pattern(re)`, a `.max()` whose bound is
|
|
233
|
+
* not a literal. The AOT args-validator compiler declines any node with this
|
|
234
|
+
* flag, because compiling it would silently skip the predicate.
|
|
235
|
+
*/
|
|
236
|
+
unmodelledRefinement?: boolean;
|
|
186
237
|
valueType?: ValidatorIR;
|
|
187
238
|
}
|
|
188
239
|
interface IndexIR {
|
|
@@ -3003,6 +3054,8 @@ interface EmitServerOptions {
|
|
|
3003
3054
|
hasPipelines?: boolean;
|
|
3004
3055
|
/** A `lunora/` source uses `@lunora/bindings/r2sql` / `ctx.r2sql` — wires `ctx.r2sql` onto ActionCtx only. */
|
|
3005
3056
|
hasR2sql?: boolean;
|
|
3057
|
+
/** The target platform supports a vector store. `false` withholds `ctx.vectors` even when the schema declares an index. */
|
|
3058
|
+
hasVectors?: boolean;
|
|
3006
3059
|
/** A `lunora/` source uses `@lunora/x402/pay` / `ctx.x402` — wires the agent-wallet pay rail onto ActionCtx only. */
|
|
3007
3060
|
hasX402?: boolean;
|
|
3008
3061
|
/**
|
|
@@ -3022,7 +3075,7 @@ interface EmitServerOptions {
|
|
|
3022
3075
|
useUmbrella?: boolean;
|
|
3023
3076
|
workflows?: ReadonlyArray<WorkflowIR>;
|
|
3024
3077
|
}
|
|
3025
|
-
declare const emitServer: ({ agents, containers, env, hasAccessFacade, hasAi, hasAnalytics, hasBrowser, hasFlags, hasHyperdrive, hasImages, hasKv, hasNotify, hasPayments, hasPipelines, hasR2sql, hasX402, identity, queues, schema, storageRuleBuckets, useUmbrella, workflows }?: EmitServerOptions) => string;
|
|
3078
|
+
declare const emitServer: ({ agents, containers, env, hasAccessFacade, hasAi, hasAnalytics, hasBrowser, hasVectors, hasFlags, hasHyperdrive, hasImages, hasKv, hasNotify, hasPayments, hasPipelines, hasR2sql, hasX402, identity, queues, schema, storageRuleBuckets, useUmbrella, workflows }?: EmitServerOptions) => string;
|
|
3026
3079
|
interface EmitFunctionsOptions {
|
|
3027
3080
|
agents?: ReadonlyArray<AgentIR>;
|
|
3028
3081
|
functions: ReadonlyArray<FunctionIR>;
|
|
@@ -3381,9 +3434,8 @@ declare const emitOpenRpcModule: (document_: Record<string, unknown>) => string;
|
|
|
3381
3434
|
* churn) — see `sortKeys` in `shared/schema-snapshot.ts` for why that ordering
|
|
3382
3435
|
* must not be locale-aware.
|
|
3383
3436
|
*
|
|
3384
|
-
* Field / index / relation keys are
|
|
3385
|
-
*
|
|
3386
|
-
* given source file and keeps the snapshot readable next to the schema it mirrors.
|
|
3437
|
+
* Field / index / relation keys are sorted the same way, by `tableSnapshotOf` —
|
|
3438
|
+
* see there for why declaration order was the wrong default for a hashed file.
|
|
3387
3439
|
*/
|
|
3388
3440
|
declare const buildSchemaSnapshot: (schema: SchemaIR, migrationIds: ReadonlyArray<string>) => SchemaSnapshot;
|
|
3389
3441
|
/**
|
package/dist/index.d.ts
CHANGED
|
@@ -9,12 +9,50 @@ import { JsonSchema } from '@lunora/values';
|
|
|
9
9
|
import { LanguageName } from 'quicktype-core';
|
|
10
10
|
/** Current snapshot format version. Bumped if the structural shape below changes. */
|
|
11
11
|
declare const SCHEMA_SNAPSHOT_VERSION: 1;
|
|
12
|
-
/**
|
|
12
|
+
/**
|
|
13
|
+
* A single field's structural shape.
|
|
14
|
+
*
|
|
15
|
+
* `kind` + `optional` were once the whole record, which made every change INSIDE
|
|
16
|
+
* a validator invisible to the diff, to the serialized baseline, and to the
|
|
17
|
+
* content hash — `v.id("users")` → `v.id("orgs")`, `v.array(v.string())` →
|
|
18
|
+
* `v.array(v.bigint())` (which changes the storage projection), a swapped union
|
|
19
|
+
* member, an added `.unique()`. Zero drift, byte-identical snapshot, same hash,
|
|
20
|
+
* so `recordSchemaVersion` did not even append a ledger row.
|
|
21
|
+
*
|
|
22
|
+
* Everything past `optional` is therefore recorded too. All of it is declared
|
|
23
|
+
* OPTIONAL so a baseline written before the deepening still parses (no
|
|
24
|
+
* {@link SCHEMA_SNAPSHOT_VERSION} bump, which `parseSnapshotJson` would turn into
|
|
25
|
+
* a hard reject with no upgrade path) — see {@link recordsFieldDetail} for how the
|
|
26
|
+
* differ tells "this baseline predates the detail" from "this field has none".
|
|
27
|
+
*/
|
|
13
28
|
interface FieldSnapshot {
|
|
29
|
+
/** `v.object({…})` member shapes, key-sorted. */
|
|
30
|
+
fields?: Record<string, FieldSnapshot>;
|
|
31
|
+
/** `v.record(key, …)` key shape. */
|
|
32
|
+
key?: FieldSnapshot;
|
|
14
33
|
/** The validator kind (`string`, `number`, `id`, `object`, …) after unwrapping `v.optional`. */
|
|
15
34
|
kind: string;
|
|
35
|
+
/** `v.literal(value)` — the literal as source text. */
|
|
36
|
+
literal?: string;
|
|
37
|
+
/** `v.union(…)` members, in canonical (not declaration) order — a union is a set. */
|
|
38
|
+
members?: ReadonlyArray<FieldSnapshot>;
|
|
39
|
+
/** `.nullable()` — the column accepts SQL NULL. Always written by a current snapshot. */
|
|
40
|
+
nullable?: boolean;
|
|
41
|
+
/** `v.array(inner)` element / `v.record(…, value)` value shape. */
|
|
42
|
+
of?: FieldSnapshot;
|
|
16
43
|
/** True when declared `v.optional(...)` — accepts `undefined` / absent on insert. */
|
|
17
44
|
optional: boolean;
|
|
45
|
+
/** `v.id("table")` — the referenced table. */
|
|
46
|
+
ref?: string;
|
|
47
|
+
/**
|
|
48
|
+
* A `.check()`/`.max()`/`.email()`/… predicate is declared on the column. Only
|
|
49
|
+
* its PRESENCE is knowable — the IR cannot represent the closure — so
|
|
50
|
+
* `.max(200)` → `.max(500)` stays invisible; adding the first refinement to a
|
|
51
|
+
* populated column does not.
|
|
52
|
+
*/
|
|
53
|
+
refined?: boolean;
|
|
54
|
+
/** `.unique()`. Always written by a current snapshot — see {@link recordsFieldDetail}. */
|
|
55
|
+
unique?: boolean;
|
|
18
56
|
}
|
|
19
57
|
/** A single secondary index's structural shape. */
|
|
20
58
|
interface IndexSnapshot {
|
|
@@ -113,7 +151,7 @@ interface DriftChange {
|
|
|
113
151
|
/** The table this change belongs to. Always set when `scope` is `"table"`. */
|
|
114
152
|
table?: string;
|
|
115
153
|
/** A machine-readable change discriminator. */
|
|
116
|
-
type: "addedIndex" | "addedOptionalField" | "addedRelation" | "addedRequiredField" | "addedTable" | "changedFieldKind" | "changedIndex" | "changedJurisdiction" | "changedShardMode" | "fieldOptionalToRequired" | "fieldRequiredToOptional" | "removedField" | "removedIndex" | "removedRelation" | "removedTable";
|
|
154
|
+
type: "addedFieldConstraint" | "addedIndex" | "addedOptionalField" | "addedRelation" | "addedRequiredField" | "addedTable" | "changedFieldKind" | "changedFieldShape" | "changedIndex" | "changedJurisdiction" | "changedShardMode" | "fieldOptionalToRequired" | "fieldRequiredToOptional" | "relaxedFieldConstraint" | "removedField" | "removedIndex" | "removedRelation" | "removedTable" | "widenedFieldShape";
|
|
117
155
|
}
|
|
118
156
|
/** The result of diffing two snapshots: every classified change. */
|
|
119
157
|
interface SchemaDrift {
|
|
@@ -151,12 +189,11 @@ interface ValidatorIR {
|
|
|
151
189
|
/** Column modifiers (`.unique()`, `.default()`, `.nullable()`, …) when present. */
|
|
152
190
|
column?: ColumnMetaIR;
|
|
153
191
|
/**
|
|
154
|
-
* `true` when this validator carries a `.check(...)
|
|
155
|
-
*
|
|
156
|
-
*
|
|
157
|
-
*
|
|
158
|
-
*
|
|
159
|
-
* NOT set this.
|
|
192
|
+
* `true` when this validator carries a refinement (`.check(...)`, `.max(n)`,
|
|
193
|
+
* `.email()`, …) — anything that narrows the accepted values without changing
|
|
194
|
+
* the kind. `schema-drift` hashes this, so a bound counts here even when it is
|
|
195
|
+
* modelled below. `.meta(...)` is pure metadata with no parse effect and does
|
|
196
|
+
* NOT set it.
|
|
160
197
|
*/
|
|
161
198
|
hasRefinement?: boolean;
|
|
162
199
|
/** For `v.optional(inner)` / `v.array(inner)`. */
|
|
@@ -173,6 +210,13 @@ interface ValidatorIR {
|
|
|
173
210
|
shape?: Record<string, ValidatorIR>;
|
|
174
211
|
/** Verbatim source text — used in emitted code when we can't reconstruct from AST. */
|
|
175
212
|
sourceText?: string;
|
|
213
|
+
/**
|
|
214
|
+
* The `n` of a `v.string().max(n)` written with a numeric literal — the one
|
|
215
|
+
* refinement predicate the IR can represent exactly (`value.length <= n`).
|
|
216
|
+
* The AOT compiler emits it as a guard instead of declining the node, which
|
|
217
|
+
* is what keeps a length-bounded public argument on the fast path.
|
|
218
|
+
*/
|
|
219
|
+
stringMaxLength?: number;
|
|
176
220
|
/** For `v.id("table")` — the table name. */
|
|
177
221
|
tableName?: string;
|
|
178
222
|
/**
|
|
@@ -183,6 +227,13 @@ interface ValidatorIR {
|
|
|
183
227
|
* type falls back to `unknown`.
|
|
184
228
|
*/
|
|
185
229
|
tsType?: string;
|
|
230
|
+
/**
|
|
231
|
+
* `true` when this validator carries a refinement the IR could NOT model — a
|
|
232
|
+
* `.check(...)` closure, `.email()`, `.pattern(re)`, a `.max()` whose bound is
|
|
233
|
+
* not a literal. The AOT args-validator compiler declines any node with this
|
|
234
|
+
* flag, because compiling it would silently skip the predicate.
|
|
235
|
+
*/
|
|
236
|
+
unmodelledRefinement?: boolean;
|
|
186
237
|
valueType?: ValidatorIR;
|
|
187
238
|
}
|
|
188
239
|
interface IndexIR {
|
|
@@ -3003,6 +3054,8 @@ interface EmitServerOptions {
|
|
|
3003
3054
|
hasPipelines?: boolean;
|
|
3004
3055
|
/** A `lunora/` source uses `@lunora/bindings/r2sql` / `ctx.r2sql` — wires `ctx.r2sql` onto ActionCtx only. */
|
|
3005
3056
|
hasR2sql?: boolean;
|
|
3057
|
+
/** The target platform supports a vector store. `false` withholds `ctx.vectors` even when the schema declares an index. */
|
|
3058
|
+
hasVectors?: boolean;
|
|
3006
3059
|
/** A `lunora/` source uses `@lunora/x402/pay` / `ctx.x402` — wires the agent-wallet pay rail onto ActionCtx only. */
|
|
3007
3060
|
hasX402?: boolean;
|
|
3008
3061
|
/**
|
|
@@ -3022,7 +3075,7 @@ interface EmitServerOptions {
|
|
|
3022
3075
|
useUmbrella?: boolean;
|
|
3023
3076
|
workflows?: ReadonlyArray<WorkflowIR>;
|
|
3024
3077
|
}
|
|
3025
|
-
declare const emitServer: ({ agents, containers, env, hasAccessFacade, hasAi, hasAnalytics, hasBrowser, hasFlags, hasHyperdrive, hasImages, hasKv, hasNotify, hasPayments, hasPipelines, hasR2sql, hasX402, identity, queues, schema, storageRuleBuckets, useUmbrella, workflows }?: EmitServerOptions) => string;
|
|
3078
|
+
declare const emitServer: ({ agents, containers, env, hasAccessFacade, hasAi, hasAnalytics, hasBrowser, hasVectors, hasFlags, hasHyperdrive, hasImages, hasKv, hasNotify, hasPayments, hasPipelines, hasR2sql, hasX402, identity, queues, schema, storageRuleBuckets, useUmbrella, workflows }?: EmitServerOptions) => string;
|
|
3026
3079
|
interface EmitFunctionsOptions {
|
|
3027
3080
|
agents?: ReadonlyArray<AgentIR>;
|
|
3028
3081
|
functions: ReadonlyArray<FunctionIR>;
|
|
@@ -3381,9 +3434,8 @@ declare const emitOpenRpcModule: (document_: Record<string, unknown>) => string;
|
|
|
3381
3434
|
* churn) — see `sortKeys` in `shared/schema-snapshot.ts` for why that ordering
|
|
3382
3435
|
* must not be locale-aware.
|
|
3383
3436
|
*
|
|
3384
|
-
* Field / index / relation keys are
|
|
3385
|
-
*
|
|
3386
|
-
* given source file and keeps the snapshot readable next to the schema it mirrors.
|
|
3437
|
+
* Field / index / relation keys are sorted the same way, by `tableSnapshotOf` —
|
|
3438
|
+
* see there for why declaration order was the wrong default for a hashed file.
|
|
3387
3439
|
*/
|
|
3388
3440
|
declare const buildSchemaSnapshot: (schema: SchemaIR, migrationIds: ReadonlyArray<string>) => SchemaSnapshot;
|
|
3389
3441
|
/**
|
package/dist/index.mjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{SCHEMA_SNAPSHOT_VERSION as t,diffSchemaSnapshots as s,serializeSchemaSnapshot as a}from"./packem_shared/SCHEMA_SNAPSHOT_VERSION-
|
|
1
|
+
import{SCHEMA_SNAPSHOT_VERSION as t,diffSchemaSnapshots as s,serializeSchemaSnapshot as a}from"./packem_shared/SCHEMA_SNAPSHOT_VERSION-B1BUjuG5.mjs";import{formatAdvisories as m,lintSchema as d,toAdvisorContext as f}from"./packem_shared/formatAdvisories-CkEu1eye.mjs";import{describeErrorLevelFindings as c,errorAdvisoryNames as n,errorPlatformDiagnosticNames as l}from"./packem_shared/describeErrorLevelFindings-D23VSkFP.mjs";import{CodegenDiagnosticError as x,diagnosticAt as E}from"./packem_shared/CodegenDiagnosticError-BUXlG3P-.mjs";import{AGENTS_FILENAME as u,discoverAgents as v}from"./packem_shared/AGENTS_FILENAME-B1Abt3Gl.mjs";import{default as g}from"./packem_shared/discoverAuthApiCalls-DoNQSgso.mjs";import{CONTAINERS_FILENAME as R,discoverContainers as C}from"./packem_shared/CONTAINERS_FILENAME-CtcysaKS.mjs";import{default as h}from"./packem_shared/discoverCrons-DCxl4hty.mjs";import{FLAGS_FILENAME as T,discoverFlags as I}from"./packem_shared/FLAGS_FILENAME-B3VZ6vTw.mjs";import{default as F}from"./packem_shared/discoverFunctions-CXURzTDU.mjs";import{default as P}from"./packem_shared/discoverHttpRoutes-2XhMbeh5.mjs";import{default as G}from"./packem_shared/discoverHyperdriveCalls-DTq4PKT5.mjs";import{default as b}from"./packem_shared/discoverInserts-qU5F4W4g.mjs";import{d as y}from"./packem_shared/index-xGhyK9J_.mjs";import{default as j}from"./packem_shared/discoverMigrations-BFkJQ8Sy.mjs";import{MUTATORS_FILENAME as V,discoverMutators as z}from"./packem_shared/MUTATORS_FILENAME-DHX1qUP5.mjs";import{default as w}from"./packem_shared/discoverNondeterministicCalls-B-NNzzPW.mjs";import{NOTIFY_FILENAME as B,discoverNotifyCalls as J,discoverNotifyConfig as Y}from"./packem_shared/NOTIFY_FILENAME-CKO5gtGe.mjs";import{default as Z}from"./packem_shared/readPackageDependencies-C6h6FZuP.mjs";import{d as ee}from"./packem_shared/queries-Ddvo5dCs.mjs";import{QUEUES_FILENAME as oe,discoverQueues as te}from"./packem_shared/QUEUES_FILENAME-C-pzLGy4.mjs";import{default as ae}from"./packem_shared/discoverR2sqlCalls-C2GtrFnl.mjs";import{default as me}from"./packem_shared/discoverRlsProcedures-fAhxiIyD.mjs";import{default as fe}from"./packem_shared/discoverRlsMetadata-BKcUnSNr.mjs";import{discoverSandboxUsage as ce}from"./packem_shared/discoverSandboxUsage-CJhnKA0_.mjs";import{default as le}from"./packem_shared/discoverSchema-D5XGH2wu.mjs";import{SHAPES_FILENAME as xe,discoverShapes as Ee}from"./packem_shared/SHAPES_FILENAME-DhZ3JkkH.mjs";import{default as ue}from"./packem_shared/discoverStorageRulesMetadata-C7XmORWp.mjs";import{WORKFLOWS_FILENAME as Ne,discoverWorkflows as ge}from"./packem_shared/WORKFLOWS_FILENAME-BfvqsG9Z.mjs";import{G as Re,e as Ce,a as Me,b as he,c as _e,d as Te,f as Ie,g as Le,h as Fe,i as De,j as Pe,k as Ue,l as Ge,m as He}from"./packem_shared/emit-CXfWb_pY.mjs";import{emitApp as ke}from"./packem_shared/emitApp-DcrQNgaz.mjs";import{buildOpenApiDocument as We,emitOpenApi as je,emitOpenApiModule as Ke}from"./packem_shared/buildOpenApiDocument-D5xOB07T.mjs";import{OPENRPC_VERSION as ze,buildOpenRpcDocument as Qe,emitOpenRpc as we,emitOpenRpcModule as qe}from"./packem_shared/OPENRPC_VERSION-C4UXIUyy.mjs";import{DEFAULT_TARGET as Je,platformMatrixIds as Ye,readProjectTarget as Xe,resolveCodegenTarget as Ze}from"./packem_shared/DEFAULT_TARGET-lPq34YeN.mjs";import{SCHEMA_SNAPSHOT_FILENAME as er,createCodegenProject as rr,findTsconfig as or,refreshCodegenProject as tr,runCodegen as sr}from"./packem_shared/SCHEMA_SNAPSHOT_FILENAME-DazENDSB.mjs";import{SchemaSnapshotParseError as ir,buildSchemaSnapshot as mr,evaluateSchemaDrift as dr,parseSchemaSnapshot as fr}from"./packem_shared/SchemaSnapshotParseError-yZc-1mxR.mjs";import{schemaFromIr as cr}from"./packem_shared/schemaFromIr-BWFnvCVg.mjs";import{LUNORA_ERROR_CODES as lr,validatorIrToJsonSchema as Sr}from"./packem_shared/LUNORA_ERROR_CODES-BYg8Lpgb.mjs";import{SDK_LANGUAGES as Er,SDK_TARGETS as Ar,generateSdk as ur}from"./packem_shared/SDK_LANGUAGES-CFyux-74.mjs";import{redact as Nr,secretKindOf as gr}from"./packem_shared/redact-Cy14LEnc.mjs";import{MESSAGE_SOLUTIONS as Rr,findSolutionByMessage as Cr}from"@lunora/errors";import{isTypedSchema as hr}from"./packem_shared/isTypedSchema-B_qlBbE-.mjs";const e="0.0.0";export{u as AGENTS_FILENAME,R as CONTAINERS_FILENAME,x as CodegenDiagnosticError,Je as DEFAULT_TARGET,T as FLAGS_FILENAME,Re as GENERATED_HEADER,lr as LUNORA_ERROR_CODES,Rr as LUNORA_SOLUTION_RULES,V as MUTATORS_FILENAME,B as NOTIFY_FILENAME,ze as OPENRPC_VERSION,oe as QUEUES_FILENAME,er as SCHEMA_SNAPSHOT_FILENAME,t as SCHEMA_SNAPSHOT_VERSION,Er as SDK_LANGUAGES,Ar as SDK_TARGETS,xe as SHAPES_FILENAME,ir as SchemaSnapshotParseError,e as VERSION,Ne as WORKFLOWS_FILENAME,We as buildOpenApiDocument,Qe as buildOpenRpcDocument,mr as buildSchemaSnapshot,rr as createCodegenProject,c as describeErrorLevelFindings,E as diagnosticAt,s as diffSchemaSnapshots,v as discoverAgents,g as discoverAuthApiCalls,C as discoverContainers,h as discoverCrons,I as discoverFlags,F as discoverFunctions,P as discoverHttpRoutes,G as discoverHyperdriveCalls,b as discoverInserts,y as discoverMaskProcedures,j as discoverMigrations,z as discoverMutators,w as discoverNondeterministicCalls,J as discoverNotifyCalls,Y as discoverNotifyConfig,ee as discoverQueries,te as discoverQueues,ae as discoverR2sqlCalls,fe as discoverRlsMetadata,me as discoverRlsProcedures,ce as discoverSandboxUsage,le as discoverSchema,Ee as discoverShapes,ue as discoverStorageRulesMetadata,ge as discoverWorkflows,Ce as emitAgents,Me as emitApi,ke as emitApp,he as emitCollections,_e as emitContainers,Te as emitCrons,Ie as emitDataModel,Le as emitDrizzleSchema,Fe as emitFunctions,je as emitOpenApi,Ke as emitOpenApiModule,we as emitOpenRpc,qe as emitOpenRpcModule,De as emitServer,Pe as emitShard,Ue as emitVectors,Ge as emitWorkflows,He as emitWranglerCronTriggers,n as errorAdvisoryNames,l as errorPlatformDiagnosticNames,dr as evaluateSchemaDrift,Cr as findLunoraSolution,or as findTsconfig,m as formatAdvisories,ur as generateSdk,hr as isTypedSchema,d as lintSchema,fr as parseSchemaSnapshot,Ye as platformMatrixIds,Z as readPackageDependencies,Xe as readProjectTarget,Nr as redact,tr as refreshCodegenProject,Ze as resolveCodegenTarget,sr as runCodegen,cr as schemaFromIr,gr as secretKindOf,a as serializeSchemaSnapshot,f as toAdvisorContext,Sr as validatorIrToJsonSchema};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{existsSync as m,readFileSync as f}from"node:fs";import{join as g}from"node:path";import{NODE_CAPABILITIES as h,CLOUDFLARE_CAPABILITIES as v}from"@lunora/platform";import{parse as b}from"jsonc-parser";const y="cloudflare",S="lunora.json",T=t=>{const e=g(t,S);if(!m(e))return;let r;try{r=f(e,"utf8")}catch{return}const o=[],n=b(r,o,{allowTrailingComma:!0});if(o.length>0||n===null||typeof n!="object")return;const{target:l}=n;return typeof l=="string"&&l.length>0?l:void 0},F=(t,e)=>e??T(t)??y,d={cloudflare:v,node:h},R=()=>Object.keys(d).toSorted((t,e)=>t.localeCompare(e)),_={access:null,ai:"ai",analytics:"analytics",browser:"browser",container:"containers",flags:null,hyperdrive:"hyperdrive",images:"images",kv:"keyValueStore",mail:"mail",notify:null,payments:null,pipelines:"pipelines",r2sql:null,scheduler:"scheduler",storage:"objectStorage",vectors:"vectorStore",workflows:"workflows",x402:null},$=["agents","commitOrderedTables","cronTriggers","crossShardFanout","durableStreams","globalTables","queues","secrets","vectorStore"],p={agents:"durable agents (`defineAgent`)",commitOrderedTables:"commit-ordered tables (`.commitOrdered()`)",cronTriggers:"declared cron triggers (`cronJobs()`)",crossShardFanout:"cross-shard fan-out queries (a `.shardBy(...)` schema)",durableStreams:"durable streams (`.stream(handler, { durable: true })`)",globalTables:"global tables (`.global()`)",queues:"queues (`defineQueue`)",secrets:"the secrets store (`ctx.secrets`)",vectorStore:"vector indexes (`.vectorize()`)"},A=(t,e,r)=>({level:"error",message:`${e.name} does not support ${p[t]}, which this app declares.`,name:"platform_unsupported_feature",remediation:`Remove the declaration, or deploy to a target whose capability matrix marks "${t}" as native or emulated.`,target:r}),x=(t,e,r)=>({level:"error",message:`${e.name}'s capability matrix does not declare a support level for ${p[t]}, which this app declares. Treated as unsupported.`,name:"platform_undeclared_feature",remediation:`Rate "${t}" in the ${e.name} capability matrix as "native", "emulated", or "unsupported" — an undeclared feature fails closed rather than letting the app deploy onto a primitive the host may not provide.`,target:r}),w=t=>{const{diagnostics:e,gatedSignals:r,matrix:o,reported:n,signals:l,target:i}=t;for(const s of $){if(l[s]!==!0)continue;const a=o.features[s]?.level;a!=="unsupported"&&a!==void 0||(r[s]=!1,!n.has(s)&&e.push(a==="unsupported"?A(s,o,i):x(s,o,i)))}},E=(t,e,r,o={})=>{const n={...t},l={...o},i=[],s=new Set;for(const[a,c]of Object.entries(_)){if(c===null||!t[a])continue;const u=e.features[c]?.level;u==="unsupported"?(n[a]=!1,s.add(c),i.push({feature:a,level:"error",message:`${e.name} does not support "${a}" (ctx.${a}).`,name:"platform_unsupported_feature",remediation:`Remove the ctx.${a} usage, or deploy to a target whose capability matrix marks "${c}" as native or emulated.`,target:r})):u===void 0&&(n[a]=!1,s.add(c),i.push({feature:a,level:"error",message:`${e.name}'s capability matrix does not declare a support level for "${a}" (ctx.${a}). Treated as unsupported.`,name:"platform_undeclared_feature",remediation:`Rate "${c}" in the ${e.name} capability matrix as "native", "emulated", or "unsupported" — an undeclared feature fails closed rather than shipping a surface the host may not provide.`,target:r}))}return w({diagnostics:i,gatedSignals:l,matrix:e,reported:s,signals:o,target:r}),{diagnostics:i,signals:l,usage:n}},P=(t,e,r={})=>{const o=d[e];return o===void 0?{diagnostics:[{level:"error",message:`Unknown deploy target "${e}" — no capability matrix is registered for it. Codegen emitted the full Cloudflare surface un-gated.`,name:"platform_unknown_target",remediation:`Use a registered target (${Object.keys(d).join(", ")}) or install the target's @lunora/platform-${e} package.`,target:e}],signals:{...r},usage:{...t}}:E(t,o,e,r)};export{_ as CAPABILITY_TO_FEATURE,y as DEFAULT_TARGET,S as PROJECT_CONFIG_FILE,E as gateAgainstMatrix,P as gatePlatformFeatures,R as platformMatrixIds,T as readProjectTarget,F as resolveCodegenTarget};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import"./SCHEMA_SNAPSHOT_VERSION-
|
|
1
|
+
import"./SCHEMA_SNAPSHOT_VERSION-B1BUjuG5.mjs";import{G as t,U as m,n as r,e as o,a as n,b as l,c as A,d as E,f as S,g,h as C,o as c,p as d,i as p,j as u,k as D,l as f,m as h}from"./emit-CXfWb_pY.mjs";import"./paths-C-9fwEgQ.mjs";export{t as GENERATED_HEADER,m as UMBRELLA_BASE_PACKAGES,r as buildStorageColumns,o as emitAgents,n as emitApi,l as emitCollections,A as emitContainers,E as emitCrons,S as emitDataModel,g as emitDrizzleSchema,C as emitFunctions,c as emitQueues,d as emitSeed,p as emitServer,u as emitShard,D as emitVectors,f as emitWorkflows,h as emitWranglerCronTriggers};
|
package/dist/packem_shared/{MUTATORS_FILENAME-BKSzaCkq.mjs → MUTATORS_FILENAME-DHX1qUP5.mjs}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{existsSync as f}from"node:fs";import{join as p}from"node:path";import{Node as o,SyntaxKind as c}from"ts-morph";import{diagnosticAt as l}from"./CodegenDiagnosticError-BUXlG3P-.mjs";import{a as g}from"./module-specifiers-WF8iAydP.mjs";import{a as d}from"./parse-validator-
|
|
1
|
+
import{existsSync as f}from"node:fs";import{join as p}from"node:path";import{Node as o,SyntaxKind as c}from"ts-morph";import{diagnosticAt as l}from"./CodegenDiagnosticError-BUXlG3P-.mjs";import{a as g}from"./module-specifiers-WF8iAydP.mjs";import{a as d}from"./parse-validator-CMV0eq2a.mjs";import{u as x}from"./unwrap-handler-return-CmIWbykC.mjs";const M="mutators.ts",m=g,y=r=>{const t=r.getSymbol();if(!t)return r.getText()==="defineMutator";for(const e of t.getDeclarations())if(o.isImportSpecifier(e))return m(e.getImportDeclaration().getModuleSpecifierValue())?e.getNameNode().getText()==="defineMutator":!1;return!1},S=r=>{const t=r.getSymbol();if(!t)return!1;for(const e of t.getDeclarations()){if(!o.isNamespaceImport(e))continue;const i=e.getFirstAncestorByKind(c.ImportDeclaration);return i!==void 0&&m(i.getModuleSpecifierValue())}return!1},N=r=>{if(o.isIdentifier(r))return y(r);if(o.isPropertyAccessExpression(r)){const t=r.getExpression();return r.getName()==="defineMutator"&&o.isIdentifier(t)&&S(t)}return!1},I=r=>{const t=r.getArguments()[0];return t&&o.isObjectLiteralExpression(t)?t:void 0},b=r=>{const t=r?.getProperty("args");if(!t||!o.isPropertyAssignment(t))return{};const e=t.getInitializer();return e&&o.isObjectLiteralExpression(e)?d(e):{}},A=r=>{const t=r?.getProperty("server");if(!t||!o.isPropertyAssignment(t))return"unknown";const e=t.getInitializer();return!e||!(o.isArrowFunction(e)||o.isFunctionExpression(e))?"unknown":x(e)},E=r=>{const t=[];for(const e of r.getVariableDeclarations()){if(!e.isExported())continue;const i=e.getInitializer();if(i?.getKind()!==c.CallExpression)continue;const n=i,a=n.getExpression();if(!N(a))continue;const s=e.getNameNode();if(!o.isIdentifier(s))throw l(s,"defineMutator exports must be plain named exports (no destructuring)");const u=I(n);t.push({args:b(u),exportName:s.getText(),filePath:"mutators",returnType:A(u)})}return t},w=(r,t)=>{const e=p(t,M);if(!f(e))return[];const i=r.getSourceFile(e)??r.addSourceFileAtPath(e),n=E(i);return n.sort((a,s)=>a.exportName.localeCompare(s.exportName)),n};export{M as MUTATORS_FILENAME,w as discoverMutators,N as isDefineMutatorCallee};
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import{G as c}from"./emit-
|
|
1
|
+
import{G as c}from"./emit-CXfWb_pY.mjs";import{s as u}from"./paths-C-9fwEgQ.mjs";import{validatorIrToJsonSchema as m,objectSchema as p,LUNORA_ERROR_CODES as i}from"./LUNORA_ERROR_CODES-BYg8Lpgb.mjs";const l="1.3.2",d={description:"Result is TS-inferred from the function's return type (no `.output()` declared); best-effort — any JSON."},R=e=>{const n=u(e.filePath),o=`${n}:${e.exportName}`;return{description:`Invoke the \`${e.kind}\` \`${o}\` over the Lunora RPC envelope (POST /_lunora/rpc, body \`{ "functionPath": "${o}", "args": { … } }\`).`,errors:i.map((r,s)=>({code:-32e3-s,data:{code:r},message:r})),name:o,params:[{description:"The function's argument object (the RPC envelope's `args`).",name:"args",required:Object.keys(e.args).length>0,schema:p(e.args)}],result:{name:"result",schema:e.output?m(e.output):d},summary:`${e.kind}: ${o}`,"x-lunora-function-kind":e.kind,"x-tags":[{name:n}]}},g=e=>{const n=e.version??"0.0.0",r=e.functions.filter(t=>t.visibility!=="internal"&&t.kind!=="stream").map(t=>R(t)).toSorted((t,a)=>t.name.localeCompare(a.name));return{info:{description:"Auto-generated from @lunora/values-typed functions by @lunora/codegen. Do not edit — run `lunora codegen` to regenerate.",title:"Lunora RPC",version:n},methods:r,openrpc:l}},S=e=>`${JSON.stringify(g(e),void 0,2)}
|
|
2
2
|
`,v=e=>`${c}export const openRpcSpec: Record<string, unknown> = ${JSON.stringify(e,void 0,4)};
|
|
3
3
|
`;export{l as OPENRPC_VERSION,g as buildOpenRpcDocument,S as emitOpenRpc,v as emitOpenRpcModule};
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import{existsSync as P,mkdirSync as is,readFileSync as yt,writeFileSync as os,rmSync as as}from"node:fs";import{join as f,dirname as fe}from"node:path";import{performance as pe}from"node:perf_hooks";import{runAdvisor as cs}from"@lunora/advisor";import{LunoraError as k}from"@lunora/errors";import{SyntaxKind as l,Node as o,Project as Xe}from"ts-morph";import{serializeSchemaSnapshot as ls}from"./SCHEMA_SNAPSHOT_VERSION-B1BUjuG5.mjs";import{toAdvisorContext as us}from"./formatAdvisories-CkEu1eye.mjs";import{s as ds}from"./paths-C-9fwEgQ.mjs";import{discoverAgents as fs}from"./AGENTS_FILENAME-B1Abt3Gl.mjs";import{discoverContainers as ps}from"./CONTAINERS_FILENAME-CtcysaKS.mjs";import gs from"./discoverCrons-DCxl4hty.mjs";import{diagnosticAt as ne}from"./CodegenDiagnosticError-BUXlG3P-.mjs";import{b as re}from"./module-specifiers-WF8iAydP.mjs";import{C as ge,i as ms,f as hs,n as xs,j as Es,b as vs,c as Ss,l as ys,e as As,o as Ns,d as bs,k as Ps,g as Is,p as ws,m as Ts,a as Cs,h as Fs}from"./emit-CXfWb_pY.mjs";import{l as g,a as v,f as I,p as A,g as At,j as Nt,k as Ee,h as Os,i as M,b as Ze,r as bt,e as Rs}from"./ast-BYoSZlae.mjs";import Ls from"./readPackageDependencies-C6h6FZuP.mjs";import{discoverQueues as Ds}from"./QUEUES_FILENAME-C-pzLGy4.mjs";import{discoverSandboxUsage as ks}from"./discoverSandboxUsage-CJhnKA0_.mjs";import Ms from"./discoverStorageRulesMetadata-C7XmORWp.mjs";import{discoverWorkflows as Ks}from"./WORKFLOWS_FILENAME-BfvqsG9Z.mjs";import{gatePlatformFeatures as _s,resolveCodegenTarget as zs}from"./DEFAULT_TARGET-lPq34YeN.mjs";import{i as L,a as _,e as E,r as Us,b as Bs,s as ie,c as qs,f as $s,d as js}from"./queries-Ddvo5dCs.mjs";import{a as y,c as z,d as Pt,e as Vs}from"./classify-procedure-call-Ib2EMtFH.mjs";import Ws from"./discoverAuthApiCalls-DoNQSgso.mjs";import Je from"./discoverFunctions-CXURzTDU.mjs";import{i as Hs,r as Gs,e as Ys}from"./unwrap-handler-return-CmIWbykC.mjs";import et from"./discoverHttpRoutes-2XhMbeh5.mjs";import Qs from"./discoverHyperdriveCalls-DTq4PKT5.mjs";import Xs from"./discoverInserts-qU5F4W4g.mjs";import{m as Ae,a as Z,s as It,d as Zs}from"./index-xGhyK9J_.mjs";import{e as wt}from"./exported-procedure-chains-M40rbSYM.mjs";import Js from"./discoverMigrations-BFkJQ8Sy.mjs";import{MUTATORS_FILENAME as en,isDefineMutatorCallee as tn,discoverMutators as tt}from"./MUTATORS_FILENAME-DHX1qUP5.mjs";import sn from"./discoverNondeterministicCalls-B-NNzzPW.mjs";import{discoverNotifyConfig as nn,discoverNotifyCalls as rn}from"./NOTIFY_FILENAME-CKO5gtGe.mjs";import on from"./discoverR2sqlCalls-C2GtrFnl.mjs";import an from"./discoverRlsProcedures-fAhxiIyD.mjs";import cn from"./discoverRlsMetadata-BKcUnSNr.mjs";import ln from"./discoverSchema-D5XGH2wu.mjs";import{secretKindOf as un,redact as dn,isHeuristicSecretKind as fn,isSecretishName as pn}from"./redact-Cy14LEnc.mjs";import{discoverShapes as gn}from"./SHAPES_FILENAME-DhZ3JkkH.mjs";import{emitApp as mn}from"./emitApp-DcrQNgaz.mjs";import{buildOpenApiDocument as hn,emitOpenApiModule as xn}from"./buildOpenApiDocument-D5xOB07T.mjs";import{buildOpenRpcDocument as En,emitOpenRpcModule as vn}from"./OPENRPC_VERSION-C4UXIUyy.mjs";import{s as Sn}from"./parse-validator-CMV0eq2a.mjs";import{buildSchemaSnapshot as yn}from"./SchemaSnapshotParseError-yZc-1mxR.mjs";const An=e=>{const t=new Map;for(const s of e){const n=ds(s),i=t.get(n);if(i===void 0){t.set(n,s);continue}if(i!==s)throw new k("INTERNAL",`@lunora/codegen: "${i}" and "${s}" both map to the api namespace "${n}" — the generated api.ts would declare "${n}" twice and the dispatch key "${n}:<fn>" would be ambiguous. Rename one file so the two differ by more than a non-identifier character (\`-\`, \`.\`, \`/\` and \`_\` all sanitize to \`_\`).`,{status:500})}},Nn=e=>{const t=[],s=e.tables.filter(n=>n.shardMode==="global");return s.some(n=>n.globalBackend!=="hyperdrive")&&t.push({name:"@lunora/d1",reason:"`.global()` tables are D1-backed, so `_generated/app.ts` imports the D1 `ctx.db` adapter"}),s.some(n=>n.globalBackend==="hyperdrive")&&t.push({name:"@lunora/hyperdrive",reason:'`.global({ backend: "hyperdrive" })` tables route through `@lunora/hyperdrive/global`'}),e.vectorIndexes.length>0&&t.push({name:"@lunora/bindings",reason:"`.vectorize()` indexes make `_generated/vectors.ts` import `@lunora/bindings/vectors`"}),t},bn=(e,t)=>{if(t===void 0)return;const s=Nn(e).filter(i=>!t.has(i.name));if(s.length===0)return;const n=s.map(i=>` - ${i.name} — ${i.reason}`).join(`
|
|
2
|
+
`);throw new k("INTERNAL",`@lunora/codegen: this schema's generated code imports packages the project does not declare:
|
|
3
|
+
${n}
|
|
4
|
+
|
|
5
|
+
Install them with your package manager, then re-run codegen.`)},Pn="env.ts",In=e=>{const t=e.getSymbol();if(!t)return e.getText()==="defineEnv";for(const s of t.getDeclarations())if(o.isImportSpecifier(s))return re(s.getImportDeclaration().getModuleSpecifierValue())?s.getNameNode().getText()==="defineEnv":!1;return!1},wn=e=>{const t=e.getSymbol();if(!t)return!1;for(const s of t.getDeclarations()){if(!o.isNamespaceImport(s))continue;const n=s.getFirstAncestorByKind(l.ImportDeclaration);return n!==void 0&&re(n.getModuleSpecifierValue())}return!1},Tn=e=>{if(o.isIdentifier(e))return In(e);if(o.isPropertyAccessExpression(e)){const t=e.getExpression();return e.getName()==="defineEnv"&&o.isIdentifier(t)&&wn(t)}return!1},Cn=e=>{const t=[];for(const s of e.getVariableDeclarations()){if(!s.isExported())continue;const n=s.getInitializer();if(n?.getKind()!==l.CallExpression||!Tn(n.getExpression()))continue;const r=s.getNameNode();if(!o.isIdentifier(r))throw ne(r,"defineEnv exports must be plain named exports (no destructuring)");t.push({exportName:r.getText()})}return t},Fn=(e,t)=>{const s=f(t,Pn);if(!P(s))return;const n=e.getSourceFile(s)??e.addSourceFileAtPath(s),i=Cn(n);if(i.length!==0){if(i.length>1)throw ne(n,`lunora/env.ts declares ${i.length.toString()} defineEnv() contracts (${i.map(r=>r.exportName).join(", ")}); exactly one is allowed`);return i[0]}},Tt=e=>{const t=n=>o.isIdentifier(n)&&n.getText()==="ctx",s=new Set;for(const n of e.getDescendantsOfKind(l.PropertyAccessExpression))t(n.getExpression())&&s.add(n.getName());for(const n of e.getDescendantsOfKind(l.VariableDeclaration)){const i=n.getInitializer(),r=n.getNameNode();if(!(i===void 0||!t(i)||!o.isObjectBindingPattern(r)))for(const a of r.getElements()){const c=a.getPropertyNameNode()?.getText()??a.getName();c&&s.add(c)}}return s},On=(e,t)=>{const s=Object.fromEntries(ge.map(n=>[n.key,!1]));for(const n of g(t)){const i=e.getSourceFile(n)??e.addSourceFileAtPath(n),r=new Set(i.getImportDeclarations().map(c=>c.getModuleSpecifierValue())),a=Tt(i);for(const c of ge)if(!s[c.key]){if(r.has(c.moduleSpecifier)){s[c.key]=!0;continue}c.contextProperty!==void 0&&a.has(c.contextProperty)&&(s[c.key]=!0)}if(ge.every(c=>s[c.key]))break}return s},Ct="identity.ts",Rn=e=>{const t=e.getSymbol();if(!t)return e.getText()==="defineIdentity";for(const s of t.getDeclarations())if(o.isImportSpecifier(s))return re(s.getImportDeclaration().getModuleSpecifierValue())?s.getNameNode().getText()==="defineIdentity":!1;return!1},Ln=e=>{const t=e.getSymbol();if(!t)return!1;for(const s of t.getDeclarations()){if(!o.isNamespaceImport(s))continue;const n=s.getFirstAncestorByKind(l.ImportDeclaration);return n!==void 0&&re(n.getModuleSpecifierValue())}return!1},Dn=e=>{if(o.isIdentifier(e))return Rn(e);if(o.isPropertyAccessExpression(e)){const t=e.getExpression();return e.getName()==="defineIdentity"&&o.isIdentifier(t)&&Ln(t)}return!1},kn=e=>{const t=[];for(const s of e.getVariableDeclarations()){if(!s.isExported())continue;const n=s.getInitializer();if(n?.getKind()!==l.CallExpression||!Dn(n.getExpression()))continue;const r=s.getNameNode();if(!o.isIdentifier(r))throw ne(r,"defineIdentity exports must be plain named exports (no destructuring)");t.push({exportName:r.getText()})}return t},Mn=(e,t)=>{const s=f(t,Ct);if(!P(s))return;const n=e.getSourceFile(s)??e.addSourceFileAtPath(s),i=kn(n);if(i.length!==0){if(i.length>1)throw ne(n,`lunora/identity.ts declares ${i.length.toString()} defineIdentity() contracts (${i.map(r=>r.exportName).join(", ")}); exactly one is allowed`);return i[0]}},Ft=e=>o.isParenthesizedExpression(e)?Ft(e.getExpression()):e,Kn=e=>o.isObjectLiteralExpression(e)&&e.getProperties().some(t=>{if(o.isShorthandPropertyAssignment(t))return t.getName()==="durable";if(!o.isPropertyAssignment(t)||t.getName()!=="durable")return!1;const s=t.getInitializer();return s===void 0||Ft(s).getText()!=="false"}),_n=(e,t)=>{const s={durableStreams:!1,secrets:!1};for(const n of g(t)){const i=e.getSourceFile(n)??e.addSourceFileAtPath(n);if(s.secrets||(s.secrets=Tt(i).has("secrets")),s.durableStreams||(s.durableStreams=i.getDescendantsOfKind(l.CallExpression).some(r=>{const a=r.getExpression();return(o.isPropertyAccessExpression(a)?a.getName():a.getText())==="stream"&&r.getArguments().some(u=>Kn(u))})),s.durableStreams&&s.secrets)break}return s},zn=(e,t)=>{const s=new Map,n=new Map,i=new Map;for(const r of e)s.set(r.name,`workflow "${r.exportName}"`),n.set(r.bindingName,`workflow "${r.exportName}"`),i.set(r.className,`workflow "${r.exportName}"`);for(const r of t){const a=s.get(r.name);if(a!==void 0)throw new k("DUPLICATE_WORKFLOW_NAME",`Duplicate deployed name "${r.name}": produced by both ${a} and agent "${r.exportName}". Workflow and agent names share the same wrangler workflows[] array and must be unique together.`,{status:500});const c=n.get(r.bindingName);if(c!==void 0)throw new k("DUPLICATE_WORKFLOW_BINDING",`Duplicate binding "${r.bindingName}": produced by both ${c} and agent "${r.exportName}". Workflow and agent bindings share the same wrangler workflows[] array and must be unique together.`,{status:500});const u=i.get(r.className);if(u!==void 0)throw new k("DUPLICATE_WORKFLOW_CLASS",`Duplicate generated class "${r.className}": produced by both ${u} and agent "${r.exportName}". Workflow and agent export names must yield unique generated class names.`,{status:500})}},Un=e=>{const{lunoraDirectory:t,project:s,projectRoot:n,schema:i}=e,r=Mn(s,t),a=Fn(s,t),c=Ks(s,t),u=Ds(s,t),d=fs(s,t);zn(c,d);const S=ps(s,t),x=Ms(s,t),w=gs(s,t,c,d),p=_n(s,t),T=ks(s,t),F=On(s,t);F.browser=F.browser||T.usesSandboxBrowser;const D=_s(F,zs(n,e.target),{agents:d.length>0,commitOrderedTables:i.tables.some(b=>b.commitOrdered===!0),cronTriggers:w.length>0,crossShardFanout:i.tables.some(b=>typeof b.shardMode=="object"),durableStreams:p.durableStreams,globalTables:i.tables.some(b=>b.shardMode==="global"),queues:u.length>0,secrets:p.secrets,vectorStore:i.vectorIndexes.length>0}),N=D.usage,O=Ls(n),U=O??new Set,B=U.has("lunorash");bn(i,O);const W=P(f(t,"flags.ts")),K=P(f(t,"notify.ts"));return{agents:d,containers:S,crons:w,dataModelContent:hs(i),declaredDependencies:O,dependencies:U,env:a,featureUsage:N,hasFlags:W,hasNotify:K,identity:r,platformGate:D,queues:u,serverContent:ms({agents:d,containers:S,env:a,hasAccessFacade:N.access,hasAi:N.ai,hasAnalytics:N.analytics,hasBrowser:N.browser,hasVectors:D.signals.vectorStore!==!1,hasFlags:W,hasHyperdrive:N.hyperdrive,hasImages:N.images,hasKv:N.kv,hasNotify:K,hasPayments:N.payments,hasPipelines:N.pipelines,hasR2sql:N.r2sql,hasX402:N.x402,identity:r,queues:u,schema:i,storageRuleBuckets:x.rules.map(b=>b.bucket),useUmbrella:B,workflows:c}),storageRulesMetadata:x,usesSandbox:T.usesSandboxBrowser||T.usesSandboxContainer||T.usesSandboxFs,useUmbrella:B,workflows:c}},Ot=new Set(["delete","get","head","options","patch","post","put"]),Bn=new Set(["handler","stream"]),qn=/\/(?:_|admin|internal|superuser|sudo|root|debug)/iu,st=new Set(["ADMIN_TOKEN","adminToken","assertAdmin","assertAuth","auth","Authorization","getSession","identity","isAdmin","requireAdmin","requireAuth","requireRole","verifyAdmin"]),$n=e=>{if(!o.isCallExpression(e))return;const t=e.getExpression();if(!o.isPropertyAccessExpression(t)||!Ot.has(t.getName()))return;const s=t.getExpression();if(!o.isIdentifier(s)||s.getText()!=="httpRoute")return;const n=e.getArguments()[0];if(!(!n||!o.isStringLiteral(n)))return{method:t.getName().toUpperCase(),path:n.getLiteralValue()}},jn=e=>{const t=e.getExpression();if(!o.isPropertyAccessExpression(t))return;let s=t.getExpression();for(;o.isCallExpression(s);){const n=s.getExpression();if(!o.isPropertyAccessExpression(n)||Ot.has(n.getName()))break;s=n.getExpression()}return $n(s)},Vn=e=>{for(const t of e.getDescendantsOfKind(l.PropertyAccessExpression))if(st.has(t.getName()))return!0;for(const t of e.getDescendantsOfKind(l.CallExpression)){const s=t.getExpression();if(o.isIdentifier(s)&&st.has(s.getText()))return!0}return!1},Wn=(e,t)=>{const s=e.getInitializer();if(!s||!o.isCallExpression(s))return;const n=s.getExpression();if(!o.isPropertyAccessExpression(n)||!Bn.has(n.getName()))return;const i=jn(s);if(!i||!qn.test(i.path))return;const r=s.getArguments()[0],a=r!==void 0&&(o.isArrowFunction(r)||o.isFunctionExpression(r))&&Vn(r);return{exportName:e.getName(),file:t,method:i.method,path:i.path,usesGuard:a}},Hn=(e,t)=>{const s=[];for(const n of e.getVariableStatements())if(n.isExported())for(const i of n.getDeclarations()){const r=Wn(i,t);r&&s.push(r)}return s},Gn=(e,t)=>{const s=[];for(const n of g(t)){const i=e.getSourceFile(n)??e.addSourceFileAtPath(n);s.push(...Hn(i,v(t,n)))}return s},Yn=e=>!o.isPropertyAccessExpression(e)||e.getName()!=="run"?!1:e.getExpression().getText()==="ctx.ai",Qn=(e,t)=>{if(!Yn(e.getExpression()))return;const s=e.getArguments()[0];if(!(!s||!L(s)||_(s)))return{exportName:E(e),file:t,line:e.getStartLineNumber()}},Xn=(e,t)=>I(e,t,Qn),Zn=new Set(["generateText","streamText"]),Jn=new Set(["messages","prompt","system"]),er=[{methods:new Set(["delete","insert","insertManyUnsafe","patch","replace"]),prefixes:["context.db","ctx.db"]},{methods:new Set(["run","runAction","runMutation"]),prefixes:["context","ctx"]},{methods:new Set(["fetch"]),prefixes:["context","ctx"]},{methods:new Set(["queue","send"]),prefixes:["context.email","context.mail","ctx.email","ctx.mail"]}],tr=e=>{const t=e.getExpression();if(!o.isPropertyAccessExpression(t))return;const s=t.getName(),n=t.getExpression().getText();for(const i of er)if(i.methods.has(s)&&i.prefixes.some(r=>n===r||n.startsWith(`${r}.`)))return`${n}.${s}`},sr=e=>{for(const t of e.getDescendantsOfKind(l.CallExpression)){const s=tr(t);if(s!==void 0)return s}},nr=e=>{const t=new Set,s=e.getFirstAncestor(r=>o.isArrowFunction(r)||o.isFunctionExpression(r)||o.isFunctionDeclaration(r)),[n]=s?.getParameters()??[],i=n?.getNameNode();if(i===void 0||!o.isObjectBindingPattern(i))return t;for(const r of i.getElements()){const a=r.getPropertyNameNode()?.getText()??r.getName(),c=r.getNameNode();if(a==="args"&&o.isObjectBindingPattern(c))for(const u of c.getElements())t.add(u.getName())}return t},rr=e=>{if(Us(e))return!0;const t=nr(e);return t.size===0?!1:e.getDescendantsOfKind(l.Identifier).some(s=>t.has(s.getText()))},ir=e=>{for(const t of e.getProperties()){if(!o.isPropertyAssignment(t)||!Jn.has(t.getName()))continue;const s=t.getInitializer();if(s!==void 0&&rr(s))return!0}return!1},or=(e,t)=>{const s=[];for(const n of e.getDescendantsOfKind(l.CallExpression)){const i=y(n.getExpression());if(i===void 0||!Zn.has(i))continue;const[r]=n.getArguments();if(r===void 0||!o.isObjectLiteralExpression(r))continue;let a;for(const c of r.getDescendantsOfKind(l.CallExpression))if(y(c.getExpression())==="tool"&&(a=sr(c),a!==void 0))break;a!==void 0&&s.push({exportName:E(n),file:t,line:n.getStartLineNumber(),method:i,sideEffect:a,userInputDerived:ir(r)})}return s},ar=(e,t)=>{const s=[];for(const n of g(t)){const i=e.getSourceFile(n)??e.addSourceFileAtPath(n);s.push(...or(i,v(t,n)))}return s},cr=e=>{if(!o.isPropertyAccessExpression(e)||e.getName()!=="fetch")return!1;const t=e.getExpression();return o.isIdentifier(t)&&t.getText()==="ctx"},lr=(e,t)=>{if(!cr(e.getExpression()))return;const s=e.getArguments()[0];if(!(!s||!L(s)))return{exportName:E(e),file:t,line:e.getStartLineNumber()}},ur=(e,t)=>I(e,t,lr),Rt=e=>e.getProperties().some(t=>o.isSpreadAssignment(t)),dr=e=>{const t=e.getArguments()[0];if(!t||!o.isObjectLiteralExpression(t))return{objects:[],opaque:!0};const s=t.getProperty("args");if(!s)return{objects:[],opaque:!1};if(!o.isPropertyAssignment(s))return{objects:[],opaque:!0};const n=s.getInitializer();return!n||!o.isObjectLiteralExpression(n)?{objects:[],opaque:!0}:{objects:[n],opaque:Rt(n)}},fr=e=>{const t=[];let s=!1,n=e;for(;o.isCallExpression(n);){const i=n.getExpression();if(!o.isPropertyAccessExpression(i))break;if(i.getName()==="input"){const r=n.getArguments()[0];r&&o.isObjectLiteralExpression(r)?(t.push(r),s||=Rt(r)):s=!0}n=i.getExpression()}return{objects:t,opaque:s}},Lt=(e,t)=>t?fr(t):dr(e),pr=e=>e.flatMap(t=>t.getProperties().filter(s=>o.isPropertyAssignment(s)||o.isShorthandPropertyAssignment(s)).map(s=>s.getName())),gr=new Set(["check","length","max"]),ve=e=>{if(!o.isCallExpression(e))return;const t=e.getExpression();if(!(!o.isPropertyAccessExpression(t)||t.getExpression().getText()!=="v"))return t.getName()},mr=e=>[e,...e.getDescendants()].filter(t=>ve(t)!==void 0),hr=e=>{let t=e;for(;;){const s=t.getParent();if(!s||!o.isPropertyAccessExpression(s)||s.getExpression()!==t)return!1;const n=s.getParent();if(!n||!o.isCallExpression(n)||n.getExpression()!==s)return!1;if(gr.has(s.getName()))return!0;t=n}},xr=e=>{const t=[],s=[];for(const n of e)for(const i of n.getProperties()){if(!o.isPropertyAssignment(i))continue;const r=i.getInitializer();if(!r)continue;const a=mr(r),c=i.getName();a.some(u=>ve(u)==="any")?t.push(c):a.some(u=>ve(u)==="string"&&!hr(u))&&s.push(c)}return{anyArgs:t,unboundedStringArgs:s}},Er=(e,t)=>{const s=e.getInitializer();if(!s||!o.isCallExpression(s))return;const n=z(s);if(n?.visibility!=="public")return;const{objects:i}=Lt(s,n.receiver),{anyArgs:r,unboundedStringArgs:a}=xr(i);if(!(r.length===0&&a.length===0))return{anyArgs:r,exportName:e.getName(),file:t,line:s.getStartLineNumber(),unboundedStringArgs:a}},vr=(e,t)=>{const s=[];for(const n of e.getVariableStatements())if(n.isExported())for(const i of n.getDeclarations()){const r=Er(i,t);r&&s.push(r)}return s},Sr=(e,t)=>{const s=[];for(const n of g(t)){const i=e.getSourceFile(n)??e.addSourceFileAtPath(n);s.push(...vr(i,v(t,n)))}return s},me=e=>e?.getKind()===l.TrueKeyword,yr=e=>e?.getKind()===l.FalseKeyword,Ar=e=>e!==void 0&&o.isNumericLiteral(e)&&e.getLiteralValue()===0,Nr=new Set(["lunoraAuthAdapter","lunoraD1Adapter"]),br=e=>!e||!o.isArrayLiteralExpression(e)?!1:e.getElements().some(t=>o.isCallExpression(t)&&y(t.getExpression())==="scim"),Pr=e=>e!==void 0&&o.isCallExpression(e)&&Nr.has(y(e.getExpression())??""),Ir=e=>!e||!o.isArrayLiteralExpression(e)?!1:e.getElements().some(t=>o.isStringLiteral(t)&&t.getLiteralText()==="*"),wr=e=>{const t=A(e,"advanced"),s=A(e,"emailAndPassword"),n=A(e,"session");return{analyzable:!0,disableCsrfCheck:me(A(t,"disableCSRFCheck")),emailPasswordEnabled:me(A(s,"enabled")),requireEmailVerification:me(A(s,"requireEmailVerification")),scimOnNonTransactionalAdapter:br(A(e,"plugins"))&&Pr(A(e,"database")),secureCookiesDisabled:yr(A(t,"useSecureCookies")),sessionFreshAgeZero:Ar(A(n,"freshAge")),trustedOriginsWildcard:Ir(A(e,"trustedOrigins"))}},Tr=()=>({analyzable:!1,disableCsrfCheck:!1,emailPasswordEnabled:!1,requireEmailVerification:!1,scimOnNonTransactionalAdapter:!1,secureCookiesDisabled:!1,sessionFreshAgeZero:!1,trustedOriginsWildcard:!1}),Cr=(e,t)=>{if(y(e.getExpression())!=="createAuth")return;const s=e.getArguments()[0],n=s!==void 0&&o.isObjectLiteralExpression(s)&&s.getProperties().some(r=>o.isSpreadAssignment(r)),i=s!==void 0&&o.isObjectLiteralExpression(s)&&!n?wr(s):Tr();return{exportName:E(e),file:t,line:e.getStartLineNumber(),...i}},Fr=(e,t)=>I(e,t,Cr),Or=(e,t)=>{if(!o.isPropertyAccessExpression(e))return;const s=e.getName();if(t.methods.has(s))return t.matchReceiver(e.getExpression().getText())?s:void 0},Rr=(e,t,s)=>{const n=Or(e.getExpression(),s);if(n===void 0)return;const i=e.getArguments()[s.argIndex];if(!(!i||!L(i)||_(i))&&!(s.requireUnmodifiedReach===!0&&!Bs(i)))return{exportName:E(e),file:t,line:e.getStartLineNumber(),method:n}},Lr=(e,t,s)=>{const n=[];for(const i of e.getDescendantsOfKind(l.CallExpression)){const r=Rr(i,t,s);r&&n.push(r)}return n},oe=(e,t,s)=>{const n=[];for(const i of g(t)){const r=e.getSourceFile(i)??e.addSourceFileAtPath(i);n.push(...Lr(r,v(t,i),s))}return n},Dr=new Set(["content","pdf","scrape","screenshot"]),kr=(e,t)=>oe(e,t,{argIndex:0,matchReceiver:s=>s==="ctx.browser",methods:Dr}),Mr=new Set(["createBrowser","createInboundEmailHandler","createPayment"]),Kr=new Set(["RateLimiter"]),_r=new Set(["extend"]),Dt=e=>{const t=[],s=[];let n=!1;for(const i of e.getProperties()){if(o.isSpreadAssignment(i)){n=!0;continue}if(o.isPropertyAssignment(i)){const r=i.getName();t.push(r),i.getInitializer()?.getKind()===l.TrueKeyword&&s.push(r);continue}(o.isShorthandPropertyAssignment(i)||o.isMethodDeclaration(i))&&t.push(i.getName())}return{analyzable:!n,presentKeys:t,trueKeys:s}},nt=e=>e&&o.isObjectLiteralExpression(e)?Dt(e):{analyzable:!1,presentKeys:[],trueKeys:[]},zr=e=>{const t=e.getStatements(),[s]=t;if(t.length!==1||s===void 0||!o.isReturnStatement(s))return;const n=s.getExpression();return n!==void 0&&o.isObjectLiteralExpression(n)?n:void 0},Ur=e=>{if(o.isObjectLiteralExpression(e))return e;if(o.isParenthesizedExpression(e)){const t=e.getExpression();return o.isObjectLiteralExpression(t)?t:void 0}return o.isBlock(e)?zr(e):void 0},Br=e=>{const t=e&&(o.isArrowFunction(e)||o.isFunctionExpression(e))?e:void 0,s=t&&Ur(t.getBody());return s?Dt(s):{analyzable:!1,presentKeys:[],trueKeys:[]}},qr=(e,t)=>{const s=[];for(const n of e.getDescendantsOfKind(l.CallExpression)){const i=y(n.getExpression());i!==void 0&&(Mr.has(i)?s.push({callee:i,file:t,line:n.getStartLineNumber(),...nt(n.getArguments()[0])}):_r.has(i)&&s.push({callee:i,file:t,line:n.getStartLineNumber(),...Br(n.getArguments()[0])}))}for(const n of e.getDescendantsOfKind(l.NewExpression)){const i=y(n.getExpression());i===void 0||!Kr.has(i)||s.push({callee:i,file:t,line:n.getStartLineNumber(),...nt(n.getArguments()[0])})}return s},$r=(e,t)=>{const s=[];for(const{displayPath:n,filePath:i}of At(t)){const r=e.getSourceFile(i)??e.addSourceFileAtPath(i);s.push(...qr(r,n))}return s},rt="ctx.containers.",jr=e=>{if(!e.startsWith(rt))return!1;const t=e.slice(rt.length);return t.length>0&&!t.includes(".")},Vr=(e,t)=>oe(e,t,{argIndex:0,matchReceiver:jr,methods:new Set(["get"])}),Wr=new Set(["allow","deny","setAllowed"]),Hr=e=>{const t=e.getArguments()[0];if(!t||!o.isObjectLiteralExpression(t))return!1;const s=t.getProperty("enableInternet");return s!==void 0&&o.isPropertyAssignment(s)&&o.isTrueLiteral(s.getInitializerOrThrow())},Gr=(e,t)=>{const s=e.getExpression();if(!(!o.isPropertyAccessExpression(s)||s.getName()!=="start"||!Hr(e)))return{detail:"enableInternet: true",exportName:E(e),file:t,kind:"enable_internet",line:e.getStartLineNumber()}},Yr=(e,t)=>{const s=e.getExpression();if(!o.isPropertyAccessExpression(s)||!Wr.has(s.getName()))return;const n=s.getExpression();if(!(!o.isPropertyAccessExpression(n)||n.getName()!=="egress"))return{detail:s.getName(),exportName:E(e),file:t,kind:"egress_relaxation",line:e.getStartLineNumber()}},Qr=(e,t)=>Gr(e,t)??Yr(e,t),Xr=(e,t)=>I(e,t,Qr),Zr=new Set(["defineExportSink","r2Sink","webhookExportSink"]),Jr=e=>{const t=e.getExpression();if(!o.isIdentifier(t))return;const s=t.getText();return Zr.has(s)?s:void 0},ei=e=>{const t=[],s=[];for(const n of e.getProperties()){if(o.isSpreadAssignment(n))return{analyzable:!1,emptyKeys:[],presentKeys:[]};if(o.isPropertyAssignment(n)){const i=n.getName();t.push(i);const r=n.getInitializer();r&&o.isStringLiteral(r)&&r.getLiteralText()===""&&s.push(i);continue}(o.isShorthandPropertyAssignment(n)||o.isMethodDeclaration(n)||o.isGetAccessorDeclaration(n))&&t.push(n.getName())}return{analyzable:!0,emptyKeys:s,presentKeys:t}},ti=(e,t)=>{const s=[];for(const{displayPath:n,filePath:i}of At(t)){const r=e.getSourceFile(i)??e.addSourceFileAtPath(i);for(const a of r.getDescendantsOfKind(l.CallExpression)){const c=Jr(a);if(c===void 0)continue;const u=a.getArguments()[0],d=u&&o.isObjectLiteralExpression(u)?ei(u):{analyzable:!1,emptyKeys:[],presentKeys:[]};s.push({analyzable:d.analyzable,emptyKeys:d.emptyKeys,factory:c,file:n,line:a.getStartLineNumber(),presentKeys:d.presentKeys})}}return s},si=new Map([["dbRateLimit",2],["rateLimit",2],["verifyTurnstileMiddleware",0]]),ni=new Set(["dbRateLimit","rateLimit"]),ri=e=>{if(!e||!o.isObjectLiteralExpression(e))return!1;const t=e.getProperty("failOpen");return t!==void 0&&o.isPropertyAssignment(t)&&t.getInitializer()?.getKind()===l.TrueKeyword},ii=(e,t)=>{const s=y(e.getExpression());if(s===void 0)return;const n=si.get(s);if(n!==void 0)return{callee:s,exportName:E(e),failOpen:ri(e.getArguments()[n]),file:t,limitName:ni.has(s)?Nt(e):"",line:e.getStartLineNumber()}},oi=(e,t)=>I(e,t,ii),ai=new Set(["boolean","number","object","string"]),ci=e=>{const t=e.getName();if(!ai.has(t))return;const s=e.getExpression();if(!o.isPropertyAccessExpression(s))return;if(s.getName()==="flags"&&Ee(s.getExpression()))return t;const n=s.getExpression();if(s.getName()==="details"&&o.isPropertyAccessExpression(n)&&n.getName()==="flags"&&Ee(n.getExpression()))return t},li=e=>{const t=e.getExpression();if(!o.isPropertyAccessExpression(t))return;const s=ci(t);if(s===void 0)return;const n=e.getArguments()[0];if(!n||!(o.isStringLiteral(n)||o.isNoSubstitutionTemplateLiteral(n)))return;const i=n.getLiteralValue();return i.length>0?{key:i,type:s}:void 0},ui=(e,t)=>{const s=new Map;for(const n of g(t)){const i=e.getSourceFile(n)??e.addSourceFileAtPath(n);for(const r of i.getDescendantsOfKind(l.CallExpression)){const a=li(r);a&&!s.has(a.key)&&s.set(a.key,a.type)}}return[...s.entries()].map(([n,i])=>({key:n,type:i})).toSorted((n,i)=>n.key.localeCompare(i.key))},di=e=>{const t=e.getInitializer();if(!t||!o.isCallExpression(t))return;const s=z(t);if(s?.kind!=="query")return;const n=Os(t,s.receiver);return n?{exportName:e.getName(),handler:n}:void 0},it=e=>{const t=e.getParent();return t&&o.isPropertyAccessExpression(t)&&t.getExpression()===e?t:void 0},fi=e=>{if(!o.isPropertyAccessExpression(e)||e.getName()!=="flags")return;const t=e.getExpression();if(!o.isIdentifier(t)||t.getText()!=="ctx")return;const s=it(e);if(!s)return"ctx.flags";if(s.getName()==="details"){const n=it(s);return n?`ctx.flags.details.${n.getName()}`:"ctx.flags.details"}return`ctx.flags.${s.getName()}`},pi=(e,t)=>{const s=[];for(const n of e.handler.getDescendantsOfKind(l.PropertyAccessExpression)){const i=fi(n);i!==void 0&&s.push({callee:i,exportName:e.exportName,file:t,line:n.getStartLineNumber()})}return s},gi=(e,t)=>{const s=[];for(const n of e.getVariableStatements())if(n.isExported())for(const i of n.getDeclarations()){const r=di(i);r&&s.push(...pi(r,t))}return s},mi=(e,t)=>{const s=[];for(const n of g(t)){const i=e.getSourceFile(n)??e.addSourceFileAtPath(n);s.push(...gi(i,v(t,n)))}return s},hi=e=>{if(!o.isPropertyAccessExpression(e)||e.getName()!=="boolean")return!1;const t=e.getExpression();return o.isPropertyAccessExpression(t)&&t.getName()==="flags"&&Ee(t.getExpression())},xi=e=>{if(e?.getKind()===l.TrueKeyword)return!0;if(e?.getKind()===l.FalseKeyword)return!1},Ei=(e,t)=>{if(!hi(e.getExpression()))return;const[s,n]=e.getArguments();if(!s||!(o.isStringLiteral(s)||o.isNoSubstitutionTemplateLiteral(s)))return;const i=s.getLiteralValue(),r=xi(n);if(!(i.length===0||r===void 0))return{defaultValue:r,exportName:E(e),file:t,key:i,line:e.getStartLineNumber()}},vi=(e,t)=>I(e,t,Ei),Si=e=>{const t=e.getType().getProperty("~standard");if(!t)return;const s=t.getTypeAtLocation(e).getProperty("types");if(!s)return;const n=s.getTypeAtLocation(e).getNonNullableType().getProperty("output");if(!n)return;const i=n.getTypeAtLocation(e),r=i.getText(e);if(!r||r==="any"||r==="never"||Hs(r))return;const a=e.getSourceFile().getFilePath();return Gs(i,e,a)?Ys(i,e,a,0,new Set):r},yi=e=>{const t=e.getExpression();return o.isPropertyAccessExpression(t)&&t.getName()==="withGeoIndex"},Ai=e=>{const t=e.getArguments()[0];return t&&o.isStringLiteral(t)?t.getLiteralText():""},Ni=(e,t)=>{const s=[];for(const n of g(t)){const i=e.getSourceFile(n)??e.addSourceFileAtPath(n),r=v(t,n);for(const a of i.getDescendantsOfKind(l.CallExpression))yi(a)&&s.push({file:r,indexName:Ai(a),line:a.getStartLineNumber()})}return s},V=e=>e!==void 0&&(o.isArrowFunction(e)||o.isFunctionExpression(e))?e:void 0,kt=e=>{const t=e.getArguments()[0],s=V(t);if(s!==void 0)return s;if(t===void 0||!o.isObjectLiteralExpression(t))return;const n=t.getProperty("handler");return n!==void 0&&o.isPropertyAssignment(n)?V(n.getInitializer()):void 0},bi=new Set(["delete","get","head","options","patch","post","put"]),Pi=new Set(["handler","stream"]),Ii=new Set(["runAction","runMutation"]),wi=new Set(["delete","insert","insertManyUnsafe","patch","replace"]),J=(e,t)=>e!==void 0&&o.isIdentifier(e)&&e.getText()===t,ot=(e,t)=>{const s=e.getParameters()[0];if(s===void 0)return;const n=s.getNameNode();if(t)return o.isIdentifier(n)?n.getText():void 0;if(o.isObjectBindingPattern(n)){for(const i of n.getElements())if((i.getPropertyNameNode()?.getText()??i.getNameNode().getText())==="ctx"){const a=i.getNameNode();return o.isIdentifier(a)?a.getText():void 0}}},at=(e,t)=>{const s=e.getBody(),n=s.getDescendantsOfKind(l.CallExpression);o.isCallExpression(s)&&n.unshift(s);for(const i of n){const r=i.getExpression();if(!o.isPropertyAccessExpression(r))continue;const a=r.getName(),c=r.getExpression();if(Ii.has(a)&&J(c,t))return a;if(wi.has(a)&&o.isPropertyAccessExpression(c)&&c.getName()==="db"&&J(c.getExpression(),t))return`db.${a}`}},ct=(e,t)=>{const s=e.getBody();for(const n of s.getDescendantsOfKind(l.PropertyAccessExpression))if(n.getName()==="auth"&&J(n.getExpression(),t))return!0;for(const n of s.getDescendantsOfKind(l.VariableDeclaration)){const i=n.getNameNode();if(!(!o.isObjectBindingPattern(i)||!J(n.getInitializer(),t))){for(const r of i.getElements())if((r.getPropertyNameNode()?.getText()??r.getNameNode().getText())==="auth")return!0}}return!1},Ti=e=>{const t=e.getExpression();if(!o.isPropertyAccessExpression(t)||!Pi.has(t.getName()))return;let s=t.getExpression();for(;o.isCallExpression(s);){const n=s.getExpression();if(!o.isPropertyAccessExpression(n))return;const i=n.getName();if(bi.has(i)){const r=n.getExpression();return o.isIdentifier(r)&&r.getText()==="httpRoute"?i.toUpperCase():void 0}s=n.getExpression()}},Ci=(e,t)=>{const s=e.getExpression();if(o.isIdentifier(s)&&s.getText()==="httpAction"){const c=V(e.getArguments()[0]),u=c&&ot(c,!0);if(!c||u===void 0)return;const d=at(c,u);return d===void 0?void 0:{exportName:E(e),file:t,kind:"httpAction",line:e.getStartLineNumber(),readsAuth:ct(c,u),sideEffect:d}}const n=Ti(e);if(n===void 0)return;const i=V(e.getArguments()[0]),r=i&&ot(i,!1);if(!i||r===void 0)return;const a=at(i,r);return a===void 0?void 0:{exportName:E(e),file:t,kind:"httpRoute",line:e.getStartLineNumber(),method:n,readsAuth:ct(i,r),sideEffect:a}},Fi=(e,t)=>I(e,t,Ci),Oi=new Set(["btoa","encodeURI","encodeURIComponent","isSafeHeaderValue","Number","parseFloat","parseInt"]),Ri=new Set(["append","set"]),Mt=e=>e!==void 0&&(o.isStringLiteral(e)||o.isNoSubstitutionTemplateLiteral(e))?e.getLiteralText():"",lt=(e,t)=>(o.isCallExpression(e)?[e,...e.getDescendantsOfKind(l.CallExpression)]:e.getDescendantsOfKind(l.CallExpression)).some(n=>Oi.has(y(n.getExpression())??"")&&$s(n,t)),Li=(e,t)=>{if(lt(e,t))return!0;const s=ie(e);return s!==void 0&<(s,t)},Se=(e,t)=>qs(e,t)&&!Li(e,t),Di=e=>{if(o.isPropertyAccessExpression(e)&&e.getName()==="headers")return!0;const t=ie(e);return t!==void 0&&o.isNewExpression(t)&&y(t.getExpression())==="Headers"},ee=e=>{if(e===void 0)return;if(o.isObjectLiteralExpression(e))return e;const t=ie(e);return t!==void 0&&o.isObjectLiteralExpression(t)?t:void 0},Ne=(e,t,s)=>{for(const n of e.getProperties())if(o.isPropertyAssignment(n)){const i=n.getInitializer();i!==void 0&&Se(i,s.requestName)&&s.rows.push({exportName:s.exportName,file:s.relativePath,headerName:Mt(n.getNameNode()),line:i.getStartLineNumber(),via:t})}else if(o.isShorthandPropertyAssignment(n)){const i=n.getNameNode();Se(i,s.requestName)&&s.rows.push({exportName:s.exportName,file:s.relativePath,headerName:n.getName(),line:i.getStartLineNumber(),via:t})}else if(o.isSpreadAssignment(n)){const i=ee(n.getExpression());i!==void 0&&Ne(i,t,s)}},Kt=(e,t)=>{const s=ee(e);if(s===void 0)return;const n=s.getProperty("headers");if(n===void 0||!o.isPropertyAssignment(n))return;const i=ee(n.getInitializer());i!==void 0&&Ne(i,"response-init",t)},ki=(e,t)=>{const s=y(e.getExpression());if(s==="Response")Kt(e.getArguments()[1],t);else if(s==="Headers"){const n=ee(e.getArguments()[0]);n!==void 0&&Ne(n,"headers-ctor",t)}},Mi=(e,t)=>{const s=e.getExpression();if(!o.isPropertyAccessExpression(s))return;const n=s.getName(),i=s.getExpression();if(n==="json"&&o.isIdentifier(i)&&i.getText()==="Response"){Kt(e.getArguments()[1],t);return}if(Ri.has(n)&&Di(i)){const r=e.getArguments()[1];r!==void 0&&Se(r,t.requestName)&&t.rows.push({exportName:t.exportName,file:t.relativePath,headerName:Mt(e.getArguments()[0]),line:r.getStartLineNumber(),via:n==="set"?"headers-set":"headers-append"})}},Ki=(e,t)=>{for(const s of e.getDescendantsOfKind(l.NewExpression))ki(s,t);for(const s of e.getDescendantsOfKind(l.CallExpression))Mi(s,t)},_i=(e,t)=>{const s=e.getExpression();if(!o.isIdentifier(s)||s.getText()!=="httpAction")return[];const n=V(e.getArguments()[0]);if(n===void 0)return[];const i=n.getParameters()[1];if(i===void 0)return[];const r=i.getNameNode();if(!o.isIdentifier(r))return[];const a=[];return Ki(n,{exportName:E(e),relativePath:t,requestName:r.getText(),rows:a}),a},zi=(e,t)=>{const s=[];for(const n of e.getDescendantsOfKind(l.CallExpression))s.push(..._i(n,t));return s},Ui=(e,t)=>{const s=[];for(const n of g(t)){const i=e.getSourceFile(n)??e.addSourceFileAtPath(n);s.push(...zi(i,v(t,n)))}return s},Bi=new Set(["auth","context.auth","ctx.auth"]),qi="userId",$i=e=>{const t=new Set;for(const s of e.getProperties()){if(o.isSpreadAssignment(s))return;(o.isPropertyAssignment(s)||o.isShorthandPropertyAssignment(s)||o.isMethodDeclaration(s))&&t.add(s.getName())}return t},ji=(e,t)=>{const s=f(t,Ct);if(!P(s))return;const n=e.getSourceFile(s)??e.addSourceFileAtPath(s);for(const i of n.getDescendantsOfKind(l.CallExpression)){if(y(i.getExpression())!=="defineIdentity")continue;const[r]=i.getArguments();return r&&o.isObjectLiteralExpression(r)?$i(r):void 0}},ut=e=>{if(!(e===void 0||!o.isPropertyAccessExpression(e)||e.getName()!=="identity"))return Bi.has(e.getExpression().getText())?e:void 0},Vi=e=>{if(o.isPropertyAccessExpression(e)&&ut(e.getExpression())!==void 0)return e.getName();if(o.isElementAccessExpression(e)&&ut(e.getExpression())!==void 0){const t=e.getArgumentExpression();return t&&o.isStringLiteral(t)?t.getLiteralValue():void 0}},Wi=(e,t,s)=>{const n=[];for(const i of e.getDescendants()){const r=Vi(i);r!==void 0&&n.push({declared:r===qi||s.has(r),exportName:E(i),file:t,key:r,line:i.getStartLineNumber()})}return n},Hi=(e,t)=>{const s=ji(e,t);if(s===void 0)return[];const n=[];for(const i of g(t)){const r=e.getSourceFile(i)??e.addSourceFileAtPath(i);n.push(...Wi(r,v(t,i),s))}return n},Gi=(e,t)=>{if(y(e.getExpression())!=="buildImageDeliveryUrl")return;const s=e.getArguments()[0];if(!s)return;const n=A(s,"key");if(!(!n||!L(n)||_(n)))return{exportName:E(e),file:t,line:e.getStartLineNumber()}},Yi=(e,t)=>I(e,t,Gi),Qi=new Set(["delete","get","getRaw","getWithMetadata","put"]),Xi=(e,t)=>oe(e,t,{argIndex:0,matchReceiver:s=>s==="ctx.kv"||s.startsWith("ctx.kv."),methods:Qi}),Zi=new Set(["queue","send"]),dt=new Set(["bcc","cc","to"]),Ji=e=>{if(!o.isPropertyAccessExpression(e))return;const t=e.getName();if(!Zi.has(t))return;const s=e.getExpression().getText();return s==="ctx.mail"||s==="ctx.email"?t:void 0},eo=e=>o.isObjectLiteralExpression(e)?e.getProperties().some(t=>{if(o.isShorthandPropertyAssignment(t)){const n=t.getNameNode();return dt.has(t.getName())&&L(n)&&!_(n)}if(!o.isPropertyAssignment(t)||!dt.has(t.getName()))return!1;const s=t.getInitializer();return s!==void 0&&L(s)&&!_(s)}):!1,to=(e,t)=>{const s=Ji(e.getExpression());if(s===void 0)return;const n=e.getArguments()[0];if(!(!n||!eo(n)))return{exportName:E(e),file:t,line:e.getStartLineNumber(),method:s}},so=(e,t)=>I(e,t,to),no=e=>o.isPropertyAssignment(e)||o.isMethodDeclaration(e)||o.isGetAccessorDeclaration(e)?o.isComputedPropertyName(e.getNameNode()):!1,ro=e=>o.isPropertyAssignment(e)||o.isShorthandPropertyAssignment(e)||o.isMethodDeclaration(e)||o.isGetAccessorDeclaration(e)?no(e):!0,_t=(e,t=!1)=>{for(const s of e.getProperties()){if(ro(s))return!0;if(t)continue;if(!o.isPropertyAssignment(s))return!0;const n=s.getInitializer();if(!n||!o.isObjectLiteralExpression(n)||_t(n,!0))return!0}return!1},io=(e,t)=>{for(const s of g(t)){const n=e.getSourceFile(s)??e.addSourceFileAtPath(s);for(const{receiver:i}of wt(n))for(const r of Ae(i)){const a=r.getArguments()[0];if(a!==void 0&&(!o.isObjectLiteralExpression(a)||_t(a)))return!0}}return!1},oo=e=>{const t=e.getArguments()[0];if(!t||!o.isObjectLiteralExpression(t))return[];const s=[];for(const n of t.getProperties()){const i=Z(n);if(i===void 0||!o.isPropertyAssignment(n))continue;const r=n.getInitializer();if(!(!r||!o.isObjectLiteralExpression(r)))for(const a of r.getProperties()){const c=Z(a);c!==void 0&&s.push({column:c,strategy:It(a),table:i})}}return s},ao=(e,t)=>{const s=new Map;for(const n of g(t)){const i=e.getSourceFile(n)??e.addSourceFileAtPath(n);for(const{receiver:r}of wt(i))for(const a of Ae(r))for(const c of oo(a)){const u=`${c.table}\0${c.column}`;s.has(u)||s.set(u,c)}}return{columns:[...s.values()]}},co=(e,t,s)=>{const n=e.getArguments()[0];if(!n||!o.isObjectLiteralExpression(n))return[];const i=[];for(const r of n.getProperties()){const a=Z(r);if(a===void 0||!o.isPropertyAssignment(r))continue;const c=r.getInitializer();if(!(!c||!o.isObjectLiteralExpression(c)))for(const u of c.getProperties()){const d=Z(u);if(d===void 0)continue;const S=It(u);S!=="custom"&&i.push({column:d,exportName:t,file:s,line:u.getStartLineNumber(),strategy:S,table:a})}}return i},lo=(e,t)=>{if(!o.isVariableDeclaration(e))return[];const s=e.getInitializer(),n=s&&o.isCallExpression(s)?z(s):void 0;return n?.receiver?Ae(n.receiver).flatMap(i=>co(i,e.getName(),t)):[]},uo=(e,t)=>{const s=[];for(const n of g(t)){const i=e.getSourceFile(n)??e.addSourceFileAtPath(n),r=v(t,n);for(const a of i.getVariableStatements())if(a.isExported())for(const c of a.getDeclarations())s.push(...lo(c,r))}return s},fo=e=>{const t=e.getExpression();if(!o.isPropertyAccessExpression(t)||t.getName()!=="replace")return!1;const s=t.getExpression();return M(s)},po=e=>{const t=e.getArguments()[0];if(t===void 0||!o.isObjectLiteralExpression(t))return;const s=t.getProperty("server");if(s!==void 0)return o.isPropertyAssignment(s)?s.getInitializer():s},go=e=>{if(!e.isExported())return;const t=e.getInitializer();if(t?.getKind()!==l.CallExpression)return;const s=t;return tn(s.getExpression())?s:void 0},mo=e=>{const t=go(e),s=t===void 0?void 0:po(t);if(s===void 0)return[];const n=e.getNameNode(),i=o.isIdentifier(n)?n.getText():"";return s.getDescendantsOfKind(l.CallExpression).filter(r=>fo(r)).map(r=>({exportName:i,file:"lunora/mutators.ts",line:r.getStartLineNumber()}))},ho=e=>e.getVariableDeclarations().flatMap(t=>mo(t)),xo=(e,t)=>{const s=f(t,en);if(!P(s))return[];const n=e.getSourceFile(s)??e.addSourceFileAtPath(s);return ho(n)},Eo=new Set(["delete","get","patch"]),vo=new Set(["accountId","authorId","companyId","createdBy","createdById","customerId","groupId","memberId","organizationId","orgId","ownerId","projectId","teamId","tenantId","userId","workspaceId"]),So=new Set(["auth","identity","session","user"]),yo=new Set([l.EqualsEqualsEqualsToken,l.EqualsEqualsToken,l.ExclamationEqualsEqualsToken,l.ExclamationEqualsToken]),Ao=e=>{const t=e.getExpression();if(!o.isPropertyAccessExpression(t)||t.getName()!=="normalizeId"||!M(t.getExpression()))return;const s=e.getArguments()[0];return s&&o.isStringLiteral(s)?s.getLiteralText():""},No=e=>{let t=e,s=t.getParent();for(;s!==void 0&&(o.isAsExpression(s)||o.isParenthesizedExpression(s)||o.isNonNullExpression(s));)t=s,s=t.getParent();if(s===void 0||!o.isVariableDeclaration(s))return;const n=s.getNameNode();return o.isIdentifier(n)?n.getText():void 0},bo=(e,t)=>e.getDescendantsOfKind(l.Identifier).some(s=>s.getText()===t),Po=e=>o.isThrowStatement(e)||o.isReturnStatement(e)||e.getDescendantsOfKind(l.ThrowStatement).length>0||e.getDescendantsOfKind(l.ReturnStatement).length>0,Io=(e,t)=>e.getDescendantsOfKind(l.IfStatement).some(s=>bo(s.getExpression(),t)&&Po(s.getThenStatement())),wo=(e,t)=>{for(const s of e.getDescendantsOfKind(l.CallExpression)){const n=s.getExpression();if(!o.isPropertyAccessExpression(n))continue;const i=n.getName();if(!Eo.has(i))continue;const r=n.getExpression();if(!(M(r)||o.isPropertyAccessExpression(r)&&M(r.getExpression())))continue;const c=s.getArguments()[0];if(c!==void 0&&o.isIdentifier(c)&&c.getText()===t)return i}},To=e=>{let t=e;for(;o.isPropertyAccessExpression(t)||o.isElementAccessExpression(t)||o.isNonNullExpression(t)||o.isParenthesizedExpression(t)||o.isAsExpression(t)||o.isAwaitExpression(t);)t=t.getExpression();return o.isIdentifier(t)?t.getText():void 0},Co=e=>e.getDescendantsOfKind(l.CallExpression).some(t=>t.getArguments().some(s=>To(s)==="ctx")),Fo=e=>e.getDescendantsOfKind(l.BinaryExpression).some(t=>yo.has(t.getOperatorToken().getKind())?o.isPropertyAccessExpression(t.getLeft())||o.isPropertyAccessExpression(t.getRight()):!1),Oo=e=>{for(const t of e.getDescendantsOfKind(l.Identifier))if(vo.has(t.getText()))return!0;for(const t of e.getDescendantsOfKind(l.PropertyAccessExpression)){const s=t.getExpression();if(o.isIdentifier(s)&&s.getText()==="ctx"&&So.has(t.getName()))return!0}return Co(e)||Fo(e)},Ro=(e,t)=>{if(!o.isVariableDeclaration(e))return[];const s=e.getInitializer();if(s===void 0||!o.isCallExpression(s))return[];const n=z(s);if(n?.kind!=="query"&&n?.kind!=="mutation")return[];const i=kt(s);if(i===void 0)return[];const r=n.receiver!==void 0&&Pt(n.receiver,"use","rls"),a=Oo(i),c=new Set,u=[];for(const d of i.getDescendantsOfKind(l.CallExpression)){const S=Ao(d);if(S===void 0)continue;const x=No(d);if(x===void 0||c.has(x)||!Io(i,x))continue;const w=wo(i,x);w!==void 0&&(c.add(x),u.push({exportName:e.getName(),file:t,line:d.getStartLineNumber(),mentionsOwnership:a,sinkMethod:w,table:S,usesRls:r,visibility:n.visibility}))}return u},Lo=(e,t)=>{const s=[];for(const n of g(t)){const i=e.getSourceFile(n)??e.addSourceFileAtPath(n),r=v(t,n);for(const a of i.getVariableStatements())if(a.isExported())for(const c of a.getDeclarations())s.push(...Ro(c,r))}return s},Do=new Set(["accountId","authorId","createdBy","createdById","organizationId","orgId","ownerId","tenantId","updatedBy","userId","workspaceId"]),ko=new Set(["insert","insertManyUnsafe","patch","replace"]),Mo=e=>{if(!o.isPropertyAccessExpression(e))return;const t=e.getName();if(!ko.has(t))return;const s=e.getExpression();if(!o.isPropertyAccessExpression(s)||s.getName()!=="db")return;const n=s.getExpression();return o.isIdentifier(n)&&n.getText()==="ctx"?t:void 0},Ko=(e,t)=>{if(t!=="insertManyUnsafe")return o.isObjectLiteralExpression(e)?[e]:[];if(!o.isArrayLiteralExpression(e))return[];const s=[];for(const n of e.getElements())o.isObjectLiteralExpression(n)&&s.push(n);return s},_o=(e,t,s,n)=>{const i=[];for(const r of e.getProperties()){let a,c;o.isPropertyAssignment(r)?(a=r.getName(),c=r.getInitializer()):o.isShorthandPropertyAssignment(r)&&(a=r.getName(),c=r.getNameNode()),!(a===void 0||c===void 0||!Do.has(a))&&L(c)&&!_(c)&&i.push({exportName:E(s),field:a,file:n,line:s.getStartLineNumber(),method:t})}return i},zo=(e,t)=>{const s=Mo(e.getExpression());if(s===void 0)return[];const n=e.getArguments()[1];return n?Ko(n,s).flatMap(i=>_o(i,s,e,t)):[]},Uo=(e,t,s)=>{const n=[];for(const i of e.getDescendantsOfKind(l.CallExpression))for(const r of zo(i,t)){const a=s(r.exportName);n.push(a===void 0?r:{...r,visibility:a})}return n},Bo=(e,t,s=[])=>{const n=[],i=new Map(s.map(r=>[`${r.filePath}:${r.exportName}`,r.visibility]));for(const r of g(t)){const a=e.getSourceFile(r)??e.addSourceFileAtPath(r),c=v(t,r);n.push(...Uo(a,c,u=>i.get(`${c}:${u}`)))}return n},qo=["providerSubscriptionId","state"],$o=["providerEventId","processedAt"],ft=(e,t)=>t.every(s=>s in e.shape),jo=e=>{const t=e.find(n=>n.name==="subscriptions"),s=e.find(n=>n.name==="events");return t!==void 0&&s!==void 0&&ft(t,qo)&&ft(s,$o)},Vo=new Set(["createAutumnAdapter","createDodoPaymentsAdapter","createPolarAdapter","createStripeAdapter"]),Wo=e=>e&&o.isNumericLiteral(e)?Number(e.getText()):void 0,Ho=e=>{const t=e.getProperty("webhookToleranceSeconds");return t&&o.isPropertyAssignment(t)?Wo(t.getInitializer()):void 0},Go=(e,t)=>{const s=y(e.getExpression());if(s===void 0||!Vo.has(s))return;const[n]=e.getArguments(),i=n&&o.isObjectLiteralExpression(n)?Ho(n):void 0;return{callee:s,exportName:E(e),file:t,line:e.getStartLineNumber(),...i===void 0?{}:{toleranceSeconds:i}}},Yo=(e,t)=>I(e,t,Go),Qo=new Set(["defineQueue","defineWorkflow"]),Xo=new Set(["run","runAction","runMutation","runQuery"]),Zo=new Set(["api","internal"]),Jo=e=>{const t=e.getExpression();return o.isIdentifier(t)?t.getText():void 0},ea=e=>{const t=e.getArguments()[0];if(!t||!o.isObjectLiteralExpression(t))return;const s=t.getProperty("handler");if(s===void 0||!o.isPropertyAssignment(s))return;const n=s.getInitializer();if(n&&(o.isArrowFunction(n)||o.isFunctionExpression(n)))return n},zt=(e,t)=>{const s=e.getParameters()[t]?.getNameNode();return s&&o.isIdentifier(s)?s.getText():void 0},Ut=(e,t)=>e===t||e.startsWith(`${t}.`),Bt=e=>{const t=e.getDescendantsOfKind(l.PropertyAccessExpression);return o.isPropertyAccessExpression(e)&&t.push(e),t},pt=e=>{const t=e.getParent();return o.isPropertyAccessExpression(t)&&t.getNameNode()===e||o.isPropertyAssignment(t)&&t.getNameNode()===e?!1:!(o.isBindingElement(t)&&t.getNameNode()===e)},qt=e=>{const t=e.getDescendantsOfKind(l.Identifier).filter(s=>pt(s));return o.isIdentifier(e)&&pt(e)&&t.push(e),t},ta=e=>{if(!o.isVariableDeclaration(e))return[];const t=e.getNameNode();return o.isIdentifier(t)?[t.getText()]:t.getDescendantsOfKind(l.BindingElement).map(s=>s.getName())},sa=e=>{const t=zt(e,1);if(t===void 0)return[];const s=[`${t}.messages`];for(const n of e.getDescendantsOfKind(l.ForOfStatement)){if(n.getExpression().getText()!==`${t}.messages`)continue;const i=n.getInitializer(),r=o.isVariableDeclarationList(i)?i.getDeclarations()[0]?.getNameNode():void 0;r&&o.isIdentifier(r)&&s.push(`${r.getText()}.body`)}return s},na=(e,t,s)=>{const n=t==="workflow"?[`${s}.params`]:sa(e),i=new Set,r=a=>Bt(a).some(c=>n.some(u=>Ut(c.getText(),u)))?!0:qt(a).some(c=>i.has(c.getText()));for(const a of e.getDescendantsOfKind(l.VariableDeclaration)){const c=a.getInitializer();if(c&&r(c))for(const u of ta(a))i.add(u)}return{names:i,prefixes:n}},ra=(e,t)=>Bt(e).some(s=>t.prefixes.some(n=>Ut(s.getText(),n)))?!0:qt(e).some(s=>t.names.has(s.getText())),ia=e=>{if(e===void 0||!o.isPropertyAccessExpression(e))return;const t=[];let s=e;for(;o.isPropertyAccessExpression(s);)t.unshift(s.getName()),s=s.getExpression();const n=t.at(-1);if(!(n===void 0||!o.isIdentifier(s)||!Zo.has(s.getText())||t.length<2))return{exportName:n,file:t.slice(0,-1).join("/")}},oa=(e,t,s)=>{const n=zt(e,0);if(n===void 0)return[];const i=na(e,t,n),r=[];for(const a of e.getDescendantsOfKind(l.CallExpression)){const c=a.getExpression();if(!o.isPropertyAccessExpression(c)||!Xo.has(c.getName())||c.getExpression().getText()!==n)continue;const u=a.getArguments()[1];if(!u||!ra(u,i))continue;const d=ia(a.getArguments()[0]);d!==void 0&&r.push({dispatchKind:t,file:s,handlerExport:E(a),line:a.getStartLineNumber(),targetExport:d.exportName,targetFile:d.file})}return r},aa=(e,t)=>{const s=[];for(const n of e.getDescendantsOfKind(l.CallExpression)){const i=Jo(n);if(i===void 0||!Qo.has(i))continue;const r=ea(n);r!==void 0&&s.push(...oa(r,i==="defineQueue"?"queue":"workflow",t))}return s},ca=(e,t)=>{const s=[];for(const n of g(t)){const i=e.getSourceFile(n)??e.addSourceFileAtPath(n);s.push(...aa(i,v(t,n)))}return s},gt={dbRateLimit:"usesRateLimit",emailGateMiddleware:"usesEmailGate",mask:"usesMask",rateLimit:"usesRateLimit",rls:"usesRls",verifyTurnstile:"usesCaptcha",verifyTurnstileMiddleware:"usesCaptcha"},mt=new Set(["account","credential","member","passkey","session","user"]),la=e=>e.replaceAll(/[-_]/gu," ").replaceAll(/([a-z0-9])([A-Z])/gu,"$1 $2").split(" ").filter(Boolean).map(t=>t.toLowerCase()),ua=e=>{const s=la(e).at(-1);if(!s)return!1;const n=s.endsWith("s")?s.slice(0,-1):s;return mt.has(s)||mt.has(n)},da=e=>{const t=e.replaceAll(/[^a-z0-9]/giu,"").toLowerCase();return t.endsWith("email")||t.endsWith("emailaddress")},fa=(e,t)=>{const{objects:s,opaque:n}=Lt(e,t);return pr(s).some(i=>da(i))?!0:n?void 0:!1},pa=e=>{const t=e.getArguments()[0];return!t||!o.isObjectLiteralExpression(t)?{usesCaptcha:!1,usesRateLimit:!1}:{usesCaptcha:!!t.getProperty("captcha"),usesRateLimit:!!t.getProperty("rateLimit")}},ga=e=>{if(o.isCallExpression(e))return e;if(!o.isIdentifier(e))return;const s=e.getSourceFile().getVariableDeclaration(e.getText())?.getInitializer();return s&&o.isCallExpression(s)?s:void 0},X={usesCaptcha:!1,usesEmailGate:!1,usesMask:!1,usesRateLimit:!1,usesRls:!1},ma=e=>{const t=ga(e),s=t?y(t.getExpression()):void 0;if(t&&s==="protectPublic"){const n=pa(t);return{...X,usesCaptcha:n.usesCaptcha,usesRateLimit:n.usesRateLimit}}return s!==void 0&&s in gt?{...X,[gt[s]]:!0}:X},ha=e=>{const t={...X};let s=e;for(;o.isCallExpression(s);){const n=s.getExpression();if(!o.isPropertyAccessExpression(n))break;const i=n.getName()==="use"?s.getArguments()[0]:void 0;if(i){const r=ma(i);t.usesCaptcha||=r.usesCaptcha,t.usesEmailGate||=r.usesEmailGate,t.usesMask||=r.usesMask,t.usesRateLimit||=r.usesRateLimit,t.usesRls||=r.usesRls}s=n.getExpression()}return t},xa=new Set(["insert","insertMany","insertManyUnsafe","replace"]),Ea=e=>{const t=e.getExpression();if(!o.isPropertyAccessExpression(t)||!xa.has(t.getName()))return!1;const s=t.getExpression();if(!M(s))return!1;const i=e.getArguments()[0];return!i||!(o.isStringLiteral(i)||o.isNoSubstitutionTemplateLiteral(i))?!1:ua(i.getLiteralText())},va=new Set(["create","runAfter","runAt","send","sendBatch"]),Sa=new Set(["queues","scheduler","workflows"]),ya=e=>{const t=e.getExpression();if(!o.isPropertyAccessExpression(t)||!va.has(t.getName()))return!1;let s=t.getExpression();for(;o.isCallExpression(s)||o.isElementAccessExpression(s)||o.isPropertyAccessExpression(s);){if(o.isPropertyAccessExpression(s)&&Sa.has(s.getName())){const n=s.getExpression();if(o.isIdentifier(n)&&n.getText()==="ctx")return!0}s=s.getExpression()}return!1},Aa=e=>{const t=e.getExpression();if(!o.isPropertyAccessExpression(t)||t.getName()!=="insertManyUnsafe")return!1;const s=t.getExpression();return M(s)},$t=new Set(["generateObject","generateText","streamObject","streamText"]),Na=e=>{const t=y(e.getExpression());return t!==void 0&&$t.has(t)},ba=e=>{const t=y(e.getExpression());if(t===void 0||!$t.has(t))return!1;const s=e.getArguments()[0];return!s||!o.isObjectLiteralExpression(s)||s.getProperties().some(n=>o.isSpreadAssignment(n))?!1:!s.getProperty("maxOutputTokens")},Pa=new Set(["log","span","trace"]),Ia=new Set(["ai"]),wa=new Set(["email","mail"]),Ta=new Set(["ai","browser","fetch","mail","notify","queues","sql","storage","workflows"]),he=(e,t)=>e.getDescendantsOfKind(l.PropertyAccessExpression).some(s=>{if(!t.has(s.getName()))return!1;const n=s.getExpression();return o.isIdentifier(n)&&n.getText()==="ctx"}),Ca=new Set([l.ArrowFunction,l.FunctionDeclaration,l.FunctionExpression,l.GetAccessor,l.MethodDeclaration,l.SetAccessor]),Fa=new Set(["every","filter","flatMap","forEach","map","some"]),Oa=new Set(["all","allSettled","race"]),Ra=e=>{const t=e.getParent();if(!t||!o.isCallExpression(t)||!t.getArguments().includes(e))return;const s=t.getExpression();if(!o.isPropertyAccessExpression(s))return;const n=s.getName();if(Fa.has(n))return t;const i=s.getExpression();if(o.isIdentifier(i)&&i.getText()==="Promise"&&Oa.has(n))return t},La=e=>{let t=e.getParent();for(;t;){if(o.isTryStatement(t)){const s=t.getTryBlock();if(e.getPos()>=s.getPos()&&e.getEnd()<=s.getEnd())return!0}if(Ca.has(t.getKind())){const s=Ra(t);if(!s)return!1;t=s;continue}t=t.getParent()}return!1},Da=e=>{let t=e;for(;;){const s=t.getParent();if(!o.isPropertyAccessExpression(s)||s.getExpression()!==t)return!1;if(s.getName()==="catch")return!0;if(s.getName()!=="then"&&s.getName()!=="finally")return!1;const n=s.getParent();if(!o.isCallExpression(n)||n.getExpression()!==s)return!1;t=n}},ka=e=>{let t=e;for(;;){const s=t.getParent();if(o.isPropertyAccessExpression(s)&&s.getExpression()===t){t=s;continue}return o.isCallExpression(s)&&s.getExpression()===t?s:void 0}},Ma=e=>{let t=!1,s=!0;for(const n of e.getDescendantsOfKind(l.PropertyAccessExpression)){if(!Ta.has(n.getName()))continue;const i=n.getExpression();if(!o.isIdentifier(i)||i.getText()!=="ctx")continue;const r=ka(n);r&&(t=!0,!La(r)&&!Da(r)&&(s=!1))}return{handlesErrors:t&&s,reachesOutbound:t}},Ka=e=>e.getDescendantsOfKind(l.ThrowStatement).some(t=>{const s=t.getExpression();if(!o.isNewExpression(s))return!1;const n=s.getExpression();return o.isIdentifier(n)&&n.getText()==="Error"}),ht="lunora-advisor-exempt",_a=/^[\s*/]+/u,za=/[\w-]/u,Ua=e=>{const s=(e.getFirstAncestorByKind(l.VariableStatement)??e).getLeadingCommentRanges().map(n=>n.getText()).join(`
|
|
6
|
+
`);for(const n of s.split(`
|
|
7
|
+
`)){const i=n.replace(_a,"");if(!i.startsWith(ht))continue;const r=i.slice(ht.length);if(za.test(r.charAt(0)))continue;const a=r.indexOf("--");return{exempt:!0,exemptReason:(a===-1?"":r.slice(a+2).split("*")[0]??"").trim()}}return{exempt:!1,exemptReason:""}},Ba=e=>{const[t]=e.getArguments();if(t){if(o.isObjectLiteralExpression(t)){const s=t.getProperty("handler");return s?o.isPropertyAssignment(s)?s.getInitializer():o.isShorthandPropertyAssignment(s)?s.getNameNode():o.isMethodDeclaration(s)?s:void 0:void 0}return t}},qa=(e,t)=>{const s=Ba(t);if(!s)return;if(o.isArrowFunction(s)||o.isFunctionExpression(s)||o.isMethodDeclaration(s))return e;if(!o.isIdentifier(s))return;const n=s.getSourceFile(),i=s.getText(),r=n.getVariableDeclaration(i)?.getInitializer();return r&&(o.isArrowFunction(r)||o.isFunctionExpression(r))?r:n.getFunction(i)},$a=e=>{let t=!1,s=!1,n=!1,i=!1,r=!1;for(const u of e.getDescendantsOfKind(l.CallExpression))if(Ea(u)&&(r=!0),ya(u)&&(t=!0),Aa(u)&&(i=!0),Na(u)&&(s=!0),ba(u)&&(n=!0),r&&t&&i&&n)break;const{handlesErrors:a,reachesOutbound:c}=Ma(e);return{callsMail:he(e,wa),emitsEvent:he(e,Pa),fanOut:t,handlesErrors:a,reachesOutbound:c,runsAiGeneration:s||he(e,Ia),throwsBareError:Ka(e),unboundedAiGeneration:n,usesInsertManyUnsafe:i,writesUserTable:r}},ja=(e,t)=>{const s=e.getInitializer();if(!s||!o.isCallExpression(s))return;const n=z(s);if(!n||n.kind!=="query"&&n.kind!=="mutation"&&n.kind!=="action")return;const i=n.receiver?ha(n.receiver):{usesCaptcha:!1,usesEmailGate:!1,usesMask:!1,usesRateLimit:!1,usesRls:!1},r=qa(e,s);return{...r?$a(r):{},...Ua(e),...i,analyzableBody:r!==void 0,exportName:e.getName(),file:t,hasEmailArg:fa(s,n.receiver),kind:n.kind,visibility:n.visibility}},Va=(e,t)=>{const s=[];for(const n of e.getVariableStatements())if(n.isExported())for(const i of n.getDeclarations()){const r=ja(i,t);r&&s.push(r)}return s},Wa=(e,t)=>{const s=[];for(const n of g(t)){const i=e.getSourceFile(n)??e.addSourceFileAtPath(n);s.push(...Va(i,v(t,n)))}return s},Ha=new Set(["dbRateLimit","rateLimit"]),Ga=e=>o.isArrowFunction(e)?e.getBody():e,Ya=(e,t)=>{const s=y(e.getExpression());if(s===void 0||!Ha.has(s))return;const n=e.getArguments()[2];if(!n)return;const i=A(n,"key");if(!i)return;const r=Ga(i);if(!(!L(r)||_(r)))return{callee:s,exportName:E(e),file:t,limitName:Nt(e),line:e.getStartLineNumber()}},Qa=(e,t)=>I(e,t,Ya),Xa=new Set(["findFirst","findFirstOrThrow","findMany","get"]),Za=e=>{const t=e.getExpression();if(!o.isPropertyAccessExpression(t)||!Xa.has(t.getName()))return;const s=t.getExpression();if(M(s)){const n=e.getArguments()[0];return n&&o.isStringLiteral(n)?n.getLiteralText():""}if(o.isPropertyAccessExpression(s)&&M(s.getExpression()))return s.getName()},Ja=e=>{let t=e;for(;o.isCallExpression(t);){const s=t.getExpression();if(!o.isPropertyAccessExpression(s))return;if(s.getName()==="query"&&M(s.getExpression())){const n=t.getArguments()[0];return n&&o.isStringLiteral(n)?n.getLiteralText():""}t=s.getExpression()}},ec=e=>{let t=Ze(e)??e;for(;o.isAwaitExpression(t);)t=Ze(t.getExpression())??t.getExpression();return t},jt=(e,t=!1)=>{const s=ec(e);if(o.isIdentifier(s)){if(t)return;const n=ie(s);return n===void 0?void 0:jt(n,!0)}if(o.isCallExpression(s))return Za(s)??Ja(s)},tc=e=>{const t=e.getBody();if(!o.isBlock(t))return[t];const s=[];for(const n of e.getDescendantsOfKind(l.ReturnStatement)){const i=n.getFirstAncestor(a=>o.isArrowFunction(a)||o.isFunctionExpression(a)||o.isFunctionDeclaration(a)),r=n.getExpression();i===e&&r!==void 0&&s.push(r)}return s},sc=(e,t)=>{if(!o.isVariableDeclaration(e))return[];const s=e.getInitializer();if(s===void 0||!o.isCallExpression(s))return[];const n=z(s);if(n?.kind!=="query")return[];const i=kt(s);if(i===void 0)return[];const r=n.receiver!==void 0&&Vs(n.receiver,"output"),a=n.receiver!==void 0&&Pt(n.receiver,"use","mask"),c=new Set,u=[];for(const d of tc(i)){const S=jt(d);S===void 0||c.has(S)||(c.add(S),u.push({exportName:e.getName(),file:t,line:d.getStartLineNumber(),table:S,usesMask:a,usesOutput:r,visibility:n.visibility}))}return u},nc=(e,t)=>{const s=[];for(const n of g(t)){const i=e.getSourceFile(n)??e.addSourceFileAtPath(n),r=v(t,n);for(const a of i.getVariableStatements())if(a.isExported())for(const c of a.getDeclarations())s.push(...sc(c,r))}return s},rc=e=>{if(!e||!o.isObjectLiteralExpression(e))return[];const t=[];for(const s of e.getProperties())(o.isPropertyAssignment(s)||o.isShorthandPropertyAssignment(s)||o.isMethodDeclaration(s)||o.isGetAccessorDeclaration(s))&&t.push(s.getName());return t},ic=(e,t)=>{if(!o.isVariableDeclaration(e))return[];const s=e.getInitializer(),n=s&&o.isCallExpression(s)?z(s):void 0;if(!n)return[];const i=[];for(const r of e.getDescendantsOfKind(l.CallExpression)){const a=bt(r);if(a===void 0)continue;const c=rc(A(a.options,"with"));c.length!==0&&i.push({exportName:e.getName(),file:t,line:r.getStartLineNumber(),parentTable:a.table,relations:c,visibility:n.visibility})}return i},oc=(e,t)=>{const s=[];for(const n of g(t)){const i=e.getSourceFile(n)??e.addSourceFileAtPath(n),r=v(t,n);for(const a of i.getVariableStatements())if(a.isExported())for(const c of a.getDeclarations())s.push(...ic(c,r))}return s},te=e=>{if(o.isStringLiteral(e)||o.isNoSubstitutionTemplateLiteral(e))return e.getLiteralText();if(o.isBinaryExpression(e)&&e.getOperatorToken().getKind()===l.PlusToken){const t=te(e.getLeft()),s=te(e.getRight());return t!==void 0&&s!==void 0?t+s:void 0}},ac=e=>{let t=e,s=t.getParent();for(;s!==void 0&&o.isBinaryExpression(s)&&s.getOperatorToken().getKind()===l.PlusToken;)t=s,s=t.getParent();return t!==e&&te(t)!==void 0},cc=/(?:^|\/)__tests__\//u,lc=/\.(?:spec|test)$/u,uc=e=>cc.test(e)||lc.test(e),dc=e=>{const t=e.getParent();if(t!==void 0){if(o.isVariableDeclaration(t)||o.isPropertyAssignment(t)||o.isPropertySignature(t))return t.getName();if(o.isBinaryExpression(t)&&t.getOperatorToken().getKind()===l.EqualsToken)return t.getLeft().getText()}},fc=(e,t,s)=>fn(e)?!uc(s)&&pn(dc(t)):!0,pc=(e,t)=>{const s=[],n=[...e.getDescendantsOfKind(l.BinaryExpression),...e.getDescendantsOfKind(l.StringLiteral),...e.getDescendantsOfKind(l.NoSubstitutionTemplateLiteral)],i=new Set;for(const r of n){if(ac(r))continue;const a=te(r);if(a===void 0)continue;const c=un(a);if(c===void 0||!fc(c,r,t))continue;const u=r.getStartLineNumber(),d=`${String(u)}:${c}`;i.has(d)||(i.add(d),s.push({file:t,kind:c,line:u,preview:dn(a)}))}return s},gc=(e,t)=>{const s=[];for(const n of g(t)){const i=e.getSourceFile(n)??e.addSourceFileAtPath(n);s.push(...pc(i,v(t,n)))}return s},mc=(e,t)=>{if(!o.isVariableDeclaration(e))return[];const s=e.getInitializer(),n=s&&o.isCallExpression(s)?z(s):void 0;if(!n)return[];const i=[];for(const r of e.getDescendantsOfKind(l.CallExpression)){const a=bt(r);if(a===void 0)continue;const c=A(a.options,"includeDeleted");if(c===void 0)continue;const u=o.isTrueLiteral(c),d=!u&&L(c);!u&&!d||i.push({exportName:e.getName(),file:t,fromArgs:d,hardcodedTrue:u,line:r.getStartLineNumber(),table:a.table,visibility:n.visibility})}return i},hc=(e,t)=>{const s=[];for(const n of g(t)){const i=e.getSourceFile(n)??e.addSourceFileAtPath(n),r=v(t,n);for(const a of i.getVariableStatements())if(a.isExported())for(const c of a.getDeclarations())s.push(...mc(c,r))}return s},xc=new Set(["query","unsafe"]),Ec=e=>{if(!o.isPropertyAccessExpression(e)||!xc.has(e.getName()))return!1;const t=e.getExpression();if(!o.isPropertyAccessExpression(t)||t.getName()!=="sql")return!1;const s=t.getExpression();return o.isIdentifier(s)&&s.getText()==="ctx"},vc=e=>o.isBinaryExpression(e)||o.isTemplateExpression(e),Sc=e=>e.getFirstAncestorByKind(l.VariableDeclaration)?.getName()??"<module>",yc=(e,t)=>{if(!Ec(e.getExpression()))return;const s=e.getArguments()[0];if(!(!s||!vc(s)))return{exportName:Sc(e),file:t,line:s.getStartLineNumber()}},Ac=(e,t)=>I(e,t,yc),Nc=[["convex",["convex","@convex-dev/"]],["supabase",["@supabase/"]],["firebase",["firebase","@firebase/","firebase-admin"]]],bc=e=>{for(const[t,s]of Nc)for(const n of s)if(e===n||e.startsWith(n.endsWith("/")?n:`${n}/`))return t},Pc=(e,t)=>{const s=[];for(const n of g(t)){const i=e.getSourceFile(n)??e.addSourceFileAtPath(n);for(const r of i.getImportDeclarations()){const a=r.getModuleSpecifierValue(),c=bc(a);c!==void 0&&s.push({file:v(t,n),line:r.getStartLineNumber(),moduleSpecifier:a,platform:c})}}return s},Ic=new Set(["createMultipartUpload","delete","download","generateUploadUrl","get","getMetadata","getPresignedUrl","getSignedUrl","getUrl","head","put","resumeMultipartUpload","store","upload"]),wc=(e,t,s=[])=>{const n=new Map(s.map(r=>[`${r.filePath}:${r.exportName}`,r.visibility]));return oe(e,t,{argIndex:0,matchReceiver:r=>r==="ctx.storage"||r.startsWith("ctx.storage."),methods:Ic,requireUnmodifiedReach:!0}).map(r=>{const a=n.get(`${r.file}:${r.exportName}`);return a===void 0?r:{...r,visibility:a}})},Tc=new Map([["generateUploadUrl",1],["getPresignedUrl",1],["getSignedUrl",1],["store",2],["upload",2]]),Cc=e=>e&&o.isNumericLiteral(e)?Number(e.getText()):void 0,Fc=e=>{if(e===void 0)return{analyzable:!0,presentKeys:[]};if(!o.isObjectLiteralExpression(e))return{analyzable:!1,presentKeys:[]};const t=[];let s,n=!1;for(const i of e.getProperties()){if(o.isSpreadAssignment(i)){n=!0;continue}if(o.isPropertyAssignment(i)){const r=i.getName();t.push(r),r==="expiresInSeconds"&&(s=Cc(i.getInitializer()));continue}(o.isShorthandPropertyAssignment(i)||o.isMethodDeclaration(i))&&t.push(i.getName())}return{analyzable:!n,expiresInSeconds:s,presentKeys:t}},Oc=e=>{if(!o.isPropertyAccessExpression(e))return;const t=e.getName(),s=Tc.get(t);if(s===void 0)return;const n=e.getExpression().getText();return n==="ctx.storage"||n.startsWith("ctx.storage.")?{method:t,optionsIndex:s}:void 0},Rc=(e,t)=>{const s=Oc(e.getExpression());if(s!==void 0)return{exportName:E(e),file:t,line:e.getStartLineNumber(),method:s.method,...Fc(e.getArguments()[s.optionsIndex])}},Lc=(e,t)=>I(e,t,Rc),Dc=(e,t)=>({analytics:e.analytics||t.dependencies.has("@lunora/bindings"),auth:t.dependencies.has("@lunora/auth"),containers:e.container||t.containerCount>0||t.dependencies.has("@lunora/container"),flags:e.flags||t.dependencies.has("@lunora/flags"),kv:e.kv||t.dependencies.has("@lunora/bindings"),mail:e.mail||t.dependencies.has("@lunora/mail"),notifications:e.notify||t.dependencies.has("@lunora/notify"),payments:e.payments||t.hasPaymentTables,queues:t.queueCount>0||t.dependencies.has("@lunora/queue"),scheduler:e.scheduler||t.cronCount>0||t.dependencies.has("@lunora/scheduler"),storage:e.storage||t.storageRuleCount>0||t.storageColumnCount>0||t.dependencies.has("@lunora/storage"),vectors:e.vectors||t.vectorIndexCount>0||t.dependencies.has("@lunora/bindings"),workflows:e.workflows||t.workflowCount>0||t.dependencies.has("@lunora/workflow")}),kc=new Set(["RegisteredAction","RegisteredMutation","RegisteredQuery"]),be=e=>{const t=e.getType(),s=t.getAliasSymbol()?.getName()??t.getSymbol()?.getName();return s!==void 0&&kc.has(s)?s:void 0},Vt=e=>{const t=e.getInitializer();return t===void 0?!1:o.isCallExpression(t)||o.isIdentifier(t)||o.isPropertyAccessExpression(t)},Wt={cause:"codegen recognises a procedure only when the initializer is a builder chain, and this one is produced by a call or an alias",remediation:"A factory that returns a procedure cannot be read statically — inline it, or export the chain the factory builds."},Mc={cause:"the binding is exported by a separate `export { … }` statement, and codegen reads the `export` keyword on the declaration itself",remediation:"Move the keyword onto the declaration and drop the separate export statement."},Pe=(e,t,s,n,i)=>({cacheKey:`procedure_not_registered:${e}:${t}`,categories:["SCHEMA"],description:"Codegen registers an export only when the declaration carries `export` and its initializer is literally a builder chain. A procedure written any other way exists at runtime but never reaches `_generated/api.ts`, so no caller can address it.",detail:`\`${t}\` in \`${e}\` (line ${n.toString()}) has type \`${s}\` but was not registered — ${i.cause}.`,facing:"INTERNAL",level:"WARN",metadata:{exportName:t,filePath:e,line:n,typeName:s},name:"procedure_not_registered",remediation:`Assign the builder chain directly: \`export const ${t} = query.input({ … }).query(handler);\`. ${i.remediation}`,title:"Procedure exists at runtime but is missing from the generated API"}),Kc=(e,t,s)=>{const n=[];for(const i of e.getVariableStatements().filter(r=>r.isExported()))for(const r of i.getDeclarations()){const a=r.getName();if(s.has(`${t}:${a}`)||!Vt(r))continue;const c=be(r);c!==void 0&&n.push(Pe(t,a,c,r.getStartLineNumber(),Wt))}return n},_c=(e,t,s)=>{if(s.has(`${t}:default`))return[];const n=[];for(const i of e.getExportAssignments().filter(r=>!r.isExportEquals())){const r=be(i.getExpression());r!==void 0&&n.push(Pe(t,"default",r,i.getStartLineNumber(),Wt))}return n},zc=(e,t,s)=>{const n=[];for(const i of e.getExportDeclarations().filter(r=>r.getModuleSpecifier()===void 0))for(const r of i.getNamedExports()){const a=r.getAliasNode()?.getText()??r.getName();if(s.has(`${t}:${a}`))continue;const c=r.getLocalTargetDeclarations().find(d=>o.isVariableDeclaration(d));if(c===void 0||!Vt(c))continue;const u=be(c);u!==void 0&&n.push(Pe(t,a,u,r.getStartLineNumber(),Mc))}return n},Uc=(e,t,s)=>[...Kc(e,t,s),..._c(e,t,s),...zc(e,t,s)],Bc=(e,t,s)=>{const n=new Set(s.map(r=>`${r.filePath}:${r.exportName}`)),i=[];for(const r of g(t)){const a=e.getSourceFile(r);a!==void 0&&i.push(...Uc(a,v(t,r),n))}return i.toSorted((r,a)=>r.cacheKey.localeCompare(a.cacheKey))},qc=new Set(["when","where"]),xe=new Set(["definePolicy","defineShape"]),$c=e=>{if(!o.isCallExpression(e))return;const t=e.getExpression();if(o.isPropertyAccessExpression(t)){const n=t.getName();return xe.has(n)?n:void 0}if(!o.isIdentifier(t))return;for(const n of t.getSymbol()?.getDeclarations()??[])if(o.isImportSpecifier(n)){const i=n.getNameNode().getText();return xe.has(i)?i:void 0}const s=t.getText();return xe.has(s)?s:void 0},jc=e=>o.isObjectLiteralExpression(e)&&e.getProperties().length===0,Ht=e=>{if(e!==void 0){if(o.isReturnStatement(e)&&e.getExpression()===void 0||e.getKind()===l.UndefinedKeyword||e.getText()==="undefined")return"undefined";if(jc(e))return"empty-object";if(o.isParenthesizedExpression(e))return Ht(e.getExpression())}},Ie=e=>e.getAncestors().find(t=>o.isArrowFunction(t)||o.isFunctionExpression(t)||o.isFunctionDeclaration(t)),Vc=e=>e.getDescendantsOfKind(l.ReturnStatement).filter(t=>Ie(t)===e),Gt=e=>e.getDescendantsOfKind(l.ConditionalExpression).filter(t=>Ie(t)===e),Wc=e=>{const t=Vc(e);return t.length>1?!0:t.some(s=>s.getFirstAncestorByKind(l.IfStatement)!==void 0)||Gt(e).length>0},Hc=e=>e.getDescendantsOfKind(l.IfStatement).filter(t=>Ie(t)===e),ye=e=>e.getKind()===l.NullKeyword||e.getKind()===l.FalseKeyword||o.isIdentifier(e)&&e.getText()==="undefined"?!0:o.isNumericLiteral(e)?e.getLiteralValue()===0:o.isStringLiteral(e)&&e.getLiteralValue()==="",Gc=(e,t)=>ye(e)||ye(t),Yc=new Map([[l.EqualsEqualsEqualsToken,"positive"],[l.EqualsEqualsToken,"positive"],[l.ExclamationEqualsEqualsToken,"negative"],[l.ExclamationEqualsToken,"negative"]]),xt=e=>!ye(e)&&(o.isLiteralExpression(e)||e.getKind()===l.TrueKeyword),Qc=(e,t,s)=>{const n=Yc.get(e);if(n!==void 0)return Gc(t,s)?n==="positive"?"negative":"positive":xt(t)||xt(s)?void 0:n},j=e=>{if(o.isParenthesizedExpression(e))return j(e.getExpression());if(o.isPrefixUnaryExpression(e)&&e.getOperatorToken()===l.ExclamationToken)return"negative";if(o.isBinaryExpression(e)){const t=e.getOperatorToken().getKind(),s=Qc(t,e.getLeft(),e.getRight());if(s!==void 0)return s;if(t===l.AmpersandAmpersandToken||t===l.BarBarToken){const n=j(e.getLeft()),i=j(e.getRight());return n===i?n:"indeterminate"}}return o.isIdentifier(e)||o.isPropertyAccessExpression(e)||o.isElementAccessExpression(e)||o.isCallExpression(e)?"positive":"indeterminate"},Et=e=>{if(e!==void 0){if(o.isReturnStatement(e))return e;if(o.isBlock(e)){const t=e.getStatements().at(-1);return t!==void 0&&o.isReturnStatement(t)?t:void 0}}},Xc=e=>{if(e.getElseStatement()!==void 0)return;const t=e.getNextSiblingIfKind(l.ReturnStatement);return t!==void 0&&t.getNextSibling()===void 0?t:void 0},Zc=e=>o.isReturnStatement(e)?e.getExpression()??e:e,Jc=e=>{const t=[];for(const s of Gt(e)){const n=j(s.getCondition());n==="positive"?t.push(s.getWhenFalse()):n==="negative"&&t.push(s.getWhenTrue())}for(const s of Hc(e)){const n=j(s.getExpression());if(n==="indeterminate")continue;const i=n==="negative"?Et(s.getThenStatement()):Et(s.getElseStatement())??Xc(s);i!==void 0&&t.push(Zc(i))}return t},el=e=>{for(const t of e.getAncestors())if(o.isVariableDeclaration(t)){const s=t.getNameNode();if(o.isIdentifier(s))return s.getText()}return"<anonymous>"},tl=(e,t,s)=>{if(!o.isCallExpression(e))return[];const[n]=e.getArguments();if(!n||!o.isObjectLiteralExpression(n))return[];const i=[];for(const r of n.getProperties()){if(!o.isPropertyAssignment(r)||!qc.has(r.getName()))continue;const a=r.getInitializer();if(!(!a||!(o.isArrowFunction(a)||o.isFunctionExpression(a)))&&Wc(a))for(const c of Jc(a)){const u=Ht(c);u!==void 0&&i.push({exportName:el(e),file:s,form:u,key:r.getName(),line:c.getStartLineNumber(),owner:t})}}return i},sl=(e,t)=>{const s=[];for(const n of e.getDescendantsOfKind(l.CallExpression)){const i=$c(n);i!==void 0&&s.push(...tl(n,i,t))}return s},nl=(e,t)=>{const s=[];for(const n of g(t)){const i=e.getSourceFile(n)??e.addSourceFileAtPath(n);s.push(...sl(i,v(t,n)))}return s},rl=new Set(["query","upsert","upsertMany"]),il=e=>{if(!o.isPropertyAccessExpression(e))return;const t=e.getName();if(rl.has(t))return e.getExpression().getText()==="ctx.vectors"?t:void 0},ol=(e,t)=>{const s=il(e.getExpression());if(s===void 0)return;const n=e.getArguments()[1];if(!n)return;const i=A(n,"namespace");if(!(!i||!L(i)||_(i)))return{exportName:E(e),file:t,line:e.getStartLineNumber(),method:s}},al=(e,t)=>I(e,t,ol),cl=e=>{const t=e.getExpression();if(!o.isPropertyAccessExpression(t)||t.getName()!=="get")return!1;const s=t.getExpression();return o.isPropertyAccessExpression(s)?s.getName()==="workflows":o.isIdentifier(s)&&s.getText()==="workflows"},ll=e=>{const t=e.getArguments()[0];return t&&o.isStringLiteral(t)?t.getLiteralText():""},ul=(e,t)=>{const s=[];for(const n of g(t)){const i=e.getSourceFile(n)??e.addSourceFileAtPath(n),r=v(t,n);for(const a of i.getDescendantsOfKind(l.CallExpression)){if(!cl(a))continue;const c=Rs(a);c!==""&&s.push({exportName:c,file:r,line:a.getStartLineNumber(),workflow:ll(a)})}}return s},dl=".lunora-schema.json",C=(e,t)=>{P(e)&&yt(e,"utf8")===t||os(e,t,"utf8")},R=(e,t)=>{if(t===""){as(e,{force:!0});return}C(e,t)},fl=e=>{const t=f(e,"package.json");if(P(t))try{const s=JSON.parse(yt(t,"utf8"));return typeof s.version=="string"&&s.version!==""?s.version:void 0}catch{return}},pl=()=>{const e=process.env.LUNORA_CODEGEN_TIMING;return e!==void 0&&e!==""},gl=e=>{let t=P(e)?e:fe(e);for(;t&&t!==fe(t);){const s=f(t,"tsconfig.json");if(P(s))return s;t=fe(t)}},vt=e=>e.replaceAll("\\","/"),ml=(e,t,s)=>{if(s&&e.length>0){const r=e.map(a=>`"${a.exportName}"`).join(", ");throw new k("MASK_UNSUPPORTED",`This project declares a \`mask(...)\` policy whose argument isn't a plain object literal (e.g. \`mask(sharedPolicies)\` referencing a hoisted variable), or contains a spread (\`...shared\`) or computed key (\`[name]:\`) codegen can't enumerate, so codegen can't tell which columns it masks. Because the project also declares replication shape(s) (${r}), codegen can't verify none of them replicate a table that policy masks — inline every table and column as literal keys so codegen can verify it, or remove the affected shape(s).`,{status:422})}const n=new Map;for(const r of t.columns){const a=n.get(r.table)??[];a.push(r.column),n.set(r.table,a)}const i=t.columns.length>0;for(const r of e){if(r.table===void 0){if(i)throw new k("MASK_UNSUPPORTED",`defineShape "${r.exportName}" has a non-literal \`table\` (a variable or expression, not a string literal), so codegen can't statically verify it doesn't replicate a table that masks a column. This project masks at least one column elsewhere, so the combination can't be proven safe — change "${r.exportName}"'s \`table\` to a plain string literal so codegen can verify it, or remove the mask(s) on the table it targets.`,{status:422});continue}const a=n.get(r.table);if(a===void 0)continue;const c=a.map(u=>`"${u}"`).join(", ");throw new k("MASK_UNSUPPORTED",`defineShape "${r.exportName}" replicates table "${r.table}", which masks column(s) ${c} on at least one procedure. A shape runs no procedure, so \`.use(mask(...))\` never applies to its replicated rows — remove the shape, unmask the table, or wait for shape-masking support.`,{status:422})}},se=(e,t,s)=>{const n=e.getSourceFile(t);if(n===void 0){e.createSourceFile(t,s,{overwrite:!0});return}n.getFullText()!==s&&n.replaceWithText(s)},St=(e,t,s)=>e.getSourceFile(t)?.getFullText()===s,hl=8,xl=e=>{const{agents:t,apiPath:s,generatedFunctionsPath:n,lunoraDirectory:i,migrations:r,project:a,shapes:c,usesSandbox:u,useUmbrella:d,workflows:S}=e;let x=Je(a,i),w=tt(a,i),p=et(a,i);An([...x,...w].map(T=>T.filePath));for(let T=1;;T+=1){const F=Cs({agents:t,functions:x,httpRoutes:p,mutators:w,useUmbrella:d,workflows:S}),D=Fs({agents:t,functions:x,migrations:r,mutators:w,shapes:c,useUmbrella:d,usesSandbox:u});if(T>=hl||St(a,s,F)&&St(a,n,D))return{apiContent:F,functions:x,functionsContent:D,httpRoutes:p,mutators:w};se(a,s,F),se(a,n,D),x=Je(a,i),w=tt(a,i),p=et(a,i)}},El=e=>{const t=gl(e);return t?new Xe({skipAddingFilesFromTsConfig:!1,tsConfigFilePath:t,useInMemoryFileSystem:!1}):new Xe({skipAddingFilesFromTsConfig:!0,useInMemoryFileSystem:!1})},fu=(e,t)=>{const s=g(t),n=f(t,"schema.ts");P(n)&&s.push(n);for(const c of s){const u=e.getSourceFile(c);u===void 0?e.addSourceFileAtPath(c):u.refreshFromFileSystemSync()}const i=new Set(s.map(c=>vt(c))),r=vt(t),a=`${r}/`;for(const c of e.getSourceFiles()){const u=c.getFilePath();(u===r||u.startsWith(a))&&!i.has(u)&&e.removeSourceFile(c)}for(const c of e.getSourceFiles()){const u=c.getFilePath();if(!(u===r||u.startsWith(a)||u.includes("/node_modules/")))try{c.refreshFromFileSystemSync()}catch{e.removeSourceFile(c)}}},pu=e=>{const t=pl(),s=t?pe.now():0,n=f(e.projectRoot,e.lunoraDirectory??"lunora"),i=f(n,"schema.ts");if(!P(i))throw new k("INTERNAL",`schema.ts not found at ${i}`);const r=e.project??El(n);Sn(Si);const a=ln(r,i,e.projectRoot),{agents:c,containers:u,crons:d,dataModelContent:S,dependencies:x,env:w,featureUsage:p,hasFlags:T,hasNotify:F,identity:D,platformGate:N,queues:O,serverContent:U,storageRulesMetadata:B,usesSandbox:W,useUmbrella:K,workflows:b}=Un({lunoraDirectory:n,project:r,projectRoot:e.projectRoot,schema:a,target:e.target}),m=f(n,"_generated"),we=f(m,"dataModel.ts"),Te=f(m,"server.ts"),Yt=f(m,"api.ts"),Qt=f(m,"functions.ts");se(r,we,S),se(r,Te,U);const ae=Js(r,n),q=gn(r,n),{apiContent:Ce,functions:$,functionsContent:Fe,httpRoutes:Xt,mutators:Zt}=xl({agents:c,apiPath:Yt,generatedFunctionsPath:Qt,lunoraDirectory:n,migrations:ae,project:r,shapes:q,useUmbrella:K,usesSandbox:W,workflows:b}),H=e.lint===!1?void 0:us({adminRoutes:Gn(r,n),aiRawRuns:Xn(r,n),aiToolSideEffects:ar(r,n),argumentDerivedFetches:ur(r,n),argumentValidators:Sr(r,n),authApiCalls:Ws(r,n),authConfigs:Fr(r,n),browserUrlAccesses:kr(r,n),configCalls:$r(r,n),containerKeyAccesses:Vr(r,n),containerOverrides:Xr(r,n),containers:u,exportSinks:ti(r,n),staleMigrationImports:Pc(r,n),failOpenGuards:oi(r,n),flagReads:mi(r,n),flagSecurityDefaults:vi(r,n),geoIndexUsages:Ni(r,n),httpActionGuards:Fi(r,n),httpHeaderWrites:Ui(r,n),hyperdriveCalls:Qs(r,n),identityClaimReads:Hi(r,n),imageDeliveryUrlAccesses:Yi(r,n),inserts:Xs(r,n),kvKeyAccesses:Xi(r,n),mailRecipientAccesses:so(r,n),maskProcedures:Zs(r,n),maskStrategies:uo(r,n),mutatorWrites:xo(r,n),nondeterministicCalls:sn(r,n),normalizeIdAuthorizations:Lo(r,n),notifyCalls:rn(r,n),notifyConfig:nn(r,n),ownerFieldWrites:Bo(r,n,$),unrestrictedWhereBranches:nl(r,n),paymentWebhooks:Yo(r,n),privilegedDispatches:ca(r,n),procedureProtections:Wa(r,n),queries:js(r,n),queues:O,r2sqlCalls:on(r,n),ratelimitKeySelectors:Qa(r,n),rawRowReturns:nc(r,n),relationLoads:oc(r,n),rlsProcedures:an(r,n),schema:a,secretLiterals:gc(r,n),shapes:q,softDeleteReads:hc(r,n),sqlInterpolations:Ac(r,n),storageKeyAccesses:wc(r,n,$),storageUploads:Lc(r,n),vectorNamespaceAccesses:al(r,n),workflowCalls:ul(r,n),workflows:b,wranglerVariables:e.wranglerVariables}),Oe=H===void 0?[]:[...cs(H,{source:"static"}),...Bc(r,n,$)],Jt=cn(r,n),Re=ao(r,n);ml(q,Re,io(r,n));const es=T?ui(r,n):[],G=Dc(p,{containerCount:u.length,cronCount:d.length,dependencies:x,hasPaymentTables:jo(a.tables),queueCount:O.length,storageColumnCount:Object.keys(xs(a)).length,storageRuleCount:B.rules.length,vectorIndexCount:a.vectorIndexes.length,workflowCount:b.length}),Le=t?pe.now():0,ce=yn(a,ae.map(h=>h.id)),De=Es({advisories:Oe,advisorProcedures:H?.procedureProtections??[],agents:c,containers:u,env:w,flagKeys:es,hasAccessFacade:p.access,hasAi:p.ai,hasAnalytics:p.analytics,hasBrowser:p.browser,hasFlags:T,hasHyperdrive:p.hyperdrive,hasImages:p.images,hasKv:p.kv,hasNotify:F,hasPayments:p.payments,hasPipelines:p.pipelines,hasR2sql:p.r2sql,hasX402:p.x402,maskMetadata:Re,mutators:Zt,queues:O,rlsMetadata:Jt,schema:a,schemaSnapshot:ce,shapes:q,storageRules:B,studioFeatures:G,useUmbrella:K,workflows:b}),ke=vs(q,x.has("@lunora/db"),K),Me=Ss(u,a.jurisdiction),Ke=ys(b),_e=As(c),ze=Ns(O),Ue=bs(d),Be=Ps(a.vectorIndexes),Y=Is(a,K),qe=ws(x.has("@lunora/seed")),Q=e.apiSpec??"openapi",le=Q==="openapi"||Q==="both",ue=Q==="openrpc"||Q==="both",$e=mn({emailAgents:c.filter(h=>h.onEmail===!0).map(h=>({bindingName:h.bindingName,exportName:h.exportName})),hasAccess:x.has("@lunora/cloudflare-access"),hasAi:p.ai,hasAnalytics:p.analytics,hasAuth:x.has("@lunora/auth"),hasBrowser:p.browser,hasFramework:x.has("@lunora/astro")||x.has("@lunora/svelte")||x.has("@lunora/vue"),hasGlobal:a.tables.some(h=>h.shardMode==="global"&&h.globalBackend!=="hyperdrive"),hasHyperdrive:p.hyperdrive,hasHyperdriveGlobal:a.tables.some(h=>h.shardMode==="global"&&h.globalBackend==="hyperdrive"),hasImages:p.images,hasKv:p.kv,hasKvIntrospector:G.kv,hasNotify:F,hasPayments:p.payments,hasR2sql:p.r2sql,hasQueue:O.some(h=>h.mode==="push"),hasScheduler:G.scheduler,hasStorage:G.storage,hasVectors:N.signals.vectorStore!==!1&&a.vectorIndexes.length>0,hasWorkflow:b.length>0,hasX402:p.x402,identity:D,jurisdiction:a.jurisdiction,tableNames:a.tables.map(h=>h.name),useUmbrella:K,voiceAgents:c.filter(h=>h.voice===!0&&h.voiceBindingName!==void 0).map(h=>({bindingName:h.voiceBindingName,exportName:h.exportName})),wantsOpenApi:le,wantsOpenRpc:ue}),je=fl(e.projectRoot),Ve=hn({functions:$,httpRoutes:Xt,version:je}),We=En({functions:$,version:je}),He=`${JSON.stringify(Ve,void 0,2)}
|
|
8
|
+
`,Ge=`${JSON.stringify(We,void 0,2)}
|
|
9
|
+
`,Ye=xn(Ve),Qe=vn(We),de=f(n,dl),ts=P(de);if(e.dryRun||(P(m)||is(m,{recursive:!0}),C(f(m,"app.ts"),$e),C(we,S),C(f(m,"api.ts"),Ce),C(Te,U),C(f(m,"functions.ts"),Fe),C(f(m,"shard.ts"),De),C(f(m,"crons.ts"),Ue),C(f(m,"vectors.ts"),Be),C(f(m,"drizzle.global.ts"),Y.global),C(f(m,"drizzle.shard.ts"),Y.shard),R(f(m,"containers.ts"),Me),R(f(m,"workflows.ts"),Ke),R(f(m,"agents.ts"),_e),R(f(m,"queues.ts"),ze),R(f(m,"seed.ts"),qe),R(f(m,"collections.ts"),ke),R(f(m,"openapi.json"),le?He:""),R(f(m,"openapi.ts"),le?Ye:""),R(f(m,"openrpc.json"),ue?Ge:""),R(f(m,"openrpc.ts"),ue?Qe:""),(!ts||e.updateSchemaBaseline===!0)&&C(de,ls(ce))),t){const h=pe.now(),ss=Math.round(h-s),ns=Math.round(Le-s),rs=Math.round(h-Le);console.error(`@lunora/codegen: codegen took ${ss.toString()}ms (discovery ${ns.toString()}ms, emit ${rs.toString()}ms)`)}return{advisories:Oe,advisorContext:H,agents:c,containers:u,cronTriggers:Ts(d),generated:{agents:_e,api:Ce,app:$e,collections:ke,containers:Me,crons:Ue,dataModel:S,drizzleGlobal:Y.global,drizzleShard:Y.shard,functions:Fe,openApi:He,openApiModule:Ye,openRpc:Ge,openRpcModule:Qe,queues:ze,seed:qe,server:U,shard:De,vectors:Be,workflows:Ke},migrations:ae,outputDirectory:m,platformDiagnostics:N.diagnostics,queues:O,schemaSnapshot:ce,schemaSnapshotPath:de,workflows:b}};export{dl as SCHEMA_SNAPSHOT_FILENAME,El as createCodegenProject,gl as findTsconfig,fu as refreshCodegenProject,pu as runCodegen};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
const h=(e,i=2166136261)=>{let t=i;for(let n=0;n<e.length;n+=1)t^=e.codePointAt(n)??0,t=Math.imul(t,16777619);return(t>>>0).toString(16).padStart(8,"0")},y=e=>`${h(e,2166136261)}${h(e,16777619)}`,E=1;function m(e){const i={},t=Object.keys(e);t.sort();for(const n of t)i[n]=e[n];return i}const g=e=>`${JSON.stringify(e,void 0,2)}
|
|
2
|
+
`,I=e=>y(g(e)),a=e=>typeof e=="object"&&e!==null,v=e=>a(e)&&a(e.fields)&&a(e.indexes)&&a(e.relations)&&typeof e.shardMode=="string",q=e=>{if(e===void 0||e.trim()==="")return{status:"absent"};let i;try{i=JSON.parse(e)}catch(n){return{error:`baseline is not valid JSON: ${n instanceof Error?n.message:String(n)}`,status:"invalid"}}if(!a(i)||i.version!==1||!a(i.tables))return{error:`baseline is malformed or written by an incompatible version (expected version ${String(1)})`,status:"invalid"};for(const[n,o]of Object.entries(i.tables))if(!v(o))return{error:`baseline table "${n}" has an invalid structure`,status:"invalid"};return{snapshot:{jurisdiction:typeof i.jurisdiction=="string"?i.jurisdiction:void 0,migrationIds:Array.isArray(i.migrationIds)?i.migrationIds:[],tables:i.tables,version:1},status:"ok"}},$=(e,i)=>e.unique===i.unique&&e.fields.length===i.fields.length&&e.fields.every((t,n)=>t===i.fields[n]),p=e=>e.unique!==void 0,u=({nullable:e,optional:i,refined:t,unique:n,...o})=>JSON.stringify(m(o)),f=e=>e.kind==="union"&&e.members?e.members.map(i=>u(i)):[u(e)],b=(e,i)=>{if(i.kind!=="union")return!1;const t=new Set(f(i));return f(e).every(n=>t.has(n))},d=e=>{switch(e.kind){case"array":return`array(${e.of?d(e.of):"?"})`;case"id":return`id(${e.ref??"?"})`;case"literal":return`literal(${e.literal??"?"})`;case"object":return`object({ ${Object.keys(e.fields??{}).join(", ")} })`;case"record":return`record(${e.key?d(e.key):"?"}, ${e.of?d(e.of):"?"})`;case"union":return(e.members??[]).map(i=>d(i)).join(" | ");default:return e.kind}},c=(e,i,t)=>({remediation:"backfill",scope:"table",severity:"breaking",summary:t,table:e,type:i}),l=(e,i,t)=>({remediation:"none",scope:"table",severity:"safe",summary:t,table:e,type:i}),S=(e,i,t,n,o)=>{if(!(t.kind===n.kind&&(!o||u(t)===u(n))))return o&&b(t,n)?l(e,"widenedFieldShape",`field ${e}.${i} widened: ${d(t)} → ${d(n)} — every stored value stays valid`):t.kind!==n.kind?c(e,"changedFieldKind",`field ${e}.${i} changed type: ${t.kind} → ${n.kind} — add a data migration to convert existing values`):c(e,"changedFieldShape",`field ${e}.${i} changed shape: ${d(t)} → ${d(n)} — stored values were written against the old shape; add a data migration to convert them`)},k=(e,i,t,n)=>{const o=[];return t.unique!==n.unique&&o.push(n.unique===!0?c(e,"addedFieldConstraint",`field ${e}.${i} became unique — existing duplicates would violate it; add a data migration to de-duplicate first`):l(e,"relaxedFieldConstraint",`field ${e}.${i} is no longer unique`)),t.nullable!==n.nullable&&o.push(n.nullable===!0?l(e,"relaxedFieldConstraint",`field ${e}.${i} became nullable`):c(e,"addedFieldConstraint",`field ${e}.${i} is no longer nullable — rows holding NULL would be invalid; add a data migration to backfill them`)),t.refined!==n.refined&&o.push(n.refined===!0?c(e,"addedFieldConstraint",`field ${e}.${i} gained a validation refinement — stored values were never checked against it; add a data migration if any could fail`):l(e,"relaxedFieldConstraint",`field ${e}.${i} dropped its validation refinement`)),o},F=(e,i,t,n)=>{const o=[],s=p(t)&&p(n),r=S(e,i,t,n,s);return r&&o.push(r),s&&o.push(...k(e,i,t,n)),t.optional&&!n.optional?o.push({remediation:"backfill",severity:"breaking",summary:`field ${e}.${i} became required — rows missing it would be invalid; add a data migration to backfill it`,table:e,scope:"table",type:"fieldOptionalToRequired"}):!t.optional&&n.optional&&o.push({remediation:"none",scope:"table",severity:"safe",summary:`field ${e}.${i} became optional`,table:e,type:"fieldRequiredToOptional"}),o},O=(e,i,t)=>t.optional?{remediation:"none",scope:"table",severity:"safe",summary:`added optional field ${e}.${i}`,table:e,type:"addedOptionalField"}:{remediation:"backfill",severity:"breaking",summary:`added required field ${e}.${i} — existing rows have no value; add a data migration to backfill it`,table:e,scope:"table",type:"addedRequiredField"},x=(e,i,t,n)=>{for(const[o,s]of Object.entries(t.fields)){const r=i.fields[o];r===void 0?n.push(O(e,o,s)):n.push(...F(e,o,r,s))}for(const o of Object.keys(i.fields))t.fields[o]===void 0&&n.push({remediation:"backfill",severity:"breaking",summary:`removed field ${e}.${o} — add a data migration if stored data must be cleaned up`,table:e,scope:"table",type:"removedField"})},j=(e,i,t,n)=>{for(const[o,s]of Object.entries(t.indexes)){const r=i.indexes[o];if(r===void 0){n.push({remediation:"none",scope:"table",severity:"safe",summary:`added index ${o} on ${e}`,table:e,type:"addedIndex"});continue}$(r,s)||n.push({remediation:"code",severity:"breaking",summary:`index ${o} on ${e} changed shape — a query may have relied on the old index`,table:e,scope:"table",type:"changedIndex"})}for(const o of Object.keys(i.indexes))t.indexes[o]===void 0&&n.push({remediation:"code",severity:"breaking",summary:`removed index ${o} on ${e} — a query that used \`.withIndex("${o}")\` would break`,table:e,scope:"table",type:"removedIndex"})},w=(e,i,t,n)=>{for(const o of Object.keys(t.relations))i.relations[o]===void 0&&n.push({remediation:"none",scope:"schema",severity:"safe",summary:`added relation ${e}.${o}`,table:e,type:"addedRelation"});for(const o of Object.keys(i.relations))t.relations[o]===void 0&&n.push({remediation:"code",scope:"schema",severity:"breaking",summary:`removed relation ${e}.${o}`,table:e,type:"removedRelation"})},A=(e,i,t,n)=>{i.shardMode!==t.shardMode&&n.push({remediation:"rehome",severity:"breaking",summary:`table ${e} changed shard mode: ${i.shardMode} → ${t.shardMode} — its physical storage moves, and existing rows do NOT follow the schema; re-home them with an export/import round trip (https://lunora.sh/docs/concepts/sharding#migrating-a-populated-table)`,table:e,scope:"table",type:"changedShardMode"}),x(e,i,t,n),j(e,i,t,n),w(e,i,t,n)},_=(e,i)=>{const t=[],n=e?.tables??{};for(const[o,s]of Object.entries(i.tables)){const r=n[o];if(r===void 0){t.push({remediation:"none",scope:"table",severity:"safe",summary:`added table ${o}`,table:o,type:"addedTable"});continue}A(o,r,s,t)}for(const o of Object.keys(n))i.tables[o]===void 0&&t.push({remediation:"rehome",scope:"table",severity:"breaking",summary:`removed table ${o} — its rows stay in each shard's SQLite, unreachable through the schema; export the shard first if the data must be kept`,table:o,type:"removedTable"});if(e!==void 0&&e.jurisdiction!==i.jurisdiction){const o=e.jurisdiction??"(none)",s=i.jurisdiction??"(none)";t.push({remediation:"rehome",scope:"schema",severity:"breaking",summary:`Durable Object jurisdiction changed from ${o} to ${s} — this re-homes every DO and strands all existing shard, scheduler, and session-DO data in the old region (no in-place migration; export then import to move it). Revert the change, or override the gate to proceed intentionally.`,type:"changedJurisdiction"})}return{changes:t}};export{E as SCHEMA_SNAPSHOT_VERSION,d as describeShape,F as diffExistingField,_ as diffSchemaSnapshots,I as hashSchemaSnapshot,v as isValidTableSnapshot,q as parseSnapshotJson,g as serializeSchemaSnapshot,m as sortKeys};
|