@lunora/vite 1.0.0-alpha.417 → 1.0.0-alpha.419

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,4 +1,4 @@
1
- import{createRequire as $}from"node:module";import{sep as O,resolve as h,dirname as B,isAbsolute as I,relative as M}from"node:path";import{cloudflare as N}from"@cloudflare/vite-plugin";import{BUNDLE_META_PATH_ENV as U,canonicalPath as k,DEFAULT_BUNDLE_META_PATH as F,resolveDeployDriver as H,startCelldDevSession as j,formatLunoraEvent as V,lunoraLine as G,detectFramework as z,createDiscoveryCache as K,targetRunsOwnDevServer as q,resolveLazyFunctions as J,resolveTargetOrThrow as Q,isRunnableTarget as Y,runnableTargetIds as X,assertBuildTargetMatches as Z}from"@lunora/config";import{GENERATED_CLASS_MODULES as Cr,detectFramework as xr}from"@lunora/config";import ee from"@visulima/vite-overlay";import{detectAgentRules as re,claimAgentRulesHint as te,lunoraLine as m,AGENT_RULES_HINT as oe}from"@lunora/config/cli";import{reconcileBindingsSafely as ne,findWranglerFile as ie,readWranglerJsonc as se,warnCloudflareCliConfigOnce as ae,hasCloudflareCredentials as ce,withheldBindings as le,describeWithheld as ue,startLocalHyperdrive as de}from"@lunora/config/cloudflare";import{reconcileWranglerCrons as Dr}from"@lunora/config/cloudflare";import{o as fe}from"./packem_shared/build-session-D75JzvIT.mjs";import{mkdirSync as pe,writeFileSync as me,statSync as ge,rmSync as ve}from"node:fs";import{r as D,a as L}from"./packem_shared/server-close-DWiO4Vxb.mjs";import he from"./packem_shared/codegenPlugin-D-Exl6Lf.mjs";import we from"./packem_shared/containerLogsPlugin-CWF3LHN3.mjs";import ye from"./packem_shared/devStatePlugin-CF4GDvBn.mjs";import Se from"./packem_shared/devVariablesPlugin-Bm5X49VR.mjs";import{frameworkComposePlugin as Pe}from"./packem_shared/CLASS_A_WIRING-j8JLPFDs.mjs";import{CLASS_A_WIRING as Wr,LUNORA_WORKER_VIRTUAL_ID as $r,buildWorkerEntrySource as Br,isAutoComposable as Ir}from"./packem_shared/CLASS_A_WIRING-j8JLPFDs.mjs";import be from"./packem_shared/logStreamPlugin-EMXiy6pI.mjs";import{proxyCheckPlugin as ke}from"./packem_shared/checkLunoraProxy-BNPgNWtV.mjs";import{checkLunoraProxy as Nr}from"./packem_shared/checkLunoraProxy-BNPgNWtV.mjs";import{remoteBindingsPlugin as Ae}from"./packem_shared/planViteRemoteBindings-DYUUW67d.mjs";import{planViteRemoteBindings as Fr,withRemoteBindings as Hr}from"./packem_shared/planViteRemoteBindings-DYUUW67d.mjs";import{readServiceBindings as Re}from"@lunora/codegen";import{lunoraSolutionFinders as Ee}from"./packem_shared/lunoraSolutionFinder--J0x2mAM.mjs";import{lunoraSolutionFinder as Vr}from"./packem_shared/lunoraSolutionFinder--J0x2mAM.mjs";import{studioPlugin as Te}from"./packem_shared/buildStudioUrl-B9K0wAjC.mjs";import{buildStudioUrl as zr}from"./packem_shared/buildStudioUrl-B9K0wAjC.mjs";import{withWorkerStartupHint as _e}from"./packem_shared/WORKER_STARTUP_HINT-COlRTY32.mjs";import{WORKER_STARTUP_HINT as qr,augmentWorkerStartupError as Jr,isWorkerEntryEvalError as Qr}from"./packem_shared/WORKER_STARTUP_HINT-COlRTY32.mjs";import{wranglerValidatorPlugin as Ce}from"./packem_shared/wranglerValidatorPlugin-CPPKubFC.mjs";import{default as Xr}from"./packem_shared/LUNORA_API_UPDATED_EVENT-CO2Rv2re.mjs";import{STUDIO_PATH as et}from"@lunora/config/studio-host";const xe=r=>({apply:"serve",configureServer(e){return()=>{re(r.projectRoot).installed||!te()||e.config.logger.warn(`
1
+ import{createRequire as $}from"node:module";import{sep as O,resolve as h,dirname as B,isAbsolute as I,relative as M}from"node:path";import{cloudflare as N}from"@cloudflare/vite-plugin";import{BUNDLE_META_PATH_ENV as U,canonicalPath as k,DEFAULT_BUNDLE_META_PATH as F,resolveDeployDriver as H,startCelldDevSession as j,formatLunoraEvent as V,lunoraLine as G,detectFramework as z,createDiscoveryCache as K,targetRunsOwnDevServer as q,resolveLazyFunctions as J,resolveTargetOrThrow as Q,isRunnableTarget as Y,runnableTargetIds as X,assertBuildTargetMatches as Z}from"@lunora/config";import{GENERATED_CLASS_MODULES as Cr,detectFramework as xr}from"@lunora/config";import ee from"@visulima/vite-overlay";import{detectAgentRules as re,claimAgentRulesHint as te,lunoraLine as m,AGENT_RULES_HINT as oe}from"@lunora/config/cli";import{reconcileBindingsSafely as ne,findWranglerFile as ie,readWranglerJsonc as se,warnCloudflareCliConfigOnce as ae,hasCloudflareCredentials as ce,withheldBindings as le,describeWithheld as ue,startLocalHyperdrive as de}from"@lunora/config/cloudflare";import{reconcileWranglerCrons as Dr}from"@lunora/config/cloudflare";import{o as fe}from"./packem_shared/build-session-D75JzvIT.mjs";import{mkdirSync as pe,writeFileSync as me,statSync as ge,rmSync as ve}from"node:fs";import{r as D,a as L}from"./packem_shared/server-close-DWiO4Vxb.mjs";import he from"./packem_shared/codegenPlugin-D-Exl6Lf.mjs";import we from"./packem_shared/containerLogsPlugin-CWF3LHN3.mjs";import ye from"./packem_shared/devStatePlugin-CF4GDvBn.mjs";import Se from"./packem_shared/devVariablesPlugin-Bm5X49VR.mjs";import{frameworkComposePlugin as Pe}from"./packem_shared/CLASS_A_WIRING-CDSSmDqw.mjs";import{CLASS_A_WIRING as Wr,LUNORA_WORKER_VIRTUAL_ID as $r,buildWorkerEntrySource as Br,isAutoComposable as Ir}from"./packem_shared/CLASS_A_WIRING-CDSSmDqw.mjs";import be from"./packem_shared/logStreamPlugin-EMXiy6pI.mjs";import{proxyCheckPlugin as ke}from"./packem_shared/checkLunoraProxy-BNPgNWtV.mjs";import{checkLunoraProxy as Nr}from"./packem_shared/checkLunoraProxy-BNPgNWtV.mjs";import{remoteBindingsPlugin as Ae}from"./packem_shared/planViteRemoteBindings-DYUUW67d.mjs";import{planViteRemoteBindings as Fr,withRemoteBindings as Hr}from"./packem_shared/planViteRemoteBindings-DYUUW67d.mjs";import{readServiceBindings as Re}from"@lunora/codegen";import{lunoraSolutionFinders as Ee}from"./packem_shared/lunoraSolutionFinder--J0x2mAM.mjs";import{lunoraSolutionFinder as Vr}from"./packem_shared/lunoraSolutionFinder--J0x2mAM.mjs";import{studioPlugin as Te}from"./packem_shared/buildStudioUrl-B9K0wAjC.mjs";import{buildStudioUrl as zr}from"./packem_shared/buildStudioUrl-B9K0wAjC.mjs";import{withWorkerStartupHint as _e}from"./packem_shared/WORKER_STARTUP_HINT-COlRTY32.mjs";import{WORKER_STARTUP_HINT as qr,augmentWorkerStartupError as Jr,isWorkerEntryEvalError as Qr}from"./packem_shared/WORKER_STARTUP_HINT-COlRTY32.mjs";import{wranglerValidatorPlugin as Ce}from"./packem_shared/wranglerValidatorPlugin-CPPKubFC.mjs";import{default as Xr}from"./packem_shared/LUNORA_API_UPDATED_EVENT-CO2Rv2re.mjs";import{STUDIO_PATH as et}from"@lunora/config/studio-host";const xe=r=>({apply:"serve",configureServer(e){return()=>{re(r.projectRoot).installed||!te()||e.config.logger.warn(`
2
2
  ${m(oe)}
3
3
  `)}},name:"lunora:agent-rules-hint"}),Oe=(r,e)=>({async config(t,o){if(e?.clear(),o.isPreview===!0)return;const n=async()=>ne({...r,cache:e},{info:i=>{console.info(i)},warn:i=>{console.warn(i)}});await(o.command==="build"?fe(r,"provision",n):n())},enforce:"pre",name:"lunora:bindings-provision"}),De=(r,e=O)=>r.split(e).join("/"),b=(r,e)=>I(e)?De(M(r,e)):e,w=(r,e,t)=>e.map(o=>({kind:t,path:b(r,o)})),Le=/[?#]/,A=r=>{try{return ge(r).size}catch{return}},We=(r,e)=>A(r)??A(r.split(Le)[0]??r)??Buffer.byteLength(e??""),$e=r=>{let e;return{apply:"build",applyToEnvironment:t=>t.config.consumer==="server",name:"lunora:bundle-meta",sharedDuringBuild:!0,generateBundle(t,o){const n={},i={};for(const[u,d]of Object.entries(o)){if(d.type!=="chunk")continue;const f={bytes:Buffer.byteLength(d.code),imports:[...w(r,d.imports,"import-statement"),...w(r,d.dynamicImports,"dynamic-import")],inputs:{}};d.facadeModuleId&&(f.entryPoint=b(r,d.facadeModuleId));for(const[g,y]of Object.entries(d.modules)){const p=b(r,g);if(f.inputs[p]={bytesInOutput:Buffer.byteLength(y.code??"")},!n[p]){const S=this.getModuleInfo(g);n[p]={bytes:We(g,S?.code),imports:[...w(r,S?.importedIds??[],"import-statement"),...w(r,S?.dynamicallyImportedIds??[],"dynamic-import")]}}}i[u]=f}const a=process.env[U],c=a===void 0||a===""?void 0:h(r,a),s=`${k(h(r,".lunora"))}${O}`,l=c!==void 0&&k(c).startsWith(s)?c:h(r,F);if(e!==void 0&&e!==this.environment.name){ve(l,{force:!0}),this.warn(`bundle-meta: environment "${this.environment.name}" built a server bundle after "${e}" wrote one; no bundle-meta.json is written, because the app's own graph cannot be told apart from a service's`);return}e=this.environment.name,pe(B(l),{recursive:!0}),me(l,`${JSON.stringify({inputs:n,outputs:i},void 0,2)}
4
4
  `,"utf8")}}},R="/_lunora",Be=8787,v=new Map,W=r=>r.command==="serve"&&r.isPreview!==!0,Ie=(r,e)=>{let t;return()=>{if(t===void 0)try{H(e).projectConfig?.(r,"dev"),t={runs:!0}}catch(o){t={reason:o instanceof Error?o.message:String(o),runs:!1}}return t}},Me=r=>{const e=ie(r),t=e===void 0?void 0:se(e).parsed?.dev?.port;return typeof t=="number"?t:Be},Ne=(r,e)=>r.map(t=>{const o=t.apply;return{...t,apply:(n,i)=>W(i)&&e()?!1:typeof o=="function"?o(n,i):o===void 0||o===i.command}}),Ue=(r,e,{stream:t,tag:o})=>{const n=V(e);n!==void 0?r[n.level](`[lunora] ${n.text}`):t==="stderr"?r.warn(`[${o}] ${e}`):r.info(`[${o}] ${e}`)},Fe=(r,e)=>{const t=Me(r),o=new Map;return{apply:(n,i)=>W(i)&&e(),buildEnd(){L(o,this.environment)},config:n=>{if(n.server?.proxy?.[R]===void 0)return{server:{proxy:{[R]:{changeOrigin:!0,target:`http://127.0.0.1:${String(t)}`,ws:!0}}}}},async configureServer(n){const{logger:i}=n.config;await v.get(r)?.stop(),v.delete(r),i.info(`[lunora] starting the worker on celld at http://127.0.0.1:${String(t)} …`);const a=await j({log:(s,l)=>{Ue(i,s,l)},port:t,projectRoot:r});v.set(r,a);const c=s=>{i.error(`[lunora] the worker on celld exited (code ${String(s)}) — restart vite dev to bring it back`)};a.exited.then(c).catch(()=>{}),D(n,o,()=>{v.get(r)===a&&v.delete(r),a.stop().catch(s=>{i.error(`[lunora] stopping celld failed: ${s instanceof Error?s.message:String(s)}`)})})},name:"lunora:celld-dev"}},He=r=>({configResolved(e){ae(r.projectRoot,t=>{e.logger.warn(G(t))})},name:"lunora:cf-config-warning"}),je=()=>({}),Ve={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)"},Ge=r=>{const e=Ve[r.framework];return r.framework==="none"?m("no meta-framework detected — running standalone."):r.class==="B"?m(`detected ${e} — composition is handled by the framework adapter.`):m(`detected ${e} — composing the Lunora worker into one Cloudflare Worker.`)},ze=(r,e)=>{let t=!1;const o=()=>{e.framework??=z(r.projectRoot)};return{config(){o()},configResolved(){o()},configureServer(){o(),!t&&e.framework!==void 0&&(t=!0,console.info(Ge(e.framework)))},name:"lunora:framework-detect"}},E=r=>Array.isArray(r)?r:[],P=new WeakSet,Ke=(r,e={})=>{let t=!1;const o=r.experimental?.newConfig,n=o!==void 0&&o!==!1,i=e.hasCredentials??(()=>ce({projectRoot:e.projectRoot})),a=c=>{const s=(l,...u)=>{const d=typeof c=="function"?c(l,...u):c,f=d===void 0?void 0:{...d},g=t?[...E(l.artifacts),...E(f?.artifacts)]:[],y=t?le({ai:l.ai??f?.ai,artifacts:g},i):[];for(const p of y)Reflect.deleteProperty(l,p.kind),Reflect.deleteProperty(f??{},p.kind),console.warn(m(ue(p)));return f};return P.add(s),s};return{config(c,s){if(t=s.command==="serve"&&s.isPreview!==!0,n)return;const l=r;P.has(l.config)||(l.config=a(l.config)),Array.isArray(l.auxiliaryWorkers)&&(l.auxiliaryWorkers=l.auxiliaryWorkers.map(u=>P.has(u.config)?u:{...u,config:a(u.config)}))},enforce:"pre",name:"lunora:local-ai-binding"}},qe=5e3,Je=3e4,T=new Map,_=r=>{const e=T.get(r);if(e!==void 0)return e;const t={databases:[],pending:Promise.resolve(),servers:0,stopping:Promise.resolve()};return T.set(r,t),t},Qe=async r=>{const e=r.databases.splice(0);await Promise.allSettled(e.map(async t=>t.stop()))},C=(r,e)=>{const t=setTimeout(()=>{r.pending.then(async()=>{r.servers===0&&(r.stopping=Qe(r),await r.stopping)}).catch(()=>{})},e);return t.unref(),t},x=({projectRoot:r,start:e=de,wranglerConfigPath:t})=>{const o=new Map,n=i=>{const a=_(r);let c=!1;a.servers+=1,clearTimeout(a.stopTimer),i(()=>{c||(c=!0,a.servers-=1,a.servers===0&&(a.stopTimer=C(a,qe)))})};return{async config(i,a){if(a.command!=="serve")return;const c=_(r);clearTimeout(c.stopTimer);const s=c.pending,l=(async()=>{await s,await c.stopping;const u=await e({onWarning:d=>{console.warn(m(d))},projectRoot:r,wranglerConfigPath:t});u!==void 0&&c.databases.push(u),u!==void 0&&u.bindings.length>0&&console.info(m(`Hyperdrive ${u.bindings.join(", ")}: embedded Postgres (PGlite), data in .wrangler/state/lunora-pglite.`))})();c.pending=l.catch(()=>{});try{await l}finally{c.servers===0&&(clearTimeout(c.stopTimer),c.stopTimer=C(c,Je))}},buildEnd(){L(o,this.environment)},configureServer(i){n(a=>{D(i,o,a)})},configurePreviewServer(i){n(a=>{i.httpServer.once("close",a)})},enforce:"pre",name:"lunora:local-hyperdrive"}},Ye=(r,e)=>({config(t,o){if(o.command!=="serve")return;const{services:n}=Re(e),i=Array.isArray(r.auxiliaryWorkers)?r.auxiliaryWorkers:[],a=new Set(i.map(s=>s.configPath===void 0?"":h(e,s.configPath))),c=[...new Set(n.map(s=>s.wranglerPath))].filter(s=>!a.has(s)).map(s=>({configPath:s}));c.length>0&&(r.auxiliaryWorkers=[...i,...c])},enforce:"pre",name:"lunora:service-workers"}),Xe=r=>{if(r===!1)return!1;const e=r===!0||r===void 0?{}:r;return{...e,forwardedConsoleMethods:e.forwardedConsoleMethods??["error","warn"],solutionFinders:[...Ee,...e.solutionFinders??[]]}},Ze=(r,e)=>{const t=Q(r,e);if(!Y(t)){const o=X();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 Z(t,r),t},er=r=>{const e=r??{},t=e.schemaDir??"lunora";let o;e.cloudflare===!1?o=!1:e.cloudflare===!0||e.cloudflare===void 0?o={}:o=e.cloudflare;const n=e.projectRoot??process.cwd(),i=Ze(n,e.target);return{allowUnauthenticatedShardAccess:e.allowUnauthenticatedShardAccess??!1,apiSpec:e.apiSpec??"openapi",lazyFunctions:J(e.lazyFunctions),cloudflare:o,studio:e.studio??!0,generatedDir:`${t}/_generated`,overlay:Xe(e.overlay),projectRoot:n,schemaDir:t,shard:e.shard??{},target:i,validateWrangler:e.validateWrangler??!0}},rr=(r,e)=>{const{configPath:t}=r;return typeof t=="string"&&t!==""?h(e,t):void 0},Rr=r=>{const e=er(r),t=je(),o=K(),n=[ze(e,t),Pe(e,t),Se(e),Oe(e,o),he(e,o),$e(e.projectRoot),be(),ye(e),xe(e),He(e),ke()];e.studio&&n.push(Te(e)),e.validateWrangler&&n.push(Ce(e,o)),e.overlay!==!1&&n.push(ee(e.overlay)),n.push(we(e,o));const i=e.cloudflare===!1?void 0:{...e.cloudflare};if(n.push(Ae(i,{projectRoot:e.projectRoot})),i===void 0&&n.push(x({projectRoot:e.projectRoot})),i!==void 0){n.push(Ye(i,e.projectRoot));const a=q(e.target),c=Ie(e.projectRoot,e.target),s=()=>a&&c().runs;n.push(...Ne([x({projectRoot:e.projectRoot,wranglerConfigPath:rr(i,e.projectRoot)}),Ke(i,{projectRoot:e.projectRoot}),..._e(N(i))],s)),a&&n.push(Fe(e.projectRoot,s),{apply:(l,u)=>u.command==="serve"&&u.isPreview!==!0&&!s(),configureServer(l){l.config.logger.warn(`[lunora] target "${e.target}": vite dev serves the worker in workerd, not on ${e.target} — ${c().reason??"it cannot run this project"}. \`vite build\` then \`lunora deploy\` ships it to ${e.target}.`)},name:"lunora:target-runtime-notice"})}return n},Er=$(import.meta.url)("../package.json").version;export{Wr as CLASS_A_WIRING,Cr as GENERATED_CLASS_MODULES,Xr as LUNORA_API_UPDATED_EVENT,$r as LUNORA_WORKER_VIRTUAL_ID,et as STUDIO_PATH,Er as VERSION,qr as WORKER_STARTUP_HINT,Jr as augmentWorkerStartupError,zr as buildStudioUrl,Br as buildWorkerEntrySource,Nr as checkLunoraProxy,he as codegenPlugin,we as containerLogsPlugin,xr as detectFramework,ye as devStatePlugin,Se as devVariablesPlugin,Pe as frameworkComposePlugin,Ir as isAutoComposable,Qr as isWorkerEntryEvalError,be as logStreamPlugin,Rr as lunora,Vr as lunoraSolutionFinder,Ee as lunoraSolutionFinders,Fr as planViteRemoteBindings,ke as proxyCheckPlugin,Dr as reconcileWranglerCrons,Ae as remoteBindingsPlugin,Xe as resolveOverlayOption,Te as studioPlugin,Hr as withRemoteBindings,_e as withWorkerStartupHint,Ce as wranglerValidatorPlugin};
@@ -0,0 +1,29 @@
1
+ import{existsSync as L}from"node:fs";import{resolve as y,join as M}from"node:path";import{loadProjectConfig as C,findProjectConfigFile as k}from"@lunora/codegen";import{DURABLE_OBJECT_BINDINGS as m,GENERATED_CLASS_MODULES as I,isMergedProject as b,GENERATED_MODULE_DURABLE_OBJECTS as N,isMergedRoleModule as U,MERGED_DURABLE_OBJECTS_MODULE as j}from"@lunora/config";import{LunoraError as x}from"@lunora/errors";const R="virtual:lunora/worker",T="\0",f=`${T}${R}`,B=/^virtual:lunora\/worker$/u,W=/^\0virtual:lunora\/worker$/u,G=`// @lunora/vite — the composed worker entry is worker-only and unavailable in the client environment.
2
+ export default {};
3
+ `,P=/\/$/,v={"react-router":{handler:'{ fetch: (request) => createRequestHandler(() => import("virtual:react-router/server-build"), import.meta.env.MODE)(request) }',imports:'import { createRequestHandler } from "react-router";'},"solid-start":{handler:"ssrModule.default",imports:'import * as ssrModule from "@solidjs/start/server-handler";'},"tanstack-start":{handler:"ssrModule.default",imports:'import * as ssrModule from "@tanstack/react-start/server-entry";'},"tanstack-start-solid":{handler:"ssrModule.default",imports:'import * as ssrModule from "@tanstack/solid-start/server-entry";'},vinext:{handler:"ssrModule.default",imports:'import * as ssrModule from "vinext/server/fetch-handler";'}},h=r=>{const t=r.framework;return t?.class==="A"&&v[t.framework]!==void 0},V={adminRevocations:m.AdminRevocationDO,scheduler:m.SchedulerDO,shardRegistry:m.ShardRegistryDO},H=(r,t,a)=>{if(!a)return{classExport:"export const ShardDO = app.ShardDO;",imports:"",namespace:e=>`env.${V[e]}`,reexported:()=>!0};const s=t.flatMap(e=>{const o=N[e];return o===void 0?[]:[{className:o,module:e}]});return{classExport:`export const LunoraDO = mergeDurableObjects({ shard: app.ShardDO${s.map(({className:e,module:o})=>`, ${o}: ${e}`).join("")} });`,imports:[`
4
+ import { mergeDurableObjects, roleNamespace } from "${r}/${j}";`,...s.map(({className:e,module:o})=>`
5
+ import { ${e} } from "${r}/${o}";`)].join(""),namespace:e=>`roleNamespace(env.SHARD, "${e}")`,reexported:e=>!U(e)}},K=(r,t,a={})=>{const{allowUnauthenticatedShardAccess:s=!1,appConfigModule:e,classModules:o=[],mergeDurableObjects:l=!1,shard:p={}}=a,c=v[r];if(c===void 0)throw new x("INTERNAL",`[lunora] no class-A worker wiring for framework "${r}"`);const d=t.replaceAll("\\","/"),i=H(d,o,l),E=l&&o.includes("shardRegistry")?`
6
+ export { ShardRegistryEntrypoint } from "${d}/shardRegistry";
7
+ `:"",$=o.filter(n=>i.reexported(n)).map(n=>`
8
+ export * from "${d}/${n}";
9
+ `).join("")+E,g=o.includes("scheduler")?`
10
+ .scheduler({ namespace: (env) => ${i.namespace("scheduler")} })`:"",O=o.includes("shardRegistry")?`
11
+ .shardRegistry((env) => ${i.namespace("shardRegistry")})`:"",D=o.includes("adminRevocations")?`
12
+ .adminRevocations((env) => ${i.namespace("adminRevocations")})`:"",A=e===void 0?"":`
13
+ import lunoraConfig from "${e}";`,[_,S]=e===void 0?["",""]:["lunoraConfig.app(",")"],w=Object.entries(p).filter(([,n])=>n!==void 0).toSorted(([n],[u])=>n.localeCompare(u)).map(([n,u])=>`
14
+ .${n}(${JSON.stringify(u)})`).join("");return`// Generated by @lunora/vite — class-A worker composition (PLAN4 M2).
15
+ // Do not edit: emitted from the detected framework (${r}). Point your
16
+ // wrangler \`main\` here (or re-export it) instead of hand-wiring createWorker.
17
+ ${c.imports}
18
+ import { defineApp } from "${d}/app";${i.imports}${A}
19
+
20
+ const app = ${_}defineApp()
21
+ .shard((env) => env.SHARD)${g}${O}${D}${S}
22
+ .httpRouter(${c.handler})${w}${s?`
23
+ .extend(() => ({ allowUnauthenticatedShardAccess: true }))`:""}
24
+ .build();
25
+
26
+ ${i.classExport}
27
+ ${$}
28
+ export default app;
29
+ `},q=async r=>{const{config:t,error:a}=await C(r);return a!==void 0?{error:a}:typeof t?.app!="function"?{}:{specifier:k(r)?.replaceAll("\\","/")}},Q=(r,t)=>{const a=y(r.projectRoot,r.generatedDir.replace(P,""));return{load:{filter:{id:W},async handler(s){if(s===f&&h(t)&&t.framework!==void 0){if(this.environment.name==="client")return G;const e=I.filter(c=>L(M(a,`${c}.ts`))),o=b(a),{error:l,specifier:p}=await q(r.projectRoot);return l!==void 0&&this.warn(`[lunora] lunora.config could not be loaded, so its \`app\` hook was not composed: ${l}`),K(t.framework.framework,a,{allowUnauthenticatedShardAccess:r.allowUnauthenticatedShardAccess,appConfigModule:p,classModules:e,mergeDurableObjects:o,shard:r.shard})}}},name:"lunora:framework-compose",resolveId:{filter:{id:B},handler(s){if(s===R&&h(t))return f}}}};export{v as CLASS_A_WIRING,R as LUNORA_WORKER_VIRTUAL_ID,f as RESOLVED_LUNORA_WORKER_ID,K as buildWorkerEntrySource,Q as frameworkComposePlugin,h as isAutoComposable};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lunora/vite",
3
- "version": "1.0.0-alpha.417",
3
+ "version": "1.0.0-alpha.419",
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.63.1",
49
- "@lunora/codegen": "1.0.0-alpha.387",
50
- "@lunora/config": "1.0.0-alpha.444",
49
+ "@lunora/codegen": "1.0.0-alpha.389",
50
+ "@lunora/config": "1.0.0-alpha.446",
51
51
  "@lunora/errors": ">=1.0.0-alpha.51 <2.0.0-0",
52
52
  "@visulima/vite-overlay": "2.0.41"
53
53
  },
@@ -1,28 +0,0 @@
1
- import{existsSync as w}from"node:fs";import{resolve as L,join as y}from"node:path";import{loadProjectConfig as M,findProjectConfigFile as k}from"@lunora/codegen";import{GENERATED_CLASS_MODULES as C,isMergedProject as b,DURABLE_OBJECT_BINDINGS as m,GENERATED_MODULE_DURABLE_OBJECTS as I,isMergedRoleModule as N,MERGED_DURABLE_OBJECTS_MODULE as U}from"@lunora/config";import{LunoraError as j}from"@lunora/errors";const R="virtual:lunora/worker",x="\0",f=`${x}${R}`,T=/^virtual:lunora\/worker$/u,B=/^\0virtual:lunora\/worker$/u,W=`// @lunora/vite — the composed worker entry is worker-only and unavailable in the client environment.
2
- export default {};
3
- `,G=/\/$/,E={"react-router":{handler:'{ fetch: (request) => createRequestHandler(() => import("virtual:react-router/server-build"), import.meta.env.MODE)(request) }',imports:'import { createRequestHandler } from "react-router";'},"solid-start":{handler:"ssrModule.default",imports:'import * as ssrModule from "@solidjs/start/server-handler";'},"tanstack-start":{handler:"ssrModule.default",imports:'import * as ssrModule from "@tanstack/react-start/server-entry";'},"tanstack-start-solid":{handler:"ssrModule.default",imports:'import * as ssrModule from "@tanstack/solid-start/server-entry";'},vinext:{handler:"ssrModule.default",imports:'import * as ssrModule from "vinext/server/fetch-handler";'}},h=e=>{const o=e.framework;return o?.class==="A"&&E[o.framework]!==void 0},P=(e,o,s)=>{if(!s)return{classExport:"export const ShardDO = app.ShardDO;",imports:"",namespace:r=>`env.${r==="scheduler"?m.SchedulerDO:m.ShardRegistryDO}`,reexported:()=>!0};const a=o.flatMap(r=>{const t=I[r];return t===void 0?[]:[{className:t,module:r}]});return{classExport:`export const LunoraDO = mergeDurableObjects({ shard: app.ShardDO${a.map(({className:r,module:t})=>`, ${t}: ${r}`).join("")} });`,imports:[`
4
- import { mergeDurableObjects, roleNamespace } from "${e}/${U}";`,...a.map(({className:r,module:t})=>`
5
- import { ${r} } from "${e}/${t}";`)].join(""),namespace:r=>`roleNamespace(env.SHARD, "${r}")`,reexported:r=>!N(r)}},V=(e,o,s={})=>{const{allowUnauthenticatedShardAccess:a=!1,appConfigModule:r,classModules:t=[],mergeDurableObjects:i=!1,shard:p={}}=s,l=E[e];if(l===void 0)throw new j("INTERNAL",`[lunora] no class-A worker wiring for framework "${e}"`);const d=o.replaceAll("\\","/"),c=P(d,t,i),$=i&&t.includes("shardRegistry")?`
6
- export { ShardRegistryEntrypoint } from "${d}/shardRegistry";
7
- `:"",g=t.filter(n=>c.reexported(n)).map(n=>`
8
- export * from "${d}/${n}";
9
- `).join("")+$,v=t.includes("scheduler")?`
10
- .scheduler({ namespace: (env) => ${c.namespace("scheduler")} })`:"",O=t.includes("shardRegistry")?`
11
- .shardRegistry((env) => ${c.namespace("shardRegistry")})`:"",A=r===void 0?"":`
12
- import lunoraConfig from "${r}";`,[D,S]=r===void 0?["",""]:["lunoraConfig.app(",")"],_=Object.entries(p).filter(([,n])=>n!==void 0).toSorted(([n],[u])=>n.localeCompare(u)).map(([n,u])=>`
13
- .${n}(${JSON.stringify(u)})`).join("");return`// Generated by @lunora/vite — class-A worker composition (PLAN4 M2).
14
- // Do not edit: emitted from the detected framework (${e}). Point your
15
- // wrangler \`main\` here (or re-export it) instead of hand-wiring createWorker.
16
- ${l.imports}
17
- import { defineApp } from "${d}/app";${c.imports}${A}
18
-
19
- const app = ${D}defineApp()
20
- .shard((env) => env.SHARD)${v}${O}${S}
21
- .httpRouter(${l.handler})${_}${a?`
22
- .extend(() => ({ allowUnauthenticatedShardAccess: true }))`:""}
23
- .build();
24
-
25
- ${c.classExport}
26
- ${g}
27
- export default app;
28
- `},H=async e=>{const{config:o,error:s}=await M(e);return s!==void 0?{error:s}:typeof o?.app!="function"?{}:{specifier:k(e)?.replaceAll("\\","/")}},z=(e,o)=>{const s=L(e.projectRoot,e.generatedDir.replace(G,""));return{load:{filter:{id:B},async handler(a){if(a===f&&h(o)&&o.framework!==void 0){if(this.environment.name==="client")return W;const r=C.filter(l=>w(y(s,`${l}.ts`))),t=b(s),{error:i,specifier:p}=await H(e.projectRoot);return i!==void 0&&this.warn(`[lunora] lunora.config could not be loaded, so its \`app\` hook was not composed: ${i}`),V(o.framework.framework,s,{allowUnauthenticatedShardAccess:e.allowUnauthenticatedShardAccess,appConfigModule:p,classModules:r,mergeDurableObjects:t,shard:e.shard})}}},name:"lunora:framework-compose",resolveId:{filter:{id:T},handler(a){if(a===R&&h(o))return f}}}};export{E as CLASS_A_WIRING,R as LUNORA_WORKER_VIRTUAL_ID,f as RESOLVED_LUNORA_WORKER_ID,V as buildWorkerEntrySource,z as frameworkComposePlugin,h as isAutoComposable};