@lunora/cli
Version:
The Lunora CLI: init, dev, deploy, codegen, run, reset, and migrate commands
2 lines (1 loc) • 2.78 kB
JavaScript
import{LunoraError as v}from"@lunora/errors";import{l as w,v as _}from"../packem_shared/admin-token-DV5A9T5b.mjs";import{u as N,s as $}from"../packem_shared/admin-url-Ca-KI3d_.mjs";import{i as b}from"../packem_shared/command-Bjv4VmYA.mjs";import{t as P}from"../packem_shared/resolve-target-vxaXHmvg.mjs";const f=(r,e="--args")=>{if(r===void 0||r.length===0)return{};try{return JSON.parse(r)}catch(o){const t=o instanceof Error?o.message:String(o);throw new v("INTERNAL",`failed to parse ${e} as JSON: ${t}`,{cause:o})}},S=/\/$/u,O="__lunora_admin__:runAs",k="__lunora_admin__:",A=(r,e)=>{const o=e.body?.error?.code;e.runAs||e.status!==403||o!=="FORBIDDEN_SHARD"||r.info("this app authorizes per shard, so an anonymous call is denied — retry with --as <userId> to run as an authenticated user")},E=({args:r,claims:e,options:o,runAs:t})=>{const a=t?{args:{args:r,functionPath:o.functionPath,identity:e,userId:o.as},functionPath:O}:{args:r,functionPath:o.functionPath};return o.shard!==void 0&&(a.shardKey=o.shard),a},I=({cwd:r,logger:e,needsBearer:o,url:t})=>o?N(t,e,r):(P({cwd:r,url:t})??$(r)).replace(S,""),T=async r=>{const e=r.cwd??process.cwd(),o=r.as!==void 0&&r.as!=="",t=o||r.functionPath.startsWith(k),a=I({cwd:e,logger:r.logger,needsBearer:t,url:r.url});if(a===void 0)return{body:void 0,code:1,requestUrl:r.url??""};const s=`${a}/_lunora/rpc`,u=r.fetchImpl??globalThis.fetch;if(typeof u!="function")throw new TypeError("no fetch implementation available — pass --fetch via dependency injection or run on Node >= 18");let l,g;try{l=f(r.args),g=r.claims===void 0?void 0:f(r.claims,"--claims")}catch(d){return r.logger.error(d instanceof Error?d.message:String(d)),{body:void 0,code:1,requestUrl:s}}const{source:m,token:n}=t?w({cwd:e,token:r.token,url:a}):{};if(t&&n===void 0)return r.logger.error("admin token required — pass --token, set LUNORA_ADMIN_TOKEN, or add it to .dev.vars (local targets only)"),{body:void 0,code:1,requestUrl:s};n!==void 0&&r.logger.debug?.(`admin bearer from ${_(m)}`);const p={"content-type":"application/json",...n===void 0?{}:{authorization:`Bearer ${n}`}},y=E({args:l,claims:g,options:r,runAs:o});r.logger.info(`POST ${s} -> ${r.functionPath}${o?` (as ${r.as??""})`:""}`);const c=await u(s,{body:JSON.stringify(y),headers:p,method:"POST"}),h=await c.text();let i;try{i=JSON.parse(h)}catch{i=h}return r.logger.info(JSON.stringify(i,void 0,2)),A(r.logger,{body:i,runAs:o,status:c.status}),{body:i,code:c.ok?0:1,requestUrl:s}},D=b(({argument:r,cwd:e,logger:o,options:t})=>{const a=r[0];return a?T({args:t.args,as:t.as,claims:t.claims,cwd:e,functionPath:a,logger:o,shard:t.shard,token:t.token,url:t.url}):(o.error("missing function path. Usage: lunora run <functionPath> [--args <json>]"),{code:1})});export{D as execute,T as runRpcCommand};