@lunora/codegen 1.0.0-alpha.82 → 1.0.0-alpha.83

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (24) hide show
  1. package/dist/index.d.mts +584 -549
  2. package/dist/index.d.ts +584 -549
  3. package/dist/index.mjs +1 -1
  4. package/dist/packem_shared/DEFAULT_TARGET-CH5disA3.mjs +1 -0
  5. package/dist/packem_shared/GENERATED_HEADER-oy7DTIDi.mjs +1 -0
  6. package/dist/packem_shared/{OPENRPC_VERSION-IKkrtXye.mjs → OPENRPC_VERSION-K3RTK2CP.mjs} +1 -1
  7. package/dist/packem_shared/SCHEMA_SNAPSHOT_FILENAME-ZIqaP_TZ.mjs +9 -0
  8. package/dist/packem_shared/{buildOpenApiDocument-XeZ1ycwi.mjs → buildOpenApiDocument-Blf3mpIz.mjs} +1 -1
  9. package/dist/packem_shared/describeErrorLevelFindings-IhNx9gPr.mjs +1 -0
  10. package/dist/packem_shared/discover-queries-Bhu9SNsy.mjs +1 -0
  11. package/dist/packem_shared/discoverCrons-DLwFH_K5.mjs +1 -0
  12. package/dist/packem_shared/discoverMaskProcedures-ZewKJLXx.mjs +1 -0
  13. package/dist/packem_shared/{discoverQueries-2A0lbpxV.mjs → discoverQueries-g4qZzLpl.mjs} +1 -1
  14. package/dist/packem_shared/discoverSchema-4nJgoLaJ.mjs +1 -0
  15. package/dist/packem_shared/{emit-05q6XTbd.mjs → emit-B7IUlWwi.mjs} +265 -215
  16. package/dist/packem_shared/{emitApp-C2DhPKWE.mjs → emitApp-jRD2D9kI.mjs} +111 -37
  17. package/package.json +10 -10
  18. package/dist/packem_shared/DEFAULT_TARGET-BYPEwgZu.mjs +0 -1
  19. package/dist/packem_shared/GENERATED_HEADER-Cphn03Kf.mjs +0 -1
  20. package/dist/packem_shared/SCHEMA_SNAPSHOT_FILENAME-DBD0oti8.mjs +0 -12
  21. package/dist/packem_shared/discover-queries-Ctpk9SA-.mjs +0 -1
  22. package/dist/packem_shared/discoverCrons-CwtPaymU.mjs +0 -1
  23. package/dist/packem_shared/discoverMaskProcedures-DQ-4yUUK.mjs +0 -1
  24. package/dist/packem_shared/discoverSchema-CaTD2Sdx.mjs +0 -1
@@ -1,4 +1,4 @@
1
- import{n as S,w as E}from"./emit-05q6XTbd.mjs";const D=e=>`has${e.charAt(0).toUpperCase()}${e.slice(1)}`,m=S.map(({appMethod:e,key:t})=>[D(t),e.method,e.configKey,e.doc]),v=e=>m.some(([t])=>e[t]),A=e=>e?['import * as lunoraIdentityContract from "../identity.js";']:[],R=(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";']:[],j=e=>{const{hasAccess:t,hasAuth:r,hasFramework:a,hasGlobal:n,hasHyperdriveGlobal:o,hasKv:l,hasQueue:s,hasScheduler:u,hasStorage:d,hasWorkflow:h,useUmbrella:c,wantsOpenApi:p,wantsOpenRpc:b}=e,i=c?"lunorash/runtime":"@lunora/runtime",g=["ExecutionContextLike","HttpRouterLike","LunoraWorker","Route","ScheduledControllerLike","ShardNamespaceLike","WorkerOptions"];n&&g.push("GlobalIntrospector"),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";']:[],...R(t,r),...n?['import type { D1CtxDbOptions, D1DatabaseLike, D1Exec } from "@lunora/d1";','import { createD1CtxDb, facetGlobalColumn, 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(l),...u?['import type { DurableObjectNamespaceLike } from "@lunora/scheduler";','import { createScheduler } from "@lunora/scheduler";']:[],...d?['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}";`,"",...A(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";']},T=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. */
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>;"]:[],...v(e)?[" private readonly shardExtras: Partial<ShardConfig> = {};"]:[]," private shardSelector?: Selector<Env, ShardNamespaceLike>;",...e.hasStorage?[" private storageDeclaration?: StorageDeclaration<Env>;"]:[]],N=e=>m.filter(([t])=>e[t]).map(([,t,r,a])=>` /** ${a} */
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
- }`),W=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. */
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
- }`]:[],...N(e)],I=e=>{const t=[...e.hasGlobal?[` ...(this.globalDeclaration
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) } : {}),"]:[],...v(e)?[" ...this.shardExtras,"]:[]];return t.length>0?`
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
- `:""},$=e=>[...e.hasScheduler?[` if (this.schedulerDeclaration) {
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
- };`]:[]],G=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?`
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
- all: async (sql, parameters) => {
276
- const result = await database
277
- .prepare(sql)
278
- .bind(...parameters)
279
- .all<Record<string, unknown>>();
280
-
281
- return result.results;
282
- },
283
- run: async (sql, parameters) => {
284
- await database
285
- .prepare(sql)
286
- .bind(...parameters)
287
- .run();
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
- `:"",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=T(e),a=$(e),n=t?` let auth: LunoraAuth | null = null;
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
- `:"",l=t?`
323
- await ensureAuth(env);`:"",s=t?"() => auth":"() => null",u=t?"getAuth: () => LunoraAuth | null":"_getAuth: () => null",d=e.hasFramework?` const buildWorker = (env: Env): LunoraWorker =>
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":"",c=e.emailAgents??[],p=c.length>0?` composed.email = dispatchAgentEmail([
325
- ${c.map(i=>` { agent: lunoraAgentDefinitions.${i.exportName}, binding: ${JSON.stringify(i.bindingName)} },`).join(`
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`${E}${j(e).join(`
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
- ${v(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":""}
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
- ${W(e).join(`
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({${I(e)}});
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
- ${d}
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;${l}
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, ${u}): WorkerOptions {
488
+ private buildWorkerOptions(env: Env, ${d}): WorkerOptions {
415
489
  const options: WorkerOptions = {
416
- ${G(e).join(`
490
+ ${$(e).join(`
417
491
  `)}
418
492
  };
419
493
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lunora/codegen",
3
- "version": "1.0.0-alpha.82",
3
+ "version": "1.0.0-alpha.83",
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.60",
50
- "@lunora/agent": "1.0.0-alpha.35",
51
- "@lunora/container": "1.0.0-alpha.18",
52
- "@lunora/errors": "1.0.0-alpha.10",
53
- "@lunora/platform": "1.0.0-alpha.1",
54
- "@lunora/queue": "1.0.0-alpha.13",
55
- "@lunora/scheduler": "1.0.0-alpha.16",
56
- "@lunora/values": "1.0.0-alpha.13",
57
- "@lunora/workflow": "1.0.0-alpha.15",
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)&&lt(e.getExpression())!==void 0)return e.getName();if(i.isElementAccessExpression(e)&&lt(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)&&gt(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};
@@ -1 +0,0 @@
1
- import{Node as n,SyntaxKind as P}from"ts-morph";import{listLunoraSourceFiles as u,lunoraRelativePath as E,classifyProcedureCall as g}from"./discoverFunctions-CVYkUBTm.mjs";const S=t=>{if(!n.isCallExpression(t))return!1;const e=t.getExpression();return n.isIdentifier(e)?e.getText()==="mask":n.isPropertyAccessExpression(e)?e.getName()==="mask":!1},f=t=>{if(n.isPropertyAssignment(t)||n.isShorthandPropertyAssignment(t)||n.isMethodDeclaration(t)||n.isGetAccessorDeclaration(t))return t.getName()},v=t=>{const e=t.getArguments()[0];if(!e||!n.isObjectLiteralExpression(e))return[];const s=[];for(const r of e.getProperties()){const o=f(r);if(o===void 0||!n.isPropertyAssignment(r))continue;const i=r.getInitializer();if(!(!i||!n.isObjectLiteralExpression(i)))for(const a of i.getProperties()){const c=f(a);c!==void 0&&s.push({column:c,table:o})}}return s},p=t=>{const e=[];let s=t;for(;n.isCallExpression(s);){const r=s.getExpression();if(!n.isPropertyAccessExpression(r))break;if(r.getName()==="use"){const o=s.getArguments()[0];o&&S(o)&&e.push(o)}s=r.getExpression()}return e},A=t=>{const e=p(t);return{maskColumns:e.flatMap(s=>v(s)),usesMask:e.length>0}},y=new Set(["findFirst","findFirstOrThrow","findMany","get","query"]),k=new Set(["delete","insert","patch","replace"]),x=(t,e)=>{const s=t.getExpression();if(!n.isPropertyAccessExpression(s)||!e.has(s.getName()))return!1;const r=s.getExpression();return n.isPropertyAccessExpression(r)?r.getName()==="db":n.isIdentifier(r)&&r.getText()==="db"},b=t=>{const e=t.getArguments()[0];return e&&n.isStringLiteral(e)?e.getLiteralText():""},L=t=>{const e=new Set,s=new Set;for(const r of t.getDescendantsOfKind(P.CallExpression))if(x(r,y)){const o=b(r);o!==""&&e.add(o)}else if(x(r,k)){const o=b(r);o!==""&&s.add(o)}return{tablesRead:[...e],tablesWritten:[...s]}},M=(t,e)=>{if(!n.isVariableDeclaration(t))return;const s=t.getInitializer();if(!s||!n.isCallExpression(s))return;const r=g(s);if(!r)return;const o=r.receiver?A(r.receiver):{maskColumns:[],usesMask:!1},{tablesRead:i,tablesWritten:a}=L(t);return{exportName:t.getName(),file:e,maskColumns:o.maskColumns,tablesRead:i,tablesWritten:a,usesMask:o.usesMask,visibility:r.visibility}},O=(t,e)=>{const s=[];for(const r of u(e)){const o=t.getSourceFile(r)??t.addSourceFileAtPath(r),i=E(e,r);for(const a of o.getVariableStatements())if(a.isExported())for(const c of a.getDeclarations()){const l=M(c,i);l&&s.push(l)}}return s},h=t=>{if(n.isPropertyAssignment(t)){const e=t.getInitializer();if(e&&n.isStringLiteral(e)){const s=e.getLiteralText();if(s==="redact"||s==="hash")return s}}return"custom"},C=t=>{const e=t.getArguments()[0];if(!e||!n.isObjectLiteralExpression(e))return[];const s=[];for(const r of e.getProperties()){const o=f(r);if(o===void 0||!n.isPropertyAssignment(r))continue;const i=r.getInitializer();if(!(!i||!n.isObjectLiteralExpression(i)))for(const a of i.getProperties()){const c=f(a);c!==void 0&&s.push({column:c,strategy:h(a),table:o})}}return s},N=t=>{const e=[];for(const s of t.getVariableStatements())if(s.isExported())for(const r of s.getDeclarations()){const o=r.getInitializer(),i=o&&n.isCallExpression(o)?g(o):void 0;i?.receiver&&e.push(i.receiver)}return e},j=(t,e)=>{const s=new Map;for(const r of u(e)){const o=t.getSourceFile(r)??t.addSourceFileAtPath(r);for(const i of N(o))for(const a of p(i))for(const c of C(a)){const l=`${c.table}\0${c.column}`;s.has(l)||s.set(l,c)}}return{columns:[...s.values()]}},F=(t,e,s)=>{const r=t.getArguments()[0];if(!r||!n.isObjectLiteralExpression(r))return[];const o=[];for(const i of r.getProperties()){const a=f(i);if(a===void 0||!n.isPropertyAssignment(i))continue;const c=i.getInitializer();if(!(!c||!n.isObjectLiteralExpression(c)))for(const l of c.getProperties()){const m=f(l);if(m===void 0)continue;const d=h(l);d!=="custom"&&o.push({column:m,exportName:e,file:s,line:l.getStartLineNumber(),strategy:d,table:a})}}return o},I=(t,e)=>{if(!n.isVariableDeclaration(t))return[];const s=t.getInitializer(),r=s&&n.isCallExpression(s)?g(s):void 0;return r?.receiver?p(r.receiver).flatMap(o=>F(o,t.getName(),e)):[]},w=(t,e)=>{const s=[];for(const r of u(e)){const o=t.getSourceFile(r)??t.addSourceFileAtPath(r),i=E(e,r);for(const a of o.getVariableStatements())if(a.isExported())for(const c of a.getDeclarations())s.push(...I(c,i))}return s};export{O as default,j as discoverMaskMetadata,w as discoverMaskStrategies};