UNPKG

@lunora/cli

Version:

The Lunora CLI: init, dev, deploy, codegen, migrate, seed, doctor, insights, logs, registry, and the rest of the project commands

2 lines (1 loc) 4.93 kB
import{readFileSync as m,existsSync as u}from"node:fs";import{join as g}from"node:path";import{discoverSchema as h}from"@lunora/codegen";import{readLinkedProject as p}from"@lunora/config";import{findWranglerFile as $}from"@lunora/config/cloudflare";import{parse as v}from"jsonc-parser";import{Project as k}from"ts-morph";import{w,d as b}from"../packem_shared/binding-manifest-file-CQ1eQYy1.mjs";import{d as j}from"../packem_shared/command-Mmxzxyr5.mjs";import{EXIT_CODE as d}from"../packem_shared/EXIT_CODE-08cwt3MK.mjs";const f=(n,e)=>{if(n===null||typeof n!="object")return;const i=n[e];return typeof i=="string"&&i.length>0?i:void 0},S=(n,e)=>{if(n===null||typeof n!="object")return[];const i=n[e];return Array.isArray(i)?i:[]},x=(n,e)=>{const{manifest:i}=b(e);return{bindings:(i?.bindings??[]).map(r=>`${r.type}:${r.binding}`),compatibilityDate:f(n,"compatibility_date"),compatibilityFlags:S(n,"compatibility_flags").filter(r=>typeof r=="string"),main:f(n,"main"),name:f(n,"name")}},E=n=>({tables:n.tables.map(e=>{let i="root";return e.shardMode==="global"?i="global":typeof e.shardMode=="object"&&(i=`shardBy(${e.shardMode.field})`),{indexes:e.indexes.length,name:e.name,shard:i}}),vectorIndexes:n.vectorIndexes.length}),F=n=>{const e=g(n,"package.json");if(!u(e))return[];let i;try{i=JSON.parse(m(e,"utf8"))}catch{return[]}if(i===null||typeof i!="object")return[];const r=["dependencies","devDependencies","peerDependencies","optionalDependencies"],s=new Map;for(const a of r){const t=i[a];if(!(t===null||typeof t!="object"))for(const[o,c]of Object.entries(t))o.startsWith("@lunora/")&&typeof c=="string"&&!s.has(o)&&s.set(o,c)}return[...s.entries()].toSorted(([a],[t])=>a.localeCompare(t)).map(([a,t])=>({name:a,version:t}))},P=n=>{const e=F(n),i=$(n);let r;if(i)try{r=x(v(m(i,"utf8")),n)}catch{r=void 0}const s=g(n,"lunora","schema.ts");let a,t;if(u(s))try{const o=new k({skipAddingFilesFromTsConfig:!0,useInMemoryFileSystem:!1});a=E(h(o,s))}catch(o){t=o instanceof Error?o.message:String(o)}return{link:p(n),lunoraPackages:e,projectRoot:n,schema:a,schemaError:t,wrangler:r,wranglerPath:i}},I=(n,e)=>{if(e.info(`project: ${n.projectRoot}`),e.info(""),e.info("@lunora/* packages:"),n.lunoraPackages.length===0)e.info(" (none found in package.json)");else for(const i of n.lunoraPackages)e.info(` ${i.name}@${i.version}`);if(e.info(""),n.wrangler?(e.info(`wrangler: ${n.wranglerPath??""}`),e.info(` name: ${n.wrangler.name??"<unset>"}`),e.info(` main: ${n.wrangler.main??"<unset>"}`),e.info(` compatibility_date: ${n.wrangler.compatibilityDate??"<unset>"}`),e.info(` compatibility_flags: ${n.wrangler.compatibilityFlags.join(", ")||"<none>"}`),e.info(` bindings: ${n.wrangler.bindings.join(", ")||"<none>"}`)):e.info("wrangler: (not found)"),e.info(""),n.link?(e.info(`link: ${n.link.workerName??"(unnamed)"} -> ${n.link.workerUrl??"<no url>"}`),n.link.env!==void 0&&e.info(` env: ${n.link.env}`)):e.info("link: (not linked — run `lunora link --url <https://your-worker>`)"),e.info(""),n.schemaError!==void 0)e.warn(`schema: parse error — ${n.schemaError}`);else if(n.schema){e.info(`schema: ${String(n.schema.tables.length)} table(s), ${String(n.schema.vectorIndexes)} vector index(es)`);for(const i of n.schema.tables)e.info(` ${i.name} [${i.shard}, ${String(i.indexes)} index(es)]`)}else e.info("schema: (no lunora/schema.ts)")},M=n=>{const{cwd:e,json:i,logger:r,out:s}=n;if(s!==void 0){const{error:o}=w({destination:s,logger:r,projectRoot:e});return o!==void 0?(r.error(o),{code:d.USAGE,error:o}):{code:0}}const{error:a,manifest:t}=b(e);if(t===void 0){const o=a??"could not derive the binding manifest";return r.error(o),{code:d.USAGE,error:o}}if(i)return{code:0,data:t};if(t.bindings.length===0)r.info("No bindings declared.");else{const o=Math.max(...t.bindings.map(c=>c.type.length));r.info(`${String(t.bindings.length)} binding(s):`);for(const c of t.bindings){const l=[c.resource,c.className,c.resourceId].filter(y=>y!==void 0).join(" ");r.info(` ${c.type.padEnd(o)} ${c.binding}${l===""?"":` ${l}`}`)}}return t.crons.length>0&&r.info(`${String(t.crons.length)} cron trigger(s): ${t.crons.join(", ")}`),t.vars.length>0&&r.info(`${String(t.vars.length)} var(s): ${t.vars.join(", ")}`),t.unknown.length>0&&r.warn(`not modelled by the manifest: ${t.unknown.join(", ")} — anything they bind must be provisioned by hand.`),{code:0,data:t}},A=n=>{const e=n.cwd??process.cwd(),i=n.format==="json",{logger:r}=n;if(n.bindings===!0)return M({cwd:e,json:i,logger:r,out:n.out});if(n.out!==void 0){const a="--out only applies with --bindings; the full info snapshot prints to stdout under --format json.";return r.error(a),{code:d.USAGE,error:a}}const s=P(e);return i||I(s,r),{code:0,data:s,snapshot:s}},L=j(({cwd:n,format:e,logger:i,options:r})=>A({bindings:r.bindings===!0,cwd:n,format:e,logger:i,out:r.out}));export{P as collectInfo,L as execute,A as runInfoCommand};