@tailor-platform/sdk 2.13.0 → 2.13.1
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/CHANGELOG.md +10 -0
- package/dist/cli/lib.mjs +1 -1
- package/dist/cli/main.mjs +1 -1
- package/dist/completion/zsh-worker.zsh +1 -1
- package/dist/plugin/builtin/seed/index.mjs +1 -1
- package/dist/{register-ts-hook-CoZS-8Mx.mjs → register-ts-hook-BJmGCQAA.mjs} +8 -8
- package/dist/register-ts-hook-BJmGCQAA.mjs.map +1 -0
- package/dist/{seed-CMkupmX8.mjs → seed-CCc9Xk66.mjs} +2 -2
- package/dist/seed-CCc9Xk66.mjs.map +1 -0
- package/package.json +5 -5
- package/dist/register-ts-hook-CoZS-8Mx.mjs.map +0 -1
- package/dist/seed-CMkupmX8.mjs.map +0 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{t as e}from"./schema-6d_OHyZf.mjs";import{t}from"./wait-point-registry-B-ESkTZX.mjs";import{$ as n,At as r,B as i,C as a,Ct as o,D as s,Dt as c,Et as l,G as u,Gt as d,I as f,It as p,Jt as m,K as h,L as g,Lt as _,M as v,Mt as y,N as b,Nt as x,O as S,Ot as C,P as w,Pt as ee,Q as te,R as ne,Rt as re,S as ie,Tt as ae,U as oe,Ut as se,V as ce,W as le,Wt as ue,X as de,Xt as fe,Y as pe,Yt as me,_ as he,_t as ge,a as _e,at as ve,b as ye,bt as be,ct as xe,d as Se,dt as Ce,en as we,et as T,f as Te,ft as Ee,g as De,gt as Oe,h as E,ht as ke,i as Ae,it as je,j as Me,jt as Ne,k as Pe,kt as Fe,l as D,lt as Ie,mt as Le,nn as Re,nt as ze,o as Be,ot as Ve,p as He,pt as Ue,qt as We,r as Ge,rn as Ke,rt as qe,s as Je,st as Ye,t as Xe,tn as Ze,tt as O,u as Qe,ut as $e,v as et,vt as tt,w as nt,wt as rt,x as it,xt as at,y as k,yt as ot,zt as st}from"./workspace_resource_pb-u9bj6p3i.mjs";import{t as A}from"./assert-WeXvmG4j.mjs";import{a as ct,i as j,n as M,o as lt,r as N,s as ut,t as dt}from"./logger-CCjs1DuH.mjs";import{$ as ft,B as pt,C as mt,D as ht,E as gt,F as _t,H as P,I as vt,J as yt,K as bt,L as xt,M as St,N as Ct,O as wt,P as Tt,Q as F,R as Et,S as Dt,T as Ot,U as kt,V as At,W as jt,X as Mt,Y as I,Z as Nt,at as Pt,b as Ft,c as It,et as Lt,g as Rt,h as zt,i as Bt,it as Vt,l as Ht,n as Ut,nt as Wt,o as Gt,ot as Kt,p as qt,q as Jt,r as Yt,rt as Xt,s as Zt,t as Qt,tt as $t,v as en,w as tn,x as nn,y as rn}from"./application-D3HlhR3i.mjs";import{_ as an,d as on,g as sn,l as cn,t as ln,v as un,x as dn,y as fn}from"./service-BzsSm2f6.mjs";import{t as L}from"./multiline-EyzjEwn9.mjs";import{t as pn}from"./package-json-C690ceex.mjs";import{t as mn}from"./user-agent-vdHYF3QL.mjs";import{a as hn,i as gn,n as _n,o as vn,t as R}from"./errors-BlX4gUw5.mjs";import{n as yn,r as bn}from"./secret-file-C9wp_FCX.mjs";import{r as z}from"./telemetry-Bklv9kQY.mjs";import{n as xn,t as Sn}from"./field-column-type-QMtF6lUp.mjs";import{a as Cn,i as wn,o as Tn,r as En,s as Dn,t as On}from"./seed-CMkupmX8.mjs";import*as kn from"node:module";import*as B from"pathe";import{basename as An,dirname as jn,join as Mn,resolve as Nn}from"pathe";import{resolveTSConfig as Pn}from"pkg-types";import{arg as V,createDefineCommand as Fn,defineCommand as In,runCommand as Ln}from"politty";import{z as H}from"zod";import{create as U,createRegistry as Rn,fromJson as zn,toJson as Bn}from"@bufbuild/protobuf";import*as W from"node:fs";import{mkdirSync as Vn,readFileSync as Hn,renameSync as Un,rmSync as Wn,statSync as Gn,utimesSync as Kn,writeFileSync as qn}from"node:fs";import{parseEnv as Jn}from"node:util";import{ValueSchema as Yn,timestampDate as G}from"@bufbuild/protobuf/wkt";import{formatDistanceToNowStrict as Xn}from"date-fns";import{pathToFileURL as Zn}from"node:url";import{parseYAML as Qn,stringifyYAML as $n}from"confbox";import{findUpSync as er}from"find-up-simple";import{lt as tr}from"semver";import{xdgConfig as nr}from"xdg-basedir";import{Code as K,ConnectError as q}from"@connectrpc/connect";import rr from"p-limit";import*as ir from"node:crypto";import{createHash as ar,randomUUID as or}from"node:crypto";import{ExitPromptError as sr}from"@inquirer/core";import{confirm as cr,input as lr,password as ur,select as dr}from"@inquirer/prompts";import{isCI as fr}from"std-env";import*as pr from"rolldown";import{parseSync as mr}from"oxc-parser";import*as hr from"inflection";import{tmpdir as gr}from"node:os";import{pathToString as _r,usedTypes as vr}from"@bufbuild/protobuf/reflect";import{createValidator as yr}from"@bufbuild/protovalidate";import*as J from"node:fs/promises";import{mkdir as br,readFile as xr,rename as Sr,rm as Cr,writeFile as wr}from"node:fs/promises";import{setTimeout as Tr}from"timers/promises";import{setTimeout as Er}from"node:timers/promises";import{spawn as Dr}from"node:child_process";import*as Or from"fs";import{lookup as kr}from"mime-types";import{createPrompt as Ar}from"@toiroakr/read-multiline";import{astVisitor as jr,parse as Mr}from"pgsql-ast-parser";import{parse as Nr}from"@0no-co/graphql.web";const Pr={ms:1,s:1e3,m:6e4},Fr=/^(\d+)(ms|s|m)$/,Ir=H.string().refine(e=>Fr.test(e),{message:`Invalid duration format. Expected format: '3s', '500ms', '1m'`}).refine(e=>{let t=e.match(Fr);if(!t)return!1;let n=t[1];return n!==void 0&&parseInt(n,10)>0},{message:`Duration must be greater than 0`});function parseDuration(e){let t=A(e.match(Fr),`invalid duration format: ${e}`),n=parseInt(A(t[1],`duration digits group missing`),10),r=A(t[2],`duration unit group missing`);return n*Pr[r]}const Lr=H.coerce.number().int().positive(),Rr=H.coerce.number().int().nonnegative(),zr=H.enum([`asc`,`desc`]);function toPageDirection(e){if(e!==void 0)return e===`asc`?Ke.ASC:Ke.DESC}function hasMachineUserFlag(e){return e.slice(0,e.indexOf(`--`)===-1?e.length:e.indexOf(`--`)).some(e=>e===`-m`||e.startsWith(`-m=`)||e===`--machine-user`||e.startsWith(`--machine-user=`)||e===`--machineUser`||e.startsWith(`--machineUser=`)||e===`--machineuser`||e.startsWith(`--machineuser=`))}function resolveMachineUserInputSource(e,t=process.argv.slice(2),n={}){if(e!==void 0)return n.valueIsExplicit||hasMachineUserFlag(t)?`option`:process.env.TAILOR_PLATFORM_MACHINE_USER_NAME===e?`env`:`option`}function loadEnvFiles(e,t){let n=new Set(Object.keys(process.env)),load=(e,t)=>{for(let r of[e??[]].flat()){let e=B.resolve(process.cwd(),r);if(!W.existsSync(e)){if(t)throw Error(`Environment file not found: ${e}`);continue}let i=W.readFileSync(e,`utf-8`),a=Jn(i);for(let[e,t]of Object.entries(a))n.has(e)||(process.env[e]=t)}};load(e,!0),load(t,!1)}function createCommonArgs(e={}){return{"env-file":V(H.string().optional(),{alias:`e`,description:`Path to the environment file (error if not found)`,completion:{type:`file`,matcher:[`.env.*`,`.env`]}}),"env-file-if-exists":V(H.string().optional(),{description:`Path to the environment file (ignored if not found)`,completion:{type:`file`,matcher:[`.env.*`,`.env`]},effect:(e,{args:t})=>{loadEnvFiles(t[`env-file`],t[`env-file-if-exists`])}}),verbose:V(H.boolean().default(!1),{...e.verboseAlias===void 0?{}:{alias:e.verboseAlias},description:`Enable verbose logging`,effect:e=>{M.verbose=e}}),json:V(H.boolean().default(!1),{alias:`j`,description:`Output as JSON`,effect:e=>{M.jsonMode=e}})}}const Br=createCommonArgs(),Y={"workspace-id":V(H.string().optional(),{alias:`w`,description:`Workspace ID`,env:`TAILOR_PLATFORM_WORKSPACE_ID`,completion:{type:`none`}}),profile:V(H.string().optional(),{alias:`p`,description:`Workspace profile`,env:`TAILOR_PLATFORM_PROFILE`,completion:{type:`none`}})},Vr=`tailor.config.ts`;function formatConfigArg(e){if(!e)return;let t=B.relative(process.cwd(),e);if(t!==`tailor.config.ts`)return`--config=${t}`}const Hr={config:V(H.string().default(Vr),{alias:`c`,description:`Path to Tailor config file`,env:`TAILOR_CONFIG_PATH`,completion:{type:`file`,extensions:[`ts`]}})},Ur={config:V(H.string().default(Vr),{alias:`c`,description:`Path to SDK config file. Use comma-separated paths to deploy multiple apps together.`,env:`TAILOR_PLATFORM_SDK_CONFIG_PATH`,completion:{type:`file`,extensions:[`ts`]}})},Wr={...Y,...Hr},Gr={yes:V(H.boolean().default(!1),{alias:`y`,description:`Skip confirmation prompts`})},Kr={"organization-id":V(H.string(),{alias:`o`,description:`Organization ID`,env:`TAILOR_PLATFORM_ORGANIZATION_ID`,completion:{type:`none`}})},paginationArgs=(e=`desc`)=>({order:V(zr.default(e),{description:`Sort order (asc or desc)`}),limit:V(Rr.optional(),{alias:`l`,description:`Maximum number of items to return (0 or omit: unlimited)`})}),qr={order:V(zr.default(`desc`),{description:`Sort order (asc or desc)`}),limit:V(Rr.default(50),{alias:`l`,description:`Maximum number of items to return (0: unlimited)`})},Jr={"folder-id":V(H.string(),{alias:`f`,description:`Folder ID`,env:`TAILOR_PLATFORM_FOLDER_ID`,completion:{type:`none`}})},X=Fn(),Yr=H.union([H.string(),H.number(),H.boolean()]),Xr=H.union([H.string(),H.number()]),Zr=H.union([Yr,H.strictObject({value:Xr,allowSecretReason:H.string().min(1,{message:`'allowSecretReason' must state why the value is safe to keep in 'env'.`})})]),Qr=H.enum(Kt),$r=H.string().refine(e=>Qr.safeParse(e.trim().toUpperCase()).success,{message:`'logLevel' must be one of: ${Kt.join(`, `)}.`}),ei=H.strictObject({id:H.uuid({message:`'id' must be a UUID.`}).optional(),name:H.string().min(1,{message:`'name' must be a non-empty string.`}),env:H.record(H.string(),Zr).optional(),cors:H.array(H.string()).optional(),allowedIpAddresses:H.array(H.string()).optional(),disableIntrospection:H.boolean().optional(),inlineSourcemap:H.boolean().optional(),logLevel:$r.optional(),db:H.unknown().optional(),resolver:H.unknown().optional(),idp:H.unknown().optional(),auth:H.unknown().optional(),executor:H.unknown().optional(),workflow:H.unknown().optional(),httpAdapter:H.unknown().optional(),staticWebsites:H.unknown().optional(),aiGateways:H.unknown().optional(),secrets:H.unknown().optional()}),ti=H.looseObject({id:H.string(),description:H.string(),importPath:H.string().optional(),pluginConfig:H.unknown().optional(),tableConfigRequired:H.union([H.boolean(),dn]).optional(),onTableLoaded:dn.optional(),onNamespaceLoaded:dn.optional(),onTailorDBReady:dn.optional(),onResolverReady:dn.optional(),onExecutorReady:dn.optional()}).refine(e=>!(e.onTableLoaded||e.onNamespaceLoaded)||!!e.importPath,{message:`importPath is required when plugin has definition-time hooks (onTableLoaded/onNamespaceLoaded)`}).transform(e=>e),ni=`tailor-platform-cli`;let ri;async function getEntryClass(){if(ri!==void 0)return ri;try{let e=await import(`@napi-rs/keyring`),t=new e.Entry(ni,`__probe__`);t.setPassword(`probe`),t.deletePassword(),ri=e.Entry}catch{M.warn(`System keyring is not available. Tokens will be stored in the config file. Set TAILOR_PLATFORM_TOKEN environment variable for CI environments.`),ri=!1}return ri}async function isKeyringAvailable(){return await getEntryClass()!==!1}async function loadKeyringTokens(e){let t=await getEntryClass();if(t)try{let n=new t(ni,e).getPassword();return n===null?void 0:JSON.parse(n)}catch{return}}async function saveKeyringTokens(e,t){let n=await getEntryClass();n&&new n(ni,e).setPassword(JSON.stringify(t))}async function deleteKeyringTokens(e){let t=await getEntryClass();if(t)try{new t(ni,e).deletePassword()}catch{}}const ii=H.object({user:H.string(),workspace_id:H.string(),readonly:H.boolean().optional(),machine_user:H.string().optional(),machine_user_override:H.enum([`allow`,`deny`]).optional(),platform_url:H.url().optional(),oauth2_client_id:H.string().optional(),console_url:H.url().optional()}),ai=H.object({access_token:H.string(),refresh_token:H.string().optional(),token_expires_at:H.string()}),oi=H.object({storage:H.literal(`keyring`),token_expires_at:H.string()}),si=H.object({storage:H.literal(`file`),token_expires_at:H.string(),access_token:H.string(),refresh_token:H.string().optional()}),ci=H.discriminatedUnion(`storage`,[oi,si]),li=oi.extend({email:H.string().optional()}),ui=si.extend({email:H.string().optional()}),di=H.discriminatedUnion(`storage`,[li,ui]),fi=H.object({version:H.literal(1),users:H.partialRecord(H.string(),ai),profiles:H.partialRecord(H.string(),ii),current_user:H.string().nullable()}),pi=`2.0.0`,mi=H.templateLiteral([H.number().int(),`.`,H.number().int(),`.`,H.number().int()]),hi=H.object({version:H.literal(2),min_sdk_version:mi,latest_version:H.number().int().optional(),latest_min_sdk_version:mi.optional(),users:H.partialRecord(H.string(),ci),profiles:H.partialRecord(H.string(),ii),current_user:H.string().nullable()}),gi=H.object({version:H.literal(3),min_sdk_version:mi,latest_version:H.number().int().optional(),latest_min_sdk_version:mi.optional(),users:H.partialRecord(H.string(),di),profiles:H.partialRecord(H.string(),ii),current_user:H.string().nullable()});function platformConfigPath(){if(!nr)throw Error(`User home directory not found`);return B.join(nr,`tailor-platform`,`config.yaml`)}function platformConfigFromProfile(e){let t={...e?.platform_url?{platformUrl:e.platform_url}:{},...e?.oauth2_client_id?{oauth2ClientId:e.oauth2_client_id}:{},...e?.console_url?{consoleUrl:e.console_url}:{}};return Object.keys(t).length>0?t:void 0}function platformUserKey(e,t){let n=Mt(t);return n===$t(`https://api.tailor.tech`)?e:`${n}|${e}`}function userFromPlatformUserKey(e,t){let n=`${Mt(t)}|`;return e.startsWith(n)?e.slice(n.length):e}function canUseLegacyUserKey(e){try{return Mt()===e}catch{return!1}}function findUserByEmail(e,t,n){let r=Mt(n),i=`${r}|`,a=r===$t(pt);return Object.entries(e).find(([e,n])=>n?.email===t?a?!e.includes(`|`):e.startsWith(i):!1)}function findUserEntry(e,t,n,r={}){let i=platformUserKey(t,n),a=e.users[i];if(a)return{userKey:i,userEntry:a};let o=findUserByEmail(e.users,t,n);if(o?.[1])return{userKey:o[0],userEntry:o[1]};let s=Mt(n);if(i!==t&&(r.allowLegacyUserKey===!1||!canUseLegacyUserKey(s)))return{userKey:i,userEntry:a};let c=e.users[t];return c?{userKey:t,userEntry:c}:{userKey:i,userEntry:a}}function resolveUserTokenKey(e,t,n,r){return findUserEntry(e,t,n,r).userKey}function resolveConfigUser(e,t,n,r){let{userKey:i,userEntry:a}=findUserEntry(e,t,n,r);return a?userFromPlatformUserKey(i,n):void 0}function hasUserTokenEntry(e,t,n,r){return findUserEntry(e,t,n,r).userEntry!==void 0}function hasUserKeyForName(e,t){return e[t]!==void 0||Object.keys(e).some(e=>e.endsWith(`|${t}`))}function hasUserEmailEntry(e,t){return Object.values(e).some(e=>e?.email===t)}function hasAnyUserTokenEntry(e,t){return hasUserKeyForName(e.users,t)||hasUserEmailEntry(e.users,t)}function hasCurrentUserEntry(e,t){return hasUserKeyForName(e,t)}function migrateV1ToV2(e){let t={};for(let[n,r]of Object.entries(e.users))r&&(t[n]={access_token:r.access_token,refresh_token:r.refresh_token,token_expires_at:r.token_expires_at,storage:`file`});return{version:2,min_sdk_version:`1.29.0`,users:t,profiles:e.profiles,current_user:e.current_user}}function inferEmailFromUserId(e){return H.email().safeParse(e).success?e:void 0}function migrateV2ToV3(e){let t={};for(let[n,r]of Object.entries(e.users)){if(!r)continue;let e=inferEmailFromUserId(n);t[n]={...r,...e?{email:e}:{}}}return{version:3,min_sdk_version:pi,users:t,profiles:e.profiles,current_user:e.current_user}}function migrateV1ToV3(e){return migrateV2ToV3(migrateV1ToV2(e))}function formatUnknownError(e){return e instanceof Error?e.message:String(e)}async function trySaveTokensInKeyring(e,t){if(!await isKeyringAvailable())return!1;try{return await saveKeyringTokens(e,t),!0}catch(e){return M.warn(`System keyring failed to store credentials. Tokens will be stored in the config file. ${formatUnknownError(e)}`),!1}}async function warnIfNewerConfigAvailable(e){if(!e.latest_min_sdk_version)return;let t=(await pn()).version??`0.0.0`;tr(t,e.latest_min_sdk_version)&&M.warn(L`
|
|
1
|
+
import{t as e}from"./schema-6d_OHyZf.mjs";import{t}from"./wait-point-registry-B-ESkTZX.mjs";import{$ as n,At as r,B as i,C as a,Ct as o,D as s,Dt as c,Et as l,G as u,Gt as d,I as f,It as p,Jt as m,K as h,L as g,Lt as _,M as v,Mt as y,N as b,Nt as x,O as S,Ot as C,P as w,Pt as ee,Q as te,R as ne,Rt as re,S as ie,Tt as ae,U as oe,Ut as se,V as ce,W as le,Wt as ue,X as de,Xt as fe,Y as pe,Yt as me,_ as he,_t as ge,a as _e,at as ve,b as ye,bt as be,ct as xe,d as Se,dt as Ce,en as we,et as T,f as Te,ft as Ee,g as De,gt as Oe,h as E,ht as ke,i as Ae,it as je,j as Me,jt as Ne,k as Pe,kt as Fe,l as D,lt as Ie,mt as Le,nn as Re,nt as ze,o as Be,ot as Ve,p as He,pt as Ue,qt as We,r as Ge,rn as Ke,rt as qe,s as Je,st as Ye,t as Xe,tn as Ze,tt as O,u as Qe,ut as $e,v as et,vt as tt,w as nt,wt as rt,x as it,xt as at,y as k,yt as ot,zt as st}from"./workspace_resource_pb-u9bj6p3i.mjs";import{t as A}from"./assert-WeXvmG4j.mjs";import{a as ct,i as j,n as M,o as lt,r as N,s as ut,t as dt}from"./logger-CCjs1DuH.mjs";import{$ as ft,B as pt,C as mt,D as ht,E as gt,F as _t,H as P,I as vt,J as yt,K as bt,L as xt,M as St,N as Ct,O as wt,P as Tt,Q as F,R as Et,S as Dt,T as Ot,U as kt,V as At,W as jt,X as Mt,Y as I,Z as Nt,at as Pt,b as Ft,c as It,et as Lt,g as Rt,h as zt,i as Bt,it as Vt,l as Ht,n as Ut,nt as Wt,o as Gt,ot as Kt,p as qt,q as Jt,r as Yt,rt as Xt,s as Zt,t as Qt,tt as $t,v as en,w as tn,x as nn,y as rn}from"./application-D3HlhR3i.mjs";import{_ as an,d as on,g as sn,l as cn,t as ln,v as un,x as dn,y as fn}from"./service-BzsSm2f6.mjs";import{t as L}from"./multiline-EyzjEwn9.mjs";import{t as pn}from"./package-json-C690ceex.mjs";import{t as mn}from"./user-agent-vdHYF3QL.mjs";import{a as hn,i as gn,n as _n,o as vn,t as R}from"./errors-BlX4gUw5.mjs";import{n as yn,r as bn}from"./secret-file-C9wp_FCX.mjs";import{r as z}from"./telemetry-Bklv9kQY.mjs";import{n as xn,t as Sn}from"./field-column-type-QMtF6lUp.mjs";import{a as Cn,i as wn,o as Tn,r as En,s as Dn,t as On}from"./seed-CCc9Xk66.mjs";import*as kn from"node:module";import*as B from"pathe";import{basename as An,dirname as jn,join as Mn,resolve as Nn}from"pathe";import{resolveTSConfig as Pn}from"pkg-types";import{arg as V,createDefineCommand as Fn,defineCommand as In,runCommand as Ln}from"politty";import{z as H}from"zod";import{create as U,createRegistry as Rn,fromJson as zn,toJson as Bn}from"@bufbuild/protobuf";import*as W from"node:fs";import{mkdirSync as Vn,readFileSync as Hn,renameSync as Un,rmSync as Wn,statSync as Gn,utimesSync as Kn,writeFileSync as qn}from"node:fs";import{parseEnv as Jn}from"node:util";import{ValueSchema as Yn,timestampDate as G}from"@bufbuild/protobuf/wkt";import{formatDistanceToNowStrict as Xn}from"date-fns";import{pathToFileURL as Zn}from"node:url";import{parseYAML as Qn,stringifyYAML as $n}from"confbox";import{findUpSync as er}from"find-up-simple";import{lt as tr}from"semver";import{xdgConfig as nr}from"xdg-basedir";import{Code as K,ConnectError as q}from"@connectrpc/connect";import rr from"p-limit";import*as ir from"node:crypto";import{createHash as ar,randomUUID as or}from"node:crypto";import{ExitPromptError as sr}from"@inquirer/core";import{confirm as cr,input as lr,password as ur,select as dr}from"@inquirer/prompts";import{isCI as fr}from"std-env";import*as pr from"rolldown";import{parseSync as mr}from"oxc-parser";import*as hr from"inflection";import{tmpdir as gr}from"node:os";import{pathToString as _r,usedTypes as vr}from"@bufbuild/protobuf/reflect";import{createValidator as yr}from"@bufbuild/protovalidate";import*as J from"node:fs/promises";import{mkdir as br,readFile as xr,rename as Sr,rm as Cr,writeFile as wr}from"node:fs/promises";import{setTimeout as Tr}from"timers/promises";import{setTimeout as Er}from"node:timers/promises";import{spawn as Dr}from"node:child_process";import*as Or from"fs";import{lookup as kr}from"mime-types";import{createPrompt as Ar}from"@toiroakr/read-multiline";import{astVisitor as jr,parse as Mr}from"pgsql-ast-parser";import{parse as Nr}from"@0no-co/graphql.web";const Pr={ms:1,s:1e3,m:6e4},Fr=/^(\d+)(ms|s|m)$/,Ir=H.string().refine(e=>Fr.test(e),{message:`Invalid duration format. Expected format: '3s', '500ms', '1m'`}).refine(e=>{let t=e.match(Fr);if(!t)return!1;let n=t[1];return n!==void 0&&parseInt(n,10)>0},{message:`Duration must be greater than 0`});function parseDuration(e){let t=A(e.match(Fr),`invalid duration format: ${e}`),n=parseInt(A(t[1],`duration digits group missing`),10),r=A(t[2],`duration unit group missing`);return n*Pr[r]}const Lr=H.coerce.number().int().positive(),Rr=H.coerce.number().int().nonnegative(),zr=H.enum([`asc`,`desc`]);function toPageDirection(e){if(e!==void 0)return e===`asc`?Ke.ASC:Ke.DESC}function hasMachineUserFlag(e){return e.slice(0,e.indexOf(`--`)===-1?e.length:e.indexOf(`--`)).some(e=>e===`-m`||e.startsWith(`-m=`)||e===`--machine-user`||e.startsWith(`--machine-user=`)||e===`--machineUser`||e.startsWith(`--machineUser=`)||e===`--machineuser`||e.startsWith(`--machineuser=`))}function resolveMachineUserInputSource(e,t=process.argv.slice(2),n={}){if(e!==void 0)return n.valueIsExplicit||hasMachineUserFlag(t)?`option`:process.env.TAILOR_PLATFORM_MACHINE_USER_NAME===e?`env`:`option`}function loadEnvFiles(e,t){let n=new Set(Object.keys(process.env)),load=(e,t)=>{for(let r of[e??[]].flat()){let e=B.resolve(process.cwd(),r);if(!W.existsSync(e)){if(t)throw Error(`Environment file not found: ${e}`);continue}let i=W.readFileSync(e,`utf-8`),a=Jn(i);for(let[e,t]of Object.entries(a))n.has(e)||(process.env[e]=t)}};load(e,!0),load(t,!1)}function createCommonArgs(e={}){return{"env-file":V(H.string().optional(),{alias:`e`,description:`Path to the environment file (error if not found)`,completion:{type:`file`,matcher:[`.env.*`,`.env`]}}),"env-file-if-exists":V(H.string().optional(),{description:`Path to the environment file (ignored if not found)`,completion:{type:`file`,matcher:[`.env.*`,`.env`]},effect:(e,{args:t})=>{loadEnvFiles(t[`env-file`],t[`env-file-if-exists`])}}),verbose:V(H.boolean().default(!1),{...e.verboseAlias===void 0?{}:{alias:e.verboseAlias},description:`Enable verbose logging`,effect:e=>{M.verbose=e}}),json:V(H.boolean().default(!1),{alias:`j`,description:`Output as JSON`,effect:e=>{M.jsonMode=e}})}}const Br=createCommonArgs(),Y={"workspace-id":V(H.string().optional(),{alias:`w`,description:`Workspace ID`,env:`TAILOR_PLATFORM_WORKSPACE_ID`,completion:{type:`none`}}),profile:V(H.string().optional(),{alias:`p`,description:`Workspace profile`,env:`TAILOR_PLATFORM_PROFILE`,completion:{type:`none`}})},Vr=`tailor.config.ts`;function formatConfigArg(e){if(!e)return;let t=B.relative(process.cwd(),e);if(t!==`tailor.config.ts`)return`--config=${t}`}const Hr={config:V(H.string().default(Vr),{alias:`c`,description:`Path to Tailor config file`,env:`TAILOR_CONFIG_PATH`,completion:{type:`file`,extensions:[`ts`]}})},Ur={config:V(H.string().default(Vr),{alias:`c`,description:`Path to SDK config file. Use comma-separated paths to deploy multiple apps together.`,env:`TAILOR_PLATFORM_SDK_CONFIG_PATH`,completion:{type:`file`,extensions:[`ts`]}})},Wr={...Y,...Hr},Gr={yes:V(H.boolean().default(!1),{alias:`y`,description:`Skip confirmation prompts`})},Kr={"organization-id":V(H.string(),{alias:`o`,description:`Organization ID`,env:`TAILOR_PLATFORM_ORGANIZATION_ID`,completion:{type:`none`}})},paginationArgs=(e=`desc`)=>({order:V(zr.default(e),{description:`Sort order (asc or desc)`}),limit:V(Rr.optional(),{alias:`l`,description:`Maximum number of items to return (0 or omit: unlimited)`})}),qr={order:V(zr.default(`desc`),{description:`Sort order (asc or desc)`}),limit:V(Rr.default(50),{alias:`l`,description:`Maximum number of items to return (0: unlimited)`})},Jr={"folder-id":V(H.string(),{alias:`f`,description:`Folder ID`,env:`TAILOR_PLATFORM_FOLDER_ID`,completion:{type:`none`}})},X=Fn(),Yr=H.union([H.string(),H.number(),H.boolean()]),Xr=H.union([H.string(),H.number()]),Zr=H.union([Yr,H.strictObject({value:Xr,allowSecretReason:H.string().min(1,{message:`'allowSecretReason' must state why the value is safe to keep in 'env'.`})})]),Qr=H.enum(Kt),$r=H.string().refine(e=>Qr.safeParse(e.trim().toUpperCase()).success,{message:`'logLevel' must be one of: ${Kt.join(`, `)}.`}),ei=H.strictObject({id:H.uuid({message:`'id' must be a UUID.`}).optional(),name:H.string().min(1,{message:`'name' must be a non-empty string.`}),env:H.record(H.string(),Zr).optional(),cors:H.array(H.string()).optional(),allowedIpAddresses:H.array(H.string()).optional(),disableIntrospection:H.boolean().optional(),inlineSourcemap:H.boolean().optional(),logLevel:$r.optional(),db:H.unknown().optional(),resolver:H.unknown().optional(),idp:H.unknown().optional(),auth:H.unknown().optional(),executor:H.unknown().optional(),workflow:H.unknown().optional(),httpAdapter:H.unknown().optional(),staticWebsites:H.unknown().optional(),aiGateways:H.unknown().optional(),secrets:H.unknown().optional()}),ti=H.looseObject({id:H.string(),description:H.string(),importPath:H.string().optional(),pluginConfig:H.unknown().optional(),tableConfigRequired:H.union([H.boolean(),dn]).optional(),onTableLoaded:dn.optional(),onNamespaceLoaded:dn.optional(),onTailorDBReady:dn.optional(),onResolverReady:dn.optional(),onExecutorReady:dn.optional()}).refine(e=>!(e.onTableLoaded||e.onNamespaceLoaded)||!!e.importPath,{message:`importPath is required when plugin has definition-time hooks (onTableLoaded/onNamespaceLoaded)`}).transform(e=>e),ni=`tailor-platform-cli`;let ri;async function getEntryClass(){if(ri!==void 0)return ri;try{let e=await import(`@napi-rs/keyring`),t=new e.Entry(ni,`__probe__`);t.setPassword(`probe`),t.deletePassword(),ri=e.Entry}catch{M.warn(`System keyring is not available. Tokens will be stored in the config file. Set TAILOR_PLATFORM_TOKEN environment variable for CI environments.`),ri=!1}return ri}async function isKeyringAvailable(){return await getEntryClass()!==!1}async function loadKeyringTokens(e){let t=await getEntryClass();if(t)try{let n=new t(ni,e).getPassword();return n===null?void 0:JSON.parse(n)}catch{return}}async function saveKeyringTokens(e,t){let n=await getEntryClass();n&&new n(ni,e).setPassword(JSON.stringify(t))}async function deleteKeyringTokens(e){let t=await getEntryClass();if(t)try{new t(ni,e).deletePassword()}catch{}}const ii=H.object({user:H.string(),workspace_id:H.string(),readonly:H.boolean().optional(),machine_user:H.string().optional(),machine_user_override:H.enum([`allow`,`deny`]).optional(),platform_url:H.url().optional(),oauth2_client_id:H.string().optional(),console_url:H.url().optional()}),ai=H.object({access_token:H.string(),refresh_token:H.string().optional(),token_expires_at:H.string()}),oi=H.object({storage:H.literal(`keyring`),token_expires_at:H.string()}),si=H.object({storage:H.literal(`file`),token_expires_at:H.string(),access_token:H.string(),refresh_token:H.string().optional()}),ci=H.discriminatedUnion(`storage`,[oi,si]),li=oi.extend({email:H.string().optional()}),ui=si.extend({email:H.string().optional()}),di=H.discriminatedUnion(`storage`,[li,ui]),fi=H.object({version:H.literal(1),users:H.partialRecord(H.string(),ai),profiles:H.partialRecord(H.string(),ii),current_user:H.string().nullable()}),pi=`2.0.0`,mi=H.templateLiteral([H.number().int(),`.`,H.number().int(),`.`,H.number().int()]),hi=H.object({version:H.literal(2),min_sdk_version:mi,latest_version:H.number().int().optional(),latest_min_sdk_version:mi.optional(),users:H.partialRecord(H.string(),ci),profiles:H.partialRecord(H.string(),ii),current_user:H.string().nullable()}),gi=H.object({version:H.literal(3),min_sdk_version:mi,latest_version:H.number().int().optional(),latest_min_sdk_version:mi.optional(),users:H.partialRecord(H.string(),di),profiles:H.partialRecord(H.string(),ii),current_user:H.string().nullable()});function platformConfigPath(){if(!nr)throw Error(`User home directory not found`);return B.join(nr,`tailor-platform`,`config.yaml`)}function platformConfigFromProfile(e){let t={...e?.platform_url?{platformUrl:e.platform_url}:{},...e?.oauth2_client_id?{oauth2ClientId:e.oauth2_client_id}:{},...e?.console_url?{consoleUrl:e.console_url}:{}};return Object.keys(t).length>0?t:void 0}function platformUserKey(e,t){let n=Mt(t);return n===$t(`https://api.tailor.tech`)?e:`${n}|${e}`}function userFromPlatformUserKey(e,t){let n=`${Mt(t)}|`;return e.startsWith(n)?e.slice(n.length):e}function canUseLegacyUserKey(e){try{return Mt()===e}catch{return!1}}function findUserByEmail(e,t,n){let r=Mt(n),i=`${r}|`,a=r===$t(pt);return Object.entries(e).find(([e,n])=>n?.email===t?a?!e.includes(`|`):e.startsWith(i):!1)}function findUserEntry(e,t,n,r={}){let i=platformUserKey(t,n),a=e.users[i];if(a)return{userKey:i,userEntry:a};let o=findUserByEmail(e.users,t,n);if(o?.[1])return{userKey:o[0],userEntry:o[1]};let s=Mt(n);if(i!==t&&(r.allowLegacyUserKey===!1||!canUseLegacyUserKey(s)))return{userKey:i,userEntry:a};let c=e.users[t];return c?{userKey:t,userEntry:c}:{userKey:i,userEntry:a}}function resolveUserTokenKey(e,t,n,r){return findUserEntry(e,t,n,r).userKey}function resolveConfigUser(e,t,n,r){let{userKey:i,userEntry:a}=findUserEntry(e,t,n,r);return a?userFromPlatformUserKey(i,n):void 0}function hasUserTokenEntry(e,t,n,r){return findUserEntry(e,t,n,r).userEntry!==void 0}function hasUserKeyForName(e,t){return e[t]!==void 0||Object.keys(e).some(e=>e.endsWith(`|${t}`))}function hasUserEmailEntry(e,t){return Object.values(e).some(e=>e?.email===t)}function hasAnyUserTokenEntry(e,t){return hasUserKeyForName(e.users,t)||hasUserEmailEntry(e.users,t)}function hasCurrentUserEntry(e,t){return hasUserKeyForName(e,t)}function migrateV1ToV2(e){let t={};for(let[n,r]of Object.entries(e.users))r&&(t[n]={access_token:r.access_token,refresh_token:r.refresh_token,token_expires_at:r.token_expires_at,storage:`file`});return{version:2,min_sdk_version:`1.29.0`,users:t,profiles:e.profiles,current_user:e.current_user}}function inferEmailFromUserId(e){return H.email().safeParse(e).success?e:void 0}function migrateV2ToV3(e){let t={};for(let[n,r]of Object.entries(e.users)){if(!r)continue;let e=inferEmailFromUserId(n);t[n]={...r,...e?{email:e}:{}}}return{version:3,min_sdk_version:pi,users:t,profiles:e.profiles,current_user:e.current_user}}function migrateV1ToV3(e){return migrateV2ToV3(migrateV1ToV2(e))}function formatUnknownError(e){return e instanceof Error?e.message:String(e)}async function trySaveTokensInKeyring(e,t){if(!await isKeyringAvailable())return!1;try{return await saveKeyringTokens(e,t),!0}catch(e){return M.warn(`System keyring failed to store credentials. Tokens will be stored in the config file. ${formatUnknownError(e)}`),!1}}async function warnIfNewerConfigAvailable(e){if(!e.latest_min_sdk_version)return;let t=(await pn()).version??`0.0.0`;tr(t,e.latest_min_sdk_version)&&M.warn(L`
|
|
2
2
|
A newer config version (${String(e.latest_version)}) is available.
|
|
3
3
|
Please update your SDK to >= ${e.latest_min_sdk_version}: pnpm update @tailor-platform/sdk
|
|
4
4
|
`)}async function readPlatformConfig(){let e=platformConfigPath();if(!W.existsSync(e)){let e={version:3,min_sdk_version:pi,users:{},profiles:{},current_user:null};return writePlatformConfig(e),e}let t=Qn(W.readFileSync(e,`utf-8`));yn(e);let n=typeof t==`object`&&t&&`version`in t?t.version:void 0;if(typeof n==`number`&&n>3){let e=`min_sdk_version`in t?String(t.min_sdk_version):void 0,r=e?`Please update your SDK to >= ${e}: pnpm update @tailor-platform/sdk`:`Please update your SDK: pnpm update @tailor-platform/sdk`;throw Error(L`
|
|
@@ -59,7 +59,7 @@ If a value is genuinely safe to keep in 'env', allow it where it is defined: ${a
|
|
|
59
59
|
}
|
|
60
60
|
`;W.writeFileSync(o,c);let l=i??B.dirname(s),u=await ht(l),d=St({tsconfig:u}),f=await pr.build({plugins:[Ot(o,l),gt(),wt],input:o,write:!1,output:{format:`esm`,sourcemap:!1,minify:!1,codeSplitting:!1,globals:{tailordb:`tailordb`}},external:[`tailordb`],resolve:{conditionNames:[`node`,`import`]},tsconfig:u,treeshake:{moduleSideEffects:!1,annotations:!0,unknownGlobalSideEffects:!1},...d.options});return d.assertAllResolved(),{namespace:t,migrationNumber:n,bundledCode:f.output[0].code}}function formatMigrationScriptCommand(e){let{migrationNumber:t,namespace:n,configPath:r,noScript:i}=e,a=[`tailor`,`tailordb`,`migration`,`script`,formatMigrationNumber(t),`--namespace`,n],o=formatConfigArg(r);return o!==void 0&&a.push(o),i&&a.push(`--no-script`,`--reason`,`<reason>`),_n(a)}const fo=[`⠋`,`⠙`,`⠹`,`⠸`,`⠼`,`⠴`,`⠦`,`⠧`,`⠇`,`⠏`],po=`\x1B[?25h`,mo=`\x1B[2K`,ho=/\u001B\[[0-9;]*[a-zA-Z]/g;function visibleLength(e){return e.replace(ho,``).length}const go=new Set;let _o=!1,vo=!1;function installExitHook(){_o||(_o=!0,process.on(`exit`,()=>{for(let e of go)e.cleanupOnExit()}))}function installSignalHook(){if(vo)return;vo=!0;let handler=()=>{for(let e of go)e.stop()};process.prependListener(`SIGINT`,handler),process.prependListener(`SIGTERM`,handler)}var Spinner=class{text;#e;#t;#n;#r=0;#i;#a=0;#o=!1;constructor(e={}){this.text=``,this.#e=e.indent??0,this.#t=e.stream??process.stderr,this.#n=!!this.#t.isTTY}start(e){return e!==void 0&&(this.text=e),this.#n?this.#o?this:(installExitHook(),installSignalHook(),go.add(this),this.#o=!0,this.#t.write(`\x1B[?25l`),this.#c(),this.#i=setInterval(()=>this.#c(),80),typeof this.#i.unref==`function`&&this.#i.unref(),this):(this.#u(`- ${this.text}`),this)}stop(){return this.#o?(this.#o=!1,this.#i&&=(clearInterval(this.#i),void 0),this.#n&&(this.#l(),this.#t.write(po)),go.delete(this),this):this}succeed(e){return this.#s(j.success,e)}fail(e){return this.#s(j.error,e)}warn(e){return this.#s(j.warning,e)}cleanupOnExit(){this.#i&&=(clearInterval(this.#i),void 0),this.#n&&this.#t.write(po)}#s(e,t){return t!==void 0&&(this.text=t),this.#o&&(this.#o=!1,this.#i&&=(clearInterval(this.#i),void 0),this.#n&&(this.#l(),this.#t.write(po)),go.delete(this)),this.#u(`${e} ${this.text}`),this}#c(){this.#t.write(`\x1B[?2026h`),this.#l();let e=N.info(fo[this.#r]??A(fo[0],`spinner frames empty`));this.#r=(this.#r+1)%fo.length;let t=`${` `.repeat(this.#e)}${e} ${this.text}`;this.#t.write(ut(this.#t,t)),this.#t.write(`\x1B[?2026l`);let n=this.#t.columns||80;this.#a=Math.max(1,Math.ceil(visibleLength(t)/n))}#l(){if(this.#a!==0){this.#t.write(`\r`),this.#t.write(mo);for(let e=1;e<this.#a;e++)this.#t.write(`\x1B[1A`),this.#t.write(mo);this.#a=0}}#u(e){let t=` `.repeat(this.#e);this.#t.write(ut(this.#t,`${t}${e}\n`))}};function spinner(e){return new Spinner(e)}const yo=65536;function migrationWorkflowResourceName(e,t){return`tailordb-migration--${e}--${formatMigrationNumber(t)}`}async function uploadMigrationFunction(e,t,n,r,i,a){let o=Buffer.from(r,`utf-8`),s={workspaceId:t,name:n,description:`Temporary function for a TailorDB migration`,sizeBytes:BigInt(o.length),contentHash:ir.createHash(`sha256`).update(r,`utf-8`).digest(`hex`)};async function*stream(){yield{payload:{case:`info`,value:s}};for(let e=0;e<o.length;e+=yo)yield{payload:{case:`chunk`,value:o.subarray(e,Math.min(e+yo,o.length))}}}await e.createFunctionRegistry(stream()),await writeMetadataLabelsDirect(e,await buildMetaRequest({trn:resourceTrn(t,`function_registry`,n),appName:i,appId:a}))}async function teardown(e,t,n,r){let i=[...r?[[`workflow`,()=>e.deleteWorkflow({workspaceId:t,workflowId:r})]]:[],[`job function`,()=>e.deleteWorkflowJobFunction({workspaceId:t,jobFunctionName:n})],[`function`,()=>e.deleteFunctionRegistry({workspaceId:t,name:n})]];for(let[e,t]of i)try{await t()}catch(t){if(Lt(t))continue;M.warn(`Could not remove the temporary migration ${e} '${n}': ${t instanceof Error?t.message:String(t)}. It is labeled as owned by this app and can be removed by a later deploy.`)}}async function reclaimLeftovers(e,t,n){await teardown(e,t,n,await findMigrationWorkflowId(e,t,n))}async function findMigrationWorkflowId(e,t,n){try{let{workflow:r}=await e.getWorkflowByName({workspaceId:t,workflowName:n});return r?.id}catch(e){if(Lt(e))return;throw e}}async function executeMigrationAsWorkflow(e){let{client:t,workspaceId:n,code:r,namespace:i,migrationNumber:a,invoker:o,appName:s,appId:c}=e,l=migrationWorkflowResourceName(i,a),u=e.pollIntervalMs??3e3,d;try{await reclaimLeftovers(t,n,l),await uploadMigrationFunction(t,n,l,r,s,c);let{jobFunction:e}=await t.createWorkflowJobFunction({workspaceId:n,jobFunctionName:l,scriptRef:l,publishExecutionEvents:!1});await writeMetadataLabelsDirect(t,await buildMetaRequest({trn:resourceTrn(n,`workflow_job_function`,l),appName:s,appId:c}));let i=e?.version;if(i===void 0)throw Error(`Temporary migration job function '${l}' was created without a version.`);let{workflow:a}=await t.createWorkflow({workspaceId:n,workflowName:l,mainJobFunctionName:l,jobFunctions:{[l]:i}});if(d=a?.id,!d)throw Error(`Temporary migration workflow '${l}' was created without an id.`);await writeMetadataLabelsDirect(t,await buildMetaRequest({trn:resourceTrn(n,`workflow`,l),appName:s,appId:c}));let{executionId:f}=await t.startWorkflow({workspaceId:n,workflowId:d,authInvoker:o});return await waitForMigrationWorkflow(t,n,f,u)}finally{await teardown(t,n,l,d)}}async function waitForMigrationWorkflow(e,t,n,r){for(;;){let{execution:i}=await e.getWorkflowExecution({workspaceId:t,executionId:n});if(!i)throw Error(`Migration workflow execution '${n}' not found.`);if(i.status===D.SUCCESS){let{logs:n}=await collectJobOutcomes(e,t,i);return{success:!0,logs:n}}if(i.status===D.FAILED){let n=await collectJobOutcomes(e,t,i);return{success:!1,logs:n.logs,error:extractFailureMessage(n)}}await new Promise(e=>setTimeout(e,r))}}async function collectJobOutcomes(e,t,n){let r=await Promise.all(n.jobExecutions.map(async n=>{if(n.executionId)try{let{execution:r}=await e.getFunctionExecution({workspaceId:t,executionId:n.executionId});if(!r)return;let i=r.error?.message.trim()||r.result.trim()||``;return{logs:r.logs,failure:i}}catch{return}}));return{logs:r.map(e=>e?.logs).filter(Boolean).join(`
|
|
61
61
|
`),failures:r.map(e=>e?.failure).filter(e=>!!e)}}function extractFailureMessage(e){return e.failures.at(-1)||e.logs.split(`
|
|
62
|
-
`).filter(e=>/error/i.test(e)).at(-1)?.trim()||`Migration workflow execution failed.`}async function getCurrentMigrationNumber(e,t,n){try{let r=resourceTrn(t,`tailordb`,n),{metadata:i}=await e.getMetadata({trn:r}),a=i?.labels[Yi];return a?parseMigrationLabelNumber(a)??0:0}catch(e){if(Lt(e))return 0;throw e}}async function detectPendingMigrations(e,t,n,r,i){let a=[];for(let{namespace:o,migrationsDir:s}of n){let n=i?.get(o)??await getCurrentMigrationNumber(e,t,o),c=getMigrationFiles(s);for(let e of c){if(e.number<=n)continue;let t=getMigrationFilePath(s,e.number,`diff`);if(!W.existsSync(t))continue;let i=loadDiff(t),c=getMigrationFilePath(s,e.number,`migrate`),l=W.existsSync(c);if(i.requiresMigrationScript&&!l&&!i.scriptSkipped){let t={migrationNumber:e.number,namespace:o,configPath:r};throw Error(`Migration ${o}/${formatMigrationNumber(e.number)} requires a migration script but migrate.ts was not found.\nTo resolve, either:\n - Add a script: ${formatMigrationScriptCommand(t)}\n - Or record that no script is needed: ${formatMigrationScriptCommand({...t,noScript:!0})}`)}if(i.scriptSkipped){let t=`${o}/${formatMigrationNumber(e.number)}`;if(l)throw Error(`Migration ${t} has both a --no-script skip acknowledgment and migrate.ts.\nTo resolve, either:\n - Keep the script and clear the stale acknowledgment: ${formatMigrationScriptCommand({migrationNumber:e.number,namespace:o,configPath:r})}\n - Or keep the skip: delete migrate.ts`);M.info(`Migration ${t} runs without a script (skip acknowledged at ${i.scriptSkipped.acknowledgedAt}: ${i.scriptSkipped.reason})`)}a.push({number:e.number,scriptPath:c,hasScript:l,diffPath:t,namespace:o,migrationsDir:s,diff:i})}}return a.toSorted((e,t)=>e.namespace===t.namespace?e.number-t.number:e.namespace.localeCompare(t.namespace))}async function executeSingleMigration(e,t){let{client:n,workspaceId:r,invoker:i,env:a,configDir:o,appName:s,appId:c}=e,l=await executeMigrationAsWorkflow({client:n,workspaceId:r,code:(await bundleMigrationScript(t.scriptPath,t.namespace,t.number,a,o)).bundledCode,namespace:t.namespace,migrationNumber:t.number,invoker:i,appName:s,appId:c});return{namespace:t.namespace,migrationNumber:t.number,success:l.success,logs:l.logs,error:l.error}}async function updateMigrationLabel(e,t,n,r,i){await writeMetadataLabelsDirect(e,{trn:resourceTrn(t,`tailordb`,n),labels:{[Yi]:sanitizeMigrationLabel(r),...i?{[Xi]:i}:{}},remove:i?void 0:[Xi]})}async function executeMigrations(e,t){let n=t.filter(e=>e.hasScript);if(n.length===0)return;let r=groupMigrationsByNamespace(n);for(let[t,n]of r){let r=e.dbConfig[t]?.migration,i=getMigrationMachineUser(r,e.machineUsers);if(!i)throw Error(`No machine user available for migration execution in namespace '${t}'. Either configure 'migration.machineUser' in db config or define machine users in auth config.`);let a=U(C,{namespace:e.authNamespace,machineUserName:i}),o={client:e.client,workspaceId:e.workspaceId,invoker:a,env:e.env,configDir:e.configDir,appName:e.appName,appId:e.appId};M.info(`Using machine user: ${N.bold(i)} for namespace '${t}'`);for(let e of n){let t=`${e.namespace}/${formatMigrationNumber(e.number)}`,n=spinner().start(`Executing migration ${t} (this can take a while)...`),r=await executeSingleMigration(o,e);if(r.success)n.succeed(`Migration ${t} completed successfully`),r.logs&&r.logs.trim()&&M.log(`Logs:\n${r.logs}`);else throw n.fail(`Migration ${t} failed`),r.logs&&M.error(`Logs:\n${r.logs}`),Error(r.error??`Migration failed`)}}}function getMigrationMachineUser(e,t){if(e?.machineUser)return e.machineUser;if(t&&t.length>0)return t[0]}function groupMigrationsByNamespace(e){let t=new Map;for(let n of e){let e=t.get(n.namespace)??[];e.push(n),t.set(n.namespace,e)}return t}function defineRecordEntry(e,t,n){Object.defineProperty(e,t,{value:n,enumerable:!0,writable:!0,configurable:!0})}const bo=new Set([`field_added`,`field_modified`,`field_type_modified`,`field_removed`,`field_renamed`]);function isPreMigrationFieldChange(e){return bo.has(e.kind)}function createPreMigrationSnapshotType(e,t,n){let r=structuredClone(e.fields),i=!1;for(let[e,n]of t)n.kind===`field_type_modified`&&(i=!0,defineRecordEntry(r,e,structuredClone(n.before)));let a={...e,fields:r};if(!i||!n)return a;let{typeHookExpr:o,typeValidateExpr:s,...c}=a;return{...c,...n.before.typeHookExpr&&{typeHookExpr:structuredClone(n.before.typeHookExpr)},...n.before.typeValidateExpr!==void 0&&{typeValidateExpr:n.before.typeValidateExpr}}}function buildPreMigrationChangesMap(e){let t=new Map;for(let n of e)for(let e of n.diff.changes){if(!isPreMigrationFieldChange(e)||!e.fieldName)continue;let n=t.get(e.tableName)??new Map;n.set(e.fieldName,e),t.set(e.tableName,n)}return t}function applyPreMigrationFieldAdjustments(e,t){for(let[n,r]of t){if(r.kind===`field_removed`){defineRecordEntry(e,n,convertFieldConfigToProto(r.before));continue}if(r.kind===`field_renamed`){defineRecordEntry(e,r.previousFieldName,convertFieldConfigToProto(r.before));let t=e[n];t&&(r.after.required&&(t.required=!1),(r.after.unique??!1)&&(t.unique=!1));continue}let t=e[n];if(!t)continue;if(r.kind===`field_added`){r.after.required&&(t.required=!1);continue}if(r.kind===`field_type_modified`){defineRecordEntry(e,n,convertFieldConfigToProto(r.before));continue}let{before:i,after:a}=r;if(!i.required&&a.required&&(t.required=!1),!(i.unique??!1)&&(a.unique??!1)&&(t.unique=!1),i.allowedValues&&a.allowedValues){let e=new Set(a.allowedValues.map(e=>e.value));if(i.allowedValues.filter(t=>!e.has(t.value)).length>0){let e=new Map;for(let t of i.allowedValues)e.set(t.value,t.description??``);for(let t of a.allowedValues)e.has(t.value)||e.set(t.value,t.description??``);t.allowedValues=Array.from(e.entries()).map(([e,t])=>({value:e,description:t}))}}}}function buildPreMigrationIndexChangesMap(e){let t=new Map;for(let n of e)for(let e of n.diff.changes){if(e.kind!==`index_added`&&e.kind!==`index_modified`)continue;let n=e.kind===`index_modified`?e.before:void 0;if(!isBreakingIndexChange(e.tableName,e.indexName,n,e.after))continue;let r=t.get(e.tableName)??new Map;r.set(e.indexName,e),t.set(e.tableName,r)}return t}function applyPreMigrationIndexAdjustments(e,t){for(let[n,r]of t){if(r.kind===`index_added`){delete e[n];continue}r.kind===`index_modified`&&defineRecordEntry(e,n,convertIndexToProto(r.before))}}async function captureMigrationRestrictionState(e,t,n){let r=new Map;for(let i of n){let n=await P(async(n,r)=>{let{tailordbTypes:a,nextPageToken:o}=await e.listTailorDBTypes({workspaceId:t,namespaceName:i,pageToken:n,pageSize:r});return[a,o]}),a=new Map;for(let e of n){let t=e.schema?.settings;e.name&&a.set(e.name,{bulkUpsert:t?.bulkUpsert??!1,publishRecordEvents:t?.publishRecordEvents??!1,...t?.disableGqlOperations&&{disableGqlOperations:{create:t.disableGqlOperations.create,update:t.disableGqlOperations.update,delete:t.disableGqlOperations.delete,read:t.disableGqlOperations.read}},tailordbType:structuredClone(e)})}r.set(i,a)}return r}function getAffectedTableNames(e){let t=new Set;for(let n of e.diff.changes)t.add(n.tableName);return t}function getDeletedTableNames(e){let t=new Set;for(let n of e.diff.changes)n.kind===`table_removed`?t.add(n.tableName):n.kind===`table_renamed`&&t.add(n.previousTableName);return t}const xo={created:new Set,updated:new Set,gqlPermissionsProcessed:new Set,reset(){this.created.clear(),this.updated.clear(),this.gqlPermissionsProcessed.clear()}},So={cache:new Map,reset(){this.cache.clear()},load(e){let t=`${e.namespace}/${e.number}`,n=this.cache.get(t);if(!n){let r=reconstructSnapshotFromMigrations(e.migrationsDir,e.number);if(!r)throw Error(`Cannot reconstruct snapshot for ${e.namespace} migration ${e.number}: no migrations found in ${e.migrationsDir}`);n=r,this.cache.set(t,n)}return n}};function buildSnapshotTypeManifest(e,t,n,r){let i=So.load(e).tables[t];if(!i)return;let a=n.find(t=>t.namespace===e.namespace),o=e.diff.changes.find(e=>e.kind===`table_scripts_modified`&&e.tableName===t);return generateTailorDBTypeManifestFromSnapshot(r?createPreMigrationSnapshotType(i,r,o):i,{suppressRecordEvents:!0,suppressGqlOperations:!0,namespaceGqlOperations:a?.config.gqlOperations})}async function awaitAllSettledOrThrow(e){let t=(await Promise.allSettled(e.filter(e=>e!==void 0))).find(e=>e.status===`rejected`);if(t)throw t.reason}async function executeSingleMigrationPrePhase(e,t,n,r,i){let a=buildPreMigrationChangesMap([n]),o=buildPreMigrationIndexChangesMap([n]),s=getAffectedTableNames(n),c=new Set(xo.created);for(let l of t.type.creates){let t=l.request.tailordbType?.name;if(!t||!s.has(t)||c.has(t))continue;let u=a.get(t),d=buildSnapshotTypeManifest(n,t,r,u);if(!d)continue;let f=structuredClone(l.request);f.tailordbType=d,u&&u.size>0&&f.tailordbType.schema?.fields&&applyPreMigrationFieldAdjustments(f.tailordbType.schema.fields,u);let p=o.get(t);p&&p.size>0&&f.tailordbType.schema?.indexes&&applyPreMigrationIndexAdjustments(f.tailordbType.schema.indexes,p),xo.created.add(t),i.add(t),await e.createTailorDBType(f)}for(let l of t.type.creates){let t=l.request.tailordbType?.name;if(!t||!s.has(t)||!c.has(t))continue;let u=a.get(t),d=buildSnapshotTypeManifest(n,t,r,u);if(!d)continue;let f=structuredClone(d);u&&u.size>0&&f.schema?.fields&&applyPreMigrationFieldAdjustments(f.schema.fields,u);let p=o.get(t);p&&p.size>0&&f.schema?.indexes&&applyPreMigrationIndexAdjustments(f.schema.indexes,p),xo.updated.add(t),i.add(t),await e.updateTailorDBType({workspaceId:l.request.workspaceId,namespaceName:l.request.namespaceName,tailordbType:f})}for(let c of t.type.updates){let t=c.request.tailordbType?.name;if(!t||!s.has(t))continue;let l=a.get(t),u=buildSnapshotTypeManifest(n,t,r,l);if(!u)continue;let d=structuredClone(c.request);d.tailordbType=u,l&&l.size>0&&d.tailordbType.schema?.fields&&applyPreMigrationFieldAdjustments(d.tailordbType.schema.fields,l);let f=o.get(t);f&&f.size>0&&d.tailordbType.schema?.indexes&&applyPreMigrationIndexAdjustments(d.tailordbType.schema.indexes,f),xo.updated.add(t),i.add(t),await e.updateTailorDBType(d)}let l=new Set(Object.keys(So.load(n).tables)),permissionKey=e=>`${n.namespace}/${e}`,u=t.gqlPermission.creates.filter(e=>e.request.namespaceName===n.namespace&&l.has(e.name)&&!xo.gqlPermissionsProcessed.has(permissionKey(e.name))),d=t.gqlPermission.updates.filter(e=>e.request.namespaceName===n.namespace&&l.has(e.name)&&!xo.gqlPermissionsProcessed.has(permissionKey(e.name)));if(u.length+d.length>0){let a=new Set(u.map(e=>e.name)),o=t.type.creates.filter(e=>{let t=e.request.tailordbType?.name;return e.request.namespaceName===n.namespace&&t&&a.has(t)&&!xo.created.has(t)});if(o.length>0)for(let t of o){let a=t.request.tailordbType?.name;if(!a)continue;let o=buildSnapshotTypeManifest(n,a,r);if(!o)continue;xo.created.add(a),i.add(a);let s=structuredClone(t.request);s.tailordbType=o,await e.createTailorDBType(s)}await awaitAllSettledOrThrow([...u.map(t=>e.createTailorDBGQLPermission(t.request)),...d.map(t=>e.updateTailorDBGQLPermission(t.request))]);for(let e of[...u.map(e=>e.name),...d.map(e=>e.name)])xo.gqlPermissionsProcessed.add(permissionKey(e))}}const Co={types:new Set,gqlPermissions:new Set,reset(){this.types.clear(),this.gqlPermissions.clear()}};async function rollbackSingleMigrationAfterFailure(e,t,n,r,i){try{await rollbackSingleMigrationPrePhase(e,t,n,r,i)}catch(e){M.warn(`Failed to roll back migration ${t.namespace}/${formatMigrationNumber(t.number)}: ${e instanceof Error?e.message:String(e)}`)}}async function executeSingleMigrationPostPhase(e,t,n,r,i){let a=buildPreMigrationChangesMap([n]),o=buildPreMigrationIndexChangesMap([n]),s=new Set([...a.keys(),...o.keys()]),c=getAffectedTableNames(n);try{for(let a of t.type.creates){let t=a.request.tailordbType?.name;if(!t||!c.has(t)||!s.has(t))continue;let o=buildSnapshotTypeManifest(n,t,r);o&&(i.add(t),await e.updateTailorDBType({workspaceId:a.request.workspaceId,namespaceName:a.request.namespaceName,tailordbType:o}))}for(let a of t.type.updates){let t=a.request.tailordbType?.name;if(!t||!c.has(t)||!s.has(t))continue;let o=buildSnapshotTypeManifest(n,t,r);o&&(i.add(t),await e.updateTailorDBType({workspaceId:a.request.workspaceId,namespaceName:a.request.namespaceName,tailordbType:o}))}}catch(e){handleOptionalToRequiredError(e,[`This error occurred during post-migration phase. Please check your migration script.`,`Ensure all existing records have values for fields being changed to required.`])}}function acceptsMigrationWrites(e){let t=e.disableGqlOperations;return e.publishRecordEvents||e.bulkUpsert||t?.create!==!0||t.update!==!0||t.delete!==!0}async function rewriteRestrictedTables(e,t){let{workspaceId:n,namespaceName:r,snapshot:i,input:a,executorUsedTables:o,settingsState:s,restricted:c,continueOnError:l=!1}=t,u,d=new Set([...Object.keys(i.tables),...s?.keys()??[]]);for(let t of d)try{let l=i.tables[t],u=s?.get(t);if(s&&!u||c&&(!u||!acceptsMigrationWrites(u)))continue;let d=l?c?generateTailorDBTypeManifestFromSnapshot(l,{suppressRecordEvents:!0,suppressGqlOperations:!0,namespaceGqlOperations:a.config.gqlOperations}):generateTailorDBTypeManifestFromSnapshot(l,{subscribed:o.has(t),namespaceGqlOperations:a.config.gqlOperations}):u?.tailordbType?structuredClone(u.tailordbType):void 0;if(!d?.schema)continue;d.schema.settings??={};let f=d.schema.settings;c&&(f.bulkUpsert=!1,f.publishRecordEvents=!1,f.disableGqlOperations={create:!0,update:!0,delete:!0,read:!0}),!c&&u&&(f.bulkUpsert=u.bulkUpsert,f.publishRecordEvents=u.publishRecordEvents,f.disableGqlOperations=u.disableGqlOperations?{...u.disableGqlOperations}:void 0),await e.updateTailorDBType({workspaceId:n,namespaceName:r,tailordbType:d})}catch(e){if(!l)throw e;u??=e instanceof Error?e:Error(String(e),{cause:e})}if(u!==void 0)throw u}function resolveMigrationSnapshotSettings(e,t,n){let r=new Map;for(let[i,a]of Object.entries(e.tables)){let e=generateTailorDBTypeManifestFromSnapshot(a,{subscribed:!1,namespaceGqlOperations:t.config.gqlOperations}).schema?.settings;e&&r.set(i,{bulkUpsert:e.bulkUpsert??!1,publishRecordEvents:a.settings?.publishEvents??n.has(i),...e.disableGqlOperations&&{disableGqlOperations:{create:e.disableGqlOperations.create??!1,update:e.disableGqlOperations.update??!1,delete:e.disableGqlOperations.delete??!1,read:e.disableGqlOperations.read??!1}}})}return r}async function applyMigrationRestrictions(e,t,n,r,i,a){for(let[o,s]of t){let t=r.find(e=>e.namespace===o);t&&await rewriteRestrictedTables(e,{workspaceId:a,namespaceName:o,snapshot:s,input:t,executorUsedTables:i,settingsState:n.get(o)??new Map,restricted:!0})}}async function restoreMigrationRestrictions(e,t,n,r,i,a){let o;for(let[s,c]of t){let t=r.find(e=>e.namespace===s);if(t)try{await rewriteRestrictedTables(e,{workspaceId:a,namespaceName:s,snapshot:c,input:t,executorUsedTables:i,settingsState:n?.get(s),restricted:!1,continueOnError:!0})}catch(e){o??=e instanceof Error?e:Error(String(e),{cause:e})}}if(o!==void 0)throw o}async function executeSingleMigrationPostPhaseDeletions(e,t,n){let r=getDeletedTableNames(n);if(r.size>0){let n=t.gqlPermission.deletes.filter(e=>{let t=`${e.request.namespaceName}/${e.name}`;if(Co.gqlPermissions.has(t))return!1;let n=e.name;return r.has(n)});for(let t of n)await e.deleteTailorDBGQLPermission(t.request),Co.gqlPermissions.add(`${t.request.namespaceName}/${t.name}`);let i=t.type.deletes.filter(e=>{let t=e.name;return!t||Co.types.has(t)?!1:r.has(t)});for(let t of i)await e.deleteTailorDBType(t.request),Co.types.add(t.name)}}async function rollbackSingleMigrationPrePhase(e,t,n,r,i){if(t.number<=0||i.size===0)return;let a=reconstructSnapshotFromMigrations(t.migrationsDir,t.number-1);if(!a){M.warn(`Cannot roll back migration ${t.namespace}/${formatMigrationNumber(t.number)}: prior snapshot (migration ${formatMigrationNumber(t.number-1)}) could not be reconstructed. Leaving schema as-is; manual repair may be required.`);return}let o=r.find(e=>e.namespace===t.namespace);M.warn(`Migration ${t.namespace}/${formatMigrationNumber(t.number)} failed; rolling back its pre-migration schema changes.`);let s=[...i].flatMap(e=>{let t=a.tables[e];return t?[{tableName:e,priorTable:t}]:[]}),c=[...i].filter(e=>!a.tables[e]);for(let{tableName:r,priorTable:i}of s)try{let r=generateTailorDBTypeManifestFromSnapshot(i,{suppressRecordEvents:!0,suppressGqlOperations:!0,namespaceGqlOperations:o?.config.gqlOperations});await e.updateTailorDBType({workspaceId:n,namespaceName:t.namespace,tailordbType:r})}catch(e){M.warn(`Failed to roll back table '${r}' in namespace '${t.namespace}': ${e instanceof Error?e.message:String(e)}`)}for(let r of c)try{await e.deleteTailorDBGQLPermission({workspaceId:n,namespaceName:t.namespace,typeName:r}).catch(()=>void 0),await e.deleteTailorDBType({workspaceId:n,namespaceName:t.namespace,tailordbTypeName:r})}catch(e){M.warn(`Failed to roll back table '${r}' in namespace '${t.namespace}': ${e instanceof Error?e.message:String(e)}`)}}function toTailorDBDeployInput(e){let t={};for(let[n,r]of Object.entries(e.types))t[n]=createSnapshotType(r);return{namespace:e.namespace,config:e.config,types:t}}async function fetchRemoteTypes(e,t,n){return P(async(r,i)=>{let{tailordbTypes:a,nextPageToken:o}=await e.listTailorDBTypes({workspaceId:t,namespaceName:n,pageToken:r,pageSize:i});return[a,o]})}async function fetchRemoteGqlPermissions(e,t,n){return P(async(r,i)=>{let{permissions:a,nextPageToken:o}=await e.listTailorDBGQLPermissions({workspaceId:t,namespaceName:n,pageToken:r,pageSize:i});return[a,o]})}async function fetchRemoteSchemaSnapshot(e,t,n){let[r,i]=await Promise.all([fetchRemoteTypes(e,t,n),fetchRemoteGqlPermissions(e,t,n)]);return createSnapshotFromRemoteTypes(r,n,i)}function definedWhenNotEmpty(e){return Object.keys(e).length>0?e:void 0}function namespaceConfig(e,t,n){return t.find(e=>e.namespace===n)?.config??e.db?.[n]}function namespaceGqlOperations(e,t,n){return namespaceConfig(e,t,n)?.gqlOperations}const wo=[`create`,`update`,`delete`,`read`];function configuredDisabledGqlOperations(e){if(!e)return;if(e===`query`)return{create:!1,update:!1,delete:!1};let t={};for(let n of wo)e[n]===!1&&(t[n]=!1);return definedWhenNotEmpty(t)}function appliedConfiguredDisabledGqlOperations(e,t){if(!e||!t)return;let n={};for(let r of wo)t[r]===!1&&e[r]&&(n[r]=!1);return definedWhenNotEmpty(n)}function deployComparableSnapshot(e,t,n){let r=new Map(t.map(e=>[e.name,e])),i=configuredDisabledGqlOperations(n),a={};for(let[t,n]of Object.entries(e.tables)){let e={...n.settings},o=r.get(t)?.schema?.settings;if(n.settings?.publishEvents===void 0&&o?.publishRecordEvents&&(e.publishEvents=!0),n.settings?.gqlOperations===void 0){let t=appliedConfiguredDisabledGqlOperations(o?.disableGqlOperations,i);t&&(e.gqlOperations=t)}let s={...n},c=definedWhenNotEmpty(e);c?s.settings=c:delete s.settings,a[t]=s}return{...e,tables:a}}async function verifyRemoteSchema(e,t,n,r,i){let a=[];for(let{namespace:o,migrationsDir:s}of n){let n=await fetchRemoteMigrationState(e,resourceTrn(t,`tailordb`,o)),{metadataExists:c,number:l}=n;if(n.historyIdInvalid||l===null&&n.historyId!==null){a.push({namespace:o,remoteMigrationNumber:l??0,drifts:[],hasDrift:!1,checkpointMissingLocal:!0});continue}if(l===null){a.push({namespace:o,remoteMigrationNumber:0,drifts:[],hasDrift:!1,skipped:c?`no_migration_label`:`not_deployed`});continue}let u=getLatestMigrationNumber(s),d=reconstructSnapshotFromMigrations(s,0)?.rebaseline,f=d?n.historyId===d.historyId:n.historyId===null,p=d?n.historyId===d.replacedHistoryId:!1,m=d&&p&&l===d.replacedLatestMigration?{from:l,to:0,fromHistoryId:n.historyId,toHistoryId:d.historyId}:void 0;if(!f&&!m||l>u&&!m){a.push({namespace:o,remoteMigrationNumber:l,drifts:[],hasDrift:!1,checkpointMissingLocal:!0});continue}let h=reconstructSnapshotFromMigrations(s,m?.to??l);if(!h){a.push({namespace:o,remoteMigrationNumber:l,drifts:[],hasDrift:!1,skipped:`no_snapshot`});continue}let[g,_]=await Promise.all([fetchRemoteTypes(e,t,o),fetchRemoteGqlPermissions(e,t,o)]),v=compareRemoteWithSnapshot(g,deployComparableSnapshot(h,g,namespaceGqlOperations(r,i,o)),_);a.push({namespace:o,remoteMigrationNumber:l,drifts:v,hasDrift:v.length>0,...m&&v.length===0?{checkpointRepair:m}:{}})}return a}function isMissingRemoteScriptHashDrift(e){return e.kind===`script_mismatch`&&e.details.endsWith(`has no script hash on remote`)}function isLikelyPreV2ScriptHashDrift(e){let t=e.filter(e=>e.hasDrift);return t.length>0&&t.every(e=>e.drifts.length>0&&e.drifts.every(isMissingRemoteScriptHashDrift))}function logRemoteDriftGuidance(e){M.info(`This may indicate:`),M.info(` - Another developer applied different migrations`,{mode:`plain`}),M.info(` - Manual schema changes were made directly`,{mode:`plain`}),M.info(` - Migration history is out of sync`,{mode:`plain`}),M.newline(),M.info(`To resolve:`),M.info(` - Run 'tailor tailordb migration status' to compare local vs remote.`,{mode:`plain`}),M.info(` - If remote is correct, update local tables and run 'migration generate'.`,{mode:`plain`}),M.info(` - If local migration history is correct, run 'migration sync <N>' to overwrite remote.`,{mode:`plain`}),M.info(` - If only bookkeeping is stale, run 'migration set <N>'.`,{mode:`plain`}),e&&isLikelyPreV2ScriptHashDrift(e)&&(M.newline(),M.info(`Every listed drift is '${lo}'. Run 'migration sync <N>' above to add the missing hashes.`))}function formatRemoteVerificationResults(e){let t=[];for(let n of e)n.hasDrift&&(t.push(`Namespace: ${n.namespace}`),t.push(` Remote migration: ${formatMigrationNumber(n.remoteMigrationNumber)}`),t.push(` Differences:`),t.push(formatSchemaDrifts(n.drifts)),t.push(``));return t.join(`
|
|
62
|
+
`).filter(e=>/error/i.test(e)).at(-1)?.trim()||`Migration workflow execution failed.`}async function getCurrentMigrationNumber(e,t,n){try{let r=resourceTrn(t,`tailordb`,n),{metadata:i}=await e.getMetadata({trn:r}),a=i?.labels[Yi];return a?parseMigrationLabelNumber(a)??0:0}catch(e){if(Lt(e))return 0;throw e}}async function detectPendingMigrations(e,t,n,r,i){let a=[];for(let{namespace:o,migrationsDir:s}of n){let n=i?.get(o)??await getCurrentMigrationNumber(e,t,o),c=getMigrationFiles(s);for(let e of c){if(e.number<=n)continue;let t=getMigrationFilePath(s,e.number,`diff`);if(!W.existsSync(t))continue;let i=loadDiff(t),c=getMigrationFilePath(s,e.number,`migrate`),l=W.existsSync(c);if(i.requiresMigrationScript&&!l&&!i.scriptSkipped){let t={migrationNumber:e.number,namespace:o,configPath:r};throw Error(`Migration ${o}/${formatMigrationNumber(e.number)} requires a migration script but migrate.ts was not found.\nTo resolve, either:\n - Add a script: ${formatMigrationScriptCommand(t)}\n - Or record that no script is needed: ${formatMigrationScriptCommand({...t,noScript:!0})}`)}if(i.scriptSkipped){let t=`${o}/${formatMigrationNumber(e.number)}`;if(l)throw Error(`Migration ${t} has both a --no-script skip acknowledgment and migrate.ts.\nTo resolve, either:\n - Keep the script and clear the stale acknowledgment: ${formatMigrationScriptCommand({migrationNumber:e.number,namespace:o,configPath:r})}\n - Or keep the skip: delete migrate.ts`);M.info(`Migration ${t} runs without a script (skip acknowledged at ${i.scriptSkipped.acknowledgedAt}: ${i.scriptSkipped.reason})`)}a.push({number:e.number,scriptPath:c,hasScript:l,diffPath:t,namespace:o,migrationsDir:s,diff:i})}}return a.toSorted((e,t)=>e.namespace===t.namespace?e.number-t.number:e.namespace.localeCompare(t.namespace))}async function executeSingleMigration(e,t){let{client:n,workspaceId:r,invoker:i,env:a,configDir:o,appName:s,appId:c}=e,l=await executeMigrationAsWorkflow({client:n,workspaceId:r,code:(await bundleMigrationScript(t.scriptPath,t.namespace,t.number,a,o)).bundledCode,namespace:t.namespace,migrationNumber:t.number,invoker:i,appName:s,appId:c});return{namespace:t.namespace,migrationNumber:t.number,success:l.success,logs:l.logs,error:l.error}}async function updateMigrationLabel(e,t,n,r,i){await writeMetadataLabelsDirect(e,{trn:resourceTrn(t,`tailordb`,n),labels:{[Yi]:sanitizeMigrationLabel(r),...i?{[Xi]:i}:{}},remove:i?void 0:[Xi]})}async function executeMigrations(e,t){let n=t.filter(e=>e.hasScript);if(n.length===0)return;let r=groupMigrationsByNamespace(n);for(let[t,n]of r){let r=e.dbConfig[t]?.migration,i=getMigrationMachineUser(r,e.machineUsers);if(!i)throw Error(`No machine user available for migration execution in namespace '${t}'. Either configure 'migration.machineUser' in db config or define machine users in auth config.`);let a=U(C,{namespace:e.authNamespace,machineUserName:i}),o={client:e.client,workspaceId:e.workspaceId,invoker:a,env:e.env,configDir:e.configDir,appName:e.appName,appId:e.appId};M.info(`Using machine user: ${N.bold(i)} for namespace '${t}'`);for(let e of n){let t=`${e.namespace}/${formatMigrationNumber(e.number)}`,n=spinner().start(`Executing migration ${t} (this can take a while)...`),r=await executeSingleMigration(o,e);if(r.success)n.succeed(`Migration ${t} completed successfully`),r.logs&&r.logs.trim()&&M.log(`Logs:\n${r.logs}`);else throw n.fail(`Migration ${t} failed`),r.logs&&M.error(`Logs:\n${r.logs}`),Error(r.error??`Migration failed`)}}}function getMigrationMachineUser(e,t){if(e?.machineUser)return e.machineUser;if(t&&t.length>0)return t[0]}function groupMigrationsByNamespace(e){let t=new Map;for(let n of e){let e=t.get(n.namespace)??[];e.push(n),t.set(n.namespace,e)}return t}function defineRecordEntry(e,t,n){Object.defineProperty(e,t,{value:n,enumerable:!0,writable:!0,configurable:!0})}const bo=new Set([`field_added`,`field_modified`,`field_type_modified`,`field_removed`,`field_renamed`]);function isPreMigrationFieldChange(e){return bo.has(e.kind)}function createPreMigrationSnapshotType(e,t,n){let r=structuredClone(e.fields),i=!1;for(let[e,n]of t)n.kind===`field_type_modified`&&(i=!0,defineRecordEntry(r,e,structuredClone(n.before)));let a={...e,fields:r};if(!i||!n)return a;let{typeHookExpr:o,typeValidateExpr:s,...c}=a;return{...c,...n.before.typeHookExpr&&{typeHookExpr:structuredClone(n.before.typeHookExpr)},...n.before.typeValidateExpr!==void 0&&{typeValidateExpr:n.before.typeValidateExpr}}}function buildPreMigrationChangesMap(e){let t=new Map;for(let n of e)for(let e of n.diff.changes){if(!isPreMigrationFieldChange(e)||!e.fieldName)continue;let n=t.get(e.tableName)??new Map;n.set(e.fieldName,e),t.set(e.tableName,n)}return t}function applyPreMigrationFieldAdjustments(e,t){for(let[n,r]of t){if(r.kind===`field_removed`){defineRecordEntry(e,n,convertFieldConfigToProto(r.before));continue}if(r.kind===`field_renamed`){defineRecordEntry(e,r.previousFieldName,convertFieldConfigToProto(r.before));let t=e[n];t&&(r.after.required&&(t.required=!1),(r.after.unique??!1)&&(t.unique=!1));continue}let t=e[n];if(!t)continue;if(r.kind===`field_added`){r.after.required&&(t.required=!1);continue}if(r.kind===`field_type_modified`){defineRecordEntry(e,n,convertFieldConfigToProto(r.before));continue}let{before:i,after:a}=r;!i.required&&a.required&&(t.required=!1),!(i.unique??!1)&&(a.unique??!1)&&(t.unique=!1);let o=i.allowedValues??[],s=a.allowedValues??[],c=new Set(s.map(e=>e.value));if(o.filter(e=>!c.has(e.value)).length>0){let e=new Map;for(let t of o)e.set(t.value,t.description??``);for(let t of s)e.has(t.value)||e.set(t.value,t.description??``);t.allowedValues=Array.from(e.entries()).map(([e,t])=>({value:e,description:t}))}}}function buildPreMigrationIndexChangesMap(e){let t=new Map;for(let n of e)for(let e of n.diff.changes){if(e.kind!==`index_added`&&e.kind!==`index_modified`)continue;let n=e.kind===`index_modified`?e.before:void 0;if(!isBreakingIndexChange(e.tableName,e.indexName,n,e.after))continue;let r=t.get(e.tableName)??new Map;r.set(e.indexName,e),t.set(e.tableName,r)}return t}function applyPreMigrationIndexAdjustments(e,t){for(let[n,r]of t){if(r.kind===`index_added`){delete e[n];continue}r.kind===`index_modified`&&defineRecordEntry(e,n,convertIndexToProto(r.before))}}async function captureMigrationRestrictionState(e,t,n){let r=new Map;for(let i of n){let n=await P(async(n,r)=>{let{tailordbTypes:a,nextPageToken:o}=await e.listTailorDBTypes({workspaceId:t,namespaceName:i,pageToken:n,pageSize:r});return[a,o]}),a=new Map;for(let e of n){let t=e.schema?.settings;e.name&&a.set(e.name,{bulkUpsert:t?.bulkUpsert??!1,publishRecordEvents:t?.publishRecordEvents??!1,...t?.disableGqlOperations&&{disableGqlOperations:{create:t.disableGqlOperations.create,update:t.disableGqlOperations.update,delete:t.disableGqlOperations.delete,read:t.disableGqlOperations.read}},tailordbType:structuredClone(e)})}r.set(i,a)}return r}function getAffectedTableNames(e){let t=new Set;for(let n of e.diff.changes)t.add(n.tableName);return t}function getDeletedTableNames(e){let t=new Set;for(let n of e.diff.changes)n.kind===`table_removed`?t.add(n.tableName):n.kind===`table_renamed`&&t.add(n.previousTableName);return t}const xo={created:new Set,updated:new Set,gqlPermissionsProcessed:new Set,reset(){this.created.clear(),this.updated.clear(),this.gqlPermissionsProcessed.clear()}},So={cache:new Map,reset(){this.cache.clear()},load(e){let t=`${e.namespace}/${e.number}`,n=this.cache.get(t);if(!n){let r=reconstructSnapshotFromMigrations(e.migrationsDir,e.number);if(!r)throw Error(`Cannot reconstruct snapshot for ${e.namespace} migration ${e.number}: no migrations found in ${e.migrationsDir}`);n=r,this.cache.set(t,n)}return n}};function buildSnapshotTypeManifest(e,t,n,r){let i=So.load(e).tables[t];if(!i)return;let a=n.find(t=>t.namespace===e.namespace),o=e.diff.changes.find(e=>e.kind===`table_scripts_modified`&&e.tableName===t);return generateTailorDBTypeManifestFromSnapshot(r?createPreMigrationSnapshotType(i,r,o):i,{suppressRecordEvents:!0,suppressGqlOperations:!0,namespaceGqlOperations:a?.config.gqlOperations})}async function awaitAllSettledOrThrow(e){let t=(await Promise.allSettled(e.filter(e=>e!==void 0))).find(e=>e.status===`rejected`);if(t)throw t.reason}async function executeSingleMigrationPrePhase(e,t,n,r,i){let a=buildPreMigrationChangesMap([n]),o=buildPreMigrationIndexChangesMap([n]),s=getAffectedTableNames(n),c=new Set(xo.created);for(let l of t.type.creates){let t=l.request.tailordbType?.name;if(!t||!s.has(t)||c.has(t))continue;let u=a.get(t),d=buildSnapshotTypeManifest(n,t,r,u);if(!d)continue;let f=structuredClone(l.request);f.tailordbType=d,u&&u.size>0&&f.tailordbType.schema?.fields&&applyPreMigrationFieldAdjustments(f.tailordbType.schema.fields,u);let p=o.get(t);p&&p.size>0&&f.tailordbType.schema?.indexes&&applyPreMigrationIndexAdjustments(f.tailordbType.schema.indexes,p),xo.created.add(t),i.add(t),await e.createTailorDBType(f)}for(let l of t.type.creates){let t=l.request.tailordbType?.name;if(!t||!s.has(t)||!c.has(t))continue;let u=a.get(t),d=buildSnapshotTypeManifest(n,t,r,u);if(!d)continue;let f=structuredClone(d);u&&u.size>0&&f.schema?.fields&&applyPreMigrationFieldAdjustments(f.schema.fields,u);let p=o.get(t);p&&p.size>0&&f.schema?.indexes&&applyPreMigrationIndexAdjustments(f.schema.indexes,p),xo.updated.add(t),i.add(t),await e.updateTailorDBType({workspaceId:l.request.workspaceId,namespaceName:l.request.namespaceName,tailordbType:f})}for(let c of t.type.updates){let t=c.request.tailordbType?.name;if(!t||!s.has(t))continue;let l=a.get(t),u=buildSnapshotTypeManifest(n,t,r,l);if(!u)continue;let d=structuredClone(c.request);d.tailordbType=u,l&&l.size>0&&d.tailordbType.schema?.fields&&applyPreMigrationFieldAdjustments(d.tailordbType.schema.fields,l);let f=o.get(t);f&&f.size>0&&d.tailordbType.schema?.indexes&&applyPreMigrationIndexAdjustments(d.tailordbType.schema.indexes,f),xo.updated.add(t),i.add(t),await e.updateTailorDBType(d)}let l=new Set(Object.keys(So.load(n).tables)),permissionKey=e=>`${n.namespace}/${e}`,u=t.gqlPermission.creates.filter(e=>e.request.namespaceName===n.namespace&&l.has(e.name)&&!xo.gqlPermissionsProcessed.has(permissionKey(e.name))),d=t.gqlPermission.updates.filter(e=>e.request.namespaceName===n.namespace&&l.has(e.name)&&!xo.gqlPermissionsProcessed.has(permissionKey(e.name)));if(u.length+d.length>0){let a=new Set(u.map(e=>e.name)),o=t.type.creates.filter(e=>{let t=e.request.tailordbType?.name;return e.request.namespaceName===n.namespace&&t&&a.has(t)&&!xo.created.has(t)});if(o.length>0)for(let t of o){let a=t.request.tailordbType?.name;if(!a)continue;let o=buildSnapshotTypeManifest(n,a,r);if(!o)continue;xo.created.add(a),i.add(a);let s=structuredClone(t.request);s.tailordbType=o,await e.createTailorDBType(s)}await awaitAllSettledOrThrow([...u.map(t=>e.createTailorDBGQLPermission(t.request)),...d.map(t=>e.updateTailorDBGQLPermission(t.request))]);for(let e of[...u.map(e=>e.name),...d.map(e=>e.name)])xo.gqlPermissionsProcessed.add(permissionKey(e))}}const Co={types:new Set,gqlPermissions:new Set,reset(){this.types.clear(),this.gqlPermissions.clear()}};async function rollbackSingleMigrationAfterFailure(e,t,n,r,i){try{await rollbackSingleMigrationPrePhase(e,t,n,r,i)}catch(e){M.warn(`Failed to roll back migration ${t.namespace}/${formatMigrationNumber(t.number)}: ${e instanceof Error?e.message:String(e)}`)}}async function executeSingleMigrationPostPhase(e,t,n,r,i){let a=buildPreMigrationChangesMap([n]),o=buildPreMigrationIndexChangesMap([n]),s=new Set([...a.keys(),...o.keys()]),c=getAffectedTableNames(n);try{for(let a of t.type.creates){let t=a.request.tailordbType?.name;if(!t||!c.has(t)||!s.has(t))continue;let o=buildSnapshotTypeManifest(n,t,r);o&&(i.add(t),await e.updateTailorDBType({workspaceId:a.request.workspaceId,namespaceName:a.request.namespaceName,tailordbType:o}))}for(let a of t.type.updates){let t=a.request.tailordbType?.name;if(!t||!c.has(t)||!s.has(t))continue;let o=buildSnapshotTypeManifest(n,t,r);o&&(i.add(t),await e.updateTailorDBType({workspaceId:a.request.workspaceId,namespaceName:a.request.namespaceName,tailordbType:o}))}}catch(e){handleOptionalToRequiredError(e,[`This error occurred during post-migration phase. Please check your migration script.`,`Ensure all existing records have values for fields being changed to required.`])}}function acceptsMigrationWrites(e){let t=e.disableGqlOperations;return e.publishRecordEvents||e.bulkUpsert||t?.create!==!0||t.update!==!0||t.delete!==!0}async function rewriteRestrictedTables(e,t){let{workspaceId:n,namespaceName:r,snapshot:i,input:a,executorUsedTables:o,settingsState:s,restricted:c,continueOnError:l=!1}=t,u,d=new Set([...Object.keys(i.tables),...s?.keys()??[]]);for(let t of d)try{let l=i.tables[t],u=s?.get(t);if(s&&!u||c&&(!u||!acceptsMigrationWrites(u)))continue;let d=l?c?generateTailorDBTypeManifestFromSnapshot(l,{suppressRecordEvents:!0,suppressGqlOperations:!0,namespaceGqlOperations:a.config.gqlOperations}):generateTailorDBTypeManifestFromSnapshot(l,{subscribed:o.has(t),namespaceGqlOperations:a.config.gqlOperations}):u?.tailordbType?structuredClone(u.tailordbType):void 0;if(!d?.schema)continue;d.schema.settings??={};let f=d.schema.settings;c&&(f.bulkUpsert=!1,f.publishRecordEvents=!1,f.disableGqlOperations={create:!0,update:!0,delete:!0,read:!0}),!c&&u&&(f.bulkUpsert=u.bulkUpsert,f.publishRecordEvents=u.publishRecordEvents,f.disableGqlOperations=u.disableGqlOperations?{...u.disableGqlOperations}:void 0),await e.updateTailorDBType({workspaceId:n,namespaceName:r,tailordbType:d})}catch(e){if(!l)throw e;u??=e instanceof Error?e:Error(String(e),{cause:e})}if(u!==void 0)throw u}function resolveMigrationSnapshotSettings(e,t,n){let r=new Map;for(let[i,a]of Object.entries(e.tables)){let e=generateTailorDBTypeManifestFromSnapshot(a,{subscribed:!1,namespaceGqlOperations:t.config.gqlOperations}).schema?.settings;e&&r.set(i,{bulkUpsert:e.bulkUpsert??!1,publishRecordEvents:a.settings?.publishEvents??n.has(i),...e.disableGqlOperations&&{disableGqlOperations:{create:e.disableGqlOperations.create??!1,update:e.disableGqlOperations.update??!1,delete:e.disableGqlOperations.delete??!1,read:e.disableGqlOperations.read??!1}}})}return r}async function applyMigrationRestrictions(e,t,n,r,i,a){for(let[o,s]of t){let t=r.find(e=>e.namespace===o);t&&await rewriteRestrictedTables(e,{workspaceId:a,namespaceName:o,snapshot:s,input:t,executorUsedTables:i,settingsState:n.get(o)??new Map,restricted:!0})}}async function restoreMigrationRestrictions(e,t,n,r,i,a){let o;for(let[s,c]of t){let t=r.find(e=>e.namespace===s);if(t)try{await rewriteRestrictedTables(e,{workspaceId:a,namespaceName:s,snapshot:c,input:t,executorUsedTables:i,settingsState:n?.get(s),restricted:!1,continueOnError:!0})}catch(e){o??=e instanceof Error?e:Error(String(e),{cause:e})}}if(o!==void 0)throw o}async function executeSingleMigrationPostPhaseDeletions(e,t,n){let r=getDeletedTableNames(n);if(r.size>0){let n=t.gqlPermission.deletes.filter(e=>{let t=`${e.request.namespaceName}/${e.name}`;if(Co.gqlPermissions.has(t))return!1;let n=e.name;return r.has(n)});for(let t of n)await e.deleteTailorDBGQLPermission(t.request),Co.gqlPermissions.add(`${t.request.namespaceName}/${t.name}`);let i=t.type.deletes.filter(e=>{let t=e.name;return!t||Co.types.has(t)?!1:r.has(t)});for(let t of i)await e.deleteTailorDBType(t.request),Co.types.add(t.name)}}async function rollbackSingleMigrationPrePhase(e,t,n,r,i){if(t.number<=0||i.size===0)return;let a=reconstructSnapshotFromMigrations(t.migrationsDir,t.number-1);if(!a){M.warn(`Cannot roll back migration ${t.namespace}/${formatMigrationNumber(t.number)}: prior snapshot (migration ${formatMigrationNumber(t.number-1)}) could not be reconstructed. Leaving schema as-is; manual repair may be required.`);return}let o=r.find(e=>e.namespace===t.namespace);M.warn(`Migration ${t.namespace}/${formatMigrationNumber(t.number)} failed; rolling back its pre-migration schema changes.`);let s=[...i].flatMap(e=>{let t=a.tables[e];return t?[{tableName:e,priorTable:t}]:[]}),c=[...i].filter(e=>!a.tables[e]);for(let{tableName:r,priorTable:i}of s)try{let r=generateTailorDBTypeManifestFromSnapshot(i,{suppressRecordEvents:!0,suppressGqlOperations:!0,namespaceGqlOperations:o?.config.gqlOperations});await e.updateTailorDBType({workspaceId:n,namespaceName:t.namespace,tailordbType:r})}catch(e){M.warn(`Failed to roll back table '${r}' in namespace '${t.namespace}': ${e instanceof Error?e.message:String(e)}`)}for(let r of c)try{await e.deleteTailorDBGQLPermission({workspaceId:n,namespaceName:t.namespace,typeName:r}).catch(()=>void 0),await e.deleteTailorDBType({workspaceId:n,namespaceName:t.namespace,tailordbTypeName:r})}catch(e){M.warn(`Failed to roll back table '${r}' in namespace '${t.namespace}': ${e instanceof Error?e.message:String(e)}`)}}function toTailorDBDeployInput(e){let t={};for(let[n,r]of Object.entries(e.types))t[n]=createSnapshotType(r);return{namespace:e.namespace,config:e.config,types:t}}async function fetchRemoteTypes(e,t,n){return P(async(r,i)=>{let{tailordbTypes:a,nextPageToken:o}=await e.listTailorDBTypes({workspaceId:t,namespaceName:n,pageToken:r,pageSize:i});return[a,o]})}async function fetchRemoteGqlPermissions(e,t,n){return P(async(r,i)=>{let{permissions:a,nextPageToken:o}=await e.listTailorDBGQLPermissions({workspaceId:t,namespaceName:n,pageToken:r,pageSize:i});return[a,o]})}async function fetchRemoteSchemaSnapshot(e,t,n){let[r,i]=await Promise.all([fetchRemoteTypes(e,t,n),fetchRemoteGqlPermissions(e,t,n)]);return createSnapshotFromRemoteTypes(r,n,i)}function definedWhenNotEmpty(e){return Object.keys(e).length>0?e:void 0}function namespaceConfig(e,t,n){return t.find(e=>e.namespace===n)?.config??e.db?.[n]}function namespaceGqlOperations(e,t,n){return namespaceConfig(e,t,n)?.gqlOperations}const wo=[`create`,`update`,`delete`,`read`];function configuredDisabledGqlOperations(e){if(!e)return;if(e===`query`)return{create:!1,update:!1,delete:!1};let t={};for(let n of wo)e[n]===!1&&(t[n]=!1);return definedWhenNotEmpty(t)}function appliedConfiguredDisabledGqlOperations(e,t){if(!e||!t)return;let n={};for(let r of wo)t[r]===!1&&e[r]&&(n[r]=!1);return definedWhenNotEmpty(n)}function deployComparableSnapshot(e,t,n){let r=new Map(t.map(e=>[e.name,e])),i=configuredDisabledGqlOperations(n),a={};for(let[t,n]of Object.entries(e.tables)){let e={...n.settings},o=r.get(t)?.schema?.settings;if(n.settings?.publishEvents===void 0&&o?.publishRecordEvents&&(e.publishEvents=!0),n.settings?.gqlOperations===void 0){let t=appliedConfiguredDisabledGqlOperations(o?.disableGqlOperations,i);t&&(e.gqlOperations=t)}let s={...n},c=definedWhenNotEmpty(e);c?s.settings=c:delete s.settings,a[t]=s}return{...e,tables:a}}async function verifyRemoteSchema(e,t,n,r,i){let a=[];for(let{namespace:o,migrationsDir:s}of n){let n=await fetchRemoteMigrationState(e,resourceTrn(t,`tailordb`,o)),{metadataExists:c,number:l}=n;if(n.historyIdInvalid||l===null&&n.historyId!==null){a.push({namespace:o,remoteMigrationNumber:l??0,drifts:[],hasDrift:!1,checkpointMissingLocal:!0});continue}if(l===null){a.push({namespace:o,remoteMigrationNumber:0,drifts:[],hasDrift:!1,skipped:c?`no_migration_label`:`not_deployed`});continue}let u=getLatestMigrationNumber(s),d=reconstructSnapshotFromMigrations(s,0)?.rebaseline,f=d?n.historyId===d.historyId:n.historyId===null,p=d?n.historyId===d.replacedHistoryId:!1,m=d&&p&&l===d.replacedLatestMigration?{from:l,to:0,fromHistoryId:n.historyId,toHistoryId:d.historyId}:void 0;if(!f&&!m||l>u&&!m){a.push({namespace:o,remoteMigrationNumber:l,drifts:[],hasDrift:!1,checkpointMissingLocal:!0});continue}let h=reconstructSnapshotFromMigrations(s,m?.to??l);if(!h){a.push({namespace:o,remoteMigrationNumber:l,drifts:[],hasDrift:!1,skipped:`no_snapshot`});continue}let[g,_]=await Promise.all([fetchRemoteTypes(e,t,o),fetchRemoteGqlPermissions(e,t,o)]),v=compareRemoteWithSnapshot(g,deployComparableSnapshot(h,g,namespaceGqlOperations(r,i,o)),_);a.push({namespace:o,remoteMigrationNumber:l,drifts:v,hasDrift:v.length>0,...m&&v.length===0?{checkpointRepair:m}:{}})}return a}function isMissingRemoteScriptHashDrift(e){return e.kind===`script_mismatch`&&e.details.endsWith(`has no script hash on remote`)}function isLikelyPreV2ScriptHashDrift(e){let t=e.filter(e=>e.hasDrift);return t.length>0&&t.every(e=>e.drifts.length>0&&e.drifts.every(isMissingRemoteScriptHashDrift))}function logRemoteDriftGuidance(e){M.info(`This may indicate:`),M.info(` - Another developer applied different migrations`,{mode:`plain`}),M.info(` - Manual schema changes were made directly`,{mode:`plain`}),M.info(` - Migration history is out of sync`,{mode:`plain`}),M.newline(),M.info(`To resolve:`),M.info(` - Run 'tailor tailordb migration status' to compare local vs remote.`,{mode:`plain`}),M.info(` - If remote is correct, update local tables and run 'migration generate'.`,{mode:`plain`}),M.info(` - If local migration history is correct, run 'migration sync <N>' to overwrite remote.`,{mode:`plain`}),M.info(` - If only bookkeeping is stale, run 'migration set <N>'.`,{mode:`plain`}),e&&isLikelyPreV2ScriptHashDrift(e)&&(M.newline(),M.info(`Every listed drift is '${lo}'. Run 'migration sync <N>' above to add the missing hashes.`))}function formatRemoteVerificationResults(e){let t=[];for(let n of e)n.hasDrift&&(t.push(`Namespace: ${n.namespace}`),t.push(` Remote migration: ${formatMigrationNumber(n.remoteMigrationNumber)}`),t.push(` Differences:`),t.push(formatSchemaDrifts(n.drifts)),t.push(``));return t.join(`
|
|
63
63
|
`)}async function checkMigrationDiffs(e,t){let n=[];for(let{namespace:r,migrationsDir:i}of t){let t=e.get(r);if(!t)continue;let a=reconstructSnapshotFromMigrations(i);if(!a){n.push({namespace:r,migrationsDir:i,hasDiff:!0,diff:void 0});continue}let o=compareLocalTypesWithSnapshot(a,t,r);n.push({namespace:r,migrationsDir:i,hasDiff:hasChanges(o),diff:hasChanges(o)?o:void 0})}return n}function formatMigrationCheckResults(e){let t=[];for(let n of e)n.hasDiff&&(t.push(`Namespace: ${n.namespace}`),n.diff?(t.push(` ${formatDiffSummary(n.diff)}`),t.push(``),t.push(formatMigrationDiff(n.diff))):t.push(` No migration snapshot found. Run 'tailor tailordb migration generate' first.`),t.push(``));return t.join(`
|
|
64
64
|
`)}function migrationFileStatesEqual(e,t){let n=Object.keys(e).toSorted(),r=Object.keys(t).toSorted();return n.length===r.length&&n.every((n,i)=>n===r[i]&&e[n]===t[n])}async function validateAndDetectMigrations(e,t,n,r,i,a){let o=getNamespacesWithMigrations(r,B.dirname(r.path)),s=[],c=[],l=Object.create(null);if(o.length>0){for(let{namespace:e,migrationsDir:t}of o)assertValidMigrationFiles(t,e),l[e]=reconstructSnapshotFromMigrations(t)?.rebaseline?.historyId??null;if(!i){let i=await checkMigrationDiffs(n,o);if(i.some(e=>e.hasDiff))throw M.error(`Schema changes detected that are not in migration files:`),M.log(formatMigrationCheckResults(i)),M.newline(),M.info(`Run 'tailor tailordb migration generate' to create migration files.`),M.info(`Or use '--no-schema-check' to skip this check.`),Error(`Schema migration check failed`);let s=await verifyRemoteSchema(e,t,o,r,a);c=s.flatMap(e=>e.checkpointRepair?[{namespace:e.namespace,...e.checkpointRepair}]:[]);let l=s.filter(e=>e.checkpointMissingLocal);if(l.length>0){M.error(`Remote migration checkpoint is not in the local migration history:`);for(let e of l)M.log(` ${e.namespace}: ${formatMigrationNumber(e.remoteMigrationNumber)}`);throw M.newline(),M.info(`Pull the latest migration files, or run 'tailor tailordb migration status' to compare.`),Error(`Remote migration checkpoint verification failed`)}if(s.some(e=>e.hasDrift))throw M.error(`Remote schema drift detected:`),M.log(formatRemoteVerificationResults(s)),M.newline(),logRemoteDriftGuidance(s),M.newline(),M.info(`Use '--no-schema-check' to skip this check (not recommended).`),Error(`Remote schema verification failed`);for(let e of c)M.warn(`Remote migration checkpoint for ${e.namespace} will be reset to 0000 after confirmation (${formatMigrationNumber(e.from)} → 0000); the remote schema already matches the local baseline.`)}let u=new Map(c.map(e=>[e.namespace,e.to]));if(s=await detectPendingMigrations(e,t,o,r.path,u),s.length>0){M.newline();let e=s.filter(e=>e.hasScript),t=s.filter(e=>!e.hasScript);M.info(`${s.length} pending migration(s) will be applied:`),t.length>0&&M.info(` • ${t.length} schema change(s) (applied automatically with schema deployment)`,{mode:`plain`}),e.length>0&&M.info(` • ${e.length} data migration(s) (requires migration script execution)`,{mode:`plain`})}}return{pendingMigrations:s,checkpointRepairs:c,namespacesWithMigrations:o,migrationFileState:captureMigrationFileState(o),migrationHistoryIds:l}}async function reconcileMigrationLabels(e,t,n,r){for(let{namespace:i,migrationsDir:a}of n){if(getMigrationFiles(a).length===0)continue;let n=getLatestMigrationNumber(a),o=r[i]??null,s=await fetchRemoteMigrationState(e,resourceTrn(t,`tailordb`,i)).catch(()=>null),c=s?.number??null;s&&c===n&&s.historyId===o||(await updateMigrationLabel(e,t,i,n,o??void 0),s?M.info(`Migration label for namespace ${i} reconciled: ${describeMigrationCheckpoint(c)} → ${formatMigrationNumber(n)}.`):M.info(`Migration label for namespace ${i} reconciled to ${formatMigrationNumber(n)}.`))}}function buildMigrationContextForScripts(e,t,n){let r=t.application.authService;if(!r)throw Error(`Auth configuration is required to execute migration scripts.`);let i={};for(let e of n)e.namespace in i||(i[e.namespace]=t.config.db?.[e.namespace]);return{client:e,workspaceId:t.workspaceId,authNamespace:r.config.name,machineUsers:r.config.machineUsers?Object.keys(r.config.machineUsers):void 0,dbConfig:i,env:t.config.env??{},configDir:B.dirname(t.config.path),appName:t.application.name,appId:t.application.id}}async function validateTailorDBMigrationState(e,t){let{context:n}=t;if(n.migrationTestBaselines){let e=captureMigrationFileState(getNamespacesWithMigrations(n.config,B.dirname(n.config.path)));if(!migrationFileStatesEqual(n.migrationFileState,e))throw Error(`Migration files changed after deployment planning. Run the migration test again to create a fresh plan.`);return{pendingMigrations:[],checkpointRepairs:[],namespacesWithMigrations:[],migrationFileState:e,migrationHistoryIds:{}}}let r=new Map;for(let e of n.tailorDBInputs)r.set(e.namespace,e.types);let i=await validateAndDetectMigrations(e,n.workspaceId,r,n.config,n.noSchemaCheck,n.tailorDBInputs),a=n.checkpointRepairs;if(a.length!==i.checkpointRepairs.length||i.checkpointRepairs.some(e=>!a.some(t=>t.namespace===e.namespace&&t.from===e.from&&t.fromHistoryId===e.fromHistoryId&&t.toHistoryId===e.toHistoryId)))throw Error(`Remote migration checkpoint repair changed after deployment planning. Run the deployment again to review the updated repair.`);if(!migrationFileStatesEqual(n.migrationFileState,i.migrationFileState))throw Error(`Migration files changed after deployment planning. Run the deployment again to create a fresh plan.`);return i}async function preflightTailorDB(e,t){await validateTailorDBMigrationState(e,t)}function includeUndeletedTables(e,t,n){let r=[...getDeletedTableNames(n)].flatMap(e=>{let n=t?.tables[e];return n?[[e,n]]:[]});return{...e,tables:{...e.tables,...Object.fromEntries(r)}}}function describeMigrationCheckpoint(e){return e==null?`<unset>`:formatMigrationNumber(e)}async function applyTailorDB(e,t,n=`create-update`){let{changeSet:r,context:i}=t;if(n===`create-update`){let{pendingMigrations:n,checkpointRepairs:a,namespacesWithMigrations:o,migrationHistoryIds:s}=await validateTailorDBMigrationState(e,t);for(let t of a)await updateMigrationLabel(e,i.workspaceId,t.namespace,t.to,t.toHistoryId),M.info(`Migration checkpoint for namespace ${t.namespace} reset: ${formatMigrationNumber(t.from)} → 0000.`);if(n.length>0){xo.reset(),Co.reset(),So.reset();let t=new Set(n.map(e=>e.namespace)),a=await captureMigrationRestrictionState(e,i.workspaceId,t);await executeServicesCreation(e,r);let isOutsideMigrations=e=>e!==void 0&&!t.has(e),o=new Map,c=new Map,l=new Set;for(let e of n){let t=o.get(e.namespace);(!t||e.number<t.number)&&o.set(e.namespace,e);let n=c.get(e.namespace)??new Set;for(let t of getDeletedTableNames(e))n.add(t);c.set(e.namespace,n);for(let t of Object.keys(So.load(e).tables))l.add(`${e.namespace}/${t}`)}let u=new Map;for(let[e,t]of o){let n=reconstructSnapshotFromMigrations(t.migrationsDir,t.number-1);if(!n)throw Error(`Cannot reconstruct the schema state before migration ${formatMigrationNumber(t.number)} for namespace "${e}"`);u.set(e,n)}let d=new Set,f=new Set([...r.gqlPermission.creates,...r.gqlPermission.updates].filter(e=>{let n=e.request.namespaceName;return i.noSchemaCheck&&n!==void 0&&t.has(n)&&!l.has(`${n}/${e.name}`)}).map(e=>`${e.request.namespaceName}/${e.name}`));try{for(let t of r.type.creates){let n=t.request.namespaceName;if(isOutsideMigrations(n)){await e.createTailorDBType(t.request);continue}let r=t.request.tailordbType?.name;if(!n||!r)continue;let a=u.get(n)?.tables[r];if(!a){i.noSchemaCheck&&!l.has(`${n}/${r}`)&&d.add(`${n}/${r}`);continue}if(c.get(n)?.has(r))continue;let o=i.tailorDBInputs.find(e=>e.namespace===n);xo.created.add(r),await e.createTailorDBType({workspaceId:t.request.workspaceId,namespaceName:n,tailordbType:generateTailorDBTypeManifestFromSnapshot(a,{suppressRecordEvents:!0,suppressGqlOperations:!0,namespaceGqlOperations:o?.config.gqlOperations})})}for(let t of r.type.updates)isOutsideMigrations(t.request.namespaceName)&&await e.updateTailorDBType(t.request)}catch(e){handleOptionalToRequiredError(e,[`Run 'tailor tailordb migration generate' to create migration files.`,`Migration scripts allow you to handle existing data before applying the schema change.`])}await Promise.all([...r.gqlPermission.creates.filter(e=>isOutsideMigrations(e.request.namespaceName)).map(t=>e.createTailorDBGQLPermission(t.request)),...r.gqlPermission.updates.filter(e=>isOutsideMigrations(e.request.namespaceName)).map(t=>e.updateTailorDBGQLPermission(t.request))]);let p=n.filter(e=>e.hasScript),m=p.length>0?buildMigrationContextForScripts(e,i,p):void 0;p.length>0&&(M.info(`Executing ${p.length} data migration(s)...`),M.newline());let h=new Map(u),g=new Map(a),_=new Map([...o].map(([e,t])=>[e,{number:t.number>0?t.number-1:null,historyId:s[e]??null}])),v;try{await applyMigrationRestrictions(e,u,a,i.tailorDBInputs,i.executorUsedTables,i.workspaceId);for(let t of n){let n=new Set;try{await z(`apply.tailorDB.migration.prePhase`,()=>executeSingleMigrationPrePhase(e,r,t,i.tailorDBInputs,n)),t.hasScript&&m&&await z(`apply.tailorDB.migration.script`,()=>executeMigrations(m,[t]))}catch(r){throw await rollbackSingleMigrationAfterFailure(e,t,i.workspaceId,i.tailorDBInputs,n),r}try{await z(`apply.tailorDB.migration.postPhase`,()=>executeSingleMigrationPostPhase(e,r,t,i.tailorDBInputs,n))}catch(r){throw await rollbackSingleMigrationAfterFailure(e,t,i.workspaceId,i.tailorDBInputs,n),r}let a=h.get(t.namespace),o=g.get(t.namespace),c=So.load(t);h.set(t.namespace,c);let l=s[t.namespace]??null;try{await updateMigrationLabel(e,i.workspaceId,t.namespace,t.number,l??void 0)}catch(n){let r;try{r=await fetchRemoteMigrationState(e,resourceTrn(i.workspaceId,`tailordb`,t.namespace))}catch(e){throw M.warn(`Could not verify migration checkpoint ${t.namespace}/${formatMigrationNumber(t.number)} after its update failed: ${e instanceof Error?e.message:String(e)}. Leaving the post-migration schema unchanged to avoid rolling back a committed checkpoint.`),n}let o=r.number??void 0,s=r.historyIdInvalid||r.historyId!==l?`${describeMigrationCheckpoint(r.number)} in a different migration history`:o!==void 0&&o>t.number?formatMigrationNumber(o):void 0;if(s!==void 0)throw h.delete(t.namespace),Error(`Migration checkpoint ${t.namespace}/${formatMigrationNumber(t.number)} advanced concurrently to ${s}. Leaving the post-migration schema unchanged and aborting this deployment.`,{cause:n});if(o!==t.number)throw h.set(t.namespace,includeUndeletedTables(c,a,t)),M.warn(`Migration checkpoint ${t.namespace}/${formatMigrationNumber(t.number)} could not be confirmed after its update failed; remote remains at ${describeMigrationCheckpoint(o)}. Leaving the post-migration schema unchanged to avoid rolling back a concurrent deployment. Repair the checkpoint before retrying.`),n}_.set(t.namespace,{number:t.number,historyId:l});let u=i.tailorDBInputs.find(e=>e.namespace===t.namespace);if(u){let e=resolveMigrationSnapshotSettings(c,u,i.executorUsedTables);for(let[t,n]of o??[])a?.tables[t]||e.set(t,n);g.set(t.namespace,e)}try{await executeSingleMigrationPostPhaseDeletions(e,r,t)}catch(e){throw M.warn(`Migration checkpoint ${t.namespace}/${formatMigrationNumber(t.number)} was committed, but post-checkpoint cleanup failed. The leftover resources remain locked. Remove them manually before the next deployment; remote schema verification will fail closed until then.`),e}}p.length>0&&(M.newline(),M.success(`All data migrations completed successfully.`))}catch(e){v={error:e}}for(let[t,n]of _)try{let r=await fetchRemoteMigrationState(e,resourceTrn(i.workspaceId,`tailordb`,t));if(r.number===n.number&&!r.historyIdInvalid&&r.historyId===n.historyId)continue;h.delete(t);let a=Error(`Migration checkpoint ${t}/${describeMigrationCheckpoint(n.number)} advanced concurrently to ${describeMigrationCheckpoint(r.number)}. Skipping restoration for this namespace and aborting this deployment.`);v?M.warn(`${a.message} The original migration error is reported below.`):v={error:a}}catch(e){h.delete(t);let r=Error(`Could not verify ownership of migration checkpoint ${t}/${describeMigrationCheckpoint(n.number)} before restoring table settings: ${e instanceof Error?e.message:String(e)}. Skipping restoration for this namespace and aborting this deployment.`);v?M.warn(`${r.message} The original migration error is reported below.`):v={error:r}}try{await restoreMigrationRestrictions(e,h,g,i.tailorDBInputs,i.executorUsedTables,i.workspaceId)}catch(e){if(!v)throw e;M.warn(`Could not restore every TailorDB table after the migration failed: ${e instanceof Error?e.message:String(e)}. The original migration error is reported below.`)}if(v)throw v.error;for(let t of r.type.creates){let n=t.request.namespaceName,r=t.request.tailordbType?.name;!n||!r||d.has(`${n}/${r}`)&&await e.createTailorDBType(t.request)}await Promise.all([...r.gqlPermission.creates.filter(e=>f.has(`${e.request.namespaceName}/${e.name}`)).map(t=>e.createTailorDBGQLPermission(t.request)),...r.gqlPermission.updates.filter(e=>f.has(`${e.request.namespaceName}/${e.name}`)).map(t=>e.updateTailorDBGQLPermission(t.request))]);let y=r.gqlPermission.deletes.filter(e=>{let t=`${e.request.namespaceName}/${e.name}`;return!Co.gqlPermissions.has(t)});y.length>0&&await Promise.all(y.map(t=>e.deleteTailorDBGQLPermission(t.request))),await Promise.all(r.type.deletes.filter(e=>isOutsideMigrations(e.request.namespaceName)&&!Co.types.has(e.name)).map(t=>e.deleteTailorDBType(t.request))),await Promise.all([...r.type.creates,...r.type.updates,...r.type.unchanged].filter(e=>e.metaRequest&&!Co.types.has(e.name)).flatMap(t=>t.metaRequest?[writeMetadataLabels(e,t.metaRequest)]:[]))}else{await Promise.all([...r.service.creates.map(async t=>{await e.createTailorDBService(t.request),await writeMetadataLabels(e,t.metaRequest)}),...r.service.updates.map(t=>writeMetadataLabels(e,t.metaRequest))]);try{for(let t of r.type.creates)await e.createTailorDBType(t.request),await writeMetadataLabels(e,t.metaRequest);for(let t of r.type.updates)await e.updateTailorDBType(t.request),await writeMetadataLabels(e,t.metaRequest);await Promise.all(r.type.unchanged.flatMap(t=>t.metaRequest?[writeMetadataLabels(e,t.metaRequest)]:[]))}catch(e){handleOptionalToRequiredError(e,[`Run 'tailor tailordb migration generate' to create migration files.`,`Migration scripts allow you to handle existing data before applying the schema change.`])}await Promise.all([...r.gqlPermission.creates.map(t=>e.createTailorDBGQLPermission(t.request)),...r.gqlPermission.updates.map(t=>e.updateTailorDBGQLPermission(t.request))]),await Promise.all(r.gqlPermission.deletes.map(t=>e.deleteTailorDBGQLPermission(t.request))),await Promise.all(r.type.deletes.map(t=>e.deleteTailorDBType(t.request)))}o.length>0&&(i.noSchemaCheck||n.length===0)&&await reconcileMigrationLabels(e,i.workspaceId,o,s)}else n===`delete-resources`?(await Promise.all(r.gqlPermission.deletes.map(t=>e.deleteTailorDBGQLPermission(t.request))),await Promise.all(r.type.deletes.map(t=>e.deleteTailorDBType(t.request)))):await Promise.all(r.service.deletes.map(t=>e.deleteTailorDBService(t.request)))}async function executeServicesCreation(e,t){await Promise.all([...t.service.creates.map(async t=>{await e.createTailorDBService(t.request),await writeMetadataLabels(e,t.metaRequest)}),...t.service.updates.map(t=>writeMetadataLabels(e,t.metaRequest))])}function itemKey(e){return`${e.request?.namespaceName??``}/${e.name}`}function collectTailorDBDisplayEntries(e,t,n){let r=new Set(t.map(itemKey)),i=new Set(n.map(itemKey)),a=t.map(t=>({action:e,symbol:Ai[e],name:t.name,labels:i.has(itemKey(t))?[`table`,`gqlPermission`]:[`table`],namespace:t.request?.namespaceName})),o=n.filter(e=>!r.has(itemKey(e))).map(t=>({action:e,symbol:Ai[e],name:t.name,labels:[`gqlPermission`],namespace:t.request?.namespaceName}));return[...a,...o]}function formatTailorDBResourceChangeEntries(e,t){return[...collectTailorDBDisplayEntries(`create`,e.creates,t.creates),...collectTailorDBDisplayEntries(`delete`,e.deletes,t.deletes),...collectTailorDBDisplayEntries(`update`,e.updates,t.updates),...collectTailorDBDisplayEntries(`replace`,e.replaces,t.replaces)]}function normalizeComparableTailorDBService(e){return normalizeProtoConfig({namespace:e.namespace,defaultTimezone:e.defaultTimezone||`UTC`})}function areTailorDBServicesEqual(e,t){return areNormalizedEqual(normalizeComparableTailorDBService({namespace:e.namespace?.name,defaultTimezone:e.defaultTimezone}),normalizeComparableTailorDBService({namespace:t.namespace,defaultTimezone:`UTC`}))}function isPlainObject(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}const To={disableGqlOperations:{create:!1,update:!1,delete:!1,read:!1},emptyExpression:``,numericStringPaths:new Set([`schema.fields.*.serial.start`,`schema.fields.*.serial.maxValue`,`schema.settings.defaultQueryLimitSize`,`schema.settings.maxBulkUpsertSize`])};function normalizeComparableTailorDBType(e){let t=normalizeProtoConfig(toComparableProtoJson(et,e));return normalizeTailorDBCompareValue({name:t?.name??``,schema:{description:t?.schema?.description??``,fields:t?.schema?.fields??{},relationships:t?.schema?.relationships??{},settings:t?.schema?.settings??{},indexes:t?.schema?.indexes??{},files:t?.schema?.files??{},permission:t?.schema?.permission??{},typeHook:t?.schema?.typeHook??{},typeValidate:t?.schema?.typeValidate??{}}},[])}function isPermissionPolicyArrayPath(e){return e.length===3&&e[0]===`schema`&&e[1]===`permission`&&(e[2]===`create`||e[2]===`read`||e[2]===`update`||e[2]===`delete`)}function normalizeTailorDBCompareValue(e,t){if(e==null)return e;if(typeof e==`boolean`)return t.at(-1)===`optionalOnCreate`&&e===!1?void 0:e;if(typeof e==`number`||typeof e==`bigint`||typeof e==`string`)return matchesNumericStringPath(t)&&isNumericLikeValue(e)?String(e):(t.at(-1)===`expr`||t.at(-1)===`description`)&&e===To.emptyExpression?void 0:e;if(Array.isArray(e)){let n=e.map((e,n)=>normalizeTailorDBCompareValue(e,[...t,n])).filter(e=>e!==void 0);return n.length===0&&t.at(-1)===`validate`?void 0:isPermissionPolicyArrayPath(t)?n.toSorted((e,t)=>JSON.stringify(e)<JSON.stringify(t)?-1:1):n}if(!isPlainObject(e))return e;let n=Object.entries(e).map(([e,n])=>[e,normalizeTailorDBCompareValue(n,[...t,e])]).filter(([,e])=>e!==void 0),r=Object.fromEntries(n);if((t.at(-1)!==`fields`||Object.keys(r).length!==0)&&!(t.at(-1)===`disableGqlOperations`&&(Object.keys(r).length===0||areNormalizedEqual(r,To.disableGqlOperations))))return r}function matchesNumericStringPath(e){let t=e.map(e=>String(e)).join(`.`);return[...To.numericStringPaths].some(e=>{let n=e.split(`.`),r=t.split(`.`);return n.length===r.length&&n.every((e,t)=>e===`*`||e===r[t])})}function isNumericLikeValue(e){return typeof e==`number`||typeof e==`bigint`||/^-?\d+$/.test(e)}function normalizeComparableGqlPermission(e){return{policies:(normalizeProtoConfig(e)?.policies??[]).map(e=>({...e,actions:(e.actions??[]).toSorted((e,t)=>e-t)}))}}async function planTailorDB(e){let{client:t,workspaceId:n,application:r,forRemoval:i,config:a,noSchemaCheck:o,forceApplyAll:s=!1}=e,c=[],l=e.migrationTestSnapshots??(e.migrationTestBaselines?new Map([...e.migrationTestBaselines].map(([e,t])=>[e,t.snapshot])):void 0);if(!i)for(let e of r.tailorDBServices){await e.loadTypes();let t=toTailorDBDeployInput(e),n=l?.get(e.namespace);c.push(n?{...t,types:n.tables}:t)}let u=i?[]:Object.values(await r.executorService?.loadExecutors()??{}),d=new Set(e.executorUsedTailorDBTables??[]);for(let e of u)subscribesToEvents(e)&&e.trigger.kind===`tailordb`&&d.add(e.trigger.tableName);let f=new Map;for(let e of c)f.set(e.namespace,e.types);let p=e.migrationTestBaselines;if(l){for(let e of l.keys())if(!c.some(t=>t.namespace===e))throw Error(`Migration test snapshot targets unknown TailorDB namespace "${e}".`);let e=new Map;for(let t of c)for(let n of Object.keys(t.types)){let r=e.get(n);if(r)throw Error(`Migration test snapshot has duplicate TailorDB table name "${n}" in namespaces "${r}" and "${t.namespace}".`);e.set(n,t.namespace)}}let m=getNamespacesWithMigrations(a,B.dirname(a.path)),{namespacesWithMigrations:h,migrationFileState:g,checkpointRepairs:_}=i?{namespacesWithMigrations:[],migrationFileState:{},checkpointRepairs:[]}:p?{namespacesWithMigrations:m,migrationFileState:captureMigrationFileState(m),checkpointRepairs:[]}:await validateAndDetectMigrations(t,n,f,a,o??!1,c),{changeSet:v,conflicts:y,unmanaged:b,resourceOwners:x}=await planServices(t,n,r.name,r.id,c),S=v.deletes.map(e=>e.name),[C,w]=await Promise.all([planTypes(t,n,c,d,S,void 0,s,{appName:r.name,appId:r.id,dependentApps:e.dependentApps,runAppIds:e.runAppIds}),planGqlPermissions(t,n,c,S,s)]);return C.creates.sort(Vt),C.updates.sort(Vt),C.deletes.sort(Vt),{changeSet:{service:v,type:C,gqlPermission:w},conflicts:y,unmanaged:b,resourceOwners:x,context:{workspaceId:n,application:r,tailorDBInputs:c,executorUsedTables:d,config:a,noSchemaCheck:o??!1,...p?{migrationTestBaselines:p}:{},namespacesWithMigrations:h,migrationFileState:g,checkpointRepairs:_}}}async function planServices(e,t,n,r,i){let a=createChangeSet(`TailorDB services`),o=[],s=[],c=new Set,l=await fetchExistingResourcesWithLabels({client:e,fetchPage:async(n,r)=>{let{tailordbServices:i,nextPageToken:a}=await e.listTailorDBServices({workspaceId:t,pageToken:n,pageSize:r});return[i,a]},getName:e=>e.namespace?.name,getTrn:e=>resourceTrn(t,`tailordb`,e)});for(let e of i){let i=l[e.namespace],c=await buildMetaRequest({trn:resourceTrn(t,`tailordb`,e.namespace),appName:n,appId:r});i?(trackDesiredResourceOwnership({labels:i.allLabels,ownerLabel:i.label,appName:n,appId:r,resourceType:`TailorDB service`,resourceName:e.namespace,conflicts:o,unmanaged:s})&&hasMatchingSdkVersion(i.allLabels,c.labels)&&areTailorDBServicesEqual(i.resource,e)?a.unchanged.push({name:e.namespace}):a.updates.push({name:e.namespace,metaRequest:c}),delete l[e.namespace]):a.creates.push({name:e.namespace,request:{workspaceId:t,namespaceName:e.namespace,defaultTimezone:`UTC`},metaRequest:c})}return Object.entries(l).forEach(([e])=>{let i=l[e];trackRemainingResourceOwner({labels:i?.allLabels,ownerLabel:i?.label,appName:n,appId:r,resourceOwners:c})&&a.deletes.push({name:e,request:{workspaceId:t,namespaceName:e}})}),{changeSet:a,conflicts:o,unmanaged:s,resourceOwners:c}}async function planTypes(e,t,n,r,i,a,o=!1,s={}){let c=createChangeSet(`TailorDB tables`),{appName:l,appId:u,dependentApps:d,runAppIds:f}=s,typeMetaRequest=async(e,n,r)=>addDependencyRecords(await buildMetaRequest({trn:tailorDBTypeTrn(t,e,n),appName:l??``,appId:u}),{key:Q.tailorDBType(e,n),dependentApps:d,runAppIds:f,pinned:r!==void 0}),fetchTypes=n=>P(async(r,i)=>{let{tailordbTypes:a,nextPageToken:o}=await e.listTailorDBTypes({workspaceId:t,namespaceName:n,pageToken:r,pageSize:i});return[a,o]});for(let e of n){let t=a?.get(e.namespace)??e.types;for(let[e,n]of Object.entries(t))assertNoPublishEventsConflict({explicit:n.settings?.publishEvents,subscribed:r.has(e),conflict:Mi.tailorDBType(e)})}for(let e of n){let n=await fetchTypes(e.namespace),i=new Map(n.map(e=>[e.name,e])),s=a?.get(e.namespace)??e.types,typeMeta=t=>typeMetaRequest(e.namespace,t,s[t]?.settings?.publishEvents);for(let[n,a]of Object.entries(s)){let s=generateTailorDBTypeManifestFromSnapshot(a,{subscribed:r.has(n),namespaceGqlOperations:e.config.gqlOperations}),l=i.get(n);l?(!o&&areNormalizedEqual(normalizeComparableTailorDBType(l),normalizeComparableTailorDBType(s))?c.unchanged.push({name:n,metaRequest:await typeMeta(n)}):c.updates.push({name:n,request:{workspaceId:t,namespaceName:e.namespace,tailordbType:s},metaRequest:await typeMeta(n)}),i.delete(n)):c.creates.push({name:n,request:{workspaceId:t,namespaceName:e.namespace,tailordbType:s},metaRequest:await typeMeta(n)})}i.forEach((n,r)=>{c.deletes.push({name:r,request:{workspaceId:t,namespaceName:e.namespace,tailordbTypeName:r}})})}for(let e of i)(await fetchTypes(e)).forEach(n=>{c.deletes.push({name:n.name,request:{workspaceId:t,namespaceName:e,tailordbTypeName:n.name}})});return c}async function planGqlPermissions(e,t,n,r,i=!1){let a=createChangeSet(`TailorDB gqlPermissions`),fetchGqlPermissions=n=>P(async(r,i)=>{let{permissions:a,nextPageToken:o}=await e.listTailorDBGQLPermissions({workspaceId:t,namespaceName:n,pageToken:r,pageSize:i});return[a,o]});for(let e of n){let n=await fetchGqlPermissions(e.namespace),r=new Set;n.forEach(e=>{r.add(e.typeName)});let o=e.types;for(let[s,c]of Object.entries(o)){let o=c.permissions?.gql;if(!o)continue;let l=protoGqlPermission(o),u=n.find(e=>e.typeName===s);r.has(s)?(!i&&u&&areNormalizedEqual(normalizeComparableGqlPermission(u.permission),normalizeComparableGqlPermission(l))?a.unchanged.push({name:s}):a.updates.push({name:s,request:{workspaceId:t,namespaceName:e.namespace,typeName:s,permission:l}}),r.delete(s)):a.creates.push({name:s,request:{workspaceId:t,namespaceName:e.namespace,typeName:s,permission:l}})}r.forEach(n=>{a.deletes.push({name:n,request:{workspaceId:t,namespaceName:e.namespace,typeName:n}})})}for(let e of r)(await fetchGqlPermissions(e)).forEach(n=>{a.deletes.push({name:n.typeName,request:{workspaceId:t,namespaceName:e,typeName:n.typeName}})});return a}async function applyWorkflow(e,t,n=`create-update`){let{changeSet:r,appName:i,appId:a}=t;if(n===`create-update`){let n=await registerJobFunctions(e,r,i,a,t.unchangedWorkflowJobNames,t.jobFunctionPublishEvents);await Promise.all([...r.creates.map(async t=>{let r=filterJobFunctionVersions(n,t.usedJobNames),i=buildWorkflowValidationShape(t.workspaceId,t.workflow);await e.createWorkflow({workspaceId:i.workspaceId,workflowName:i.workflowName,mainJobFunctionName:i.mainJobFunctionName,retryPolicy:i.retryPolicy,concurrencyPolicy:i.concurrencyPolicy,jobFunctions:r,publishExecutionEvents:i.publishExecutionEvents}),await writeMetadataLabels(e,t.metaRequest)}),...r.updates.map(async t=>{let r=filterJobFunctionVersions(n,t.usedJobNames),i=buildWorkflowValidationShape(t.workspaceId,t.workflow);await e.updateWorkflow({workspaceId:i.workspaceId,workflowName:i.workflowName,mainJobFunctionName:i.mainJobFunctionName,retryPolicy:i.retryPolicy,concurrencyPolicy:i.concurrencyPolicy,jobFunctions:r,publishExecutionEvents:i.publishExecutionEvents}),await writeMetadataLabels(e,t.metaRequest)}),...r.unchanged.flatMap(t=>t.metaRequest?[writeMetadataLabels(e,t.metaRequest)]:[])])}else await deleteAllSettled(r.deletes.map(t=>({resourceType:`workflow`,resourceName:t.name,run:()=>e.deleteWorkflow({workspaceId:t.workspaceId,workflowId:t.workflowId})}))),await deleteAllSettled(t.jobFunctionDeletes.map(t=>({resourceType:`workflow job function`,resourceName:t.jobFunctionName,run:()=>e.deleteWorkflowJobFunction({workspaceId:t.workspaceId,jobFunctionName:t.jobFunctionName})})))}async function deleteAllSettled(e){let t=await Promise.allSettled(e.map(e=>e.run())),n=[];t.forEach((t,r)=>{if(t.status===`fulfilled`)return;let i=A(e[r],`operation missing at index`),a=t.reason;if(!(a instanceof q&&a.code===K.NotFound)){if(a instanceof q&&a.code===K.FailedPrecondition){M.warn(`Skipped deleting ${i.resourceType} "${i.resourceName}" because it is still referenced.`);return}n.push(hn(a))}});let r=n[0];if(r)throw r}function filterJobFunctionVersions(e,t){let n={};for(let r of t)e[r]!==void 0&&(n[r]=e[r]);return n}async function registerJobFunctions(e,t,n,r,i=new Set,a=new Map){let o={},s=t.creates[0]||t.updates[0]||t.deletes[0];if(!s)return o;let{workspaceId:c}=s,l=new Set;i.forEach(e=>l.add(e));for(let e of[...t.creates,...t.updates])for(let t of e.usedJobNames)l.add(t);let u=await At(async(t,n)=>{let r=await e.listWorkflowJobFunctions({workspaceId:c,pageToken:t,pageSize:n});return[r.jobFunctions.map(e=>e.name),r.nextPageToken]}),d=new Set(u);if(t.creates.length>0||t.updates.length>0){let t=await Promise.all(Array.from(l).map(async t=>{let i=d.has(t),o={workspaceId:c,jobFunctionName:t,scriptRef:workflowJobFunctionName(t),publishExecutionEvents:a.get(t)??!1},s=i?await e.updateWorkflowJobFunction(o):await e.createWorkflowJobFunction(o);return await writeMetadataLabels(e,await buildMetaRequest({trn:resourceTrn(c,`workflow_job_function`,t),appName:n,appId:r})),{jobName:t,version:s.jobFunction?.version}}));for(let{jobName:e,version:n}of t)n&&(o[e]=n)}return o}function parseDurationToProto(e){let t=parseDuration(e),n=Math.floor(t/1e3),r=t%1e3*1e6;return{seconds:BigInt(n),nanos:r}}function toRetryPolicy(e){return{maxRetries:e.maxRetries,initialBackoff:parseDurationToProto(e.initialBackoff),maxBackoff:parseDurationToProto(e.maxBackoff),backoffMultiplier:e.backoffMultiplier}}function toConcurrencyPolicy(e){return{maxConcurrentExecutions:e.maxConcurrentExecutions}}function buildWorkflowValidationShape(e,t){return{workspaceId:e,workflowName:t.name,mainJobFunctionName:t.mainJob.name,...t.retryPolicy&&{retryPolicy:toRetryPolicy(t.retryPolicy)},...t.concurrencyPolicy&&{concurrencyPolicy:toConcurrencyPolicy(t.concurrencyPolicy)},publishExecutionEvents:t.publishEvents??!1}}const Eo={workflowNames:new Set};function isSubscribed(e,t){return e.workflowNames.has(t)}function subscribedWorkflowJobNames(e){let{workflows:t,mainJobDeps:n,isSubscribed:r}=e,i=new Set;for(let e of t)if(r(e.name))for(let t of n[e.mainJob.name]??[])i.add(t);return i}function resolveJobPublishEvents(e){let{workflows:t,mainJobDeps:n,subscribers:r,explicit:i}=e,a=new Set;for(let e of Object.values(t))for(let t of n[e.mainJob.name]??[])a.add(t);let o=subscribedWorkflowJobNames({workflows:Object.values(t),mainJobDeps:n,isSubscribed:e=>isSubscribed(r,e)}),s=new Map;for(let e of a)s.set(e,resolvePublishEvents({explicit:i.get(e),subscribed:o.has(e),conflict:Mi.workflowJob(e)}));return s}function collectStaleJobFunctionNames(e,t){let n=new Set;for(let[r,i]of t){let t=e.get(r);t&&t.publishExecutionEvents!==i&&n.add(r)}return n}async function planWorkflow(e,t,n,r,i,a,o=new Set,s={}){let c=createChangeSet(`Workflows`),l=[],u=[],d=new Set,f=new Set,p=new Set,m=s.execution??Eo,{dependentApps:h,runAppIds:g}=s,everyJobDeclaresPublishEvents=e=>{let t=a[i[e]?.mainJob.name??``]??[],n=s.jobPublishEvents??new Map;return t.length>0&&t.every(e=>n.has(e))},_=await fetchExistingJobFunctions(e,t),v=resolveJobPublishEvents({workflows:i,mainJobDeps:a,subscribers:s.jobExecution??Eo,explicit:s.jobPublishEvents??new Map}),y=collectStaleJobFunctionNames(_,v),b=await fetchExistingResourcesWithLabels({client:e,fetchPage:async(n,r)=>{let i=await e.listWorkflows({workspaceId:t,pageToken:n,pageSize:r});return[i.workflows,i.nextPageToken]},getName:e=>e.name,getTrn:e=>resourceTrn(t,`workflow`,e)});for(let e of Object.values(i)){let i=b[e.name],s=addDependencyRecords(await buildMetaRequest({trn:resourceTrn(t,`workflow`,e.name),appName:n,appId:r}),{key:Q.workflow(e.name),dependentApps:h,runAppIds:g,pinned:e.publishEvents!==void 0});addDependencyRecords(s,{key:Q.workflowJobs(e.name),dependentApps:h,runAppIds:g,pinned:everyJobDeclaresPublishEvents(e.name),scope:`jobs`});let d=a[e.mainJob.name];if(!d)throw Error(`Job "${e.mainJob.name}" (mainJob of workflow "${e.name}") was not found.\n\nPossible causes:\n - The job is not exported as a named export\n - The file containing the job is not included in workflow.files glob pattern\n\nSolution:\n export const ${e.mainJob.name} = createWorkflowJob({ name: "${e.mainJob.name}", ... })`);d.forEach(e=>p.add(e));let _={...e,publishEvents:resolvePublishEvents({explicit:e.publishEvents,subscribed:isSubscribed(m,e.name),conflict:Mi.workflow(e.name)})};if(i){if(trackDesiredResourceOwnership({labels:i.allLabels,ownerLabel:i.label,appName:n,appId:r,resourceType:`Workflow`,resourceName:e.name,conflicts:l,unmanaged:u})&&hasMatchingSdkVersion(i.allLabels,s.labels)&&canTreatWorkflowAsUnchanged({existing:i.resource,workflow:_,usedJobNames:d,unchangedJobFunctions:o,staleJobFunctionNames:y})){c.unchanged.push({name:e.name,metaRequest:s});for(let e of d)f.add(e)}else c.updates.push({name:e.name,workspaceId:t,workflow:_,usedJobNames:d,metaRequest:s});delete b[e.name]}else c.creates.push({name:e.name,workspaceId:t,workflow:_,usedJobNames:d,metaRequest:s})}let x=[];Object.values(b).forEach(e=>{if(!e)return;let i=trackRemainingResourceOwner({labels:e.allLabels,ownerLabel:e.label,appName:n,appId:r,resourceOwners:d}),a=getExistingWorkflowJobNames(e.resource);i?x.push({name:e.resource.name,workspaceId:t,workflowId:e.resource.id,usedJobNames:a,deletableJobNames:[]}):a.forEach(e=>p.add(e))});let S=await planWorkflowJobFunctionDeletes({client:e,workspaceId:t,appName:n,appId:r,existingJobFunctionNames:[..._.keys()],retainedWorkflowJobNames:p,resourceOwners:d}),C=new Set(S.map(e=>e.jobFunctionName));for(let e of x)c.deletes.push({...e,deletableJobNames:e.usedJobNames.filter(e=>!p.has(e)&&C.has(e))});return{changeSet:c,conflicts:l,unmanaged:u,resourceOwners:d,appName:n,appId:r,unchangedWorkflowJobNames:f,jobFunctionDeletes:S,jobFunctionPublishEvents:v}}async function fetchExistingJobFunctions(e,t){let n=await At(async(n,r)=>{let i=await e.listWorkflowJobFunctions({workspaceId:t,pageToken:n,pageSize:r});return[i.jobFunctions,i.nextPageToken]});return new Map(n.map(e=>[e.name,e]))}async function planWorkflowJobFunctionDeletes(e){let{client:t,workspaceId:n,appName:r,appId:i,existingJobFunctionNames:a,retainedWorkflowJobNames:o,resourceOwners:s}=e,c=a.filter(e=>!o.has(e));return(await Promise.all(c.map(async e=>{let{metadata:a}=await t.getMetadata({trn:resourceTrn(n,`workflow_job_function`,e)});return trackRemainingResourceOwner({labels:a?.labels,ownerLabel:a?.labels[`sdk-name`],appName:r,appId:i,resourceOwners:s})?{workspaceId:n,jobFunctionName:e}:void 0}))).filter(e=>e!==void 0)}function formatWorkflowChangeEntries(e,t){return formatChangeEntriesWithFunctionRegistry(`workflow`,e,t,e=>`usedJobNames`in e?e.usedJobNames.map(e=>workflowJobFunctionName(e)):[])}function canTreatWorkflowAsUnchanged(e){let{existing:t,workflow:n,usedJobNames:r,unchangedJobFunctions:i,staleJobFunctionNames:a}=e;return!r.every(e=>i.has(e))||r.some(e=>a.has(e))?!1:areWorkflowsEqual(t,n,r)}function areWorkflowsEqual(e,t,n){return e.mainJobFunctionName===t.mainJob.name&&(e.publishExecutionEvents??!1)===(t.publishEvents??!1)&&areNormalizedEqual(normalizeComparableExistingWorkflowRetryPolicy(e.retryPolicy),normalizeComparableWorkflowRetryPolicy(t.retryPolicy))&&areNormalizedEqual(normalizeComparableConcurrencyPolicy(e.concurrencyPolicy),normalizeComparableConcurrencyPolicy(t.concurrencyPolicy))&&areNormalizedEqual(normalizeComparableWorkflowJobNames(e.jobFunctions),normalizeComparableWorkflowJobNames(n))}function normalizeComparableExistingWorkflowRetryPolicy(e){if(e)return normalizeRetryPolicyForCompare({maxRetries:e.maxRetries??0,backoffMultiplier:e.backoffMultiplier??0,initialBackoff:{seconds:e.initialBackoff?.seconds??0n,nanos:e.initialBackoff?.nanos??0},maxBackoff:{seconds:e.maxBackoff?.seconds??0n,nanos:e.maxBackoff?.nanos??0}})}function normalizeComparableWorkflowRetryPolicy(e){if(e)return normalizeRetryPolicyForCompare({maxRetries:e.maxRetries,backoffMultiplier:e.backoffMultiplier,initialBackoff:parseDurationToProto(e.initialBackoff),maxBackoff:parseDurationToProto(e.maxBackoff)})}function normalizeComparableConcurrencyPolicy(e){if(!(!e||!e.maxConcurrentExecutions))return{maxConcurrentExecutions:e.maxConcurrentExecutions}}function normalizeComparableWorkflowJobNames(e){return Array.isArray(e)?e.toSorted():Object.keys(e??{}).toSorted()}function getExistingWorkflowJobNames(e){let t=new Set(Object.keys(e.jobFunctions??{}));return e.mainJobFunctionName&&t.add(e.mainJobFunctionName),[...t].toSorted()}function normalizeRetryPolicyForCompare(e){return{maxRetries:e.maxRetries,backoffMultiplier:e.backoffMultiplier,initialBackoff:{seconds:String(e.initialBackoff.seconds),nanos:e.initialBackoff.nanos},maxBackoff:{seconds:String(e.maxBackoff.seconds),nanos:e.maxBackoff.nanos}}}function toConcurrencyPolicyInit(e){if(e)return{maxConcurrentExecutions:e.maxConcurrentExecutions}}function normalizeComparableConcurrency(e){if(!(!e||!e.maxConcurrentExecutions))return{maxConcurrentExecutions:e.maxConcurrentExecutions}}function declaredKey(e){if(e.matchType===`exact`)return e.key;let t=e.key;if(typeof t!=`string`)throw Error(`Invalid workflow execution policy "${e.name}": prefix policies must be created via defineWorkflowExecutionPolicy() or defineWorkflowExecutionPolicies(), not a hand-constructed object.`);return t}function toPlatformExecutionPolicyKey(e){let t=declaredKey(e);return e.matchType===`prefix`?`${t}*`:t}function validatePolicy(e){if(declaredKey(e).endsWith(`*`))throw Error(`Invalid workflow execution policy "${e.name}": key must not end with '*'; omit the '*' and set matchType: "prefix" for wildcard policies (the SDK appends '*' automatically).`);let t=Ht.safeParse({name:e.name,key:toPlatformExecutionPolicyKey(e),concurrencyPolicy:e.concurrencyPolicy});if(!t.success)throw Error(`Invalid workflow execution policy "${e.name}": ${t.error.issues.map(e=>e.message).join(`; `)}`)}async function planWorkflowJobFunctionExecutionPolicy(e,t,n,r,i){let a=createChangeSet(`Workflow execution policies`),o=[],s=[],c=new Set,l=Object.values(i);for(let e of l)validatePolicy(e);let u=await fetchExistingResourcesWithLabels({client:e,fetchPage:async(n,r)=>{let i=await e.listWorkflowJobFunctionExecutionPolicies({workspaceId:t,pageToken:n,pageSize:r});return[i.policies,i.nextPageToken]},getName:e=>e.name,getTrn:e=>resourceTrn(t,`workflow_job_function_execution_policy`,e)}),d=new Set;for(let e of l){if(d.has(e.name))throw Error(`Duplicate workflow execution policy name "${e.name}". Each policy must have a unique name within the workspace.`);d.add(e.name);let i=await buildMetaRequest({trn:resourceTrn(t,`workflow_job_function_execution_policy`,e.name),appName:n,appId:r}),c=u[e.name];if(c){let l=trackDesiredResourceOwnership({labels:c.allLabels,ownerLabel:c.label,appName:n,appId:r,resourceType:`Workflow execution policy`,resourceName:e.name,conflicts:o,unmanaged:s}),d=c.resource.executionPolicyKey,f=toPlatformExecutionPolicyKey(e),p=normalizeComparableConcurrency(c.resource.concurrencyPolicy),m=normalizeComparableConcurrency(e.concurrencyPolicy);l&&hasMatchingSdkVersion(c.allLabels,i.labels)&&d===f&&areNormalizedEqual(p,m)?a.unchanged.push({name:e.name}):d===f?a.updates.push({name:e.name,workspaceId:t,policy:e,metaRequest:i}):a.replaces.push({name:e.name,workspaceId:t,policy:e,metaRequest:i}),delete u[e.name]}else a.creates.push({name:e.name,workspaceId:t,policy:e,metaRequest:i})}for(let[e,i]of Object.entries(u))i&&trackRemainingResourceOwner({labels:i.allLabels,ownerLabel:i.label,appName:n,appId:r,resourceOwners:c})&&a.deletes.push({name:e,workspaceId:t});return{changeSet:a,conflicts:o,unmanaged:s,resourceOwners:c}}async function applyWorkflowJobFunctionExecutionPolicy(e,t,n=`create-update`){let{changeSet:r}=t;n===`create-update`?await Promise.all([...r.replaces.map(async t=>{await e.deleteWorkflowJobFunctionExecutionPolicy({workspaceId:t.workspaceId,executionPolicyName:t.name}),await e.createWorkflowJobFunctionExecutionPolicy({workspaceId:t.workspaceId,executionPolicyName:t.policy.name,executionPolicyKey:toPlatformExecutionPolicyKey(t.policy),concurrencyPolicy:toConcurrencyPolicyInit(t.policy.concurrencyPolicy)}),await writeMetadataLabels(e,t.metaRequest)}),...r.creates.map(async t=>{await e.createWorkflowJobFunctionExecutionPolicy({workspaceId:t.workspaceId,executionPolicyName:t.policy.name,executionPolicyKey:toPlatformExecutionPolicyKey(t.policy),concurrencyPolicy:toConcurrencyPolicyInit(t.policy.concurrencyPolicy)}),await writeMetadataLabels(e,t.metaRequest)}),...r.updates.map(async t=>{await e.updateWorkflowJobFunctionExecutionPolicy({workspaceId:t.workspaceId,executionPolicyName:t.policy.name,concurrencyPolicy:toConcurrencyPolicyInit(t.policy.concurrencyPolicy)}),await writeMetadataLabels(e,t.metaRequest)})]):await Promise.all(r.deletes.map(t=>e.deleteWorkflowJobFunctionExecutionPolicy({workspaceId:t.workspaceId,executionPolicyName:t.name})))}function deploymentPlanResults(e){let{application:t,...n}=e;return n}async function applyDeploymentPlans(e,t,n){let forEachDeployment=async e=>{for(let t of n)await e(t)},step=(e,t)=>z(e,()=>forEachDeployment(t));await z(`apply.preflight`,async()=>{await forEachDeployment(t=>preflightTailorDB(e,t.tailorDB))}),await withMetadataWriteBatch(e,async e=>{await z(`apply.createUpdateServices`,async()=>{await step(`apply.secretManager.createUpdate`,t=>applySecretManager(e,t.secretManager,`create-update`,t.application)),await step(`apply.functionRegistry.createUpdate`,n=>applyFunctionRegistry(e,t,n.functionRegistry,`create-update`)),await step(`apply.staticWebsite.createUpdate`,t=>applyStaticWebsite(e,t.staticWebsite,`create-update`)),await step(`apply.aiGateway.createUpdate`,t=>applyAIGateway(e,t.aiGateway,`create-update`)),await step(`apply.idp.createUpdate`,t=>applyIdP(e,t.idp,`create-update`)),await step(`apply.auth.createUpdatePrerequisites`,t=>applyAuth(e,t.auth,`create-update-prerequisites`)),await step(`apply.tailorDB.createUpdate`,t=>applyTailorDB(e,t.tailorDB,`create-update`)),await step(`apply.auth.createUpdateDependents`,t=>applyAuth(e,t.auth,`create-update-dependents`)),await step(`apply.pipeline.createUpdate`,t=>applyPipeline(e,t.pipeline,`create-update`))}),await z(`apply.deleteSubgraphResources`,async()=>{await forEachDeployment(t=>applyPipeline(e,t.pipeline,`delete-resources`)),await forEachDeployment(t=>applyAuth(e,t.auth,`delete-resources`)),await forEachDeployment(t=>applyIdP(e,t.idp,`delete-resources`))}),await z(`apply.createUpdateApplication`,async()=>{await forEachDeployment(t=>applyApplication(e,t.app,`create-update`))}),await z(`apply.createUpdateDependentServices`,async()=>{await step(`apply.executor.createUpdate`,t=>applyExecutor(e,t.executor,`create-update`)),await step(`apply.workflowExecutionPolicy.createUpdate`,t=>applyWorkflowJobFunctionExecutionPolicy(e,t.workflowExecutionPolicy,`create-update`)),await step(`apply.workflow.createUpdate`,t=>applyWorkflow(e,t.workflow,`create-update`))})}),await z(`apply.deleteDependentServices`,async()=>{await forEachDeployment(t=>applyWorkflow(e,t.workflow,`delete`)),await forEachDeployment(t=>applyWorkflowJobFunctionExecutionPolicy(e,t.workflowExecutionPolicy,`delete`)),await forEachDeployment(t=>applyExecutor(e,t.executor,`delete`)),await forEachDeployment(t=>applyStaticWebsite(e,t.staticWebsite,`delete`)),await forEachDeployment(t=>applyAIGateway(e,t.aiGateway,`delete`)),await forEachDeployment(t=>applySecretManager(e,t.secretManager,`delete`,t.application))}),await z(`apply.deleteApplication`,async()=>{await forEachDeployment(t=>applyApplication(e,t.app,`delete`))}),await z(`apply.deleteSubgraphServices`,async()=>{await forEachDeployment(t=>applyPipeline(e,t.pipeline,`delete-services`)),await forEachDeployment(t=>applyAuth(e,t.auth,`delete-services`)),await forEachDeployment(t=>applyIdP(e,t.idp,`delete-services`)),await forEachDeployment(t=>applyTailorDB(e,t.tailorDB,`delete-services`))}),await z(`apply.cleanup`,async()=>{await forEachDeployment(n=>applyFunctionRegistry(e,t,n.functionRegistry,`delete`))})}function setBundledScript(e,t,n,r){if(e.has(t))throw Error(`Duplicate ${r} bundle name "${t}" across config files.`);e.set(t,n)}function addBundledScripts(e,t,n){for(let[r,i]of t)setBundledScript(e,r,i,n)}function mergeBundledScripts(e){let t={resolvers:new Map,executors:new Map,workflowJobs:new Map,authHooks:new Map};for(let n of e)addBundledScripts(t.resolvers,n.bundledScripts.resolvers,`resolver`),addBundledScripts(t.executors,n.bundledScripts.executors,`executor`),addBundledScripts(t.workflowJobs,n.bundledScripts.workflowJobs,`workflow job`),addBundledScripts(t.authHooks,n.bundledScripts.authHooks,`auth hook`);return t}async function confirmMigrationCheckpointRepairs(e,t){if(e.length!==0){M.warn(`TailorDB migration checkpoints and history IDs need to be updated before this deployment:`);for(let t of e.toSorted((e,t)=>e.namespace.localeCompare(t.namespace)))M.log(` ${t.namespace}:`),M.log(` Checkpoint: ${formatMigrationNumber(t.from)} → ${formatMigrationNumber(t.to)}`),M.log(` Migration history ID: ${t.fromHistoryId??`<unset>`} → ${t.toHistoryId}`);if(M.log(` The checkpoint reset itself changes only metadata.`),M.log(` This deployment may still apply pending schema or data migrations afterward.`),!t&&!await Z.confirm({message:`Reset these migration checkpoints, align their history IDs, and continue with the deployment?`,default:!1}))throw Error(`Apply cancelled: migration checkpoint reset was not confirmed.`)}}async function confirmOwnerConflict(e,t,n,r){if(e.length===0)return;let i=e.filter(e=>e.currentOwner===t),a=e.filter(e=>e.currentOwner!==t);i.length>0&&await(r?confirmIdRegeneration(i,t,n):confirmMissingConfigId(i,t,n)),a.length>0&&await confirmNameMismatch(a,t,n)}async function confirmIdRegeneration(e,t,n){if(logIdMismatch(`Application id was regenerated for "${t}":`,e),n){M.success(`Re-tagging resources with the new id (--yes flag specified)...`,{mode:`plain`});return}if(!await Z.confirm({message:`Re-tag these resources with the new id for "${t}"?\n${N.dim(`(The id in tailor.config.ts was removed since the previous deploy, so a new one was generated)`)}`,default:!1}))throw Error(L`
|
|
65
65
|
Apply cancelled. Resources remain tagged with the previous id.
|
|
@@ -155,14 +155,14 @@ Function Execution:`)),M.log(` ID: ${n.functionExecutionId}`),n.functionStatus&
|
|
|
155
155
|
Resources tagged with "${r.name}" were left in place: they carry an application id this config does not match.
|
|
156
156
|
Put that id in your config, or run deploy to take them over first, then remove again.
|
|
157
157
|
`);return}M.success(`Successfully removed all resources managed by "${r.name}".`)}});function applicationInfo(e){return{name:e.name,domain:e.domain,url:e.url,auth:e.authNamespace,cors:e.cors,allowedIpAddresses:e.allowedIpAddresses,disableIntrospection:e.disableIntrospection,createdAt:e.createTime?G(e.createTime):null,updatedAt:e.updateTime?G(e.updateTime):null}}async function fetchAIGateways(e,t,n){return(await Promise.all(n.map(async n=>{try{let{aigateway:r}=await e.getAIGateway({workspaceId:t,aigatewayName:n});return r?{name:r.name,url:r.url}:void 0}catch(e){if(e instanceof q&&e.code===K.NotFound)return;throw e}}))).filter(e=>e!==void 0)}async function show(e){let{client:t,workspaceId:n}=await loadOperatorWorkspaceContext({profile:e?.profile,workspaceId:e?.workspaceId}),{config:r}=await loadConfig(e?.configPath),i=r.aiGateways?.length?[...new Set(r.aiGateways.map(e=>e.name))]:[],[a,o,s]=await Promise.all([t.getWorkspace({workspaceId:n}),t.getApplication({workspaceId:n,applicationName:r.name}),fetchAIGateways(t,n,i)]),{name:c,...l}=applicationInfo(A(o.application,`application "${r.name}" not found in workspace`)),u=a.workspace,d=u?await resolveWorkspaceFolderName(t,u):``;return{name:c,workspaceId:n,workspaceName:u?.name??``,...d?{workspaceFolderName:d}:{},workspaceRegion:u?.region??``,...l,aiGateways:s}}const ks=createWorkspaceNameTransformer(`workspaceName`,`workspaceFolderName`),As=X({name:`show`,description:`Show information about the deployed application.`,args:H.strictObject({...Wr}),run:async e=>{let t=await show({workspaceId:e[`workspace-id`],profile:e.profile,configPath:e.config});M.out(t,{display:{workspaceName:ks,workspaceFolderName:null}})}});function createProgress(e,t){let n=0;return{update:()=>{n+=1;let r=Math.round(n/t*100);process.stderr.write(`\r${e} ${n}/${t} (${r}%)`)},finish:()=>{process.stderr.write(`
|
|
158
|
-
`)}}}async function withTimeout(e,t,n){let r=new AbortController;try{return await Promise.race([e,Er(t,void 0,{signal:r.signal}).then(()=>{throw Error(n)})])}finally{r.abort()}}const js=new Set([`.DS_Store`,`thumbs.db`,`desktop.ini`]);function shouldIgnoreFile(e){let t=B.basename(e).toLowerCase();return js.has(t)}async function deployStaticWebsite(e,t,n,r,i=!0){let{deploymentId:a}=await e.createDeployment({workspaceId:t,name:n});if(!a)throw Error(`createDeployment returned empty deploymentId`);let o=await uploadDirectory(e,t,a,r,i),{url:s}=await e.publishDeployment({workspaceId:t,deploymentId:a});if(!s)throw Error(`publishDeployment returned empty url`);return{url:s,skippedFiles:o}}async function uploadDirectory(e,t,n,r,i){let a=await collectFiles(r);if(a.length===0)return M.warn(`No files found under ${r}`),[];let o=rr(5),s=a.length,c=i?createProgress(`Uploading files`,s):void 0,l=[];return await Promise.all(a.map(i=>o(async()=>{await uploadSingleFile(e,t,n,r,i,l),c&&c.update()}))),c&&c.finish(),l}async function collectFiles(e,t=``){let n=B.join(e,t),r=await Or.promises.readdir(n,{withFileTypes:!0}),i=[];for(let n of r){let r=B.join(t,n.name);if(n.isDirectory()){let t=await collectFiles(e,r);i.push(...t)}else n.isFile()&&!n.isSymbolicLink()&&!shouldIgnoreFile(r)&&i.push(r)}return i}async function uploadSingleFile(e,t,n,r,i,a){let o=B.join(r,i),s=kr(i);if(!s){a.push(`${i} (unsupported content type; no MIME mapping found)`);return}let c=s,l=Or.createReadStream(o,{highWaterMark:65536});async function*requestStream(){yield{payload:{case:`initialMetadata`,value:{workspaceId:t,deploymentId:n,filePath:i,contentType:c}}};for await(let e of l)yield{payload:{case:`chunkData`,value:e}}}async function uploadWithLogging(){try{await e.uploadFile(requestStream())}catch(e){if(e instanceof q&&e.code===K.InvalidArgument){a.push(`${i} (server rejected file as invalid: ${e.message})`);return}throw e}}await withTimeout(uploadWithLogging(),12e4,`Upload timed out for "${i}"`)}function logSkippedFiles(e){if(e.length!==0){M.warn(`Deployment completed, but some files failed to upload. These files may have unsupported content types or other validation issues. Please review the list below:`);for(let t of e)M.log(` - ${t}`)}}const Ms=X({name:`deploy`,description:`Deploy a static website from a local build directory.`,args:H.strictObject({...Y,name:V(H.string(),{alias:`n`,description:`Static website name`}),dir:V(H.string(),{alias:`d`,description:`Path to the static website files`,completion:{type:`directory`}})}),run:async e=>{await assertWritable({profile:e.profile}),M.info(`Deploying static website "${e.name}" from directory: ${e.dir}`);let t=await loadAccessToken({profile:e.profile}),n=await F(t),r=e.name,i=B.resolve(process.cwd(),e.dir),a=await loadWorkspaceId({workspaceId:e[`workspace-id`],profile:e.profile});if(!Or.existsSync(i)||!Or.statSync(i).isDirectory())throw Error(`Directory not found or not a directory: ${i}`);let{url:o,skippedFiles:s}=await withTimeout(deployStaticWebsite(n,a,r,i,!e.json),6e5,`Deployment timed out after 10 minutes.`);e.json?M.out({name:r,workspaceId:a,url:o,skippedFiles:s}):(M.success(`Static website "${r}" deployed successfully. URL: ${o}`),logSkippedFiles(s))}});function logBetaWarning(e){M.warn(`The '${e}' command is a beta feature and may introduce breaking changes in future releases.`),M.newline()}function normalizeEditorCommand(e){let t=e?.trim();return t&&t.length>0?t:void 0}function getConfiguredEditorCommand(){return normalizeEditorCommand(process.env.VISUAL)??normalizeEditorCommand(process.env.EDITOR)}function getEditorCommand(){return getConfiguredEditorCommand()??`editor`}function parseEditorCommand(e){let[t,...n]=e.trim().split(/\s+/);if(!t)throw Error(`Editor command is empty.`);return{command:t,args:n}}async function openInEditor(e,t=getEditorCommand()){let{command:n,args:r}=parseEditorCommand(t);return await new Promise((t,i)=>{let a=Dr(n,[...r,e],{stdio:`inherit`,detached:!1});a.once(`error`,e=>i(e)),a.once(`close`,e=>{if(e==null||e===0){t();return}i(Error(`Editor exited with code ${e}.`))})}),!0}async function openInConfiguredEditor(e){let t=getConfiguredEditorCommand();return t?await openInEditor(e,t):!1}function fieldKey(e,t){return`${e}.${t}`}function buildTempFieldName(e,t){let n=`${e}Migrate`;for(let e=1;e<=t.size+1;e++){let r=e===1?n:`${n}${e}`;if(r.length>63)break;if(!t.has(r))return r}throw Error(`Cannot derive a temporary field name for "${e}": every candidate is taken or exceeds 63 characters.`)}function canConvertField(e){return getExpandContractEligibility(e).eligible}function getExpandContractEligibility(e){let{previous:t,current:n,tableName:r,fieldName:i}=e,a=t.tables[r]?.fields[i],o=n.tables[r]?.fields[i];if(!a||!o)return{eligible:!1,reason:`the field does not exist in both schemas`};let s=getExpandContractFieldChangeEligibility(a,o);return s.eligible?isFieldReferenced(t.tables[r],i)||isFieldReferenced(n.tables[r],i)?{eligible:!1,reason:`another schema feature references the field`}:{eligible:!0}:s}function typeMemberNames(e){return e?[...Object.keys(e.fields),...Object.keys(e.files??{}),...Object.keys(e.forwardRelationships??{}),...Object.keys(e.backwardRelationships??{})]:[]}function staticPropertyName(e,t){if(!t&&e.type===`Identifier`)return e.name;if(e.type===`Literal`&&typeof e.value==`string`)return e.value;if(e.type===`TemplateLiteral`&&e.expressions.length===0)return e.quasis[0]?.value.cooked??void 0}const Ns=new Set([`input`,`newRecord`,`oldRecord`,`invoker`,`now`]);function walkScriptAst(e,t,n=[]){if(!e)return;t(e,n);let r=[...n,e],i=e;for(let[e,n]of Object.entries(i))if(e!==`type`&&e!==`parent`){if(Array.isArray(n))for(let e of n)e&&typeof e==`object`&&`type`in e&&walkScriptAst(e,t,r);else n&&typeof n==`object`&&`type`in n&&walkScriptAst(n,t,r)}}function unwrapFunction(e){return e.type===`ParenthesizedExpression`?unwrapFunction(e.expression):e}function collectIssueBindings(e){let t=new Set([`__issues`]);walkScriptAst(e,e=>{if(e.type!==`CallExpression`)return;let n=unwrapFunction(e.callee);if(n.type!==`ArrowFunctionExpression`&&n.type!==`FunctionExpression`||e.arguments[1]?.type!==`Identifier`||e.arguments[1].name!==`__issues`)return;let r=n.params[1];r?.type===`Identifier`&&t.add(r.name)});let n;do{let r=t.size;walkScriptAst(e,e=>{e.type===`VariableDeclarator`&&e.id.type===`Identifier`&&e.init?.type===`Identifier`&&t.has(e.init.name)&&t.add(e.id.name)}),n=t.size>r}while(n);return t}function isWrapperArgumentProperty(e,t){if(e.type!==`Property`)return!1;let n=staticPropertyName(e.key,e.computed);if(!n||!Ns.has(n))return!1;let r=t.at(-1),i=t.at(-2);return r?.type!==`ObjectExpression`||i?.type!==`CallExpression`?!1:i.arguments[0]===r&&[`ArrowFunctionExpression`,`FunctionExpression`].includes(unwrapFunction(i.callee).type)}function isWrapperParameterProperty(e,t){if(e.type!==`Property`)return!1;let n=staticPropertyName(e.key,e.computed);if(!n||!Ns.has(n))return!1;let r=t.at(-1);if(r?.type!==`ObjectPattern`)return!1;for(let e=t.length-2;e>=0;e--){let i=t[e];if(i&&(i.type===`ArrowFunctionExpression`||i.type===`FunctionExpression`)&&i.params[0]===r)return t.slice(0,e).some(e=>e.type===`CallExpression`&&unwrapFunction(e.callee)===i&&e.arguments[0]?.type===`ObjectExpression`&&e.arguments[0].properties.some(e=>e.type===`Property`&&staticPropertyName(e.key,e.computed)===n))}return!1}function isIssueMessage(e,t,n){let r=t.at(-1);return r?.type===`CallExpression`&&r.callee.type===`Identifier`&&n.has(r.callee.name)&&r.arguments.findIndex(t=>t===e)>0}function scriptReferencesField(e,t){try{let{program:n,errors:r}=mr(`expand-contract-reference.js`,e,{sourceType:`module`});if(r.length>0)return!0;let i=collectIssueBindings(n),a=!1;return walkScriptAst(n,(e,n)=>{a||(e.type===`MemberExpression`&&(staticPropertyName(e.property,e.computed)===t||e.computed&&staticPropertyName(e.property,!0)===void 0)||e.type===`Property`&&(staticPropertyName(e.key,e.computed)===t||e.computed&&staticPropertyName(e.key,!0)===void 0)&&(e.computed||!isWrapperArgumentProperty(e,n)&&!isWrapperParameterProperty(e,n))||e.type===`CallExpression`&&e.callee.type===`Identifier`&&i.has(e.callee.name)&&e.arguments[0]!==void 0&&e.arguments[0].type!==`SpreadElement`&&staticPropertyName(e.arguments[0],!0)===t||(e.type===`Literal`||e.type===`TemplateLiteral`)&&staticPropertyName(e,!0)===t&&!isIssueMessage(e,n,i))&&(a=!0)}),a}catch{return!0}}function permissionsReferenceField(e,t){return e?[...e.record?Object.values(e.record).flatMap(e=>e):[],...e.gql??[]].some(e=>e.conditions.some(e=>{let[n,,r]=e;return[n,r].some(e=>isSnapshotFieldRefOperand(e)&&(`record`in e&&e.record===t||`newRecord`in e&&e.newRecord===t||`oldRecord`in e&&e.oldRecord===t))})):!1}function isFieldReferenced(e,t){return e?Object.values(e.indexes??{}).some(e=>e.fields.includes(t))||[...Object.values(e.forwardRelationships??{}),...Object.values(e.backwardRelationships??{})].some(e=>e.sourceField===t||e.targetField===t)||permissionsReferenceField(e.permissions,t)?!0:[e.typeHookExpr?.create,e.typeHookExpr?.update,e.typeValidateExpr].filter(e=>e!==void 0).some(e=>scriptReferencesField(e,t)):!1}function planExpandContract(e){let{previous:t,current:n,diff:r,confirmed:i}=e,a=[],o=new Set;for(let e of r.changes){if(e.kind!==`field_type_modified`)continue;let r=fieldKey(e.tableName,e.fieldName);if(!i.has(r)||!canConvertField({previous:t,current:n,tableName:e.tableName,fieldName:e.fieldName}))continue;let s=new Set([...typeMemberNames(t.tables[e.tableName]),...typeMemberNames(n.tables[e.tableName]),...a.filter(t=>t.tableName===e.tableName).map(e=>e.tempFieldName)]);a.push({tableName:e.tableName,fieldName:e.fieldName,tempFieldName:buildTempFieldName(e.fieldName,s),before:e.before,after:e.after}),o.add(r)}return{plans:a,blocked:r.breakingChanges.filter(e=>e.unsupported&&!(e.fieldName&&o.has(fieldKey(e.tableName,e.fieldName))))}}function extractBreakingChangeFields(e){let t=new Map,n=new Map,r=new Map,i=new Map,a=new Map;for(let o of e.changes)if(o.kind===`field_modified`||o.kind===`field_type_modified`){let{before:e,after:n}=o;if(!e.required&&n.required&&(t.has(o.tableName)||t.set(o.tableName,new Set),A(t.get(o.tableName),`optionalToRequired entry missing`).add(o.fieldName)),e.type===`enum`&&n.type===`enum`&&e.allowedValues&&n.allowedValues){let t=e.allowedValues.map(e=>e.value),i=n.allowedValues.map(e=>e.value),a=new Set(t),s=new Set(i);(t.some(e=>!s.has(e))||i.some(e=>!a.has(e)))&&(r.has(o.tableName)||r.set(o.tableName,new Map),A(r.get(o.tableName),`enumValueChanges entry missing`).set(o.fieldName,{beforeValues:t,afterValues:i}))}}else if(o.kind===`field_added`){let{after:e}=o;e.required&&(n.has(o.tableName)||n.set(o.tableName,new Map),A(n.get(o.tableName),`addedRequiredFields entry missing`).set(o.fieldName,e))}else o.kind===`field_renamed`?(i.has(o.tableName)||i.set(o.tableName,new Map),A(i.get(o.tableName),`renamedFields entry missing`).set(o.fieldName,o.after)):o.kind===`table_renamed`&&a.set(o.tableName,o.after);return{optionalToRequired:t,addedRequiredFields:n,enumValueChanges:r,renamedFields:i,clearedFields:new Map,renamedTypes:a}}function generateDbTypesFromSnapshot(e,t,n=[]){let r=t?extractBreakingChangeFields(t):{optionalToRequired:new Map,addedRequiredFields:new Map,enumValueChanges:new Map,renamedFields:new Map,clearedFields:new Map,renamedTypes:new Map};for(let e of n){let t=r.renamedFields.get(e.tableName)??new Map;t.set(e.tempFieldName,{...e.after,required:!1,unique:!1}),r.renamedFields.set(e.tableName,t);let n=r.clearedFields.get(e.tableName)??new Set;n.add(e.fieldName),r.clearedFields.set(e.tableName,n)}let i=[...Object.values(e.tables),...r.renamedTypes.values()];if(i.length===0)return generateEmptyDbTypes(e.namespace);let a=new Set,o=!1,s=[];for(let e of i){let t=generateTableType(e,r);t.usedTimestamp&&a.add(`Timestamp`),o||=t.usedArrayColumnType,s.push(t.typeDef)}let c=[`type ColumnType`,`type Transaction as KyselyTransaction`];o&&c.push(`type ArrayColumnType`);let l=[];return a.has(`Timestamp`)&&l.push(`type Timestamp = ColumnType<Date, Date | string, Date | string>;`),l.push(`type Generated<T> = T extends ColumnType<infer S, infer I, infer U>
|
|
158
|
+
`)}}}async function withTimeout(e,t,n){let r=new AbortController;try{return await Promise.race([e,Er(t,void 0,{signal:r.signal}).then(()=>{throw Error(n)})])}finally{r.abort()}}const js=new Set([`.DS_Store`,`thumbs.db`,`desktop.ini`]);function shouldIgnoreFile(e){let t=B.basename(e).toLowerCase();return js.has(t)}async function deployStaticWebsite(e,t,n,r,i=!0){let{deploymentId:a}=await e.createDeployment({workspaceId:t,name:n});if(!a)throw Error(`createDeployment returned empty deploymentId`);let o=await uploadDirectory(e,t,a,r,i),{url:s}=await e.publishDeployment({workspaceId:t,deploymentId:a});if(!s)throw Error(`publishDeployment returned empty url`);return{url:s,skippedFiles:o}}async function uploadDirectory(e,t,n,r,i){let a=await collectFiles(r);if(a.length===0)return M.warn(`No files found under ${r}`),[];let o=rr(5),s=a.length,c=i?createProgress(`Uploading files`,s):void 0,l=[];return await Promise.all(a.map(i=>o(async()=>{await uploadSingleFile(e,t,n,r,i,l),c&&c.update()}))),c&&c.finish(),l}async function collectFiles(e,t=``){let n=B.join(e,t),r=await Or.promises.readdir(n,{withFileTypes:!0}),i=[];for(let n of r){let r=B.join(t,n.name);if(n.isDirectory()){let t=await collectFiles(e,r);i.push(...t)}else n.isFile()&&!n.isSymbolicLink()&&!shouldIgnoreFile(r)&&i.push(r)}return i}async function uploadSingleFile(e,t,n,r,i,a){let o=B.join(r,i),s=kr(i);if(!s){a.push(`${i} (unsupported content type; no MIME mapping found)`);return}let c=s,l=Or.createReadStream(o,{highWaterMark:65536});async function*requestStream(){yield{payload:{case:`initialMetadata`,value:{workspaceId:t,deploymentId:n,filePath:i,contentType:c}}};for await(let e of l)yield{payload:{case:`chunkData`,value:e}}}async function uploadWithLogging(){try{await e.uploadFile(requestStream())}catch(e){if(e instanceof q&&e.code===K.InvalidArgument){a.push(`${i} (server rejected file as invalid: ${e.message})`);return}throw e}}await withTimeout(uploadWithLogging(),12e4,`Upload timed out for "${i}"`)}function logSkippedFiles(e){if(e.length!==0){M.warn(`Deployment completed, but some files failed to upload. These files may have unsupported content types or other validation issues. Please review the list below:`);for(let t of e)M.log(` - ${t}`)}}const Ms=X({name:`deploy`,description:`Deploy a static website from a local build directory.`,args:H.strictObject({...Y,name:V(H.string(),{alias:`n`,description:`Static website name`}),dir:V(H.string(),{alias:`d`,description:`Path to the static website files`,completion:{type:`directory`}})}),run:async e=>{await assertWritable({profile:e.profile}),M.info(`Deploying static website "${e.name}" from directory: ${e.dir}`);let t=await loadAccessToken({profile:e.profile}),n=await F(t),r=e.name,i=B.resolve(process.cwd(),e.dir),a=await loadWorkspaceId({workspaceId:e[`workspace-id`],profile:e.profile});if(!Or.existsSync(i)||!Or.statSync(i).isDirectory())throw Error(`Directory not found or not a directory: ${i}`);let{url:o,skippedFiles:s}=await withTimeout(deployStaticWebsite(n,a,r,i,!e.json),6e5,`Deployment timed out after 10 minutes.`);e.json?M.out({name:r,workspaceId:a,url:o,skippedFiles:s}):(M.success(`Static website "${r}" deployed successfully. URL: ${o}`),logSkippedFiles(s))}});function logBetaWarning(e){M.warn(`The '${e}' command is a beta feature and may introduce breaking changes in future releases.`),M.newline()}function normalizeEditorCommand(e){let t=e?.trim();return t&&t.length>0?t:void 0}function getConfiguredEditorCommand(){return normalizeEditorCommand(process.env.VISUAL)??normalizeEditorCommand(process.env.EDITOR)}function getEditorCommand(){return getConfiguredEditorCommand()??`editor`}function parseEditorCommand(e){let[t,...n]=e.trim().split(/\s+/);if(!t)throw Error(`Editor command is empty.`);return{command:t,args:n}}async function openInEditor(e,t=getEditorCommand()){let{command:n,args:r}=parseEditorCommand(t);return await new Promise((t,i)=>{let a=Dr(n,[...r,e],{stdio:`inherit`,detached:!1});a.once(`error`,e=>i(e)),a.once(`close`,e=>{if(e==null||e===0){t();return}i(Error(`Editor exited with code ${e}.`))})}),!0}async function openInConfiguredEditor(e){let t=getConfiguredEditorCommand();return t?await openInEditor(e,t):!1}function fieldKey(e,t){return`${e}.${t}`}function buildTempFieldName(e,t){let n=`${e}Migrate`;for(let e=1;e<=t.size+1;e++){let r=e===1?n:`${n}${e}`;if(r.length>63)break;if(!t.has(r))return r}throw Error(`Cannot derive a temporary field name for "${e}": every candidate is taken or exceeds 63 characters.`)}function canConvertField(e){return getExpandContractEligibility(e).eligible}function getExpandContractEligibility(e){let{previous:t,current:n,tableName:r,fieldName:i}=e,a=t.tables[r]?.fields[i],o=n.tables[r]?.fields[i];if(!a||!o)return{eligible:!1,reason:`the field does not exist in both schemas`};let s=getExpandContractFieldChangeEligibility(a,o);return s.eligible?isFieldReferenced(t.tables[r],i)||isFieldReferenced(n.tables[r],i)?{eligible:!1,reason:`another schema feature references the field`}:{eligible:!0}:s}function typeMemberNames(e){return e?[...Object.keys(e.fields),...Object.keys(e.files??{}),...Object.keys(e.forwardRelationships??{}),...Object.keys(e.backwardRelationships??{})]:[]}function staticPropertyName(e,t){if(!t&&e.type===`Identifier`)return e.name;if(e.type===`Literal`&&typeof e.value==`string`)return e.value;if(e.type===`TemplateLiteral`&&e.expressions.length===0)return e.quasis[0]?.value.cooked??void 0}const Ns=new Set([`input`,`newRecord`,`oldRecord`,`invoker`,`now`]);function walkScriptAst(e,t,n=[]){if(!e)return;t(e,n);let r=[...n,e],i=e;for(let[e,n]of Object.entries(i))if(e!==`type`&&e!==`parent`){if(Array.isArray(n))for(let e of n)e&&typeof e==`object`&&`type`in e&&walkScriptAst(e,t,r);else n&&typeof n==`object`&&`type`in n&&walkScriptAst(n,t,r)}}function unwrapFunction(e){return e.type===`ParenthesizedExpression`?unwrapFunction(e.expression):e}function collectIssueBindings(e){let t=new Set([`__issues`]);walkScriptAst(e,e=>{if(e.type!==`CallExpression`)return;let n=unwrapFunction(e.callee);if(n.type!==`ArrowFunctionExpression`&&n.type!==`FunctionExpression`||e.arguments[1]?.type!==`Identifier`||e.arguments[1].name!==`__issues`)return;let r=n.params[1];r?.type===`Identifier`&&t.add(r.name)});let n;do{let r=t.size;walkScriptAst(e,e=>{e.type===`VariableDeclarator`&&e.id.type===`Identifier`&&e.init?.type===`Identifier`&&t.has(e.init.name)&&t.add(e.id.name)}),n=t.size>r}while(n);return t}function isWrapperArgumentProperty(e,t){if(e.type!==`Property`)return!1;let n=staticPropertyName(e.key,e.computed);if(!n||!Ns.has(n))return!1;let r=t.at(-1),i=t.at(-2);return r?.type!==`ObjectExpression`||i?.type!==`CallExpression`?!1:i.arguments[0]===r&&[`ArrowFunctionExpression`,`FunctionExpression`].includes(unwrapFunction(i.callee).type)}function isWrapperParameterProperty(e,t){if(e.type!==`Property`)return!1;let n=staticPropertyName(e.key,e.computed);if(!n||!Ns.has(n))return!1;let r=t.at(-1);if(r?.type!==`ObjectPattern`)return!1;for(let e=t.length-2;e>=0;e--){let i=t[e];if(i&&(i.type===`ArrowFunctionExpression`||i.type===`FunctionExpression`)&&i.params[0]===r)return t.slice(0,e).some(e=>e.type===`CallExpression`&&unwrapFunction(e.callee)===i&&e.arguments[0]?.type===`ObjectExpression`&&e.arguments[0].properties.some(e=>e.type===`Property`&&staticPropertyName(e.key,e.computed)===n))}return!1}function isIssueMessage(e,t,n){let r=t.at(-1);return r?.type===`CallExpression`&&r.callee.type===`Identifier`&&n.has(r.callee.name)&&r.arguments.findIndex(t=>t===e)>0}function scriptReferencesField(e,t){try{let{program:n,errors:r}=mr(`expand-contract-reference.js`,e,{sourceType:`module`});if(r.length>0)return!0;let i=collectIssueBindings(n),a=!1;return walkScriptAst(n,(e,n)=>{a||(e.type===`MemberExpression`&&(staticPropertyName(e.property,e.computed)===t||e.computed&&staticPropertyName(e.property,!0)===void 0)||e.type===`Property`&&(staticPropertyName(e.key,e.computed)===t||e.computed&&staticPropertyName(e.key,!0)===void 0)&&(e.computed||!isWrapperArgumentProperty(e,n)&&!isWrapperParameterProperty(e,n))||e.type===`CallExpression`&&e.callee.type===`Identifier`&&i.has(e.callee.name)&&e.arguments[0]!==void 0&&e.arguments[0].type!==`SpreadElement`&&staticPropertyName(e.arguments[0],!0)===t||(e.type===`Literal`||e.type===`TemplateLiteral`)&&staticPropertyName(e,!0)===t&&!isIssueMessage(e,n,i))&&(a=!0)}),a}catch{return!0}}function permissionsReferenceField(e,t){return e?[...e.record?Object.values(e.record).flatMap(e=>e):[],...e.gql??[]].some(e=>e.conditions.some(e=>{let[n,,r]=e;return[n,r].some(e=>isSnapshotFieldRefOperand(e)&&(`record`in e&&e.record===t||`newRecord`in e&&e.newRecord===t||`oldRecord`in e&&e.oldRecord===t))})):!1}function isFieldReferenced(e,t){return e?Object.values(e.indexes??{}).some(e=>e.fields.includes(t))||[...Object.values(e.forwardRelationships??{}),...Object.values(e.backwardRelationships??{})].some(e=>e.sourceField===t||e.targetField===t)||permissionsReferenceField(e.permissions,t)?!0:[e.typeHookExpr?.create,e.typeHookExpr?.update,e.typeValidateExpr].filter(e=>e!==void 0).some(e=>scriptReferencesField(e,t)):!1}function planExpandContract(e){let{previous:t,current:n,diff:r,confirmed:i}=e,a=[],o=new Set;for(let e of r.changes){if(e.kind!==`field_type_modified`)continue;let r=fieldKey(e.tableName,e.fieldName);if(!i.has(r)||!canConvertField({previous:t,current:n,tableName:e.tableName,fieldName:e.fieldName}))continue;let s=new Set([...typeMemberNames(t.tables[e.tableName]),...typeMemberNames(n.tables[e.tableName]),...a.filter(t=>t.tableName===e.tableName).map(e=>e.tempFieldName)]);a.push({tableName:e.tableName,fieldName:e.fieldName,tempFieldName:buildTempFieldName(e.fieldName,s),before:e.before,after:e.after}),o.add(r)}return{plans:a,blocked:r.breakingChanges.filter(e=>e.unsupported&&!(e.fieldName&&o.has(fieldKey(e.tableName,e.fieldName))))}}function extractBreakingChangeFields(e){let t=new Map,n=new Map,r=new Map,i=new Map,a=new Map;for(let o of e.changes)if(o.kind===`field_modified`||o.kind===`field_type_modified`){let{before:e,after:n}=o;if(!e.required&&n.required&&(t.has(o.tableName)||t.set(o.tableName,new Set),A(t.get(o.tableName),`optionalToRequired entry missing`).add(o.fieldName)),e.type===`enum`&&n.type===`enum`){let t=(e.allowedValues??[]).map(e=>e.value),i=(n.allowedValues??[]).map(e=>e.value),a=new Set(t),s=new Set(i);(t.some(e=>!s.has(e))||i.some(e=>!a.has(e)))&&(r.has(o.tableName)||r.set(o.tableName,new Map),A(r.get(o.tableName),`enumValueChanges entry missing`).set(o.fieldName,{beforeValues:t,afterValues:i,afterRequired:n.required}))}}else if(o.kind===`field_added`){let{after:e}=o;e.required&&(n.has(o.tableName)||n.set(o.tableName,new Map),A(n.get(o.tableName),`addedRequiredFields entry missing`).set(o.fieldName,e))}else o.kind===`field_renamed`?(i.has(o.tableName)||i.set(o.tableName,new Map),A(i.get(o.tableName),`renamedFields entry missing`).set(o.fieldName,o.after)):o.kind===`table_renamed`&&a.set(o.tableName,o.after);return{optionalToRequired:t,addedRequiredFields:n,enumValueChanges:r,renamedFields:i,clearedFields:new Map,renamedTypes:a}}function generateDbTypesFromSnapshot(e,t,n=[]){let r=t?extractBreakingChangeFields(t):{optionalToRequired:new Map,addedRequiredFields:new Map,enumValueChanges:new Map,renamedFields:new Map,clearedFields:new Map,renamedTypes:new Map};for(let e of n){let t=r.renamedFields.get(e.tableName)??new Map;t.set(e.tempFieldName,{...e.after,required:!1,unique:!1}),r.renamedFields.set(e.tableName,t);let n=r.clearedFields.get(e.tableName)??new Set;n.add(e.fieldName),r.clearedFields.set(e.tableName,n)}let i=[...Object.values(e.tables),...r.renamedTypes.values()];if(i.length===0)return generateEmptyDbTypes(e.namespace);let a=new Set,o=!1,s=[];for(let e of i){let t=generateTableType(e,r);t.usedTimestamp&&a.add(`Timestamp`),o||=t.usedArrayColumnType,s.push(t.typeDef)}let c=[`type ColumnType`,`type Transaction as KyselyTransaction`];o&&c.push(`type ArrayColumnType`);let l=[];return a.has(`Timestamp`)&&l.push(`type Timestamp = ColumnType<Date, Date | string, Date | string>;`),l.push(`type Generated<T> = T extends ColumnType<infer S, infer I, infer U>
|
|
159
159
|
? ColumnType<S, I | undefined, U>
|
|
160
160
|
: ColumnType<T, T | undefined, T>;`),a.has(`Serial`)&&l.push(`type Serial<T = string | number> = ColumnType<T, never, never>;`),[`/**`,` * Auto-generated Kysely types for migration script.`,` * These types reflect the database schema state at this migration point.`,` *`,` * DO NOT EDIT - This file is auto-generated by the migration system.`,` */`,``,`import { ${c.join(`, `)} } from "@tailor-platform/sdk/kysely";`,`import type { Env } from "@tailor-platform/sdk";`,``,...l,``,`export interface Database {`,...s,`}`,``,`export type Transaction = KyselyTransaction<Database>;`,``,"/** Context passed as the second argument to the migration's `main` function. */",`export type MigrationContext = {`,` env: keyof Env extends never ? Record<string, string | number | boolean> : Env;`,`};`].join(`
|
|
161
161
|
`)+`
|
|
162
162
|
`}function generateEmptyDbTypes(e){return[`/**`,` * Auto-generated Kysely types for migration script.`,` * Namespace: ${e}`,` *`,` * DO NOT EDIT - This file is auto-generated by the migration system.`,` */`,``,`import { type Transaction as KyselyTransaction } from "@tailor-platform/sdk/kysely";`,`import type { Env } from "@tailor-platform/sdk";`,``,`// eslint-disable-next-line @typescript-eslint/no-empty-object-type`,`export interface Database {}`,``,`export type Transaction = KyselyTransaction<Database>;`,``,"/** Context passed as the second argument to the migration's `main` function. */",`export type MigrationContext = {`,` env: keyof Env extends never ? Record<string, string | number | boolean> : Env;`,`};`].join(`
|
|
163
163
|
`)+`
|
|
164
164
|
`}function generateTableType(e,t){let n=[],r=!1,i=!1,a=!1;n.push(` id: Generated<string>;`);let o=t.optionalToRequired.get(e.name)||new Set,s=t.addedRequiredFields.get(e.name)||new Map,c=t.enumValueChanges.get(e.name)||new Map,l=t.clearedFields.get(e.name)??new Set;for(let[t,s]of Object.entries(e.fields)){if(t===`id`)continue;let e=generateFieldType(s,o.has(t),c.get(t)),u=l.has(t),d=u?generateClearableFieldType(s):e;n.push(` ${t}: ${d.type};`),r||=d.usedTimestamp,i=i||e.usedColumnType||u,a||=!u&&e.usedArrayColumnType}for(let[e,t]of s){let o=generateFieldType(t,!0,void 0);n.push(` ${e}: ${o.type};`),r||=o.usedTimestamp,i||=o.usedColumnType,a||=o.usedArrayColumnType}let u=t.renamedFields.get(e.name)||new Map;for(let[e,t]of u){let o=generateFieldType(t,t.required,void 0);n.push(` ${e}: ${o.type};`),r||=o.usedTimestamp,i||=o.usedColumnType,a||=o.usedArrayColumnType}return{typeDef:` ${e.name}: {\n${n.join(`
|
|
165
|
-
`)}\n }`,usedTimestamp:r,usedColumnType:i,usedArrayColumnType:a}}function mapToTsType(e){if(e===`enum`||e===`nested`)return{type:`string`,usedTimestamp:!1};let t=xn(e);return{type:t,usedTimestamp:t===`Timestamp`}}function formatEnumUnion(e){return e.
|
|
165
|
+
`)}\n }`,usedTimestamp:r,usedColumnType:i,usedArrayColumnType:a}}function mapToTsType(e){if(e===`enum`||e===`nested`)return{type:`string`,usedTimestamp:!1};let t=xn(e);return{type:t,usedTimestamp:t===`Timestamp`}}function formatEnumUnion(e){return e.map(e=>`"${e}"`).join(` | `)}function formatEnumSlot(e,t,n){if(e.length===0)return t?n?`never[] | null`:`never[]`:n?`null`:`never`;let r=formatEnumUnion(e);return t?n?`(${r})[] | null`:`(${r})[]`:n?`(${r}) | null`:r}function generateEnumChangeColumnType(e,t){let n=t.array??!1,r=[...new Set([...e.beforeValues,...e.afterValues])],i=!e.afterRequired,a=formatEnumSlot(r,n,!t.required||i),o=formatEnumSlot(e.afterValues,n,i);return`ColumnType<${a}, ${o}, ${o}>`}function generateClearableFieldType(e){let{type:t}=mapToTsType(e.type),n=Sn.get(t);if(n){let t=e.array?`${n.select}[]`:n.select,r=e.array?`(${n.write})[]`:n.write;return{type:`ColumnType<${t} | null, ${r} | null, ${r} | null>`,usedTimestamp:!1}}let r=e.array?`${t}[]`:t;return{type:`ColumnType<${r} | null, ${r} | null, ${r} | null>`,usedTimestamp:!1}}function generateOptionalToRequiredDateColumnType(e){if(e.type!==`date`&&e.type!==`datetime`)return null;let t=Sn.get(xn(e.type));if(!t)return null;let n=e.array?`${t.select}[]`:t.select,r=e.array?`(${t.write})[]`:t.write;return`ColumnType<${n} | null, ${r}, ${r}>`}function generateFieldType(e,t,n){if(n)return{type:generateEnumChangeColumnType(n,e),usedTimestamp:!1,usedColumnType:!0,usedArrayColumnType:!1};let r,i=!1;if(e.type===`enum`){let t=e.allowedValues?.map(e=>e.value)??[];r=t.length>0?formatEnumUnion(t):`string`}else{let t=mapToTsType(e.type);r=t.type,i=t.usedTimestamp}if(t){let t=generateOptionalToRequiredDateColumnType(e);if(t)return{type:t,usedTimestamp:!1,usedColumnType:!0,usedArrayColumnType:!1}}let a=r;if(e.array){if(Sn.has(r)){let t=`ArrayColumnType<${r}>`;return{type:e.required?t:`${t} | null`,usedTimestamp:i,usedColumnType:!1,usedArrayColumnType:!0}}a=e.type===`enum`&&e.allowedValues&&e.allowedValues.length>0?`(${r})[]`:`${r}[]`}return t?{type:`ColumnType<${a} | null, ${a}, ${a}>`,usedTimestamp:i,usedColumnType:!0,usedArrayColumnType:!1}:(e.required||(a=`${a} | null`),{type:a,usedTimestamp:i,usedColumnType:!1,usedArrayColumnType:!1})}async function writeDbTypesFile(e,t,n,r,i=[]){let a=generateDbTypesFromSnapshot(e,r,i),o=getMigrationFilePath(t,n,`db`);return await J.writeFile(o,a),o}const Ps=`TODO(tailor-migration-review)`;async function fileExists(e){try{return await J.access(e),!0}catch{return!1}}async function ensureFileNotExists(e){if(await fileExists(e))throw Error(`Migration file already exists: ${e}`)}async function generateSchemaFile(e,t,n){let r=getMigrationDirPath(t,n);await J.mkdir(r,{recursive:!0});let i=getMigrationFilePath(t,n,`schema`);return await ensureFileNotExists(i),await J.writeFile(i,JSON.stringify(e,null,2)),{filePath:i,migrationNumber:n}}async function generateDiffFiles(e,t,n,r,i,a=[]){let o=getMigrationDirPath(t,n);await J.mkdir(o,{recursive:!0});let s=getMigrationFilePath(t,n,`diff`),c=getMigrationFilePath(t,n,`migrate`),l=getMigrationFilePath(t,n,`db`),u=e.requiresMigrationScript;await ensureFileNotExists(s),u&&(await ensureFileNotExists(c),await ensureFileNotExists(l));let d=i?{...e,description:i}:e;await J.writeFile(s,JSON.stringify(d,null,2));let f={diffFilePath:s,migrationNumber:n};if(u){let e=generateMigrationScript(d,a);await J.writeFile(c,e),f.migrateFilePath=c,await writeDbTypesFile(r,t,n,d,a),f.dbTypesFilePath=l}return f}async function generateDataOnlyMigrationFiles(e){let{migrationsDir:t,migrationNumber:n,snapshot:r,description:i}=e,a=getMigrationDirPath(t,n);await J.mkdir(a,{recursive:!0});let o=getMigrationFilePath(t,n,`diff`),s=getMigrationFilePath(t,n,`migrate`),c=getMigrationFilePath(t,n,`db`);await ensureFileNotExists(o),await ensureFileNotExists(s),await ensureFileNotExists(c);let l=i?{...e.diff,description:i}:e.diff;return await J.writeFile(o,JSON.stringify(l,null,2)),await J.writeFile(s,generateDataOnlyMigrationScript(l.namespace)),await writeDbTypesFile(r,t,n,l),{diffFilePath:o,migrateFilePath:s,dbTypesFilePath:c,migrationNumber:n}}function generateDataOnlyMigrationScript(e){return`/**
|
|
166
166
|
* Data-only migration script for ${e}
|
|
167
167
|
*
|
|
168
168
|
* This migration carries no schema change; it exists to run this script.
|
|
@@ -267,11 +267,11 @@ describe(${JSON.stringify(`${e.namespace} migration`)}, () => {
|
|
|
267
267
|
${e.fieldName}: null, // TODO: Set appropriate default value
|
|
268
268
|
})
|
|
269
269
|
.where("${e.fieldName}", "is", null)
|
|
270
|
-
.execute();`),!t){let t=generateUniqueConstraintScript(e);t&&a.push(t)}if(r.type===`enum`&&i.type===`enum`){let t=(r.allowedValues??[]).map(e=>e.value),n=(i.allowedValues??[]).map(e=>e.value),o=t.filter(e=>!n.includes(e));if(o.length>0){let
|
|
270
|
+
.execute();`),!t){let t=generateUniqueConstraintScript(e);t&&a.push(t)}if(r.type===`enum`&&i.type===`enum`){let t=(r.allowedValues??[]).map(e=>e.value),n=(i.allowedValues??[]).map(e=>e.value),o=t.filter(e=>!n.includes(e));if(o.length>0){let[t]=n,r=t===void 0?i.required?`"NEW_VALUE"`:`null`:JSON.stringify(t);a.push(` // Migrate records with removed enum values: ${o.join(`, `)}
|
|
271
271
|
await trx
|
|
272
272
|
.updateTable("${e.tableName}")
|
|
273
|
-
.set({ ${e.fieldName}:
|
|
274
|
-
.where("${e.fieldName}", "in", [${o.map(e
|
|
273
|
+
.set({ ${e.fieldName}: ${r} }) // TODO: Set appropriate value
|
|
274
|
+
.where("${e.fieldName}", "in", [${o.map(e=>JSON.stringify(e)).join(`, `)}])
|
|
275
275
|
.execute();`)}}return isBreakingForeignKeyRetarget(r,i,n)&&a.push(` // Migrate ${e.fieldName} references from ${r.foreignKeyType} to ${i.foreignKeyType}
|
|
276
276
|
// Find records that don't have a valid reference in the new target table
|
|
277
277
|
{
|
|
@@ -639,4 +639,4 @@ This is the baseline schema. Future changes will be tracked as diffs.`)}function
|
|
|
639
639
|
`}async function bundleQueryScript(e,t){let n=B.resolve(Gt(),`query`);W.mkdirSync(n,{recursive:!0});let r=B.join(n,`query_${e}.entry.ts`),i=e===`sql`?createSqlEntry():createGqlEntry();W.writeFileSync(r,i);let a=await ht(t),o=St({tsconfig:a}),s=await pr.build({plugins:[Ot(r,t),gt(),wt],input:r,write:!1,output:{format:`esm`,sourcemap:!1,minify:!1,codeSplitting:!1,globals:{tailordb:`tailordb`}},external:e===`sql`?[`tailordb`]:[],resolve:{conditionNames:[`node`,`import`]},tsconfig:a,treeshake:{moduleSideEffects:!1,annotations:!0,unknownGlobalSideEffects:!1},...o.options});return o.assertAllResolved(),s.output[0].code}function toErrorMessage(e){return e instanceof Error?e.message:String(e)}function mapQueryExecutionError(e){let t=toErrorMessage(e.error);if(t.includes(`machine user does not exist`))return R({code:`not_found`,message:`Machine user '${e.machineUser??`unknown`}' was not found.`,suggestion:"Run `tailor machineuser list` and use an existing name."});if(e.engine===`sql`&&t.includes(`sqlaccess error: failed to fetch schema: query returned an unexpected number of rows`))return R({code:`invalid_namespace`,message:`Failed to load TailorDB schema for namespace '${e.namespace}'.`,suggestion:`Ensure the query references TailorDB tables from a single namespace and re-apply if needed.`});if(e.engine===`sql`&&t.includes(`sqlaccess error: failed to parse:`)){let e=t.split(`sqlaccess error: failed to parse:`).at(1)?.split(`
|
|
640
640
|
`).at(0)?.trim();return R({code:`invalid_sql`,message:`SQL parse error.`,suggestion:e??`The SQL query contains unsupported syntax.`})}return e.error instanceof Error?e.error:Error(t)}function isGraphQLInputComplete(e){if(e.trim().length===0)return!1;try{return Nr(e),!0}catch{return!1}}function isSqlInputComplete(e){let t=!1,n=!1,r=!1,i=0,a=null,o=!1;for(let s=0;s<e.length;s+=1){let c=A(e[s],`character at index ${s} missing`),l=e[s+1];if(r){c===`
|
|
641
641
|
`&&(r=!1);continue}if(i>0){if(c===`/`&&l===`*`){i+=1,s+=1;continue}c===`*`&&l===`/`&&(--i,s+=1);continue}if(a!=null){e.startsWith(a,s)&&(s+=a.length-1,a=null);continue}if(t){if(c===`'`&&l===`'`){s+=1;continue}c===`'`&&(t=!1);continue}if(n){if(c===`"`&&l===`"`){s+=1;continue}c===`"`&&(n=!1);continue}if(c===`-`&&l===`-`){r=!0,s+=1;continue}if(c===`/`&&l===`*`){i=1,s+=1;continue}if(c===`'`){o=!1,t=!0;continue}if(c===`"`){o=!1,n=!0;continue}if(c===`$`){let t=e.slice(s),n=t.match(/^\$[A-Za-z_][A-Za-z0-9_]*\$/)??t.match(/^\$\$/);if(n!=null){o=!1,a=n[0],s+=n[0].length-1;continue}}if(c===`;`){o=!0;continue}/\s/.test(c)||(o=!1)}return o&&!t&&!n&&i===0&&a==null}function extractTableNamesFromSql(e){let t;try{t=Mr(e)}catch(e){let t=e instanceof Error?e.message:String(e);throw Error(`SQL parse error: ${t}\nIf your table name is a reserved keyword (e.g. User), wrap it in double quotes: SELECT * FROM "User"`,{cause:e})}let n=new Set,r=jr(e=>({tableRef:t=>(n.add(t.name),e.super().tableRef(t),t)}));for(let e of t)r.statement(e);return[...n]}function collectAliasMap(e){let t=new Map;for(let n of e)if(n.type===`table`){let e=n.name.name,r=n.name.alias??e;t.set(r,e)}return t}function extractColumnTemplate(e){try{let t=Mr(e);for(let e of t){if(e.type!==`select`||!e.columns)continue;let t=collectAliasMap(e.from??[]),n=[],r=!1;for(let i of e.columns)if(i.expr.type===`ref`&&i.expr.name===`*`){if(r=!0,i.expr.table){let e=t.get(i.expr.table.name);n.push({type:`wildcard`,tableNames:e?[e]:[]})}else n.push({type:`wildcard`,tableNames:[...new Set(t.values())]})}else{let e=i.alias?.name??(i.expr.type===`ref`?i.expr.name:null);e&&n.push({type:`explicit`,name:e})}return r?n:null}return null}catch{return null}}async function loadTypeFieldOrder(e,t){let n=new Map,r=e.db?.[t];if(!r||!(`files`in r)||r.files.length===0)return n;let i=B.dirname(e.path),a=sn(r,i);return await Promise.all(a.map(async e=>{try{let t=await import(Zn(e).href);for(let e of Object.values(t)){let t=on.safeParse(cn(e));t.success&&n.set(t.data.name,Object.keys(t.data.fields))}}catch{}})),n}const oc=H.enum([`sql`,`gql`]),sc=H.object({workspaceId:H.string().optional(),profile:H.string().optional(),configPath:H.string().optional(),engine:oc,machineUser:H.string().optional(),machineUserSource:H.enum([`option`,`env`]).optional()}),cc=sc.extend({query:H.string()});async function getNamespaceFromSqlQuery(e,t,n,r){if(r.length===0)throw Error(`No namespaces found in configuration.`);if(r.length===1)return A(r[0],`namespace missing`);let i=extractTableNamesFromSql(t);if(i.length===0)throw Error(`Could not infer namespace from query. Detected namespaces: ${r.join(`, `)}.`);let a=await resolveTableNamespaces({workspaceId:e,namespaces:r,tableNames:i,client:n}),o=i.filter(e=>!a.has(e));if(o.length>0)throw Error(`Could not find namespace for tables in query: ${o.join(`, `)}.`);let s=new Set(a.values());if(s.size===1)return A([...s][0],`namespace from types missing`);throw Error(`Query references tables from multiple namespaces: ${[...s].join(`, `)}.`)}async function loadOptions(e){let t=parseOptions(sc,e),n=await loadMachineUserName({machineUser:t.machineUser,machineUserSource:t.machineUserSource,profile:t.profile});if(!n)throw Error(`Machine user is required. Specify --machine-user, set TAILOR_PLATFORM_MACHINE_USER_NAME, or set a profile default with 'tailor profile update <profile> --machine-user <name>'.`);let r=await loadAccessToken({profile:t.profile}),i=await F(r),a=await loadWorkspaceId({workspaceId:t.workspaceId,profile:t.profile}),{config:o}=await loadConfig(e.configPath),s=extractAllNamespaces(o),{application:c}=await i.getApplication({workspaceId:a,applicationName:o.name});if(!c?.authNamespace)throw Error(`Application ${o.name} does not have an auth configuration.`);let{machineUser:l}=await i.getAuthMachineUser({workspaceId:a,authNamespace:c.authNamespace,name:n});if(!l)throw Error(`Machine user ${n} not found.`);return{engine:t.engine,client:i,workspaceId:a,config:o,application:c,machineUserResource:l,namespaces:s}}async function sqlQuery(e,t,n){let r=splitSqlStatements(n.query),i=await executeScript({client:e,workspaceId:n.workspaceId,name:`query-sql-${n.namespace}.js`,code:n.bundledCode,arg:{namespace:n.namespace,queries:r},invoker:t});if(!i.success)throw Error(i.error);return{engine:`sql`,namespace:n.namespace,query:n.query,result:parseExecutionResult(i.result)}}async function gqlQuery(e,t,n,r,i){let{access_token:a}=await kt(n.url,r.clientId,r.clientSecret),o=await executeScript({client:e,workspaceId:i.workspaceId,name:`query-gql.js`,code:i.bundledCode,arg:{endpoint:`${n.url}/query`,accessToken:a,query:i.query},invoker:t});if(!o.success)throw Error(o.error);return{engine:`gql`,query:i.query,result:parseExecutionResult(o.result)}}function parseExecutionResult(e){if(!e)return null;try{return JSON.parse(e)}catch{return e}}async function resolveQueryCommandInput(e){return e.query==null?e.file==null?e.edit?await resolveEditedQueryInput(e.engine):{mode:`repl`}:{mode:`query`,query:await J.readFile(e.file,`utf-8`)}:{mode:`query`,query:e.query}}async function resolveEditedQueryInput(e){if(!process.stdin.isTTY||!process.stdout.isTTY)throw Error(`Non-interactive terminals are not supported. Pass -q/--query or -f/--file to run a query.`);let t=getEditorCommand(),n=await J.mkdtemp(B.join(gr(),`tailor-query-`)),r=e===`sql`?`sql`:`graphql`,i=B.join(n,`query.${r}`);try{await J.writeFile(i,``,`utf-8`);try{await openInEditor(i,t)}catch(e){throw Error(`Failed to open query editor "${t}": ${e instanceof Error?e.message:String(e)}`,{cause:e})}let e=await J.readFile(i,`utf-8`);return e.trim().length===0||e===``?{mode:`abort`}:{mode:`query`,query:e}}finally{await J.rm(n,{recursive:!0,force:!0})}}async function query(e){let t=parseOptions(cc,e);return await(await prepareQueryExecutor(t))(t.query)}async function prepareQueryExecutor(e){let{client:t,workspaceId:n,config:r,application:i,machineUserResource:a,engine:o,namespaces:s}=await loadOptions(e),c=await bundleQueryScript(o,B.dirname(r.path)),l=U(C,{namespace:i.authNamespace,machineUserName:a.name});return async e=>{let u;try{switch(o){case`sql`:return u=await getNamespaceFromSqlQuery(n,e,t,s),reorderSqlColumns(await sqlQuery(t,l,{workspaceId:n,namespace:u,bundledCode:c,query:e}),r,u,e);case`gql`:return await gqlQuery(t,l,i,a,{workspaceId:n,bundledCode:c,query:e});default:throw Error(`Unsupported query engine: ${o}`)}}catch(e){throw mapQueryExecutionError({error:e,engine:o,namespace:u,machineUser:a.name})}}}function resolveReplCommand(e){let t=e.trim();return t.startsWith(`\\`)?t===`\\q`||t===`\\quit`?`quit`:t===`\\help`||t===`\\h`||t===`\\?`?`help`:t===`\\clear`||t===`\\c`?`clear`:`unknown`:null}function clearReplScreen(){process.stdout.write(`\x1Bc`)}function sanitizeHistoryScope(e){return e.replace(/[^a-zA-Z0-9._-]/g,`_`)}function getReplHistoryPath(e,t,n){if(!nr)return;let r=[t,n].filter(e=>!!e).map(sanitizeHistoryScope).join(`-`),i=e===`sql`?`sql`:`gql`,a=r?`-${r}`:``;return B.join(nr,`tailor-platform`,`query-history-${i}${a}.json`)}function createReplValidator(e){return t=>{let n=t.trim();if(n!==``&&resolveReplCommand(n)===null)return e===`sql`?isSqlInputComplete(t)?void 0:`SQL statement is incomplete (missing ';').`:isGraphQLInputComplete(t)?void 0:`GraphQL document is incomplete.`}}async function runRepl(e){if(!process.stdin.isTTY||!process.stdout.isTTY)throw Error(`Non-interactive terminals are not supported. Pass -q/--query or -f/--file to run a query.`);let t=await prepareQueryExecutor(e),n=getReplHistoryPath(e.engine,e.profile,e.workspaceId),r=createReplValidator(e.engine),{highlightSqlLine:i,highlightGraphqlLine:a,replTransform:o}=await import(`./repl-editor-BG1aDOfH.mjs`),s=e.engine===`sql`?i:a,c=Ar({prefix:``,preferNewlineOnEnter:e.newlineOnEnter,validate:r,highlight:s,transform:o,theme:{submitRender:`preserve`},history:n?{filePath:n,maxEntries:100}:[],helpFooter:{items:[`submit`,`newline`],maxLines:1}});for(M.info(`Entering ${e.engine.toUpperCase()} REPL mode.`),M.info(`Type \\help for usage, \\q to quit.`);;){let[n,r]=await c(`${e.engine}> `);if(r?.kind===`cancel`){if(n.length===0)return;continue}if(r?.kind===`eof`)return;let i=n.trim();if(i===``)continue;let a=resolveReplCommand(i);if(a===`quit`)return;if(a===`help`){printReplHelp(e.engine);continue}if(a===`clear`){clearReplScreen();continue}if(a===`unknown`){M.warn(`Unknown command: ${i}`);continue}try{let n=await t(i);n.engine===`sql`?printSqlResult(n,{json:e.json}):printGqlResult(n,{json:e.json})}catch(e){if(gn(e)){M.log(e.format());continue}if(e instanceof Error){M.error(e.message);continue}M.error(String(e))}}}function printReplHelp(e){M.log(`REPL commands:`),M.log(` \\help, \\h, \\? Show this help`),M.log(` \\q, \\quit Exit REPL`),M.log(` \\clear, \\c Clear the screen`),M.log(``),M.log(`Key bindings (see footer for terminal-specific submit/newline keys):`),M.log(` Ctrl+J Insert newline (always available)`),M.log(` Ctrl+C Cancel current input`),M.log(` Ctrl+D Exit REPL (on empty input)`),M.log(` Ctrl+Z / Ctrl+Y Undo / Redo`),M.log(` Up/Down (first/last line) Navigate history`),M.log(``),M.log(`Editing aids:`),M.log(` Syntax highlighting Enabled for the current engine`),M.log(` ( [ { Auto-inserts the matching closing bracket`),M.log(` Enter after open bracket Adds one indent level and closes the block`),M.log(``),M.log(e===`sql`?`Input must end with ';' to submit.`:`Input must be a complete GraphQL document to submit.`)}async function querySql(e){let t=await query({...e,engine:`sql`});if(t.engine!==`sql`)throw Error(`Expected sql engine result but got: ${t.engine}`);return t}async function queryGql(e){let t=await query({...e,engine:`gql`});if(t.engine!==`gql`)throw Error(`Expected gql engine result but got: ${t.engine}`);return t}async function reorderSqlColumns(e,t,n,r){if(!isSQLExecutionResult(e.result)||e.result.rows.length===0)return e;let i=extractColumnTemplate(r);if(!i)return e;try{let r=buildExpectedColumnOrder(i,await loadTypeFieldOrder(t,n));if(r.length===0)return e;let a=e.result.rows.map(e=>reorderRowByTemplate(e,r));return{...e,result:{...e.result,rows:a}}}catch{return e}}const lc=[`id`];function buildExpectedColumnOrder(e,t){let n=[];for(let r of e)if(r.type===`explicit`)n.push(r.name);else for(let e of r.tableNames)n.push(...lc),n.push(...t.get(e)??[]);return n}function reorderRowByTemplate(e,t){let n={},r=new Set(Object.keys(e)),i=new Map;for(let e of r)i.set(e.toLowerCase(),e);for(let a of t){let t=i.get(a.toLowerCase());t!=null&&r.has(t)&&(n[t]=e[t],r.delete(t),i.delete(a.toLowerCase()))}for(let t of r)n[t]=e[t];return n}const uc=X({name:`query`,description:`Run SQL/GraphQL query.`,args:H.strictObject({...Wr,engine:V(oc,{description:`Query engine (sql or gql)`}),query:V(H.string().optional(),{alias:`q`,description:`Query string to execute directly; omit to start REPL mode`}),file:V(H.string().optional(),{alias:`f`,description:`Read query string from file; omit to start REPL mode`}),edit:V(H.boolean().default(!1),{description:`Open a temporary file in your editor; omit to start REPL mode`}),"machine-user":V(H.string().optional(),{alias:`m`,description:`Machine user name for query execution. Falls back to the active profile's default machine user.`,env:`TAILOR_PLATFORM_MACHINE_USER_NAME`}),"newline-on-enter":V(H.boolean().optional(),{description:`REPL: when true, Enter inserts a newline and Shift+Enter submits. Use --no-newline-on-enter to swap.`})}).superRefine((e,t)=>{e.query!=null&&e.file!=null&&t.addIssue({code:`custom`,path:[`file`],message:`Pass either -q/--query or -f/--file, not both.`}),e.edit&&e.query!=null&&t.addIssue({code:`custom`,path:[`edit`],message:`Pass only one of --edit, -q/--query, or -f/--file.`}),e.edit&&e.file!=null&&t.addIssue({code:`custom`,path:[`edit`],message:`Pass only one of --edit, -q/--query, or -f/--file.`})}),run:async e=>{let t=await resolveQueryCommandInput({query:e.query,file:e.file,edit:e.edit,engine:e.engine}),n={workspaceId:e[`workspace-id`],profile:e.profile,configPath:e.config,engine:e.engine,machineUser:e[`machine-user`],machineUserSource:resolveMachineUserInputSource(e[`machine-user`])};if(t.mode===`abort`){M.info(`Editor closed without a query. Nothing was executed.`);return}if(t.mode===`repl`){let t=e[`newline-on-enter`]??ct(process.env.TAILOR_QUERY_NEWLINE_ON_ENTER)??!0;await runRepl({...n,json:e.json,newlineOnEnter:t});return}let r=t.query;if(e.engine===`sql`){printSqlResult(await querySql({...n,query:r}),{json:e.json});return}printGqlResult(await queryGql({...n,query:r}),{json:e.json})}});function isSQLExecutionResult(e){if(!e||typeof e!=`object`)return!1;let t=e;return Array.isArray(t.rows)&&typeof t.rowCount==`number`}function printSingleSqlResult(e,t={}){if(e.rows.length===0){if(t.json){M.out({results:[],rowCount:0});return}M.info(`No rows returned.`);return}if(t.json){M.out({results:e.rows,rowCount:e.rowCount});return}M.out(e.rows,{showNull:!0}),M.out(`rows: ${e.rowCount}`)}function splitSqlStatements(e){let t=Mr(e,{locationTracking:!0});return t.map((n,r)=>{let i=A(n._location,`SQL statement location missing`).start,a=t[r+1],o=a===void 0?e.length:A(a._location,`SQL statement location missing`).start;return e.substring(i,o)})}function isSQLExecutionResultArray(e){return Array.isArray(e)&&e.length>0&&e.every(isSQLExecutionResult)}function printSqlResult(e,t={}){if(isSQLExecutionResultArray(e.result)){if(t.json){M.out(e.result.map(e=>({results:e.rows,rowCount:e.rowCount})));return}let n=splitSqlStatements(e.query);for(let r=0;r<e.result.length;r++)r>0&&M.log(``),M.info(n[r]??`Statement ${r+1}`),printSingleSqlResult(A(e.result[r],`SQL result at index ${r} missing`),t);return}if(isSQLExecutionResult(e.result)){printSingleSqlResult(e.result,t);return}M.out({engine:e.engine,query:e.query,result:e.result})}function printGqlResult(e,t={}){if(t.json){M.out({result:e.result});return}M.out(JSON.stringify(e.result,null,2))}function errorToJson(e,t){if(gn(e))return{error:{code:e.code??`CLI_ERROR`,message:e.message,...e.details?{details:e.details}:{},...e.suggestion?{suggestion:e.suggestion}:{},...e.command?{help:executableHelpAction(e.command)}:{},...e.next?{next:e.next}:{},...e.context?{context:e.context}:{},...t?.includeStack&&e.stack?{stack:e.stack}:{}}};if(e instanceof q){let n=K[e.code];return{error:{code:`RPC_${typeof n==`string`?n.replaceAll(/([a-z0-9])([A-Z])/g,`$1_$2`).toUpperCase():`CODE_${e.code}`}`,message:e.message,...t?.includeStack&&e.stack?{stack:e.stack}:{}}}}if(e instanceof Error){let n=vn(e);return{error:{code:e.name===`CIPromptError`?`INTERACTIVE_PROMPT_REQUIRED`:`UNEXPECTED_ERROR`,message:e.message,...n?{suggestion:n}:{},...t?.includeStack&&e.stack?{stack:e.stack}:{}}}}return{error:{code:`UNKNOWN_ERROR`,message:String(e)}}}function serializeError(e,t){let n=errorToJson(e,t);try{return JSON.stringify(n)}catch{let e={...n.error};return delete e.context,delete e.stack,JSON.stringify({error:e})}}function executableHelpAction(e){return{command:`tailor`,args:[...e.split(/\s+/).filter(Boolean),`--help`]}}function isNativeTypeScriptRuntime(){return isBun()||isDeno()}function isBun(){return`Bun`in globalThis}function isDeno(){return`Deno`in globalThis}async function registerTsHook(e){if(isNativeTypeScriptRuntime())return;let{resolveSync:t,loadSync:n}=await import(e.href);kn.registerHooks({resolve:t,load:n})}export{Cs as $,loadDiff as $n,Ur as $r,deployFromCLI as $t,truncate as A,selectTargetNamespace as An,loadAccessToken as Ar,getFunctionRegistry as At,logBetaWarning as B,Za as Bn,removeLegacyUserAlias as Br,listExecutorJobs as Bt,Hs as C,bundleMigrationScript as Cn,apiCall as Cr,extractAllNamespaces as Ct,resumeWorkflow as D,fetchRemoteMigrationNumber as Dn,fetchLatestToken as Dr,ss as Dt,zs as E,protoGqlPermission as En,deleteUserTokens as Er,waitForExecution as Et,generate as F,createSnapshotFromLocalTypes as Fn,loadPlatformClientConfig as Fr,Qo as Ft,remove as G,to as Gn,X as Gr,getWorkflow as Gt,deployStaticWebsite as H,Qa as Hn,resolveUserTokenKey as Hr,Xo as Ht,Is as I,createSnapshotType as In,loadStoredUserTokens as Ir,listExecutors as It,updateOrganization as J,getLatestMigrationNumber as Jn,Hr as Jr,listWorkflowExecutions as Jt,Os as K,Xa as Kn,Vr as Kr,Jo as Kt,Fs as L,assertValidMigrationFiles as Ln,loadWorkspaceId as Lr,getExecutorJob as Lt,loadSeedContext as M,captureMigrationFileState as Mn,loadConfigPath as Mr,rs as Mt,chunkSeedData as N,createRemoteComparableSnapshot as Nn,loadConsoleBaseUrl as Nr,ts as Nt,Rs as O,fetchRemoteMigrationState as On,hasAnyUserTokenEntry as Or,listFunctionRegistries as Ot,bundleSeedScript as P,formatSchemaDrifts as Pn,loadMachineUserName as Pr,triggerExecutor as Pt,listOrganizations as Q,getNextMigrationNumber as Qn,loadEnvFiles as Qr,deploy as Qt,Ps as R,reconstructSnapshotFromMigrations as Rn,platformConfigFromProfile as Rr,getExecutorWaitFailureMessage as Rt,getAppHealth as S,formatMigrationScriptCommand as Sn,loadOperatorWorkspaceContext as Sr,loadTailorDBNamespaces as St,waitWorkflowExecution as T,generateAllTypeManifestsFromSnapshot as Tn,loadConfig as Tr,executeScript as Tt,show as U,$a as Un,saveUserTokens as Ur,startWorkflow as Ut,Ms as V,Ya as Vn,resolveConfigUser as Vr,watchExecutorJob as Vt,As as W,no as Wn,writePlatformConfig as Wr,Yo as Wt,Ts as X,getMigrationFilePath as Xn,createCommonArgs as Xr,Uo as Xt,organizationTree as Y,getMigrationDirPath as Yn,Gr as Yr,functionExecutionStatusToString as Yt,ws as Z,getMigrationFiles as Zn,Wr as Zr,getExecutor as Zt,getWorkspace as _,logRemoteDriftGuidance as _n,xi as _r,cs as _t,uc as a,createValidatedWorkspaceWithClient as an,sanitizeMigrationLabel as ar,_s as at,listApps as b,getMigrationMachineUser as bn,writeMetadataLabels as br,resolvePluginConfig as bt,rc as c,formatTimestamp as cn,UnsupportedMigrationFileVersionError as cr,deleteFolder as ct,listUsers as d,ensureConfigId as dn,parseMigrationNumberArg as dr,ds as dt,qr as ei,deployMigrationTestBaseline as en,loadSnapshot as er,getOrganization as et,$s as f,PluginManager as fn,formatDiffSummary as fr,listOAuth2Clients as ft,Js as g,formatRemoteVerificationResults as gn,resourceTrn as gr,ls as gt,restoreWorkspace as h,fetchRemoteSchemaSnapshot as hn,subscribesToEvents as hr,getMachineUserToken as ht,query as i,Y as ii,Ro as in,handleOptionalToRequiredError as ir,listFolders as it,Ls as j,captureFileState as jn,loadAuthStatus as jr,listWebhookExecutors as jt,listWorkflows as k,getNamespacesWithMigrations as kn,hasUserTokenEntry as kr,as as kt,removeUser as l,humanizeRelativeTime as ln,normalizeSchemaSnapshot as lr,ps as lt,Xs as m,checkMigrationDiffs as mn,hasChanges as mr,getOAuth2Client as mt,errorToJson as n,resolveMachineUserInputSource as ni,zo as nn,Yi as nr,updateFolder as nt,ac as o,createWorkspace$1 as on,compareLocalTypesWithSnapshot as or,getFolder as ot,inviteUser as p,generateUserTypes as pn,formatMigrationDiff as pr,us as pt,Ds as q,assertMigrationNumberExists as qn,Br as qr,getWorkflowExecution as qt,serializeError as r,toPageDirection as ri,listWorkspaces as rn,createMigrationHistoryId as rr,ys as rt,updateUser as s,formatKeyValueTable as sn,compareSnapshots as sr,hs as st,registerTsHook as t,paginationArgs as ti,deployMigrationTestTarget as tn,Xi as tr,xs as tt,tc as u,Fo as un,formatMigrationNumber as ur,createFolder as ut,Ks as v,toTailorDBDeployInput as vn,yi as vr,listMachineUsers as vt,Bs as w,compareSnapshotWithRemote as wn,assertWritable as wr,extractOwnedNamespaces as wt,Ws as x,updateMigrationLabel as xn,Z as xr,loadApplicationNamespaces as xt,deleteWorkspace as y,verifyRemoteSchema as yn,bi as yr,generate$1 as yt,generateSchemaFile as z,eo as zn,readPlatformConfig as zr,Zo as zt};
|
|
642
|
-
//# sourceMappingURL=register-ts-hook-
|
|
642
|
+
//# sourceMappingURL=register-ts-hook-BJmGCQAA.mjs.map
|