@lunora/vite 1.0.0-alpha.307 → 1.0.0-alpha.309
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.mts +2 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.mjs +1 -1
- package/dist/packem_shared/CLASS_A_WIRING-DCI5QzA9.mjs +26 -0
- package/dist/packem_shared/codegenPlugin-8QF4FJr4.mjs +3 -0
- package/package.json +3 -3
- package/dist/packem_shared/CLASS_A_WIRING-BAnDZbel.mjs +0 -24
- package/dist/packem_shared/codegenPlugin-eWUCZzQt.mjs +0 -3
package/dist/index.d.mts
CHANGED
|
@@ -262,6 +262,8 @@ interface WorkerEntryComposition {
|
|
|
262
262
|
appConfigModule?: string;
|
|
263
263
|
/** The `_generated/` class modules that exist, each star-re-exported. */
|
|
264
264
|
classModules?: ReadonlyArray<GeneratedClassModule>;
|
|
265
|
+
/** Codegen wrote the merge module: export one `LunoraDO` hosting the shard, scheduler and registry (plan 462). */
|
|
266
|
+
mergeDurableObjects?: boolean;
|
|
265
267
|
/** Per-shard knobs, each key named after the builder method that sets it. */
|
|
266
268
|
shard?: LunoraShardConfig;
|
|
267
269
|
}
|
package/dist/index.d.ts
CHANGED
|
@@ -262,6 +262,8 @@ interface WorkerEntryComposition {
|
|
|
262
262
|
appConfigModule?: string;
|
|
263
263
|
/** The `_generated/` class modules that exist, each star-re-exported. */
|
|
264
264
|
classModules?: ReadonlyArray<GeneratedClassModule>;
|
|
265
|
+
/** Codegen wrote the merge module: export one `LunoraDO` hosting the shard, scheduler and registry (plan 462). */
|
|
266
|
+
mergeDurableObjects?: boolean;
|
|
265
267
|
/** Per-shard knobs, each key named after the builder method that sets it. */
|
|
266
268
|
shard?: LunoraShardConfig;
|
|
267
269
|
}
|
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-8QF4FJr4.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,26 @@
|
|
|
1
|
+
import{existsSync as w}from"node:fs";import{resolve as _,join as M}from"node:path";import{loadProjectConfig as C,findProjectConfigFile as L}from"@lunora/codegen";import{GENERATED_CLASS_MODULES as b,isMergedProject as k,DURABLE_OBJECT_BINDINGS as m,GENERATED_MODULE_DURABLE_OBJECTS as j,isMergedRoleModule as y,MERGED_DURABLE_OBJECTS_MODULE as I}from"@lunora/config";import{LunoraError as N}from"@lunora/errors";const $="virtual:lunora/worker",x="\0",f=`${x}${$}`,U=`// @lunora/vite — the composed worker entry is worker-only and unavailable in the client environment.
|
|
2
|
+
export default {};
|
|
3
|
+
`,T=/\/$/,R={"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 o=r.framework;return o?.class==="A"&&R[o.framework]!==void 0},B=(r,o,s)=>{if(!s)return{classExport:"export const ShardDO = app.ShardDO;",imports:"",namespace:e=>`env.${e==="scheduler"?m.SchedulerDO:m.ShardRegistryDO}`,reexported:()=>!0};const a=o.flatMap(e=>{const t=j[e];return t===void 0?[]:[{className:t,module:e}]});return{classExport:`export const LunoraDO = mergeDurableObjects({ shard: app.ShardDO${a.map(({className:e,module:t})=>`, ${t}: ${e}`).join("")} });`,imports:[`
|
|
4
|
+
import { mergeDurableObjects, roleNamespace } from "${r}/${I}";`,...a.map(({className:e,module:t})=>`
|
|
5
|
+
import { ${e} } from "${r}/${t}";`)].join(""),namespace:e=>`roleNamespace(env.SHARD, "${e}")`,reexported:e=>!y(e)}},G=(r,o,s={})=>{const{allowUnauthenticatedShardAccess:a=!1,appConfigModule:e,classModules:t=[],mergeDurableObjects:c=!1,shard:d={}}=s,i=R[r];if(i===void 0)throw new N("INTERNAL",`[lunora] no class-A worker wiring for framework "${r}"`);const p=o.replaceAll("\\","/"),l=B(p,t,c),v=t.filter(n=>l.reexported(n)).map(n=>`
|
|
6
|
+
export * from "${p}/${n}";
|
|
7
|
+
`).join(""),E=t.includes("scheduler")?`
|
|
8
|
+
.scheduler({ namespace: (env) => ${l.namespace("scheduler")} })`:"",g=t.includes("shardRegistry")?`
|
|
9
|
+
.shardRegistry((env) => ${l.namespace("shardRegistry")})`:"",A=e===void 0?"":`
|
|
10
|
+
import lunoraConfig from "${e}";`,[D,O]=e===void 0?["",""]:["lunoraConfig.app(",")"],S=Object.entries(d).filter(([,n])=>n!==void 0).toSorted(([n],[u])=>n.localeCompare(u)).map(([n,u])=>`
|
|
11
|
+
.${n}(${JSON.stringify(u)})`).join("");return`// Generated by @lunora/vite — class-A worker composition (PLAN4 M2).
|
|
12
|
+
// Do not edit: emitted from the detected framework (${r}). Point your
|
|
13
|
+
// wrangler \`main\` here (or re-export it) instead of hand-wiring createWorker.
|
|
14
|
+
${i.imports}
|
|
15
|
+
import { defineApp } from "${p}/app";${l.imports}${A}
|
|
16
|
+
|
|
17
|
+
const app = ${D}defineApp()
|
|
18
|
+
.shard((env) => env.SHARD)${E}${g}${O}
|
|
19
|
+
.httpRouter(${i.handler})${S}${a?`
|
|
20
|
+
.extend(() => ({ allowUnauthenticatedShardAccess: true }))`:""}
|
|
21
|
+
.build();
|
|
22
|
+
|
|
23
|
+
${l.classExport}
|
|
24
|
+
${v}
|
|
25
|
+
export default app;
|
|
26
|
+
`},P=async r=>{const{config:o,error:s}=await C(r);return s!==void 0?{error:s}:typeof o?.app!="function"?{}:{specifier:L(r)?.replaceAll("\\","/")}},K=(r,o)=>{const s=_(r.projectRoot,r.generatedDir.replace(T,""));return{async load(a){if(a===f&&h(o)&&o.framework!==void 0){if(this.environment.name==="client")return U;const e=b.filter(i=>w(M(s,`${i}.ts`))),t=k(s),{error:c,specifier:d}=await P(r.projectRoot);return c!==void 0&&this.warn(`[lunora] lunora.config could not be loaded, so its \`app\` hook was not composed: ${c}`),G(o.framework.framework,s,{allowUnauthenticatedShardAccess:r.allowUnauthenticatedShardAccess,appConfigModule:d,classModules:e,mergeDurableObjects:t,shard:r.shard})}},name:"lunora:framework-compose",resolveId(a){if(a===$&&h(o))return f}}};export{R as CLASS_A_WIRING,$ as LUNORA_WORKER_VIRTUAL_ID,f as RESOLVED_LUNORA_WORKER_ID,G as buildWorkerEntrySource,K as frameworkComposePlugin,h as isAutoComposable};
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import{readFileSync as J,existsSync as H}from"node:fs";import{resolve as p,sep as k,relative as z,basename as K,join as X}from"node:path";import{findProjectConfigFile as q,PROJECT_CONFIG_FILENAMES as Q,findTsconfig as Y,isTestPath as Z,runCodegen as ee,fingerprintSchemaSources as A,createCodegenProject as ne,refreshCodegenProject as re,CodegenDiagnosticError as te}from"@lunora/codegen";import{LUNORA_TAG as w,isCodegenDisabled as oe,CODEGEN_ENV as x,runPostCodegenHook as W,reportCodegenFindings as ie,blockingFindingsMessage as ae}from"@lunora/config";import{findWranglerFile as ce,readWranglerJsonc as se,WRANGLER_FILES as le,reconcileBindingsSafely as de,collectWranglerSecretVariables as fe,reconcileWranglerExtras as ge}from"@lunora/config/cloudflare";import{isRunnableDevEnvironment as ue}from"vite";import{createHash as he}from"node:crypto";import me from"./LUNORA_API_UPDATED_EVENT-CO2Rv2re.mjs";import{a as pe,r as we}from"./server-close-DWiO4Vxb.mjs";const ye=(e,n)=>{try{const{parsed:o,text:r}=se(e);return o===void 0?`raw:${r}`:JSON.stringify(n?n(o):o)}catch{return"unreadable"}},ve=e=>{const n={...e},{triggers:o}=n;if(o!==null&&typeof o=="object"){const r={...o};delete r.crons,Object.keys(r).length>0?n.triggers=r:delete n.triggers}return n},O=e=>{const n=ce(e),o=n===void 0?"absent":ye(n,ve),r=q(e);let l="absent";try{r!==void 0&&(l=he("sha256").update(J(r)).digest("hex"))}catch{}return`${o}\0${l}`},Se=100,I=300,G=2,Ee=e=>{let n,o,r=0;const l=()=>{n&&(clearTimeout(n),n=void 0)},c=(u,f)=>{o&&clearTimeout(o),o=setTimeout(()=>{if(o=void 0,e.fingerprint()!==u){if(r+=1,r>G){e.logger.warn(`${w} \`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(`${w} schema changed while \`postcodegen\` was running — regenerating`),f()}},I)},d=u=>{e.regenerate(u,f=>{c(f,()=>{d(u)})})};return{cancelPending:l,dispose:()=>{l(),o&&(clearTimeout(o),o=void 0)},onSave:u=>{l(),r=0,n=setTimeout(()=>{n=void 0,d(u)},Se)}}},L=/[/\\]tsconfig\..+\.json$/u,$e=e=>{const n=e.map(r=>` • ${r.kind} "${r.exportName}" — class ${r.className} is not exported by your worker entry.`),o=[...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:",...o].join(`
|
|
2
|
+
`)},be=(e,n,o)=>{if(n.warn(`${w} schema.ts not found at ${e} — codegen skipped`),o!==void 0){const r=`schema.ts not found at ${e} — generated output is now stale`;o.onError(new Error(r),r)}},M=(e,n,o,r)=>{const l=X(e.projectRoot,e.schemaDir,"schema.ts");if(!H(l))return be(l,n,o),{};try{const c=ee({apiSpec:e.apiSpec,lunoraDirectory:e.schemaDir,project:r,projectRoot:e.projectRoot,target:e.target,wranglerVariables:fe(e.projectRoot)});return ge(e.projectRoot,c.cronTriggers,n),ie(c,n),{blockingMessage:ae(c),outputDirectory:p(c.outputDirectory)}}catch(c){const d=c instanceof Error?c.message:String(c);return n.error(`${w} codegen failed: ${d}`),o?.onError(c,d),{failure:`${w} codegen failed: ${d}`}}},ke=(e,n,o)=>{let r;for(const[l,c]of Object.entries(e.environments)){if(l==="client"){r=c;continue}ue(c)||c.hot.send({path:"*",triggeredBy:n,type:"full-reload"})}if(r===void 0){e.hot.send({type:"full-reload"});return}if(o){r.hot.send({type:"full-reload"});return}r.hot.send({event:me,type:"custom"})},R={error:e=>{console.error(e)},info:e=>{console.info(e)},warn:e=>{console.warn(e)}},Ne=e=>{const n=p(e.projectRoot,e.schemaDir),o=oe(process.env[x]);let r=p(e.projectRoot,e.generatedDir),l=0,c=!1,d;const u=new Map;let f,C=!1,j=!1,y,D;return{config(i,h){y=h.command},configResolved(){y!=="build"&&o||(D=M(e,R))},async buildStart(){const i=y!=="build"&&o,{blockingMessage:h,failure:v,outputDirectory:b}=D??(i?{}:M(e,R));if(D=void 0,y==="build"&&v!==void 0&&this.error(v),b!==void 0){r=b,c=!0;let g;try{g=await W({cwd:e.projectRoot,logger:R})}finally{c=!1}g.ran&&(l=Date.now()),y==="build"&&g.error!==void 0&&this.error(g.error)}y==="build"&&h!==void 0&&this.error(h),await de(e,R,g=>{d?.hot.send({err:{loc:void 0,message:$e(g),stack:""},type:"error"})}),d!==void 0&&(f=O(e.projectRoot),C=!0)},configureServer(i){d=i,i.watcher.add(n),f=O(e.projectRoot),C=!1;const h={error:t=>{i.config.logger.error(t)},info:t=>{i.config.logger.info(t)},warn:t=>{i.config.logger.warn(t)}};let v=!1;const b={onError(t,a){v=!0;const s=t instanceof te?{column:t.column,file:t.file,line:t.line}:void 0,$=s===void 0?`[lunora] codegen failed: ${a}
|
|
3
|
+
(see terminal for full stack trace and file location)`:`[lunora] codegen failed: ${a}`;d?.hot.send({err:{loc:s,message:$,stack:t instanceof Error?t.stack??"":""},type:"error"})}},g=(t,a)=>t===a||t.startsWith(a+k);let T=!1,m;const U=()=>{for(const t of Object.values(i.environments)){const a=t.moduleGraph;for(const s of a.idToModuleMap.values())s.id&&g(s.id,r)&&a.invalidateModule(s)}},V=async(t,a)=>{try{if(T)return;m===void 0?m=ne(n):re(m,n);const{outputDirectory:s}=M(e,h,b,m);if(s===void 0){m=void 0;return}r=s;const $=A(n);c=!0;let _;try{_=await W({cwd:e.projectRoot,logger:h})}finally{c=!1}if(_.ran&&(l=Date.now(),a($)),_.error!==void 0)return;U(),ke(i,t,v),v=!1}catch(s){h.error(`${w} codegen watch: ${s instanceof Error?s.message:String(s)}`)}},P=Ee({fingerprint:()=>A(n),logger:h,regenerate:(t,a)=>{V(t,a)}}),S=t=>{const a=p(t);if(L.test(a)){m=void 0;return}if(a.endsWith(`${k}tsconfig.json`)&&a===Y(n)){m=void 0;return}if(g(a,n)&&!g(a,r)&&a.endsWith(".ts")&&!Z(z(n,a).split(k).join("/"))){if(c||Date.now()-l<I){P.cancelPending();return}P.onSave(a)}},N=t=>{const a=p(t);(a.endsWith(`${k}tsconfig.json`)||L.test(a))&&(m=void 0)};o?i.config.logger.info(`${w} codegen watch disabled (${x}) — _generated/ is written only by an explicit \`lunora codegen\``):(i.watcher.on("add",S),i.watcher.on("change",S),i.watcher.on("unlink",S),i.watcher.on("unlink",N));const F=new Set([...le.map(t=>p(e.projectRoot,t)),...Q.map(t=>p(e.projectRoot,t))]);for(const t of F)i.watcher.add(t);const E=t=>{if(!F.has(p(t))||j)return;const a=O(e.projectRoot);if(!C){f=a;return}if(f===void 0){f=a;return}a!==f&&(f=a,j=!0,i.config.logger.info(`${w} ${K(p(t))} changed — restarting dev server`),Promise.resolve(i.restart()).finally(()=>{j=!1}).catch(s=>{const $=s instanceof Error?s.message:String(s);i.config.logger.error(`${w} dev server restart failed: ${$} — keeping the running server; re-save your config to retry.`),i.hot.send({err:{loc:void 0,message:`[lunora] dev server restart failed: ${$}`,stack:""},type:"error"})}))};i.watcher.on("add",E),i.watcher.on("change",E),i.watcher.on("unlink",E);const B=()=>{T||(T=!0,m=void 0,P.dispose(),i.watcher.off("add",S),i.watcher.off("change",S),i.watcher.off("unlink",S),i.watcher.off("unlink",N),i.watcher.off("add",E),i.watcher.off("change",E),i.watcher.off("unlink",E))};return()=>{we(i,u,B)}},buildEnd(){pe(u,this.environment)},name:"lunora:codegen"}};export{Ne 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.309",
|
|
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.267",
|
|
50
|
+
"@lunora/config": "1.0.0-alpha.311",
|
|
51
51
|
"@lunora/errors": "1.0.0-alpha.50",
|
|
52
52
|
"@visulima/vite-overlay": "2.0.41"
|
|
53
53
|
},
|
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
import{existsSync as $}from"node:fs";import{resolve as E,join as k}from"node:path";import{loadProjectConfig as C,findProjectConfigFile as L}from"@lunora/codegen";import{GENERATED_CLASS_MODULES as _}from"@lunora/config";import{LunoraError as y}from"@lunora/errors";const f="virtual:lunora/worker",I="\0",p=`${I}${f}`,M=`// @lunora/vite — the composed worker entry is worker-only and unavailable in the client environment.
|
|
2
|
-
export default {};
|
|
3
|
-
`,D=/\/$/,m={"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";'}},u=r=>{const e=r.framework;return e?.class==="A"&&m[e.framework]!==void 0},O=(r,e,o={})=>{const{allowUnauthenticatedShardAccess:a=!1,appConfigModule:n,classModules:s=[],shard:l={}}=o,i=m[r];if(i===void 0)throw new y("INTERNAL",`[lunora] no class-A worker wiring for framework "${r}"`);const c=e.replaceAll("\\","/"),h=s.map(t=>`
|
|
4
|
-
export * from "${c}/${t}";
|
|
5
|
-
`).join(""),v=s.includes("scheduler")?`
|
|
6
|
-
.scheduler({ namespace: (env) => env.SCHEDULER })`:"",R=s.includes("shardRegistry")?`
|
|
7
|
-
.shardRegistry((env) => env.SHARD_REGISTRY)`:"",w=n===void 0?"":`
|
|
8
|
-
import lunoraConfig from "${n}";`,[A,S]=n===void 0?["",""]:["lunoraConfig.app(",")"],g=Object.entries(l).filter(([,t])=>t!==void 0).toSorted(([t],[d])=>t.localeCompare(d)).map(([t,d])=>`
|
|
9
|
-
.${t}(${JSON.stringify(d)})`).join("");return`// Generated by @lunora/vite — class-A worker composition (PLAN4 M2).
|
|
10
|
-
// Do not edit: emitted from the detected framework (${r}). Point your
|
|
11
|
-
// wrangler \`main\` here (or re-export it) instead of hand-wiring createWorker.
|
|
12
|
-
${i.imports}
|
|
13
|
-
import { defineApp } from "${c}/app";${w}
|
|
14
|
-
|
|
15
|
-
const app = ${A}defineApp()
|
|
16
|
-
.shard((env) => env.SHARD)${v}${R}${S}
|
|
17
|
-
.httpRouter(${i.handler})${g}${a?`
|
|
18
|
-
.extend(() => ({ allowUnauthenticatedShardAccess: true }))`:""}
|
|
19
|
-
.build();
|
|
20
|
-
|
|
21
|
-
export const ShardDO = app.ShardDO;
|
|
22
|
-
${h}
|
|
23
|
-
export default app;
|
|
24
|
-
`},U=async r=>{const{config:e,error:o}=await C(r);return o!==void 0?{error:o}:typeof e?.app!="function"?{}:{specifier:L(r)?.replaceAll("\\","/")}},H=(r,e)=>{const o=E(r.projectRoot,r.generatedDir.replace(D,""));return{async load(a){if(a===p&&u(e)&&e.framework!==void 0){if(this.environment.name==="client")return M;const n=_.filter(i=>$(k(o,`${i}.ts`))),{error:s,specifier:l}=await U(r.projectRoot);return s!==void 0&&this.warn(`[lunora] lunora.config could not be loaded, so its \`app\` hook was not composed: ${s}`),O(e.framework.framework,o,{allowUnauthenticatedShardAccess:r.allowUnauthenticatedShardAccess,appConfigModule:l,classModules:n,shard:r.shard})}},name:"lunora:framework-compose",resolveId(a){if(a===f&&u(e))return p}}};export{m as CLASS_A_WIRING,f as LUNORA_WORKER_VIRTUAL_ID,p as RESOLVED_LUNORA_WORKER_ID,O as buildWorkerEntrySource,H as frameworkComposePlugin,u as isAutoComposable};
|
|
@@ -1,3 +0,0 @@
|
|
|
1
|
-
import{readFileSync as J,existsSync as H}from"node:fs";import{resolve as p,sep as b,basename as z,join as K}from"node:path";import{findProjectConfigFile as X,PROJECT_CONFIG_FILENAMES as q,findTsconfig as Q,runCodegen as Y,fingerprintSchemaSources as A,createCodegenProject as Z,refreshCodegenProject as ee,CodegenDiagnosticError as ne}from"@lunora/codegen";import{LUNORA_TAG as w,isCodegenDisabled as te,CODEGEN_ENV as x,runPostCodegenHook as W,reportCodegenFindings as re,blockingFindingsMessage as oe}from"@lunora/config";import{findWranglerFile as ie,readWranglerJsonc as ce,WRANGLER_FILES as ae,reconcileBindingsSafely as se,collectWranglerSecretVariables as le,reconcileWranglerExtras as de}from"@lunora/config/cloudflare";import{isRunnableDevEnvironment as fe}from"vite";import{createHash as ge}from"node:crypto";import ue from"./LUNORA_API_UPDATED_EVENT-CO2Rv2re.mjs";import{a as he,r as me}from"./server-close-DWiO4Vxb.mjs";const pe=(e,n)=>{try{const{parsed:o,text:t}=ce(e);return o===void 0?`raw:${t}`:JSON.stringify(n?n(o):o)}catch{return"unreadable"}},we=e=>{const n={...e},{triggers:o}=n;if(o!==null&&typeof o=="object"){const t={...o};delete t.crons,Object.keys(t).length>0?n.triggers=t:delete n.triggers}return n},O=e=>{const n=ie(e),o=n===void 0?"absent":pe(n,we),t=X(e);let l="absent";try{t!==void 0&&(l=ge("sha256").update(J(t)).digest("hex"))}catch{}return`${o}\0${l}`},ye=100,I=300,G=2,ve=e=>{let n,o,t=0;const l=()=>{n&&(clearTimeout(n),n=void 0)},a=(u,f)=>{o&&clearTimeout(o),o=setTimeout(()=>{if(o=void 0,e.fingerprint()!==u){if(t+=1,t>G){e.logger.warn(`${w} \`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(`${w} schema changed while \`postcodegen\` was running — regenerating`),f()}},I)},d=u=>{e.regenerate(u,f=>{a(f,()=>{d(u)})})};return{cancelPending:l,dispose:()=>{l(),o&&(clearTimeout(o),o=void 0)},onSave:u=>{l(),t=0,n=setTimeout(()=>{n=void 0,d(u)},ye)}}},L=/[/\\]tsconfig\..+\.json$/u,Se=e=>{const n=e.map(t=>` • ${t.kind} "${t.exportName}" — class ${t.className} is not exported by your worker entry.`),o=[...new Set(e.map(t=>t.module))].map(t=>` export * from "./lunora/_generated/${t}";`);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:",...o].join(`
|
|
2
|
-
`)},Ee=(e,n,o)=>{if(n.warn(`${w} schema.ts not found at ${e} — codegen skipped`),o!==void 0){const t=`schema.ts not found at ${e} — generated output is now stale`;o.onError(new Error(t),t)}},M=(e,n,o,t)=>{const l=K(e.projectRoot,e.schemaDir,"schema.ts");if(!H(l))return Ee(l,n,o),{};try{const a=Y({apiSpec:e.apiSpec,lunoraDirectory:e.schemaDir,project:t,projectRoot:e.projectRoot,target:e.target,wranglerVariables:le(e.projectRoot)});return de(e.projectRoot,a.cronTriggers,n),re(a,n),{blockingMessage:oe(a),outputDirectory:p(a.outputDirectory)}}catch(a){const d=a instanceof Error?a.message:String(a);return n.error(`${w} codegen failed: ${d}`),o?.onError(a,d),{failure:`${w} codegen failed: ${d}`}}},$e=(e,n,o)=>{let t;for(const[l,a]of Object.entries(e.environments)){if(l==="client"){t=a;continue}fe(a)||a.hot.send({path:"*",triggeredBy:n,type:"full-reload"})}if(t===void 0){e.hot.send({type:"full-reload"});return}if(o){t.hot.send({type:"full-reload"});return}t.hot.send({event:ue,type:"custom"})},R={error:e=>{console.error(e)},info:e=>{console.info(e)},warn:e=>{console.warn(e)}},Oe=e=>{const n=p(e.projectRoot,e.schemaDir),o=te(process.env[x]);let t=p(e.projectRoot,e.generatedDir),l=0,a=!1,d;const u=new Map;let f,C=!1,j=!1,y,D;return{config(i,h){y=h.command},configResolved(){y!=="build"&&o||(D=M(e,R))},async buildStart(){const i=y!=="build"&&o,{blockingMessage:h,failure:v,outputDirectory:k}=D??(i?{}:M(e,R));if(D=void 0,y==="build"&&v!==void 0&&this.error(v),k!==void 0){t=k,a=!0;let g;try{g=await W({cwd:e.projectRoot,logger:R})}finally{a=!1}g.ran&&(l=Date.now()),y==="build"&&g.error!==void 0&&this.error(g.error)}y==="build"&&h!==void 0&&this.error(h),await se(e,R,g=>{d?.hot.send({err:{loc:void 0,message:Se(g),stack:""},type:"error"})}),d!==void 0&&(f=O(e.projectRoot),C=!0)},configureServer(i){d=i,i.watcher.add(n),f=O(e.projectRoot),C=!1;const h={error:r=>{i.config.logger.error(r)},info:r=>{i.config.logger.info(r)},warn:r=>{i.config.logger.warn(r)}};let v=!1;const k={onError(r,c){v=!0;const s=r instanceof ne?{column:r.column,file:r.file,line:r.line}:void 0,$=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:$,stack:r instanceof Error?r.stack??"":""},type:"error"})}},g=(r,c)=>r===c||r.startsWith(c+b);let T=!1,m;const U=()=>{for(const r of Object.values(i.environments)){const c=r.moduleGraph;for(const s of c.idToModuleMap.values())s.id&&g(s.id,t)&&c.invalidateModule(s)}},V=async(r,c)=>{try{if(T)return;m===void 0?m=Z(n):ee(m,n);const{outputDirectory:s}=M(e,h,k,m);if(s===void 0){m=void 0;return}t=s;const $=A(n);a=!0;let P;try{P=await W({cwd:e.projectRoot,logger:h})}finally{a=!1}if(P.ran&&(l=Date.now(),c($)),P.error!==void 0)return;U(),$e(i,r,v),v=!1}catch(s){h.error(`${w} codegen watch: ${s instanceof Error?s.message:String(s)}`)}},_=ve({fingerprint:()=>A(n),logger:h,regenerate:(r,c)=>{V(r,c)}}),S=r=>{const c=p(r);if(L.test(c)){m=void 0;return}if(c.endsWith(`${b}tsconfig.json`)&&c===Q(n)){m=void 0;return}if(g(c,n)&&!g(c,t)&&c.endsWith(".ts")&&!(c.includes(`${b}__tests__${b}`)||c.endsWith(".test.ts")||c.endsWith(".spec.ts"))){if(a||Date.now()-l<I){_.cancelPending();return}_.onSave(c)}},N=r=>{const c=p(r);(c.endsWith(`${b}tsconfig.json`)||L.test(c))&&(m=void 0)};o?i.config.logger.info(`${w} codegen watch disabled (${x}) — _generated/ is written only by an explicit \`lunora codegen\``):(i.watcher.on("add",S),i.watcher.on("change",S),i.watcher.on("unlink",S),i.watcher.on("unlink",N));const F=new Set([...ae.map(r=>p(e.projectRoot,r)),...q.map(r=>p(e.projectRoot,r))]);for(const r of F)i.watcher.add(r);const E=r=>{if(!F.has(p(r))||j)return;const c=O(e.projectRoot);if(!C){f=c;return}if(f===void 0){f=c;return}c!==f&&(f=c,j=!0,i.config.logger.info(`${w} ${z(p(r))} changed — restarting dev server`),Promise.resolve(i.restart()).finally(()=>{j=!1}).catch(s=>{const $=s instanceof Error?s.message:String(s);i.config.logger.error(`${w} dev server restart failed: ${$} — keeping the running server; re-save your config to retry.`),i.hot.send({err:{loc:void 0,message:`[lunora] dev server restart failed: ${$}`,stack:""},type:"error"})}))};i.watcher.on("add",E),i.watcher.on("change",E),i.watcher.on("unlink",E);const B=()=>{T||(T=!0,m=void 0,_.dispose(),i.watcher.off("add",S),i.watcher.off("change",S),i.watcher.off("unlink",S),i.watcher.off("unlink",N),i.watcher.off("add",E),i.watcher.off("change",E),i.watcher.off("unlink",E))};return()=>{me(i,u,B)}},buildEnd(){he(u,this.environment)},name:"lunora:codegen"}};export{Oe as default};
|