@lunora/vite 1.0.0-alpha.196 → 1.0.0-alpha.197

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.mjs CHANGED
@@ -1,3 +1,3 @@
1
- import{createRequire as i}from"node:module";import{cloudflare as l}from"@cloudflare/vite-plugin";import{detectAgentRules as s,claimAgentRulesHint as u,AGENT_RULES_HINT as c,detectFramework as f,resolveTargetOrThrow as d,isRunnableTarget as m,runnableTargetIds as p}from"@lunora/config";import{detectFramework as ar}from"@lunora/config";import g from"@visulima/vite-overlay";import{l as a}from"./packem_shared/log-DE48L4Oz.mjs";import{reconcileBindingsSafely as S,codegenPlugin as v}from"./packem_shared/codegenPlugin-DVaxvj10.mjs";import w from"./packem_shared/containerLogsPlugin-CWkqSCL3.mjs";import R from"./packem_shared/devStatePlugin-CcFV-eBl.mjs";import h from"./packem_shared/devVariablesPlugin-DY_bJXsX.mjs";import{frameworkComposePlugin as k}from"./packem_shared/CLASS_A_WIRING-CEzeqjr2.mjs";import{CLASS_A_WIRING as lr,GENERATED_CLASS_MODULES as sr,LUNORA_WORKER_VIRTUAL_ID as ur,buildWorkerEntrySource as cr,isAutoComposable as fr}from"./packem_shared/CLASS_A_WIRING-CEzeqjr2.mjs";import P from"./packem_shared/logStreamPlugin-DtOu5VX8.mjs";import{proxyCheckPlugin as A}from"./packem_shared/checkLunoraProxy-C9M8c5eS.mjs";import{checkLunoraProxy as mr}from"./packem_shared/checkLunoraProxy-C9M8c5eS.mjs";import{remoteBindingsPlugin as E}from"./packem_shared/planViteRemoteBindings-E3GdC6pY.mjs";import{planViteRemoteBindings as gr,withRemoteBindings as Sr}from"./packem_shared/planViteRemoteBindings-E3GdC6pY.mjs";import{lunoraSolutionFinders as T}from"./packem_shared/lunoraSolutionFinder--J0x2mAM.mjs";import{lunoraSolutionFinder as wr}from"./packem_shared/lunoraSolutionFinder--J0x2mAM.mjs";import{studioPlugin as _}from"./packem_shared/STUDIO_PATH-UztnV2ca.mjs";import{STUDIO_PATH as hr,buildStudioUrl as kr}from"./packem_shared/STUDIO_PATH-UztnV2ca.mjs";import{withWorkerStartupHint as x}from"./packem_shared/WORKER_STARTUP_HINT-COlRTY32.mjs";import{WORKER_STARTUP_HINT as Ar,augmentWorkerStartupError as Er,isWorkerEntryEvalError as Tr}from"./packem_shared/WORKER_STARTUP_HINT-COlRTY32.mjs";import{wranglerValidatorPlugin as O}from"./packem_shared/wranglerValidatorPlugin-BdKLAEoq.mjs";import{default as xr}from"./packem_shared/LUNORA_API_UPDATED_EVENT-CO2Rv2re.mjs";import{reconcileWranglerCrons as br}from"@lunora/config/cloudflare";const b=o=>({apply:"serve",configureServer(r){return()=>{s(o.projectRoot).installed||!u()||r.config.logger.warn(`
1
+ import{createRequire as i}from"node:module";import{cloudflare as l}from"@cloudflare/vite-plugin";import{detectAgentRules as s,claimAgentRulesHint as u,AGENT_RULES_HINT as c,detectFramework as f,resolveTargetOrThrow as d,isRunnableTarget as m,runnableTargetIds as p}from"@lunora/config";import{detectFramework as ar}from"@lunora/config";import g from"@visulima/vite-overlay";import{l as a}from"./packem_shared/log-DE48L4Oz.mjs";import{r as S,c as v}from"./packem_shared/codegen-plugin-dg384k5b.mjs";import w from"./packem_shared/containerLogsPlugin-CWkqSCL3.mjs";import R from"./packem_shared/devStatePlugin-CcFV-eBl.mjs";import h from"./packem_shared/devVariablesPlugin-DY_bJXsX.mjs";import{frameworkComposePlugin as k}from"./packem_shared/CLASS_A_WIRING-CEzeqjr2.mjs";import{CLASS_A_WIRING as lr,GENERATED_CLASS_MODULES as sr,LUNORA_WORKER_VIRTUAL_ID as ur,buildWorkerEntrySource as cr,isAutoComposable as fr}from"./packem_shared/CLASS_A_WIRING-CEzeqjr2.mjs";import P from"./packem_shared/logStreamPlugin-DtOu5VX8.mjs";import{proxyCheckPlugin as A}from"./packem_shared/checkLunoraProxy-C9M8c5eS.mjs";import{checkLunoraProxy as mr}from"./packem_shared/checkLunoraProxy-C9M8c5eS.mjs";import{remoteBindingsPlugin as E}from"./packem_shared/planViteRemoteBindings-E3GdC6pY.mjs";import{planViteRemoteBindings as gr,withRemoteBindings as Sr}from"./packem_shared/planViteRemoteBindings-E3GdC6pY.mjs";import{lunoraSolutionFinders as T}from"./packem_shared/lunoraSolutionFinder--J0x2mAM.mjs";import{lunoraSolutionFinder as wr}from"./packem_shared/lunoraSolutionFinder--J0x2mAM.mjs";import{studioPlugin as _}from"./packem_shared/STUDIO_PATH-UztnV2ca.mjs";import{STUDIO_PATH as hr,buildStudioUrl as kr}from"./packem_shared/STUDIO_PATH-UztnV2ca.mjs";import{withWorkerStartupHint as x}from"./packem_shared/WORKER_STARTUP_HINT-COlRTY32.mjs";import{WORKER_STARTUP_HINT as Ar,augmentWorkerStartupError as Er,isWorkerEntryEvalError as Tr}from"./packem_shared/WORKER_STARTUP_HINT-COlRTY32.mjs";import{wranglerValidatorPlugin as O}from"./packem_shared/wranglerValidatorPlugin-BdKLAEoq.mjs";import{default as xr}from"./packem_shared/LUNORA_API_UPDATED_EVENT-CO2Rv2re.mjs";import{reconcileWranglerCrons as br}from"@lunora/config/cloudflare";const b=o=>({apply:"serve",configureServer(r){return()=>{s(o.projectRoot).installed||!u()||r.config.logger.warn(`
2
2
  ${a(c)}
3
3
  `)}},name:"lunora:agent-rules-hint"}),y=o=>({async config(r,t){t.isPreview!==!0&&await S(o,{info:e=>{console.info(e)},warn:e=>{console.warn(e)}})},enforce:"pre",name:"lunora:bindings-provision"}),L=()=>({}),W={astro:"Astro",none:"standalone (SPA / SSR-less)",nuxt:"Nuxt","react-router":"React Router","solid-start":"SolidStart",sveltekit:"SvelteKit","tanstack-start":"TanStack Start","tanstack-start-solid":"TanStack Start (Solid)",vinext:"Next.js on Vite (vinext)"},D=o=>{const r=W[o.framework];return o.framework==="none"?a("no meta-framework detected — running standalone."):o.class==="B"?a(`detected ${r} — composition is handled by the framework adapter.`):a(`detected ${r} — composing the Lunora worker into one Cloudflare Worker.`)},C=(o,r)=>{let t=!1;const e=()=>{r.framework??=f(o.projectRoot)};return{config(){e()},configResolved(){e()},configureServer(){e(),!t&&r.framework!==void 0&&(t=!0,console.info(D(r.framework)))},name:"lunora:framework-detect"}},N=o=>{if(o===!1)return!1;const r=o===!0||o===void 0?{}:o;return{...r,forwardedConsoleMethods:r.forwardedConsoleMethods??["error","warn"],solutionFinders:[...T,...r.solutionFinders??[]]}},U=(o,r)=>{const t=d(o,r);if(!m(t)){const e=p();throw new Error(`target "${t}" has no command-line toolchain, so the Lunora Vite plugin cannot build or serve it — it can only generate for it (\`lunora codegen --target ${t}\`). Buildable targets: ${e.join(", ")}`)}return t},I=o=>{const r=o??{},t=r.schemaDir??"lunora";let e;r.cloudflare===!1?e=!1:r.cloudflare===!0||r.cloudflare===void 0?e={}:e=r.cloudflare;const n=r.projectRoot??process.cwd();return{allowUnauthenticatedShardAccess:r.allowUnauthenticatedShardAccess??!1,apiSpec:r.apiSpec??"openapi",cloudflare:e,studio:r.studio??!0,generatedDir:`${t}/_generated`,overlay:N(r.overlay),projectRoot:n,schemaDir:t,shard:r.shard??{},target:U(n,r.target),validateWrangler:r.validateWrangler??!0}},er=o=>{const r=I(o),t=L(),e=[C(r,t),k(r,t),h(r),y(r),v(r),P(),R(r),b(r),A()];r.studio&&e.push(_(r)),r.validateWrangler&&e.push(O(r)),r.overlay!==!1&&e.push(g(r.overlay)),e.push(w(r));const n=r.cloudflare===!1?void 0:{...r.cloudflare};return e.push(E(n,{projectRoot:r.projectRoot})),n!==void 0&&e.push(...x(l(n))),e},or=i(import.meta.url)("../package.json").version;export{lr as CLASS_A_WIRING,sr as GENERATED_CLASS_MODULES,xr as LUNORA_API_UPDATED_EVENT,ur as LUNORA_WORKER_VIRTUAL_ID,hr as STUDIO_PATH,or as VERSION,Ar as WORKER_STARTUP_HINT,Er as augmentWorkerStartupError,kr as buildStudioUrl,cr as buildWorkerEntrySource,mr as checkLunoraProxy,v as codegenPlugin,w as containerLogsPlugin,ar as detectFramework,R as devStatePlugin,h as devVariablesPlugin,k as frameworkComposePlugin,fr as isAutoComposable,Tr as isWorkerEntryEvalError,P as logStreamPlugin,er as lunora,wr as lunoraSolutionFinder,T as lunoraSolutionFinders,gr as planViteRemoteBindings,A as proxyCheckPlugin,br as reconcileWranglerCrons,E as remoteBindingsPlugin,N as resolveOverlayOption,_ as studioPlugin,Sr as withRemoteBindings,x as withWorkerStartupHint,O as wranglerValidatorPlugin};
@@ -0,0 +1,3 @@
1
+ import{existsSync as j,readFileSync as X}from"node:fs";import{join as N,resolve as p,sep as k,basename as q}from"node:path";import{listLunoraSourceFiles as Q,findTsconfig as Y,runCodegen as Z,describeErrorLevelFindings as ee,createCodegenProject as ne,refreshCodegenProject as re,CodegenDiagnosticError as te}from"@lunora/codegen";import{LUNORA_CONFIG_FILE as V,inferLunoraBindings as oe,isCodegenDisabled as ie,CODEGEN_ENV as x,runPostCodegenHook as M}from"@lunora/config";import{findWranglerFile as ae,readWranglerJsonc as ce,reconcileWranglerBindings as se,reconcileWranglerCrons as le,describePreservedCrons as de,reconcileWranglerCompatibilityDate as fe,WRANGLER_FILES as ge,collectWranglerSecretVariables as ue}from"@lunora/config/cloudflare";import{isRunnableDevEnvironment as he}from"vite";import me from"./LUNORA_API_UPDATED_EVENT-CO2Rv2re.mjs";import{L as d,a as A}from"./log-DE48L4Oz.mjs";import{createHash as pe}from"node:crypto";import{r as we,a as ye}from"./server-close-Qoh4i6Ay.mjs";const F=(n,r)=>{try{const{parsed:t,text:e}=ce(n);return t===void 0?`raw:${e}`:JSON.stringify(r?r(t):t)}catch{return"unreadable"}},$e=n=>{const r={...n},{triggers:t}=r;if(t!==null&&typeof t=="object"){const e={...t};delete e.crons,Object.keys(e).length>0?r.triggers=e:delete r.triggers}return r},T=n=>{const r=ae(n),t=r===void 0?"absent":F(r,$e),e=N(n,V),o=j(e)?F(e):"absent";return`${t}\0${o}`},ve=async(n,r,t)=>{try{const e=await oe({projectRoot:n.projectRoot,schemaDir:n.schemaDir}),o=se(n.projectRoot,e);o.changed&&r.info?.(`${d} inferred bindings → ${o.added.join(", ")} (written to ${o.wranglerPath??"wrangler.jsonc"})`);for(const c of o.warnings)r.warn(`${d} ${c}`);o.exportGaps.length>0&&t?.(o.exportGaps)}catch(e){const o=e instanceof Error?e.message:String(e);r.warn(`${d} binding inference skipped: ${o}`)}},L=new Map,Se=(n,r,t)=>{try{const e=le(n,r);e.changed&&t.info?.(`${d} synced ${r.length.toFixed(0)} cron trigger(s) into ${e.wranglerPath??"wrangler.jsonc"}`);for(const l of e.warnings)t.warn(`${d} ${l}`);const o=e.preserved.join("\0"),c=de(e.preserved);c!==void 0&&(e.changed||L.get(n)!==o)&&t.info?.(`${d} ${c}`),L.set(n,o)}catch(e){const o=e instanceof Error?e.message:String(e);t.warn(`${d} cron trigger sync skipped: ${o}`)}try{const e=fe(n);e.changed&&t.info?.(`${d} bumped compatibility_date to ${e.date??"unknown"} (Workers Cache enabled) → ${e.wranglerPath??"wrangler.jsonc"}`)}catch(e){const o=e instanceof Error?e.message:String(e);t.warn(`${d} compatibility date sync skipped: ${o}`)}},be=100,H=300,G=2,Ee=n=>{let r,t,e=0;const o=()=>{r&&(clearTimeout(r),r=void 0)},c=(u,h)=>{t&&clearTimeout(t),t=setTimeout(()=>{if(t=void 0,n.fingerprint()!==u){if(e+=1,e>G){n.logger.warn(`${d} \`postcodegen\` keeps rewriting the schema sources — stopping after ${String(G)} reruns. Make the hook idempotent or move it off the schema directory.`);return}n.logger.info(`${d} schema changed while \`postcodegen\` was running — regenerating`),h()}},H)},l=u=>{n.regenerate(u,h=>{c(h,()=>{l(u)})})};return{cancelPending:o,dispose:()=>{o(),t&&(clearTimeout(t),t=void 0)},onSave:u=>{o(),e=0,r=setTimeout(()=>{r=void 0,l(u)},be)}}},I=n=>{if(!j(n))return"unreadable";const r=Q(n),t=N(n,"schema.ts");j(t)&&r.push(t);const e=pe("sha256");for(const o of r.toSorted((c,l)=>c.localeCompare(l)))try{e.update(o).update("\0").update(X(o))}catch{}return e.digest("hex")},B=/[/\\]tsconfig\..+\.json$/u,ke=n=>{const r=n.map(e=>` • ${e.kind} "${e.exportName}" — class ${e.className} is not exported by your worker entry.`),t=[...new Set(n.map(e=>e.module))].map(e=>` export * from "./lunora/_generated/${e}";`);return[`[lunora] ${String(n.length)} declared ${n.length===1?"binding is":"bindings are"} not exported by your worker entry — \`wrangler deploy\` will fail.`,...r,"","Add to your worker entry:",...t].join(`
2
+ `)},Re=n=>{const{advisoryNames:r,platformDiagnosticNames:t}=ee(n),e=[...new Set([...r,...t])].toSorted((c,l)=>c.localeCompare(l));if(e.length===0)return;const o=e.length===1?"advisory/platform diagnostic":"advisories/platform diagnostics";return`${d} ${String(e.length)} ERROR-level ${o} (${e.join(", ")}) — see the log above for detail.`},je=(n,r,t)=>{if(r.warn(`${d} schema.ts not found at ${n} — codegen skipped`),t!==void 0){const e=`schema.ts not found at ${n} — generated output is now stale`;t.onError(new Error(e),e)}},U=(n,r,t,e)=>{const o=N(n.projectRoot,n.schemaDir,"schema.ts");if(!j(o))return je(o,r,t),{};try{const c=Z({apiSpec:n.apiSpec,lunoraDirectory:n.schemaDir,project:e,projectRoot:n.projectRoot,target:n.target,wranglerVariables:ue(n.projectRoot)});Se(n.projectRoot,c.cronTriggers,r);for(const l of c.advisories){const u=A(l.level,l.name,l.detail,l.remediation);l.level==="ERROR"?r.error(u):r.warn(u)}for(const l of c.platformDiagnostics){const u=A(l.level==="error"?"ERROR":"WARN",l.name,l.message,l.remediation);l.level==="error"?r.error(u):r.warn(u)}return{blockingMessage:Re(c),outputDirectory:p(c.outputDirectory)}}catch(c){const l=c instanceof Error?c.message:String(c);return r.error(`${d} codegen failed: ${l}`),t?.onError(c,l),{failure:`${d} codegen failed: ${l}`}}},Ce=(n,r,t)=>{let e;for(const[o,c]of Object.entries(n.environments)){if(o==="client"){e=c;continue}he(c)||c.hot.send({path:"*",triggeredBy:r,type:"full-reload"})}if(e===void 0){n.hot.send({type:"full-reload"});return}if(t){e.hot.send({type:"full-reload"});return}e.hot.send({event:me,type:"custom"})},Fe=n=>{const r=p(n.projectRoot,n.schemaDir),t=ie(process.env[x]);let e=p(n.projectRoot,n.generatedDir),o=0,c=!1,l;const u=new Map;let h,C=!1,D=!1,E;return{config(i,w){E=w.command},async buildStart(){const i={error:g=>{console.error(g)},info:g=>{console.info(g)},warn:g=>{console.warn(g)}},w=E!=="build"&&t,{blockingMessage:y,failure:R,outputDirectory:$}=w?{}:U(n,i);if(E==="build"&&R!==void 0&&this.error(R),$!==void 0){e=$,c=!0;let g;try{g=await M({cwd:n.projectRoot,logger:i})}finally{c=!1}g.ran&&(o=Date.now()),E==="build"&&g.error!==void 0&&this.error(g.error)}E==="build"&&y!==void 0&&this.error(y),await ve(n,i,g=>{l?.hot.send({err:{loc:void 0,message:ke(g),stack:""},type:"error"})}),l!==void 0&&(h=T(n.projectRoot),C=!0)},configureServer(i){l=i,i.watcher.add(r),h=T(n.projectRoot),C=!1;const w={error:a=>{i.config.logger.error(a)},info:a=>{i.config.logger.info(a)},warn:a=>{i.config.logger.warn(a)}};let y=!1;const R={onError(a,s){y=!0;const f=a instanceof te?{column:a.column,file:a.file,line:a.line}:void 0,b=f===void 0?`[lunora] codegen failed: ${s}
3
+ (see terminal for full stack trace and file location)`:`[lunora] codegen failed: ${s}`;l?.hot.send({err:{loc:f,message:b,stack:a instanceof Error?a.stack??"":""},type:"error"})}},$=(a,s)=>a===s||a.startsWith(s+k);let g=!1,m;const J=()=>{for(const a of Object.values(i.environments)){const s=a.moduleGraph;for(const f of s.idToModuleMap.values())f.id&&$(f.id,e)&&s.invalidateModule(f)}},z=async(a,s)=>{try{if(g)return;m===void 0?m=ne(r):re(m,r);const{outputDirectory:f}=U(n,w,R,m);if(f===void 0){m=void 0;return}e=f;const b=I(r);c=!0;let P;try{P=await M({cwd:n.projectRoot,logger:w})}finally{c=!1}if(P.ran&&(o=Date.now(),s(b)),P.error!==void 0)return;J(),Ce(i,a,y),y=!1}catch(f){w.error(`${d} codegen watch: ${f instanceof Error?f.message:String(f)}`)}},_=Ee({fingerprint:()=>I(r),logger:w,regenerate:(a,s)=>{z(a,s)}}),v=a=>{const s=p(a);if(B.test(s)){m=void 0;return}if(s.endsWith(`${k}tsconfig.json`)&&s===Y(r)){m=void 0;return}if($(s,r)&&!$(s,e)&&s.endsWith(".ts")&&!(s.includes(`${k}__tests__${k}`)||s.endsWith(".test.ts")||s.endsWith(".spec.ts"))){if(c||Date.now()-o<H){_.cancelPending();return}_.onSave(s)}},O=a=>{const s=p(a);(s.endsWith(`${k}tsconfig.json`)||B.test(s))&&(m=void 0)};t?i.config.logger.info(`${d} codegen watch disabled (${x}) — _generated/ is written only by an explicit \`lunora codegen\``):(i.watcher.on("add",v),i.watcher.on("change",v),i.watcher.on("unlink",v),i.watcher.on("unlink",O));const W=new Set([...ge.map(a=>p(n.projectRoot,a)),p(n.projectRoot,V)]);for(const a of W)i.watcher.add(a);const S=a=>{if(!W.has(p(a))||D)return;const s=T(n.projectRoot);if(!C){h=s;return}if(h===void 0){h=s;return}s!==h&&(h=s,D=!0,i.config.logger.info(`${d} ${q(p(a))} changed — restarting dev server`),Promise.resolve(i.restart()).finally(()=>{D=!1}).catch(f=>{const b=f instanceof Error?f.message:String(f);i.config.logger.error(`${d} dev server restart failed: ${b} — keeping the running server; re-save your config to retry.`),i.hot.send({err:{loc:void 0,message:`[lunora] dev server restart failed: ${b}`,stack:""},type:"error"})}))};i.watcher.on("add",S),i.watcher.on("change",S),i.watcher.on("unlink",S);const K=()=>{g||(g=!0,m=void 0,_.dispose(),i.watcher.off("add",v),i.watcher.off("change",v),i.watcher.off("unlink",v),i.watcher.off("unlink",O),i.watcher.off("add",S),i.watcher.off("change",S),i.watcher.off("unlink",S))};return()=>{ye(i,u,K)}},buildEnd(){we(u,this.environment)},name:"lunora:codegen"}};export{Fe as c,ve as r};
@@ -0,0 +1 @@
1
+ import{c as i}from"./codegen-plugin-dg384k5b.mjs";import"./LUNORA_API_UPDATED_EVENT-CO2Rv2re.mjs";import"./log-DE48L4Oz.mjs";import"./server-close-Qoh4i6Ay.mjs";export{i as default};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lunora/vite",
3
- "version": "1.0.0-alpha.196",
3
+ "version": "1.0.0-alpha.197",
4
4
  "description": "The Lunora Vite plugin: codegen, type sync, wrangler validation, and an error overlay over @cloudflare/vite-plugin",
5
5
  "keywords": [
6
6
  "cloudflare",
@@ -46,9 +46,9 @@
46
46
  },
47
47
  "dependencies": {
48
48
  "@cloudflare/vite-plugin": "1.51.2",
49
- "@lunora/codegen": "1.0.0-alpha.160",
50
- "@lunora/config": "1.0.0-alpha.196",
51
- "@lunora/errors": "1.0.0-alpha.33",
49
+ "@lunora/codegen": "1.0.0-alpha.161",
50
+ "@lunora/config": "1.0.0-alpha.197",
51
+ "@lunora/errors": "1.0.0-alpha.34",
52
52
  "@visulima/vite-overlay": "2.0.12"
53
53
  },
54
54
  "peerDependencies": {
@@ -1,3 +0,0 @@
1
- import{existsSync as j,readFileSync as K}from"node:fs";import{join as N,resolve as p,sep as R,basename as X}from"node:path";import{listLunoraSourceFiles as q,findTsconfig as Q,runCodegen as Y,describeErrorLevelFindings as Z,createCodegenProject as ee,refreshCodegenProject as ne,CodegenDiagnosticError as re}from"@lunora/codegen";import{LUNORA_CONFIG_FILE as U,isCodegenDisabled as te,CODEGEN_ENV as x,runPostCodegenHook as A,inferLunoraBindings as oe}from"@lunora/config";import{findWranglerFile as ie,readWranglerJsonc as ae,WRANGLER_FILES as ce,reconcileWranglerBindings as se,collectWranglerSecretVariables as le,reconcileWranglerCrons as de,reconcileWranglerCompatibilityDate as fe}from"@lunora/config/cloudflare";import{isRunnableDevEnvironment as ge}from"vite";import ue from"./LUNORA_API_UPDATED_EVENT-CO2Rv2re.mjs";import{L as f,a as F}from"./log-DE48L4Oz.mjs";import{createHash as he}from"node:crypto";import{r as me,a as pe}from"./server-close-Qoh4i6Ay.mjs";const L=(n,r)=>{try{const{parsed:t,text:e}=ae(n);return t===void 0?`raw:${e}`:JSON.stringify(r?r(t):t)}catch{return"unreadable"}},we=n=>{const r={...n},{triggers:t}=r;if(t!==null&&typeof t=="object"){const e={...t};delete e.crons,Object.keys(e).length>0?r.triggers=e:delete r.triggers}return r},T=n=>{const r=ie(n),t=r===void 0?"absent":L(r,we),e=N(n,U),i=j(e)?L(e):"absent";return`${t}\0${i}`},ye=100,V=300,M=2,$e=n=>{let r,t,e=0;const i=()=>{r&&(clearTimeout(r),r=void 0)},s=(u,h)=>{t&&clearTimeout(t),t=setTimeout(()=>{if(t=void 0,n.fingerprint()!==u){if(e+=1,e>M){n.logger.warn(`${f} \`postcodegen\` keeps rewriting the schema sources — stopping after ${String(M)} reruns. Make the hook idempotent or move it off the schema directory.`);return}n.logger.info(`${f} schema changed while \`postcodegen\` was running — regenerating`),h()}},V)},l=u=>{n.regenerate(u,h=>{s(h,()=>{l(u)})})};return{cancelPending:i,dispose:()=>{i(),t&&(clearTimeout(t),t=void 0)},onSave:u=>{i(),e=0,r=setTimeout(()=>{r=void 0,l(u)},ye)}}},G=n=>{if(!j(n))return"unreadable";const r=q(n),t=N(n,"schema.ts");j(t)&&r.push(t);const e=he("sha256");for(const i of r.toSorted((s,l)=>s.localeCompare(l)))try{e.update(i).update("\0").update(K(i))}catch{}return e.digest("hex")},I=/[/\\]tsconfig\..+\.json$/u,ve=n=>{const r=n.map(e=>` • ${e.kind} "${e.exportName}" — class ${e.className} is not exported by your worker entry.`),t=[...new Set(n.map(e=>e.module))].map(e=>` export * from "./lunora/_generated/${e}";`);return[`[lunora] ${String(n.length)} declared ${n.length===1?"binding is":"bindings are"} not exported by your worker entry — \`wrangler deploy\` will fail.`,...r,"","Add to your worker entry:",...t].join(`
2
- `)},Se=async(n,r,t)=>{try{const e=await oe({projectRoot:n.projectRoot,schemaDir:n.schemaDir}),i=se(n.projectRoot,e);i.changed&&r.info?.(`${f} inferred bindings → ${i.added.join(", ")} (written to ${i.wranglerPath??"wrangler.jsonc"})`);for(const s of i.warnings)r.warn(`${f} ${s}`);i.exportGaps.length>0&&t?.(i.exportGaps)}catch(e){const i=e instanceof Error?e.message:String(e);r.warn(`${f} binding inference skipped: ${i}`)}},Ee=(n,r,t)=>{try{const e=de(n,r);e.changed&&t.info?.(`${f} synced ${r.length.toFixed(0)} cron trigger(s) into ${e.wranglerPath??"wrangler.jsonc"}`)}catch(e){const i=e instanceof Error?e.message:String(e);t.warn(`${f} cron trigger sync skipped: ${i}`)}try{const e=fe(n);e.changed&&t.info?.(`${f} bumped compatibility_date to ${e.date??"unknown"} (Workers Cache enabled) → ${e.wranglerPath??"wrangler.jsonc"}`)}catch(e){const i=e instanceof Error?e.message:String(e);t.warn(`${f} compatibility date sync skipped: ${i}`)}},be=n=>{const{advisoryNames:r,platformDiagnosticNames:t}=Z(n),e=[...new Set([...r,...t])].toSorted((s,l)=>s.localeCompare(l));if(e.length===0)return;const i=e.length===1?"advisory/platform diagnostic":"advisories/platform diagnostics";return`${f} ${String(e.length)} ERROR-level ${i} (${e.join(", ")}) — see the log above for detail.`},Re=(n,r,t)=>{if(r.warn(`${f} schema.ts not found at ${n} — codegen skipped`),t!==void 0){const e=`schema.ts not found at ${n} — generated output is now stale`;t.onError(new Error(e),e)}},B=(n,r,t,e)=>{const i=N(n.projectRoot,n.schemaDir,"schema.ts");if(!j(i))return Re(i,r,t),{};try{const s=Y({apiSpec:n.apiSpec,lunoraDirectory:n.schemaDir,project:e,projectRoot:n.projectRoot,target:n.target,wranglerVariables:le(n.projectRoot)});Ee(n.projectRoot,s.cronTriggers,r);for(const l of s.advisories){const u=F(l.level,l.name,l.detail,l.remediation);l.level==="ERROR"?r.error(u):r.warn(u)}for(const l of s.platformDiagnostics){const u=F(l.level==="error"?"ERROR":"WARN",l.name,l.message,l.remediation);l.level==="error"?r.error(u):r.warn(u)}return{blockingMessage:be(s),outputDirectory:p(s.outputDirectory)}}catch(s){const l=s instanceof Error?s.message:String(s);return r.error(`${f} codegen failed: ${l}`),t?.onError(s,l),{failure:`${f} codegen failed: ${l}`}}},ke=(n,r,t)=>{let e;for(const[i,s]of Object.entries(n.environments)){if(i==="client"){e=s;continue}ge(s)||s.hot.send({path:"*",triggeredBy:r,type:"full-reload"})}if(e===void 0){n.hot.send({type:"full-reload"});return}if(t){e.hot.send({type:"full-reload"});return}e.hot.send({event:ue,type:"custom"})},Ae=n=>{const r=p(n.projectRoot,n.schemaDir),t=te(process.env[x]);let e=p(n.projectRoot,n.generatedDir),i=0,s=!1,l;const u=new Map;let h,C=!1,D=!1,b;return{config(o,w){b=w.command},async buildStart(){const o={error:g=>{console.error(g)},info:g=>{console.info(g)},warn:g=>{console.warn(g)}},w=b!=="build"&&t,{blockingMessage:y,failure:k,outputDirectory:$}=w?{}:B(n,o);if(b==="build"&&k!==void 0&&this.error(k),$!==void 0){e=$,s=!0;let g;try{g=await A({cwd:n.projectRoot,logger:o})}finally{s=!1}g.ran&&(i=Date.now()),b==="build"&&g.error!==void 0&&this.error(g.error)}b==="build"&&y!==void 0&&this.error(y),await Se(n,o,g=>{l?.hot.send({err:{loc:void 0,message:ve(g),stack:""},type:"error"})}),l!==void 0&&(h=T(n.projectRoot),C=!0)},configureServer(o){l=o,o.watcher.add(r),h=T(n.projectRoot),C=!1;const w={error:a=>{o.config.logger.error(a)},info:a=>{o.config.logger.info(a)},warn:a=>{o.config.logger.warn(a)}};let y=!1;const k={onError(a,c){y=!0;const d=a instanceof re?{column:a.column,file:a.file,line:a.line}:void 0,E=d===void 0?`[lunora] codegen failed: ${c}
3
- (see terminal for full stack trace and file location)`:`[lunora] codegen failed: ${c}`;l?.hot.send({err:{loc:d,message:E,stack:a instanceof Error?a.stack??"":""},type:"error"})}},$=(a,c)=>a===c||a.startsWith(c+R);let g=!1,m;const H=()=>{for(const a of Object.values(o.environments)){const c=a.moduleGraph;for(const d of c.idToModuleMap.values())d.id&&$(d.id,e)&&c.invalidateModule(d)}},J=async(a,c)=>{try{if(g)return;m===void 0?m=ee(r):ne(m,r);const{outputDirectory:d}=B(n,w,k,m);if(d===void 0){m=void 0;return}e=d;const E=G(r);s=!0;let P;try{P=await A({cwd:n.projectRoot,logger:w})}finally{s=!1}if(P.ran&&(i=Date.now(),c(E)),P.error!==void 0)return;H(),ke(o,a,y),y=!1}catch(d){w.error(`${f} codegen watch: ${d instanceof Error?d.message:String(d)}`)}},_=$e({fingerprint:()=>G(r),logger:w,regenerate:(a,c)=>{J(a,c)}}),v=a=>{const c=p(a);if(I.test(c)){m=void 0;return}if(c.endsWith(`${R}tsconfig.json`)&&c===Q(r)){m=void 0;return}if($(c,r)&&!$(c,e)&&c.endsWith(".ts")&&!(c.includes(`${R}__tests__${R}`)||c.endsWith(".test.ts")||c.endsWith(".spec.ts"))){if(s||Date.now()-i<V){_.cancelPending();return}_.onSave(c)}},O=a=>{const c=p(a);(c.endsWith(`${R}tsconfig.json`)||I.test(c))&&(m=void 0)};t?o.config.logger.info(`${f} codegen watch disabled (${x}) — _generated/ is written only by an explicit \`lunora codegen\``):(o.watcher.on("add",v),o.watcher.on("change",v),o.watcher.on("unlink",v),o.watcher.on("unlink",O));const W=new Set([...ce.map(a=>p(n.projectRoot,a)),p(n.projectRoot,U)]);for(const a of W)o.watcher.add(a);const S=a=>{if(!W.has(p(a))||D)return;const c=T(n.projectRoot);if(!C){h=c;return}if(h===void 0){h=c;return}c!==h&&(h=c,D=!0,o.config.logger.info(`${f} ${X(p(a))} changed — restarting dev server`),Promise.resolve(o.restart()).finally(()=>{D=!1}).catch(d=>{const E=d instanceof Error?d.message:String(d);o.config.logger.error(`${f} dev server restart failed: ${E} — keeping the running server; re-save your config to retry.`),o.hot.send({err:{loc:void 0,message:`[lunora] dev server restart failed: ${E}`,stack:""},type:"error"})}))};o.watcher.on("add",S),o.watcher.on("change",S),o.watcher.on("unlink",S);const z=()=>{g||(g=!0,m=void 0,_.dispose(),o.watcher.off("add",v),o.watcher.off("change",v),o.watcher.off("unlink",v),o.watcher.off("unlink",O),o.watcher.off("add",S),o.watcher.off("change",S),o.watcher.off("unlink",S))};return()=>{pe(o,u,z)}},buildEnd(){me(u,this.environment)},name:"lunora:codegen"}};export{Ae as codegenPlugin,Se as reconcileBindingsSafely};