UNPKG

@lunora/cli

Version:

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

5 lines (4 loc) 5.03 kB
import{mkdirSync as y,writeFileSync as h,readFileSync as l,existsSync as m}from"node:fs";import{isAbsolute as v,resolve as $,dirname as p,join as u}from"node:path";import{discoverSchema as k}from"@lunora/codegen";import{readLinkedProject as w}from"@lunora/config";import{findWranglerFile as j}from"@lunora/config/cloudflare";import{parse as S}from"jsonc-parser";import{Project as x}from"ts-morph";import{d as g}from"../packem_shared/binding-manifest-file-CQ1eQYy1.mjs";import{d as F}from"../packem_shared/command-DwC11Cwe.mjs";const d=(n,e)=>{if(n===null||typeof n!="object")return;const i=n[e];return typeof i=="string"&&i.length>0?i:void 0},P=(n,e)=>{if(n===null||typeof n!="object")return[];const i=n[e];return Array.isArray(i)?i:[]},I=(n,e)=>{const{manifest:i}=g(e);return{bindings:(i?.bindings??[]).map(t=>`${t.type}:${t.binding}`),compatibilityDate:d(n,"compatibility_date"),compatibilityFlags:P(n,"compatibility_flags").filter(t=>typeof t=="string"),main:d(n,"main"),name:d(n,"name")}},M=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}),N=n=>{const e=u(n,"package.json");if(!m(e))return[];let i;try{i=JSON.parse(l(e,"utf8"))}catch{return[]}if(i===null||typeof i!="object")return[];const t=["dependencies","devDependencies","peerDependencies","optionalDependencies"],s=new Map;for(const a of t){const r=i[a];if(!(r===null||typeof r!="object"))for(const[o,c]of Object.entries(r))o.startsWith("@lunora/")&&typeof c=="string"&&!s.has(o)&&s.set(o,c)}return[...s.entries()].toSorted(([a],[r])=>a.localeCompare(r)).map(([a,r])=>({name:a,version:r}))},D=n=>{const e=N(n),i=j(n);let t;if(i)try{t=I(S(l(i,"utf8")),n)}catch{t=void 0}const s=u(n,"lunora","schema.ts");let a,r;if(m(s))try{const o=new x({skipAddingFilesFromTsConfig:!0,useInMemoryFileSystem:!1});a=M(k(o,s))}catch(o){r=o instanceof Error?o.message:String(o)}return{link:w(n),lunoraPackages:e,projectRoot:n,schema:a,schemaError:r,wrangler:t,wranglerPath:i}},E=(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)")},O=n=>{const{cwd:e,json:i,logger:t,out:s}=n,{error:a,manifest:r}=g(e);if(r===void 0)return t.error(a??"could not derive the binding manifest"),{code:1};if(s!==void 0){const o=v(s)?s:$(e,s);return y(p(o),{recursive:!0}),h(o,`${JSON.stringify(r,void 0,2)} `,"utf8"),t.success(`binding manifest written to ${o}`),{code:0}}if(i)return process.stdout.write(`${JSON.stringify(r,void 0,2)} `),{code:0};if(r.bindings.length===0)t.info("No bindings declared.");else{const o=Math.max(...r.bindings.map(c=>c.type.length));t.info(`${String(r.bindings.length)} binding(s):`);for(const c of r.bindings){const f=[c.resource,c.className,c.resourceId].filter(b=>b!==void 0).join(" ");t.info(` ${c.type.padEnd(o)} ${c.binding}${f===""?"":` ${f}`}`)}}return r.crons.length>0&&t.info(`${String(r.crons.length)} cron trigger(s): ${r.crons.join(", ")}`),r.vars.length>0&&t.info(`${String(r.vars.length)} var(s): ${r.vars.join(", ")}`),r.unknown.length>0&&t.warn(`not modelled by the manifest: ${r.unknown.join(", ")} — anything they bind must be provisioned by hand.`),{code:0}},A=n=>{const e=n.cwd??process.cwd();if(n.bindings===!0)return{...O({cwd:e,json:n.json===!0,logger:n.logger,out:n.out}),snapshot:void 0};if(n.out!==void 0)return n.logger.error("--out only applies with --bindings; the full info snapshot prints to stdout under --json."),{code:1,snapshot:void 0};const i=D(e);return n.json?process.stdout.write(`${JSON.stringify(i,void 0,2)} `):E(i,n.logger),{code:0,snapshot:i}},q=F(({cwd:n,logger:e,options:i})=>A({bindings:i.bindings===!0,cwd:n,json:i.json===!0,logger:e,out:i.out}));export{D as collectInfo,q as execute,A as runInfoCommand};