@lunora/cli 1.0.0-alpha.162 → 1.0.0-alpha.164
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 +1 -1
- package/dist/packem_chunks/handler.mjs +1 -1
- package/dist/packem_chunks/handler14.mjs +1 -1
- package/dist/packem_chunks/handler7.mjs +3 -3
- package/dist/packem_chunks/runInitCommand.mjs +1 -1
- package/dist/packem_shared/commands-DB63_8xW.mjs +19 -0
- package/dist/packem_shared/{lint-ignore-report-BR2og7ff.mjs → lint-ignore-report-m43j10IE.mjs} +1 -1
- package/dist/packem_shared/{runAddCommand-D4TymjQc.mjs → runAddCommand-DiEQBX7C.mjs} +1 -1
- package/package.json +8 -8
- package/dist/packem_shared/commands-BJueH6Qo.mjs +0 -19
package/dist/index.mjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{p as o,i as a,u as n}from"./packem_shared/cli-Cu92injU.mjs";import{runCodegenCommand as t}from"./packem_chunks/runCodegenCommand.mjs";import{runDeployCommand as p}from"./packem_chunks/runDeployCommand.mjs";import{planDevCommand as x,runDevCommand as i}from"./packem_chunks/planDevCommand.mjs";import{runInitCommand as C}from"./packem_chunks/runInitCommand.mjs";import{runMigrateGenerateCommand as u}from"./packem_chunks/runMigrateGenerateCommand.mjs";import{runResetCommand as g}from"./packem_chunks/runResetCommand.mjs";import{runRpcCommand as E}from"./packem_chunks/runRpcCommand.mjs";import{insertSchemaExtension as D}from"./packem_shared/insertSchemaExtension-DZReBZ4_.mjs";import{createLogger as A,pail as c}from"./packem_shared/createLogger-BoSxdb2T.mjs";import{diffSnapshots as v,renderAddColumn as _,renderCreateIndex as h,renderCreateTable as y,renderDropIndex as F,renderDropTable as L,renderMigrationFile as O,validatorKindToSqlType as b}from"./packem_shared/diffSnapshots-cgOtkd-G.mjs";import{default as B}from"./packem_shared/schemaIrToSnapshot-DV2DilTz.mjs";import{createRecordingSpawner as U,defaultSpawner as W}from"./packem_shared/createRecordingSpawner-SKs4R1fc.mjs";import{default as N}from"./packem_shared/parseManifest-x3WsxKHz.mjs";import{R as V,S as j}from"./packem_shared/import-C9in1wC3.mjs";import{REQUIRED_COMPATIBILITY_DATE as H,REQUIRED_FLAG as K,validateWranglerProject as Y,validateWranglerConfig as Z}from"@lunora/config/cloudflare";import{buildRegistryIndex as z}from"./packem_shared/buildRegistryIndex-DwySASBu.mjs";import{I as X,F as $,E as rr}from"./packem_shared/commands-
|
|
1
|
+
import{p as o,i as a,u as n}from"./packem_shared/cli-Cu92injU.mjs";import{runCodegenCommand as t}from"./packem_chunks/runCodegenCommand.mjs";import{runDeployCommand as p}from"./packem_chunks/runDeployCommand.mjs";import{planDevCommand as x,runDevCommand as i}from"./packem_chunks/planDevCommand.mjs";import{runInitCommand as C}from"./packem_chunks/runInitCommand.mjs";import{runMigrateGenerateCommand as u}from"./packem_chunks/runMigrateGenerateCommand.mjs";import{runResetCommand as g}from"./packem_chunks/runResetCommand.mjs";import{runRpcCommand as E}from"./packem_chunks/runRpcCommand.mjs";import{insertSchemaExtension as D}from"./packem_shared/insertSchemaExtension-DZReBZ4_.mjs";import{createLogger as A,pail as c}from"./packem_shared/createLogger-BoSxdb2T.mjs";import{diffSnapshots as v,renderAddColumn as _,renderCreateIndex as h,renderCreateTable as y,renderDropIndex as F,renderDropTable as L,renderMigrationFile as O,validatorKindToSqlType as b}from"./packem_shared/diffSnapshots-cgOtkd-G.mjs";import{default as B}from"./packem_shared/schemaIrToSnapshot-DV2DilTz.mjs";import{createRecordingSpawner as U,defaultSpawner as W}from"./packem_shared/createRecordingSpawner-SKs4R1fc.mjs";import{default as N}from"./packem_shared/parseManifest-x3WsxKHz.mjs";import{R as V,S as j}from"./packem_shared/import-C9in1wC3.mjs";import{REQUIRED_COMPATIBILITY_DATE as H,REQUIRED_FLAG as K,validateWranglerProject as Y,validateWranglerConfig as Z}from"@lunora/config/cloudflare";import{buildRegistryIndex as z}from"./packem_shared/buildRegistryIndex-DwySASBu.mjs";import{I as X,F as $,E as rr}from"./packem_shared/commands-DB63_8xW.mjs";import{runExportCommand as or}from"./packem_shared/runExportCommand-BpE4AbuX.mjs";export{o as COMMANDS,V as DEFAULT_IMPORT_BATCH_SIZE,H as REQUIRED_COMPATIBILITY_DATE,K as REQUIRED_FLAG,a as VERSION,z as buildRegistryIndex,A as createLogger,U as createRecordingSpawner,W as defaultSpawner,v as diffSnapshots,D as insertSchemaExtension,c as pail,N as parseManifest,x as planDevCommand,_ as renderAddColumn,h as renderCreateIndex,y as renderCreateTable,F as renderDropIndex,L as renderDropTable,O as renderMigrationFile,X as runAddCommand,$ as runBuildIndexCommand,n as runCli,t as runCodegenCommand,p as runDeployCommand,i as runDevCommand,or as runExportCommand,j as runImportCommand,C as runInitCommand,u as runMigrateGenerateCommand,rr as runRegistryViewCommand,g as runResetCommand,E as runRpcCommand,B as schemaIrToSnapshot,Y as validateWrangler,Z as validateWranglerConfig,b as validatorKindToSqlType};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{existsSync as b,readFileSync as k}from"node:fs";import{applyLintIgnores as $,detectLintTools as S}from"@lunora/config";import{findWranglerFile as T}from"@lunora/config/cloudflare";import{join as g,basename as h}from"@visulima/path";import{i as j}from"../packem_shared/command-0l-ZPhIX.mjs";import{d as L,r as U,l as x,i as R,o as m,u as B,a as f,b as D,c as F,e as p,f as M,n as N,g as c,h as W,j as q,s as u,k as A,m as C,p as I,q as O,t as J}from"../packem_shared/lint-ignore-report-
|
|
1
|
+
import{existsSync as b,readFileSync as k}from"node:fs";import{applyLintIgnores as $,detectLintTools as S}from"@lunora/config";import{findWranglerFile as T}from"@lunora/config/cloudflare";import{join as g,basename as h}from"@visulima/path";import{i as j}from"../packem_shared/command-0l-ZPhIX.mjs";import{d as L,r as U,l as x,i as R,o as m,u as B,a as f,b as D,c as F,e as p,f as M,n as N,g as c,h as W,j as q,s as u,k as A,m as C,p as I,q as O,t as J}from"../packem_shared/lint-ignore-report-m43j10IE.mjs";import{i as K,t as P,d as Q,s as X}from"../packem_shared/output-format-Cv3aLqhP.mjs";import{v as w,B as Y}from"../packem_shared/tui-prompts-BU3irGxV.mjs";import{I as Z}from"../packem_shared/commands-DB63_8xW.mjs";const z=r=>{const e=r.trim().toLowerCase();return C.find(a=>a.value===e||a.label.toLowerCase()===e||e==="auth0"&&a.value==="auth-auth0"||e==="clerk"&&a.value==="auth-clerk")?.value},v=r=>{try{const e=JSON.parse(k(g(r,"package.json"),"utf8"));return{...e.dependencies,...e.devDependencies}}catch{return{}}},E=async r=>{const e=r.cwd??process.cwd(),a=q(v(e));return a!==void 0?a:r.yes===!0?(r.logger.warn(`add: couldn't detect your framework — using "${u}". Pass a specific item (e.g. \`lunora add auth-ui-vue\`) to override.`),u):await(r.promptSelect??((o,t,d)=>w(o,t,d)))("Which framework is your app?",A,{default:u})??u},G=async r=>{if(r.provider!==void 0&&r.provider!==""){const a=z(r.provider);return a===void 0?(r.logger.warn(`add: unknown --provider "${r.provider}" — using "${c}" (email & password).`),c):a}if(r.yes===!0)return c;const e=r.promptSelect??((a,o,t)=>w(a,o,t));return W(e)},l=r=>r.promptText??((e,a)=>Y(e,a)),H=async r=>{const e=h(r.cwd??process.cwd());if(r.bucket!==void 0&&r.bucket!==""){const a=R(r.bucket);if(a!==void 0)return a;const o=m(e);return r.logger.warn(`add: "${r.bucket}" isn't a valid R2 bucket name (lowercase alphanumeric + hyphens, 3–63 chars) — using "${o}".`),o}return r.yes===!0?m(e):B(l(r),e)},V=async r=>{const e=a=>{r.logger.warn(`add: ${a}`)};if(r.mailTo!==void 0&&r.mailTo!=="")return f(r.mailTo,e);if(r.yes!==!0)return f(await l(r)(D,{placeholder:"you@yourdomain.com"}),e)},_=async r=>{const e=h(r.cwd??process.cwd());if(r.db!==void 0&&r.db!==""){const a=F(r.db);if(a!==void 0)return a;const o=p(e);return r.logger.warn(`add: "${r.db}" isn't a usable D1 database name — using "${o}".`),o}return r.yes===!0?p(e):M(l(r),e)},rr=async(r,e)=>r.kind==="auth"?[await G(e)]:r.kind==="auth-ui"?[await E(e)]:r.kind==="email"?[x]:[r.item],er=(r,e)=>{N($(r,S(r)),e)},ar=async r=>{const e=r.cwd??process.cwd(),a=r.feature===void 0?void 0:L(r.feature);if(a===void 0)return r.logger.error("add requires a feature or registry item. Usage: lunora add <auth|email|storage|crons|presence|…>"),{code:1,items:[]};if(!b(g(e,"lunora"))||T(e)===void 0)return r.logger.error("add: not a Lunora project here (need a lunora/ directory and a wrangler.jsonc). Run `lunora init` first."),{code:1,items:[]};if(a.kind==="auth-ui"&&U(v(e)))return r.logger.error("add: auth-ui has no React Native port — the screens render DOM elements and a stylesheet, which Metro has nothing to mount. Build the screens with React Native primitives against the same better-auth client (`@lunora/react-native/auth`); `lunora add auth` still installs the server half."),{code:1,items:[]};const o=await rr(a,r),t=[];if(o.includes("storage")){const s=await H(r);t.push(i=>I(i,s))}if(o.includes("mail")){const s=await V(r);s!==void 0&&t.push(i=>O(i,s))}if(o.some(s=>s==="auth"||s.startsWith("auth-"))){const s=await _(r);t.push(i=>J(i,s))}const d=t.length>0?s=>{let i=s;for(const y of t)i=y(i);return i}:void 0,n=await Z({allowUnsafeSource:r.allowUnsafeSource,cwd:e,from:r.from,logger:r.logger,names:[...o],ref:r.ref,source:r.source,transformManifest:d,yes:!0});return n.code===0&&er(e,r.logger),{code:n.code,items:o}},mr=j(async({argument:r,cwd:e,logger:a,options:o})=>{const t=K("add",o.format);if(t!==void 0)return a.error(t),{code:1};const d=X(o.format,a),n=await ar({allowUnsafeSource:o.allowUnsafeSource===!0,bucket:o.bucket,cwd:e,db:o.db,feature:r[0],from:o.from,logger:d,mailTo:o.mailTo,provider:o.provider,ref:o.ref,source:o.source,yes:o.yes===!0});return P(o.format)&&Q({code:n.code,items:n.items}),{code:n.code}});export{mr as execute,ar as runAddFeature};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{i as n}from"../packem_shared/command-0l-ZPhIX.mjs";import{I as c,E as f,F as a}from"../packem_shared/commands-
|
|
1
|
+
import{i as n}from"../packem_shared/command-0l-ZPhIX.mjs";import{I as c,E as f,F as a}from"../packem_shared/commands-DB63_8xW.mjs";const i=n(({argument:u,cwd:s,logger:o,options:e})=>{const r=u[0],t=u.slice(1);return r==="add"?c({allowUnsafeSource:e.allowUnsafeSource===!0,cwd:s,diff:e.diff===!0,dryRun:e.dryRun===!0,from:e.from,json:e.json===!0,logger:o,names:t,overwrite:e.overwrite===!0,ref:e.ref,source:e.source,yes:e.yes===!0}):r==="list"?c({cwd:s,from:e.from,json:e.json===!0,list:!0,logger:o,names:[],ref:e.ref,source:e.source}):r==="view"?f({allowUnsafeSource:e.allowUnsafeSource===!0,cwd:s,from:e.from,logger:o,names:t,ref:e.ref,source:e.source}):r==="build"?a({check:e.check===!0,from:e.from,logger:o,out:e.out}):(o.error("registry: unknown subcommand. Usage: lunora registry <add|list|view|build> [names…]"),{code:1})});export{i as execute};
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import{
|
|
2
|
-
`),{code:0,descriptors:[]}):(t.error(`env: ${r.key} is not set in ${
|
|
3
|
-
`);return{code:0,descriptors:[]}},oe=async e=>{const s=e.cwd??process.cwd(),t={cwd:s,devVariablesPath:S(s,
|
|
1
|
+
import{existsSync as h,readFileSync as E}from"node:fs";import{join as S}from"node:path";import{DEV_VARS_FILE as l,DEV_VARS_KEY_PATTERN as $,writeDevVariablesFileAtomically as k,upsertDevVariableLine as A,isPlaceholderValue as P,resolveDeployDriver as D,resolveProjectTarget as K,generateSecretValue as R,DEV_VARS_EXAMPLE_FILE as v,parseDevVariableEntries as _,escapeRegExp as U,packageNamesFromBindings as Y,inferLunoraBindings as j,requiredSecrets as Z,isMintableSecretKey as V}from"@lunora/config";import{i as q}from"../packem_shared/command-0l-ZPhIX.mjs";import{l as C,M as F}from"../packem_shared/detect-package-manager-DXDstphE.mjs";import{defaultSpawner as M}from"../packem_shared/createRecordingSpawner-SKs4R1fc.mjs";import{f as B}from"../packem_shared/wrangler-secrets-D0Tv5GWn.mjs";const I=/[\r\n]/u,N=/["\\]/u,x=e=>new Map(_(e).map(s=>[s.key,s])),g=e=>h(e)?E(e,"utf8"):"",T=(e,s)=>e.replaceAll(new RegExp(String.raw`^[ \t]*${U(s)}[ \t]*=.*(?:\r?\n|$)`,"gmu"),""),L=e=>e.length<=4?"****":`${e.slice(0,4)}${"*".repeat(Math.min(8,e.length-4))}`,f=e=>x(g(e)),z=e=>e.env??(e.prod===!0?"production":void 0),X=e=>{const s=f(e.devVariablesPath);if(s.size===0)return e.logger.info(`${l}: (empty)`),{code:0,descriptors:[]};for(const t of s.values())e.logger.info(`${t.key}=${L(t.value)}`);return{code:0,descriptors:[]}},G=e=>{const{devVariablesPath:s,logger:t,options:r}=e;if(!r.key)return t.error("env get requires a key. Usage: lunora env get <KEY>"),{code:1,descriptors:[]};const o=f(s).get(r.key);return o?(process.stdout.write(`${o.value}
|
|
2
|
+
`),{code:0,descriptors:[]}):(t.error(`env: ${r.key} is not set in ${l}`),{code:1,descriptors:[]})},H=e=>{const{devVariablesPath:s,logger:t,options:r}=e;if(!r.key)return t.error("env set requires a key. Usage: lunora env set <KEY> <VALUE>"),{code:1,descriptors:[]};if(!$.test(r.key))return t.error(`env: invalid key "${r.key}" — must match [A-Za-z_][A-Za-z0-9_]*`),{code:1,descriptors:[]};if(r.value===void 0)return t.error("env set requires a value. Usage: lunora env set <KEY> <VALUE>"),{code:1,descriptors:[]};if(I.test(r.value))return t.error(`env: value for "${r.key}" contains a newline, which .dev.vars cannot represent`),{code:1,descriptors:[]};if(N.test(r.value))return t.error(`env: value for "${r.key}" contains a double-quote or backslash, which .dev.vars cannot round-trip`),{code:1,descriptors:[]};const o=g(s);return k(s,A(o,r.key,r.value)),t.success(`env: set ${r.key} (${L(r.value)}) in ${l}`),{code:0,descriptors:[]}},J=e=>{const{devVariablesPath:s,logger:t,options:r}=e;if(!r.key)return t.error("env unset requires a key. Usage: lunora env unset <KEY>"),{code:1,descriptors:[]};if(!$.test(r.key))return t.error(`env: invalid key "${r.key}" — must match [A-Za-z_][A-Za-z0-9_]*`),{code:1,descriptors:[]};const o=g(s);return x(o).has(r.key)?(k(s,T(o,r.key)),t.success(`env: unset ${r.key} in ${l}`),{code:0,descriptors:[]}):(t.warn(`env: ${r.key} was not set in ${l}`),{code:0,descriptors:[]})},Q=async e=>{const{devVariablesPath:s,logger:t,options:r}=e;if(!r.yes)return t.error("env push uploads secrets to Cloudflare. Re-run with --yes to confirm."),{code:1,descriptors:[]};const o=f(s);if(o.size===0)return t.warn(`${l}: nothing to push (empty)`),{code:0,descriptors:[]};const c=[...o.values()].filter(n=>P(n.value)).map(n=>n.key);if(c.length>0)return t.error(`env push: refusing to upload placeholder value(s) for ${c.join(", ")} — run \`lunora env doctor\` to review, and \`lunora env generate --set\` (or \`lunora env set <KEY> <VALUE>\`) to fill them, then re-run.`),{code:1,descriptors:[]};const i=r.spawner??M,d=r.cwd??process.cwd(),p=C(d),a=[],u=z(r);for(const n of o.values()){const m=D(K(d)).toolchain?.secretPut({environment:u,key:n.key,temporary:r.temporary});if(m===void 0)return t.error("deploy target has no command-line toolchain; cannot push secrets"),{code:1,descriptors:[]};const w=F(p,m.tool,m.args),b={args:w.args,command:w.command,cwd:d,input:n.value};a.push(b),t.info(`pushing ${n.key} -> wrangler secret${u===void 0?"":` (${u})`}`);const y=await i(b);if(y.code!==0)return t.error(`env push: failed at ${n.key} (exit ${String(y.code)})`),{code:y.code,descriptors:a}}return t.success(`env: pushed ${String(o.size)} secret(s)`),{code:0,descriptors:a}},W=e=>(e.options.secretLister??B)({cwd:e.cwd,env:z(e.options),temporary:e.options.temporary}),O=async e=>{const{devVariablesPath:s,logger:t}=e,r=await W(e);if(!r.ok)return t.error(`env diff: ${r.error??"failed to list remote secrets"}`),{code:1,descriptors:[]};const o=new Set(f(s).keys()),c=new Set(r.names),i=[...o].filter(a=>!c.has(a)).toSorted((a,u)=>a.localeCompare(u)),d=r.names.filter(a=>!o.has(a)),p=[...o].filter(a=>c.has(a)).toSorted((a,u)=>a.localeCompare(u));for(const a of i)t.info(`local only (run \`lunora env push\`): ${a}`);for(const a of d)t.info(`remote only (in Cloudflare, not ${l}): ${a}`);return t.info(`in both: ${String(p.length)} secret(s)`),i.length===0&&d.length===0&&t.success("env diff: local and remote secret names match"),{code:0,descriptors:[]}},ee=e=>{const{cwd:s,devVariablesPath:t,logger:r}=e,o=S(s,v);if(!h(o))return r.info(`env doctor: no ${v} to check against — nothing to validate.`),{code:0,descriptors:[]};const c=_(E(o,"utf8")).map(n=>n.key),i=f(t);if(!h(t))return r.error(`env doctor: ${l} is missing. Run \`lunora dev\` to scaffold it, or \`lunora env set <KEY> <VALUE>\`.`),r.info(`expected (from ${v}): ${c.join(", ")}`),{code:1,descriptors:[]};const d=c.filter(n=>!i.has(n)),p=[...i.values()].filter(n=>P(n.value)).map(n=>n.key),a=new Set(c),u=[...i.keys()].filter(n=>!a.has(n));for(const n of d)r.error(`missing: ${n} is in ${v} but not ${l}`);for(const n of p)r.error(`unset: ${n} still has a placeholder value`);for(const n of u)r.info(`extra: ${n} is set locally but not listed in ${v}`);return d.length===0&&p.length===0?(r.success(`env doctor: ${l} looks good (${String(i.size)} var(s)).`),{code:0,descriptors:[]}):{code:1,descriptors:[]}},re=async e=>{let s=[];try{s=Y(await j({projectRoot:e.cwd}))}catch{}const t=Z(s).map(o=>o.key).filter(o=>V(o)),r=[...f(e.devVariablesPath).keys()].filter(o=>V(o));return[...new Set([...t,...r])]},te=async e=>{const{devVariablesPath:s,logger:t,options:r}=e;let o;if(r.key===void 0){if(o=await re(e),o.length===0)return t.info("env generate: no locally-generatable secrets for this project. Name one explicitly: lunora env generate <KEY>"),{code:0,descriptors:[]}}else{if(!$.test(r.key))return t.error(`env: invalid key "${r.key}" — must match [A-Za-z_][A-Za-z0-9_]*`),{code:1,descriptors:[]};o=[r.key]}const c=o.map(i=>({key:i,value:R()}));if(r.set===!0){let i=g(s);for(const d of c)i=A(i,d.key,d.value);return k(s,i),t.success(`env: generated ${String(c.length)} secret(s) into ${l}: ${c.map(d=>d.key).join(", ")}`),{code:0,descriptors:[]}}for(const i of c)process.stdout.write(`${i.key}=${i.value}
|
|
3
|
+
`);return{code:0,descriptors:[]}},oe=async e=>{const s=e.cwd??process.cwd(),t={cwd:s,devVariablesPath:S(s,l),logger:e.logger,options:e};switch(e.subcommand){case"diff":return O(t);case"doctor":return ee(t);case"generate":return te(t);case"get":return G(t);case"list":return X(t);case"push":return Q(t);case"set":return H(t);case"unset":return J(t);default:return e.logger.error(`env: unknown subcommand "${e.subcommand}"`),{code:1,descriptors:[]}}},se=new Set(["diff","doctor","generate","get","list","push","set","unset"]),ne=e=>typeof e=="string"&&se.has(e),fe=q(({argument:e,cwd:s,logger:t,options:r})=>{const o=e[0];return ne(o)?oe({cwd:s,env:r.env,key:e[1],logger:t,prod:r.prod===!0,set:r.set===!0,subcommand:o,temporary:r.temporary===!0,value:e[2],yes:r.yes===!0}):(t.error(`env: unknown subcommand "${o??""}" — expected list | get | set | unset | push | diff | doctor | generate`),{code:1})});export{fe as execute,oe as runEnvCommand};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{existsSync as h,mkdirSync as L,writeFileSync as g,readFileSync as b,readdirSync as re,rmSync as R,mkdtempSync as oe,lstatSync as Te,cpSync as J,renameSync as je}from"node:fs";import{tmpdir as ie}from"node:os";import{detectFramework as Oe,isInteractive as v,LUNA_ART as Be,LUNA_NAME as Pe,LUNA_SIGNOFF as Ee,paintAnswer as De,BADGES as m,detectLintTools as Ve,applyLintIgnores as ze}from"@lunora/config";import{walkSync as Ue}from"@visulima/fs";import{join as p,dirname as S,basename as A,resolve as se,relative as He}from"@visulima/path";import{downloadTemplate as ne}from"giget";import{modify as qe,applyEdits as We}from"jsonc-parser";import{join as D,dirname as Fe}from"node:path";import{p as le,M as Ke,l as V,g as Je,P as Ge,k as Qe}from"../packem_shared/detect-package-manager-DXDstphE.mjs";import{i as Ye}from"../packem_shared/command-0l-ZPhIX.mjs";import Xe from"magic-string";import{Project as Ze,SyntaxKind as f}from"ts-morph";import{P as z}from"../packem_shared/prompt-cancelled-C8Sj7OqI.mjs";import{P as ce,g as de,b as et,O as pe}from"../packem_shared/resolve-BZp6jitE.mjs";import{defaultSpawner as ue}from"../packem_shared/createRecordingSpawner-SKs4R1fc.mjs";import{_ as tt,R as at,D as rt,B as he,M as ot,o as me,F as ge,v as U,V as it,H as st,q as ve,C as fe,J as nt}from"../packem_shared/tui-prompts-BU3irGxV.mjs";import{l as we,u as lt,p as ct,b as dt,a as pt,q as ut,h as ht,f as ye,t as be,n as mt,j as gt}from"../packem_shared/lint-ignore-report-
|
|
1
|
+
import{existsSync as h,mkdirSync as L,writeFileSync as g,readFileSync as b,readdirSync as re,rmSync as R,mkdtempSync as oe,lstatSync as Te,cpSync as J,renameSync as je}from"node:fs";import{tmpdir as ie}from"node:os";import{detectFramework as Oe,isInteractive as v,LUNA_ART as Be,LUNA_NAME as Pe,LUNA_SIGNOFF as Ee,paintAnswer as De,BADGES as m,detectLintTools as Ve,applyLintIgnores as ze}from"@lunora/config";import{walkSync as Ue}from"@visulima/fs";import{join as p,dirname as S,basename as A,resolve as se,relative as He}from"@visulima/path";import{downloadTemplate as ne}from"giget";import{modify as qe,applyEdits as We}from"jsonc-parser";import{join as D,dirname as Fe}from"node:path";import{p as le,M as Ke,l as V,g as Je,P as Ge,k as Qe}from"../packem_shared/detect-package-manager-DXDstphE.mjs";import{i as Ye}from"../packem_shared/command-0l-ZPhIX.mjs";import Xe from"magic-string";import{Project as Ze,SyntaxKind as f}from"ts-morph";import{P as z}from"../packem_shared/prompt-cancelled-C8Sj7OqI.mjs";import{P as ce,g as de,b as et,O as pe}from"../packem_shared/resolve-BZp6jitE.mjs";import{defaultSpawner as ue}from"../packem_shared/createRecordingSpawner-SKs4R1fc.mjs";import{_ as tt,R as at,D as rt,B as he,M as ot,o as me,F as ge,v as U,V as it,H as st,q as ve,C as fe,J as nt}from"../packem_shared/tui-prompts-BU3irGxV.mjs";import{l as we,u as lt,p as ct,b as dt,a as pt,q as ut,h as ht,f as ye,t as be,n as mt,j as gt}from"../packem_shared/lint-ignore-report-m43j10IE.mjs";import{logStep as G}from"../packem_shared/createLogger-BoSxdb2T.mjs";import vt from"node:dns/promises";import{I as ft}from"../packem_shared/commands-DB63_8xW.mjs";const H={bun:{githubCacheKey:void 0,githubSetupStep:` - uses: oven-sh/setup-bun@v2
|
|
2
2
|
`,gitlabImage:"oven/bun:1",gitlabProvisionScript:[],installCmd:"bun install --frozen-lockfile",lockfile:"bun.lockb"},npm:{githubCacheKey:"npm",githubSetupStep:"",gitlabImage:"node:22",gitlabProvisionScript:[],installCmd:"npm ci",lockfile:"package-lock.json"},pnpm:{githubCacheKey:"pnpm",githubSetupStep:` - uses: pnpm/action-setup@v4
|
|
3
3
|
`,gitlabImage:"node:22",gitlabProvisionScript:["corepack enable"],installCmd:"pnpm install --frozen-lockfile",lockfile:"pnpm-lock.yaml"},yarn:{githubCacheKey:"yarn",githubSetupStep:"",gitlabImage:"node:22",gitlabProvisionScript:["corepack enable"],installCmd:"yarn install --frozen-lockfile",lockfile:"yarn.lock"}},$=(e,t)=>{const a=Ke(e,"lunora",t);return[a.command,...a.args].join(" ")},Q=e=>` - uses: actions/checkout@v4
|
|
4
4
|
${e.githubSetupStep} - uses: actions/setup-node@v4
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import{existsSync as g,readFileSync as m,writeFileSync as h,mkdirSync as j}from"node:fs";import{join as l,relative as q,dirname as w}from"@visulima/path";import{p as z,l as U}from"./detect-package-manager-DXDstphE.mjs";import{DEV_VARS_FILE as C,parseDevVariableEntries as Y,writeDevVariablesFileAtomically as B}from"@lunora/config";import{modify as V,applyEdits as T,parse as H}from"jsonc-parser";import{O as G,a as S,k as Q,_ as K,R as X,A as Z}from"./resolve-BZp6jitE.mjs";import{o as ee}from"./tui-prompts-BU3irGxV.mjs";import{collectCatalog as ne,buildRegistryIndex as te}from"./buildRegistryIndex-DwySASBu.mjs";import{findWranglerFile as re,readWranglerJsonc as se}from"@lunora/config/cloudflare";import{LunoraError as x}from"@lunora/errors";import{insertSchemaExtension as oe}from"./insertSchemaExtension-DZReBZ4_.mjs";import{createHash as ie}from"node:crypto";const F=e=>{if(!e.startsWith("workspace:"))return e;const n=e.slice(10);return n===""||n==="*"||n==="^"||n==="~"?G():n},ae=new Set(["@lunora/client","@lunora/do","@lunora/ratelimit","@lunora/runtime","@lunora/server","@lunora/values"]),ce=/(['"])@lunora\/(client|do|ratelimit|runtime|server|values)(\/[^'"]*)?\1/gu,de=e=>{const n=l(e,"package.json");if(!g(n))return!1;try{const t=JSON.parse(m(n,"utf8"));return t.dependencies?.lunorash!==void 0||t.devDependencies?.lunorash!==void 0}catch{return!1}},fe=e=>e.replaceAll(ce,(n,t,s,r)=>`${t}lunorash/${s}${r??""}${t}`),O=(e,n,t,s="dependencies",r=!1)=>{const o=Object.entries(e);if(o.length===0)return[];const i=l(n,"package.json");if(!g(i))return t.warn(`package.json not found at ${i} — skipping dependency updates`),[];let a=m(i,"utf8");const c=JSON.parse(a),d=[];for(const[f,u]of o){if(r&&ae.has(f)){t.info(`dep provided by the lunorash umbrella, skipping: ${f}`);continue}if(c.dependencies?.[f]!==void 0||c.devDependencies?.[f]!==void 0){t.info(`dep already present: ${f}`);continue}const p=V(a,[s,f],F(u),{formattingOptions:{insertSpaces:!0,tabSize:4}});a=T(a,p),d.push(f)}return d.length>0&&(h(i,a,"utf8"),t.success(`added ${String(d.length)} ${s==="devDependencies"?"devDependency(ies)":"dependency(ies)"} to package.json: ${d.join(", ")}`)),d},ue=(e,n,t)=>{if(e.length===0)return[];const s=l(n,C),r=g(s)?m(s,"utf8"):"",o=new Set(Y(r).map(d=>d.key)),i=[],a=[],c=[];for(const d of e)d.secret&&a.push(d.name),!o.has(d.name)&&(d.description&&c.push(`# ${d.description}`),c.push(`${d.name}=${d.secret?"":d.value??""}`),i.push(d.name));if(i.length>0){const d=r===""||r.endsWith(`
|
|
2
|
+
`)?r:`${r}
|
|
3
|
+
`;B(s,`${d}${c.join(`
|
|
4
|
+
`)}
|
|
5
|
+
`),t.success(`scaffolded ${String(i.length)} env var(s) into .dev.vars: ${i.join(", ")}`)}return a.length>0&&t.info(`set secret value(s) locally in .dev.vars, then for production: ${a.map(d=>`wrangler secret put ${d}`).join("; ")}`),i},N=new Set(["ai","analytics_engine_datasets","browser","d1_databases","durable_objects","hyperdrive","kv_namespaces","mtls_certificates","queues","r2_buckets","send_email","services","vars","vectorize","version_metadata","workflows"]),le=["binding","name","queue","pattern"],J=e=>{if(!(typeof e!="object"||e===null))for(const n of le){const t=e[n];if(typeof t=="string"&&t.length>0)return`${n}:${t}`}},pe=(e,n,t,s)=>{const r=new Set(e.map(a=>JSON.stringify(a))),o=new Set(e.map(a=>J(a)).filter(a=>a!==void 0)),i=[];for(const a of n){if(r.has(JSON.stringify(a)))continue;const c=J(a);if(c!==void 0&&o.has(c)){s.warn(`${c.replace(":"," ")} already exists in ${t} — keeping the project's entry and skipping the registry item's. Reconcile by hand if the item needs different settings.`);continue}c!==void 0&&o.add(c),i.push(a)}return i},D=e=>Array.isArray(e),ge=(e,n)=>{let t=H(e);for(const s of n){if(typeof t!="object"||t===null)return;t=t[s]}return t},me=(e,n)=>{const t=e[0];return t!==void 0&&N.has(t)?!0:(n.warn(`skipping binding "${e.join(".")}" — only resource bindings (${[...N].join(", ")}) may be written, not exec/entrypoint keys`),!1)},I=Symbol("skip-binding"),$e=(e,n,t)=>{const{value:s}=n;if(!D(s))return s;const r=ge(e,n.path);if(!D(r))return s;const o=pe(r,s,n.path.join("."),t);return o.length===0?I:[...r,...o]},he=(e,n,t)=>{if(e.length===0)return[];const s=["wrangler.jsonc","wrangler.json"].map(i=>l(n,i)).find(i=>g(i));if(!s)return t.warn("wrangler.jsonc not found — skipping binding updates"),[];let r=m(s,"utf8");const o=[];for(const i of e){if(!me(i.path,t))continue;const a=$e(r,i,t);if(a===I)continue;const c=V(r,[...i.path],a,{formattingOptions:{insertSpaces:!0,tabSize:4}});c.length!==0&&(r=T(r,c),o.push(i.path.join(".")))}return o.length>0&&(h(s,r,"utf8"),t.success(`applied ${String(o.length)} binding(s) to ${s}: ${o.join(", ")}`)),o},ye=(e,n,t,s=!1)=>{const r=[],o=[];return e.deps&&r.push(...O(e.deps,n,t,"dependencies",s)),e.devDependencies&&r.push(...O(e.devDependencies,n,t,"devDependencies",s)),e.bindings&&o.push(...he(e.bindings,n,t)),e.envVars&&ue(e.envVars,n,t),{bindings:o,deps:r}},ve=async(e,n)=>{const t=e.some(({manifest:c})=>Object.keys(c.deps??{}).length>0||Object.keys(c.devDependencies??{}).length>0),s=e.some(({manifest:c})=>(c.bindings??[]).length>0),r=n.source!==void 0&&n.source.length>0;if(!t&&!s&&!r||n.yes)return!0;const o=[];t&&o.push("add dependencies to package.json"),s&&o.push("write wrangler.jsonc bindings"),r&&o.push(`come from a non-default source (${String(n.source)})`);const i=o.join(", ");if(!process.stdin.isTTY&&n.confirm===void 0)return n.logger.error(`add: stdin is not a TTY and the requested items ${i} — re-run with --yes to confirm`),!1;const a=await(n.confirm??ee)(`The requested items ${i}. Continue?`);return a||n.logger.info("add: aborted"),a},b=1,we=".lunora-registry.json",L=e=>l(e,"lunora",we),ke=e=>typeof e!="object"||e===null||!("items"in e)?!1:typeof e.items=="object"&&e.items!==null,v=e=>ie("sha256").update(e).digest("hex"),be=e=>{const n=L(e);if(!g(n))return{items:{},version:b};try{const t=JSON.parse(m(n,"utf8"));if(ke(t))return{items:t.items,version:b}}catch{}return{items:{},version:b}},je=(e,n)=>{h(L(e),`${JSON.stringify(n,void 0,2)}
|
|
6
|
+
`,"utf8")},R=(e,n,t,s)=>{const r=e.items[n]??{files:{}};e.items[n]=r,r.files[t]=v(s)},Se=(e,n,t)=>e.items[n]?.files[t],E=e=>e===""?[]:e.split(`
|
|
7
|
+
`),xe=(e,n)=>{const t=E(e),s=E(n);let r=0;for(;r<t.length&&r<s.length&&t[r]===s[r];)r+=1;let o=t.length,i=s.length;for(;o>r&&i>r&&t[o-1]===s[i-1];)o-=1,i-=1;if(r===o&&r===i)return[];const a=[];for(let c=Math.max(0,r-3);c<r;c+=1)a.push(` ${t[c]??""}`);for(let c=r;c<o;c+=1)a.push(`- ${t[c]??""}`);for(let c=r;c<i;c+=1)a.push(`+ ${s[c]??""}`);for(let c=i;c<Math.min(s.length,i+3);c+=1)a.push(` ${s[c]??""}`);return a},Oe=/\.[cm]?[jt]sx?$/u,M=(e,n,t)=>{const s=m(l(e,n.from),"utf8");return t&&Oe.test(n.to)?fe(s):s},Ne=(e,n,t,s,r,o,i)=>{const a=l(s,"lunora","schema.ts");if(o)return r.info(`~ would merge .extend(${n}.extension) into lunora/schema.ts (and create ${e.to} if absent)`),{kind:"skipped",path:a};const c=l(s,e.to);g(c)||(j(w(c),{recursive:!0}),h(c,M(t,e,i),"utf8"));const d=i?"lunorash/server":"@lunora/server",f=g(a)?m(a,"utf8"):`import { defineSchema } from "${d}";
|
|
8
|
+
|
|
9
|
+
export const schema = defineSchema({});
|
|
10
|
+
`,u=oe(f,n);if(u.ok)return j(w(a),{recursive:!0}),h(a,u.text,"utf8"),r.success(`merged .extend(${n}.extension) into lunora/schema.ts`),{kind:"written",path:a};if(u.reason==="already-applied")return r.warn(`lunora/schema.ts already extends "${n}" — skipping`),{kind:"skipped",path:a};throw u.reason==="invalid-identifier"?new x("INTERNAL",`schema-extension item "${n}" is not a valid JS identifier — it is spliced into lunora/schema.ts as \`import { ${n} }\` / \`.extend(${n}.extension)\`. Rename the item to a valid identifier (no leading digit, no "-").`):new x("INTERNAL",`schema-extension merge failed for "${n}": ${u.reason}`)},Je=(e,n,t,s,r)=>{const o=xe(n,t);if(o.length===0){r.info(`= ${e.to} (unchanged)`);return}r.info(`${s?"~":"+"} ${e.to}`);for(const i of o)r.info(` ${i}`)},De=(e,n,t,s,r,o,i,a)=>{const c=l(s,e.to),d=M(t,e,a),f=g(c),u=f?m(c,"utf8"):"",p=P=>(j(w(c),{recursive:!0}),h(c,d,"utf8"),R(o,n,e.to,d),r.success(`${P}: ${e.to}`),{kind:"written",path:c});if(i.diff)return Je(e,u,d,f,r),{kind:"skipped",path:c};if(!f)return p("write");const $=v(u);if($===v(d))return R(o,n,e.to,d),r.warn(`skip (exists): ${e.to}`),{kind:"skipped",path:c};if(i.overwrite)return p("overwrite");const y=Se(o,n,e.to);return y===void 0?(r.warn(`skip (exists, untracked): ${e.to} — refusing to overwrite a file lunora didn't add (use --overwrite to force)`),{kind:"skipped",path:c}):y===$?p("update"):y===v(d)?(r.warn(`skip (locally edited): ${e.to}`),{kind:"skipped",path:c}):(h(`${c}.new`,d,"utf8"),r.warn(`conflict: ${e.to} has local edits and an upstream update — wrote ${e.to}.new (use --overwrite to take theirs)`),{kind:"skipped",path:c})},Re=(e,n,t,s,r,o,i={},a=!1)=>e.merge==="schema-extension"?Ne(e,n,t,s,r,i.diff===!0,a):De(e,n,t,s,r,o,i,a),A=["src/server.ts","src/server/index.ts","src/server/index.tsx","src/index.ts","src/worker.ts"],Ee=e=>{const n=re(e);if(n===void 0)return;const{parsed:t}=se(n);return typeof t?.main=="string"?t.main:void 0},Ae=e=>{const n=Ee(e),t=n===void 0?A:[n,...A];for(const s of t){const r=l(e,s);if(!g(r))continue;const o=m(r,"utf8");if(!o.includes("createShardDO(")){if(s===n)break;continue}return{entryPath:r,main:s,source:o}}},_e=(e,n,t)=>{const s=q(w(e),l(n,"lunora",t)).replaceAll("\\","/");return s.startsWith(".")?s:`./${s}`},qe=(e,n)=>{for(const t of e){const s=`Add \`export * from "${`./lunora/${t.module}.js`}"\` to your worker entry`,r=t.comment?` (${t.comment})`:"";n.warn(`${s}${r}`)}return 0},Ve=(e,n,t,s)=>{const r=[];for(const o of e){const i=_e(n,t,o.module),a=i.replaceAll(/[.*+?^${}()|[\]\\]/g,String.raw`\$&`);new RegExp(String.raw`export\s+\*\s+from\s+["']${a}\.js["']`,"u").test(s)||(o.comment&&r.push(`
|
|
11
|
+
// ${o.comment}`),r.push(`export * from "${i}.js";`))}return r},Te=(e,n,t,s)=>{if(e.length===0)return 0;const r=Ae(n);if(r===void 0)return qe(e,t);const o=Ve(e,r.entryPath,n,r.source);if(o.length===0)return 0;if(s){for(const a of o)a!==""&&t.info(`~ entrypoint: ${a}`);return o.length}const i=r.source.endsWith(`
|
|
12
|
+
`)?"":`
|
|
13
|
+
`;return h(r.entryPath,`${r.source}${i}${o.join(`
|
|
14
|
+
`)}
|
|
15
|
+
`,"utf8"),t.success(`wrote ${String(o.length)} entrypoint re-export(s) to ${q(n,r.entryPath)}`),o.length},_=(e,n,t,s={})=>{const r=[],o=[],i=[],a=[],c=be(n),d=de(n);for(const{directory:f,manifest:u}of e){for(const $ of u.files){const y=Re($,u.name,f,n,t,c,s,d);(y.kind==="written"?r:o).push(y.path)}if(u.entrypointReexports!==void 0&&Te(u.entrypointReexports,n,t,s.diff===!0),s.diff)continue;const p=ye(u,n,t,d);i.push(...p.deps),a.push(...p.bindings)}return!s.diff&&Object.keys(c.items).length>0&&je(n,c),{bindings:a,deps:i,skipped:o,written:r}},k=()=>({bindings:[],code:0,deps:[],skipped:[],written:[]}),Ze=(e,n,t,s,r)=>e.bindings?{...e,bindings:e.bindings.map(o=>{if(o.path[0]!==n||!Array.isArray(o.value))return o;const i=o.value;return{...o,value:i.map(a=>typeof a=="object"&&a!==null&&a[t.key]===t.value?{...a,[s]:r}:a)}})}:e,W=(e,n)=>{const t=n.title??n.description;e.info(`plan: ${n.name}${t?` — ${t}`:""}`);for(const o of n.files)e.info(` file ${o.to} (${o.merge})`);const s=new Map,r=o=>{const i=s.get(o);if(i!==void 0)return i;const a=F(o);return s.set(o,a),a};for(const[o,i]of Object.entries(n.deps??{}))e.info(` dep ${o}@${r(i)}`);for(const[o,i]of Object.entries(n.devDependencies??{}))e.info(` dev ${o}@${r(i)}`);for(const o of n.bindings??[])e.info(` bind ${o.path.join(".")} = ${JSON.stringify(o.value)}`);for(const o of n.envVars??[]){const i=o.secret?" (secret)":` = ${JSON.stringify(o.value??"")}`;e.info(` env ${o.name}${i}`)}for(const o of n.entrypointReexports??[]){const i=`./lunora/${o.module}`,a=o.comment?` // ${o.comment}`:"";e.info(` entry ${i}${a}`)}},Fe=e=>{const n=e.map(({manifest:t})=>({bindings:(t.bindings??[]).map(s=>({path:s.path.join("."),value:s.value})),deps:Object.keys(t.deps??{}),devDependencies:Object.keys(t.devDependencies??{}),entrypointReexports:(t.entrypointReexports??[]).map(s=>({module:s.module,...s.comment?{comment:s.comment}:{}})),envVars:(t.envVars??[]).map(s=>({name:s.name,...s.secret?{secret:!0}:{value:s.value??""}})),files:t.files.map(s=>({merge:s.merge,to:s.to})),name:t.name,requires:t.requires??[],title:t.title}));process.stdout.write(`${JSON.stringify({items:n},void 0,2)}
|
|
16
|
+
`)},Ie=e=>{try{const{args:n,command:t}=z(U(e));return`${t} ${n.join(" ")}`}catch{return"<your-package-manager> install"}},Le=(e,n,t,s,r,o)=>{r.success(`add complete: ${String(t)} written, ${String(s)} skipped`),r.info("next steps:"),r.info(" lunora codegen # regenerate _generated/ so the new tables/functions appear"),n.length>0&&r.info(` ${Ie(o)} # install newly-added dependencies`);for(const{manifest:i}of e)i.docs&&r.info(`${i.name}: ${i.docs}`)},Me=async e=>{const n=k(),t=S("list",e);if(t)return e.logger.error(t),{...n,code:1};let s=()=>{};try{const r=await K(e);s=r.cleanup;const o=ne(r.root);if(e.json)return process.stdout.write(`${JSON.stringify(o,void 0,2)}
|
|
17
|
+
`),n;e.logger.info(`available registry items (${String(o.length)}):`);for(const i of o)e.logger.info(` ${i.name}${i.description?` — ${i.description}`:""}`);return n}catch(r){return e.logger.error(`list failed: ${r instanceof Error?r.message:String(r)}`),{...n,code:1}}finally{s()}},en=async e=>{const n=e.cwd??process.cwd(),t=k();if(e.list)return Me(e);if(e.names.length===0)return e.logger.error("add requires at least one item name. Usage: lunora registry add <name> [...names]"),{...t,code:1};const s=S("add",e);if(s)return e.logger.error(s),{...t,code:1};let r=[];try{const{cleanups:o,items:i}=await Q(e.names,e);r=o;const{transformManifest:a}=e,c=a?i.map($=>({...$,manifest:a($.manifest)})):i;for(const{manifest:$}of c)W(e.logger,$);if(e.json&&Fe(c),e.dryRun)return e.logger.info("dry-run: stopping before any files are written"),t;if(e.diff)return _(c,n,e.logger,{diff:!0}),e.logger.info("diff: preview only — re-run without --diff to apply"),t;if(!await ve(c,e))return{...t,code:1};const{bindings:d,deps:f,skipped:u,written:p}=_(c,n,e.logger,{overwrite:e.overwrite});return Le(c,f,p.length,u.length,e.logger,n),{bindings:d,code:0,deps:f,skipped:u,written:p}}catch(o){return e.logger.error(`add failed: ${o instanceof Error?o.message:String(o)}`),{...t,code:1}}finally{for(const o of r)o()}},nn=async e=>{const n=k();if(e.names.length===0)return e.logger.error("view requires an item name. Usage: lunora registry view <name>"),{...n,code:1};const t=S("view",e);if(t)return e.logger.error(t),{...n,code:1};const s=[];try{for(const r of e.names){const{cleanup:o,directory:i}=await X(r,e);s.push(o);const a=Z(i,r);W(e.logger,a);for(const c of a.files){e.logger.info(`--- ${c.to} (${c.merge}) ---`);const d=m(l(i,c.from),"utf8");for(const f of d.split(`
|
|
18
|
+
`))e.logger.info(f)}}return n}catch(r){return e.logger.error(`view failed: ${r instanceof Error?r.message:String(r)}`),{...n,code:1}}finally{for(const r of s)r()}},tn=async e=>{const n=k(),t=e.from;if(t===void 0)return e.logger.error("registry build requires --from <registry root>"),{...n,code:1};if(!g(t))return e.logger.error(`registry root not found: ${t}`),{...n,code:1};const s=te(t),r=e.out??l(t,"index.json");if(e.check){const o=g(r)?JSON.parse(m(r,"utf8")):{items:[]};return JSON.stringify(o.items??[])!==JSON.stringify(s.items)?(e.logger.error(`registry: ${r} is stale — run \`lunora registry build\` to regenerate it`),{...n,code:1}):(e.logger.success(`registry: ${r} is up to date (${String(s.items.length)} items)`),n)}return h(r,`${JSON.stringify({$schema:"./schema/registry.schema.json",...s},void 0,4)}
|
|
19
|
+
`,"utf8"),e.logger.success(`registry: wrote ${r} (${String(s.items.length)} items)`),n};export{nn as E,tn as F,en as I,Ze as d};
|
package/dist/packem_shared/{lint-ignore-report-BR2og7ff.mjs → lint-ignore-report-m43j10IE.mjs}
RENAMED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{d as i}from"./commands-
|
|
1
|
+
import{d as i}from"./commands-DB63_8xW.mjs";const o=[{description:"Email + password on better-auth (default)",label:"Email & password",value:"auth"},{description:"Clerk-hosted auth",label:"Clerk",value:"auth-clerk"},{description:"Auth0 (OIDC)",label:"Auth0",value:"auth-auth0"}],r="auth",y=async a=>await a("Which auth provider?",o,{default:r})??r,O="mail",S=[{description:"Next, react-router, TanStack Start, Astro islands",label:"React",value:"auth-ui-react"},{description:"Nuxt, Vue + Vite",label:"Vue",value:"auth-ui-vue"},{description:"SvelteKit, Svelte + Vite",label:"Svelte",value:"auth-ui-svelte"},{description:"TanStack Start Solid, Solid + Vite",label:"Solid",value:"auth-ui-solid"},{description:"Analog",label:"Angular",value:"auth-ui-angular"}],x="auth-ui-react",d=a=>Object.hasOwn(a,"react-native")||Object.hasOwn(a,"@lunora/react-native")||Object.hasOwn(a,"expo"),A=a=>{const t=e=>Object.hasOwn(a,e);if(!d(a)){if(t("@lunora/react"))return"auth-ui-react";if(t("@lunora/vue"))return"auth-ui-vue";if(t("@lunora/svelte"))return"auth-ui-svelte";if(t("@lunora/solid"))return"auth-ui-solid";if(t("@lunora/angular"))return"auth-ui-angular";if(t("react")||t("next"))return"auth-ui-react";if(t("vue")||t("nuxt"))return"auth-ui-vue";if(t("svelte")||t("@sveltejs/kit"))return"auth-ui-svelte";if(t("solid-js"))return"auth-ui-solid";if(t("@angular/core"))return"auth-ui-angular"}},_=a=>{const t=a.trim();if(t==="")return;const e=t.toLowerCase();return e==="auth-ui"||e==="auth-ui-"?{kind:"auth-ui"}:e==="auth"?{kind:"auth"}:e==="email"||e==="mail"?{kind:"email"}:{item:e,kind:"item"}},c=/[^a-z0-9]+/u,s=(a,t,e)=>{let n=a.toLowerCase().split(c).filter(Boolean).join("-").slice(0,e);return n.endsWith("-")&&(n=n.slice(0,-1)),n.length>=t?n:void 0},h="DB",f="Name your D1 database (run `wrangler d1 create` to get its id, then put it in wrangler.jsonc)",u=a=>s(a,1,64),p="lunora-db",v=a=>u(`${a}-db`)??p,L=async(a,t)=>{const e=v(t);return u(await a(f,{default:e,placeholder:e}))??e},V=(a,t)=>i(a,"d1_databases",{key:"binding",value:h},"database_name",t),$="SEND_EMAIL",C="Verified destination email for production delivery (blank = set it later in wrangler.jsonc)",b=a=>{const t=a.trim();if(t.length===0||t.includes(" "))return!1;const e=t.indexOf("@");if(e<=0||e!==t.lastIndexOf("@"))return!1;const n=t.slice(e+1);return n.length>=3&&n.includes(".")&&!n.startsWith(".")&&!n.endsWith(".")},D=(a,t)=>{const e=a.trim();if(e!==""){if(!b(e)){t(`"${e}" doesn't look like an email — leaving the placeholder; set destination_address in wrangler.jsonc.`);return}return e}},N=(a,t)=>i(a,"send_email",{key:"name",value:$},"destination_address",t),m="UPLOADS",g="Name your R2 bucket (you can rename it in wrangler.jsonc later)",l=a=>s(a,3,63),k="lunora-uploads",w=a=>l(`${a}-uploads`)??k,E=async(a,t)=>{const e=w(t);return l(await a(g,{default:e,placeholder:e}))??e},W=(a,t)=>i(a,"r2_buckets",{key:"binding",value:m},"bucket_name",t),I=(a,t)=>{for(const e of a)(e.status==="created"||e.status==="updated")&&t.success(`${e.status} ${e.path} — ${e.tool} now skips Lunora's generated files`),e.status==="failed"&&t.warn(`could not configure ${e.tool} to skip Lunora's generated files: ${e.message??"unknown error"}. Add the entries by hand, or re-run once the path is writable.`),e.status==="manual"&&e.snippet!==void 0&&t.warn(`${e.path} needs an entry so ${e.tool} skips Lunora's generated files — add:
|
|
2
2
|
${e.snippet}`)};export{D as a,C as b,u as c,_ as d,v as e,L as f,r as g,y as h,l as i,A as j,S as k,O as l,o as m,I as n,w as o,W as p,N as q,d as r,x as s,V as t,E as u};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import"node:fs";import"@visulima/path";import"./detect-package-manager-DXDstphE.mjs";import{I as a,F as p,E as e}from"./commands-
|
|
1
|
+
import"node:fs";import"@visulima/path";import"./detect-package-manager-DXDstphE.mjs";import{I as a,F as p,E as e}from"./commands-DB63_8xW.mjs";import"./buildRegistryIndex-DwySASBu.mjs";import"./resolve-BZp6jitE.mjs";export{a as runAddCommand,p as runBuildIndexCommand,e as runRegistryViewCommand};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lunora/cli",
|
|
3
|
-
"version": "1.0.0-alpha.
|
|
3
|
+
"version": "1.0.0-alpha.164",
|
|
4
4
|
"description": "The Lunora CLI: init, dev, deploy, codegen, migrate, seed, doctor, insights, logs, registry, and the rest of the project commands",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"agent-skills",
|
|
@@ -52,16 +52,16 @@
|
|
|
52
52
|
},
|
|
53
53
|
"dependencies": {
|
|
54
54
|
"@bomb.sh/tab": "0.0.21",
|
|
55
|
-
"@lunora/advisor": "1.0.0-alpha.
|
|
55
|
+
"@lunora/advisor": "1.0.0-alpha.78",
|
|
56
56
|
"@lunora/bindings": "1.0.0-alpha.28",
|
|
57
|
-
"@lunora/codegen": "1.0.0-alpha.
|
|
58
|
-
"@lunora/config": "1.0.0-alpha.
|
|
57
|
+
"@lunora/codegen": "1.0.0-alpha.108",
|
|
58
|
+
"@lunora/config": "1.0.0-alpha.137",
|
|
59
59
|
"@lunora/container": "1.0.0-alpha.30",
|
|
60
|
-
"@lunora/d1": "1.0.0-alpha.
|
|
60
|
+
"@lunora/d1": "1.0.0-alpha.77",
|
|
61
61
|
"@lunora/errors": "1.0.0-alpha.21",
|
|
62
|
-
"@lunora/mcp": "1.0.0-alpha.
|
|
63
|
-
"@lunora/runtime": "1.0.0-alpha.
|
|
64
|
-
"@lunora/seed": "1.0.0-alpha.
|
|
62
|
+
"@lunora/mcp": "1.0.0-alpha.70",
|
|
63
|
+
"@lunora/runtime": "1.0.0-alpha.62",
|
|
64
|
+
"@lunora/seed": "1.0.0-alpha.71",
|
|
65
65
|
"@visulima/cerebro": "3.0.0",
|
|
66
66
|
"@visulima/error": "6.0.0",
|
|
67
67
|
"@visulima/fs": "5.0.5",
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
import{existsSync as g,readFileSync as m,writeFileSync as $,mkdirSync as j}from"node:fs";import{join as l,relative as q,dirname as w}from"@visulima/path";import{p as z,l as U}from"./detect-package-manager-DXDstphE.mjs";import{DEV_VARS_FILE as C,parseDevVariableEntries as Y}from"@lunora/config";import{modify as V,applyEdits as T,parse as B}from"jsonc-parser";import{O as H,a as S,k as G,_ as Q,R as K,A as X}from"./resolve-BZp6jitE.mjs";import{o as Z}from"./tui-prompts-BU3irGxV.mjs";import{collectCatalog as ee,buildRegistryIndex as ne}from"./buildRegistryIndex-DwySASBu.mjs";import{findWranglerFile as te,readWranglerJsonc as re}from"@lunora/config/cloudflare";import{LunoraError as x}from"@lunora/errors";import{insertSchemaExtension as se}from"./insertSchemaExtension-DZReBZ4_.mjs";import{createHash as oe}from"node:crypto";const I=e=>{if(!e.startsWith("workspace:"))return e;const n=e.slice(10);return n===""||n==="*"||n==="^"||n==="~"?H():n},ie=new Set(["@lunora/client","@lunora/do","@lunora/ratelimit","@lunora/runtime","@lunora/server","@lunora/values"]),ae=/(['"])@lunora\/(client|do|ratelimit|runtime|server|values)(\/[^'"]*)?\1/gu,ce=e=>{const n=l(e,"package.json");if(!g(n))return!1;try{const t=JSON.parse(m(n,"utf8"));return t.dependencies?.lunorash!==void 0||t.devDependencies?.lunorash!==void 0}catch{return!1}},de=e=>e.replaceAll(ae,(n,t,s,r)=>`${t}lunorash/${s}${r??""}${t}`),O=(e,n,t,s="dependencies",r=!1)=>{const o=Object.entries(e);if(o.length===0)return[];const i=l(n,"package.json");if(!g(i))return t.warn(`package.json not found at ${i} — skipping dependency updates`),[];let a=m(i,"utf8");const c=JSON.parse(a),d=[];for(const[f,u]of o){if(r&&ie.has(f)){t.info(`dep provided by the lunorash umbrella, skipping: ${f}`);continue}if(c.dependencies?.[f]!==void 0||c.devDependencies?.[f]!==void 0){t.info(`dep already present: ${f}`);continue}const p=V(a,[s,f],I(u),{formattingOptions:{insertSpaces:!0,tabSize:4}});a=T(a,p),d.push(f)}return d.length>0&&($(i,a,"utf8"),t.success(`added ${String(d.length)} ${s==="devDependencies"?"devDependency(ies)":"dependency(ies)"} to package.json: ${d.join(", ")}`)),d},fe=(e,n,t)=>{if(e.length===0)return[];const s=l(n,C),r=g(s)?m(s,"utf8"):"",o=new Set(Y(r).map(d=>d.key)),i=[],a=[],c=[];for(const d of e)d.secret&&a.push(d.name),!o.has(d.name)&&(d.description&&c.push(`# ${d.description}`),c.push(`${d.name}=${d.secret?"":d.value??""}`),i.push(d.name));if(i.length>0){const d=r===""||r.endsWith(`
|
|
2
|
-
`)?r:`${r}
|
|
3
|
-
`;$(s,`${d}${c.join(`
|
|
4
|
-
`)}
|
|
5
|
-
`,"utf8"),t.success(`scaffolded ${String(i.length)} env var(s) into .dev.vars: ${i.join(", ")}`)}return a.length>0&&t.info(`set secret value(s) locally in .dev.vars, then for production: ${a.map(d=>`wrangler secret put ${d}`).join("; ")}`),i},N=new Set(["ai","analytics_engine_datasets","browser","d1_databases","durable_objects","hyperdrive","kv_namespaces","mtls_certificates","queues","r2_buckets","send_email","services","vars","vectorize","version_metadata","workflows"]),ue=["binding","name","queue","pattern"],J=e=>{if(!(typeof e!="object"||e===null))for(const n of ue){const t=e[n];if(typeof t=="string"&&t.length>0)return`${n}:${t}`}},le=(e,n,t,s)=>{const r=new Set(e.map(a=>JSON.stringify(a))),o=new Set(e.map(a=>J(a)).filter(a=>a!==void 0)),i=[];for(const a of n){if(r.has(JSON.stringify(a)))continue;const c=J(a);if(c!==void 0&&o.has(c)){s.warn(`${c.replace(":"," ")} already exists in ${t} — keeping the project's entry and skipping the registry item's. Reconcile by hand if the item needs different settings.`);continue}c!==void 0&&o.add(c),i.push(a)}return i},D=e=>Array.isArray(e),pe=(e,n)=>{let t=B(e);for(const s of n){if(typeof t!="object"||t===null)return;t=t[s]}return t},ge=(e,n)=>{const t=e[0];return t!==void 0&&N.has(t)?!0:(n.warn(`skipping binding "${e.join(".")}" — only resource bindings (${[...N].join(", ")}) may be written, not exec/entrypoint keys`),!1)},L=Symbol("skip-binding"),me=(e,n,t)=>{const{value:s}=n;if(!D(s))return s;const r=pe(e,n.path);if(!D(r))return s;const o=le(r,s,n.path.join("."),t);return o.length===0?L:[...r,...o]},$e=(e,n,t)=>{if(e.length===0)return[];const s=["wrangler.jsonc","wrangler.json"].map(i=>l(n,i)).find(i=>g(i));if(!s)return t.warn("wrangler.jsonc not found — skipping binding updates"),[];let r=m(s,"utf8");const o=[];for(const i of e){if(!ge(i.path,t))continue;const a=me(r,i,t);if(a===L)continue;const c=V(r,[...i.path],a,{formattingOptions:{insertSpaces:!0,tabSize:4}});c.length!==0&&(r=T(r,c),o.push(i.path.join(".")))}return o.length>0&&($(s,r,"utf8"),t.success(`applied ${String(o.length)} binding(s) to ${s}: ${o.join(", ")}`)),o},he=(e,n,t,s=!1)=>{const r=[],o=[];return e.deps&&r.push(...O(e.deps,n,t,"dependencies",s)),e.devDependencies&&r.push(...O(e.devDependencies,n,t,"devDependencies",s)),e.bindings&&o.push(...$e(e.bindings,n,t)),e.envVars&&fe(e.envVars,n,t),{bindings:o,deps:r}},ye=async(e,n)=>{const t=e.some(({manifest:c})=>Object.keys(c.deps??{}).length>0||Object.keys(c.devDependencies??{}).length>0),s=e.some(({manifest:c})=>(c.bindings??[]).length>0),r=n.source!==void 0&&n.source.length>0;if(!t&&!s&&!r||n.yes)return!0;const o=[];t&&o.push("add dependencies to package.json"),s&&o.push("write wrangler.jsonc bindings"),r&&o.push(`come from a non-default source (${String(n.source)})`);const i=o.join(", ");if(!process.stdin.isTTY&&n.confirm===void 0)return n.logger.error(`add: stdin is not a TTY and the requested items ${i} — re-run with --yes to confirm`),!1;const a=await(n.confirm??Z)(`The requested items ${i}. Continue?`);return a||n.logger.info("add: aborted"),a},b=1,ve=".lunora-registry.json",M=e=>l(e,"lunora",ve),we=e=>typeof e!="object"||e===null||!("items"in e)?!1:typeof e.items=="object"&&e.items!==null,v=e=>oe("sha256").update(e).digest("hex"),ke=e=>{const n=M(e);if(!g(n))return{items:{},version:b};try{const t=JSON.parse(m(n,"utf8"));if(we(t))return{items:t.items,version:b}}catch{}return{items:{},version:b}},be=(e,n)=>{$(M(e),`${JSON.stringify(n,void 0,2)}
|
|
6
|
-
`,"utf8")},E=(e,n,t,s)=>{const r=e.items[n]??{files:{}};e.items[n]=r,r.files[t]=v(s)},je=(e,n,t)=>e.items[n]?.files[t],R=e=>e===""?[]:e.split(`
|
|
7
|
-
`),Se=(e,n)=>{const t=R(e),s=R(n);let r=0;for(;r<t.length&&r<s.length&&t[r]===s[r];)r+=1;let o=t.length,i=s.length;for(;o>r&&i>r&&t[o-1]===s[i-1];)o-=1,i-=1;if(r===o&&r===i)return[];const a=[];for(let c=Math.max(0,r-3);c<r;c+=1)a.push(` ${t[c]??""}`);for(let c=r;c<o;c+=1)a.push(`- ${t[c]??""}`);for(let c=r;c<i;c+=1)a.push(`+ ${s[c]??""}`);for(let c=i;c<Math.min(s.length,i+3);c+=1)a.push(` ${s[c]??""}`);return a},xe=/\.[cm]?[jt]sx?$/u,W=(e,n,t)=>{const s=m(l(e,n.from),"utf8");return t&&xe.test(n.to)?de(s):s},Oe=(e,n,t,s,r,o,i)=>{const a=l(s,"lunora","schema.ts");if(o)return r.info(`~ would merge .extend(${n}.extension) into lunora/schema.ts (and create ${e.to} if absent)`),{kind:"skipped",path:a};const c=l(s,e.to);g(c)||(j(w(c),{recursive:!0}),$(c,W(t,e,i),"utf8"));const d=i?"lunorash/server":"@lunora/server",f=g(a)?m(a,"utf8"):`import { defineSchema } from "${d}";
|
|
8
|
-
|
|
9
|
-
export const schema = defineSchema({});
|
|
10
|
-
`,u=se(f,n);if(u.ok)return j(w(a),{recursive:!0}),$(a,u.text,"utf8"),r.success(`merged .extend(${n}.extension) into lunora/schema.ts`),{kind:"written",path:a};if(u.reason==="already-applied")return r.warn(`lunora/schema.ts already extends "${n}" — skipping`),{kind:"skipped",path:a};throw u.reason==="invalid-identifier"?new x("INTERNAL",`schema-extension item "${n}" is not a valid JS identifier — it is spliced into lunora/schema.ts as \`import { ${n} }\` / \`.extend(${n}.extension)\`. Rename the item to a valid identifier (no leading digit, no "-").`):new x("INTERNAL",`schema-extension merge failed for "${n}": ${u.reason}`)},Ne=(e,n,t,s,r)=>{const o=Se(n,t);if(o.length===0){r.info(`= ${e.to} (unchanged)`);return}r.info(`${s?"~":"+"} ${e.to}`);for(const i of o)r.info(` ${i}`)},Je=(e,n,t,s,r,o,i,a)=>{const c=l(s,e.to),d=W(t,e,a),f=g(c),u=f?m(c,"utf8"):"",p=P=>(j(w(c),{recursive:!0}),$(c,d,"utf8"),E(o,n,e.to,d),r.success(`${P}: ${e.to}`),{kind:"written",path:c});if(i.diff)return Ne(e,u,d,f,r),{kind:"skipped",path:c};if(!f)return p("write");const h=v(u);if(h===v(d))return E(o,n,e.to,d),r.warn(`skip (exists): ${e.to}`),{kind:"skipped",path:c};if(i.overwrite)return p("overwrite");const y=je(o,n,e.to);return y===void 0?(r.warn(`skip (exists, untracked): ${e.to} — refusing to overwrite a file lunora didn't add (use --overwrite to force)`),{kind:"skipped",path:c}):y===h?p("update"):y===v(d)?(r.warn(`skip (locally edited): ${e.to}`),{kind:"skipped",path:c}):($(`${c}.new`,d,"utf8"),r.warn(`conflict: ${e.to} has local edits and an upstream update — wrote ${e.to}.new (use --overwrite to take theirs)`),{kind:"skipped",path:c})},De=(e,n,t,s,r,o,i={},a=!1)=>e.merge==="schema-extension"?Oe(e,n,t,s,r,i.diff===!0,a):Je(e,n,t,s,r,o,i,a),_=["src/server.ts","src/server/index.ts","src/server/index.tsx","src/index.ts","src/worker.ts"],Ee=e=>{const n=te(e);if(n===void 0)return;const{parsed:t}=re(n);return typeof t?.main=="string"?t.main:void 0},Re=e=>{const n=Ee(e),t=n===void 0?_:[n,..._];for(const s of t){const r=l(e,s);if(!g(r))continue;const o=m(r,"utf8");if(!o.includes("createShardDO(")){if(s===n)break;continue}return{entryPath:r,main:s,source:o}}},_e=(e,n,t)=>{const s=q(w(e),l(n,"lunora",t)).replaceAll("\\","/");return s.startsWith(".")?s:`./${s}`},Ae=(e,n)=>{for(const t of e){const s=`Add \`export * from "${`./lunora/${t.module}.js`}"\` to your worker entry`,r=t.comment?` (${t.comment})`:"";n.warn(`${s}${r}`)}return 0},qe=(e,n,t,s)=>{const r=[];for(const o of e){const i=_e(n,t,o.module),a=i.replaceAll(/[.*+?^${}()|[\]\\]/g,String.raw`\$&`);new RegExp(String.raw`export\s+\*\s+from\s+["']${a}\.js["']`,"u").test(s)||(o.comment&&r.push(`
|
|
11
|
-
// ${o.comment}`),r.push(`export * from "${i}.js";`))}return r},Ve=(e,n,t,s)=>{if(e.length===0)return 0;const r=Re(n);if(r===void 0)return Ae(e,t);const o=qe(e,r.entryPath,n,r.source);if(o.length===0)return 0;if(s){for(const a of o)a!==""&&t.info(`~ entrypoint: ${a}`);return o.length}const i=r.source.endsWith(`
|
|
12
|
-
`)?"":`
|
|
13
|
-
`;return $(r.entryPath,`${r.source}${i}${o.join(`
|
|
14
|
-
`)}
|
|
15
|
-
`,"utf8"),t.success(`wrote ${String(o.length)} entrypoint re-export(s) to ${q(n,r.entryPath)}`),o.length},A=(e,n,t,s={})=>{const r=[],o=[],i=[],a=[],c=ke(n),d=ce(n);for(const{directory:f,manifest:u}of e){for(const h of u.files){const y=De(h,u.name,f,n,t,c,s,d);(y.kind==="written"?r:o).push(y.path)}if(u.entrypointReexports!==void 0&&Ve(u.entrypointReexports,n,t,s.diff===!0),s.diff)continue;const p=he(u,n,t,d);i.push(...p.deps),a.push(...p.bindings)}return!s.diff&&Object.keys(c.items).length>0&&be(n,c),{bindings:a,deps:i,skipped:o,written:r}},k=()=>({bindings:[],code:0,deps:[],skipped:[],written:[]}),Xe=(e,n,t,s,r)=>e.bindings?{...e,bindings:e.bindings.map(o=>{if(o.path[0]!==n||!Array.isArray(o.value))return o;const i=o.value;return{...o,value:i.map(a=>typeof a=="object"&&a!==null&&a[t.key]===t.value?{...a,[s]:r}:a)}})}:e,F=(e,n)=>{const t=n.title??n.description;e.info(`plan: ${n.name}${t?` — ${t}`:""}`);for(const o of n.files)e.info(` file ${o.to} (${o.merge})`);const s=new Map,r=o=>{const i=s.get(o);if(i!==void 0)return i;const a=I(o);return s.set(o,a),a};for(const[o,i]of Object.entries(n.deps??{}))e.info(` dep ${o}@${r(i)}`);for(const[o,i]of Object.entries(n.devDependencies??{}))e.info(` dev ${o}@${r(i)}`);for(const o of n.bindings??[])e.info(` bind ${o.path.join(".")} = ${JSON.stringify(o.value)}`);for(const o of n.envVars??[]){const i=o.secret?" (secret)":` = ${JSON.stringify(o.value??"")}`;e.info(` env ${o.name}${i}`)}for(const o of n.entrypointReexports??[]){const i=`./lunora/${o.module}`,a=o.comment?` // ${o.comment}`:"";e.info(` entry ${i}${a}`)}},Te=e=>{const n=e.map(({manifest:t})=>({bindings:(t.bindings??[]).map(s=>({path:s.path.join("."),value:s.value})),deps:Object.keys(t.deps??{}),devDependencies:Object.keys(t.devDependencies??{}),entrypointReexports:(t.entrypointReexports??[]).map(s=>({module:s.module,...s.comment?{comment:s.comment}:{}})),envVars:(t.envVars??[]).map(s=>({name:s.name,...s.secret?{secret:!0}:{value:s.value??""}})),files:t.files.map(s=>({merge:s.merge,to:s.to})),name:t.name,requires:t.requires??[],title:t.title}));process.stdout.write(`${JSON.stringify({items:n},void 0,2)}
|
|
16
|
-
`)},Ie=e=>{try{const{args:n,command:t}=z(U(e));return`${t} ${n.join(" ")}`}catch{return"<your-package-manager> install"}},Le=(e,n,t,s,r,o)=>{r.success(`add complete: ${String(t)} written, ${String(s)} skipped`),r.info("next steps:"),r.info(" lunora codegen # regenerate _generated/ so the new tables/functions appear"),n.length>0&&r.info(` ${Ie(o)} # install newly-added dependencies`);for(const{manifest:i}of e)i.docs&&r.info(`${i.name}: ${i.docs}`)},Me=async e=>{const n=k(),t=S("list",e);if(t)return e.logger.error(t),{...n,code:1};let s=()=>{};try{const r=await Q(e);s=r.cleanup;const o=ee(r.root);if(e.json)return process.stdout.write(`${JSON.stringify(o,void 0,2)}
|
|
17
|
-
`),n;e.logger.info(`available registry items (${String(o.length)}):`);for(const i of o)e.logger.info(` ${i.name}${i.description?` — ${i.description}`:""}`);return n}catch(r){return e.logger.error(`list failed: ${r instanceof Error?r.message:String(r)}`),{...n,code:1}}finally{s()}},Ze=async e=>{const n=e.cwd??process.cwd(),t=k();if(e.list)return Me(e);if(e.names.length===0)return e.logger.error("add requires at least one item name. Usage: lunora registry add <name> [...names]"),{...t,code:1};const s=S("add",e);if(s)return e.logger.error(s),{...t,code:1};let r=[];try{const{cleanups:o,items:i}=await G(e.names,e);r=o;const{transformManifest:a}=e,c=a?i.map(h=>({...h,manifest:a(h.manifest)})):i;for(const{manifest:h}of c)F(e.logger,h);if(e.json&&Te(c),e.dryRun)return e.logger.info("dry-run: stopping before any files are written"),t;if(e.diff)return A(c,n,e.logger,{diff:!0}),e.logger.info("diff: preview only — re-run without --diff to apply"),t;if(!await ye(c,e))return{...t,code:1};const{bindings:d,deps:f,skipped:u,written:p}=A(c,n,e.logger,{overwrite:e.overwrite});return Le(c,f,p.length,u.length,e.logger,n),{bindings:d,code:0,deps:f,skipped:u,written:p}}catch(o){return e.logger.error(`add failed: ${o instanceof Error?o.message:String(o)}`),{...t,code:1}}finally{for(const o of r)o()}},en=async e=>{const n=k();if(e.names.length===0)return e.logger.error("view requires an item name. Usage: lunora registry view <name>"),{...n,code:1};const t=S("view",e);if(t)return e.logger.error(t),{...n,code:1};const s=[];try{for(const r of e.names){const{cleanup:o,directory:i}=await K(r,e);s.push(o);const a=X(i,r);F(e.logger,a);for(const c of a.files){e.logger.info(`--- ${c.to} (${c.merge}) ---`);const d=m(l(i,c.from),"utf8");for(const f of d.split(`
|
|
18
|
-
`))e.logger.info(f)}}return n}catch(r){return e.logger.error(`view failed: ${r instanceof Error?r.message:String(r)}`),{...n,code:1}}finally{for(const r of s)r()}},nn=async e=>{const n=k(),t=e.from;if(t===void 0)return e.logger.error("registry build requires --from <registry root>"),{...n,code:1};if(!g(t))return e.logger.error(`registry root not found: ${t}`),{...n,code:1};const s=ne(t),r=e.out??l(t,"index.json");if(e.check){const o=g(r)?JSON.parse(m(r,"utf8")):{items:[]};return JSON.stringify(o.items??[])!==JSON.stringify(s.items)?(e.logger.error(`registry: ${r} is stale — run \`lunora registry build\` to regenerate it`),{...n,code:1}):(e.logger.success(`registry: ${r} is up to date (${String(s.items.length)} items)`),n)}return $(r,`${JSON.stringify({$schema:"./schema/registry.schema.json",...s},void 0,4)}
|
|
19
|
-
`,"utf8"),e.logger.success(`registry: wrote ${r} (${String(s.items.length)} items)`),n};export{en as E,nn as F,Ze as I,Xe as d};
|