@lunora/vite 1.0.0-alpha.321 → 1.0.0-alpha.322
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 p}from"node:module";import{cloudflare as m}from"@cloudflare/vite-plugin";import{detectAgentRules as v,claimAgentRulesHint as h,lunoraLine as u,AGENT_RULES_HINT as w,resolveDeployDriver as S,startCelldDevSession as k,formatLunoraEvent as P,detectFramework as R,targetRunsOwnDevServer as y,resolveTargetOrThrow as x,isRunnableTarget as E,runnableTargetIds as A}from"@lunora/config";import{GENERATED_CLASS_MODULES as Lr,detectFramework as Ur}from"@lunora/config";import _ from"@visulima/vite-overlay";import{reconcileBindingsSafely as O,findWranglerFile as C,readWranglerJsonc as D,warnCloudflareCliConfigOnce as T}from"@lunora/config/cloudflare";import{reconcileWranglerCrons as Fr}from"@lunora/config/cloudflare";import{r as W,a as $}from"./packem_shared/server-close-DWiO4Vxb.mjs";import b from"./packem_shared/codegenPlugin-
|
|
1
|
+
import{createRequire as p}from"node:module";import{cloudflare as m}from"@cloudflare/vite-plugin";import{detectAgentRules as v,claimAgentRulesHint as h,lunoraLine as u,AGENT_RULES_HINT as w,resolveDeployDriver as S,startCelldDevSession as k,formatLunoraEvent as P,detectFramework as R,targetRunsOwnDevServer as y,resolveTargetOrThrow as x,isRunnableTarget as E,runnableTargetIds as A}from"@lunora/config";import{GENERATED_CLASS_MODULES as Lr,detectFramework as Ur}from"@lunora/config";import _ from"@visulima/vite-overlay";import{reconcileBindingsSafely as O,findWranglerFile as C,readWranglerJsonc as D,warnCloudflareCliConfigOnce as T}from"@lunora/config/cloudflare";import{reconcileWranglerCrons as Fr}from"@lunora/config/cloudflare";import{r as W,a as $}from"./packem_shared/server-close-DWiO4Vxb.mjs";import b from"./packem_shared/codegenPlugin-BsLFhhzx.mjs";import L from"./packem_shared/containerLogsPlugin-67PZ8zmb.mjs";import U from"./packem_shared/devStatePlugin-CF4GDvBn.mjs";import N from"./packem_shared/devVariablesPlugin-DbD6cSF0.mjs";import{frameworkComposePlugin as F}from"./packem_shared/CLASS_A_WIRING-DCI5QzA9.mjs";import{CLASS_A_WIRING as jr,LUNORA_WORKER_VIRTUAL_ID as Br,buildWorkerEntrySource as Vr,isAutoComposable as Hr}from"./packem_shared/CLASS_A_WIRING-DCI5QzA9.mjs";import I from"./packem_shared/logStreamPlugin-EMXiy6pI.mjs";import{proxyCheckPlugin as j}from"./packem_shared/checkLunoraProxy-BNPgNWtV.mjs";import{checkLunoraProxy as Kr}from"./packem_shared/checkLunoraProxy-BNPgNWtV.mjs";import{remoteBindingsPlugin as B}from"./packem_shared/planViteRemoteBindings-ByOliZuE.mjs";import{planViteRemoteBindings as qr,withRemoteBindings as Jr}from"./packem_shared/planViteRemoteBindings-ByOliZuE.mjs";import{resolve as V}from"node:path";import{readServiceBindings as H}from"@lunora/codegen";import{lunoraSolutionFinders as M}from"./packem_shared/lunoraSolutionFinder--J0x2mAM.mjs";import{lunoraSolutionFinder as Qr}from"./packem_shared/lunoraSolutionFinder--J0x2mAM.mjs";import{studioPlugin as K}from"./packem_shared/buildStudioUrl-DMMWpguZ.mjs";import{buildStudioUrl as Yr}from"./packem_shared/buildStudioUrl-DMMWpguZ.mjs";import{withWorkerStartupHint as G}from"./packem_shared/WORKER_STARTUP_HINT-COlRTY32.mjs";import{WORKER_STARTUP_HINT as re,augmentWorkerStartupError as ee,isWorkerEntryEvalError as oe}from"./packem_shared/WORKER_STARTUP_HINT-COlRTY32.mjs";import{wranglerValidatorPlugin as q}from"./packem_shared/wranglerValidatorPlugin-BlGHjTXZ.mjs";import{default as ne}from"./packem_shared/LUNORA_API_UPDATED_EVENT-CO2Rv2re.mjs";import{STUDIO_PATH as ae}from"@lunora/config/studio-host";const J=e=>({apply:"serve",configureServer(r){return()=>{v(e.projectRoot).installed||!h()||r.config.logger.warn(`
|
|
2
2
|
${u(w)}
|
|
3
3
|
`)}},name:"lunora:agent-rules-hint"}),z=e=>({async config(r,t){t.isPreview!==!0&&await O(e,{info:o=>{console.info(o)},warn:o=>{console.warn(o)}})},enforce:"pre",name:"lunora:bindings-provision"}),f="/_lunora",Q=8787,c=new Map,g=e=>e.command==="serve"&&e.isPreview!==!0,X=(e,r)=>{let t;return()=>{if(t===void 0)try{S(r).projectConfig?.(e,"dev"),t={runs:!0}}catch(o){t={reason:o instanceof Error?o.message:String(o),runs:!1}}return t}},Y=e=>{const r=C(e),t=r===void 0?void 0:D(r).parsed?.dev?.port;return typeof t=="number"?t:Q},Z=(e,r)=>e.map(t=>{const o=t.apply;return{...t,apply:(n,a)=>g(a)&&r()?!1:typeof o=="function"?o(n,a):o===void 0||o===a.command}}),rr=(e,r,{stream:t,tag:o})=>{const n=P(r);n!==void 0?e[n.level](`[lunora] ${n.text}`):t==="stderr"?e.warn(`[${o}] ${r}`):e.info(`[${o}] ${r}`)},er=(e,r)=>{const t=Y(e),o=new Map;return{apply:(n,a)=>g(a)&&r(),buildEnd(){$(o,this.environment)},config:n=>{if(n.server?.proxy?.[f]===void 0)return{server:{proxy:{[f]:{changeOrigin:!0,target:`http://127.0.0.1:${String(t)}`,ws:!0}}}}},async configureServer(n){const{logger:a}=n.config;await c.get(e)?.stop(),c.delete(e),a.info(`[lunora] starting the worker on celld at http://127.0.0.1:${String(t)} …`);const s=await k({log:(i,d)=>{rr(a,i,d)},port:t,projectRoot:e});c.set(e,s);const l=i=>{a.error(`[lunora] the worker on celld exited (code ${String(i)}) — restart vite dev to bring it back`)};s.exited.then(l).catch(()=>{}),W(n,o,()=>{c.get(e)===s&&c.delete(e),s.stop().catch(i=>{a.error(`[lunora] stopping celld failed: ${i instanceof Error?i.message:String(i)}`)})})},name:"lunora:celld-dev"}},or=e=>({configResolved(r){T(e.projectRoot,t=>{r.logger.warn(u(t))})},name:"lunora:cf-config-warning"}),tr=()=>({}),nr={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)"},ir=e=>{const r=nr[e.framework];return e.framework==="none"?u("no meta-framework detected — running standalone."):e.class==="B"?u(`detected ${r} — composition is handled by the framework adapter.`):u(`detected ${r} — composing the Lunora worker into one Cloudflare Worker.`)},ar=(e,r)=>{let t=!1;const o=()=>{r.framework??=R(e.projectRoot)};return{config(){o()},configResolved(){o()},configureServer(){o(),!t&&r.framework!==void 0&&(t=!0,console.info(ir(r.framework)))},name:"lunora:framework-detect"}},sr=(e,r)=>({config(t,o){if(o.command!=="serve")return;const{services:n}=H(r),a=Array.isArray(e.auxiliaryWorkers)?e.auxiliaryWorkers:[],s=new Set(a.map(i=>i.configPath===void 0?"":V(r,i.configPath))),l=[...new Set(n.map(i=>i.wranglerPath))].filter(i=>!s.has(i)).map(i=>({configPath:i}));l.length>0&&(e.auxiliaryWorkers=[...a,...l])},enforce:"pre",name:"lunora:service-workers"}),lr=e=>{if(e===!1)return!1;const r=e===!0||e===void 0?{}:e;return{...r,forwardedConsoleMethods:r.forwardedConsoleMethods??["error","warn"],solutionFinders:[...M,...r.solutionFinders??[]]}},cr=(e,r)=>{const t=x(e,r);if(!E(t)){const o=A();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: ${o.join(", ")}`)}return t},ur=e=>{const r=e??{},t=r.schemaDir??"lunora";let o;r.cloudflare===!1?o=!1:r.cloudflare===!0||r.cloudflare===void 0?o={}:o=r.cloudflare;const n=r.projectRoot??process.cwd(),a=cr(n,r.target);return{allowUnauthenticatedShardAccess:r.allowUnauthenticatedShardAccess??!1,apiSpec:r.apiSpec??"openapi",cloudflare:o,studio:r.studio??!0,generatedDir:`${t}/_generated`,overlay:lr(r.overlay),projectRoot:n,schemaDir:t,shard:r.shard??{},target:a,validateWrangler:r.validateWrangler??!0}},Tr=e=>{const r=ur(e),t=tr(),o=[ar(r,t),F(r,t),N(r),z(r),b(r),I(),U(r),J(r),or(r),j()];r.studio&&o.push(K(r)),r.validateWrangler&&o.push(q(r)),r.overlay!==!1&&o.push(_(r.overlay)),o.push(L(r));const n=r.cloudflare===!1?void 0:{...r.cloudflare};if(o.push(B(n,{projectRoot:r.projectRoot})),n!==void 0){o.push(sr(n,r.projectRoot));const a=y(r.target),s=X(r.projectRoot,r.target),l=()=>a&&s().runs;o.push(...Z(G(m(n)),l)),a&&o.push(er(r.projectRoot,l),{apply:(i,d)=>d.command==="serve"&&d.isPreview!==!0&&!l(),configureServer(i){i.config.logger.warn(`[lunora] target "${r.target}": vite dev serves the worker in workerd, not on ${r.target} — ${s().reason??"it cannot run this project"}. \`vite build\` then \`lunora deploy\` ships it to ${r.target}.`)},name:"lunora:target-runtime-notice"})}return o},Wr=p(import.meta.url)("../package.json").version;export{jr as CLASS_A_WIRING,Lr as GENERATED_CLASS_MODULES,ne as LUNORA_API_UPDATED_EVENT,Br as LUNORA_WORKER_VIRTUAL_ID,ae as STUDIO_PATH,Wr as VERSION,re as WORKER_STARTUP_HINT,ee as augmentWorkerStartupError,Yr as buildStudioUrl,Vr as buildWorkerEntrySource,Kr as checkLunoraProxy,b as codegenPlugin,L as containerLogsPlugin,Ur as detectFramework,U as devStatePlugin,N as devVariablesPlugin,F as frameworkComposePlugin,Hr as isAutoComposable,oe as isWorkerEntryEvalError,I as logStreamPlugin,Tr as lunora,Qr as lunoraSolutionFinder,M as lunoraSolutionFinders,qr as planViteRemoteBindings,j as proxyCheckPlugin,Fr as reconcileWranglerCrons,B as remoteBindingsPlugin,lr as resolveOverlayOption,K as studioPlugin,Jr as withRemoteBindings,G as withWorkerStartupHint,q as wranglerValidatorPlugin};
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import{readFileSync as K,existsSync as X}from"node:fs";import{resolve as h,dirname as q,sep as k,basename as Q,join as Y,relative as Z}from"node:path";import{findProjectConfigFile as z,readServiceBindings as ee,PROJECT_CONFIG_FILENAMES as te,runCodegen as ne,findTsconfig as re,isTestPath as oe,fingerprintSchemaSources as A,createCodegenProject as ie,refreshCodegenProject as ce,CodegenDiagnosticError as ae}from"@lunora/codegen";import{LUNORA_TAG as m,isCodegenDisabled as se,CODEGEN_ENV as I,runPostCodegenHook as G,reportCodegenFindings as le,blockingFindingsMessage as de}from"@lunora/config";import{findWranglerFile as fe,readWranglerJsonc as ge,WRANGLER_FILES as ue,reconcileBindingsSafely as he,wranglerCodegenInputs as me,reconcileWranglerExtras as pe}from"@lunora/config/cloudflare";import{isRunnableDevEnvironment as we}from"vite";import{createHash as ye}from"node:crypto";import ve from"./LUNORA_API_UPDATED_EVENT-CO2Rv2re.mjs";import{a as Se,r as Ee}from"./server-close-DWiO4Vxb.mjs";const Re=(e,n)=>{try{const{parsed:i,text:r}=ge(e);return i===void 0?`raw:${r}`:JSON.stringify(n?n(i):i)}catch{return"unreadable"}},$e=e=>{const n={...e},{triggers:i}=n;if(i!==null&&typeof i=="object"){const r={...i};delete r.crons,Object.keys(r).length>0?n.triggers=r:delete n.triggers}return n},M=e=>{const n=fe(e),i=n===void 0?"absent":Re(n,$e),r=z(e);let l="absent";try{r!==void 0&&(l=ye("sha256").update(K(r)).digest("hex"))}catch{}return`${i}\0${l}`},ke=100,U=300,L=2,Ce=e=>{let n,i,r=0;const l=()=>{n&&(clearTimeout(n),n=void 0)},a=(g,f)=>{i&&clearTimeout(i),i=setTimeout(()=>{if(i=void 0,e.fingerprint()!==g){if(r+=1,r>L){e.logger.warn(`${m} \`postcodegen\` keeps rewriting the schema sources — stopping after ${String(L)} reruns. Make the hook idempotent or move it off the schema directory.`);return}e.logger.info(`${m} schema changed while \`postcodegen\` was running — regenerating`),f()}},U)},d=g=>{e.regenerate(g,f=>{a(f,()=>{d(g)})})};return{cancelPending:l,dispose:()=>{l(),i&&(clearTimeout(i),i=void 0)},onSave:g=>{l(),r=0,n=setTimeout(()=>{n=void 0,d(g)},ke)}}},W=/[/\\]tsconfig\..+\.json$/u,be=/(?:\.[cm]?[jt]sx?|(?:^|[/\\])tsconfig(?:\..+)?\.json)$/u,je=e=>{const n=e.map(r=>` • ${r.kind} "${r.exportName}" — class ${r.className} is not exported by your worker entry.`),i=[...new Set(e.map(r=>r.module))].map(r=>` export * from "./lunora/_generated/${r}";`);return[`[lunora] ${String(e.length)} declared ${e.length===1?"binding is":"bindings are"} not exported by your worker entry — \`wrangler deploy\` will fail.`,...n,"","Add to your worker entry:",...i].join(`
|
|
2
|
+
`)},De=(e,n,i)=>{if(n.warn(`${m} schema.ts not found at ${e} — codegen skipped`),i!==void 0){const r=`schema.ts not found at ${e} — generated output is now stale`;i.onError(new Error(r),r)}},N=(e,n,i,r)=>{const l=Y(e.projectRoot,e.schemaDir,"schema.ts");if(!X(l))return De(l,n,i),{};try{const a=ne({apiSpec:e.apiSpec,lunoraDirectory:e.schemaDir,project:r,projectRoot:e.projectRoot,target:e.target,...me(e.projectRoot)});return pe(e.projectRoot,a.cronTriggers,n),le(a,n),{blockingMessage:de(a),outputDirectory:h(a.outputDirectory)}}catch(a){const d=a instanceof Error?a.message:String(a);return n.error(`${m} codegen failed: ${d}`),i?.onError(a,d),{failure:`${m} codegen failed: ${d}`}}},Te=(e,n,i)=>{let r;for(const[l,a]of Object.entries(e.environments)){if(l==="client"){r=a;continue}we(a)||a.hot.send({path:"*",triggeredBy:n,type:"full-reload"})}if(r===void 0){e.hot.send({type:"full-reload"});return}if(i){r.hot.send({type:"full-reload"});return}r.hot.send({event:ve,type:"custom"})},b={error:e=>{console.error(e)},info:e=>{console.info(e)},warn:e=>{console.warn(e)}},Ge=e=>{const n=h(e.projectRoot,e.schemaDir),i=se(process.env[I]);let r=h(e.projectRoot,e.generatedDir),l=0,a=!1,d;const g=new Map;let f,j=!1,D=!1,S,T;return{config(o,y){S=y.command},configResolved(){S!=="build"&&i||(T=N(e,b))},async buildStart(){const o=S!=="build"&&i,{blockingMessage:y,failure:v,outputDirectory:E}=T??(o?{}:N(e,b));if(T=void 0,S==="build"&&v!==void 0&&this.error(v),E!==void 0){r=E,a=!0;let p;try{p=await G({cwd:e.projectRoot,logger:b})}finally{a=!1}p.ran&&(l=Date.now()),S==="build"&&p.error!==void 0&&this.error(p.error)}S==="build"&&y!==void 0&&this.error(y),await he(e,b,p=>{d?.hot.send({err:{loc:void 0,message:je(p),stack:""},type:"error"})}),d!==void 0&&(f=M(e.projectRoot),j=!0)},configureServer(o){d=o,o.watcher.add(n);const y=ee(e.projectRoot).services.filter(t=>t.rpcEntrypoint!==void 0).map(t=>q(t.wranglerPath));o.watcher.add(y),f=M(e.projectRoot),j=!1;const v={error:t=>{o.config.logger.error(t)},info:t=>{o.config.logger.info(t)},warn:t=>{o.config.logger.warn(t)}};let E=!1;const p={onError(t,c){E=!0;const s=t instanceof ae?{column:t.column,file:t.file,line:t.line}:void 0,w=s===void 0?`[lunora] codegen failed: ${c}
|
|
3
|
+
(see terminal for full stack trace and file location)`:`[lunora] codegen failed: ${c}`;d?.hot.send({err:{loc:s,message:w,stack:t instanceof Error?t.stack??"":""},type:"error"})}},C=(t,c)=>t===c||t.startsWith(c+k);let _=!1,u;const B=()=>{for(const t of Object.values(o.environments)){const c=t.moduleGraph;for(const s of c.idToModuleMap.values())s.id&&C(s.id,r)&&c.invalidateModule(s)}},J=async(t,c)=>{try{if(_)return;u===void 0?u=ie(n):ce(u,n);const{outputDirectory:s}=N(e,v,p,u);if(s===void 0){u=void 0;return}r=s;const w=A(n);a=!0;let O;try{O=await G({cwd:e.projectRoot,logger:v})}finally{a=!1}if(O.ran&&(l=Date.now(),c(w)),O.error!==void 0)return;B(),Te(o,t,E),E=!1}catch(s){v.error(`${m} codegen watch: ${s instanceof Error?s.message:String(s)}`)}},P=Ce({fingerprint:()=>A(n),logger:v,regenerate:(t,c)=>{J(t,c)}}),V=t=>W.test(t)||t.endsWith(`${k}tsconfig.json`)&&t===re(n)?(u=void 0,!1):!(!C(t,n)||C(t,r)||!t.endsWith(".ts")||oe(Z(n,t).split(k).join("/"))),R=t=>{const c=h(t);if(!(!(be.test(c)&&!c.includes(`${k}node_modules${k}`)&&y.some(w=>C(c,w)))&&!V(c))){if(a||Date.now()-l<U){P.cancelPending();return}P.onSave(c)}},F=t=>{const c=h(t);(c.endsWith(`${k}tsconfig.json`)||W.test(c))&&(u=void 0)};i?o.config.logger.info(`${m} codegen watch disabled (${I}) — _generated/ is written only by an explicit \`lunora codegen\``):(o.watcher.on("add",R),o.watcher.on("change",R),o.watcher.on("unlink",R),o.watcher.on("unlink",F));const x=new Set([...ue.map(t=>h(e.projectRoot,t)),...te.map(t=>h(e.projectRoot,t))]);for(const t of x)o.watcher.add(t);const $=t=>{if(!x.has(h(t))||D)return;const c=M(e.projectRoot);if(!j){f=c;return}if(f===void 0){f=c;return}c!==f&&(f=c,D=!0,o.config.logger.info(`${m} ${Q(h(t))} changed — restarting dev server`),Promise.resolve(o.restart()).finally(()=>{D=!1}).catch(s=>{const w=s instanceof Error?s.message:String(s);o.config.logger.error(`${m} dev server restart failed: ${w} — keeping the running server; re-save your config to retry.`),o.hot.send({err:{loc:void 0,message:`[lunora] dev server restart failed: ${w}`,stack:""},type:"error"})}))};o.watcher.on("add",$),o.watcher.on("change",$),o.watcher.on("unlink",$);const H=()=>{_||(_=!0,u=void 0,P.dispose(),o.watcher.off("add",R),o.watcher.off("change",R),o.watcher.off("unlink",R),o.watcher.off("unlink",F),o.watcher.off("add",$),o.watcher.off("change",$),o.watcher.off("unlink",$))};return()=>{Ee(o,g,H)}},buildEnd(){Se(g,this.environment)},name:"lunora:codegen"}};export{Ge as default};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lunora/vite",
|
|
3
|
-
"version": "1.0.0-alpha.
|
|
3
|
+
"version": "1.0.0-alpha.322",
|
|
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,8 +46,8 @@
|
|
|
46
46
|
},
|
|
47
47
|
"dependencies": {
|
|
48
48
|
"@cloudflare/vite-plugin": "1.62.5",
|
|
49
|
-
"@lunora/codegen": "1.0.0-alpha.
|
|
50
|
-
"@lunora/config": "1.0.0-alpha.
|
|
49
|
+
"@lunora/codegen": "1.0.0-alpha.279",
|
|
50
|
+
"@lunora/config": "1.0.0-alpha.324",
|
|
51
51
|
"@lunora/errors": ">=1.0.0-alpha.51 <2.0.0-0",
|
|
52
52
|
"@visulima/vite-overlay": "2.0.41"
|
|
53
53
|
},
|
|
@@ -1,3 +0,0 @@
|
|
|
1
|
-
import{readFileSync as K,existsSync as X}from"node:fs";import{resolve as h,dirname as q,sep as b,basename as Q,join as Y,relative as Z}from"node:path";import{findProjectConfigFile as z,readServiceBindings as ee,PROJECT_CONFIG_FILENAMES as te,runCodegen as re,findTsconfig as ne,isTestPath as oe,fingerprintSchemaSources as A,createCodegenProject as ie,refreshCodegenProject as ce,CodegenDiagnosticError as ae}from"@lunora/codegen";import{LUNORA_TAG as m,isCodegenDisabled as se,CODEGEN_ENV as I,runPostCodegenHook as W,reportCodegenFindings as le,blockingFindingsMessage as de}from"@lunora/config";import{findWranglerFile as fe,readWranglerJsonc as ge,WRANGLER_FILES as ue,reconcileBindingsSafely as he,collectWranglerSecretVariables as me,reconcileWranglerExtras as pe}from"@lunora/config/cloudflare";import{isRunnableDevEnvironment as we}from"vite";import{createHash as ye}from"node:crypto";import ve from"./LUNORA_API_UPDATED_EVENT-CO2Rv2re.mjs";import{a as Se,r as Ee}from"./server-close-DWiO4Vxb.mjs";const Re=(e,r)=>{try{const{parsed:i,text:n}=ge(e);return i===void 0?`raw:${n}`:JSON.stringify(r?r(i):i)}catch{return"unreadable"}},$e=e=>{const r={...e},{triggers:i}=r;if(i!==null&&typeof i=="object"){const n={...i};delete n.crons,Object.keys(n).length>0?r.triggers=n:delete r.triggers}return r},M=e=>{const r=fe(e),i=r===void 0?"absent":Re(r,$e),n=z(e);let l="absent";try{n!==void 0&&(l=ye("sha256").update(K(n)).digest("hex"))}catch{}return`${i}\0${l}`},be=100,U=300,G=2,ke=e=>{let r,i,n=0;const l=()=>{r&&(clearTimeout(r),r=void 0)},a=(g,f)=>{i&&clearTimeout(i),i=setTimeout(()=>{if(i=void 0,e.fingerprint()!==g){if(n+=1,n>G){e.logger.warn(`${m} \`postcodegen\` keeps rewriting the schema sources — stopping after ${String(G)} reruns. Make the hook idempotent or move it off the schema directory.`);return}e.logger.info(`${m} schema changed while \`postcodegen\` was running — regenerating`),f()}},U)},d=g=>{e.regenerate(g,f=>{a(f,()=>{d(g)})})};return{cancelPending:l,dispose:()=>{l(),i&&(clearTimeout(i),i=void 0)},onSave:g=>{l(),n=0,r=setTimeout(()=>{r=void 0,d(g)},be)}}},L=/[/\\]tsconfig\..+\.json$/u,Ce=/(?:\.[cm]?[jt]sx?|(?:^|[/\\])tsconfig(?:\..+)?\.json)$/u,je=e=>{const r=e.map(n=>` • ${n.kind} "${n.exportName}" — class ${n.className} is not exported by your worker entry.`),i=[...new Set(e.map(n=>n.module))].map(n=>` export * from "./lunora/_generated/${n}";`);return[`[lunora] ${String(e.length)} declared ${e.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
|
-
`)},De=(e,r,i)=>{if(r.warn(`${m} schema.ts not found at ${e} — codegen skipped`),i!==void 0){const n=`schema.ts not found at ${e} — generated output is now stale`;i.onError(new Error(n),n)}},N=(e,r,i,n)=>{const l=Y(e.projectRoot,e.schemaDir,"schema.ts");if(!X(l))return De(l,r,i),{};try{const a=re({apiSpec:e.apiSpec,lunoraDirectory:e.schemaDir,project:n,projectRoot:e.projectRoot,target:e.target,wranglerVariables:me(e.projectRoot)});return pe(e.projectRoot,a.cronTriggers,r),le(a,r),{blockingMessage:de(a),outputDirectory:h(a.outputDirectory)}}catch(a){const d=a instanceof Error?a.message:String(a);return r.error(`${m} codegen failed: ${d}`),i?.onError(a,d),{failure:`${m} codegen failed: ${d}`}}},Te=(e,r,i)=>{let n;for(const[l,a]of Object.entries(e.environments)){if(l==="client"){n=a;continue}we(a)||a.hot.send({path:"*",triggeredBy:r,type:"full-reload"})}if(n===void 0){e.hot.send({type:"full-reload"});return}if(i){n.hot.send({type:"full-reload"});return}n.hot.send({event:ve,type:"custom"})},C={error:e=>{console.error(e)},info:e=>{console.info(e)},warn:e=>{console.warn(e)}},We=e=>{const r=h(e.projectRoot,e.schemaDir),i=se(process.env[I]);let n=h(e.projectRoot,e.generatedDir),l=0,a=!1,d;const g=new Map;let f,j=!1,D=!1,S,T;return{config(o,y){S=y.command},configResolved(){S!=="build"&&i||(T=N(e,C))},async buildStart(){const o=S!=="build"&&i,{blockingMessage:y,failure:v,outputDirectory:E}=T??(o?{}:N(e,C));if(T=void 0,S==="build"&&v!==void 0&&this.error(v),E!==void 0){n=E,a=!0;let p;try{p=await W({cwd:e.projectRoot,logger:C})}finally{a=!1}p.ran&&(l=Date.now()),S==="build"&&p.error!==void 0&&this.error(p.error)}S==="build"&&y!==void 0&&this.error(y),await he(e,C,p=>{d?.hot.send({err:{loc:void 0,message:je(p),stack:""},type:"error"})}),d!==void 0&&(f=M(e.projectRoot),j=!0)},configureServer(o){d=o,o.watcher.add(r);const y=ee(e.projectRoot).services.filter(t=>t.rpcEntrypoint!==void 0).map(t=>q(t.wranglerPath));o.watcher.add(y),f=M(e.projectRoot),j=!1;const v={error:t=>{o.config.logger.error(t)},info:t=>{o.config.logger.info(t)},warn:t=>{o.config.logger.warn(t)}};let E=!1;const p={onError(t,c){E=!0;const s=t instanceof ae?{column:t.column,file:t.file,line:t.line}:void 0,w=s===void 0?`[lunora] codegen failed: ${c}
|
|
3
|
-
(see terminal for full stack trace and file location)`:`[lunora] codegen failed: ${c}`;d?.hot.send({err:{loc:s,message:w,stack:t instanceof Error?t.stack??"":""},type:"error"})}},k=(t,c)=>t===c||t.startsWith(c+b);let _=!1,u;const V=()=>{for(const t of Object.values(o.environments)){const c=t.moduleGraph;for(const s of c.idToModuleMap.values())s.id&&k(s.id,n)&&c.invalidateModule(s)}},B=async(t,c)=>{try{if(_)return;u===void 0?u=ie(r):ce(u,r);const{outputDirectory:s}=N(e,v,p,u);if(s===void 0){u=void 0;return}n=s;const w=A(r);a=!0;let O;try{O=await W({cwd:e.projectRoot,logger:v})}finally{a=!1}if(O.ran&&(l=Date.now(),c(w)),O.error!==void 0)return;V(),Te(o,t,E),E=!1}catch(s){v.error(`${m} codegen watch: ${s instanceof Error?s.message:String(s)}`)}},P=ke({fingerprint:()=>A(r),logger:v,regenerate:(t,c)=>{B(t,c)}}),J=t=>L.test(t)||t.endsWith(`${b}tsconfig.json`)&&t===ne(r)?(u=void 0,!1):!(!k(t,r)||k(t,n)||!t.endsWith(".ts")||oe(Z(r,t).split(b).join("/"))),R=t=>{const c=h(t);if(!(!(Ce.test(c)&&!c.includes(`${b}node_modules${b}`)&&y.some(w=>k(c,w)))&&!J(c))){if(a||Date.now()-l<U){P.cancelPending();return}P.onSave(c)}},F=t=>{const c=h(t);(c.endsWith(`${b}tsconfig.json`)||L.test(c))&&(u=void 0)};i?o.config.logger.info(`${m} codegen watch disabled (${I}) — _generated/ is written only by an explicit \`lunora codegen\``):(o.watcher.on("add",R),o.watcher.on("change",R),o.watcher.on("unlink",R),o.watcher.on("unlink",F));const x=new Set([...ue.map(t=>h(e.projectRoot,t)),...te.map(t=>h(e.projectRoot,t))]);for(const t of x)o.watcher.add(t);const $=t=>{if(!x.has(h(t))||D)return;const c=M(e.projectRoot);if(!j){f=c;return}if(f===void 0){f=c;return}c!==f&&(f=c,D=!0,o.config.logger.info(`${m} ${Q(h(t))} changed — restarting dev server`),Promise.resolve(o.restart()).finally(()=>{D=!1}).catch(s=>{const w=s instanceof Error?s.message:String(s);o.config.logger.error(`${m} dev server restart failed: ${w} — keeping the running server; re-save your config to retry.`),o.hot.send({err:{loc:void 0,message:`[lunora] dev server restart failed: ${w}`,stack:""},type:"error"})}))};o.watcher.on("add",$),o.watcher.on("change",$),o.watcher.on("unlink",$);const H=()=>{_||(_=!0,u=void 0,P.dispose(),o.watcher.off("add",R),o.watcher.off("change",R),o.watcher.off("unlink",R),o.watcher.off("unlink",F),o.watcher.off("add",$),o.watcher.off("change",$),o.watcher.off("unlink",$))};return()=>{Ee(o,g,H)}},buildEnd(){Se(g,this.environment)},name:"lunora:codegen"}};export{We as default};
|