@lunora/cli
Version:
The Lunora CLI: init, dev, deploy, codegen, migrate, seed, doctor, insights, logs, registry, and the rest of the project commands
4 lines (3 loc) • 3.66 kB
JavaScript
import{existsSync as y}from"node:fs";import{mkdtemp as S,writeFile as v,rm as $}from"node:fs/promises";import{tmpdir as j}from"node:os";import{discoverSchema as k,schemaFromIr as C}from"@lunora/codegen";import{seedPlan as x}from"@lunora/seed";import{join as m}from"@visulima/path";import{Project as z}from"ts-morph";import{d as F}from"../packem_shared/admin-token-BKmc3AUm.mjs";import{i as R}from"../packem_shared/command-0l-ZPhIX.mjs";import{d as T}from"../packem_shared/resolve-target-CeiNrCAx.mjs";import{o as A}from"../packem_shared/tui-prompts-BU3irGxV.mjs";import{runResetCommand as I}from"./runResetCommand.mjs";import{S as N}from"../packem_shared/import-C9in1wC3.mjs";const p=e=>e===""?!1:F(e),B=(e,r)=>typeof r=="bigint"?Number(r):r instanceof ArrayBuffer?[...new Uint8Array(r)]:r,c=e=>({code:e,conflicts:0,generated:0,inserted:0,ndjson:""}),P=(e,r)=>{if(!y(r))return e.logger.error(`schema not found: ${r} — run \`vis generate lunora-table --name=<name>\` to create one`),c(1);if(e.reset===!0&&(e.prod===!0||!p(e.url)))return e.logger.error("--reset only clears local .wrangler/state and cannot be combined with --prod or a remote --url"),c(1)},U=async(e,r,o,t)=>{const l=await S(m(j(),"lunora-seed-")),a=m(l,"rows.ndjson");await v(a,e,"utf8");try{const n=await N({batchSize:t.batchSize,cwd:o,fetchImpl:t.fetchImpl,file:a,logger:t.logger,prod:t.prod,token:t.token,url:t.url}),d=n.body?.conflicts??0;return d>0&&t.logger.warn(`${String(d)} row(s) skipped — their _id already exists. Seeding is deterministic; re-run with --reset to wipe local state first, or a different --seed for fresh ids.`),{code:n.code,conflicts:d,generated:r,inserted:n.inserted,ndjson:e}}finally{await $(l,{force:!0,recursive:!0}).catch(()=>{})}},_=(e,r)=>{if(e.table===void 0||r.tables.some(t=>t.name===e.table))return;const o=r.tables.map(t=>t.name).join(", ");return e.logger.error(`unknown table "${e.table}" — schema defines: ${o||"(no tables)"}`),c(1)},H=async(e,r)=>{if(!(!(e.prod===!0||!p(e.url))||e.yes===!0)){if(!process.stdin.isTTY&&e.confirm===void 0)return e.logger.error("seed: refusing to insert into a non-local target without confirmation — re-run with --yes"),c(1);if(!await(e.confirm??A)(`This will insert ${String(r)} generated row(s) into ${e.url??"the production worker"}. Continue?`))return e.logger.info("seed: aborted"),c(1)}},J=async e=>{const r=e.cwd??process.cwd(),o=m(r,"lunora","schema.ts"),t=P(e,o);if(t!==void 0)return t;const l=new z({skipAddingFilesFromTsConfig:!0}),a=k(l,o),n=_(e,a);if(n!==void 0)return n;const d=C(a),g=x(d,{defaultCount:e.count??10,now:e.now,only:e.table===void 0?void 0:[e.table],seed:e.seed??0}),u=[];for(const{rows:f,table:h}of g)for(const b of f)u.push(JSON.stringify({doc:b,table:h},B));const i=u.length>0?`${u.join(`
`)}
`:"",s=u.length;if(e.dryRun===!0)return i.length>0&&process.stdout.write(i),e.logger.info(`generated ${String(s)} row(s) across ${String(g.length)} table(s) — dry run, nothing inserted`),{code:0,conflicts:0,generated:s,inserted:0,ndjson:i};if(e.reset===!0){const f=await I({cwd:r,logger:e.logger,yes:!0});if(f.code!==0)return{code:f.code,conflicts:0,generated:s,inserted:0,ndjson:i}}if(s===0)return e.logger.warn("no rows generated — nothing to insert"),{code:0,conflicts:0,generated:0,inserted:0,ndjson:i};const w=await H(e,s);return w!==void 0?w:U(i,s,r,e)},Z=R(async({cwd:e,logger:r,options:o})=>({code:(await J({batchSize:o.batchSize,count:o.count,cwd:e,dryRun:o.dryRun===!0,logger:r,prod:o.prod===!0,reset:o.reset===!0,now:o.now,seed:o.seed,table:o.table,token:o.token,url:T({cwd:e,prod:o.prod===!0,url:o.url}),yes:o.yes===!0})).code}));export{Z as execute,J as runSeedCommand};