@lunora/codegen 1.0.0-alpha.334 → 1.0.0-alpha.336
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.mts +20 -1
- package/dist/index.d.ts +20 -1
- package/dist/index.mjs +1 -1
- package/dist/packem_shared/{AGENTS_FILENAME-8zoeGNsB.mjs → AGENTS_FILENAME-isdHqPIt.mjs} +1 -1
- package/dist/packem_shared/CONTAINERS_FILENAME-mK4cZpcz.mjs +1 -0
- package/dist/packem_shared/{DEFAULT_TARGET-CDksdcYc.mjs → DEFAULT_TARGET-3OLdJhTj.mjs} +1 -1
- package/dist/packem_shared/{FLAGS_FILENAME-Cwq0B2Nl.mjs → FLAGS_FILENAME-BQk3SX8D.mjs} +1 -1
- package/dist/packem_shared/GENERATED_HEADER-BXK9A_wP.mjs +1 -0
- package/dist/packem_shared/LUNORA_ERROR_CODES-CIAJQeKB.mjs +1 -0
- package/dist/packem_shared/{MUTATORS_FILENAME-DZFH7a9G.mjs → MUTATORS_FILENAME-Cy9h3EVW.mjs} +1 -1
- package/dist/packem_shared/{NOTIFY_FILENAME-DZIt-rb0.mjs → NOTIFY_FILENAME-9to_l_Kh.mjs} +1 -1
- package/dist/packem_shared/{OPENRPC_VERSION-CeEGdAZ9.mjs → OPENRPC_VERSION-l4HD4osw.mjs} +1 -1
- package/dist/packem_shared/{QUEUES_FILENAME-EvfCmmv6.mjs → QUEUES_FILENAME-Civ-7SiI.mjs} +1 -1
- package/dist/packem_shared/SCHEMA_SNAPSHOT_FILENAME-DcWyFDv9.mjs +31 -0
- package/dist/packem_shared/{SHAPES_FILENAME-Ciu5tx7B.mjs → SHAPES_FILENAME-DVJbfDZ8.mjs} +1 -1
- package/dist/packem_shared/{WORKFLOWS_FILENAME-C5tz9gMh.mjs → WORKFLOWS_FILENAME-kXq07aGl.mjs} +1 -1
- package/dist/packem_shared/{attribution-RI-H1KPm.mjs → attribution-CG8-kUcl.mjs} +1 -1
- package/dist/packem_shared/{buildOpenApiDocument-BBao-3vL.mjs → buildOpenApiDocument-DWdj2jvW.mjs} +1 -1
- package/dist/packem_shared/capabilitiesUsedBy-C-7D7vlH.mjs +1 -0
- package/dist/packem_shared/chain-74gjwZMP.mjs +1 -0
- package/dist/packem_shared/{classify-procedure-call-C5JY2w5V.mjs → classify-procedure-call-BkaeM9Ej.mjs} +1 -1
- package/dist/packem_shared/{context-property-calls-M6Oo1xQT.mjs → context-property-calls-dFjpeIlP.mjs} +1 -1
- package/dist/packem_shared/{context-root-DQd48e1F.mjs → context-root-CNR6TAsP.mjs} +1 -1
- package/dist/packem_shared/{createCodegenProject-C-fKC9h4.mjs → createCodegenProject-R4so-yTU.mjs} +1 -1
- package/dist/packem_shared/{database-calls-BNoSJRFy.mjs → database-calls-UPlhi3Ks.mjs} +1 -1
- package/dist/packem_shared/discoverAuthApiCalls-CScPrUD-.mjs +1 -0
- package/dist/packem_shared/discoverCrons-B1_NUt19.mjs +1 -0
- package/dist/packem_shared/{discoverFunctions-CJu5EH_G.mjs → discoverFunctions-DkPOc8b9.mjs} +1 -1
- package/dist/packem_shared/{discoverHttpRoutes-MrMxIY66.mjs → discoverHttpRoutes-DCDgDIYv.mjs} +1 -1
- package/dist/packem_shared/discoverHyperdriveCalls-CL-d0IVo.mjs +1 -0
- package/dist/packem_shared/{discoverInserts-Boh6WAYw.mjs → discoverInserts-BcoTjXqI.mjs} +1 -1
- package/dist/packem_shared/discoverMaskProcedures-Bw-BOIbA.mjs +1 -0
- package/dist/packem_shared/{discoverMigrations-BMdGxHeq.mjs → discoverMigrations-BWxx8Wv9.mjs} +1 -1
- package/dist/packem_shared/{discoverNondeterministicCalls-c9xenrIN.mjs → discoverNondeterministicCalls-3INW8oqs.mjs} +1 -1
- package/dist/packem_shared/{discoverQueries-o_00HnBB.mjs → discoverQueries-CxQRVuIV.mjs} +1 -1
- package/dist/packem_shared/discoverR2sqlCalls-B4oeTYEM.mjs +1 -0
- package/dist/packem_shared/{discoverRlsMetadata-C7J8dgVz.mjs → discoverRlsMetadata-D0B4nCmG.mjs} +1 -1
- package/dist/packem_shared/{discoverRlsProcedures-Di3VEk-D.mjs → discoverRlsProcedures-Cl6UKT7L.mjs} +1 -1
- package/dist/packem_shared/{discoverSandboxUsage-CrhZZJZS.mjs → discoverSandboxUsage--Z1vx7GM.mjs} +1 -1
- package/dist/packem_shared/discoverSchema-Cwt-DQgh.mjs +1 -0
- package/dist/packem_shared/{discoverStorageRulesMetadata-BFCmbsIN.mjs → discoverStorageRulesMetadata-CitX6ziW.mjs} +1 -1
- package/dist/packem_shared/{emitAgents-CR2_X_ov.mjs → emitAgents-C9JRmvrC.mjs} +1 -1
- package/dist/packem_shared/{emitApi-CDgIPAG2.mjs → emitApi-c14__tie.mjs} +24 -24
- package/dist/packem_shared/{emitApp-DuJW6LKD.mjs → emitApp-BL16wvE9.mjs} +1 -1
- package/dist/packem_shared/{emitCrons-BQW2lviZ.mjs → emitCrons-lc-hnJYn.mjs} +1 -1
- package/dist/packem_shared/{emitDataModel-BskFt9Wv.mjs → emitDataModel-CuFqq97x.mjs} +1 -1
- package/dist/packem_shared/{emitDrizzleSchema-DitcRZ1a.mjs → emitDrizzleSchema-bct1OuH5.mjs} +1 -1
- package/dist/packem_shared/{emitFunctions-Cd0Tuw73.mjs → emitFunctions-CkBPtGDF.mjs} +71 -65
- package/dist/packem_shared/{emitServer-D1vA5_X1.mjs → emitServer-CGUhLmlG.mjs} +1 -1
- package/dist/packem_shared/{emitShard-DtfjUgjj.mjs → emitShard-FJhdFx9H.mjs} +1 -1
- package/dist/packem_shared/{exported-procedure-chains-Bol_VtzO.mjs → exported-procedure-chains-D1WlRfqJ.mjs} +1 -1
- package/dist/packem_shared/{fingerprintSchemaSources-BdFj8vPc.mjs → fingerprintSchemaSources-BKXkgkj4.mjs} +1 -1
- package/dist/packem_shared/{handler-reference-8w_VU4XY.mjs → handler-reference-CClSR4bi.mjs} +1 -1
- package/dist/packem_shared/index-CN8FVvr-.mjs +1 -0
- package/dist/packem_shared/{isTestPath-Cdv_LoVU.mjs → isTestPath-C3QumE88.mjs} +1 -1
- package/dist/packem_shared/loadProjectConfig-B7RmxIeD.mjs +1 -0
- package/dist/packem_shared/{modules-DDIIcM7P.mjs → modules-l-Db0C4S.mjs} +1 -1
- package/dist/packem_shared/parse-validator-iVTounLK.mjs +1 -0
- package/dist/packem_shared/property-name-7cBlgK_O.mjs +1 -0
- package/dist/packem_shared/{qualifiers-DEdXn5wP.mjs → qualifiers-Bl5fSmav.mjs} +1 -1
- package/dist/packem_shared/readServiceBindings-BA49C6aN.mjs +1 -0
- package/dist/packem_shared/{server-DAvi_bv_.mjs → server-B6VhYK7m.mjs} +1 -1
- package/dist/packem_shared/{shard-CsfiXxV0.mjs → shard-B6afe1Uh.mjs} +170 -122
- package/dist/packem_shared/{shard-runtime-BpoCV-aM.mjs → shard-runtime-BW1kffN4.mjs} +9 -7
- package/dist/packem_shared/shared-8vTRkL2-.mjs +13 -0
- package/dist/packem_shared/{unwrap-handler-return-Bfz7lH0C.mjs → unwrap-handler-return-CGdJGvGh.mjs} +1 -1
- package/dist/sdk/index.mjs +15 -15
- package/package.json +9 -9
- package/dist/packem_shared/CONTAINERS_FILENAME-QiNt84QA.mjs +0 -1
- package/dist/packem_shared/GENERATED_HEADER-Ck_WOHzE.mjs +0 -1
- package/dist/packem_shared/LUNORA_ERROR_CODES-C2s0xWQD.mjs +0 -1
- package/dist/packem_shared/SCHEMA_SNAPSHOT_FILENAME-V7LYutDl.mjs +0 -31
- package/dist/packem_shared/capabilitiesUsedBy-BC7ldWJI.mjs +0 -1
- package/dist/packem_shared/chain-C9qZxjM_.mjs +0 -1
- package/dist/packem_shared/discoverAuthApiCalls-GPzUN_-_.mjs +0 -1
- package/dist/packem_shared/discoverCrons-C1fKEf4g.mjs +0 -1
- package/dist/packem_shared/discoverHyperdriveCalls-VVJGsgxj.mjs +0 -1
- package/dist/packem_shared/discoverMaskProcedures-D3Tu8Q8Y.mjs +0 -1
- package/dist/packem_shared/discoverR2sqlCalls-D_H1v-UD.mjs +0 -1
- package/dist/packem_shared/discoverSchema-Bdmw34_P.mjs +0 -1
- package/dist/packem_shared/index-BMMBKqsT.mjs +0 -1
- package/dist/packem_shared/loadProjectConfig-B0uxUGF-.mjs +0 -1
- package/dist/packem_shared/parse-validator-BqDQLzDZ.mjs +0 -1
- package/dist/packem_shared/project-config-file-CBY6llht.mjs +0 -1
- package/dist/packem_shared/readServiceBindings-4xlUucKw.mjs +0 -1
- package/dist/packem_shared/shared-DnCokNcE.mjs +0 -13
package/dist/packem_shared/{emitDrizzleSchema-DitcRZ1a.mjs → emitDrizzleSchema-bct1OuH5.mjs}
RENAMED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{SCHEMA_MODULE_PATH as c}from"./emitDataModel-
|
|
1
|
+
import{SCHEMA_MODULE_PATH as c}from"./emitDataModel-CuFqq97x.mjs";import{r as m}from"./qualifiers-Bl5fSmav.mjs";import{G as b,a as z,d as T,v as f,u as A,g as x,c as h}from"./shared-8vTRkL2-.mjs";const d=e=>{switch(e.kind){case"array":case"object":case"record":case"union":return{builder:"text",mode:"json",notNull:!0,typeAnnotation:f(e)};case"bigint":return{builder:"blob",mode:"bigint",notNull:!0};case"boolean":return{builder:"integer",mode:"boolean",notNull:!0};case"bytes":return{builder:"blob",mode:"buffer",notNull:!0};case"date":case"timestamp":return{builder:"integer",notNull:!0};case"from":return{builder:"text",notNull:!0,typeAnnotation:f(e)};case"id":return{builder:"text",notNull:!0};case"literal":{const t=e.literalValue??"";return t.startsWith('"')||t.startsWith("'")?{builder:"text",notNull:!0}:t==="true"||t==="false"?{builder:"integer",mode:"boolean",notNull:!0}:t==="null"?{builder:"text",notNull:!0}:{builder:"real",notNull:!0}}case"null":return{builder:"text",notNull:!0};case"number":return{builder:"real",notNull:!0};case"optional":return{...e.inner?d(e.inner):{builder:"text",notNull:!1},notNull:!1};case"storage":case"string":return{builder:"text",notNull:!0};default:return{builder:"text",notNull:!0}}},N=(e,t)=>{const r=A(e);return r.kind==="id"&&r.tableName!==void 0&&t.has(r.tableName)?r.tableName:void 0},j=(e,t,r)=>{x(e,"drizzle column name");const n=d(t),o=n.mode?`, { mode: "${n.mode}" }`:"";let l=`${n.builder}("${e}"${o})`;n.typeAnnotation&&(l+=`.$type<${n.typeAnnotation}>()`);const s=N(t,r);return s!==void 0&&(l+=`.references((): AnySQLiteColumn => ${s}._id)`),n.notNull&&t.column?.notNull!==!1&&(l+=".notNull()"),l},I=e=>{const t=e.unique?"uniqueIndex":"index",r=e.fields.map(n=>(x(n,"drizzle index field"),`t.${n}`)).join(", ");return` ${h(e.name)}: ${t}(${JSON.stringify(e.name)}).on(${r}),`},S=(e,t)=>{z(e.name,"table name");const r=[' _id: text("_id").primaryKey(),',' _creationTime: integer("_creationTime").notNull(),',...Object.entries(e.shape).map(([o,l])=>` ${o}: ${j(o,l,t)},`)].join(`
|
|
2
2
|
`),n=e.indexes.length>0?`, (t) => ({
|
|
3
3
|
${e.indexes.map(o=>I(o)).join(`
|
|
4
4
|
`)}
|
|
@@ -1,30 +1,30 @@
|
|
|
1
|
-
import{LunoraError as
|
|
1
|
+
import{LunoraError as A}from"@lunora/errors";import{L as de,s as j,G as D,d as U,I as T,b as M,r as he,c as me}from"./shared-8vTRkL2-.mjs";import{v as pe}from"./parse-validator-iVTounLK.mjs";import{renderAgentFunctionRegistry as ge,renderSandboxFunctionRegistry as fe}from"./emitApi-c14__tie.mjs";import{b as ye,a as $e,r as I,c as we}from"./qualifiers-Bl5fSmav.mjs";import{s as g}from"./dispatch-namespace-DwTjD7BU.mjs";const ke=new Set(["any","bigint","boolean","date","id","null","number","storage","string","timestamp"]),J=r=>r.column!==void 0,Re=(r,t)=>{switch(r){case"bigint":return`if (typeof ${t} !== "bigint") return DEFER;
|
|
2
2
|
`;case"boolean":return`if (typeof ${t} !== "boolean") return DEFER;
|
|
3
3
|
`;case"date":case"number":case"timestamp":return`if (typeof ${t} !== "number" || !Number.isFinite(${t})) return DEFER;
|
|
4
4
|
`;case"null":return`if (${t} !== null) return DEFER;
|
|
5
5
|
`;default:return`if (typeof ${t} !== "string") return DEFER;
|
|
6
|
-
`}}
|
|
7
|
-
`,
|
|
8
|
-
`}},
|
|
6
|
+
`}},be=(r,t)=>r.stringMaxLength===void 0?"":`if (${t}.length > ${String(r.stringMaxLength)}) return DEFER;
|
|
7
|
+
`,ve=(r,t)=>{const n=r.literalValue?.trim();if(!(n===void 0||!de.test(n)))return{out:t,pre:`if (${t} !== ${n}) return DEFER;
|
|
8
|
+
`}},F=(r,t,n)=>{if(!J(r)&&!(r.unmodelledRefinement||r.sourceText!==void 0)){if(ke.has(r.kind))return r.kind==="any"?{out:t,pre:""}:{out:t,pre:Re(r.kind,t)+be(r,t)};switch(r.kind){case"array":return Ne(r,t,n);case"literal":return ve(r,t);case"object":return Pe(r,t,n);default:return}}},Ne=(r,t,n)=>{const{inner:o}=r;if(!o)return;const a=n.next(),i=`__arr${String(a)}`,s=`__i${String(a)}`,c=`__e${String(a)}`,d=F(o,c,n);if(!d)return;const l=`if (!Array.isArray(${t})) return DEFER;
|
|
9
9
|
const ${i} = new Array(${t}.length);
|
|
10
10
|
for (let ${s} = 0; ${s} < ${t}.length; ${s}++) {
|
|
11
11
|
const ${c} = ${t}[${s}];
|
|
12
12
|
${d.pre}${i}[${s}] = ${d.out};
|
|
13
13
|
}
|
|
14
|
-
`;return{out:i,pre:l}},
|
|
14
|
+
`;return{out:i,pre:l}},Oe=(r,t,n,o)=>{const a=JSON.stringify(r);if(t.kind==="optional"){if(t.hasRefinement||t.sourceText!==void 0||J(t))return;const{inner:s}=t;if(!s)return;const c=F(s,n,o);if(!c)return;const d=o.next(),l=`__has${String(d)}`,u=`__val${String(d)}`,f=`let ${l} = false;
|
|
15
15
|
let ${u};
|
|
16
16
|
if (${n} !== undefined) {
|
|
17
17
|
${c.pre}${u} = ${c.out};
|
|
18
18
|
${l} = true;
|
|
19
19
|
}
|
|
20
|
-
`;return{entry:`...(${l} ? { ${a}: ${u} } : {})`,pre:f}}const i=
|
|
21
|
-
`,d=u}const l=
|
|
22
|
-
`},
|
|
23
|
-
${
|
|
24
|
-
`;return{out:s,pre:c}},
|
|
20
|
+
`;return{entry:`...(${l} ? { ${a}: ${u} } : {})`,pre:f}}const i=F(t,n,o);if(i)return{entry:`${a}: ${i.out}`,pre:i.pre}},Se=new Set(Object.getOwnPropertyNames(Object.prototype)),B=(r,t,n)=>{let o="";const a=[];for(const i of Object.keys(r)){const s=r[i];if(!s)return;const c=JSON.stringify(i);let d=`${t}[${c}]`;if(Se.has(i)){const u=`__f${String(n.next())}`;o+=`const ${u} = Object.hasOwn(${t}, ${c}) ? ${t}[${c}] : undefined;
|
|
21
|
+
`,d=u}const l=Oe(i,s,d,n);if(!l)return;o+=l.pre,a.push(l.entry)}return{entries:a.join(", "),pre:o}},q=r=>{const t=`Object.getPrototypeOf(${r})`;return`if (${t} !== Object.prototype && ${t} !== null) return DEFER;
|
|
22
|
+
`},Pe=(r,t,n)=>{const o=r.shape??{},a=B(o,t,n);if(!a)return;const i=n.next(),s=`__obj${String(i)}`,c=`if (typeof ${t} !== "object" || ${t} === null || Array.isArray(${t})) return DEFER;
|
|
23
|
+
${q(t)}${a.pre}const ${s} = { ${a.entries} };
|
|
24
|
+
`;return{out:s,pre:c}},H=r=>{let t=0;const o=B(r,"source",{next:()=>(t+=1,t)});if(o)return`(source) => {
|
|
25
25
|
if (typeof source !== "object" || source === null || Array.isArray(source)) return DEFER;
|
|
26
|
-
${
|
|
27
|
-
}`},
|
|
26
|
+
${q("source")}${o.pre}return { ${o.entries} };
|
|
27
|
+
}`},xe=(r,t)=>`lunora_${g(r)}_${String(t)}`,C=r=>JSON.stringify(Object.entries(r).toSorted(([t],[n])=>t.localeCompare(n)).map(([t,n])=>{const o=n.kind==="optional",a=o?n.inner??{kind:"unknown"}:n,i=a.kind==="array"?a.inner?.kind:void 0,s=a.kind==="id"?a.tableName:void 0;return{kind:a.kind,name:t,optional:o,...pe(n)?{sensitive:!0}:{},...s===void 0?{}:{table:s},...i===void 0||i==="unknown"?{}:{element:i}}})),z=(r,t,n,o)=>{const a=new Map,i=s=>{a.has(s)||a.set(s,xe(s,a.size))};for(const s of r)i(s.filePath);for(const s of t)i(s.filePath);for(const s of n)i(s.filePath);for(const s of o)i(s.filePath);return a},W=(r,t,n)=>new Set([...r.map(o=>o.filePath),...t.map(o=>o.filePath),...n.map(o=>o.filePath)]),N=r=>`${r}[functionPath]`,Ae=`const callRegistered = async <R>(context: CallerCtx, functionPath: string, args: Record<string, unknown> | undefined): Promise<R> => {
|
|
28
28
|
const registered = await loadFunction(functionPath);
|
|
29
29
|
|
|
30
30
|
if (!registered) {
|
|
@@ -57,29 +57,29 @@ ${B("source")}${o.pre}return { ${o.entries} };
|
|
|
57
57
|
}
|
|
58
58
|
|
|
59
59
|
return (await registered.handler(context, args ?? {})) as R;
|
|
60
|
-
};`,
|
|
61
|
-
`),d=r.map(e
|
|
60
|
+
};`,Le=(r,t,n=[],o=[],a=!1)=>{const i=z(r,t,n,o),s=W(t,n,o),c=[...i.entries()].filter(([e])=>!a||s.has(e)?!0:r.some(m=>m.filePath===e&&m.channel?.kind==="room")).map(([e,m])=>{if(!T.test(e))throw new A("INTERNAL",`@lunora/codegen: refusing to emit import for unsafe file path: ${JSON.stringify(e)}`);return`import ${a&&!s.has(e)?"type ":""}* as ${m} from "../${e}.js";`}).join(`
|
|
61
|
+
`),d=r.map(e=>{if(!a||s.has(e.filePath))return` "${g(e.filePath)}:${e.exportName}": ${i.get(e.filePath)??""}.${e.exportName} as unknown as RegisteredLunoraFunction,`;const m=j(e.args);return` "${g(e.filePath)}:${e.exportName}": { args: {}, handler: unloadedFunctionHandler, ...${JSON.stringify({argumentDescriptors:JSON.parse(C(e.args)),kind:e.kind,...m.length===0?{}:{sensitiveArgs:m},...e.channel?{channel:e.channel}:{},...e.expose?{expose:e.expose}:{},...e.lifecycle?{lifecycle:e.lifecycle}:{},...e.visibility?{visibility:e.visibility}:{},...e.x402?.price===void 0?{}:{x402:{price:e.x402.price}},...e.socket===void 0?{}:{auth:e.socket.auth,socketPath:e.socket.path}})} } satisfies RegisteredLunoraFunction & Pick<FunctionManifestEntry, "argumentDescriptors" | "channel" | "expose">,`}).join(`
|
|
62
62
|
`),l=t.map(e=>` ${JSON.stringify(e.id)}: ${i.get(e.filePath)??""}.${e.exportName} as unknown as RegisteredDataMigration,`).join(`
|
|
63
63
|
`),u=n.map(e=>` "${g(e.filePath)}:${e.exportName}": ${i.get(e.filePath)??""}.${e.exportName} as unknown as RegisteredLunoraFunction,`).join(`
|
|
64
64
|
`),f=o.map(e=>` "${e.exportName}": ${i.get(e.filePath)??""}.${e.exportName} as unknown as RegisteredShape,`).join(`
|
|
65
65
|
`),$=n.map(e=>`${g(e.filePath)}:${e.exportName}`),y=[d,u].filter(e=>e.length>0).join(`
|
|
66
|
-
`),
|
|
67
|
-
`),
|
|
68
|
-
`),k=[...r.map(e=>({args:e.args,definition:e,path:`${g(e.filePath)}:${e.exportName}`})),...n.map(e=>({args:e.args,definition:{...e,expose:void 0,kind:"mutation",lifecycle:void 0,visibility:void 0,x402:void 0},path:`${g(e.filePath)}:${e.exportName}`}))],
|
|
69
|
-
`):"",h=[...new Set(
|
|
66
|
+
`),O=r.filter(e=>!a||s.has(e.filePath)).map(e=>{if(e.lifecycle||Object.keys(e.args).length===0)return;const m=H(e.args);return m===void 0?void 0:`installCompiledValidatorMap(${i.get(e.filePath)??""}.${e.exportName}.args, ${m});`}).filter(e=>e!==void 0).join(`
|
|
67
|
+
`),S=r.filter(e=>e.channel?.kind==="room").map(e=>` ${JSON.stringify(e.channel?.name??"")}: RoomMessageOf<typeof ${i.get(e.filePath)??""}[${JSON.stringify(e.exportName)}]>;`).join(`
|
|
68
|
+
`),k=[...r.map(e=>({args:e.args,definition:e,path:`${g(e.filePath)}:${e.exportName}`})),...n.map(e=>({args:e.args,definition:{...e,expose:void 0,kind:"mutation",lifecycle:void 0,visibility:void 0,x402:void 0},path:`${g(e.filePath)}:${e.exportName}`}))],P=a?k.filter(({definition:e})=>!s.has(e.filePath)):[];for(const{definition:e}of k)if(a&&e.x402&&e.x402.price===void 0)throw new A("INTERNAL",`@lunora/codegen: lazy function registry needs a literal \`.x402({ price })\` value in ${e.filePath}:${e.exportName}`);const v=a?P.map(({definition:e,path:m})=>{const R=i.get(e.filePath)??"",x="channel"in e?e.channel:void 0,b={argumentDescriptors:JSON.parse(C(e.args)),exportName:e.exportName,kind:e.kind,moduleId:R,...x?{channel:x}:{},...e.expose?{expose:e.expose}:{},...e.lifecycle?{lifecycle:e.lifecycle}:{},...e.visibility?{visibility:e.visibility}:{},...e.x402?.price===void 0?{}:{x402:{price:e.x402.price}}};return` ${JSON.stringify(m)}: ${JSON.stringify(b)},`}).join(`
|
|
69
|
+
`):"",h=[...new Set(P.map(({definition:e})=>e.filePath))],w=a?h.map(e=>{if(!T.test(e))throw new A("INTERNAL",`@lunora/codegen: refusing to emit import for unsafe file path: ${JSON.stringify(e)}`);const m=i.get(e)??"";return` ${JSON.stringify(m)}: () => import(${JSON.stringify(`./fn/${m}.js`)}),`}).join(`
|
|
70
70
|
`):"";return{dispatchBody:y.length>0?`
|
|
71
71
|
${y}
|
|
72
72
|
`:"",importBlock:c.length>0?`${c}
|
|
73
73
|
|
|
74
|
-
`:"",installBlock:
|
|
75
|
-
${
|
|
74
|
+
`:"",installBlock:O,manifestBody:v.length>0?`
|
|
75
|
+
${v}
|
|
76
76
|
`:"",migrationBody:l.length>0?`
|
|
77
77
|
${l}
|
|
78
78
|
`:"",moduleLoaders:w.length>0?`
|
|
79
79
|
${w}
|
|
80
|
-
`:"",mutatorPaths:$,roomMessagesBody:
|
|
80
|
+
`:"",mutatorPaths:$,roomMessagesBody:S,shapeBody:f.length>0?`
|
|
81
81
|
${f}
|
|
82
|
-
`:""}},
|
|
82
|
+
`:""}},Te=r=>{const t=M(r,o=>{const a=I(he(o.args),o.filePath),i=a==="{}"?"?":"",s=I(we(o),o.filePath);return o.kind==="stream"?`${o.exportName}: (args${i}: ${a}) => Promise<AsyncIterable<${s}>>;`:`${o.exportName}: (args${i}: ${a}) => Promise<${s}>;`},"type");return{implementation:M(r,o=>`${me(o.exportName)}: (args) => callRegistered(context, "${g(o.filePath)}:${o.exportName}", args),`,"value"),types:t}},Fe=r=>{const t={connect:[],disconnect:[],init:[],reactor:[],whisper:[]};for(const n of r)!n.lifecycle||n.lifecycle==="socket"||t[n.lifecycle].push(`${g(n.filePath)}:${n.exportName}`);return t},Ee=r=>{const t=new Map,n=[];for(const o of r){if(o.lifecycle!=="socket"||o.socket===void 0)continue;const{auth:a,origin:i,path:s}=o.socket,c=`${g(o.filePath)}:${o.exportName}`,d=t.get(s);if(!(d?.origin!==void 0&&d.origin===i)){if(d!==void 0)throw new A("DUPLICATE_SOCKET_PATH",`two defineWebSocket routes serve "${s}" (${d.functionPath} and ${c}); socket paths must be unique.`);t.set(s,{functionPath:c,origin:i}),n.push(` ${JSON.stringify(s)}: { auth: ${String(a)}, functionPath: ${JSON.stringify(c)} },`)}}return`
|
|
83
83
|
/**
|
|
84
84
|
* Socket registry: the URL path of each \`defineWebSocket\` route → its function path + auth requirement.
|
|
85
85
|
* Static, so building the worker never evaluates a route's module. The generated ShardDO's \`socketRoute\` override
|
|
@@ -89,7 +89,7 @@ export const LUNORA_SOCKETS: Readonly<Record<string, { auth: boolean; functionPa
|
|
|
89
89
|
${n.join(`
|
|
90
90
|
`)}
|
|
91
91
|
};
|
|
92
|
-
`},
|
|
92
|
+
`},_e=(r,t)=>{const n=r.some(c=>c.lifecycle==="socket"),a=n&&t?Ee(r):n&&!t?`
|
|
93
93
|
/**
|
|
94
94
|
* Socket registry: the URL path of each \`defineWebSocket\` route → its function
|
|
95
95
|
* path + auth requirement. The generated ShardDO's \`socketRoute\` override
|
|
@@ -133,7 +133,7 @@ export const LUNORA_SOCKETS: Readonly<Record<string, { auth: boolean; functionPa
|
|
|
133
133
|
* Set on a \`defineWebSocket\` registration: whether the route refuses an
|
|
134
134
|
* anonymous upgrade. Read into \`LUNORA_SOCKETS\` alongside \`socketPath\`.
|
|
135
135
|
*/
|
|
136
|
-
auth?: boolean;`:"",lifecycleMember:n?' | "socket"':"",registry:a}},
|
|
136
|
+
auth?: boolean;`:"",lifecycleMember:n?' | "socket"':"",registry:a}},Me=(r,t,n)=>r?{channelField:` /**
|
|
137
137
|
* Set on a \`defineRoom\` registration: the room's name (without the \`room:\`
|
|
138
138
|
* topic prefix). The generated \`LUNORA_ROOMS\` map keys it on the room's
|
|
139
139
|
* \`room:<name>\` whisper topic so the ShardDO resolves a room topic to this
|
|
@@ -148,7 +148,7 @@ export type LunoraRoomMessages = {
|
|
|
148
148
|
${n}
|
|
149
149
|
};
|
|
150
150
|
`,typeImport:`import type { RoomMessageOf } from "${t}";
|
|
151
|
-
`}:{channelField:"",messagesBlock:"",typeImport:""},
|
|
151
|
+
`}:{channelField:"",messagesBlock:"",typeImport:""},Ie=(r,t,n)=>r?t?`
|
|
152
152
|
/**
|
|
153
153
|
* Room routes are static metadata so building the worker never evaluates user handlers.
|
|
154
154
|
*/
|
|
@@ -208,47 +208,53 @@ export const LUNORA_ROOMS: Readonly<Record<string, string>> = (() => {
|
|
|
208
208
|
|
|
209
209
|
return registry;
|
|
210
210
|
})();
|
|
211
|
-
`:"",
|
|
211
|
+
`:"",Ce=(r,t)=>{const n=Te(r),o=n.types?`
|
|
212
212
|
${n.types}
|
|
213
213
|
`:"",a=n.implementation?`
|
|
214
214
|
${n.implementation}
|
|
215
|
-
`:"",i
|
|
216
|
-
`:"",c=r.length>0?"context":"_context";let d="";if(r.length>0){let l=
|
|
215
|
+
`:"",i=$e(n.types),s=i.length>0?`import type { ${i.join(", ")} } from "./dataModel.js";
|
|
216
|
+
`:"",c=r.length>0?"context":"_context";let d="";if(r.length>0){let l=Ae;t||(l=l.replace("await loadFunction(functionPath)",N("LUNORA_FUNCTIONS"))),d=`${l}
|
|
217
217
|
|
|
218
|
-
`}return{callRegisteredHelper:d,dataModelImport:s,implementation:a,parameter:c,types:o}},
|
|
219
|
-
|
|
220
|
-
|
|
218
|
+
`}return{callRegisteredHelper:d,dataModelImport:s,implementation:a,parameter:c,types:o}},He=r=>{const{agents:t=[],functions:n,lazyFunctions:o=!1,migrations:a=[],mutators:i=[],shapes:s=[],useUmbrella:c=!1,usesSandbox:d=!1}=r,l=U(c),{dispatchBody:u,importBlock:f,installBlock:$,manifestBody:y,migrationBody:O,moduleLoaders:S,mutatorPaths:k,roomMessagesBody:P,shapeBody:v}=Le(n,a,i,s,o),h=ge(t,n),w=fe(d,n),m=t.length>0||n.some(p=>j(p.args).length>0)?` /**
|
|
219
|
+
* Names of the arguments whose validators carry a \`v.sensitive\` marker. Read by the
|
|
220
|
+
* shard before any validator is loaded, so a lazy function's secret args are
|
|
221
|
+
* masked even on a dispatch that fails before its module evaluates.
|
|
222
|
+
*/
|
|
223
|
+
sensitiveArgs?: readonly string[];
|
|
224
|
+
`:"",R=[h.lines,w.lines].filter(p=>p.length>0).join(`
|
|
225
|
+
`);let x=u;R.length>0&&(x=u.length>0?`${u.trimEnd()}
|
|
226
|
+
${R}
|
|
221
227
|
`:`
|
|
222
|
-
${
|
|
223
|
-
`);const
|
|
228
|
+
${R}
|
|
229
|
+
`);const b=Fe(n),Q=o?"await loadFunction(functionPath)":N("LUNORA_FUNCTIONS"),G=o?` if (${N("LUNORA_FUNCTION_MANIFEST")}?.visibility === "internal") {
|
|
224
230
|
throw new LunoraError("FUNCTION_NOT_FOUND", \`function not registered: \${functionPath}\`);
|
|
225
231
|
}
|
|
226
232
|
|
|
227
|
-
`:"",
|
|
228
|
-
`:"",
|
|
233
|
+
`:"",V=s.length>0?`import type { RegisteredShape } from "${l.server}";
|
|
234
|
+
`:"",E=n.some(p=>p.channel?.kind==="room"),L=Me(E,l.server,P),K=s.length>0?`
|
|
229
235
|
/**
|
|
230
236
|
* Replication-shape registry — one entry per \`defineShape\` in \`lunora/shapes.ts\`.
|
|
231
237
|
* The generated ShardDO's \`resolveShape\` override looks a shape up by name and
|
|
232
238
|
* evaluates its trusted \`compileWhere(ctx, args)\` to authorize + scope a
|
|
233
239
|
* \`shape_subscribe\` (reads-as-permissions).
|
|
234
240
|
*/
|
|
235
|
-
export const LUNORA_SHAPES: Record<string, RegisteredShape> = {${
|
|
236
|
-
`:"",
|
|
241
|
+
export const LUNORA_SHAPES: Record<string, RegisteredShape> = {${v}};
|
|
242
|
+
`:"",Y=k.length>0?`
|
|
237
243
|
/**
|
|
238
244
|
* Custom-mutator function paths — the \`LUNORA_FUNCTIONS\` keys the generated
|
|
239
245
|
* ShardDO's \`isCustomMutator\` override routes through the client-watermark push
|
|
240
246
|
* protocol (\`x-lunora-client-id\`/\`x-lunora-client-seq\` ordering).
|
|
241
247
|
*/
|
|
242
|
-
export const LUNORA_MUTATOR_PATHS: ReadonlySet<string> = new Set([${k.map(
|
|
243
|
-
`:"",
|
|
244
|
-
`:"",
|
|
248
|
+
export const LUNORA_MUTATOR_PATHS: ReadonlySet<string> = new Set([${k.map(p=>JSON.stringify(p)).join(", ")}]);
|
|
249
|
+
`:"",Z=Ie(E,o,n),{fields:X,lifecycleMember:_,registry:ee}=_e(n,o),te=$.length>0?`import { DEFER_VALIDATION as DEFER, installCompiledValidatorMap } from "${l.values}";
|
|
250
|
+
`:"",re=$.length>0?`
|
|
245
251
|
/**
|
|
246
252
|
* AOT-compiled argument validators (Worker-safe, no \`eval\`). Each is installed
|
|
247
253
|
* onto its function's live \`.args\` object and consulted by the interpreted
|
|
248
254
|
* parser as a zero-allocation fast path; anything it can't model is deferred.
|
|
249
255
|
*/
|
|
250
256
|
${$}
|
|
251
|
-
`:"",
|
|
257
|
+
`:"",ne=Ce(n,o),{callRegisteredHelper:oe,dataModelImport:se,implementation:ae,parameter:ie,types:ce}=ne,le=o?`
|
|
252
258
|
export interface FunctionManifestEntry {
|
|
253
259
|
argumentDescriptors: ReadonlyArray<{ element?: string; kind: string; name: string; optional: boolean; table?: string }>;
|
|
254
260
|
channel?: { kind: "room"; name: string };
|
|
@@ -264,7 +270,7 @@ export interface FunctionManifestEntry {
|
|
|
264
270
|
/** Static, codegen-derived facts. Request gates can inspect these without evaluating a user module. */
|
|
265
271
|
export const LUNORA_FUNCTION_MANIFEST: Readonly<Record<string, FunctionManifestEntry>> = {${y}};
|
|
266
272
|
|
|
267
|
-
const MODULE_LOADERS: Record<string, () => Promise<Record<string, unknown>>> = {${
|
|
273
|
+
const MODULE_LOADERS: Record<string, () => Promise<Record<string, unknown>>> = {${S}};
|
|
268
274
|
const loadedModules = new Map<string, Promise<Record<string, unknown>>>();
|
|
269
275
|
const resolvedModules = new Map<string, Record<string, unknown>>();
|
|
270
276
|
const boundFunctions = new Set<string>();
|
|
@@ -333,7 +339,7 @@ export const loadFunction = async (functionPath: string): Promise<RegisteredLuno
|
|
|
333
339
|
return getLoadedFunction(functionPath);
|
|
334
340
|
};
|
|
335
341
|
|
|
336
|
-
`:"",
|
|
342
|
+
`:"",ue=o&&y!==""?`
|
|
337
343
|
/**
|
|
338
344
|
* Evaluate every lazy module now and report the ones that fail, keyed by function path. A lazy
|
|
339
345
|
* registry defers a broken module's error to its first call; \`lunora build\` and \`deploy\` run this
|
|
@@ -359,9 +365,9 @@ export const loadAllFunctions = async (): Promise<{ checked: number; failures: R
|
|
|
359
365
|
|
|
360
366
|
return { checked: functionPaths.length, failures };
|
|
361
367
|
};
|
|
362
|
-
`:"";return
|
|
368
|
+
`:"";return ye(`${D}${f}${h.importLine}${w.importLine}${te}${V}${L.typeImport}import { LunoraError } from "${l.server}";
|
|
363
369
|
import type { ActionCtx, MutationCtx, QueryCtx } from "./server.js";
|
|
364
|
-
${
|
|
370
|
+
${se}
|
|
365
371
|
/**
|
|
366
372
|
* Single registered function, narrowed to the shape \`handleRpc\` needs.
|
|
367
373
|
* The real argument validators / return types are checked elsewhere — at
|
|
@@ -390,7 +396,7 @@ export interface RegisteredLunoraFunction {
|
|
|
390
396
|
* \`init\` and \`reactor\` have no caller identity, so RLS has no user to scope
|
|
391
397
|
* to. \`whisper\` does have one — it runs under the asking socket's identity.
|
|
392
398
|
*/
|
|
393
|
-
lifecycle?: "connect" | "disconnect" | "init" | "reactor" | "whisper"${_};${
|
|
399
|
+
lifecycle?: "connect" | "disconnect" | "init" | "reactor" | "whisper"${_};${X}
|
|
394
400
|
${L.channelField} /**
|
|
395
401
|
* Hoisted by the builder when the \`.use()\` chain carries a step with a
|
|
396
402
|
* per-dispatch effect — \`rateLimit(...)\` consuming budget, a single-use
|
|
@@ -406,14 +412,14 @@ ${L.channelField} /**
|
|
|
406
412
|
* paywalls it; the shard refuses to subscribe it (\`isPaidFunction\`).
|
|
407
413
|
*/
|
|
408
414
|
x402?: { readonly price: number | string };
|
|
409
|
-
}
|
|
410
|
-
${h.prelude}${w.prelude}${
|
|
415
|
+
${m}}
|
|
416
|
+
${h.prelude}${w.prelude}${le}${ue}
|
|
411
417
|
/**
|
|
412
418
|
* Static dispatch table. The key matches the \`__lunoraRef\` the client
|
|
413
419
|
* emits (\`api[namespace][fn].__lunoraRef === "namespace:fn"\`).
|
|
414
420
|
*/
|
|
415
|
-
export const LUNORA_FUNCTIONS: Record<string, RegisteredLunoraFunction> = {${
|
|
416
|
-
${
|
|
421
|
+
export const LUNORA_FUNCTIONS: Record<string, RegisteredLunoraFunction> = {${x}};
|
|
422
|
+
${re}${K}${Y}${Z}${L.messagesBlock}${ee}
|
|
417
423
|
/**
|
|
418
424
|
* Lifecycle manifest: the function paths the generated ShardDO dispatches when a
|
|
419
425
|
* client's WebSocket connects (\`connect\`) or disconnects (\`disconnect\`), once
|
|
@@ -431,11 +437,11 @@ export const LUNORA_LIFECYCLE_HOOKS: {
|
|
|
431
437
|
reactor: readonly string[];
|
|
432
438
|
whisper: readonly string[];
|
|
433
439
|
} = {
|
|
434
|
-
connect: [${
|
|
435
|
-
disconnect: [${
|
|
436
|
-
init: [${
|
|
437
|
-
reactor: [${
|
|
438
|
-
whisper: [${
|
|
440
|
+
connect: [${b.connect.map(p=>JSON.stringify(p)).join(", ")}],
|
|
441
|
+
disconnect: [${b.disconnect.map(p=>JSON.stringify(p)).join(", ")}],
|
|
442
|
+
init: [${b.init.map(p=>JSON.stringify(p)).join(", ")}],
|
|
443
|
+
reactor: [${b.reactor.map(p=>JSON.stringify(p)).join(", ")}],
|
|
444
|
+
whisper: [${b.whisper.map(p=>JSON.stringify(p)).join(", ")}],
|
|
439
445
|
};
|
|
440
446
|
|
|
441
447
|
/**
|
|
@@ -445,7 +451,7 @@ export const LUNORA_LIFECYCLE_HOOKS: {
|
|
|
445
451
|
* functions are treated as not-found so their existence never leaks to clients.
|
|
446
452
|
*/
|
|
447
453
|
export const dispatchLunoraFunction = async (functionPath: string, context: unknown, args: Record<string, unknown>): Promise<unknown> => {
|
|
448
|
-
${
|
|
454
|
+
${G} const registered = ${Q};
|
|
449
455
|
|
|
450
456
|
if (!registered || registered.visibility === "internal") {
|
|
451
457
|
throw new LunoraError("FUNCTION_NOT_FOUND", \`function not registered: \${functionPath}\`);
|
|
@@ -466,10 +472,10 @@ export type CallerCtx = ActionCtx | MutationCtx | QueryCtx;
|
|
|
466
472
|
* with the supplied \`context\`, exactly like \`ctx.runQuery\`/\`runMutation\`/
|
|
467
473
|
* \`runAction\` but without re-stating the function path.
|
|
468
474
|
*/
|
|
469
|
-
export interface Caller {${
|
|
475
|
+
export interface Caller {${ce}}
|
|
470
476
|
|
|
471
|
-
${
|
|
472
|
-
export const createCaller = (${
|
|
477
|
+
${oe}/** Build a {@link Caller} bound to \`context\` (typically a handler's \`ctx\`). */
|
|
478
|
+
export const createCaller = (${ie}: CallerCtx): Caller => ({${ae}});
|
|
473
479
|
|
|
474
480
|
/**
|
|
475
481
|
* Single registered data migration, narrowed to the shape the per-shard runner
|
|
@@ -488,13 +494,13 @@ export interface RegisteredDataMigration {
|
|
|
488
494
|
* Registry of online data migrations keyed by \`defineMigration\`'s \`id\`. The
|
|
489
495
|
* shard DO's admin RPC and the CLI resolve migrations to run through this map.
|
|
490
496
|
*/
|
|
491
|
-
export const LUNORA_MIGRATIONS: Record<string, RegisteredDataMigration> = {${
|
|
492
|
-
`,c)},
|
|
493
|
-
`:"",
|
|
497
|
+
export const LUNORA_MIGRATIONS: Record<string, RegisteredDataMigration> = {${O}};
|
|
498
|
+
`,c)},ze="fn",We=r=>{if(r.lazyFunctions!==!0)return{};const{functions:t}=r,n=r.migrations??[],o=r.mutators??[],a=r.shapes??[],i=z(t,n,o,a),s=W(n,o,a),c=[...new Set(t.filter(u=>!s.has(u.filePath)).map(u=>u.filePath))],d=U(r.useUmbrella??!1),l={};for(const u of c){if(!T.test(u))throw new A("INTERNAL",`@lunora/codegen: refusing to emit import for unsafe file path: ${JSON.stringify(u)}`);const f=i.get(u)??"",$=`../../${u}.js`,y=t.filter(h=>h.filePath===u&&!h.lifecycle&&Object.keys(h.args).length>0).flatMap(h=>{const w=H(h.args);return w===void 0?[]:[`installCompiledValidatorMap(${f}.${h.exportName}.args, ${w});`]}),O=y.length>0?`import { DEFER_VALIDATION as DEFER, installCompiledValidatorMap } from "${d.values}";
|
|
499
|
+
`:"",S=y.length>0?`import * as ${f} from "${$}";
|
|
494
500
|
`:"",k=y.length>0?`
|
|
495
501
|
/** Install the precompiled argument parsers before the module is dispatched. */
|
|
496
502
|
${y.join(`
|
|
497
503
|
`)}
|
|
498
|
-
`:"",
|
|
499
|
-
`:"";l[`${f}.ts`]=`${
|
|
500
|
-
${
|
|
504
|
+
`:"",v=t.some(h=>h.filePath===u&&h.exportName==="default")||n.some(h=>h.filePath===u&&h.exportName==="default")?`export { default } from "${$}";
|
|
505
|
+
`:"";l[`${f}.ts`]=`${D}${O}${S}${k}export * from "${$}";
|
|
506
|
+
${v}`}return l};export{ze as LAZY_FUNCTION_DIRECTORY,He as emitFunctions,We as emitLazyFunctionModules};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import"./CAPABILITY_PROBES-brcmKenl.mjs";import{e}from"./server-
|
|
1
|
+
import"./CAPABILITY_PROBES-brcmKenl.mjs";import{e}from"./server-B6VhYK7m.mjs";import"./shared-8vTRkL2-.mjs";import"./platform-8oj7iXQy.mjs";export{e as default};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import"./SCHEMA_SNAPSHOT_VERSION-C0oHwiJZ.mjs";import"./isD1GlobalTable-udvHAAzD.mjs";import"./json-data-Chfs2Cz5.mjs";import{e as d}from"./shard-
|
|
1
|
+
import"./SCHEMA_SNAPSHOT_VERSION-C0oHwiJZ.mjs";import"./isD1GlobalTable-udvHAAzD.mjs";import"./json-data-Chfs2Cz5.mjs";import{e as d}from"./shard-B6afe1Uh.mjs";import"./shard-runtime-BW1kffN4.mjs";import"./shared-8vTRkL2-.mjs";import"./platform-8oj7iXQy.mjs";import"./schema-BgM8A3XV.mjs";export{d as default};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{Node as s}from"ts-morph";import{b as t,d as c}from"./attribution-
|
|
1
|
+
import{Node as s}from"ts-morph";import{b as t,d as c}from"./attribution-CG8-kUcl.mjs";import{c as n}from"./classify-procedure-call-BkaeM9Ej.mjs";const m=a=>{const i=[];for(const e of t(a)){const r=e.getInitializer(),o=r&&s.isCallExpression(r)?n(r):void 0;o?.receiver&&i.push({name:c(e)??e.getName(),receiver:o.receiver})}return i};export{m as e};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{createHash as i}from"node:crypto";import{existsSync as s,readFileSync as c}from"node:fs";import{join as u}from"node:path";import{listLunoraSourceFiles as h}from"./isTestPath-
|
|
1
|
+
import{createHash as i}from"node:crypto";import{existsSync as s,readFileSync as c}from"node:fs";import{join as u}from"node:path";import{listLunoraSourceFiles as h}from"./isTestPath-C3QumE88.mjs";const S=t=>{if(!s(t))return"unreadable";const e=h(t,{includeSkipped:!0}),o=u(t,"schema.ts");s(o)&&e.push(o);const r=i("sha256");for(const a of e.toSorted((n,p)=>n.localeCompare(p)))try{r.update(a).update("\0").update(c(a))}catch{}return r.digest("hex")};export{S as default};
|
package/dist/packem_shared/{handler-reference-8w_VU4XY.mjs → handler-reference-CClSR4bi.mjs}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{dirname as F}from"node:path";import{Node as e}from"ts-morph";import{unwrapExpression as m,lunoraRelativePath as u}from"./isTestPath-
|
|
1
|
+
import{dirname as F}from"node:path";import{Node as e}from"ts-morph";import{unwrapExpression as m,lunoraRelativePath as u}from"./isTestPath-C3QumE88.mjs";import{r as v,d as b}from"./attribution-CG8-kUcl.mjs";const h=i=>e.isPropertyAssignment(i)?m(i.getInitializer()):e.isShorthandPropertyAssignment(i)?i.getNameNode():void 0,A=(i,s)=>{const o=i===void 0?void 0:h(i);if(o===void 0||!e.isIdentifier(o))return;const a=v(o),g=a?.getAliasedSymbol()??a;for(const t of g?.getDeclarations()??[]){const n=e.isVariableDeclaration(t)?m(t.getInitializer()):t;if(!(e.isFunctionDeclaration(n)||e.isArrowFunction(n)||e.isFunctionExpression(n))||!(e.isFunctionDeclaration(t)||e.isVariableDeclaration(t)))continue;const r=t.getSourceFile(),c=u(s,r.getFilePath()),l=!c.startsWith("../"),d=l?c:u(F(s),r.getFilePath()),f=b(t);return{body:n,...r===o.getSourceFile()?{}:{file:d},...l&&f!==void 0?{site:{exportName:f,file:d}}:{}}}};export{A as r};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{Node as r}from"ts-morph";import{listLunoraSourceFiles as u,lunoraRelativePath as f}from"./isTestPath-C3QumE88.mjs";import{b as m,d as p}from"./attribution-CG8-kUcl.mjs";import{t as d}from"./database-calls-UPlhi3Ks.mjs";import{w as g,c as h}from"./classify-procedure-call-BkaeM9Ej.mjs";import{a as k}from"./property-name-7cBlgK_O.mjs";const l=e=>{if(!(!r.isPropertyAssignment(e)&&!r.isShorthandPropertyAssignment(e)&&!r.isMethodDeclaration(e)&&!r.isGetAccessorDeclaration(e)))return k(e)},v=e=>g(e,"use","mask"),D=e=>{if(r.isPropertyAssignment(e)){const s=e.getInitializer();if(s&&r.isStringLiteral(s)){const t=s.getLiteralText();if(t==="redact"||t==="hash")return t}}return"custom"},P=e=>{const s=e.getArguments()[0];if(!s||!r.isObjectLiteralExpression(s))return[];const t=[];for(const i of s.getProperties()){const o=l(i);if(o===void 0||!r.isPropertyAssignment(i))continue;const n=i.getInitializer();if(!(!n||!r.isObjectLiteralExpression(n)))for(const a of n.getProperties()){const c=l(a);c!==void 0&&t.push({column:c,table:o})}}return t},y=e=>{const s=v(e);return{maskColumns:s.flatMap(t=>P(t)),usesMask:s.length>0}},C=new Set(["explain","findFirst","findFirstOrThrow","findMany","get","query"]),M=new Set(["delete","insert","patch","replace"]),x=(e,s)=>{if(!r.isVariableDeclaration(e))return;const t=e.getInitializer();if(!t||!r.isCallExpression(t))return;const i=h(t);if(!i)return;const o=i.receiver?y(i.receiver):{maskColumns:[],usesMask:!1},{tablesRead:n,tablesWritten:a}=d(e,C,M);return{exportName:p(e)??e.getName(),file:s,maskColumns:o.maskColumns,tablesRead:n,tablesWritten:a,usesMask:o.usesMask,visibility:i.visibility}},E=(e,s)=>{const t=[];for(const i of u(s)){const o=e.getSourceFile(i)??e.addSourceFileAtPath(i),n=f(s,i);for(const a of m(o)){const c=x(a,n);c&&t.push(c)}}return t};export{l as a,E as d,v as m,D as s};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{statSync as y,readdirSync as v,realpathSync as b,lstatSync as C}from"node:fs";import{dirname as P,join as m,relative as A,sep as F,extname as w,basename as I}from"node:path";import{matcher as D}from"@visulima/fs";import{SyntaxKind as p,Node as s,VariableDeclarationKind as k}from"ts-morph";import{diagnosticAt as j}from"./CodegenDiagnosticError-BUXlG3P-.mjs";import{
|
|
1
|
+
import{statSync as y,readdirSync as v,realpathSync as b,lstatSync as C}from"node:fs";import{dirname as P,join as m,relative as A,sep as F,extname as w,basename as I}from"node:path";import{matcher as D}from"@visulima/fs";import{SyntaxKind as p,Node as s,VariableDeclarationKind as k}from"ts-morph";import{diagnosticAt as j}from"./CodegenDiagnosticError-BUXlG3P-.mjs";import{readProjectConfigLiterals as z}from"./loadProjectConfig-B7RmxIeD.mjs";import{findProjectConfigFile as V,findCodegenConfigFile as K}from"./PROJECT_CONFIG_FILENAMES-CLfsyvjA.mjs";import{p as $,a as M}from"./property-name-7cBlgK_O.mjs";const B=/\.ts$/u,g=(e,t)=>A(e,t).split(F).join("/").replace(B,""),U=new Set(["_generated","node_modules"]),O=new Set(["__fixtures__","__mocks__","__snapshots__","__tests__"]),N=/\.(?:bench|e2e|e2e-spec|spec|spec-d|test|test-d)(?:\.tsx?)?$/u,me=e=>{const t=e.split("/");return N.test(t.at(-1)??"")||t.slice(0,-1).some(i=>O.has(i))},f=(e,t,i)=>t?U.has(e)||!i&&O.has(e):!i&&N.test(e),S=new Map,d=()=>!1,W=e=>{const t=K(e),i=t===void 0?void 0:y(t,{throwIfNoEntry:!1});if(t===void 0||i===void 0)return d;const n=`${String(i.mtimeMs)}:${String(i.size)}`,r=S.get(t);if(r?.key===n)return r.isExcluded;const{codegen:o}=z(P(t));o?.unreadable&&console.warn("@lunora/codegen: `codegen.exclude` in lunora.config is not an array of string literals without `!` negations — ignoring it.");const c=o?.exclude?.length?D(o.exclude):d;return S.set(t,{isExcluded:c,key:n}),c},X=(e,t,i)=>e==="schema.ts"&&t===i,G=e=>{try{return y(e)}catch{console.warn(`@lunora/codegen: skipping ${e} — it is a symlink that does not resolve (or vanished mid-scan).`);return}},L=(e,t,i,n,r)=>{let o,c;try{o=v(e),c=b(e)}catch{return t}if(n.has(c))return t;n.add(c);for(const l of o){const u=m(e,l),a=G(u);a===void 0||r(l,A(i,u).split(F).join("/"),a.isDirectory())||(a.isDirectory()?L(u,t,i,n,r):a.isFile()&&w(l)===".ts"&&!X(l,e,i)&&t.push(u))}return t},_=(e,t={})=>{const i=t.includeSkipped??!1,n=i?d:W(e);return L(e,[],e,new Set,(r,o,c)=>f(r,c,i)||n(o))},H=["src/server","src/index.ts","src/worker.ts"],Y=new Set([".ts",".tsx"]),R=(e,t=[])=>{let i;try{i=C(e)}catch{return t}if(i.isFile())return Y.has(w(e))&&!f(I(e),!1,!1)&&t.push(e),t;if(!i.isDirectory())return t;for(const n of v(e))f(n,!0,!1)||R(m(e,n),t);return t},q=e=>{const t=P(e),i=_(e).map(o=>({displayPath:g(e,o),filePath:o})),n=new Set(i.map(o=>o.filePath)),r=V(t);for(const o of[...H.flatMap(c=>R(m(t,c))),...r===void 0?[]:[r]])n.has(o)||(n.add(o),i.push({displayPath:g(t,o),filePath:o}));return i},Q=e=>Array.isArray(e),T=(e,t,i,n)=>{const r=[];for(const{displayPath:o,filePath:c}of t){const l=e.getSourceFile(c)??e.addSourceFileAtPath(c);for(const u of l.getDescendantsOfKind(i)){const a=n(u,o);Q(a)?r.push(...a):a!==void 0&&r.push(a)}}return r},J=e=>_(e).map(t=>({displayPath:g(e,t),filePath:t})),Z=(e,t,i,n)=>T(e,J(t),i,n),xe=(e,t,i)=>Z(e,t,p.CallExpression,i),Se=(e,t,i)=>T(e,q(t),p.CallExpression,i),he=e=>$(e.getPropertyNameNode()??e.getNameNode()),x=(e,t)=>e?.getProperties().find(i=>!s.isSpreadAssignment(i)&&M(i)===t),ye=(e,t)=>{if(t){const o=e.getArguments()[0];return o&&(s.isArrowFunction(o)||s.isFunctionExpression(o))?o:void 0}const i=e.getArguments()[0];if(!i||!s.isObjectLiteralExpression(i))return;const n=x(i,"handler");if(!n||!s.isPropertyAssignment(n))return;const r=n.getInitializer();return r&&(s.isArrowFunction(r)||s.isFunctionExpression(r))?r:void 0},ve=(e,t)=>{if(!e||!s.isObjectLiteralExpression(e))return;const i=x(e,t);return i&&s.isPropertyAssignment(i)?i.getInitializer():void 0},ee=e=>{const t=e?.getParent();return s.isVariableDeclaration(e)&&s.isVariableDeclarationList(t)&&t.getDeclarationKind()===k.Const},te=e=>{let t=e,i=t.getParent();for(;i!==void 0&&(s.isParenthesizedExpression(i)||s.isAsExpression(i)||s.isSatisfiesExpression(i)||s.isTypeAssertion(i)||s.isNonNullExpression(i));)t=i,i=t.getParent();return t},h=e=>{const t=te(e),i=t.getParent();if(i===void 0)return!1;if(s.isBinaryExpression(i)){const r=i.getOperatorToken().getKind();return i.getLeft()===t&&r>=p.FirstAssignment&&r<=p.LastAssignment}if(s.isPrefixUnaryExpression(i)||s.isPostfixUnaryExpression(i)){const r=i.getOperatorToken();return r===p.PlusPlusToken||r===p.MinusMinusToken}return s.isDeleteExpression(i)?!0:s.isForOfStatement(i)||s.isForInStatement(i)?i.getInitializer()===t:s.isPropertyAssignment(i)?i.getInitializer()===t&&h(i):(s.isShorthandPropertyAssignment(i)||s.isSpreadAssignment(i)||s.isSpreadElement(i)||s.isObjectLiteralExpression(i)||s.isArrayLiteralExpression(i))&&h(i)},ie=e=>{const t=e?.getDeclarations().find(n=>s.isVariableDeclaration(n));if(!ee(t))return;const i=t.getParent().getParent();return s.isVariableStatement(i)&&s.isSourceFile(i.getParent())?t.getInitializer():void 0},se=e=>ie(e.getSymbol()),Pe=e=>{if(!e)return;if(s.isObjectLiteralExpression(e))return e;if(!s.isIdentifier(e))return;const t=se(e);return t!==void 0&&s.isObjectLiteralExpression(t)?t:void 0},E=e=>{let t=e;for(;t&&(s.isAsExpression(t)||s.isSatisfiesExpression(t)||s.isParenthesizedExpression(t)||s.isNonNullExpression(t));)t=t.getExpression();return t},ne=(e,t)=>{let i=E(e);for(;s.isAwaitExpression(i)||s.isPropertyAccessExpression(i)||s.isElementAccessExpression(i)||s.isCallExpression(i);){const n=s.isCallExpression(i)?t?.(i):void 0;if(n!==void 0)return{verdict:n};i=E(i.getExpression())}return{root:i}},Ae=e=>ne(e).root,Fe=e=>s.isArrowFunction(e)||s.isConstructorDeclaration(e)||s.isFunctionDeclaration(e)||s.isFunctionExpression(e)||s.isGetAccessorDeclaration(e)||s.isMethodDeclaration(e)||s.isSetAccessorDeclaration(e),we=(e,t)=>e?.compilerNode===t.compilerNode,Oe=e=>{if(s.isPropertyAccessExpression(e))return{member:e.getName(),object:e.getExpression()};const t=s.isElementAccessExpression(e)?e.getArgumentExpression():void 0;return s.isElementAccessExpression(e)&&s.isStringLiteral(t)?{member:t.getLiteralValue(),object:e.getExpression()}:void 0},Ne=e=>{const t=e.getParent();return s.isReturnStatement(t)||s.isArrowFunction(t)&&t.getBody()===e?e.getFirstAncestor(n=>s.isFunctionLikeDeclaration(n)||s.isArrowFunction(n)):void 0},Le=e=>{const t=E(e);return t&&s.isCallExpression(t)?t:void 0},_e=e=>{const t=e.getExportAssignment(r=>!r.isExportEquals());if(!t)return;const i=t.getExpression();if(!s.isIdentifier(i))return i;const n=i.getSymbol()?.getValueDeclaration();return n&&s.isVariableDeclaration(n)?n.getInitializer():i},Re=e=>{const t=e.getArguments()[1];return t&&s.isStringLiteral(t)?t.getLiteralValue():""},Te=(e,t)=>{if(!s.isObjectLiteralExpression(e))return;const i=x(e,t);if(!i||!s.isPropertyAssignment(i))return;const n=i.getInitializer();return n&&s.isStringLiteral(n)?n.getLiteralText():void 0},re=e=>{const t=e.getStatements(),[i]=t;if(t.length!==1||i===void 0||!s.isReturnStatement(i))return;const n=i.getExpression();return n!==void 0&&s.isObjectLiteralExpression(n)?n:void 0},be=e=>{if(s.isObjectLiteralExpression(e))return e;if(s.isParenthesizedExpression(e)){const t=e.getExpression();return s.isObjectLiteralExpression(t)?t:void 0}return s.isBlock(e)?re(e):void 0},Ce=e=>(t,i,n)=>{if(s.isStringLiteral(t)||s.isNoSubstitutionTemplateLiteral(t))return t.getLiteralValue();throw j(t,`${e} "${i}": \`${n}\` must be a static string literal — it is deploy configuration codegen writes into wrangler.jsonc`)},oe=new Set(["api","internal"]),Ie=new Set(["run","runAction","runMutation","runQuery"]),ce=e=>{if(e===void 0||!s.isPropertyAccessExpression(e))return;const t=[];let i=e;for(;s.isPropertyAccessExpression(i);)t.unshift(i.getName()),i=i.getExpression();return s.isIdentifier(i)&&oe.has(i.getText())&&t.length>=2?t:void 0},De=e=>{const t=ce(e);return t===void 0?void 0:`${t.slice(0,-1).join("_")}:${String(t.at(-1))}`};export{Ie as RUN_METHODS,B as TS_EXTENSION_RE,he as bindingKeyName,Ae as chainRootOf,xe as collectCallRows,Z as collectNodeRows,Se as collectSecurityCallRows,_e as defaultExportExpression,x as findObjectProperty,De as functionKeyOf,ce as functionReferenceSegments,ye as handlerOf,ee as isConstDeclaration,Fe as isFunctionLike,we as isSameNode,me as isTestPath,h as isWriteTarget,Re as limitNameOf,_ as listLunoraSourceFiles,q as listSecurityScanFiles,g as lunoraRelativePath,Oe as memberAccessOf,be as objectLiteralFromCallbackBody,Pe as optionsObjectLiteral,te as outermostValueWrapper,ve as propertyInitializer,M as propertyKeyName,$ as propertyNameText,Ne as returningFunctionOf,Ce as stringPropertyFor,Te as stringPropertyOf,ie as symbolConstInitializer,E as unwrapExpression,Le as unwrapToCallExpression,ne as walkChain};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{statSync as E,readFileSync as y}from"node:fs";import{basename as P}from"node:path";import{createJiti as x}from"jiti";import{Project as S,Node as i}from"ts-morph";import{a as d}from"./property-name-7cBlgK_O.mjs";import{findProjectConfigFile as v}from"./PROJECT_CONFIG_FILENAMES-CLfsyvjA.mjs";import{PROJECT_CONFIG_FILENAMES as q}from"./PROJECT_CONFIG_FILENAMES-CLfsyvjA.mjs";const f=new Map,U=async t=>{const r=v(t);if(r===void 0)return{};let e;try{const a=E(r);e=`${String(a.mtimeMs)}:${String(a.size)}`}catch{return{}}const n=f.get(r);if(n?.key===e)return n.value;const s=(async()=>{try{const o=(await x(r,{interopDefault:!1,moduleCache:!1}).import(r))?.default;return{config:o!==null&&typeof o=="object"?o:void 0}}catch(a){return{error:a instanceof Error?a.message:String(a)}}})();return f.set(r,{key:e,value:s}),s},j=t=>{let e=t.getExportAssignments().find(n=>!n.isExportEquals())?.getExpression();for(;e!==void 0&&(i.isSatisfiesExpression(e)||i.isAsExpression(e)||i.isParenthesizedExpression(e));)e=e.getExpression();if(e!==void 0&&i.isIdentifier(e))for(e=t.getVariableDeclaration(e.getText())?.getInitializer();e!==void 0&&(i.isSatisfiesExpression(e)||i.isAsExpression(e));)e=e.getExpression();return e!==void 0&&i.isObjectLiteralExpression(e)?e:void 0},g=(t,r)=>i.isPropertyAssignment(t)?t.getInitializer():r.getVariableDeclaration(d(t))?.getInitializer(),b=t=>{let r=t;for(;r!==void 0&&(i.isSatisfiesExpression(r)||i.isAsExpression(r)||i.isParenthesizedExpression(r));)r=r.getExpression();return r},m=(t,r,e)=>{const n=b(t);if(n===void 0||!i.isObjectLiteralExpression(n))return{unreadable:!0};const s=n.getProperties(),a=s.filter(u=>i.isPropertyAssignment(u)&&!i.isComputedPropertyName(u.getNameNode())||i.isShorthandPropertyAssignment(u));if(a.length!==s.length)return{unreadable:!0};const o=a.findLast(u=>d(u)===e);if(o===void 0)return{absent:!0};const l=g(o,r);return l===void 0?{unreadable:!0}:{literal:l}},A=["exportName","file","reason","rule"],h=t=>{const r=b(t);if(r===void 0||!i.isObjectLiteralExpression(r))return;const e={};for(const l of r.getProperties()){if(!i.isPropertyAssignment(l)||i.isComputedPropertyName(l.getNameNode()))return;const u=d(l),c=b(l.getInitializer());if(!A.includes(u)||c===void 0||!i.isStringLiteral(c)&&!i.isNoSubstitutionTemplateLiteral(c))return;e[u]=c.getLiteralValue()}const{exportName:n,file:s,reason:a,rule:o}=e;return n?.trim()&&s?.trim()&&a?.trim()&&o?.trim()?{exportName:n,file:s,reason:a,rule:o}:void 0},O=(t,r)=>{const e=m(t,r,"accept");if("absent"in e)return{};const n="literal"in e?b(e.literal):void 0;if(n===void 0||!i.isArrayLiteralExpression(n))return{acceptUnreadable:!0};const s=[];for(const a of n.getElements()){const o=h(a);if(o===void 0)return{acceptUnreadable:!0};s.push(o)}return{accept:s}},N=(t,r)=>{const e=m(t,r,"minSeverity"),n=O(t,r);return"absent"in e?{advisor:n}:"literal"in e&&i.isStringLiteral(e.literal)?{advisor:{...n,minSeverity:e.literal.getLiteralValue()}}:{advisor:{...n,unreadable:!0}}},C=(t,r)=>{const e=m(t,r,"exclude");if("absent"in e)return{codegen:{}};if(!("literal"in e)||!i.isArrayLiteralExpression(e.literal))return{codegen:{unreadable:!0}};const n=[];for(const s of e.literal.getElements()){if(!i.isStringLiteral(s)&&!i.isNoSubstitutionTemplateLiteral(s)||s.getLiteralValue().startsWith("!"))return{codegen:{unreadable:!0}};n.push(s.getLiteralValue())}return{codegen:{exclude:n}}},z=(t,r)=>{const e=m(t,r,"merge");return"absent"in e?{durableObjects:{}}:"literal"in e&&(i.isTrueLiteral(e.literal)||i.isFalseLiteral(e.literal))?{durableObjects:{merge:e.literal.getLiteralValue()}}:{durableObjects:{unreadable:!0}}},w=new Map([["advisor",{advisor:{unreadable:!0}}],["codegen",{codegen:{unreadable:!0}}],["durableObjects",{durableObjects:{unreadable:!0}}],["remote",{unreadable:!0}],["target",{unreadable:!0}]]),L=(t,r)=>{const e=t.getProperty(r);if(e!==void 0)return(i.isPropertyAssignment(e)?e.getInitializer():void 0)??"unreadable"},p=(t,r)=>{const e=L(t,r);if(e!==void 0)return e!=="unreadable"&&(i.isStringLiteral(e)||i.isNoSubstitutionTemplateLiteral(e))?e.getLiteralValue():!1},I=t=>{const r=L(t,"rpc");if(r!==void 0)return r!=="unreadable"&&i.isFalseLiteral(r)?!1:"unreadable"},D=t=>{const r=b(t);if(r===void 0||!i.isObjectLiteralExpression(r))return{services:{unreadable:!0}};const e={};for(const n of r.getProperties()){if(!i.isPropertyAssignment(n)||i.isComputedPropertyName(n.getNameNode()))return{services:{unreadable:!0}};const s=b(n.getInitializer());if(s===void 0||!i.isObjectLiteralExpression(s)||s.getProperties().some(u=>!i.isPropertyAssignment(u)))return{services:{unreadable:!0}};const a=p(s,"dir"),o=p(s,"entrypoint"),l=I(s);if(typeof a!="string"||o===!1||l==="unreadable")return{services:{unreadable:!0}};e[d(n)]={dir:a,...o===void 0?{}:{entrypoint:o},...l===void 0?{}:{rpc:l}}}return{services:{declared:e}}},M=(t,r)=>{if(i.isGetAccessorDeclaration(t)||i.isMethodDeclaration(t))return w.get(d(t))??{};if(!i.isPropertyAssignment(t)&&!i.isShorthandPropertyAssignment(t))return{};const e=d(t);if(e==="advisor")return N(g(t,r),r);if(e==="services")return D(g(t,r));if(e==="codegen")return C(g(t,r),r);if(e==="durableObjects")return z(g(t,r),r);if(e!=="target"&&e!=="remote")return{};const n=g(t,r);return n===void 0?{unreadable:!0}:e==="target"?i.isStringLiteral(n)?{target:n.getLiteralValue()}:{unreadable:!0}:i.isTrueLiteral(n)||i.isFalseLiteral(n)?{remote:n.getLiteralValue()}:i.isObjectLiteralExpression(n)?{remote:!0}:{unreadable:!0}},V=t=>{const r=v(t);if(r===void 0)return{};let e;try{e=y(r,"utf8")}catch{return{unreadable:!0}}const s=new S({compilerOptions:{allowJs:!0},skipFileDependencyResolution:!0,skipLoadingLibFiles:!0,useInMemoryFileSystem:!0}).createSourceFile(P(r),e,{overwrite:!0}),a=j(s);if(a===void 0)return{unreadable:!0};if(a.getProperties().some(l=>i.isSpreadAssignment(l))){const l=u=>a.getProperties().some(c=>!i.isSpreadAssignment(c)&&d(c)===u);return{...l("advisor")?{advisor:{unreadable:!0}}:{},...l("codegen")?{codegen:{unreadable:!0}}:{},...l("durableObjects")?{durableObjects:{unreadable:!0}}:{},...l("services")?{services:{unreadable:!0}}:{},unreadable:!0}}let o={};for(const l of a.getProperties())o={...o,...M(l,s)};return o},G=t=>{const{durableObjects:r}=V(t);return r?.unreadable&&console.warn("@lunora/codegen: `durableObjects.merge` in lunora.config is not a boolean literal — the Durable Object classes stay separate."),r?.merge===!0};export{q as PROJECT_CONFIG_FILENAMES,v as findProjectConfigFile,U as loadProjectConfig,G as readMergeDurableObjects,V as readProjectConfigLiterals};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{basename as b}from"node:path";import{Node as d}from"ts-morph";import{diagnosticAt as c}from"./CodegenDiagnosticError-BUXlG3P-.mjs";import{listLunoraSourceFiles as $,lunoraRelativePath as v,unwrapToCallExpression as E,defaultExportExpression as S,findObjectProperty as M}from"./isTestPath-
|
|
1
|
+
import{basename as b}from"node:path";import{Node as d}from"ts-morph";import{diagnosticAt as c}from"./CodegenDiagnosticError-BUXlG3P-.mjs";import{listLunoraSourceFiles as $,lunoraRelativePath as v,unwrapToCallExpression as E,defaultExportExpression as S,findObjectProperty as M}from"./isTestPath-C3QumE88.mjs";import{s as g}from"./dispatch-namespace-DwTjD7BU.mjs";const h=(e,o)=>e.find(t=>t.ownsFolder!==!1&&o.startsWith(`${t.name}/`))?.name,F="module.ts",w=(e,o,t)=>{if(d.isStringLiteral(e)||d.isNoSubstitutionTemplateLiteral(e))return e.getLiteralValue();throw c(e,`module "${o}": \`${t}\` must be a static string literal — codegen reads it without running the file`)},L=(e,o,t)=>{if(!d.isArrayLiteralExpression(e))throw c(e,`module "${o}": \`${t}\` must be an inline array of table names`);return e.getElements().map(n=>w(n,o,t))},p=(e,o,t)=>{const n=M(e,o);if(n!==void 0){if(!d.isPropertyAssignment(n))throw c(n,`module "${t}": write \`${o}\` inline as \`${o}: …\` — codegen reads it without running the file`);return n.getInitializerOrThrow()}},A=(e,o,t)=>{const n=e.getSourceFile(o)??e.addSourceFileAtPath(o),s=E(S(n)),a=s?.getExpression();if(!s||!a||!d.isIdentifier(a)||a.getText()!=="defineModule")return;if(t==="")throw c(s,"defineModule: lunora/module.ts would make the whole app one module — move it into the folder it describes (lunora/<module>/module.ts)");const i=s.getArguments()[0],m={name:t,tables:[]};if(i===void 0)return m;if(!d.isObjectLiteralExpression(i))throw c(i,`module "${t}": defineModule must be passed an inline object literal`);const r=p(i,"description",t);r!==void 0&&(m.description=w(r,t,"description"));const l=p(i,"tables",t);return l!==void 0&&(m.tables=L(l,t,"tables")),m},k=(e,o)=>{const t=[];for(const n of $(o)){if(b(n)!==F)continue;const s=v(o,n),a=A(e,n,s==="module"?"":s.slice(0,-7));a&&t.push(a)}return t.toSorted((n,s)=>n.name.localeCompare(s.name))},T=(e,o)=>{const t=new Set(e.map(r=>r.name)),n=new Set(e.flatMap(r=>r.tables)),s=o.tables.filter(r=>r.extensionKey!==void 0&&!n.has(r.name)),a=Map.groupBy(s,r=>String(r.extensionKey)),i=e.map(r=>{const l=a.get(r.name);return l===void 0?r:{...r,tables:[...r.tables,...l.map(u=>u.name)]}}),m=[...a].filter(([r])=>!t.has(r)).map(([r,l])=>{const u=l.every(f=>f.extensionFromPackage===!0);return{installed:!0,name:r,...u?{ownsFolder:!1}:{},tables:l.map(f=>f.name)}});return[...i,...m].toSorted((r,l)=>r.name.localeCompare(l.name))},x=e=>{for(const o of e){const t=e.find(n=>n.name.startsWith(`${o.name}/`));if(t)throw new Error(`@lunora/codegen: module "${t.name}" is nested inside ${o.installed===!0?"installed component":"module"} "${o.name}" — a file can belong to one module only, so move one of the two`)}},y=(e,o)=>{const t=new Set(o.tables.map(s=>s.name)),n=new Map;for(const s of e)for(const a of s.tables){if(!t.has(a))throw new Error(`@lunora/codegen: module "${s.name}" declares table "${a}", which lunora/schema.ts does not define`);const i=n.get(a);if(i!==void 0)throw new Error(`@lunora/codegen: table "${a}" is claimed by both module "${i}" and module "${s.name}" — a table has one owner`);n.set(a,s.name)}},C=(e,o,t)=>{if(e.length===0)return;const n=new Set(o.map(s=>s.name));for(const s of t){const a=g(s);if(h(o,s)===void 0&&n.has(a))throw new Error(`@lunora/codegen: lunora/${s}.ts sits beside module "${a}" and shares its name — move it into lunora/${a}/ or rename one of them`)}},z=(e,o,t)=>{const n=T(e,o);return x(n),y(n,o),C(e,n,t),n},K=(e,o)=>h(e,o)??g(o);export{h as a,k as d,K as m,z as r};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{LunoraError as y}from"@lunora/errors";import{Node as i,VariableDeclarationKind as h}from"ts-morph";import{diagnosticAt as b}from"./CodegenDiagnosticError-BUXlG3P-.mjs";import{s as E}from"./property-name-7cBlgK_O.mjs";let f;const U=e=>{f=e},k=/^[A-Za-z_$][\w$]*$/u,p=new Set(["$defaultFn","$onUpdateFn","$type","default","defaultNow","nullable","serverDefault","unique"]),A=(e,t)=>{const r={notNull:!0,...e.column};switch(t){case"$defaultFn":case"default":case"defaultNow":case"serverDefault":{r.hasDefault=!0;break}case"$onUpdateFn":{r.hasOnUpdate=!0;break}case"$type":break;case"nullable":{r.notNull=!1;break}case"unique":{r.unique=!0;break}}return{...e,column:r}},N=new Set(["any","bigint","boolean","bytes","date","geoPoint","null","number","string","timestamp"]),m=new Set(["check","email","int","length","max","min","pattern","positive","url"]),T=new Set(["meta"]),I=new Set(["strip"]),l=new Set,g=new Set,v=e=>{const t=e.getSymbol();let r=(t?.getAliasedSymbol()??t)?.getValueDeclaration();if(r!==void 0&&i.isShorthandPropertyAssignment(r)){const n=r.getValueSymbol();r=(n?.getAliasedSymbol()??n)?.getValueDeclaration()}if(!(r===void 0||!i.isVariableDeclaration(r)))return r.getInitializer()},L=e=>{const t=e.getParent();return!i.isVariableDeclaration(t)||t.getVariableStatement()?.getDeclarationKind()===h.Const},d=e=>{if(i.isParenthesizedExpression(e)||i.isAsExpression(e)||i.isSatisfiesExpression(e))return d(e.getExpression());if(i.isObjectLiteralExpression(e))return e;if(i.isPropertyAccessExpression(e)){const r=e.getSymbol()?.getValueDeclaration(),n=r!==void 0&&i.isPropertyAssignment(r)?r.getInitializer():void 0;return n===void 0?void 0:d(n)}if(!i.isIdentifier(e)||l.has(e))return;const t=v(e);if(!(t===void 0||!L(t))){l.add(e);try{return d(t)}finally{l.delete(e)}}},w="v",D=e=>{if(i.isIdentifier(e))return!0;let t=e;for(;i.isCallExpression(t);){const r=t.getExpression();if(!i.isPropertyAccessExpression(r))return!1;t=r.getExpression()}return i.isIdentifier(t)&&t.getText()===w},u=e=>{if(i.isIdentifier(e)&&!l.has(e)){const t=v(e);if(t!==void 0&&D(t)){l.add(e);try{return u(t)}finally{l.delete(e)}}}return i.isCallExpression(e)?F(e):{kind:"any",sourceText:e.getText()}},R=e=>{const t=d(e.getExpression());if(t===void 0||g.has(t))return{};g.add(t);try{return S(t)}finally{g.delete(t)}},O=e=>{throw b(e,`computed property name ${e.getText()} must be a string literal — codegen resolves object keys statically.`)},S=e=>{const t={};for(const r of e.getProperties()){if(i.isSpreadAssignment(r)){Object.assign(t,R(r));continue}const n=i.isShorthandPropertyAssignment(r);if(!n&&!i.isPropertyAssignment(r))continue;const a=n?r.getNameNode():r.getInitializer();if(!a)continue;const s=r.getNameNode(),o=E(s)??O(s);if(!k.test(o))throw new y("INTERNAL",`@lunora/codegen: field name is not a valid JS identifier: ${JSON.stringify(o)}`);t[o]=u(a)}return t},c=(e,t)=>e&&i.isExpression(e)?u(e):t,V=e=>e.sensitive===!0?!0:[e.inner,e.keyType,e.valueType,...e.members??[],...Object.values(e.shape??{})].some(r=>r!==void 0&&V(r)),x=e=>e===void 0?"undefined":i.isStringLiteral(e)||i.isNoSubstitutionTemplateLiteral(e)?JSON.stringify(e.getLiteralValue()):e.getText(),M=e=>{const t=e&&f?f(e):void 0;return t===void 0?{kind:"from"}:{kind:"from",tsType:t}},P=(e,t,r)=>{if(N.has(e))return{kind:e};const[n,a]=t;switch(e){case"array":return{inner:c(n,{kind:"any"}),kind:"array"};case"from":return M(n);case"id":{if(!n||!i.isStringLiteral(n))throw b(n??r,`v.id(...) target table must be a string literal — codegen resolves foreign-key targets statically. Got ${n?n.getText():"no argument"}.`);return{kind:"id",tableName:n.getLiteralText()}}case"literal":return{kind:"literal",literalValue:x(n)};case"object":return n&&i.isObjectLiteralExpression(n)?{kind:"object",shape:S(n)}:{kind:"object",shape:{}};case"optional":return{inner:c(n,{kind:"any"}),kind:"optional"};case"record":return{keyType:c(n,{kind:"string"}),kind:"record",valueType:c(a,{kind:"any"})};case"sensitive":return{...c(n,{kind:"any"}),sensitive:!0};case"storage":return n&&i.isStringLiteral(n)?{bucket:n.getLiteralText(),kind:"storage"}:{kind:"storage"};case"union":return{kind:"union",members:t.filter(s=>i.isExpression(s)).map(s=>u(s))};default:throw new y("INTERNAL",`Unsupported validator kind: ${e}`)}},$=e=>{const[t]=e;if(e.length!==1||t===void 0||!i.isNumericLiteral(t))return;const r=Number(t.getText().replaceAll("_",""));return Number.isSafeInteger(r)&&r>=0?r:void 0},F=e=>{const t=e.getExpression();if(!i.isPropertyAccessExpression(t))return{kind:"any",sourceText:e.getText()};const r=t.getName(),n=e.getArguments();if(p.has(r)||m.has(r)||T.has(r)||I.has(r)){const a=t.getExpression(),s=i.isExpression(a)?u(a):{kind:"any"};if(p.has(r))return A(s,r);if(!m.has(r))return s;const o=r==="max"&&s.kind==="string"?$(n):void 0;return o!==void 0?{...s,hasRefinement:!0,stringMaxLength:Math.min(s.stringMaxLength??o,o)}:{...s,hasRefinement:!0,unmodelledRefinement:!0}}return P(r,n,e)};export{u as a,S as p,d as r,U as s,V as v};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{Node as e}from"ts-morph";const i=t=>{if(e.isStringLiteral(t)||e.isNoSubstitutionTemplateLiteral(t)||e.isNumericLiteral(t))return t.getLiteralText();if(e.isComputedPropertyName(t)){const r=t.getExpression();return e.isStringLiteral(r)||e.isNoSubstitutionTemplateLiteral(r)?r.getLiteralText():void 0}return t.getText()},s=t=>i(t)??t.getText(),p=t=>s(t.getNameNode());export{p as a,s as p,i as s};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{d as E}from"./declared-output-Iaar469J.mjs";import{v as u}from"./shared-
|
|
1
|
+
import{d as E}from"./declared-output-Iaar469J.mjs";import{v as u}from"./shared-8vTRkL2-.mjs";const p=/import\("(?<spec>(?:\.\.?\/)*_generated\/[^"]+)"\)/gu,l=/^(?:\.\.?\/)*_generated\//u,i=/\.[A-Za-z]\w*$/u,R=t=>t.replaceAll(p,(e,r)=>{const o=r.replace(l,"./");return`import("${i.test(o)?o:`${o}.js`}")`}),_=/import\("(?<spec>[^"]+)"\)/gu,a="node_modules/",m=/^@types\//u,A=t=>t.replaceAll(_,(e,r)=>{const o=r.lastIndexOf(a);if(o===-1||o>0&&r[o-1]!=="/")return e;const s=r.slice(o+a.length);return s===""||m.test(s)?e:`import("${s}")`}),I=/import\("(?<spec>\.\.?\/[^"]+)"\)/gu,f=/^(?:\.\.?\/)+/u,g=t=>{const e=[];for(const r of t.split("/"))if(!(r===""||r===".")){if(r===".."&&e.length>0&&e.at(-1)!==".."){e.pop();continue}e.push(r)}return e.join("/")},S=(t,e)=>t.replaceAll(I,(r,o)=>{if(l.test(o.replace(f,"")))return r;const s=e.includes("/")?e.slice(0,e.lastIndexOf("/")):"",c=`../${g(`${s}/${o}`)}`;return`import("${i.test(c)?c:`${c}.js`}")`}),v=(t,e)=>R(S(A(t),e)),d=["client","do","errors","flags","observability","platform","ratelimit","runtime","server","values"],L=new RegExp(String.raw`import\("@lunora/(?<pkg>${d.join("|")})(?<subpath>/[^"]*)?"\)`,"gu"),T={flags:new Set(["/web"]),platform:new Set},M=(t,e)=>e?t.replaceAll(L,(r,o,s)=>{const n=T[o];return s&&n&&!n.has(s)?r:`import("lunorash/${o}${s??""}")`}):t,O=t=>["Doc","Id"].filter(e=>new RegExp(String.raw`(?<![.$\w])${e}<`,"u").test(t)),U=t=>E(t)?u(t.output):t.returnType;export{O as a,M as b,U as c,v as r};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{existsSync as g,readFileSync as p}from"node:fs";import{isAbsolute as w,resolve as m,join as u}from"node:path";import{ts as h}from"ts-morph";import{readProjectConfigLiterals as E}from"./loadProjectConfig-B7RmxIeD.mjs";const f=/^[A-Za-z_$][\w$]*$/u,$=["wrangler.jsonc","wrangler.json"],b=t=>`SERVICE_${t.replaceAll(/(?<=[a-z0-9])(?=[A-Z])/gu,"_").toUpperCase()}`,y=(t,e)=>{const r=$.map(n=>u(e,n)).find(n=>g(n));if(r===void 0){const n=g(u(e,"wrangler.toml"))?" (its wrangler.toml is not read — Lunora reads a service's config as JSON(C) only)":"";throw new Error(`@lunora/codegen: service "${t}" points at ${e}, which has no wrangler.jsonc / wrangler.json${n}`)}const o=h.parseConfigFileTextToJson(r,p(r,"utf8"));if(o.error!==void 0||typeof o.config!="object"||o.config===null)throw new Error(`@lunora/codegen: service "${t}": ${r} is not valid JSON(C)`);return{config:o.config,path:r}},v=(t,e)=>{const r=t.route??e.route,o=t.routes??e.routes;return!(r!==void 0||Array.isArray(o)&&o.length>0)&&(t.workers_dev??e.workers_dev)!==!1},S=(t,e,r)=>{if(!f.test(e))throw new Error(`@lunora/codegen: service key "${e}" must be an identifier — it becomes ctx.services.${e}`);if(r.entrypoint!==void 0&&!f.test(r.entrypoint))throw new Error(`@lunora/codegen: service "${e}": entrypoint "${r.entrypoint}" must name an exported WorkerEntrypoint class`);const o=w(r.dir)?r.dir:m(t,r.dir),{config:n,path:s}=y(e,o),{main:c,name:l}=n;if(typeof l!="string"||l==="")throw new Error(`@lunora/codegen: service "${e}": ${s} declares no Worker "name"`);if(typeof c!="string"||c==="")throw new Error(`@lunora/codegen: service "${e}": ${s} declares no "main" entry module`);const d=Object.entries(n.env??{}).map(([i,a])=>[i,a??{}]);return{binding:b(e),...r.entrypoint===void 0?{}:{entrypoint:r.entrypoint},envWorkers:Object.fromEntries(d.flatMap(([i,a])=>typeof a.name=="string"&&a.name!==""?[[i,a.name]]:[])),main:m(o,c),name:e,publicScopes:[...v(n,n)?[""]:[],...d.filter(([,i])=>v(i,n)).map(([i])=>i)],...r.entrypoint===void 0||r.rpc===!1?{}:{rpcEntrypoint:r.entrypoint},worker:l,wranglerPath:s}},j=t=>{const{services:e}=E(t);if(e?.unreadable===!0)throw new Error('@lunora/codegen: lunora.config `services` must be an inline object of { dir: "…", entrypoint?: "…", rpc?: false } literals — codegen reads it without running the file');const r=Object.entries(e?.declared??{}).map(([o,n])=>S(t,o,n)).toSorted((o,n)=>o.name.localeCompare(n.name));for(const[o,n]of r.entries()){const s=r.slice(o+1).find(c=>c.binding===n.binding);if(s!==void 0)throw new Error(`@lunora/codegen: services "${n.name}" and "${s.name}" both map to the binding ${n.binding} — rename one`)}return r},A=t=>{try{return{services:j(t)}}catch(e){return{error:e instanceof Error?e.message:String(e),services:[]}}};export{A as readServiceBindings,j as resolveServiceBindings};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{CAPABILITIES as Re}from"./CAPABILITY_PROBES-brcmKenl.mjs";import{join as q,relative as m,dirname as Q,isAbsolute as Se,sep as De}from"node:path";import{ts as i,Project as Me}from"ts-morph";import{G as Z,a as $,u as Ce,d as Ne}from"./shared-
|
|
1
|
+
import{CAPABILITIES as Re}from"./CAPABILITY_PROBES-brcmKenl.mjs";import{join as q,relative as m,dirname as Q,isAbsolute as Se,sep as De}from"node:path";import{ts as i,Project as Me}from"ts-morph";import{G as Z,a as $,u as Ce,d as Ne}from"./shared-8vTRkL2-.mjs";import{p as Ae}from"./platform-8oj7iXQy.mjs";const ee=/(?:\.d)?\.([cm]?)tsx?$/u,Fe=t=>t.replace(ee,".d.$1ts"),te=(t,n)=>{const a=m(t,n).split(De).join("/").replace(ee,".$1js");return a.startsWith(".")?a:`./${a}`},ae=t=>t.replaceAll("\\","/"),E=(t,n,a)=>ae(q(t,Fe(m(n,a)))),Pe=t=>te(".",q("services",t.name,m(Q(t.wranglerPath),t.main))),We=t=>{const n=[],a=r=>{(i.isImportDeclaration(r)||i.isExportDeclaration(r))&&r.moduleSpecifier!==void 0&&i.isStringLiteral(r.moduleSpecifier)?n.push(r.moduleSpecifier):i.isImportTypeNode(r)&&i.isLiteralTypeNode(r.argument)&&i.isStringLiteral(r.argument.literal)&&n.push(r.argument.literal),i.forEachChild(r,a)};return a(t),n},Ge=(t,n)=>{const a=Q(t.wranglerPath),r=m(a,t.main);if(r.startsWith("..")||Se(r))throw new Error(`@lunora/codegen: service "${t.name}": its entry module (${t.main}) must be inside ${a} to be typed as RPC`);const d=q(n,"services",t.name),c=i.findConfigFile(a,o=>i.sys.fileExists(o)),p=new Me({compilerOptions:{composite:!1,declaration:!0,declarationMap:!1,emitDeclarationOnly:!0,incremental:!1,noEmit:!1,noEmitOnError:!1,outDir:d,rootDir:a},skipAddingFilesFromTsConfig:!0,...c===void 0?{}:{tsConfigFilePath:c}});p.addSourceFileAtPath(t.main),p.resolveSourceFileDependencies();const u={...p.getCompilerOptions(),preserveSymlinks:!0},x=new Map(p.getSourceFiles().map(o=>o.getFilePath()).filter(o=>!o.endsWith(".d.ts")&&!m(a,o).startsWith("..")).map(o=>[E(d,a,o),o])),y={};for(const o of p.emitToMemory({emitOnlyDtsFiles:!0}).getFiles()){const g=x.get(ae(o.filePath));if(g===void 0)continue;const h=i.createSourceFile(o.filePath,o.text,i.ScriptTarget.Latest,!1);let{text:f}=o;for(const b of We(h).toReversed()){const s=i.resolveModuleName(b.text,g,u,i.sys).resolvedModule?.resolvedFileName;if(s===void 0)continue;const T=E(d,a,s),v=x.has(T)?T:s;f=`${f.slice(0,b.getStart(h))}${JSON.stringify(te(Q(o.filePath),v))}${f.slice(b.getEnd())}`}y[m(n,o.filePath)]=`${Z}${f}`}if(y[m(n,E(d,a,t.main))]===void 0)throw new Error(`@lunora/codegen: service "${t.name}": TypeScript emitted no declaration for its entry module ${t.main}`);return y},je=(t,n=[])=>{const a=new Set;for(const r of t.tables)for(const d of Object.values(r.shape)){const c=Ce(d);c.kind==="storage"&&typeof c.bucket=="string"&&c.bucket!==""&&a.add(c.bucket)}for(const r of n)r!==""&&r!=="default"&&a.add(r);return["default",...[...a].toSorted((r,d)=>r.localeCompare(d))]},He=({agents:t=[],capabilities:n=new Set,containers:a=[],env:r,hasVectors:d=!0,hasFlags:c=!1,hasNotify:p=!1,identity:u,queues:x=[],schema:y,services:o=[],storageRuleBuckets:g=[],topics:h=[],useUmbrella:f=!1,workflows:b=[]}={})=>{const s=Ne(f),T=je(y??{tables:[]},g).map(e=>JSON.stringify(e)).join(" | "),v=e=>e.sandbox===!0?"SandboxContainerAccessor":"ContainerAccessor",re=[...new Set(a.map(e=>v(e)))].toSorted((e,l)=>e.localeCompare(l)),oe=a.length>0?`import type { ${re.join(", ")} } from "@lunora/container";
|
|
2
2
|
`:"",ne=a.length>0?`
|
|
3
3
|
readonly containers: {${a.map(e=>`
|
|
4
4
|
readonly ${e.exportName}: ${v(e)};`).join("")}
|