@lunora/codegen 1.0.0-alpha.82 → 1.0.0-alpha.84
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 +584 -549
- package/dist/index.d.ts +584 -549
- package/dist/index.mjs +1 -1
- package/dist/packem_shared/DEFAULT_TARGET-CH5disA3.mjs +1 -0
- package/dist/packem_shared/{FLAGS_FILENAME-UPE377GV.mjs → FLAGS_FILENAME-BiJh08O0.mjs} +1 -1
- package/dist/packem_shared/GENERATED_HEADER-oy7DTIDi.mjs +1 -0
- package/dist/packem_shared/{MUTATORS_FILENAME-CsAoG-d2.mjs → MUTATORS_FILENAME-9652koWz.mjs} +1 -1
- package/dist/packem_shared/{NOTIFY_FILENAME-zA5OFFbv.mjs → NOTIFY_FILENAME-DeIlwPBu.mjs} +1 -1
- package/dist/packem_shared/{OPENRPC_VERSION-IKkrtXye.mjs → OPENRPC_VERSION-K3RTK2CP.mjs} +1 -1
- package/dist/packem_shared/SCHEMA_SNAPSHOT_FILENAME-DHVrsPNK.mjs +9 -0
- package/dist/packem_shared/{SHAPES_FILENAME-DyVUZzIk.mjs → SHAPES_FILENAME-Cwn4I4UB.mjs} +1 -1
- package/dist/packem_shared/{buildOpenApiDocument-XeZ1ycwi.mjs → buildOpenApiDocument-Blf3mpIz.mjs} +1 -1
- package/dist/packem_shared/describeErrorLevelFindings-IhNx9gPr.mjs +1 -0
- package/dist/packem_shared/discover-queries-B4Lw0cEr.mjs +1 -0
- package/dist/packem_shared/{discoverAuthApiCalls-CYdI8pkP.mjs → discoverAuthApiCalls-CVTXSguP.mjs} +1 -1
- package/dist/packem_shared/discoverCrons-CZ0_RXUc.mjs +1 -0
- package/dist/packem_shared/discoverFunctions-9GMvSwz7.mjs +1 -0
- package/dist/packem_shared/{discoverHttpRoutes-DmTedJlp.mjs → discoverHttpRoutes-VyBQ9CbN.mjs} +1 -1
- package/dist/packem_shared/{discoverInserts-CssZuKb6.mjs → discoverInserts-BGlOx2Cg.mjs} +1 -1
- package/dist/packem_shared/discoverMaskProcedures-DpAT4zsu.mjs +1 -0
- package/dist/packem_shared/{discoverMigrations-qyXaVjw1.mjs → discoverMigrations-CcOvlTA7.mjs} +1 -1
- package/dist/packem_shared/{discoverNondeterministicCalls-GNP4oKrf.mjs → discoverNondeterministicCalls-CVY5_-x1.mjs} +1 -1
- package/dist/packem_shared/discoverQueries-BFFoJLOQ.mjs +1 -0
- package/dist/packem_shared/{discoverR2sqlCalls-B7uqLnVS.mjs → discoverR2sqlCalls-BKn9ogOI.mjs} +1 -1
- package/dist/packem_shared/{discoverRlsMetadata-Bt0QK8VM.mjs → discoverRlsMetadata-B2iTIbm0.mjs} +1 -1
- package/dist/packem_shared/{discoverSandboxUsage-Bb2JzaIW.mjs → discoverSandboxUsage-rkLj3ZC0.mjs} +1 -1
- package/dist/packem_shared/discoverSchema-1zm6abY5.mjs +1 -0
- package/dist/packem_shared/{discoverStorageRulesMetadata-VJ_uXOFe.mjs → discoverStorageRulesMetadata-AD_GPKdF.mjs} +1 -1
- package/dist/packem_shared/{emit-05q6XTbd.mjs → emit-B7IUlWwi.mjs} +265 -215
- package/dist/packem_shared/{emitApp-C2DhPKWE.mjs → emitApp-jRD2D9kI.mjs} +111 -37
- package/dist/packem_shared/parse-validator-DCrBLhq7.mjs +1 -0
- package/package.json +10 -10
- package/dist/packem_shared/DEFAULT_TARGET-BYPEwgZu.mjs +0 -1
- package/dist/packem_shared/GENERATED_HEADER-Cphn03Kf.mjs +0 -1
- package/dist/packem_shared/SCHEMA_SNAPSHOT_FILENAME-DBD0oti8.mjs +0 -12
- package/dist/packem_shared/discover-queries-Ctpk9SA-.mjs +0 -1
- package/dist/packem_shared/discoverCrons-CwtPaymU.mjs +0 -1
- package/dist/packem_shared/discoverFunctions-CVYkUBTm.mjs +0 -1
- package/dist/packem_shared/discoverMaskProcedures-DQ-4yUUK.mjs +0 -1
- package/dist/packem_shared/discoverQueries-2A0lbpxV.mjs +0 -1
- package/dist/packem_shared/discoverSchema-CaTD2Sdx.mjs +0 -1
- package/dist/packem_shared/parse-validator-_jDrFxwt.mjs +0 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{n as S,
|
|
1
|
+
import{n as S,R as D}from"./emit-B7IUlWwi.mjs";const E=e=>`has${e.charAt(0).toUpperCase()}${e.slice(1)}`,v=S.map(({appMethod:e,key:t})=>[E(t),e.method,e.configKey,e.doc]),m=e=>v.some(([t])=>e[t]),R=e=>e?['import * as lunoraIdentityContract from "../identity.js";']:[],A=(e,t)=>e?['import type { CreateAccessResolverOptions } from "@lunora/cloudflare-access";',`import { createAccessResolver${t?", composeResolvers":""} } from "@lunora/cloudflare-access";`]:[],x=e=>e?['import { createKvIntrospectorFromEnv } from "@lunora/bindings/kv";']:[],O=e=>e?['import notifyConfig from "../notify.js";']:[],k=e=>(e.emailAgents?.length??0)>0,C=e=>k(e)?['import { dispatchAgentEmail } from "@lunora/agent/inbound";']:[],L=e=>k(e)?['import * as lunoraAgentDefinitions from "../agents.js";']:[],T=e=>{const{hasAccess:t,hasAuth:r,hasFramework:a,hasGlobal:n,hasHyperdriveGlobal:o,hasKv:c,hasQueue:s,hasScheduler:d,hasStorage:u,hasWorkflow:h,useUmbrella:l,wantsOpenApi:p,wantsOpenRpc:b}=e,i=l?"lunorash/runtime":"@lunora/runtime",g=["ExecutionContextLike","HttpRouterLike","LunoraWorker","Route","ScheduledControllerLike","ShardNamespaceLike","WorkerOptions"];n&&g.push("GlobalIntrospector","AdminTableResolver"),a&&g.push("FrameworkHostHandler");const f=[...n||o?["createCrossShardRelationCapabilities"]:[],"createWorker","resolveLogArchiveFromEnv",...a?["withFrameworkWorker"]:[]].join(", ");return[...r?['import type { LunoraAuth, LunoraAuthOptions } from "@lunora/auth";','import { createAuth, createAuthAdmin, createAuthAuditReader, createDoAuthWiring, d1Executor, ensureMigrated, handleAuthRequest, lunoraD1Adapter } from "@lunora/auth";']:[],...A(t,r),...n?['import type { D1CtxDbOptions, D1DatabaseLike, D1Exec } from "@lunora/d1";','import { createD1CtxDb, facetGlobalColumn, importGlobalRows, listGlobalTables, readGlobalTablePage } from "@lunora/d1";']:[],...o?['import type { HyperdriveEngine } from "@lunora/hyperdrive/global";','import { createHyperdriveGlobalCtxDb } from "@lunora/hyperdrive/global";','import type { SqlCtxDbOptions, SqlExec } from "@lunora/sql-store";']:[],...x(c),...d?['import type { DurableObjectNamespaceLike } from "@lunora/scheduler";','import { createScheduler } from "@lunora/scheduler";']:[],...u?['import type { R2BucketLike, Storage } from "@lunora/storage";','import { createBucketStorage, createStorage } from "@lunora/storage";']:[],...h?['import { createWorkflowsRestClient } from "@lunora/workflow";']:[],...C(e),`import type { ${[...g].toSorted((w,y)=>w.localeCompare(y)).join(", ")} } from "${i}";`,`import { ${f} } from "${i}";`,"",...R(e.identity),...L(e),...n||o?['import schema from "../schema.js";']:[],...O(e.hasNotify),'import { LUNORA_CRONS } from "./crons.js";','import { LUNORA_FUNCTIONS } from "./functions.js";',...s?['import { createQueueCaptureSink, dispatchQueueBatch, shouldCaptureQueue } from "@lunora/queue";','import { LUNORA_QUEUE_REGISTRY } from "./queues.js";']:[],...p?['import { openApiSpec } from "./openapi.js";']:[],...b?['import { openRpcSpec } from "./openrpc.js";']:[],'import { createShardDO } from "./shard.js";']},j=e=>[...e.hasStorage?[`/** \`.storage(...)\` declaration — one bucket (required) plus optional extra named buckets and signed-URL config. Backs \`ctx.storage\` AND the studio file browser. */
|
|
2
2
|
interface StorageDeclaration<Env> {
|
|
3
3
|
/** The default R2 bucket binding (the bare \`ctx.storage\`). */
|
|
4
4
|
bucket: Selector<Env, R2BucketLike>;
|
|
@@ -8,12 +8,12 @@ interface StorageDeclaration<Env> {
|
|
|
8
8
|
publicBaseUrl?: Selector<Env, string>;
|
|
9
9
|
/** HMAC secret for signed URLs. */
|
|
10
10
|
signingSecret?: Selector<Env, string>;
|
|
11
|
-
}`]:[],...e.hasScheduler?["/** `.scheduler(...)` declaration — the `SchedulerDO` namespace plus the worker origin its callbacks dispatch back to. Backs `ctx.scheduler` AND the studio's scheduled-jobs view. */\ninterface SchedulerDeclaration<Env> {\n /** The `SchedulerDO` namespace binding (typically `env.SCHEDULER`). */\n namespace: Selector<Env, DurableObjectNamespaceLike & ShardNamespaceLike>;\n /** The worker origin the `SchedulerDO` dispatches HTTP job callbacks back to. */\n origin?: Selector<Env, string>;\n}"]:[],...e.hasGlobal?["/** `.global(...)` declaration — the D1 binding backing `.global()` tables. Backs cross-tenant `ctx.db` reads/writes AND the studio's global data browser. */\ninterface GlobalDeclaration<Env> {\n /** The D1 binding (typically `env.DB`). */\n d1: Selector<Env, D1DatabaseLike>;\n /** The worker origin used to fan reverse cross-backend relations across shards. Without it, such a relation throws a clear error. */\n origin?: Selector<Env, string>;\n}"]:[],...e.hasHyperdriveGlobal?['/** `.hyperdriveGlobal(...)` declaration — backs `.global({ backend: "hyperdrive" })` tables on a Postgres/MySQL database via Hyperdrive. Stays reactive: the writer is injected as `globalDb` and the broadcast hook drives live queries. */\ninterface HyperdriveGlobalDeclaration<Env> {\n /** The Hyperdrive engine — selects the Postgres or MySQL dialect. */\n engine: HyperdriveEngine;\n /** Build the `SqlExec` from `env` — e.g. `buildPgExec(fromPostgresJs(postgres(env.HYPERDRIVE.connectionString)))`. Cache the driver on the DO instance; rebuild lazily after hibernation. */\n exec: (env: Env) => SqlExec;\n /** The worker origin used to fan reverse cross-backend relations across shards. Without it, such a relation throws a clear error. */\n origin?: Selector<Env, string>;\n}']:[],...e.hasAuth?['/** `.auth(...)` declaration — better-auth options plus the storage the adapter reads. Give it `d1` (the default) or `namespace` (a Durable Object that hosts the auth tables), never both. The builder owns the lazy build + `ensureMigrated` dance and wires `authHandler` / `resolveIdentity` / `authAdmin`. */\ninterface AuthDeclaration<Env> {\n /** The D1 binding the auth SQL adapter is wired over (via `lunoraD1Adapter`). Omit only when using `namespace`. */\n d1?: Selector<Env, unknown>;\n /** Shared secret the worker presents on the object\'s internal session route. REQUIRED with `namespace`: the binding is reachable from any worker bound to it, so the secret — not the binding — is the authorization boundary. Without it identity resolution fails closed. */\n internalSecret?: Selector<Env, string>;\n /** Name of the Durable Object instance holding the auth tables. Defaults to `"auth"`. Set it to run separate auth objects (per deployment, per tenant) off one namespace. */\n objectName?: Selector<Env, string>;\n /** The auth Durable Object namespace — the DO-backed mode. Needed for `@better-auth/scim`, which requires native transactions that D1 has none of. The object owns the auth tables, so `/api/auth/*` and identity resolution both go through it. */\n namespace?: Selector<Env, ShardNamespaceLike>;\n /** Build the better-auth options from `env` (secret, plugins, email/password, …). */\n options: (env: Env) => LunoraAuthOptions;\n}']:[]],q=e=>[...e.hasAccess?[" private accessSelector?: Selector<Env, CreateAccessResolverOptions>;"]:[]," private adminToken?: Selector<Env, string>;",...e.hasAuth?[" private authDeclaration?: AuthDeclaration<Env>;"]:[]," private readonly extendFns: ((env: Env, derived: Readonly<WorkerOptions>) => Partial<WorkerOptions>)[] = [];",...e.hasGlobal?[" private globalDeclaration?: GlobalDeclaration<Env>;"]:[],...e.hasHyperdriveGlobal?[" private hyperdriveGlobalDeclaration?: HyperdriveGlobalDeclaration<Env>;"]:[]," private httpRouterApp?: HttpRouterLike;"," private readonly routeMap: Record<string, Route> = {};",...e.hasScheduler?[" private schedulerDeclaration?: SchedulerDeclaration<Env>;"]:[],...
|
|
11
|
+
}`]:[],...e.hasScheduler?["/** `.scheduler(...)` declaration — the `SchedulerDO` namespace plus the worker origin its callbacks dispatch back to. Backs `ctx.scheduler` AND the studio's scheduled-jobs view. */\ninterface SchedulerDeclaration<Env> {\n /** The `SchedulerDO` namespace binding (typically `env.SCHEDULER`). */\n namespace: Selector<Env, DurableObjectNamespaceLike & ShardNamespaceLike>;\n /** The worker origin the `SchedulerDO` dispatches HTTP job callbacks back to. */\n origin?: Selector<Env, string>;\n}"]:[],...e.hasGlobal?["/** `.global(...)` declaration — the D1 binding backing `.global()` tables. Backs cross-tenant `ctx.db` reads/writes AND the studio's global data browser. */\ninterface GlobalDeclaration<Env> {\n /** The D1 binding (typically `env.DB`). */\n d1: Selector<Env, D1DatabaseLike>;\n /** The worker origin used to fan reverse cross-backend relations across shards. Without it, such a relation throws a clear error. */\n origin?: Selector<Env, string>;\n}"]:[],...e.hasHyperdriveGlobal?['/** `.hyperdriveGlobal(...)` declaration — backs `.global({ backend: "hyperdrive" })` tables on a Postgres/MySQL database via Hyperdrive. Stays reactive: the writer is injected as `globalDb` and the broadcast hook drives live queries. */\ninterface HyperdriveGlobalDeclaration<Env> {\n /** The Hyperdrive engine — selects the Postgres or MySQL dialect. */\n engine: HyperdriveEngine;\n /** Build the `SqlExec` from `env` — e.g. `buildPgExec(fromPostgresJs(postgres(env.HYPERDRIVE.connectionString)))`. Cache the driver on the DO instance; rebuild lazily after hibernation. */\n exec: (env: Env) => SqlExec;\n /** The worker origin used to fan reverse cross-backend relations across shards. Without it, such a relation throws a clear error. */\n origin?: Selector<Env, string>;\n}']:[],...e.hasAuth?['/** `.auth(...)` declaration — better-auth options plus the storage the adapter reads. Give it `d1` (the default) or `namespace` (a Durable Object that hosts the auth tables), never both. The builder owns the lazy build + `ensureMigrated` dance and wires `authHandler` / `resolveIdentity` / `authAdmin`. */\ninterface AuthDeclaration<Env> {\n /** The D1 binding the auth SQL adapter is wired over (via `lunoraD1Adapter`). Omit only when using `namespace`. */\n d1?: Selector<Env, unknown>;\n /** Shared secret the worker presents on the object\'s internal session route. REQUIRED with `namespace`: the binding is reachable from any worker bound to it, so the secret — not the binding — is the authorization boundary. Without it identity resolution fails closed. */\n internalSecret?: Selector<Env, string>;\n /** Name of the Durable Object instance holding the auth tables. Defaults to `"auth"`. Set it to run separate auth objects (per deployment, per tenant) off one namespace. */\n objectName?: Selector<Env, string>;\n /** The auth Durable Object namespace — the DO-backed mode. Needed for `@better-auth/scim`, which requires native transactions that D1 has none of. The object owns the auth tables, so `/api/auth/*` and identity resolution both go through it. */\n namespace?: Selector<Env, ShardNamespaceLike>;\n /** Build the better-auth options from `env` (secret, plugins, email/password, …). */\n options: (env: Env) => LunoraAuthOptions;\n}']:[]],q=e=>[...e.hasAccess?[" private accessSelector?: Selector<Env, CreateAccessResolverOptions>;"]:[]," private adminToken?: Selector<Env, string>;",...e.hasAuth?[" private authDeclaration?: AuthDeclaration<Env>;"]:[]," private readonly extendFns: ((env: Env, derived: Readonly<WorkerOptions>) => Partial<WorkerOptions>)[] = [];",...e.hasGlobal?[" private globalDeclaration?: GlobalDeclaration<Env>;"]:[],...e.hasHyperdriveGlobal?[" private hyperdriveGlobalDeclaration?: HyperdriveGlobalDeclaration<Env>;"]:[]," private httpRouterApp?: HttpRouterLike;"," private readonly routeMap: Record<string, Route> = {};",...e.hasScheduler?[" private schedulerDeclaration?: SchedulerDeclaration<Env>;"]:[],...m(e)?[" private readonly shardExtras: Partial<ShardConfig> = {};"]:[]," private shardSelector?: Selector<Env, ShardNamespaceLike>;",...e.hasStorage?[" private storageDeclaration?: StorageDeclaration<Env>;"]:[]],I=e=>v.filter(([t])=>e[t]).map(([,t,r,a])=>` /** ${a} */
|
|
12
12
|
public ${t}(factory: NonNullable<ShardConfig["${r}"]>): this {
|
|
13
13
|
this.shardExtras.${r} = factory;
|
|
14
14
|
|
|
15
15
|
return this;
|
|
16
|
-
}`),
|
|
16
|
+
}`),N=e=>[...e.hasAccess?[" /** Wire Cloudflare Access (Zero Trust) — verifies the `Cf-Access-Jwt-Assertion` JWT and feeds the identity into `ctx.auth` / RLS via `resolveIdentity`. When `.auth(...)` is also configured, Access is composed ahead of it (Access wins when its JWT is present; everyone else falls through to the app session). */\n public access(selector: Selector<Env, CreateAccessResolverOptions>): this {\n this.accessSelector = selector;\n\n return this;\n }"]:[],` /** Bearer token gating the \`/_lunora/admin/*\` endpoints the studio calls. */
|
|
17
17
|
public admin(selector: Selector<Env, string>): this {
|
|
18
18
|
this.adminToken = selector;
|
|
19
19
|
|
|
@@ -53,7 +53,7 @@ interface StorageDeclaration<Env> {
|
|
|
53
53
|
this.storageDeclaration = declaration;
|
|
54
54
|
|
|
55
55
|
return this;
|
|
56
|
-
}`]:[],...
|
|
56
|
+
}`]:[],...I(e)],G=e=>{const t=[...e.hasGlobal?[` ...(this.globalDeclaration
|
|
57
57
|
? {
|
|
58
58
|
d1: (rawEnv: Record<string, unknown>, request?: { identity?: Record<string, unknown>; userId?: string | null }) => {
|
|
59
59
|
const env = rawEnv as Env;
|
|
@@ -110,10 +110,10 @@ interface StorageDeclaration<Env> {
|
|
|
110
110
|
return namespace && origin ? createScheduler({${e.jurisdiction?` jurisdiction: ${JSON.stringify(e.jurisdiction)},`:""} namespace, originUrl: origin }) : undefined;
|
|
111
111
|
},
|
|
112
112
|
}
|
|
113
|
-
: {}),`]:[],...e.hasStorage?[" ...(this.storageDeclaration ? { storage: (rawEnv: Record<string, unknown>) => this.resolveStorage(rawEnv as Env) } : {}),"]:[],...
|
|
113
|
+
: {}),`]:[],...e.hasStorage?[" ...(this.storageDeclaration ? { storage: (rawEnv: Record<string, unknown>) => this.resolveStorage(rawEnv as Env) } : {}),"]:[],...m(e)?[" ...this.shardExtras,"]:[]];return t.length>0?`
|
|
114
114
|
${t.join(`
|
|
115
115
|
`)}
|
|
116
|
-
`:""}
|
|
116
|
+
`:""},W=e=>[...e.hasScheduler?[` if (this.schedulerDeclaration) {
|
|
117
117
|
options.schedulerDO = this.schedulerDeclaration.namespace(env);
|
|
118
118
|
}`]:[],...e.hasWorkflow?[` options.workflowsClient = (workflowEnv) => {
|
|
119
119
|
const source = workflowEnv as Record<string, unknown>;
|
|
@@ -129,6 +129,15 @@ ${t.join(`
|
|
|
129
129
|
if (database) {
|
|
130
130
|
options.d1 = database;
|
|
131
131
|
options.globalIntrospector = buildGlobalIntrospector(database);
|
|
132
|
+
// \`resolveTableSharding\`/\`importGlobals\` wire the admin bulk-import
|
|
133
|
+
// endpoint: without the former, EVERY row (including a \`.global()\`
|
|
134
|
+
// table's) routes to the default shard, so a global table is never
|
|
135
|
+
// recognised as global and the latter is never reached — the
|
|
136
|
+
// endpoint answers 200 with \`inserted: {}\` for a write that never
|
|
137
|
+
// happened. Both are mechanical over the schema this file already
|
|
138
|
+
// imports, so there is nothing project-specific to configure.
|
|
139
|
+
options.resolveTableSharding = buildTableShardingResolver();
|
|
140
|
+
options.importGlobals = buildGlobalImporter(database);
|
|
132
141
|
}
|
|
133
142
|
}`]:[],...e.hasStorage?[` if (this.storageDeclaration) {
|
|
134
143
|
Object.assign(options, this.buildStorageAdmin(env));
|
|
@@ -191,7 +200,7 @@ ${t.join(`
|
|
|
191
200
|
}`]:[],...e.voiceAgents&&e.voiceAgents.length>0?[` options.voiceAgents = {
|
|
192
201
|
${e.voiceAgents.map(t=>` ${JSON.stringify(t.exportName)}: (env as Record<string, unknown>)[${JSON.stringify(t.bindingName)}] as ShardNamespaceLike,`).join(`
|
|
193
202
|
`)}
|
|
194
|
-
};`]:[]]
|
|
203
|
+
};`]:[]],$=e=>[" cronJobs: LUNORA_CRONS,"," functions: LUNORA_FUNCTIONS,",...e.identity?[` identity: lunoraIdentityContract.${e.identity.exportName},`]:[],...e.jurisdiction?[` jurisdiction: ${JSON.stringify(e.jurisdiction)},`]:[],...e.wantsOpenApi?[" openApiSpec,"]:[],...e.wantsOpenRpc?[" openRpcSpec,"]:[],...e.hasQueue?[" queue: (batch: unknown, queueEnv: unknown, _context: ExecutionContextLike): Promise<void> =>"," dispatchQueueBatch(batch as Parameters<typeof dispatchQueueBatch>[0], LUNORA_QUEUE_REGISTRY, {"," capture: shouldCaptureQueue(queueEnv as Record<string, unknown>)",` ? createQueueCaptureSink(queueEnv as Record<string, unknown>${e.jurisdiction?`, { jurisdiction: ${JSON.stringify(e.jurisdiction)} }`:""})`," : undefined,"," env: queueEnv as Record<string, unknown>,"," }),"]:[]," ...(this.httpRouterApp ? { httpRouter: this.httpRouterApp } : {}),"," routes: this.routeMap,"," shardDO: this.shardSelector?.(env) ?? (undefined as unknown as ShardNamespaceLike),"],B=e=>e?`
|
|
195
204
|
/** Resolve the storage capability (single or multi-bucket) for the DO side. */
|
|
196
205
|
private resolveStorage(env: Env): Storage | undefined {
|
|
197
206
|
const declaration = this.storageDeclaration;
|
|
@@ -270,23 +279,47 @@ ${e.voiceAgents.map(t=>` ${JSON.stringify(t.exportName)}: (env as Rec
|
|
|
270
279
|
};
|
|
271
280
|
}
|
|
272
281
|
`:"",H=e=>e?`
|
|
273
|
-
/** Adapt the raw D1 binding to \`@lunora/d1\`'s \`D1Exec\` (reads via \`all\`, writes via \`run\`). */
|
|
274
|
-
const buildExec = (database: D1DatabaseLike): D1Exec =>
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
282
|
+
/** Adapt the raw D1 binding to \`@lunora/d1\`'s \`D1Exec\` (reads via \`all\`, writes via \`run\`, and — when the binding exposes it — several writes in one round trip via \`batch\`). */
|
|
283
|
+
const buildExec = (database: D1DatabaseLike): D1Exec => {
|
|
284
|
+
const batchFn = database.batch;
|
|
285
|
+
|
|
286
|
+
return {
|
|
287
|
+
all: async (sql, parameters) => {
|
|
288
|
+
const result = await database
|
|
289
|
+
.prepare(sql)
|
|
290
|
+
.bind(...parameters)
|
|
291
|
+
.all<Record<string, unknown>>();
|
|
292
|
+
|
|
293
|
+
return result.results;
|
|
294
|
+
},
|
|
295
|
+
// D1's own \`batch\` runs the whole array as one atomic SQLite
|
|
296
|
+
// transaction. Guarded because \`D1DatabaseLike.batch\` is optional in
|
|
297
|
+
// the structural type (test doubles may omit it) — real D1 always has
|
|
298
|
+
// it; a double without it still works through the store's sequential
|
|
299
|
+
// fallback. Invoked via \`.call(database, ...)\` rather than
|
|
300
|
+
// \`database.batch(...)\` directly so TS can narrow the captured
|
|
301
|
+
// \`batchFn\` across the closure boundary (a property-access narrowing
|
|
302
|
+
// like \`hasBatch = typeof database.batch === "function"\` does not
|
|
303
|
+
// survive into a nested arrow function); \`.call\` still binds \`this\`
|
|
304
|
+
// to \`database\`, so the real workerd \`D1Database\` doesn't throw
|
|
305
|
+
// \`TypeError: Illegal invocation\` the way a detached
|
|
306
|
+
// \`const fn = database.batch; fn(...)\` capture would.
|
|
307
|
+
batch: batchFn
|
|
308
|
+
? async (statements) => {
|
|
309
|
+
await batchFn.call(
|
|
310
|
+
database,
|
|
311
|
+
statements.map(({ params, sql }) => database.prepare(sql).bind(...params)),
|
|
312
|
+
);
|
|
313
|
+
}
|
|
314
|
+
: undefined,
|
|
315
|
+
run: async (sql, parameters) => {
|
|
316
|
+
await database
|
|
317
|
+
.prepare(sql)
|
|
318
|
+
.bind(...parameters)
|
|
319
|
+
.run();
|
|
320
|
+
},
|
|
321
|
+
};
|
|
322
|
+
};
|
|
290
323
|
|
|
291
324
|
/** Introspect \`.global()\` (D1-backed) tables for the studio's global data browser. */
|
|
292
325
|
const buildGlobalIntrospector = (database: D1DatabaseLike): GlobalIntrospector => {
|
|
@@ -298,7 +331,48 @@ const buildGlobalIntrospector = (database: D1DatabaseLike): GlobalIntrospector =
|
|
|
298
331
|
readTablePage: (options) => readGlobalTablePage(exec, schema as never, options),
|
|
299
332
|
};
|
|
300
333
|
};
|
|
301
|
-
|
|
334
|
+
|
|
335
|
+
/**
|
|
336
|
+
* \`resolveTableSharding\` for the admin bulk-import endpoint: a lookup over each
|
|
337
|
+
* table's declared \`shardMode\` (\`defineTable(...).global()\` / \`.shardBy(field)\`
|
|
338
|
+
* already record exactly this shape on the table) — mechanical, nothing to
|
|
339
|
+
* configure per project. \`undefined\` for a table the schema doesn't declare, so
|
|
340
|
+
* the import endpoint's own unknown-table handling still applies.
|
|
341
|
+
*/
|
|
342
|
+
const buildTableShardingResolver = (): AdminTableResolver => (table) => {
|
|
343
|
+
const declared = (schema as unknown as D1CtxDbOptions["schema"]).tables[table];
|
|
344
|
+
|
|
345
|
+
return declared?.shardMode ? { mode: declared.shardMode } : undefined;
|
|
346
|
+
};
|
|
347
|
+
|
|
348
|
+
/**
|
|
349
|
+
* \`importGlobals\` for the admin bulk-import endpoint: routes \`.global()\` rows
|
|
350
|
+
* through the same D1 writer \`.global()\` reads/writes already use, via
|
|
351
|
+
* \`@lunora/d1\`'s \`importGlobalRows\`. Mirrors \`runShardImport\`'s shard-local
|
|
352
|
+
* twin (\`createShardCtxDb\` + \`importShardRows\`) — same \`{ rows, startLine }\`
|
|
353
|
+
* shape, same trusted-import \`allowExplicitId\` semantics, forwarded as-is.
|
|
354
|
+
*
|
|
355
|
+
* Passes each row's own \`line\` through rather than dropping it: the caller
|
|
356
|
+
* (\`@lunora/runtime\`'s NDJSON import stream) already carries the row's true
|
|
357
|
+
* physical source line, and global rows are typically interspersed with
|
|
358
|
+
* shard-local ones it filtered out before calling here — a single
|
|
359
|
+
* \`startLine\` plus positional counting would mis-attribute every row after
|
|
360
|
+
* the first gap. \`importGlobalRows\` prefers \`row.line\` when present and
|
|
361
|
+
* falls back to the position-derived count otherwise.
|
|
362
|
+
*/
|
|
363
|
+
const buildGlobalImporter =
|
|
364
|
+
(database: D1DatabaseLike) =>
|
|
365
|
+
(request: { rows: ReadonlyArray<{ doc: Record<string, unknown>; line: number; table: string }>; startLine?: number }) => {
|
|
366
|
+
const exec = buildExec(database);
|
|
367
|
+
const writer = createD1CtxDb({ exec, schema: schema as unknown as D1CtxDbOptions["schema"] });
|
|
368
|
+
|
|
369
|
+
return importGlobalRows(writer, schema as unknown as D1CtxDbOptions["schema"], {
|
|
370
|
+
exec,
|
|
371
|
+
rows: request.rows.map((row) => ({ doc: row.doc, line: row.line, table: row.table })),
|
|
372
|
+
startLine: request.startLine,
|
|
373
|
+
});
|
|
374
|
+
};
|
|
375
|
+
`:"",U=e=>[...e.hasAuth?["AuthDeclaration"]:[],"ComposedApp",...e.hasGlobal?["GlobalDeclaration"]:[],...e.hasScheduler?["SchedulerDeclaration"]:[],"Selector",...e.hasStorage?["StorageDeclaration"]:[]].toSorted((t,r)=>t.localeCompare(r)).join(", "),F=e=>{const{hasAuth:t}=e,r=j(e),a=W(e),n=t?` let auth: LunoraAuth | null = null;
|
|
302
376
|
`:"",o=t?`
|
|
303
377
|
const ensureAuth = async (env: Env): Promise<void> => {
|
|
304
378
|
if (!this.authDeclaration || auth) {
|
|
@@ -319,22 +393,22 @@ const buildGlobalIntrospector = (database: D1DatabaseLike): GlobalIntrospector =
|
|
|
319
393
|
// migrator). For production run the migrate command ahead of deploy.
|
|
320
394
|
await ensureMigrated(createAuth({ ...this.authDeclaration.options(env), database: d1(env) as never }));
|
|
321
395
|
};
|
|
322
|
-
`:"",
|
|
323
|
-
await ensureAuth(env);`:"",s=t?"() => auth":"() => null",
|
|
324
|
-
host ? withFrameworkWorker(host, (hostEnv) => this.buildWorkerOptions(hostEnv as Env, ${s})) : createWorker(this.buildWorkerOptions(env, ${s}));`:` const buildWorker = (env: Env): LunoraWorker => createWorker(this.buildWorkerOptions(env, ${s}));`,h=e.hasFramework?"host?: FrameworkHostHandler":"",
|
|
325
|
-
${
|
|
396
|
+
`:"",c=t?`
|
|
397
|
+
await ensureAuth(env);`:"",s=t?"() => auth":"() => null",d=t?"getAuth: () => LunoraAuth | null":"_getAuth: () => null",u=e.hasFramework?` const buildWorker = (env: Env): LunoraWorker =>
|
|
398
|
+
host ? withFrameworkWorker(host, (hostEnv) => this.buildWorkerOptions(hostEnv as Env, ${s})) : createWorker(this.buildWorkerOptions(env, ${s}));`:` const buildWorker = (env: Env): LunoraWorker => createWorker(this.buildWorkerOptions(env, ${s}));`,h=e.hasFramework?"host?: FrameworkHostHandler":"",l=e.emailAgents??[],p=l.length>0?` composed.email = dispatchAgentEmail([
|
|
399
|
+
${l.map(i=>` { agent: lunoraAgentDefinitions.${i.exportName}, binding: ${JSON.stringify(i.bindingName)} },`).join(`
|
|
326
400
|
`)}
|
|
327
401
|
]);
|
|
328
402
|
|
|
329
403
|
`:"",b=` /** Materialise the standalone Cloudflare worker + \`ShardDO\` class. */
|
|
330
404
|
public build(): ComposedApp {
|
|
331
405
|
return this.assemble();
|
|
332
|
-
}${e.hasFramework?"\n\n /** Compose Lunora's realtime plane INTO a meta-framework's Cloudflare handler (SvelteKit/Astro/Nuxt). The framework `host` serves everything except the reserved `/_lunora/*` endpoints; pass the adapter-emitted worker (e.g. SvelteKit's `_worker.js`, Astro's `handle`). */\n public buildFrameworkWorker(host: FrameworkHostHandler): ComposedApp {\n return this.assemble(host);\n }":""}`;return`${
|
|
406
|
+
}${e.hasFramework?"\n\n /** Compose Lunora's realtime plane INTO a meta-framework's Cloudflare handler (SvelteKit/Astro/Nuxt). The framework `host` serves everything except the reserved `/_lunora/*` endpoints; pass the adapter-emitted worker (e.g. SvelteKit's `_worker.js`, Astro's `handle`). */\n public buildFrameworkWorker(host: FrameworkHostHandler): ComposedApp {\n return this.assemble(host);\n }":""}`;return`${D}${T(e).join(`
|
|
333
407
|
`)}
|
|
334
408
|
|
|
335
409
|
/** Read a value off the per-request \`env\`. Returns \`undefined\` to leave the capability unconfigured (its \`ctx.*\`/admin surface stays a clear-error stub). */
|
|
336
410
|
type Selector<Env, T> = (env: Env) => T | undefined;
|
|
337
|
-
${
|
|
411
|
+
${m(e)?"\n/** The generated `createShardDO` config — the long-tail `.ai()` / `.kv()` / … methods pass straight through to it. */\ntype ShardConfig = NonNullable<Parameters<typeof createShardDO>[0]>;\n":""}
|
|
338
412
|
${r.join(`
|
|
339
413
|
|
|
340
414
|
`)}${r.length>0?`
|
|
@@ -359,7 +433,7 @@ ${q(e).join(`
|
|
|
359
433
|
|
|
360
434
|
private emailHandler?: (env: Env) => (message: unknown, env: unknown, context: ExecutionContextLike) => Promise<void>;
|
|
361
435
|
|
|
362
|
-
${
|
|
436
|
+
${N(e).join(`
|
|
363
437
|
|
|
364
438
|
`)}
|
|
365
439
|
|
|
@@ -367,19 +441,19 @@ ${b}
|
|
|
367
441
|
|
|
368
442
|
/** Build the shard DO + compose the worker (standalone or framework-hosted), wrapping the lazy per-isolate singletons + auth init. */
|
|
369
443
|
private assemble(${h}): ComposedApp {
|
|
370
|
-
const ShardDO = createShardDO({${
|
|
444
|
+
const ShardDO = createShardDO({${G(e)}});
|
|
371
445
|
|
|
372
446
|
// Per-isolate singletons: the worker (and auth instance) are expensive to
|
|
373
447
|
// build, so the first request constructs them and every later request on
|
|
374
448
|
// the same isolate reuses them.
|
|
375
449
|
let worker: LunoraWorker | null = null;
|
|
376
450
|
${n}${o}
|
|
377
|
-
${
|
|
451
|
+
${u}
|
|
378
452
|
|
|
379
453
|
const composed: ComposedApp = {
|
|
380
454
|
ShardDO,
|
|
381
455
|
fetch: async (request: Request, rawEnv: unknown, context: ExecutionContextLike): Promise<Response> => {
|
|
382
|
-
const env = rawEnv as Env;${
|
|
456
|
+
const env = rawEnv as Env;${c}
|
|
383
457
|
worker ??= buildWorker(env);
|
|
384
458
|
|
|
385
459
|
return worker.fetch(request, rawEnv, context);
|
|
@@ -411,9 +485,9 @@ ${p} if (this.emailHandler) {
|
|
|
411
485
|
}
|
|
412
486
|
${B(e.hasStorage)}
|
|
413
487
|
/** Fan the recorded declarations into the worker-side \`createWorker\` options. */
|
|
414
|
-
private buildWorkerOptions(env: Env, ${
|
|
488
|
+
private buildWorkerOptions(env: Env, ${d}): WorkerOptions {
|
|
415
489
|
const options: WorkerOptions = {
|
|
416
|
-
${
|
|
490
|
+
${$(e).join(`
|
|
417
491
|
`)}
|
|
418
492
|
};
|
|
419
493
|
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{LunoraError as c}from"@lunora/errors";import{Node as r}from"ts-morph";let d;const T=n=>{d=n},p=/^[A-Za-z_$][\w$]*$/u,g=new Set(["$defaultFn","$onUpdateFn","$type","default","defaultNow","nullable","unique"]),k=(n,t)=>{const e={notNull:!0,...n.column};switch(t){case"$defaultFn":case"default":case"defaultNow":{e.hasDefault=!0;break}case"$onUpdateFn":{e.hasOnUpdate=!0;break}case"$type":break;case"nullable":{e.notNull=!1;break}case"unique":{e.unique=!0;break}}return{...n,column:e}},f=new Set(["any","bigint","boolean","bytes","date","geoPoint","null","number","string","timestamp"]),m=new Set(["check","meta"]),o=n=>r.isCallExpression(n)?h(n):{kind:"any",sourceText:n.getText()},y=n=>{const t={};for(const e of n.getProperties()){const a=r.isShorthandPropertyAssignment(e);if(!a&&!r.isPropertyAssignment(e))continue;const i=e.getNameNode();if(r.isComputedPropertyName(i))continue;const s=a?e.getNameNode():e.getInitializer();if(!s)continue;const l=e.getName();if(!p.test(l))throw new c("INTERNAL",`@lunora/codegen: field name is not a valid JS identifier: ${JSON.stringify(l)}`);t[l]=o(s)}return t},u=(n,t)=>n&&r.isExpression(n)?o(n):t,N=n=>n===void 0?"undefined":r.isStringLiteral(n)||r.isNoSubstitutionTemplateLiteral(n)?JSON.stringify(n.getLiteralValue()):n.getText(),b=n=>{const t=n&&d?d(n):void 0;return t===void 0?{kind:"from"}:{kind:"from",tsType:t}},x=(n,t)=>{if(f.has(n))return{kind:n};const[e,a]=t;switch(n){case"array":return{inner:u(e,{kind:"any"}),kind:"array"};case"from":return b(e);case"id":return{kind:"id",tableName:e&&r.isStringLiteral(e)?e.getLiteralText():"_unknown_"};case"literal":return{kind:"literal",literalValue:N(e)};case"object":return e&&r.isObjectLiteralExpression(e)?{kind:"object",shape:y(e)}:{kind:"object",shape:{}};case"optional":return{inner:u(e,{kind:"any"}),kind:"optional"};case"record":return{keyType:u(e,{kind:"string"}),kind:"record",valueType:u(a,{kind:"any"})};case"storage":return e&&r.isStringLiteral(e)?{bucket:e.getLiteralText(),kind:"storage"}:{kind:"storage"};case"union":return{kind:"union",members:t.filter(i=>r.isExpression(i)).map(i=>o(i))};default:throw new c("INTERNAL",`Unsupported validator kind: ${n}`)}},h=n=>{const t=n.getExpression();if(!r.isPropertyAccessExpression(t))return{kind:"any",sourceText:n.getText()};const e=t.getName(),a=n.getArguments();if(g.has(e)){const i=t.getExpression(),s=r.isExpression(i)?o(i):{kind:"any"};return k(s,e)}if(m.has(e)){const i=t.getExpression(),s=r.isExpression(i)?o(i):{kind:"any"};return e==="check"?{...s,hasRefinement:!0}:s}return x(e,a)};export{T as f,o,y as p};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lunora/codegen",
|
|
3
|
-
"version": "1.0.0-alpha.
|
|
3
|
+
"version": "1.0.0-alpha.84",
|
|
4
4
|
"description": "Code generator for Lunora: emits _generated/{api,server,dataModel}.ts from your schema",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"cloudflare",
|
|
@@ -46,15 +46,15 @@
|
|
|
46
46
|
"access": "public"
|
|
47
47
|
},
|
|
48
48
|
"dependencies": {
|
|
49
|
-
"@lunora/advisor": "1.0.0-alpha.
|
|
50
|
-
"@lunora/agent": "1.0.0-alpha.
|
|
51
|
-
"@lunora/container": "1.0.0-alpha.
|
|
52
|
-
"@lunora/errors": "1.0.0-alpha.
|
|
53
|
-
"@lunora/platform": "1.0.0-alpha.
|
|
54
|
-
"@lunora/queue": "1.0.0-alpha.
|
|
55
|
-
"@lunora/scheduler": "1.0.0-alpha.
|
|
56
|
-
"@lunora/values": "1.0.0-alpha.
|
|
57
|
-
"@lunora/workflow": "1.0.0-alpha.
|
|
49
|
+
"@lunora/advisor": "1.0.0-alpha.61",
|
|
50
|
+
"@lunora/agent": "1.0.0-alpha.36",
|
|
51
|
+
"@lunora/container": "1.0.0-alpha.20",
|
|
52
|
+
"@lunora/errors": "1.0.0-alpha.12",
|
|
53
|
+
"@lunora/platform": "1.0.0-alpha.3",
|
|
54
|
+
"@lunora/queue": "1.0.0-alpha.15",
|
|
55
|
+
"@lunora/scheduler": "1.0.0-alpha.18",
|
|
56
|
+
"@lunora/values": "1.0.0-alpha.15",
|
|
57
|
+
"@lunora/workflow": "1.0.0-alpha.17",
|
|
58
58
|
"jsonc-parser": "^3.3.1",
|
|
59
59
|
"ts-morph": "^28.0.0"
|
|
60
60
|
},
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{existsSync as l,readFileSync as c}from"node:fs";import{join as u}from"node:path";import{CLOUDFLARE_CAPABILITIES as g}from"@lunora/platform";import{parse as m}from"jsonc-parser";const f="cloudflare",p="lunora.json",d=t=>{const e=u(t,p);if(!l(e))return;let a;try{a=c(e,"utf8")}catch{return}const s=[],o=m(a,s,{allowTrailingComma:!0});if(s.length>0||o===null||typeof o!="object")return;const{target:r}=o;return typeof r=="string"&&r.length>0?r:void 0},C=(t,e)=>e??d(t)??f,n={cloudflare:g},j=()=>Object.keys(n).toSorted((t,e)=>t.localeCompare(e)),y={ai:"ai",analytics:"analytics",browser:"browser",container:"containers",hyperdrive:"hyperdrive",kv:"keyValueStore",mail:"mail",pipelines:"pipelines",scheduler:"scheduler",storage:"objectStorage",vectors:"vectorStore",workflows:"workflows"},h=(t,e,a)=>{const s={...t},o=[];for(const[r,i]of Object.entries(y))t[r]&&e.features[i]?.level==="unsupported"&&(s[r]=!1,o.push({feature:r,level:"error",message:`${e.name} does not support "${r}" (ctx.${r}). Its surface was omitted from the generated types.`,name:"platform_unsupported_feature",remediation:`Remove the ctx.${r} usage, or deploy to a target whose capability matrix marks "${i}" as native or emulated.`,target:a}));return{diagnostics:o,usage:s}},x=(t,e)=>{const a=n[e];return a===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(n).join(", ")}) or install the target's @lunora/platform-${e} package.`,target:e}],usage:{...t}}:h(t,a,e)};export{f as DEFAULT_TARGET,p as PROJECT_CONFIG_FILE,h as gateAgainstMatrix,x as gatePlatformFeatures,j as platformMatrixIds,d as readProjectTarget,C as resolveCodegenTarget};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import"@lunora/agent/component";import"@lunora/errors";import"./SCHEMA_SNAPSHOT_VERSION-CFhF_hmg.mjs";import{w as r,a as o,e as n,k as l,S as p,X as S,b as d,s as g,f as u,L as C,t as E,v as c,O as A,d as D,y as f,Z as b,x as h}from"./emit-05q6XTbd.mjs";import"./paths-BmX5O1sG.mjs";export{r as GENERATED_HEADER,o as buildStorageColumns,n as emitAgents,l as emitApi,p as emitCollections,S as emitContainers,d as emitCrons,g as emitDataModel,u as emitDrizzleSchema,C as emitFunctions,E as emitQueues,c as emitSeed,A as emitServer,D as emitShard,f as emitVectors,b as emitWorkflows,h as emitWranglerCronTriggers};
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
import{existsSync as E,mkdirSync as Gt,readFileSync as xt,writeFileSync as Ht,rmSync as Qt}from"node:fs";import{join as p,dirname as fe}from"node:path";import{performance as me}from"node:perf_hooks";import{runAdvisor as Xt}from"@lunora/advisor";import{LunoraError as R}from"@lunora/errors";import{Node as i,SyntaxKind as u,Project as et}from"ts-morph";import{serializeSchemaSnapshot as Zt}from"./SCHEMA_SNAPSHOT_VERSION-CFhF_hmg.mjs";import{toAdvisorContext as Jt}from"./formatAdvisories-BCEfzLT0.mjs";import{listLunoraSourceFiles as d,lunoraRelativePath as g,classifyProcedureCall as k,inlineHandler as Yt,procedureHandler as ht,chainUsesWrappedCall as Et,isDatabaseAccessor as C,chainHasStep as es,discoverFunctions as ts,resolveStandardSchemaType as ss}from"./discoverFunctions-CVYkUBTm.mjs";import{discoverAgents as rs}from"./AGENTS_FILENAME-BesaDYkL.mjs";import{i as w,a as O,e as h,c as S,r as ns,s as G,b as is,d as os,y as as}from"./discover-queries-Ctpk9SA-.mjs";import cs from"./discoverAuthApiCalls-CYdI8pkP.mjs";import{discoverContainers as us}from"./CONTAINERS_FILENAME-CFwdyaCI.mjs";import ls from"./discoverCrons-CwtPaymU.mjs";import{diagnosticAt as H}from"./CodegenDiagnosticError-DPezpZTz.mjs";import{o as Q}from"./module-specifiers-8FEEiUcv.mjs";import{r as xe,a as ds,s as gs,k as ps,O as fs,L as ms,d as xs,S as hs,X as Es,Z as $s,e as ys,t as As,b as Ss,y as bs,f as Ns,v as vs,x as Ps}from"./emit-05q6XTbd.mjs";import{discoverFlagKeys as ws}from"./FLAGS_FILENAME-UPE377GV.mjs";import Is from"./discoverHttpRoutes-DmTedJlp.mjs";import Ls from"./discoverInserts-CssZuKb6.mjs";import Ts,{discoverMaskStrategies as Os,discoverMaskMetadata as Fs}from"./discoverMaskProcedures-DQ-4yUUK.mjs";import Ds from"./discoverMigrations-qyXaVjw1.mjs";import{MUTATORS_FILENAME as Cs,isDefineMutatorCallee as ks,discoverMutators as Ks}from"./MUTATORS_FILENAME-CsAoG-d2.mjs";import Rs from"./discoverNondeterministicCalls-GNP4oKrf.mjs";import{discoverNotifyConfig as js,discoverNotifyCalls as Ms}from"./NOTIFY_FILENAME-zA5OFFbv.mjs";import zs from"./readPackageDependencies-CogJX1Ia.mjs";import{discoverQueues as qs}from"./QUEUES_FILENAME-CSE6i-ld.mjs";import Bs from"./discoverR2sqlCalls-B7uqLnVS.mjs";import Vs,{discoverRlsMetadata as Us}from"./discoverRlsMetadata-Bt0QK8VM.mjs";import{discoverSandboxUsage as Ws}from"./discoverSandboxUsage-Bb2JzaIW.mjs";import _s from"./discoverSchema-CaTD2Sdx.mjs";import{secretKindOf as Gs,redact as Hs,isHeuristicSecretKind as Qs,isSecretishName as Xs}from"./redact-6jD4lAhq.mjs";import{discoverShapes as Zs}from"./SHAPES_FILENAME-DyVUZzIk.mjs";import Js from"./discoverStorageRulesMetadata-VJ_uXOFe.mjs";import{e as Ys}from"./discover-ast-CezKqEhE.mjs";import{discoverWorkflows as er}from"./WORKFLOWS_FILENAME-ClsYRKXp.mjs";import{emitApp as tr}from"./emitApp-C2DhPKWE.mjs";import{buildOpenApiDocument as sr,emitOpenApiModule as rr}from"./buildOpenApiDocument-XeZ1ycwi.mjs";import{buildOpenRpcDocument as nr,emitOpenRpcModule as ir}from"./OPENRPC_VERSION-IKkrtXye.mjs";import{p as or}from"./parse-validator-_jDrFxwt.mjs";import{gatePlatformFeatures as ar,resolveCodegenTarget as cr}from"./DEFAULT_TARGET-BYPEwgZu.mjs";import{buildSchemaSnapshot as ur}from"./SchemaSnapshotParseError-BJkhTEpi.mjs";const lr=e=>{const t=[],s=e.tables.filter(r=>r.shardMode==="global");return s.some(r=>r.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(r=>r.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},dr=(e,t)=>{if(t===void 0)return;const s=lr(e).filter(o=>!t.has(o.name));if(s.length===0)return;const r=s.map(o=>` - ${o.name} — ${o.reason}`).join(`
|
|
2
|
-
`),n=s.map(o=>o.name).join(" ");throw new R("INTERNAL",`@lunora/codegen: this schema's generated code imports packages the project does not declare:
|
|
3
|
-
${r}
|
|
4
|
-
|
|
5
|
-
Install them, then re-run codegen:
|
|
6
|
-
|
|
7
|
-
pnpm add ${n}
|
|
8
|
-
`)},$t=new Set(["delete","get","head","options","patch","post","put"]),gr=new Set(["handler","stream"]),pr=/\/(?:_|admin|internal|superuser|sudo|root|debug)/iu,tt=new Set(["ADMIN_TOKEN","adminToken","assertAdmin","assertAuth","auth","Authorization","getSession","identity","isAdmin","requireAdmin","requireAuth","requireRole","verifyAdmin"]),fr=e=>{if(!i.isCallExpression(e))return;const t=e.getExpression();if(!i.isPropertyAccessExpression(t)||!$t.has(t.getName()))return;const s=t.getExpression();if(!i.isIdentifier(s)||s.getText()!=="httpRoute")return;const r=e.getArguments()[0];if(!(!r||!i.isStringLiteral(r)))return{method:t.getName().toUpperCase(),path:r.getLiteralValue()}},mr=e=>{const t=e.getExpression();if(!i.isPropertyAccessExpression(t))return;let s=t.getExpression();for(;i.isCallExpression(s);){const r=s.getExpression();if(!i.isPropertyAccessExpression(r)||$t.has(r.getName()))break;s=r.getExpression()}return fr(s)},xr=e=>{for(const t of e.getDescendantsOfKind(u.PropertyAccessExpression))if(tt.has(t.getName()))return!0;for(const t of e.getDescendantsOfKind(u.CallExpression)){const s=t.getExpression();if(i.isIdentifier(s)&&tt.has(s.getText()))return!0}return!1},hr=(e,t)=>{const s=e.getInitializer();if(!s||!i.isCallExpression(s))return;const r=s.getExpression();if(!i.isPropertyAccessExpression(r)||!gr.has(r.getName()))return;const n=mr(s);if(!n||!pr.test(n.path))return;const o=s.getArguments()[0],a=o!==void 0&&(i.isArrowFunction(o)||i.isFunctionExpression(o))&&xr(o);return{exportName:e.getName(),file:t,method:n.method,path:n.path,usesGuard:a}},Er=(e,t)=>{const s=[];for(const r of e.getVariableStatements())if(r.isExported())for(const n of r.getDeclarations()){const o=hr(n,t);o&&s.push(o)}return s},$r=(e,t)=>{const s=[];for(const r of d(t)){const n=e.getSourceFile(r)??e.addSourceFileAtPath(r);s.push(...Er(n,g(t,r)))}return s},yr=e=>!i.isPropertyAccessExpression(e)||e.getName()!=="run"?!1:e.getExpression().getText()==="ctx.ai",Ar=(e,t)=>{if(!yr(e.getExpression()))return;const s=e.getArguments()[0];if(!(!s||!w(s)||O(s)))return{exportName:h(e),file:t,line:e.getStartLineNumber()}},Sr=(e,t)=>{const s=[];for(const r of e.getDescendantsOfKind(u.CallExpression)){const n=Ar(r,t);n&&s.push(n)}return s},br=(e,t)=>{const s=[];for(const r of d(t)){const n=e.getSourceFile(r)??e.addSourceFileAtPath(r);s.push(...Sr(n,g(t,r)))}return s},Nr=new Set(["generateText","streamText"]),vr=new Set(["messages","prompt","system"]),Pr=[{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"]}],wr=e=>{const t=e.getExpression();if(!i.isPropertyAccessExpression(t))return;const s=t.getName(),r=t.getExpression().getText();for(const n of Pr)if(n.methods.has(s)&&n.prefixes.some(o=>r===o||r.startsWith(`${o}.`)))return`${r}.${s}`},Ir=e=>{for(const t of e.getDescendantsOfKind(u.CallExpression)){const s=wr(t);if(s!==void 0)return s}},Lr=e=>{const t=new Set,s=e.getFirstAncestor(o=>i.isArrowFunction(o)||i.isFunctionExpression(o)||i.isFunctionDeclaration(o)),[r]=s?.getParameters()??[],n=r?.getNameNode();if(n===void 0||!i.isObjectBindingPattern(n))return t;for(const o of n.getElements()){const a=o.getPropertyNameNode()?.getText()??o.getName(),c=o.getNameNode();if(a==="args"&&i.isObjectBindingPattern(c))for(const l of c.getElements())t.add(l.getName())}return t},Tr=e=>{if(ns(e))return!0;const t=Lr(e);return t.size===0?!1:e.getDescendantsOfKind(u.Identifier).some(s=>t.has(s.getText()))},Or=e=>{for(const t of e.getProperties()){if(!i.isPropertyAssignment(t)||!vr.has(t.getName()))continue;const s=t.getInitializer();if(s!==void 0&&Tr(s))return!0}return!1},Fr=(e,t)=>{const s=[];for(const r of e.getDescendantsOfKind(u.CallExpression)){const n=S(r.getExpression());if(n===void 0||!Nr.has(n))continue;const[o]=r.getArguments();if(o===void 0||!i.isObjectLiteralExpression(o))continue;let a;for(const c of o.getDescendantsOfKind(u.CallExpression))if(S(c.getExpression())==="tool"&&(a=Ir(c),a!==void 0))break;a!==void 0&&s.push({exportName:h(r),file:t,line:r.getStartLineNumber(),method:n,sideEffect:a,userInputDerived:Or(o)})}return s},Dr=(e,t)=>{const s=[];for(const r of d(t)){const n=e.getSourceFile(r)??e.addSourceFileAtPath(r);s.push(...Fr(n,g(t,r)))}return s},Cr=e=>{if(!i.isPropertyAccessExpression(e)||e.getName()!=="fetch")return!1;const t=e.getExpression();return i.isIdentifier(t)&&t.getText()==="ctx"},kr=(e,t)=>{if(!Cr(e.getExpression()))return;const s=e.getArguments()[0];if(!(!s||!w(s)))return{exportName:h(e),file:t,line:e.getStartLineNumber()}},Kr=(e,t)=>{const s=[];for(const r of e.getDescendantsOfKind(u.CallExpression)){const n=kr(r,t);n&&s.push(n)}return s},Rr=(e,t)=>{const s=[];for(const r of d(t)){const n=e.getSourceFile(r)??e.addSourceFileAtPath(r);s.push(...Kr(n,g(t,r)))}return s},yt=e=>e.getProperties().some(t=>i.isSpreadAssignment(t)),jr=e=>{const t=e.getArguments()[0];if(!t||!i.isObjectLiteralExpression(t))return{objects:[],opaque:!0};const s=t.getProperty("args");if(!s)return{objects:[],opaque:!1};if(!i.isPropertyAssignment(s))return{objects:[],opaque:!0};const r=s.getInitializer();return!r||!i.isObjectLiteralExpression(r)?{objects:[],opaque:!0}:{objects:[r],opaque:yt(r)}},Mr=e=>{const t=[];let s=!1,r=e;for(;i.isCallExpression(r);){const n=r.getExpression();if(!i.isPropertyAccessExpression(n))break;if(n.getName()==="input"){const o=r.getArguments()[0];o&&i.isObjectLiteralExpression(o)?(t.push(o),s||=yt(o)):s=!0}r=n.getExpression()}return{objects:t,opaque:s}},At=(e,t)=>t?Mr(t):jr(e),zr=e=>e.flatMap(t=>t.getProperties().filter(s=>i.isPropertyAssignment(s)||i.isShorthandPropertyAssignment(s)).map(s=>s.getName())),qr=/\.check\(|\.meta\(|length|max/iu,Br=/\bv\.any\s*\(/u,Vr=/\bv\.string\s*\(/u,Ur=e=>Br.test(e),Wr=e=>Vr.test(e)&&!qr.test(e),_r=e=>{const t=[],s=[];for(const r of e)for(const n of r.getProperties()){if(!i.isPropertyAssignment(n))continue;const o=n.getInitializer();if(!o)continue;const a=o.getText(),c=n.getName();Ur(a)?t.push(c):Wr(a)&&s.push(c)}return{anyArgs:t,unboundedStringArgs:s}},Gr=(e,t)=>{const s=e.getInitializer();if(!s||!i.isCallExpression(s))return;const r=k(s);if(r?.visibility!=="public")return;const{objects:n}=At(s,r.receiver),{anyArgs:o,unboundedStringArgs:a}=_r(n);if(!(o.length===0&&a.length===0))return{anyArgs:o,exportName:e.getName(),file:t,line:s.getStartLineNumber(),unboundedStringArgs:a}},Hr=(e,t)=>{const s=[];for(const r of e.getVariableStatements())if(r.isExported())for(const n of r.getDeclarations()){const o=Gr(n,t);o&&s.push(o)}return s},Qr=(e,t)=>{const s=[];for(const r of d(t)){const n=e.getSourceFile(r)??e.addSourceFileAtPath(r);s.push(...Hr(n,g(t,r)))}return s},b=(e,t)=>{if(!e||!i.isObjectLiteralExpression(e))return;const s=e.getProperty(t);return s&&i.isPropertyAssignment(s)?s.getInitializer():void 0},he=e=>e?.getKind()===u.TrueKeyword,Xr=e=>e?.getKind()===u.FalseKeyword,Zr=e=>e!==void 0&&i.isNumericLiteral(e)&&e.getLiteralValue()===0,Jr=new Set(["lunoraAuthAdapter","lunoraD1Adapter"]),Yr=e=>!e||!i.isArrayLiteralExpression(e)?!1:e.getElements().some(t=>i.isCallExpression(t)&&S(t.getExpression())==="scim"),en=e=>e!==void 0&&i.isCallExpression(e)&&Jr.has(S(e.getExpression())??""),tn=e=>!e||!i.isArrayLiteralExpression(e)?!1:e.getElements().some(t=>i.isStringLiteral(t)&&t.getLiteralText()==="*"),sn=e=>{const t=b(e,"advanced"),s=b(e,"emailAndPassword"),r=b(e,"session");return{analyzable:!0,disableCsrfCheck:he(b(t,"disableCSRFCheck")),emailPasswordEnabled:he(b(s,"enabled")),requireEmailVerification:he(b(s,"requireEmailVerification")),scimOnNonTransactionalAdapter:Yr(b(e,"plugins"))&&en(b(e,"database")),secureCookiesDisabled:Xr(b(t,"useSecureCookies")),sessionFreshAgeZero:Zr(b(r,"freshAge")),trustedOriginsWildcard:tn(b(e,"trustedOrigins"))}},rn=()=>({analyzable:!1,disableCsrfCheck:!1,emailPasswordEnabled:!1,requireEmailVerification:!1,scimOnNonTransactionalAdapter:!1,secureCookiesDisabled:!1,sessionFreshAgeZero:!1,trustedOriginsWildcard:!1}),nn=(e,t)=>{if(S(e.getExpression())!=="createAuth")return;const s=e.getArguments()[0],r=s!==void 0&&i.isObjectLiteralExpression(s)&&s.getProperties().some(o=>i.isSpreadAssignment(o)),n=s!==void 0&&i.isObjectLiteralExpression(s)&&!r?sn(s):rn();return{exportName:h(e),file:t,line:e.getStartLineNumber(),...n}},on=(e,t)=>{const s=[];for(const r of e.getDescendantsOfKind(u.CallExpression)){const n=nn(r,t);n&&s.push(n)}return s},an=(e,t)=>{const s=[];for(const r of d(t)){const n=e.getSourceFile(r)??e.addSourceFileAtPath(r);s.push(...on(n,g(t,r)))}return s},cn=(e,t)=>{if(!i.isPropertyAccessExpression(e))return;const s=e.getName();if(t.methods.has(s))return t.matchReceiver(e.getExpression().getText())?s:void 0},un=(e,t,s)=>{const r=cn(e.getExpression(),s);if(r===void 0)return;const n=e.getArguments()[s.argIndex];if(!(!n||!w(n)||O(n)))return{exportName:h(e),file:t,line:e.getStartLineNumber(),method:r}},ln=(e,t,s)=>{const r=[];for(const n of e.getDescendantsOfKind(u.CallExpression)){const o=un(n,t,s);o&&r.push(o)}return r},X=(e,t,s)=>{const r=[];for(const n of d(t)){const o=e.getSourceFile(n)??e.addSourceFileAtPath(n);r.push(...ln(o,g(t,n),s))}return r},dn=new Set(["content","pdf","scrape","screenshot"]),gn=(e,t)=>X(e,t,{argIndex:0,matchReceiver:s=>s==="ctx.browser",methods:dn}),pn=new Set(["createBrowser","createInboundEmailHandler","createPayment"]),fn=new Set(["RateLimiter"]),mn=new Set(["extend"]),St=e=>{const t=[],s=[];let r=!1;for(const n of e.getProperties()){if(i.isSpreadAssignment(n)){r=!0;continue}if(i.isPropertyAssignment(n)){const o=n.getName();t.push(o),n.getInitializer()?.getKind()===u.TrueKeyword&&s.push(o);continue}(i.isShorthandPropertyAssignment(n)||i.isMethodDeclaration(n))&&t.push(n.getName())}return{analyzable:!r,presentKeys:t,trueKeys:s}},st=e=>e&&i.isObjectLiteralExpression(e)?St(e):{analyzable:!1,presentKeys:[],trueKeys:[]},xn=e=>{const t=e.getStatements(),[s]=t;if(t.length!==1||s===void 0||!i.isReturnStatement(s))return;const r=s.getExpression();return r!==void 0&&i.isObjectLiteralExpression(r)?r:void 0},hn=e=>{if(i.isObjectLiteralExpression(e))return e;if(i.isParenthesizedExpression(e)){const t=e.getExpression();return i.isObjectLiteralExpression(t)?t:void 0}return i.isBlock(e)?xn(e):void 0},En=e=>{const t=e&&(i.isArrowFunction(e)||i.isFunctionExpression(e))?e:void 0,s=t&&hn(t.getBody());return s?St(s):{analyzable:!1,presentKeys:[],trueKeys:[]}},$n=(e,t)=>{const s=[];for(const r of e.getDescendantsOfKind(u.CallExpression)){const n=S(r.getExpression());n!==void 0&&(pn.has(n)?s.push({callee:n,file:t,line:r.getStartLineNumber(),...st(r.getArguments()[0])}):mn.has(n)&&s.push({callee:n,file:t,line:r.getStartLineNumber(),...En(r.getArguments()[0])}))}for(const r of e.getDescendantsOfKind(u.NewExpression)){const n=S(r.getExpression());n===void 0||!fn.has(n)||s.push({callee:n,file:t,line:r.getStartLineNumber(),...st(r.getArguments()[0])})}return s},yn=(e,t)=>{const s=[];for(const r of d(t)){const n=e.getSourceFile(r)??e.addSourceFileAtPath(r);s.push(...$n(n,g(t,r)))}return s},rt="ctx.containers.",An=e=>{if(!e.startsWith(rt))return!1;const t=e.slice(rt.length);return t.length>0&&!t.includes(".")},Sn=(e,t)=>X(e,t,{argIndex:0,matchReceiver:An,methods:new Set(["get"])}),bn=new Set(["allow","deny","setAllowed"]),Nn=e=>{const t=e.getArguments()[0];if(!t||!i.isObjectLiteralExpression(t))return!1;const s=t.getProperty("enableInternet");return s!==void 0&&i.isPropertyAssignment(s)&&i.isTrueLiteral(s.getInitializerOrThrow())},vn=(e,t)=>{const s=e.getExpression();if(!(!i.isPropertyAccessExpression(s)||s.getName()!=="start"||!Nn(e)))return{detail:"enableInternet: true",exportName:h(e),file:t,kind:"enable_internet",line:e.getStartLineNumber()}},Pn=(e,t)=>{const s=e.getExpression();if(!i.isPropertyAccessExpression(s)||!bn.has(s.getName()))return;const r=s.getExpression();if(!(!i.isPropertyAccessExpression(r)||r.getName()!=="egress"))return{detail:s.getName(),exportName:h(e),file:t,kind:"egress_relaxation",line:e.getStartLineNumber()}},wn=(e,t)=>vn(e,t)??Pn(e,t),In=(e,t)=>{const s=[];for(const r of e.getDescendantsOfKind(u.CallExpression)){const n=wn(r,t);n&&s.push(n)}return s},Ln=(e,t)=>{const s=[];for(const r of d(t)){const n=e.getSourceFile(r)??e.addSourceFileAtPath(r);s.push(...In(n,g(t,r)))}return s},Tn="env.ts",On=e=>{const t=e.getSymbol();if(!t)return e.getText()==="defineEnv";for(const s of t.getDeclarations())if(i.isImportSpecifier(s))return Q(s.getImportDeclaration().getModuleSpecifierValue())?s.getNameNode().getText()==="defineEnv":!1;return!1},Fn=e=>{const t=e.getSymbol();if(!t)return!1;for(const s of t.getDeclarations()){if(!i.isNamespaceImport(s))continue;const r=s.getFirstAncestorByKind(u.ImportDeclaration);return r!==void 0&&Q(r.getModuleSpecifierValue())}return!1},Dn=e=>{if(i.isIdentifier(e))return On(e);if(i.isPropertyAccessExpression(e)){const t=e.getExpression();return e.getName()==="defineEnv"&&i.isIdentifier(t)&&Fn(t)}return!1},Cn=e=>{const t=[];for(const s of e.getVariableDeclarations()){if(!s.isExported())continue;const r=s.getInitializer();if(r?.getKind()!==u.CallExpression||!Dn(r.getExpression()))continue;const n=s.getNameNode();if(!i.isIdentifier(n))throw H(n,"defineEnv exports must be plain named exports (no destructuring)");t.push({exportName:n.getText()})}return t},kn=(e,t)=>{const s=p(t,Tn);if(!E(s))return;const r=e.getSourceFile(s)??e.addSourceFileAtPath(s),n=Cn(r);if(n.length!==0){if(n.length>1)throw H(r,`lunora/env.ts declares ${n.length.toString()} defineEnv() contracts (${n.map(o=>o.exportName).join(", ")}); exactly one is allowed`);return n[0]}},Kn=new Set(["defineExportSink","r2Sink","webhookExportSink"]),Rn=e=>{const t=e.getExpression();if(!i.isIdentifier(t))return;const s=t.getText();return Kn.has(s)?s:void 0},jn=e=>{const t=[],s=[];for(const r of e.getProperties()){if(i.isSpreadAssignment(r))return{analyzable:!1,emptyKeys:[],presentKeys:[]};if(i.isPropertyAssignment(r)){const n=r.getName();t.push(n);const o=r.getInitializer();o&&i.isStringLiteral(o)&&o.getLiteralText()===""&&s.push(n);continue}(i.isShorthandPropertyAssignment(r)||i.isMethodDeclaration(r)||i.isGetAccessorDeclaration(r))&&t.push(r.getName())}return{analyzable:!0,emptyKeys:s,presentKeys:t}},Mn=(e,t)=>{const s=[];for(const r of d(t)){const n=e.getSourceFile(r)??e.addSourceFileAtPath(r),o=g(t,r);for(const a of n.getDescendantsOfKind(u.CallExpression)){const c=Rn(a);if(c===void 0)continue;const l=a.getArguments()[0],f=l&&i.isObjectLiteralExpression(l)?jn(l):{analyzable:!1,emptyKeys:[],presentKeys:[]};s.push({analyzable:f.analyzable,emptyKeys:f.emptyKeys,factory:c,file:o,line:a.getStartLineNumber(),presentKeys:f.presentKeys})}}return s},zn=new Map([["dbRateLimit",2],["rateLimit",2],["verifyTurnstileMiddleware",0]]),qn=new Set(["dbRateLimit","rateLimit"]),Bn=e=>{if(!e||!i.isObjectLiteralExpression(e))return!1;const t=e.getProperty("failOpen");return t!==void 0&&i.isPropertyAssignment(t)&&t.getInitializer()?.getKind()===u.TrueKeyword},Vn=e=>{const t=e.getArguments()[1];return t&&i.isStringLiteral(t)?t.getLiteralValue():""},Un=(e,t)=>{const s=S(e.getExpression());if(s===void 0)return;const r=zn.get(s);if(r!==void 0)return{callee:s,exportName:h(e),failOpen:Bn(e.getArguments()[r]),file:t,limitName:qn.has(s)?Vn(e):"",line:e.getStartLineNumber()}},Wn=(e,t)=>{const s=[];for(const r of e.getDescendantsOfKind(u.CallExpression)){const n=Un(r,t);n&&s.push(n)}return s},_n=(e,t)=>{const s=[];for(const r of d(t)){const n=e.getSourceFile(r)??e.addSourceFileAtPath(r);s.push(...Wn(n,g(t,r)))}return s},Gn=e=>{const t=r=>i.isIdentifier(r)&&r.getText()==="ctx",s=new Set;for(const r of e.getDescendantsOfKind(u.PropertyAccessExpression))t(r.getExpression())&&s.add(r.getName());for(const r of e.getDescendantsOfKind(u.VariableDeclaration)){const n=r.getInitializer(),o=r.getNameNode();if(!(n===void 0||!t(n)||!i.isObjectBindingPattern(o)))for(const a of o.getElements()){const c=a.getPropertyNameNode()?.getText()??a.getName();c&&s.add(c)}}return s},Hn=(e,t)=>{const s=Object.fromEntries(xe.map(r=>[r.key,!1]));for(const r of d(t)){const n=e.getSourceFile(r)??e.addSourceFileAtPath(r),o=new Set(n.getImportDeclarations().map(c=>c.getModuleSpecifierValue())),a=Gn(n);for(const c of xe)if(!s[c.key]){if(o.has(c.moduleSpecifier)){s[c.key]=!0;continue}c.contextProperty!==void 0&&a.has(c.contextProperty)&&(s[c.key]=!0)}if(xe.every(c=>s[c.key]))break}return s},Qn=["providerSubscriptionId","state"],Xn=["providerEventId","processedAt"],nt=(e,t)=>t.every(s=>s in e.shape),Zn=e=>{const t=e.find(r=>r.name==="subscriptions"),s=e.find(r=>r.name==="events");return t!==void 0&&s!==void 0&&nt(t,Qn)&&nt(s,Xn)},Jn=(e,t)=>({analytics:e.analytics||t.dependencies.has("@lunora/bindings/analytics"),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/kv"),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/vectors"),workflows:e.workflows||t.workflowCount>0||t.dependencies.has("@lunora/workflow")}),Yn=e=>i.isIdentifier(e)&&e.getText()==="ctx",ei=e=>{if(!i.isPropertyAccessExpression(e)||e.getName()!=="boolean")return!1;const t=e.getExpression();return i.isPropertyAccessExpression(t)&&t.getName()==="flags"&&Yn(t.getExpression())},ti=e=>{if(e?.getKind()===u.TrueKeyword)return!0;if(e?.getKind()===u.FalseKeyword)return!1},si=(e,t)=>{if(!ei(e.getExpression()))return;const[s,r]=e.getArguments();if(!s||!(i.isStringLiteral(s)||i.isNoSubstitutionTemplateLiteral(s)))return;const n=s.getLiteralValue(),o=ti(r);if(!(n.length===0||o===void 0))return{defaultValue:o,exportName:h(e),file:t,key:n,line:e.getStartLineNumber()}},ri=(e,t)=>{const s=[];for(const r of e.getDescendantsOfKind(u.CallExpression)){const n=si(r,t);n&&s.push(n)}return s},ni=(e,t)=>{const s=[];for(const r of d(t)){const n=e.getSourceFile(r)??e.addSourceFileAtPath(r);s.push(...ri(n,g(t,r)))}return s},ii=e=>{const t=e.getExpression();return i.isPropertyAccessExpression(t)&&t.getName()==="withGeoIndex"},oi=e=>{const t=e.getArguments()[0];return t&&i.isStringLiteral(t)?t.getLiteralText():""},ai=(e,t)=>{const s=[];for(const r of d(t)){const n=e.getSourceFile(r)??e.addSourceFileAtPath(r),o=g(t,r);for(const a of n.getDescendantsOfKind(u.CallExpression))ii(a)&&s.push({file:o,indexName:oi(a),line:a.getStartLineNumber()})}return s},ci=new Set(["delete","get","head","options","patch","post","put"]),ui=new Set(["handler","stream"]),li=new Set(["runAction","runMutation"]),di=new Set(["delete","insert","insertManyUnsafe","patch","replace"]),U=(e,t)=>e!==void 0&&i.isIdentifier(e)&&e.getText()===t,it=e=>e!==void 0&&(i.isArrowFunction(e)||i.isFunctionExpression(e))?e:void 0,ot=(e,t)=>{const s=e.getParameters()[0];if(s===void 0)return;const r=s.getNameNode();if(t)return i.isIdentifier(r)?r.getText():void 0;if(i.isObjectBindingPattern(r)){for(const n of r.getElements())if((n.getPropertyNameNode()?.getText()??n.getNameNode().getText())==="ctx"){const o=n.getNameNode();return i.isIdentifier(o)?o.getText():void 0}}},at=(e,t)=>{const s=e.getBody(),r=s.getDescendantsOfKind(u.CallExpression);i.isCallExpression(s)&&r.unshift(s);for(const n of r){const o=n.getExpression();if(!i.isPropertyAccessExpression(o))continue;const a=o.getName(),c=o.getExpression();if(li.has(a)&&U(c,t))return a;if(di.has(a)&&i.isPropertyAccessExpression(c)&&c.getName()==="db"&&U(c.getExpression(),t))return`db.${a}`}},ct=(e,t)=>{const s=e.getBody();for(const r of s.getDescendantsOfKind(u.PropertyAccessExpression))if(r.getName()==="auth"&&U(r.getExpression(),t))return!0;for(const r of s.getDescendantsOfKind(u.VariableDeclaration)){const n=r.getNameNode();if(!(!i.isObjectBindingPattern(n)||!U(r.getInitializer(),t))){for(const o of n.getElements())if((o.getPropertyNameNode()?.getText()??o.getNameNode().getText())==="auth")return!0}}return!1},gi=e=>{const t=e.getExpression();if(!i.isPropertyAccessExpression(t)||!ui.has(t.getName()))return;let s=t.getExpression();for(;i.isCallExpression(s);){const r=s.getExpression();if(!i.isPropertyAccessExpression(r))return;const n=r.getName();if(ci.has(n)){const o=r.getExpression();return i.isIdentifier(o)&&o.getText()==="httpRoute"?n.toUpperCase():void 0}s=r.getExpression()}},pi=(e,t)=>{const s=e.getExpression();if(i.isIdentifier(s)&&s.getText()==="httpAction"){const c=it(e.getArguments()[0]),l=c&&ot(c,!0);if(!c||l===void 0)return;const f=at(c,l);return f===void 0?void 0:{exportName:h(e),file:t,kind:"httpAction",line:e.getStartLineNumber(),readsAuth:ct(c,l),sideEffect:f}}const r=gi(e);if(r===void 0)return;const n=it(e.getArguments()[0]),o=n&&ot(n,!1);if(!n||o===void 0)return;const a=at(n,o);return a===void 0?void 0:{exportName:h(e),file:t,kind:"httpRoute",line:e.getStartLineNumber(),method:r,readsAuth:ct(n,o),sideEffect:a}},fi=(e,t)=>{const s=[];for(const r of e.getDescendantsOfKind(u.CallExpression)){const n=pi(r,t);n&&s.push(n)}return s},mi=(e,t)=>{const s=[];for(const r of d(t)){const n=e.getSourceFile(r)??e.addSourceFileAtPath(r);s.push(...fi(n,g(t,r)))}return s},xi=new Set(["btoa","encodeURI","encodeURIComponent","isSafeHeaderValue","Number","parseFloat","parseInt"]),hi=new Set(["append","set"]),ye=e=>i.isIdentifier(e)?e.getText():i.isPropertyAccessExpression(e)?e.getName():"",bt=e=>e!==void 0&&(i.isStringLiteral(e)||i.isNoSubstitutionTemplateLiteral(e))?e.getLiteralText():"",ut=(e,t)=>(i.isCallExpression(e)?[e,...e.getDescendantsOfKind(u.CallExpression)]:e.getDescendantsOfKind(u.CallExpression)).some(s=>xi.has(ye(s.getExpression()))&&os(s,t)),Ei=(e,t)=>{if(ut(e,t))return!0;const s=G(e);return s!==void 0&&ut(s,t)},$e=(e,t)=>is(e,t)&&!Ei(e,t),$i=e=>{if(i.isPropertyAccessExpression(e)&&e.getName()==="headers")return!0;const t=G(e);return t!==void 0&&i.isNewExpression(t)&&ye(t.getExpression())==="Headers"},W=e=>{if(e===void 0)return;if(i.isObjectLiteralExpression(e))return e;const t=G(e);return t!==void 0&&i.isObjectLiteralExpression(t)?t:void 0},Ae=(e,t,s)=>{for(const r of e.getProperties())if(i.isPropertyAssignment(r)){const n=r.getInitializer();n!==void 0&&$e(n,s.requestName)&&s.rows.push({exportName:s.exportName,file:s.relativePath,headerName:bt(r.getNameNode()),line:n.getStartLineNumber(),via:t})}else if(i.isShorthandPropertyAssignment(r)){const n=r.getNameNode();$e(n,s.requestName)&&s.rows.push({exportName:s.exportName,file:s.relativePath,headerName:r.getName(),line:n.getStartLineNumber(),via:t})}else if(i.isSpreadAssignment(r)){const n=W(r.getExpression());n!==void 0&&Ae(n,t,s)}},Nt=(e,t)=>{const s=W(e);if(s===void 0)return;const r=s.getProperty("headers");if(r===void 0||!i.isPropertyAssignment(r))return;const n=W(r.getInitializer());n!==void 0&&Ae(n,"response-init",t)},yi=(e,t)=>{const s=ye(e.getExpression());if(s==="Response")Nt(e.getArguments()[1],t);else if(s==="Headers"){const r=W(e.getArguments()[0]);r!==void 0&&Ae(r,"headers-ctor",t)}},Ai=(e,t)=>{const s=e.getExpression();if(!i.isPropertyAccessExpression(s))return;const r=s.getName(),n=s.getExpression();if(r==="json"&&i.isIdentifier(n)&&n.getText()==="Response"){Nt(e.getArguments()[1],t);return}if(hi.has(r)&&$i(n)){const o=e.getArguments()[1];o!==void 0&&$e(o,t.requestName)&&t.rows.push({exportName:t.exportName,file:t.relativePath,headerName:bt(e.getArguments()[0]),line:o.getStartLineNumber(),via:r==="set"?"headers-set":"headers-append"})}},Si=(e,t)=>{for(const s of e.getDescendantsOfKind(u.NewExpression))yi(s,t);for(const s of e.getDescendantsOfKind(u.CallExpression))Ai(s,t)},bi=(e,t)=>{const s=e.getExpression();if(!i.isIdentifier(s)||s.getText()!=="httpAction")return[];const r=Yt(e.getArguments()[0]);if(r===void 0)return[];const n=r.getParameters()[1];if(n===void 0)return[];const o=n.getNameNode();if(!i.isIdentifier(o))return[];const a=[];return Si(r,{exportName:h(e),relativePath:t,requestName:o.getText(),rows:a}),a},Ni=(e,t)=>{const s=[];for(const r of e.getDescendantsOfKind(u.CallExpression))s.push(...bi(r,t));return s},vi=(e,t)=>{const s=[];for(const r of d(t)){const n=e.getSourceFile(r)??e.addSourceFileAtPath(r);s.push(...Ni(n,g(t,r)))}return s},vt="identity.ts",Pi=e=>{const t=e.getSymbol();if(!t)return e.getText()==="defineIdentity";for(const s of t.getDeclarations())if(i.isImportSpecifier(s))return Q(s.getImportDeclaration().getModuleSpecifierValue())?s.getNameNode().getText()==="defineIdentity":!1;return!1},wi=e=>{const t=e.getSymbol();if(!t)return!1;for(const s of t.getDeclarations()){if(!i.isNamespaceImport(s))continue;const r=s.getFirstAncestorByKind(u.ImportDeclaration);return r!==void 0&&Q(r.getModuleSpecifierValue())}return!1},Ii=e=>{if(i.isIdentifier(e))return Pi(e);if(i.isPropertyAccessExpression(e)){const t=e.getExpression();return e.getName()==="defineIdentity"&&i.isIdentifier(t)&&wi(t)}return!1},Li=e=>{const t=[];for(const s of e.getVariableDeclarations()){if(!s.isExported())continue;const r=s.getInitializer();if(r?.getKind()!==u.CallExpression||!Ii(r.getExpression()))continue;const n=s.getNameNode();if(!i.isIdentifier(n))throw H(n,"defineIdentity exports must be plain named exports (no destructuring)");t.push({exportName:n.getText()})}return t},Ti=(e,t)=>{const s=p(t,vt);if(!E(s))return;const r=e.getSourceFile(s)??e.addSourceFileAtPath(s),n=Li(r);if(n.length!==0){if(n.length>1)throw H(r,`lunora/identity.ts declares ${n.length.toString()} defineIdentity() contracts (${n.map(o=>o.exportName).join(", ")}); exactly one is allowed`);return n[0]}},Oi=new Set(["auth","context.auth","ctx.auth"]),Fi="userId",Di=e=>{const t=new Set;for(const s of e.getProperties()){if(i.isSpreadAssignment(s))return;(i.isPropertyAssignment(s)||i.isShorthandPropertyAssignment(s)||i.isMethodDeclaration(s))&&t.add(s.getName())}return t},Ci=(e,t)=>{const s=p(t,vt);if(!E(s))return;const r=e.getSourceFile(s)??e.addSourceFileAtPath(s);for(const n of r.getDescendantsOfKind(u.CallExpression)){if(S(n.getExpression())!=="defineIdentity")continue;const[o]=n.getArguments();return o&&i.isObjectLiteralExpression(o)?Di(o):void 0}},lt=e=>{if(!(e===void 0||!i.isPropertyAccessExpression(e)||e.getName()!=="identity"))return Oi.has(e.getExpression().getText())?e:void 0},ki=e=>{if(i.isPropertyAccessExpression(e)&<(e.getExpression())!==void 0)return e.getName();if(i.isElementAccessExpression(e)&<(e.getExpression())!==void 0){const t=e.getArgumentExpression();return t&&i.isStringLiteral(t)?t.getLiteralValue():void 0}},Ki=(e,t,s)=>{const r=[];for(const n of e.getDescendants()){const o=ki(n);o!==void 0&&r.push({declared:o===Fi||s.has(o),exportName:h(n),file:t,key:o,line:n.getStartLineNumber()})}return r},Ri=(e,t)=>{const s=Ci(e,t);if(s===void 0)return[];const r=[];for(const n of d(t)){const o=e.getSourceFile(n)??e.addSourceFileAtPath(n);r.push(...Ki(o,g(t,n),s))}return r},ji=e=>{if(!i.isObjectLiteralExpression(e))return;const t=e.getProperty("key");return t&&i.isPropertyAssignment(t)?t.getInitializer():void 0},Mi=(e,t)=>{if(S(e.getExpression())!=="buildImageDeliveryUrl")return;const s=e.getArguments()[0];if(!s)return;const r=ji(s);if(!(!r||!w(r)||O(r)))return{exportName:h(e),file:t,line:e.getStartLineNumber()}},zi=(e,t)=>{const s=[];for(const r of e.getDescendantsOfKind(u.CallExpression)){const n=Mi(r,t);n&&s.push(n)}return s},qi=(e,t)=>{const s=[];for(const r of d(t)){const n=e.getSourceFile(r)??e.addSourceFileAtPath(r);s.push(...zi(n,g(t,r)))}return s},Bi=new Set(["delete","get","getRaw","getWithMetadata","put"]),Vi=(e,t)=>X(e,t,{argIndex:0,matchReceiver:s=>s==="ctx.kv"||s.startsWith("ctx.kv."),methods:Bi}),Ui=new Set(["queue","send"]),dt=new Set(["bcc","cc","to"]),Wi=e=>{if(!i.isPropertyAccessExpression(e))return;const t=e.getName();if(!Ui.has(t))return;const s=e.getExpression().getText();return s==="ctx.mail"||s==="ctx.email"?t:void 0},_i=e=>i.isObjectLiteralExpression(e)?e.getProperties().some(t=>{if(i.isShorthandPropertyAssignment(t)){const r=t.getNameNode();return dt.has(t.getName())&&w(r)&&!O(r)}if(!i.isPropertyAssignment(t)||!dt.has(t.getName()))return!1;const s=t.getInitializer();return s!==void 0&&w(s)&&!O(s)}):!1,Gi=(e,t)=>{const s=Wi(e.getExpression());if(s===void 0)return;const r=e.getArguments()[0];if(!(!r||!_i(r)))return{exportName:h(e),file:t,line:e.getStartLineNumber(),method:s}},Hi=(e,t)=>{const s=[];for(const r of e.getDescendantsOfKind(u.CallExpression)){const n=Gi(r,t);n&&s.push(n)}return s},Qi=(e,t)=>{const s=[];for(const r of d(t)){const n=e.getSourceFile(r)??e.addSourceFileAtPath(r);s.push(...Hi(n,g(t,r)))}return s},Xi=e=>{const t=e.getExpression();if(!i.isPropertyAccessExpression(t)||t.getName()!=="replace")return!1;const s=t.getExpression();return i.isPropertyAccessExpression(s)?s.getName()==="db":i.isIdentifier(s)&&s.getText()==="db"},Zi=e=>{const t=e.getArguments()[0];if(t===void 0||!i.isObjectLiteralExpression(t))return;const s=t.getProperty("server");if(s!==void 0)return i.isPropertyAssignment(s)?s.getInitializer():s},Ji=e=>{if(!e.isExported())return;const t=e.getInitializer();if(t?.getKind()!==u.CallExpression)return;const s=t;return ks(s.getExpression())?s:void 0},Yi=e=>{const t=Ji(e),s=t===void 0?void 0:Zi(t);if(s===void 0)return[];const r=e.getNameNode(),n=i.isIdentifier(r)?r.getText():"";return s.getDescendantsOfKind(u.CallExpression).filter(o=>Xi(o)).map(o=>({exportName:n,file:"lunora/mutators.ts",line:o.getStartLineNumber()}))},eo=e=>e.getVariableDeclarations().flatMap(t=>Yi(t)),to=(e,t)=>{const s=p(t,Cs);if(!E(s))return[];const r=e.getSourceFile(s)??e.addSourceFileAtPath(s);return eo(r)},so=new Set(["delete","get","patch"]),ro=new Set(["accountId","authorId","companyId","createdBy","createdById","customerId","groupId","memberId","organizationId","orgId","ownerId","projectId","teamId","tenantId","userId","workspaceId"]),no=new Set(["auth","identity","session","user"]),io=new Set([u.EqualsEqualsEqualsToken,u.EqualsEqualsToken,u.ExclamationEqualsEqualsToken,u.ExclamationEqualsToken]),oo=e=>{const t=e.getExpression();if(!i.isPropertyAccessExpression(t)||t.getName()!=="normalizeId"||!C(t.getExpression()))return;const s=e.getArguments()[0];return s&&i.isStringLiteral(s)?s.getLiteralText():""},ao=e=>{let t=e,s=t.getParent();for(;s!==void 0&&(i.isAsExpression(s)||i.isParenthesizedExpression(s)||i.isNonNullExpression(s));)t=s,s=t.getParent();if(s===void 0||!i.isVariableDeclaration(s))return;const r=s.getNameNode();return i.isIdentifier(r)?r.getText():void 0},co=(e,t)=>e.getDescendantsOfKind(u.Identifier).some(s=>s.getText()===t),uo=e=>i.isThrowStatement(e)||i.isReturnStatement(e)||e.getDescendantsOfKind(u.ThrowStatement).length>0||e.getDescendantsOfKind(u.ReturnStatement).length>0,lo=(e,t)=>e.getDescendantsOfKind(u.IfStatement).some(s=>co(s.getExpression(),t)&&uo(s.getThenStatement())),go=(e,t)=>{for(const s of e.getDescendantsOfKind(u.CallExpression)){const r=s.getExpression();if(!i.isPropertyAccessExpression(r))continue;const n=r.getName();if(!so.has(n))continue;const o=r.getExpression();if(!(C(o)||i.isPropertyAccessExpression(o)&&C(o.getExpression())))continue;const a=s.getArguments()[0];if(a!==void 0&&i.isIdentifier(a)&&a.getText()===t)return n}},po=e=>{let t=e;for(;i.isPropertyAccessExpression(t)||i.isElementAccessExpression(t)||i.isNonNullExpression(t)||i.isParenthesizedExpression(t)||i.isAsExpression(t)||i.isAwaitExpression(t);)t=t.getExpression();return i.isIdentifier(t)?t.getText():void 0},fo=e=>e.getDescendantsOfKind(u.CallExpression).some(t=>t.getArguments().some(s=>po(s)==="ctx")),mo=e=>e.getDescendantsOfKind(u.BinaryExpression).some(t=>io.has(t.getOperatorToken().getKind())?i.isPropertyAccessExpression(t.getLeft())||i.isPropertyAccessExpression(t.getRight()):!1),xo=e=>{for(const t of e.getDescendantsOfKind(u.Identifier))if(ro.has(t.getText()))return!0;for(const t of e.getDescendantsOfKind(u.PropertyAccessExpression)){const s=t.getExpression();if(i.isIdentifier(s)&&s.getText()==="ctx"&&no.has(t.getName()))return!0}return fo(e)||mo(e)},ho=(e,t)=>{if(!i.isVariableDeclaration(e))return[];const s=e.getInitializer();if(s===void 0||!i.isCallExpression(s))return[];const r=k(s);if(r?.kind!=="query"&&r?.kind!=="mutation")return[];const n=ht(s);if(n===void 0)return[];const o=r.receiver!==void 0&&Et(r.receiver,"use","rls"),a=xo(n),c=new Set,l=[];for(const f of n.getDescendantsOfKind(u.CallExpression)){const $=oo(f);if($===void 0)continue;const I=ao(f);if(I===void 0||c.has(I)||!lo(n,I))continue;const K=go(n,I);K!==void 0&&(c.add(I),l.push({exportName:e.getName(),file:t,line:f.getStartLineNumber(),mentionsOwnership:a,sinkMethod:K,table:$,usesRls:o,visibility:r.visibility}))}return l},Eo=(e,t)=>{const s=[];for(const r of d(t)){const n=e.getSourceFile(r)??e.addSourceFileAtPath(r),o=g(t,r);for(const a of n.getVariableStatements())if(a.isExported())for(const c of a.getDeclarations())s.push(...ho(c,o))}return s},$o=new Set(["accountId","authorId","createdBy","createdById","organizationId","orgId","ownerId","tenantId","updatedBy","userId","workspaceId"]),yo=new Set(["insert","insertManyUnsafe","patch","replace"]),Ao=e=>{if(!i.isPropertyAccessExpression(e))return;const t=e.getName();if(!yo.has(t))return;const s=e.getExpression();if(!i.isPropertyAccessExpression(s)||s.getName()!=="db")return;const r=s.getExpression();return i.isIdentifier(r)&&r.getText()==="ctx"?t:void 0},So=(e,t)=>{if(t!=="insertManyUnsafe")return i.isObjectLiteralExpression(e)?[e]:[];if(!i.isArrayLiteralExpression(e))return[];const s=[];for(const r of e.getElements())i.isObjectLiteralExpression(r)&&s.push(r);return s},bo=(e,t,s,r)=>{const n=[];for(const o of e.getProperties()){let a,c;i.isPropertyAssignment(o)?(a=o.getName(),c=o.getInitializer()):i.isShorthandPropertyAssignment(o)&&(a=o.getName(),c=o.getNameNode()),!(a===void 0||c===void 0||!$o.has(a))&&w(c)&&!O(c)&&n.push({exportName:h(s),field:a,file:r,line:s.getStartLineNumber(),method:t})}return n},No=(e,t)=>{const s=Ao(e.getExpression());if(s===void 0)return[];const r=e.getArguments()[1];return r?So(r,s).flatMap(n=>bo(n,s,e,t)):[]},vo=(e,t,s)=>{const r=[];for(const n of e.getDescendantsOfKind(u.CallExpression))for(const o of No(n,t)){const a=s(o.exportName);r.push(a===void 0?o:{...o,visibility:a})}return r},Po=(e,t,s=[])=>{const r=[],n=new Map(s.map(o=>[`${o.filePath}:${o.exportName}`,o.visibility]));for(const o of d(t)){const a=e.getSourceFile(o)??e.addSourceFileAtPath(o),c=g(t,o);r.push(...vo(a,c,l=>n.get(`${c}:${l}`)))}return r},wo=new Set(["createAutumnAdapter","createDodoPaymentsAdapter","createPolarAdapter","createStripeAdapter"]),Io=e=>e&&i.isNumericLiteral(e)?Number(e.getText()):void 0,Lo=e=>{const t=e.getProperty("webhookToleranceSeconds");return t&&i.isPropertyAssignment(t)?Io(t.getInitializer()):void 0},To=(e,t)=>{const s=[];for(const r of e.getDescendantsOfKind(u.CallExpression)){const n=S(r.getExpression());if(n===void 0||!wo.has(n))continue;const[o]=r.getArguments(),a=o&&i.isObjectLiteralExpression(o)?Lo(o):void 0;s.push({callee:n,exportName:h(r),file:t,line:r.getStartLineNumber(),...a===void 0?{}:{toleranceSeconds:a}})}return s},Oo=(e,t)=>{const s=[];for(const r of d(t)){const n=e.getSourceFile(r)??e.addSourceFileAtPath(r);s.push(...To(n,g(t,r)))}return s},Fo=new Set(["defineQueue","defineWorkflow"]),Do=new Set(["run","runAction","runMutation","runQuery"]),Co=new Set(["api","internal"]),ko=e=>{const t=e.getExpression();return i.isIdentifier(t)?t.getText():void 0},Ko=e=>{const t=e.getArguments()[0];if(!t||!i.isObjectLiteralExpression(t))return;const s=t.getProperty("handler");if(s===void 0||!i.isPropertyAssignment(s))return;const r=s.getInitializer();if(r&&(i.isArrowFunction(r)||i.isFunctionExpression(r)))return r},Pt=(e,t)=>{const s=e.getParameters()[t]?.getNameNode();return s&&i.isIdentifier(s)?s.getText():void 0},wt=(e,t)=>e===t||e.startsWith(`${t}.`),It=e=>{const t=e.getDescendantsOfKind(u.PropertyAccessExpression);return i.isPropertyAccessExpression(e)&&t.push(e),t},gt=e=>{const t=e.getParent();return i.isPropertyAccessExpression(t)&&t.getNameNode()===e||i.isPropertyAssignment(t)&&t.getNameNode()===e?!1:!(i.isBindingElement(t)&&t.getNameNode()===e)},Lt=e=>{const t=e.getDescendantsOfKind(u.Identifier).filter(s=>gt(s));return i.isIdentifier(e)&>(e)&&t.push(e),t},Ro=e=>{if(!i.isVariableDeclaration(e))return[];const t=e.getNameNode();return i.isIdentifier(t)?[t.getText()]:t.getDescendantsOfKind(u.BindingElement).map(s=>s.getName())},jo=e=>{const t=Pt(e,1);if(t===void 0)return[];const s=[`${t}.messages`];for(const r of e.getDescendantsOfKind(u.ForOfStatement)){if(r.getExpression().getText()!==`${t}.messages`)continue;const n=r.getInitializer(),o=i.isVariableDeclarationList(n)?n.getDeclarations()[0]?.getNameNode():void 0;o&&i.isIdentifier(o)&&s.push(`${o.getText()}.body`)}return s},Mo=(e,t,s)=>{const r=t==="workflow"?[`${s}.params`]:jo(e),n=new Set,o=a=>It(a).some(c=>r.some(l=>wt(c.getText(),l)))?!0:Lt(a).some(c=>n.has(c.getText()));for(const a of e.getDescendantsOfKind(u.VariableDeclaration)){const c=a.getInitializer();if(c&&o(c))for(const l of Ro(a))n.add(l)}return{names:n,prefixes:r}},zo=(e,t)=>It(e).some(s=>t.prefixes.some(r=>wt(s.getText(),r)))?!0:Lt(e).some(s=>t.names.has(s.getText())),qo=e=>{if(e===void 0||!i.isPropertyAccessExpression(e))return;const t=[];let s=e;for(;i.isPropertyAccessExpression(s);)t.unshift(s.getName()),s=s.getExpression();const r=t.at(-1);if(!(r===void 0||!i.isIdentifier(s)||!Co.has(s.getText())||t.length<2))return{exportName:r,file:t.slice(0,-1).join("/")}},Bo=(e,t,s)=>{const r=Pt(e,0);if(r===void 0)return[];const n=Mo(e,t,r),o=[];for(const a of e.getDescendantsOfKind(u.CallExpression)){const c=a.getExpression();if(!i.isPropertyAccessExpression(c)||!Do.has(c.getName())||c.getExpression().getText()!==r)continue;const l=a.getArguments()[1];if(!l||!zo(l,n))continue;const f=qo(a.getArguments()[0]);f!==void 0&&o.push({dispatchKind:t,file:s,handlerExport:h(a),line:a.getStartLineNumber(),targetExport:f.exportName,targetFile:f.file})}return o},Vo=(e,t)=>{const s=[];for(const r of e.getDescendantsOfKind(u.CallExpression)){const n=ko(r);if(n===void 0||!Fo.has(n))continue;const o=Ko(r);o!==void 0&&s.push(...Bo(o,n==="defineQueue"?"queue":"workflow",t))}return s},Uo=(e,t)=>{const s=[];for(const r of d(t)){const n=e.getSourceFile(r)??e.addSourceFileAtPath(r);s.push(...Vo(n,g(t,r)))}return s},pt={dbRateLimit:"usesRateLimit",emailGateMiddleware:"usesEmailGate",mask:"usesMask",rateLimit:"usesRateLimit",rls:"usesRls",verifyTurnstile:"usesCaptcha",verifyTurnstileMiddleware:"usesCaptcha"},Wo=/account|credential|member|passkey|session|user/iu,_o=e=>{const t=e.replaceAll(/[^a-z0-9]/giu,"").toLowerCase();return t.endsWith("email")||t.endsWith("emailaddress")},Go=(e,t)=>{const{objects:s,opaque:r}=At(e,t);return zr(s).some(n=>_o(n))?!0:r?void 0:!1},Se=e=>{const t=e.getExpression();if(i.isIdentifier(t))return t.getText();if(i.isPropertyAccessExpression(t))return t.getName()},Ho=e=>{const t=e.getArguments()[0];return!t||!i.isObjectLiteralExpression(t)?{usesCaptcha:!1,usesRateLimit:!1}:{usesCaptcha:!!t.getProperty("captcha"),usesRateLimit:!!t.getProperty("rateLimit")}},Qo=e=>{if(i.isCallExpression(e))return e;if(!i.isIdentifier(e))return;const t=e.getSourceFile().getVariableDeclaration(e.getText())?.getInitializer();return t&&i.isCallExpression(t)?t:void 0},V={usesCaptcha:!1,usesEmailGate:!1,usesMask:!1,usesRateLimit:!1,usesRls:!1},Xo=e=>{const t=Qo(e),s=t?Se(t):void 0;if(t&&s==="protectPublic"){const r=Ho(t);return{...V,usesCaptcha:r.usesCaptcha,usesRateLimit:r.usesRateLimit}}return s!==void 0&&s in pt?{...V,[pt[s]]:!0}:V},Zo=e=>{const t={...V};let s=e;for(;i.isCallExpression(s);){const r=s.getExpression();if(!i.isPropertyAccessExpression(r))break;const n=r.getName()==="use"?s.getArguments()[0]:void 0;if(n){const o=Xo(n);t.usesCaptcha||=o.usesCaptcha,t.usesEmailGate||=o.usesEmailGate,t.usesMask||=o.usesMask,t.usesRateLimit||=o.usesRateLimit,t.usesRls||=o.usesRls}s=r.getExpression()}return t},Jo=e=>{const t=e.getExpression();if(!i.isPropertyAccessExpression(t)||t.getName()!=="insert")return!1;const s=t.getExpression();if(!(i.isPropertyAccessExpression(s)?s.getName()==="db":i.isIdentifier(s)&&s.getText()==="db"))return!1;const r=e.getArguments()[0];return!!(r&&i.isStringLiteral(r)&&Wo.test(r.getLiteralText()))},Yo=new Set(["create","runAfter","runAt","send","sendBatch"]),ea=new Set(["queues","scheduler","workflows"]),ta=e=>{const t=e.getExpression();if(!i.isPropertyAccessExpression(t)||!Yo.has(t.getName()))return!1;let s=t.getExpression();for(;i.isCallExpression(s)||i.isElementAccessExpression(s)||i.isPropertyAccessExpression(s);){if(i.isPropertyAccessExpression(s)&&ea.has(s.getName())){const r=s.getExpression();if(i.isIdentifier(r)&&r.getText()==="ctx")return!0}s=s.getExpression()}return!1},sa=e=>{const t=e.getExpression();if(!i.isPropertyAccessExpression(t)||t.getName()!=="insertManyUnsafe")return!1;const s=t.getExpression();return i.isPropertyAccessExpression(s)?s.getName()==="db":i.isIdentifier(s)&&s.getText()==="db"},Tt=new Set(["generateObject","generateText","streamObject","streamText"]),ra=e=>{const t=Se(e);return t!==void 0&&Tt.has(t)},na=e=>{const t=Se(e);if(t===void 0||!Tt.has(t))return!1;const s=e.getArguments()[0];return!s||!i.isObjectLiteralExpression(s)||s.getProperties().some(r=>i.isSpreadAssignment(r))?!1:!s.getProperty("maxOutputTokens")},ia=new Set(["log","span","trace"]),oa=new Set(["ai"]),aa=new Set(["email","mail"]),ca=new Set(["ai","browser","fetch","mail","notify","queues","sql","storage","workflows"]),B=(e,t)=>e.getDescendantsOfKind(u.PropertyAccessExpression).some(s=>{if(!t.has(s.getName()))return!1;const r=s.getExpression();return i.isIdentifier(r)&&r.getText()==="ctx"}),ua=e=>e.getDescendantsOfKind(u.ThrowStatement).some(t=>{const s=t.getExpression();if(!i.isNewExpression(s))return!1;const r=s.getExpression();return i.isIdentifier(r)&&r.getText()==="Error"}),ft="lunora-advisor-exempt",la=/^[\s*/]+/u,da=/[\w-]/u,ga=e=>{const t=(e.getFirstAncestorByKind(u.VariableStatement)??e).getLeadingCommentRanges().map(s=>s.getText()).join(`
|
|
9
|
-
`);for(const s of t.split(`
|
|
10
|
-
`)){const r=s.replace(la,"");if(!r.startsWith(ft))continue;const n=r.slice(ft.length);if(da.test(n.charAt(0)))continue;const o=n.indexOf("--");return{exempt:!0,exemptReason:(o===-1?"":n.slice(o+2).split("*")[0]??"").trim()}}return{exempt:!1,exemptReason:""}},pa=e=>{let t=!1,s=!1,r=!1,n=!1,o=!1;for(const a of e.getDescendantsOfKind(u.CallExpression))if(Jo(a)&&(o=!0),ta(a)&&(t=!0),sa(a)&&(n=!0),ra(a)&&(s=!0),na(a)&&(r=!0),o&&t&&n&&r)break;return{callsMail:B(e,aa),emitsEvent:B(e,ia),fanOut:t,handlesErrors:e.getDescendantsOfKind(u.TryStatement).length>0,reachesOutbound:B(e,ca),runsAiGeneration:s||B(e,oa),throwsBareError:ua(e),unboundedAiGeneration:r,usesInsertManyUnsafe:n,writesUserTable:o}},fa=(e,t)=>{const s=e.getInitializer();if(!s||!i.isCallExpression(s))return;const r=k(s);if(!r||r.kind!=="query"&&r.kind!=="mutation"&&r.kind!=="action")return;const n=r.receiver?Zo(r.receiver):{usesCaptcha:!1,usesEmailGate:!1,usesMask:!1,usesRateLimit:!1,usesRls:!1};return{...pa(e),...ga(e),...n,exportName:e.getName(),file:t,hasEmailArg:Go(s,r.receiver),kind:r.kind,visibility:r.visibility}},ma=(e,t)=>{const s=[];for(const r of e.getVariableStatements())if(r.isExported())for(const n of r.getDeclarations()){const o=fa(n,t);o&&s.push(o)}return s},xa=(e,t)=>{const s=[];for(const r of d(t)){const n=e.getSourceFile(r)??e.addSourceFileAtPath(r);s.push(...ma(n,g(t,r)))}return s},ha=new Set(["dbRateLimit","rateLimit"]),Ea=e=>{if(!i.isObjectLiteralExpression(e))return;const t=e.getProperty("key");return t&&i.isPropertyAssignment(t)?t.getInitializer():void 0},$a=e=>{const t=e.getArguments()[1];return t&&i.isStringLiteral(t)?t.getLiteralValue():""},ya=e=>i.isArrowFunction(e)?e.getBody():e,Aa=(e,t)=>{const s=S(e.getExpression());if(s===void 0||!ha.has(s))return;const r=e.getArguments()[2];if(!r)return;const n=Ea(r);if(!n)return;const o=ya(n);if(!(!w(o)||O(o)))return{callee:s,exportName:h(e),file:t,limitName:$a(e),line:e.getStartLineNumber()}},Sa=(e,t)=>{const s=[];for(const r of e.getDescendantsOfKind(u.CallExpression)){const n=Aa(r,t);n&&s.push(n)}return s},ba=(e,t)=>{const s=[];for(const r of d(t)){const n=e.getSourceFile(r)??e.addSourceFileAtPath(r);s.push(...Sa(n,g(t,r)))}return s},Na=new Set(["findFirst","findFirstOrThrow","findMany","get"]),va=e=>{const t=e.getExpression();if(!i.isPropertyAccessExpression(t)||!Na.has(t.getName()))return;const s=t.getExpression();if(C(s)){const r=e.getArguments()[0];return r&&i.isStringLiteral(r)?r.getLiteralText():""}if(i.isPropertyAccessExpression(s)&&C(s.getExpression()))return s.getName()},Pa=e=>{let t=e;for(;i.isCallExpression(t);){const s=t.getExpression();if(!i.isPropertyAccessExpression(s))return;if(s.getName()==="query"&&C(s.getExpression())){const r=t.getArguments()[0];return r&&i.isStringLiteral(r)?r.getLiteralText():""}t=s.getExpression()}},wa=e=>{let t=e;for(;i.isAwaitExpression(t)||i.isParenthesizedExpression(t)||i.isNonNullExpression(t)||i.isAsExpression(t);)t=t.getExpression();return t},Ot=(e,t=!1)=>{const s=wa(e);if(i.isIdentifier(s)){if(t)return;const r=G(s);return r===void 0?void 0:Ot(r,!0)}if(i.isCallExpression(s))return va(s)??Pa(s)},Ia=e=>{const t=e.getBody();if(!i.isBlock(t))return[t];const s=[];for(const r of e.getDescendantsOfKind(u.ReturnStatement)){const n=r.getFirstAncestor(a=>i.isArrowFunction(a)||i.isFunctionExpression(a)||i.isFunctionDeclaration(a)),o=r.getExpression();n===e&&o!==void 0&&s.push(o)}return s},La=(e,t)=>{if(!i.isVariableDeclaration(e))return[];const s=e.getInitializer();if(s===void 0||!i.isCallExpression(s))return[];const r=k(s);if(r?.kind!=="query")return[];const n=ht(s);if(n===void 0)return[];const o=r.receiver!==void 0&&es(r.receiver,"output"),a=r.receiver!==void 0&&Et(r.receiver,"use","mask"),c=new Set,l=[];for(const f of Ia(n)){const $=Ot(f);$===void 0||c.has($)||(c.add($),l.push({exportName:e.getName(),file:t,line:f.getStartLineNumber(),table:$,usesMask:a,usesOutput:o,visibility:r.visibility}))}return l},Ta=(e,t)=>{const s=[];for(const r of d(t)){const n=e.getSourceFile(r)??e.addSourceFileAtPath(r),o=g(t,r);for(const a of n.getVariableStatements())if(a.isExported())for(const c of a.getDeclarations())s.push(...La(c,o))}return s},Oa=new Set(["findFirst","findFirstOrThrow","findMany"]),Fa=e=>{const t=e.getExpression();if(!i.isPropertyAccessExpression(t)||!Oa.has(t.getName()))return;const s=t.getExpression();if(i.isPropertyAccessExpression(s)&&s.getName()==="db"||i.isIdentifier(s)&&s.getText()==="db"){const r=e.getArguments()[0];return{options:e.getArguments()[1],table:r&&i.isStringLiteral(r)?r.getLiteralText():""}}if(i.isPropertyAccessExpression(s)){const r=s.getExpression();if(i.isPropertyAccessExpression(r)&&r.getName()==="db"||i.isIdentifier(r)&&r.getText()==="db")return{options:e.getArguments()[0],table:s.getName()}}},Da=e=>{if(!e||!i.isObjectLiteralExpression(e))return[];const t=[];for(const s of e.getProperties())(i.isPropertyAssignment(s)||i.isShorthandPropertyAssignment(s)||i.isMethodDeclaration(s)||i.isGetAccessorDeclaration(s))&&t.push(s.getName());return t},Ca=(e,t)=>{if(!e||!i.isObjectLiteralExpression(e))return;const s=e.getProperty(t);return s&&i.isPropertyAssignment(s)?s.getInitializer():void 0},ka=(e,t)=>{if(!i.isVariableDeclaration(e))return[];const s=e.getInitializer(),r=s&&i.isCallExpression(s)?k(s):void 0;if(!r)return[];const n=[];for(const o of e.getDescendantsOfKind(u.CallExpression)){const a=Fa(o);if(a===void 0)continue;const c=Da(Ca(a.options,"with"));c.length!==0&&n.push({exportName:e.getName(),file:t,line:o.getStartLineNumber(),parentTable:a.table,relations:c,visibility:r.visibility})}return n},Ka=(e,t)=>{const s=[];for(const r of d(t)){const n=e.getSourceFile(r)??e.addSourceFileAtPath(r),o=g(t,r);for(const a of n.getVariableStatements())if(a.isExported())for(const c of a.getDeclarations())s.push(...ka(c,o))}return s},_=e=>{if(i.isStringLiteral(e)||i.isNoSubstitutionTemplateLiteral(e))return e.getLiteralText();if(i.isBinaryExpression(e)&&e.getOperatorToken().getKind()===u.PlusToken){const t=_(e.getLeft()),s=_(e.getRight());return t!==void 0&&s!==void 0?t+s:void 0}},Ra=e=>{let t=e,s=t.getParent();for(;s!==void 0&&i.isBinaryExpression(s)&&s.getOperatorToken().getKind()===u.PlusToken;)t=s,s=t.getParent();return t!==e&&_(t)!==void 0},ja=/(?:^|\/)__tests__\//u,Ma=/\.(?:spec|test)$/u,za=e=>ja.test(e)||Ma.test(e),qa=e=>{const t=e.getParent();if(t!==void 0){if(i.isVariableDeclaration(t)||i.isPropertyAssignment(t)||i.isPropertySignature(t))return t.getName();if(i.isBinaryExpression(t)&&t.getOperatorToken().getKind()===u.EqualsToken)return t.getLeft().getText()}},Ba=(e,t,s)=>Qs(e)?!za(s)&&Xs(qa(t)):!0,Va=(e,t)=>{const s=[],r=[...e.getDescendantsOfKind(u.BinaryExpression),...e.getDescendantsOfKind(u.StringLiteral),...e.getDescendantsOfKind(u.NoSubstitutionTemplateLiteral)],n=new Set;for(const o of r){if(Ra(o))continue;const a=_(o);if(a===void 0)continue;const c=Gs(a);if(c===void 0||!Ba(c,o,t))continue;const l=o.getStartLineNumber(),f=`${String(l)}:${c}`;n.has(f)||(n.add(f),s.push({file:t,kind:c,line:l,preview:Hs(a)}))}return s},Ua=(e,t)=>{const s=[];for(const r of d(t)){const n=e.getSourceFile(r)??e.addSourceFileAtPath(r);s.push(...Va(n,g(t,r)))}return s},Wa=new Set(["findFirst","findFirstOrThrow","findMany"]),_a=e=>{const t=e.getExpression();if(!i.isPropertyAccessExpression(t)||!Wa.has(t.getName()))return;const s=t.getExpression();if(i.isPropertyAccessExpression(s)&&s.getName()==="db"||i.isIdentifier(s)&&s.getText()==="db"){const r=e.getArguments()[0];return{options:e.getArguments()[1],table:r&&i.isStringLiteral(r)?r.getLiteralText():""}}if(i.isPropertyAccessExpression(s)){const r=s.getExpression();if(i.isPropertyAccessExpression(r)&&r.getName()==="db"||i.isIdentifier(r)&&r.getText()==="db")return{options:e.getArguments()[0],table:s.getName()}}},Ga=(e,t)=>{if(!e||!i.isObjectLiteralExpression(e))return;const s=e.getProperty(t);return s&&i.isPropertyAssignment(s)?s.getInitializer():void 0},Ha=(e,t)=>{if(!i.isVariableDeclaration(e))return[];const s=e.getInitializer(),r=s&&i.isCallExpression(s)?k(s):void 0;if(!r)return[];const n=[];for(const o of e.getDescendantsOfKind(u.CallExpression)){const a=_a(o);if(a===void 0)continue;const c=Ga(a.options,"includeDeleted");if(c===void 0)continue;const l=i.isTrueLiteral(c),f=!l&&w(c);!l&&!f||n.push({exportName:e.getName(),file:t,fromArgs:f,hardcodedTrue:l,line:o.getStartLineNumber(),table:a.table,visibility:r.visibility})}return n},Qa=(e,t)=>{const s=[];for(const r of d(t)){const n=e.getSourceFile(r)??e.addSourceFileAtPath(r),o=g(t,r);for(const a of n.getVariableStatements())if(a.isExported())for(const c of a.getDeclarations())s.push(...Ha(c,o))}return s},Xa=new Set(["query","unsafe"]),Za=e=>{if(!i.isPropertyAccessExpression(e)||!Xa.has(e.getName()))return!1;const t=e.getExpression();if(!i.isPropertyAccessExpression(t)||t.getName()!=="sql")return!1;const s=t.getExpression();return i.isIdentifier(s)&&s.getText()==="ctx"},Ja=e=>i.isBinaryExpression(e)||i.isTemplateExpression(e),Ya=e=>e.getFirstAncestorByKind(u.VariableDeclaration)?.getName()??"<module>",ec=(e,t)=>{if(!Za(e.getExpression()))return;const s=e.getArguments()[0];if(!(!s||!Ja(s)))return{exportName:Ya(e),file:t,line:s.getStartLineNumber()}},tc=(e,t)=>{const s=[];for(const r of e.getDescendantsOfKind(u.CallExpression)){const n=ec(r,t);n&&s.push(n)}return s},sc=(e,t)=>{const s=[];for(const r of d(t)){const n=e.getSourceFile(r)??e.addSourceFileAtPath(r);s.push(...tc(n,g(t,r)))}return s},rc=new Set(["createMultipartUpload","delete","download","generateUploadUrl","get","getMetadata","getPresignedUrl","getSignedUrl","getUrl","head","put","resumeMultipartUpload","store","upload"]),nc=(e,t)=>X(e,t,{argIndex:0,matchReceiver:s=>s==="ctx.storage"||s.startsWith("ctx.storage."),methods:rc}),ic=new Map([["generateUploadUrl",1],["getPresignedUrl",1],["getSignedUrl",1],["store",2],["upload",2]]),oc=e=>e&&i.isNumericLiteral(e)?Number(e.getText()):void 0,ac=e=>{if(e===void 0)return{analyzable:!0,presentKeys:[]};if(!i.isObjectLiteralExpression(e))return{analyzable:!1,presentKeys:[]};const t=[];let s,r=!1;for(const n of e.getProperties()){if(i.isSpreadAssignment(n)){r=!0;continue}if(i.isPropertyAssignment(n)){const o=n.getName();t.push(o),o==="expiresInSeconds"&&(s=oc(n.getInitializer()));continue}(i.isShorthandPropertyAssignment(n)||i.isMethodDeclaration(n))&&t.push(n.getName())}return{analyzable:!r,expiresInSeconds:s,presentKeys:t}},cc=e=>{if(!i.isPropertyAccessExpression(e))return;const t=e.getName(),s=ic.get(t);if(s===void 0)return;const r=e.getExpression().getText();return r==="ctx.storage"||r.startsWith("ctx.storage.")?{method:t,optionsIndex:s}:void 0},uc=(e,t)=>{const s=cc(e.getExpression());if(s!==void 0)return{exportName:h(e),file:t,line:e.getStartLineNumber(),method:s.method,...ac(e.getArguments()[s.optionsIndex])}},lc=(e,t)=>{const s=[];for(const r of e.getDescendantsOfKind(u.CallExpression)){const n=uc(r,t);n&&s.push(n)}return s},dc=(e,t)=>{const s=[];for(const r of d(t)){const n=e.getSourceFile(r)??e.addSourceFileAtPath(r);s.push(...lc(n,g(t,r)))}return s},gc=new Set(["RegisteredAction","RegisteredMutation","RegisteredQuery"]),be=e=>{const t=e.getType(),s=t.getAliasSymbol()?.getName()??t.getSymbol()?.getName();return s!==void 0&&gc.has(s)?s:void 0},Ft=e=>{const t=e.getInitializer();return t===void 0?!1:i.isCallExpression(t)||i.isIdentifier(t)||i.isPropertyAccessExpression(t)},Dt={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."},pc={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."},Ne=(e,t,s,r,n)=>({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 ${r.toString()}) has type \`${s}\` but was not registered — ${n.cause}.`,facing:"INTERNAL",level:"WARN",metadata:{exportName:t,filePath:e,line:r,typeName:s},name:"procedure_not_registered",remediation:`Assign the builder chain directly: \`export const ${t} = query.input({ … }).query(handler);\`. ${n.remediation}`,title:"Procedure exists at runtime but is missing from the generated API"}),fc=(e,t,s)=>{const r=[];for(const n of e.getVariableStatements().filter(o=>o.isExported()))for(const o of n.getDeclarations()){const a=o.getName();if(s.has(`${t}:${a}`)||!Ft(o))continue;const c=be(o);c!==void 0&&r.push(Ne(t,a,c,o.getStartLineNumber(),Dt))}return r},mc=(e,t,s)=>{if(s.has(`${t}:default`))return[];const r=[];for(const n of e.getExportAssignments().filter(o=>!o.isExportEquals())){const o=be(n.getExpression());o!==void 0&&r.push(Ne(t,"default",o,n.getStartLineNumber(),Dt))}return r},xc=(e,t,s)=>{const r=[];for(const n of e.getExportDeclarations().filter(o=>o.getModuleSpecifier()===void 0))for(const o of n.getNamedExports()){const a=o.getAliasNode()?.getText()??o.getName();if(s.has(`${t}:${a}`))continue;const c=o.getLocalTargetDeclarations().find(f=>i.isVariableDeclaration(f));if(c===void 0||!Ft(c))continue;const l=be(c);l!==void 0&&r.push(Ne(t,a,l,o.getStartLineNumber(),pc))}return r},hc=(e,t,s)=>[...fc(e,t,s),...mc(e,t,s),...xc(e,t,s)],Ec=(e,t,s)=>{const r=new Set(s.map(o=>`${o.filePath}:${o.exportName}`)),n=[];for(const o of d(t)){const a=e.getSourceFile(o);a!==void 0&&n.push(...hc(a,g(t,o),r))}return n.toSorted((o,a)=>o.cacheKey.localeCompare(a.cacheKey))},$c=new Set(["when","where"]),Ee=new Set(["definePolicy","defineShape"]),yc=e=>{if(!i.isCallExpression(e))return;const t=e.getExpression();if(i.isPropertyAccessExpression(t)){const r=t.getName();return Ee.has(r)?r:void 0}if(!i.isIdentifier(t))return;for(const r of t.getSymbol()?.getDeclarations()??[])if(i.isImportSpecifier(r)){const n=r.getNameNode().getText();return Ee.has(n)?n:void 0}const s=t.getText();return Ee.has(s)?s:void 0},Ac=e=>i.isObjectLiteralExpression(e)&&e.getProperties().length===0,Ct=e=>{if(e!==void 0){if(i.isReturnStatement(e)&&e.getExpression()===void 0||e.getKind()===u.UndefinedKeyword||e.getText()==="undefined")return"undefined";if(Ac(e))return"empty-object";if(i.isParenthesizedExpression(e))return Ct(e.getExpression())}},kt=e=>e.getAncestors().find(t=>i.isArrowFunction(t)||i.isFunctionExpression(t)||i.isFunctionDeclaration(t)),Kt=e=>e.getDescendantsOfKind(u.ReturnStatement).filter(t=>kt(t)===e),Rt=e=>e.getDescendantsOfKind(u.ConditionalExpression).filter(t=>kt(t)===e),Sc=e=>{const t=Kt(e);return t.length>1?!0:t.some(s=>s.getFirstAncestorByKind(u.IfStatement)!==void 0)||Rt(e).length>0},bc=e=>{const t=[],s=e.getBody();i.isBlock(s)||t.push(s);for(const r of Kt(e)){const n=i.isReturnStatement(r)?r.getExpression():void 0;t.push(n??r)}for(const r of Rt(e))t.push(r.getWhenTrue(),r.getWhenFalse());return t},Nc=e=>{for(const t of e.getAncestors())if(i.isVariableDeclaration(t)){const s=t.getNameNode();if(i.isIdentifier(s))return s.getText()}return"<anonymous>"},vc=(e,t,s)=>{if(!i.isCallExpression(e))return[];const[r]=e.getArguments();if(!r||!i.isObjectLiteralExpression(r))return[];const n=[];for(const o of r.getProperties()){if(!i.isPropertyAssignment(o)||!$c.has(o.getName()))continue;const a=o.getInitializer();if(!(!a||!(i.isArrowFunction(a)||i.isFunctionExpression(a)))&&Sc(a))for(const c of bc(a)){const l=Ct(c);l!==void 0&&n.push({exportName:Nc(e),file:s,form:l,key:o.getName(),line:c.getStartLineNumber(),owner:t})}}return n},Pc=(e,t)=>{const s=[];for(const r of e.getDescendantsOfKind(u.CallExpression)){const n=yc(r);n!==void 0&&s.push(...vc(r,n,t))}return s},wc=(e,t)=>{const s=[];for(const r of d(t)){const n=e.getSourceFile(r)??e.addSourceFileAtPath(r);s.push(...Pc(n,g(t,r)))}return s},Ic=new Set(["query","upsert","upsertMany"]),Lc=e=>{if(!i.isPropertyAccessExpression(e))return;const t=e.getName();if(Ic.has(t))return e.getExpression().getText()==="ctx.vectors"?t:void 0},Tc=e=>{if(!i.isObjectLiteralExpression(e))return;const t=e.getProperty("namespace");return t&&i.isPropertyAssignment(t)?t.getInitializer():void 0},Oc=(e,t)=>{const s=Lc(e.getExpression());if(s===void 0)return;const r=e.getArguments()[1];if(!r)return;const n=Tc(r);if(!(!n||!w(n)||O(n)))return{exportName:h(e),file:t,line:e.getStartLineNumber(),method:s}},Fc=(e,t)=>{const s=[];for(const r of e.getDescendantsOfKind(u.CallExpression)){const n=Oc(r,t);n&&s.push(n)}return s},Dc=(e,t)=>{const s=[];for(const r of d(t)){const n=e.getSourceFile(r)??e.addSourceFileAtPath(r);s.push(...Fc(n,g(t,r)))}return s},Cc=e=>{const t=e.getExpression();if(!i.isPropertyAccessExpression(t)||t.getName()!=="get")return!1;const s=t.getExpression();return i.isPropertyAccessExpression(s)?s.getName()==="workflows":i.isIdentifier(s)&&s.getText()==="workflows"},kc=e=>{const t=e.getArguments()[0];return t&&i.isStringLiteral(t)?t.getLiteralText():""},Kc=(e,t)=>{const s=[];for(const r of d(t)){const n=e.getSourceFile(r)??e.addSourceFileAtPath(r),o=g(t,r);for(const a of n.getDescendantsOfKind(u.CallExpression)){if(!Cc(a))continue;const c=Ys(a);c!==""&&s.push({exportName:c,file:o,line:a.getStartLineNumber(),workflow:kc(a)})}}return s},Rc=".lunora-schema.json",A=(e,t)=>{E(e)&&xt(e,"utf8")===t||Ht(e,t,"utf8")},P=(e,t)=>{if(t===""){Qt(e,{force:!0});return}A(e,t)},jc=e=>{const t=p(e,"package.json");if(E(t))try{const s=JSON.parse(xt(t,"utf8"));return typeof s.version=="string"&&s.version!==""?s.version:void 0}catch{return}},Mc=()=>{const e=process.env.LUNORA_CODEGEN_TIMING;return e!==void 0&&e!==""},zc=e=>{let t=E(e)?e:fe(e);for(;t&&t!==fe(t);){const s=p(t,"tsconfig.json");if(E(s))return s;t=fe(t)}},mt=e=>e.replaceAll("\\","/"),qc=(e,t)=>{const s=new Map,r=new Map,n=new Map;for(const o of e)s.set(o.name,`workflow "${o.exportName}"`),r.set(o.bindingName,`workflow "${o.exportName}"`),n.set(o.className,`workflow "${o.exportName}"`);for(const o of t){const a=s.get(o.name);if(a!==void 0)throw new R("DUPLICATE_WORKFLOW_NAME",`Duplicate deployed name "${o.name}": produced by both ${a} and agent "${o.exportName}". Workflow and agent names share the same wrangler workflows[] array and must be unique together.`,{status:500});const c=r.get(o.bindingName);if(c!==void 0)throw new R("DUPLICATE_WORKFLOW_BINDING",`Duplicate binding "${o.bindingName}": produced by both ${c} and agent "${o.exportName}". Workflow and agent bindings share the same wrangler workflows[] array and must be unique together.`,{status:500});const l=n.get(o.className);if(l!==void 0)throw new R("DUPLICATE_WORKFLOW_CLASS",`Duplicate generated class "${o.className}": produced by both ${l} and agent "${o.exportName}". Workflow and agent export names must yield unique generated class names.`,{status:500})}},Bc=e=>{const t=zc(e);return t?new et({skipAddingFilesFromTsConfig:!1,tsConfigFilePath:t,useInMemoryFileSystem:!1}):new et({skipAddingFilesFromTsConfig:!0,useInMemoryFileSystem:!1})},Ou=(e,t)=>{const s=d(t),r=p(t,"schema.ts");E(r)&&s.push(r);for(const c of s){const l=e.getSourceFile(c);l===void 0?e.addSourceFileAtPath(c):l.refreshFromFileSystemSync()}const n=new Set(s.map(c=>mt(c))),o=mt(t),a=`${o}/`;for(const c of e.getSourceFiles()){const l=c.getFilePath();(l===o||l.startsWith(a))&&!n.has(l)&&e.removeSourceFile(c)}},Fu=e=>{const t=Mc(),s=t?me.now():0,r=p(e.projectRoot,e.lunoraDirectory??"lunora"),n=p(r,"schema.ts");if(!E(n))throw new R("INTERNAL",`schema.ts not found at ${n}`);const o=e.project??Bc(r);or(ss);const a=_s(o,n,e.projectRoot),c=ts(o,r),l=Is(o,r),f=Ds(o,r),$=Zs(o,r),I=Ks(o,r),K=Ti(o,r),ve=kn(o,r),N=er(o,r),F=qs(o,r),v=rs(o,r);qc(N,v);const Z=ls(o,r,N,v),D=us(o,r),j=e.lint===!1?void 0:Jt({adminRoutes:$r(o,r),aiRawRuns:br(o,r),aiToolSideEffects:Dr(o,r),argumentDerivedFetches:Rr(o,r),argumentValidators:Qr(o,r),authApiCalls:cs(o,r),authConfigs:an(o,r),browserUrlAccesses:gn(o,r),configCalls:yn(o,r),containerKeyAccesses:Sn(o,r),containerOverrides:Ln(o,r),containers:D,exportSinks:Mn(o,r),failOpenGuards:_n(o,r),flagSecurityDefaults:ni(o,r),geoIndexUsages:ai(o,r),httpActionGuards:mi(o,r),httpHeaderWrites:vi(o,r),identityClaimReads:Ri(o,r),imageDeliveryUrlAccesses:qi(o,r),inserts:Ls(o,r),kvKeyAccesses:Vi(o,r),mailRecipientAccesses:Qi(o,r),maskProcedures:Ts(o,r),maskStrategies:Os(o,r),mutatorWrites:to(o,r),nondeterministicCalls:Rs(o,r),normalizeIdAuthorizations:Eo(o,r),notifyCalls:Ms(o,r),notifyConfig:js(o,r),ownerFieldWrites:Po(o,r,c),unrestrictedWhereBranches:wc(o,r),paymentWebhooks:Oo(o,r),privilegedDispatches:Uo(o,r),procedureProtections:xa(o,r),queries:as(o,r),queues:F,r2sqlCalls:Bs(o,r),ratelimitKeySelectors:ba(o,r),rawRowReturns:Ta(o,r),relationLoads:Ka(o,r),rlsProcedures:Vs(o,r),schema:a,secretLiterals:Ua(o,r),shapes:$,softDeleteReads:Qa(o,r),sqlInterpolations:sc(o,r),storageKeyAccesses:nc(o,r),storageUploads:dc(o,r),vectorNamespaceAccesses:Dc(o,r),workflowCalls:Kc(o,r),workflows:N,wranglerVariables:e.wranglerVariables}),Pe=j===void 0?[]:[...Xt(j,{source:"static"}),...Ec(o,r,c)],jt=Us(o,r),Mt=Fs(o,r),J=Js(o,r),zt=Hn(o,r),we=ar(zt,cr(e.projectRoot,e.target)),y=we.usage,Y=y.ai,ee=y.payments,Ie=y.kv,Le=y.access,te=E(p(r,"flags.ts")),qt=te?ws(o,r):[],se=E(p(r,"notify.ts")),re=y.hyperdrive,ne=Ws(o,r),Bt=ne.usesSandboxBrowser||ne.usesSandboxContainer,ie=y.browser||ne.usesSandboxBrowser,oe=y.images,ae=y.analytics,Te=y.pipelines,ce=y.r2sql,ue=y.x402,Oe=zs(e.projectRoot),L=Oe??new Set,M=Jn(y,{containerCount:D.length,cronCount:Z.length,dependencies:L,hasPaymentTables:Zn(a.tables),queueCount:F.length,storageColumnCount:Object.keys(ds(a)).length,storageRuleCount:J.rules.length,vectorIndexCount:a.vectorIndexes.length,workflowCount:N.length}),T=L.has("lunorash");dr(a,Oe);const Fe=t?me.now():0,De=gs(a,T),Ce=ps({agents:v,functions:c,httpRoutes:l,mutators:I,useUmbrella:T,workflows:N}),ke=fs({agents:v,containers:D,env:ve,hasAccessFacade:Le,hasAi:Y,hasAnalytics:ae,hasBrowser:ie,hasFlags:te,hasHyperdrive:re,hasImages:oe,hasKv:Ie,hasNotify:se,hasPayments:ee,hasPipelines:Te,hasR2sql:ce,hasX402:ue,identity:K,queues:F,schema:a,storageRuleBuckets:J.rules.map(m=>m.bucket),useUmbrella:T,workflows:N}),Ke=ms({agents:v,functions:c,migrations:f,mutators:I,shapes:$,useUmbrella:T,usesSandbox:Bt}),le=ur(a,f.map(m=>m.id)),Re=xs({advisories:Pe,advisorProcedures:j?.procedureProtections??[],agents:v,containers:D,env:ve,flagKeys:qt,hasAccessFacade:Le,hasAi:Y,hasAnalytics:ae,hasBrowser:ie,hasFlags:te,hasHyperdrive:re,hasImages:oe,hasKv:Ie,hasNotify:se,hasPayments:ee,hasPipelines:Te,hasR2sql:ce,hasX402:ue,maskMetadata:Mt,mutators:I,queues:F,rlsMetadata:jt,schema:a,schemaSnapshot:le,shapes:$,storageRules:J,studioFeatures:M,useUmbrella:T,workflows:N}),je=hs($,L.has("@lunora/db"),T),Me=Es(D,a.jurisdiction),ze=$s(N),qe=ys(v),Be=As(F),Ve=Ss(Z),Ue=bs(a.vectorIndexes),z=Ns(a,T),We=vs(L.has("@lunora/seed")),q=e.apiSpec??"openapi",de=q==="openapi"||q==="both",ge=q==="openrpc"||q==="both",_e=tr({emailAgents:v.filter(m=>m.onEmail===!0).map(m=>({bindingName:m.bindingName,exportName:m.exportName})),hasAccess:L.has("@lunora/cloudflare-access"),hasAi:Y,hasAnalytics:ae,hasAuth:L.has("@lunora/auth"),hasBrowser:ie,hasFramework:L.has("@lunora/astro")||L.has("@lunora/svelte")||L.has("@lunora/vue"),hasGlobal:a.tables.some(m=>m.shardMode==="global"&&m.globalBackend!=="hyperdrive"),hasHyperdrive:re,hasHyperdriveGlobal:a.tables.some(m=>m.shardMode==="global"&&m.globalBackend==="hyperdrive"),hasImages:oe,hasKv:M.kv,hasNotify:se,hasPayments:ee,hasR2sql:ce,hasQueue:F.some(m=>m.mode==="push"),hasScheduler:M.scheduler,hasStorage:M.storage,hasVectors:a.vectorIndexes.length>0,hasWorkflow:N.length>0,hasX402:ue,identity:K,jurisdiction:a.jurisdiction,useUmbrella:T,voiceAgents:v.filter(m=>m.voice===!0&&m.voiceBindingName!==void 0).map(m=>({bindingName:m.voiceBindingName,exportName:m.exportName})),wantsOpenApi:de,wantsOpenRpc:ge}),Ge=jc(e.projectRoot),He=sr({functions:c,httpRoutes:l,version:Ge}),Qe=nr({functions:c,version:Ge}),Xe=`${JSON.stringify(He,void 0,2)}
|
|
11
|
-
`,Ze=`${JSON.stringify(Qe,void 0,2)}
|
|
12
|
-
`,Je=rr(He),Ye=ir(Qe),pe=p(r,Rc),Vt=E(pe),x=p(r,"_generated");if(e.dryRun||(E(x)||Gt(x,{recursive:!0}),A(p(x,"app.ts"),_e),A(p(x,"dataModel.ts"),De),A(p(x,"api.ts"),Ce),A(p(x,"server.ts"),ke),A(p(x,"functions.ts"),Ke),A(p(x,"shard.ts"),Re),A(p(x,"crons.ts"),Ve),A(p(x,"vectors.ts"),Ue),A(p(x,"drizzle.global.ts"),z.global),A(p(x,"drizzle.shard.ts"),z.shard),P(p(x,"containers.ts"),Me),P(p(x,"workflows.ts"),ze),P(p(x,"agents.ts"),qe),P(p(x,"queues.ts"),Be),P(p(x,"seed.ts"),We),P(p(x,"collections.ts"),je),P(p(x,"openapi.json"),de?Xe:""),P(p(x,"openapi.ts"),de?Je:""),P(p(x,"openrpc.json"),ge?Ze:""),P(p(x,"openrpc.ts"),ge?Ye:""),(!Vt||e.updateSchemaBaseline===!0)&&A(pe,Zt(le))),t){const m=me.now(),Ut=Math.round(m-s),Wt=Math.round(Fe-s),_t=Math.round(m-Fe);console.error(`@lunora/codegen: codegen took ${Ut.toString()}ms (discovery ${Wt.toString()}ms, emit ${_t.toString()}ms)`)}return{advisories:Pe,advisorContext:j,agents:v,containers:D,cronTriggers:Ps(Z),generated:{agents:qe,api:Ce,app:_e,collections:je,containers:Me,crons:Ve,dataModel:De,drizzleGlobal:z.global,drizzleShard:z.shard,functions:Ke,openApi:Xe,openApiModule:Je,openRpc:Ze,openRpcModule:Ye,queues:Be,seed:We,server:ke,shard:Re,vectors:Ue,workflows:ze},outputDirectory:x,platformDiagnostics:we.diagnostics,queues:F,schemaSnapshot:le,schemaSnapshotPath:pe,workflows:N}};export{Rc as SCHEMA_SNAPSHOT_FILENAME,Bc as createCodegenProject,Ou as refreshCodegenProject,Fu as runCodegen};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{Node as s,SyntaxKind as a}from"ts-morph";import{listLunoraSourceFiles as E,lunoraRelativePath as P}from"./discoverFunctions-CVYkUBTm.mjs";const p=e=>{if(e.getText()!=="args")return!1;const t=e.getParent();return s.isPropertyAccessExpression(t)&&t.getNameNode()===e?!1:!(s.isPropertyAssignment(t)&&t.getNameNode()===e)},m=e=>{if(e.getText()!=="ctx")return!1;const t=e.getParent();return s.isPropertyAccessExpression(t)&&t.getNameNode()===e?!1:!(s.isPropertyAssignment(t)&&t.getNameNode()===e)},d=e=>s.isIdentifier(e)?m(e):e.getDescendantsOfKind(a.Identifier).some(t=>m(t)),x=(e,t)=>{if(e.getText()!==t)return!1;const r=e.getParent();return s.isPropertyAccessExpression(r)&&r.getNameNode()===e?!1:!(s.isPropertyAssignment(r)&&r.getNameNode()===e)},A=e=>{let t=e;for(;s.isPropertyAccessExpression(t)||s.isElementAccessExpression(t)||s.isNonNullExpression(t);)t=t.getExpression();return s.isIdentifier(t)?t:void 0},T=e=>{if(s.isIdentifier(e))return e.getText();if(s.isPropertyAccessExpression(e))return e.getName()},N=e=>s.isIdentifier(e)?p(e):e.getDescendantsOfKind(a.Identifier).some(t=>p(t)),u=e=>{if(!s.isIdentifier(e))return;const t=e.getText(),r=e.getFirstAncestor(o=>s.isArrowFunction(o)||s.isFunctionExpression(o)||s.isFunctionDeclaration(o));if(r===void 0)return;const n=e.getStart();let i,g=-1;for(const o of r.getDescendantsOfKind(a.VariableDeclaration)){if(o.getName()!==t)continue;const c=o.getInitializer(),f=o.getStart();c!==void 0&&f<n&&f>g&&(i=c,g=f)}return i},w=e=>{if(N(e))return!0;const t=u(e);return t!==void 0&&N(t)},O=e=>{if(d(e))return!0;const t=u(e);if(t!==void 0&&d(t))return!0;const r=t??e;return(s.isIdentifier(r)?[r]:r.getDescendantsOfKind(a.Identifier)).some(n=>{const i=u(n);return i!==void 0&&d(i)})},l=(e,t)=>s.isIdentifier(e)?x(e,t):e.getDescendantsOfKind(a.Identifier).some(r=>x(r,t)),C=(e,t)=>{if(l(e,t))return!0;const r=u(e);if(r!==void 0&&l(r,t))return!0;const n=A(e);if(n!==void 0){const i=u(n);return i!==void 0&&l(i,t)}return!1},y=e=>{for(const t of e.getAncestors())if(s.isVariableDeclaration(t)&&t.getVariableStatement()?.hasExportKeyword()===!0)return t.getName();return"<module>"},I=new Set(["withIndex","withSearchIndex"]),S=e=>{const t=e.getExpression();if(!s.isPropertyAccessExpression(t)||t.getName()!=="query")return!1;const r=t.getExpression();return s.isPropertyAccessExpression(r)?r.getName()==="db":s.isIdentifier(r)&&r.getText()==="db"},h=e=>{const t=[];let r=e;for(;;){const n=r.getParent();if(!n||!s.isPropertyAccessExpression(n))break;const i=n.getParent();if(!i||!s.isCallExpression(i))break;t.push(n.getName()),r=i}return t},v=/\b[A-Za-z_$][\w$]*\._id\s*===?[^=]/u,b=e=>{let t=e;for(;;){const r=t.getParent();if(!r||!s.isPropertyAccessExpression(r))return!1;const n=r.getParent();if(!n||!s.isCallExpression(n))return!1;if(r.getName()==="filter"){const i=n.getArguments()[0];if(i&&v.test(i.getText()))return!0}t=n}},D=e=>{const t=e.getArguments()[0];return t&&s.isStringLiteral(t)?t.getLiteralText():""},L=(e,t)=>{const r=[];for(const n of E(t)){const i=e.getSourceFile(n)??e.addSourceFileAtPath(n),g=P(t,n);for(const o of i.getDescendantsOfKind(a.CallExpression)){if(!S(o))continue;const c=h(o);c.includes("filter")&&r.push({exportName:y(o),file:g,filtersPrimaryKey:b(o),hasFilter:!0,hasIndex:c.some(f=>I.has(f)),line:o.getStartLineNumber(),table:D(o)})}}return r};export{O as a,C as b,T as c,l as d,y as e,w as i,N as r,u as s,L as y};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{LunoraError as L}from"@lunora/errors";import{isValidCronExpression as A,compileCronSchedule as b,CRON_SCHEDULE_KINDS as O}from"@lunora/scheduler";import{SyntaxKind as p,Node as n}from"ts-morph";import{diagnosticAt as f}from"./CodegenDiagnosticError-DPezpZTz.mjs";import{listLunoraSourceFiles as S}from"./discoverFunctions-CVYkUBTm.mjs";import{E as $}from"./module-specifiers-8FEEiUcv.mjs";import{n as I}from"./paths-BmX5O1sG.mjs";const j=new Set([...O,"cron"]),y=e=>{const t=e.getSymbol();if(!t)return e.getText()==="cronJobs";for(const r of t.getDeclarations())if(n.isImportSpecifier(r))return $(r.getImportDeclaration().getModuleSpecifierValue())?r.getNameNode().getText()==="cronJobs":!1;return!1},R=e=>{const t=new Set;for(const r of e.getVariableDeclarations()){const i=r.getInitializer();if(i?.getKind()!==p.CallExpression)continue;const a=i.getExpression();n.isIdentifier(a)&&y(a)&&t.add(r.getName())}return t},P=e=>{let t=e;for(;n.isCallExpression(t)||n.isPropertyAccessExpression(t);)t=t.getExpression();return n.isIdentifier(t)?t.getText():void 0},C=(e,t)=>{const r=e.getArguments()[t];return r&&(n.isStringLiteral(r)||n.isNoSubstitutionTemplateLiteral(r))?r.getLiteralValue():void 0},_=(e,t)=>{if(n.isStringLiteral(e)||n.isNoSubstitutionTemplateLiteral(e)||n.isNumericLiteral(e))return e.getLiteralValue();if(n.isTrueLiteral(e))return!0;if(n.isFalseLiteral(e))return!1;if(n.isPrefixUnaryExpression(e)&&e.getOperatorToken()===p.MinusToken){const r=e.getOperand();if(n.isNumericLiteral(r))return-r.getLiteralValue()}if(n.isObjectLiteralExpression(e))return g(e,t);if(n.isArrayLiteralExpression(e))return e.getElements().map(r=>_(r,t));throw f(e,`Cron job "${t}" passes a non-static value where a literal is required; codegen can only read literals.`,{code:"CRON_NON_STATIC_VALUE",name:"LunoraError",status:500})},g=(e,t)=>{const r={};for(const i of e.getProperties()){if(!n.isPropertyAssignment(i))throw f(i,`Cron job "${t}" uses an unsupported object property (shorthand/spread/method) where a static literal is required.`,{code:"CRON_NON_STATIC_VALUE",name:"LunoraError",status:500});const a=i.getInitializer();a&&(r[i.getName()]=_(a,t))}return r},x=(e,t,r)=>{const i=e.getArguments()[t];if(!i||!n.isPropertyAccessExpression(i))throw f(e,`Cron job "${r}" must reference a function statically (e.g. internal.email.digest); codegen cannot resolve a dynamic reference.`,{code:"CRON_NON_STATIC_FN",name:"LunoraError",status:500});const a=i.getName(),o=i.getExpression();if(!n.isPropertyAccessExpression(o))throw f(i,`Cron job "${r}" function reference must be of the form internal.file.fn (two property accesses).`,{code:"CRON_NON_STATIC_FN",name:"LunoraError",status:500});const s=o.getName();return`${I(s)}:${a}`},h=e=>({workflow:{binding:e.bindingName,exportName:e.exportName}}),w=e=>({workflow:{binding:e.bindingName,exportName:e.exportName}}),T=(e,t,r,i,a,o)=>{const s=e.getExpression();if(!n.isIdentifier(s)||s.getText()!==t)return;const c=r.get(e.getName());if(c)return o(c);throw f(e,`Cron job "${i}" targets ${t}.${e.getName()}, but no such ${a} is declared in lunora/${a}s.ts.`,{code:"CRON_NON_STATIC_FN",name:"LunoraError",status:500})},D=(e,t,r,i,a)=>{const o=e.getArguments()[t];if(o&&n.isPropertyAccessExpression(o)){const s=T(o,"workflows",i,r,"workflow",h);return s||T(o,"agents",a,r,"agent",w)||{functionPath:x(e,t,r)}}if(o&&n.isIdentifier(o)){const s=i.get(o.getText()),c=a.get(o.getText());if(s&&c)throw f(o,`Cron job "${r}" references "${o.getText()}", which is ambiguous: a workflow and an agent are both declared under that name.`,{code:"CRON_NON_STATIC_FN",name:"LunoraError",status:500});if(s)return h(s);if(c)return w(c);throw f(o,`Cron job "${r}" references "${o.getText()}", which is neither a function (internal.file.fn / api.file.fn) nor a declared workflow in lunora/workflows.ts nor a declared agent in lunora/agents.ts.`,{code:"CRON_NON_STATIC_FN",name:"LunoraError",status:500})}return{functionPath:x(e,t,r)}},k=(e,t,r,i,a)=>{const o=t.getName();if(!j.has(o)||!r.has(P(t.getExpression())??""))return;const s=C(e,0);if(s===void 0||s.trim()==="")throw f(e,`A cron ".${o}(...)" registration must pass a non-empty string-literal name as its first argument.`,{code:"CRON_NAME_NOT_STATIC",name:"LunoraError",status:500});let c;if(o==="cron"){const l=C(e,1);if(l===void 0)throw f(e,`Cron job "${s}" must pass a string-literal cron expression to ".cron(...)".`,{code:"CRON_EXPR_NOT_STATIC",name:"LunoraError",status:500});if(!A(l))throw f(e,`Cron job "${s}" has an invalid cron expression "${l}" — expected 5 or 6 space-separated fields.`,{code:"CRON_EXPR_INVALID",name:"LunoraError",status:500});c=l}else{const l=e.getArguments()[1];if(!l||!n.isObjectLiteralExpression(l))throw f(e,`Cron job "${s}" must pass an object-literal schedule to ".${o}(...)".`,{code:"CRON_SCHEDULE_NOT_STATIC",name:"LunoraError",status:500});c=b(o,g(l,s))}const u=D(e,2,s,i,a),m=e.getArguments()[3];return{args:m&&n.isObjectLiteralExpression(m)?g(m,s):{},cron:c,name:s,...u}},F=e=>{const t=new Set;for(const r of e){if(t.has(r.name))throw new L("DUPLICATE_CRON_NAME",`Duplicate cron job name "${r.name}": cron names must be unique across the project.`,{status:500});t.add(r.name)}},J=(e,t,r=[],i=[])=>{const a=S(t),o=[],s=new Map(r.map(u=>[u.exportName,u])),c=new Map(i.map(u=>[u.exportName,u]));for(const u of a){const m=e.getSourceFile(u)??e.addSourceFileAtPath(u),l=R(m);if(l.size!==0)for(const d of m.getDescendantsOfKind(p.CallExpression)){const N=d.getExpression();if(!n.isPropertyAccessExpression(N))continue;const E=k(d,N,l,s,c);E&&o.push(E)}}return o.sort((u,m)=>u.name.localeCompare(m.name)),F(o),o};export{J as default};
|