@lunora/vite 1.0.0-alpha.181 → 1.0.0-alpha.183

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