@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) • 20.4 kB
JavaScript
import{existsSync as p,readFileSync as S}from"node:fs";import{runCodegen as F,discoverMigrations as O}from"@lunora/codegen";import{readLinkedProject as L,writeLinkedProject as H,execArgsFor as w,detectPackageManager as k,discoverContainerInfo as N,DEV_VARS_FILE as v,parseDevVariableEntries as T,isMintableSecretKey as E,runPostCodegenHook as M,resolveDeployDriver as D,inferLunoraBindings as _,packageNamesFromBindings as W,requiredSecrets as B,generateSecretValue as V,upsertDevVariableLine as K,writeDevVariablesFileAtomically as q,discoverSchemaInfo as Y}from"@lunora/config";import{validateWranglerProject as G,reconcileWranglerBindings as z,reconcileWranglerCompatibilityDate as J,reconcileWranglerCrons as Q,findWranglerFile as X,readWranglerJsonc as Z}from"@lunora/config/cloudflare";import{join as h}from"@visulima/path";import{Spinner as ee}from"@visulima/spinner";import{Project as re}from"ts-morph";import{i as te,m as ae,e as ne}from"../packem_shared/vectorize-metadata-DbziRKpX.mjs";import{r as oe,e as ie}from"../packem_shared/advisory-gate-Cl8IEFIj.mjs";import{p as se}from"../packem_shared/api-spec-lYyq4vL6.mjs";import{r as R}from"../packem_shared/wrangler-name-Dsk5K1f-.mjs";import{d as ce}from"../packem_shared/command-DwC11Cwe.mjs";import{r as le}from"../packem_shared/deploy-target-D9GPy_tq.mjs";import{a as de,i as ue}from"../packem_shared/docker-DpVxvYpL.mjs";import{r as ge,p as me,H as fe,a as he}from"../packem_shared/schema-drift-gate-DARCKocg.mjs";import{v as ve,l as pe,i as b,p as ye}from"../packem_shared/output-format-DfogXx0p.mjs";import{r as we}from"../packem_shared/platform-diagnostics-uOXqysk3.mjs";import{containerBuildTag as ke}from"@lunora/container";import{defaultSpawner as $}from"../packem_shared/createRecordingSpawner-DJlNacZ6.mjs";import{a as j}from"../packem_shared/resolve-target-BRvw8Pf7.mjs";import{c as be}from"../packem_shared/tui-prompts-Dd0pDuNr.mjs";import{l as $e}from"../packem_shared/wrangler-secrets-CCdt0mUl.mjs";import{runMigrateDataCommand as Se}from"./runMigrateGenerateCommand.mjs";const De=/https?:\/\/[^\s"'<>]+\.workers\.dev[^\s"'<>]*/u,Re=/https:\/\/[^\s"'<>]+/u,Ce=e=>{if(e===void 0)return;const r=De.exec(e);return r?r[0]:Re.exec(e)?.[0]},P=e=>e===void 0?"":` (--env ${e})`,Ae=({cwd:e,env:r,logger:a,now:t,url:n})=>{if(n!==void 0)try{const o=L(e);if(o!==void 0){if(o.workerUrl===n&&o.env===r)return;a.warn(`link: .lunora/project.json records ${o.workerUrl??"(no url)"}${P(o.env)}, but this deploy published ${n}${P(r)}. Keeping the recorded value — run \`lunora link --url ${n}${r===void 0?"":` --env ${r}`}\` to update it.`);return}const i=(t??(()=>new Date().toISOString()))();H(e,{env:r,linkedAt:i,workerName:R(e),workerUrl:n}),a.success(`link: recorded ${n} in .lunora/project.json (run \`lunora link\` to change)`)}catch{}},Ee=e=>{const{cwd:r,env:a,logger:t,migrated:n,mintedSecretsFile:o}=e;try{const i=L(r),s=i?.workerName??R(r),c=e.url??i?.workerUrl;t.success("deploy complete"),t.info(` worker: ${s??"(see wrangler output above)"}`),a!==void 0&&t.info(` env: ${a}`),c===void 0?t.info(" url: run `lunora link --url <https://your-worker>` to record it"):t.info(` url: ${c}`),n&&t.info(" migrations: applied"),o!==void 0&&t.info(` secrets: generated value(s) recorded in ${o}`),t.info(" studio: lunora view --remote"),t.info(" logs: lunora logs")}catch{}},Pe=async e=>{if(e.targets.length===0)return{builtTags:[],code:0};if(!(e.railpackAvailable??de)()){const t="deploy blocked: a container uses `image: { build }` (Railpack), but Railpack isn't ready. Install the `railpack` CLI and start a BuildKit instance, e.g. `docker run --rm --privileged -d --name buildkit moby/buildkit` then `export BUILDKIT_HOST=docker-container://buildkit`. Alternatively switch the container's `image` to a Dockerfile path or a pre-built registry reference.";return e.logger.error(t),{builtTags:[],code:1,error:t}}const r=e.spawner??$,a=[];for(const t of e.targets){const n=ke(t.exportName),o={args:["build",t.buildDir,"--name",n],command:"railpack",cwd:e.cwd},i=w(k(e.cwd),"wrangler",["containers","push",n]),s={args:i.args,command:i.command,cwd:e.cwd};e.logger.info(`railpack: building "${t.exportName}" → ${n} from ${t.buildDir}`);const c=await r(o);if(c.code!==0){const l=`railpack build failed for container "${t.exportName}" (${t.buildDir})`;return e.logger.error(l),{builtTags:a,code:c.code,error:l}}e.logger.info(`railpack: pushing ${n} to the Cloudflare Registry`);const d=await r(s);if(d.code!==0){const l=`wrangler containers push failed for "${t.exportName}" (${n})`;return e.logger.error(l),{builtTags:a,code:d.code,error:l}}a.push(n)}return{builtTags:a,code:0}},I="<replace-with-d1-create-id>",C=e=>{const r=X(e);return r?Z(r).parsed:void 0},xe=["LUNORA_ORIGIN_URL","LUNORA_WORKER_ORIGIN","AUTH_URL"],Le=e=>{try{const{hostname:r}=new URL(e);return r==="localhost"||r==="127.0.0.1"||r==="::1"||r==="[::1]"}catch{return!1}},Ne=e=>e.startsWith("./")||e.startsWith("../")||e.startsWith("/")||e.includes("Dockerfile"),Te=(e,r,a,t="deploy")=>{const n=(C(e)?.containers??[]).filter(i=>typeof i?.image=="string"&&Ne(i.image));if(n.length===0||a())return;const o=`${t} blocked: wrangler.jsonc declares ${String(n.length)} container(s) built from a local Dockerfile, but no Docker-compatible engine is available. Start Docker (or Colima), or point the container's \`image\` at a pre-built registry reference. Note: container images must target linux/amd64.`;return r.error(o),o},_e=e=>p(h(e,"src","worker.ts"))?"src/worker.ts":void 0,je=(e,r,a="deploy")=>{for(const t of N(e,"lunora").containers){const{image:n}=t;if(n.kind==="dockerfile"&&!p(h(e,n.dockerfilePath))){const o=`${a} blocked: container "${t.exportName}" references a Dockerfile at "${n.dockerfilePath}" that does not exist. Create it or fix the \`image\` path in lunora/containers.ts.`;return r.error(o),o}if(n.kind==="build"&&!p(h(e,n.buildDir))){const o=`${a} blocked: container "${t.exportName}" references a Railpack build directory "${n.buildDir}" that does not exist. Create it or fix the \`image.build\` path in lunora/containers.ts.`;return r.error(o),o}}},U=e=>b(e.format)?!1:e.interactive!==void 0?e.interactive:process.stdout.isTTY&&!process.env.CI,Ie=e=>(C(e)?.d1_databases??[]).find(r=>r.database_id===I)?.binding,Ue=async(e,r)=>{const a=N(e,"lunora").containers.filter(n=>n.image.kind==="build").map(n=>({buildDir:n.image.buildDir,exportName:n.exportName}));if(a.length===0)return;const t=await Pe({cwd:e,logger:r.logger,railpackAvailable:r.railpackAvailable,spawner:r.spawner,targets:a});return t.code===0?void 0:t.error??"railpack build failed"},Fe=(e,r,a)=>{if(a!==void 0)try{const t=Q(e,a);t.changed&&r.success(`synced ${String(a.length)} cron trigger(s) → ${t.wranglerPath??"wrangler.jsonc"}`)}catch(t){const n=t instanceof Error?t.message:String(t);r.warn(`cron trigger sync skipped: ${n}`)}},Oe=async(e,r,a,t,n)=>{try{D(t);const o=await _({projectRoot:e}),i=z(e,o,n);i.changed&&r.success(`provisioned bindings: ${i.added.join(", ")} → ${i.wranglerPath??"wrangler.jsonc"}`);for(const s of i.warnings)r.warn(s)}catch(o){const i=o instanceof Error?o.message:String(o);r.warn(`binding inference skipped: ${i}`)}try{const o=J(e);o.changed&&r.success(`bumped compatibility_date to ${o.date??"unknown"} (Workers Cache enabled) → ${o.wranglerPath??"wrangler.jsonc"}`)}catch(o){const i=o instanceof Error?o.message:String(o);r.warn(`compatibility date sync skipped: ${i}`)}Fe(e,r,a)},He=(e,r)=>{const a=h(e,v);if(!p(a))return;let t;try{t=T(S(a,"utf8")).length}catch{return}t!==0&&r.warn(`Note: \`lunora deploy\` does not push secrets. ${v} has ${String(t)} key(s); if you changed them, run \`lunora env push --yes\` to update the deployed secrets.`)},Me=async e=>{let r=[];try{r=W(await _({projectRoot:e}))}catch{}const a=B(r).map(n=>n.key);let t=[];try{const n=h(e,v);p(n)&&(t=T(S(n,"utf8")).map(o=>o.key).filter(o=>te(o)))}catch{}return[...new Set([...a,...t])]},We=async(e,r,a,t)=>{const{logger:n}=r,o=r.spawner??$,i=k(e),s=r.env===void 0?"":` --env ${r.env}`,{toolchain:c}=D(t);if(c===void 0)return n.error("deploy target has no command-line toolchain; cannot push secrets"),{minted:[],ok:!1};const d=[];for(const l of a){const g=V(),u=c.secretPut({environment:r.env,key:l,temporary:r.temporary}),m=w(i,u.tool,u.args),f=await o({args:m.args,command:m.command,cwd:e,input:g});if(f.code!==0)return n.error(`failed to push secret ${l} (exit ${String(f.code)}); set it manually with \`wrangler secret put ${l}${s}\`.`),{minted:d,ok:!1};d.push({key:l,value:g}),n.success(`generated + pushed ${l}`)}return{minted:d,ok:!0}},Be=/^[\w-]+$/u,Ve=(e,r,a)=>{if(a.length===0)return;const t=a.map(s=>s.key).join(", ");if(r.env!==void 0&&!Be.test(r.env)){r.logger.warn(`${t}: minted and pushed for --env ${r.env}, but "${r.env}" isn't a safe filename fragment — the value could not be recorded. Capture it manually if you need it again.`);return}const n=r.env===void 0?v:`${v}.${r.env}`,o=h(e,n);let i=p(o)?S(o,"utf8"):"";for(const s of a)i=K(i,s.key,s.value);return q(o,i),r.logger.success(r.env===void 0?`${t}: value(s) recorded in ${n}`:`${t}: value(s) recorded in ${n} (kept separate from ${v} so \`lunora dev\` and a plain \`lunora env push\` don't inherit the --env ${r.env} value)`),n},Ke=async(e,r,a,t)=>{if(r.dryRun===!0||r.preview===!0)return{};const{logger:n}=r,o=r.env===void 0?"":` --env ${r.env}`;let i;try{i=await(r.secretLister??$e)({cwd:e,env:r.env,temporary:r.temporary})}catch{return{}}if(!i.ok)return{};const s=new Set(i.names),d=(await Me(e)).filter(u=>!s.has(u));if(d.length===0)return{};if(!a)return{error:`missing required secret(s) on the deploy target: ${d.join(", ")}. Set them with \`wrangler secret put <KEY>${o}\` (or \`lunora env generate --set\` then \`lunora env push --yes${o}\`), then re-deploy.`};for(const u of d.filter(m=>!E(m)))n.warn(`required secret ${u} is not set on the target — set it with: wrangler secret put ${u}${o}`);const l=d.filter(u=>E(u));if(l.length===0)return{};if(await(r.secretConfirm??be())(`${String(l.length)} required secret(s) not set on the target (${l.join(", ")}). Generate strong values and push them now?`)){const{minted:u,ok:m}=await We(e,r,l,t),f=Ve(e,r,u);return m?{mintedSecretsFile:f}:{error:"failed to push required secret(s) — set them manually and re-deploy",mintedSecretsFile:f}}return n.warn(`${String(l.length)} required secret(s) not set on the target: ${l.join(", ")}. Generate + push with \`lunora env generate --set\` then \`lunora env push --yes${o}\`.`),{}},qe=async(e,r)=>{const a=new re({skipAddingFilesFromTsConfig:!0}),t=h(r,"lunora");let n;try{n=O(a,t)}catch(o){const i=o instanceof Error?o.message:String(o);return e.logger.warn(`--migrate: could not discover migrations (${i}); skipping`),0}if(n.length===0)return e.logger.info("--migrate: no data migrations declared in lunora/"),0;e.logger.info(`--migrate: running ${String(n.length)} migration(s) against deployed worker`);for(const o of n){e.logger.info(`--migrate: up "${o.id}" (table "${o.table}")`);const i={cwd:r,fetchImpl:e.fetchImpl,id:o.id,logger:e.logger,prod:!0,subcommand:"up",token:e.migrateToken,url:e.migrateUrl,yes:e.migrateYes===!0},s=await Se(i);if(s.code!==0)return e.logger.error(`--migrate: migration "${o.id}" failed — see output above`),s.code;e.logger.success(`--migrate: "${o.id}" applied`)}return 0},Ye=e=>{if(!e.migrate||e.dryRun||e.preview)return;if(e.migrateUrl===void 0){const a="--migrate requires --migrate-url <https://your-worker> — the deploy target URL is only known after wrangler runs, and this gate runs before it; refusing to default to localhost";return e.logger.error(a),a}if(e.migrateYes!==!0){const a="--migrate runs production data migrations after deploy. Re-run with --migrate-yes to confirm.";return e.logger.error(a),a}const r=e.migrateToken??process.env.LUNORA_ADMIN_TOKEN;if(r===void 0||r===""){const a="admin token required for --migrate — pass --migrate-token or set LUNORA_ADMIN_TOKEN";return e.logger.error(a),a}},Ge=async(e,r,a,t,n,o,i,s)=>{let c;r?(c=new ee({name:"dots"}),c.start("running codegen")):a.info("running codegen");try{const d=F({apiSpec:t,projectRoot:e,target:n});c?.succeed("codegen complete"),c||a.success("codegen complete");const l=we(d.platformDiagnostics,a);if(l!==void 0)return{error:l};const{errorAdvisories:g,names:u,shouldBlock:m}=ie(d.advisories,s);if(m){const A=`${g.length.toString()} ERROR-level ${g.length===1?"advisory":"advisories"} (${u.join(", ")}). Pass --no-strict-advisories to downgrade this to a warning and deploy anyway.`;return a.error(A),{error:A}}const f=await M({cwd:e,logger:a,spawner:o,stdoutToStderr:i});return f.error!==void 0?{error:f.error}:{result:d}}catch(d){c?.failed("codegen failed");const l=d instanceof Error?d.message:String(d);return a.error(`codegen failed: ${l}`),{error:`codegen failed: ${l}`}}},ze=(e,r,a="deploy")=>{const t=Ie(e);if(t===void 0)return;const n=`${a} blocked: the "${t}" D1 binding has a placeholder database_id ("${I}"). Run \`wrangler d1 create <name>\` to create the database, then replace the placeholder in wrangler.jsonc with the real id before deploying.`;return r.error(n),n},Je=(e,r,a="deploy")=>{const t=C(e)?.vars;if(!t)return;const n=xe.filter(i=>typeof t[i]=="string"&&Le(t[i]));if(n.length===0)return;const o=`${a} blocked: ${n.join(", ")} in wrangler.jsonc point at localhost. A deployed Worker can't reach a loopback address, so this silently breaks scheduled-job dispatch / auth callbacks. Set each to the deployed worker's public URL (or move it to a secret with \`wrangler secret put\`) before deploying.`;return r.error(o),o},Qe=async(e,r)=>{const{info:a}=Y(r,"lunora"),t=a?.vectorMetadata??[];if(t.length===0)return;const n=[];for(const s of t){const c=ae(s.kind);if(c===void 0){e.logger.warn(`vector index "${s.index}" declares metadata "${s.property}", whose column type cannot be filtered on in Vectorize — it is stored with each vector but no filter will match it.`);continue}n.push({index:s.index,property:s.property,type:c})}if(n.length===0)return;const i=(await ne({cwd:r,entries:n,exec:w(k(r),"wrangler",[]),logger:e.logger,spawner:e.spawner??$})).filter(s=>s.status!=="failed").length;i>0&&e.logger.success(`vectorize metadata indexes ready: ${String(i)}/${String(n.length)}`)},x=5,Xe=2e3,Ze=async(e,r,a)=>{if(e.healthCheck!==!0)return;const t=a??j({cwd:r,env:e.env});if(t===void 0){const o="--health-check: the deploy succeeded, but no URL to probe could be resolved — wrangler's output carried none and this checkout has no link for this environment. Run `lunora link --url <https://your-worker>` and re-deploy, or drop --health-check.";return e.logger.error(o),{error:o,ok:!1,url:""}}const n=await me({attempts:x,baseUrl:t,delayMs:Xe,fetchImpl:e.healthFetch,paths:[fe,he],sleep:e.healthSleep});return n.error===void 0?(e.logger.success(`health check ok (${n.url})`),{ok:!0,url:n.url}):(e.logger.error(`--health-check: the deploy succeeded, but the new version did not answer after ${String(x)} attempt(s) — ${n.error}`),{error:n.error,ok:!1,url:n.url})},er=async(e,r,a,t,n,o)=>{await Qe(e,r);const i=e.migrate?await qe(e,r):0;return i===0&&n?.(),{code:i,descriptor:a,mintedSecretsFile:o,validation:t}},rr=(e,r,a)=>{const t=ze(e,r.logger,a);if(t!==void 0)return t;const n=Je(e,r.logger,a);if(n!==void 0)return n;const o=je(e,r.logger,a);return o!==void 0?o:Te(e,r.logger,r.dockerAvailable??ue,a)},tr=(e,r,a)=>{const t=_e(e);t!==void 0&&r.logger.info(`class-B composition: deploying ${t} (overrides wrangler main)`),r.temporary&&r.logger.info("temporary account: deploying to a short-lived Cloudflare account (~60min); wrangler will print a claim URL"),r.dryRun&&r.logger.info("dry run: validating + bundling without publishing"),r.outDir!==void 0&&r.logger.info(`build artifact: emitting bundle to ${r.outDir}`);const n=D(a),o={dryRun:r.dryRun,entry:t,environment:r.env,outDir:r.outDir,preview:r.preview,temporary:r.temporary};if(n.toolchain===void 0)throw new Error(`deploy target "${n.id}" has no command-line toolchain`);return n.toolchain.deploy(o)},y=(e,r)=>({code:1,descriptor:void 0,error:e,validation:{problems:[],wranglerPath:void 0},...r}),ar=(e,r)=>{if(e.problems.length===0)return!1;r.error("wrangler.jsonc validation failed:");for(const a of e.problems)r.error(` - ${a}`);return!0},nr=(e,r,a)=>{const t=b(r.format),n=r.dryRun!==!0,o=tr(e,r,a),i=w(k(e),o.tool,o.args);return{args:i.args,captureStdout:n&&!t,captureStdoutSilently:n&&t,command:i.command,cwd:e,stdoutToStderr:t&&!n}},or=async({cwd:e,descriptor:r,mintedSecretsFile:a,options:t,reblessSchemaBaseline:n,stdout:o,validation:i})=>{const s={deployedAt:new Date().toISOString(),dryRun:t.dryRun===!0,env:t.env,preview:t.preview===!0,url:t.dryRun===!0?void 0:Ce(o),workerName:R(e)};if(t.dryRun===!0||t.preview===!0)return t.healthCheck===!0&&t.logger.warn(`--health-check skipped: ${t.dryRun===!0?"a dry run publishes nothing":"a preview version serves no live traffic"}`),{code:0,deployment:s,descriptor:r,mintedSecretsFile:a,validation:i};t.temporary!==!0&&Ae({cwd:e,env:t.env,logger:t.logger,url:s.url});const c=await Ze(t,e,s.url);return c?.error!==void 0?{code:1,deployment:s,descriptor:r,healthCheck:c,mintedSecretsFile:a,validation:i}:{...await er(t,e,r,i,n,a),deployment:s,healthCheck:c}},ir=async(e,r)=>{const a=e.cwd??process.cwd(),t=U(e),n=oe(e),o={problems:[],wranglerPath:void 0},i=le(a,e.target);if(i.target===void 0){const u=i.error??"unknown deploy target";return e.logger.error(u),{error:u,validation:o}}const{target:s}=i;let c;if(!e.skipCodegen){const u=await Ge(a,t,e.logger,e.apiSpec,s,e.spawner,b(e.format),n);if(u.error!==void 0)return{error:u.error,target:s,validation:o};c=u.result}let d;if(c!==void 0){const u=ge({allowDrift:e.allowSchemaDrift===!0,codegen:c,command:r,logger:e.logger,updateBaseline:e.updateSchemaBaseline===!0});if(u.blocked)return{error:`schema drift gate blocked ${r}`,schemaDrift:{blocked:!0,reason:u.reason},target:s,validation:o};d=u.rebless}await Oe(a,e.logger,c?.cronTriggers,s,e.env);const l=rr(a,e,r);if(l!==void 0)return{error:l,target:s,validation:o};const g=G({environment:e.env,projectRoot:a});return ar(g,e.logger)?{error:"wrangler validation failed",target:s,validation:g}:{codegen:c,reblessSchemaBaseline:d,target:s,validation:g}},sr=async e=>{const r=e.cwd??process.cwd(),a=U(e),t=await ir(e,"deploy");if(t.error!==void 0){if(t.validation.problems.length>0)return{code:1,descriptor:void 0,error:t.error,validation:t.validation};const f=t.schemaDrift===void 0?void 0:{schemaDrift:t.schemaDrift};return y(t.error,f)}const{reblessSchemaBaseline:n,validation:o}=t,i=t.target,s=Ye(e);if(s!==void 0)return y(s);const c=await Ue(r,e);if(c!==void 0)return y(c);He(r,e.logger);const{error:d,mintedSecretsFile:l}=await Ke(r,e,a,i);if(d!==void 0)return e.logger.error(d),{code:1,descriptor:void 0,error:d,mintedSecretsFile:l,validation:o};const g=nr(r,e,i);e.logger.info(`deploying via ${g.command} ${g.args.join(" ")}`);const m=await(e.spawner??$)(g);return g.captureStdoutSilently===!0&&m.stdout!==void 0&&m.stdout!==""&&process.stderr.write(m.stdout),m.code!==0?{code:m.code,descriptor:g,mintedSecretsFile:l,validation:o}:or({cwd:r,descriptor:g,mintedSecretsFile:l,options:e,reblessSchemaBaseline:n,stdout:m.stdout,validation:o})},cr=async e=>{const r=ve("deploy",e.format);if(r!==void 0)return e.logger.error(r),y(r);const a=await sr({...e,logger:pe(e.format,e.logger)});if(b(e.format))return ye(a),a;if(a.code===0&&e.dryRun!==!0&&e.preview!==!0)Ee({cwd:e.cwd??process.cwd(),env:e.env,logger:e.logger,migrated:e.migrate===!0,mintedSecretsFile:a.mintedSecretsFile,url:a.deployment?.url});else if(a.code===0&&e.preview===!0){const t=a.deployment?.url;e.logger.success(t===void 0?"preview version uploaded":`preview version uploaded — ${t}`)}return a},Nr=ce(async({cwd:e,logger:r,options:a})=>({code:(await cr({allowSchemaDrift:a.allowSchemaDrift===!0,apiSpec:se(a.apiSpec),cwd:e,dryRun:a.dryRun===!0,env:a.env,format:a.format,healthCheck:a.healthCheck===!0,logger:r,migrate:a.migrate===!0,migrateToken:a.migrateToken,migrateUrl:j({cwd:e,env:a.env,url:a.migrateUrl}),migrateYes:a.migrateYes===!0,preview:a.preview===!0,skipCodegen:a.prebuilt===!0,strictAdvisories:a.strictAdvisories,target:a.target,temporary:a.temporary===!0,updateSchemaBaseline:a.updateSchemaBaseline===!0})).code}));export{Nr as execute,cr as runDeployCommand,ir as runPreDeployPipeline};